made-refine 0.2.4 → 0.2.6
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 +178 -75
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +178 -75
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/provider.tsx","../src/portal-container.tsx","styles.css","../src/use-style-updaters.ts","../src/utils/css-value.ts","../src/utils.ts","../src/ui/color-utils.ts","../src/use-session-manager.ts","../src/use-text-and-comments.ts","../src/use-agent-comms.ts","../src/mcp-client.ts","../src/use-keyboard-shortcuts.ts","../src/use-canvas.ts","../src/canvas-store.ts","../src/panel.tsx","../src/ui/tooltip.tsx","../src/cn.ts","../src/use-measurement.ts","../src/measurement-overlay.tsx","../src/use-move.ts","../src/use-guidelines.ts","../src/utils/snap-targets.ts","../src/panel/interaction-overlay.tsx","../src/move-overlay.tsx","../src/selection-overlay.tsx","../src/comment-overlay.tsx","../src/panel/shared.tsx","../src/ui/input.tsx","../src/panel/border-radius-inputs.tsx","../src/ui/button.tsx","../src/ui/slider.tsx","../src/panel/border-section.tsx","../src/ui/select.tsx","../src/ui/simple-select.tsx","../src/ui/color-picker.tsx","../src/panel/fill-section.tsx","../src/panel/shadow-section.tsx","../src/shadow-utils.ts","../src/panel/typography-inputs.tsx","../src/panel/panel-header.tsx","../src/panel/panel-footer.tsx","../src/panel/spacing-inputs.tsx","../src/panel/sizing-inputs.tsx","../src/panel/alignment-grid.tsx","../src/panel/layout-section.tsx","../src/use-panel-position.ts","../src/toolbar.tsx","../src/rulers-overlay.tsx","../src/use-toolbar-dock.ts","../src/toolbar/edits-popover.tsx","../src/ui/badge.tsx","../src/toolbar/settings-popover.tsx","../src/toolbar/zoom-popover.tsx","../src/direct-edit.tsx","../src/demo.tsx"],"sourcesContent":["import * as React from 'react'\nimport { PortalContainerProvider, usePortalContainer } from './portal-container'\nimport type {\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n BorderProperties,\n FlexPropertyKey,\n SizingPropertyKey,\n TypographyPropertyKey,\n CSSPropertyValue,\n SizingValue,\n ColorPropertyKey,\n ColorValue,\n UndoEntry,\n ActiveTool,\n Theme,\n BorderStyleControlPreference,\n SessionEdit,\n SessionItem,\n} from './types'\nimport type { MoveInfo } from './use-move'\nimport { useStyleUpdaters } from './use-style-updaters'\nimport { useSessionManager } from './use-session-manager'\nimport { useTextAndComments } from './use-text-and-comments'\nimport { useAgentComms } from './use-agent-comms'\nimport { useKeyboardShortcuts } from './use-keyboard-shortcuts'\nimport { useCanvas } from './use-canvas'\n\nexport interface DirectEditActionsContextValue {\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 setBorderStyleControlPreference: (preference: BorderStyleControlPreference) => 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 canSendEditToAgent: (snapshot?: {\n selectedElement: HTMLElement | null\n elementInfo: DirectEditState['elementInfo']\n pendingStyles: Record<string, string>\n }) => boolean\n sendEditToAgent: () => Promise<boolean>\n sendAllSessionItemsToAgent: () => Promise<boolean>\n sendCommentToAgent: (id: string) => Promise<boolean>\n setActiveCommentId: (id: string | null) => void\n getSessionEdits: () => SessionEdit[]\n getSessionItems: () => SessionItem[]\n exportAllEdits: () => Promise<boolean>\n clearSessionEdits: () => void\n removeSessionEdit: (element: HTMLElement) => void\n startTextEditing: (element: HTMLElement) => void\n commitTextEditing: () => void\n toggleCanvas: () => void\n setCanvasZoom: (zoom: number) => void\n fitCanvasToViewport: () => void\n zoomCanvasTo100: () => void\n}\n\nexport interface DirectEditStateContextValue extends DirectEditState {\n sessionEditCount: number\n}\n\nexport interface DirectEditContextValue extends DirectEditStateContextValue, DirectEditActionsContextValue {}\n\nconst DirectEditStateContext = React.createContext<DirectEditStateContextValue | null>(null)\nconst DirectEditActionsContext = React.createContext<DirectEditActionsContextValue | null>(null)\n\nexport function useDirectEditState(): DirectEditStateContextValue {\n const context = React.useContext(DirectEditStateContext)\n if (!context) {\n throw new Error('useDirectEditState must be used within a DirectEditProvider')\n }\n return context\n}\n\nexport function useDirectEditActions(): DirectEditActionsContextValue {\n const context = React.useContext(DirectEditActionsContext)\n if (!context) {\n throw new Error('useDirectEditActions must be used within a DirectEditProvider')\n }\n return context\n}\n\nexport function useDirectEdit(): DirectEditContextValue {\n const state = useDirectEditState()\n const actions = useDirectEditActions()\n return React.useMemo(() => ({ ...state, ...actions }), [state, actions])\n}\n\ninterface DirectEditProviderProps {\n children: React.ReactNode\n}\n\nconst BORDER_STYLE_CONTROL_PREFERENCE_KEY = 'direct-edit-border-style-control'\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect\n\nfunction getInitialTheme(): Theme {\n if (typeof window === 'undefined') return 'system'\n try {\n const theme = localStorage.getItem('direct-edit-theme')\n if (theme === 'light' || theme === 'dark' || theme === 'system') {\n return theme\n }\n } catch {}\n return 'system'\n}\n\nfunction getInitialBorderStyleControlPreference(): BorderStyleControlPreference {\n if (typeof window === 'undefined') return 'icon'\n try {\n const borderPref = localStorage.getItem(BORDER_STYLE_CONTROL_PREFERENCE_KEY)\n if (borderPref === 'label' || borderPref === 'icon') {\n return borderPref\n }\n } catch {}\n return 'icon'\n}\n\nexport function DirectEditProvider({ children }: DirectEditProviderProps) {\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 computedBoxShadow: null,\n computedTypography: null,\n originalStyles: {},\n pendingStyles: {},\n editModeActive: false,\n activeTool: 'select',\n theme: getInitialTheme(),\n borderStyleControlPreference: getInitialBorderStyleControlPreference(),\n comments: [],\n activeCommentId: null,\n textEditingElement: null,\n canvas: { active: false, zoom: 1, panX: 0, panY: 0 },\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 > 500) {\n undoStackRef.current = undoStackRef.current.slice(-500)\n }\n if (entry.type === 'edit' || entry.type === 'move' || entry.type === 'textEdit') {\n removedSessionEditsRef.current.delete(entry.element)\n }\n }, [])\n\n const {\n updateSpacingProperty, updateBorderRadiusProperty, updateBorderProperty,\n updateBorderProperties, updateRawCSS, updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n } = useStyleUpdaters({ stateRef, pushUndo, setState })\n\n const {\n syncSessionItemCount, saveCurrentToSession, selectElement, selectParent, selectChild,\n resetToOriginal, undo, handleMoveComplete, getSessionEdits, getSessionItems,\n exportAllEdits, exportEdits, removeSessionEdit, clearSessionEdits,\n } = useSessionManager({\n stateRef, sessionEditsRef, removedSessionEditsRef, undoStackRef,\n pushUndo, setState, setSessionEditCount,\n })\n\n // Save current element to session when selected element or pending styles change\n React.useEffect(() => {\n if (!state.selectedElement) return\n saveCurrentToSession()\n }, [state.selectedElement, state.pendingStyles, saveCurrentToSession])\n\n const {\n finalizeTextEditing, toggleEditMode: toggleEditModeBase, startTextEditing, commitTextEditing,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment, setActiveCommentId,\n } = useTextAndComments({\n stateRef, sessionEditsRef, removedSessionEditsRef,\n pushUndo, syncSessionItemCount, setState,\n })\n\n const { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 } = useCanvas({\n stateRef, setState,\n })\n\n const closePanel = React.useCallback(() => {\n setState((prev) => ({\n ...prev,\n isOpen: false,\n }))\n }, [])\n\n // Wrap toggleEditMode to enter canvas when edit mode turns on, exit when it turns off.\n // Timing note: toggleEditModeBase() only calls setState (async). stateRef is synced\n // from React state in a post-render useEffect, so stateRef.current still holds the\n // pre-toggle values immediately after the call. wasActive and canvas?.active both\n // read the old state intentionally — that's what the branching logic requires.\n const toggleEditMode = React.useCallback(() => {\n const wasActive = stateRef.current.editModeActive\n toggleEditModeBase()\n if (wasActive && stateRef.current.canvas?.active) {\n exitCanvas()\n } else if (!wasActive) {\n enterCanvas()\n }\n if (wasActive) {\n closePanel()\n }\n }, [toggleEditModeBase, stateRef, exitCanvas, enterCanvas, closePanel])\n\n // Sync session item count when comments change\n React.useEffect(() => {\n syncSessionItemCount(state.comments)\n }, [state.comments, syncSessionItemCount])\n\n // Click-outside listener for text editing\n React.useEffect(() => {\n const editingElement = state.textEditingElement\n if (!editingElement) return\n const activeEditingElement = editingElement\n\n function handleMouseDown(e: MouseEvent) {\n const target = e.target\n if (!(target instanceof Node)) return\n if (!activeEditingElement.contains(target)) {\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 {\n canSendEditToAgent, sendEditToAgent, sendCommentToAgent, sendAllSessionItemsToAgent,\n } = useAgentComms({ stateRef, sessionEditsRef, getSessionItems })\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 setBorderStyleControlPreference = React.useCallback((preference: BorderStyleControlPreference) => {\n setState((prev) => ({ ...prev, borderStyleControlPreference: preference }))\n try { localStorage.setItem(BORDER_STYLE_CONTROL_PREFERENCE_KEY, preference) } catch {}\n }, [])\n\n useKeyboardShortcuts({\n stateRef, toggleEditMode, toggleFlexLayout, undo,\n commitTextEditing, startTextEditing, closePanel, setState,\n toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100,\n })\n\n const stateContextValue = React.useMemo<DirectEditStateContextValue>(() => ({\n ...state,\n sessionEditCount,\n }), [state, sessionEditCount])\n\n const actionsContextValue = React.useMemo<DirectEditActionsContextValue>(() => ({\n selectElement, selectParent, selectChild, closePanel,\n updateSpacingProperty, updateBorderRadiusProperty, updateBorderProperty,\n updateBorderProperties, updateRawCSS, updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n resetToOriginal, exportEdits, canSendEditToAgent, sendEditToAgent,\n sendAllSessionItemsToAgent, sendCommentToAgent, toggleEditMode, undo,\n handleMoveComplete, setActiveTool, setTheme, setBorderStyleControlPreference,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment,\n setActiveCommentId, getSessionEdits, getSessionItems, exportAllEdits,\n clearSessionEdits, removeSessionEdit, startTextEditing, commitTextEditing,\n toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100,\n }), [\n selectElement, selectParent, selectChild, closePanel,\n updateSpacingProperty, updateBorderRadiusProperty, updateBorderProperty,\n updateBorderProperties, updateRawCSS, updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n resetToOriginal, exportEdits, canSendEditToAgent, sendEditToAgent,\n sendAllSessionItemsToAgent, sendCommentToAgent, toggleEditMode, undo,\n handleMoveComplete, setActiveTool, setTheme, setBorderStyleControlPreference,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment,\n setActiveCommentId, getSessionEdits, getSessionItems, exportAllEdits,\n clearSessionEdits, removeSessionEdit, startTextEditing, commitTextEditing,\n toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100,\n ])\n\n return (\n <PortalContainerProvider>\n <DirectEditStateContext.Provider value={stateContextValue}>\n <DirectEditActionsContext.Provider value={actionsContextValue}>\n <ThemeApplier />\n {children}\n\n </DirectEditActionsContext.Provider>\n </DirectEditStateContext.Provider>\n </PortalContainerProvider>\n )\n}\n\nfunction ThemeApplier() {\n const { theme } = useDirectEditState()\n const container = usePortalContainer()\n\n useIsomorphicLayoutEffect(() => {\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.documentElement.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-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--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);--ease-in-out:cubic-bezier(.4,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}.collapse{visibility:collapse}.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)}.left-3{left:calc(var(--spacing)*3)}.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}}.m-4{margin:calc(var(--spacing)*4)}.mx-0\\.5{margin-inline:calc(var(--spacing)*.5)}.mx-2{margin-inline:calc(var(--spacing)*2)}.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)}.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-8{height:calc(var(--spacing)*8)}.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-48{max-height:calc(var(--spacing)*48)}.max-h-\\[240px\\]{max-height:240px}.min-h-0{min-height:calc(var(--spacing)*0)}.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-\\[30px\\]{width:30px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.w-\\[180px\\]{width:180px}.w-\\[200px\\]{width:200px}.w-\\[260px\\]{width:260px}.w-\\[280px\\]{width:280px}.w-\\[300px\\]{width:300px}.w-\\[340px\\]{width:340px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[18px\\]{min-width:18px}.min-w-\\[20px\\]{min-width:20px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[120px\\]{min-width:120px}.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-not-allowed{cursor:not-allowed}.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))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\\[0fr\\]{grid-template-columns:0fr}.grid-cols-\\[1fr\\]{grid-template-columns:1fr}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows: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}.place-items-center{place-items:center}.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-4{gap:calc(var(--spacing)*4)}.gap-\\[2px\\]{gap:2px}.gap-\\[4px\\]{gap:4px}: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)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-\\[6px\\]{border-radius:6px}.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{border-color:var(--color-border)}.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-transparent{border-color:#0000}.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-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)}.p-4{padding:calc(var(--spacing)*4)}.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-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-2\\.5{padding-top:calc(var(--spacing)*2.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.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-\\[9px\\]{font-size:9px}.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-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-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);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-\\[0_4px_6px_-1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 6px -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-\\[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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);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-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)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-white{--tw-ring-color:var(--color-white)}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-border{outline-color:var(--color-border)}.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-red-500\\/70{outline-color:#fb2c36b3}@supports (color:color-mix(in lab, red, red)){.outline-red-500\\/70{outline-color:color-mix(in oklab,var(--color-red-500)70%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,background-color\\]{transition-property:color,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,background-color\\,color\\]{transition-property:opacity,background-color,color;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-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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.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}.\\[-ms-overflow-style\\:none\\]{-ms-overflow-style:none}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.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)}.placeholder\\:text-red-400::placeholder{color:var(--color-red-400)}.focus-within\\:ring-1:focus-within{--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-within\\:ring-ring:focus-within{--tw-ring-color:var(--color-ring)}.focus-within\\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}.focus-within\\:ring-inset:focus-within{--tw-ring-inset:inset}@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-muted\\/80:hover{background-color:#f2f2f2cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab,var(--color-muted)80%,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}.disabled\\:opacity-60:disabled{opacity:.6}.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\\]\\:bg-muted\\/50[data-highlighted]{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}@media (prefers-color-scheme:dark){.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)}}.\\[\\&_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}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none;animation: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 * as React from 'react'\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} from './types'\nimport {\n getAllComputedStyles,\n getComputedBorderStyles,\n getComputedColorStyles,\n getComputedBoxShadow,\n getElementInfo,\n formatPropertyValue,\n propertyToCSSMap,\n borderRadiusPropertyToCSSMap,\n borderPropertyToCSSMap,\n flexPropertyToCSSMap,\n sizingPropertyToCSSMap,\n typographyPropertyToCSSMap,\n sizingValueToCSS,\n colorPropertyToCSSMap,\n} from './utils'\nimport { formatColorValue } from './ui/color-utils'\n\nexport interface StyleUpdaterOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n pushUndo: (entry: UndoEntry) => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n}\n\nexport function useStyleUpdaters({ stateRef, pushUndo, setState }: StyleUpdaterOptions) {\n\n const updateSpacingProperty = React.useCallback(\n (key: SpacingPropertyKey, value: CSSPropertyValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = propertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateBorderRadiusProperty = React.useCallback(\n (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = borderRadiusPropertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateBorderProperty = React.useCallback(\n (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.style.setProperty(cssProperty, cssValue)\n\n const border = getComputedBorderStyles(el)\n const color = getComputedColorStyles(el)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [pushUndo]\n )\n\n const updateBorderProperties = React.useCallback(\n (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => {\n const el = stateRef.current.selectedElement\n if (!el || 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 = el.style.getPropertyValue(cssProperty) || null\n properties.push({ cssProperty, previousValue })\n\n el.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: el, properties })\n\n const border = getComputedBorderStyles(el)\n const color = getComputedColorStyles(el)\n const boxShadow = getComputedBoxShadow(el)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n computedBoxShadow: boxShadow,\n pendingStyles: {\n ...prev.pendingStyles,\n ...pendingUpdates,\n },\n }))\n },\n [pushUndo]\n )\n\n const updateRawCSS = React.useCallback(\n (properties: Record<string, string>) => {\n const el = stateRef.current.selectedElement\n if (!el || 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 = el.style.getPropertyValue(cssProperty) || null\n undoProperties.push({ cssProperty, previousValue })\n el.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: el, properties: undoProperties })\n\n const border = getComputedBorderStyles(el)\n const color = getComputedColorStyles(el)\n const boxShadow = getComputedBoxShadow(el)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n computedBoxShadow: boxShadow,\n pendingStyles: {\n ...prev.pendingStyles,\n ...pendingUpdates,\n },\n }))\n },\n [pushUndo]\n )\n\n const updateFlexProperty = React.useCallback(\n (key: FlexPropertyKey, value: string) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = flexPropertyToCSSMap[key]\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const toggleFlexLayout = React.useCallback(() => {\n const current = stateRef.current\n const element = current.selectedElement\n if (!element) return\n\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 = current.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 computed = getAllComputedStyles(element)\n const elementInfo = getElementInfo(element)\n\n const newPending = { ...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: computed.flex,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedSizing: computed.sizing,\n elementInfo,\n pendingStyles: newPending,\n }))\n }, [pushUndo])\n\n const updateSizingProperty = React.useCallback(\n (key: SizingPropertyKey, value: SizingValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = sizingPropertyToCSSMap[key]\n const cssValue = sizingValueToCSS(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateColorProperty = React.useCallback(\n (key: ColorPropertyKey, value: ColorValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = colorPropertyToCSSMap[key]\n const cssValue = formatColorValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateTypographyProperty = React.useCallback(\n (key: TypographyPropertyKey, value: CSSPropertyValue | string) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = typographyPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n if (key === 'textVerticalAlign') {\n const prevDisplay = el.style.getPropertyValue('display') || null\n const prevAlignItems = el.style.getPropertyValue('align-items') || null\n pushUndo({\n type: 'edit',\n element: el,\n properties: [\n { cssProperty: 'display', previousValue: prevDisplay },\n { cssProperty: 'align-items', previousValue: prevAlignItems },\n ],\n })\n\n const computed = window.getComputedStyle(el)\n const isInline = computed.display === 'inline' || computed.display === 'inline-block'\n const displayValue = isInline ? 'inline-flex' : 'flex'\n el.style.setProperty('display', displayValue)\n el.style.setProperty('align-items', cssValue)\n } else {\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.style.setProperty(cssProperty, cssValue)\n }\n\n setState((prev) => {\n let displayValue = 'flex'\n if (key === 'textVerticalAlign' && el) {\n const computed = window.getComputedStyle(el)\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 [pushUndo]\n )\n\n return {\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateRawCSS,\n updateFlexProperty,\n toggleFlexLayout,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n }\n}\n","import type { CSSPropertyValue } from '../types'\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","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 Comment,\n} from './types'\n\nexport { parsePropertyValue, formatPropertyValue } from './utils/css-value'\nimport { parsePropertyValue } from './utils/css-value'\n\nexport function clamp(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min\n if (max < min) return min\n return Math.max(min, Math.min(max, value))\n}\n\nexport function isInputFocused(): boolean {\n let active: Element | null = document.activeElement\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement\n }\n return (\n active instanceof HTMLInputElement ||\n active instanceof HTMLTextAreaElement ||\n (active instanceof HTMLElement && active.isContentEditable)\n )\n}\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 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\n/** CSS properties captured before editing so resetToOriginal can restore them. */\nexport const ORIGINAL_STYLE_PROPS = [\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 'outline-style',\n 'outline-width',\n 'box-shadow',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n] as const\n\nexport function getOriginalInlineStyles(element: HTMLElement): Record<string, string> {\n const styles: Record<string, string> = {}\n\n for (const prop of ORIGINAL_STYLE_PROPS) {\n const value = element.style.getPropertyValue(prop)\n if (value) {\n styles[prop] = value\n }\n }\n\n return styles\n}\n\nconst spacingScale: Record<number, string> = { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' }\n\nconst tailwindClassMap: Record<string, { prefix: string; scale: Record<number, string> }> = {\n padding: { prefix: 'p', scale: spacingScale },\n 'padding-inline': { prefix: 'px', scale: spacingScale },\n 'padding-block': { prefix: 'py', scale: spacingScale },\n 'padding-top': { prefix: 'pt', scale: spacingScale },\n 'padding-right': { prefix: 'pr', scale: spacingScale },\n 'padding-bottom': { prefix: 'pb', scale: spacingScale },\n 'padding-left': { prefix: 'pl', scale: spacingScale },\n margin: { prefix: 'm', scale: spacingScale },\n 'margin-inline': { prefix: 'mx', scale: spacingScale },\n 'margin-block': { prefix: 'my', scale: spacingScale },\n 'margin-top': { prefix: 'mt', scale: spacingScale },\n 'margin-right': { prefix: 'mr', scale: spacingScale },\n 'margin-bottom': { prefix: 'mb', scale: spacingScale },\n 'margin-left': { prefix: 'ml', scale: spacingScale },\n gap: { prefix: 'gap', scale: spacingScale },\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\nfunction normalizeTailwindArbitraryValue(value: string): string {\n return value.trim().replace(/\\s+/g, '_')\n}\n\nfunction normalizeShadowForComparison(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s*\\/\\s*/g, '/')\n .replace(/\\(\\s+/g, '(')\n .replace(/\\s+\\)/g, ')')\n .replace(/\\s*,\\s*/g, ',')\n .replace(/\\s+/g, ' ')\n}\n\nconst tailwindShadowClassValues: Array<{ className: string; css: string }> = [\n { className: 'shadow-2xs', css: '0 1px rgb(0 0 0 / 0.05)' },\n { className: 'shadow-xs', css: '0 1px 2px 0 rgb(0 0 0 / 0.05)' },\n { className: 'shadow', css: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-sm', css: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-md', css: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-lg', css: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-xl', css: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-2xl', css: '0 25px 50px -12px rgb(0 0 0 / 0.25)' },\n { className: 'shadow-inner', css: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)' },\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 === 'box-shadow') {\n const trimmed = value.trim()\n if (trimmed === 'none' || trimmed === '') {\n classes.push('shadow-none')\n } else {\n const normalized = normalizeShadowForComparison(trimmed)\n const preset = tailwindShadowClassValues.find(\n (entry) => normalizeShadowForComparison(entry.css) === normalized\n )\n if (preset) classes.push(preset.className)\n else classes.push(`shadow-[${normalizeTailwindArbitraryValue(value)}]`)\n }\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 parseRgbChannel(value: string): number | null {\n const token = value.trim()\n if (!token) return null\n\n if (token.endsWith('%')) {\n const numeric = parseFloat(token.slice(0, -1))\n if (!Number.isFinite(numeric)) return null\n return Math.round((Math.max(0, Math.min(100, numeric)) / 100) * 255)\n }\n\n const numeric = parseFloat(token)\n if (!Number.isFinite(numeric)) return null\n return Math.round(Math.max(0, Math.min(255, numeric)))\n}\n\nfunction parseRgbAlpha(value: string | undefined): number | null {\n if (value == null || value.trim() === '') return 1\n const token = value.trim()\n\n if (token.endsWith('%')) {\n const numeric = parseFloat(token.slice(0, -1))\n if (!Number.isFinite(numeric)) return null\n return Math.max(0, Math.min(100, numeric)) / 100\n }\n\n const numeric = parseFloat(token)\n if (!Number.isFinite(numeric)) return null\n return Math.max(0, Math.min(1, numeric))\n}\n\nfunction parseRgbaColor(rgba: string): ColorValue {\n const raw = rgba.trim()\n const fnMatch = raw.match(/^rgba?\\((.*)\\)$/i)\n if (!fnMatch) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\n\n const body = fnMatch[1].trim()\n let channelTokens: [string, string, string] | null = null\n let alphaToken: string | undefined\n\n const commaParts = body.split(',').map((part) => part.trim()).filter(Boolean)\n if (commaParts.length === 3 || commaParts.length === 4) {\n channelTokens = [commaParts[0], commaParts[1], commaParts[2]]\n alphaToken = commaParts[3]\n } else {\n const slashParts = body.split('/')\n if (slashParts.length === 1 || slashParts.length === 2) {\n const channels = slashParts[0].trim().split(/\\s+/).filter(Boolean)\n if (channels.length === 3) {\n channelTokens = [channels[0], channels[1], channels[2]]\n alphaToken = slashParts[1]?.trim()\n }\n }\n }\n\n if (!channelTokens) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\n\n const r = parseRgbChannel(channelTokens[0])\n const g = parseRgbChannel(channelTokens[1])\n const b = parseRgbChannel(channelTokens[2])\n const a = parseRgbAlpha(alphaToken)\n\n if (r === null || g === null || b === null || a === null) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\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 getComputedBoxShadow(element: HTMLElement): string {\n const computed = window.getComputedStyle(element)\n const value = computed.boxShadow.trim()\n return value || 'none'\n}\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 interface AllComputedStyles {\n spacing: SpacingProperties\n borderRadius: BorderRadiusProperties\n border: BorderProperties\n flex: FlexProperties\n sizing: SizingProperties\n color: ColorProperties\n boxShadow: string\n typography: TypographyProperties\n}\n\nexport function getAllComputedStyles(element: HTMLElement): AllComputedStyles {\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n return {\n spacing,\n borderRadius,\n border: getComputedBorderStyles(element),\n flex,\n sizing: getComputedSizing(element),\n color: getComputedColorStyles(element),\n boxShadow: getComputedBoxShadow(element),\n typography: getComputedTypography(element),\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\ntype ParsedStackFrame = {\n functionName?: string\n fileName?: string\n lineNumber?: number\n columnNumber?: number\n source?: string\n isServer?: boolean\n}\n\nconst STACK_SOURCE_FILE_EXTENSION_REGEX = /\\.(jsx|tsx|ts|js)$/\nconst STACK_BUNDLED_FILE_PATTERN_REGEX =\n /(\\.min|bundle|chunk|vendor|vendors|runtime|polyfill|polyfills)\\.(js|mjs|cjs)$|(chunk|bundle|vendor|vendors|runtime|polyfill|polyfills|framework|app|main|index)[-_.][A-Za-z0-9_-]{4,}\\.(js|mjs|cjs)$|[\\da-f]{8,}\\.(js|mjs|cjs)$|[-_.][\\da-f]{20,}\\.(js|mjs|cjs)$|\\/dist\\/|\\/build\\/|\\/.next\\/|\\/out\\/|\\/node_modules\\/|\\.webpack\\.|\\.vite\\.|\\.turbopack\\./i\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/\nconst SERVER_FRAME_MARKER = '(at Server)'\n\nconst STACK_INTERNAL_SCHEME_PREFIXES = [\n 'rsc://',\n 'about://React/',\n 'React/Server/',\n 'file:///',\n 'webpack://',\n 'webpack-internal://',\n 'node:',\n 'turbopack://',\n '/app-pages-browser/',\n] as const\n\nfunction formatOwnerDebugStack(stack: string): string {\n if (!stack) return ''\n\n const lines = stack.split('\\n')\n const filtered: string[] = []\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n if (trimmed === 'Error: react-stack-top-frame') continue\n if (\n trimmed.includes('react_stack_bottom_frame') ||\n trimmed.includes('react-stack-bottom-frame')\n ) {\n continue\n }\n filtered.push(line)\n }\n\n if (filtered.length > 0 && filtered[0].includes('fakeJSXCallSite')) {\n filtered.shift()\n }\n\n return filtered.join('\\n')\n}\n\nfunction extractStackLocation(urlLike: string): [string, number | undefined, number | undefined] {\n if (!urlLike.includes(':')) return [urlLike, undefined, undefined]\n\n const isWrappedLocation = urlLike.startsWith('(') && /:\\d+\\)$/.test(urlLike)\n const sanitizedResult = isWrappedLocation ? urlLike.slice(1, -1) : urlLike\n const parts = /(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(sanitizedResult)\n if (!parts) return [sanitizedResult, undefined, undefined]\n\n return [\n parts[1],\n parts[2] !== undefined ? Number(parts[2]) : undefined,\n parts[3] !== undefined ? Number(parts[3]) : undefined,\n ]\n}\n\nfunction parseV8StackLine(line: string): ParsedStackFrame | null {\n let currentLine = line\n if (currentLine.includes('(eval ')) {\n currentLine = currentLine\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(,.*$)/g, '')\n }\n\n let sanitizedLine = currentLine\n .replace(/^\\s+/, '')\n .replace(/\\(eval code/g, '(')\n .replace(/^.*?\\s+/, '')\n const locationMatch = sanitizedLine.match(/ (\\(.+\\)$)/)\n if (locationMatch) {\n sanitizedLine = sanitizedLine.replace(locationMatch[0], '')\n }\n\n const [fileName, lineNumber, columnNumber] = extractStackLocation(\n locationMatch ? locationMatch[1] : sanitizedLine\n )\n const functionName = locationMatch && sanitizedLine ? sanitizedLine : undefined\n if (fileName === 'eval' || fileName === '<anonymous>') {\n return {\n functionName,\n }\n }\n\n return {\n functionName,\n fileName,\n lineNumber,\n columnNumber,\n source: currentLine,\n isServer: currentLine.includes(SERVER_FRAME_MARKER) || fileName.startsWith('rsc://'),\n }\n}\n\nfunction parseFFOrSafariStackLine(line: string): ParsedStackFrame | null {\n let currentLine = line\n if (currentLine.includes(' > eval')) {\n currentLine = currentLine.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1'\n )\n }\n\n const trimmed = currentLine.trim()\n if (!trimmed || SAFARI_NATIVE_CODE_REGEXP.test(trimmed)) {\n return null\n }\n\n if (!trimmed.includes('@') && !trimmed.includes(':')) {\n return {\n functionName: trimmed,\n source: currentLine,\n isServer: trimmed.includes(SERVER_FRAME_MARKER),\n }\n }\n\n const atIndex = trimmed.lastIndexOf('@')\n if (atIndex === -1) {\n return null\n }\n const maybeFunctionName = trimmed.slice(0, atIndex)\n const location = trimmed.slice(atIndex + 1)\n const [fileName, lineNumber, columnNumber] = extractStackLocation(location)\n\n return {\n functionName: maybeFunctionName || undefined,\n fileName,\n lineNumber,\n columnNumber,\n source: currentLine,\n isServer: currentLine.includes(SERVER_FRAME_MARKER) || fileName.startsWith('rsc://'),\n }\n}\n\nfunction parseInStackLine(line: string): ParsedStackFrame | null {\n const functionName = line\n .replace(/^\\s*in\\s+/, '')\n .replace(/\\s*\\(at .*\\)$/, '')\n .trim()\n if (!functionName) return null\n\n return {\n functionName,\n source: line,\n isServer: line.includes(SERVER_FRAME_MARKER),\n }\n}\n\nfunction parseDebugStack(stack: string): ParsedStackFrame[] {\n const frames: ParsedStackFrame[] = []\n for (const rawLine of stack.split('\\n')) {\n if (FIREFOX_SAFARI_STACK_REGEXP.test(rawLine)) {\n const parsed = parseFFOrSafariStackLine(rawLine)\n if (parsed) frames.push(parsed)\n continue\n }\n\n if (/^\\s*at\\s+/.test(rawLine)) {\n const parsed = parseV8StackLine(rawLine)\n if (parsed) frames.push(parsed)\n continue\n }\n\n if (/^\\s*in\\s+/.test(rawLine)) {\n const parsed = parseInStackLine(rawLine)\n if (parsed) frames.push(parsed)\n }\n }\n\n return frames\n}\n\nfunction normalizeStackFileName(fileName: string): string {\n if (!fileName) return ''\n\n let normalized = fileName\n const isHttpUrl = normalized.startsWith('http://') || normalized.startsWith('https://')\n if (isHttpUrl) {\n try {\n normalized = new URL(normalized).pathname\n } catch {\n // Fall through and use the original string.\n }\n }\n\n let didStripPrefix = true\n while (didStripPrefix) {\n didStripPrefix = false\n for (const prefix of STACK_INTERNAL_SCHEME_PREFIXES) {\n if (normalized.startsWith(prefix)) {\n normalized = normalized.slice(prefix.length)\n if (prefix === 'file:///') {\n normalized = `/${normalized.replace(/^\\/+/, '')}`\n }\n didStripPrefix = true\n break\n }\n }\n }\n\n normalized = normalized\n .replace(/^\\/\\(app-pages-browser\\)\\//, '/')\n .replace(/^\\/\\.\\//, '/')\n .replace(/^\\.\\//, '')\n\n const queryIndex = normalized.indexOf('?')\n if (queryIndex !== -1) {\n normalized = normalized.slice(0, queryIndex)\n }\n\n return normalized\n}\n\nfunction isSourceStackFile(fileName: string): boolean {\n const normalizedFileName = normalizeStackFileName(fileName)\n if (!normalizedFileName) return false\n if (!STACK_SOURCE_FILE_EXTENSION_REGEX.test(normalizedFileName)) return false\n return !STACK_BUNDLED_FILE_PATTERN_REGEX.test(normalizedFileName)\n}\n\ntype EnrichedServerFrame = {\n fileName: string\n lineNumber?: number\n columnNumber?: number\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildFunctionNameToRscFramesMap(fiber: any): Map<string, EnrichedServerFrame[]> {\n const functionNameToRscFrames = new Map<string, EnrichedServerFrame[]>()\n const visited = new Set<any>()\n let current = fiber\n\n while (current && !visited.has(current)) {\n visited.add(current)\n const rawStack = current?._debugStack?.stack\n const stack = typeof rawStack === 'string' ? formatOwnerDebugStack(rawStack) : ''\n if (stack) {\n const frames = parseDebugStack(stack)\n for (const frame of frames) {\n if (!frame.functionName || !frame.fileName) continue\n if (!frame.fileName.startsWith('rsc://')) continue\n\n const normalized = normalizeStackFileName(frame.fileName)\n if (!normalized) continue\n\n const existing = functionNameToRscFrames.get(frame.functionName) ?? []\n const duplicate = existing.some(\n (candidate) =>\n candidate.fileName === normalized &&\n candidate.lineNumber === frame.lineNumber &&\n candidate.columnNumber === frame.columnNumber\n )\n if (!duplicate) {\n existing.push({\n fileName: normalized,\n lineNumber: frame.lineNumber,\n columnNumber: frame.columnNumber,\n })\n functionNameToRscFrames.set(frame.functionName, existing)\n }\n }\n }\n\n current = current._debugOwner ?? current.return ?? null\n }\n\n return functionNameToRscFrames\n}\n\nfunction enrichServerFrame(\n frame: ParsedStackFrame,\n functionNameToRscFrames: Map<string, EnrichedServerFrame[]>,\n functionNameToUsageIndex: Map<string, number>,\n): ParsedStackFrame {\n if (!frame.functionName) return frame\n\n const available = functionNameToRscFrames.get(frame.functionName)\n if (!available) return frame\n\n const usageIndex = functionNameToUsageIndex.get(frame.functionName) ?? 0\n const resolved = available[usageIndex % available.length]\n functionNameToUsageIndex.set(frame.functionName, usageIndex + 1)\n\n return {\n ...frame,\n fileName: resolved.fileName,\n lineNumber: resolved.lineNumber,\n columnNumber: resolved.columnNumber,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSourceFromDebugStack(fiber: any):\n | {\n fileName?: string\n lineNumber?: number\n columnNumber?: number\n }\n | null {\n const rawStack = fiber?._debugStack?.stack\n if (typeof rawStack !== 'string' || rawStack.length === 0) {\n return null\n }\n\n const formattedStack = formatOwnerDebugStack(rawStack)\n if (!formattedStack) return null\n\n const stackFrames = parseDebugStack(formattedStack)\n const functionNameToRscFrames = buildFunctionNameToRscFramesMap(fiber)\n const functionNameToUsageIndex = new Map<string, number>()\n\n for (const frame of stackFrames) {\n const maybeEnriched = frame.isServer\n ? enrichServerFrame(frame, functionNameToRscFrames, functionNameToUsageIndex)\n : frame\n if (!maybeEnriched.fileName) continue\n\n const normalizedFileName = normalizeStackFileName(maybeEnriched.fileName)\n if (!normalizedFileName) continue\n\n if (isSourceStackFile(normalizedFileName)) {\n return {\n fileName: normalizedFileName,\n lineNumber: maybeEnriched.lineNumber,\n columnNumber: maybeEnriched.columnNumber,\n }\n }\n }\n\n return 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 const fromDebugStack = getSourceFromDebugStack(fiber)\n if (fromDebugStack?.fileName) return fromDebugStack\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 = 24\nconst CONTEXT_ALLOWED_ATTRIBUTES = new Set([\n 'id',\n 'class',\n 'href',\n 'src',\n 'alt',\n 'aria-label',\n 'role',\n 'data-testid',\n 'data-qa',\n 'data-cy',\n 'data-direct-edit-target',\n])\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 sanitizeContextNode(root: HTMLElement) {\n const nodes: HTMLElement[] = [root, ...Array.from(root.querySelectorAll<HTMLElement>('*'))]\n for (const node of nodes) {\n for (const attr of Array.from(node.attributes)) {\n if (!CONTEXT_ALLOWED_ATTRIBUTES.has(attr.name)) {\n node.removeAttribute(attr.name)\n }\n }\n }\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(/^webpack-internal:\\/\\//, '')\n .replace(/^rsc:\\/\\/React\\/Server\\//, '')\n .replace(/^about:\\/\\/React\\//, '')\n .replace(/^file:\\/\\//, '')\n .replace(/^\\/\\(app-pages-browser\\)\\//, '/')\n .replace(/^\\/app-pages-browser\\//, '/')\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\nfunction buildDomContextHtml(\n element: HTMLElement,\n options?: { siblingCount?: number }\n): string {\n const parent = element.parentElement\n if (!parent) {\n const clone = element.cloneNode(true) as HTMLElement\n clone.setAttribute('data-direct-edit-target', 'true')\n stripDirectEditNodes(clone)\n sanitizeContextNode(clone)\n return clone.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 const siblingCount = options?.siblingCount ?? 1\n let slice = siblings\n\n if (siblingCount >= 0 && selectedIndex >= 0) {\n const start = Math.max(0, selectedIndex - siblingCount)\n const end = Math.min(siblings.length, selectedIndex + 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 sanitizeContextNode(clone)\n parentClone.appendChild(clone)\n }\n\n sanitizeContextNode(parentClone)\n return parentClone.outerHTML\n}\n\nfunction normalizePreviewWhitespace(value: string): string {\n return value.replace(/\\s+/g, ' ').trim()\n}\n\nfunction isWordLikeChar(char: string): boolean {\n return /[A-Za-z0-9]/.test(char)\n}\n\nfunction getFallbackTextPreview(element: HTMLElement): string {\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT)\n const tokens: string[] = []\n let previousRaw = ''\n let previousParent: HTMLElement | null = null\n\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const textNode = node as Text\n const raw = textNode.textContent ?? ''\n const normalized = normalizePreviewWhitespace(raw)\n if (!normalized) continue\n\n if (tokens.length > 0) {\n const hasExplicitWhitespace = /^\\s/.test(raw) || /\\s$/.test(previousRaw)\n const prevLast = previousRaw.slice(-1)\n const nextFirst = normalized[0]\n const shouldInsertHeuristicSpace =\n previousParent !== textNode.parentElement &&\n isWordLikeChar(prevLast) &&\n isWordLikeChar(nextFirst)\n\n if (hasExplicitWhitespace || shouldInsertHeuristicSpace) {\n tokens.push(' ')\n }\n }\n\n tokens.push(normalized)\n previousRaw = raw\n previousParent = textNode.parentElement\n }\n\n return tokens.join('')\n}\n\nfunction getTextPreview(element: HTMLElement): string {\n const innerTextCandidate = normalizePreviewWhitespace(element.innerText ?? '')\n const text = innerTextCandidate || getFallbackTextPreview(element)\n if (text.length <= 120) {\n return text\n }\n return `${text.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 seenFibers = new Set<any>()\n let fiber = getFiberForElement(element)\n while (fiber && !seenFibers.has(fiber)) {\n seenFibers.add(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 break\n }\n fiber = fiber._debugOwner ?? fiber.return ?? null\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\nfunction getLocatorHeader(locator: ElementLocator): { componentLabel: string; formattedSource: string | null } {\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 return { componentLabel, formattedSource }\n}\n\nfunction buildLocatorContextLines(locator: ElementLocator): string[] {\n const lines: string[] = []\n const { componentLabel, formattedSource } = getLocatorHeader(locator)\n const target = (locator.targetHtml || locator.domContextHtml || '').trim()\n const context = locator.domContextHtml?.trim() || ''\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n if (target) {\n lines.push('target:')\n lines.push(target)\n }\n if (context && context !== target) {\n lines.push('context:')\n lines.push(context)\n }\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n\n return lines\n}\n\nexport function buildElementContext(locator: ElementLocator): string {\n return buildLocatorContextLines(locator).join('\\n')\n}\n\nconst spacingGroups = [\n { top: 'padding-top', right: 'padding-right', bottom: 'padding-bottom', left: 'padding-left', all: 'padding', inline: 'padding-inline', block: 'padding-block' },\n { top: 'margin-top', right: 'margin-right', bottom: 'margin-bottom', left: 'margin-left', all: 'margin', inline: 'margin-inline', block: 'margin-block' },\n] as const\n\nexport function collapseSpacingShorthands(styles: Record<string, string>): Record<string, string> {\n const result = { ...styles }\n\n for (const group of spacingGroups) {\n const hasTop = group.top in result\n const hasRight = group.right in result\n const hasBottom = group.bottom in result\n const hasLeft = group.left in result\n const hasAllSides = hasTop && hasRight && hasBottom && hasLeft\n\n if (hasAllSides) {\n delete result[group.all]\n delete result[group.inline]\n delete result[group.block]\n }\n\n const top = result[group.top]\n const right = result[group.right]\n const bottom = result[group.bottom]\n const left = result[group.left]\n\n const horizontalMatch = hasLeft && hasRight && left === right\n const verticalMatch = hasTop && hasBottom && top === bottom\n\n if (horizontalMatch && verticalMatch) {\n delete result[group.top]\n delete result[group.right]\n delete result[group.bottom]\n delete result[group.left]\n if (top === left) {\n result[group.all] = top\n } else {\n result[group.inline] = left\n result[group.block] = top\n }\n } else if (horizontalMatch) {\n // Only horizontal pair matches\n delete result[group.left]\n delete result[group.right]\n result[group.inline] = left\n } else if (verticalMatch) {\n // Only vertical pair matches\n delete result[group.top]\n delete result[group.bottom]\n result[group.block] = top\n }\n }\n\n return result\n}\n\nfunction collapseFourSideShorthand(\n result: Record<string, string>,\n sides: { top: string; right: string; bottom: string; left: string; all: string }\n): void {\n if (!(sides.top in result && sides.right in result && sides.bottom in result && sides.left in result)) return\n\n // Side-specific values are the source of truth when all four are present.\n delete result[sides.all]\n\n const top = result[sides.top]\n const right = result[sides.right]\n const bottom = result[sides.bottom]\n const left = result[sides.left]\n const allEqual = top === right && top === bottom && top === left\n if (!allEqual) return\n\n delete result[sides.top]\n delete result[sides.right]\n delete result[sides.bottom]\n delete result[sides.left]\n result[sides.all] = top\n}\n\nexport function collapseExportShorthands(styles: Record<string, string>): Record<string, string> {\n const result = collapseSpacingShorthands(styles)\n\n collapseFourSideShorthand(result, {\n top: 'border-top-style',\n right: 'border-right-style',\n bottom: 'border-bottom-style',\n left: 'border-left-style',\n all: 'border-style',\n })\n\n collapseFourSideShorthand(result, {\n top: 'border-top-width',\n right: 'border-right-width',\n bottom: 'border-bottom-width',\n left: 'border-left-width',\n all: 'border-width',\n })\n\n collapseFourSideShorthand(result, {\n top: 'border-top-left-radius',\n right: 'border-top-right-radius',\n bottom: 'border-bottom-right-radius',\n left: 'border-bottom-left-radius',\n all: 'border-radius',\n })\n\n return result\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 const collapsedStyles = collapseExportShorthands(pendingStyles)\n for (const [property, value] of Object.entries(collapsedStyles)) {\n const tailwindClass = stylesToTailwind({ [property]: value })\n changes.push({\n property,\n value,\n tailwind: tailwindClass,\n })\n }\n\n const lines = buildLocatorContextLines(locator)\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 = buildLocatorContextLines(locator)\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\nfunction formatMoveSummary(move: NonNullable<SessionEdit['move']>): string {\n const fromPosition = formatPosition(move.fromSiblingBefore, move.fromSiblingAfter)\n const toPosition = formatPosition(move.toSiblingBefore, move.toSiblingAfter)\n if (move.fromParentName === move.toParentName) {\n return `in <${move.toParentName}>, from ${fromPosition} to ${toPosition}`\n }\n return `from <${move.fromParentName}> ${fromPosition} to <${move.toParentName}> ${toPosition}`\n}\n\nfunction formatMoveSelector(\n selector: string | null | undefined,\n fallback: '(none)' | '(unknown)'\n): string {\n const normalized = selector?.trim()\n return normalized ? normalized : fallback\n}\n\nfunction formatMoveSource(\n source: DomSourceLocation | null | undefined,\n fallback: '(none)' | '(unknown)'\n): string {\n if (!source?.file) return fallback\n return formatSourceLocation(source.file, source.line, source.column)\n}\n\nfunction buildMoveExportLines(move: NonNullable<SessionEdit['move']>): string[] {\n return [\n 'moved:',\n `summary: ${formatMoveSummary(move)}`,\n `from_parent_selector: ${formatMoveSelector(move.fromParentSelector, '(unknown)')}`,\n `from_before_selector: ${formatMoveSelector(move.fromSiblingBeforeSelector, '(none)')}`,\n `from_after_selector: ${formatMoveSelector(move.fromSiblingAfterSelector, '(none)')}`,\n `from_parent_source: ${formatMoveSource(move.fromParentSource, '(unknown)')}`,\n `from_before_source: ${formatMoveSource(move.fromSiblingBeforeSource, '(none)')}`,\n `from_after_source: ${formatMoveSource(move.fromSiblingAfterSource, '(none)')}`,\n `to_parent_selector: ${formatMoveSelector(move.toParentSelector, '(unknown)')}`,\n `to_before_selector: ${formatMoveSelector(move.toSiblingBeforeSelector, '(none)')}`,\n `to_after_selector: ${formatMoveSelector(move.toSiblingAfterSelector, '(none)')}`,\n `to_parent_source: ${formatMoveSource(move.toParentSource, '(unknown)')}`,\n `to_before_source: ${formatMoveSource(move.toSiblingBeforeSource, '(none)')}`,\n `to_after_source: ${formatMoveSource(move.toSiblingAfterSource, '(none)')}`,\n ]\n}\n\nexport function buildSessionExport(edits: SessionEdit[], comments: Comment[] = []): 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 block += `\\n${buildMoveExportLines(edit.move).join('\\n')}`\n }\n blocks.push(block)\n }\n\n for (const comment of comments) {\n blocks.push(buildCommentExport(comment.locator, comment.text, comment.replies))\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","import * as React from 'react'\nimport type {\n DirectEditState,\n UndoEntry,\n SessionEdit,\n SessionItem,\n Comment,\n} from './types'\nimport type { MoveInfo } from './use-move'\nimport {\n getAllComputedStyles,\n getComputedStyles,\n getOriginalInlineStyles,\n getElementInfo,\n propertyToCSSMap,\n borderRadiusPropertyToCSSMap,\n borderPropertyToCSSMap,\n flexPropertyToCSSMap,\n sizingPropertyToCSSMap,\n colorPropertyToCSSMap,\n typographyPropertyToCSSMap,\n buildElementContext,\n buildEditExport,\n buildSessionExport,\n getElementDisplayName,\n getElementLocator,\n} from './utils'\n\nexport interface SessionManagerOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n sessionEditsRef: React.MutableRefObject<Map<HTMLElement, SessionEdit>>\n removedSessionEditsRef: React.MutableRefObject<WeakSet<HTMLElement>>\n undoStackRef: React.MutableRefObject<UndoEntry[]>\n pushUndo: (entry: UndoEntry) => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n setSessionEditCount: React.Dispatch<React.SetStateAction<number>>\n}\n\nexport function useSessionManager({\n stateRef,\n sessionEditsRef,\n removedSessionEditsRef,\n undoStackRef,\n pushUndo,\n setState,\n setSessionEditCount,\n}: SessionManagerOptions) {\n\n const getExportableComments = React.useCallback((comments: Comment[]): Comment[] => {\n return comments.filter((comment) => comment.text.trim().length > 0)\n }, [])\n\n const syncSessionItemCount = React.useCallback((comments = stateRef.current.comments) => {\n setSessionEditCount(sessionEditsRef.current.size + getExportableComments(comments).length)\n }, [getExportableComments])\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 syncSessionItemCount()\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 syncSessionItemCount()\n }, [syncSessionItemCount])\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 existingEdit = sessionEditsRef.current.get(element)\n const computed = getAllComputedStyles(element)\n const originalStyles = existingEdit?.originalStyles ?? getOriginalInlineStyles(element)\n const pendingStyles = existingEdit?.pendingStyles ?? {}\n const elementInfo = getElementInfo(element)\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n originalStyles,\n pendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n borderStyleControlPreference: prev.borderStyleControlPreference,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n canvas: prev.canvas,\n textEditingElement: null,\n }))\n\n }, [pushUndo, saveCurrentToSession])\n\n const selectParent = React.useCallback(() => {\n const el = stateRef.current.selectedElement\n if (el?.parentElement) {\n selectElement(el.parentElement)\n }\n }, [selectElement])\n\n const selectChild = React.useCallback(() => {\n const firstChild = stateRef.current.selectedElement?.firstElementChild as HTMLElement | null\n if (firstChild) {\n selectElement(firstChild)\n }\n }, [selectElement])\n\n const resetToOriginal = React.useCallback(() => {\n const current = stateRef.current\n const el = current.selectedElement\n if (!el) return\n\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 syncSessionItemCount()\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 'box-shadow',\n ]\n\n for (const prop of allCSSProps) {\n el.style.removeProperty(prop)\n }\n\n for (const [prop, value] of Object.entries(current.originalStyles)) {\n el.style.setProperty(prop, value)\n }\n\n const computed = getAllComputedStyles(el)\n\n setState((prev) => ({\n ...prev,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n pendingStyles: {},\n }))\n }, [syncSessionItemCount])\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 computed = getAllComputedStyles(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: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.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 computed = getAllComputedStyles(prevEl)\n const elementInfo = getElementInfo(prevEl)\n setState((prev) => ({\n isOpen: true,\n selectedElement: prevEl,\n elementInfo,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n originalStyles: entry.previousOriginalStyles,\n pendingStyles: entry.previousPendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n borderStyleControlPreference: prev.borderStyleControlPreference,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n canvas: prev.canvas,\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 computedBoxShadow: 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 syncSessionItemCount()\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 syncSessionItemCount()\n break\n }\n }\n }, [])\n\n const handleMoveComplete = React.useCallback(\n (element: HTMLElement, moveInfo: MoveInfo | null) => {\n const current = stateRef.current\n const getStyleStateForElement = (sessionEdit?: SessionEdit) => {\n if (sessionEdit) {\n return {\n originalStyles: { ...sessionEdit.originalStyles },\n pendingStyles: { ...sessionEdit.pendingStyles },\n }\n }\n if (current.selectedElement === element) {\n return {\n originalStyles: { ...current.originalStyles },\n pendingStyles: { ...current.pendingStyles },\n }\n }\n return {\n originalStyles: getOriginalInlineStyles(element),\n pendingStyles: {},\n }\n }\n\n if (moveInfo) {\n const getAnchor = (node: HTMLElement | null): {\n selector: string | null\n source: ReturnType<typeof getElementLocator>['domSource'] | null\n } => {\n if (!node) {\n return { selector: null, source: null }\n }\n const locator = getElementLocator(node)\n const selector = locator.domSelector.trim()\n return {\n selector: selector.length > 0 ? selector : null,\n source: locator.domSource ?? null,\n }\n }\n\n const existing = sessionEditsRef.current.get(element)\n const styleState = getStyleStateForElement(existing)\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 const nextPrevSibling = element.previousElementSibling as HTMLElement | null\n const nextSibling = element.nextElementSibling as HTMLElement | null\n const fromParentAnchor = getAnchor(moveInfo.originalParent)\n const fromBeforeAnchor = getAnchor(moveInfo.originalPreviousSibling)\n const fromAfterAnchor = getAnchor(moveInfo.originalNextSibling)\n const toParentAnchor = getAnchor(newParent)\n const toBeforeAnchor = getAnchor(nextPrevSibling)\n const toAfterAnchor = getAnchor(nextSibling)\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 fromParentSelector: existing.move.fromParentSelector ?? null,\n fromSiblingBeforeSelector: existing.move.fromSiblingBeforeSelector ?? null,\n fromSiblingAfterSelector: existing.move.fromSiblingAfterSelector ?? null,\n fromParentSource: existing.move.fromParentSource ?? null,\n fromSiblingBeforeSource: existing.move.fromSiblingBeforeSource ?? null,\n fromSiblingAfterSource: existing.move.fromSiblingAfterSource ?? null,\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 fromParentSelector: fromParentAnchor.selector,\n fromSiblingBeforeSelector: fromBeforeAnchor.selector,\n fromSiblingAfterSelector: fromAfterAnchor.selector,\n fromParentSource: fromParentAnchor.source,\n fromSiblingBeforeSource: fromBeforeAnchor.source,\n fromSiblingAfterSource: fromAfterAnchor.source,\n }\n\n sessionEditsRef.current.set(element, {\n element,\n locator,\n originalStyles: styleState.originalStyles,\n pendingStyles: styleState.pendingStyles,\n textEdit: existing?.textEdit ?? null,\n move: newParent\n ? {\n ...fromFields,\n toParentName: getElementDisplayName(newParent),\n toSiblingBefore: nextPrevSibling\n ? getElementDisplayName(nextPrevSibling)\n : null,\n toSiblingAfter: nextSibling\n ? getElementDisplayName(nextSibling)\n : null,\n toParentSelector: toParentAnchor.selector,\n toSiblingBeforeSelector: toBeforeAnchor.selector,\n toSiblingAfterSelector: toAfterAnchor.selector,\n toParentSource: toParentAnchor.source,\n toSiblingBeforeSource: toBeforeAnchor.source,\n toSiblingAfterSource: toAfterAnchor.source,\n }\n : null,\n })\n syncSessionItemCount()\n }\n // Refresh element state without going through selectElement,\n // which would push an extra selection undo entry.\n const computed = getAllComputedStyles(element)\n const elementInfo = getElementInfo(element)\n const styleState = getStyleStateForElement(sessionEditsRef.current.get(element))\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n originalStyles: styleState.originalStyles,\n pendingStyles: styleState.pendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n borderStyleControlPreference: prev.borderStyleControlPreference,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n canvas: prev.canvas,\n textEditingElement: null,\n }))\n },\n [pushUndo]\n )\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 syncSessionItemCount()\n return edits\n }, [saveCurrentToSession, syncSessionItemCount])\n\n const getSessionItems = React.useCallback((): SessionItem[] => {\n const edits = getSessionEdits().map((edit) => ({ type: 'edit', edit } as const))\n const comments = getExportableComments(stateRef.current.comments).map((comment) => ({ type: 'comment', comment } as const))\n return [...edits, ...comments]\n }, [getSessionEdits, getExportableComments])\n\n const exportAllEdits = React.useCallback(async (): Promise<boolean> => {\n const items = getSessionItems()\n if (items.length === 0) return false\n const edits = items.filter((item) => item.type === 'edit').map((item) => item.edit)\n const comments = items.filter((item) => item.type === 'comment').map((item) => item.comment)\n const text = buildSessionExport(edits, comments)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${text}`)\n return true\n } catch {\n return false\n }\n }, [getSessionItems])\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 computed = getAllComputedStyles(el)\n setState((prev) => ({\n ...prev,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n computedBorder: computed.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 syncSessionItemCount()\n if (stateRef.current.selectedElement === element) {\n refreshSelectedElement()\n }\n }, [revertElementStyles, refreshSelectedElement, syncSessionItemCount])\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 syncSessionItemCount([])\n setState((prev) => (\n prev.comments.length > 0 || prev.activeCommentId\n ? { ...prev, comments: [], activeCommentId: null }\n : prev\n ))\n refreshSelectedElement()\n }, [revertElementStyles, refreshSelectedElement, syncSessionItemCount])\n\n const exportEdits = React.useCallback(async () => {\n const current = stateRef.current\n if (!current.selectedElement || !current.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(current.selectedElement)\n const hasPendingStyles = Object.keys(current.pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n const hasMove = Boolean(sessionEdit?.move)\n\n const locator = getElementLocator(current.selectedElement)\n const exportMarkdown = hasPendingStyles || hasTextEdit || hasMove\n ? hasMove && sessionEdit\n ? buildSessionExport([{\n ...sessionEdit,\n locator,\n pendingStyles: { ...current.pendingStyles },\n textEdit: sessionEdit.textEdit,\n }], [])\n : buildEditExport(locator, current.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\n return {\n syncSessionItemCount,\n saveCurrentToSession,\n selectElement,\n selectParent,\n selectChild,\n resetToOriginal,\n undo,\n handleMoveComplete,\n getSessionEdits,\n getSessionItems,\n exportAllEdits,\n exportEdits,\n revertElementStyles,\n refreshSelectedElement,\n removeSessionEdit,\n clearSessionEdits,\n }\n}\n","import * as React from 'react'\nimport type {\n DirectEditState,\n UndoEntry,\n SessionEdit,\n Comment,\n} from './types'\nimport {\n getElementLocator,\n buildCommentExport,\n isTextElement,\n} from './utils'\n\nexport interface TextAndCommentsOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n sessionEditsRef: React.MutableRefObject<Map<HTMLElement, SessionEdit>>\n removedSessionEditsRef: React.MutableRefObject<WeakSet<HTMLElement>>\n pushUndo: (entry: UndoEntry) => void\n syncSessionItemCount: (comments?: Comment[]) => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n}\n\nexport function useTextAndComments({\n stateRef,\n sessionEditsRef,\n removedSessionEditsRef,\n pushUndo,\n syncSessionItemCount,\n setState,\n}: TextAndCommentsOptions) {\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 syncSessionItemCount()\n }\n\n setState((prev) => (prev.textEditingElement ? { ...prev, textEditingElement: null } : prev))\n }, [pushUndo, syncSessionItemCount])\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 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: rect.width > 0 ? (clickPosition.x - rect.left) / rect.width : 0,\n y: rect.height > 0 ? (clickPosition.y - rect.top) / rect.height : 0,\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 // Remove previously active empty comment\n const filtered = prev.activeCommentId\n ? prev.comments.filter((c) => c.id !== prev.activeCommentId || c.text.trim().length > 0)\n : prev.comments\n return {\n ...prev,\n comments: [...filtered, comment],\n activeCommentId: id,\n }\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 return {\n finalizeTextEditing,\n toggleEditMode,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n setActiveCommentId,\n startTextEditing,\n commitTextEditing,\n }\n}\n","import * as React from 'react'\nimport type {\n DirectEditState,\n SessionEdit,\n SessionItem,\n Comment,\n} from './types'\nimport {\n buildEditExport,\n buildCommentExport,\n buildSessionExport,\n getElementLocator,\n stylesToTailwind,\n collapseExportShorthands,\n} from './utils'\nimport { sendEditToAgent as postEditToAgent, sendCommentToAgent as postCommentToAgent } from './mcp-client'\n\nexport interface AgentCommsOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n sessionEditsRef: React.MutableRefObject<Map<HTMLElement, SessionEdit>>\n getSessionItems: () => SessionItem[]\n}\n\nexport function useAgentComms({ stateRef, sessionEditsRef, getSessionItems }: AgentCommsOptions) {\n\n const canSendEditToAgent = React.useCallback((snapshot?: {\n selectedElement: HTMLElement | null\n elementInfo: DirectEditState['elementInfo']\n pendingStyles: Record<string, string>\n }) => {\n const current = stateRef.current\n const selectedElement = snapshot?.selectedElement ?? current.selectedElement\n const elementInfo = snapshot?.elementInfo ?? current.elementInfo\n const pendingStyles = snapshot?.pendingStyles ?? current.pendingStyles\n if (!selectedElement || !elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(selectedElement)\n const hasPendingStyles = Object.keys(pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n const hasMove = Boolean(sessionEdit?.move)\n return hasPendingStyles || hasTextEdit || hasMove\n }, [])\n\n const sendSessionEditToAgent = React.useCallback(async (sessionEdit: SessionEdit) => {\n const locator = sessionEdit.locator\n const pendingStyles = { ...sessionEdit.pendingStyles }\n const exportMarkdown = sessionEdit.move\n ? buildSessionExport([{\n ...sessionEdit,\n locator,\n pendingStyles,\n textEdit: sessionEdit.textEdit,\n }], [])\n : buildEditExport(locator, pendingStyles, sessionEdit.textEdit)\n const collapsedStyles = collapseExportShorthands(pendingStyles)\n const changes = Object.entries(collapsedStyles).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 moveChange: sessionEdit.move ?? null,\n exportMarkdown,\n })\n return result.ok\n } catch {\n return false\n }\n }, [])\n\n const sendSessionCommentToAgent = React.useCallback(async (comment: Comment) => {\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 const sendEditToAgent = React.useCallback(async () => {\n const current = stateRef.current\n if (!current.selectedElement || !current.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(current.selectedElement)\n if (!canSendEditToAgent({\n selectedElement: current.selectedElement,\n elementInfo: current.elementInfo,\n pendingStyles: current.pendingStyles,\n })) return false\n\n const locator = getElementLocator(current.selectedElement)\n const editToSend: SessionEdit = {\n element: current.selectedElement,\n locator,\n originalStyles: sessionEdit?.originalStyles ?? { ...current.originalStyles },\n pendingStyles: { ...current.pendingStyles },\n move: sessionEdit?.move ?? null,\n textEdit: sessionEdit?.textEdit ?? null,\n }\n return sendSessionEditToAgent(editToSend)\n }, [canSendEditToAgent, sendSessionEditToAgent])\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 return sendSessionCommentToAgent(comment)\n }, [sendSessionCommentToAgent])\n\n const sendAllSessionItemsToAgent = React.useCallback(async () => {\n const items = getSessionItems()\n if (items.length === 0) return false\n\n let allSucceeded = true\n for (const item of items) {\n const succeeded = item.type === 'edit'\n ? await sendSessionEditToAgent(item.edit)\n : await sendSessionCommentToAgent(item.comment)\n if (!succeeded) {\n allSucceeded = false\n }\n }\n\n return allSucceeded\n }, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent])\n\n return {\n canSendEditToAgent,\n sendEditToAgent,\n sendCommentToAgent,\n sendAllSessionItemsToAgent,\n }\n}\n","const PROTOCOL_VERSION = 1\nconst BOOTSTRAP_TIMEOUT_MS = 2_500\nconst REQUEST_TIMEOUT_MS = 3_000\nconst SESSION_EXPIRY_SKEW_MS = 5_000\nconst CLIENT_NAME = 'made-refine'\nconst DEFAULT_CLIENT_VERSION = 'unknown'\n\nconst BOOTSTRAP_ENV_KEYS = [\n 'MADE_REFINE_MCP_BOOTSTRAP_URL',\n 'VITE_MADE_REFINE_MCP_BOOTSTRAP_URL',\n 'NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL',\n] as const\n\nconst CLIENT_VERSION_ENV_KEYS = [\n 'MADE_REFINE_VERSION',\n 'VITE_MADE_REFINE_VERSION',\n 'NEXT_PUBLIC_MADE_REFINE_VERSION',\n] as const\n\ntype BootstrapEnvKey = (typeof BOOTSTRAP_ENV_KEYS)[number]\ntype ClientVersionEnvKey = (typeof CLIENT_VERSION_ENV_KEYS)[number]\ntype EnvKey = BootstrapEnvKey | ClientVersionEnvKey\n\ntype AnnotationPath = '/v1/annotations/edit' | '/v1/annotations/comment'\n\ninterface KnownProcessEnv {\n MADE_REFINE_MCP_BOOTSTRAP_URL?: string\n VITE_MADE_REFINE_MCP_BOOTSTRAP_URL?: string\n NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL?: string\n MADE_REFINE_VERSION?: string\n VITE_MADE_REFINE_VERSION?: string\n NEXT_PUBLIC_MADE_REFINE_VERSION?: string\n [key: string]: string | undefined\n}\n\ndeclare const process: { env?: KnownProcessEnv } | undefined\n\ninterface RuntimeMcpConfig {\n bootstrapUrl?: string\n workspaceId?: string\n projectFingerprint?: {\n path?: string\n gitRemoteHash?: string\n }\n clientVersion?: string\n}\n\ninterface RuntimeConfig {\n mcp?: RuntimeMcpConfig\n mcpBootstrapUrl?: string\n}\n\ninterface SessionContext {\n bootstrapUrl: string\n ingestBaseUrl: string\n serverInstanceId: string | null\n projectId: string | null\n sessionId: string | null\n accessToken: string | null\n expiresAt: number | null\n}\n\ninterface BootstrapRequest {\n protocolVersion: number\n projectFingerprint: {\n path: string\n gitRemoteHash: string | null\n }\n workspaceId?: string\n client: {\n name: string\n version: string\n origin: string | null\n }\n}\n\ndeclare global {\n interface Window {\n __MADE_REFINE_CONFIG__?: RuntimeConfig\n __MADE_REFINE_MCP_BOOTSTRAP_URL__?: string\n }\n}\n\nlet cachedSession: SessionContext | null = null\n\nfunction getTimeoutSignal(timeoutMs: number): AbortSignal | undefined {\n const timeout = (AbortSignal as { timeout?: (delay: number) => AbortSignal }).timeout\n return typeof timeout === 'function' ? timeout(timeoutMs) : undefined\n}\n\nfunction getRuntimeMcpConfig(): RuntimeMcpConfig | null {\n if (typeof window === 'undefined') return null\n const config = window.__MADE_REFINE_CONFIG__\n const bootstrapUrl =\n config?.mcp?.bootstrapUrl\n ?? config?.mcpBootstrapUrl\n ?? window.__MADE_REFINE_MCP_BOOTSTRAP_URL__\n\n if (!config?.mcp && typeof bootstrapUrl !== 'string') return null\n return {\n ...(config?.mcp ?? {}),\n ...(typeof bootstrapUrl === 'string' ? { bootstrapUrl } : {}),\n }\n}\n\nfunction toNonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction getStaticProcessEnvValue(key: EnvKey): string | null {\n switch (key) {\n case 'MADE_REFINE_MCP_BOOTSTRAP_URL':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.MADE_REFINE_MCP_BOOTSTRAP_URL : undefined)\n case 'VITE_MADE_REFINE_MCP_BOOTSTRAP_URL':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.VITE_MADE_REFINE_MCP_BOOTSTRAP_URL : undefined)\n case 'NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL : undefined)\n case 'MADE_REFINE_VERSION':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.MADE_REFINE_VERSION : undefined)\n case 'VITE_MADE_REFINE_VERSION':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.VITE_MADE_REFINE_VERSION : undefined)\n case 'NEXT_PUBLIC_MADE_REFINE_VERSION':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.NEXT_PUBLIC_MADE_REFINE_VERSION : undefined)\n default:\n return null\n }\n}\n\nfunction getDynamicProcessEnvValue(keys: readonly EnvKey[]): string | null {\n const processLike = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\n const env = processLike?.env\n if (!env) return null\n\n for (const key of keys) {\n const value = toNonEmptyString(env[key])\n if (value) return value\n }\n\n return null\n}\n\nfunction getEnvValue(keys: readonly EnvKey[]): string | null {\n for (const key of keys) {\n const processValue = getStaticProcessEnvValue(key)\n if (processValue) return processValue\n }\n\n return getDynamicProcessEnvValue(keys)\n}\n\nfunction normalizeUrl(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n if (!trimmed) return null\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed.replace(/\\/+$/, '')\n }\n\n if (typeof window === 'undefined' || !window.location?.origin) return null\n try {\n return new URL(trimmed, window.location.origin).toString().replace(/\\/+$/, '')\n } catch {\n return null\n }\n}\n\nfunction normalizeBootstrapUrl(value: string | null | undefined): string | null {\n const normalized = normalizeUrl(value)\n if (!normalized) return null\n\n try {\n const url = new URL(normalized)\n const normalizedPathname = url.pathname.replace(/\\/+$/, '')\n url.pathname = normalizedPathname.endsWith('/v1/bootstrap')\n ? normalizedPathname\n : `${normalizedPathname}/v1/bootstrap`\n return url.toString()\n } catch {\n return normalized.endsWith('/v1/bootstrap') ? normalized : `${normalized}/v1/bootstrap`\n }\n}\n\nfunction toSafeBootstrapUrl(value: string | null | undefined): string | null {\n const normalized = normalizeBootstrapUrl(value)\n if (!normalized) return null\n return isLoopbackHttpUrl(normalized) ? normalized : null\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, '')}${path}`\n}\n\nfunction readString(record: Record<string, unknown> | null, key: string): string | null {\n const value = record?.[key]\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction parseExpiresAt(value: unknown): number | null {\n if (typeof value !== 'string') return null\n const timestamp = Date.parse(value)\n return Number.isFinite(timestamp) ? timestamp : null\n}\n\nfunction readNumber(record: Record<string, unknown> | null, key: string): number | null {\n const value = record?.[key]\n if (typeof value !== 'number' || !Number.isFinite(value)) return null\n return value\n}\n\nfunction isLoopbackIpv4(hostname: string): boolean {\n if (!/^127(?:\\.\\d{1,3}){3}$/.test(hostname)) return false\n const segments = hostname.split('.')\n return segments.every((segment) => {\n const value = Number(segment)\n return Number.isInteger(value) && value >= 0 && value <= 255\n })\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n if (hostname === 'localhost' || hostname.endsWith('.localhost')) return true\n if (hostname === '::1' || hostname === '[::1]') return true\n return isLoopbackIpv4(hostname)\n}\n\nfunction isLoopbackHttpUrl(value: string): boolean {\n try {\n const url = new URL(value)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false\n return isLoopbackHostname(url.hostname)\n } catch {\n return false\n }\n}\n\nfunction buildBootstrapRequestBody(runtimeConfig: RuntimeMcpConfig | null): BootstrapRequest {\n const locationPath = typeof window !== 'undefined' ? window.location.pathname : ''\n const locationOrigin = typeof window !== 'undefined' ? window.location.origin : null\n\n return {\n protocolVersion: PROTOCOL_VERSION,\n projectFingerprint: {\n path: runtimeConfig?.projectFingerprint?.path || locationPath || 'unknown',\n gitRemoteHash: runtimeConfig?.projectFingerprint?.gitRemoteHash ?? null,\n },\n ...(runtimeConfig?.workspaceId\n ? {\n workspaceId: runtimeConfig.workspaceId,\n }\n : {}),\n client: {\n name: CLIENT_NAME,\n version: runtimeConfig?.clientVersion\n ?? getEnvValue(CLIENT_VERSION_ENV_KEYS)\n ?? DEFAULT_CLIENT_VERSION,\n origin: locationOrigin,\n },\n }\n}\n\nfunction resolveBootstrapUrl(): string | null {\n const runtimeConfig = getRuntimeMcpConfig()\n const runtimeUrl = toSafeBootstrapUrl(runtimeConfig?.bootstrapUrl)\n if (runtimeUrl) return runtimeUrl\n\n const envUrl = toSafeBootstrapUrl(getEnvValue(BOOTSTRAP_ENV_KEYS))\n if (envUrl) return envUrl\n\n return null\n}\n\nfunction isSessionUsable(session: SessionContext | null, bootstrapUrl: string): session is SessionContext {\n if (!session) return false\n if (session.bootstrapUrl !== bootstrapUrl) return false\n if (session.expiresAt == null) return true\n return Date.now() < session.expiresAt - SESSION_EXPIRY_SKEW_MS\n}\n\nasync function readJsonRecord(response: Response): Promise<Record<string, unknown> | null> {\n try {\n const data = await response.json()\n if (!data || typeof data !== 'object') return null\n return data as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nasync function bootstrapSession(force = false): Promise<SessionContext | null> {\n const bootstrapUrl = resolveBootstrapUrl()\n if (!bootstrapUrl) {\n cachedSession = null\n return null\n }\n\n if (!force && isSessionUsable(cachedSession, bootstrapUrl)) {\n return cachedSession\n }\n\n const runtimeConfig = getRuntimeMcpConfig()\n try {\n const response = await fetch(bootstrapUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(buildBootstrapRequestBody(runtimeConfig)),\n signal: getTimeoutSignal(BOOTSTRAP_TIMEOUT_MS),\n })\n if (!response.ok) {\n cachedSession = null\n return null\n }\n\n const data = await readJsonRecord(response)\n const protocolVersion = readNumber(data, 'protocolVersion')\n if (protocolVersion !== PROTOCOL_VERSION) {\n cachedSession = null\n return null\n }\n\n const ingestBaseUrl = normalizeUrl(readString(data, 'ingestBaseUrl'))\n if (!ingestBaseUrl || !isLoopbackHttpUrl(ingestBaseUrl)) {\n cachedSession = null\n return null\n }\n\n const nextSession: SessionContext = {\n bootstrapUrl,\n ingestBaseUrl,\n serverInstanceId: readString(data, 'serverInstanceId'),\n projectId: readString(data, 'projectId'),\n sessionId: readString(data, 'sessionId'),\n accessToken: readString(data, 'accessToken'),\n expiresAt: parseExpiresAt(data?.expiresAt),\n }\n cachedSession = nextSession\n return nextSession\n } catch {\n cachedSession = null\n return null\n }\n}\n\nasync function refreshSessionToken(session: SessionContext): Promise<SessionContext | null> {\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (session.accessToken) {\n headers.Authorization = `Bearer ${session.accessToken}`\n }\n\n const response = await fetch(joinUrl(session.ingestBaseUrl, '/v1/sessions/refresh'), {\n method: 'POST',\n headers,\n body: JSON.stringify({\n protocolVersion: PROTOCOL_VERSION,\n projectId: session.projectId,\n sessionId: session.sessionId,\n }),\n signal: getTimeoutSignal(REQUEST_TIMEOUT_MS),\n })\n\n if (response.status === 404 || response.status === 405) {\n return null\n }\n if (!response.ok) {\n return null\n }\n\n const data = await readJsonRecord(response)\n const nextToken = readString(data, 'accessToken')\n if (!nextToken) {\n return null\n }\n\n const refreshedSession: SessionContext = {\n ...session,\n accessToken: nextToken,\n expiresAt: parseExpiresAt(data?.expiresAt) ?? session.expiresAt,\n }\n cachedSession = refreshedSession\n return refreshedSession\n } catch {\n return null\n }\n}\n\nfunction createIdempotencyKey(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n\n const timestamp = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 12)\n return `${timestamp}-${random}`\n}\n\nasync function sendAnnotationRequest(\n session: SessionContext,\n path: AnnotationPath,\n payload: Record<string, unknown>,\n idempotencyKey: string\n): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Idempotency-Key': idempotencyKey,\n }\n\n if (session.accessToken) {\n headers.Authorization = `Bearer ${session.accessToken}`\n }\n\n return fetch(joinUrl(session.ingestBaseUrl, path), {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: getTimeoutSignal(REQUEST_TIMEOUT_MS),\n })\n}\n\nasync function toClientResponse(response: Response): Promise<{ ok: boolean; id: string }> {\n const data = await readJsonRecord(response)\n const bodyOk = data?.ok\n const parsedOk = typeof bodyOk === 'boolean' ? bodyOk : response.ok\n\n return {\n ok: parsedOk && response.ok,\n id: readString(data, 'id') ?? '',\n }\n}\n\nasync function postWithSessionToken(\n path: AnnotationPath,\n payload: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n const idempotencyKey = createIdempotencyKey()\n\n let session = await bootstrapSession()\n if (!session) return { ok: false, id: '' }\n\n let response: Response\n try {\n response = await sendAnnotationRequest(session, path, payload, idempotencyKey)\n } catch {\n return { ok: false, id: '' }\n }\n\n if (response.status === 401 || response.status === 403) {\n session = (await refreshSessionToken(session)) ?? (await bootstrapSession(true))\n if (!session) return { ok: false, id: '' }\n\n try {\n response = await sendAnnotationRequest(session, path, payload, idempotencyKey)\n } catch {\n return { ok: false, id: '' }\n }\n }\n\n return toClientResponse(response)\n}\n\nexport async function sendEditToAgent(\n edit: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/v1/annotations/edit', edit)\n}\n\nexport async function sendCommentToAgent(\n comment: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/v1/annotations/comment', comment)\n}\n\nexport async function checkAgentConnection(): Promise<boolean> {\n const session = await bootstrapSession(true)\n return Boolean(session)\n}\n","import * as React from 'react'\nimport type { DirectEditState, ActiveTool } from './types'\nimport { isTextElement, isInputFocused } from './utils'\n\nexport interface KeyboardShortcutsOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n toggleEditMode: () => void\n toggleFlexLayout: () => void\n undo: () => void\n commitTextEditing: () => void\n startTextEditing: (element: HTMLElement) => void\n closePanel: () => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n toggleCanvas: () => void\n setCanvasZoom: (zoom: number) => void\n fitCanvasToViewport: () => void\n zoomCanvasTo100: () => void\n}\n\nexport function useKeyboardShortcuts({\n stateRef,\n toggleEditMode,\n toggleFlexLayout,\n undo,\n commitTextEditing,\n startTextEditing,\n closePanel,\n setState,\n toggleCanvas,\n setCanvasZoom,\n fitCanvasToViewport,\n zoomCanvasTo100,\n}: KeyboardShortcutsOptions) {\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 const s = stateRef.current\n\n if ((e.metaKey || e.ctrlKey) && e.key === 'z' && !e.shiftKey) {\n if (s.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 && s.editModeActive) {\n if (!isInputFocused()) {\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' as ActiveTool : 'comment' as ActiveTool,\n activeCommentId: null,\n }\n })\n return\n }\n }\n\n if (e.key === 'Z' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && s.editModeActive) {\n if (!isInputFocused()) {\n e.preventDefault()\n toggleCanvas()\n return\n }\n }\n\n if ((e.metaKey || e.ctrlKey) && !e.shiftKey && !e.altKey && s.canvas?.active) {\n if (e.code === 'Digit0' || e.key === '0') {\n e.preventDefault()\n fitCanvasToViewport()\n return\n }\n if (e.code === 'Digit1' || e.key === '1') {\n e.preventDefault()\n zoomCanvasTo100()\n return\n }\n if (e.code === 'Equal' || e.key === '=') {\n e.preventDefault()\n setCanvasZoom(Math.min(5.0, (s.canvas?.zoom ?? 1) * 1.1))\n return\n }\n if (e.code === 'Minus' || e.key === '-') {\n e.preventDefault()\n setCanvasZoom(Math.max(0.1, (s.canvas?.zoom ?? 1) / 1.1))\n return\n }\n }\n\n if (e.key === 'A' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && s.editModeActive && s.selectedElement) {\n if (!isInputFocused()) {\n e.preventDefault()\n toggleFlexLayout()\n return\n }\n }\n\n if (e.key === 'Enter' && s.editModeActive && !s.textEditingElement && s.selectedElement) {\n if (!isInputFocused() && isTextElement(s.selectedElement)) {\n e.preventDefault()\n startTextEditing(s.selectedElement)\n return\n }\n }\n\n if (e.key === 'Escape') {\n if (s.textEditingElement) {\n commitTextEditing()\n return\n }\n if (s.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 (s.activeTool === 'comment') {\n setState((prev) => ({ ...prev, activeTool: 'select' as ActiveTool }))\n } else if (s.isOpen) {\n closePanel()\n } else if (s.editModeActive) {\n toggleEditMode()\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [closePanel, toggleEditMode, toggleFlexLayout, undo, commitTextEditing, startTextEditing, toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100])\n}\n","import * as React from 'react'\nimport type { DirectEditState } from './types'\nimport { isInputFocused } from './utils'\nimport { setCanvasSnapshot, getBodyOffset, setBodyOffset, registerCanvasStoreOwner } from './canvas-store'\n\nconst MIN_ZOOM = 0.1\nconst MAX_ZOOM = 5.0\n\n// Zoom sensitivity applied to normalized pixel delta.\n// macOS trackpad pinch: deltaY ≈ 1–2px/event → ~0.3–0.6% per event (smooth).\n// Windows mouse Ctrl+scroll: deltaY ≈ 100px/notch → ~26% per notch.\nconst ZOOM_SENSITIVITY = 0.0145\n\n// Wheel delta normalization constants (Facebook normalizeWheel convention).\n// Required because Firefox can report DOM_DELTA_LINE and some Windows configs\n// use DOM_DELTA_PAGE, giving very different deltaY magnitudes than pixel mode.\nconst LINE_HEIGHT_PX = 40\nconst PAGE_HEIGHT_PX = 800\n\nfunction normalizeWheelDelta(e: WheelEvent): { deltaX: number; deltaY: number } {\n let { deltaX, deltaY } = e\n if (e.deltaMode === 1) { // DOM_DELTA_LINE\n deltaX *= LINE_HEIGHT_PX\n deltaY *= LINE_HEIGHT_PX\n } else if (e.deltaMode === 2) { // DOM_DELTA_PAGE\n deltaX *= PAGE_HEIGHT_PX\n deltaY *= PAGE_HEIGHT_PX\n }\n return { deltaX, deltaY }\n}\n\n// Clamp pan so at least PAN_MARGIN of the viewport always shows content,\n// preventing the user from panning content entirely off-screen.\n// fitCanvasToViewport centering values always satisfy this constraint.\nconst PAN_MARGIN = 0.1\n\nfunction clampPan(\n zoom: number,\n panX: number,\n panY: number,\n bodyW: number,\n bodyH: number,\n): { panX: number; panY: number } {\n const vw = window.innerWidth\n const vh = window.innerHeight\n // Content right edge must remain >= MARGIN * vw in viewport space:\n // (bodyW + panX) * zoom >= MARGIN * vw → panX >= MARGIN*vw/zoom - bodyW\n const minPanX = PAN_MARGIN * vw / zoom - bodyW\n // Content left edge must remain <= (1-MARGIN) * vw:\n // panX * zoom <= (1-MARGIN)*vw → panX <= (1-MARGIN)*vw/zoom\n const maxPanX = (1 - PAN_MARGIN) * vw / zoom\n const minPanY = PAN_MARGIN * vh / zoom - bodyH\n const maxPanY = (1 - PAN_MARGIN) * vh / zoom\n return {\n panX: Math.max(minPanX, Math.min(maxPanX, panX)),\n panY: Math.max(minPanY, Math.min(maxPanY, panY)),\n }\n}\n\nexport interface UseCanvasOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n}\n\nexport interface UseCanvasReturn {\n toggleCanvas: () => void\n enterCanvas: () => void\n exitCanvas: () => void\n setCanvasZoom: (zoom: number) => void\n fitCanvasToViewport: () => void\n zoomCanvasTo100: () => void\n}\n\nexport function useCanvas({ stateRef, setState }: UseCanvasOptions): UseCanvasReturn {\n React.useEffect(() => registerCanvasStoreOwner(), [])\n\n // Synchronous ref for canvas state (avoids stale closures in event handlers)\n const canvasRef = React.useRef({ active: false, zoom: 1, panX: 0, panY: 0 })\n\n // Saved state for restoring on exit\n const savedScrollRef = React.useRef({ x: 0, y: 0 })\n const savedBodyOverflowRef = React.useRef('')\n const savedHtmlOverflowRef = React.useRef('')\n const savedHtmlBgColorRef = React.useRef('')\n const savedBodyDimensionsRef = React.useRef({ width: 0, height: 0 })\n const savedScrollContainersRef = React.useRef<Array<{\n el: HTMLElement\n height: string\n maxHeight: string\n overflowX: string\n overflowY: string\n }>>([])\n\n // rAF batching for setState: DOM transform is applied immediately for visual\n // smoothness; React state is deferred to avoid 60fps re-renders across all consumers.\n // Note: RulersOverlay reads canvas state from React context and will lag by\n // one frame during rapid interaction — this is an accepted visual tradeoff.\n const rafIdRef = React.useRef<number | null>(null)\n const rafPendingRef = React.useRef(false)\n\n // Space key and drag state\n const spaceHeldRef = React.useRef(false)\n const isDraggingRef = React.useRef(false)\n const dragStartRef = React.useRef({ x: 0, y: 0, panX: 0, panY: 0 })\n\n const applyTransform = React.useCallback((zoom: number, panX: number, panY: number) => {\n document.body.style.transformOrigin = '0 0'\n document.body.style.transform = `scale(${zoom}) translate(${panX}px, ${panY}px)`\n }, [])\n\n const dispatchCanvasChange = React.useCallback(() => {\n window.dispatchEvent(new Event('direct-edit-canvas-change'))\n }, [])\n\n const readBodyOffset = React.useCallback(() => {\n const bodyStyle = getComputedStyle(document.body)\n return {\n x: parseFloat(bodyStyle.marginLeft) || 0,\n y: parseFloat(bodyStyle.marginTop) || 0,\n }\n }, [])\n\n const updateBodyOffset = React.useCallback(() => {\n const next = readBodyOffset()\n const prev = getBodyOffset()\n if (prev.x === next.x && prev.y === next.y) return false\n setBodyOffset(next)\n return true\n }, [readBodyOffset])\n\n const cancelPendingRaf = React.useCallback(() => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n rafPendingRef.current = false\n }\n }, [])\n\n const updateCanvas = React.useCallback((zoom: number, panX: number, panY: number) => {\n const dims = savedBodyDimensionsRef.current\n const bodyW = dims.width || window.innerWidth\n const bodyH = dims.height || window.innerHeight\n const clamped = clampPan(zoom, panX, panY, bodyW, bodyH)\n\n canvasRef.current = { ...canvasRef.current, zoom, panX: clamped.panX, panY: clamped.panY }\n setCanvasSnapshot(canvasRef.current)\n applyTransform(zoom, clamped.panX, clamped.panY)\n dispatchCanvasChange()\n\n // Batch React state update via rAF. The snapshot is read at fire time so\n // rapid events (e.g. 60fps wheel) collapse into a single setState per frame.\n if (!rafPendingRef.current) {\n rafPendingRef.current = true\n rafIdRef.current = requestAnimationFrame(() => {\n rafPendingRef.current = false\n rafIdRef.current = null\n const s = canvasRef.current\n setState((prev) => ({\n ...prev,\n canvas: { active: s.active, zoom: s.zoom, panX: s.panX, panY: s.panY },\n }))\n })\n }\n }, [applyTransform, dispatchCanvasChange, setState])\n\n function isScrollableContainer(el: HTMLElement): boolean {\n if (el.scrollHeight <= el.clientHeight + 1) return false\n const style = getComputedStyle(el)\n const overflowY = style.overflowY || style.overflow\n // Skip intentionally clipped containers; expanding them can inflate canvas bounds.\n if (overflowY === 'hidden' || overflowY === 'clip') return false\n return overflowY === 'auto' || overflowY === 'scroll' || overflowY === 'overlay'\n }\n\n function expandScrollContainers(): void {\n const saved: typeof savedScrollContainersRef.current = []\n const queue: HTMLElement[] = Array.from(document.body.children).filter(\n (el): el is HTMLElement => el instanceof HTMLElement\n )\n let visited = 0\n const maxNodes = 5000\n while (queue.length > 0 && visited < maxNodes) {\n const nextQueue: HTMLElement[] = []\n for (const el of queue) {\n if (visited >= maxNodes) break\n visited++\n if (isScrollableContainer(el)) {\n const style = el.style\n saved.push({\n el,\n height: style.height,\n maxHeight: style.maxHeight,\n overflowX: style.overflowX,\n overflowY: style.overflowY,\n })\n style.height = 'auto'\n style.maxHeight = 'none'\n style.overflowX = 'visible'\n style.overflowY = 'visible'\n }\n for (const child of el.children) {\n if (child instanceof HTMLElement) nextQueue.push(child)\n }\n }\n queue.length = 0\n queue.push(...nextQueue)\n }\n savedScrollContainersRef.current = saved\n }\n\n function restoreScrollContainers(): void {\n for (let i = savedScrollContainersRef.current.length - 1; i >= 0; i--) {\n const { el, height, maxHeight, overflowX, overflowY } = savedScrollContainersRef.current[i]\n el.style.height = height\n el.style.maxHeight = maxHeight\n el.style.overflowX = overflowX\n el.style.overflowY = overflowY\n }\n savedScrollContainersRef.current = []\n }\n\n const enterCanvas = React.useCallback(() => {\n const scrollX = window.scrollX\n const scrollY = window.scrollY\n savedScrollRef.current = { x: scrollX, y: scrollY }\n savedBodyOverflowRef.current = document.body.style.overflow\n savedHtmlOverflowRef.current = document.documentElement.style.overflow\n savedHtmlBgColorRef.current = document.documentElement.style.backgroundColor\n\n const existingTransform = document.body.style.transform\n if (existingTransform && existingTransform !== 'none' && existingTransform !== '') {\n console.warn('[made-refine] canvas mode: overriding existing body transform:', existingTransform)\n }\n\n // Reset window scroll so transform does the positioning\n window.scrollTo(0, 0)\n\n // Expand scroll containers so body reflects full content dimensions\n expandScrollContainers()\n\n savedBodyDimensionsRef.current = {\n width: document.body.scrollWidth,\n height: document.body.scrollHeight,\n }\n\n // Measure body margin before applying transform — needed for guideline math.\n updateBodyOffset()\n\n document.body.style.overflow = 'hidden'\n document.documentElement.style.overflow = 'hidden'\n document.documentElement.style.backgroundColor = '#F5F5F5'\n\n // Initial pan compensates for saved scroll position\n const initialPanX = -scrollX\n const initialPanY = -scrollY\n applyTransform(1, initialPanX, initialPanY)\n\n canvasRef.current = { active: true, zoom: 1, panX: initialPanX, panY: initialPanY }\n setCanvasSnapshot(canvasRef.current)\n setState((prev) => ({\n ...prev,\n canvas: { active: true, zoom: 1, panX: initialPanX, panY: initialPanY },\n }))\n dispatchCanvasChange()\n }, [applyTransform, dispatchCanvasChange, setState, updateBodyOffset])\n\n const exitCanvas = React.useCallback(() => {\n // Cancel any pending rAF first to prevent stale setState firing after exit\n // has already reset canvas state to { active: false, zoom: 1, panX: 0, panY: 0 }.\n cancelPendingRaf()\n\n document.body.style.transform = ''\n document.body.style.transformOrigin = ''\n restoreScrollContainers()\n document.body.style.overflow = savedBodyOverflowRef.current\n document.documentElement.style.overflow = savedHtmlOverflowRef.current\n document.documentElement.style.backgroundColor = savedHtmlBgColorRef.current\n document.body.style.cursor = ''\n\n window.scrollTo(savedScrollRef.current.x, savedScrollRef.current.y)\n\n setBodyOffset({ x: 0, y: 0 })\n canvasRef.current = { active: false, zoom: 1, panX: 0, panY: 0 }\n setCanvasSnapshot(canvasRef.current)\n setState((prev) => ({\n ...prev,\n canvas: { active: false, zoom: 1, panX: 0, panY: 0 },\n }))\n dispatchCanvasChange()\n }, [cancelPendingRaf, dispatchCanvasChange, setState])\n\n const toggleCanvas = React.useCallback(() => {\n if (canvasRef.current.active) {\n exitCanvas()\n } else {\n enterCanvas()\n }\n }, [enterCanvas, exitCanvas])\n\n const setCanvasZoom = React.useCallback((zoom: number) => {\n const c = canvasRef.current\n if (!c.active) return\n const clampedZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom))\n updateCanvas(clampedZoom, c.panX, c.panY)\n }, [updateCanvas])\n\n const fitCanvasToViewport = React.useCallback(() => {\n const c = canvasRef.current\n if (!c.active) return\n const bodyWidth = savedBodyDimensionsRef.current.width || window.innerWidth\n const bodyHeight = savedBodyDimensionsRef.current.height || window.innerHeight\n const scaleX = window.innerWidth / bodyWidth\n const scaleY = window.innerHeight / bodyHeight\n const zoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, Math.min(scaleX, scaleY) * 0.9))\n // Center content: panX = (viewportWidth/zoom - bodyWidth) / 2\n // These centering values always satisfy the pan clamp bounds.\n const panX = (window.innerWidth / zoom - bodyWidth) / 2\n const panY = (window.innerHeight / zoom - bodyHeight) / 2\n updateCanvas(zoom, panX, panY)\n }, [updateCanvas])\n\n const zoomCanvasTo100 = React.useCallback(() => {\n const c = canvasRef.current\n if (!c.active) return\n updateCanvas(1, 0, 0)\n }, [updateCanvas])\n\n // Wheel handler: Ctrl/Cmd+scroll = zoom-to-cursor, plain scroll = pan\n React.useEffect(() => {\n function handleWheel(e: WheelEvent) {\n const c = canvasRef.current\n if (!c.active) return\n e.preventDefault()\n\n const { deltaX, deltaY } = normalizeWheelDelta(e)\n\n if (e.ctrlKey || e.metaKey) {\n const zoomFactor = Math.exp(-deltaY * ZOOM_SENSITIVITY)\n const oldZoom = c.zoom\n const newZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, oldZoom * zoomFactor))\n const cx = e.clientX\n const cy = e.clientY\n // Zoom-to-cursor: account for body margin offset\n const bo = getBodyOffset()\n const newPanX = c.panX + (cx - bo.x) * (1 / newZoom - 1 / oldZoom)\n const newPanY = c.panY + (cy - bo.y) * (1 / newZoom - 1 / oldZoom)\n updateCanvas(newZoom, newPanX, newPanY)\n } else {\n // Pan: divide by zoom to convert viewport delta to content-space delta\n const newPanX = c.panX - deltaX / c.zoom\n const newPanY = c.panY - deltaY / c.zoom\n updateCanvas(c.zoom, newPanX, newPanY)\n }\n }\n\n window.addEventListener('wheel', handleWheel, { passive: false })\n return () => window.removeEventListener('wheel', handleWheel)\n }, [updateCanvas])\n\n // Body margins can change on responsive breakpoints; keep canvas math in sync.\n React.useEffect(() => {\n function handleResize() {\n if (!canvasRef.current.active) return\n if (updateBodyOffset()) {\n dispatchCanvasChange()\n }\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [dispatchCanvasChange, updateBodyOffset])\n\n // Space key tracking for grab cursor\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.code !== 'Space' || e.repeat) return\n if (!canvasRef.current.active) return\n if (isInputFocused()) return\n spaceHeldRef.current = true\n if (!isDraggingRef.current) {\n document.body.style.cursor = 'grab'\n }\n e.preventDefault()\n }\n\n function handleKeyUp(e: KeyboardEvent) {\n if (e.code !== 'Space') return\n if (!canvasRef.current.active) return\n spaceHeldRef.current = false\n if (!isDraggingRef.current) {\n document.body.style.cursor = ''\n }\n }\n\n window.addEventListener('keydown', handleKeyDown, true)\n window.addEventListener('keyup', handleKeyUp, true)\n return () => {\n window.removeEventListener('keydown', handleKeyDown, true)\n window.removeEventListener('keyup', handleKeyUp, true)\n }\n }, [])\n\n // Pointer drag for pan (Space+drag or middle mouse button).\n // Uses AbortController so all nested listeners are always removed together.\n // Also handles pointercancel and window blur to prevent stuck drag state.\n React.useEffect(() => {\n function handlePointerDown(e: PointerEvent) {\n const c = canvasRef.current\n if (!c.active) return\n const isMiddleMouse = e.button === 1\n const isSpaceDrag = spaceHeldRef.current && e.button === 0\n if (!isMiddleMouse && !isSpaceDrag) return\n\n e.preventDefault()\n isDraggingRef.current = true\n dragStartRef.current = { x: e.clientX, y: e.clientY, panX: c.panX, panY: c.panY }\n document.body.style.cursor = 'grabbing'\n\n const dragAbort = new AbortController()\n const opts = { signal: dragAbort.signal }\n\n function endDrag() {\n isDraggingRef.current = false\n document.body.style.cursor = spaceHeldRef.current ? 'grab' : ''\n dragAbort.abort()\n }\n\n window.addEventListener('pointermove', (moveE: PointerEvent) => {\n const current = canvasRef.current\n const dx = (moveE.clientX - dragStartRef.current.x) / current.zoom\n const dy = (moveE.clientY - dragStartRef.current.y) / current.zoom\n updateCanvas(current.zoom, dragStartRef.current.panX + dx, dragStartRef.current.panY + dy)\n }, opts)\n\n // pointercancel: pointer cancelled by system gesture or browser intervention\n // blur: tab switch or window focus loss mid-drag\n window.addEventListener('pointerup', endDrag, opts)\n window.addEventListener('pointercancel', endDrag, opts)\n window.addEventListener('blur', endDrag, opts)\n }\n\n window.addEventListener('pointerdown', handlePointerDown, true)\n return () => window.removeEventListener('pointerdown', handlePointerDown, true)\n }, [updateCanvas])\n\n // Cleanup on unmount: cancel pending rAF then restore DOM state\n React.useEffect(() => {\n return () => {\n cancelPendingRaf()\n if (canvasRef.current.active) {\n exitCanvas()\n }\n }\n }, [cancelPendingRaf, exitCanvas])\n\n return { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 }\n}\n","import { useSyncExternalStore } from 'react'\n\ntype CanvasSnapshot = { active: boolean; zoom: number; panX: number; panY: number }\n\nconst DEFAULT: CanvasSnapshot = { active: false, zoom: 1, panX: 0, panY: 0 }\n\nlet snapshot: CanvasSnapshot = DEFAULT\nconst listeners = new Set<() => void>()\nlet ownerCount = 0\n\nlet bodyOffset = { x: 0, y: 0 }\nexport function getBodyOffset() { return bodyOffset }\nexport function setBodyOffset(o: { x: number; y: number }) { bodyOffset = o }\n\nexport function getCanvasSnapshot(): CanvasSnapshot {\n return snapshot\n}\n\nexport function setCanvasSnapshot(next: CanvasSnapshot) {\n snapshot = next\n listeners.forEach((cb) => cb())\n}\n\nexport function registerCanvasStoreOwner(): () => void {\n ownerCount += 1\n if (ownerCount > 1 && (typeof process === 'undefined' || process.env.NODE_ENV !== 'test')) {\n console.warn('[made-refine] multiple DirectEditProvider instances share canvas-store globals')\n }\n return () => {\n ownerCount = Math.max(0, ownerCount - 1)\n }\n}\n\nfunction subscribe(cb: () => void) {\n listeners.add(cb)\n return () => {\n listeners.delete(cb)\n }\n}\n\n/** Synchronous canvas state — no rAF lag. Use for overlays that must track the DOM transform exactly. */\nexport function useCanvasSnapshot(): CanvasSnapshot {\n return useSyncExternalStore(subscribe, getCanvasSnapshot, () => DEFAULT)\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEditState, useDirectEditActions } from './provider'\nimport {\n TooltipProvider,\n} from './ui/tooltip'\nimport { cn } from './cn'\nimport type { SpacingPropertyKey, BorderRadiusPropertyKey, BorderPropertyKey, BorderProperties, CSSPropertyValue, SizingValue, SizingPropertyKey, ColorValue, ColorPropertyKey, TypographyPropertyKey, TypographyProperties, BorderStyleControlPreference } from './types'\nimport { useMeasurement } from './use-measurement'\nimport { MeasurementOverlay } from './measurement-overlay'\nimport { useMove } from './use-move'\nimport { getStoredGuidelines } from './use-guidelines'\nimport {\n calculateGuidelineMeasurements, isFlexContainer, isTextElement,\n resolveElementTarget, computeHoverHighlight,\n elementFromPointWithoutOverlays, findChildAtPoint,\n} from './utils'\nimport { InteractionOverlay } from './panel/interaction-overlay'\nimport { MoveOverlay } from './move-overlay'\nimport { SelectionOverlay } from './selection-overlay'\nimport { CommentOverlay } from './comment-overlay'\n// Panel module imports\nimport { NumberInput, Tip, CollapsibleSection, SectionNav, useSectionNav } from './panel/shared'\nimport type { SectionKey } from './panel/shared'\nimport { BorderRadiusInputs } from './panel/border-radius-inputs'\nimport { BorderSection } from './panel/border-section'\nimport { ShadowSection } from './panel/shadow-section'\nimport { TypographyInputs } from './panel/typography-inputs'\nimport { FillSection } from './panel/fill-section'\nimport { PanelHeader } from './panel/panel-header'\nimport { PanelFooter } from './panel/panel-footer'\nimport { LayoutSection } from './panel/layout-section'\nimport { usePanelPosition, PANEL_WIDTH, PANEL_HEIGHT } from './use-panel-position'\n\n// Re-export panel modules for external consumers\nexport { NumberInput, Tip, CollapsibleSection, SectionNav, useSectionNav, selectOnFocus } from './panel/shared'\nexport type { SectionKey } from './panel/shared'\nexport { SpacingInputs } from './panel/spacing-inputs'\nexport { BorderRadiusInputs, RadiusCornerIcon, BORDER_RADIUS_FULL, BORDER_RADIUS_SLIDER_MAX, sliderToValue, valueToSlider } from './panel/border-radius-inputs'\nexport { BorderSection, BorderInputs, BorderSideIcon, BORDER_STYLE_OPTIONS, BORDER_POSITION_OPTIONS, BORDER_SIDES, BORDER_SIDE_OPTIONS } from './panel/border-section'\nexport type { BorderPosition, BorderSideOption } from './panel/border-section'\nexport { ShadowSection, ShadowLayerEditor, ShadowField } from './panel/shadow-section'\nexport { TypographyInputs, FONT_FAMILIES, FONT_WEIGHTS } from './panel/typography-inputs'\nexport { FillSection, ColorInput } from './panel/fill-section'\nexport { SizingInputs, SizingDropdown, SizingFixedInput, SIZING_OPTIONS, DISTRIBUTE_MODES, DISTRIBUTE_LABELS } from './panel/sizing-inputs'\nexport type { DistributeMode } from './panel/sizing-inputs'\nexport { AlignmentGrid } from './panel/alignment-grid'\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 computedBoxShadow?: string\n borderStyleControlPreference?: BorderStyleControlPreference\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 canSendToAgent?: 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 onHeaderPointerCancel?: (e: React.PointerEvent) => void\n}\n\nexport function DirectEditPanelInner({\n elementInfo,\n computedSpacing,\n computedBorderRadius,\n computedBorder,\n computedFlex,\n computedSizing,\n computedColor,\n computedBoxShadow = 'none',\n borderStyleControlPreference = 'icon',\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 canSendToAgent = false,\n className,\n style,\n panelRef,\n isDragging,\n onHeaderPointerDown,\n onHeaderPointerMove,\n onHeaderPointerUp,\n onHeaderPointerCancel,\n}: DirectEditPanelInnerProps) {\n const hasPendingChanges = Object.keys(pendingStyles).length > 0\n const canTriggerSend = canSendToAgent || hasPendingChanges\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 shadow: 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 transition-shadow duration-200',\n isDragging && 'cursor-grabbing select-none shadow-2xl',\n className\n )}\n style={{\n width: PANEL_WIDTH,\n ...(isDragging && { transform: 'rotate(0.5deg) scale(1.01)', transition: 'transform 150ms ease-out, box-shadow 150ms ease-out' }),\n ...style,\n }}\n >\n <PanelHeader\n elementInfo={elementInfo}\n isDraggable={isDraggable}\n onClose={onClose}\n onSelectParent={onSelectParent}\n onSelectChild={onSelectChild}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n onPointerCancel={onHeaderPointerCancel}\n />\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} onWheelCapture={(e) => e.stopPropagation()}>\n <LayoutSection\n elementInfo={elementInfo}\n computedFlex={computedFlex}\n computedSpacing={computedSpacing}\n computedSizing={computedSizing}\n onToggleFlex={onToggleFlex}\n onUpdateFlex={onUpdateFlex}\n onUpdateSpacing={onUpdateSpacing}\n onUpdateSizing={onUpdateSizing}\n sectionRef={sectionRefs.layout}\n />\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 borderStyleControlPreference={borderStyleControlPreference}\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 <div ref={sectionRefs.shadow}>\n <ShadowSection\n boxShadow={computedBoxShadow}\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 <PanelFooter\n isDraggable={isDraggable}\n canTriggerSend={canTriggerSend}\n onExportEdits={onExportEdits}\n onSendToAgent={onSendToAgent}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n onPointerCancel={onHeaderPointerCancel}\n />\n </div>\n </TooltipProvider>\n )\n}\n\nfunction DirectEditPanelContent() {\n const container = usePortalContainer()\n const {\n isOpen, elementInfo,\n computedSpacing, computedBorderRadius, computedBorder, computedFlex,\n computedSizing, computedColor, computedBoxShadow, computedTypography,\n borderStyleControlPreference, pendingStyles,\n editModeActive, selectedElement, activeTool,\n comments, activeCommentId, textEditingElement,\n } = useDirectEditState()\n const {\n closePanel, selectParent, selectChild, selectElement,\n updateSpacingProperty, updateBorderRadiusProperty,\n updateBorderProperty, updateBorderProperties, updateRawCSS,\n updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n resetToOriginal, exportEdits, sendEditToAgent,\n handleMoveComplete, setActiveTool,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment,\n sendCommentToAgent, setActiveCommentId,\n startTextEditing, commitTextEditing,\n canSendEditToAgent,\n } = useDirectEditActions()\n\n const {\n position,\n isDragging,\n isSnapping,\n panelRef,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n } = usePanelPosition()\n\n const [hoverHighlight, setHoverHighlight] = React.useState<{\n flexContainer: HTMLElement\n children: HTMLElement[]\n } | null>(null)\n const [commentInputAttention, setCommentInputAttention] = React.useState<{ commentId: string; nonce: number } | null>(null)\n const commentDraftRef = React.useRef('')\n\n React.useEffect(() => {\n commentDraftRef.current = ''\n }, [activeCommentId])\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 triggerCommentInputAttention = React.useCallback((commentId: string) => {\n setCommentInputAttention((prev) => (\n prev?.commentId === commentId\n ? { commentId, nonce: prev.nonce + 1 }\n : { commentId, nonce: 1 }\n ))\n }, [])\n\n const hasPendingCommentDraft = React.useCallback((nextCommentId: string | null = null) => {\n if (!activeCommentId) return false\n if (nextCommentId && nextCommentId === activeCommentId) return false\n const active = comments.find((comment) => comment.id === activeCommentId)\n if (!active) return false\n // Block only unsent drafts (typed input not yet submitted to comment.text).\n const hasUnsentDraft = active.text.trim().length === 0 && commentDraftRef.current.trim().length > 0\n if (!hasUnsentDraft) return false\n triggerCommentInputAttention(active.id)\n return true\n }, [activeCommentId, comments, triggerCommentInputAttention])\n\n const handleSetActiveComment = React.useCallback((id: string | null) => {\n if (hasPendingCommentDraft(id)) return\n // Delete empty comment when switching away\n if (activeCommentId && activeCommentId !== id) {\n const active = comments.find((comment) => comment.id === activeCommentId)\n if (active && active.text.trim().length === 0) {\n deleteComment(active.id)\n }\n }\n setActiveCommentId(id)\n }, [activeCommentId, comments, hasPendingCommentDraft, deleteComment, setActiveCommentId])\n\n const overlay = editModeActive && container ? createPortal(\n <InteractionOverlay\n activeTool={activeTool}\n selectedElement={selectedElement}\n textEditingElement={textEditingElement}\n activeCommentId={activeCommentId}\n hoverHighlight={hoverHighlight}\n onSelectElement={selectElement}\n onStartTextEditing={startTextEditing}\n onAddComment={addComment}\n onSetActiveCommentId={handleSetActiveComment}\n onSetHoverHighlight={setHoverHighlight}\n hasPendingCommentDraft={hasPendingCommentDraft}\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={handleSetActiveComment}\n onUpdateText={updateCommentText}\n onAddReply={addCommentReply}\n onDelete={deleteComment}\n onExport={exportComment}\n onSendToAgent={sendCommentToAgent}\n attentionRequest={commentInputAttention}\n draftRef={commentDraftRef}\n />,\n container\n ) : null\n\n if (!isOpen || !computedSpacing || !elementInfo || !computedBorderRadius || !computedBorder || !computedFlex || !computedSizing || !computedColor || computedBoxShadow === null || !computedTypography || !container) return <>{overlay}{commentOverlay}</>\n\n const handleMoveStart = (\n e: React.PointerEvent,\n targetElement?: HTMLElement,\n options?: { constrainToOriginalParent?: boolean }\n ) => {\n const elementToDrag = targetElement ?? selectedElement\n if (elementToDrag) {\n startDrag(e, elementToDrag, options)\n }\n }\n\n const hasMultiItemFlexAncestor = (() => {\n if (!selectedElement) return false\n\n let current: HTMLElement | null = selectedElement.parentElement\n while (current) {\n if (isFlexContainer(current) && current.children.length > 1) {\n return true\n }\n current = current.parentElement\n }\n\n return false\n })()\n\n const showMoveHandle = Boolean(\n selectedElement\n && (\n (isFlexContainer(selectedElement) && selectedElement.children.length > 1)\n || hasMultiItemFlexAncestor\n )\n )\n\n return createPortal(\n <>\n {overlay}\n {commentOverlay}\n\n {selectedElement && (\n <SelectionOverlay\n selectedElement={selectedElement}\n draggedElement={dragState.draggedElement}\n isDragging={dragState.isDragging}\n ghostPosition={dragState.ghostPosition}\n onMoveStart={handleMoveStart}\n showMoveHandle={showMoveHandle}\n activeTool={activeTool}\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 computedBoxShadow={computedBoxShadow}\n borderStyleControlPreference={borderStyleControlPreference}\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 canSendToAgent={canSendEditToAgent({\n selectedElement,\n elementInfo,\n pendingStyles,\n })}\n className=\"fixed z-[99999]\"\n style={{\n left: position.x,\n top: position.y,\n maxHeight: PANEL_HEIGHT,\n pointerEvents: 'auto',\n ...(isSnapping && {\n transition: 'left 300ms cubic-bezier(0.34, 1.56, 0.64, 1), top 300ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n }),\n }}\n panelRef={panelRef}\n isDragging={isDragging}\n onHeaderPointerDown={handlePointerDown}\n onHeaderPointerMove={handlePointerMove}\n onHeaderPointerUp={handlePointerUp}\n onHeaderPointerCancel={handlePointerCancel}\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 { 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-xs outline-1 outline-border 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-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\nexport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n createTooltipHandle,\n}\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 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 window.addEventListener('direct-edit-canvas-change', handleUpdate)\n\n return () => {\n window.removeEventListener('scroll', handleUpdate, true)\n window.removeEventListener('resize', handleUpdate)\n window.removeEventListener('direct-edit-canvas-change', 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) => (\n <MeasurementLineComponent key={`${line.direction}-${line.x1}-${line.y1}-${line.x2}-${line.y2}`} 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 StartDragOptions {\n constrainToOriginalParent?: boolean\n}\n\nexport interface UseMoveResult {\n dragState: DragState\n dropTarget: UseMoveDropTarget | null\n dropIndicator: DropIndicator | null\n startDrag: (e: React.PointerEvent, element: HTMLElement, options?: StartDragOptions) => 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 const dragOptionsRef = React.useRef<StartDragOptions>({})\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 dragOptionsRef.current = {}\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 dragOptionsRef.current = {}\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, options?: StartDragOptions) => {\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 dragOptionsRef.current = options ?? {}\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 = dragOptionsRef.current.constrainToOriginalParent\n ? originalParent\n : 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'\nimport { getBodyOffset } from './canvas-store'\nimport { collectSnapTargets, findSnap, SNAP_THRESHOLD_PX } from './utils/snap-targets'\n\nconst STORAGE_KEY = 'direct-edit-guidelines'\n\nfunction isGuidelineOrientation(value: unknown): value is Guideline['orientation'] {\n return value === 'horizontal' || value === 'vertical'\n}\n\nfunction isValidGuideline(value: unknown): value is Guideline {\n if (!value || typeof value !== 'object') return false\n\n const candidate = value as Partial<Guideline>\n return (\n typeof candidate.id === 'string'\n && candidate.id.length > 0\n && isGuidelineOrientation(candidate.orientation)\n && typeof candidate.position === 'number'\n && Number.isFinite(candidate.position)\n )\n}\n\nexport interface UseGuidelinesResult {\n guidelines: Guideline[]\n activeGuideline: Guideline | null\n dragPosition: number | null\n isCreating: boolean\n isSnapped: 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 if (!stored) return []\n\n const parsed: unknown = JSON.parse(stored)\n if (!Array.isArray(parsed)) return []\n return parsed.filter(isValidGuideline)\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\nconst SNAP_VELOCITY_THRESHOLD = 3 // px/ms — snap only when dragging slower than this\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(\n enabled: boolean,\n hostElement?: HTMLElement | null,\n canvas?: { active: boolean; zoom: number; panX: number; panY: number } | null,\n): 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 canvasRef = React.useRef(canvas)\n canvasRef.current = canvas\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 const snapTargetsRef = React.useRef<number[]>([])\n const isSnappedRef = React.useRef(false)\n const [isSnapped, setIsSnapped] = React.useState(false)\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((prev) => {\n const x = window.scrollX\n const y = window.scrollY\n return prev.x === x && prev.y === y ? prev : { x, y }\n })\n }\n\n update()\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n window.addEventListener('direct-edit-canvas-change', update)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n window.removeEventListener('direct-edit-canvas-change', update)\n }\n }, [enabled])\n\n const endDrag = React.useCallback(() => {\n const wasCreating = dragInfoRef.current?.isCreating ?? false\n dragInfoRef.current = null\n snapTargetsRef.current = []\n isSnappedRef.current = false\n setIsSnapped(false)\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 let lastPos = NaN\n let lastTime = 0\n\n function onPointerMove(e: PointerEvent) {\n const rawViewportPos = orientation === 'horizontal' ? e.clientY : e.clientX\n\n // Compute velocity to gate snapping — only snap when dragging slowly\n const now = performance.now()\n const dt = now - lastTime\n const velocity = dt > 0 && !Number.isNaN(lastPos)\n ? Math.abs(rawViewportPos - lastPos) / dt\n : 0\n lastPos = rawViewportPos\n lastTime = now\n\n let effectiveViewportPos = rawViewportPos\n let snapped = false\n if (velocity < SNAP_VELOCITY_THRESHOLD) {\n const snapResult = findSnap(rawViewportPos, snapTargetsRef.current, SNAP_THRESHOLD_PX)\n if (snapResult !== null) {\n effectiveViewportPos = snapResult\n snapped = true\n }\n }\n\n isSnappedRef.current = snapped\n setIsSnapped(snapped)\n const pos = viewportToCssCoord(hostRef.current, effectiveViewportPos, axis)\n setDragPosition(pos)\n const c = canvasRef.current\n let storedPosition: number\n if (c?.active) {\n const pan = orientation === 'horizontal' ? (c.panY || 0) : (c.panX || 0)\n const bo = orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n storedPosition = bo + (pos - bo) / (c.zoom || 1) - pan\n } else {\n const currentScroll = orientation === 'horizontal' ? window.scrollY : window.scrollX\n storedPosition = pos + currentScroll\n }\n setGuidelines((prev) =>\n prev.map((g) => (g.id === guidelineId ? { ...g, position: storedPosition } : g)),\n )\n }\n\n function onPointerUp(e: PointerEvent) {\n const rawViewportPos = orientation === 'horizontal' ? e.clientY : e.clientX\n const snapResult = findSnap(rawViewportPos, snapTargetsRef.current, SNAP_THRESHOLD_PX)\n const pos = viewportToCssCoord(hostRef.current, snapResult ?? rawViewportPos, axis)\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 id = generateId()\n const c = canvasRef.current\n let storedPosition: number\n if (c?.active) {\n const pan = orientation === 'horizontal' ? (c.panY || 0) : (c.panX || 0)\n const bo = orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n storedPosition = bo + (pos - bo) / (c.zoom || 1) - pan\n } else {\n const scrollPos = orientation === 'horizontal' ? window.scrollY : window.scrollX\n storedPosition = pos + scrollPos\n }\n const newGuideline: Guideline = { id, orientation, position: storedPosition }\n\n snapTargetsRef.current = collectSnapTargets(orientation)\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 snapTargetsRef.current = collectSnapTargets(guideline.orientation)\n const c = canvasRef.current\n let viewportPos: number\n if (c?.active) {\n const pan = guideline.orientation === 'horizontal' ? (c.panY || 0) : (c.panX || 0)\n const bo = guideline.orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n viewportPos = bo + (guideline.position - bo + pan) * (c.zoom || 1)\n } else {\n const scrollPos = guideline.orientation === 'horizontal' ? window.scrollY : window.scrollX\n viewportPos = guideline.position - scrollPos\n }\n setActiveGuidelineId(guidelineId)\n setDragPosition(viewportPos)\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 isSnapped,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n clearAll,\n }\n}\n","export const SNAP_THRESHOLD_PX = 6\n\n/**\n * Collect viewport-space edge positions from visible DOM elements.\n * Called once at drag start to avoid DOM access during pointermove.\n */\nexport function collectSnapTargets(orientation: 'horizontal' | 'vertical'): number[] {\n const edges: number[] = []\n const elements = document.body.querySelectorAll('*')\n const viewportW = window.innerWidth\n const viewportH = window.innerHeight\n\n for (let i = 0; i < elements.length; i++) {\n const el = elements[i] as HTMLElement\n if (el === document.body || el === document.documentElement) continue\n if (el.closest('[data-direct-edit]') || el.closest('[data-direct-edit-host]')) continue\n // Skip display:none subtrees without calling getBoundingClientRect.\n // offsetParent is null for display:none elements (and position:fixed, which\n // we intentionally exclude — snap targets should be page content, not UI overlays).\n if (el.offsetParent === null && el !== document.body) continue\n\n const rect = el.getBoundingClientRect()\n if (rect.width < 4 || rect.height < 4) continue\n\n // Skip off-screen elements (200px buffer)\n if (\n rect.right < -200\n || rect.bottom < -200\n || rect.left > viewportW + 200\n || rect.top > viewportH + 200\n ) continue\n\n if (orientation === 'horizontal') {\n edges.push(rect.top, rect.bottom)\n } else {\n edges.push(rect.left, rect.right)\n }\n\n if (edges.length >= 2000) break\n }\n\n return edges\n}\n\n/**\n * Find the nearest snap edge within threshold.\n * Returns the snapped viewport position, or null if nothing is close enough.\n */\nexport function findSnap(\n viewportPos: number,\n snapEdges: number[],\n threshold: number,\n): number | null {\n let best: number | null = null\n let bestDist = threshold + 1\n\n for (let i = 0; i < snapEdges.length; i++) {\n const dist = Math.abs(snapEdges[i] - viewportPos)\n if (dist < bestDist) {\n bestDist = dist\n best = snapEdges[i]\n }\n }\n\n return bestDist <= threshold ? best : null\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\nimport type { ActiveTool } from '../types'\nimport {\n isTextElement,\n resolveElementTarget,\n computeHoverHighlight,\n elementFromPointWithoutOverlays,\n} from '../utils'\n\nexport interface InteractionOverlayProps {\n activeTool: ActiveTool\n selectedElement: HTMLElement | null\n textEditingElement: HTMLElement | null\n activeCommentId: string | null\n hoverHighlight: {\n flexContainer: HTMLElement\n children: HTMLElement[]\n } | null\n onSelectElement: (element: HTMLElement) => void\n onStartTextEditing: (element: HTMLElement) => void\n onAddComment: (element: HTMLElement, position: { x: number; y: number }) => void\n onSetActiveCommentId: (id: string | null) => void\n onSetHoverHighlight: (highlight: { flexContainer: HTMLElement; children: HTMLElement[] } | null) => void\n hasPendingCommentDraft: () => boolean\n}\n\nexport function InteractionOverlay({\n activeTool,\n selectedElement,\n textEditingElement,\n activeCommentId,\n hoverHighlight,\n onSelectElement,\n onStartTextEditing,\n onAddComment,\n onSetActiveCommentId,\n onSetHoverHighlight,\n hasPendingCommentDraft,\n}: InteractionOverlayProps) {\n return (\n <>\n <div\n role=\"presentation\"\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) onSelectElement(resolved)\n onStartTextEditing(resolved)\n }\n }\n }}\n onMouseMove={(e) => {\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n onSetHoverHighlight(computeHoverHighlight(elementUnder, selectedElement))\n }}\n onMouseLeave={() => onSetHoverHighlight(null)}\n onClick={(e) => {\n e.preventDefault()\n onSetHoverHighlight(null)\n if (activeTool === 'comment') {\n if (hasPendingCommentDraft()) return\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n const target = (elementUnder && elementUnder !== document.body && elementUnder !== document.documentElement)\n ? resolveElementTarget(elementUnder, selectedElement)\n : document.body\n onAddComment(target, { x: e.clientX, y: e.clientY })\n return\n }\n if (activeCommentId) { onSetActiveCommentId(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 onSelectElement(resolved)\n }\n }}\n />\n {hoverHighlight && (() => {\n const cr = hoverHighlight.flexContainer.getBoundingClientRect()\n return (\n <div\n data-direct-edit=\"hover-highlight\"\n className=\"pointer-events-none fixed inset-0 z-[99991]\"\n >\n <div\n style={{\n position: 'absolute',\n left: cr.left,\n top: cr.top,\n width: cr.width,\n height: cr.height,\n border: '1px solid #3b82f6',\n borderRadius: '0px',\n boxSizing: 'border-box',\n }}\n />\n {hoverHighlight.children.map((child) => {\n const r = child.getBoundingClientRect()\n return (\n <div\n key={`${r.left}-${r.top}-${r.width}-${r.height}`}\n style={{\n position: 'absolute',\n left: r.left,\n top: r.top,\n width: r.width,\n height: r.height,\n border: '1px dashed #3b82f6',\n borderRadius: '0px',\n boxSizing: 'border-box',\n }}\n />\n )\n })}\n </div>\n )\n })()}\n </>\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 type { ActiveTool } from './types'\nimport { elementFromPointWithoutOverlays } from './utils'\n\nconst BLUE = '#0D99FF'\nconst MAGENTA = '#E11BB6'\nconst DRAG_THRESHOLD = 4\nconst DBLCLICK_DELAY = 300\nconst HANDLE_SIZE = 12\n\ninterface MoveStartOptions {\n constrainToOriginalParent?: boolean\n}\n\nexport interface SelectionOverlayProps {\n selectedElement: HTMLElement\n draggedElement?: HTMLElement | null\n isDragging: boolean\n ghostPosition?: { x: number; y: number }\n onMoveStart: (\n e: React.PointerEvent,\n targetElement?: HTMLElement,\n options?: MoveStartOptions\n ) => void\n showMoveHandle?: boolean\n activeTool?: ActiveTool\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 draggedElement,\n isDragging,\n ghostPosition,\n onMoveStart,\n showMoveHandle = false,\n activeTool = 'select',\n isTextEditing,\n onDoubleClick,\n onHoverElement,\n onClickThrough,\n}: SelectionOverlayProps) {\n const rectElement = isDragging && draggedElement ? draggedElement : selectedElement\n const [rect, setRect] = React.useState(() => rectElement.getBoundingClientRect())\n const [moveHandleRects, setMoveHandleRects] = React.useState<Array<{\n target: HTMLElement\n left: number\n top: number\n width: number\n height: number\n }>>([])\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(rectElement.getBoundingClientRect())\n }\n\n updateRect()\n\n window.addEventListener('scroll', updateRect, true)\n window.addEventListener('resize', updateRect)\n window.addEventListener('direct-edit-canvas-change', updateRect)\n\n const observer = new MutationObserver(updateRect)\n observer.observe(rectElement, {\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 window.removeEventListener('direct-edit-canvas-change', updateRect)\n observer.disconnect()\n }\n }, [rectElement])\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 getMoveHandleTargets = React.useCallback(() => {\n if (!showMoveHandle) return []\n const selectedDisplay = window.getComputedStyle(selectedElement).display\n const selectedIsFlexContainer = selectedDisplay === 'flex' || selectedDisplay === 'inline-flex'\n\n if (selectedIsFlexContainer && selectedElement.children.length > 1) {\n return Array.from(selectedElement.children).filter((child): child is HTMLElement => child instanceof HTMLElement)\n }\n\n let flexParent: HTMLElement | null = selectedElement.parentElement\n while (flexParent) {\n const display = window.getComputedStyle(flexParent).display\n const isFlex = display === 'flex' || display === 'inline-flex'\n if (isFlex && flexParent.children.length > 1) {\n break\n }\n flexParent = flexParent.parentElement\n }\n\n if (!flexParent) {\n return [selectedElement]\n }\n\n let target: HTMLElement = selectedElement\n while (target.parentElement && target.parentElement !== flexParent) {\n target = target.parentElement\n }\n\n return [target]\n }, [selectedElement, showMoveHandle])\n\n React.useEffect(() => {\n if (!showMoveHandle || isDragging || isTextEditing) {\n setMoveHandleRects([])\n return\n }\n\n const targets = getMoveHandleTargets()\n setMoveHandleRects(targets.map((target) => {\n const targetRect = target.getBoundingClientRect()\n return {\n target,\n left: targetRect.left,\n top: targetRect.top,\n width: targetRect.width,\n height: targetRect.height,\n }\n }))\n }, [\n rect,\n selectedElement,\n selectedElement.parentElement,\n selectedElement.childElementCount,\n showMoveHandle,\n isDragging,\n isTextEditing,\n getMoveHandleTargets,\n ])\n\n const handleMoveHandlePointerDown = (target: HTMLElement) => (e: React.PointerEvent<HTMLButtonElement>) => {\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) {\n clearTimeout(clickThroughTimerRef.current)\n clickThroughTimerRef.current = null\n }\n onMoveStart(e, target, { constrainToOriginalParent: true })\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 {!isTextEditing && (\n <div\n data-direct-edit=\"selection-overlay\"\n style={{\n position: 'fixed',\n left: displayX,\n top: displayY,\n width: rect.width,\n height: rect.height,\n pointerEvents: 'none',\n zIndex: 99996,\n border: `1px solid ${BLUE}`,\n borderRadius: '0px',\n boxSizing: 'border-box',\n }}\n />\n )}\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: activeTool === 'comment' ? 'none' : 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n {moveHandleRects.map((targetRect) => {\n return (\n <button\n key={`${targetRect.left}-${targetRect.top}-${targetRect.width}-${targetRect.height}`}\n type=\"button\"\n data-direct-edit=\"move-handle\"\n aria-label=\"Move element\"\n title=\"Drag to reorder\"\n style={{\n position: 'absolute',\n left: targetRect.left - rect.left + targetRect.width / 2 - HANDLE_SIZE / 2,\n top: targetRect.top - rect.top + targetRect.height / 2 - HANDLE_SIZE / 2,\n width: HANDLE_SIZE,\n height: HANDLE_SIZE,\n borderRadius: 9999,\n border: `1px solid ${MAGENTA}`,\n background: 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: 'none',\n cursor: 'grab',\n pointerEvents: 'auto',\n padding: 0,\n }}\n onPointerDown={handleMoveHandlePointerDown(targetRect.target)}\n />\n )\n })}\n </div>\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\"><{locator.tagName.toLowerCase()}></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 attentionRequest?: { commentId: string; nonce: number } | null\n draftRef?: React.MutableRefObject<string>\n}\n\nexport function CommentOverlay({\n comments,\n activeCommentId,\n onSetActiveComment,\n onUpdateText,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n attentionRequest = null,\n draftRef,\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 ? () => onExport(comment.id) : undefined}\n onSendToAgent={() => onSendToAgent(comment.id)}\n attentionNonce={attentionRequest?.commentId === comment.id ? attentionRequest.nonce : 0}\n draftRef={activeCommentId === comment.id ? draftRef : undefined}\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 attentionNonce: number\n draftRef?: React.MutableRefObject<string>\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 attentionNonce,\n draftRef,\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\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 * rect.width,\n y: rect.top + comment.relativePosition.y * rect.height,\n })\n setElementRect(rect)\n }\n\n updatePosition()\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n window.addEventListener('direct-edit-canvas-change', updatePosition)\n return () => {\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('direct-edit-canvas-change', 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 <button\n type=\"button\"\n data-direct-edit=\"comment-pin\"\n aria-label={`Comment ${index}`}\n className=\"group/pin fixed z-[99998] flex size-3 cursor-pointer items-center justify-center rounded-full border-none bg-blue-500 p-0 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 </button>\n\n {isActive && (\n comment.text === '' ? (\n <NewCommentInput\n position={position}\n flipHorizontal={flipHorizontal}\n flipVertical={flipVertical}\n onSubmit={(text) => {\n onUpdateText(text)\n }}\n onCancel={onClose}\n attentionNonce={attentionNonce}\n draftRef={draftRef}\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 }}\n onDelete={onDelete}\n onExport={onExport}\n onSendToAgent={onSendToAgent}\n />\n )\n )}\n </>\n )\n}\n\ninterface NewCommentInputProps {\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onSubmit: (text: string) => void\n onCancel: () => void\n attentionNonce: number\n draftRef?: React.MutableRefObject<string>\n}\n\nfunction NewCommentInput({\n position,\n flipHorizontal,\n flipVertical,\n onSubmit,\n onCancel,\n attentionNonce,\n draftRef,\n}: NewCommentInputProps) {\n const [text, setText] = React.useState('')\n const [showError, setShowError] = React.useState(false)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const cardRef = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n React.useEffect(() => {\n if (attentionNonce <= 0) return\n setShowError(true)\n cardRef.current?.animate?.(\n [\n { transform: 'translateX(0)' },\n { transform: 'translateX(-6px)' },\n { transform: 'translateX(6px)' },\n { transform: 'translateX(-4px)' },\n { transform: 'translateX(4px)' },\n { transform: 'translateX(0)' },\n ],\n { duration: 260, easing: 'ease-in-out' }\n )\n const timeout = window.setTimeout(() => setShowError(false), 420)\n return () => window.clearTimeout(timeout)\n }, [attentionNonce])\n\n return (\n <div\n ref={cardRef}\n role=\"presentation\"\n data-direct-edit=\"comment-card\"\n className={cn(\n '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 showError && 'outline-red-500/70'\n )}\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 aria-invalid={showError}\n className={cn(\n 'min-w-0 flex-1 bg-transparent px-1.5 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none',\n showError && 'placeholder:text-red-400'\n )}\n placeholder=\"Add a comment...\"\n value={text}\n onChange={(e) => {\n setText(e.target.value)\n if (draftRef) draftRef.current = e.target.value\n }}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter' && text.trim()) {\n onSubmit(text.trim())\n } else if (e.key === 'Escape') {\n onCancel()\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-md transition-colors',\n text.trim()\n ? 'bg-blue-500 text-white hover:bg-blue-600'\n : 'bg-muted text-muted-foreground'\n )}\n disabled={!text.trim()}\n onClick={() => {\n if (text.trim()) onSubmit(text.trim())\n }}\n >\n <ArrowUp className=\"size-3.5\" />\n </button>\n </div>\n )\n}\n\ninterface CommentThreadProps {\n comment: Comment\n index: number\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onClose: () => void\n onAddReply: (text: string) => void\n onDelete: () => void\n onExport?: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n}\n\nfunction CommentThread({\n comment,\n index,\n position,\n flipHorizontal,\n flipVertical,\n onClose,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentThreadProps) {\n const [replyText, setReplyText] = React.useState('')\n const [copied, setCopied] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const inputRef = React.useRef<HTMLInputElement>(null)\n const copyTimerRef = React.useRef<number | null>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n React.useEffect(() => {\n return () => {\n if (copyTimerRef.current) {\n window.clearTimeout(copyTimerRef.current)\n }\n }\n }, [])\n\n const handleCopy = async () => {\n if (!onExport) return\n const success = await onExport()\n if (success) {\n if (copyTimerRef.current) {\n window.clearTimeout(copyTimerRef.current)\n }\n setCopied(true)\n copyTimerRef.current = window.setTimeout(() => {\n copyTimerRef.current = null\n setCopied(false)\n }, 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 role=\"presentation\"\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 {onExport && (\n <Tooltip>\n <TooltipTrigger\n render={\n <button\n type=\"button\"\n aria-label={copied ? 'Copied' : 'Copy comment export'}\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 )}\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) => (\n <div key={reply.createdAt} 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 { Input } from '../ui/input'\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '../ui/tooltip'\nimport { cn } from '../cn'\n\nexport const selectOnFocus = (e: React.FocusEvent<HTMLInputElement>) => e.target.select()\n\ninterface NumberInputProps extends Omit<React.ComponentProps<typeof Input>, 'value' | 'onChange' | 'type'> {\n value: number | null\n onValueChange: (value: number) => void\n}\n\nexport function NumberInput({ value: propValue, onValueChange, ...props }: NumberInputProps) {\n const [localValue, setLocalValue] = React.useState(propValue === null ? '' : String(propValue))\n\n React.useEffect(() => {\n setLocalValue(propValue === null ? '' : 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(propValue === null ? '' : String(propValue))\n }\n }}\n onFocus={selectOnFocus}\n />\n )\n}\n\nexport function 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 CollapsibleSectionProps {\n title: string\n actions?: React.ReactNode\n children: React.ReactNode\n}\n\nexport function 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\nexport type SectionKey = 'layout' | 'radius' | 'border' | 'shadow' | 'colors' | 'text'\n\nexport const SECTION_LABELS: Record<SectionKey, string> = {\n layout: 'Layout',\n radius: 'Radius',\n border: 'Border',\n shadow: 'Shadow',\n colors: 'Colors',\n text: 'Text',\n}\n\nexport function 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\nexport function 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', 'shadow']\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 overflow-x-auto overflow-y-hidden whitespace-nowrap border-b border-border/50 bg-background px-2 py-1 [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\n {sections.map((key) => (\n <button\n key={key}\n type=\"button\"\n className={cn(\n 'shrink-0 rounded-md px-2 py-1 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\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","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 { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Slider } from '../ui/slider'\nimport { cn } from '../cn'\nimport type { BorderRadiusPropertyKey, CSSPropertyValue } from '../types'\nimport { NumberInput, Tip, selectOnFocus } from './shared'\nimport {\n Columns2,\n Grid2x2,\n} from 'lucide-react'\n\nexport const BORDER_RADIUS_FULL = 9999\nexport const BORDER_RADIUS_SLIDER_MAX = 49\n\n// Slider position 0-48 maps to 0-48px, position 49 maps to 9999 (Full)\nexport function sliderToValue(sliderPos: number): number {\n return sliderPos >= BORDER_RADIUS_SLIDER_MAX ? BORDER_RADIUS_FULL : sliderPos\n}\n\nexport function valueToSlider(value: number): number {\n return value >= BORDER_RADIUS_FULL ? BORDER_RADIUS_SLIDER_MAX : Math.min(value, BORDER_RADIUS_SLIDER_MAX - 1)\n}\n\nexport function 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\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\nexport function 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 combinedValue = 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 isMixed = !allSame\n const isFull = !isMixed && combinedValue >= BORDER_RADIUS_FULL\n const displayValue = isMixed ? 'mixed' : (isFull ? 'Full' : String(combinedValue))\n const sliderValue = valueToSlider(combinedValue)\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","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 * 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 {\n SelectTrigger,\n SelectIcon,\n} from '../ui/select'\nimport { SimpleSelect } from '../ui/simple-select'\nimport { cn } from '../cn'\nimport type { BorderPropertyKey, BorderProperties, BorderStyle, CSSPropertyValue, ColorValue, BorderStyleControlPreference } from '../types'\nimport { ColorPickerGroup } from '../ui/color-picker'\nimport { NumberInput, Tip, CollapsibleSection } from './shared'\nimport { ColorInput } from './fill-section'\nimport {\n ChevronDown,\n Square,\n Focus,\n Settings2,\n Grid2x2,\n Plus,\n Minus,\n} from 'lucide-react'\n\nexport const 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\nexport type BorderPosition = 'border' | 'outline'\nexport const BORDER_POSITION_OPTIONS: Array<{ value: BorderPosition; label: string }> = [\n { value: 'border', label: 'Border' },\n { value: 'outline', label: 'Outline' },\n]\n\nexport const BORDER_SIDES = ['Top', 'Right', 'Bottom', 'Left'] as const\n\nexport const BORDER_SIDE_OPTIONS = ['All', 'Top', 'Right', 'Bottom', 'Left', 'Custom'] as const\nexport type BorderSideOption = typeof BORDER_SIDE_OPTIONS[number]\n\nexport function 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\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 borderStyleControlPreference: BorderStyleControlPreference\n onPositionChange: (position: BorderPosition) => void\n outlineStyle?: BorderStyle\n outlineWidth?: number\n}\n\nexport function BorderInputs({ border, borderColor, outlineColor, onChange, onBatchChange, onBorderColorChange, onOutlineColorChange, onSetCSS, borderPosition, borderStyleControlPreference, 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 handleSideChange = (newSide: BorderSideOption) => {\n setSelectedSide(newSide)\n\n if (newSide === 'Custom') return\n\n if (newSide === 'All') {\n // Set all sides to the max width across all sides\n const maxWidth = Math.max(\n ...BORDER_SIDES.map((s) => (border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue).numericValue),\n )\n const value: CSSPropertyValue = { numericValue: maxWidth, unit: 'px', raw: `${maxWidth}px` }\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Width` as BorderPropertyKey, value])\n }\n onBatchChange(changes)\n return\n }\n\n // Specific side: set that side to currentWidth, zero out the rest\n const sideWidth = (border[`border${newSide}Width` as keyof BorderProperties] as CSSPropertyValue).numericValue\n const width = currentWidth ?? sideWidth ?? 1\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n const value: CSSPropertyValue = s === newSide\n ? { numericValue: width, unit: 'px', raw: `${width}px` }\n : { numericValue: 0, unit: 'px', raw: '0px' }\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 const currentStyleLabel = BORDER_STYLE_OPTIONS.find((o) => o.value === currentStyle)?.label ?? currentStyle\n\n return (\n <div className=\"space-y-2\">\n {/* Row 1: Position + Style + Width + Side */}\n <div className=\"flex items-center gap-1.5\">\n <SimpleSelect\n value={borderPosition}\n onValueChange={(val) => onPositionChange(val as BorderPosition)}\n options={BORDER_POSITION_OPTIONS}\n triggerClassName=\"min-w-0 flex-1\"\n />\n\n <Tip label={isOutline ? 'Outline width' : 'Border width'}>\n <div className={cn(borderStyleControlPreference === 'icon' && 'min-w-0 flex-1')}>\n <NumberInput\n min={0}\n step={0.5}\n value={typeof currentWidth === 'number' ? Math.round(currentWidth * 100) / 100 : null}\n placeholder={currentWidth === null ? 'mixed' : undefined}\n onValueChange={handleAllWidthChange}\n className={cn(\n 'h-7 px-2 text-center text-xs tabular-nums',\n borderStyleControlPreference === 'icon' ? 'w-full' : 'w-11',\n )}\n />\n </div>\n </Tip>\n\n <SimpleSelect\n value={currentStyle}\n onValueChange={(val) => handleStyleChange(val as BorderStyle)}\n options={BORDER_STYLE_OPTIONS}\n popupMinWidth=\"120px\"\n >\n {borderStyleControlPreference === 'icon' ? (\n <Tip label={`Border style: ${currentStyleLabel}`}>\n <SelectTrigger className=\"flex h-7 w-auto shrink-0 items-center justify-center rounded-md border-0 px-2 text-xs text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\">\n <Settings2 className=\"size-3.5\" />\n </SelectTrigger>\n </Tip>\n ) : (\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-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\">\n <span className=\"flex items-center gap-1.5\">\n <Square className=\"size-3.5 text-muted-foreground\" />\n <span>{currentStyleLabel}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3.5 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n )}\n </SimpleSelect>\n\n {!isOutline && (\n <SimpleSelect\n value={selectedSide}\n onValueChange={(val) => handleSideChange(val as BorderSideOption)}\n options={BORDER_SIDE_OPTIONS.map((side) => ({ value: side, label: side }))}\n popupMinWidth=\"90px\"\n >\n <Tip label={`Sides: ${selectedSide}`}>\n <SelectTrigger className=\"flex h-7 w-auto shrink-0 items-center justify-center rounded-md border-0 px-2 text-xs text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\">\n {selectedSide === 'Custom' ? (\n <Grid2x2 className=\"size-3.5 text-muted-foreground\" strokeWidth={1} />\n ) : selectedSide === 'All' ? (\n <Square className=\"size-3.5 text-muted-foreground\" />\n ) : (\n <BorderSideIcon side={selectedSide} className=\"text-muted-foreground\" />\n )}\n </SelectTrigger>\n </Tip>\n </SimpleSelect>\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\n {/* Row 2: Color */}\n {activeColor && activeColorChange && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"min-w-0 flex-1\">\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 </div>\n {borderStyleControlPreference === 'icon' && <div className=\"w-[30px] shrink-0\" />}\n {!isOutline && <div className=\"w-[30px] shrink-0\" />}\n </div>\n )}\n </div>\n )\n}\n\ninterface BorderSectionProps {\n border: BorderProperties\n borderColor?: ColorValue\n outlineColor?: ColorValue\n borderStyleControlPreference: BorderStyleControlPreference\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\nexport function BorderSection({ border, borderColor, outlineColor, borderStyleControlPreference, 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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 borderStyleControlPreference={borderStyleControlPreference}\n onPositionChange={handlePositionChange}\n outlineStyle={outlineStyleValue}\n outlineWidth={outlineWidthValue}\n />\n </ColorPickerGroup>\n ) : null}\n </CollapsibleSection>\n )\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 { Check, ChevronDown } from 'lucide-react'\nimport {\n Select,\n SelectTrigger,\n SelectIcon,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from './select'\nimport { cn } from '../cn'\n\ninterface SimpleSelectOption {\n value: string\n label: string\n}\n\ninterface SimpleSelectProps {\n value: string\n onValueChange: (value: string) => void\n options: SimpleSelectOption[]\n popupMinWidth?: string\n triggerClassName?: string\n itemClassName?: string\n children?: React.ReactNode\n icon?: React.ReactNode\n label?: string\n}\n\nfunction SimpleSelect({\n value,\n onValueChange,\n options,\n popupMinWidth = '100px',\n triggerClassName,\n itemClassName,\n children,\n icon,\n label,\n}: SimpleSelectProps) {\n const defaultItemClass = '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 return (\n <Select value={value} onValueChange={(val) => val && onValueChange(val)}>\n {children ?? (\n <SelectTrigger className={cn(\n 'flex h-7 items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n triggerClassName,\n )}>\n <span className=\"flex items-center gap-2\">\n {icon}\n <span>{label ?? options.find((o) => o.value === value)?.label ?? value}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3.5 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n )}\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className={cn(\n '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 )} style={{ minWidth: popupMinWidth }}>\n {options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className={itemClassName ?? defaultItemClass}\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}\n\nexport { SimpleSelect }\nexport type { SimpleSelectOption, SimpleSelectProps }\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 type { ColorValue } from '../types'\nimport { formatColorValue } from '../ui/color-utils'\nimport { ColorPickerPopover, ColorPickerGroup } from '../ui/color-picker'\nimport {\n Paintbrush,\n Square,\n Focus,\n Type,\n} from 'lucide-react'\n\ninterface ColorInputProps {\n id?: string\n label: string\n icon: React.ReactNode\n value: ColorValue\n onChange: (value: ColorValue) => void\n}\n\nexport function 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\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\nexport function 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}\n","import * as React from 'react'\nimport { formatColorValue } from '../ui/color-utils'\nimport { ColorPickerPopover } from '../ui/color-picker'\nimport { createDefaultShadowLayer, parseShadowLayers, serializeShadowLayers, type EditableShadowLayer } from '../shadow-utils'\nimport { NumberInput, Tip, CollapsibleSection } from './shared'\nimport {\n Plus,\n Minus,\n} from 'lucide-react'\n\nexport function ShadowField({\n label,\n value,\n onChange,\n}: {\n label: string\n value: number\n onChange: (value: number) => void\n}) {\n return (\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-xs text-muted-foreground\">{label}</span>\n <NumberInput\n value={value}\n onValueChange={onChange}\n className=\"h-7 pl-7 pr-2 text-xs tabular-nums\"\n />\n </div>\n )\n}\n\nexport function ShadowLayerEditor({\n layer,\n index,\n onChange,\n onRemoveLayer,\n}: {\n layer: EditableShadowLayer\n index: number\n onChange: (next: EditableShadowLayer) => void\n onRemoveLayer: () => void\n}) {\n const [hexInput, setHexInput] = React.useState(layer.color.hex)\n const [alphaInput, setAlphaInput] = React.useState(String(layer.color.alpha))\n\n React.useEffect(() => {\n setHexInput(layer.color.hex)\n setAlphaInput(String(layer.color.alpha))\n }, [layer.color.hex, layer.color.alpha])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1\">\n <div className=\"grid flex-1 grid-cols-4 gap-2\">\n <ShadowField label=\"X\" value={layer.x} onChange={(x) => onChange({ ...layer, x })} />\n <ShadowField label=\"Y\" value={layer.y} onChange={(y) => onChange({ ...layer, y })} />\n <Tip label=\"Blur\">\n <div>\n <ShadowField label=\"B\" value={layer.blur} onChange={(blur) => onChange({ ...layer, blur: Math.max(0, blur) })} />\n </div>\n </Tip>\n <Tip label=\"Spread\">\n <div>\n <ShadowField label=\"S\" value={layer.spread} onChange={(spread) => onChange({ ...layer, spread })} />\n </div>\n </Tip>\n </div>\n <Tip label=\"Remove shadow layer\">\n <button\n type=\"button\"\n className=\"flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground\"\n onClick={onRemoveLayer}\n >\n <Minus className=\"size-3.5\" />\n </button>\n </Tip>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <div className=\"flex h-7 flex-1 items-center rounded-md border-0 bg-muted\">\n <div className=\"ml-1\">\n <ColorPickerPopover id={`shadow-color-${index}`} value={layer.color} onChange={(color) => onChange({ ...layer, color })}>\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: `#${layer.color.hex}` }}\n />\n </ColorPickerPopover>\n </div>\n <input\n type=\"text\"\n value={hexInput}\n onChange={(event) => {\n const cleaned = event.target.value.replace('#', '').toUpperCase()\n if (!/^[0-9A-F]{0,6}$/.test(cleaned)) return\n setHexInput(cleaned)\n if (cleaned.length === 6) {\n onChange({\n ...layer,\n color: {\n ...layer.color,\n hex: cleaned,\n raw: formatColorValue({ ...layer.color, hex: cleaned, raw: '' }),\n },\n })\n }\n }}\n onBlur={() => setHexInput(layer.color.hex)}\n className=\"h-full w-[68px] bg-transparent px-2 font-mono text-xs uppercase outline-none\"\n maxLength={6}\n placeholder=\"000000\"\n />\n <span className=\"text-xs text-muted-foreground\">/</span>\n <input\n type=\"number\"\n value={alphaInput}\n onChange={(event) => {\n setAlphaInput(event.target.value)\n const parsed = parseInt(event.target.value, 10)\n if (Number.isNaN(parsed)) return\n const clamped = Math.max(0, Math.min(100, parsed))\n onChange({\n ...layer,\n color: {\n ...layer.color,\n alpha: clamped,\n raw: formatColorValue({ ...layer.color, alpha: clamped, raw: '' }),\n },\n })\n }}\n onBlur={() => setAlphaInput(String(layer.color.alpha))}\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 className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n}\n\ninterface ShadowSectionProps {\n boxShadow?: string\n onSetCSS?: (properties: Record<string, string>) => void\n pendingStyles?: Record<string, string>\n}\n\nexport function ShadowSection({ boxShadow, onSetCSS, pendingStyles }: ShadowSectionProps) {\n const effectiveShadow = (pendingStyles?.['box-shadow'] ?? boxShadow ?? 'none').trim()\n const parsedLayers = React.useMemo(() => parseShadowLayers(effectiveShadow), [effectiveShadow])\n const [layers, setLayers] = React.useState<EditableShadowLayer[]>(parsedLayers)\n const hasShadow = layers.length > 0\n\n React.useEffect(() => {\n setLayers(parsedLayers)\n }, [parsedLayers])\n\n const commitLayers = (nextLayers: EditableShadowLayer[]) => {\n setLayers(nextLayers)\n if (!onSetCSS) return\n onSetCSS({ 'box-shadow': serializeShadowLayers(nextLayers) })\n }\n\n const updateLayer = (index: number, nextLayer: EditableShadowLayer) => {\n const nextLayers = layers.map((layer, layerIndex) => (layerIndex === index ? nextLayer : layer))\n commitLayers(nextLayers)\n }\n\n const addLayer = () => {\n const nextLayers = [...layers, createDefaultShadowLayer(layers.length)]\n commitLayers(nextLayers)\n }\n\n const removeLayer = (index: number) => {\n const nextLayers = layers.filter((_, layerIndex) => layerIndex !== index)\n commitLayers(nextLayers)\n }\n\n const headerActions = (\n <div className=\"flex items-center gap-1\">\n <Tip label={hasShadow ? 'Add shadow layer' : 'Add shadow'}>\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={addLayer}\n >\n <Plus className=\"size-3.5\" />\n </button>\n </Tip>\n </div>\n )\n\n return (\n <CollapsibleSection title=\"Shadow\" actions={headerActions}>\n {hasShadow ? (\n <div className=\"space-y-4\">\n {layers.map((layer, index) => (\n <ShadowLayerEditor\n key={`shadow-layer-${index}`}\n layer={layer}\n index={index}\n onChange={(nextLayer) => updateLayer(index, nextLayer)}\n onRemoveLayer={() => removeLayer(index)}\n />\n ))}\n </div>\n ) : null}\n </CollapsibleSection>\n )\n}\n","import type { ColorValue } from './types'\nimport { formatColorValue } from './ui/color-utils'\nimport { parseColorValue } from './utils'\n\nconst TAILWIND_SHADOW_PRESETS = [\n { x: 0, y: 1, blur: 3, spread: 0, alpha: 10 },\n { x: 0, y: 4, blur: 6, spread: -1, alpha: 10 },\n] as const\n\nexport interface EditableShadowLayer {\n x: number\n y: number\n blur: number\n spread: number\n inset: boolean\n color: ColorValue\n}\n\nexport function createDefaultShadowLayer(index: number): EditableShadowLayer {\n const preset = index === 0 ? TAILWIND_SHADOW_PRESETS[0] : TAILWIND_SHADOW_PRESETS[1]\n return {\n x: preset.x,\n y: preset.y,\n blur: preset.blur,\n spread: preset.spread,\n inset: false,\n color: { hex: '000000', alpha: preset.alpha, raw: '' },\n }\n}\n\nfunction splitPreservingParens(input: string, isSeparator: (char: string) => boolean): string[] {\n const parts: string[] = []\n let current = ''\n let depth = 0\n\n for (const char of input.trim()) {\n if (char === '(') {\n depth += 1\n current += char\n } else if (char === ')') {\n depth = Math.max(0, depth - 1)\n current += char\n } else if (depth === 0 && isSeparator(char)) {\n const part = current.trim()\n if (part) parts.push(part)\n current = ''\n } else {\n current += char\n }\n }\n\n const tail = current.trim()\n if (tail) parts.push(tail)\n return parts\n}\n\nexport function splitShadowLayers(value: string): string[] {\n const trimmed = value.trim()\n if (!trimmed || trimmed === 'none') return []\n return splitPreservingParens(trimmed, (char) => char === ',')\n}\n\nfunction tokenizeShadowLayer(layer: string): string[] {\n return splitPreservingParens(layer, (char) => /\\s/.test(char))\n}\n\nfunction parseLengthToken(token: string): number | null {\n const match = token.match(/^(-?(?:\\d+\\.?\\d*|\\.\\d+))(px)?$/i)\n if (!match) return null\n\n const numeric = parseFloat(match[1])\n if (!Number.isFinite(numeric)) return null\n\n // Unitless zero is valid in box-shadow and should be treated like 0px.\n if (match[2] || numeric === 0) return numeric\n return null\n}\n\nfunction formatShadowNumber(value: number): string {\n return String(Math.round(value * 100) / 100)\n}\n\nexport function parseShadowLayer(layer: string, fallback: EditableShadowLayer): EditableShadowLayer {\n const trimmed = layer.trim()\n if (!trimmed) return fallback\n\n const tokens = tokenizeShadowLayer(trimmed)\n let inset = false\n const lengths: number[] = []\n let colorToken: string | null = null\n\n for (const token of tokens) {\n if (token.toLowerCase() === 'inset') {\n inset = true\n continue\n }\n\n const length = parseLengthToken(token)\n if (length !== null) {\n lengths.push(length)\n continue\n }\n\n if (!colorToken) {\n colorToken = token\n }\n }\n\n const [x, y, blur, spread] = [\n lengths[0] ?? fallback.x,\n lengths[1] ?? fallback.y,\n lengths[2] ?? 0,\n lengths[3] ?? 0,\n ]\n\n return {\n x,\n y,\n blur,\n spread,\n inset,\n color: colorToken ? parseColorValue(colorToken) : fallback.color,\n }\n}\n\nexport function parseShadowLayers(value: string): EditableShadowLayer[] {\n const rawLayers = splitShadowLayers(value)\n if (rawLayers.length === 0) return []\n return rawLayers.map((layer, index) => parseShadowLayer(layer, createDefaultShadowLayer(index)))\n}\n\nexport function serializeShadowLayer(layer: EditableShadowLayer): string {\n const colorValue = formatColorValue({ ...layer.color, raw: '' })\n const prefix = layer.inset ? 'inset ' : ''\n return `${prefix}${formatShadowNumber(layer.x)}px ${formatShadowNumber(layer.y)}px ${formatShadowNumber(layer.blur)}px ${formatShadowNumber(layer.spread)}px ${colorValue}`\n}\n\nexport function serializeShadowLayers(layers: EditableShadowLayer[]): string {\n if (layers.length === 0) return 'none'\n return layers.map(serializeShadowLayer).join(', ')\n}\n","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport { SimpleSelect } from '../ui/simple-select'\nimport type { TypographyPropertyKey, TypographyProperties, CSSPropertyValue } from '../types'\nimport { NumberInput, Tip } from './shared'\nimport {\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignVerticalJustifyStart,\n AlignVerticalJustifyCenter,\n AlignVerticalJustifyEnd,\n ALargeSmall,\n WrapText,\n AArrowUp,\n LetterText,\n} from 'lucide-react'\n\nexport const 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\nexport const 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\nexport function 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 <SimpleSelect\n value={typography.fontFamily}\n onValueChange={(val) => onUpdate('fontFamily', val)}\n options={FONT_FAMILIES}\n label={getFontFamilyLabel(typography.fontFamily)}\n icon={<Type className=\"size-3.5 text-muted-foreground\" />}\n triggerClassName=\"w-full\"\n popupMinWidth=\"180px\"\n itemClassName=\"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\n <SimpleSelect\n value={typography.fontWeight}\n onValueChange={(val) => onUpdate('fontWeight', val)}\n options={FONT_WEIGHTS}\n label={getFontWeightLabel(typography.fontWeight)}\n icon={<ALargeSmall className=\"size-3.5 text-muted-foreground\" />}\n triggerClassName=\"w-full\"\n popupMinWidth=\"140px\"\n itemClassName=\"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\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","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport { Tip } from './shared'\nimport { cn } from '../cn'\nimport { X, ChevronUp, ChevronDown } from 'lucide-react'\n\nconst panelBarBaseClass = 'flex h-11 shrink-0 items-center border-border/50 bg-background pl-3 pr-2'\n\nexport interface PanelHeaderProps {\n elementInfo: {\n tagName: string\n id: string | null\n parentElement: HTMLElement | null | boolean\n hasChildren: boolean\n }\n isDraggable: boolean\n onClose?: () => void\n onSelectParent?: () => void\n onSelectChild?: () => void\n onPointerDown?: (e: React.PointerEvent) => void\n onPointerMove?: (e: React.PointerEvent) => void\n onPointerUp?: (e: React.PointerEvent) => void\n onPointerCancel?: (e: React.PointerEvent) => void\n}\n\nexport function PanelHeader({\n elementInfo,\n isDraggable,\n onClose,\n onSelectParent,\n onSelectChild,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n}: PanelHeaderProps) {\n return (\n <div\n className={cn(\n panelBarBaseClass,\n 'gap-2 border-b',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n >\n <div className=\"min-w-0 flex-1\">\n <code className=\"text-xs font-medium text-foreground\">\n <{elementInfo.tagName}>\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 <span className={!elementInfo.parentElement ? 'cursor-not-allowed' : undefined}>\n <Tip label=\"Select Parent\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectParent}\n disabled={!elementInfo.parentElement}\n aria-label=\"Select parent element\"\n className=\"size-7\"\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n </Tip>\n </span>\n )}\n {onSelectChild && (\n <span className={!elementInfo.hasChildren ? 'cursor-not-allowed' : undefined}>\n <Tip label=\"Select Child\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectChild}\n disabled={!elementInfo.hasChildren}\n aria-label=\"Select child element\"\n className=\"size-7\"\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </Tip>\n </span>\n )}\n {onClose && (\n <>\n <div className=\"mx-0.5 h-4 w-px bg-border\" />\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Close panel\" className=\"size-7\" onClick={onClose}>\n <X className=\"size-3.5\" />\n </Button>\n </>\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport { Tip } from './shared'\nimport { cn } from '../cn'\nimport { X, Copy, Check, Send } from 'lucide-react'\n\nconst panelBarBaseClass = 'flex h-11 shrink-0 items-center border-border/50 bg-background pl-3 pr-2'\n\nexport interface PanelFooterProps {\n isDraggable: boolean\n canTriggerSend: boolean\n onExportEdits: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n onPointerDown?: (e: React.PointerEvent) => void\n onPointerMove?: (e: React.PointerEvent) => void\n onPointerUp?: (e: React.PointerEvent) => void\n onPointerCancel?: (e: React.PointerEvent) => void\n}\n\nexport function PanelFooter({\n isDraggable,\n canTriggerSend,\n onExportEdits,\n onSendToAgent,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n}: PanelFooterProps) {\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\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 return (\n <div\n className={cn(\n panelBarBaseClass,\n 'gap-1 border-t',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n >\n <div className=\"flex-1\" />\n <Tip label=\"Copy edits\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\n aria-label={copyError ? 'Copy failed' : copied ? 'Copied' : 'Copy edits'}\n className=\"size-7\"\n >\n {copyError ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </Button>\n </Tip>\n <span className={!canTriggerSend || sendStatus === 'sending' ? 'cursor-not-allowed' : undefined}>\n <Tip label=\"Apply changes via agent\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleSendToAgent}\n disabled={!canTriggerSend || sendStatus === 'sending'}\n aria-label={sendStatus === 'offline' ? 'Send failed' : sendStatus === 'sent' ? 'Changes sent' : 'Apply changes via agent'}\n className=\"size-7\"\n >\n {sendStatus === 'offline' ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : sendStatus === 'sent' ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : sendStatus === 'sending' ? (\n <Send className=\"size-3.5 animate-pulse\" />\n ) : (\n <Send className=\"size-3.5\" />\n )}\n </Button>\n </Tip>\n </span>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport type { SpacingPropertyKey, CSSPropertyValue } from '../types'\nimport { NumberInput, Tip } from './shared'\nimport {\n ArrowRight,\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n MoveHorizontal,\n MoveVertical,\n Columns2,\n Grid2x2,\n} from 'lucide-react'\n\ninterface SpacingInputsProps {\n prefix: 'padding' | 'margin'\n values: {\n top: CSSPropertyValue\n right: CSSPropertyValue\n bottom: CSSPropertyValue\n left: CSSPropertyValue\n }\n onChange: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n}\n\nexport function SpacingInputs({ prefix, values, onChange }: SpacingInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n const allowNegative = prefix === 'margin'\n\n const handleChange = (sides: ('top' | 'right' | 'bottom' | 'left')[], numericValue: number) => {\n const clamped = allowNegative ? numericValue : Math.max(0, numericValue)\n const newValue: CSSPropertyValue = {\n numericValue: clamped,\n unit: 'px',\n raw: `${clamped}px`,\n }\n\n for (const side of sides) {\n const key = `${prefix}${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 : null\n const verticalValue =\n values.top.numericValue === values.bottom.numericValue\n ? values.top.numericValue\n : null\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 placeholder={horizontalValue === null ? 'mixed' : undefined}\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 placeholder={verticalValue === null ? 'mixed' : undefined}\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","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport {\n Select,\n SelectTrigger,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from '../ui/select'\nimport type { SizingValue, SizingMode, SizingPropertyKey } from '../types'\nimport { useDirectEditState } from '../provider'\nimport { Tip, selectOnFocus } from './shared'\nimport {\n Check,\n ChevronsUpDown,\n Link,\n Unlink,\n} from 'lucide-react'\n\nexport const 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\nexport const DISTRIBUTE_MODES = ['fixed', 'space-between', 'space-around', 'space-evenly'] as const\nexport type DistributeMode = typeof DISTRIBUTE_MODES[number]\nexport const DISTRIBUTE_LABELS: Record<DistributeMode, string> = {\n fixed: 'Fixed',\n 'space-between': 'Between',\n 'space-around': 'Around',\n 'space-evenly': 'Evenly',\n}\n\nexport function 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\nexport function 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 focus-within:outline-none focus-within:ring-1 focus-within:ring-inset focus-within:ring-ring\">\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 focus-visible:outline-none\">\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\nexport function SizingInputs({ width, height, onWidthChange, onHeightChange }: SizingInputsProps) {\n const { selectedElement } = useDirectEditState()\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","import * as React from 'react'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n createTooltipHandle,\n} from '../ui/tooltip'\nimport { cn } from '../cn'\n\ninterface AlignmentGridProps {\n justifyContent: string\n alignItems: string\n onChange: (justify: string, align: string) => void\n}\n\nexport function 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 h-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 <TooltipContent side=\"bottom\" sideOffset={8} className=\"flex flex-col\">\n justify: {payload?.justify}, align: {payload?.align}\n </TooltipContent>\n )}\n </Tooltip>\n </TooltipProvider>\n )\n}\n","import * as React from 'react'\nimport { Tip, CollapsibleSection } from './shared'\nimport { cn } from '../cn'\nimport {\n Select,\n SelectTrigger,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from '../ui/select'\nimport { SpacingInputs } from './spacing-inputs'\nimport { SizingInputs, SizingFixedInput, DISTRIBUTE_MODES, DISTRIBUTE_LABELS, type DistributeMode } from './sizing-inputs'\nimport { AlignmentGrid } from './alignment-grid'\nimport type { CSSPropertyValue, SpacingPropertyKey, SizingValue, SizingPropertyKey } from '../types'\nimport {\n Check,\n ArrowRight,\n ArrowDown,\n MoveHorizontal,\n ChevronsUpDown,\n Plus,\n Minus,\n} from 'lucide-react'\n\nexport interface LayoutSectionProps {\n elementInfo: {\n isFlexContainer: boolean\n }\n computedFlex: {\n flexDirection: 'row' | 'row-reverse' | 'column' | 'column-reverse'\n justifyContent: string\n alignItems: string\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 computedSizing: {\n width: SizingValue\n height: SizingValue\n } | null\n onToggleFlex: () => void\n onUpdateFlex: (key: 'flexDirection' | 'justifyContent' | 'alignItems', value: string) => void\n onUpdateSpacing: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n onUpdateSizing: (key: SizingPropertyKey, value: SizingValue) => void\n sectionRef: React.RefObject<HTMLDivElement>\n}\n\nexport function LayoutSection({\n elementInfo,\n computedFlex,\n computedSpacing,\n computedSizing,\n onToggleFlex,\n onUpdateFlex,\n onUpdateSpacing,\n onUpdateSizing,\n sectionRef,\n}: LayoutSectionProps) {\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 return (\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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={sectionRef}>\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 focus-within:outline-none focus-within:ring-1 focus-within:ring-inset focus-within:ring-ring\">\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 focus-visible:outline-none\">\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 <SpacingInputs\n prefix=\"padding\"\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 <SpacingInputs\n prefix=\"margin\"\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}\n","import * as React from 'react'\nimport { clamp } from './utils'\n\nexport const PANEL_WIDTH = 300\nexport const PANEL_HEIGHT = 420\n\nconst STORAGE_KEY = 'direct-edit-panel-position'\nconst PANEL_MARGIN = 8\n\ninterface Position {\n x: number\n y: number\n}\n\nfunction getPanelBounds() {\n const availableX = window.innerWidth - PANEL_WIDTH\n const availableY = window.innerHeight - PANEL_HEIGHT\n const minX = availableX <= 0 ? 0 : Math.min(PANEL_MARGIN, availableX)\n const minY = availableY <= 0 ? 0 : Math.min(PANEL_MARGIN, availableY)\n const maxX = availableX <= 0 ? 0 : Math.max(minX, availableX - PANEL_MARGIN)\n const maxY = availableY <= 0 ? 0 : Math.max(minY, availableY - PANEL_MARGIN)\n\n return { minX, maxX, minY, maxY }\n}\n\nfunction normalizePosition(position: Position): Position {\n const { minX, maxX, minY, maxY } = getPanelBounds()\n return {\n x: clamp(position.x, minX, maxX),\n y: clamp(position.y, minY, maxY),\n }\n}\n\nfunction snapToEdge(position: Position): Position {\n const { minX, maxX, minY, maxY } = getPanelBounds()\n const centerX = position.x + PANEL_WIDTH / 2\n const centerY = position.y + PANEL_HEIGHT / 2\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const distances = {\n top: centerY,\n bottom: vh - centerY,\n left: centerX,\n right: vw - centerX,\n }\n\n let nearest: 'top' | 'bottom' | 'left' | 'right' = 'right'\n let min = Infinity\n for (const [edge, dist] of Object.entries(distances) as ['top' | 'bottom' | 'left' | 'right', number][]) {\n if (dist < min) {\n min = dist\n nearest = edge\n }\n }\n\n const freeX = clamp(position.x, minX, maxX)\n const freeY = clamp(position.y, minY, maxY)\n\n switch (nearest) {\n case 'top':\n return { x: freeX, y: minY }\n case 'bottom':\n return { x: freeX, y: maxY }\n case 'left':\n return { x: minX, y: freeY }\n case 'right':\n return { x: maxX, y: freeY }\n }\n}\n\nfunction parseStoredPosition(raw: string): Position | null {\n const parsed: unknown = JSON.parse(raw)\n if (!parsed || typeof parsed !== 'object') return null\n\n const candidate = parsed as { x?: unknown; y?: unknown }\n if (typeof candidate.x !== 'number' || !Number.isFinite(candidate.x)) return null\n if (typeof candidate.y !== 'number' || !Number.isFinite(candidate.y)) return null\n return { x: candidate.x, y: candidate.y }\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 const parsed = parseStoredPosition(stored)\n if (parsed) {\n return snapToEdge(parsed)\n }\n }\n } catch {\n // Fall through to default\n }\n\n return snapToEdge({\n x: window.innerWidth - PANEL_WIDTH - PANEL_MARGIN,\n y: window.innerHeight - PANEL_HEIGHT - PANEL_MARGIN,\n })\n}\n\nexport function usePanelPosition() {\n const [position, setPosition] = React.useState<Position>(getInitialPosition)\n const [isDragging, setIsDragging] = React.useState(false)\n const [isSnapping, setIsSnapping] = React.useState(false)\n const [dragOffset, setDragOffset] = React.useState<Position>({ x: 0, y: 0 })\n const snapTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const positionRef = React.useRef(position)\n\n React.useEffect(() => {\n positionRef.current = position\n }, [position])\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!panelRef.current) return\n\n // Don't start drag when clicking interactive elements (buttons, inputs, etc.)\n const target = e.target as HTMLElement\n if (target.closest('button, a, input, select, textarea, [role=\"button\"]')) 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 try {\n e.currentTarget.setPointerCapture(e.pointerId)\n } catch {\n // Ignore unsupported pointer capture environments.\n }\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n const next = normalizePosition({\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n })\n positionRef.current = next\n setPosition(next)\n }\n\n const handlePointerUp = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n setIsDragging(false)\n try {\n e.currentTarget.releasePointerCapture(e.pointerId)\n } catch {\n // Ignore unsupported pointer capture environments.\n }\n\n const snapped = snapToEdge(positionRef.current)\n positionRef.current = snapped\n setPosition(snapped)\n setIsSnapping(true)\n\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n snapTimerRef.current = setTimeout(() => {\n snapTimerRef.current = null\n setIsSnapping(false)\n }, 350)\n\n try { localStorage.setItem(STORAGE_KEY, JSON.stringify(snapped)) } catch {}\n }\n\n const handlePointerCancel = (e: React.PointerEvent) => {\n if (!isDragging) return\n setIsDragging(false)\n try {\n e.currentTarget.releasePointerCapture(e.pointerId)\n } catch {\n // Ignore unsupported pointer capture environments.\n }\n }\n\n React.useEffect(() => {\n function handleResize() {\n setPosition((prev) => {\n const next = snapToEdge(prev)\n positionRef.current = next\n return next\n })\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [])\n\n React.useEffect(() => {\n return () => {\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n }\n }, [])\n\n return {\n position,\n isDragging,\n isSnapping,\n panelRef,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n }\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEditState, useDirectEditActions } from './provider'\nimport { useRulersVisible } from './rulers-overlay'\nimport { cn } from './cn'\nimport { useToolbarDock } from './use-toolbar-dock'\nimport { MousePointer2, Ruler, Command, ArrowBigUp, MessageSquare, X } from 'lucide-react'\nimport type { ActiveTool, Theme, SessionItem } from './types'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n} from './ui/tooltip'\nimport { EditsPopover } from './toolbar/edits-popover'\nimport { SettingsPopover } from './toolbar/settings-popover'\nimport { ZoomPopover } from './toolbar/zoom-popover'\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 onGetSessionItems?: () => SessionItem[]\n onExportAllEdits?: () => Promise<boolean>\n onSendAllToAgents?: () => Promise<boolean>\n onClearSessionEdits?: () => void\n onRemoveSessionEdit?: (element: HTMLElement) => void\n onDeleteComment?: (id: string) => void\n className?: string\n canvasActive?: boolean\n canvasZoom?: number\n onToggleCanvas?: () => void\n onSetCanvasZoom?: (zoom: number) => void\n onZoomTo100?: () => void\n onFitToViewport?: () => void\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 onGetSessionItems,\n onExportAllEdits,\n onSendAllToAgents,\n onClearSessionEdits,\n onRemoveSessionEdit,\n onDeleteComment,\n className,\n canvasActive = false,\n canvasZoom = 1,\n onToggleCanvas,\n onSetCanvasZoom,\n onZoomTo100,\n onFitToViewport,\n}: DirectEditToolbarInnerProps) {\n const container = usePortalContainer()\n const toolbarRef = React.useRef<HTMLDivElement>(null)\n const { dockedEdge, isDragging, isSnapping, style: dockStyle, predictSize, handlePointerDown, handlePointerMove, handlePointerUp, handlePointerCancel } = useToolbarDock(toolbarRef)\n const isVertical = dockedEdge === 'left' || dockedEdge === 'right'\n const [activePopover, setActivePopover] = React.useState<'edits' | 'settings' | 'zoom' | null>(null)\n\n // Cache toolbar sizes per edge + state so prediction stays accurate after re-docking.\n const sizeCacheRef = React.useRef<Record<string, { w: number; h: number }>>({})\n\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n const key = `${dockedEdge}:${editModeActive ? 'expanded' : 'collapsed'}`\n // Cache size after transition settles\n const timer = setTimeout(() => {\n const rect = el.getBoundingClientRect()\n sizeCacheRef.current[key] = { w: rect.width, h: rect.height }\n }, 350)\n return () => clearTimeout(timer)\n }, [editModeActive, dockedEdge])\n\n // On toggle, immediately predict the final position so expand + move run in parallel\n const prevEditModeRef = React.useRef(editModeActive)\n React.useEffect(() => {\n if (prevEditModeRef.current === editModeActive) return\n prevEditModeRef.current = editModeActive\n const target = sizeCacheRef.current[`${dockedEdge}:${editModeActive ? 'expanded' : 'collapsed'}`]\n if (target) {\n predictSize(target.w, target.h)\n }\n }, [editModeActive, dockedEdge, predictSize])\n\n // Close active popover when toolbar starts dragging\n React.useEffect(() => {\n if (isDragging) setActivePopover(null)\n }, [isDragging])\n\n // Do not leave popovers open when design mode is turned off.\n React.useEffect(() => {\n if (!editModeActive) setActivePopover(null)\n }, [editModeActive])\n\n const tooltipSide = dockedEdge === 'bottom' ? 'top'\n : dockedEdge === 'top' ? 'bottom'\n : dockedEdge === 'left' ? 'right' : 'left'\n const [isMac] = React.useState(() => (\n typeof navigator !== 'undefined' ? (navigator.platform?.includes('Mac') ?? false) : false\n ))\n\n const kbdClass = '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',\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-[color,background-color] duration-150 ease-out',\n editModeActive && 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: 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 'grid place-items-center overflow-hidden',\n isVertical\n ? (editModeActive ? 'mt-1 grid-rows-[1fr]' : 'mt-0 grid-rows-[0fr]')\n : (editModeActive ? 'ml-1 grid-cols-[1fr]' : 'ml-0 grid-cols-[0fr]')\n )}\n style={{\n transitionProperty: 'grid-template-columns, grid-template-rows, margin',\n transitionDuration: '200ms',\n transitionTimingFunction: 'cubic-bezier(0.25, 1, 0.5, 1)',\n transitionDelay: editModeActive ? '0ms' : '80ms',\n }}\n >\n <div\n className={cn('flex gap-1 overflow-hidden', isVertical ? 'min-h-0 flex-col items-center' : 'min-w-0 flex-row items-center')}\n style={{\n filter: editModeActive ? 'blur(0px)' : 'blur(5px)',\n opacity: editModeActive ? 1 : 0,\n transitionProperty: 'filter, opacity',\n transitionDuration: '250ms, 100ms',\n transitionTimingFunction: 'cubic-bezier(0.33, 1, 0.68, 1)',\n transitionDelay: editModeActive ? '80ms' : '0ms',\n }}\n >\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 <ZoomPopover\n tooltipSide={tooltipSide}\n canvasActive={canvasActive}\n canvasZoom={canvasZoom}\n isOpen={activePopover === 'zoom'}\n onOpenChange={(open) => setActivePopover(open ? 'zoom' : null)}\n onToggleCanvas={onToggleCanvas}\n onSetCanvasZoom={onSetCanvasZoom}\n onZoomTo100={onZoomTo100}\n onFitToViewport={onFitToViewport}\n />\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 <EditsPopover\n tooltipSide={tooltipSide}\n sessionEditCount={sessionEditCount}\n isOpen={activePopover === 'edits'}\n onOpenChange={(open) => setActivePopover(open ? 'edits' : null)}\n onGetSessionItems={onGetSessionItems}\n onExportAllEdits={onExportAllEdits}\n onSendAllToAgents={onSendAllToAgents}\n onClearSessionEdits={onClearSessionEdits}\n onRemoveSessionEdit={onRemoveSessionEdit}\n onDeleteComment={onDeleteComment}\n />\n\n <SettingsPopover\n tooltipSide={tooltipSide}\n theme={theme}\n isMac={isMac}\n isOpen={activePopover === 'settings'}\n onOpenChange={(open) => setActivePopover(open ? 'settings' : null)}\n onSetTheme={onSetTheme}\n />\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 <Tooltip>\n <TooltipTrigger\n className=\"flex cursor-pointer items-center justify-center rounded-[8px] p-2 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onToggleEditMode}\n >\n <X className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>Close</span>\n <kbd className={kbdClass}>Esc</kbd>\n </TooltipContent>\n </Tooltip>\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 { editModeActive, activeTool, theme, sessionEditCount, canvas } = useDirectEditState()\n const {\n toggleEditMode, setActiveTool, setTheme,\n getSessionItems, exportAllEdits, sendAllSessionItemsToAgent, clearSessionEdits, removeSessionEdit, deleteComment,\n toggleCanvas, setCanvasZoom, zoomCanvasTo100, fitCanvasToViewport,\n } = useDirectEditActions()\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 onGetSessionItems={getSessionItems}\n onExportAllEdits={exportAllEdits}\n onSendAllToAgents={sendAllSessionItemsToAgent}\n onClearSessionEdits={clearSessionEdits}\n onRemoveSessionEdit={removeSessionEdit}\n onDeleteComment={deleteComment}\n canvasActive={canvas?.active ?? false}\n canvasZoom={canvas?.zoom ?? 1}\n onToggleCanvas={toggleCanvas}\n onSetCanvasZoom={setCanvasZoom}\n onZoomTo100={zoomCanvasTo100}\n onFitToViewport={fitCanvasToViewport}\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 { useDirectEditState } from './hooks'\nimport { getCanvasSnapshot, useCanvasSnapshot, getBodyOffset } from './canvas-store'\nimport { useGuidelines } from './use-guidelines'\nimport type { Guideline } from './types'\n\nconst RULER_SIZE = 20\nconst GUIDELINE_COLOR = '#FF6B6B'\nconst SNAPPED_COLOR = '#0D99FF'\nconst HIT_ZONE = 9\n\nexport function computeCanvasRulerScrollOffset(pan: number, zoom: number, bodyOffset: number): number {\n if (zoom === 0) return -pan\n return bodyOffset * (1 - 1 / zoom) - pan\n}\n\n/**\n * Compute adaptive tick intervals so major labels stay ~80px apart on screen.\n * Returns the major (labeled) interval, minor (small tick) interval, and steps per major.\n */\nfunction computeTickIntervals(zoom: number) {\n const MIN_LABEL_SPACING_PX = 80\n const rawInterval = MIN_LABEL_SPACING_PX / zoom\n\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawInterval)))\n const residual = rawInterval / magnitude\n\n let nice: number\n if (residual <= 1) nice = 1\n else if (residual <= 2) nice = 2\n else if (residual <= 2.5) nice = 2.5\n else if (residual <= 5) nice = 5\n else nice = 10\n\n const major = nice * magnitude\n const stepsPerMajor = 10\n const minor = major / stepsPerMajor\n\n return { major, minor, stepsPerMajor }\n}\n\nfunction getColorSchemeQuery(): MediaQueryList | null {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return null\n }\n return window.matchMedia('(prefers-color-scheme: dark)')\n}\n\nfunction subscribeColorScheme(cb: () => void) {\n const mq = getColorSchemeQuery()\n if (!mq) return () => {}\n\n if (typeof mq.addEventListener === 'function') {\n mq.addEventListener('change', cb)\n return () => mq.removeEventListener('change', cb)\n }\n\n mq.addListener(cb)\n return () => mq.removeListener(cb)\n}\n\nfunction getColorScheme() {\n return getColorSchemeQuery()?.matches ?? false\n}\n\n/** Triggers canvas redraws when system color scheme changes (theme = 'system'). */\nfunction useSystemDark() {\n return React.useSyncExternalStore(subscribeColorScheme, getColorScheme, () => false)\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 zoom = 1,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n zoom?: number\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportWidth = useViewportWidth()\n const { theme } = useDirectEditState()\n const systemDark = useSystemDark()\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 computed = getComputedStyle(canvas)\n const tick = computed.getPropertyValue('color')\n const label = tick\n\n const { minor, stepsPerMajor } = computeTickIntervals(zoom)\n const midIdx = stepsPerMajor / 2\n const visibleContentWidth = width / zoom\n const startIdx = Math.floor(scrollOffset.x / minor)\n const endIdx = Math.ceil((scrollOffset.x + visibleContentWidth) / minor)\n\n for (let i = startIdx; i <= endIdx; i++) {\n const px = i * minor\n const x = (px - scrollOffset.x) * zoom\n const isMajor = i % stepsPerMajor === 0\n const isMid = !isMajor && i % midIdx === 0\n\n ctx.beginPath()\n ctx.moveTo(x, height)\n ctx.lineTo(x, height - (isMajor ? 10 : isMid ? 7 : 4))\n ctx.strokeStyle = tick\n ctx.globalAlpha = 0.6\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor) {\n ctx.globalAlpha = 1\n ctx.fillStyle = label\n ctx.font = '9px system-ui, -apple-system, sans-serif'\n ctx.textAlign = 'center'\n ctx.fillText(String(Math.round(px)), x, 9)\n }\n }\n }, [scrollOffset.x, viewportWidth, zoom, theme, systemDark])\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: 'var(--color-background)',\n borderBottom: '1px solid var(--color-border)',\n color: 'var(--color-muted-foreground)',\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 zoom = 1,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n zoom?: number\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportHeight = useViewportHeight()\n const { theme } = useDirectEditState()\n const systemDark = useSystemDark()\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 computed = getComputedStyle(canvas)\n const tick = computed.getPropertyValue('color')\n const label = tick\n\n const { minor, stepsPerMajor } = computeTickIntervals(zoom)\n const midIdx = stepsPerMajor / 2\n const visibleContentHeight = height / zoom\n const startIdx = Math.floor(scrollOffset.y / minor)\n const endIdx = Math.ceil((scrollOffset.y + visibleContentHeight) / minor)\n\n for (let i = startIdx; i <= endIdx; i++) {\n const px = i * minor\n const y = (px - scrollOffset.y) * zoom\n const isMajor = i % stepsPerMajor === 0\n const isMid = !isMajor && i % midIdx === 0\n\n ctx.beginPath()\n ctx.moveTo(width, y)\n ctx.lineTo(width - (isMajor ? 10 : isMid ? 7 : 4), y)\n ctx.strokeStyle = tick\n ctx.globalAlpha = 0.6\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor) {\n ctx.save()\n ctx.globalAlpha = 1\n ctx.fillStyle = 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(Math.round(px)), 0, 0)\n ctx.restore()\n }\n }\n }, [scrollOffset.y, viewportHeight, zoom, theme, systemDark])\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: 'var(--color-background)',\n borderRight: '1px solid var(--color-border)',\n color: 'var(--color-muted-foreground)',\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 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: 'var(--color-background)',\n borderRight: '1px solid var(--color-border)',\n borderBottom: '1px solid var(--color-border)',\n zIndex: 99994,\n pointerEvents: 'auto',\n }}\n />\n )\n}\n\n// --- Guideline viewport position ---\n\nfunction computeGuidelineViewportPos(position: number, orientation: 'horizontal' | 'vertical') {\n const snap = getCanvasSnapshot()\n const zoom = snap.active ? snap.zoom : 1\n const pan = orientation === 'horizontal'\n ? (snap.active ? snap.panY : -window.scrollY)\n : (snap.active ? snap.panX : -window.scrollX)\n if (snap.active) {\n const bo = orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n return bo + (position - bo + pan) * zoom\n }\n return (position + pan) * zoom\n}\n\n// --- GuidelineLine ---\n\nfunction GuidelineLine({\n guideline,\n isActive,\n isSnapped,\n dragPosition,\n onStartDrag,\n onDelete,\n}: {\n guideline: Guideline\n isActive: boolean\n isSnapped?: boolean\n dragPosition: number | null\n onStartDrag: (id: string) => void\n onDelete: (id: string) => void\n}) {\n const isHorizontal = guideline.orientation === 'horizontal'\n const lineColor = isActive && isSnapped ? SNAPPED_COLOR : GUIDELINE_COLOR\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 isDragging = isActive && dragPosition !== null\n // Compute viewport position from the latest canvas snapshot. This provides a\n // correct initial value; the imperative updateGuidelinePositions() callback\n // keeps it frame-perfect during rapid zoom/pan without React re-renders.\n const viewportPos = isDragging\n ? dragPosition\n : computeGuidelineViewportPos(guideline.position, guideline.orientation)\n const translate = isHorizontal\n ? `translateY(${viewportPos}px)`\n : `translateX(${viewportPos}px)`\n\n if (isHorizontal) {\n return (\n <div\n data-gl-pos={guideline.position}\n data-gl-orient=\"h\"\n {...(isDragging ? { 'data-gl-dragging': '' } : {})}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n height: 0,\n transform: translate,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n >\n {/* Visible line */}\n <div\n data-direct-edit=\"guideline\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 1, background: lineColor }}\n />\n {/* Hit zone */}\n <div\n style={{\n position: 'absolute',\n top: -Math.floor(HIT_ZONE / 2),\n left: RULER_SIZE,\n right: 0,\n height: HIT_ZONE,\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: 'absolute',\n top: 4,\n left: RULER_SIZE + 4,\n background: lineColor,\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 </div>\n )\n }\n\n // Vertical guideline\n return (\n <div\n data-gl-pos={guideline.position}\n data-gl-orient=\"v\"\n {...(isDragging ? { 'data-gl-dragging': '' } : {})}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n bottom: 0,\n width: 0,\n transform: translate,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n >\n <div\n data-direct-edit=\"guideline\"\n style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: 1, background: lineColor }}\n />\n <div\n style={{\n position: 'absolute',\n left: -Math.floor(HIT_ZONE / 2),\n top: RULER_SIZE,\n bottom: 0,\n width: HIT_ZONE,\n cursor: 'ew-resize',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n />\n {isActive && (\n <div\n style={{\n position: 'absolute',\n left: 4,\n top: RULER_SIZE + 4,\n background: lineColor,\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 </div>\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 const canvas = useCanvasSnapshot()\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 isSnapped,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n } = useGuidelines(enabled, hostElement, canvas)\n\n // Imperatively update guideline wrapper transforms for frame-perfect positioning.\n // Both this and applyTransform() run in the same macrotask (via\n // `direct-edit-canvas-change` event), so the browser composites them in a\n // single paint — no intermediate frame where body transform and guideline\n // positions are out of sync.\n React.useLayoutEffect(() => {\n if (!container || !enabled) return\n const el = container\n\n function updateGuidelinePositions() {\n const snap = getCanvasSnapshot()\n const zoom = snap.active ? snap.zoom : 1\n const panX = snap.active ? snap.panX : -window.scrollX\n const panY = snap.active ? snap.panY : -window.scrollY\n const bo = getBodyOffset()\n\n el.querySelectorAll<HTMLElement>('[data-gl-pos]').forEach((node) => {\n // Skip guidelines being dragged — React controls their transform\n if (node.hasAttribute('data-gl-dragging')) return\n const pos = Number(node.dataset.glPos)\n const orient = node.dataset.glOrient\n let vp: number\n if (snap.active) {\n vp = orient === 'h'\n ? bo.y + (pos - bo.y + panY) * zoom\n : bo.x + (pos - bo.x + panX) * zoom\n } else {\n vp = orient === 'h' ? (pos + panY) * zoom : (pos + panX) * zoom\n }\n node.style.transform = orient === 'h' ? `translateY(${vp}px)` : `translateX(${vp}px)`\n })\n }\n\n updateGuidelinePositions()\n\n window.addEventListener('direct-edit-canvas-change', updateGuidelinePositions)\n window.addEventListener('scroll', updateGuidelinePositions, true)\n return () => {\n window.removeEventListener('direct-edit-canvas-change', updateGuidelinePositions)\n window.removeEventListener('scroll', updateGuidelinePositions, true)\n }\n }, [container, enabled])\n\n if (!enabled || !container) return null\n\n // In canvas mode, pan replaces scroll and we need zoom for coordinate mapping\n const zoom = canvas?.active ? (canvas.zoom || 1) : 1\n const effectiveScrollOffset = canvas?.active\n ? (() => {\n // Convert canvas pan + body margin into an offset compatible with\n // ruler tick math: viewport = (content - scrollOffset) * zoom.\n const bo = getBodyOffset()\n return {\n x: computeCanvasRulerScrollOffset(canvas.panX || 0, zoom, bo.x),\n y: computeCanvasRulerScrollOffset(canvas.panY || 0, zoom, bo.y),\n }\n })()\n : scrollOffset\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={effectiveScrollOffset} zoom={zoom} onPointerDown={handleHorizontalPointerDown} />\n <VerticalRuler scrollOffset={effectiveScrollOffset} zoom={zoom} onPointerDown={handleVerticalPointerDown} />\n {guidelines.map((g) => (\n <GuidelineLine\n key={g.id}\n guideline={g}\n isActive={activeGuideline?.id === g.id}\n isSnapped={activeGuideline?.id === g.id ? isSnapped : false}\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 } = useDirectEditState()\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'\nimport { clamp } from './utils'\n\nexport type DockedEdge = 'top' | 'bottom' | 'left' | 'right'\n\nconst STORAGE_KEY = 'direct-edit-toolbar-dock'\nconst EDGE_MARGIN = 8\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 getToolbarBounds(width: number, height: number) {\n const availableX = window.innerWidth - width\n const availableY = window.innerHeight - height\n const minX = availableX <= 0 ? 0 : Math.min(EDGE_MARGIN, availableX)\n const maxX = availableX <= 0 ? 0 : Math.max(minX, availableX - EDGE_MARGIN)\n const minY = availableY <= 0 ? 0 : Math.min(EDGE_MARGIN, availableY)\n const maxY = availableY <= 0 ? 0 : Math.max(minY, availableY - EDGE_MARGIN)\n return { minX, maxX, minY, maxY }\n}\n\nfunction getDockedPosition(edge: DockedEdge, width: number, height: number) {\n const { minX, maxX, minY, maxY } = getToolbarBounds(width, height)\n const centerX = clamp((window.innerWidth - width) / 2, minX, maxX)\n const centerY = clamp((window.innerHeight - height) / 2, minY, maxY)\n\n switch (edge) {\n case 'bottom':\n return { x: centerX, y: maxY }\n case 'top':\n return { x: centerX, y: minY }\n case 'left':\n return { x: minX, y: centerY }\n case 'right':\n return { x: maxX, y: centerY }\n }\n}\n\nfunction getInitialDockedPosition(edge: DockedEdge) {\n if (typeof window === 'undefined') return { x: 0, y: 0 }\n // Start near the target edge before measurement so we never flash from (0,0).\n return getDockedPosition(edge, 0, 0)\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 const transitionTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const transitioningRef = React.useRef(false)\n const recalcRef = React.useRef<(() => void) | 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 }>(() => (\n getInitialDockedPosition(dockedEdge)\n ))\n const [dockedTransitionEnabled, setDockedTransitionEnabled] = React.useState(false)\n\n // Compute initial position synchronously before the browser paints.\n // useLayoutEffect fires after DOM commit but before paint, so the browser\n // never sees the element at (0,0) — no flash, no fly-in, no visibility hack needed.\n React.useLayoutEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n setDockedPos(getDockedPos())\n }, [getDockedPos, toolbarRef])\n\n // Keep docked transitions off for the first paint to avoid startup motion.\n React.useEffect(() => {\n const raf = requestAnimationFrame(() => {\n setDockedTransitionEnabled(true)\n })\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // Predict the final size before an expand/collapse transition starts.\n // Sets the target position immediately so it transitions in parallel with the resize.\n const predictSize = React.useCallback((width: number, height: number) => {\n transitioningRef.current = true\n setDockedPos(getDockedPosition(dockedEdge, width, height))\n if (transitionTimerRef.current) clearTimeout(transitionTimerRef.current)\n transitionTimerRef.current = setTimeout(() => {\n transitioningRef.current = false\n transitionTimerRef.current = null\n // Ensure we always settle to the measured final size/position.\n recalcRef.current?.()\n }, 350)\n }, [dockedEdge])\n\n // Resize observer + window resize to recalculate docked position.\n // Suppressed during predicted transitions to avoid cascading updates.\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n\n function recalc() {\n if (!el || transitioningRef.current) return\n const rect = el.getBoundingClientRect()\n setDockedPos(getDockedPosition(dockedEdge, rect.width, rect.height))\n }\n\n recalcRef.current = recalc\n const ro = new ResizeObserver(recalc)\n ro.observe(el)\n window.addEventListener('resize', recalc)\n\n return () => {\n recalcRef.current = null\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 try {\n capturedElementRef.current.setPointerCapture(e.pointerId)\n } catch {}\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 try {\n capturedElementRef.current.releasePointerCapture(e.pointerId)\n } catch {}\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 setDockedPos(getDockedPosition(newEdge, el.offsetWidth, el.offsetHeight))\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 timers on unmount\n React.useEffect(() => {\n return () => {\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n if (transitionTimerRef.current) clearTimeout(transitionTimerRef.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 = { position: 'fixed' }\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 — smooth re-centering when toolbar resizes (e.g. design mode toggle)\n return {\n ...base,\n left: dockedPos.x,\n top: dockedPos.y,\n ...(dockedTransitionEnabled && {\n transition: 'left 300ms cubic-bezier(0.25, 1, 0.5, 1), top 300ms cubic-bezier(0.25, 1, 0.5, 1), box-shadow 150ms ease-out',\n }),\n }\n }, [phase, dragPosition, dockedPos, dockedTransitionEnabled])\n\n return {\n dockedEdge,\n isDragging,\n isSnapping,\n style,\n predictSize,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n }\n}\n","import * as React from 'react'\nimport { Button as BaseButton } from '@base-ui/react/button'\nimport { usePortalContainer } from '../portal-container'\nimport { Popover } from '@base-ui/react/popover'\nimport { X, Check, Copy, Send, Trash2 } from 'lucide-react'\nimport type { SessionItem } from '../types'\nimport { Badge } from '../ui/badge'\nimport { buildSessionExport } from '../utils'\nimport { cn } from '../cn'\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '../ui/tooltip'\n\nfunction EditsPopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nfunction truncateText(value: string, max = 64): string {\n if (value.length <= max) return value\n return `${value.slice(0, max)}...`\n}\n\nexport interface EditsPopoverProps {\n tooltipSide: 'top' | 'bottom' | 'left' | 'right'\n sessionEditCount: number\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n onGetSessionItems?: () => SessionItem[]\n onExportAllEdits?: () => Promise<boolean>\n onSendAllToAgents?: () => Promise<boolean>\n onClearSessionEdits?: () => void\n onRemoveSessionEdit?: (element: HTMLElement) => void\n onDeleteComment?: (id: string) => void\n}\n\nexport function EditsPopover({\n tooltipSide,\n sessionEditCount,\n isOpen,\n onOpenChange,\n onGetSessionItems,\n onExportAllEdits,\n onSendAllToAgents,\n onClearSessionEdits,\n onRemoveSessionEdit,\n onDeleteComment,\n}: EditsPopoverProps) {\n const [copied, setCopied] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const editsPopupRef = React.useRef<HTMLDivElement>(null)\n const editsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const [editsSnapshot, setEditsSnapshot] = React.useState<SessionItem[]>([])\n\n // Close on outside click (Shadow DOM breaks base-ui's dismiss)\n React.useEffect(() => {\n if (!isOpen) 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 onOpenChange(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 }, [isOpen, onOpenChange])\n\n // Refresh snapshot when popover opens\n React.useEffect(() => {\n if (isOpen && onGetSessionItems) {\n setEditsSnapshot(onGetSessionItems())\n }\n }, [isOpen, onGetSessionItems])\n\n const handleCopyAll = React.useCallback(async () => {\n const success = await onExportAllEdits?.()\n if (!success) return\n setCopied(true)\n window.setTimeout(() => setCopied(false), 2000)\n }, [onExportAllEdits])\n\n const handleSendAll = React.useCallback(async () => {\n if (!onSendAllToAgents || sendStatus === 'sending') return\n\n setSendStatus('sending')\n let success = false\n try {\n success = await onSendAllToAgents()\n } catch {\n success = false\n }\n if (success) {\n setSendStatus('sent')\n window.setTimeout(() => setSendStatus('idle'), 2000)\n return\n }\n\n setSendStatus('offline')\n window.setTimeout(() => setSendStatus('idle'), 2000)\n }, [onSendAllToAgents, sendStatus])\n\n const handleCopyItem = React.useCallback(async (item: SessionItem) => {\n const text = item.type === 'edit'\n ? buildSessionExport([item.edit], [])\n : buildSessionExport([], [item.comment])\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${text}`)\n setCopied(true)\n window.setTimeout(() => setCopied(false), 2000)\n } catch {}\n }, [])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={onOpenChange}>\n <Tooltip disabled={isOpen}>\n <TooltipTrigger render={\n <Popover.Trigger render={\n <button\n ref={editsTriggerRef}\n type=\"button\"\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n sessionEditCount > 0 || isOpen\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onOpenChange(!isOpen)\n }}\n />\n } />\n }>\n <Copy className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide}>\n <span>Export 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\n ref={editsPopupRef}\n className=\"w-[340px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between px-3 pb-1 pt-2.5\">\n <span className=\"text-xs font-medium text-foreground\">Copy to AI agents</span>\n {editsSnapshot.length > 0 && (\n <div className=\"flex items-center gap-1\">\n <BaseButton\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={() => {\n void handleCopyAll()\n }}\n >\n {copied ? (\n <Check className=\"size-3 text-green-400\" />\n ) : (\n <Copy className=\"size-3\" />\n )}\n {copied ? 'Copied' : 'Copy all'}\n </BaseButton>\n {onSendAllToAgents && (\n <BaseButton\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={() => {\n void handleSendAll()\n }}\n disabled={sendStatus === 'sending'}\n >\n {sendStatus === 'offline' ? (\n <X className=\"size-3 text-red-500\" />\n ) : sendStatus === 'sent' ? (\n <Check className=\"size-3 text-green-400\" />\n ) : (\n <Send className={cn('size-3', sendStatus === 'sending' && 'animate-pulse')} />\n )}\n {sendStatus === 'sending'\n ? 'Sending'\n : sendStatus === 'sent'\n ? 'Sent'\n : sendStatus === 'offline'\n ? 'Offline'\n : 'Send all'}\n </BaseButton>\n )}\n <Tooltip>\n <TooltipTrigger render={\n <BaseButton\n className=\"inline-flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={() => {\n onClearSessionEdits?.()\n setEditsSnapshot([])\n }}\n />\n }>\n <Trash2 className=\"size-3\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide}>\n <span>Clear all</span>\n </TooltipContent>\n </Tooltip>\n </div>\n )}\n </div>\n {editsSnapshot.length === 0 ? (\n <div className=\"px-3 pb-3 pt-1 text-xs text-muted-foreground\">\n No edits or comments yet.\n </div>\n ) : (\n <div className=\"max-h-[240px] overflow-y-auto px-1 py-1\">\n {editsSnapshot.map((item, i) => {\n const isEdit = item.type === 'edit'\n const isMoved = isEdit && Boolean(item.edit.move)\n const locator = isEdit ? item.edit.locator : item.comment.locator\n const componentName = locator.reactStack[0]?.name ?? locator.tagName\n let valueSummary = ''\n if (isEdit) {\n const entries = Object.entries(item.edit.pendingStyles)\n const editValues: string[] = []\n for (const [prop, value] of entries) {\n editValues.push(`${prop}: ${value}`)\n }\n if (item.edit.textEdit) {\n editValues.push(`text: \"${item.edit.textEdit.newText}\"`)\n }\n if (item.edit.move) {\n editValues.push(`${item.edit.move.fromParentName} -> ${item.edit.move.toParentName}`)\n }\n valueSummary = editValues.length > 0 ? editValues.join(', ') : '(no edits)'\n } else {\n const commentValues: string[] = []\n commentValues.push(item.comment.text.trim() ? item.comment.text.trim() : '(empty)')\n for (const reply of item.comment.replies.slice(0, 2)) {\n commentValues.push(`reply: ${reply.text}`)\n }\n valueSummary = commentValues.join(', ')\n }\n return (\n <div\n key={item.type === 'comment' ? item.comment.id : `edit-${i}`}\n role=\"button\"\n tabIndex={0}\n className=\"group flex cursor-pointer items-start justify-between rounded-md px-1.5 py-1.5 text-xs transition-colors hover:bg-muted/50\"\n onClick={() => {\n void handleCopyItem(item)\n }}\n onKeyDown={(e) => {\n if (e.target !== e.currentTarget) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n void handleCopyItem(item)\n }\n }}\n >\n <div className=\"min-w-0 flex flex-1 flex-col items-start gap-[4px]\">\n <Badge variant=\"secondary\" className=\"h-6 shrink-0 px-1.5 text-xs\">\n @<{componentName}>\n </Badge>\n <span className=\"min-w-0 max-w-full truncate text-xs text-muted-foreground\">\n {isEdit ? (isMoved ? 'moved: ' : 'edit: ') : 'comment: '}\n {truncateText(valueSummary, 128)}\n </span>\n </div>\n <BaseButton\n className=\"ml-2 flex size-6 flex-shrink-0 items-center justify-center rounded-md text-muted-foreground opacity-0 transition-[opacity,background-color,color] hover:bg-muted hover:text-foreground group-hover:opacity-100\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n if (item.type === 'edit') {\n onRemoveSessionEdit?.(item.edit.element)\n } else {\n onDeleteComment?.(item.comment.id)\n }\n setEditsSnapshot((prev) => prev.filter((_, j) => j !== i))\n }}\n >\n <X className=\"size-3\" />\n </BaseButton>\n </div>\n )\n })}\n </div>\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </EditsPopoverPortal>\n </Popover.Root>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\n\nconst badgeVariants = {\n base: 'inline-flex items-center rounded-md border px-2 py-0.5 text-[10px] font-medium whitespace-nowrap transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground',\n secondary: 'border-transparent bg-muted text-secondary-foreground',\n outline: 'border-border bg-transparent text-foreground',\n },\n}\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: keyof typeof badgeVariants.variant\n}\n\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = 'default', ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n badgeVariants.base,\n badgeVariants.variant[variant],\n className\n )}\n {...props}\n />\n )\n)\n\nBadge.displayName = 'Badge'\n\nexport { Badge }\n","import * as React from 'react'\nimport { usePortalContainer } from '../portal-container'\nimport { Menu } from '@base-ui/react/menu'\nimport { EllipsisVertical, Sun, Moon, Monitor, Command, ArrowBigUp, Option, Keyboard, ChevronRight } from 'lucide-react'\nimport type { Theme } from '../types'\nimport { cn } from '../cn'\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '../ui/tooltip'\n\nfunction SettingsMenuPortal(props: React.ComponentPropsWithoutRef<typeof Menu.Portal>) {\n const container = usePortalContainer()\n return <Menu.Portal container={container} {...props} />\n}\n\nexport interface SettingsPopoverProps {\n tooltipSide: 'top' | 'bottom' | 'left' | 'right'\n theme: Theme\n isMac: boolean\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n onSetTheme?: (theme: Theme) => void\n}\n\nexport function SettingsPopover({\n tooltipSide,\n theme,\n isMac,\n isOpen,\n onOpenChange,\n onSetTheme,\n}: SettingsPopoverProps) {\n const settingsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const settingsPopupRef = React.useRef<HTMLDivElement>(null)\n\n const popupKbdClass = 'inline-flex h-4 min-w-[18px] items-center justify-center rounded-[6px] bg-muted px-1 text-[9px] font-mono text-muted-foreground'\n const popupTitleClass = 'flex h-8 items-center px-3 text-xs font-medium text-foreground'\n const submenuSide = tooltipSide === 'left' ? 'left' : 'right'\n const centeredSubmenuCollision = React.useMemo(\n () => ({ side: 'flip' as const, align: 'none' as const, fallbackAxisSide: 'none' as const }),\n [],\n )\n\n return (\n <Menu.Root open={isOpen} onOpenChange={onOpenChange} modal={false}>\n <Tooltip disabled={isOpen}>\n <TooltipTrigger render={\n <Menu.Trigger render={\n <button\n ref={settingsTriggerRef}\n type=\"button\"\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n isOpen\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 }>\n <EllipsisVertical className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide}>\n <span>Preferences</span>\n </TooltipContent>\n </Tooltip>\n <SettingsMenuPortal>\n <Menu.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Menu.Popup\n ref={settingsPopupRef}\n className=\"w-[200px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className={popupTitleClass}>Preferences</div>\n <div className=\"px-1 pb-1\">\n <Menu.SubmenuRoot>\n <Menu.SubmenuTrigger\n openOnHover={false}\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors data-[highlighted]:bg-muted/50 data-[highlighted]:text-foreground\"\n >\n <Monitor className=\"size-3.5\" />\n <span className=\"flex-1\">Theme</span>\n <ChevronRight className=\"size-3.5\" />\n </Menu.SubmenuTrigger>\n <SettingsMenuPortal>\n <Menu.Positioner\n anchor={settingsPopupRef}\n side={submenuSide}\n align=\"center\"\n sideOffset={6}\n collisionAvoidance={centeredSubmenuCollision}\n className=\"fixed z-[99999]\"\n style={{ pointerEvents: 'auto' }}\n >\n <Menu.Popup\n className=\"w-[200px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className={popupTitleClass}>Theme</div>\n <div className=\"px-1 pb-1\">\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 <Menu.Item\n key={value}\n className={cn(\n 'flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs transition-colors',\n theme === value\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground data-[highlighted]:bg-muted/50 data-[highlighted]:text-foreground'\n )}\n onClick={() => {\n onSetTheme?.(value)\n onOpenChange(false)\n }}\n >\n <Icon className=\"size-3.5\" />\n {label}\n </Menu.Item>\n ))}\n </div>\n </Menu.Popup>\n </Menu.Positioner>\n </SettingsMenuPortal>\n </Menu.SubmenuRoot>\n\n <Menu.SubmenuRoot>\n <Menu.SubmenuTrigger\n openOnHover={false}\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors data-[highlighted]:bg-muted/50 data-[highlighted]:text-foreground\"\n >\n <Keyboard className=\"size-3.5\" />\n <span className=\"flex-1\">Keyboard shortcuts</span>\n <ChevronRight className=\"size-3.5\" />\n </Menu.SubmenuTrigger>\n <SettingsMenuPortal>\n <Menu.Positioner\n anchor={settingsPopupRef}\n side={submenuSide}\n align=\"center\"\n sideOffset={6}\n collisionAvoidance={centeredSubmenuCollision}\n className=\"fixed z-[99999]\"\n style={{ pointerEvents: 'auto' }}\n >\n <Menu.Popup\n className=\"w-[300px] rounded-xl bg-background text-[11px] outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className=\"flex h-7 items-center px-3 text-[11px] font-medium text-foreground\">Keyboard Shortcuts</div>\n <div className=\"px-1 pb-1\">\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: 'Toggle canvas mode', keys: [<ArrowBigUp key=\"shift\" className=\"size-3\" />, 'Z'] },\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 h-7 w-full items-center justify-between rounded-md px-2 text-[11px] text-muted-foreground\">\n <span>{label}</span>\n <span className=\"flex items-center gap-1\">\n {keys.map((k, i) => (\n <kbd key={typeof k === 'string' ? k : i} className={popupKbdClass}>{k}</kbd>\n ))}\n </span>\n </div>\n ))}\n </div>\n </Menu.Popup>\n </Menu.Positioner>\n </SettingsMenuPortal>\n </Menu.SubmenuRoot>\n </div>\n </Menu.Popup>\n </Menu.Positioner>\n </SettingsMenuPortal>\n </Menu.Root>\n )\n}\n","import * as React from 'react'\nimport { Button as BaseButton } from '@base-ui/react/button'\nimport { usePortalContainer } from '../portal-container'\nimport { Popover } from '@base-ui/react/popover'\nimport { Scan, Minimize2, Maximize2, Check, ArrowBigUp } from 'lucide-react'\nimport { cn } from '../cn'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../ui/tooltip'\n\nfunction ZoomPopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nexport interface ZoomPopoverProps {\n tooltipSide: 'top' | 'bottom' | 'left' | 'right'\n canvasActive: boolean\n canvasZoom: number\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n onToggleCanvas?: () => void\n onSetCanvasZoom?: (zoom: number) => void\n onZoomTo100?: () => void\n onFitToViewport?: () => void\n}\n\nexport function ZoomPopover({\n tooltipSide,\n canvasActive,\n canvasZoom,\n isOpen,\n onOpenChange,\n onToggleCanvas,\n onSetCanvasZoom,\n onZoomTo100,\n onFitToViewport,\n}: ZoomPopoverProps) {\n const popupRef = React.useRef<HTMLDivElement>(null)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const kbdClass = '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 // Close on outside click (Shadow DOM breaks base-ui's dismiss)\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 onOpenChange(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 }, [isOpen, onOpenChange])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={onOpenChange}>\n <Tooltip disabled={isOpen}>\n <TooltipTrigger render={\n <Popover.Trigger render={\n <button\n ref={triggerRef}\n type=\"button\"\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n isOpen\n ? 'bg-muted text-foreground'\n : canvasActive\n ? 'bg-muted text-foreground hover:bg-muted/80'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onOpenChange(!isOpen)\n }}\n />\n } />\n }>\n <Maximize2 className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>Canvas mode</span>\n <kbd className={kbdClass}><ArrowBigUp className=\"size-2.5\" /></kbd>\n <kbd className={kbdClass}>Z</kbd>\n </TooltipContent>\n </Tooltip>\n <ZoomPopoverPortal>\n <Popover.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup\n ref={popupRef}\n className=\"w-[180px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className=\"px-1 py-1\">\n <BaseButton\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n onClick={() => {\n onZoomTo100?.()\n onOpenChange(false)\n }}\n >\n <Scan className=\"size-3.5\" />\n Actual size (100%)\n </BaseButton>\n <BaseButton\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n onClick={() => {\n onFitToViewport?.()\n onOpenChange(false)\n }}\n >\n <Minimize2 className=\"size-3.5\" />\n Fit to viewport\n </BaseButton>\n <div className=\"my-1 border-t border-foreground/10\" />\n <BaseButton\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n onClick={() => {\n onToggleCanvas?.()\n onOpenChange(false)\n }}\n >\n <Check className={cn('size-3.5', canvasActive ? 'opacity-100' : 'opacity-0')} />\n Canvas mode\n </BaseButton>\n </div>\n </Popover.Popup>\n </Popover.Positioner>\n </ZoomPopoverPortal>\n </Popover.Root>\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 const [boxShadow, setBoxShadow] = React.useState('none')\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 handleSetCSS = (properties: Record<string, string>) => {\n setPendingStyles((prev) => ({ ...prev, ...properties }))\n if (properties['box-shadow']) {\n setBoxShadow(properties['box-shadow'])\n }\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 setBoxShadow('none')\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 computedBoxShadow={boxShadow}\n borderStyleControlPreference=\"icon\"\n computedTypography={typography}\n pendingStyles={pendingStyles}\n onSelectParent={() => {}}\n onUpdateSpacing={handleUpdateSpacing}\n onUpdateBorderRadius={handleUpdateBorderRadius}\n onUpdateBorder={handleUpdateBorder}\n onBatchUpdateBorder={handleBatchUpdateBorder}\n onSetCSS={handleSetCSS}\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 boxShadow,\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","React","numeric","isFlexContainer","containerRect","React","locator","styleState","React","React","snapshot","sendEditToAgent","sendCommentToAgent","React","React","jsx","sendEditToAgent","sendCommentToAgent","React","React","jsx","React","React","jsx","jsxs","React","React","jsx","jsxs","elementUnder","jsx","BLUE","React","Fragment","jsx","jsxs","BLUE","React","Fragment","jsx","jsxs","React","React","jsx","jsx","jsxs","React","React","jsx","React","jsx","jsxs","jsx","jsxs","React","jsx","Check","jsx","jsxs","Check","React","jsx","jsxs","React","jsx","jsxs","ChevronDown","Square","Focus","Grid2x2","jsx","jsxs","changes","React","Plus","Minus","jsx","jsxs","Type","jsx","jsxs","X","ChevronDown","Fragment","jsx","jsxs","React","X","Copy","Check","Send","jsx","jsxs","panelBarBaseClass","React","ArrowUp","Columns2","Grid2x2","jsx","jsxs","React","Check","jsx","jsxs","jsx","jsxs","Check","ArrowRight","ArrowDown","MoveHorizontal","ChevronsUpDown","Plus","Minus","jsx","jsxs","React","STORAGE_KEY","Fragment","jsx","jsxs","sendEditToAgent","sendCommentToAgent","React","createPortal","React","createPortal","Fragment","jsx","jsxs","RULER_SIZE","bodyOffset","zoom","createPortal","React","STORAGE_KEY","DRAG_THRESHOLD","Command","ArrowBigUp","X","React","Popover","X","Check","Copy","Send","Trash2","React","jsx","jsx","jsxs","Popover","Copy","Check","X","Send","Trash2","React","jsx","jsxs","React","BaseButton","Popover","Check","ArrowBigUp","jsx","jsxs","Popover","ArrowBigUp","BaseButton","Check","Fragment","jsx","jsxs","Command","ArrowBigUp","X","createPortal","jsx","jsxs","React","jsx","jsxs"]}
|
|
1
|
+
{"version":3,"sources":["../src/provider.tsx","../src/portal-container.tsx","styles.css","../src/use-style-updaters.ts","../src/utils/css-value.ts","../src/utils.ts","../src/ui/color-utils.ts","../src/use-session-manager.ts","../src/use-text-and-comments.ts","../src/use-agent-comms.ts","../src/mcp-client.ts","../src/use-keyboard-shortcuts.ts","../src/use-canvas.ts","../src/canvas-store.ts","../src/panel.tsx","../src/ui/tooltip.tsx","../src/cn.ts","../src/use-measurement.ts","../src/measurement-overlay.tsx","../src/use-move.ts","../src/use-guidelines.ts","../src/utils/snap-targets.ts","../src/panel/interaction-overlay.tsx","../src/move-overlay.tsx","../src/selection-overlay.tsx","../src/comment-overlay.tsx","../src/panel/shared.tsx","../src/ui/input.tsx","../src/panel/border-radius-inputs.tsx","../src/ui/button.tsx","../src/ui/slider.tsx","../src/panel/border-section.tsx","../src/ui/select.tsx","../src/ui/simple-select.tsx","../src/ui/color-picker.tsx","../src/panel/fill-section.tsx","../src/panel/shadow-section.tsx","../src/shadow-utils.ts","../src/panel/typography-inputs.tsx","../src/panel/panel-header.tsx","../src/panel/panel-footer.tsx","../src/panel/spacing-inputs.tsx","../src/panel/sizing-inputs.tsx","../src/panel/alignment-grid.tsx","../src/panel/layout-section.tsx","../src/use-panel-position.ts","../src/toolbar.tsx","../src/rulers-overlay.tsx","../src/use-toolbar-dock.ts","../src/toolbar/edits-popover.tsx","../src/ui/badge.tsx","../src/toolbar/settings-popover.tsx","../src/toolbar/zoom-popover.tsx","../src/direct-edit.tsx","../src/demo.tsx"],"sourcesContent":["import * as React from 'react'\nimport { PortalContainerProvider, usePortalContainer } from './portal-container'\nimport type {\n DirectEditState,\n SpacingPropertyKey,\n BorderRadiusPropertyKey,\n BorderPropertyKey,\n BorderProperties,\n FlexPropertyKey,\n SizingPropertyKey,\n TypographyPropertyKey,\n CSSPropertyValue,\n SizingValue,\n ColorPropertyKey,\n ColorValue,\n UndoEntry,\n ActiveTool,\n Theme,\n BorderStyleControlPreference,\n SessionEdit,\n SessionItem,\n} from './types'\nimport type { MoveInfo } from './use-move'\nimport { useStyleUpdaters } from './use-style-updaters'\nimport { useSessionManager } from './use-session-manager'\nimport { useTextAndComments } from './use-text-and-comments'\nimport { useAgentComms } from './use-agent-comms'\nimport { useKeyboardShortcuts } from './use-keyboard-shortcuts'\nimport { useCanvas } from './use-canvas'\n\nexport interface DirectEditActionsContextValue {\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 setBorderStyleControlPreference: (preference: BorderStyleControlPreference) => 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 canSendEditToAgent: (snapshot?: {\n selectedElement: HTMLElement | null\n elementInfo: DirectEditState['elementInfo']\n pendingStyles: Record<string, string>\n }) => boolean\n sendEditToAgent: () => Promise<boolean>\n sendAllSessionItemsToAgent: () => Promise<boolean>\n sendCommentToAgent: (id: string) => Promise<boolean>\n setActiveCommentId: (id: string | null) => void\n getSessionEdits: () => SessionEdit[]\n getSessionItems: () => SessionItem[]\n exportAllEdits: () => Promise<boolean>\n clearSessionEdits: () => void\n removeSessionEdit: (element: HTMLElement) => void\n startTextEditing: (element: HTMLElement) => void\n commitTextEditing: () => void\n toggleCanvas: () => void\n setCanvasZoom: (zoom: number) => void\n fitCanvasToViewport: () => void\n zoomCanvasTo100: () => void\n}\n\nexport interface DirectEditStateContextValue extends DirectEditState {\n sessionEditCount: number\n}\n\nexport interface DirectEditContextValue extends DirectEditStateContextValue, DirectEditActionsContextValue {}\n\nconst DirectEditStateContext = React.createContext<DirectEditStateContextValue | null>(null)\nconst DirectEditActionsContext = React.createContext<DirectEditActionsContextValue | null>(null)\n\nexport function useDirectEditState(): DirectEditStateContextValue {\n const context = React.useContext(DirectEditStateContext)\n if (!context) {\n throw new Error('useDirectEditState must be used within a DirectEditProvider')\n }\n return context\n}\n\nexport function useDirectEditActions(): DirectEditActionsContextValue {\n const context = React.useContext(DirectEditActionsContext)\n if (!context) {\n throw new Error('useDirectEditActions must be used within a DirectEditProvider')\n }\n return context\n}\n\nexport function useDirectEdit(): DirectEditContextValue {\n const state = useDirectEditState()\n const actions = useDirectEditActions()\n return React.useMemo(() => ({ ...state, ...actions }), [state, actions])\n}\n\ninterface DirectEditProviderProps {\n children: React.ReactNode\n}\n\nconst BORDER_STYLE_CONTROL_PREFERENCE_KEY = 'direct-edit-border-style-control'\nconst useIsomorphicLayoutEffect = typeof window === 'undefined' ? React.useEffect : React.useLayoutEffect\n\nfunction getInitialTheme(): Theme {\n if (typeof window === 'undefined') return 'system'\n try {\n const theme = localStorage.getItem('direct-edit-theme')\n if (theme === 'light' || theme === 'dark' || theme === 'system') {\n return theme\n }\n } catch {}\n return 'system'\n}\n\nfunction getInitialBorderStyleControlPreference(): BorderStyleControlPreference {\n if (typeof window === 'undefined') return 'icon'\n try {\n const borderPref = localStorage.getItem(BORDER_STYLE_CONTROL_PREFERENCE_KEY)\n if (borderPref === 'label' || borderPref === 'icon') {\n return borderPref\n }\n } catch {}\n return 'icon'\n}\n\nexport function DirectEditProvider({ children }: DirectEditProviderProps) {\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 computedBoxShadow: null,\n computedTypography: null,\n originalStyles: {},\n pendingStyles: {},\n editModeActive: false,\n activeTool: 'select',\n theme: getInitialTheme(),\n borderStyleControlPreference: getInitialBorderStyleControlPreference(),\n comments: [],\n activeCommentId: null,\n textEditingElement: null,\n canvas: { active: false, zoom: 1, panX: 0, panY: 0 },\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 > 500) {\n undoStackRef.current = undoStackRef.current.slice(-500)\n }\n if (entry.type === 'edit' || entry.type === 'move' || entry.type === 'textEdit') {\n removedSessionEditsRef.current.delete(entry.element)\n }\n }, [])\n\n const {\n updateSpacingProperty, updateBorderRadiusProperty, updateBorderProperty,\n updateBorderProperties, updateRawCSS, updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n } = useStyleUpdaters({ stateRef, pushUndo, setState })\n\n const {\n syncSessionItemCount, saveCurrentToSession, selectElement, selectParent, selectChild,\n resetToOriginal, undo, handleMoveComplete, getSessionEdits, getSessionItems,\n exportAllEdits, exportEdits, removeSessionEdit, clearSessionEdits,\n } = useSessionManager({\n stateRef, sessionEditsRef, removedSessionEditsRef, undoStackRef,\n pushUndo, setState, setSessionEditCount,\n })\n\n // Save current element to session when selected element or pending styles change\n React.useEffect(() => {\n if (!state.selectedElement) return\n saveCurrentToSession()\n }, [state.selectedElement, state.pendingStyles, saveCurrentToSession])\n\n const {\n finalizeTextEditing, toggleEditMode: toggleEditModeBase, startTextEditing, commitTextEditing,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment, setActiveCommentId,\n } = useTextAndComments({\n stateRef, sessionEditsRef, removedSessionEditsRef,\n pushUndo, syncSessionItemCount, setState,\n })\n\n const { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 } = useCanvas({\n stateRef, setState,\n })\n\n const closePanel = React.useCallback(() => {\n setState((prev) => ({\n ...prev,\n isOpen: false,\n }))\n }, [])\n\n // Wrap toggleEditMode to enter canvas when edit mode turns on, exit when it turns off.\n // Timing note: toggleEditModeBase() only calls setState (async). stateRef is synced\n // from React state in a post-render useEffect, so stateRef.current still holds the\n // pre-toggle values immediately after the call. wasActive and canvas?.active both\n // read the old state intentionally — that's what the branching logic requires.\n const toggleEditMode = React.useCallback(() => {\n const wasActive = stateRef.current.editModeActive\n toggleEditModeBase()\n if (wasActive && stateRef.current.canvas?.active) {\n exitCanvas()\n } else if (!wasActive) {\n enterCanvas()\n }\n if (wasActive) {\n closePanel()\n }\n }, [toggleEditModeBase, stateRef, exitCanvas, enterCanvas, closePanel])\n\n // Sync session item count when comments change\n React.useEffect(() => {\n syncSessionItemCount(state.comments)\n }, [state.comments, syncSessionItemCount])\n\n // Click-outside listener for text editing\n React.useEffect(() => {\n const editingElement = state.textEditingElement\n if (!editingElement) return\n const activeEditingElement = editingElement\n\n function handleMouseDown(e: MouseEvent) {\n const target = e.target\n if (!(target instanceof Node)) return\n if (!activeEditingElement.contains(target)) {\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 {\n canSendEditToAgent, sendEditToAgent, sendCommentToAgent, sendAllSessionItemsToAgent,\n } = useAgentComms({ stateRef, sessionEditsRef, getSessionItems })\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 setBorderStyleControlPreference = React.useCallback((preference: BorderStyleControlPreference) => {\n setState((prev) => ({ ...prev, borderStyleControlPreference: preference }))\n try { localStorage.setItem(BORDER_STYLE_CONTROL_PREFERENCE_KEY, preference) } catch {}\n }, [])\n\n useKeyboardShortcuts({\n stateRef, toggleEditMode, toggleFlexLayout, undo,\n commitTextEditing, startTextEditing, closePanel, setState,\n toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100,\n })\n\n const stateContextValue = React.useMemo<DirectEditStateContextValue>(() => ({\n ...state,\n sessionEditCount,\n }), [state, sessionEditCount])\n\n const actionsContextValue = React.useMemo<DirectEditActionsContextValue>(() => ({\n selectElement, selectParent, selectChild, closePanel,\n updateSpacingProperty, updateBorderRadiusProperty, updateBorderProperty,\n updateBorderProperties, updateRawCSS, updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n resetToOriginal, exportEdits, canSendEditToAgent, sendEditToAgent,\n sendAllSessionItemsToAgent, sendCommentToAgent, toggleEditMode, undo,\n handleMoveComplete, setActiveTool, setTheme, setBorderStyleControlPreference,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment,\n setActiveCommentId, getSessionEdits, getSessionItems, exportAllEdits,\n clearSessionEdits, removeSessionEdit, startTextEditing, commitTextEditing,\n toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100,\n }), [\n selectElement, selectParent, selectChild, closePanel,\n updateSpacingProperty, updateBorderRadiusProperty, updateBorderProperty,\n updateBorderProperties, updateRawCSS, updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n resetToOriginal, exportEdits, canSendEditToAgent, sendEditToAgent,\n sendAllSessionItemsToAgent, sendCommentToAgent, toggleEditMode, undo,\n handleMoveComplete, setActiveTool, setTheme, setBorderStyleControlPreference,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment,\n setActiveCommentId, getSessionEdits, getSessionItems, exportAllEdits,\n clearSessionEdits, removeSessionEdit, startTextEditing, commitTextEditing,\n toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100,\n ])\n\n return (\n <PortalContainerProvider>\n <DirectEditStateContext.Provider value={stateContextValue}>\n <DirectEditActionsContext.Provider value={actionsContextValue}>\n <ThemeApplier />\n {children}\n\n </DirectEditActionsContext.Provider>\n </DirectEditStateContext.Provider>\n </PortalContainerProvider>\n )\n}\n\nfunction ThemeApplier() {\n const { theme } = useDirectEditState()\n const container = usePortalContainer()\n\n useIsomorphicLayoutEffect(() => {\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.documentElement.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-400:oklch(70.4% .191 22.216);--color-red-500:oklch(63.7% .237 25.331);--color-green-400:oklch(79.2% .209 151.711);--color-green-500:oklch(72.3% .219 149.579);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-600:oklch(54.6% .245 262.881);--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--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);--ease-in-out:cubic-bezier(.4,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}.collapse{visibility:collapse}.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)}.left-3{left:calc(var(--spacing)*3)}.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}}.m-4{margin:calc(var(--spacing)*4)}.mx-0\\.5{margin-inline:calc(var(--spacing)*.5)}.mx-2{margin-inline:calc(var(--spacing)*2)}.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)}.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-8{height:calc(var(--spacing)*8)}.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-48{max-height:calc(var(--spacing)*48)}.max-h-\\[240px\\]{max-height:240px}.min-h-0{min-height:calc(var(--spacing)*0)}.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-\\[30px\\]{width:30px}.w-\\[60px\\]{width:60px}.w-\\[68px\\]{width:68px}.w-\\[180px\\]{width:180px}.w-\\[200px\\]{width:200px}.w-\\[260px\\]{width:260px}.w-\\[280px\\]{width:280px}.w-\\[300px\\]{width:300px}.w-\\[340px\\]{width:340px}.w-auto{width:auto}.w-fit{width:fit-content}.w-full{width:100%}.w-px{width:1px}.max-w-full{max-width:100%}.min-w-0{min-width:calc(var(--spacing)*0)}.min-w-\\[18px\\]{min-width:18px}.min-w-\\[20px\\]{min-width:20px}.min-w-\\[100px\\]{min-width:100px}.min-w-\\[120px\\]{min-width:120px}.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-not-allowed{cursor:not-allowed}.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))}.grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.grid-cols-\\[0fr\\]{grid-template-columns:0fr}.grid-cols-\\[1fr\\]{grid-template-columns:1fr}.grid-rows-\\[0fr\\]{grid-template-rows:0fr}.grid-rows-\\[1fr\\]{grid-template-rows: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}.place-items-center{place-items:center}.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-4{gap:calc(var(--spacing)*4)}.gap-\\[2px\\]{gap:2px}.gap-\\[4px\\]{gap:4px}: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)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse:0;margin-block-start:calc(calc(var(--spacing)*4)*var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing)*4)*calc(1 - var(--tw-space-y-reverse)))}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.overflow-y-hidden{overflow-y:hidden}.rounded{border-radius:.25rem}.rounded-\\[6px\\]{border-radius:6px}.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{border-color:var(--color-border)}.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-transparent{border-color:#0000}.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-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)}.p-4{padding:calc(var(--spacing)*4)}.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-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-2\\.5{padding-top:calc(var(--spacing)*2.5)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-6{padding-top:calc(var(--spacing)*6)}.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-\\[9px\\]{font-size:9px}.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-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-2xs{--tw-shadow:0 1px var(--tw-shadow-color,#0000000d);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-\\[0_4px_6px_-1px_rgba\\(0\\,0\\,0\\,0\\.1\\)\\]{--tw-shadow:0 4px 6px -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-\\[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-inner{--tw-shadow:inset 0 2px 4px 0 var(--tw-shadow-color,#0000000d);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-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)}.shadow-sm{--tw-shadow:0 1px 3px 0 var(--tw-shadow-color,#0000001a),0 1px 2px -1px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xl{--tw-shadow:0 20px 25px -5px var(--tw-shadow-color,#0000001a),0 8px 10px -6px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.shadow-xs{--tw-shadow:0 1px 2px 0 var(--tw-shadow-color,#0000000d);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-2{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.ring-white{--tw-ring-color:var(--color-white)}.outline,.outline-1{outline-style:var(--tw-outline-style);outline-width:1px}.outline-border{outline-color:var(--color-border)}.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-red-500\\/70{outline-color:#fb2c36b3}@supports (color:color-mix(in lab, red, red)){.outline-red-500\\/70{outline-color:color-mix(in oklab,var(--color-red-500)70%,transparent)}}.blur{--tw-blur:blur(8px);filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.backdrop-blur-xl{--tw-backdrop-blur:blur(var(--blur-xl));-webkit-backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,);backdrop-filter:var(--tw-backdrop-blur,)var(--tw-backdrop-brightness,)var(--tw-backdrop-contrast,)var(--tw-backdrop-grayscale,)var(--tw-backdrop-hue-rotate,)var(--tw-backdrop-invert,)var(--tw-backdrop-opacity,)var(--tw-backdrop-saturate,)var(--tw-backdrop-sepia,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[color\\,background-color\\]{transition-property:color,background-color;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-\\[opacity\\,background-color\\,color\\]{transition-property:opacity,background-color,color;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-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-150{--tw-duration:.15s;transition-duration:.15s}.duration-200{--tw-duration:.2s;transition-duration:.2s}.ease-in-out{--tw-ease:var(--ease-in-out);transition-timing-function:var(--ease-in-out)}.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}.\\[-ms-overflow-style\\:none\\]{-ms-overflow-style:none}.\\[scrollbar-width\\:none\\]{scrollbar-width:none}.duration-150{animation-duration:.15s}.duration-200{animation-duration:.2s}.ease-in-out{animation-timing-function:cubic-bezier(.4,0,.2,1)}.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)}.placeholder\\:text-red-400::placeholder{color:var(--color-red-400)}.focus-within\\:ring-1:focus-within{--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-within\\:ring-ring:focus-within{--tw-ring-color:var(--color-ring)}.focus-within\\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}.focus-within\\:ring-inset:focus-within{--tw-ring-inset:inset}@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-muted\\/80:hover{background-color:#f2f2f2cc}@supports (color:color-mix(in lab, red, red)){.hover\\:bg-muted\\/80:hover{background-color:color-mix(in oklab,var(--color-muted)80%,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}.disabled\\:opacity-60:disabled{opacity:.6}.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\\]\\:bg-muted\\/50[data-highlighted]{background-color:#f2f2f280}@supports (color:color-mix(in lab, red, red)){.data-\\[highlighted\\]\\:bg-muted\\/50[data-highlighted]{background-color:color-mix(in oklab,var(--color-muted)50%,transparent)}}.data-\\[highlighted\\]\\:text-foreground[data-highlighted]{color:var(--color-foreground)}@media (prefers-color-scheme:dark){.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)}}.\\[\\&_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}.\\[\\&\\:\\:-webkit-scrollbar\\]\\:hidden::-webkit-scrollbar{display:none}}@media (prefers-reduced-motion:reduce){*,:before,:after{transition:none;animation: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 * as React from 'react'\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} from './types'\nimport {\n getAllComputedStyles,\n getComputedBorderStyles,\n getComputedColorStyles,\n getComputedBoxShadow,\n getElementInfo,\n formatPropertyValue,\n propertyToCSSMap,\n borderRadiusPropertyToCSSMap,\n borderPropertyToCSSMap,\n flexPropertyToCSSMap,\n sizingPropertyToCSSMap,\n typographyPropertyToCSSMap,\n sizingValueToCSS,\n colorPropertyToCSSMap,\n} from './utils'\nimport { formatColorValue } from './ui/color-utils'\n\nexport interface StyleUpdaterOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n pushUndo: (entry: UndoEntry) => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n}\n\nexport function useStyleUpdaters({ stateRef, pushUndo, setState }: StyleUpdaterOptions) {\n\n const updateSpacingProperty = React.useCallback(\n (key: SpacingPropertyKey, value: CSSPropertyValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = propertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateBorderRadiusProperty = React.useCallback(\n (key: BorderRadiusPropertyKey, value: CSSPropertyValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = borderRadiusPropertyToCSSMap[key]\n const cssValue = formatPropertyValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateBorderProperty = React.useCallback(\n (key: BorderPropertyKey, value: BorderProperties[BorderPropertyKey]) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = borderPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.style.setProperty(cssProperty, cssValue)\n\n const border = getComputedBorderStyles(el)\n const color = getComputedColorStyles(el)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n pendingStyles: {\n ...prev.pendingStyles,\n [cssProperty]: cssValue,\n },\n }))\n },\n [pushUndo]\n )\n\n const updateBorderProperties = React.useCallback(\n (changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]>) => {\n const el = stateRef.current.selectedElement\n if (!el || 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 = el.style.getPropertyValue(cssProperty) || null\n properties.push({ cssProperty, previousValue })\n\n el.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: el, properties })\n\n const border = getComputedBorderStyles(el)\n const color = getComputedColorStyles(el)\n const boxShadow = getComputedBoxShadow(el)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n computedBoxShadow: boxShadow,\n pendingStyles: {\n ...prev.pendingStyles,\n ...pendingUpdates,\n },\n }))\n },\n [pushUndo]\n )\n\n const updateRawCSS = React.useCallback(\n (properties: Record<string, string>) => {\n const el = stateRef.current.selectedElement\n if (!el || 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 = el.style.getPropertyValue(cssProperty) || null\n undoProperties.push({ cssProperty, previousValue })\n el.style.setProperty(cssProperty, cssValue)\n pendingUpdates[cssProperty] = cssValue\n }\n\n pushUndo({ type: 'edit', element: el, properties: undoProperties })\n\n const border = getComputedBorderStyles(el)\n const color = getComputedColorStyles(el)\n const boxShadow = getComputedBoxShadow(el)\n\n setState((prev) => ({\n ...prev,\n computedBorder: border,\n computedColor: color,\n computedBoxShadow: boxShadow,\n pendingStyles: {\n ...prev.pendingStyles,\n ...pendingUpdates,\n },\n }))\n },\n [pushUndo]\n )\n\n const updateFlexProperty = React.useCallback(\n (key: FlexPropertyKey, value: string) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = flexPropertyToCSSMap[key]\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const toggleFlexLayout = React.useCallback(() => {\n const current = stateRef.current\n const element = current.selectedElement\n if (!element) return\n\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 = current.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 computed = getAllComputedStyles(element)\n const elementInfo = getElementInfo(element)\n\n const newPending = { ...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: computed.flex,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedSizing: computed.sizing,\n elementInfo,\n pendingStyles: newPending,\n }))\n }, [pushUndo])\n\n const updateSizingProperty = React.useCallback(\n (key: SizingPropertyKey, value: SizingValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = sizingPropertyToCSSMap[key]\n const cssValue = sizingValueToCSS(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateColorProperty = React.useCallback(\n (key: ColorPropertyKey, value: ColorValue) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = colorPropertyToCSSMap[key]\n const cssValue = formatColorValue(value)\n\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.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 [pushUndo]\n )\n\n const updateTypographyProperty = React.useCallback(\n (key: TypographyPropertyKey, value: CSSPropertyValue | string) => {\n const el = stateRef.current.selectedElement\n if (!el) return\n\n const cssProperty = typographyPropertyToCSSMap[key]\n const cssValue = typeof value === 'string' ? value : formatPropertyValue(value)\n\n if (key === 'textVerticalAlign') {\n const prevDisplay = el.style.getPropertyValue('display') || null\n const prevAlignItems = el.style.getPropertyValue('align-items') || null\n pushUndo({\n type: 'edit',\n element: el,\n properties: [\n { cssProperty: 'display', previousValue: prevDisplay },\n { cssProperty: 'align-items', previousValue: prevAlignItems },\n ],\n })\n\n const computed = window.getComputedStyle(el)\n const isInline = computed.display === 'inline' || computed.display === 'inline-block'\n const displayValue = isInline ? 'inline-flex' : 'flex'\n el.style.setProperty('display', displayValue)\n el.style.setProperty('align-items', cssValue)\n } else {\n const previousValue = el.style.getPropertyValue(cssProperty) || null\n pushUndo({ type: 'edit', element: el, properties: [{ cssProperty, previousValue }] })\n\n el.style.setProperty(cssProperty, cssValue)\n }\n\n setState((prev) => {\n let displayValue = 'flex'\n if (key === 'textVerticalAlign' && el) {\n const computed = window.getComputedStyle(el)\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 [pushUndo]\n )\n\n return {\n updateSpacingProperty,\n updateBorderRadiusProperty,\n updateBorderProperty,\n updateBorderProperties,\n updateRawCSS,\n updateFlexProperty,\n toggleFlexLayout,\n updateSizingProperty,\n updateColorProperty,\n updateTypographyProperty,\n }\n}\n","import type { CSSPropertyValue } from '../types'\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","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 Comment,\n} from './types'\n\nexport { parsePropertyValue, formatPropertyValue } from './utils/css-value'\nimport { parsePropertyValue } from './utils/css-value'\n\nexport function clamp(value: number, min: number, max: number): number {\n if (!Number.isFinite(value)) return min\n if (max < min) return min\n return Math.max(min, Math.min(max, value))\n}\n\nexport function isInputFocused(): boolean {\n let active: Element | null = document.activeElement\n while (active?.shadowRoot?.activeElement) {\n active = active.shadowRoot.activeElement\n }\n return (\n active instanceof HTMLInputElement ||\n active instanceof HTMLTextAreaElement ||\n (active instanceof HTMLElement && active.isContentEditable)\n )\n}\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 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\n/** CSS properties captured before editing so resetToOriginal can restore them. */\nexport const ORIGINAL_STYLE_PROPS = [\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 'outline-style',\n 'outline-width',\n 'box-shadow',\n 'font-family',\n 'font-weight',\n 'font-size',\n 'line-height',\n 'letter-spacing',\n 'text-align',\n] as const\n\nexport function getOriginalInlineStyles(element: HTMLElement): Record<string, string> {\n const styles: Record<string, string> = {}\n\n for (const prop of ORIGINAL_STYLE_PROPS) {\n const value = element.style.getPropertyValue(prop)\n if (value) {\n styles[prop] = value\n }\n }\n\n return styles\n}\n\nconst spacingScale: Record<number, string> = { 0: '0', 1: 'px', 2: '0.5', 4: '1', 8: '2', 12: '3', 16: '4', 20: '5', 24: '6', 32: '8' }\n\nconst tailwindClassMap: Record<string, { prefix: string; scale: Record<number, string> }> = {\n padding: { prefix: 'p', scale: spacingScale },\n 'padding-inline': { prefix: 'px', scale: spacingScale },\n 'padding-block': { prefix: 'py', scale: spacingScale },\n 'padding-top': { prefix: 'pt', scale: spacingScale },\n 'padding-right': { prefix: 'pr', scale: spacingScale },\n 'padding-bottom': { prefix: 'pb', scale: spacingScale },\n 'padding-left': { prefix: 'pl', scale: spacingScale },\n margin: { prefix: 'm', scale: spacingScale },\n 'margin-inline': { prefix: 'mx', scale: spacingScale },\n 'margin-block': { prefix: 'my', scale: spacingScale },\n 'margin-top': { prefix: 'mt', scale: spacingScale },\n 'margin-right': { prefix: 'mr', scale: spacingScale },\n 'margin-bottom': { prefix: 'mb', scale: spacingScale },\n 'margin-left': { prefix: 'ml', scale: spacingScale },\n gap: { prefix: 'gap', scale: spacingScale },\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\nfunction normalizeTailwindArbitraryValue(value: string): string {\n return value.trim().replace(/\\s+/g, '_')\n}\n\nfunction normalizeShadowForComparison(value: string): string {\n return value\n .trim()\n .toLowerCase()\n .replace(/\\s*\\/\\s*/g, '/')\n .replace(/\\(\\s+/g, '(')\n .replace(/\\s+\\)/g, ')')\n .replace(/\\s*,\\s*/g, ',')\n .replace(/\\s+/g, ' ')\n}\n\nconst tailwindShadowClassValues: Array<{ className: string; css: string }> = [\n { className: 'shadow-2xs', css: '0 1px rgb(0 0 0 / 0.05)' },\n { className: 'shadow-xs', css: '0 1px 2px 0 rgb(0 0 0 / 0.05)' },\n { className: 'shadow', css: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-sm', css: '0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-md', css: '0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-lg', css: '0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-xl', css: '0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1)' },\n { className: 'shadow-2xl', css: '0 25px 50px -12px rgb(0 0 0 / 0.25)' },\n { className: 'shadow-inner', css: 'inset 0 2px 4px 0 rgb(0 0 0 / 0.05)' },\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 === 'box-shadow') {\n const trimmed = value.trim()\n if (trimmed === 'none' || trimmed === '') {\n classes.push('shadow-none')\n } else {\n const normalized = normalizeShadowForComparison(trimmed)\n const preset = tailwindShadowClassValues.find(\n (entry) => normalizeShadowForComparison(entry.css) === normalized\n )\n if (preset) classes.push(preset.className)\n else classes.push(`shadow-[${normalizeTailwindArbitraryValue(value)}]`)\n }\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 parseRgbChannel(value: string): number | null {\n const token = value.trim()\n if (!token) return null\n\n if (token.endsWith('%')) {\n const numeric = parseFloat(token.slice(0, -1))\n if (!Number.isFinite(numeric)) return null\n return Math.round((Math.max(0, Math.min(100, numeric)) / 100) * 255)\n }\n\n const numeric = parseFloat(token)\n if (!Number.isFinite(numeric)) return null\n return Math.round(Math.max(0, Math.min(255, numeric)))\n}\n\nfunction parseRgbAlpha(value: string | undefined): number | null {\n if (value == null || value.trim() === '') return 1\n const token = value.trim()\n\n if (token.endsWith('%')) {\n const numeric = parseFloat(token.slice(0, -1))\n if (!Number.isFinite(numeric)) return null\n return Math.max(0, Math.min(100, numeric)) / 100\n }\n\n const numeric = parseFloat(token)\n if (!Number.isFinite(numeric)) return null\n return Math.max(0, Math.min(1, numeric))\n}\n\nfunction parseRgbaColor(rgba: string): ColorValue {\n const raw = rgba.trim()\n const fnMatch = raw.match(/^rgba?\\((.*)\\)$/i)\n if (!fnMatch) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\n\n const body = fnMatch[1].trim()\n let channelTokens: [string, string, string] | null = null\n let alphaToken: string | undefined\n\n const commaParts = body.split(',').map((part) => part.trim()).filter(Boolean)\n if (commaParts.length === 3 || commaParts.length === 4) {\n channelTokens = [commaParts[0], commaParts[1], commaParts[2]]\n alphaToken = commaParts[3]\n } else {\n const slashParts = body.split('/')\n if (slashParts.length === 1 || slashParts.length === 2) {\n const channels = slashParts[0].trim().split(/\\s+/).filter(Boolean)\n if (channels.length === 3) {\n channelTokens = [channels[0], channels[1], channels[2]]\n alphaToken = slashParts[1]?.trim()\n }\n }\n }\n\n if (!channelTokens) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\n\n const r = parseRgbChannel(channelTokens[0])\n const g = parseRgbChannel(channelTokens[1])\n const b = parseRgbChannel(channelTokens[2])\n const a = parseRgbAlpha(alphaToken)\n\n if (r === null || g === null || b === null || a === null) {\n return { hex: '000000', alpha: 100, raw: rgba }\n }\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 getComputedBoxShadow(element: HTMLElement): string {\n const computed = window.getComputedStyle(element)\n const value = computed.boxShadow.trim()\n return value || 'none'\n}\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 interface AllComputedStyles {\n spacing: SpacingProperties\n borderRadius: BorderRadiusProperties\n border: BorderProperties\n flex: FlexProperties\n sizing: SizingProperties\n color: ColorProperties\n boxShadow: string\n typography: TypographyProperties\n}\n\nexport function getAllComputedStyles(element: HTMLElement): AllComputedStyles {\n const { spacing, borderRadius, flex } = getComputedStyles(element)\n return {\n spacing,\n borderRadius,\n border: getComputedBorderStyles(element),\n flex,\n sizing: getComputedSizing(element),\n color: getComputedColorStyles(element),\n boxShadow: getComputedBoxShadow(element),\n typography: getComputedTypography(element),\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\ntype ParsedStackFrame = {\n functionName?: string\n fileName?: string\n lineNumber?: number\n columnNumber?: number\n source?: string\n isServer?: boolean\n}\n\nconst STACK_SOURCE_FILE_EXTENSION_REGEX = /\\.(jsx|tsx|ts|js)$/\nconst STACK_BUNDLED_FILE_PATTERN_REGEX =\n /(\\.min|bundle|chunk|vendor|vendors|runtime|polyfill|polyfills)\\.(js|mjs|cjs)$|(chunk|bundle|vendor|vendors|runtime|polyfill|polyfills|framework|app|main|index)[-_.][A-Za-z0-9_-]{4,}\\.(js|mjs|cjs)$|[\\da-f]{8,}\\.(js|mjs|cjs)$|[-_.][\\da-f]{20,}\\.(js|mjs|cjs)$|\\/dist\\/|\\/build\\/|\\/.next\\/|\\/out\\/|\\/node_modules\\/|\\.webpack\\.|\\.vite\\.|\\.turbopack\\./i\nconst FIREFOX_SAFARI_STACK_REGEXP = /(^|@)\\S+:\\d+/\nconst SAFARI_NATIVE_CODE_REGEXP = /^(eval@)?(\\[native code\\])?$/\nconst SERVER_FRAME_MARKER = '(at Server)'\n\nconst STACK_INTERNAL_SCHEME_PREFIXES = [\n 'rsc://',\n 'about://React/',\n 'React/Server/',\n 'file:///',\n 'webpack://',\n 'webpack-internal://',\n 'node:',\n 'turbopack://',\n '/app-pages-browser/',\n] as const\n\nfunction formatOwnerDebugStack(stack: string): string {\n if (!stack) return ''\n\n const lines = stack.split('\\n')\n const filtered: string[] = []\n\n for (const line of lines) {\n const trimmed = line.trim()\n if (!trimmed) continue\n if (trimmed === 'Error: react-stack-top-frame') continue\n if (\n trimmed.includes('react_stack_bottom_frame') ||\n trimmed.includes('react-stack-bottom-frame')\n ) {\n continue\n }\n filtered.push(line)\n }\n\n if (filtered.length > 0 && filtered[0].includes('fakeJSXCallSite')) {\n filtered.shift()\n }\n\n return filtered.join('\\n')\n}\n\nfunction extractStackLocation(urlLike: string): [string, number | undefined, number | undefined] {\n if (!urlLike.includes(':')) return [urlLike, undefined, undefined]\n\n const isWrappedLocation = urlLike.startsWith('(') && /:\\d+\\)$/.test(urlLike)\n const sanitizedResult = isWrappedLocation ? urlLike.slice(1, -1) : urlLike\n const parts = /(.+?)(?::(\\d+))?(?::(\\d+))?$/.exec(sanitizedResult)\n if (!parts) return [sanitizedResult, undefined, undefined]\n\n return [\n parts[1],\n parts[2] !== undefined ? Number(parts[2]) : undefined,\n parts[3] !== undefined ? Number(parts[3]) : undefined,\n ]\n}\n\nfunction parseV8StackLine(line: string): ParsedStackFrame | null {\n let currentLine = line\n if (currentLine.includes('(eval ')) {\n currentLine = currentLine\n .replace(/eval code/g, 'eval')\n .replace(/(\\(eval at [^()]*)|(,.*$)/g, '')\n }\n\n let sanitizedLine = currentLine\n .replace(/^\\s+/, '')\n .replace(/\\(eval code/g, '(')\n .replace(/^.*?\\s+/, '')\n const locationMatch = sanitizedLine.match(/ (\\(.+\\)$)/)\n if (locationMatch) {\n sanitizedLine = sanitizedLine.replace(locationMatch[0], '')\n }\n\n const [fileName, lineNumber, columnNumber] = extractStackLocation(\n locationMatch ? locationMatch[1] : sanitizedLine\n )\n const functionName = locationMatch && sanitizedLine ? sanitizedLine : undefined\n if (fileName === 'eval' || fileName === '<anonymous>') {\n return {\n functionName,\n }\n }\n\n return {\n functionName,\n fileName,\n lineNumber,\n columnNumber,\n source: currentLine,\n isServer: currentLine.includes(SERVER_FRAME_MARKER) || fileName.startsWith('rsc://'),\n }\n}\n\nfunction parseFFOrSafariStackLine(line: string): ParsedStackFrame | null {\n let currentLine = line\n if (currentLine.includes(' > eval')) {\n currentLine = currentLine.replace(\n / line (\\d+)(?: > eval line \\d+)* > eval:\\d+:\\d+/g,\n ':$1'\n )\n }\n\n const trimmed = currentLine.trim()\n if (!trimmed || SAFARI_NATIVE_CODE_REGEXP.test(trimmed)) {\n return null\n }\n\n if (!trimmed.includes('@') && !trimmed.includes(':')) {\n return {\n functionName: trimmed,\n source: currentLine,\n isServer: trimmed.includes(SERVER_FRAME_MARKER),\n }\n }\n\n const atIndex = trimmed.lastIndexOf('@')\n if (atIndex === -1) {\n return null\n }\n const maybeFunctionName = trimmed.slice(0, atIndex)\n const location = trimmed.slice(atIndex + 1)\n const [fileName, lineNumber, columnNumber] = extractStackLocation(location)\n\n return {\n functionName: maybeFunctionName || undefined,\n fileName,\n lineNumber,\n columnNumber,\n source: currentLine,\n isServer: currentLine.includes(SERVER_FRAME_MARKER) || fileName.startsWith('rsc://'),\n }\n}\n\nfunction parseInStackLine(line: string): ParsedStackFrame | null {\n const functionName = line\n .replace(/^\\s*in\\s+/, '')\n .replace(/\\s*\\(at .*\\)$/, '')\n .trim()\n if (!functionName) return null\n\n return {\n functionName,\n source: line,\n isServer: line.includes(SERVER_FRAME_MARKER),\n }\n}\n\nfunction parseDebugStack(stack: string): ParsedStackFrame[] {\n const frames: ParsedStackFrame[] = []\n for (const rawLine of stack.split('\\n')) {\n if (FIREFOX_SAFARI_STACK_REGEXP.test(rawLine)) {\n const parsed = parseFFOrSafariStackLine(rawLine)\n if (parsed) frames.push(parsed)\n continue\n }\n\n if (/^\\s*at\\s+/.test(rawLine)) {\n const parsed = parseV8StackLine(rawLine)\n if (parsed) frames.push(parsed)\n continue\n }\n\n if (/^\\s*in\\s+/.test(rawLine)) {\n const parsed = parseInStackLine(rawLine)\n if (parsed) frames.push(parsed)\n }\n }\n\n return frames\n}\n\nfunction normalizeStackFileName(fileName: string): string {\n if (!fileName) return ''\n\n let normalized = fileName\n const isHttpUrl = normalized.startsWith('http://') || normalized.startsWith('https://')\n if (isHttpUrl) {\n try {\n normalized = new URL(normalized).pathname\n } catch {\n // Fall through and use the original string.\n }\n }\n\n let didStripPrefix = true\n while (didStripPrefix) {\n didStripPrefix = false\n for (const prefix of STACK_INTERNAL_SCHEME_PREFIXES) {\n if (normalized.startsWith(prefix)) {\n normalized = normalized.slice(prefix.length)\n if (prefix === 'file:///') {\n normalized = `/${normalized.replace(/^\\/+/, '')}`\n }\n didStripPrefix = true\n break\n }\n }\n }\n\n normalized = normalized\n .replace(/^\\/\\(app-pages-browser\\)\\//, '/')\n .replace(/^\\/\\.\\//, '/')\n .replace(/^\\.\\//, '')\n\n const queryIndex = normalized.indexOf('?')\n if (queryIndex !== -1) {\n normalized = normalized.slice(0, queryIndex)\n }\n\n return normalized\n}\n\nfunction isSourceStackFile(fileName: string): boolean {\n const normalizedFileName = normalizeStackFileName(fileName)\n if (!normalizedFileName) return false\n if (!STACK_SOURCE_FILE_EXTENSION_REGEX.test(normalizedFileName)) return false\n return !STACK_BUNDLED_FILE_PATTERN_REGEX.test(normalizedFileName)\n}\n\ntype EnrichedServerFrame = {\n fileName: string\n lineNumber?: number\n columnNumber?: number\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction buildFunctionNameToRscFramesMap(fiber: any): Map<string, EnrichedServerFrame[]> {\n const functionNameToRscFrames = new Map<string, EnrichedServerFrame[]>()\n const visited = new Set<any>()\n let current = fiber\n\n while (current && !visited.has(current)) {\n visited.add(current)\n const rawStack = current?._debugStack?.stack\n const stack = typeof rawStack === 'string' ? formatOwnerDebugStack(rawStack) : ''\n if (stack) {\n const frames = parseDebugStack(stack)\n for (const frame of frames) {\n if (!frame.functionName || !frame.fileName) continue\n if (!frame.fileName.startsWith('rsc://')) continue\n\n const normalized = normalizeStackFileName(frame.fileName)\n if (!normalized) continue\n\n const existing = functionNameToRscFrames.get(frame.functionName) ?? []\n const duplicate = existing.some(\n (candidate) =>\n candidate.fileName === normalized &&\n candidate.lineNumber === frame.lineNumber &&\n candidate.columnNumber === frame.columnNumber\n )\n if (!duplicate) {\n existing.push({\n fileName: normalized,\n lineNumber: frame.lineNumber,\n columnNumber: frame.columnNumber,\n })\n functionNameToRscFrames.set(frame.functionName, existing)\n }\n }\n }\n\n current = current._debugOwner ?? current.return ?? null\n }\n\n return functionNameToRscFrames\n}\n\nfunction enrichServerFrame(\n frame: ParsedStackFrame,\n functionNameToRscFrames: Map<string, EnrichedServerFrame[]>,\n functionNameToUsageIndex: Map<string, number>,\n): ParsedStackFrame {\n if (!frame.functionName) return frame\n\n const available = functionNameToRscFrames.get(frame.functionName)\n if (!available) return frame\n\n const usageIndex = functionNameToUsageIndex.get(frame.functionName) ?? 0\n const resolved = available[usageIndex % available.length]\n functionNameToUsageIndex.set(frame.functionName, usageIndex + 1)\n\n return {\n ...frame,\n fileName: resolved.fileName,\n lineNumber: resolved.lineNumber,\n columnNumber: resolved.columnNumber,\n }\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction getSourceFromDebugStack(fiber: any):\n | {\n fileName?: string\n lineNumber?: number\n columnNumber?: number\n }\n | null {\n const rawStack = fiber?._debugStack?.stack\n if (typeof rawStack !== 'string' || rawStack.length === 0) {\n return null\n }\n\n const formattedStack = formatOwnerDebugStack(rawStack)\n if (!formattedStack) return null\n\n const stackFrames = parseDebugStack(formattedStack)\n const functionNameToRscFrames = buildFunctionNameToRscFramesMap(fiber)\n const functionNameToUsageIndex = new Map<string, number>()\n\n for (const frame of stackFrames) {\n const maybeEnriched = frame.isServer\n ? enrichServerFrame(frame, functionNameToRscFrames, functionNameToUsageIndex)\n : frame\n if (!maybeEnriched.fileName) continue\n\n const normalizedFileName = normalizeStackFileName(maybeEnriched.fileName)\n if (!normalizedFileName) continue\n\n if (isSourceStackFile(normalizedFileName)) {\n return {\n fileName: normalizedFileName,\n lineNumber: maybeEnriched.lineNumber,\n columnNumber: maybeEnriched.columnNumber,\n }\n }\n }\n\n return 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 const fromDebugStack = getSourceFromDebugStack(fiber)\n if (fromDebugStack?.fileName) return fromDebugStack\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 = 24\nconst CONTEXT_ALLOWED_ATTRIBUTES = new Set([\n 'id',\n 'class',\n 'href',\n 'src',\n 'alt',\n 'aria-label',\n 'role',\n 'data-testid',\n 'data-qa',\n 'data-cy',\n 'data-direct-edit-target',\n])\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 sanitizeContextNode(root: HTMLElement) {\n const nodes: HTMLElement[] = [root, ...Array.from(root.querySelectorAll<HTMLElement>('*'))]\n for (const node of nodes) {\n for (const attr of Array.from(node.attributes)) {\n if (!CONTEXT_ALLOWED_ATTRIBUTES.has(attr.name)) {\n node.removeAttribute(attr.name)\n }\n }\n }\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(/^webpack-internal:\\/\\//, '')\n .replace(/^rsc:\\/\\/React\\/Server\\//, '')\n .replace(/^about:\\/\\/React\\//, '')\n .replace(/^file:\\/\\//, '')\n .replace(/^\\/\\(app-pages-browser\\)\\//, '/')\n .replace(/^\\/app-pages-browser\\//, '/')\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, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"')\n .replace(/'/g, ''')\n}\n\nfunction buildDomContextHtml(\n element: HTMLElement,\n options?: { siblingCount?: number }\n): string {\n const parent = element.parentElement\n if (!parent) {\n const clone = element.cloneNode(true) as HTMLElement\n clone.setAttribute('data-direct-edit-target', 'true')\n stripDirectEditNodes(clone)\n sanitizeContextNode(clone)\n return clone.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 const siblingCount = options?.siblingCount ?? 1\n let slice = siblings\n\n if (siblingCount >= 0 && selectedIndex >= 0) {\n const start = Math.max(0, selectedIndex - siblingCount)\n const end = Math.min(siblings.length, selectedIndex + 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 sanitizeContextNode(clone)\n parentClone.appendChild(clone)\n }\n\n sanitizeContextNode(parentClone)\n return parentClone.outerHTML\n}\n\nfunction normalizePreviewWhitespace(value: string): string {\n return value.replace(/\\s+/g, ' ').trim()\n}\n\nfunction isWordLikeChar(char: string): boolean {\n return /[A-Za-z0-9]/.test(char)\n}\n\nfunction getFallbackTextPreview(element: HTMLElement): string {\n const walker = document.createTreeWalker(element, NodeFilter.SHOW_TEXT)\n const tokens: string[] = []\n let previousRaw = ''\n let previousParent: HTMLElement | null = null\n\n for (let node = walker.nextNode(); node; node = walker.nextNode()) {\n const textNode = node as Text\n const raw = textNode.textContent ?? ''\n const normalized = normalizePreviewWhitespace(raw)\n if (!normalized) continue\n\n if (tokens.length > 0) {\n const hasExplicitWhitespace = /^\\s/.test(raw) || /\\s$/.test(previousRaw)\n const prevLast = previousRaw.slice(-1)\n const nextFirst = normalized[0]\n const shouldInsertHeuristicSpace =\n previousParent !== textNode.parentElement &&\n isWordLikeChar(prevLast) &&\n isWordLikeChar(nextFirst)\n\n if (hasExplicitWhitespace || shouldInsertHeuristicSpace) {\n tokens.push(' ')\n }\n }\n\n tokens.push(normalized)\n previousRaw = raw\n previousParent = textNode.parentElement\n }\n\n return tokens.join('')\n}\n\nfunction getTextPreview(element: HTMLElement): string {\n const innerTextCandidate = normalizePreviewWhitespace(element.innerText ?? '')\n const text = innerTextCandidate || getFallbackTextPreview(element)\n if (text.length <= 120) {\n return text\n }\n return `${text.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 seenFibers = new Set<any>()\n let fiber = getFiberForElement(element)\n while (fiber && !seenFibers.has(fiber)) {\n seenFibers.add(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 break\n }\n fiber = fiber._debugOwner ?? fiber.return ?? null\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\nfunction getLocatorHeader(locator: ElementLocator): { componentLabel: string; formattedSource: string | null } {\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 return { componentLabel, formattedSource }\n}\n\nfunction buildLocatorContextLines(locator: ElementLocator): string[] {\n const lines: string[] = []\n const { componentLabel, formattedSource } = getLocatorHeader(locator)\n const target = (locator.targetHtml || locator.domContextHtml || '').trim()\n const context = locator.domContextHtml?.trim() || ''\n const selector = locator.domSelector?.trim()\n const text = locator.textPreview?.trim()\n\n lines.push(`@<${componentLabel}>`)\n lines.push('')\n if (target) {\n lines.push('target:')\n lines.push(target)\n }\n if (context && context !== target) {\n lines.push('context:')\n lines.push(context)\n }\n lines.push(`in ${formattedSource ?? '(file not available)'}`)\n if (selector) {\n lines.push(`selector: ${selector}`)\n }\n if (text) {\n lines.push(`text: ${text}`)\n }\n\n return lines\n}\n\nexport function buildElementContext(locator: ElementLocator): string {\n return buildLocatorContextLines(locator).join('\\n')\n}\n\nconst spacingGroups = [\n { top: 'padding-top', right: 'padding-right', bottom: 'padding-bottom', left: 'padding-left', all: 'padding', inline: 'padding-inline', block: 'padding-block' },\n { top: 'margin-top', right: 'margin-right', bottom: 'margin-bottom', left: 'margin-left', all: 'margin', inline: 'margin-inline', block: 'margin-block' },\n] as const\n\nexport function collapseSpacingShorthands(styles: Record<string, string>): Record<string, string> {\n const result = { ...styles }\n\n for (const group of spacingGroups) {\n const hasTop = group.top in result\n const hasRight = group.right in result\n const hasBottom = group.bottom in result\n const hasLeft = group.left in result\n const hasAllSides = hasTop && hasRight && hasBottom && hasLeft\n\n if (hasAllSides) {\n delete result[group.all]\n delete result[group.inline]\n delete result[group.block]\n }\n\n const top = result[group.top]\n const right = result[group.right]\n const bottom = result[group.bottom]\n const left = result[group.left]\n\n const horizontalMatch = hasLeft && hasRight && left === right\n const verticalMatch = hasTop && hasBottom && top === bottom\n\n if (horizontalMatch && verticalMatch) {\n delete result[group.top]\n delete result[group.right]\n delete result[group.bottom]\n delete result[group.left]\n if (top === left) {\n result[group.all] = top\n } else {\n result[group.inline] = left\n result[group.block] = top\n }\n } else if (horizontalMatch) {\n // Only horizontal pair matches\n delete result[group.left]\n delete result[group.right]\n result[group.inline] = left\n } else if (verticalMatch) {\n // Only vertical pair matches\n delete result[group.top]\n delete result[group.bottom]\n result[group.block] = top\n }\n }\n\n return result\n}\n\nfunction collapseFourSideShorthand(\n result: Record<string, string>,\n sides: { top: string; right: string; bottom: string; left: string; all: string }\n): void {\n if (!(sides.top in result && sides.right in result && sides.bottom in result && sides.left in result)) return\n\n // Side-specific values are the source of truth when all four are present.\n delete result[sides.all]\n\n const top = result[sides.top]\n const right = result[sides.right]\n const bottom = result[sides.bottom]\n const left = result[sides.left]\n const allEqual = top === right && top === bottom && top === left\n if (!allEqual) return\n\n delete result[sides.top]\n delete result[sides.right]\n delete result[sides.bottom]\n delete result[sides.left]\n result[sides.all] = top\n}\n\nexport function collapseExportShorthands(styles: Record<string, string>): Record<string, string> {\n const result = collapseSpacingShorthands(styles)\n\n collapseFourSideShorthand(result, {\n top: 'border-top-style',\n right: 'border-right-style',\n bottom: 'border-bottom-style',\n left: 'border-left-style',\n all: 'border-style',\n })\n\n collapseFourSideShorthand(result, {\n top: 'border-top-width',\n right: 'border-right-width',\n bottom: 'border-bottom-width',\n left: 'border-left-width',\n all: 'border-width',\n })\n\n collapseFourSideShorthand(result, {\n top: 'border-top-left-radius',\n right: 'border-top-right-radius',\n bottom: 'border-bottom-right-radius',\n left: 'border-bottom-left-radius',\n all: 'border-radius',\n })\n\n return result\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 const collapsedStyles = collapseExportShorthands(pendingStyles)\n for (const [property, value] of Object.entries(collapsedStyles)) {\n const tailwindClass = stylesToTailwind({ [property]: value })\n changes.push({\n property,\n value,\n tailwind: tailwindClass,\n })\n }\n\n const lines = buildLocatorContextLines(locator)\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 = buildLocatorContextLines(locator)\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\nfunction formatMoveSummary(move: NonNullable<SessionEdit['move']>): string {\n const fromPosition = formatPosition(move.fromSiblingBefore, move.fromSiblingAfter)\n const toPosition = formatPosition(move.toSiblingBefore, move.toSiblingAfter)\n if (move.fromParentName === move.toParentName) {\n return `in <${move.toParentName}>, from ${fromPosition} to ${toPosition}`\n }\n return `from <${move.fromParentName}> ${fromPosition} to <${move.toParentName}> ${toPosition}`\n}\n\nfunction formatMoveSelector(\n selector: string | null | undefined,\n fallback: '(none)' | '(unknown)'\n): string {\n const normalized = selector?.trim()\n return normalized ? normalized : fallback\n}\n\nfunction formatMoveSource(\n source: DomSourceLocation | null | undefined,\n fallback: '(none)' | '(unknown)'\n): string {\n if (!source?.file) return fallback\n return formatSourceLocation(source.file, source.line, source.column)\n}\n\nfunction buildMoveExportLines(move: NonNullable<SessionEdit['move']>): string[] {\n return [\n 'moved:',\n `summary: ${formatMoveSummary(move)}`,\n `from_parent_selector: ${formatMoveSelector(move.fromParentSelector, '(unknown)')}`,\n `from_before_selector: ${formatMoveSelector(move.fromSiblingBeforeSelector, '(none)')}`,\n `from_after_selector: ${formatMoveSelector(move.fromSiblingAfterSelector, '(none)')}`,\n `from_parent_source: ${formatMoveSource(move.fromParentSource, '(unknown)')}`,\n `from_before_source: ${formatMoveSource(move.fromSiblingBeforeSource, '(none)')}`,\n `from_after_source: ${formatMoveSource(move.fromSiblingAfterSource, '(none)')}`,\n `to_parent_selector: ${formatMoveSelector(move.toParentSelector, '(unknown)')}`,\n `to_before_selector: ${formatMoveSelector(move.toSiblingBeforeSelector, '(none)')}`,\n `to_after_selector: ${formatMoveSelector(move.toSiblingAfterSelector, '(none)')}`,\n `to_parent_source: ${formatMoveSource(move.toParentSource, '(unknown)')}`,\n `to_before_source: ${formatMoveSource(move.toSiblingBeforeSource, '(none)')}`,\n `to_after_source: ${formatMoveSource(move.toSiblingAfterSource, '(none)')}`,\n ]\n}\n\nexport function buildSessionExport(edits: SessionEdit[], comments: Comment[] = []): 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 block += `\\n${buildMoveExportLines(edit.move).join('\\n')}`\n }\n blocks.push(block)\n }\n\n for (const comment of comments) {\n blocks.push(buildCommentExport(comment.locator, comment.text, comment.replies))\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","import * as React from 'react'\nimport type {\n DirectEditState,\n UndoEntry,\n SessionEdit,\n SessionItem,\n Comment,\n} from './types'\nimport type { MoveInfo } from './use-move'\nimport {\n getAllComputedStyles,\n getComputedStyles,\n getOriginalInlineStyles,\n getElementInfo,\n propertyToCSSMap,\n borderRadiusPropertyToCSSMap,\n borderPropertyToCSSMap,\n flexPropertyToCSSMap,\n sizingPropertyToCSSMap,\n colorPropertyToCSSMap,\n typographyPropertyToCSSMap,\n buildElementContext,\n buildEditExport,\n buildSessionExport,\n getElementDisplayName,\n getElementLocator,\n} from './utils'\n\nexport interface SessionManagerOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n sessionEditsRef: React.MutableRefObject<Map<HTMLElement, SessionEdit>>\n removedSessionEditsRef: React.MutableRefObject<WeakSet<HTMLElement>>\n undoStackRef: React.MutableRefObject<UndoEntry[]>\n pushUndo: (entry: UndoEntry) => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n setSessionEditCount: React.Dispatch<React.SetStateAction<number>>\n}\n\nexport function useSessionManager({\n stateRef,\n sessionEditsRef,\n removedSessionEditsRef,\n undoStackRef,\n pushUndo,\n setState,\n setSessionEditCount,\n}: SessionManagerOptions) {\n\n const getExportableComments = React.useCallback((comments: Comment[]): Comment[] => {\n return comments.filter((comment) => comment.text.trim().length > 0)\n }, [])\n\n const syncSessionItemCount = React.useCallback((comments = stateRef.current.comments) => {\n setSessionEditCount(sessionEditsRef.current.size + getExportableComments(comments).length)\n }, [getExportableComments])\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 syncSessionItemCount()\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 syncSessionItemCount()\n }, [syncSessionItemCount])\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 existingEdit = sessionEditsRef.current.get(element)\n const computed = getAllComputedStyles(element)\n const originalStyles = existingEdit?.originalStyles ?? getOriginalInlineStyles(element)\n const pendingStyles = existingEdit?.pendingStyles ?? {}\n const elementInfo = getElementInfo(element)\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n originalStyles,\n pendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n borderStyleControlPreference: prev.borderStyleControlPreference,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n canvas: prev.canvas,\n textEditingElement: null,\n }))\n\n }, [pushUndo, saveCurrentToSession])\n\n const selectParent = React.useCallback(() => {\n const el = stateRef.current.selectedElement\n if (el?.parentElement) {\n selectElement(el.parentElement)\n }\n }, [selectElement])\n\n const selectChild = React.useCallback(() => {\n const firstChild = stateRef.current.selectedElement?.firstElementChild as HTMLElement | null\n if (firstChild) {\n selectElement(firstChild)\n }\n }, [selectElement])\n\n const resetToOriginal = React.useCallback(() => {\n const current = stateRef.current\n const el = current.selectedElement\n if (!el) return\n\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 syncSessionItemCount()\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 'box-shadow',\n ]\n\n for (const prop of allCSSProps) {\n el.style.removeProperty(prop)\n }\n\n for (const [prop, value] of Object.entries(current.originalStyles)) {\n el.style.setProperty(prop, value)\n }\n\n const computed = getAllComputedStyles(el)\n\n setState((prev) => ({\n ...prev,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n pendingStyles: {},\n }))\n }, [syncSessionItemCount])\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 computed = getAllComputedStyles(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: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.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 computed = getAllComputedStyles(prevEl)\n const elementInfo = getElementInfo(prevEl)\n setState((prev) => ({\n isOpen: true,\n selectedElement: prevEl,\n elementInfo,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n originalStyles: entry.previousOriginalStyles,\n pendingStyles: entry.previousPendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n borderStyleControlPreference: prev.borderStyleControlPreference,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n canvas: prev.canvas,\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 computedBoxShadow: 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 syncSessionItemCount()\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 syncSessionItemCount()\n break\n }\n }\n }, [])\n\n const handleMoveComplete = React.useCallback(\n (element: HTMLElement, moveInfo: MoveInfo | null) => {\n const current = stateRef.current\n const getStyleStateForElement = (sessionEdit?: SessionEdit) => {\n if (sessionEdit) {\n return {\n originalStyles: { ...sessionEdit.originalStyles },\n pendingStyles: { ...sessionEdit.pendingStyles },\n }\n }\n if (current.selectedElement === element) {\n return {\n originalStyles: { ...current.originalStyles },\n pendingStyles: { ...current.pendingStyles },\n }\n }\n return {\n originalStyles: getOriginalInlineStyles(element),\n pendingStyles: {},\n }\n }\n\n if (moveInfo) {\n const getAnchor = (node: HTMLElement | null): {\n selector: string | null\n source: ReturnType<typeof getElementLocator>['domSource'] | null\n } => {\n if (!node) {\n return { selector: null, source: null }\n }\n const locator = getElementLocator(node)\n const selector = locator.domSelector.trim()\n return {\n selector: selector.length > 0 ? selector : null,\n source: locator.domSource ?? null,\n }\n }\n\n const existing = sessionEditsRef.current.get(element)\n const styleState = getStyleStateForElement(existing)\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 const nextPrevSibling = element.previousElementSibling as HTMLElement | null\n const nextSibling = element.nextElementSibling as HTMLElement | null\n const fromParentAnchor = getAnchor(moveInfo.originalParent)\n const fromBeforeAnchor = getAnchor(moveInfo.originalPreviousSibling)\n const fromAfterAnchor = getAnchor(moveInfo.originalNextSibling)\n const toParentAnchor = getAnchor(newParent)\n const toBeforeAnchor = getAnchor(nextPrevSibling)\n const toAfterAnchor = getAnchor(nextSibling)\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 fromParentSelector: existing.move.fromParentSelector ?? null,\n fromSiblingBeforeSelector: existing.move.fromSiblingBeforeSelector ?? null,\n fromSiblingAfterSelector: existing.move.fromSiblingAfterSelector ?? null,\n fromParentSource: existing.move.fromParentSource ?? null,\n fromSiblingBeforeSource: existing.move.fromSiblingBeforeSource ?? null,\n fromSiblingAfterSource: existing.move.fromSiblingAfterSource ?? null,\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 fromParentSelector: fromParentAnchor.selector,\n fromSiblingBeforeSelector: fromBeforeAnchor.selector,\n fromSiblingAfterSelector: fromAfterAnchor.selector,\n fromParentSource: fromParentAnchor.source,\n fromSiblingBeforeSource: fromBeforeAnchor.source,\n fromSiblingAfterSource: fromAfterAnchor.source,\n }\n\n sessionEditsRef.current.set(element, {\n element,\n locator,\n originalStyles: styleState.originalStyles,\n pendingStyles: styleState.pendingStyles,\n textEdit: existing?.textEdit ?? null,\n move: newParent\n ? {\n ...fromFields,\n toParentName: getElementDisplayName(newParent),\n toSiblingBefore: nextPrevSibling\n ? getElementDisplayName(nextPrevSibling)\n : null,\n toSiblingAfter: nextSibling\n ? getElementDisplayName(nextSibling)\n : null,\n toParentSelector: toParentAnchor.selector,\n toSiblingBeforeSelector: toBeforeAnchor.selector,\n toSiblingAfterSelector: toAfterAnchor.selector,\n toParentSource: toParentAnchor.source,\n toSiblingBeforeSource: toBeforeAnchor.source,\n toSiblingAfterSource: toAfterAnchor.source,\n }\n : null,\n })\n syncSessionItemCount()\n }\n // Refresh element state without going through selectElement,\n // which would push an extra selection undo entry.\n const computed = getAllComputedStyles(element)\n const elementInfo = getElementInfo(element)\n const styleState = getStyleStateForElement(sessionEditsRef.current.get(element))\n\n setState((prev) => ({\n isOpen: true,\n selectedElement: element,\n elementInfo,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedBorder: computed.border,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n originalStyles: styleState.originalStyles,\n pendingStyles: styleState.pendingStyles,\n editModeActive: prev.editModeActive,\n activeTool: prev.activeTool,\n theme: prev.theme,\n borderStyleControlPreference: prev.borderStyleControlPreference,\n comments: prev.comments,\n activeCommentId: prev.activeCommentId,\n canvas: prev.canvas,\n textEditingElement: null,\n }))\n },\n [pushUndo]\n )\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 syncSessionItemCount()\n return edits\n }, [saveCurrentToSession, syncSessionItemCount])\n\n const getSessionItems = React.useCallback((): SessionItem[] => {\n const edits = getSessionEdits().map((edit) => ({ type: 'edit', edit } as const))\n const comments = getExportableComments(stateRef.current.comments).map((comment) => ({ type: 'comment', comment } as const))\n return [...edits, ...comments]\n }, [getSessionEdits, getExportableComments])\n\n const exportAllEdits = React.useCallback(async (): Promise<boolean> => {\n const items = getSessionItems()\n if (items.length === 0) return false\n const edits = items.filter((item) => item.type === 'edit').map((item) => item.edit)\n const comments = items.filter((item) => item.type === 'comment').map((item) => item.comment)\n const text = buildSessionExport(edits, comments)\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${text}`)\n return true\n } catch {\n return false\n }\n }, [getSessionItems])\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 computed = getAllComputedStyles(el)\n setState((prev) => ({\n ...prev,\n computedSpacing: computed.spacing,\n computedBorderRadius: computed.borderRadius,\n computedFlex: computed.flex,\n computedSizing: computed.sizing,\n computedColor: computed.color,\n computedBoxShadow: computed.boxShadow,\n computedTypography: computed.typography,\n computedBorder: computed.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 syncSessionItemCount()\n if (stateRef.current.selectedElement === element) {\n refreshSelectedElement()\n }\n }, [revertElementStyles, refreshSelectedElement, syncSessionItemCount])\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 syncSessionItemCount([])\n setState((prev) => (\n prev.comments.length > 0 || prev.activeCommentId\n ? { ...prev, comments: [], activeCommentId: null }\n : prev\n ))\n refreshSelectedElement()\n }, [revertElementStyles, refreshSelectedElement, syncSessionItemCount])\n\n const exportEdits = React.useCallback(async () => {\n const current = stateRef.current\n if (!current.selectedElement || !current.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(current.selectedElement)\n const hasPendingStyles = Object.keys(current.pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n const hasMove = Boolean(sessionEdit?.move)\n\n const locator = getElementLocator(current.selectedElement)\n const exportMarkdown = hasPendingStyles || hasTextEdit || hasMove\n ? hasMove && sessionEdit\n ? buildSessionExport([{\n ...sessionEdit,\n locator,\n pendingStyles: { ...current.pendingStyles },\n textEdit: sessionEdit.textEdit,\n }], [])\n : buildEditExport(locator, current.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\n return {\n syncSessionItemCount,\n saveCurrentToSession,\n selectElement,\n selectParent,\n selectChild,\n resetToOriginal,\n undo,\n handleMoveComplete,\n getSessionEdits,\n getSessionItems,\n exportAllEdits,\n exportEdits,\n revertElementStyles,\n refreshSelectedElement,\n removeSessionEdit,\n clearSessionEdits,\n }\n}\n","import * as React from 'react'\nimport type {\n DirectEditState,\n UndoEntry,\n SessionEdit,\n Comment,\n} from './types'\nimport {\n getElementLocator,\n buildCommentExport,\n isTextElement,\n} from './utils'\n\nexport interface TextAndCommentsOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n sessionEditsRef: React.MutableRefObject<Map<HTMLElement, SessionEdit>>\n removedSessionEditsRef: React.MutableRefObject<WeakSet<HTMLElement>>\n pushUndo: (entry: UndoEntry) => void\n syncSessionItemCount: (comments?: Comment[]) => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n}\n\nexport function useTextAndComments({\n stateRef,\n sessionEditsRef,\n removedSessionEditsRef,\n pushUndo,\n syncSessionItemCount,\n setState,\n}: TextAndCommentsOptions) {\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 syncSessionItemCount()\n }\n\n setState((prev) => (prev.textEditingElement ? { ...prev, textEditingElement: null } : prev))\n }, [pushUndo, syncSessionItemCount])\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 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: rect.width > 0 ? (clickPosition.x - rect.left) / rect.width : 0,\n y: rect.height > 0 ? (clickPosition.y - rect.top) / rect.height : 0,\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 // Remove previously active empty comment\n const filtered = prev.activeCommentId\n ? prev.comments.filter((c) => c.id !== prev.activeCommentId || c.text.trim().length > 0)\n : prev.comments\n return {\n ...prev,\n comments: [...filtered, comment],\n activeCommentId: id,\n }\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 return {\n finalizeTextEditing,\n toggleEditMode,\n addComment,\n updateCommentText,\n addCommentReply,\n deleteComment,\n exportComment,\n setActiveCommentId,\n startTextEditing,\n commitTextEditing,\n }\n}\n","import * as React from 'react'\nimport type {\n DirectEditState,\n SessionEdit,\n SessionItem,\n Comment,\n} from './types'\nimport {\n buildEditExport,\n buildCommentExport,\n buildSessionExport,\n getElementLocator,\n stylesToTailwind,\n collapseExportShorthands,\n} from './utils'\nimport { sendEditToAgent as postEditToAgent, sendCommentToAgent as postCommentToAgent } from './mcp-client'\n\nexport interface AgentCommsOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n sessionEditsRef: React.MutableRefObject<Map<HTMLElement, SessionEdit>>\n getSessionItems: () => SessionItem[]\n}\n\nexport function useAgentComms({ stateRef, sessionEditsRef, getSessionItems }: AgentCommsOptions) {\n\n const canSendEditToAgent = React.useCallback((snapshot?: {\n selectedElement: HTMLElement | null\n elementInfo: DirectEditState['elementInfo']\n pendingStyles: Record<string, string>\n }) => {\n const current = stateRef.current\n const selectedElement = snapshot?.selectedElement ?? current.selectedElement\n const elementInfo = snapshot?.elementInfo ?? current.elementInfo\n const pendingStyles = snapshot?.pendingStyles ?? current.pendingStyles\n if (!selectedElement || !elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(selectedElement)\n const hasPendingStyles = Object.keys(pendingStyles).length > 0\n const hasTextEdit = Boolean(sessionEdit?.textEdit)\n const hasMove = Boolean(sessionEdit?.move)\n return hasPendingStyles || hasTextEdit || hasMove\n }, [])\n\n const sendSessionEditToAgent = React.useCallback(async (sessionEdit: SessionEdit) => {\n const locator = sessionEdit.locator\n const pendingStyles = { ...sessionEdit.pendingStyles }\n const exportMarkdown = sessionEdit.move\n ? buildSessionExport([{\n ...sessionEdit,\n locator,\n pendingStyles,\n textEdit: sessionEdit.textEdit,\n }], [])\n : buildEditExport(locator, pendingStyles, sessionEdit.textEdit)\n const collapsedStyles = collapseExportShorthands(pendingStyles)\n const changes = Object.entries(collapsedStyles).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 moveChange: sessionEdit.move ?? null,\n exportMarkdown,\n })\n return result.ok\n } catch {\n return false\n }\n }, [])\n\n const sendSessionCommentToAgent = React.useCallback(async (comment: Comment) => {\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 const sendEditToAgent = React.useCallback(async () => {\n const current = stateRef.current\n if (!current.selectedElement || !current.elementInfo) return false\n const sessionEdit = sessionEditsRef.current.get(current.selectedElement)\n if (!canSendEditToAgent({\n selectedElement: current.selectedElement,\n elementInfo: current.elementInfo,\n pendingStyles: current.pendingStyles,\n })) return false\n\n const locator = getElementLocator(current.selectedElement)\n const editToSend: SessionEdit = {\n element: current.selectedElement,\n locator,\n originalStyles: sessionEdit?.originalStyles ?? { ...current.originalStyles },\n pendingStyles: { ...current.pendingStyles },\n move: sessionEdit?.move ?? null,\n textEdit: sessionEdit?.textEdit ?? null,\n }\n return sendSessionEditToAgent(editToSend)\n }, [canSendEditToAgent, sendSessionEditToAgent])\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 return sendSessionCommentToAgent(comment)\n }, [sendSessionCommentToAgent])\n\n const sendAllSessionItemsToAgent = React.useCallback(async () => {\n const items = getSessionItems()\n if (items.length === 0) return false\n\n let allSucceeded = true\n for (const item of items) {\n const succeeded = item.type === 'edit'\n ? await sendSessionEditToAgent(item.edit)\n : await sendSessionCommentToAgent(item.comment)\n if (!succeeded) {\n allSucceeded = false\n }\n }\n\n return allSucceeded\n }, [getSessionItems, sendSessionCommentToAgent, sendSessionEditToAgent])\n\n return {\n canSendEditToAgent,\n sendEditToAgent,\n sendCommentToAgent,\n sendAllSessionItemsToAgent,\n }\n}\n","const PROTOCOL_VERSION = 1\nconst BOOTSTRAP_TIMEOUT_MS = 2_500\nconst REQUEST_TIMEOUT_MS = 3_000\nconst SESSION_EXPIRY_SKEW_MS = 5_000\nconst CLIENT_NAME = 'made-refine'\nconst DEFAULT_CLIENT_VERSION = 'unknown'\n\nconst BOOTSTRAP_ENV_KEYS = [\n 'MADE_REFINE_MCP_BOOTSTRAP_URL',\n 'VITE_MADE_REFINE_MCP_BOOTSTRAP_URL',\n 'NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL',\n] as const\n\nconst CLIENT_VERSION_ENV_KEYS = [\n 'MADE_REFINE_VERSION',\n 'VITE_MADE_REFINE_VERSION',\n 'NEXT_PUBLIC_MADE_REFINE_VERSION',\n] as const\n\ntype BootstrapEnvKey = (typeof BOOTSTRAP_ENV_KEYS)[number]\ntype ClientVersionEnvKey = (typeof CLIENT_VERSION_ENV_KEYS)[number]\ntype EnvKey = BootstrapEnvKey | ClientVersionEnvKey\n\ntype AnnotationPath = '/v1/annotations/edit' | '/v1/annotations/comment'\n\ninterface KnownProcessEnv {\n MADE_REFINE_MCP_BOOTSTRAP_URL?: string\n VITE_MADE_REFINE_MCP_BOOTSTRAP_URL?: string\n NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL?: string\n MADE_REFINE_VERSION?: string\n VITE_MADE_REFINE_VERSION?: string\n NEXT_PUBLIC_MADE_REFINE_VERSION?: string\n [key: string]: string | undefined\n}\n\ndeclare const process: { env?: KnownProcessEnv } | undefined\n\ninterface RuntimeMcpConfig {\n bootstrapUrl?: string\n workspaceId?: string\n projectFingerprint?: {\n path?: string\n gitRemoteHash?: string\n }\n clientVersion?: string\n}\n\ninterface RuntimeConfig {\n mcp?: RuntimeMcpConfig\n mcpBootstrapUrl?: string\n}\n\ninterface SessionContext {\n bootstrapUrl: string\n ingestBaseUrl: string\n serverInstanceId: string | null\n projectId: string | null\n sessionId: string | null\n accessToken: string | null\n expiresAt: number | null\n}\n\ninterface BootstrapRequest {\n protocolVersion: number\n projectFingerprint: {\n path: string\n gitRemoteHash: string | null\n }\n workspaceId?: string\n client: {\n name: string\n version: string\n origin: string | null\n }\n}\n\ndeclare global {\n interface Window {\n __MADE_REFINE_CONFIG__?: RuntimeConfig\n __MADE_REFINE_MCP_BOOTSTRAP_URL__?: string\n }\n}\n\nlet cachedSession: SessionContext | null = null\n\nfunction getTimeoutSignal(timeoutMs: number): AbortSignal | undefined {\n const timeout = (AbortSignal as { timeout?: (delay: number) => AbortSignal }).timeout\n return typeof timeout === 'function' ? timeout(timeoutMs) : undefined\n}\n\nfunction getRuntimeMcpConfig(): RuntimeMcpConfig | null {\n if (typeof window === 'undefined') return null\n const config = window.__MADE_REFINE_CONFIG__\n const bootstrapUrl =\n config?.mcp?.bootstrapUrl\n ?? config?.mcpBootstrapUrl\n ?? window.__MADE_REFINE_MCP_BOOTSTRAP_URL__\n\n if (!config?.mcp && typeof bootstrapUrl !== 'string') return null\n return {\n ...(config?.mcp ?? {}),\n ...(typeof bootstrapUrl === 'string' ? { bootstrapUrl } : {}),\n }\n}\n\nfunction toNonEmptyString(value: unknown): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction getStaticProcessEnvValue(key: EnvKey): string | null {\n switch (key) {\n case 'MADE_REFINE_MCP_BOOTSTRAP_URL':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.MADE_REFINE_MCP_BOOTSTRAP_URL : undefined)\n case 'VITE_MADE_REFINE_MCP_BOOTSTRAP_URL':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.VITE_MADE_REFINE_MCP_BOOTSTRAP_URL : undefined)\n case 'NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.NEXT_PUBLIC_MADE_REFINE_MCP_BOOTSTRAP_URL : undefined)\n case 'MADE_REFINE_VERSION':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.MADE_REFINE_VERSION : undefined)\n case 'VITE_MADE_REFINE_VERSION':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.VITE_MADE_REFINE_VERSION : undefined)\n case 'NEXT_PUBLIC_MADE_REFINE_VERSION':\n return toNonEmptyString(typeof process !== 'undefined' ? process.env?.NEXT_PUBLIC_MADE_REFINE_VERSION : undefined)\n default:\n return null\n }\n}\n\nfunction getDynamicProcessEnvValue(keys: readonly EnvKey[]): string | null {\n const processLike = (globalThis as { process?: { env?: Record<string, string | undefined> } }).process\n const env = processLike?.env\n if (!env) return null\n\n for (const key of keys) {\n const value = toNonEmptyString(env[key])\n if (value) return value\n }\n\n return null\n}\n\nfunction getEnvValue(keys: readonly EnvKey[]): string | null {\n for (const key of keys) {\n const processValue = getStaticProcessEnvValue(key)\n if (processValue) return processValue\n }\n\n return getDynamicProcessEnvValue(keys)\n}\n\nfunction normalizeUrl(value: string | null | undefined): string | null {\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n if (!trimmed) return null\n\n if (/^https?:\\/\\//i.test(trimmed)) {\n return trimmed.replace(/\\/+$/, '')\n }\n\n if (typeof window === 'undefined' || !window.location?.origin) return null\n try {\n return new URL(trimmed, window.location.origin).toString().replace(/\\/+$/, '')\n } catch {\n return null\n }\n}\n\nfunction normalizeBootstrapUrl(value: string | null | undefined): string | null {\n const normalized = normalizeUrl(value)\n if (!normalized) return null\n\n try {\n const url = new URL(normalized)\n const normalizedPathname = url.pathname.replace(/\\/+$/, '')\n url.pathname = normalizedPathname.endsWith('/v1/bootstrap')\n ? normalizedPathname\n : `${normalizedPathname}/v1/bootstrap`\n return url.toString()\n } catch {\n return normalized.endsWith('/v1/bootstrap') ? normalized : `${normalized}/v1/bootstrap`\n }\n}\n\nfunction toSafeBootstrapUrl(value: string | null | undefined): string | null {\n const normalized = normalizeBootstrapUrl(value)\n if (!normalized) return null\n return isLoopbackHttpUrl(normalized) ? normalized : null\n}\n\nfunction joinUrl(base: string, path: string): string {\n return `${base.replace(/\\/+$/, '')}${path}`\n}\n\nfunction readString(record: Record<string, unknown> | null, key: string): string | null {\n const value = record?.[key]\n if (typeof value !== 'string') return null\n const trimmed = value.trim()\n return trimmed.length > 0 ? trimmed : null\n}\n\nfunction parseExpiresAt(value: unknown): number | null {\n if (typeof value !== 'string') return null\n const timestamp = Date.parse(value)\n return Number.isFinite(timestamp) ? timestamp : null\n}\n\nfunction readNumber(record: Record<string, unknown> | null, key: string): number | null {\n const value = record?.[key]\n if (typeof value !== 'number' || !Number.isFinite(value)) return null\n return value\n}\n\nfunction isLoopbackIpv4(hostname: string): boolean {\n if (!/^127(?:\\.\\d{1,3}){3}$/.test(hostname)) return false\n const segments = hostname.split('.')\n return segments.every((segment) => {\n const value = Number(segment)\n return Number.isInteger(value) && value >= 0 && value <= 255\n })\n}\n\nfunction isLoopbackHostname(hostname: string): boolean {\n if (hostname === 'localhost' || hostname.endsWith('.localhost')) return true\n if (hostname === '::1' || hostname === '[::1]') return true\n return isLoopbackIpv4(hostname)\n}\n\nfunction isLoopbackHttpUrl(value: string): boolean {\n try {\n const url = new URL(value)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false\n return isLoopbackHostname(url.hostname)\n } catch {\n return false\n }\n}\n\nfunction buildBootstrapRequestBody(runtimeConfig: RuntimeMcpConfig | null): BootstrapRequest {\n const locationPath = typeof window !== 'undefined' ? window.location.pathname : ''\n const locationOrigin = typeof window !== 'undefined' ? window.location.origin : null\n\n return {\n protocolVersion: PROTOCOL_VERSION,\n projectFingerprint: {\n path: runtimeConfig?.projectFingerprint?.path || locationPath || 'unknown',\n gitRemoteHash: runtimeConfig?.projectFingerprint?.gitRemoteHash ?? null,\n },\n ...(runtimeConfig?.workspaceId\n ? {\n workspaceId: runtimeConfig.workspaceId,\n }\n : {}),\n client: {\n name: CLIENT_NAME,\n version: runtimeConfig?.clientVersion\n ?? getEnvValue(CLIENT_VERSION_ENV_KEYS)\n ?? DEFAULT_CLIENT_VERSION,\n origin: locationOrigin,\n },\n }\n}\n\nfunction resolveBootstrapUrl(): string | null {\n const runtimeConfig = getRuntimeMcpConfig()\n const runtimeUrl = toSafeBootstrapUrl(runtimeConfig?.bootstrapUrl)\n if (runtimeUrl) return runtimeUrl\n\n const envUrl = toSafeBootstrapUrl(getEnvValue(BOOTSTRAP_ENV_KEYS))\n if (envUrl) return envUrl\n\n return null\n}\n\nfunction isSessionUsable(session: SessionContext | null, bootstrapUrl: string): session is SessionContext {\n if (!session) return false\n if (session.bootstrapUrl !== bootstrapUrl) return false\n if (session.expiresAt == null) return true\n return Date.now() < session.expiresAt - SESSION_EXPIRY_SKEW_MS\n}\n\nasync function readJsonRecord(response: Response): Promise<Record<string, unknown> | null> {\n try {\n const data = await response.json()\n if (!data || typeof data !== 'object') return null\n return data as Record<string, unknown>\n } catch {\n return null\n }\n}\n\nasync function bootstrapSession(force = false): Promise<SessionContext | null> {\n const bootstrapUrl = resolveBootstrapUrl()\n if (!bootstrapUrl) {\n cachedSession = null\n return null\n }\n\n if (!force && isSessionUsable(cachedSession, bootstrapUrl)) {\n return cachedSession\n }\n\n const runtimeConfig = getRuntimeMcpConfig()\n try {\n const response = await fetch(bootstrapUrl, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify(buildBootstrapRequestBody(runtimeConfig)),\n signal: getTimeoutSignal(BOOTSTRAP_TIMEOUT_MS),\n })\n if (!response.ok) {\n cachedSession = null\n return null\n }\n\n const data = await readJsonRecord(response)\n const protocolVersion = readNumber(data, 'protocolVersion')\n if (protocolVersion !== PROTOCOL_VERSION) {\n cachedSession = null\n return null\n }\n\n const ingestBaseUrl = normalizeUrl(readString(data, 'ingestBaseUrl'))\n if (!ingestBaseUrl || !isLoopbackHttpUrl(ingestBaseUrl)) {\n cachedSession = null\n return null\n }\n\n const nextSession: SessionContext = {\n bootstrapUrl,\n ingestBaseUrl,\n serverInstanceId: readString(data, 'serverInstanceId'),\n projectId: readString(data, 'projectId'),\n sessionId: readString(data, 'sessionId'),\n accessToken: readString(data, 'accessToken'),\n expiresAt: parseExpiresAt(data?.expiresAt),\n }\n cachedSession = nextSession\n return nextSession\n } catch {\n cachedSession = null\n return null\n }\n}\n\nasync function refreshSessionToken(session: SessionContext): Promise<SessionContext | null> {\n try {\n const headers: Record<string, string> = { 'Content-Type': 'application/json' }\n if (session.accessToken) {\n headers.Authorization = `Bearer ${session.accessToken}`\n }\n\n const response = await fetch(joinUrl(session.ingestBaseUrl, '/v1/sessions/refresh'), {\n method: 'POST',\n headers,\n body: JSON.stringify({\n protocolVersion: PROTOCOL_VERSION,\n projectId: session.projectId,\n sessionId: session.sessionId,\n }),\n signal: getTimeoutSignal(REQUEST_TIMEOUT_MS),\n })\n\n if (response.status === 404 || response.status === 405) {\n return null\n }\n if (!response.ok) {\n return null\n }\n\n const data = await readJsonRecord(response)\n const nextToken = readString(data, 'accessToken')\n if (!nextToken) {\n return null\n }\n\n const refreshedSession: SessionContext = {\n ...session,\n accessToken: nextToken,\n expiresAt: parseExpiresAt(data?.expiresAt) ?? session.expiresAt,\n }\n cachedSession = refreshedSession\n return refreshedSession\n } catch {\n return null\n }\n}\n\nfunction createIdempotencyKey(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID()\n }\n\n const timestamp = Date.now().toString(36)\n const random = Math.random().toString(36).slice(2, 12)\n return `${timestamp}-${random}`\n}\n\nasync function sendAnnotationRequest(\n session: SessionContext,\n path: AnnotationPath,\n payload: Record<string, unknown>,\n idempotencyKey: string\n): Promise<Response> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'X-Idempotency-Key': idempotencyKey,\n }\n\n if (session.accessToken) {\n headers.Authorization = `Bearer ${session.accessToken}`\n }\n\n return fetch(joinUrl(session.ingestBaseUrl, path), {\n method: 'POST',\n headers,\n body: JSON.stringify(payload),\n signal: getTimeoutSignal(REQUEST_TIMEOUT_MS),\n })\n}\n\nasync function toClientResponse(response: Response): Promise<{ ok: boolean; id: string }> {\n const data = await readJsonRecord(response)\n const bodyOk = data?.ok\n const parsedOk = typeof bodyOk === 'boolean' ? bodyOk : response.ok\n\n return {\n ok: parsedOk && response.ok,\n id: readString(data, 'id') ?? '',\n }\n}\n\nasync function postWithSessionToken(\n path: AnnotationPath,\n payload: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n const idempotencyKey = createIdempotencyKey()\n\n let session = await bootstrapSession()\n if (!session) return { ok: false, id: '' }\n\n let response: Response\n try {\n response = await sendAnnotationRequest(session, path, payload, idempotencyKey)\n } catch {\n return { ok: false, id: '' }\n }\n\n if (response.status === 401 || response.status === 403) {\n session = (await refreshSessionToken(session)) ?? (await bootstrapSession(true))\n if (!session) return { ok: false, id: '' }\n\n try {\n response = await sendAnnotationRequest(session, path, payload, idempotencyKey)\n } catch {\n return { ok: false, id: '' }\n }\n }\n\n return toClientResponse(response)\n}\n\nexport async function sendEditToAgent(\n edit: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/v1/annotations/edit', edit)\n}\n\nexport async function sendCommentToAgent(\n comment: Record<string, unknown>\n): Promise<{ ok: boolean; id: string }> {\n return postWithSessionToken('/v1/annotations/comment', comment)\n}\n\nexport async function checkAgentConnection(): Promise<boolean> {\n const session = await bootstrapSession(true)\n return Boolean(session)\n}\n","import * as React from 'react'\nimport type { DirectEditState, ActiveTool } from './types'\nimport { isTextElement, isInputFocused } from './utils'\n\nexport interface KeyboardShortcutsOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n toggleEditMode: () => void\n toggleFlexLayout: () => void\n undo: () => void\n commitTextEditing: () => void\n startTextEditing: (element: HTMLElement) => void\n closePanel: () => void\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n toggleCanvas: () => void\n setCanvasZoom: (zoom: number) => void\n fitCanvasToViewport: () => void\n zoomCanvasTo100: () => void\n}\n\nexport function useKeyboardShortcuts({\n stateRef,\n toggleEditMode,\n toggleFlexLayout,\n undo,\n commitTextEditing,\n startTextEditing,\n closePanel,\n setState,\n toggleCanvas,\n setCanvasZoom,\n fitCanvasToViewport,\n zoomCanvasTo100,\n}: KeyboardShortcutsOptions) {\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 const s = stateRef.current\n\n if ((e.metaKey || e.ctrlKey) && e.key === 'z' && !e.shiftKey) {\n if (s.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 && s.editModeActive) {\n if (!isInputFocused()) {\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' as ActiveTool : 'comment' as ActiveTool,\n activeCommentId: null,\n }\n })\n return\n }\n }\n\n if (e.key === 'Z' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && s.editModeActive) {\n if (!isInputFocused()) {\n e.preventDefault()\n toggleCanvas()\n return\n }\n }\n\n if ((e.metaKey || e.ctrlKey) && !e.shiftKey && !e.altKey && s.canvas?.active) {\n if (e.code === 'Digit0' || e.key === '0') {\n e.preventDefault()\n fitCanvasToViewport()\n return\n }\n if (e.code === 'Digit1' || e.key === '1') {\n e.preventDefault()\n zoomCanvasTo100()\n return\n }\n if (e.code === 'Equal' || e.key === '=') {\n e.preventDefault()\n setCanvasZoom(Math.min(5.0, (s.canvas?.zoom ?? 1) * 1.1))\n return\n }\n if (e.code === 'Minus' || e.key === '-') {\n e.preventDefault()\n setCanvasZoom(Math.max(0.1, (s.canvas?.zoom ?? 1) / 1.1))\n return\n }\n }\n\n if (e.key === 'A' && e.shiftKey && !e.metaKey && !e.ctrlKey && !e.altKey && s.editModeActive && s.selectedElement) {\n if (!isInputFocused()) {\n e.preventDefault()\n toggleFlexLayout()\n return\n }\n }\n\n if (e.key === 'Enter' && s.editModeActive && !s.textEditingElement && s.selectedElement) {\n if (!isInputFocused() && isTextElement(s.selectedElement)) {\n e.preventDefault()\n startTextEditing(s.selectedElement)\n return\n }\n }\n\n if (e.key === 'Escape') {\n if (s.textEditingElement) {\n commitTextEditing()\n return\n }\n if (s.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 (s.activeTool === 'comment') {\n setState((prev) => ({ ...prev, activeTool: 'select' as ActiveTool }))\n } else if (s.isOpen) {\n closePanel()\n } else if (s.editModeActive) {\n toggleEditMode()\n }\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [closePanel, toggleEditMode, toggleFlexLayout, undo, commitTextEditing, startTextEditing, toggleCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100])\n}\n","import * as React from 'react'\nimport type { DirectEditState } from './types'\nimport { isInputFocused } from './utils'\nimport { setCanvasSnapshot, getBodyOffset, setBodyOffset, registerCanvasStoreOwner } from './canvas-store'\n\nconst MIN_ZOOM = 0.1\nconst MAX_ZOOM = 5.0\n\n// Zoom sensitivity applied to normalized pixel delta.\n// macOS trackpad pinch: deltaY ≈ 1–2px/event → ~0.3–0.6% per event (smooth).\n// Windows mouse Ctrl+scroll: deltaY ≈ 100px/notch → ~26% per notch.\nconst ZOOM_SENSITIVITY = 0.0145\n\n// Wheel delta normalization constants (Facebook normalizeWheel convention).\n// Required because Firefox can report DOM_DELTA_LINE and some Windows configs\n// use DOM_DELTA_PAGE, giving very different deltaY magnitudes than pixel mode.\nconst LINE_HEIGHT_PX = 40\nconst PAGE_HEIGHT_PX = 800\nconst CANVAS_MEASURE_NODE_BUDGET = 12000\nconst CANVAS_PRIORITY_ROOT_SELECTORS = ['#root', '#app', '#__next', 'main'] as const\n\nfunction normalizeWheelDelta(e: WheelEvent): { deltaX: number; deltaY: number } {\n let { deltaX, deltaY } = e\n if (e.deltaMode === 1) { // DOM_DELTA_LINE\n deltaX *= LINE_HEIGHT_PX\n deltaY *= LINE_HEIGHT_PX\n } else if (e.deltaMode === 2) { // DOM_DELTA_PAGE\n deltaX *= PAGE_HEIGHT_PX\n deltaY *= PAGE_HEIGHT_PX\n }\n return { deltaX, deltaY }\n}\n\nfunction getResolvedOverflowY(style: CSSStyleDeclaration): string {\n return style.overflowY || style.overflow\n}\n\nfunction isScrollableOverflowY(value: string): boolean {\n return value === 'auto' || value === 'scroll' || value === 'overlay'\n}\n\nfunction isClippedOverflowY(value: string): boolean {\n return value === 'hidden' || value === 'clip'\n}\n\nfunction getParentAcrossShadowTree(el: HTMLElement): HTMLElement | null {\n const parent = el.parentElement\n if (parent) return parent\n const root = el.getRootNode()\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n return root.host\n }\n return null\n}\n\nfunction enqueueChildren(el: HTMLElement, queue: HTMLElement[]): void {\n for (const child of el.children) {\n if (child instanceof HTMLElement) queue.push(child)\n }\n const shadowRoot = el.shadowRoot\n if (!shadowRoot) return\n for (const child of shadowRoot.children) {\n if (child instanceof HTMLElement) queue.push(child)\n }\n}\n\nfunction measureContentBounds(el: HTMLElement): { width: number; height: number } {\n const rect = el.getBoundingClientRect()\n const pageLeft = rect.left + (window.scrollX || window.pageXOffset || 0)\n const pageTop = rect.top + (window.scrollY || window.pageYOffset || 0)\n return {\n width: Math.max(0, pageLeft) + el.scrollWidth,\n height: Math.max(0, pageTop) + el.scrollHeight,\n }\n}\n\nfunction hasClippedAncestor(el: HTMLElement): boolean {\n let ancestor = getParentAcrossShadowTree(el)\n while (ancestor && ancestor !== document.body) {\n const ancestorStyle = getComputedStyle(ancestor)\n if (isClippedOverflowY(getResolvedOverflowY(ancestorStyle))) return true\n ancestor = getParentAcrossShadowTree(ancestor)\n }\n return false\n}\n\n// Clamp pan so at least PAN_MARGIN of the viewport always shows content,\n// preventing the user from panning content entirely off-screen.\n// fitCanvasToViewport centering values always satisfy this constraint.\nconst PAN_MARGIN = 0.1\n\nfunction clampPan(\n zoom: number,\n panX: number,\n panY: number,\n bodyW: number,\n bodyH: number,\n): { panX: number; panY: number } {\n const vw = window.innerWidth\n const vh = window.innerHeight\n // Content right edge must remain >= MARGIN * vw in viewport space:\n // (bodyW + panX) * zoom >= MARGIN * vw → panX >= MARGIN*vw/zoom - bodyW\n const minPanX = PAN_MARGIN * vw / zoom - bodyW\n // Content left edge must remain <= (1-MARGIN) * vw:\n // panX * zoom <= (1-MARGIN)*vw → panX <= (1-MARGIN)*vw/zoom\n const maxPanX = (1 - PAN_MARGIN) * vw / zoom\n const minPanY = PAN_MARGIN * vh / zoom - bodyH\n const maxPanY = (1 - PAN_MARGIN) * vh / zoom\n return {\n panX: Math.max(minPanX, Math.min(maxPanX, panX)),\n panY: Math.max(minPanY, Math.min(maxPanY, panY)),\n }\n}\n\nexport interface UseCanvasOptions {\n stateRef: React.MutableRefObject<DirectEditState>\n setState: React.Dispatch<React.SetStateAction<DirectEditState>>\n}\n\nexport interface UseCanvasReturn {\n toggleCanvas: () => void\n enterCanvas: () => void\n exitCanvas: () => void\n setCanvasZoom: (zoom: number) => void\n fitCanvasToViewport: () => void\n zoomCanvasTo100: () => void\n}\n\nexport function useCanvas({ stateRef, setState }: UseCanvasOptions): UseCanvasReturn {\n React.useEffect(() => registerCanvasStoreOwner(), [])\n\n // Synchronous ref for canvas state (avoids stale closures in event handlers)\n const canvasRef = React.useRef({ active: false, zoom: 1, panX: 0, panY: 0 })\n\n // Saved state for restoring on exit\n const savedScrollRef = React.useRef({ x: 0, y: 0 })\n const savedBodyOverflowRef = React.useRef('')\n const savedHtmlOverflowRef = React.useRef('')\n const savedHtmlBgColorRef = React.useRef('')\n const domStateSavedRef = React.useRef(false)\n const savedBodyDimensionsRef = React.useRef({ width: 0, height: 0 })\n const savedExpandedNodesRef = React.useRef<Array<{\n el: HTMLElement\n height: string\n maxHeight: string\n overflowY: string\n }>>([])\n\n // rAF batching for setState: DOM transform is applied immediately for visual\n // smoothness; React state is deferred to avoid 60fps re-renders across all consumers.\n // Note: RulersOverlay reads canvas state from React context and will lag by\n // one frame during rapid interaction — this is an accepted visual tradeoff.\n const rafIdRef = React.useRef<number | null>(null)\n const rafPendingRef = React.useRef(false)\n\n // Space key and drag state\n const spaceHeldRef = React.useRef(false)\n const isDraggingRef = React.useRef(false)\n const dragStartRef = React.useRef({ x: 0, y: 0, panX: 0, panY: 0 })\n\n const applyTransform = React.useCallback((zoom: number, panX: number, panY: number) => {\n document.body.style.transformOrigin = '0 0'\n document.body.style.transform = `scale(${zoom}) translate(${panX}px, ${panY}px)`\n }, [])\n\n const dispatchCanvasChange = React.useCallback(() => {\n window.dispatchEvent(new Event('direct-edit-canvas-change'))\n }, [])\n\n const readBodyOffset = React.useCallback(() => {\n const bodyStyle = getComputedStyle(document.body)\n return {\n x: parseFloat(bodyStyle.marginLeft) || 0,\n y: parseFloat(bodyStyle.marginTop) || 0,\n }\n }, [])\n\n const updateBodyOffset = React.useCallback(() => {\n const next = readBodyOffset()\n const prev = getBodyOffset()\n if (prev.x === next.x && prev.y === next.y) return false\n setBodyOffset(next)\n return true\n }, [readBodyOffset])\n\n const cancelPendingRaf = React.useCallback(() => {\n if (rafIdRef.current !== null) {\n cancelAnimationFrame(rafIdRef.current)\n rafIdRef.current = null\n rafPendingRef.current = false\n }\n }, [])\n\n const updateCanvas = React.useCallback((zoom: number, panX: number, panY: number) => {\n const dims = savedBodyDimensionsRef.current\n const bodyW = dims.width || window.innerWidth\n const bodyH = dims.height || window.innerHeight\n const clamped = clampPan(zoom, panX, panY, bodyW, bodyH)\n\n canvasRef.current = { ...canvasRef.current, zoom, panX: clamped.panX, panY: clamped.panY }\n setCanvasSnapshot(canvasRef.current)\n applyTransform(zoom, clamped.panX, clamped.panY)\n dispatchCanvasChange()\n\n // Batch React state update via rAF. The snapshot is read at fire time so\n // rapid events (e.g. 60fps wheel) collapse into a single setState per frame.\n if (!rafPendingRef.current) {\n rafPendingRef.current = true\n rafIdRef.current = requestAnimationFrame(() => {\n rafPendingRef.current = false\n rafIdRef.current = null\n const s = canvasRef.current\n setState((prev) => ({\n ...prev,\n canvas: { active: s.active, zoom: s.zoom, panX: s.panX, panY: s.panY },\n }))\n })\n }\n }, [applyTransform, dispatchCanvasChange, setState])\n\n function collectTraversalSeeds(): HTMLElement[] {\n const out: HTMLElement[] = []\n const seen = new Set<HTMLElement>()\n const push = (el: Element | null): void => {\n if (!(el instanceof HTMLElement)) return\n if (!document.body.contains(el)) return\n if (seen.has(el)) return\n seen.add(el)\n out.push(el)\n }\n\n for (const selector of CANVAS_PRIORITY_ROOT_SELECTORS) {\n push(document.querySelector(selector))\n }\n for (const child of document.body.children) {\n push(child)\n }\n return out\n }\n\n function expandScrollableRegionsAndMeasureBody(): { width: number; height: number } {\n const snapshots = new Map<HTMLElement, { height: string; maxHeight: string; overflowY: string }>()\n const expandedOrder: HTMLElement[] = []\n const queue = collectTraversalSeeds()\n const visited = new Set<HTMLElement>()\n let visitedCount = 0\n let fallbackWidth = 0\n let fallbackHeight = 0\n\n const expandNode = (el: HTMLElement): void => {\n if (snapshots.has(el)) return\n snapshots.set(el, {\n height: el.style.height,\n maxHeight: el.style.maxHeight,\n overflowY: el.style.overflowY,\n })\n expandedOrder.push(el)\n el.style.height = 'auto'\n el.style.maxHeight = 'none'\n el.style.overflowY = 'visible'\n }\n\n while (queue.length > 0 && visitedCount < CANVAS_MEASURE_NODE_BUDGET) {\n const el = queue.shift()\n if (!el || visited.has(el)) continue\n visited.add(el)\n visitedCount++\n\n const hasVerticalOverflow = el.scrollHeight > el.clientHeight + 1\n const style = getComputedStyle(el)\n const overflowY = getResolvedOverflowY(style)\n const isScrollable = hasVerticalOverflow && isScrollableOverflowY(overflowY)\n\n if (isScrollable) {\n expandNode(el)\n // Relax clipped ancestors of detected scrollers so body dimensions can include full content.\n let ancestor = getParentAcrossShadowTree(el)\n while (ancestor && ancestor !== document.body) {\n const ancestorStyle = getComputedStyle(ancestor)\n if (isClippedOverflowY(getResolvedOverflowY(ancestorStyle))) {\n expandNode(ancestor)\n }\n ancestor = getParentAcrossShadowTree(ancestor)\n }\n }\n\n const canContributeFallback = hasVerticalOverflow && (isScrollable || (!isClippedOverflowY(overflowY) && !hasClippedAncestor(el)))\n if (canContributeFallback) {\n const bounds = measureContentBounds(el)\n fallbackWidth = Math.max(fallbackWidth, bounds.width)\n fallbackHeight = Math.max(fallbackHeight, bounds.height)\n }\n\n enqueueChildren(el, queue)\n }\n\n savedExpandedNodesRef.current = expandedOrder.map((el) => ({ el, ...snapshots.get(el)! }))\n\n return {\n width: Math.max(document.body.scrollWidth, document.documentElement.scrollWidth, fallbackWidth, window.innerWidth),\n height: Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, fallbackHeight, window.innerHeight),\n }\n }\n\n function restoreExpandedNodes(): void {\n for (let i = savedExpandedNodesRef.current.length - 1; i >= 0; i--) {\n const { el, height, maxHeight, overflowY } = savedExpandedNodesRef.current[i]\n el.style.height = height\n el.style.maxHeight = maxHeight\n el.style.overflowY = overflowY\n }\n savedExpandedNodesRef.current = []\n }\n\n const enterCanvas = React.useCallback(() => {\n if (canvasRef.current.active) return\n if (domStateSavedRef.current || savedExpandedNodesRef.current.length > 0) {\n restoreExpandedNodes()\n domStateSavedRef.current = false\n }\n\n const scrollX = window.scrollX\n const scrollY = window.scrollY\n savedScrollRef.current = { x: scrollX, y: scrollY }\n savedBodyOverflowRef.current = document.body.style.overflow\n savedHtmlOverflowRef.current = document.documentElement.style.overflow\n savedHtmlBgColorRef.current = document.documentElement.style.backgroundColor\n domStateSavedRef.current = true\n\n const existingTransform = document.body.style.transform\n if (existingTransform && existingTransform !== 'none' && existingTransform !== '') {\n console.warn('[made-refine] canvas mode: overriding existing body transform:', existingTransform)\n }\n\n let entered = false\n try {\n // Reset window scroll so transform does the positioning\n window.scrollTo(0, 0)\n\n // Expand scroll regions and clipped ancestors before measuring canvas bounds.\n savedBodyDimensionsRef.current = expandScrollableRegionsAndMeasureBody()\n\n // Measure body margin before applying transform — needed for guideline math.\n updateBodyOffset()\n\n document.body.style.overflow = 'hidden'\n document.documentElement.style.overflow = 'hidden'\n document.documentElement.style.backgroundColor = '#F5F5F5'\n\n // Initial pan compensates for saved scroll position\n const initialPanX = -scrollX\n const initialPanY = -scrollY\n applyTransform(1, initialPanX, initialPanY)\n\n canvasRef.current = { active: true, zoom: 1, panX: initialPanX, panY: initialPanY }\n setCanvasSnapshot(canvasRef.current)\n setState((prev) => ({\n ...prev,\n canvas: { active: true, zoom: 1, panX: initialPanX, panY: initialPanY },\n }))\n dispatchCanvasChange()\n entered = true\n } finally {\n if (!entered) {\n document.body.style.transform = ''\n document.body.style.transformOrigin = ''\n restoreExpandedNodes()\n document.body.style.overflow = savedBodyOverflowRef.current\n document.documentElement.style.overflow = savedHtmlOverflowRef.current\n document.documentElement.style.backgroundColor = savedHtmlBgColorRef.current\n window.scrollTo(scrollX, scrollY)\n domStateSavedRef.current = false\n }\n }\n }, [applyTransform, dispatchCanvasChange, setState, updateBodyOffset])\n\n const exitCanvas = React.useCallback(() => {\n const shouldRestoreDom = domStateSavedRef.current || savedExpandedNodesRef.current.length > 0\n const wasActive = canvasRef.current.active\n if (!wasActive && !shouldRestoreDom) return\n\n // Cancel any pending rAF first to prevent stale setState firing after exit\n // has already reset canvas state to { active: false, zoom: 1, panX: 0, panY: 0 }.\n cancelPendingRaf()\n\n document.body.style.transform = ''\n document.body.style.transformOrigin = ''\n restoreExpandedNodes()\n if (shouldRestoreDom) {\n document.body.style.overflow = savedBodyOverflowRef.current\n document.documentElement.style.overflow = savedHtmlOverflowRef.current\n document.documentElement.style.backgroundColor = savedHtmlBgColorRef.current\n window.scrollTo(savedScrollRef.current.x, savedScrollRef.current.y)\n }\n document.body.style.cursor = ''\n domStateSavedRef.current = false\n\n setBodyOffset({ x: 0, y: 0 })\n canvasRef.current = { active: false, zoom: 1, panX: 0, panY: 0 }\n setCanvasSnapshot(canvasRef.current)\n if (wasActive) {\n setState((prev) => ({\n ...prev,\n canvas: { active: false, zoom: 1, panX: 0, panY: 0 },\n }))\n dispatchCanvasChange()\n }\n }, [cancelPendingRaf, dispatchCanvasChange, setState])\n\n const toggleCanvas = React.useCallback(() => {\n if (canvasRef.current.active) {\n exitCanvas()\n } else {\n enterCanvas()\n }\n }, [enterCanvas, exitCanvas])\n\n const setCanvasZoom = React.useCallback((zoom: number) => {\n const c = canvasRef.current\n if (!c.active) return\n const clampedZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, zoom))\n updateCanvas(clampedZoom, c.panX, c.panY)\n }, [updateCanvas])\n\n const fitCanvasToViewport = React.useCallback(() => {\n const c = canvasRef.current\n if (!c.active) return\n const bodyWidth = savedBodyDimensionsRef.current.width || window.innerWidth\n const bodyHeight = savedBodyDimensionsRef.current.height || window.innerHeight\n const scaleX = window.innerWidth / bodyWidth\n const scaleY = window.innerHeight / bodyHeight\n const zoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, Math.min(scaleX, scaleY) * 0.9))\n // Center content: panX = (viewportWidth/zoom - bodyWidth) / 2\n // These centering values always satisfy the pan clamp bounds.\n const panX = (window.innerWidth / zoom - bodyWidth) / 2\n const panY = (window.innerHeight / zoom - bodyHeight) / 2\n updateCanvas(zoom, panX, panY)\n }, [updateCanvas])\n\n const zoomCanvasTo100 = React.useCallback(() => {\n const c = canvasRef.current\n if (!c.active) return\n updateCanvas(1, 0, 0)\n }, [updateCanvas])\n\n // Wheel handler: Ctrl/Cmd+scroll = zoom-to-cursor, plain scroll = pan\n React.useEffect(() => {\n function handleWheel(e: WheelEvent) {\n const c = canvasRef.current\n if (!c.active) return\n e.preventDefault()\n\n const { deltaX, deltaY } = normalizeWheelDelta(e)\n\n if (e.ctrlKey || e.metaKey) {\n const zoomFactor = Math.exp(-deltaY * ZOOM_SENSITIVITY)\n const oldZoom = c.zoom\n const newZoom = Math.max(MIN_ZOOM, Math.min(MAX_ZOOM, oldZoom * zoomFactor))\n const cx = e.clientX\n const cy = e.clientY\n // Zoom-to-cursor: account for body margin offset\n const bo = getBodyOffset()\n const newPanX = c.panX + (cx - bo.x) * (1 / newZoom - 1 / oldZoom)\n const newPanY = c.panY + (cy - bo.y) * (1 / newZoom - 1 / oldZoom)\n updateCanvas(newZoom, newPanX, newPanY)\n } else {\n // Pan: divide by zoom to convert viewport delta to content-space delta\n const newPanX = c.panX - deltaX / c.zoom\n const newPanY = c.panY - deltaY / c.zoom\n updateCanvas(c.zoom, newPanX, newPanY)\n }\n }\n\n window.addEventListener('wheel', handleWheel, { passive: false })\n return () => window.removeEventListener('wheel', handleWheel)\n }, [updateCanvas])\n\n // Body margins can change on responsive breakpoints; keep canvas math in sync.\n React.useEffect(() => {\n function handleResize() {\n if (!canvasRef.current.active) return\n if (updateBodyOffset()) {\n dispatchCanvasChange()\n }\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [dispatchCanvasChange, updateBodyOffset])\n\n // Space key tracking for grab cursor\n React.useEffect(() => {\n function handleKeyDown(e: KeyboardEvent) {\n if (e.code !== 'Space' || e.repeat) return\n if (!canvasRef.current.active) return\n if (isInputFocused()) return\n spaceHeldRef.current = true\n if (!isDraggingRef.current) {\n document.body.style.cursor = 'grab'\n }\n e.preventDefault()\n }\n\n function handleKeyUp(e: KeyboardEvent) {\n if (e.code !== 'Space') return\n if (!canvasRef.current.active) return\n spaceHeldRef.current = false\n if (!isDraggingRef.current) {\n document.body.style.cursor = ''\n }\n }\n\n window.addEventListener('keydown', handleKeyDown, true)\n window.addEventListener('keyup', handleKeyUp, true)\n return () => {\n window.removeEventListener('keydown', handleKeyDown, true)\n window.removeEventListener('keyup', handleKeyUp, true)\n }\n }, [])\n\n // Pointer drag for pan (Space+drag or middle mouse button).\n // Uses AbortController so all nested listeners are always removed together.\n // Also handles pointercancel and window blur to prevent stuck drag state.\n React.useEffect(() => {\n function handlePointerDown(e: PointerEvent) {\n const c = canvasRef.current\n if (!c.active) return\n const isMiddleMouse = e.button === 1\n const isSpaceDrag = spaceHeldRef.current && e.button === 0\n if (!isMiddleMouse && !isSpaceDrag) return\n\n e.preventDefault()\n isDraggingRef.current = true\n dragStartRef.current = { x: e.clientX, y: e.clientY, panX: c.panX, panY: c.panY }\n document.body.style.cursor = 'grabbing'\n\n const dragAbort = new AbortController()\n const opts = { signal: dragAbort.signal }\n\n function endDrag() {\n isDraggingRef.current = false\n document.body.style.cursor = spaceHeldRef.current ? 'grab' : ''\n dragAbort.abort()\n }\n\n window.addEventListener('pointermove', (moveE: PointerEvent) => {\n const current = canvasRef.current\n const dx = (moveE.clientX - dragStartRef.current.x) / current.zoom\n const dy = (moveE.clientY - dragStartRef.current.y) / current.zoom\n updateCanvas(current.zoom, dragStartRef.current.panX + dx, dragStartRef.current.panY + dy)\n }, opts)\n\n // pointercancel: pointer cancelled by system gesture or browser intervention\n // blur: tab switch or window focus loss mid-drag\n window.addEventListener('pointerup', endDrag, opts)\n window.addEventListener('pointercancel', endDrag, opts)\n window.addEventListener('blur', endDrag, opts)\n }\n\n window.addEventListener('pointerdown', handlePointerDown, true)\n return () => window.removeEventListener('pointerdown', handlePointerDown, true)\n }, [updateCanvas])\n\n // Cleanup on unmount: cancel pending rAF then restore DOM state\n React.useEffect(() => {\n return () => {\n cancelPendingRaf()\n if (canvasRef.current.active || domStateSavedRef.current || savedExpandedNodesRef.current.length > 0) {\n exitCanvas()\n }\n }\n }, [cancelPendingRaf, exitCanvas])\n\n return { toggleCanvas, enterCanvas, exitCanvas, setCanvasZoom, fitCanvasToViewport, zoomCanvasTo100 }\n}\n","import { useSyncExternalStore } from 'react'\n\ntype CanvasSnapshot = { active: boolean; zoom: number; panX: number; panY: number }\n\nconst DEFAULT: CanvasSnapshot = { active: false, zoom: 1, panX: 0, panY: 0 }\n\nlet snapshot: CanvasSnapshot = DEFAULT\nconst listeners = new Set<() => void>()\nlet ownerCount = 0\n\nlet bodyOffset = { x: 0, y: 0 }\nexport function getBodyOffset() { return bodyOffset }\nexport function setBodyOffset(o: { x: number; y: number }) { bodyOffset = o }\n\nexport function getCanvasSnapshot(): CanvasSnapshot {\n return snapshot\n}\n\nexport function setCanvasSnapshot(next: CanvasSnapshot) {\n snapshot = next\n listeners.forEach((cb) => cb())\n}\n\nexport function registerCanvasStoreOwner(): () => void {\n ownerCount += 1\n if (ownerCount > 1 && (typeof process === 'undefined' || process.env.NODE_ENV !== 'test')) {\n console.warn('[made-refine] multiple DirectEditProvider instances share canvas-store globals')\n }\n return () => {\n ownerCount = Math.max(0, ownerCount - 1)\n }\n}\n\nfunction subscribe(cb: () => void) {\n listeners.add(cb)\n return () => {\n listeners.delete(cb)\n }\n}\n\n/** Synchronous canvas state — no rAF lag. Use for overlays that must track the DOM transform exactly. */\nexport function useCanvasSnapshot(): CanvasSnapshot {\n return useSyncExternalStore(subscribe, getCanvasSnapshot, () => DEFAULT)\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEditState, useDirectEditActions } from './provider'\nimport {\n TooltipProvider,\n} from './ui/tooltip'\nimport { cn } from './cn'\nimport type { SpacingPropertyKey, BorderRadiusPropertyKey, BorderPropertyKey, BorderProperties, CSSPropertyValue, SizingValue, SizingPropertyKey, ColorValue, ColorPropertyKey, TypographyPropertyKey, TypographyProperties, BorderStyleControlPreference } from './types'\nimport { useMeasurement } from './use-measurement'\nimport { MeasurementOverlay } from './measurement-overlay'\nimport { useMove } from './use-move'\nimport { getStoredGuidelines } from './use-guidelines'\nimport {\n calculateGuidelineMeasurements, isFlexContainer, isTextElement,\n resolveElementTarget, computeHoverHighlight,\n elementFromPointWithoutOverlays, findChildAtPoint,\n} from './utils'\nimport { InteractionOverlay } from './panel/interaction-overlay'\nimport { MoveOverlay } from './move-overlay'\nimport { SelectionOverlay } from './selection-overlay'\nimport { CommentOverlay } from './comment-overlay'\n// Panel module imports\nimport { NumberInput, Tip, CollapsibleSection, SectionNav, useSectionNav } from './panel/shared'\nimport type { SectionKey } from './panel/shared'\nimport { BorderRadiusInputs } from './panel/border-radius-inputs'\nimport { BorderSection } from './panel/border-section'\nimport { ShadowSection } from './panel/shadow-section'\nimport { TypographyInputs } from './panel/typography-inputs'\nimport { FillSection } from './panel/fill-section'\nimport { PanelHeader } from './panel/panel-header'\nimport { PanelFooter } from './panel/panel-footer'\nimport { LayoutSection } from './panel/layout-section'\nimport { usePanelPosition, PANEL_WIDTH, PANEL_HEIGHT } from './use-panel-position'\n\n// Re-export panel modules for external consumers\nexport { NumberInput, Tip, CollapsibleSection, SectionNav, useSectionNav, selectOnFocus } from './panel/shared'\nexport type { SectionKey } from './panel/shared'\nexport { SpacingInputs } from './panel/spacing-inputs'\nexport { BorderRadiusInputs, RadiusCornerIcon, BORDER_RADIUS_FULL, BORDER_RADIUS_SLIDER_MAX, sliderToValue, valueToSlider } from './panel/border-radius-inputs'\nexport { BorderSection, BorderInputs, BorderSideIcon, BORDER_STYLE_OPTIONS, BORDER_POSITION_OPTIONS, BORDER_SIDES, BORDER_SIDE_OPTIONS } from './panel/border-section'\nexport type { BorderPosition, BorderSideOption } from './panel/border-section'\nexport { ShadowSection, ShadowLayerEditor, ShadowField } from './panel/shadow-section'\nexport { TypographyInputs, FONT_FAMILIES, FONT_WEIGHTS } from './panel/typography-inputs'\nexport { FillSection, ColorInput } from './panel/fill-section'\nexport { SizingInputs, SizingDropdown, SizingFixedInput, SIZING_OPTIONS, DISTRIBUTE_MODES, DISTRIBUTE_LABELS } from './panel/sizing-inputs'\nexport type { DistributeMode } from './panel/sizing-inputs'\nexport { AlignmentGrid } from './panel/alignment-grid'\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 computedBoxShadow?: string\n borderStyleControlPreference?: BorderStyleControlPreference\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 canSendToAgent?: 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 onHeaderPointerCancel?: (e: React.PointerEvent) => void\n}\n\nexport function DirectEditPanelInner({\n elementInfo,\n computedSpacing,\n computedBorderRadius,\n computedBorder,\n computedFlex,\n computedSizing,\n computedColor,\n computedBoxShadow = 'none',\n borderStyleControlPreference = 'icon',\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 canSendToAgent = false,\n className,\n style,\n panelRef,\n isDragging,\n onHeaderPointerDown,\n onHeaderPointerMove,\n onHeaderPointerUp,\n onHeaderPointerCancel,\n}: DirectEditPanelInnerProps) {\n const hasPendingChanges = Object.keys(pendingStyles).length > 0\n const canTriggerSend = canSendToAgent || hasPendingChanges\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 shadow: 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 transition-shadow duration-200',\n isDragging && 'cursor-grabbing select-none shadow-2xl',\n className\n )}\n style={{\n width: PANEL_WIDTH,\n ...(isDragging && { transform: 'rotate(0.5deg) scale(1.01)', transition: 'transform 150ms ease-out, box-shadow 150ms ease-out' }),\n ...style,\n }}\n >\n <PanelHeader\n elementInfo={elementInfo}\n isDraggable={isDraggable}\n onClose={onClose}\n onSelectParent={onSelectParent}\n onSelectChild={onSelectChild}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n onPointerCancel={onHeaderPointerCancel}\n />\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} onWheelCapture={(e) => e.stopPropagation()}>\n <LayoutSection\n elementInfo={elementInfo}\n computedFlex={computedFlex}\n computedSpacing={computedSpacing}\n computedSizing={computedSizing}\n onToggleFlex={onToggleFlex}\n onUpdateFlex={onUpdateFlex}\n onUpdateSpacing={onUpdateSpacing}\n onUpdateSizing={onUpdateSizing}\n sectionRef={sectionRefs.layout}\n />\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 borderStyleControlPreference={borderStyleControlPreference}\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 <div ref={sectionRefs.shadow}>\n <ShadowSection\n boxShadow={computedBoxShadow}\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 <PanelFooter\n isDraggable={isDraggable}\n canTriggerSend={canTriggerSend}\n onExportEdits={onExportEdits}\n onSendToAgent={onSendToAgent}\n onPointerDown={onHeaderPointerDown}\n onPointerMove={onHeaderPointerMove}\n onPointerUp={onHeaderPointerUp}\n onPointerCancel={onHeaderPointerCancel}\n />\n </div>\n </TooltipProvider>\n )\n}\n\nfunction DirectEditPanelContent() {\n const container = usePortalContainer()\n const {\n isOpen, elementInfo,\n computedSpacing, computedBorderRadius, computedBorder, computedFlex,\n computedSizing, computedColor, computedBoxShadow, computedTypography,\n borderStyleControlPreference, pendingStyles,\n editModeActive, selectedElement, activeTool,\n comments, activeCommentId, textEditingElement,\n } = useDirectEditState()\n const {\n closePanel, selectParent, selectChild, selectElement,\n updateSpacingProperty, updateBorderRadiusProperty,\n updateBorderProperty, updateBorderProperties, updateRawCSS,\n updateFlexProperty, toggleFlexLayout,\n updateSizingProperty, updateColorProperty, updateTypographyProperty,\n resetToOriginal, exportEdits, sendEditToAgent,\n handleMoveComplete, setActiveTool,\n addComment, updateCommentText, addCommentReply, deleteComment, exportComment,\n sendCommentToAgent, setActiveCommentId,\n startTextEditing, commitTextEditing,\n canSendEditToAgent,\n } = useDirectEditActions()\n\n const {\n position,\n isDragging,\n isSnapping,\n panelRef,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n } = usePanelPosition()\n\n const [hoverHighlight, setHoverHighlight] = React.useState<{\n flexContainer: HTMLElement\n children: HTMLElement[]\n } | null>(null)\n const [commentInputAttention, setCommentInputAttention] = React.useState<{ commentId: string; nonce: number } | null>(null)\n const commentDraftRef = React.useRef('')\n\n React.useEffect(() => {\n commentDraftRef.current = ''\n }, [activeCommentId])\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 triggerCommentInputAttention = React.useCallback((commentId: string) => {\n setCommentInputAttention((prev) => (\n prev?.commentId === commentId\n ? { commentId, nonce: prev.nonce + 1 }\n : { commentId, nonce: 1 }\n ))\n }, [])\n\n const hasPendingCommentDraft = React.useCallback((nextCommentId: string | null = null) => {\n if (!activeCommentId) return false\n if (nextCommentId && nextCommentId === activeCommentId) return false\n const active = comments.find((comment) => comment.id === activeCommentId)\n if (!active) return false\n // Block only unsent drafts (typed input not yet submitted to comment.text).\n const hasUnsentDraft = active.text.trim().length === 0 && commentDraftRef.current.trim().length > 0\n if (!hasUnsentDraft) return false\n triggerCommentInputAttention(active.id)\n return true\n }, [activeCommentId, comments, triggerCommentInputAttention])\n\n const handleSetActiveComment = React.useCallback((id: string | null) => {\n if (hasPendingCommentDraft(id)) return\n // Delete empty comment when switching away\n if (activeCommentId && activeCommentId !== id) {\n const active = comments.find((comment) => comment.id === activeCommentId)\n if (active && active.text.trim().length === 0) {\n deleteComment(active.id)\n }\n }\n setActiveCommentId(id)\n }, [activeCommentId, comments, hasPendingCommentDraft, deleteComment, setActiveCommentId])\n\n const overlay = editModeActive && container ? createPortal(\n <InteractionOverlay\n activeTool={activeTool}\n selectedElement={selectedElement}\n textEditingElement={textEditingElement}\n activeCommentId={activeCommentId}\n hoverHighlight={hoverHighlight}\n onSelectElement={selectElement}\n onStartTextEditing={startTextEditing}\n onAddComment={addComment}\n onSetActiveCommentId={handleSetActiveComment}\n onSetHoverHighlight={setHoverHighlight}\n hasPendingCommentDraft={hasPendingCommentDraft}\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={handleSetActiveComment}\n onUpdateText={updateCommentText}\n onAddReply={addCommentReply}\n onDelete={deleteComment}\n onExport={exportComment}\n onSendToAgent={sendCommentToAgent}\n attentionRequest={commentInputAttention}\n draftRef={commentDraftRef}\n />,\n container\n ) : null\n\n if (!isOpen || !computedSpacing || !elementInfo || !computedBorderRadius || !computedBorder || !computedFlex || !computedSizing || !computedColor || computedBoxShadow === null || !computedTypography || !container) return <>{overlay}{commentOverlay}</>\n\n const handleMoveStart = (\n e: React.PointerEvent,\n targetElement?: HTMLElement,\n options?: { constrainToOriginalParent?: boolean }\n ) => {\n const elementToDrag = targetElement ?? selectedElement\n if (elementToDrag) {\n startDrag(e, elementToDrag, options)\n }\n }\n\n const hasMultiItemFlexAncestor = (() => {\n if (!selectedElement) return false\n\n let current: HTMLElement | null = selectedElement.parentElement\n while (current) {\n if (isFlexContainer(current) && current.children.length > 1) {\n return true\n }\n current = current.parentElement\n }\n\n return false\n })()\n\n const showMoveHandle = Boolean(\n selectedElement\n && (\n (isFlexContainer(selectedElement) && selectedElement.children.length > 1)\n || hasMultiItemFlexAncestor\n )\n )\n\n return createPortal(\n <>\n {overlay}\n {commentOverlay}\n\n {selectedElement && (\n <SelectionOverlay\n selectedElement={selectedElement}\n draggedElement={dragState.draggedElement}\n isDragging={dragState.isDragging}\n ghostPosition={dragState.ghostPosition}\n onMoveStart={handleMoveStart}\n showMoveHandle={showMoveHandle}\n activeTool={activeTool}\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 computedBoxShadow={computedBoxShadow}\n borderStyleControlPreference={borderStyleControlPreference}\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 canSendToAgent={canSendEditToAgent({\n selectedElement,\n elementInfo,\n pendingStyles,\n })}\n className=\"fixed z-[99999]\"\n style={{\n left: position.x,\n top: position.y,\n maxHeight: PANEL_HEIGHT,\n pointerEvents: 'auto',\n ...(isSnapping && {\n transition: 'left 300ms cubic-bezier(0.34, 1.56, 0.64, 1), top 300ms cubic-bezier(0.34, 1.56, 0.64, 1)',\n }),\n }}\n panelRef={panelRef}\n isDragging={isDragging}\n onHeaderPointerDown={handlePointerDown}\n onHeaderPointerMove={handlePointerMove}\n onHeaderPointerUp={handlePointerUp}\n onHeaderPointerCancel={handlePointerCancel}\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 { 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-xs outline-1 outline-border 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-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\nexport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n TooltipProvider,\n createTooltipHandle,\n}\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 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 window.addEventListener('direct-edit-canvas-change', handleUpdate)\n\n return () => {\n window.removeEventListener('scroll', handleUpdate, true)\n window.removeEventListener('resize', handleUpdate)\n window.removeEventListener('direct-edit-canvas-change', 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) => (\n <MeasurementLineComponent key={`${line.direction}-${line.x1}-${line.y1}-${line.x2}-${line.y2}`} 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 StartDragOptions {\n constrainToOriginalParent?: boolean\n}\n\nexport interface UseMoveResult {\n dragState: DragState\n dropTarget: UseMoveDropTarget | null\n dropIndicator: DropIndicator | null\n startDrag: (e: React.PointerEvent, element: HTMLElement, options?: StartDragOptions) => 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 const dragOptionsRef = React.useRef<StartDragOptions>({})\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 dragOptionsRef.current = {}\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 dragOptionsRef.current = {}\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, options?: StartDragOptions) => {\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 dragOptionsRef.current = options ?? {}\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 = dragOptionsRef.current.constrainToOriginalParent\n ? originalParent\n : 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'\nimport { getBodyOffset } from './canvas-store'\nimport { collectSnapTargets, findSnap, SNAP_THRESHOLD_PX } from './utils/snap-targets'\n\nconst STORAGE_KEY = 'direct-edit-guidelines'\n\nfunction isGuidelineOrientation(value: unknown): value is Guideline['orientation'] {\n return value === 'horizontal' || value === 'vertical'\n}\n\nfunction isValidGuideline(value: unknown): value is Guideline {\n if (!value || typeof value !== 'object') return false\n\n const candidate = value as Partial<Guideline>\n return (\n typeof candidate.id === 'string'\n && candidate.id.length > 0\n && isGuidelineOrientation(candidate.orientation)\n && typeof candidate.position === 'number'\n && Number.isFinite(candidate.position)\n )\n}\n\nexport interface UseGuidelinesResult {\n guidelines: Guideline[]\n activeGuideline: Guideline | null\n dragPosition: number | null\n isCreating: boolean\n isSnapped: 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 if (!stored) return []\n\n const parsed: unknown = JSON.parse(stored)\n if (!Array.isArray(parsed)) return []\n return parsed.filter(isValidGuideline)\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\nconst SNAP_VELOCITY_THRESHOLD = 3 // px/ms — snap only when dragging slower than this\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(\n enabled: boolean,\n hostElement?: HTMLElement | null,\n canvas?: { active: boolean; zoom: number; panX: number; panY: number } | null,\n): 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 canvasRef = React.useRef(canvas)\n canvasRef.current = canvas\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 const snapTargetsRef = React.useRef<number[]>([])\n const isSnappedRef = React.useRef(false)\n const [isSnapped, setIsSnapped] = React.useState(false)\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((prev) => {\n const x = window.scrollX\n const y = window.scrollY\n return prev.x === x && prev.y === y ? prev : { x, y }\n })\n }\n\n update()\n window.addEventListener('scroll', update, true)\n window.addEventListener('resize', update)\n window.addEventListener('direct-edit-canvas-change', update)\n return () => {\n window.removeEventListener('scroll', update, true)\n window.removeEventListener('resize', update)\n window.removeEventListener('direct-edit-canvas-change', update)\n }\n }, [enabled])\n\n const endDrag = React.useCallback(() => {\n const wasCreating = dragInfoRef.current?.isCreating ?? false\n dragInfoRef.current = null\n snapTargetsRef.current = []\n isSnappedRef.current = false\n setIsSnapped(false)\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 let lastPos = NaN\n let lastTime = 0\n\n function onPointerMove(e: PointerEvent) {\n const rawViewportPos = orientation === 'horizontal' ? e.clientY : e.clientX\n\n // Compute velocity to gate snapping — only snap when dragging slowly\n const now = performance.now()\n const dt = now - lastTime\n const velocity = dt > 0 && !Number.isNaN(lastPos)\n ? Math.abs(rawViewportPos - lastPos) / dt\n : 0\n lastPos = rawViewportPos\n lastTime = now\n\n let effectiveViewportPos = rawViewportPos\n let snapped = false\n if (velocity < SNAP_VELOCITY_THRESHOLD) {\n const snapResult = findSnap(rawViewportPos, snapTargetsRef.current, SNAP_THRESHOLD_PX)\n if (snapResult !== null) {\n effectiveViewportPos = snapResult\n snapped = true\n }\n }\n\n isSnappedRef.current = snapped\n setIsSnapped(snapped)\n const pos = viewportToCssCoord(hostRef.current, effectiveViewportPos, axis)\n setDragPosition(pos)\n const c = canvasRef.current\n let storedPosition: number\n if (c?.active) {\n const pan = orientation === 'horizontal' ? (c.panY || 0) : (c.panX || 0)\n const bo = orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n storedPosition = bo + (pos - bo) / (c.zoom || 1) - pan\n } else {\n const currentScroll = orientation === 'horizontal' ? window.scrollY : window.scrollX\n storedPosition = pos + currentScroll\n }\n setGuidelines((prev) =>\n prev.map((g) => (g.id === guidelineId ? { ...g, position: storedPosition } : g)),\n )\n }\n\n function onPointerUp(e: PointerEvent) {\n const rawViewportPos = orientation === 'horizontal' ? e.clientY : e.clientX\n const snapResult = findSnap(rawViewportPos, snapTargetsRef.current, SNAP_THRESHOLD_PX)\n const pos = viewportToCssCoord(hostRef.current, snapResult ?? rawViewportPos, axis)\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 id = generateId()\n const c = canvasRef.current\n let storedPosition: number\n if (c?.active) {\n const pan = orientation === 'horizontal' ? (c.panY || 0) : (c.panX || 0)\n const bo = orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n storedPosition = bo + (pos - bo) / (c.zoom || 1) - pan\n } else {\n const scrollPos = orientation === 'horizontal' ? window.scrollY : window.scrollX\n storedPosition = pos + scrollPos\n }\n const newGuideline: Guideline = { id, orientation, position: storedPosition }\n\n snapTargetsRef.current = collectSnapTargets(orientation)\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 snapTargetsRef.current = collectSnapTargets(guideline.orientation)\n const c = canvasRef.current\n let viewportPos: number\n if (c?.active) {\n const pan = guideline.orientation === 'horizontal' ? (c.panY || 0) : (c.panX || 0)\n const bo = guideline.orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n viewportPos = bo + (guideline.position - bo + pan) * (c.zoom || 1)\n } else {\n const scrollPos = guideline.orientation === 'horizontal' ? window.scrollY : window.scrollX\n viewportPos = guideline.position - scrollPos\n }\n setActiveGuidelineId(guidelineId)\n setDragPosition(viewportPos)\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 isSnapped,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n clearAll,\n }\n}\n","export const SNAP_THRESHOLD_PX = 6\n\n/**\n * Collect viewport-space edge positions from visible DOM elements.\n * Called once at drag start to avoid DOM access during pointermove.\n */\nexport function collectSnapTargets(orientation: 'horizontal' | 'vertical'): number[] {\n const edges: number[] = []\n const elements = document.body.querySelectorAll('*')\n const viewportW = window.innerWidth\n const viewportH = window.innerHeight\n\n for (let i = 0; i < elements.length; i++) {\n const el = elements[i] as HTMLElement\n if (el === document.body || el === document.documentElement) continue\n if (el.closest('[data-direct-edit]') || el.closest('[data-direct-edit-host]')) continue\n // Skip display:none subtrees without calling getBoundingClientRect.\n // offsetParent is null for display:none elements (and position:fixed, which\n // we intentionally exclude — snap targets should be page content, not UI overlays).\n if (el.offsetParent === null && el !== document.body) continue\n\n const rect = el.getBoundingClientRect()\n if (rect.width < 4 || rect.height < 4) continue\n\n // Skip off-screen elements (200px buffer)\n if (\n rect.right < -200\n || rect.bottom < -200\n || rect.left > viewportW + 200\n || rect.top > viewportH + 200\n ) continue\n\n if (orientation === 'horizontal') {\n edges.push(rect.top, rect.bottom)\n } else {\n edges.push(rect.left, rect.right)\n }\n\n if (edges.length >= 2000) break\n }\n\n return edges\n}\n\n/**\n * Find the nearest snap edge within threshold.\n * Returns the snapped viewport position, or null if nothing is close enough.\n */\nexport function findSnap(\n viewportPos: number,\n snapEdges: number[],\n threshold: number,\n): number | null {\n let best: number | null = null\n let bestDist = threshold + 1\n\n for (let i = 0; i < snapEdges.length; i++) {\n const dist = Math.abs(snapEdges[i] - viewportPos)\n if (dist < bestDist) {\n bestDist = dist\n best = snapEdges[i]\n }\n }\n\n return bestDist <= threshold ? best : null\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\nimport type { ActiveTool } from '../types'\nimport {\n isTextElement,\n resolveElementTarget,\n computeHoverHighlight,\n elementFromPointWithoutOverlays,\n} from '../utils'\n\nexport interface InteractionOverlayProps {\n activeTool: ActiveTool\n selectedElement: HTMLElement | null\n textEditingElement: HTMLElement | null\n activeCommentId: string | null\n hoverHighlight: {\n flexContainer: HTMLElement\n children: HTMLElement[]\n } | null\n onSelectElement: (element: HTMLElement) => void\n onStartTextEditing: (element: HTMLElement) => void\n onAddComment: (element: HTMLElement, position: { x: number; y: number }) => void\n onSetActiveCommentId: (id: string | null) => void\n onSetHoverHighlight: (highlight: { flexContainer: HTMLElement; children: HTMLElement[] } | null) => void\n hasPendingCommentDraft: () => boolean\n}\n\nexport function InteractionOverlay({\n activeTool,\n selectedElement,\n textEditingElement,\n activeCommentId,\n hoverHighlight,\n onSelectElement,\n onStartTextEditing,\n onAddComment,\n onSetActiveCommentId,\n onSetHoverHighlight,\n hasPendingCommentDraft,\n}: InteractionOverlayProps) {\n return (\n <>\n <div\n role=\"presentation\"\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) onSelectElement(resolved)\n onStartTextEditing(resolved)\n }\n }\n }}\n onMouseMove={(e) => {\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n onSetHoverHighlight(computeHoverHighlight(elementUnder, selectedElement))\n }}\n onMouseLeave={() => onSetHoverHighlight(null)}\n onClick={(e) => {\n e.preventDefault()\n onSetHoverHighlight(null)\n if (activeTool === 'comment') {\n if (hasPendingCommentDraft()) return\n const elementUnder = elementFromPointWithoutOverlays(e.clientX, e.clientY)\n const target = (elementUnder && elementUnder !== document.body && elementUnder !== document.documentElement)\n ? resolveElementTarget(elementUnder, selectedElement)\n : document.body\n onAddComment(target, { x: e.clientX, y: e.clientY })\n return\n }\n if (activeCommentId) { onSetActiveCommentId(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 onSelectElement(resolved)\n }\n }}\n />\n {hoverHighlight && (() => {\n const cr = hoverHighlight.flexContainer.getBoundingClientRect()\n return (\n <div\n data-direct-edit=\"hover-highlight\"\n className=\"pointer-events-none fixed inset-0 z-[99991]\"\n >\n <div\n style={{\n position: 'absolute',\n left: cr.left,\n top: cr.top,\n width: cr.width,\n height: cr.height,\n border: '1px solid #3b82f6',\n borderRadius: '0px',\n boxSizing: 'border-box',\n }}\n />\n {hoverHighlight.children.map((child) => {\n const r = child.getBoundingClientRect()\n return (\n <div\n key={`${r.left}-${r.top}-${r.width}-${r.height}`}\n style={{\n position: 'absolute',\n left: r.left,\n top: r.top,\n width: r.width,\n height: r.height,\n border: '1px dashed #3b82f6',\n borderRadius: '0px',\n boxSizing: 'border-box',\n }}\n />\n )\n })}\n </div>\n )\n })()}\n </>\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 type { ActiveTool } from './types'\nimport { elementFromPointWithoutOverlays } from './utils'\n\nconst BLUE = '#0D99FF'\nconst MAGENTA = '#E11BB6'\nconst DRAG_THRESHOLD = 4\nconst DBLCLICK_DELAY = 300\nconst HANDLE_SIZE = 12\n\ninterface MoveStartOptions {\n constrainToOriginalParent?: boolean\n}\n\nexport interface SelectionOverlayProps {\n selectedElement: HTMLElement\n draggedElement?: HTMLElement | null\n isDragging: boolean\n ghostPosition?: { x: number; y: number }\n onMoveStart: (\n e: React.PointerEvent,\n targetElement?: HTMLElement,\n options?: MoveStartOptions\n ) => void\n showMoveHandle?: boolean\n activeTool?: ActiveTool\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 draggedElement,\n isDragging,\n ghostPosition,\n onMoveStart,\n showMoveHandle = false,\n activeTool = 'select',\n isTextEditing,\n onDoubleClick,\n onHoverElement,\n onClickThrough,\n}: SelectionOverlayProps) {\n const rectElement = isDragging && draggedElement ? draggedElement : selectedElement\n const [rect, setRect] = React.useState(() => rectElement.getBoundingClientRect())\n const [moveHandleRects, setMoveHandleRects] = React.useState<Array<{\n target: HTMLElement\n left: number\n top: number\n width: number\n height: number\n }>>([])\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(rectElement.getBoundingClientRect())\n }\n\n updateRect()\n\n window.addEventListener('scroll', updateRect, true)\n window.addEventListener('resize', updateRect)\n window.addEventListener('direct-edit-canvas-change', updateRect)\n\n const observer = new MutationObserver(updateRect)\n observer.observe(rectElement, {\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 window.removeEventListener('direct-edit-canvas-change', updateRect)\n observer.disconnect()\n }\n }, [rectElement])\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 getMoveHandleTargets = React.useCallback(() => {\n if (!showMoveHandle) return []\n const selectedDisplay = window.getComputedStyle(selectedElement).display\n const selectedIsFlexContainer = selectedDisplay === 'flex' || selectedDisplay === 'inline-flex'\n\n if (selectedIsFlexContainer && selectedElement.children.length > 1) {\n return Array.from(selectedElement.children).filter((child): child is HTMLElement => child instanceof HTMLElement)\n }\n\n let flexParent: HTMLElement | null = selectedElement.parentElement\n while (flexParent) {\n const display = window.getComputedStyle(flexParent).display\n const isFlex = display === 'flex' || display === 'inline-flex'\n if (isFlex && flexParent.children.length > 1) {\n break\n }\n flexParent = flexParent.parentElement\n }\n\n if (!flexParent) {\n return [selectedElement]\n }\n\n let target: HTMLElement = selectedElement\n while (target.parentElement && target.parentElement !== flexParent) {\n target = target.parentElement\n }\n\n return [target]\n }, [selectedElement, showMoveHandle])\n\n React.useEffect(() => {\n if (!showMoveHandle || isDragging || isTextEditing) {\n setMoveHandleRects([])\n return\n }\n\n const targets = getMoveHandleTargets()\n setMoveHandleRects(targets.map((target) => {\n const targetRect = target.getBoundingClientRect()\n return {\n target,\n left: targetRect.left,\n top: targetRect.top,\n width: targetRect.width,\n height: targetRect.height,\n }\n }))\n }, [\n rect,\n selectedElement,\n selectedElement.parentElement,\n selectedElement.childElementCount,\n showMoveHandle,\n isDragging,\n isTextEditing,\n getMoveHandleTargets,\n ])\n\n const handleMoveHandlePointerDown = (target: HTMLElement) => (e: React.PointerEvent<HTMLButtonElement>) => {\n if (e.button !== 0) return\n e.preventDefault()\n e.stopPropagation()\n cleanupRef.current?.()\n if (clickThroughTimerRef.current) {\n clearTimeout(clickThroughTimerRef.current)\n clickThroughTimerRef.current = null\n }\n onMoveStart(e, target, { constrainToOriginalParent: true })\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 {!isTextEditing && (\n <div\n data-direct-edit=\"selection-overlay\"\n style={{\n position: 'fixed',\n left: displayX,\n top: displayY,\n width: rect.width,\n height: rect.height,\n pointerEvents: 'none',\n zIndex: 99996,\n border: `1px solid ${BLUE}`,\n borderRadius: '0px',\n boxSizing: 'border-box',\n }}\n />\n )}\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: activeTool === 'comment' ? 'none' : 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n onMouseMove={handleMouseMove}\n onMouseLeave={handleMouseLeave}\n >\n {moveHandleRects.map((targetRect) => {\n return (\n <button\n key={`${targetRect.left}-${targetRect.top}-${targetRect.width}-${targetRect.height}`}\n type=\"button\"\n data-direct-edit=\"move-handle\"\n aria-label=\"Move element\"\n title=\"Drag to reorder\"\n style={{\n position: 'absolute',\n left: targetRect.left - rect.left + targetRect.width / 2 - HANDLE_SIZE / 2,\n top: targetRect.top - rect.top + targetRect.height / 2 - HANDLE_SIZE / 2,\n width: HANDLE_SIZE,\n height: HANDLE_SIZE,\n borderRadius: 9999,\n border: `1px solid ${MAGENTA}`,\n background: 'transparent',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n boxShadow: 'none',\n cursor: 'grab',\n pointerEvents: 'auto',\n padding: 0,\n }}\n onPointerDown={handleMoveHandlePointerDown(targetRect.target)}\n />\n )\n })}\n </div>\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\"><{locator.tagName.toLowerCase()}></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 attentionRequest?: { commentId: string; nonce: number } | null\n draftRef?: React.MutableRefObject<string>\n}\n\nexport function CommentOverlay({\n comments,\n activeCommentId,\n onSetActiveComment,\n onUpdateText,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n attentionRequest = null,\n draftRef,\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 ? () => onExport(comment.id) : undefined}\n onSendToAgent={() => onSendToAgent(comment.id)}\n attentionNonce={attentionRequest?.commentId === comment.id ? attentionRequest.nonce : 0}\n draftRef={activeCommentId === comment.id ? draftRef : undefined}\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 attentionNonce: number\n draftRef?: React.MutableRefObject<string>\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 attentionNonce,\n draftRef,\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\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 * rect.width,\n y: rect.top + comment.relativePosition.y * rect.height,\n })\n setElementRect(rect)\n }\n\n updatePosition()\n window.addEventListener('scroll', updatePosition, true)\n window.addEventListener('resize', updatePosition)\n window.addEventListener('direct-edit-canvas-change', updatePosition)\n return () => {\n window.removeEventListener('scroll', updatePosition, true)\n window.removeEventListener('resize', updatePosition)\n window.removeEventListener('direct-edit-canvas-change', 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 <button\n type=\"button\"\n data-direct-edit=\"comment-pin\"\n aria-label={`Comment ${index}`}\n className=\"group/pin fixed z-[99998] flex size-3 cursor-pointer items-center justify-center rounded-full border-none bg-blue-500 p-0 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 </button>\n\n {isActive && (\n comment.text === '' ? (\n <NewCommentInput\n position={position}\n flipHorizontal={flipHorizontal}\n flipVertical={flipVertical}\n onSubmit={(text) => {\n onUpdateText(text)\n }}\n onCancel={onClose}\n attentionNonce={attentionNonce}\n draftRef={draftRef}\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 }}\n onDelete={onDelete}\n onExport={onExport}\n onSendToAgent={onSendToAgent}\n />\n )\n )}\n </>\n )\n}\n\ninterface NewCommentInputProps {\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onSubmit: (text: string) => void\n onCancel: () => void\n attentionNonce: number\n draftRef?: React.MutableRefObject<string>\n}\n\nfunction NewCommentInput({\n position,\n flipHorizontal,\n flipVertical,\n onSubmit,\n onCancel,\n attentionNonce,\n draftRef,\n}: NewCommentInputProps) {\n const [text, setText] = React.useState('')\n const [showError, setShowError] = React.useState(false)\n const inputRef = React.useRef<HTMLInputElement>(null)\n const cardRef = React.useRef<HTMLDivElement>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n React.useEffect(() => {\n if (attentionNonce <= 0) return\n setShowError(true)\n cardRef.current?.animate?.(\n [\n { transform: 'translateX(0)' },\n { transform: 'translateX(-6px)' },\n { transform: 'translateX(6px)' },\n { transform: 'translateX(-4px)' },\n { transform: 'translateX(4px)' },\n { transform: 'translateX(0)' },\n ],\n { duration: 260, easing: 'ease-in-out' }\n )\n const timeout = window.setTimeout(() => setShowError(false), 420)\n return () => window.clearTimeout(timeout)\n }, [attentionNonce])\n\n return (\n <div\n ref={cardRef}\n role=\"presentation\"\n data-direct-edit=\"comment-card\"\n className={cn(\n '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 showError && 'outline-red-500/70'\n )}\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 aria-invalid={showError}\n className={cn(\n 'min-w-0 flex-1 bg-transparent px-1.5 text-xs text-foreground placeholder:text-muted-foreground focus:outline-none',\n showError && 'placeholder:text-red-400'\n )}\n placeholder=\"Add a comment...\"\n value={text}\n onChange={(e) => {\n setText(e.target.value)\n if (draftRef) draftRef.current = e.target.value\n }}\n onKeyDown={(e) => {\n e.stopPropagation()\n if (e.key === 'Enter' && text.trim()) {\n onSubmit(text.trim())\n } else if (e.key === 'Escape') {\n onCancel()\n }\n }}\n />\n <button\n type=\"button\"\n className={cn(\n 'flex size-6 shrink-0 items-center justify-center rounded-md transition-colors',\n text.trim()\n ? 'bg-blue-500 text-white hover:bg-blue-600'\n : 'bg-muted text-muted-foreground'\n )}\n disabled={!text.trim()}\n onClick={() => {\n if (text.trim()) onSubmit(text.trim())\n }}\n >\n <ArrowUp className=\"size-3.5\" />\n </button>\n </div>\n )\n}\n\ninterface CommentThreadProps {\n comment: Comment\n index: number\n position: { x: number; y: number }\n flipHorizontal: boolean\n flipVertical: boolean\n onClose: () => void\n onAddReply: (text: string) => void\n onDelete: () => void\n onExport?: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n}\n\nfunction CommentThread({\n comment,\n index,\n position,\n flipHorizontal,\n flipVertical,\n onClose,\n onAddReply,\n onDelete,\n onExport,\n onSendToAgent,\n}: CommentThreadProps) {\n const [replyText, setReplyText] = React.useState('')\n const [copied, setCopied] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const inputRef = React.useRef<HTMLInputElement>(null)\n const copyTimerRef = React.useRef<number | null>(null)\n\n React.useEffect(() => {\n inputRef.current?.focus()\n }, [])\n\n React.useEffect(() => {\n return () => {\n if (copyTimerRef.current) {\n window.clearTimeout(copyTimerRef.current)\n }\n }\n }, [])\n\n const handleCopy = async () => {\n if (!onExport) return\n const success = await onExport()\n if (success) {\n if (copyTimerRef.current) {\n window.clearTimeout(copyTimerRef.current)\n }\n setCopied(true)\n copyTimerRef.current = window.setTimeout(() => {\n copyTimerRef.current = null\n setCopied(false)\n }, 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 role=\"presentation\"\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 {onExport && (\n <Tooltip>\n <TooltipTrigger\n render={\n <button\n type=\"button\"\n aria-label={copied ? 'Copied' : 'Copy comment export'}\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 )}\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) => (\n <div key={reply.createdAt} 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 { Input } from '../ui/input'\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '../ui/tooltip'\nimport { cn } from '../cn'\n\nexport const selectOnFocus = (e: React.FocusEvent<HTMLInputElement>) => e.target.select()\n\ninterface NumberInputProps extends Omit<React.ComponentProps<typeof Input>, 'value' | 'onChange' | 'type'> {\n value: number | null\n onValueChange: (value: number) => void\n}\n\nexport function NumberInput({ value: propValue, onValueChange, ...props }: NumberInputProps) {\n const [localValue, setLocalValue] = React.useState(propValue === null ? '' : String(propValue))\n\n React.useEffect(() => {\n setLocalValue(propValue === null ? '' : 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(propValue === null ? '' : String(propValue))\n }\n }}\n onFocus={selectOnFocus}\n />\n )\n}\n\nexport function 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 CollapsibleSectionProps {\n title: string\n actions?: React.ReactNode\n children: React.ReactNode\n}\n\nexport function 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\nexport type SectionKey = 'layout' | 'radius' | 'border' | 'shadow' | 'colors' | 'text'\n\nexport const SECTION_LABELS: Record<SectionKey, string> = {\n layout: 'Layout',\n radius: 'Radius',\n border: 'Border',\n shadow: 'Shadow',\n colors: 'Colors',\n text: 'Text',\n}\n\nexport function 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\nexport function 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', 'shadow']\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 overflow-x-auto overflow-y-hidden whitespace-nowrap border-b border-border/50 bg-background px-2 py-1 [scrollbar-width:none] [-ms-overflow-style:none] [&::-webkit-scrollbar]:hidden\">\n {sections.map((key) => (\n <button\n key={key}\n type=\"button\"\n className={cn(\n 'shrink-0 rounded-md px-2 py-1 text-xs font-medium transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\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","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 { Button } from '../ui/button'\nimport { Input } from '../ui/input'\nimport { Slider } from '../ui/slider'\nimport { cn } from '../cn'\nimport type { BorderRadiusPropertyKey, CSSPropertyValue } from '../types'\nimport { NumberInput, Tip, selectOnFocus } from './shared'\nimport {\n Columns2,\n Grid2x2,\n} from 'lucide-react'\n\nexport const BORDER_RADIUS_FULL = 9999\nexport const BORDER_RADIUS_SLIDER_MAX = 49\n\n// Slider position 0-48 maps to 0-48px, position 49 maps to 9999 (Full)\nexport function sliderToValue(sliderPos: number): number {\n return sliderPos >= BORDER_RADIUS_SLIDER_MAX ? BORDER_RADIUS_FULL : sliderPos\n}\n\nexport function valueToSlider(value: number): number {\n return value >= BORDER_RADIUS_FULL ? BORDER_RADIUS_SLIDER_MAX : Math.min(value, BORDER_RADIUS_SLIDER_MAX - 1)\n}\n\nexport function 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\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\nexport function 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 combinedValue = 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 isMixed = !allSame\n const isFull = !isMixed && combinedValue >= BORDER_RADIUS_FULL\n const displayValue = isMixed ? 'mixed' : (isFull ? 'Full' : String(combinedValue))\n const sliderValue = valueToSlider(combinedValue)\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","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 * 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 {\n SelectTrigger,\n SelectIcon,\n} from '../ui/select'\nimport { SimpleSelect } from '../ui/simple-select'\nimport { cn } from '../cn'\nimport type { BorderPropertyKey, BorderProperties, BorderStyle, CSSPropertyValue, ColorValue, BorderStyleControlPreference } from '../types'\nimport { ColorPickerGroup } from '../ui/color-picker'\nimport { NumberInput, Tip, CollapsibleSection } from './shared'\nimport { ColorInput } from './fill-section'\nimport {\n ChevronDown,\n Square,\n Focus,\n Settings2,\n Grid2x2,\n Plus,\n Minus,\n} from 'lucide-react'\n\nexport const 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\nexport type BorderPosition = 'border' | 'outline'\nexport const BORDER_POSITION_OPTIONS: Array<{ value: BorderPosition; label: string }> = [\n { value: 'border', label: 'Border' },\n { value: 'outline', label: 'Outline' },\n]\n\nexport const BORDER_SIDES = ['Top', 'Right', 'Bottom', 'Left'] as const\n\nexport const BORDER_SIDE_OPTIONS = ['All', 'Top', 'Right', 'Bottom', 'Left', 'Custom'] as const\nexport type BorderSideOption = typeof BORDER_SIDE_OPTIONS[number]\n\nexport function 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\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 borderStyleControlPreference: BorderStyleControlPreference\n onPositionChange: (position: BorderPosition) => void\n outlineStyle?: BorderStyle\n outlineWidth?: number\n}\n\nexport function BorderInputs({ border, borderColor, outlineColor, onChange, onBatchChange, onBorderColorChange, onOutlineColorChange, onSetCSS, borderPosition, borderStyleControlPreference, 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 handleSideChange = (newSide: BorderSideOption) => {\n setSelectedSide(newSide)\n\n if (newSide === 'Custom') return\n\n if (newSide === 'All') {\n // Set all sides to the max width across all sides\n const maxWidth = Math.max(\n ...BORDER_SIDES.map((s) => (border[`border${s}Width` as keyof BorderProperties] as CSSPropertyValue).numericValue),\n )\n const value: CSSPropertyValue = { numericValue: maxWidth, unit: 'px', raw: `${maxWidth}px` }\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n changes.push([`border${s}Width` as BorderPropertyKey, value])\n }\n onBatchChange(changes)\n return\n }\n\n // Specific side: set that side to currentWidth, zero out the rest\n const sideWidth = (border[`border${newSide}Width` as keyof BorderProperties] as CSSPropertyValue).numericValue\n const width = currentWidth ?? sideWidth ?? 1\n const changes: Array<[BorderPropertyKey, BorderProperties[BorderPropertyKey]]> = []\n for (const s of BORDER_SIDES) {\n const value: CSSPropertyValue = s === newSide\n ? { numericValue: width, unit: 'px', raw: `${width}px` }\n : { numericValue: 0, unit: 'px', raw: '0px' }\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 const currentStyleLabel = BORDER_STYLE_OPTIONS.find((o) => o.value === currentStyle)?.label ?? currentStyle\n\n return (\n <div className=\"space-y-2\">\n {/* Row 1: Position + Style + Width + Side */}\n <div className=\"flex items-center gap-1.5\">\n <SimpleSelect\n value={borderPosition}\n onValueChange={(val) => onPositionChange(val as BorderPosition)}\n options={BORDER_POSITION_OPTIONS}\n triggerClassName=\"min-w-0 flex-1\"\n />\n\n <Tip label={isOutline ? 'Outline width' : 'Border width'}>\n <div className={cn(borderStyleControlPreference === 'icon' && 'min-w-0 flex-1')}>\n <NumberInput\n min={0}\n step={0.5}\n value={typeof currentWidth === 'number' ? Math.round(currentWidth * 100) / 100 : null}\n placeholder={currentWidth === null ? 'mixed' : undefined}\n onValueChange={handleAllWidthChange}\n className={cn(\n 'h-7 px-2 text-center text-xs tabular-nums',\n borderStyleControlPreference === 'icon' ? 'w-full' : 'w-11',\n )}\n />\n </div>\n </Tip>\n\n <SimpleSelect\n value={currentStyle}\n onValueChange={(val) => handleStyleChange(val as BorderStyle)}\n options={BORDER_STYLE_OPTIONS}\n popupMinWidth=\"120px\"\n >\n {borderStyleControlPreference === 'icon' ? (\n <Tip label={`Border style: ${currentStyleLabel}`}>\n <SelectTrigger className=\"flex h-7 w-auto shrink-0 items-center justify-center rounded-md border-0 px-2 text-xs text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\">\n <Settings2 className=\"size-3.5\" />\n </SelectTrigger>\n </Tip>\n ) : (\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-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\">\n <span className=\"flex items-center gap-1.5\">\n <Square className=\"size-3.5 text-muted-foreground\" />\n <span>{currentStyleLabel}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3.5 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n )}\n </SimpleSelect>\n\n {!isOutline && (\n <SimpleSelect\n value={selectedSide}\n onValueChange={(val) => handleSideChange(val as BorderSideOption)}\n options={BORDER_SIDE_OPTIONS.map((side) => ({ value: side, label: side }))}\n popupMinWidth=\"90px\"\n >\n <Tip label={`Sides: ${selectedSide}`}>\n <SelectTrigger className=\"flex h-7 w-auto shrink-0 items-center justify-center rounded-md border-0 px-2 text-xs text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\">\n {selectedSide === 'Custom' ? (\n <Grid2x2 className=\"size-3.5 text-muted-foreground\" strokeWidth={1} />\n ) : selectedSide === 'All' ? (\n <Square className=\"size-3.5 text-muted-foreground\" />\n ) : (\n <BorderSideIcon side={selectedSide} className=\"text-muted-foreground\" />\n )}\n </SelectTrigger>\n </Tip>\n </SimpleSelect>\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\n {/* Row 2: Color */}\n {activeColor && activeColorChange && (\n <div className=\"flex items-center gap-1.5\">\n <div className=\"min-w-0 flex-1\">\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 </div>\n {borderStyleControlPreference === 'icon' && <div className=\"w-[30px] shrink-0\" />}\n {!isOutline && <div className=\"w-[30px] shrink-0\" />}\n </div>\n )}\n </div>\n )\n}\n\ninterface BorderSectionProps {\n border: BorderProperties\n borderColor?: ColorValue\n outlineColor?: ColorValue\n borderStyleControlPreference: BorderStyleControlPreference\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\nexport function BorderSection({ border, borderColor, outlineColor, borderStyleControlPreference, 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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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 borderStyleControlPreference={borderStyleControlPreference}\n onPositionChange={handlePositionChange}\n outlineStyle={outlineStyleValue}\n outlineWidth={outlineWidthValue}\n />\n </ColorPickerGroup>\n ) : null}\n </CollapsibleSection>\n )\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 { Check, ChevronDown } from 'lucide-react'\nimport {\n Select,\n SelectTrigger,\n SelectIcon,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from './select'\nimport { cn } from '../cn'\n\ninterface SimpleSelectOption {\n value: string\n label: string\n}\n\ninterface SimpleSelectProps {\n value: string\n onValueChange: (value: string) => void\n options: SimpleSelectOption[]\n popupMinWidth?: string\n triggerClassName?: string\n itemClassName?: string\n children?: React.ReactNode\n icon?: React.ReactNode\n label?: string\n}\n\nfunction SimpleSelect({\n value,\n onValueChange,\n options,\n popupMinWidth = '100px',\n triggerClassName,\n itemClassName,\n children,\n icon,\n label,\n}: SimpleSelectProps) {\n const defaultItemClass = '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 return (\n <Select value={value} onValueChange={(val) => val && onValueChange(val)}>\n {children ?? (\n <SelectTrigger className={cn(\n 'flex h-7 items-center justify-between rounded-md border-0 bg-muted px-2 text-xs hover:bg-muted-foreground/10 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n triggerClassName,\n )}>\n <span className=\"flex items-center gap-2\">\n {icon}\n <span>{label ?? options.find((o) => o.value === value)?.label ?? value}</span>\n </span>\n <SelectIcon>\n <ChevronDown className=\"size-3.5 text-muted-foreground\" />\n </SelectIcon>\n </SelectTrigger>\n )}\n <SelectPortal>\n <SelectPositioner sideOffset={4} className=\"z-[99999]\">\n <SelectPopup className={cn(\n '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 )} style={{ minWidth: popupMinWidth }}>\n {options.map((option) => (\n <SelectItem\n key={option.value}\n value={option.value}\n className={itemClassName ?? defaultItemClass}\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}\n\nexport { SimpleSelect }\nexport type { SimpleSelectOption, SimpleSelectProps }\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 type { ColorValue } from '../types'\nimport { formatColorValue } from '../ui/color-utils'\nimport { ColorPickerPopover, ColorPickerGroup } from '../ui/color-picker'\nimport {\n Paintbrush,\n Square,\n Focus,\n Type,\n} from 'lucide-react'\n\ninterface ColorInputProps {\n id?: string\n label: string\n icon: React.ReactNode\n value: ColorValue\n onChange: (value: ColorValue) => void\n}\n\nexport function 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\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\nexport function 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}\n","import * as React from 'react'\nimport { formatColorValue } from '../ui/color-utils'\nimport { ColorPickerPopover } from '../ui/color-picker'\nimport { createDefaultShadowLayer, parseShadowLayers, serializeShadowLayers, type EditableShadowLayer } from '../shadow-utils'\nimport { NumberInput, Tip, CollapsibleSection } from './shared'\nimport {\n Plus,\n Minus,\n} from 'lucide-react'\n\nexport function ShadowField({\n label,\n value,\n onChange,\n}: {\n label: string\n value: number\n onChange: (value: number) => void\n}) {\n return (\n <div className=\"relative\">\n <span className=\"pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-xs text-muted-foreground\">{label}</span>\n <NumberInput\n value={value}\n onValueChange={onChange}\n className=\"h-7 pl-7 pr-2 text-xs tabular-nums\"\n />\n </div>\n )\n}\n\nexport function ShadowLayerEditor({\n layer,\n index,\n onChange,\n onRemoveLayer,\n}: {\n layer: EditableShadowLayer\n index: number\n onChange: (next: EditableShadowLayer) => void\n onRemoveLayer: () => void\n}) {\n const [hexInput, setHexInput] = React.useState(layer.color.hex)\n const [alphaInput, setAlphaInput] = React.useState(String(layer.color.alpha))\n\n React.useEffect(() => {\n setHexInput(layer.color.hex)\n setAlphaInput(String(layer.color.alpha))\n }, [layer.color.hex, layer.color.alpha])\n\n return (\n <div className=\"space-y-2\">\n <div className=\"flex items-center gap-1\">\n <div className=\"grid flex-1 grid-cols-4 gap-2\">\n <ShadowField label=\"X\" value={layer.x} onChange={(x) => onChange({ ...layer, x })} />\n <ShadowField label=\"Y\" value={layer.y} onChange={(y) => onChange({ ...layer, y })} />\n <Tip label=\"Blur\">\n <div>\n <ShadowField label=\"B\" value={layer.blur} onChange={(blur) => onChange({ ...layer, blur: Math.max(0, blur) })} />\n </div>\n </Tip>\n <Tip label=\"Spread\">\n <div>\n <ShadowField label=\"S\" value={layer.spread} onChange={(spread) => onChange({ ...layer, spread })} />\n </div>\n </Tip>\n </div>\n <Tip label=\"Remove shadow layer\">\n <button\n type=\"button\"\n className=\"flex size-7 shrink-0 items-center justify-center rounded-md text-muted-foreground hover:bg-muted-foreground/10 hover:text-foreground\"\n onClick={onRemoveLayer}\n >\n <Minus className=\"size-3.5\" />\n </button>\n </Tip>\n </div>\n\n <div className=\"flex items-center gap-1\">\n <div className=\"flex h-7 flex-1 items-center rounded-md border-0 bg-muted\">\n <div className=\"ml-1\">\n <ColorPickerPopover id={`shadow-color-${index}`} value={layer.color} onChange={(color) => onChange({ ...layer, color })}>\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: `#${layer.color.hex}` }}\n />\n </ColorPickerPopover>\n </div>\n <input\n type=\"text\"\n value={hexInput}\n onChange={(event) => {\n const cleaned = event.target.value.replace('#', '').toUpperCase()\n if (!/^[0-9A-F]{0,6}$/.test(cleaned)) return\n setHexInput(cleaned)\n if (cleaned.length === 6) {\n onChange({\n ...layer,\n color: {\n ...layer.color,\n hex: cleaned,\n raw: formatColorValue({ ...layer.color, hex: cleaned, raw: '' }),\n },\n })\n }\n }}\n onBlur={() => setHexInput(layer.color.hex)}\n className=\"h-full w-[68px] bg-transparent px-2 font-mono text-xs uppercase outline-none\"\n maxLength={6}\n placeholder=\"000000\"\n />\n <span className=\"text-xs text-muted-foreground\">/</span>\n <input\n type=\"number\"\n value={alphaInput}\n onChange={(event) => {\n setAlphaInput(event.target.value)\n const parsed = parseInt(event.target.value, 10)\n if (Number.isNaN(parsed)) return\n const clamped = Math.max(0, Math.min(100, parsed))\n onChange({\n ...layer,\n color: {\n ...layer.color,\n alpha: clamped,\n raw: formatColorValue({ ...layer.color, alpha: clamped, raw: '' }),\n },\n })\n }}\n onBlur={() => setAlphaInput(String(layer.color.alpha))}\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 className=\"size-7 shrink-0\" />\n </div>\n </div>\n )\n}\n\ninterface ShadowSectionProps {\n boxShadow?: string\n onSetCSS?: (properties: Record<string, string>) => void\n pendingStyles?: Record<string, string>\n}\n\nexport function ShadowSection({ boxShadow, onSetCSS, pendingStyles }: ShadowSectionProps) {\n const effectiveShadow = (pendingStyles?.['box-shadow'] ?? boxShadow ?? 'none').trim()\n const parsedLayers = React.useMemo(() => parseShadowLayers(effectiveShadow), [effectiveShadow])\n const [layers, setLayers] = React.useState<EditableShadowLayer[]>(parsedLayers)\n const hasShadow = layers.length > 0\n\n React.useEffect(() => {\n setLayers(parsedLayers)\n }, [parsedLayers])\n\n const commitLayers = (nextLayers: EditableShadowLayer[]) => {\n setLayers(nextLayers)\n if (!onSetCSS) return\n onSetCSS({ 'box-shadow': serializeShadowLayers(nextLayers) })\n }\n\n const updateLayer = (index: number, nextLayer: EditableShadowLayer) => {\n const nextLayers = layers.map((layer, layerIndex) => (layerIndex === index ? nextLayer : layer))\n commitLayers(nextLayers)\n }\n\n const addLayer = () => {\n const nextLayers = [...layers, createDefaultShadowLayer(layers.length)]\n commitLayers(nextLayers)\n }\n\n const removeLayer = (index: number) => {\n const nextLayers = layers.filter((_, layerIndex) => layerIndex !== index)\n commitLayers(nextLayers)\n }\n\n const headerActions = (\n <div className=\"flex items-center gap-1\">\n <Tip label={hasShadow ? 'Add shadow layer' : 'Add shadow'}>\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={addLayer}\n >\n <Plus className=\"size-3.5\" />\n </button>\n </Tip>\n </div>\n )\n\n return (\n <CollapsibleSection title=\"Shadow\" actions={headerActions}>\n {hasShadow ? (\n <div className=\"space-y-4\">\n {layers.map((layer, index) => (\n <ShadowLayerEditor\n key={`shadow-layer-${index}`}\n layer={layer}\n index={index}\n onChange={(nextLayer) => updateLayer(index, nextLayer)}\n onRemoveLayer={() => removeLayer(index)}\n />\n ))}\n </div>\n ) : null}\n </CollapsibleSection>\n )\n}\n","import type { ColorValue } from './types'\nimport { formatColorValue } from './ui/color-utils'\nimport { parseColorValue } from './utils'\n\nconst TAILWIND_SHADOW_PRESETS = [\n { x: 0, y: 1, blur: 3, spread: 0, alpha: 10 },\n { x: 0, y: 4, blur: 6, spread: -1, alpha: 10 },\n] as const\n\nexport interface EditableShadowLayer {\n x: number\n y: number\n blur: number\n spread: number\n inset: boolean\n color: ColorValue\n}\n\nexport function createDefaultShadowLayer(index: number): EditableShadowLayer {\n const preset = index === 0 ? TAILWIND_SHADOW_PRESETS[0] : TAILWIND_SHADOW_PRESETS[1]\n return {\n x: preset.x,\n y: preset.y,\n blur: preset.blur,\n spread: preset.spread,\n inset: false,\n color: { hex: '000000', alpha: preset.alpha, raw: '' },\n }\n}\n\nfunction splitPreservingParens(input: string, isSeparator: (char: string) => boolean): string[] {\n const parts: string[] = []\n let current = ''\n let depth = 0\n\n for (const char of input.trim()) {\n if (char === '(') {\n depth += 1\n current += char\n } else if (char === ')') {\n depth = Math.max(0, depth - 1)\n current += char\n } else if (depth === 0 && isSeparator(char)) {\n const part = current.trim()\n if (part) parts.push(part)\n current = ''\n } else {\n current += char\n }\n }\n\n const tail = current.trim()\n if (tail) parts.push(tail)\n return parts\n}\n\nexport function splitShadowLayers(value: string): string[] {\n const trimmed = value.trim()\n if (!trimmed || trimmed === 'none') return []\n return splitPreservingParens(trimmed, (char) => char === ',')\n}\n\nfunction tokenizeShadowLayer(layer: string): string[] {\n return splitPreservingParens(layer, (char) => /\\s/.test(char))\n}\n\nfunction parseLengthToken(token: string): number | null {\n const match = token.match(/^(-?(?:\\d+\\.?\\d*|\\.\\d+))(px)?$/i)\n if (!match) return null\n\n const numeric = parseFloat(match[1])\n if (!Number.isFinite(numeric)) return null\n\n // Unitless zero is valid in box-shadow and should be treated like 0px.\n if (match[2] || numeric === 0) return numeric\n return null\n}\n\nfunction formatShadowNumber(value: number): string {\n return String(Math.round(value * 100) / 100)\n}\n\nexport function parseShadowLayer(layer: string, fallback: EditableShadowLayer): EditableShadowLayer {\n const trimmed = layer.trim()\n if (!trimmed) return fallback\n\n const tokens = tokenizeShadowLayer(trimmed)\n let inset = false\n const lengths: number[] = []\n let colorToken: string | null = null\n\n for (const token of tokens) {\n if (token.toLowerCase() === 'inset') {\n inset = true\n continue\n }\n\n const length = parseLengthToken(token)\n if (length !== null) {\n lengths.push(length)\n continue\n }\n\n if (!colorToken) {\n colorToken = token\n }\n }\n\n const [x, y, blur, spread] = [\n lengths[0] ?? fallback.x,\n lengths[1] ?? fallback.y,\n lengths[2] ?? 0,\n lengths[3] ?? 0,\n ]\n\n return {\n x,\n y,\n blur,\n spread,\n inset,\n color: colorToken ? parseColorValue(colorToken) : fallback.color,\n }\n}\n\nexport function parseShadowLayers(value: string): EditableShadowLayer[] {\n const rawLayers = splitShadowLayers(value)\n if (rawLayers.length === 0) return []\n return rawLayers.map((layer, index) => parseShadowLayer(layer, createDefaultShadowLayer(index)))\n}\n\nexport function serializeShadowLayer(layer: EditableShadowLayer): string {\n const colorValue = formatColorValue({ ...layer.color, raw: '' })\n const prefix = layer.inset ? 'inset ' : ''\n return `${prefix}${formatShadowNumber(layer.x)}px ${formatShadowNumber(layer.y)}px ${formatShadowNumber(layer.blur)}px ${formatShadowNumber(layer.spread)}px ${colorValue}`\n}\n\nexport function serializeShadowLayers(layers: EditableShadowLayer[]): string {\n if (layers.length === 0) return 'none'\n return layers.map(serializeShadowLayer).join(', ')\n}\n","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport { SimpleSelect } from '../ui/simple-select'\nimport type { TypographyPropertyKey, TypographyProperties, CSSPropertyValue } from '../types'\nimport { NumberInput, Tip } from './shared'\nimport {\n Type,\n AlignLeft,\n AlignCenter,\n AlignRight,\n AlignVerticalJustifyStart,\n AlignVerticalJustifyCenter,\n AlignVerticalJustifyEnd,\n ALargeSmall,\n WrapText,\n AArrowUp,\n LetterText,\n} from 'lucide-react'\n\nexport const 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\nexport const 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\nexport function 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 <SimpleSelect\n value={typography.fontFamily}\n onValueChange={(val) => onUpdate('fontFamily', val)}\n options={FONT_FAMILIES}\n label={getFontFamilyLabel(typography.fontFamily)}\n icon={<Type className=\"size-3.5 text-muted-foreground\" />}\n triggerClassName=\"w-full\"\n popupMinWidth=\"180px\"\n itemClassName=\"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\n <SimpleSelect\n value={typography.fontWeight}\n onValueChange={(val) => onUpdate('fontWeight', val)}\n options={FONT_WEIGHTS}\n label={getFontWeightLabel(typography.fontWeight)}\n icon={<ALargeSmall className=\"size-3.5 text-muted-foreground\" />}\n triggerClassName=\"w-full\"\n popupMinWidth=\"140px\"\n itemClassName=\"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\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","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport { Tip } from './shared'\nimport { cn } from '../cn'\nimport { X, ChevronUp, ChevronDown } from 'lucide-react'\n\nconst panelBarBaseClass = 'flex h-11 shrink-0 items-center border-border/50 bg-background pl-3 pr-2'\n\nexport interface PanelHeaderProps {\n elementInfo: {\n tagName: string\n id: string | null\n parentElement: HTMLElement | null | boolean\n hasChildren: boolean\n }\n isDraggable: boolean\n onClose?: () => void\n onSelectParent?: () => void\n onSelectChild?: () => void\n onPointerDown?: (e: React.PointerEvent) => void\n onPointerMove?: (e: React.PointerEvent) => void\n onPointerUp?: (e: React.PointerEvent) => void\n onPointerCancel?: (e: React.PointerEvent) => void\n}\n\nexport function PanelHeader({\n elementInfo,\n isDraggable,\n onClose,\n onSelectParent,\n onSelectChild,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n}: PanelHeaderProps) {\n return (\n <div\n className={cn(\n panelBarBaseClass,\n 'gap-2 border-b',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n >\n <div className=\"min-w-0 flex-1\">\n <code className=\"text-xs font-medium text-foreground\">\n <{elementInfo.tagName}>\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 <span className={!elementInfo.parentElement ? 'cursor-not-allowed' : undefined}>\n <Tip label=\"Select Parent\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectParent}\n disabled={!elementInfo.parentElement}\n aria-label=\"Select parent element\"\n className=\"size-7\"\n >\n <ChevronUp className=\"size-3.5\" />\n </Button>\n </Tip>\n </span>\n )}\n {onSelectChild && (\n <span className={!elementInfo.hasChildren ? 'cursor-not-allowed' : undefined}>\n <Tip label=\"Select Child\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={onSelectChild}\n disabled={!elementInfo.hasChildren}\n aria-label=\"Select child element\"\n className=\"size-7\"\n >\n <ChevronDown className=\"size-3.5\" />\n </Button>\n </Tip>\n </span>\n )}\n {onClose && (\n <>\n <div className=\"mx-0.5 h-4 w-px bg-border\" />\n <Button variant=\"ghost\" size=\"icon\" aria-label=\"Close panel\" className=\"size-7\" onClick={onClose}>\n <X className=\"size-3.5\" />\n </Button>\n </>\n )}\n </div>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport { Tip } from './shared'\nimport { cn } from '../cn'\nimport { X, Copy, Check, Send } from 'lucide-react'\n\nconst panelBarBaseClass = 'flex h-11 shrink-0 items-center border-border/50 bg-background pl-3 pr-2'\n\nexport interface PanelFooterProps {\n isDraggable: boolean\n canTriggerSend: boolean\n onExportEdits: () => Promise<boolean>\n onSendToAgent: () => Promise<boolean>\n onPointerDown?: (e: React.PointerEvent) => void\n onPointerMove?: (e: React.PointerEvent) => void\n onPointerUp?: (e: React.PointerEvent) => void\n onPointerCancel?: (e: React.PointerEvent) => void\n}\n\nexport function PanelFooter({\n isDraggable,\n canTriggerSend,\n onExportEdits,\n onSendToAgent,\n onPointerDown,\n onPointerMove,\n onPointerUp,\n onPointerCancel,\n}: PanelFooterProps) {\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\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 return (\n <div\n className={cn(\n panelBarBaseClass,\n 'gap-1 border-t',\n isDraggable && 'cursor-grab active:cursor-grabbing'\n )}\n onPointerDown={onPointerDown}\n onPointerMove={onPointerMove}\n onPointerUp={onPointerUp}\n onPointerCancel={onPointerCancel}\n >\n <div className=\"flex-1\" />\n <Tip label=\"Copy edits\">\n <Button\n variant=\"ghost\"\n size=\"icon\"\n onClick={handleCopy}\n aria-label={copyError ? 'Copy failed' : copied ? 'Copied' : 'Copy edits'}\n className=\"size-7\"\n >\n {copyError ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : copied ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : (\n <Copy className=\"size-3.5\" />\n )}\n </Button>\n </Tip>\n <span className={!canTriggerSend || sendStatus === 'sending' ? 'cursor-not-allowed' : undefined}>\n <Tip label=\"Apply changes via agent\">\n <Button\n variant=\"outline\"\n size=\"icon\"\n onClick={handleSendToAgent}\n disabled={!canTriggerSend || sendStatus === 'sending'}\n aria-label={sendStatus === 'offline' ? 'Send failed' : sendStatus === 'sent' ? 'Changes sent' : 'Apply changes via agent'}\n className=\"size-7\"\n >\n {sendStatus === 'offline' ? (\n <X className=\"size-3.5 text-red-500\" />\n ) : sendStatus === 'sent' ? (\n <Check className=\"size-3.5 text-green-500\" />\n ) : sendStatus === 'sending' ? (\n <Send className=\"size-3.5 animate-pulse\" />\n ) : (\n <Send className=\"size-3.5\" />\n )}\n </Button>\n </Tip>\n </span>\n </div>\n )\n}\n","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport type { SpacingPropertyKey, CSSPropertyValue } from '../types'\nimport { NumberInput, Tip } from './shared'\nimport {\n ArrowRight,\n ArrowDown,\n ArrowUp,\n ArrowLeft,\n MoveHorizontal,\n MoveVertical,\n Columns2,\n Grid2x2,\n} from 'lucide-react'\n\ninterface SpacingInputsProps {\n prefix: 'padding' | 'margin'\n values: {\n top: CSSPropertyValue\n right: CSSPropertyValue\n bottom: CSSPropertyValue\n left: CSSPropertyValue\n }\n onChange: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n}\n\nexport function SpacingInputs({ prefix, values, onChange }: SpacingInputsProps) {\n const [individual, setIndividual] = React.useState(false)\n const allowNegative = prefix === 'margin'\n\n const handleChange = (sides: ('top' | 'right' | 'bottom' | 'left')[], numericValue: number) => {\n const clamped = allowNegative ? numericValue : Math.max(0, numericValue)\n const newValue: CSSPropertyValue = {\n numericValue: clamped,\n unit: 'px',\n raw: `${clamped}px`,\n }\n\n for (const side of sides) {\n const key = `${prefix}${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 : null\n const verticalValue =\n values.top.numericValue === values.bottom.numericValue\n ? values.top.numericValue\n : null\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 placeholder={horizontalValue === null ? 'mixed' : undefined}\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 placeholder={verticalValue === null ? 'mixed' : undefined}\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","import * as React from 'react'\nimport { Button } from '../ui/button'\nimport {\n Select,\n SelectTrigger,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from '../ui/select'\nimport type { SizingValue, SizingMode, SizingPropertyKey } from '../types'\nimport { useDirectEditState } from '../provider'\nimport { Tip, selectOnFocus } from './shared'\nimport {\n Check,\n ChevronsUpDown,\n Link,\n Unlink,\n} from 'lucide-react'\n\nexport const 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\nexport const DISTRIBUTE_MODES = ['fixed', 'space-between', 'space-around', 'space-evenly'] as const\nexport type DistributeMode = typeof DISTRIBUTE_MODES[number]\nexport const DISTRIBUTE_LABELS: Record<DistributeMode, string> = {\n fixed: 'Fixed',\n 'space-between': 'Between',\n 'space-around': 'Around',\n 'space-evenly': 'Evenly',\n}\n\nexport function 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\nexport function 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 focus-within:outline-none focus-within:ring-1 focus-within:ring-inset focus-within:ring-ring\">\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 focus-visible:outline-none\">\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\nexport function SizingInputs({ width, height, onWidthChange, onHeightChange }: SizingInputsProps) {\n const { selectedElement } = useDirectEditState()\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","import * as React from 'react'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n createTooltipHandle,\n} from '../ui/tooltip'\nimport { cn } from '../cn'\n\ninterface AlignmentGridProps {\n justifyContent: string\n alignItems: string\n onChange: (justify: string, align: string) => void\n}\n\nexport function 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 h-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 <TooltipContent side=\"bottom\" sideOffset={8} className=\"flex flex-col\">\n justify: {payload?.justify}, align: {payload?.align}\n </TooltipContent>\n )}\n </Tooltip>\n </TooltipProvider>\n )\n}\n","import * as React from 'react'\nimport { Tip, CollapsibleSection } from './shared'\nimport { cn } from '../cn'\nimport {\n Select,\n SelectTrigger,\n SelectPortal,\n SelectPositioner,\n SelectPopup,\n SelectItem,\n SelectItemIndicator,\n SelectItemText,\n} from '../ui/select'\nimport { SpacingInputs } from './spacing-inputs'\nimport { SizingInputs, SizingFixedInput, DISTRIBUTE_MODES, DISTRIBUTE_LABELS, type DistributeMode } from './sizing-inputs'\nimport { AlignmentGrid } from './alignment-grid'\nimport type { CSSPropertyValue, SpacingPropertyKey, SizingValue, SizingPropertyKey } from '../types'\nimport {\n Check,\n ArrowRight,\n ArrowDown,\n MoveHorizontal,\n ChevronsUpDown,\n Plus,\n Minus,\n} from 'lucide-react'\n\nexport interface LayoutSectionProps {\n elementInfo: {\n isFlexContainer: boolean\n }\n computedFlex: {\n flexDirection: 'row' | 'row-reverse' | 'column' | 'column-reverse'\n justifyContent: string\n alignItems: string\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 computedSizing: {\n width: SizingValue\n height: SizingValue\n } | null\n onToggleFlex: () => void\n onUpdateFlex: (key: 'flexDirection' | 'justifyContent' | 'alignItems', value: string) => void\n onUpdateSpacing: (key: SpacingPropertyKey, value: CSSPropertyValue) => void\n onUpdateSizing: (key: SizingPropertyKey, value: SizingValue) => void\n sectionRef: React.RefObject<HTMLDivElement>\n}\n\nexport function LayoutSection({\n elementInfo,\n computedFlex,\n computedSpacing,\n computedSizing,\n onToggleFlex,\n onUpdateFlex,\n onUpdateSpacing,\n onUpdateSizing,\n sectionRef,\n}: LayoutSectionProps) {\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 return (\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 focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring\"\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={sectionRef}>\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 focus-within:outline-none focus-within:ring-1 focus-within:ring-inset focus-within:ring-ring\">\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 focus-visible:outline-none\">\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 <SpacingInputs\n prefix=\"padding\"\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 <SpacingInputs\n prefix=\"margin\"\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}\n","import * as React from 'react'\nimport { clamp } from './utils'\n\nexport const PANEL_WIDTH = 300\nexport const PANEL_HEIGHT = 420\n\nconst STORAGE_KEY = 'direct-edit-panel-position'\nconst PANEL_MARGIN = 8\n\ninterface Position {\n x: number\n y: number\n}\n\nfunction getPanelBounds() {\n const availableX = window.innerWidth - PANEL_WIDTH\n const availableY = window.innerHeight - PANEL_HEIGHT\n const minX = availableX <= 0 ? 0 : Math.min(PANEL_MARGIN, availableX)\n const minY = availableY <= 0 ? 0 : Math.min(PANEL_MARGIN, availableY)\n const maxX = availableX <= 0 ? 0 : Math.max(minX, availableX - PANEL_MARGIN)\n const maxY = availableY <= 0 ? 0 : Math.max(minY, availableY - PANEL_MARGIN)\n\n return { minX, maxX, minY, maxY }\n}\n\nfunction normalizePosition(position: Position): Position {\n const { minX, maxX, minY, maxY } = getPanelBounds()\n return {\n x: clamp(position.x, minX, maxX),\n y: clamp(position.y, minY, maxY),\n }\n}\n\nfunction snapToEdge(position: Position): Position {\n const { minX, maxX, minY, maxY } = getPanelBounds()\n const centerX = position.x + PANEL_WIDTH / 2\n const centerY = position.y + PANEL_HEIGHT / 2\n const vw = window.innerWidth\n const vh = window.innerHeight\n\n const distances = {\n top: centerY,\n bottom: vh - centerY,\n left: centerX,\n right: vw - centerX,\n }\n\n let nearest: 'top' | 'bottom' | 'left' | 'right' = 'right'\n let min = Infinity\n for (const [edge, dist] of Object.entries(distances) as ['top' | 'bottom' | 'left' | 'right', number][]) {\n if (dist < min) {\n min = dist\n nearest = edge\n }\n }\n\n const freeX = clamp(position.x, minX, maxX)\n const freeY = clamp(position.y, minY, maxY)\n\n switch (nearest) {\n case 'top':\n return { x: freeX, y: minY }\n case 'bottom':\n return { x: freeX, y: maxY }\n case 'left':\n return { x: minX, y: freeY }\n case 'right':\n return { x: maxX, y: freeY }\n }\n}\n\nfunction parseStoredPosition(raw: string): Position | null {\n const parsed: unknown = JSON.parse(raw)\n if (!parsed || typeof parsed !== 'object') return null\n\n const candidate = parsed as { x?: unknown; y?: unknown }\n if (typeof candidate.x !== 'number' || !Number.isFinite(candidate.x)) return null\n if (typeof candidate.y !== 'number' || !Number.isFinite(candidate.y)) return null\n return { x: candidate.x, y: candidate.y }\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 const parsed = parseStoredPosition(stored)\n if (parsed) {\n return snapToEdge(parsed)\n }\n }\n } catch {\n // Fall through to default\n }\n\n return snapToEdge({\n x: window.innerWidth - PANEL_WIDTH - PANEL_MARGIN,\n y: window.innerHeight - PANEL_HEIGHT - PANEL_MARGIN,\n })\n}\n\nexport function usePanelPosition() {\n const [position, setPosition] = React.useState<Position>(getInitialPosition)\n const [isDragging, setIsDragging] = React.useState(false)\n const [isSnapping, setIsSnapping] = React.useState(false)\n const [dragOffset, setDragOffset] = React.useState<Position>({ x: 0, y: 0 })\n const snapTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const panelRef = React.useRef<HTMLDivElement>(null)\n const positionRef = React.useRef(position)\n\n React.useEffect(() => {\n positionRef.current = position\n }, [position])\n\n const handlePointerDown = (e: React.PointerEvent) => {\n if (!panelRef.current) return\n\n // Don't start drag when clicking interactive elements (buttons, inputs, etc.)\n const target = e.target as HTMLElement\n if (target.closest('button, a, input, select, textarea, [role=\"button\"]')) 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 try {\n e.currentTarget.setPointerCapture(e.pointerId)\n } catch {\n // Ignore unsupported pointer capture environments.\n }\n }\n\n const handlePointerMove = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n const next = normalizePosition({\n x: e.clientX - dragOffset.x,\n y: e.clientY - dragOffset.y,\n })\n positionRef.current = next\n setPosition(next)\n }\n\n const handlePointerUp = (e: React.PointerEvent) => {\n if (!isDragging) return\n\n setIsDragging(false)\n try {\n e.currentTarget.releasePointerCapture(e.pointerId)\n } catch {\n // Ignore unsupported pointer capture environments.\n }\n\n const snapped = snapToEdge(positionRef.current)\n positionRef.current = snapped\n setPosition(snapped)\n setIsSnapping(true)\n\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n snapTimerRef.current = setTimeout(() => {\n snapTimerRef.current = null\n setIsSnapping(false)\n }, 350)\n\n try { localStorage.setItem(STORAGE_KEY, JSON.stringify(snapped)) } catch {}\n }\n\n const handlePointerCancel = (e: React.PointerEvent) => {\n if (!isDragging) return\n setIsDragging(false)\n try {\n e.currentTarget.releasePointerCapture(e.pointerId)\n } catch {\n // Ignore unsupported pointer capture environments.\n }\n }\n\n React.useEffect(() => {\n function handleResize() {\n setPosition((prev) => {\n const next = snapToEdge(prev)\n positionRef.current = next\n return next\n })\n }\n\n window.addEventListener('resize', handleResize)\n return () => window.removeEventListener('resize', handleResize)\n }, [])\n\n React.useEffect(() => {\n return () => {\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n }\n }, [])\n\n return {\n position,\n isDragging,\n isSnapping,\n panelRef,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n }\n}\n","import * as React from 'react'\nimport { createPortal } from 'react-dom'\nimport { usePortalContainer } from './portal-container'\nimport { useDirectEditState, useDirectEditActions } from './provider'\nimport { useRulersVisible } from './rulers-overlay'\nimport { cn } from './cn'\nimport { useToolbarDock } from './use-toolbar-dock'\nimport { MousePointer2, Ruler, Command, ArrowBigUp, MessageSquare, X } from 'lucide-react'\nimport type { ActiveTool, Theme, SessionItem } from './types'\nimport {\n Tooltip,\n TooltipProvider,\n TooltipTrigger,\n TooltipContent,\n} from './ui/tooltip'\nimport { EditsPopover } from './toolbar/edits-popover'\nimport { SettingsPopover } from './toolbar/settings-popover'\nimport { ZoomPopover } from './toolbar/zoom-popover'\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 onGetSessionItems?: () => SessionItem[]\n onExportAllEdits?: () => Promise<boolean>\n onSendAllToAgents?: () => Promise<boolean>\n onClearSessionEdits?: () => void\n onRemoveSessionEdit?: (element: HTMLElement) => void\n onDeleteComment?: (id: string) => void\n className?: string\n canvasActive?: boolean\n canvasZoom?: number\n onToggleCanvas?: () => void\n onSetCanvasZoom?: (zoom: number) => void\n onZoomTo100?: () => void\n onFitToViewport?: () => void\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 onGetSessionItems,\n onExportAllEdits,\n onSendAllToAgents,\n onClearSessionEdits,\n onRemoveSessionEdit,\n onDeleteComment,\n className,\n canvasActive = false,\n canvasZoom = 1,\n onToggleCanvas,\n onSetCanvasZoom,\n onZoomTo100,\n onFitToViewport,\n}: DirectEditToolbarInnerProps) {\n const container = usePortalContainer()\n const toolbarRef = React.useRef<HTMLDivElement>(null)\n const { dockedEdge, isDragging, isSnapping, style: dockStyle, predictSize, handlePointerDown, handlePointerMove, handlePointerUp, handlePointerCancel } = useToolbarDock(toolbarRef)\n const isVertical = dockedEdge === 'left' || dockedEdge === 'right'\n const [activePopover, setActivePopover] = React.useState<'edits' | 'settings' | 'zoom' | null>(null)\n\n // Cache toolbar sizes per edge + state so prediction stays accurate after re-docking.\n const sizeCacheRef = React.useRef<Record<string, { w: number; h: number }>>({})\n\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n const key = `${dockedEdge}:${editModeActive ? 'expanded' : 'collapsed'}`\n // Cache size after transition settles\n const timer = setTimeout(() => {\n const rect = el.getBoundingClientRect()\n sizeCacheRef.current[key] = { w: rect.width, h: rect.height }\n }, 350)\n return () => clearTimeout(timer)\n }, [editModeActive, dockedEdge])\n\n // On toggle, immediately predict the final position so expand + move run in parallel\n const prevEditModeRef = React.useRef(editModeActive)\n React.useEffect(() => {\n if (prevEditModeRef.current === editModeActive) return\n prevEditModeRef.current = editModeActive\n const target = sizeCacheRef.current[`${dockedEdge}:${editModeActive ? 'expanded' : 'collapsed'}`]\n if (target) {\n predictSize(target.w, target.h)\n }\n }, [editModeActive, dockedEdge, predictSize])\n\n // Close active popover when toolbar starts dragging\n React.useEffect(() => {\n if (isDragging) setActivePopover(null)\n }, [isDragging])\n\n // Do not leave popovers open when design mode is turned off.\n React.useEffect(() => {\n if (!editModeActive) setActivePopover(null)\n }, [editModeActive])\n\n const tooltipSide = dockedEdge === 'bottom' ? 'top'\n : dockedEdge === 'top' ? 'bottom'\n : dockedEdge === 'left' ? 'right' : 'left'\n const [isMac] = React.useState(() => (\n typeof navigator !== 'undefined' ? (navigator.platform?.includes('Mac') ?? false) : false\n ))\n\n const kbdClass = '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',\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-[color,background-color] duration-150 ease-out',\n editModeActive && 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: 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 'grid place-items-center overflow-hidden',\n isVertical\n ? (editModeActive ? 'mt-1 grid-rows-[1fr]' : 'mt-0 grid-rows-[0fr]')\n : (editModeActive ? 'ml-1 grid-cols-[1fr]' : 'ml-0 grid-cols-[0fr]')\n )}\n style={{\n transitionProperty: 'grid-template-columns, grid-template-rows, margin',\n transitionDuration: '200ms',\n transitionTimingFunction: 'cubic-bezier(0.25, 1, 0.5, 1)',\n transitionDelay: editModeActive ? '0ms' : '80ms',\n }}\n >\n <div\n className={cn('flex gap-1 overflow-hidden', isVertical ? 'min-h-0 flex-col items-center' : 'min-w-0 flex-row items-center')}\n style={{\n filter: editModeActive ? 'blur(0px)' : 'blur(5px)',\n opacity: editModeActive ? 1 : 0,\n transitionProperty: 'filter, opacity',\n transitionDuration: '250ms, 100ms',\n transitionTimingFunction: 'cubic-bezier(0.33, 1, 0.68, 1)',\n transitionDelay: editModeActive ? '80ms' : '0ms',\n }}\n >\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 <ZoomPopover\n tooltipSide={tooltipSide}\n canvasActive={canvasActive}\n canvasZoom={canvasZoom}\n isOpen={activePopover === 'zoom'}\n onOpenChange={(open) => setActivePopover(open ? 'zoom' : null)}\n onToggleCanvas={onToggleCanvas}\n onSetCanvasZoom={onSetCanvasZoom}\n onZoomTo100={onZoomTo100}\n onFitToViewport={onFitToViewport}\n />\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 <EditsPopover\n tooltipSide={tooltipSide}\n sessionEditCount={sessionEditCount}\n isOpen={activePopover === 'edits'}\n onOpenChange={(open) => setActivePopover(open ? 'edits' : null)}\n onGetSessionItems={onGetSessionItems}\n onExportAllEdits={onExportAllEdits}\n onSendAllToAgents={onSendAllToAgents}\n onClearSessionEdits={onClearSessionEdits}\n onRemoveSessionEdit={onRemoveSessionEdit}\n onDeleteComment={onDeleteComment}\n />\n\n <SettingsPopover\n tooltipSide={tooltipSide}\n theme={theme}\n isMac={isMac}\n isOpen={activePopover === 'settings'}\n onOpenChange={(open) => setActivePopover(open ? 'settings' : null)}\n onSetTheme={onSetTheme}\n />\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 <Tooltip>\n <TooltipTrigger\n className=\"flex cursor-pointer items-center justify-center rounded-[8px] p-2 text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={onToggleEditMode}\n >\n <X className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>Close</span>\n <kbd className={kbdClass}>Esc</kbd>\n </TooltipContent>\n </Tooltip>\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 { editModeActive, activeTool, theme, sessionEditCount, canvas } = useDirectEditState()\n const {\n toggleEditMode, setActiveTool, setTheme,\n getSessionItems, exportAllEdits, sendAllSessionItemsToAgent, clearSessionEdits, removeSessionEdit, deleteComment,\n toggleCanvas, setCanvasZoom, zoomCanvasTo100, fitCanvasToViewport,\n } = useDirectEditActions()\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 onGetSessionItems={getSessionItems}\n onExportAllEdits={exportAllEdits}\n onSendAllToAgents={sendAllSessionItemsToAgent}\n onClearSessionEdits={clearSessionEdits}\n onRemoveSessionEdit={removeSessionEdit}\n onDeleteComment={deleteComment}\n canvasActive={canvas?.active ?? false}\n canvasZoom={canvas?.zoom ?? 1}\n onToggleCanvas={toggleCanvas}\n onSetCanvasZoom={setCanvasZoom}\n onZoomTo100={zoomCanvasTo100}\n onFitToViewport={fitCanvasToViewport}\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 { useDirectEditState } from './hooks'\nimport { getCanvasSnapshot, useCanvasSnapshot, getBodyOffset } from './canvas-store'\nimport { useGuidelines } from './use-guidelines'\nimport type { Guideline } from './types'\n\nconst RULER_SIZE = 20\nconst GUIDELINE_COLOR = '#FF6B6B'\nconst SNAPPED_COLOR = '#0D99FF'\nconst HIT_ZONE = 9\n\nexport function computeCanvasRulerScrollOffset(pan: number, zoom: number, bodyOffset: number): number {\n if (zoom === 0) return -pan\n return bodyOffset * (1 - 1 / zoom) - pan\n}\n\n/**\n * Compute adaptive tick intervals so major labels stay ~80px apart on screen.\n * Returns the major (labeled) interval, minor (small tick) interval, and steps per major.\n */\nfunction computeTickIntervals(zoom: number) {\n const MIN_LABEL_SPACING_PX = 80\n const rawInterval = MIN_LABEL_SPACING_PX / zoom\n\n const magnitude = Math.pow(10, Math.floor(Math.log10(rawInterval)))\n const residual = rawInterval / magnitude\n\n let nice: number\n if (residual <= 1) nice = 1\n else if (residual <= 2) nice = 2\n else if (residual <= 2.5) nice = 2.5\n else if (residual <= 5) nice = 5\n else nice = 10\n\n const major = nice * magnitude\n const stepsPerMajor = 10\n const minor = major / stepsPerMajor\n\n return { major, minor, stepsPerMajor }\n}\n\nfunction getColorSchemeQuery(): MediaQueryList | null {\n if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {\n return null\n }\n return window.matchMedia('(prefers-color-scheme: dark)')\n}\n\nfunction subscribeColorScheme(cb: () => void) {\n const mq = getColorSchemeQuery()\n if (!mq) return () => {}\n\n if (typeof mq.addEventListener === 'function') {\n mq.addEventListener('change', cb)\n return () => mq.removeEventListener('change', cb)\n }\n\n mq.addListener(cb)\n return () => mq.removeListener(cb)\n}\n\nfunction getColorScheme() {\n return getColorSchemeQuery()?.matches ?? false\n}\n\n/** Triggers canvas redraws when system color scheme changes (theme = 'system'). */\nfunction useSystemDark() {\n return React.useSyncExternalStore(subscribeColorScheme, getColorScheme, () => false)\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 zoom = 1,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n zoom?: number\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportWidth = useViewportWidth()\n const { theme } = useDirectEditState()\n const systemDark = useSystemDark()\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 computed = getComputedStyle(canvas)\n const tick = computed.getPropertyValue('color')\n const label = tick\n\n const { minor, stepsPerMajor } = computeTickIntervals(zoom)\n const midIdx = stepsPerMajor / 2\n const visibleContentWidth = width / zoom\n const startIdx = Math.floor(scrollOffset.x / minor)\n const endIdx = Math.ceil((scrollOffset.x + visibleContentWidth) / minor)\n\n for (let i = startIdx; i <= endIdx; i++) {\n const px = i * minor\n const x = (px - scrollOffset.x) * zoom\n const isMajor = i % stepsPerMajor === 0\n const isMid = !isMajor && i % midIdx === 0\n\n ctx.beginPath()\n ctx.moveTo(x, height)\n ctx.lineTo(x, height - (isMajor ? 10 : isMid ? 7 : 4))\n ctx.strokeStyle = tick\n ctx.globalAlpha = 0.6\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor) {\n ctx.globalAlpha = 1\n ctx.fillStyle = label\n ctx.font = '9px system-ui, -apple-system, sans-serif'\n ctx.textAlign = 'center'\n ctx.fillText(String(Math.round(px)), x, 9)\n }\n }\n }, [scrollOffset.x, viewportWidth, zoom, theme, systemDark])\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: 'var(--color-background)',\n borderBottom: '1px solid var(--color-border)',\n color: 'var(--color-muted-foreground)',\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 zoom = 1,\n onPointerDown,\n}: {\n scrollOffset: { x: number; y: number }\n zoom?: number\n onPointerDown: (e: React.PointerEvent) => void\n}) {\n const canvasRef = React.useRef<HTMLCanvasElement>(null)\n const viewportHeight = useViewportHeight()\n const { theme } = useDirectEditState()\n const systemDark = useSystemDark()\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 computed = getComputedStyle(canvas)\n const tick = computed.getPropertyValue('color')\n const label = tick\n\n const { minor, stepsPerMajor } = computeTickIntervals(zoom)\n const midIdx = stepsPerMajor / 2\n const visibleContentHeight = height / zoom\n const startIdx = Math.floor(scrollOffset.y / minor)\n const endIdx = Math.ceil((scrollOffset.y + visibleContentHeight) / minor)\n\n for (let i = startIdx; i <= endIdx; i++) {\n const px = i * minor\n const y = (px - scrollOffset.y) * zoom\n const isMajor = i % stepsPerMajor === 0\n const isMid = !isMajor && i % midIdx === 0\n\n ctx.beginPath()\n ctx.moveTo(width, y)\n ctx.lineTo(width - (isMajor ? 10 : isMid ? 7 : 4), y)\n ctx.strokeStyle = tick\n ctx.globalAlpha = 0.6\n ctx.lineWidth = 1\n ctx.stroke()\n\n if (isMajor) {\n ctx.save()\n ctx.globalAlpha = 1\n ctx.fillStyle = 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(Math.round(px)), 0, 0)\n ctx.restore()\n }\n }\n }, [scrollOffset.y, viewportHeight, zoom, theme, systemDark])\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: 'var(--color-background)',\n borderRight: '1px solid var(--color-border)',\n color: 'var(--color-muted-foreground)',\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 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: 'var(--color-background)',\n borderRight: '1px solid var(--color-border)',\n borderBottom: '1px solid var(--color-border)',\n zIndex: 99994,\n pointerEvents: 'auto',\n }}\n />\n )\n}\n\n// --- Guideline viewport position ---\n\nfunction computeGuidelineViewportPos(position: number, orientation: 'horizontal' | 'vertical') {\n const snap = getCanvasSnapshot()\n const zoom = snap.active ? snap.zoom : 1\n const pan = orientation === 'horizontal'\n ? (snap.active ? snap.panY : -window.scrollY)\n : (snap.active ? snap.panX : -window.scrollX)\n if (snap.active) {\n const bo = orientation === 'horizontal' ? getBodyOffset().y : getBodyOffset().x\n return bo + (position - bo + pan) * zoom\n }\n return (position + pan) * zoom\n}\n\n// --- GuidelineLine ---\n\nfunction GuidelineLine({\n guideline,\n isActive,\n isSnapped,\n dragPosition,\n onStartDrag,\n onDelete,\n}: {\n guideline: Guideline\n isActive: boolean\n isSnapped?: boolean\n dragPosition: number | null\n onStartDrag: (id: string) => void\n onDelete: (id: string) => void\n}) {\n const isHorizontal = guideline.orientation === 'horizontal'\n const lineColor = isActive && isSnapped ? SNAPPED_COLOR : GUIDELINE_COLOR\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 isDragging = isActive && dragPosition !== null\n // Compute viewport position from the latest canvas snapshot. This provides a\n // correct initial value; the imperative updateGuidelinePositions() callback\n // keeps it frame-perfect during rapid zoom/pan without React re-renders.\n const viewportPos = isDragging\n ? dragPosition\n : computeGuidelineViewportPos(guideline.position, guideline.orientation)\n const translate = isHorizontal\n ? `translateY(${viewportPos}px)`\n : `translateX(${viewportPos}px)`\n\n if (isHorizontal) {\n return (\n <div\n data-gl-pos={guideline.position}\n data-gl-orient=\"h\"\n {...(isDragging ? { 'data-gl-dragging': '' } : {})}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n right: 0,\n height: 0,\n transform: translate,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n >\n {/* Visible line */}\n <div\n data-direct-edit=\"guideline\"\n style={{ position: 'absolute', top: 0, left: 0, right: 0, height: 1, background: lineColor }}\n />\n {/* Hit zone */}\n <div\n style={{\n position: 'absolute',\n top: -Math.floor(HIT_ZONE / 2),\n left: RULER_SIZE,\n right: 0,\n height: HIT_ZONE,\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: 'absolute',\n top: 4,\n left: RULER_SIZE + 4,\n background: lineColor,\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 </div>\n )\n }\n\n // Vertical guideline\n return (\n <div\n data-gl-pos={guideline.position}\n data-gl-orient=\"v\"\n {...(isDragging ? { 'data-gl-dragging': '' } : {})}\n style={{\n position: 'fixed',\n top: 0,\n left: 0,\n bottom: 0,\n width: 0,\n transform: translate,\n zIndex: 99993,\n pointerEvents: 'none',\n }}\n >\n <div\n data-direct-edit=\"guideline\"\n style={{ position: 'absolute', left: 0, top: 0, bottom: 0, width: 1, background: lineColor }}\n />\n <div\n style={{\n position: 'absolute',\n left: -Math.floor(HIT_ZONE / 2),\n top: RULER_SIZE,\n bottom: 0,\n width: HIT_ZONE,\n cursor: 'ew-resize',\n pointerEvents: 'auto',\n }}\n onPointerDown={handlePointerDown}\n onDoubleClick={handleDoubleClick}\n />\n {isActive && (\n <div\n style={{\n position: 'absolute',\n left: 4,\n top: RULER_SIZE + 4,\n background: lineColor,\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 </div>\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 const canvas = useCanvasSnapshot()\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 isSnapped,\n scrollOffset,\n startCreate,\n startDrag,\n deleteGuideline,\n } = useGuidelines(enabled, hostElement, canvas)\n\n // Imperatively update guideline wrapper transforms for frame-perfect positioning.\n // Both this and applyTransform() run in the same macrotask (via\n // `direct-edit-canvas-change` event), so the browser composites them in a\n // single paint — no intermediate frame where body transform and guideline\n // positions are out of sync.\n React.useLayoutEffect(() => {\n if (!container || !enabled) return\n const el = container\n\n function updateGuidelinePositions() {\n const snap = getCanvasSnapshot()\n const zoom = snap.active ? snap.zoom : 1\n const panX = snap.active ? snap.panX : -window.scrollX\n const panY = snap.active ? snap.panY : -window.scrollY\n const bo = getBodyOffset()\n\n el.querySelectorAll<HTMLElement>('[data-gl-pos]').forEach((node) => {\n // Skip guidelines being dragged — React controls their transform\n if (node.hasAttribute('data-gl-dragging')) return\n const pos = Number(node.dataset.glPos)\n const orient = node.dataset.glOrient\n let vp: number\n if (snap.active) {\n vp = orient === 'h'\n ? bo.y + (pos - bo.y + panY) * zoom\n : bo.x + (pos - bo.x + panX) * zoom\n } else {\n vp = orient === 'h' ? (pos + panY) * zoom : (pos + panX) * zoom\n }\n node.style.transform = orient === 'h' ? `translateY(${vp}px)` : `translateX(${vp}px)`\n })\n }\n\n updateGuidelinePositions()\n\n window.addEventListener('direct-edit-canvas-change', updateGuidelinePositions)\n window.addEventListener('scroll', updateGuidelinePositions, true)\n return () => {\n window.removeEventListener('direct-edit-canvas-change', updateGuidelinePositions)\n window.removeEventListener('scroll', updateGuidelinePositions, true)\n }\n }, [container, enabled])\n\n if (!enabled || !container) return null\n\n // In canvas mode, pan replaces scroll and we need zoom for coordinate mapping\n const zoom = canvas?.active ? (canvas.zoom || 1) : 1\n const effectiveScrollOffset = canvas?.active\n ? (() => {\n // Convert canvas pan + body margin into an offset compatible with\n // ruler tick math: viewport = (content - scrollOffset) * zoom.\n const bo = getBodyOffset()\n return {\n x: computeCanvasRulerScrollOffset(canvas.panX || 0, zoom, bo.x),\n y: computeCanvasRulerScrollOffset(canvas.panY || 0, zoom, bo.y),\n }\n })()\n : scrollOffset\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={effectiveScrollOffset} zoom={zoom} onPointerDown={handleHorizontalPointerDown} />\n <VerticalRuler scrollOffset={effectiveScrollOffset} zoom={zoom} onPointerDown={handleVerticalPointerDown} />\n {guidelines.map((g) => (\n <GuidelineLine\n key={g.id}\n guideline={g}\n isActive={activeGuideline?.id === g.id}\n isSnapped={activeGuideline?.id === g.id ? isSnapped : false}\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 } = useDirectEditState()\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'\nimport { clamp } from './utils'\n\nexport type DockedEdge = 'top' | 'bottom' | 'left' | 'right'\n\nconst STORAGE_KEY = 'direct-edit-toolbar-dock'\nconst EDGE_MARGIN = 8\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 getToolbarBounds(width: number, height: number) {\n const availableX = window.innerWidth - width\n const availableY = window.innerHeight - height\n const minX = availableX <= 0 ? 0 : Math.min(EDGE_MARGIN, availableX)\n const maxX = availableX <= 0 ? 0 : Math.max(minX, availableX - EDGE_MARGIN)\n const minY = availableY <= 0 ? 0 : Math.min(EDGE_MARGIN, availableY)\n const maxY = availableY <= 0 ? 0 : Math.max(minY, availableY - EDGE_MARGIN)\n return { minX, maxX, minY, maxY }\n}\n\nfunction getDockedPosition(edge: DockedEdge, width: number, height: number) {\n const { minX, maxX, minY, maxY } = getToolbarBounds(width, height)\n const centerX = clamp((window.innerWidth - width) / 2, minX, maxX)\n const centerY = clamp((window.innerHeight - height) / 2, minY, maxY)\n\n switch (edge) {\n case 'bottom':\n return { x: centerX, y: maxY }\n case 'top':\n return { x: centerX, y: minY }\n case 'left':\n return { x: minX, y: centerY }\n case 'right':\n return { x: maxX, y: centerY }\n }\n}\n\nfunction getInitialDockedPosition(edge: DockedEdge) {\n if (typeof window === 'undefined') return { x: 0, y: 0 }\n // Start near the target edge before measurement so we never flash from (0,0).\n return getDockedPosition(edge, 0, 0)\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 const transitionTimerRef = React.useRef<ReturnType<typeof setTimeout> | null>(null)\n const transitioningRef = React.useRef(false)\n const recalcRef = React.useRef<(() => void) | 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 }>(() => (\n getInitialDockedPosition(dockedEdge)\n ))\n const [dockedTransitionEnabled, setDockedTransitionEnabled] = React.useState(false)\n\n // Compute initial position synchronously before the browser paints.\n // useLayoutEffect fires after DOM commit but before paint, so the browser\n // never sees the element at (0,0) — no flash, no fly-in, no visibility hack needed.\n React.useLayoutEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n setDockedPos(getDockedPos())\n }, [getDockedPos, toolbarRef])\n\n // Keep docked transitions off for the first paint to avoid startup motion.\n React.useEffect(() => {\n const raf = requestAnimationFrame(() => {\n setDockedTransitionEnabled(true)\n })\n return () => cancelAnimationFrame(raf)\n }, [])\n\n // Predict the final size before an expand/collapse transition starts.\n // Sets the target position immediately so it transitions in parallel with the resize.\n const predictSize = React.useCallback((width: number, height: number) => {\n transitioningRef.current = true\n setDockedPos(getDockedPosition(dockedEdge, width, height))\n if (transitionTimerRef.current) clearTimeout(transitionTimerRef.current)\n transitionTimerRef.current = setTimeout(() => {\n transitioningRef.current = false\n transitionTimerRef.current = null\n // Ensure we always settle to the measured final size/position.\n recalcRef.current?.()\n }, 350)\n }, [dockedEdge])\n\n // Resize observer + window resize to recalculate docked position.\n // Suppressed during predicted transitions to avoid cascading updates.\n React.useEffect(() => {\n const el = toolbarRef.current\n if (!el) return\n\n function recalc() {\n if (!el || transitioningRef.current) return\n const rect = el.getBoundingClientRect()\n setDockedPos(getDockedPosition(dockedEdge, rect.width, rect.height))\n }\n\n recalcRef.current = recalc\n const ro = new ResizeObserver(recalc)\n ro.observe(el)\n window.addEventListener('resize', recalc)\n\n return () => {\n recalcRef.current = null\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 try {\n capturedElementRef.current.setPointerCapture(e.pointerId)\n } catch {}\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 try {\n capturedElementRef.current.releasePointerCapture(e.pointerId)\n } catch {}\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 setDockedPos(getDockedPosition(newEdge, el.offsetWidth, el.offsetHeight))\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 timers on unmount\n React.useEffect(() => {\n return () => {\n if (snapTimerRef.current) clearTimeout(snapTimerRef.current)\n if (transitionTimerRef.current) clearTimeout(transitionTimerRef.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 = { position: 'fixed' }\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 — smooth re-centering when toolbar resizes (e.g. design mode toggle)\n return {\n ...base,\n left: dockedPos.x,\n top: dockedPos.y,\n ...(dockedTransitionEnabled && {\n transition: 'left 300ms cubic-bezier(0.25, 1, 0.5, 1), top 300ms cubic-bezier(0.25, 1, 0.5, 1), box-shadow 150ms ease-out',\n }),\n }\n }, [phase, dragPosition, dockedPos, dockedTransitionEnabled])\n\n return {\n dockedEdge,\n isDragging,\n isSnapping,\n style,\n predictSize,\n handlePointerDown,\n handlePointerMove,\n handlePointerUp,\n handlePointerCancel,\n }\n}\n","import * as React from 'react'\nimport { Button as BaseButton } from '@base-ui/react/button'\nimport { usePortalContainer } from '../portal-container'\nimport { Popover } from '@base-ui/react/popover'\nimport { X, Check, Copy, Send, Trash2 } from 'lucide-react'\nimport type { SessionItem } from '../types'\nimport { Badge } from '../ui/badge'\nimport { buildSessionExport } from '../utils'\nimport { cn } from '../cn'\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '../ui/tooltip'\n\nfunction EditsPopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nfunction truncateText(value: string, max = 64): string {\n if (value.length <= max) return value\n return `${value.slice(0, max)}...`\n}\n\nexport interface EditsPopoverProps {\n tooltipSide: 'top' | 'bottom' | 'left' | 'right'\n sessionEditCount: number\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n onGetSessionItems?: () => SessionItem[]\n onExportAllEdits?: () => Promise<boolean>\n onSendAllToAgents?: () => Promise<boolean>\n onClearSessionEdits?: () => void\n onRemoveSessionEdit?: (element: HTMLElement) => void\n onDeleteComment?: (id: string) => void\n}\n\nexport function EditsPopover({\n tooltipSide,\n sessionEditCount,\n isOpen,\n onOpenChange,\n onGetSessionItems,\n onExportAllEdits,\n onSendAllToAgents,\n onClearSessionEdits,\n onRemoveSessionEdit,\n onDeleteComment,\n}: EditsPopoverProps) {\n const [copied, setCopied] = React.useState(false)\n const [sendStatus, setSendStatus] = React.useState<'idle' | 'sending' | 'sent' | 'offline'>('idle')\n const editsPopupRef = React.useRef<HTMLDivElement>(null)\n const editsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const [editsSnapshot, setEditsSnapshot] = React.useState<SessionItem[]>([])\n\n // Close on outside click (Shadow DOM breaks base-ui's dismiss)\n React.useEffect(() => {\n if (!isOpen) 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 onOpenChange(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 }, [isOpen, onOpenChange])\n\n // Refresh snapshot when popover opens\n React.useEffect(() => {\n if (isOpen && onGetSessionItems) {\n setEditsSnapshot(onGetSessionItems())\n }\n }, [isOpen, onGetSessionItems])\n\n const handleCopyAll = React.useCallback(async () => {\n const success = await onExportAllEdits?.()\n if (!success) return\n setCopied(true)\n window.setTimeout(() => setCopied(false), 2000)\n }, [onExportAllEdits])\n\n const handleSendAll = React.useCallback(async () => {\n if (!onSendAllToAgents || sendStatus === 'sending') return\n\n setSendStatus('sending')\n let success = false\n try {\n success = await onSendAllToAgents()\n } catch {\n success = false\n }\n if (success) {\n setSendStatus('sent')\n window.setTimeout(() => setSendStatus('idle'), 2000)\n return\n }\n\n setSendStatus('offline')\n window.setTimeout(() => setSendStatus('idle'), 2000)\n }, [onSendAllToAgents, sendStatus])\n\n const handleCopyItem = React.useCallback(async (item: SessionItem) => {\n const text = item.type === 'edit'\n ? buildSessionExport([item.edit], [])\n : buildSessionExport([], [item.comment])\n try {\n await navigator.clipboard.writeText(`implement the visual edits\\n\\n${text}`)\n setCopied(true)\n window.setTimeout(() => setCopied(false), 2000)\n } catch {}\n }, [])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={onOpenChange}>\n <Tooltip disabled={isOpen}>\n <TooltipTrigger render={\n <Popover.Trigger render={\n <button\n ref={editsTriggerRef}\n type=\"button\"\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n sessionEditCount > 0 || isOpen\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onOpenChange(!isOpen)\n }}\n />\n } />\n }>\n <Copy className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide}>\n <span>Export 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\n ref={editsPopupRef}\n className=\"w-[340px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className=\"flex items-center justify-between px-3 pb-1 pt-2.5\">\n <span className=\"text-xs font-medium text-foreground\">Copy to AI agents</span>\n {editsSnapshot.length > 0 && (\n <div className=\"flex items-center gap-1\">\n <BaseButton\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={() => {\n void handleCopyAll()\n }}\n >\n {copied ? (\n <Check className=\"size-3 text-green-400\" />\n ) : (\n <Copy className=\"size-3\" />\n )}\n {copied ? 'Copied' : 'Copy all'}\n </BaseButton>\n {onSendAllToAgents && (\n <BaseButton\n className=\"inline-flex h-6 items-center gap-1 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted hover:text-foreground disabled:cursor-not-allowed disabled:opacity-60\"\n onClick={() => {\n void handleSendAll()\n }}\n disabled={sendStatus === 'sending'}\n >\n {sendStatus === 'offline' ? (\n <X className=\"size-3 text-red-500\" />\n ) : sendStatus === 'sent' ? (\n <Check className=\"size-3 text-green-400\" />\n ) : (\n <Send className={cn('size-3', sendStatus === 'sending' && 'animate-pulse')} />\n )}\n {sendStatus === 'sending'\n ? 'Sending'\n : sendStatus === 'sent'\n ? 'Sent'\n : sendStatus === 'offline'\n ? 'Offline'\n : 'Send all'}\n </BaseButton>\n )}\n <Tooltip>\n <TooltipTrigger render={\n <BaseButton\n className=\"inline-flex size-6 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-muted hover:text-foreground\"\n onClick={() => {\n onClearSessionEdits?.()\n setEditsSnapshot([])\n }}\n />\n }>\n <Trash2 className=\"size-3\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide}>\n <span>Clear all</span>\n </TooltipContent>\n </Tooltip>\n </div>\n )}\n </div>\n {editsSnapshot.length === 0 ? (\n <div className=\"px-3 pb-3 pt-1 text-xs text-muted-foreground\">\n No edits or comments yet.\n </div>\n ) : (\n <div className=\"max-h-[240px] overflow-y-auto px-1 py-1\">\n {editsSnapshot.map((item, i) => {\n const isEdit = item.type === 'edit'\n const isMoved = isEdit && Boolean(item.edit.move)\n const locator = isEdit ? item.edit.locator : item.comment.locator\n const componentName = locator.reactStack[0]?.name ?? locator.tagName\n let valueSummary = ''\n if (isEdit) {\n const entries = Object.entries(item.edit.pendingStyles)\n const editValues: string[] = []\n for (const [prop, value] of entries) {\n editValues.push(`${prop}: ${value}`)\n }\n if (item.edit.textEdit) {\n editValues.push(`text: \"${item.edit.textEdit.newText}\"`)\n }\n if (item.edit.move) {\n editValues.push(`${item.edit.move.fromParentName} -> ${item.edit.move.toParentName}`)\n }\n valueSummary = editValues.length > 0 ? editValues.join(', ') : '(no edits)'\n } else {\n const commentValues: string[] = []\n commentValues.push(item.comment.text.trim() ? item.comment.text.trim() : '(empty)')\n for (const reply of item.comment.replies.slice(0, 2)) {\n commentValues.push(`reply: ${reply.text}`)\n }\n valueSummary = commentValues.join(', ')\n }\n return (\n <div\n key={item.type === 'comment' ? item.comment.id : `edit-${i}`}\n role=\"button\"\n tabIndex={0}\n className=\"group flex cursor-pointer items-start justify-between rounded-md px-1.5 py-1.5 text-xs transition-colors hover:bg-muted/50\"\n onClick={() => {\n void handleCopyItem(item)\n }}\n onKeyDown={(e) => {\n if (e.target !== e.currentTarget) return\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n void handleCopyItem(item)\n }\n }}\n >\n <div className=\"min-w-0 flex flex-1 flex-col items-start gap-[4px]\">\n <Badge variant=\"secondary\" className=\"h-6 shrink-0 px-1.5 text-xs\">\n @<{componentName}>\n </Badge>\n <span className=\"min-w-0 max-w-full truncate text-xs text-muted-foreground\">\n {isEdit ? (isMoved ? 'moved: ' : 'edit: ') : 'comment: '}\n {truncateText(valueSummary, 128)}\n </span>\n </div>\n <BaseButton\n className=\"ml-2 flex size-6 flex-shrink-0 items-center justify-center rounded-md text-muted-foreground opacity-0 transition-[opacity,background-color,color] hover:bg-muted hover:text-foreground group-hover:opacity-100\"\n onPointerDown={(e) => e.stopPropagation()}\n onClick={(e) => {\n e.stopPropagation()\n if (item.type === 'edit') {\n onRemoveSessionEdit?.(item.edit.element)\n } else {\n onDeleteComment?.(item.comment.id)\n }\n setEditsSnapshot((prev) => prev.filter((_, j) => j !== i))\n }}\n >\n <X className=\"size-3\" />\n </BaseButton>\n </div>\n )\n })}\n </div>\n )}\n </Popover.Popup>\n </Popover.Positioner>\n </EditsPopoverPortal>\n </Popover.Root>\n )\n}\n","import * as React from 'react'\nimport { cn } from '../cn'\n\nconst badgeVariants = {\n base: 'inline-flex items-center rounded-md border px-2 py-0.5 text-[10px] font-medium whitespace-nowrap transition-colors focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n variant: {\n default: 'border-transparent bg-primary text-primary-foreground',\n secondary: 'border-transparent bg-muted text-secondary-foreground',\n outline: 'border-border bg-transparent text-foreground',\n },\n}\n\nexport interface BadgeProps extends React.HTMLAttributes<HTMLDivElement> {\n variant?: keyof typeof badgeVariants.variant\n}\n\nconst Badge = React.forwardRef<HTMLDivElement, BadgeProps>(\n ({ className, variant = 'default', ...props }, ref) => (\n <div\n ref={ref}\n className={cn(\n badgeVariants.base,\n badgeVariants.variant[variant],\n className\n )}\n {...props}\n />\n )\n)\n\nBadge.displayName = 'Badge'\n\nexport { Badge }\n","import * as React from 'react'\nimport { usePortalContainer } from '../portal-container'\nimport { Menu } from '@base-ui/react/menu'\nimport { EllipsisVertical, Sun, Moon, Monitor, Command, ArrowBigUp, Option, Keyboard, ChevronRight } from 'lucide-react'\nimport type { Theme } from '../types'\nimport { cn } from '../cn'\nimport {\n Tooltip,\n TooltipTrigger,\n TooltipContent,\n} from '../ui/tooltip'\n\nfunction SettingsMenuPortal(props: React.ComponentPropsWithoutRef<typeof Menu.Portal>) {\n const container = usePortalContainer()\n return <Menu.Portal container={container} {...props} />\n}\n\nexport interface SettingsPopoverProps {\n tooltipSide: 'top' | 'bottom' | 'left' | 'right'\n theme: Theme\n isMac: boolean\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n onSetTheme?: (theme: Theme) => void\n}\n\nexport function SettingsPopover({\n tooltipSide,\n theme,\n isMac,\n isOpen,\n onOpenChange,\n onSetTheme,\n}: SettingsPopoverProps) {\n const settingsTriggerRef = React.useRef<HTMLButtonElement>(null)\n const settingsPopupRef = React.useRef<HTMLDivElement>(null)\n\n const popupKbdClass = 'inline-flex h-4 min-w-[18px] items-center justify-center rounded-[6px] bg-muted px-1 text-[9px] font-mono text-muted-foreground'\n const popupTitleClass = 'flex h-8 items-center px-3 text-xs font-medium text-foreground'\n const submenuSide = tooltipSide === 'left' ? 'left' : 'right'\n const centeredSubmenuCollision = React.useMemo(\n () => ({ side: 'flip' as const, align: 'none' as const, fallbackAxisSide: 'none' as const }),\n [],\n )\n\n return (\n <Menu.Root open={isOpen} onOpenChange={onOpenChange} modal={false}>\n <Tooltip disabled={isOpen}>\n <TooltipTrigger render={\n <Menu.Trigger render={\n <button\n ref={settingsTriggerRef}\n type=\"button\"\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n isOpen\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 }>\n <EllipsisVertical className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide}>\n <span>Preferences</span>\n </TooltipContent>\n </Tooltip>\n <SettingsMenuPortal>\n <Menu.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Menu.Popup\n ref={settingsPopupRef}\n className=\"w-[200px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className={popupTitleClass}>Preferences</div>\n <div className=\"px-1 pb-1\">\n <Menu.SubmenuRoot>\n <Menu.SubmenuTrigger\n openOnHover={false}\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors data-[highlighted]:bg-muted/50 data-[highlighted]:text-foreground\"\n >\n <Monitor className=\"size-3.5\" />\n <span className=\"flex-1\">Theme</span>\n <ChevronRight className=\"size-3.5\" />\n </Menu.SubmenuTrigger>\n <SettingsMenuPortal>\n <Menu.Positioner\n anchor={settingsPopupRef}\n side={submenuSide}\n align=\"center\"\n sideOffset={6}\n collisionAvoidance={centeredSubmenuCollision}\n className=\"fixed z-[99999]\"\n style={{ pointerEvents: 'auto' }}\n >\n <Menu.Popup\n className=\"w-[200px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className={popupTitleClass}>Theme</div>\n <div className=\"px-1 pb-1\">\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 <Menu.Item\n key={value}\n className={cn(\n 'flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs transition-colors',\n theme === value\n ? 'bg-muted text-foreground'\n : 'text-muted-foreground data-[highlighted]:bg-muted/50 data-[highlighted]:text-foreground'\n )}\n onClick={() => {\n onSetTheme?.(value)\n onOpenChange(false)\n }}\n >\n <Icon className=\"size-3.5\" />\n {label}\n </Menu.Item>\n ))}\n </div>\n </Menu.Popup>\n </Menu.Positioner>\n </SettingsMenuPortal>\n </Menu.SubmenuRoot>\n\n <Menu.SubmenuRoot>\n <Menu.SubmenuTrigger\n openOnHover={false}\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors data-[highlighted]:bg-muted/50 data-[highlighted]:text-foreground\"\n >\n <Keyboard className=\"size-3.5\" />\n <span className=\"flex-1\">Keyboard shortcuts</span>\n <ChevronRight className=\"size-3.5\" />\n </Menu.SubmenuTrigger>\n <SettingsMenuPortal>\n <Menu.Positioner\n anchor={settingsPopupRef}\n side={submenuSide}\n align=\"center\"\n sideOffset={6}\n collisionAvoidance={centeredSubmenuCollision}\n className=\"fixed z-[99999]\"\n style={{ pointerEvents: 'auto' }}\n >\n <Menu.Popup\n className=\"w-[300px] rounded-xl bg-background text-[11px] outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className=\"flex h-7 items-center px-3 text-[11px] font-medium text-foreground\">Keyboard Shortcuts</div>\n <div className=\"px-1 pb-1\">\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: 'Toggle canvas mode', keys: [<ArrowBigUp key=\"shift\" className=\"size-3\" />, 'Z'] },\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 h-7 w-full items-center justify-between rounded-md px-2 text-[11px] text-muted-foreground\">\n <span>{label}</span>\n <span className=\"flex items-center gap-1\">\n {keys.map((k, i) => (\n <kbd key={typeof k === 'string' ? k : i} className={popupKbdClass}>{k}</kbd>\n ))}\n </span>\n </div>\n ))}\n </div>\n </Menu.Popup>\n </Menu.Positioner>\n </SettingsMenuPortal>\n </Menu.SubmenuRoot>\n </div>\n </Menu.Popup>\n </Menu.Positioner>\n </SettingsMenuPortal>\n </Menu.Root>\n )\n}\n","import * as React from 'react'\nimport { Button as BaseButton } from '@base-ui/react/button'\nimport { usePortalContainer } from '../portal-container'\nimport { Popover } from '@base-ui/react/popover'\nimport { Scan, Minimize2, Maximize2, Check, ArrowBigUp } from 'lucide-react'\nimport { cn } from '../cn'\nimport { Tooltip, TooltipTrigger, TooltipContent } from '../ui/tooltip'\n\nfunction ZoomPopoverPortal(props: React.ComponentPropsWithoutRef<typeof Popover.Portal>) {\n const container = usePortalContainer()\n return <Popover.Portal container={container} {...props} />\n}\n\nexport interface ZoomPopoverProps {\n tooltipSide: 'top' | 'bottom' | 'left' | 'right'\n canvasActive: boolean\n canvasZoom: number\n isOpen: boolean\n onOpenChange: (open: boolean) => void\n onToggleCanvas?: () => void\n onSetCanvasZoom?: (zoom: number) => void\n onZoomTo100?: () => void\n onFitToViewport?: () => void\n}\n\nexport function ZoomPopover({\n tooltipSide,\n canvasActive,\n canvasZoom,\n isOpen,\n onOpenChange,\n onToggleCanvas,\n onSetCanvasZoom,\n onZoomTo100,\n onFitToViewport,\n}: ZoomPopoverProps) {\n const popupRef = React.useRef<HTMLDivElement>(null)\n const triggerRef = React.useRef<HTMLButtonElement>(null)\n const kbdClass = '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 // Close on outside click (Shadow DOM breaks base-ui's dismiss)\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 onOpenChange(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 }, [isOpen, onOpenChange])\n\n return (\n <Popover.Root open={isOpen} onOpenChange={onOpenChange}>\n <Tooltip disabled={isOpen}>\n <TooltipTrigger render={\n <Popover.Trigger render={\n <button\n ref={triggerRef}\n type=\"button\"\n className={cn(\n 'flex cursor-pointer items-center justify-center rounded-[8px] p-2 transition-colors',\n isOpen\n ? 'bg-muted text-foreground'\n : canvasActive\n ? 'bg-muted text-foreground hover:bg-muted/80'\n : 'text-muted-foreground hover:bg-muted hover:text-foreground'\n )}\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onOpenChange(!isOpen)\n }}\n />\n } />\n }>\n <Maximize2 className=\"size-4\" />\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} className=\"inline-flex items-center gap-1.5\">\n <span>Canvas mode</span>\n <kbd className={kbdClass}><ArrowBigUp className=\"size-2.5\" /></kbd>\n <kbd className={kbdClass}>Z</kbd>\n </TooltipContent>\n </Tooltip>\n <ZoomPopoverPortal>\n <Popover.Positioner side={tooltipSide} sideOffset={12} className=\"fixed z-[99999]\" style={{ pointerEvents: 'auto' }}>\n <Popover.Popup\n ref={popupRef}\n className=\"w-[180px] rounded-xl bg-background text-xs outline outline-1 outline-foreground/10 shadow-lg\"\n onPointerDown={(e: React.PointerEvent) => e.stopPropagation()}\n >\n <div className=\"px-1 py-1\">\n <BaseButton\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n onClick={() => {\n onZoomTo100?.()\n onOpenChange(false)\n }}\n >\n <Scan className=\"size-3.5\" />\n Actual size (100%)\n </BaseButton>\n <BaseButton\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n onClick={() => {\n onFitToViewport?.()\n onOpenChange(false)\n }}\n >\n <Minimize2 className=\"size-3.5\" />\n Fit to viewport\n </BaseButton>\n <div className=\"my-1 border-t border-foreground/10\" />\n <BaseButton\n className=\"flex h-8 w-full items-center gap-2 rounded-md px-2 text-xs text-muted-foreground transition-colors hover:bg-muted/50 hover:text-foreground\"\n onClick={() => {\n onToggleCanvas?.()\n onOpenChange(false)\n }}\n >\n <Check className={cn('size-3.5', canvasActive ? 'opacity-100' : 'opacity-0')} />\n Canvas mode\n </BaseButton>\n </div>\n </Popover.Popup>\n </Popover.Positioner>\n </ZoomPopoverPortal>\n </Popover.Root>\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 const [boxShadow, setBoxShadow] = React.useState('none')\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 handleSetCSS = (properties: Record<string, string>) => {\n setPendingStyles((prev) => ({ ...prev, ...properties }))\n if (properties['box-shadow']) {\n setBoxShadow(properties['box-shadow'])\n }\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 setBoxShadow('none')\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 computedBoxShadow={boxShadow}\n borderStyleControlPreference=\"icon\"\n computedTypography={typography}\n pendingStyles={pendingStyles}\n onSelectParent={() => {}}\n onUpdateSpacing={handleUpdateSpacing}\n onUpdateBorderRadius={handleUpdateBorderRadius}\n onUpdateBorder={handleUpdateBorder}\n onBatchUpdateBorder={handleBatchUpdateBorder}\n onSetCSS={handleSetCSS}\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 boxShadow,\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","React","numeric","isFlexContainer","containerRect","React","locator","styleState","React","React","snapshot","sendEditToAgent","sendCommentToAgent","React","React","jsx","sendEditToAgent","sendCommentToAgent","React","React","jsx","React","React","jsx","jsxs","React","React","jsx","jsxs","elementUnder","jsx","BLUE","React","Fragment","jsx","jsxs","BLUE","React","Fragment","jsx","jsxs","React","React","jsx","jsx","jsxs","React","React","jsx","React","jsx","jsxs","jsx","jsxs","React","jsx","Check","jsx","jsxs","Check","React","jsx","jsxs","React","jsx","jsxs","ChevronDown","Square","Focus","Grid2x2","jsx","jsxs","changes","React","Plus","Minus","jsx","jsxs","Type","jsx","jsxs","X","ChevronDown","Fragment","jsx","jsxs","React","X","Copy","Check","Send","jsx","jsxs","panelBarBaseClass","React","ArrowUp","Columns2","Grid2x2","jsx","jsxs","React","Check","jsx","jsxs","jsx","jsxs","Check","ArrowRight","ArrowDown","MoveHorizontal","ChevronsUpDown","Plus","Minus","jsx","jsxs","React","STORAGE_KEY","Fragment","jsx","jsxs","sendEditToAgent","sendCommentToAgent","React","createPortal","React","createPortal","Fragment","jsx","jsxs","RULER_SIZE","bodyOffset","zoom","createPortal","React","STORAGE_KEY","DRAG_THRESHOLD","Command","ArrowBigUp","X","React","Popover","X","Check","Copy","Send","Trash2","React","jsx","jsx","jsxs","Popover","Copy","Check","X","Send","Trash2","React","jsx","jsxs","React","BaseButton","Popover","Check","ArrowBigUp","jsx","jsxs","Popover","ArrowBigUp","BaseButton","Check","Fragment","jsx","jsxs","Command","ArrowBigUp","X","createPortal","jsx","jsxs","React","jsx","jsxs"]}
|