@kubuild/editor 0.1.2 → 0.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +43 -28
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +43 -28
- package/dist/index.js.map +1 -1
- package/dist/layers-panel.d.ts.map +1 -1
- package/dist/table-spreadsheet-editor.d.ts.map +1 -1
- package/package.json +2 -2
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/editor.tsx","../src/store.ts","../src/canvas.tsx","../src/floating-badges.tsx","../src/toolbar.tsx","../src/import-modal.tsx","../src/code-viewer-modal.tsx","../src/export-utils.ts","../src/code-highlighter.tsx","../src/inspector-panel.tsx","../src/variable-picker.tsx","../src/asset-manager-modal.tsx","../src/table-spreadsheet-editor.tsx","../src/icons.tsx","../src/style-manager-accordion.tsx","../src/box-model-editor.tsx","../src/dimension-sector-controls.tsx","../src/typography-sector-controls.tsx","../src/motion-sector-controls.tsx","../src/traits-panel.tsx","../src/layers-panel.tsx","../src/breadcrumbs.tsx","../src/left-sidebar.tsx","../src/component-panel.tsx","../src/blocks-panel.tsx","../src/config.ts"],"sourcesContent":["export * from './editor';\nexport * from './store';\nexport * from './canvas';\nexport * from './component-panel';\nexport * from './toolbar';\nexport * from './inspector-panel';\nexport * from './layers-panel';\nexport * from './variable-picker';\nexport * from './import-modal';\nexport * from './asset-manager-modal';\nexport * from './export-utils';\nexport * from './icons';\nexport * from './table-spreadsheet-editor';\nexport * from './box-model-editor';\nexport * from './style-manager-accordion';\nexport * from './dimension-sector-controls';\nexport * from './typography-sector-controls';\nexport * from './floating-badges';\nexport * from './breadcrumbs';\nexport * from './blocks-panel';\nexport * from './left-sidebar';\nexport * from './code-viewer-modal';\nexport * from './code-highlighter';\nexport * from './motion-sector-controls';\nexport * from './config';\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry, createDefaultComponentRegistry } from '@kubuild/components';\nimport {\n RuntimeContext,\n VariableCatalog,\n Diagnostic,\n buildSampleVariablesFromCatalog,\n} from '@kubuild/core';\nimport { useEditorStore, Viewport } from './store';\nimport { EditorCanvas } from './canvas';\nimport { EditorToolbar } from './toolbar';\nimport { InspectorPanel } from './inspector-panel';\nimport { LayersPanel } from './layers-panel';\nimport { TableSpreadsheetEditor, findActiveTableNode } from './table-spreadsheet-editor';\nimport { HierarchyBreadcrumbs } from './breadcrumbs';\nimport { LeftSidebar } from './left-sidebar';\nimport { EditorConfig, resolveEditorConfig } from './config';\nimport {\n Monitor,\n Tablet,\n Smartphone,\n Plus,\n Layers,\n Sliders,\n Undo2,\n Redo2,\n X,\n Boxes,\n} from 'lucide-react';\n\nexport interface KubuildEditorProps {\n initialDocument?: PageDocument;\n registry?: ComponentRegistry;\n context?: RuntimeContext;\n /** Host-declared bindable variables + preview-only sample values (STORA-053). Never written to the document. */\n variableCatalog?: VariableCatalog;\n onChange?: (doc: PageDocument) => void;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n config?: EditorConfig;\n className?: string;\n}\n\nexport const KubuildEditor: React.FC<KubuildEditorProps> = ({\n initialDocument,\n registry = createDefaultComponentRegistry(),\n context,\n variableCatalog,\n onChange,\n onDiagnostic,\n config,\n className,\n}) => {\n const {\n document,\n setDocument,\n setOnChangeHandler,\n setVariableCatalog,\n viewport,\n setViewport,\n selectedNodeId,\n navigatorMode,\n tableSpreadsheetMode,\n setTableSpreadsheetMode,\n undo,\n redo,\n canUndo,\n canRedo,\n } = useEditorStore();\n const lastLoadedDocRef = React.useRef<PageDocument | undefined>(undefined);\n\n // Mobile drawer states\n const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState<boolean>(false);\n const [isMobileInspectorOpen, setIsMobileInspectorOpen] = useState<boolean>(false);\n const [isMobileLayersOpen, setIsMobileLayersOpen] = useState<boolean>(false);\n\n const activeTable = useMemo(\n () => findActiveTableNode(document.document, selectedNodeId),\n [document.document, selectedNodeId],\n );\n\n useEffect(() => {\n if (\n initialDocument &&\n initialDocument !== lastLoadedDocRef.current &&\n initialDocument !== useEditorStore.getState().document\n ) {\n lastLoadedDocRef.current = initialDocument;\n setDocument(initialDocument);\n }\n }, [initialDocument, setDocument]);\n\n useEffect(() => {\n setOnChangeHandler(onChange ?? null);\n }, [onChange, setOnChangeHandler]);\n\n useEffect(() => {\n setVariableCatalog(variableCatalog ?? []);\n }, [variableCatalog, setVariableCatalog]);\n\n const sampleVariables = useMemo(\n () => buildSampleVariablesFromCatalog(variableCatalog),\n [variableCatalog],\n );\n\n // Host-supplied context.variables wins on key conflicts — the catalog only fills gaps\n // so the canvas can preview bindings without the host needing to wire live data itself.\n const previewContext = useMemo<RuntimeContext | undefined>(() => {\n if (Object.keys(sampleVariables).length === 0) {\n return context;\n }\n return { ...context, variables: { ...sampleVariables, ...(context?.variables ?? {}) } };\n }, [context, sampleVariables]);\n\n const viewportWidthMap: Record<Viewport, string> = {\n desktop: 'w-full max-w-6xl',\n tablet: 'w-full max-w-[768px] sm:w-[768px]',\n mobile: 'w-full max-w-[375px] sm:w-[375px]',\n };\n\n const viewportIcons: Record<Viewport, React.ReactNode> = {\n desktop: <Monitor className=\"w-3.5 h-3.5\" />,\n tablet: <Tablet className=\"w-3.5 h-3.5\" />,\n mobile: <Smartphone className=\"w-3.5 h-3.5\" />,\n };\n\n const resolvedConfig = useMemo(() => resolveEditorConfig(config), [config]);\n\n return (\n <div\n className={`flex flex-col h-full bg-slate-100 text-slate-900 relative overflow-hidden ${className || ''}`}\n >\n {/* Floating Navigator */}\n {navigatorMode === 'floating' && <LayersPanel registry={registry} />}\n\n {/* Floating Table Spreadsheet Editor */}\n {activeTable && tableSpreadsheetMode === 'floating' && (\n <TableSpreadsheetEditor\n registry={registry}\n tableNode={activeTable}\n mode=\"floating\"\n onToggleMode={() => setTableSpreadsheetMode('docked')}\n onClose={() => setTableSpreadsheetMode('hidden')}\n />\n )}\n\n {/* Mobile Sidebar Drawer Modal */}\n {isMobileSidebarOpen && resolvedConfig.sidebar.enabled && (\n <div className=\"fixed inset-0 z-50 flex lg:hidden animate-in fade-in duration-200\">\n <div\n className=\"fixed inset-0 bg-slate-950/50 backdrop-blur-xs transition-opacity\"\n onClick={() => setIsMobileSidebarOpen(false)}\n />\n <div className=\"relative w-80 max-w-[85vw] bg-white h-full shadow-2xl flex flex-col z-10 animate-in slide-in-from-left duration-200\">\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-slate-200 bg-slate-50\">\n <div className=\"flex items-center gap-2\">\n <Boxes className=\"w-4 h-4 text-blue-600\" />\n <span className=\"font-bold text-xs text-slate-800\">Add Components & Blocks</span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsMobileSidebarOpen(false)}\n className=\"p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-200 transition\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0\">\n <LeftSidebar registry={registry} config={resolvedConfig.sidebar} />\n </div>\n </div>\n </div>\n )}\n\n {/* Mobile Inspector Drawer Modal */}\n {isMobileInspectorOpen && resolvedConfig.inspector.enabled && (\n <div className=\"fixed inset-0 z-50 flex justify-end lg:hidden animate-in fade-in duration-200\">\n <div\n className=\"fixed inset-0 bg-slate-950/50 backdrop-blur-xs transition-opacity\"\n onClick={() => setIsMobileInspectorOpen(false)}\n />\n <div className=\"relative w-84 max-w-[90vw] sm:max-w-md bg-white h-full shadow-2xl flex flex-col z-10 animate-in slide-in-from-right duration-200\">\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-slate-200 bg-slate-50\">\n <div className=\"flex items-center gap-2\">\n <Sliders className=\"w-4 h-4 text-blue-600\" />\n <span className=\"font-bold text-xs text-slate-800\">\n {selectedNodeId ? `Inspector (#${selectedNodeId})` : 'Inspector & Properties'}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsMobileInspectorOpen(false)}\n className=\"p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-200 transition\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0\">\n <InspectorPanel registry={registry} config={resolvedConfig.inspector} />\n </div>\n </div>\n </div>\n )}\n\n {/* Mobile Layers / Navigator Drawer Modal */}\n {isMobileLayersOpen && (\n <div className=\"fixed inset-0 z-50 flex lg:hidden animate-in fade-in duration-200\">\n <div\n className=\"fixed inset-0 bg-slate-950/50 backdrop-blur-xs transition-opacity\"\n onClick={() => setIsMobileLayersOpen(false)}\n />\n <div className=\"relative w-72 max-w-[85vw] bg-white h-full shadow-2xl flex flex-col z-10 animate-in slide-in-from-left duration-200\">\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-slate-200 bg-slate-50\">\n <div className=\"flex items-center gap-2\">\n <Layers className=\"w-4 h-4 text-blue-600\" />\n <span className=\"font-bold text-xs text-slate-800\">Element Tree / Layers</span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsMobileLayersOpen(false)}\n className=\"p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-200 transition\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0\">\n <LayersPanel registry={registry} />\n </div>\n </div>\n </div>\n )}\n\n {/* Editor Top Toolbar */}\n {resolvedConfig.toolbar.enabled && (\n <div className=\"flex items-center justify-between px-3 py-1.5 sm:px-4 sm:py-2 bg-white border-b border-slate-200 gap-2 overflow-x-auto min-h-[44px]\">\n {resolvedConfig.toolbar.showTitle ? (\n <div className=\"flex items-center gap-2 shrink-0\">\n <span className=\"font-bold text-slate-800 text-xs sm:text-sm tracking-tight\">\n KUBUILD Editor\n </span>\n <span className=\"text-[11px] bg-slate-100 text-slate-600 px-1.5 py-0.5 rounded border max-w-[120px] sm:max-w-[200px] truncate font-medium\">\n {document.metadata?.title || 'Untitled'}\n </span>\n </div>\n ) : (\n <div />\n )}\n\n <div className=\"flex items-center gap-2 shrink-0\">\n <EditorToolbar registry={registry} config={resolvedConfig.toolbar} />\n\n {/* Viewport switcher */}\n {resolvedConfig.toolbar.showViewportSwitcher && (\n <div className=\"flex items-center gap-0.5 bg-slate-100 p-0.5 sm:p-1 rounded-md text-xs border border-slate-200/80\">\n {(['desktop', 'tablet', 'mobile'] as Viewport[]).map((vp) => (\n <button\n key={vp}\n type=\"button\"\n onClick={() => setViewport(vp)}\n title={`Switch to ${vp} preview`}\n className={`px-2 py-1 sm:px-2.5 sm:py-1 rounded capitalize font-medium transition flex items-center gap-1 text-[11px] sm:text-xs ${\n viewport === vp\n ? 'bg-white text-blue-600 shadow-xs font-semibold'\n : 'text-slate-600 hover:text-slate-900'\n }`}\n >\n {viewportIcons[vp]}\n <span className=\"hidden md:inline\">{vp}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {resolvedConfig.toolbar.showSelectionStatus && (\n <div className=\"hidden xl:block text-xs text-slate-500 shrink-0 font-mono\">\n {selectedNodeId ? `Selected: #${selectedNodeId}` : 'No element selected'}\n </div>\n )}\n </div>\n )}\n\n {/* Main Body: Desktop Docked Sidebars + Canvas */}\n <div className=\"flex flex-1 overflow-hidden min-h-0 relative\">\n {/* Desktop Left Sidebar */}\n {resolvedConfig.sidebar.enabled && (\n <div className=\"hidden lg:flex w-80 shrink-0 bg-white border-r border-slate-200 overflow-hidden flex-col min-h-0 h-full\">\n <LeftSidebar registry={registry} config={resolvedConfig.sidebar} />\n </div>\n )}\n\n {navigatorMode === 'docked' && (\n <div className=\"hidden lg:flex w-60 shrink-0 bg-white border-r border-slate-200 overflow-hidden flex-col min-h-0 h-full\">\n <LayersPanel registry={registry} />\n </div>\n )}\n\n {/* Central Canvas Area */}\n <div className=\"flex-1 overflow-hidden flex flex-col min-h-0 h-full bg-slate-100/90 relative\">\n <div className=\"flex-1 overflow-auto p-2 sm:p-4 md:p-8 flex justify-center items-start min-h-0\">\n <div\n className={`${viewportWidthMap[viewport]} bg-white shadow-md rounded-lg overflow-hidden transition-all duration-200 min-h-[500px] border border-slate-200`}\n >\n <EditorCanvas\n registry={registry}\n context={previewContext}\n viewport={viewport}\n onDiagnostic={onDiagnostic}\n config={resolvedConfig.canvas}\n />\n </div>\n </div>\n\n {/* Quick Edit Selected Floating Action Pill (Mobile only) */}\n {selectedNodeId && !isMobileInspectorOpen && resolvedConfig.inspector.enabled && (\n <div className=\"lg:hidden fixed bottom-14 left-1/2 -translate-x-1/2 z-30 animate-in fade-in slide-in-from-bottom-2\">\n <button\n type=\"button\"\n onClick={() => setIsMobileInspectorOpen(true)}\n className=\"flex items-center gap-2 bg-blue-600 hover:bg-blue-500 text-white text-xs font-semibold px-4 py-2 rounded-full shadow-xl border border-blue-400/40 active:scale-95 transition\"\n >\n <Sliders className=\"w-3.5 h-3.5\" />\n <span>Edit Element (#{selectedNodeId})</span>\n </button>\n </div>\n )}\n\n {resolvedConfig.canvas.showBreadcrumbs && <HierarchyBreadcrumbs registry={registry} />}\n </div>\n\n {/* Desktop Right Inspector */}\n {resolvedConfig.inspector.enabled && (\n <div className=\"hidden lg:flex w-72 shrink-0 bg-white border-l border-slate-200 overflow-hidden flex-col min-h-0 h-full\">\n <InspectorPanel registry={registry} config={resolvedConfig.inspector} />\n </div>\n )}\n </div>\n\n {/* Mobile Bottom Navigation Bar (Visible only on < lg screens) */}\n <div className=\"flex lg:hidden items-center justify-around bg-white border-t border-slate-200 px-2 py-1.5 z-20 shrink-0 shadow-lg select-none min-h-[48px]\">\n {resolvedConfig.sidebar.enabled && (\n <button\n type=\"button\"\n onClick={() => setIsMobileSidebarOpen(true)}\n className=\"flex flex-col items-center justify-center gap-0.5 px-3 py-1 rounded-md text-slate-600 hover:text-blue-600 hover:bg-slate-50 active:bg-slate-100 transition\"\n >\n <Plus className=\"w-4 h-4 text-blue-600\" />\n <span className=\"text-[10px] font-medium\">Add</span>\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => setIsMobileLayersOpen(true)}\n className=\"flex flex-col items-center justify-center gap-0.5 px-3 py-1 rounded-md text-slate-600 hover:text-blue-600 hover:bg-slate-50 active:bg-slate-100 transition\"\n >\n <Layers className=\"w-4 h-4\" />\n <span className=\"text-[10px] font-medium\">Layers</span>\n </button>\n\n {resolvedConfig.inspector.enabled && (\n <button\n type=\"button\"\n onClick={() => setIsMobileInspectorOpen(true)}\n className={`flex flex-col items-center justify-center gap-0.5 px-3 py-1 rounded-md transition relative ${\n selectedNodeId\n ? 'text-blue-600 font-semibold'\n : 'text-slate-600 hover:text-blue-600 hover:bg-slate-50'\n }`}\n >\n <div className=\"relative\">\n <Sliders className=\"w-4 h-4\" />\n {selectedNodeId && (\n <span className=\"absolute -top-1 -right-1 w-2 h-2 rounded-full bg-blue-600 ring-2 ring-white\" />\n )}\n </div>\n <span className=\"text-[10px]\">{selectedNodeId ? 'Inspect *' : 'Inspect'}</span>\n </button>\n )}\n\n <div className=\"h-5 w-px bg-slate-200 mx-0.5\" />\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n disabled={!canUndo}\n onClick={undo}\n title=\"Undo\"\n className=\"p-2 rounded text-slate-600 hover:text-blue-600 disabled:opacity-30 disabled:hover:text-slate-600 transition\"\n >\n <Undo2 className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n disabled={!canRedo}\n onClick={redo}\n title=\"Redo\"\n className=\"p-2 rounded text-slate-600 hover:text-blue-600 disabled:opacity-30 disabled:hover:text-slate-600 transition\"\n >\n <Redo2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { create } from 'zustand';\nimport {\n PageDocument,\n Node,\n StyleDefinition,\n TemplateRecord,\n AnimationConfig,\n} from '@kubuild/schema';\nimport {\n createBlankDocument,\n findNodeById,\n findNodeLocation,\n isDescendantOf,\n getParentNodeId,\n insertNode,\n moveNode,\n duplicateNode,\n removeNode,\n updateProps,\n updateStyle,\n updateAnimation,\n DocumentHistoryManager,\n CommandResult,\n deepClone,\n cloneTreeWithNewIds,\n collectNodeIdSet,\n VariableCatalog,\n saveDraftAsTemplate,\n cloneTemplateAsPage,\n SaveTemplateMetadata,\n CloneTemplateOptions,\n} from '@kubuild/core';\nimport {\n ComponentRegistry,\n ComponentDefaultChildSpec,\n STARTER_BLOCKS,\n BlockDefinition,\n} from '@kubuild/components';\n\nexport type Viewport = 'desktop' | 'tablet' | 'mobile';\nexport type NavigatorMode = 'docked' | 'floating' | 'hidden';\nexport type TableSpreadsheetMode = 'floating' | 'docked' | 'hidden';\n\nexport type DragPayload =\n | { type: 'component'; componentType: string }\n | { type: 'block'; blockId: string }\n | { type: 'node'; nodeId: string };\n\nexport interface InsertComponentResult {\n success: boolean;\n nodeId?: string;\n error?: string;\n}\n\nexport interface MoveComponentResult {\n success: boolean;\n error?: string;\n}\n\nexport interface DuplicateComponentResult {\n success: boolean;\n nodeId?: string;\n error?: string;\n}\n\nexport interface DeleteComponentResult {\n success: boolean;\n error?: string;\n}\n\nexport interface PasteComponentResult {\n success: boolean;\n nodeId?: string;\n error?: string;\n}\n\nexport interface UpdatePropsResult {\n success: boolean;\n error?: string;\n}\n\nexport interface UpdateStyleResult {\n success: boolean;\n error?: string;\n}\n\nexport interface UpdateAnimationResult {\n success: boolean;\n error?: string;\n}\n\n// Duck-types Zod's issue-array shape (from updateStyle's schema.parse) vs plain\n// Error (from updateProps/removeNode/etc) without adding a zod dependency here.\nfunction formatCommandError(err: unknown): string {\n if (err && typeof err === 'object' && Array.isArray((err as { issues?: unknown }).issues)) {\n const issues = (err as { issues: Array<{ path: (string | number)[]; message: string }> })\n .issues;\n return issues\n .map((i) => (i.path.length ? `${i.path.join('.')}: ${i.message}` : i.message))\n .join('; ');\n }\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Generates a node id unique within `existingIds`, e.g. \"heading-1\", \"heading-2\". */\nfunction generateComponentNodeId(type: string, existingIds: Set<string>): string {\n let counter = 1;\n let candidate = `${type}-${counter}`;\n while (existingIds.has(candidate)) {\n counter += 1;\n candidate = `${type}-${counter}`;\n }\n return candidate;\n}\n\n/** Recursively constructs default child nodes from ComponentDefinition.defaultChildren specs. */\nfunction buildDefaultChildren(\n specs: ComponentDefaultChildSpec[] | undefined,\n existingIds: Set<string>,\n registry: ComponentRegistry,\n): Node[] | undefined {\n if (!specs || specs.length === 0) return undefined;\n return specs.map((spec) => {\n const id = generateComponentNodeId(spec.type, existingIds);\n existingIds.add(id);\n const def = registry.get(spec.type);\n const nodeProps = deepClone(spec.props ?? def?.defaultProps ?? {});\n const nodeStyles = spec.styles ?? def?.defaultStyles;\n const childNodes = buildDefaultChildren(\n spec.children ?? def?.defaultChildren,\n existingIds,\n registry,\n );\n const node: Node = {\n id,\n type: spec.type,\n props: nodeProps,\n ...(nodeStyles ? { styles: deepClone(nodeStyles) } : {}),\n ...(childNodes ? { children: childNodes } : {}),\n };\n return node;\n });\n}\n\nexport interface EditorState {\n document: PageDocument;\n selectedNodeId: string | null;\n hoveredNodeId: string | null;\n dragPayload: DragPayload | null;\n viewport: Viewport;\n isDirty: boolean;\n canUndo: boolean;\n canRedo: boolean;\n clipboard: Node | null;\n onChangeHandler: ((doc: PageDocument) => void) | null;\n /** Host-declared bindable variables + editor/preview-only sample values (STORA-053). Never serialized to the document. */\n variableCatalog: VariableCatalog;\n navigatorMode: NavigatorMode;\n tableSpreadsheetMode: TableSpreadsheetMode;\n\n setDocument: (document: PageDocument) => void;\n setDragPayload: (payload: DragPayload | null) => void;\n setVariableCatalog: (catalog: VariableCatalog) => void;\n setNavigatorMode: (mode: NavigatorMode) => void;\n toggleNavigator: () => void;\n setTableSpreadsheetMode: (mode: TableSpreadsheetMode) => void;\n toggleTableSpreadsheet: () => void;\n setOnChangeHandler: (handler: ((doc: PageDocument) => void) | null) => void;\n dispatch: (executor: (doc: PageDocument) => CommandResult) => void;\n insertComponent: (\n type: string,\n registry: ComponentRegistry,\n parentId?: string,\n index?: number,\n ) => InsertComponentResult;\n insertBlock: (\n blockOrId: BlockDefinition | string,\n parentId?: string,\n index?: number,\n ) => InsertComponentResult;\n moveComponent: (\n nodeId: string,\n targetParentId: string,\n registry: ComponentRegistry,\n index?: number,\n ) => MoveComponentResult;\n duplicateComponent: (nodeId: string, registry: ComponentRegistry) => DuplicateComponentResult;\n deleteComponent: (nodeId: string) => DeleteComponentResult;\n updateNodeProps: (\n nodeId: string,\n props: Record<string, unknown>,\n registry: ComponentRegistry,\n merge?: boolean,\n ) => UpdatePropsResult;\n updateNodeStyle: (\n nodeId: string,\n styles: StyleDefinition,\n breakpoint: 'base' | 'desktop' | 'tablet' | 'mobile',\n merge?: boolean,\n ) => UpdateStyleResult;\n /**\n * Update a pseudo-state style layer (e.g. ':hover') on a node — STORA-221.\n * Writes to node.styles.states[state] without touching default values.\n */\n updateNodeStateStyle: (\n nodeId: string,\n styles: StyleDefinition,\n state: string,\n merge?: boolean,\n ) => UpdateStyleResult;\n updateNodeAnimation: (\n nodeId: string,\n animation: Partial<AnimationConfig> | null,\n merge?: boolean,\n ) => UpdateAnimationResult;\n undo: () => void;\n redo: () => void;\n markSaved: () => void;\n copyNode: (nodeId: string) => void;\n pasteNode: (\n targetParentId: string,\n registry: ComponentRegistry,\n index?: number,\n ) => PasteComponentResult;\n selectNode: (nodeId: string | null) => void;\n selectParent: () => void;\n hoverNode: (nodeId: string | null) => void;\n setViewport: (viewport: Viewport) => void;\n getSelectedNode: () => Node | null;\n saveDraftAsTemplate: (metadata: SaveTemplateMetadata) => TemplateRecord;\n loadTemplate: (template: TemplateRecord | PageDocument, options?: CloneTemplateOptions) => void;\n}\n\n// Held outside reactive Zustand state: a mutable class instance, not serializable.\n// Recreated whenever a new document is loaded via setDocument.\nlet historyManager = new DocumentHistoryManager(createBlankDocument());\n\nfunction selectionAfter(document: PageDocument, selectedNodeId: string | null): string | null {\n if (!selectedNodeId) return null;\n return findNodeById(document.document, selectedNodeId) ? selectedNodeId : null;\n}\n\nexport const useEditorStore = create<EditorState>((set, get) => ({\n document: historyManager.document,\n selectedNodeId: null,\n hoveredNodeId: null,\n dragPayload: null,\n viewport: 'desktop',\n isDirty: false,\n canUndo: false,\n canRedo: false,\n clipboard: null,\n onChangeHandler: null,\n variableCatalog: [],\n navigatorMode: 'floating',\n tableSpreadsheetMode: 'floating',\n\n setDragPayload: (payload) => set({ dragPayload: payload }),\n setVariableCatalog: (catalog) => set({ variableCatalog: catalog }),\n setNavigatorMode: (mode) => set({ navigatorMode: mode }),\n toggleNavigator: () =>\n set((state) => ({\n navigatorMode: state.navigatorMode === 'hidden' ? 'floating' : 'hidden',\n })),\n setTableSpreadsheetMode: (mode) => set({ tableSpreadsheetMode: mode }),\n toggleTableSpreadsheet: () =>\n set((state) => ({\n tableSpreadsheetMode: state.tableSpreadsheetMode === 'hidden' ? 'floating' : 'hidden',\n })),\n\n setDocument: (document) => {\n historyManager = new DocumentHistoryManager(document);\n set({\n document: historyManager.document,\n isDirty: false,\n selectedNodeId: null,\n hoveredNodeId: null,\n dragPayload: null,\n clipboard: null,\n canUndo: false,\n canRedo: false,\n });\n },\n\n setOnChangeHandler: (handler) => set({ onChangeHandler: handler }),\n\n dispatch: (executor) => {\n const result = historyManager.execute(executor);\n const { selectedNodeId, onChangeHandler } = get();\n set({\n document: result.document,\n isDirty: true,\n canUndo: historyManager.canUndo,\n canRedo: historyManager.canRedo,\n selectedNodeId: selectionAfter(result.document, selectedNodeId),\n });\n onChangeHandler?.(result.document);\n },\n\n insertComponent: (type, registry, parentId, index) => {\n const state = get();\n const targetParentId = parentId ?? state.selectedNodeId ?? state.document.document.id;\n const parentNode = findNodeById(state.document.document, targetParentId);\n if (!parentNode) {\n return {\n success: false,\n error: `Insertion target \"${targetParentId}\" was not found in the document.`,\n };\n }\n\n const definition = registry.get(type);\n if (!definition) {\n return { success: false, error: `Unknown component type \"${type}\".` };\n }\n\n const policy = registry.canInsertChild(parentNode.type, type);\n if (!policy.valid) {\n return { success: false, error: policy.errors.join(' ') };\n }\n\n const props = deepClone(definition.defaultProps ?? {});\n if (definition.validateProps) {\n const propResult = definition.validateProps(props);\n if (Array.isArray(propResult) && propResult.length > 0) {\n return { success: false, error: propResult.join(' ') };\n }\n if (propResult === false) {\n return {\n success: false,\n error: `Default props for \"${definition.label}\" failed validation.`,\n };\n }\n }\n\n const existingIds = collectNodeIdSet(state.document.document);\n const nodeId = generateComponentNodeId(type, existingIds);\n existingIds.add(nodeId);\n const children = buildDefaultChildren(definition.defaultChildren, existingIds, registry);\n const node: Node = {\n id: nodeId,\n type,\n props,\n ...(definition.defaultStyles ? { styles: deepClone(definition.defaultStyles) } : {}),\n ...(children ? { children } : {}),\n };\n\n get().dispatch((doc) => insertNode(doc, { parentId: targetParentId, node, index }));\n get().selectNode(nodeId);\n\n return { success: true, nodeId };\n },\n\n insertBlock: (blockOrId, parentId, index) => {\n const state = get();\n const targetParentId = parentId ?? state.selectedNodeId ?? state.document.document.id;\n\n let blockDef: BlockDefinition | undefined;\n if (typeof blockOrId === 'string') {\n blockDef = STARTER_BLOCKS.find((b) => b.id === blockOrId);\n } else {\n blockDef = blockOrId;\n }\n\n if (!blockDef) {\n return { success: false, error: 'Block definition not found.' };\n }\n\n const existingIds = collectNodeIdSet(state.document.document);\n let counter = 1;\n const generateId = (prefix = 'node') => {\n let id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n while (existingIds.has(id)) {\n id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n }\n existingIds.add(id);\n return id;\n };\n\n const nodeTree = blockDef.createNodeTree(generateId);\n\n try {\n get().dispatch((doc) => insertNode(doc, { parentId: targetParentId, node: nodeTree, index }));\n get().selectNode(nodeTree.id);\n return { success: true, nodeId: nodeTree.id };\n } catch {\n // Fallback: try inserting at root\n try {\n get().dispatch((doc) =>\n insertNode(doc, { parentId: state.document.document.id, node: nodeTree }),\n );\n get().selectNode(nodeTree.id);\n return { success: true, nodeId: nodeTree.id };\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n }\n },\n\n moveComponent: (nodeId, targetParentId, registry, index) => {\n const state = get();\n\n if (nodeId === state.document.document.id) {\n return { success: false, error: 'Cannot move the root page node.' };\n }\n\n const sourceLocation = findNodeLocation(state.document.document, nodeId);\n if (!sourceLocation || !sourceLocation.parent) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n const targetParent = findNodeById(state.document.document, targetParentId);\n if (!targetParent) {\n return {\n success: false,\n error: `Move target \"${targetParentId}\" was not found in the document.`,\n };\n }\n\n if (isDescendantOf(sourceLocation.node, targetParentId)) {\n return {\n success: false,\n error: 'Cannot move a node into itself or one of its own descendants.',\n };\n }\n\n const policy = registry.canInsertChild(targetParent.type, sourceLocation.node.type);\n if (!policy.valid) {\n return { success: false, error: policy.errors.join(' ') };\n }\n\n // Reordering within the same parent: the source slot is removed before the\n // target index is applied, so any target position after it shifts left by one.\n const adjustedIndex =\n sourceLocation.parent.id === targetParentId &&\n typeof index === 'number' &&\n index > sourceLocation.index\n ? index - 1\n : index;\n\n get().dispatch((doc) => moveNode(doc, { nodeId, targetParentId, index: adjustedIndex }));\n\n return { success: true };\n },\n\n duplicateComponent: (nodeId, _registry) => {\n const state = get();\n\n if (nodeId === state.document.document.id) {\n return { success: false, error: 'Cannot duplicate the root page node.' };\n }\n\n const location = findNodeLocation(state.document.document, nodeId);\n if (!location || !location.parent) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n let newNodeId: string | undefined;\n try {\n get().dispatch((doc) => {\n const result = duplicateNode(doc, { nodeId });\n newNodeId = result.event.nodeId;\n return result;\n });\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n if (newNodeId) get().selectNode(newNodeId);\n return { success: true, nodeId: newNodeId };\n },\n\n deleteComponent: (nodeId) => {\n const state = get();\n\n if (nodeId === state.document.document.id) {\n return { success: false, error: 'Cannot delete the root page node.' };\n }\n\n if (!findNodeById(state.document.document, nodeId)) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n try {\n get().dispatch((doc) => removeNode(doc, { nodeId }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeProps: (nodeId, props, registry, merge = true) => {\n const state = get();\n const node = findNodeById(state.document.document, nodeId);\n if (!node) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n const definition = registry.get(node.type);\n if (!definition) {\n return { success: false, error: `Unknown component type \"${node.type}\".` };\n }\n\n if (definition.validateProps) {\n const candidate = merge\n ? { ...deepClone(node.props ?? {}), ...deepClone(props) }\n : deepClone(props);\n const propResult = definition.validateProps(candidate);\n if (Array.isArray(propResult) && propResult.length > 0) {\n return { success: false, error: propResult.join(' ') };\n }\n if (propResult === false) {\n return { success: false, error: `Props failed validation for \"${definition.label}\".` };\n }\n }\n\n try {\n get().dispatch((doc) => updateProps(doc, { nodeId, props, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeStyle: (nodeId, styles, breakpoint, merge = true) => {\n try {\n get().dispatch((doc) => updateStyle(doc, { nodeId, styles, breakpoint, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeStateStyle: (nodeId, styles, state, merge = true) => {\n try {\n get().dispatch((doc) => updateStyle(doc, { nodeId, styles, state, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeAnimation: (nodeId, animation, merge = true) => {\n try {\n get().dispatch((doc) => updateAnimation(doc, { nodeId, animation, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n undo: () => {\n const restored = historyManager.undo();\n if (!restored) return;\n const { selectedNodeId, onChangeHandler } = get();\n set({\n document: restored,\n isDirty: true,\n canUndo: historyManager.canUndo,\n canRedo: historyManager.canRedo,\n selectedNodeId: selectionAfter(restored, selectedNodeId),\n });\n onChangeHandler?.(restored);\n },\n\n redo: () => {\n const restored = historyManager.redo();\n if (!restored) return;\n const { selectedNodeId, onChangeHandler } = get();\n set({\n document: restored,\n isDirty: true,\n canUndo: historyManager.canUndo,\n canRedo: historyManager.canRedo,\n selectedNodeId: selectionAfter(restored, selectedNodeId),\n });\n onChangeHandler?.(restored);\n },\n\n markSaved: () => set({ isDirty: false }),\n\n copyNode: (nodeId) => {\n const node = findNodeById(get().document.document, nodeId);\n if (!node) return;\n set({ clipboard: deepClone(node) });\n },\n\n pasteNode: (targetParentId, registry, index) => {\n const { clipboard, document } = get();\n if (!clipboard) {\n return { success: false, error: 'Clipboard is empty.' };\n }\n\n const targetParent = findNodeById(document.document, targetParentId);\n if (!targetParent) {\n return {\n success: false,\n error: `Paste target \"${targetParentId}\" was not found in the document.`,\n };\n }\n\n if (isDescendantOf(clipboard, targetParentId)) {\n return {\n success: false,\n error: 'Cannot paste a node into itself or one of its own descendants.',\n };\n }\n\n const policy = registry.canInsertChild(targetParent.type, clipboard.type);\n if (!policy.valid) {\n return { success: false, error: policy.errors.join(' ') };\n }\n\n const existingIds = collectNodeIdSet(document.document);\n const { clonedNode } = cloneTreeWithNewIds(clipboard, undefined, existingIds);\n\n try {\n get().dispatch((doc) =>\n insertNode(doc, { parentId: targetParentId, node: clonedNode, index }),\n );\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n get().selectNode(clonedNode.id);\n return { success: true, nodeId: clonedNode.id };\n },\n\n selectNode: (nodeId) => set({ selectedNodeId: nodeId }),\n selectParent: () => {\n const { document, selectedNodeId } = get();\n if (!selectedNodeId) return;\n const parentId = getParentNodeId(document.document, selectedNodeId);\n if (parentId) {\n set({ selectedNodeId: parentId });\n }\n },\n hoverNode: (nodeId) => set({ hoveredNodeId: nodeId }),\n setViewport: (viewport) => set({ viewport }),\n getSelectedNode: () => {\n const { document, selectedNodeId } = get();\n if (!selectedNodeId) return null;\n return findNodeById(document.document, selectedNodeId);\n },\n\n saveDraftAsTemplate: (metadata) => {\n const currentDoc = get().document;\n return saveDraftAsTemplate(currentDoc, metadata);\n },\n\n loadTemplate: (template, options) => {\n const clonedDoc = cloneTemplateAsPage(template, options);\n get().setDocument(clonedDoc);\n },\n}));\n","import React, { useLayoutEffect, useRef, useState, useEffect } from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { KubuildRenderer } from '@kubuild/renderer';\nimport {\n RuntimeContext,\n Diagnostic,\n getNavigationTarget,\n NavigationDirection,\n findNodeById,\n findNodeLocation,\n isDescendantOf,\n} from '@kubuild/core';\nimport { useEditorStore, Viewport } from './store';\nimport { FloatingActionBadges } from './floating-badges';\nimport { EditorCanvasConfig } from './config';\n\nexport interface EditorCanvasProps {\n document?: PageDocument;\n registry: ComponentRegistry;\n context?: RuntimeContext;\n viewport: Viewport;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n config?: EditorCanvasConfig;\n}\n\ninterface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n}\n\nconst ARROW_DIRECTIONS: Record<string, NavigationDirection> = {\n ArrowUp: 'parent',\n ArrowDown: 'child',\n ArrowLeft: 'previous-sibling',\n ArrowRight: 'next-sibling',\n};\n\ninterface DropTarget {\n parentId: string;\n index?: number;\n position: 'before' | 'after' | 'inside';\n rect: Rect;\n}\n\nfunction rectFor(container: HTMLElement, nodeId: string | null): Rect | null {\n if (!nodeId) return null;\n const el = container.querySelector(`[data-kubuild-node=\"${CSS.escape(nodeId)}\"]`);\n if (!el) return null;\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n return {\n top: elRect.top - containerRect.top,\n left: elRect.left - containerRect.left,\n width: elRect.width,\n height: elRect.height,\n };\n}\n\nexport const EditorCanvas: React.FC<EditorCanvasProps> = ({\n document: propDoc,\n registry,\n context,\n viewport,\n onDiagnostic,\n config,\n}) => {\n const {\n document: storeDoc,\n selectedNodeId,\n hoveredNodeId,\n dragPayload,\n selectNode,\n hoverNode,\n updateNodeProps,\n setDragPayload,\n insertComponent,\n insertBlock,\n moveComponent,\n } = useEditorStore();\n const document = propDoc ?? storeDoc;\n const showFloatingBadges = config?.showFloatingBadges !== false;\n const containerRef = useRef<HTMLDivElement>(null);\n const [selectedRect, setSelectedRect] = useState<Rect | null>(null);\n const [hoveredRect, setHoveredRect] = useState<Rect | null>(null);\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n\n useLayoutEffect(() => {\n const recompute = () => {\n const container = containerRef.current;\n if (!container) return;\n setSelectedRect(rectFor(container, selectedNodeId));\n setHoveredRect(rectFor(container, hoveredNodeId));\n };\n\n recompute();\n const container = containerRef.current;\n window.addEventListener('resize', recompute);\n window.addEventListener('scroll', recompute, true);\n container?.addEventListener('input', recompute);\n return () => {\n window.removeEventListener('resize', recompute);\n window.removeEventListener('scroll', recompute, true);\n container?.removeEventListener('input', recompute);\n };\n }, [document, selectedNodeId, hoveredNodeId, viewport]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n container.querySelectorAll<HTMLElement>('[data-kubuild-node]').forEach((el) => {\n const id = el.getAttribute('data-kubuild-node');\n const isEditable = el.isContentEditable || el.getAttribute('contenteditable') === 'true';\n el.draggable = !!id && id !== document.document.id && !isEditable;\n });\n }, [document, viewport]);\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (isEditableTarget(e.target)) return;\n\n const state = useEditorStore.getState();\n\n if (e.key === 'Escape') {\n state.selectNode(null);\n return;\n }\n\n const mod = e.metaKey || e.ctrlKey;\n\n if (mod && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n e.preventDefault();\n state.undo();\n return;\n }\n if (mod && (e.key.toLowerCase() === 'y' || (e.key.toLowerCase() === 'z' && e.shiftKey))) {\n e.preventDefault();\n state.redo();\n return;\n }\n\n if (!state.selectedNodeId) return;\n\n if (mod && e.key.toLowerCase() === 'c') {\n state.copyNode(state.selectedNodeId);\n return;\n }\n if (mod && e.key.toLowerCase() === 'v') {\n state.pasteNode(state.selectedNodeId, registry);\n return;\n }\n if (mod && e.key.toLowerCase() === 'd') {\n e.preventDefault();\n state.duplicateComponent(state.selectedNodeId, registry);\n return;\n }\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (state.selectedNodeId === state.document.document.id) return;\n e.preventDefault();\n state.deleteComponent(state.selectedNodeId);\n return;\n }\n\n const direction = ARROW_DIRECTIONS[e.key];\n if (direction) {\n e.preventDefault();\n const target = getNavigationTarget(\n state.document.document,\n state.selectedNodeId,\n direction,\n );\n if (target) state.selectNode(target);\n }\n };\n\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [registry]);\n\n const handleMouseOver = (e: React.MouseEvent) => {\n const el = (e.target as HTMLElement).closest('[data-kubuild-node]');\n if (el) hoverNode(el.getAttribute('data-kubuild-node'));\n };\n\n const handleMouseLeave = () => hoverNode(null);\n\n const handleDragStart = (e: React.DragEvent) => {\n const target = e.target as HTMLElement;\n if (target.isContentEditable || target.closest('[contenteditable=\"true\"]')) {\n e.preventDefault();\n return;\n }\n const el = target.closest('[data-kubuild-node]');\n const nodeId = el?.getAttribute('data-kubuild-node');\n if (!nodeId || nodeId === document.document.id) {\n e.preventDefault();\n return;\n }\n e.stopPropagation();\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', nodeId);\n e.dataTransfer.setData('application/kubuild-drag-type', 'node');\n e.dataTransfer.setData('application/kubuild-node-id', nodeId);\n setDraggingId(nodeId);\n setDragPayload({ type: 'node', nodeId });\n selectNode(nodeId);\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n const activePayload =\n dragPayload ?? (draggingId ? { type: 'node' as const, nodeId: draggingId } : null);\n if (!activePayload) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const containerRect = container.getBoundingClientRect();\n const hoveredEl = (e.target as HTMLElement).closest(\n '[data-kubuild-node]',\n ) as HTMLElement | null;\n\n let incomingType: string | null = null;\n if (activePayload.type === 'node') {\n const draggedNode = findNodeById(document.document, activePayload.nodeId);\n incomingType = draggedNode?.type ?? null;\n } else if (activePayload.type === 'component') {\n incomingType = activePayload.componentType;\n } else if (activePayload.type === 'block') {\n incomingType = 'section';\n }\n\n if (!incomingType) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n if (!hoveredEl) {\n // Hovering directly over empty canvas container: default to dropping inside root page\n const rootNode = document.document;\n const policy = registry.canInsertChild(rootNode.type, incomingType);\n if (!policy.valid) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n e.preventDefault();\n e.dataTransfer.dropEffect = activePayload.type === 'node' ? 'move' : 'copy';\n setDropTarget({\n parentId: rootNode.id,\n index: rootNode.children?.length ?? 0,\n position: 'inside',\n rect: {\n top: 0,\n left: 0,\n width: containerRect.width,\n height: Math.max(containerRect.height, 200),\n },\n });\n return;\n }\n\n const hoveredId = hoveredEl.getAttribute('data-kubuild-node');\n if (!hoveredId) return;\n\n // If dragging an existing node, prevent dropping into itself or its descendants\n if (activePayload.type === 'node') {\n const draggedNode = findNodeById(document.document, activePayload.nodeId);\n if (!draggedNode || isDescendantOf(draggedNode, hoveredId)) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n }\n\n const hoveredNode = findNodeById(document.document, hoveredId);\n if (!hoveredNode) return;\n\n const elRect = hoveredEl.getBoundingClientRect();\n const ratio = elRect.height > 0 ? (e.clientY - elRect.top) / elRect.height : 0.5;\n const hoveredDef = registry.get(hoveredNode.type);\n const canGoInside = !!hoveredDef?.acceptsChildren;\n const location = findNodeLocation(document.document, hoveredId);\n\n let candidate: {\n parentId: string;\n index?: number;\n position: DropTarget['position'];\n targetType: string;\n };\n\n if (canGoInside && (!location?.parent || (ratio > 0.25 && ratio < 0.75))) {\n candidate = {\n parentId: hoveredId,\n index: hoveredNode.children?.length ?? 0,\n position: 'inside',\n targetType: hoveredNode.type,\n };\n } else if (location?.parent) {\n candidate = {\n parentId: location.parent.id,\n index: location.index + (ratio >= 0.5 ? 1 : 0),\n position: ratio >= 0.5 ? 'after' : 'before',\n targetType: location.parent.type,\n };\n } else {\n // Hovering root directly\n candidate = {\n parentId: document.document.id,\n index: document.document.children?.length ?? 0,\n position: 'inside',\n targetType: document.document.type,\n };\n }\n\n const policy = registry.canInsertChild(candidate.targetType, incomingType);\n if (!policy.valid) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n e.preventDefault();\n e.dataTransfer.dropEffect = activePayload.type === 'node' ? 'move' : 'copy';\n setDropTarget({\n parentId: candidate.parentId,\n index: candidate.index,\n position: candidate.position,\n rect: {\n top: elRect.top - containerRect.top,\n left: elRect.left - containerRect.left,\n width: elRect.width,\n height: elRect.height,\n },\n });\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n const activePayload =\n dragPayload ?? (draggingId ? { type: 'node' as const, nodeId: draggingId } : null);\n\n if (activePayload && dropTarget) {\n if (activePayload.type === 'node') {\n moveComponent(activePayload.nodeId, dropTarget.parentId, registry, dropTarget.index);\n } else if (activePayload.type === 'component') {\n insertComponent(\n activePayload.componentType,\n registry,\n dropTarget.parentId,\n dropTarget.index,\n );\n } else if (activePayload.type === 'block') {\n insertBlock(activePayload.blockId, dropTarget.parentId, dropTarget.index);\n }\n }\n\n setDraggingId(null);\n setDropTarget(null);\n setDragPayload(null);\n };\n\n const handleDragEnd = () => {\n setDraggingId(null);\n setDropTarget(null);\n setDragPayload(null);\n };\n\n return (\n <div\n ref={containerRef}\n style={{ position: 'relative' }}\n onMouseOver={handleMouseOver}\n onMouseLeave={handleMouseLeave}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n >\n <KubuildRenderer\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode=\"editor\"\n onNodeClick={(id: string) => selectNode(id)}\n onNodePropChange={(nodeId: string, propName: string, value: unknown, isBlur?: boolean) => {\n if (!isBlur && typeof value === 'string' && value.trim() === '') {\n return;\n }\n updateNodeProps(nodeId, { [propName]: value }, registry);\n }}\n onDiagnostic={onDiagnostic}\n />\n {hoveredRect && hoveredNodeId !== selectedNodeId && (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-hover-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n top: hoveredRect.top,\n left: hoveredRect.left,\n width: hoveredRect.width,\n height: hoveredRect.height,\n border: '1px dashed #94a3b8',\n }}\n />\n )}\n {selectedRect && (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-selection-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n top: selectedRect.top,\n left: selectedRect.left,\n width: selectedRect.width,\n height: selectedRect.height,\n border: '2px solid #3b82f6',\n }}\n />\n )}\n {showFloatingBadges && selectedRect && selectedNodeId && (\n <FloatingActionBadges\n selectedNodeId={selectedNodeId}\n document={document}\n registry={registry}\n selectedRect={selectedRect}\n onDragStart={handleDragStart}\n />\n )}\n {dropTarget &&\n (dropTarget.position === 'inside' ? (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-drop-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n top: dropTarget.rect.top,\n left: dropTarget.rect.left,\n width: dropTarget.rect.width,\n height: dropTarget.rect.height,\n border: '2px dashed #16a34a',\n backgroundColor: 'rgba(22, 163, 74, 0.08)',\n }}\n />\n ) : (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-drop-line-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n left: dropTarget.rect.left,\n width: dropTarget.rect.width,\n top:\n dropTarget.position === 'before'\n ? dropTarget.rect.top - 1\n : dropTarget.rect.top + dropTarget.rect.height - 1,\n height: 2,\n backgroundColor: '#16a34a',\n }}\n />\n ))}\n </div>\n );\n};\n","import React from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { findNodeById, getParentNodeId } from '@kubuild/core';\nimport { ArrowUp, Move, Copy, Trash2 } from 'lucide-react';\nimport { useEditorStore } from './store';\n\nexport interface FloatingActionBadgesProps {\n selectedNodeId: string;\n document: PageDocument;\n registry: ComponentRegistry;\n selectedRect: {\n top: number;\n left: number;\n width: number;\n height: number;\n };\n onDragStart?: (e: React.DragEvent) => void;\n}\n\n/**\n * Floating Action Badges rendered above the active bounding box on the canvas — STORA-230.\n * Includes:\n * - Component Type / Tag Badge\n * - Select Parent (ArrowUp)\n * - Move Handle (Move)\n * - Duplicate (Copy)\n * - Delete (Trash2)\n */\nexport const FloatingActionBadges: React.FC<FloatingActionBadgesProps> = ({\n selectedNodeId,\n document,\n registry,\n selectedRect,\n onDragStart,\n}) => {\n const { selectNode, duplicateComponent, deleteComponent } = useEditorStore();\n\n const node = findNodeById(document.document, selectedNodeId);\n if (!node) return null;\n\n const isRoot = node.id === document.document.id;\n const parentId = getParentNodeId(document.document, node.id);\n const definition = registry.get(node.type);\n const label = definition?.label || node.type;\n\n // Position badge directly above the bounding box top, clamped within canvas viewport\n const topPos = selectedRect.top >= 28 ? selectedRect.top - 26 : selectedRect.top;\n const leftPos = selectedRect.left;\n\n return (\n <div\n data-testid=\"floating-action-badges\"\n className=\"absolute flex items-center bg-blue-600 text-white rounded shadow-md text-xs font-medium z-50 select-none overflow-hidden\"\n style={{\n top: `${topPos}px`,\n left: `${leftPos}px`,\n pointerEvents: 'auto',\n transform: selectedRect.top < 28 ? 'translateY(0)' : 'translateY(-100%)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Element Tag Label */}\n <span\n data-testid=\"floating-badge-label\"\n className=\"px-2 py-1 bg-blue-700 font-semibold tracking-wide flex items-center gap-1\"\n >\n {label}\n </span>\n\n {/* Select Parent Button */}\n {parentId && (\n <button\n type=\"button\"\n data-testid=\"floating-badge-select-parent\"\n title=\"Select Parent\"\n aria-label=\"Select Parent\"\n onClick={() => selectNode(parentId)}\n className=\"px-1.5 py-1 hover:bg-blue-500 active:bg-blue-700 transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <ArrowUp className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n\n {/* Move Handle */}\n {!isRoot && (\n <div\n data-testid=\"floating-badge-move\"\n title=\"Move / Drag\"\n aria-label=\"Move\"\n draggable={true}\n onDragStart={onDragStart}\n className=\"px-1.5 py-1 hover:bg-blue-500 active:bg-blue-700 cursor-grab active:cursor-grabbing transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <Move className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </div>\n )}\n\n {/* Duplicate Button */}\n {!isRoot && (\n <button\n type=\"button\"\n data-testid=\"floating-badge-duplicate\"\n title=\"Duplicate (⌘D)\"\n aria-label=\"Duplicate\"\n onClick={() => duplicateComponent(node.id, registry)}\n className=\"px-1.5 py-1 hover:bg-blue-500 active:bg-blue-700 transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <Copy className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n\n {/* Delete Button */}\n {!isRoot && (\n <button\n type=\"button\"\n data-testid=\"floating-badge-delete\"\n title=\"Delete (Backspace / Del)\"\n aria-label=\"Delete\"\n onClick={() => deleteComponent(node.id)}\n className=\"px-1.5 py-1 hover:bg-red-500 active:bg-red-700 transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { useEditorStore } from './store';\nimport { ImportModal } from './import-modal';\nimport { CodeViewerModal } from './code-viewer-modal';\nimport { downloadDocumentAsStora, downloadDocumentAsJson } from './export-utils';\nimport { Copy, ClipboardPaste, CopyPlus, Trash2, Undo2, Redo2 } from 'lucide-react';\n\nimport { EditorToolbarConfig } from './config';\n\nexport interface EditorToolbarProps {\n registry: ComponentRegistry;\n className?: string;\n showExportImport?: boolean;\n config?: EditorToolbarConfig;\n}\n\ninterface ToolbarIconButtonProps {\n icon: React.ReactNode;\n label: string;\n shortcut?: string;\n onClick: () => void;\n disabled?: boolean;\n danger?: boolean;\n 'data-testid'?: string;\n}\n\nconst ToolbarIconButton: React.FC<ToolbarIconButtonProps> = ({\n icon,\n label,\n shortcut,\n onClick,\n disabled = false,\n danger = false,\n 'data-testid': testId,\n}) => {\n return (\n <div className=\"relative group flex items-center justify-center\">\n <button\n type=\"button\"\n data-testid={testId}\n disabled={disabled}\n onClick={onClick}\n aria-label={`${label}${shortcut ? ` (${shortcut})` : ''}`}\n title={`${label}${shortcut ? ` (${shortcut})` : ''}`}\n className={`p-1.5 rounded border border-slate-200 bg-white transition flex items-center justify-center cursor-pointer ${\n danger\n ? 'text-slate-700 hover:border-red-400 hover:text-red-600 hover:bg-red-50 disabled:opacity-35 disabled:cursor-not-allowed disabled:hover:bg-white disabled:hover:text-slate-700 disabled:hover:border-slate-200'\n : 'text-slate-700 hover:border-blue-400 hover:text-blue-600 hover:bg-blue-50 disabled:opacity-35 disabled:cursor-not-allowed disabled:hover:bg-white disabled:hover:text-slate-700 disabled:hover:border-slate-200'\n }`}\n >\n {icon}\n </button>\n\n {/* Floating tooltip on hover */}\n <div\n role=\"tooltip\"\n className=\"pointer-events-none absolute bottom-full mb-1.5 hidden group-hover:flex flex-col items-center z-50 animate-fadeIn select-none\"\n >\n <div className=\"bg-slate-900 text-white text-[11px] font-medium px-2 py-0.5 rounded shadow-md whitespace-nowrap flex items-center gap-1.5\">\n <span>{label}</span>\n {shortcut && <span className=\"text-slate-400 text-[10px] font-mono\">{shortcut}</span>}\n </div>\n <div className=\"w-1.5 h-1.5 bg-slate-900 rotate-45 -mt-1\" />\n </div>\n </div>\n );\n};\n\nexport const EditorToolbar: React.FC<EditorToolbarProps> = ({\n registry,\n className,\n showExportImport: propShowExportImport = true,\n config,\n}) => {\n const {\n document,\n setDocument,\n selectedNodeId,\n clipboard,\n canUndo,\n canRedo,\n navigatorMode,\n toggleNavigator,\n duplicateComponent,\n deleteComponent,\n copyNode,\n pasteNode,\n undo,\n redo,\n } = useEditorStore();\n const [error, setError] = useState<string | null>(null);\n const [isImportModalOpen, setIsImportModalOpen] = useState<boolean>(false);\n const [isCodeViewerModalOpen, setIsCodeViewerModalOpen] = useState<boolean>(false);\n const [isExporting, setIsExporting] = useState<boolean>(false);\n\n const showNavigatorToggle = config?.showNavigatorToggle !== false;\n const showHistory = config?.showHistory !== false;\n const showClipboard = config?.showClipboard !== false;\n const showCodeViewer = config?.showCodeViewer !== false;\n const showExportImport = propShowExportImport && config?.showExportImport !== false;\n const customActions = config?.customActions;\n\n const rootId = document.document.id;\n const hasSelection = !!selectedNodeId && selectedNodeId !== rootId;\n const canPaste = !!clipboard && !!selectedNodeId;\n\n const handleCopy = () => {\n if (!selectedNodeId) return;\n copyNode(selectedNodeId);\n setError(null);\n };\n\n const handlePaste = () => {\n if (!selectedNodeId) return;\n const result = pasteNode(selectedNodeId, registry);\n setError(result.success ? null : (result.error ?? 'Could not paste here.'));\n };\n\n const handleDuplicate = () => {\n if (!selectedNodeId) return;\n const result = duplicateComponent(selectedNodeId, registry);\n setError(result.success ? null : (result.error ?? 'Could not duplicate.'));\n };\n\n const handleDelete = () => {\n if (!selectedNodeId) return;\n const result = deleteComponent(selectedNodeId);\n setError(result.success ? null : (result.error ?? 'Could not delete.'));\n };\n\n const handleExportStora = async () => {\n setError(null);\n setIsExporting(true);\n try {\n await downloadDocumentAsStora(document, undefined, { componentRegistry: registry });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Unknown error during export.';\n setError(`Export failed: ${msg}`);\n } finally {\n setIsExporting(false);\n }\n };\n\n const handleExportJson = () => {\n setError(null);\n try {\n downloadDocumentAsJson(document);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Unknown error during JSON download.';\n setError(`JSON download failed: ${msg}`);\n }\n };\n\n return (\n <>\n <div className={`flex items-center gap-1.5 ${className || ''}`}>\n {error && (\n <div\n role=\"alert\"\n className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1 flex items-center gap-1 mr-1\"\n >\n <span>{error}</span>\n <button\n type=\"button\"\n onClick={() => setError(null)}\n className=\"text-red-400 hover:text-red-600 font-bold ml-1\"\n >\n ×\n </button>\n </div>\n )}\n\n {showNavigatorToggle && (\n <button\n type=\"button\"\n title={`Navigator / Element Tree (${navigatorMode !== 'hidden' ? 'Open' : 'Hidden'})`}\n onClick={toggleNavigator}\n className={`hidden sm:flex items-center gap-1 text-xs px-2.5 py-1 rounded border transition font-medium cursor-pointer ${\n navigatorMode !== 'hidden'\n ? 'border-blue-500 bg-blue-50 text-blue-700 shadow-xs'\n : 'border-slate-200 bg-white hover:border-slate-300 text-slate-700'\n }`}\n >\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\n </svg>\n <span>Navigator</span>\n </button>\n )}\n\n {showNavigatorToggle &&\n (showClipboard || showHistory || showCodeViewer || showExportImport) && (\n <div className=\"hidden sm:block h-4 w-px bg-slate-200 mx-1\" />\n )}\n\n {(showClipboard || showHistory) && (\n <div className=\"flex items-center gap-1\">\n {showClipboard && (\n <>\n <ToolbarIconButton\n icon={<Copy className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Copy\"\n shortcut=\"Ctrl/Cmd+C\"\n disabled={!hasSelection}\n onClick={handleCopy}\n data-testid=\"toolbar-copy\"\n />\n <ToolbarIconButton\n icon={<ClipboardPaste className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Paste\"\n shortcut=\"Ctrl/Cmd+V\"\n disabled={!canPaste}\n onClick={handlePaste}\n data-testid=\"toolbar-paste\"\n />\n <ToolbarIconButton\n icon={<CopyPlus className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Duplicate\"\n shortcut=\"Ctrl/Cmd+D\"\n disabled={!hasSelection}\n onClick={handleDuplicate}\n data-testid=\"toolbar-duplicate\"\n />\n <ToolbarIconButton\n icon={<Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Delete\"\n shortcut=\"Del\"\n disabled={!hasSelection}\n onClick={handleDelete}\n danger\n data-testid=\"toolbar-delete\"\n />\n </>\n )}\n {showClipboard && showHistory && <div className=\"h-3.5 w-px bg-slate-200 mx-0.5\" />}\n {showHistory && (\n <>\n <ToolbarIconButton\n icon={<Undo2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Undo\"\n shortcut=\"Ctrl/Cmd+Z\"\n disabled={!canUndo}\n onClick={undo}\n data-testid=\"toolbar-undo\"\n />\n <ToolbarIconButton\n icon={<Redo2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Redo\"\n shortcut=\"Ctrl/Cmd+Shift+Z\"\n disabled={!canRedo}\n onClick={redo}\n data-testid=\"toolbar-redo\"\n />\n </>\n )}\n </div>\n )}\n\n {(showClipboard || showHistory) && (showCodeViewer || showExportImport) && (\n <div className=\"hidden sm:block h-4 w-px bg-slate-200 mx-1\" />\n )}\n\n {showCodeViewer && (\n <button\n type=\"button\"\n title=\"View Semantic HTML & CSS (< >)\"\n onClick={() => setIsCodeViewerModalOpen(true)}\n className=\"flex items-center gap-1.5 text-xs px-2 sm:px-2.5 py-1 rounded border border-slate-200 bg-white hover:border-blue-500 hover:text-blue-600 font-medium text-slate-700 transition\"\n >\n <span className=\"font-mono text-[11px] font-bold text-blue-600\"><></span>\n <span className=\"hidden sm:inline\">View Code</span>\n </button>\n )}\n\n {showExportImport && (\n <div className=\"flex items-center gap-1\">\n {showCodeViewer && <div className=\"h-4 w-px bg-slate-200 mx-1\" />}\n <button\n type=\"button\"\n title=\"Import .stora Package\"\n onClick={() => setIsImportModalOpen(true)}\n className=\"text-xs px-2 sm:px-2.5 py-1 rounded border border-slate-200 bg-white hover:border-blue-500 hover:text-blue-600 font-medium text-slate-700 transition\"\n >\n Import\n </button>\n <button\n type=\"button\"\n title=\"Export .stora Archive\"\n disabled={isExporting}\n onClick={handleExportStora}\n className=\"text-xs px-2 sm:px-2.5 py-1 rounded border border-blue-600 bg-blue-600 hover:bg-blue-500 text-white font-medium disabled:opacity-50 transition shadow-xs\"\n >\n {isExporting ? '...' : 'Export'}\n </button>\n <button\n type=\"button\"\n title=\"Download page.json\"\n onClick={handleExportJson}\n className=\"hidden md:inline-block text-xs px-2 py-1 rounded border border-slate-200 bg-white hover:border-slate-400 text-slate-600 transition\"\n >\n JSON\n </button>\n </div>\n )}\n\n {customActions && (\n <>\n <div className=\"h-4 w-px bg-slate-200 mx-1\" />\n <div className=\"flex items-center gap-1\">{customActions}</div>\n </>\n )}\n </div>\n\n <ImportModal\n isOpen={isImportModalOpen}\n onClose={() => setIsImportModalOpen(false)}\n onImport={(importedDoc) => {\n setDocument(importedDoc);\n }}\n registry={registry}\n />\n\n <CodeViewerModal\n isOpen={isCodeViewerModalOpen}\n onClose={() => setIsCodeViewerModalOpen(false)}\n />\n </>\n );\n};\n","import React, { useState, useRef } from 'react';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { PageDocument, PageDocumentSchema } from '@kubuild/schema';\nimport {\n inspectPackage,\n importPackage,\n PreflightReport,\n MissingDependencyPolicy,\n validateDocument,\n} from '@kubuild/core';\n\nexport interface ImportModalProps {\n isOpen: boolean;\n onClose: () => void;\n onImport: (doc: PageDocument) => void;\n registry: ComponentRegistry;\n}\n\nexport const ImportModal: React.FC<ImportModalProps> = ({\n isOpen,\n onClose,\n onImport,\n registry,\n}) => {\n const [file, setFile] = useState<File | null>(null);\n const [fileBytes, setFileBytes] = useState<Uint8Array | null>(null);\n const [isJsonFile, setIsJsonFile] = useState<boolean>(false);\n const [jsonDoc, setJsonDoc] = useState<PageDocument | null>(null);\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [preflight, setPreflight] = useState<PreflightReport | null>(null);\n const [dependencyPolicy, setDependencyPolicy] = useState<MissingDependencyPolicy>('import-with-placeholder');\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n if (!isOpen) return null;\n\n const resetState = () => {\n setFile(null);\n setFileBytes(null);\n setIsJsonFile(false);\n setJsonDoc(null);\n setIsLoading(false);\n setError(null);\n setPreflight(null);\n setDependencyPolicy('import-with-placeholder');\n };\n\n const handleClose = () => {\n resetState();\n onClose();\n };\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = e.target.files?.[0];\n if (!selectedFile) return;\n await processFile(selectedFile);\n };\n\n const handleDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const droppedFile = e.dataTransfer.files?.[0];\n if (!droppedFile) return;\n await processFile(droppedFile);\n };\n\n const defaultSupportedCapabilities = [\n 'assetProvider',\n 'actionRegistry',\n 'variableRegistry',\n 'dataProvider',\n ];\n\n const processFile = async (selectedFile: File) => {\n setFile(selectedFile);\n setError(null);\n setIsLoading(true);\n setPreflight(null);\n setIsJsonFile(false);\n setJsonDoc(null);\n\n try {\n if (selectedFile.name.endsWith('.json')) {\n setIsJsonFile(true);\n const text = await selectedFile.text();\n const parsed = JSON.parse(text);\n const parseCheck = PageDocumentSchema.safeParse(parsed);\n if (!parseCheck.success) {\n throw new Error('Invalid Page Document JSON structure.');\n }\n const valResult = validateDocument(parseCheck.data, { componentRegistry: registry });\n if (!valResult.valid) {\n const firstErr = valResult.errors[0];\n throw new Error(`Document validation error: ${firstErr.message} at ${firstErr.path}`);\n }\n setJsonDoc(parseCheck.data);\n } else {\n // Assume .stora / zip archive\n const arrayBuffer = await selectedFile.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n setFileBytes(bytes);\n\n const report = await inspectPackage(bytes, {\n componentRegistry: registry,\n supportedCapabilities: defaultSupportedCapabilities,\n dependencyPolicy,\n });\n setPreflight(report);\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n setError(msg);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handlePolicyChange = async (newPolicy: MissingDependencyPolicy) => {\n setDependencyPolicy(newPolicy);\n if (fileBytes) {\n setIsLoading(true);\n try {\n const report = await inspectPackage(fileBytes, {\n componentRegistry: registry,\n supportedCapabilities: defaultSupportedCapabilities,\n dependencyPolicy: newPolicy,\n });\n setPreflight(report);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n }\n };\n\n const handleConfirmImport = async () => {\n if (isJsonFile && jsonDoc) {\n onImport(jsonDoc);\n handleClose();\n return;\n }\n\n if (!fileBytes) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await importPackage(fileBytes, {\n componentRegistry: registry,\n supportedCapabilities: defaultSupportedCapabilities,\n dependencyPolicy,\n });\n\n if (!result.success) {\n const errors = result.errors\n .filter((d) => d.severity === 'error')\n .map((d) => d.message)\n .join('; ');\n throw new Error(`Import failed: ${errors || result.diagnosticMessage || 'Unknown error'}`);\n }\n\n onImport(result.document);\n handleClose();\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n setError(msg);\n } finally {\n setIsLoading(false);\n }\n };\n\n const hasBlockingErrors =\n preflight &&\n (!preflight.canImport || preflight.diagnostics.some((d) => d.severity === 'error'));\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm p-4\">\n <div className=\"bg-slate-900 border border-slate-700 rounded-xl shadow-2xl w-full max-w-xl flex flex-col overflow-hidden text-slate-100 animate-in fade-in zoom-in-95 duration-150\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-slate-950/80\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-5 h-5 text-blue-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4\" />\n </svg>\n <h2 className=\"font-semibold text-base\">Import .stora Package</h2>\n </div>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"text-slate-400 hover:text-slate-200 p-1 rounded-lg hover:bg-slate-800 transition\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Content Body */}\n <div className=\"p-6 flex flex-col gap-4 max-h-[75vh] overflow-y-auto\">\n {/* Dropzone */}\n {!file && (\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n className=\"border-2 border-dashed border-slate-700 hover:border-blue-500 rounded-xl p-8 flex flex-col items-center justify-center gap-3 cursor-pointer bg-slate-950/40 hover:bg-slate-800/40 transition group\"\n >\n <div className=\"w-12 h-12 rounded-full bg-blue-500/10 flex items-center justify-center text-blue-400 group-hover:scale-110 transition\">\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n </div>\n <div className=\"text-center\">\n <p className=\"text-sm font-medium text-slate-200\">\n Click to select or drag and drop package\n </p>\n <p className=\"text-xs text-slate-400 mt-1\">Supports .stora portable archive and .json page document</p>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".stora,.zip,.json\"\n onChange={handleFileChange}\n className=\"hidden\"\n />\n </div>\n )}\n\n {/* Loading Indicator */}\n {isLoading && (\n <div className=\"flex items-center justify-center py-6 gap-3 text-sm text-slate-400\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n Inspecting package preflight...\n </div>\n )}\n\n {/* Error Banner */}\n {error && (\n <div className=\"p-3 bg-red-950/50 border border-red-800/80 rounded-lg text-xs text-red-300 flex items-start gap-2\">\n <svg className=\"w-4 h-4 text-red-400 shrink-0 mt-0.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1\">{error}</div>\n </div>\n )}\n\n {/* File Selected Badge */}\n {file && !isLoading && (\n <div className=\"flex items-center justify-between p-3 bg-slate-800/50 border border-slate-700/60 rounded-lg text-xs\">\n <div className=\"flex items-center gap-2 truncate\">\n <svg className=\"w-4 h-4 text-blue-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4\" />\n </svg>\n <span className=\"font-medium text-slate-200 truncate\">{file.name}</span>\n <span className=\"text-slate-400\">({(file.size / 1024).toFixed(1)} KB)</span>\n </div>\n <button\n type=\"button\"\n onClick={resetState}\n className=\"text-slate-400 hover:text-slate-200 px-2 py-1 rounded hover:bg-slate-700/50 transition\"\n >\n Change\n </button>\n </div>\n )}\n\n {/* JSON Preview */}\n {isJsonFile && jsonDoc && (\n <div className=\"bg-slate-950/60 border border-slate-800 rounded-lg p-4 flex flex-col gap-2 text-xs\">\n <div className=\"flex items-center gap-2 text-emerald-400 font-medium\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n Valid Page Document JSON\n </div>\n <div className=\"text-slate-300\">\n <span className=\"text-slate-400\">Title:</span> {jsonDoc.metadata?.title || 'Untitled'}\n </div>\n <div className=\"text-slate-300\">\n <span className=\"text-slate-400\">Schema Version:</span> {jsonDoc.version}\n </div>\n </div>\n )}\n\n {/* Preflight Report for .stora */}\n {preflight && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"bg-slate-950/60 border border-slate-800 rounded-lg p-4 flex flex-col gap-3 text-xs\">\n <div className=\"flex items-center justify-between border-b border-slate-800/80 pb-2\">\n <div className=\"font-semibold text-slate-200\">Preflight Inspection Report</div>\n <div\n className={`px-2 py-0.5 rounded-full text-[11px] font-medium flex items-center gap-1.5 ${\n preflight.canImport && preflight.diagnostics.length === 0\n ? 'bg-emerald-500/10 text-emerald-400 border border-emerald-500/20'\n : preflight.canImport\n ? 'bg-amber-500/10 text-amber-400 border border-amber-500/20'\n : 'bg-red-500/10 text-red-400 border border-red-500/20'\n }`}\n >\n <span>{preflight.canImport ? (preflight.diagnostics.length === 0 ? 'Ready' : 'Warnings') : 'Blocked'}</span>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2 text-slate-300\">\n <div>\n <span className=\"text-slate-400\">Package Version:</span>{' '}\n {preflight.manifest?.packageVersion || '1.0.0'}\n </div>\n <div>\n <span className=\"text-slate-400\">Schema Version:</span>{' '}\n {preflight.manifest?.schemaVersion || preflight.sourceVersion || '1.0.0'}\n </div>\n <div>\n <span className=\"text-slate-400\">Assets:</span>{' '}\n {preflight.assetCount} item(s)\n </div>\n <div>\n <span className=\"text-slate-400\">Requires Migration:</span>{' '}\n {preflight.requiresMigration ? 'Yes' : 'No'}\n </div>\n </div>\n\n {/* Missing Components */}\n {preflight.missingComponents.length > 0 && (\n <div className=\"mt-2 p-3 bg-amber-950/40 border border-amber-800/60 rounded-lg flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5 text-amber-400 font-medium\">\n <span>Missing Custom Components ({preflight.missingComponents.length})</span>\n </div>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {preflight.missingComponents.map((c) => (\n <span\n key={c}\n className=\"px-1.5 py-0.5 bg-amber-900/40 border border-amber-700/50 rounded font-mono text-[10px] text-amber-200\"\n >\n {c}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Missing Capabilities */}\n {preflight.missingCapabilities.length > 0 && (\n <div className=\"mt-2 p-3 bg-amber-950/40 border border-amber-800/60 rounded-lg flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5 text-amber-400 font-medium\">\n <span>Missing Capabilities ({preflight.missingCapabilities.length})</span>\n </div>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {preflight.missingCapabilities.map((cap) => (\n <span\n key={cap}\n className=\"px-1.5 py-0.5 bg-amber-900/40 border border-amber-700/50 rounded font-mono text-[10px] text-amber-200\"\n >\n {cap}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Policy Selector if there are missing dependencies */}\n {(preflight.missingComponents.length > 0 || preflight.missingCapabilities.length > 0) && (\n <div className=\"mt-2 flex flex-col gap-1.5\">\n <label className=\"text-slate-400 text-[11px] font-medium\">Import Policy Decision:</label>\n <div className=\"grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => handlePolicyChange('import-with-placeholder')}\n className={`p-2 rounded-lg border text-left text-xs transition ${\n dependencyPolicy === 'import-with-placeholder'\n ? 'border-blue-500 bg-blue-500/10 text-blue-300 font-medium'\n : 'border-slate-800 bg-slate-900/50 text-slate-400 hover:border-slate-700'\n }`}\n >\n <div className=\"font-medium\">Use Placeholders</div>\n <p className=\"text-[10px] text-slate-400 mt-1\">\n Keep nodes intact for placeholder rendering\n </p>\n </button>\n\n <button\n type=\"button\"\n onClick={() => handlePolicyChange('cancel')}\n className={`p-2 rounded-lg border text-left text-xs transition ${\n dependencyPolicy === 'cancel'\n ? 'border-red-500 bg-red-500/10 text-red-300 font-medium'\n : 'border-slate-800 bg-slate-900/50 text-slate-400 hover:border-slate-700'\n }`}\n >\n <div className=\"font-medium\">Strict (Block)</div>\n <p className=\"text-[10px] text-slate-400 mt-1\">\n Abort import if any dependencies missing\n </p>\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Footer Actions */}\n <div className=\"flex items-center justify-end gap-2 px-6 py-4 border-t border-slate-800 bg-slate-950/80\">\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"px-4 py-2 rounded-lg text-xs text-slate-400 hover:text-slate-200 hover:bg-slate-800 transition\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={(!preflight && !jsonDoc) || !!hasBlockingErrors || isLoading}\n onClick={handleConfirmImport}\n className=\"px-4 py-2 rounded-lg text-xs font-medium bg-blue-600 hover:bg-blue-500 text-white disabled:opacity-40 disabled:cursor-not-allowed transition shadow-lg shadow-blue-500/20\"\n >\n Import to Editor\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useMemo, useCallback } from 'react';\nimport type { PageDocument } from '@kubuild/schema';\nimport {\n generateSemanticHtml,\n generateDocumentCss,\n generateStandaloneHtml,\n} from '@kubuild/renderer';\nimport { useEditorStore } from './store';\nimport { downloadFile, sanitizeDocumentFilename } from './export-utils';\nimport { CodeHighlighter } from './code-highlighter';\n\nexport interface CodeViewerModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n document?: PageDocument;\n}\n\nexport type CodeTab = 'combined' | 'html' | 'css';\n\nexport const CodeViewerModal: React.FC<CodeViewerModalProps> = ({\n isOpen,\n onClose,\n title = 'Live Code Viewer',\n document: customDoc,\n}) => {\n const storeDoc = useEditorStore((state) => state.document);\n const doc = customDoc || storeDoc;\n const [activeTab, setActiveTab] = useState<CodeTab>('combined');\n const [copied, setCopied] = useState<boolean>(false);\n const [includeReset, setIncludeReset] = useState<boolean>(true);\n const [includeNodeClasses, setIncludeNodeClasses] = useState<boolean>(true);\n\n // Generate code based on active document and user options\n const htmlCode = useMemo(() => {\n return generateSemanticHtml(doc, {\n includeNodeClasses,\n indentSize: 2,\n });\n }, [doc, includeNodeClasses]);\n\n const cssCode = useMemo(() => {\n return generateDocumentCss(doc, {\n includeReset,\n });\n }, [doc, includeReset]);\n\n const combinedCode = useMemo(() => {\n return generateStandaloneHtml(doc, {\n htmlOptions: { includeNodeClasses, indentSize: 2 },\n cssOptions: { includeReset },\n });\n }, [doc, includeNodeClasses, includeReset]);\n\n const activeCode = useMemo(() => {\n switch (activeTab) {\n case 'html':\n return htmlCode;\n case 'css':\n return cssCode;\n case 'combined':\n default:\n return combinedCode;\n }\n }, [activeTab, htmlCode, cssCode, combinedCode]);\n\n const lineCount = useMemo(() => {\n return activeCode ? activeCode.split('\\n').length : 0;\n }, [activeCode]);\n\n const charCount = useMemo(() => {\n return activeCode.length;\n }, [activeCode]);\n\n const countNodes = useCallback((node: any): number => {\n let count = 1;\n if (node?.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n count += countNodes(child);\n }\n }\n return count;\n }, []);\n\n const totalNodes = useMemo(() => {\n return countNodes(doc.document);\n }, [doc, countNodes]);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(activeCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers or restricted environments\n const textarea = window.document.createElement('textarea');\n textarea.value = activeCode;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n window.document.body.appendChild(textarea);\n textarea.select();\n window.document.execCommand('copy');\n window.document.body.removeChild(textarea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [activeCode]);\n\n const handleDownload = useCallback(() => {\n const docTitle = doc.metadata?.title || 'page';\n if (activeTab === 'css') {\n const filename = sanitizeDocumentFilename(docTitle, 'css');\n downloadFile(cssCode, filename, 'text/css');\n } else {\n const filename = sanitizeDocumentFilename(docTitle, 'html');\n downloadFile(activeCode, filename, 'text/html');\n }\n }, [activeTab, activeCode, cssCode, doc.metadata?.title]);\n\n // Handle ESC key to close\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"code-viewer-title\"\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 sm:p-6 bg-black/60 backdrop-blur-xs animate-in fade-in duration-150\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div className=\"relative w-full max-w-5xl h-[85vh] flex flex-col bg-slate-900 border border-slate-700/80 rounded-2xl shadow-2xl overflow-hidden text-slate-100 font-sans\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-slate-900/90 shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-blue-500/10 border border-blue-500/30 flex items-center justify-center text-blue-400 font-mono text-xs font-semibold\">\n <>\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h2 id=\"code-viewer-title\" className=\"text-base font-semibold text-white tracking-tight\">\n {title}\n </h2>\n <span className=\"flex items-center gap-1 text-[10px] font-medium px-2 py-0.5 rounded-full bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse\" />\n Live Sync\n </span>\n </div>\n <p className=\"text-xs text-slate-400\">\n Production-ready clean semantic HTML & structured CSS\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Copy Button */}\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`flex items-center gap-1.5 text-xs font-medium px-3.5 py-1.5 rounded-lg border transition shadow-xs ${\n copied\n ? 'bg-emerald-600 border-emerald-500 text-white'\n : 'bg-blue-600 hover:bg-blue-500 border-blue-500 text-white active:scale-95'\n }`}\n title=\"Copy code to clipboard\"\n >\n {copied ? (\n <>\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n <span>Copied!</span>\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n <span>Copy Code</span>\n </>\n )}\n </button>\n\n {/* Download Button */}\n <button\n type=\"button\"\n onClick={handleDownload}\n className=\"flex items-center gap-1.5 text-xs font-medium px-3 py-1.5 rounded-lg border border-slate-700 bg-slate-800 hover:bg-slate-700/80 text-slate-200 hover:text-white transition\"\n title={`Download as .${activeTab === 'css' ? 'css' : 'html'}`}\n >\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n <span>Download</span>\n </button>\n\n {/* Close Button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center text-slate-400 hover:text-white hover:bg-slate-800 transition\"\n title=\"Close modal (Esc)\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Tab & Controls Bar */}\n <div className=\"flex flex-wrap items-center justify-between px-6 py-2.5 border-b border-slate-800 bg-slate-900/60 shrink-0 gap-3\">\n {/* Tabs */}\n <div className=\"flex items-center gap-1 bg-slate-950/60 p-1 rounded-lg border border-slate-800\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('combined')}\n className={`px-3 py-1 text-xs font-medium rounded-md transition ${\n activeTab === 'combined'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200 hover:bg-slate-800/50'\n }`}\n >\n HTML & CSS\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('html')}\n className={`px-3 py-1 text-xs font-medium rounded-md transition ${\n activeTab === 'html'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200 hover:bg-slate-800/50'\n }`}\n >\n Semantic HTML\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('css')}\n className={`px-3 py-1 text-xs font-medium rounded-md transition ${\n activeTab === 'css'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200 hover:bg-slate-800/50'\n }`}\n >\n Structured CSS\n </button>\n </div>\n\n {/* Options Switches */}\n <div className=\"flex items-center gap-4 text-xs text-slate-400\">\n {activeTab !== 'html' && (\n <label className=\"flex items-center gap-1.5 cursor-pointer hover:text-slate-300 transition\">\n <input\n type=\"checkbox\"\n checked={includeReset}\n onChange={(e) => setIncludeReset(e.target.checked)}\n className=\"rounded border-slate-700 bg-slate-800 text-blue-600 focus:ring-0 focus:ring-offset-0\"\n />\n <span>Include CSS Reset</span>\n </label>\n )}\n\n {activeTab !== 'css' && (\n <label className=\"flex items-center gap-1.5 cursor-pointer hover:text-slate-300 transition\">\n <input\n type=\"checkbox\"\n checked={includeNodeClasses}\n onChange={(e) => setIncludeNodeClasses(e.target.checked)}\n className=\"rounded border-slate-700 bg-slate-800 text-blue-600 focus:ring-0 focus:ring-offset-0\"\n />\n <span>Include Node Classes</span>\n </label>\n )}\n </div>\n </div>\n\n {/* Code Content View */}\n <div className=\"flex-1 min-h-0 bg-slate-950 overflow-auto font-mono text-xs text-slate-200 flex select-text\">\n {/* Line Numbers */}\n <div className=\"py-4 pl-4 pr-3 select-none text-right text-slate-600 border-r border-slate-800/80 bg-slate-950/80 shrink-0 sticky left-0\">\n {Array.from({ length: lineCount }, (_, i) => (\n <div key={i + 1} className=\"leading-5 h-5 font-mono text-[11px]\">\n {i + 1}\n </div>\n ))}\n </div>\n\n {/* Syntax Highlighted Code Area */}\n <div className=\"flex-1 p-4 overflow-x-auto\">\n <CodeHighlighter code={activeCode} mode={activeTab} />\n </div>\n </div>\n\n {/* Footer info bar */}\n <div className=\"flex items-center justify-between px-6 py-2.5 border-t border-slate-800 bg-slate-900 text-xs text-slate-400 shrink-0\">\n <div className=\"flex items-center gap-4\">\n <span>\n <strong className=\"text-slate-300 font-semibold\">{totalNodes}</strong> Elements\n </span>\n <span className=\"w-1 h-1 rounded-full bg-slate-700\" />\n <span>\n <strong className=\"text-slate-300 font-semibold\">{lineCount}</strong> Lines\n </span>\n <span className=\"w-1 h-1 rounded-full bg-slate-700\" />\n <span>\n <strong className=\"text-slate-300 font-semibold\">{(charCount / 1024).toFixed(1)}</strong> KB\n </span>\n </div>\n\n <div className=\"text-[11px] text-slate-500\">\n Format: {activeTab === 'combined' ? 'Single-file HTML document' : activeTab === 'html' ? 'Semantic HTML markup' : 'Clean CSS stylesheet'}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { PageDocument } from '@kubuild/schema';\nimport { exportPackage, ExportPackageOptions } from '@kubuild/core';\n\n/**\n * Clean a page title into a safe download filename slug\n */\nexport function sanitizeDocumentFilename(name: string, extension: string): string {\n const clean = name\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n return `${clean || 'page'}.${extension.replace(/^\\./, '')}`;\n}\n\n/**\n * Triggers a browser download of in-memory binary or text data.\n */\nexport function downloadFile(\n data: Uint8Array | ArrayBuffer | string,\n filename: string,\n mimeType: string = 'application/octet-stream'\n): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n const blob = data instanceof Blob ? data : new Blob([data as BlobPart], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/**\n * Exports a PageDocument as a .stora portable archive and initiates browser download.\n */\nexport async function downloadDocumentAsStora(\n doc: PageDocument,\n filename?: string,\n options?: ExportPackageOptions\n): Promise<Uint8Array> {\n const result = await exportPackage(doc, {\n allowExternalFallback: true,\n ...options,\n });\n if (!result.success) {\n const errorDetails = result.errors.map((e) => `${e.path}: ${e.message}`).join(', ');\n throw new Error(`Export failed: ${errorDetails || result.diagnosticMessage || 'Unknown error'}`);\n }\n\n const name = filename || sanitizeDocumentFilename(doc.metadata?.title || 'page', 'stora');\n downloadFile(result.archive, name, 'application/vnd.stora.package+zip');\n return result.archive;\n}\n\n/**\n * Exports a PageDocument as a formatted JSON document and initiates browser download.\n */\nexport function downloadDocumentAsJson(doc: PageDocument, filename?: string): void {\n const name = filename || sanitizeDocumentFilename(doc.metadata?.title || 'page', 'json');\n const jsonStr = JSON.stringify(doc, null, 2);\n downloadFile(jsonStr, name, 'application/json');\n}\n","import React from 'react';\n\nexport type LanguageMode = 'combined' | 'html' | 'css';\n\ninterface Token {\n type:\n | 'plain'\n | 'tag-name'\n | 'tag-bracket'\n | 'attr-name'\n | 'attr-equal'\n | 'attr-value'\n | 'comment'\n | 'doctype'\n | 'css-selector-class'\n | 'css-selector-id'\n | 'css-selector-elem'\n | 'css-pseudo'\n | 'css-property'\n | 'css-value-number'\n | 'css-value-color'\n | 'css-value-keyword'\n | 'css-value-string'\n | 'css-value-important'\n | 'css-atrule'\n | 'css-punctuation'\n | 'css-function';\n text: string;\n}\n\nconst TOKEN_STYLES: Record<Token['type'], string> = {\n plain: 'text-slate-200',\n 'tag-name': 'text-sky-400 font-medium',\n 'tag-bracket': 'text-slate-500',\n 'attr-name': 'text-amber-300',\n 'attr-equal': 'text-slate-400',\n 'attr-value': 'text-emerald-400',\n comment: 'text-slate-500 italic',\n doctype: 'text-indigo-400 font-semibold',\n 'css-selector-class': 'text-amber-300 font-medium',\n 'css-selector-id': 'text-amber-400 font-medium',\n 'css-selector-elem': 'text-sky-400',\n 'css-pseudo': 'text-indigo-300',\n 'css-property': 'text-cyan-300',\n 'css-value-number': 'text-emerald-300 font-mono',\n 'css-value-color': 'text-yellow-300',\n 'css-value-keyword': 'text-purple-300',\n 'css-value-string': 'text-emerald-400',\n 'css-value-important': 'text-rose-400 font-semibold',\n 'css-atrule': 'text-purple-400 font-semibold',\n 'css-punctuation': 'text-slate-400',\n 'css-function': 'text-blue-300',\n};\n\nconst CSS_KEYWORDS = new Set([\n 'block', 'inline', 'inline-block', 'flex', 'inline-flex', 'grid', 'inline-grid',\n 'none', 'inherit', 'initial', 'unset', 'revert', 'auto', 'normal', 'bold', 'bolder',\n 'lighter', 'italic', 'center', 'left', 'right', 'justify', 'start', 'end',\n 'flex-start', 'flex-end', 'space-between', 'space-around', 'space-evenly', 'stretch',\n 'baseline', 'row', 'row-reverse', 'column', 'column-reverse', 'wrap', 'nowrap',\n 'wrap-reverse', 'relative', 'absolute', 'fixed', 'sticky', 'static', 'hidden',\n 'visible', 'scroll', 'border-box', 'content-box', 'solid', 'dashed', 'dotted',\n 'double', 'groove', 'ridge', 'inset', 'outset', 'transparent', 'currentColor',\n 'antialiased', 'subpixel-antialiased', 'pointer', 'default', 'not-allowed',\n 'crosshair', 'move', 'text', 'wait', 'grab', 'grabbing', 'nowrap', 'pre', 'pre-wrap',\n 'pre-line', 'break-word', 'break-all', 'contain', 'cover', 'fill', 'scale-down',\n]);\n\nconst HTML_TAG_NAMES = new Set([\n 'html', 'head', 'body', 'title', 'meta', 'link', 'style', 'script', 'base',\n 'div', 'span', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'section', 'article',\n 'aside', 'header', 'footer', 'nav', 'main', 'figure', 'figcaption', 'ul', 'ol',\n 'li', 'a', 'button', 'input', 'textarea', 'select', 'option', 'form', 'label',\n 'img', 'picture', 'video', 'audio', 'source', 'iframe', 'canvas', 'svg', 'path',\n 'circle', 'rect', 'line', 'polyline', 'polygon', 'g', 'defs', 'clippath', 'table',\n 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'blockquote', 'hr', 'br', 'strong',\n 'em', 'code', 'pre', 'small', 'sub', 'sup', 'i', 'b', 'time', 'address', 'details',\n 'summary', 'dialog',\n]);\n\n/**\n * Tokenize a single line of CSS\n */\nfunction tokenizeCssLine(line: string, inBlockRef: { inBlock: boolean }): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n const len = line.length;\n\n while (i < len) {\n // 1. Whitespace\n if (/\\s/.test(line[i])) {\n let ws = '';\n while (i < len && /\\s/.test(line[i])) {\n ws += line[i++];\n }\n tokens.push({ type: 'plain', text: ws });\n continue;\n }\n\n // 2. CSS Comments: /* ... */\n if (line.slice(i, i + 2) === '/*') {\n const closeIdx = line.indexOf('*/', i + 2);\n if (closeIdx !== -1) {\n tokens.push({ type: 'comment', text: line.slice(i, closeIdx + 2) });\n i = closeIdx + 2;\n } else {\n tokens.push({ type: 'comment', text: line.slice(i) });\n i = len;\n }\n continue;\n }\n\n // 3. At-rules (e.g. @media, @keyframes)\n if (line[i] === '@') {\n let atrule = '';\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i] === '@' ? 'a' : line[i])) {\n atrule += line[i++];\n }\n tokens.push({ type: 'css-atrule', text: atrule });\n continue;\n }\n\n // 4. Braces & Punctuation\n if (line[i] === '{') {\n inBlockRef.inBlock = true;\n tokens.push({ type: 'css-punctuation', text: '{' });\n i++;\n continue;\n }\n if (line[i] === '}') {\n inBlockRef.inBlock = false;\n tokens.push({ type: 'css-punctuation', text: '}' });\n i++;\n continue;\n }\n if (line[i] === ';' || line[i] === ',') {\n tokens.push({ type: 'css-punctuation', text: line[i] });\n i++;\n continue;\n }\n\n // 5. Inside declaration block { ... }\n if (inBlockRef.inBlock) {\n // String literals inside values\n if (line[i] === '\"' || line[i] === \"'\") {\n const quote = line[i];\n let str = quote;\n i++;\n while (i < len && line[i] !== quote) {\n if (line[i] === '\\\\' && i + 1 < len) {\n str += line[i++];\n }\n str += line[i++];\n }\n if (i < len) str += line[i++];\n tokens.push({ type: 'css-value-string', text: str });\n continue;\n }\n\n // Colon ':' separator\n if (line[i] === ':') {\n tokens.push({ type: 'css-punctuation', text: ':' });\n i++;\n continue;\n }\n\n // !important\n if (line.slice(i, i + 10).toLowerCase() === '!important') {\n tokens.push({ type: 'css-value-important', text: line.slice(i, i + 10) });\n i += 10;\n continue;\n }\n\n // Hex colors: #fff, #1a2b3c, etc.\n if (line[i] === '#') {\n let hex = '#';\n i++;\n while (i < len && /[0-9a-fA-F]/.test(line[i])) {\n hex += line[i++];\n }\n tokens.push({ type: 'css-value-color', text: hex });\n continue;\n }\n\n // Function calls: rgb(), rgba(), hsl(), var(), calc(), url()\n const fnMatch = line.slice(i).match(/^([a-zA-Z_-][a-zA-Z0-9_-]*)\\(/);\n if (fnMatch) {\n tokens.push({ type: 'css-function', text: fnMatch[1] });\n tokens.push({ type: 'css-punctuation', text: '(' });\n i += fnMatch[0].length;\n continue;\n }\n\n // Numbers & Units (e.g. 100%, 16px, 1.5, 0, -2rem)\n const numMatch = line.slice(i).match(/^-?\\d+(\\.\\d+)?(px|rem|em|%|vh|vw|vmin|vmax|s|ms|deg|fr|ch|ex)?/);\n if (numMatch && numMatch[0].length > 0) {\n tokens.push({ type: 'css-value-number', text: numMatch[0] });\n i += numMatch[0].length;\n continue;\n }\n\n // Identifiers: Property names or keyword values\n const identMatch = line.slice(i).match(/^-?[a-zA-Z_-][a-zA-Z0-9_-]*/);\n if (identMatch) {\n const ident = identMatch[0];\n // Peek forward: if next non-ws char before ';' or '}' is ':', it's a property name\n const rest = line.slice(i + ident.length);\n const nextColon = rest.match(/^\\s*:/);\n if (nextColon) {\n tokens.push({ type: 'css-property', text: ident });\n } else if (CSS_KEYWORDS.has(ident.toLowerCase())) {\n tokens.push({ type: 'css-value-keyword', text: ident });\n } else {\n tokens.push({ type: 'plain', text: ident });\n }\n i += ident.length;\n continue;\n }\n\n // Fallback char\n tokens.push({ type: 'plain', text: line[i++] });\n continue;\n }\n\n // 6. Outside declaration block: Selectors\n // Class selector (.className)\n if (line[i] === '.') {\n let cls = '.';\n i++;\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n cls += line[i++];\n }\n tokens.push({ type: 'css-selector-class', text: cls });\n continue;\n }\n\n // ID selector (#idName)\n if (line[i] === '#') {\n let idSel = '#';\n i++;\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n idSel += line[i++];\n }\n tokens.push({ type: 'css-selector-id', text: idSel });\n continue;\n }\n\n // Pseudo class or pseudo element (:hover, ::before)\n if (line[i] === ':') {\n let pseudo = ':';\n i++;\n if (i < len && line[i] === ':') {\n pseudo += ':';\n i++;\n }\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n pseudo += line[i++];\n }\n tokens.push({ type: 'css-pseudo', text: pseudo });\n continue;\n }\n\n // Element or Universal selector (* or div or body)\n if (line[i] === '*') {\n tokens.push({ type: 'css-selector-elem', text: '*' });\n i++;\n continue;\n }\n\n const selElemMatch = line.slice(i).match(/^[a-zA-Z0-9_-]+/);\n if (selElemMatch) {\n tokens.push({ type: 'css-selector-elem', text: selElemMatch[0] });\n i += selElemMatch[0].length;\n continue;\n }\n\n // Fallback char in selector (e.g. '>', '+', '~')\n tokens.push({ type: 'css-punctuation', text: line[i++] });\n }\n\n return tokens;\n}\n\n/**\n * Tokenize a single line of HTML\n */\nfunction tokenizeHtmlLine(\n line: string,\n state: { inStyleTag: boolean; inCssBlock: boolean; inHtmlComment: boolean }\n): Token[] {\n // If we are inside multi-line HTML comment\n if (state.inHtmlComment) {\n const endIdx = line.indexOf('-->');\n if (endIdx !== -1) {\n state.inHtmlComment = false;\n const commentPart = line.slice(0, endIdx + 3);\n const rest = line.slice(endIdx + 3);\n return [\n { type: 'comment', text: commentPart },\n ...tokenizeHtmlLine(rest, state),\n ];\n }\n return [{ type: 'comment', text: line }];\n }\n\n // If inside <style> block, parse as CSS until </style>\n if (state.inStyleTag) {\n const closeStyleIdx = line.indexOf('</style>');\n if (closeStyleIdx !== -1) {\n const cssPart = line.slice(0, closeStyleIdx);\n const closeTag = '</style>';\n const rest = line.slice(closeStyleIdx + closeTag.length);\n state.inStyleTag = false;\n\n const cssTokens = tokenizeCssLine(cssPart, { inBlock: state.inCssBlock });\n const tagTokens: Token[] = [\n { type: 'tag-bracket', text: '</' },\n { type: 'tag-name', text: 'style' },\n { type: 'tag-bracket', text: '>' },\n ];\n const restTokens = tokenizeHtmlLine(rest, state);\n return [...cssTokens, ...tagTokens, ...restTokens];\n }\n const blockRef = { inBlock: state.inCssBlock };\n const tokens = tokenizeCssLine(line, blockRef);\n state.inCssBlock = blockRef.inBlock;\n return tokens;\n }\n\n const tokens: Token[] = [];\n let i = 0;\n const len = line.length;\n\n while (i < len) {\n // 1. HTML Comment: <!-- ... -->\n if (line.slice(i, i + 4) === '<!--') {\n const closeIdx = line.indexOf('-->', i + 4);\n if (closeIdx !== -1) {\n tokens.push({ type: 'comment', text: line.slice(i, closeIdx + 3) });\n i = closeIdx + 3;\n } else {\n state.inHtmlComment = true;\n tokens.push({ type: 'comment', text: line.slice(i) });\n i = len;\n }\n continue;\n }\n\n // 2. DOCTYPE declaration: <!DOCTYPE html>\n if (line.slice(i, i + 9).toUpperCase() === '<!DOCTYPE') {\n const closeIdx = line.indexOf('>', i);\n if (closeIdx !== -1) {\n tokens.push({ type: 'doctype', text: line.slice(i, closeIdx + 1) });\n i = closeIdx + 1;\n } else {\n tokens.push({ type: 'doctype', text: line.slice(i) });\n i = len;\n }\n continue;\n }\n\n // 3. HTML Tags: <tag or </tag\n if (line[i] === '<') {\n let isClosing = false;\n let startIdx = i;\n i++; // consume '<'\n\n if (i < len && line[i] === '/') {\n isClosing = true;\n i++; // consume '/'\n }\n\n // Tag name\n let tagName = '';\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n tagName += line[i++];\n }\n\n tokens.push({\n type: 'tag-bracket',\n text: isClosing ? '</' : '<',\n });\n\n if (tagName) {\n tokens.push({\n type: 'tag-name',\n text: tagName,\n });\n }\n\n // If it's an opening <style> tag, track state\n if (!isClosing && tagName.toLowerCase() === 'style') {\n state.inStyleTag = true;\n }\n\n // Parse attributes inside tag until '>' or '/>'\n while (i < len && line[i] !== '>') {\n if (line.slice(i, i + 2) === '/>') {\n tokens.push({ type: 'tag-bracket', text: '/>' });\n i += 2;\n break;\n }\n\n // Whitespace in tag\n if (/\\s/.test(line[i])) {\n let ws = '';\n while (i < len && /\\s/.test(line[i])) ws += line[i++];\n tokens.push({ type: 'plain', text: ws });\n continue;\n }\n\n // Attribute name\n const attrMatch = line.slice(i).match(/^[a-zA-Z0-9_:-]+/);\n if (attrMatch) {\n tokens.push({ type: 'attr-name', text: attrMatch[0] });\n i += attrMatch[0].length;\n\n // Check if followed by '='\n let wsBeforeEq = '';\n while (i < len && /\\s/.test(line[i])) wsBeforeEq += line[i++];\n\n if (i < len && line[i] === '=') {\n if (wsBeforeEq) tokens.push({ type: 'plain', text: wsBeforeEq });\n tokens.push({ type: 'attr-equal', text: '=' });\n i++;\n\n // Whitespace after '='\n let wsAfterEq = '';\n while (i < len && /\\s/.test(line[i])) wsAfterEq += line[i++];\n if (wsAfterEq) tokens.push({ type: 'plain', text: wsAfterEq });\n\n // Attribute value\n if (i < len && (line[i] === '\"' || line[i] === \"'\")) {\n const quote = line[i++];\n let val = quote;\n while (i < len && line[i] !== quote) {\n val += line[i++];\n }\n if (i < len) val += line[i++]; // consume closing quote\n tokens.push({ type: 'attr-value', text: val });\n } else {\n // Unquoted attr value\n let unquoted = '';\n while (i < len && !/[\\s>]/.test(line[i])) {\n unquoted += line[i++];\n }\n if (unquoted) {\n tokens.push({ type: 'attr-value', text: unquoted });\n }\n }\n }\n continue;\n }\n\n // Fallback character inside tag\n tokens.push({ type: 'plain', text: line[i++] });\n }\n\n // Closing '>'\n if (i < len && line[i] === '>') {\n tokens.push({ type: 'tag-bracket', text: '>' });\n i++;\n }\n continue;\n }\n\n // 4. Plain text between HTML tags\n let text = '';\n while (i < len && line[i] !== '<') {\n text += line[i++];\n }\n if (text) {\n tokens.push({ type: 'plain', text });\n }\n }\n\n return tokens;\n}\n\n/**\n * Tokenize entire code string line-by-line according to the language mode\n */\nexport function tokenizeCode(code: string, mode: LanguageMode): Token[][] {\n if (!code) return [];\n const lines = code.split('\\n');\n\n if (mode === 'css') {\n const blockRef = { inBlock: false };\n return lines.map((line) => tokenizeCssLine(line, blockRef));\n }\n\n // HTML or Combined\n const state = {\n inStyleTag: false,\n inCssBlock: false,\n inHtmlComment: false,\n };\n\n return lines.map((line) => tokenizeHtmlLine(line, state));\n}\n\nexport interface CodeHighlighterProps {\n code: string;\n mode: LanguageMode;\n}\n\n/**\n * Performant, rich syntax-highlighted code display\n */\nexport const CodeHighlighter: React.FC<CodeHighlighterProps> = ({ code, mode }) => {\n const tokenizedLines = React.useMemo(() => tokenizeCode(code, mode), [code, mode]);\n\n return (\n <div className=\"flex-1 font-mono text-[12px] leading-5 whitespace-pre\">\n {tokenizedLines.map((lineTokens, lineIdx) => (\n <div key={lineIdx} className=\"h-5 leading-5 min-w-full\">\n {lineTokens.length === 0 ? (\n <span className=\"inline-block\"> </span>\n ) : (\n lineTokens.map((tok, tokIdx) => (\n <span key={tokIdx} className={TOKEN_STYLES[tok.type]}>\n {tok.text}\n </span>\n ))\n )}\n </div>\n ))}\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport { ComponentRegistry, ComponentFieldDefinition, isBindableField } from '@kubuild/components';\nimport { findNodeById, findNodeLocation } from '@kubuild/core';\nimport { isVariableBinding, PageDocument, AnimationConfig } from '@kubuild/schema';\nimport { useEditorStore, Viewport } from './store';\nimport { VariableBindingControl, toBindingValue } from './variable-picker';\nimport { AssetManagerModal } from './asset-manager-modal';\nimport { TableSpreadsheetEditor } from './table-spreadsheet-editor';\nimport { BoxModelEditor } from './box-model-editor';\nimport { StyleManagerAccordion } from './style-manager-accordion';\nimport { TraitsPanel } from './traits-panel';\nimport { ComponentIcon } from './icons';\nimport { replayNodeAnimation } from '@kubuild/renderer';\nimport { AlertTriangle, Palette, Settings, Crosshair, Trash2, X } from 'lucide-react';\n\nimport { StyleSectorId } from './style-manager-accordion';\nimport { EditorInspectorConfig } from './config';\n\nexport interface InspectorPanelProps {\n registry: ComponentRegistry;\n className?: string;\n document?: PageDocument;\n selectedNodeId?: string | null;\n config?: EditorInspectorConfig;\n}\n\nconst SPACING_FIELDS: Array<{ name: string; label: string }> = [\n { name: 'marginTop', label: 'Margin Top' },\n { name: 'marginRight', label: 'Margin Right' },\n { name: 'marginBottom', label: 'Margin Bottom' },\n { name: 'marginLeft', label: 'Margin Left' },\n { name: 'paddingTop', label: 'Padding Top' },\n { name: 'paddingRight', label: 'Padding Right' },\n { name: 'paddingBottom', label: 'Padding Bottom' },\n { name: 'paddingLeft', label: 'Padding Left' },\n];\n\nconst SPACING_UNITS = ['px', 'rem', '%', 'em', 'vh', 'vw', 'auto'] as const;\ntype SpacingUnit = (typeof SPACING_UNITS)[number];\n\nfunction parseSpacingValue(val: unknown): { num: string; unit: SpacingUnit } {\n if (typeof val === 'number') {\n return { num: String(val), unit: 'px' };\n }\n if (typeof val !== 'string' || val.trim() === '') {\n return { num: '', unit: 'px' };\n }\n const str = val.trim();\n if (str.toLowerCase() === 'auto') {\n return { num: 'auto', unit: 'auto' };\n }\n const match = str.match(/^(-?\\d*\\.?\\d+)\\s*(px|rem|%|em|vh|vw)?$/i);\n if (match) {\n const unitMatch = (match[2]?.toLowerCase() || 'px') as SpacingUnit;\n return {\n num: match[1],\n unit: (SPACING_UNITS as readonly string[]).includes(unitMatch) ? unitMatch : 'px',\n };\n }\n return { num: str, unit: 'px' };\n}\n\n// Desktop edits target the 'base' style layer (every ComponentDefinition ships its\n// baseline appearance under 'base'; nothing populates a distinct 'desktop' key today).\nfunction styleBreakpointFor(viewport: Viewport): 'base' | 'tablet' | 'mobile' {\n return viewport === 'desktop' ? 'base' : viewport;\n}\n\nfunction ErrorText({ message }: { message: string | null | undefined }) {\n if (!message) return null;\n return (\n <div role=\"alert\" className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1 mt-1\">\n {message}\n </div>\n );\n}\n\ninterface StringPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst StringPropControl: React.FC<StringPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n onKeyDown,\n}) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextVal = e.target.value;\n setText(nextVal);\n onCommit(field, nextVal, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n onCommit(field, text, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onCommit(field, text, false);\n };\n\n return (\n <input\n type=\"text\"\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n placeholder={field.defaultValue !== undefined ? String(field.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface MediaSrcPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n onOpenAssetPicker: () => void;\n}\n\nconst MediaSrcPropControl: React.FC<MediaSrcPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n onOpenAssetPicker,\n}) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextVal = e.target.value;\n setText(nextVal);\n onCommit(field, nextVal, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n onCommit(field, text, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onCommit(field, text, false);\n };\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n setText(dataUrl);\n onCommit(field, dataUrl, true);\n };\n reader.readAsDataURL(file);\n e.target.value = '';\n };\n\n const handleClear = () => {\n setText('');\n onCommit(field, '', true);\n };\n\n const isLocalFilePath = text.trim().startsWith('file:') || /^[a-zA-Z]:\\\\/.test(text.trim());\n const isDataUrl = text.startsWith('data:image/');\n const hasPreview = text.trim().length > 0 && (isDataUrl || text.startsWith('http://') || text.startsWith('https://') || text.startsWith('blob:'));\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileUpload}\n accept=\"image/png, image/jpeg, image/jpg, image/webp, image/svg+xml, image/gif, image/avif\"\n className=\"hidden\"\n />\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder=\"https://... or upload local image\"\n className=\"flex-1 min-w-0 text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 font-mono text-[11px]\"\n />\n <button\n type=\"button\"\n title=\"Upload local image from device\"\n aria-label=\"Upload local image from device\"\n onClick={() => fileInputRef.current?.click()}\n className=\"shrink-0 p-1.5 rounded border border-slate-300 bg-white text-slate-600 hover:text-blue-600 hover:border-blue-400 hover:bg-blue-50/50 transition flex items-center gap-1 text-xs font-medium cursor-pointer\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n <span className=\"text-[11px]\">Upload</span>\n </button>\n <button\n type=\"button\"\n title=\"Browse Asset Gallery\"\n aria-label=\"Browse Asset Gallery\"\n onClick={onOpenAssetPicker}\n className=\"shrink-0 p-1.5 rounded border border-slate-300 bg-white text-slate-600 hover:text-blue-600 hover:border-blue-400 hover:bg-blue-50/50 transition cursor-pointer\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </button>\n </div>\n\n {hasPreview && (\n <div className=\"flex items-center gap-2 bg-slate-50 border border-slate-200 rounded p-1.5\">\n <img\n src={text}\n alt=\"Preview\"\n className=\"w-8 h-8 object-cover rounded border border-slate-300 bg-white\"\n onError={(e) => {\n (e.target as HTMLElement).style.display = 'none';\n }}\n />\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <span className=\"text-[11px] font-medium text-slate-700 truncate\">\n {isDataUrl ? 'Local Image (Embedded)' : text}\n </span>\n <span className=\"text-[10px] text-slate-400\">\n {isDataUrl ? 'Base64 image data' : 'URL / Asset'}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={handleClear}\n title=\"Clear image\"\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition cursor-pointer text-xs\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n {isLocalFilePath && (\n <div className=\"text-[11px] text-amber-700 bg-amber-50 border border-amber-200 rounded p-1.5 leading-tight\">\n Browsers cannot open direct local paths (<code className=\"font-mono\">file://</code>). Click <strong>Upload</strong> above to select and load the local image directly.\n </div>\n )}\n </div>\n );\n};\n\n\ninterface TextAreaPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n}\n\nconst TextAreaPropControl: React.FC<TextAreaPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n onKeyDown,\n}) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const nextVal = e.target.value;\n setText(nextVal);\n onCommit(field, nextVal, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n onCommit(field, text, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onCommit(field, text, false);\n };\n\n return (\n <textarea\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n rows={3}\n placeholder={field.defaultValue !== undefined ? String(field.defaultValue) : ''}\n className=\"w-full text-xs font-mono bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface NumberPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n setError: (error: string | null) => void;\n}\n\nconst NumberPropControl: React.FC<NumberPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n setError,\n}) => {\n const valueStr = typeof value === 'number' ? String(value) : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'number' ? String(value) : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setText(val);\n if (val === '' || val === '-') {\n setError(null);\n return;\n }\n const parsed = Number(val);\n if (Number.isNaN(parsed)) {\n setError('Must be a number.');\n return;\n }\n setError(null);\n onCommit(field, parsed, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n if (text === '') {\n onCommit(field, undefined, true);\n return;\n }\n const parsed = Number(text);\n if (Number.isNaN(parsed)) {\n setError('Must be a number.');\n return;\n }\n onCommit(field, parsed, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n setError(null);\n };\n\n return (\n <input\n type=\"number\"\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={field.defaultValue !== undefined ? String(field.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface SpacingControlProps {\n nodeId: string;\n breakpoint: 'base' | 'tablet' | 'mobile';\n fieldName: string;\n fieldLabel: string;\n value: unknown;\n onCommit: (fieldName: string, value: string) => void;\n error?: string | null;\n}\n\nconst SpacingControl: React.FC<SpacingControlProps> = ({\n nodeId,\n breakpoint,\n fieldName,\n fieldLabel,\n value,\n onCommit,\n error,\n}) => {\n const parsed = parseSpacingValue(value);\n const [num, setNum] = useState(parsed.num);\n const [unit, setUnit] = useState<SpacingUnit>(parsed.unit);\n\n useEffect(() => {\n const next = parseSpacingValue(value);\n setNum(next.num);\n setUnit(next.unit);\n }, [value, nodeId, breakpoint]);\n\n const handleNumChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawNum = e.target.value;\n setNum(rawNum);\n if (rawNum.trim() === '') {\n onCommit(fieldName, '');\n return;\n }\n if (unit === 'auto') {\n onCommit(fieldName, 'auto');\n return;\n }\n onCommit(fieldName, `${rawNum.trim()}${unit}`);\n };\n\n const handleUnitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const nextUnit = e.target.value as SpacingUnit;\n setUnit(nextUnit);\n if (nextUnit === 'auto') {\n setNum('auto');\n onCommit(fieldName, 'auto');\n return;\n }\n if (num === 'auto') {\n setNum('');\n onCommit(fieldName, '');\n return;\n }\n if (num.trim() !== '') {\n onCommit(fieldName, `${num.trim()}${nextUnit}`);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const isMargin = fieldName.startsWith('margin');\n\n return (\n <div>\n <label className=\"block text-xs font-medium text-slate-600 mb-1\">{fieldLabel}</label>\n <div className=\"flex items-center rounded border border-slate-300 bg-white focus-within:ring-1 focus-within:ring-blue-500 focus-within:border-blue-500 overflow-hidden shadow-xs\">\n <input\n type={unit === 'auto' ? 'text' : 'number'}\n value={num}\n placeholder=\"0\"\n disabled={unit === 'auto'}\n onChange={handleNumChange}\n onKeyDown={handleKeyDown}\n className=\"w-full min-w-0 text-xs bg-white text-slate-900 px-2 py-1.5 focus:outline-none disabled:bg-slate-100 disabled:text-slate-500\"\n />\n <select\n value={unit}\n onChange={handleUnitChange}\n aria-label={`${fieldLabel} Unit`}\n className=\"shrink-0 text-xs bg-slate-100 text-slate-700 font-medium px-1.5 py-1.5 border-l border-slate-200 focus:outline-none cursor-pointer hover:bg-slate-200 transition\"\n >\n <option value=\"px\">px</option>\n <option value=\"rem\">rem</option>\n <option value=\"%\">%</option>\n <option value=\"em\">em</option>\n <option value=\"vh\">vh</option>\n <option value=\"vw\">vw</option>\n {isMargin && <option value=\"auto\">auto</option>}\n </select>\n </div>\n <ErrorText message={error} />\n </div>\n );\n};\n\n/**\n * Amber warning badge shown above the style manager while editing a\n * non-default pseudo-state layer (e.g. `:hover`) — STORA-223.\n */\nexport const StateEditingBadge: React.FC<{ state: string }> = ({ state }) => (\n <div\n data-testid=\"state-editing-badge\"\n className=\"flex items-center gap-1.5 mb-2 px-2 py-1.5 rounded bg-amber-50 border border-amber-300 text-amber-800 text-xs font-medium\"\n >\n <AlertTriangle className=\"w-3.5 h-3.5 text-amber-600 shrink-0\" aria-hidden=\"true\" />\n <span>Editing {state} State</span>\n </div>\n);\n\nexport const InspectorPanel: React.FC<InspectorPanelProps> = ({\n registry,\n className,\n document: propDocument,\n selectedNodeId: propSelectedNodeId,\n config,\n}) => {\n const storeState = useEditorStore((s) => s);\n const document = propDocument ?? storeState.document;\n const selectedNodeId =\n propSelectedNodeId !== undefined ? propSelectedNodeId : storeState.selectedNodeId;\n const {\n viewport,\n updateNodeProps,\n updateNodeStyle,\n updateNodeStateStyle,\n updateNodeAnimation,\n variableCatalog,\n insertComponent,\n deleteComponent,\n selectNode,\n tableSpreadsheetMode,\n setTableSpreadsheetMode,\n } = storeState;\n\n const showProps = config?.showProps !== false;\n const showTraits = config?.showTraits !== false;\n const showStyles = config?.showStyles !== false;\n const showStateSelector = config?.showStateSelector !== false;\n const allowedStyleSectors = config?.allowedStyleSectors;\n\n const initialTab = !showStyles && showTraits ? 'traits' : 'style';\n\n const [fieldErrors, setFieldErrors] = useState<Record<string, string | null>>({});\n const [activeTab, setActiveTab] = useState<'style' | 'traits'>(initialTab);\n // STORA-250 — asset manager modal state (open + which prop field it targets).\n const [assetPickerField, setAssetPickerField] = useState<string | null>(null);\n // Active pseudo-state layer for the style manager — STORA-221.\n const [activeState, setActiveState] = useState<string>('default');\n\n useEffect(() => {\n if (!showStyles && showTraits && activeTab !== 'traits') {\n setActiveTab('traits');\n } else if (!showTraits && showStyles && activeTab !== 'style') {\n setActiveTab('style');\n }\n }, [showStyles, showTraits, activeTab]);\n\n const node = selectedNodeId ? findNodeById(document.document, selectedNodeId) : null;\n const definition = node ? registry.get(node.type) : undefined;\n\n useEffect(() => {\n setFieldErrors({});\n }, [node?.id]);\n\n if (!node || !definition) {\n return (\n <div className={`p-3 text-xs text-slate-500 ${className || ''}`}>No element selected.</div>\n );\n }\n\n const setError = (key: string, error: string | null) => {\n setFieldErrors((prev) => ({ ...prev, [key]: error }));\n };\n\n const commitProp = (field: ComponentFieldDefinition, value: unknown, isBlur = true) => {\n const errorKey = `prop:${field.name}`;\n if (!isBlur) {\n // While typing / focused: allow temporary empty state without showing red error banner\n if (typeof value === 'string' && value.trim() === '') {\n setError(errorKey, null);\n return;\n }\n const result = updateNodeProps(node.id, { [field.name]: value }, registry);\n if (result.success) {\n setError(errorKey, null);\n }\n return;\n }\n\n // On blur: validate and commit final value\n const result = updateNodeProps(node.id, { [field.name]: value }, registry);\n setError(errorKey, result.success ? null : result.error ?? 'Invalid value.');\n };\n\n const renderPropControl = (field: ComponentFieldDefinition) => {\n const currentValue = node.props?.[field.name];\n const errorKey = `prop:${field.name}`;\n\n switch (field.type) {\n case 'boolean':\n return (\n <input\n type=\"checkbox\"\n checked={Boolean(currentValue)}\n onChange={(e) => commitProp(field, e.target.checked, true)}\n />\n );\n case 'select':\n return (\n <select\n value={String(currentValue ?? '')}\n onChange={(e) => {\n const option = field.options?.find((o) => String(o.value) === e.target.value);\n commitProp(field, option ? option.value : e.target.value, true);\n }}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n {(field.options ?? []).map((opt) => (\n <option key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n case 'color':\n return (\n <input\n type=\"color\"\n value={typeof currentValue === 'string' ? currentValue : '#000000'}\n onChange={(e) => commitProp(field, e.target.value, true)}\n className=\"w-full h-8 cursor-pointer rounded border border-slate-300 bg-white p-1\"\n />\n );\n case 'number':\n return (\n <NumberPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n setError={(err) => setError(errorKey, err)}\n />\n );\n case 'image':\n case 'action':\n case 'json':\n return (\n <textarea\n defaultValue={JSON.stringify(currentValue ?? null, null, 2)}\n onBlur={(e) => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(e.target.value);\n } catch {\n setError(errorKey, 'Invalid JSON.');\n }\n commitProp(field, parsed, true);\n }}\n rows={3}\n className=\"w-full text-xs font-mono bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n case 'textarea':\n return (\n <TextAreaPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n />\n );\n case 'string':\n default: {\n const isMediaSrcField = field.name === 'src' || field.name === 'poster';\n if (isMediaSrcField) {\n return (\n <MediaSrcPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n onOpenAssetPicker={() => setAssetPickerField(field.name)}\n />\n );\n }\n return (\n <StringPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && node.type === 'list-item' && field.name === 'text') {\n e.preventDefault();\n const location = findNodeLocation(document.document, node.id);\n if (location && location.parent && location.parent.type === 'list') {\n insertComponent('list-item', registry, location.parent.id);\n }\n }\n }}\n />\n );\n }\n }\n };\n\n const activeBreakpoint = styleBreakpointFor(viewport);\n const activeLayer =\n activeState === 'default'\n ? ((node.styles?.[activeBreakpoint] as Record<string, unknown> | undefined) ?? {})\n : ((node.styles?.states?.[activeState] as Record<string, unknown> | undefined) ?? {});\n\n const handleCommitSpacing = (fieldName: string, value: string) => {\n const errorKey = `style:${fieldName}`;\n const result =\n activeState === 'default'\n ? updateNodeStyle(node.id, { [fieldName]: value }, activeBreakpoint)\n : updateNodeStateStyle(node.id, { [fieldName]: value }, activeState);\n setError(errorKey, result.success ? null : result.error ?? 'Invalid value.');\n };\n\n const handleResetStyles = (properties?: string[]) => {\n if (!node) return;\n const targetProps = properties && properties.length > 0 ? properties : Object.keys(activeLayer);\n const resetMap = targetProps.reduce<Record<string, string>>((acc, p) => {\n acc[p] = '';\n return acc;\n }, {});\n if (activeState === 'default') {\n updateNodeStyle(node.id, resetMap, activeBreakpoint);\n } else {\n updateNodeStateStyle(node.id, resetMap, activeState);\n }\n };\n\n const handleAddListItem = (e?: React.SyntheticEvent) => {\n if (e) e.preventDefault();\n const result = insertComponent('list-item', registry, node.id);\n if (result.success && result.nodeId) {\n setTimeout(() => {\n const el = window.document.getElementById(`list-item-input-${result.nodeId}`);\n if (el) {\n (el as HTMLInputElement).focus();\n (el as HTMLInputElement).select();\n }\n }, 50);\n }\n };\n\n const handleCommitTrait = (traitName: string, value: unknown) => {\n const result = updateNodeProps(node.id, { [traitName]: value }, registry);\n setError(`trait:${traitName}`, result.success ? null : result.error ?? 'Invalid value.');\n };\n\n return (\n <div className={`flex flex-col h-full min-h-0 overflow-hidden text-sm text-slate-900 ${className || ''}`}>\n {/* STORA-250 — Asset Manager Modal: picking an asset updates the target prop instantly. */}\n {assetPickerField && (\n <AssetManagerModal\n isOpen\n onClose={() => setAssetPickerField(null)}\n onSelect={(url) => {\n const result = updateNodeProps(node.id, { [assetPickerField]: url }, registry);\n setError(`prop:${assetPickerField}`, result.success ? null : result.error ?? 'Invalid value.');\n }}\n />\n )}\n {/* Tab bar: Style / Traits — STORA-211 */}\n {showStyles && showTraits && (\n <div className=\"flex shrink-0 border-b border-slate-200 bg-slate-50\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('style')}\n className={`flex-1 px-3 py-2 text-xs font-medium transition border-b-2 flex items-center justify-center gap-1.5 ${\n activeTab === 'style'\n ? 'text-blue-600 border-blue-600 bg-white'\n : 'text-slate-500 border-transparent hover:text-slate-700 hover:bg-slate-100'\n }`}\n >\n <Palette className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n <span>Style</span>\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('traits')}\n className={`flex-1 px-3 py-2 text-xs font-medium transition border-b-2 flex items-center justify-center gap-1.5 ${\n activeTab === 'traits'\n ? 'text-blue-600 border-blue-600 bg-white'\n : 'text-slate-500 border-transparent hover:text-slate-700 hover:bg-slate-100'\n }`}\n >\n <Settings className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n <span>Traits</span>\n </button>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 overflow-y-auto overflow-x-hidden flex flex-col gap-4 p-3 min-w-0\">\n {node.type === 'list' && (\n <div className=\"pb-3 border-b border-slate-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n List Items ({node.children?.length ?? 0})\n </div>\n <button\n type=\"button\"\n onClick={handleAddListItem}\n className=\"px-2 py-1 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n >\n + Add Item\n </button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {(!node.children || node.children.length === 0) && (\n <div className=\"text-xs text-slate-400 italic\">No items yet. Click \"+ Add Item\" or press Enter.</div>\n )}\n {node.children?.map((child, idx) => (\n <div\n key={child.id}\n className=\"flex items-center gap-1.5 bg-slate-50 p-1.5 rounded border border-slate-200\"\n >\n <span className=\"text-[11px] font-mono text-slate-400 w-4 text-center\">{idx + 1}.</span>\n <input\n id={`list-item-input-${child.id}`}\n type=\"text\"\n value={typeof child.props?.text === 'string' ? child.props.text : ''}\n onChange={(e) => updateNodeProps(child.id, { text: e.target.value }, registry)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddListItem(e);\n }\n }}\n placeholder={`Item ${idx + 1}`}\n className=\"flex-1 text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <button\n type=\"button\"\n title=\"Select Item\"\n onClick={() => selectNode(child.id)}\n className=\"p-1 text-slate-400 hover:text-blue-600 rounded flex items-center justify-center\"\n >\n <Crosshair className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n title=\"Delete Item\"\n onClick={() => deleteComponent(child.id)}\n className=\"p-1 text-slate-400 hover:text-red-600 rounded flex items-center justify-center\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {node.type === 'table' && (\n <div className=\"pb-3 border-b border-slate-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Spreadsheet Grid\n </div>\n <div className=\"flex items-center gap-1\">\n {tableSpreadsheetMode === 'docked' ? (\n <button\n type=\"button\"\n onClick={() => setTableSpreadsheetMode('floating')}\n className=\"px-2 py-0.5 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n title=\"Pop out to floating window\"\n >\n Pop out (Float)\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => setTableSpreadsheetMode('docked')}\n className=\"px-2 py-0.5 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n title=\"Dock grid into inspector\"\n >\n Dock Grid Here\n </button>\n )}\n </div>\n </div>\n\n {tableSpreadsheetMode === 'docked' ? (\n <div className=\"mb-2\">\n <TableSpreadsheetEditor\n registry={registry}\n tableNode={node}\n mode=\"docked\"\n onToggleMode={() => setTableSpreadsheetMode('floating')}\n />\n </div>\n ) : (\n <div className=\"flex flex-col gap-1.5 mb-2\">\n <div className=\"flex items-center justify-between p-2 bg-blue-50/70 border border-blue-200 rounded text-xs text-blue-800\">\n <span className=\"font-medium flex items-center gap-1.5\">\n <ComponentIcon iconOrType=\"table\" size={13} />\n <span>\n {tableSpreadsheetMode === 'floating'\n ? 'Grid is Floating on Canvas'\n : 'Grid is Hidden'}\n </span>\n </span>\n <button\n type=\"button\"\n onClick={() =>\n setTableSpreadsheetMode(\n tableSpreadsheetMode === 'floating' ? 'docked' : 'floating',\n )\n }\n className=\"px-2 py-0.5 text-xs font-medium bg-white text-blue-700 hover:bg-blue-100 rounded border border-blue-300 transition\"\n >\n {tableSpreadsheetMode === 'floating' ? 'Dock Here' : 'Open Float Grid'}\n </button>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center justify-between mb-2 mt-3\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Table Rows ({node.children?.length ?? 0})\n </div>\n <button\n type=\"button\"\n onClick={() => {\n const cellCount = node.children?.[0]?.children?.length || 2;\n const result = insertComponent('table-row', registry, node.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < cellCount; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n }\n }}\n className=\"px-2 py-1 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n >\n + Add Row\n </button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {(!node.children || node.children.length === 0) && (\n <div className=\"text-xs text-slate-400 italic\">No rows yet. Click \"+ Add Row\" to add one.</div>\n )}\n {node.children?.map((row, idx) => (\n <div\n key={row.id}\n className=\"flex items-center justify-between bg-slate-50 px-2 py-1.5 rounded border border-slate-200 text-xs\"\n >\n <span className=\"font-medium text-slate-700\">\n Row {idx + 1} ({row.children?.length ?? 0} cells)\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => insertComponent('table-cell', registry, row.id)}\n className=\"px-1.5 py-0.5 text-[11px] text-blue-600 bg-blue-50 hover:bg-blue-100 rounded\"\n title=\"Add Cell to Row\"\n >\n + Cell\n </button>\n <button\n type=\"button\"\n title=\"Select Row\"\n onClick={() => selectNode(row.id)}\n className=\"p-1 text-slate-400 hover:text-blue-600 rounded flex items-center justify-center\"\n >\n <Crosshair className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n title=\"Delete Row\"\n onClick={() => deleteComponent(row.id)}\n className=\"p-1 text-slate-400 hover:text-red-600 rounded flex items-center justify-center\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {node.type === 'table-row' && (\n <div className=\"pb-3 border-b border-slate-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Row Cells ({node.children?.length ?? 0})\n </div>\n <button\n type=\"button\"\n onClick={() => insertComponent('table-cell', registry, node.id)}\n className=\"px-2 py-1 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n >\n + Add Cell\n </button>\n </div>\n </div>\n )}\n\n {activeTab === 'style' && (\n <>\n {showProps && (\n <div>\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide mb-2\">\n {definition.label} Props\n </div>\n <div className=\"flex flex-col gap-3\">\n {(definition.propFields ?? []).map((field) => {\n const currentValue = node.props?.[field.name];\n const bound = isVariableBinding(currentValue);\n return (\n <div key={field.name}>\n <label className=\"block text-xs font-medium text-slate-600 mb-1\">{field.label}</label>\n {!bound && renderPropControl(field)}\n {isBindableField(field) && (\n <VariableBindingControl\n field={field}\n currentValue={currentValue}\n catalog={variableCatalog}\n onBind={(key) => commitProp(field, toBindingValue(key), true)}\n onRevert={() => commitProp(field, field.defaultValue ?? '', true)}\n />\n )}\n <ErrorText message={fieldErrors[`prop:${field.name}`]} />\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {showStyles && (\n <div className=\"pt-2 border-t border-slate-200 min-w-0 max-w-full\">\n {/* Active state warning badge — STORA-223 */}\n {activeState !== 'default' && <StateEditingBadge state={activeState} />}\n {/* Pseudo-state selector — STORA-221 */}\n {showStateSelector && (\n <div className=\"flex items-center gap-2 mb-2\">\n <label\n htmlFor=\"style-state-selector\"\n className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide shrink-0\"\n >\n State\n </label>\n <select\n id=\"style-state-selector\"\n value={activeState}\n onChange={(e) => setActiveState(e.target.value)}\n className={`flex-1 text-xs rounded px-2 py-1.5 border focus:outline-none focus:ring-1 transition cursor-pointer ${\n activeState !== 'default'\n ? 'bg-amber-50 text-amber-900 border-amber-400 focus:ring-amber-400 focus:border-amber-400'\n : 'bg-white text-slate-900 border-slate-300 hover:border-slate-400 focus:ring-blue-500 focus:border-blue-500 shadow-xs'\n }`}\n >\n <option value=\"default\">Default</option>\n <option value=\":hover\">:hover</option>\n <option value=\":active\">:active</option>\n <option value=\":focus\">:focus</option>\n </select>\n </div>\n )}\n <StyleManagerAccordion\n key={`${node.id}-${activeBreakpoint}-${activeState}`}\n styles={activeLayer}\n animation={node.animation}\n allowedSectors={allowedStyleSectors}\n onCommitStyle={handleCommitSpacing}\n onCommitAnimation={(anim) => {\n const result = updateNodeAnimation(node.id, anim);\n if (!result.success && result.error) {\n setError('animation', result.error);\n }\n }}\n onResetAnimation={() => {\n updateNodeAnimation(node.id, null);\n }}\n onReplayAnimation={() => {\n if (node?.id) {\n replayNodeAnimation(node.id);\n }\n }}\n errors={fieldErrors}\n breakpoint={activeBreakpoint}\n />\n </div>\n )}\n </>\n )}\n\n {activeTab === 'traits' && showTraits && (\n <TraitsPanel\n registry={registry}\n document={document}\n selectedNodeId={node.id}\n onCommitTrait={handleCommitTrait}\n className=\"p-0\"\n />\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { isVariableBinding, VariableBinding } from '@kubuild/schema';\nimport { ComponentFieldDefinition, primitiveTypeForField } from '@kubuild/components';\nimport { VariableCatalog, VariableDefinition } from '@kubuild/core';\n\n/**\n * Filters a host catalog down to entries whose type is compatible with a given\n * bindable prop field — 'array'/'object' catalog entries are never offered onto\n * scalar-bindable fields (string/number/boolean), since resolvePropsForNode's\n * type check would reject them at render time anyway.\n */\nexport function getCompatibleCatalogEntries(\n field: ComponentFieldDefinition,\n catalog: VariableCatalog | undefined,\n): VariableDefinition[] {\n const expectedType = primitiveTypeForField(field);\n if (!expectedType || !catalog) {\n return [];\n }\n return catalog.filter((entry) => entry.type === expectedType);\n}\n\nexport function toBindingValue(key: string): VariableBinding {\n return { type: 'variable', key };\n}\n\nexport interface VariableBindingControlProps {\n field: ComponentFieldDefinition;\n currentValue: unknown;\n catalog: VariableCatalog;\n onBind: (key: string) => void;\n onRevert: () => void;\n}\n\nexport const VariableBindingControl: React.FC<VariableBindingControlProps> = ({\n field,\n currentValue,\n catalog,\n onBind,\n onRevert,\n}) => {\n const compatibleEntries = getCompatibleCatalogEntries(field, catalog);\n\n if (isVariableBinding(currentValue)) {\n const bound = catalog.find((entry) => entry.key === currentValue.key);\n return (\n <div className=\"flex items-center gap-2 mt-1 text-xs\">\n <span\n data-testid={`bound-chip-${field.name}`}\n className=\"px-2 py-0.5 rounded bg-blue-50 text-blue-700 border border-blue-200\"\n >\n bound to <code>{currentValue.key}</code>\n {bound ? ` (sample: ${JSON.stringify(bound.sampleValue)})` : ''}\n </span>\n <button\n type=\"button\"\n data-testid={`revert-${field.name}`}\n onClick={onRevert}\n className=\"text-slate-500 hover:text-slate-700 underline\"\n >\n Revert to static\n </button>\n </div>\n );\n }\n\n if (compatibleEntries.length === 0) {\n return null;\n }\n\n return (\n <div className=\"mt-1\">\n <select\n data-testid={`bind-variable-${field.name}`}\n value=\"\"\n onChange={(e) => {\n if (e.target.value) onBind(e.target.value);\n }}\n className=\"w-full text-xs bg-white text-slate-700 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"\">Bind variable…</option>\n {compatibleEntries.map((entry) => (\n <option key={entry.key} value={entry.key}>\n {entry.label} ({JSON.stringify(entry.sampleValue)})\n </option>\n ))}\n </select>\n </div>\n );\n};\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { AssetProvider, AssetInfo } from '@kubuild/core';\n\nexport interface AssetManagerModalProps {\n isOpen: boolean;\n onClose: () => void;\n /** Called with the resolved URL of the picked asset. */\n onSelect: (url: string) => void;\n /** Optional host-provided asset provider backing the local gallery tab. */\n assetProvider?: AssetProvider;\n /** Acceptable MIME types, e.g. ['image/*']. Defaults to images only. */\n accept?: string[];\n /** Title shown in the modal header. */\n title?: string;\n}\n\ntype TabId = 'gallery' | 'url' | 'upload';\n\ninterface GalleryItem {\n id: string;\n url: string;\n name: string;\n mimeType: string;\n}\n\nconst DEFAULT_ACCEPT = ['image/'];\n\nconst isAccepted = (mimeType: string, accept: string[]): boolean =>\n accept.some((pattern) => {\n // Normalize 'image/*' and 'image/' to a prefix match on 'image/'.\n const prefix = pattern.endsWith('/*') ? pattern.slice(0, -1) : pattern;\n return mimeType.startsWith(prefix);\n });\n\n/**\n * STORA-250 — Unified asset picker modal.\n *\n * Three sources:\n * - Gallery: assets listed by the host `AssetProvider` (local `.stora` gallery).\n * - URL: direct CDN / external URL entry.\n * - Upload: drag-and-drop or file-picker upload, resolved via\n * `assetProvider.upload` when available, otherwise an in-memory object URL.\n *\n * Selecting an asset immediately invokes `onSelect(url)` so the caller can\n * update the target node's `src` prop instantly.\n */\nexport const AssetManagerModal: React.FC<AssetManagerModalProps> = ({\n isOpen,\n onClose,\n onSelect,\n assetProvider,\n accept = DEFAULT_ACCEPT,\n title = 'Asset Manager',\n}) => {\n const [activeTab, setActiveTab] = useState<TabId>('gallery');\n const [urlValue, setUrlValue] = useState('');\n const [urlError, setUrlError] = useState<string | null>(null);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [isUploading, setIsUploading] = useState(false);\n const [uploaded, setUploaded] = useState<GalleryItem[]>([]);\n const [providerAssets, setProviderAssets] = useState<GalleryItem[] | null>(null);\n const [providerError, setProviderError] = useState<string | null>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const galleryItems = useMemo<GalleryItem[]>(() => {\n if (providerAssets) return providerAssets;\n return uploaded;\n }, [providerAssets, uploaded]);\n\n const loadProviderAssets = useCallback(async () => {\n if (!assetProvider?.list) {\n setProviderAssets([]);\n return;\n }\n try {\n const list = await assetProvider.list();\n setProviderAssets(\n list\n .filter((a: AssetInfo) => isAccepted(a.mimeType || '', accept))\n .map((a: AssetInfo) => ({\n id: a.id,\n url: a.url,\n name: a.alt || a.id,\n mimeType: a.mimeType || '',\n })),\n );\n setProviderError(null);\n } catch (err: unknown) {\n setProviderError(err instanceof Error ? err.message : String(err));\n setProviderAssets([]);\n }\n }, [assetProvider, accept]);\n\n // Load gallery assets each time the modal opens on the gallery tab.\n React.useEffect(() => {\n if (isOpen && activeTab === 'gallery' && providerAssets === null) {\n void loadProviderAssets();\n }\n }, [isOpen, activeTab, providerAssets, loadProviderAssets]);\n\n if (!isOpen) return null;\n\n const handlePick = (item: GalleryItem) => {\n onSelect(item.url);\n onClose();\n };\n\n const handleUrlSubmit = () => {\n const trimmed = urlValue.trim();\n if (!trimmed) {\n setUrlError('URL is required.');\n return;\n }\n try {\n // Validate it is a well-formed absolute URL.\n const parsed = new URL(trimmed);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n setUrlError('Only http(s) URLs are supported.');\n return;\n }\n } catch {\n setUrlError('Enter a valid absolute URL (https://…).');\n return;\n }\n setUrlError(null);\n onSelect(trimmed);\n onClose();\n };\n\n const processFiles = async (files: FileList | File[]) => {\n const list = Array.from(files);\n if (list.length === 0) return;\n setIsUploading(true);\n setUploadError(null);\n const results: GalleryItem[] = [];\n try {\n for (const file of list) {\n if (!isAccepted(file.type || '', accept)) {\n throw new Error(`Unsupported file type: ${file.type || file.name}`);\n }\n if (assetProvider?.upload) {\n const info = await assetProvider.upload(file);\n results.push({\n id: info.id,\n url: info.url,\n name: info.alt || file.name,\n mimeType: info.mimeType || file.type,\n });\n } else {\n // Fallback: convert file to base64 Data URL so local images persist reliably.\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n results.push({\n id: `local-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n url: dataUrl,\n name: file.name,\n mimeType: file.type,\n });\n }\n }\n setUploaded((prev) => [...results, ...prev]);\n // Merge into provider list view if it was loaded.\n if (providerAssets !== null) {\n setProviderAssets([...results, ...providerAssets]);\n }\n // Instantly select the first uploaded asset.\n handlePick(results[0]);\n } catch (err: unknown) {\n setUploadError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsUploading(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n if (e.dataTransfer.files?.length) {\n void processFiles(e.dataTransfer.files);\n }\n };\n\n const tabs: Array<{ id: TabId; label: string }> = [\n { id: 'gallery', label: 'Gallery' },\n { id: 'url', label: 'CDN URL' },\n { id: 'upload', label: 'Upload' },\n ];\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm p-4\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n >\n <div\n className=\"bg-slate-900 border border-slate-700 rounded-xl shadow-2xl w-full max-w-2xl flex flex-col overflow-hidden text-slate-100 animate-in fade-in zoom-in-95 duration-150\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-slate-950/80\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-5 h-5 text-blue-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n <h2 className=\"font-semibold text-base\">{title}</h2>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 p-1 rounded-lg hover:bg-slate-800 transition\"\n aria-label=\"Close asset manager\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Tabs */}\n <div className=\"flex border-b border-slate-800 bg-slate-950/40 px-6 gap-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={`px-4 py-2.5 text-xs font-medium border-b-2 -mb-px transition ${\n activeTab === tab.id\n ? 'border-blue-500 text-blue-400'\n : 'border-transparent text-slate-400 hover:text-slate-200'\n }`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Body */}\n <div className=\"p-6 flex flex-col gap-4 max-h-[65vh] overflow-y-auto\">\n {activeTab === 'gallery' && (\n <div className=\"flex flex-col gap-3\">\n {providerError && (\n <div className=\"p-3 bg-red-950/50 border border-red-800/80 rounded-lg text-xs text-red-300\">\n Failed to load gallery: {providerError}\n </div>\n )}\n {providerAssets === null ? (\n <div className=\"flex items-center justify-center py-8 gap-3 text-sm text-slate-400\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n Loading gallery…\n </div>\n ) : galleryItems.length === 0 ? (\n <div className=\"py-10 text-center text-sm text-slate-500\">\n <p className=\"font-medium text-slate-400\">No assets in the local gallery yet.</p>\n <p className=\"text-xs mt-1\">\n Upload files in the Upload tab, or provide an <code className=\"text-slate-400\">AssetProvider</code> to\n list package assets.\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 sm:grid-cols-4 gap-3\">\n {galleryItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handlePick(item)}\n title={item.name}\n className=\"group relative aspect-square rounded-lg overflow-hidden border border-slate-700 hover:border-blue-500 bg-slate-950/60 transition focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <img\n src={item.url}\n alt={item.name}\n className=\"w-full h-full object-cover group-hover:scale-105 transition\"\n loading=\"lazy\"\n />\n <div className=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 to-transparent px-2 py-1.5\">\n <span className=\"block text-[10px] text-slate-200 truncate\">{item.name}</span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'url' && (\n <div className=\"flex flex-col gap-3\">\n <label className=\"text-xs font-medium text-slate-300\" htmlFor=\"asset-url-input\">\n Image URL\n </label>\n <div className=\"flex gap-2\">\n <input\n id=\"asset-url-input\"\n type=\"url\"\n value={urlValue}\n onChange={(e) => {\n setUrlValue(e.target.value);\n setUrlError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleUrlSubmit();\n }}\n placeholder=\"https://cdn.example.com/image.jpg\"\n className=\"flex-1 text-xs bg-slate-950/60 text-slate-100 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 placeholder:text-slate-600\"\n />\n <button\n type=\"button\"\n onClick={handleUrlSubmit}\n className=\"px-4 py-2 text-xs font-medium bg-blue-600 hover:bg-blue-500 text-white rounded-lg transition\"\n >\n Use URL\n </button>\n </div>\n {urlError && (\n <div className=\"text-xs text-red-400\" role=\"alert\">\n {urlError}\n </div>\n )}\n {urlValue.trim() && !urlError && (\n <div className=\"mt-2 rounded-lg border border-slate-700 bg-slate-950/60 p-3 flex items-center justify-center\">\n <img\n src={urlValue}\n alt=\"Preview\"\n className=\"max-h-48 rounded object-contain\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'upload' && (\n <div className=\"flex flex-col gap-3\">\n <div\n onDragOver={(e) => {\n e.preventDefault();\n setIsDragOver(true);\n }}\n onDragLeave={() => setIsDragOver(false)}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n className={`border-2 border-dashed rounded-xl p-8 flex flex-col items-center justify-center gap-3 cursor-pointer transition ${\n isDragOver\n ? 'border-blue-500 bg-blue-500/10'\n : 'border-slate-700 hover:border-blue-500 bg-slate-950/40 hover:bg-slate-800/40'\n } group`}\n >\n <div className=\"w-12 h-12 rounded-full bg-blue-500/10 flex items-center justify-center text-blue-400 group-hover:scale-110 transition\">\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\"\n />\n </svg>\n </div>\n <div className=\"text-center\">\n <p className=\"text-sm font-medium text-slate-200\">\n {isUploading ? 'Uploading…' : 'Drag and drop files here, or click to browse'}\n </p>\n <p className=\"text-xs text-slate-400 mt-1\">\n {assetProvider?.upload\n ? 'Files are uploaded via the host asset provider.'\n : 'Files are kept in-memory for this session.'}\n </p>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={accept.join(',')}\n onChange={(e) => {\n if (e.target.files?.length) void processFiles(e.target.files);\n e.target.value = '';\n }}\n className=\"hidden\"\n />\n </div>\n {isUploading && (\n <div className=\"flex items-center justify-center gap-3 text-sm text-slate-400\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n Uploading…\n </div>\n )}\n {uploadError && (\n <div className=\"p-3 bg-red-950/50 border border-red-800/80 rounded-lg text-xs text-red-300\" role=\"alert\">\n {uploadError}\n </div>\n )}\n {uploaded.length > 0 && (\n <div className=\"grid grid-cols-3 sm:grid-cols-4 gap-3\">\n {uploaded.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handlePick(item)}\n title={item.name}\n className=\"group relative aspect-square rounded-lg overflow-hidden border border-slate-700 hover:border-blue-500 bg-slate-950/60 transition\"\n >\n <img src={item.url} alt={item.name} className=\"w-full h-full object-cover\" />\n <div className=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 to-transparent px-2 py-1.5\">\n <span className=\"block text-[10px] text-slate-200 truncate\">{item.name}</span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Node } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { findNodeById, getAncestorChain, deepClone } from '@kubuild/core';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\nimport { X, Trash2 } from 'lucide-react';\n\nexport interface TableSpreadsheetEditorProps {\n registry: ComponentRegistry;\n tableNode?: Node | null;\n mode?: 'floating' | 'docked';\n onClose?: () => void;\n onToggleMode?: () => void;\n className?: string;\n}\n\nexport function findActiveTableNode(documentRoot: Node, selectedNodeId: string | null): Node | null {\n if (!selectedNodeId) return null;\n const node = findNodeById(documentRoot, selectedNodeId);\n if (!node) return null;\n if (node.type === 'table') return node;\n\n const ancestors = getAncestorChain(documentRoot, selectedNodeId);\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const anc = findNodeById(documentRoot, ancestors[i]);\n if (anc && anc.type === 'table') {\n return anc;\n }\n }\n return null;\n}\n\nconst COLUMN_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nexport function parseCsv(text: string): string[][] {\n const rows: string[][] = [];\n let currentRow: string[] = [];\n let currentVal = '';\n let insideQuotes = false;\n\n const str = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\n for (let i = 0; i < str.length; i++) {\n const char = str[i];\n const nextChar = str[i + 1];\n\n if (char === '\"') {\n if (insideQuotes && nextChar === '\"') {\n currentVal += '\"';\n i++;\n } else {\n insideQuotes = !insideQuotes;\n }\n } else if ((char === ',' || char === '\\t' || char === ';') && !insideQuotes) {\n currentRow.push(currentVal.trim());\n currentVal = '';\n } else if (char === '\\n' && !insideQuotes) {\n currentRow.push(currentVal.trim());\n if (currentRow.some((c) => c.length > 0)) {\n rows.push(currentRow);\n }\n currentRow = [];\n currentVal = '';\n } else {\n currentVal += char;\n }\n }\n\n if (currentVal.length > 0 || currentRow.length > 0) {\n currentRow.push(currentVal.trim());\n if (currentRow.some((c) => c.length > 0)) {\n rows.push(currentRow);\n }\n }\n\n return rows;\n}\n\nfunction getColumnLabel(index: number): string {\n if (index < 26) return COLUMN_LETTERS[index];\n const first = COLUMN_LETTERS[Math.floor(index / 26) - 1];\n const second = COLUMN_LETTERS[index % 26];\n return `${first}${second}`;\n}\n\nexport const TableSpreadsheetEditor: React.FC<TableSpreadsheetEditorProps> = ({\n registry,\n tableNode: propTableNode,\n mode = 'floating',\n onClose,\n onToggleMode,\n className = '',\n}) => {\n const {\n document: editorDoc,\n selectedNodeId,\n selectNode,\n insertComponent,\n deleteComponent,\n updateNodeProps,\n dispatch,\n } = useEditorStore();\n\n const tableNode = propTableNode ?? findActiveTableNode(editorDoc.document, selectedNodeId);\n\n // CSV Import State\n const [isImportModalOpen, setIsImportModalOpen] = useState(false);\n const [csvInputText, setCsvInputText] = useState('');\n const [hasHeaderRow, setHasHeaderRow] = useState(true);\n const [importMode, setImportMode] = useState<'replace' | 'append'>('replace');\n const [isDraggingFileOverGrid, setIsDraggingFileOverGrid] = useState(false);\n const [isDraggingFileOverModal, setIsDraggingFileOverModal] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const readAndProcessCsvFile = (file: File) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n setCsvInputText(content);\n setIsImportModalOpen(true);\n }\n };\n reader.readAsText(file);\n };\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n readAndProcessCsvFile(file);\n e.target.value = '';\n };\n\n const handleExecuteImport = () => {\n if (!csvInputText.trim() || !tableNode) return;\n const parsedRows = parseCsv(csvInputText);\n if (parsedRows.length === 0) return;\n\n const parsedMaxCols = Math.max(...parsedRows.map((r) => r.length));\n\n const newRowNodes: Node[] = parsedRows.map((row, rowIdx) => {\n const isHeader = hasHeaderRow && (importMode === 'replace' ? rowIdx === 0 : false);\n const rowId = `row_${Date.now()}_${rowIdx}_${Math.random().toString(36).substring(2, 7)}`;\n const cells: Node[] = Array.from({ length: parsedMaxCols }).map((_, colIdx) => ({\n id: `cell_${Date.now()}_${rowIdx}_${colIdx}_${Math.random().toString(36).substring(2, 7)}`,\n type: 'table-cell',\n props: {\n tag: isHeader ? 'th' : 'td',\n text: row[colIdx] ?? '',\n },\n }));\n\n return {\n id: rowId,\n type: 'table-row',\n children: cells,\n };\n });\n\n dispatch((doc) => {\n const nextDoc = deepClone(doc);\n const tbl = findNodeById(nextDoc.document, tableNode.id);\n if (!tbl) {\n throw new Error('Table not found');\n }\n if (importMode === 'replace') {\n tbl.children = newRowNodes;\n } else {\n tbl.children = [...(tbl.children || []), ...newRowNodes];\n }\n return {\n document: nextDoc,\n event: {\n type: 'NODE_INSERTED',\n timestamp: new Date().toISOString(),\n nodeId: tableNode.id,\n },\n };\n });\n\n setIsImportModalOpen(false);\n setCsvInputText('');\n };\n\n // Floating window position\n const [pos, setPos] = useState({ x: 260, y: 120 });\n const [isDragging, setIsDragging] = useState(false);\n const dragStartRef = useRef<{ startX: number; startY: number; posX: number; posY: number }>({\n startX: 0,\n startY: 0,\n posX: 260,\n posY: 120,\n });\n\n const handleHeaderMouseDown = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('button, input, select, textarea')) return;\n setIsDragging(true);\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n posX: pos.x,\n posY: pos.y,\n };\n };\n\n useEffect(() => {\n if (!isDragging) return;\n const handleMouseMove = (e: MouseEvent) => {\n const dx = e.clientX - dragStartRef.current.startX;\n const dy = e.clientY - dragStartRef.current.startY;\n setPos({\n x: Math.max(10, Math.min(window.innerWidth - 350, dragStartRef.current.posX + dx)),\n y: Math.max(10, Math.min(window.innerHeight - 150, dragStartRef.current.posY + dy)),\n });\n };\n const handleMouseUp = () => {\n setIsDragging(false);\n };\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDragging]);\n\n if (!tableNode) return null;\n\n const rows = (tableNode.children || []).filter((child) => child.type === 'table-row');\n const maxCols = Math.max(\n 1,\n ...rows.map((row) => (row.children || []).filter((c) => c.type === 'table-cell').length),\n );\n\n // Table operations\n const handleAddRow = () => {\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < maxCols; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n }\n };\n\n const handleAddColumn = () => {\n if (rows.length === 0) {\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n return;\n }\n\n rows.forEach((row, rowIdx) => {\n const isHeaderRow = rowIdx === 0 && row.children?.[0]?.props?.tag === 'th';\n const cellResult = insertComponent('table-cell', registry, row.id);\n if (cellResult.success && cellResult.nodeId && isHeaderRow) {\n updateNodeProps(cellResult.nodeId, { tag: 'th', text: `Header ${maxCols + 1}` }, registry);\n }\n });\n };\n\n const handleDeleteColumn = (colIndex: number) => {\n if (maxCols <= 1) return;\n rows.forEach((row) => {\n const cells = (row.children || []).filter((c) => c.type === 'table-cell');\n if (cells[colIndex]) {\n deleteComponent(cells[colIndex].id);\n }\n });\n };\n\n // Input references for keyboard navigation\n const inputRefs = useRef<Map<string, HTMLInputElement>>(new Map());\n\n const focusCell = (r: number, c: number) => {\n const targetRow = rows[r];\n if (!targetRow) return;\n const targetCells = (targetRow.children || []).filter((ch) => ch.type === 'table-cell');\n const targetCell = targetCells[c];\n if (targetCell) {\n selectNode(targetCell.id);\n const inputEl = inputRefs.current.get(`${r},${c}`);\n if (inputEl) {\n inputEl.focus();\n inputEl.select?.();\n }\n }\n };\n\n const handleCellKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n rowIdx: number,\n colIdx: number,\n ) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n if (e.shiftKey) {\n // Shift+Tab: Move to previous cell\n if (colIdx > 0) {\n focusCell(rowIdx, colIdx - 1);\n } else if (rowIdx > 0) {\n const prevRowCells = (rows[rowIdx - 1]?.children || []).filter(\n (ch) => ch.type === 'table-cell',\n );\n focusCell(rowIdx - 1, Math.max(0, prevRowCells.length - 1));\n }\n } else {\n // Tab: Move to next cell\n if (colIdx < maxCols - 1) {\n focusCell(rowIdx, colIdx + 1);\n } else if (rowIdx < rows.length - 1) {\n focusCell(rowIdx + 1, 0);\n } else {\n // At the very last cell -> Create new row and focus first cell\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < maxCols; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n setTimeout(() => focusCell(rowIdx + 1, 0), 40);\n }\n }\n }\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (e.shiftKey) {\n // Shift+Enter: Move to cell above\n if (rowIdx > 0) {\n focusCell(rowIdx - 1, colIdx);\n }\n } else {\n // Enter: Move to cell below or create new row if on last row\n if (rowIdx < rows.length - 1) {\n focusCell(rowIdx + 1, colIdx);\n } else {\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < maxCols; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n setTimeout(() => focusCell(rowIdx + 1, colIdx), 40);\n }\n }\n }\n } else if (e.key === 'ArrowUp') {\n if (rowIdx > 0) {\n e.preventDefault();\n focusCell(rowIdx - 1, colIdx);\n }\n } else if (e.key === 'ArrowDown') {\n if (rowIdx < rows.length - 1) {\n e.preventDefault();\n focusCell(rowIdx + 1, colIdx);\n }\n }\n };\n\n const isFloating = mode === 'floating';\n\n const modalContent = isImportModalOpen ? (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-slate-900/60 backdrop-blur-xs p-4 select-auto\">\n <div\n className=\"bg-white rounded-xl shadow-2xl border border-slate-200 w-full max-w-lg overflow-hidden flex flex-col animate-in fade-in zoom-in-95 duration-150\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Modal Header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-slate-50 border-b border-slate-200\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"p-1.5 bg-emerald-100 text-emerald-700 rounded-lg\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n <line x1=\"8\" y1=\"17\" x2=\"16\" y2=\"17\" />\n </svg>\n </span>\n <div>\n <h3 className=\"text-sm font-semibold text-slate-800\">Import CSV into Table</h3>\n <p className=\"text-xs text-slate-500\">Upload file or paste CSV / TSV text directly</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsImportModalOpen(false)}\n className=\"text-slate-400 hover:text-slate-600 p-1.5 rounded-md transition flex items-center justify-center\"\n >\n <X className=\"w-4 h-4\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Modal Body */}\n <div className=\"p-4 flex flex-col gap-3\">\n <div\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverModal(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverModal(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverModal(false);\n const file = e.dataTransfer.files?.[0];\n if (file) readAndProcessCsvFile(file);\n }}\n onClick={() => fileInputRef.current?.click()}\n className={`w-full flex flex-col items-center justify-center gap-1.5 py-4 px-3 border-2 border-dashed rounded-lg text-xs font-medium cursor-pointer transition ${\n isDraggingFileOverModal\n ? 'bg-emerald-100/80 border-emerald-500 text-emerald-800 scale-[1.01]'\n : 'bg-slate-50 hover:bg-emerald-50/50 border-slate-300 hover:border-emerald-400 text-slate-700'\n }`}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"text-emerald-600\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n <span className=\"font-semibold\">\n {isDraggingFileOverModal ? 'Drop CSV file here!' : 'Click to select or Drag & Drop .csv file here'}\n </span>\n <span className=\"text-[10px] text-slate-400\">Supports .csv and text/tsv files</span>\n </div>\n\n <div>\n <label className=\"block text-xs font-medium text-slate-700 mb-1\">\n Or Paste CSV / Tab-Separated Data:\n </label>\n <textarea\n rows={6}\n value={csvInputText}\n onChange={(e) => setCsvInputText(e.target.value)}\n placeholder=\"Header 1, Header 2, Header 3 Value 1, Value 2, Value 3 Value 4, Value 5, Value 6\"\n className=\"w-full text-xs font-mono p-2.5 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-emerald-500 resize-none bg-slate-50 text-slate-900\"\n />\n </div>\n\n {/* Options */}\n <div className=\"grid grid-cols-2 gap-3 pt-1 border-t border-slate-100 text-xs\">\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={hasHeaderRow}\n onChange={(e) => setHasHeaderRow(e.target.checked)}\n className=\"rounded text-emerald-600 focus:ring-emerald-500\"\n />\n <span className=\"text-slate-700 font-medium\">First row is Header (<th>)</span>\n </label>\n\n <div className=\"flex items-center gap-3\">\n <span className=\"text-slate-500\">Mode:</span>\n <label className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"csv-import-mode\"\n checked={importMode === 'replace'}\n onChange={() => setImportMode('replace')}\n className=\"text-emerald-600 focus:ring-emerald-500\"\n />\n <span className=\"text-slate-700\">Replace</span>\n </label>\n <label className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"csv-import-mode\"\n checked={importMode === 'append'}\n onChange={() => setImportMode('append')}\n className=\"text-emerald-600 focus:ring-emerald-500\"\n />\n <span className=\"text-slate-700\">Append</span>\n </label>\n </div>\n </div>\n\n {/* Live Preview info */}\n {csvInputText.trim() && (\n <div className=\"bg-emerald-50 border border-emerald-200 rounded-lg px-3 py-2 text-xs text-emerald-800 flex items-center justify-between\">\n <span>\n Detected: {parseCsv(csvInputText).length} rows,{' '}\n {Math.max(0, ...parseCsv(csvInputText).map((r) => r.length))} columns\n </span>\n <span className=\"font-semibold text-emerald-700\">Ready to import</span>\n </div>\n )}\n </div>\n\n {/* Modal Footer */}\n <div className=\"flex items-center justify-end gap-2 px-4 py-3 bg-slate-50 border-t border-slate-200\">\n <button\n type=\"button\"\n onClick={() => setIsImportModalOpen(false)}\n className=\"px-3 py-1.5 text-xs font-medium text-slate-600 hover:bg-slate-200 rounded-lg transition\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={!csvInputText.trim()}\n onClick={handleExecuteImport}\n className=\"px-4 py-1.5 text-xs font-semibold text-white bg-emerald-600 hover:bg-emerald-500 disabled:opacity-50 disabled:pointer-events-none rounded-lg shadow-sm transition\"\n >\n Import to Table\n </button>\n </div>\n </div>\n </div>\n ) : null;\n\n const renderedModal =\n typeof window !== 'undefined' && typeof document !== 'undefined' && modalContent\n ? createPortal(modalContent, document.body)\n : modalContent;\n\n const content = (\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Hidden file input for CSV */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv,text/csv,text/plain\"\n onChange={handleFileUpload}\n className=\"hidden\"\n />\n\n {/* Toolbar / Actions inside Spreadsheet */}\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-slate-100/90 border-b border-slate-200 text-xs select-none\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-slate-700 flex items-center gap-1.5\">\n <ComponentIcon iconOrType=\"table\" size={14} />\n <span>Table Grid ({rows.length} × {maxCols})</span>\n </span>\n <span className=\"text-[10px] text-slate-400 font-mono\">#{tableNode.id}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={() => setIsImportModalOpen(true)}\n title=\"Import CSV data into table\"\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-emerald-700 bg-emerald-50 hover:bg-emerald-100 border border-emerald-300 rounded shadow-xs transition\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n <span>Import CSV</span>\n </button>\n <button\n type=\"button\"\n onClick={handleAddRow}\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-blue-600 bg-white hover:bg-blue-50 border border-slate-300 rounded shadow-xs transition\"\n >\n <span>+ Row</span>\n </button>\n <button\n type=\"button\"\n onClick={handleAddColumn}\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-blue-600 bg-white hover:bg-blue-50 border border-slate-300 rounded shadow-xs transition\"\n >\n <span>+ Column</span>\n </button>\n {onToggleMode && (\n <button\n type=\"button\"\n onClick={onToggleMode}\n title={isFloating ? 'Dock to inspector panel' : 'Make floating window'}\n className=\"p-1 text-slate-500 hover:text-blue-600 hover:bg-slate-200 rounded transition\"\n >\n {isFloating ? (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n ) : (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"14\" height=\"14\" x=\"7\" y=\"7\" rx=\"2\" />\n <path d=\"M17 3H5a2 2 0 0 0-2 2v12\" />\n </svg>\n )}\n </button>\n )}\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n title=\"Close Spreadsheet view\"\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition flex items-center justify-center\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Spreadsheet Grid Table */}\n <div\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverGrid(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverGrid(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverGrid(false);\n const file = e.dataTransfer.files?.[0];\n if (file) readAndProcessCsvFile(file);\n }}\n className=\"flex-1 overflow-auto p-2 bg-slate-50 relative\"\n >\n {/* Drag over grid overlay */}\n {isDraggingFileOverGrid && (\n <div className=\"absolute inset-0 z-30 bg-emerald-600/90 backdrop-blur-xs flex flex-col items-center justify-center text-white p-4 animate-in fade-in duration-150 select-none\">\n <svg\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"animate-bounce mb-2\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n <span className=\"text-sm font-bold\">Drop CSV File to Import</span>\n <span className=\"text-xs text-emerald-100\">Instantly populate this table</span>\n </div>\n )}\n\n <table className=\"border-collapse w-full text-xs bg-white border border-slate-300 shadow-xs\">\n <thead>\n <tr className=\"bg-slate-100 border-b border-slate-300 text-slate-500 select-none\">\n <th className=\"w-9 p-1 text-center font-mono text-[10px] bg-slate-200/80 border-r border-slate-300\">\n #\n </th>\n {Array.from({ length: maxCols }).map((_, colIdx) => (\n <th\n key={colIdx}\n className=\"p-1 text-center font-mono text-[11px] font-semibold border-r border-slate-300 group min-w-[100px]\"\n >\n <div className=\"flex items-center justify-between px-1\">\n <span className=\"mx-auto\">{getColumnLabel(colIdx)}</span>\n {maxCols > 1 && (\n <button\n type=\"button\"\n onClick={() => handleDeleteColumn(colIdx)}\n title={`Delete Column ${getColumnLabel(colIdx)}`}\n className=\"opacity-0 group-hover:opacity-100 text-slate-400 hover:text-red-600 p-0.5 rounded flex items-center justify-center\"\n >\n <Trash2 className=\"w-2.5 h-2.5\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </th>\n ))}\n <th className=\"w-8 p-1 text-center text-slate-400 font-normal\">\n <button\n type=\"button\"\n onClick={handleAddColumn}\n title=\"Add Column\"\n className=\"hover:text-blue-600 font-bold\"\n >\n +\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => {\n const cells = (row.children || []).filter((c) => c.type === 'table-cell');\n const isSelectedRow = row.id === selectedNodeId;\n\n return (\n <tr\n key={row.id}\n className={`border-b border-slate-200 ${\n isSelectedRow ? 'bg-blue-50/40' : 'hover:bg-slate-50/60'\n }`}\n >\n {/* Row Number Header */}\n <td\n onClick={() => selectNode(row.id)}\n title=\"Click to select row\"\n className=\"p-1 text-center font-mono text-[10px] text-slate-500 bg-slate-100 border-r border-slate-300 select-none cursor-pointer hover:bg-blue-100 hover:text-blue-700\"\n >\n {rowIdx + 1}\n </td>\n\n {/* Row Cells */}\n {Array.from({ length: maxCols }).map((_, colIdx) => {\n const cell = cells[colIdx];\n if (!cell) {\n return (\n <td\n key={`empty-${colIdx}`}\n className=\"p-1 border-r border-slate-200 bg-slate-50/50 text-center\"\n >\n <button\n type=\"button\"\n onClick={() => insertComponent('table-cell', registry, row.id)}\n className=\"text-[10px] text-blue-500 hover:underline\"\n >\n + Add Cell\n </button>\n </td>\n );\n }\n\n const isHeaderCell = cell.props?.tag === 'th';\n const isSelectedCell = cell.id === selectedNodeId;\n const cellText = typeof cell.props?.text === 'string' ? cell.props.text : '';\n\n return (\n <td\n key={cell.id}\n onClick={() => selectNode(cell.id)}\n className={`p-1 border-r border-slate-200 transition relative group ${\n isSelectedCell\n ? 'ring-2 ring-blue-500 ring-inset bg-blue-50/80 z-10'\n : isHeaderCell\n ? 'bg-slate-100/70 font-semibold'\n : 'bg-white'\n }`}\n >\n <div className=\"flex items-center gap-1\">\n <input\n ref={(el) => {\n if (el) {\n inputRefs.current.set(`${rowIdx},${colIdx}`, el);\n } else {\n inputRefs.current.delete(`${rowIdx},${colIdx}`);\n }\n }}\n type=\"text\"\n value={cellText}\n onChange={(e) =>\n updateNodeProps(cell.id, { text: e.target.value }, registry)\n }\n onKeyDown={(e) => handleCellKeyDown(e, rowIdx, colIdx)}\n onFocus={() => selectNode(cell.id)}\n placeholder={isHeaderCell ? 'Header...' : 'Data...'}\n className={`w-full bg-transparent border-0 focus:outline-none focus:ring-0 text-xs px-1 py-0.5 rounded text-slate-900 ${\n isHeaderCell ? 'font-semibold text-slate-800' : ''\n }`}\n />\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n updateNodeProps(\n cell.id,\n { tag: isHeaderCell ? 'td' : 'th' },\n registry,\n );\n }}\n title={`Current: ${isHeaderCell ? 'Header (TH)' : 'Data (TD)'}. Click to switch.`}\n className={`opacity-0 group-hover:opacity-100 text-[9px] px-1 py-0.5 rounded font-mono uppercase transition ${\n isHeaderCell\n ? 'bg-purple-100 text-purple-700 hover:bg-purple-200'\n : 'bg-slate-100 text-slate-600 hover:bg-slate-200'\n }`}\n >\n {isHeaderCell ? 'TH' : 'TD'}\n </button>\n </div>\n </td>\n );\n })}\n\n {/* Row Delete Action */}\n <td className=\"p-1 text-center border-l border-slate-200\">\n <button\n type=\"button\"\n onClick={() => deleteComponent(row.id)}\n title={`Delete Row ${rowIdx + 1}`}\n className=\"text-slate-400 hover:text-red-600 p-1 rounded flex items-center justify-center mx-auto\"\n >\n <Trash2 className=\"w-3 h-3\" aria-hidden=\"true\" />\n </button>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n\n if (isFloating) {\n return (\n <>\n {renderedModal}\n <div\n style={{ left: `${pos.x}px`, top: `${pos.y}px` }}\n onMouseDown={handleHeaderMouseDown}\n className={`fixed z-40 min-w-[380px] max-w-[620px] bg-white/95 backdrop-blur-md rounded-xl shadow-2xl border border-slate-300 flex flex-col max-h-[460px] overflow-hidden ${className}`}\n >\n {content}\n </div>\n </>\n );\n }\n\n return (\n <>\n {renderedModal}\n <div className={`flex flex-col border border-slate-200 rounded-lg overflow-hidden bg-white shadow-xs ${className}`}>\n {content}\n </div>\n </>\n );\n};\n","import React from 'react';\n\nexport interface ComponentIconProps {\n iconOrType?: string;\n className?: string;\n size?: number;\n}\n\nexport const ComponentIcon: React.FC<ComponentIconProps> = ({\n iconOrType,\n className = '',\n size = 15,\n}) => {\n const iconProps = {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n className,\n };\n\n switch (iconOrType) {\n case 'layout':\n case 'page':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 21V9\" />\n </svg>\n );\n case 'rows':\n case 'section':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n <path d=\"M3 15h18\" />\n </svg>\n );\n case 'box':\n case 'container':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <rect width=\"10\" height=\"10\" x=\"7\" y=\"7\" rx=\"1\" strokeDasharray=\"2 2\" />\n </svg>\n );\n case 'columns':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M12 3v18\" />\n </svg>\n );\n case 'heading':\n return (\n <svg {...iconProps}>\n <path d=\"M6 12h12\" />\n <path d=\"M6 4v16\" />\n <path d=\"M18 4v16\" />\n </svg>\n );\n case 'type':\n case 'text':\n return (\n <svg {...iconProps}>\n <path d=\"M4 7V4h16v3\" />\n <path d=\"M9 20h6\" />\n <path d=\"M12 4v16\" />\n </svg>\n );\n case 'image':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </svg>\n );\n case 'mouse-pointer':\n case 'button':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"12\" x=\"3\" y=\"6\" rx=\"3\" />\n <path d=\"M8 12h8\" />\n </svg>\n );\n case 'database':\n case 'collection':\n return (\n <svg {...iconProps}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n <path d=\"M3 12c0 1.66 4 3 9 3s9-1.34 9-3\" />\n </svg>\n );\n case 'list':\n case 'list-item':\n return (\n <svg {...iconProps}>\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\n </svg>\n );\n case 'paragraph':\n return (\n <svg {...iconProps}>\n <path d=\"M13 4v16\" />\n <path d=\"M17 4v16\" />\n <path d=\"M19 4H9.5a4.5 4.5 0 0 0 0 9H13\" />\n </svg>\n );\n case 'link':\n return (\n <svg {...iconProps}>\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n );\n case 'blockquote':\n case 'quote':\n return (\n <svg {...iconProps}>\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z\" />\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\" />\n </svg>\n );\n case 'badge':\n case 'tag':\n return (\n <svg {...iconProps}>\n <path d=\"M12 2H2v10l9.29 9.29c.94.94 2.48.94 3.42 0l6.58-6.58c.94-.94.94-2.48 0-3.42L12 2Z\" />\n <path d=\"M7 7h.01\" />\n </svg>\n );\n case 'code-block':\n case 'code':\n return (\n <svg {...iconProps}>\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n );\n case 'table':\n case 'table-row':\n case 'table-cell':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n case 'icon':\n case 'sparkles':\n case 'star':\n return (\n <svg {...iconProps}>\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\" />\n </svg>\n );\n case 'html-embed':\n return (\n <svg {...iconProps}>\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n <line x1=\"14\" x2=\"10\" y1=\"4\" y2=\"20\" />\n </svg>\n );\n case 'video':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"14\" x=\"3\" y=\"5\" rx=\"2\" />\n <polygon points=\"10 9 15 12 10 15 10 9\" />\n </svg>\n );\n case 'divider':\n case 'hr':\n return (\n <svg {...iconProps}>\n <line x1=\"3\" x2=\"21\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n case 'form':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M7 8h10\" />\n <path d=\"M7 12h10\" />\n <path d=\"M7 16h6\" />\n </svg>\n );\n case 'input':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"12\" x=\"3\" y=\"6\" rx=\"2\" />\n <path d=\"M7 10v4\" />\n </svg>\n );\n case 'textarea':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M7 7h10\" />\n <path d=\"M7 11h10\" />\n <path d=\"M7 15h4\" />\n </svg>\n );\n case 'select':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"12\" x=\"3\" y=\"6\" rx=\"2\" />\n <path d=\"m15 10 2 2-2 2\" />\n </svg>\n );\n case 'checkbox':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n case 'radio':\n return (\n <svg {...iconProps}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\" />\n </svg>\n );\n case 'dimension':\n case 'maximize':\n return (\n <svg {...iconProps}>\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\n </svg>\n );\n case 'spacing':\n case 'box-model':\n case 'margin':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" strokeDasharray=\"3 3\" />\n <rect width=\"10\" height=\"10\" x=\"7\" y=\"7\" rx=\"1\" />\n </svg>\n );\n case 'typography':\n return (\n <svg {...iconProps}>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\" />\n <line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\" />\n </svg>\n );\n case 'decorations':\n case 'palette':\n return (\n <svg {...iconProps}>\n <circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\" />\n <circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\" />\n <circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n <circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\" />\n <path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z\" />\n </svg>\n );\n case 'flex':\n case 'alignment':\n case 'align':\n return (\n <svg {...iconProps}>\n <rect width=\"6\" height=\"14\" x=\"4\" y=\"5\" rx=\"1\" />\n <rect width=\"6\" height=\"10\" x=\"14\" y=\"7\" rx=\"1\" />\n </svg>\n );\n case 'motion':\n case 'animation':\n return (\n <svg {...iconProps}>\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\" />\n <path d=\"M5 3v4\" />\n <path d=\"M19 17v4\" />\n <path d=\"M3 5h4\" />\n <path d=\"M17 19h4\" />\n </svg>\n );\n case 'play':\n return (\n <svg {...iconProps}>\n <polygon points=\"6 3 20 12 6 21 6 3\" fill=\"currentColor\" />\n </svg>\n );\n case 'chevron-down':\n return (\n <svg {...iconProps}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n case 'chevron-right':\n return (\n <svg {...iconProps}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n case 'reset':\n case 'rotate-ccw':\n case 'refresh':\n return (\n <svg {...iconProps}>\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n );\n default:\n return (\n <svg {...iconProps}>\n <path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\" />\n </svg>\n );\n }\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { AnimationConfig, DEFAULT_ANIMATION_CONFIG } from '@kubuild/schema';\nimport { ComponentIcon } from './icons';\nimport { BoxModelEditor } from './box-model-editor';\nimport { DimensionSectorControls } from './dimension-sector-controls';\nimport { TypographySectorControls } from './typography-sector-controls';\nimport { MotionSectorControls } from './motion-sector-controls';\n\nexport type StyleSectorId = 'dimension' | 'spacing' | 'typography' | 'decorations' | 'flex' | 'motion';\n\nexport interface StyleSectorDefinition {\n id: StyleSectorId;\n label: string;\n icon: string;\n description?: string;\n properties: string[];\n}\n\nexport const STYLE_SECTORS: StyleSectorDefinition[] = [\n {\n id: 'dimension',\n label: 'Dimension',\n icon: 'dimension',\n description: 'Width, height, min/max limits, display & overflow',\n properties: ['display', 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'overflow'],\n },\n {\n id: 'spacing',\n label: 'Spacing (Box Model)',\n icon: 'spacing',\n description: 'Margin, border widths, padding & box dimensions',\n properties: [\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n ],\n },\n {\n id: 'typography',\n label: 'Typography',\n icon: 'typography',\n description: 'Font family, size, weight, line-height, text color & align',\n properties: ['fontFamily', 'fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'color', 'textAlign', 'textDecoration', 'textTransform'],\n },\n {\n id: 'decorations',\n label: 'Decorations',\n icon: 'decorations',\n description: 'Background, borders, radius, shadow & opacity',\n properties: ['backgroundColor', 'backgroundImage', 'borderStyle', 'borderWidth', 'borderColor', 'borderRadius', 'boxShadow', 'opacity'],\n },\n {\n id: 'flex',\n label: 'Flex / Alignment',\n icon: 'flex',\n description: 'Flex direction, alignment, wrapping & gap',\n properties: ['flexDirection', 'justifyContent', 'alignItems', 'flexWrap', 'gap', 'alignContent', 'flexGrow', 'flexShrink'],\n },\n {\n id: 'motion',\n label: 'Motion / Animation',\n icon: 'motion',\n description: 'Scroll entrance effects, duration, delay, hover & loop animations',\n properties: ['type', 'duration', 'delay', 'easing', 'once', 'hoverEffect', 'loopEffect'],\n },\n];\n\nexport const STORAGE_KEY_ACCORDION = 'kubuild:style-manager-accordion';\n\nexport const DEFAULT_ACCORDION_STATE: Record<StyleSectorId, boolean> = {\n dimension: true,\n spacing: true,\n typography: false,\n decorations: false,\n flex: false,\n motion: false,\n};\n\nlet memoryStorage: Record<string, string> = {};\n\nexport function getStorage(): {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n} {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n return window.localStorage;\n }\n if (typeof localStorage !== 'undefined') {\n return localStorage;\n }\n } catch {\n // restricted storage fallback\n }\n return {\n getItem: (k: string) => memoryStorage[k] ?? null,\n setItem: (k: string, v: string) => {\n memoryStorage[k] = v;\n },\n removeItem: (k: string) => {\n delete memoryStorage[k];\n },\n };\n}\n\nexport function clearMemoryStorage(): void {\n memoryStorage = {};\n}\n\nexport function loadAccordionState(): Record<StyleSectorId, boolean> {\n const storage = getStorage();\n try {\n const raw = storage.getItem(STORAGE_KEY_ACCORDION);\n if (!raw) return { ...DEFAULT_ACCORDION_STATE };\n const parsed = JSON.parse(raw);\n return {\n ...DEFAULT_ACCORDION_STATE,\n ...parsed,\n };\n } catch {\n return { ...DEFAULT_ACCORDION_STATE };\n }\n}\n\nexport function saveAccordionState(state: Record<StyleSectorId, boolean>): void {\n const storage = getStorage();\n try {\n storage.setItem(STORAGE_KEY_ACCORDION, JSON.stringify(state));\n } catch {\n // ignore quota/security errors\n }\n}\n\nexport interface StyleManagerAccordionProps {\n styles?: Record<string, unknown>;\n animation?: Partial<AnimationConfig>;\n onCommitStyle: (property: string, value: string) => void;\n onCommitAnimation?: (animation: Partial<AnimationConfig>) => void;\n onResetStyles?: (properties?: string[]) => void;\n onResetAnimation?: () => void;\n onReplayAnimation?: () => void;\n errors?: Record<string, string | null>;\n breakpoint?: 'base' | 'tablet' | 'mobile';\n className?: string;\n initialState?: Partial<Record<StyleSectorId, boolean>>;\n /** Optional filter for allowed style sectors. If omitted, all sectors are displayed. */\n allowedSectors?: StyleSectorId[];\n}\n\nexport const StyleManagerAccordion: React.FC<StyleManagerAccordionProps> = ({\n styles = {},\n animation,\n onCommitStyle,\n onCommitAnimation,\n onResetStyles,\n onResetAnimation,\n onReplayAnimation,\n errors = {},\n breakpoint = 'base',\n className = '',\n initialState,\n allowedSectors,\n}) => {\n const visibleSectors = React.useMemo(() => {\n if (!allowedSectors || allowedSectors.length === 0) return STYLE_SECTORS;\n return STYLE_SECTORS.filter((sector) => allowedSectors.includes(sector.id));\n }, [allowedSectors]);\n\n const [openState, setOpenState] = useState<Record<StyleSectorId, boolean>>(() => ({\n ...loadAccordionState(),\n ...initialState,\n }));\n\n const toggleSector = useCallback((sectorId: StyleSectorId) => {\n setOpenState((prev) => {\n const next = { ...prev, [sectorId]: !prev[sectorId] };\n saveAccordionState(next);\n return next;\n });\n }, []);\n\n const expandAll = useCallback(() => {\n const next: Record<StyleSectorId, boolean> = {\n dimension: true,\n spacing: true,\n typography: true,\n decorations: true,\n flex: true,\n motion: true,\n };\n setOpenState(next);\n saveAccordionState(next);\n }, []);\n\n const collapseAll = useCallback(() => {\n const next: Record<StyleSectorId, boolean> = {\n dimension: false,\n spacing: false,\n typography: false,\n decorations: false,\n flex: false,\n motion: false,\n };\n setOpenState(next);\n saveAccordionState(next);\n }, []);\n\n const handleResetSector = useCallback(\n (e: React.MouseEvent, sector: StyleSectorDefinition) => {\n e.stopPropagation();\n if (sector.id === 'motion') {\n if (onResetAnimation) {\n onResetAnimation();\n } else if (onCommitAnimation) {\n onCommitAnimation(DEFAULT_ANIMATION_CONFIG);\n }\n return;\n }\n\n if (onResetStyles) {\n onResetStyles(sector.properties);\n } else {\n sector.properties.forEach((prop) => {\n if (styles[prop] !== undefined && styles[prop] !== null && styles[prop] !== '') {\n onCommitStyle(prop, '');\n }\n });\n }\n },\n [onResetStyles, onCommitStyle, onResetAnimation, onCommitAnimation, styles],\n );\n\n const handleResetAll = useCallback(() => {\n if (onResetStyles) {\n onResetStyles();\n } else {\n Object.keys(styles).forEach((prop) => {\n if (styles[prop] !== undefined && styles[prop] !== null && styles[prop] !== '') {\n onCommitStyle(prop, '');\n }\n });\n }\n if (onResetAnimation) {\n onResetAnimation();\n } else if (onCommitAnimation) {\n onCommitAnimation(DEFAULT_ANIMATION_CONFIG);\n }\n }, [onResetStyles, onCommitStyle, onResetAnimation, onCommitAnimation, styles]);\n\n // Compute number of active custom properties per sector\n const getActivePropertyCount = (sector: StyleSectorDefinition): number => {\n if (sector.id === 'motion') {\n let count = 0;\n if (animation?.type && animation.type !== 'none') count++;\n if (animation?.delay !== undefined && animation.delay > 0) count++;\n if (animation?.hoverEffect && animation.hoverEffect !== 'none') count++;\n if (animation?.loopEffect && animation.loopEffect !== 'none') count++;\n return count;\n }\n\n return sector.properties.filter((prop) => {\n const val = styles[prop];\n return val !== undefined && val !== null && val !== '';\n }).length;\n };\n\n const isMotionActive =\n Boolean(animation?.type && animation.type !== 'none') ||\n Boolean(animation?.hoverEffect && animation.hoverEffect !== 'none') ||\n Boolean(animation?.loopEffect && animation.loopEffect !== 'none') ||\n Boolean(animation?.delay !== undefined && animation.delay > 0);\n\n const totalActiveStyles =\n Object.values(styles).filter(\n (val) => val !== undefined && val !== null && val !== '',\n ).length + (isMotionActive ? 1 : 0);\n\n return (\n <div className={`flex flex-col gap-2 w-full min-w-0 max-w-full ${className}`} data-testid=\"style-manager-accordion\">\n {/* Top Header Controls — stacked in two rows so the narrow inspector\n panel (w-72) never overflows: title+badge on top, actions below. */}\n <div className=\"flex flex-col gap-1 px-1 py-0.5 min-w-0\">\n <div className=\"flex items-center gap-1.5 text-xs font-semibold text-slate-500 uppercase tracking-wide min-w-0\">\n <span className=\"truncate\">Style Manager</span>\n <span className=\"shrink-0 px-1.5 py-0.2 text-[10px] font-medium bg-slate-100 text-slate-600 rounded border border-slate-200\">\n {breakpoint === 'base' ? 'base' : `${breakpoint} override`}\n </span>\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n <button\n type=\"button\"\n onClick={expandAll}\n title=\"Expand All Sectors\"\n className=\"px-1.5 py-0.5 text-[10px] font-medium text-slate-500 hover:text-slate-800 hover:bg-slate-100 rounded transition whitespace-nowrap\"\n >\n Expand All\n </button>\n <span className=\"text-slate-300 text-xs\">|</span>\n <button\n type=\"button\"\n onClick={collapseAll}\n title=\"Collapse All Sectors\"\n className=\"px-1.5 py-0.5 text-[10px] font-medium text-slate-500 hover:text-slate-800 hover:bg-slate-100 rounded transition whitespace-nowrap\"\n >\n Collapse All\n </button>\n {totalActiveStyles > 0 && (\n <>\n <span className=\"text-slate-300 text-xs\">|</span>\n <button\n type=\"button\"\n data-testid=\"style-manager-reset-all\"\n onClick={handleResetAll}\n title=\"Reset all styles on active node\"\n className=\"flex items-center gap-1 px-1.5 py-0.5 text-[10px] font-medium text-red-600 hover:text-red-800 hover:bg-red-50 rounded transition whitespace-nowrap\"\n >\n <ComponentIcon iconOrType=\"reset\" size={11} />\n <span>Reset CSS</span>\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Accordion Sectors List */}\n <div className=\"flex flex-col gap-1.5\">\n {visibleSectors.map((sector) => {\n const isOpen = Boolean(openState[sector.id]);\n const activeCount = getActivePropertyCount(sector);\n\n return (\n <div\n key={sector.id}\n data-testid={`sector-${sector.id}`}\n className=\"rounded-lg border border-slate-200 bg-white overflow-hidden shadow-2xs transition-colors\"\n >\n {/* Sector Header / Toggle Button */}\n <button\n type=\"button\"\n onClick={() => toggleSector(sector.id)}\n aria-expanded={isOpen}\n aria-controls={`sector-content-${sector.id}`}\n data-testid={`sector-header-${sector.id}`}\n className=\"w-full flex items-center justify-between px-3 py-2 text-left bg-slate-50/70 hover:bg-slate-100/70 transition cursor-pointer select-none\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"text-slate-500 shrink-0\">\n <ComponentIcon iconOrType={sector.icon} size={14} />\n </span>\n <span className=\"text-xs font-semibold text-slate-700 truncate\">\n {sector.label}\n </span>\n {activeCount > 0 && (\n <span\n title={`${activeCount} custom properties set`}\n className=\"px-1.5 py-0.2 text-[9px] font-bold bg-blue-100 text-blue-700 rounded-full border border-blue-200 leading-none\"\n >\n {activeCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5 shrink-0 ml-2\">\n {activeCount > 0 && (\n <button\n type=\"button\"\n data-testid={`sector-reset-${sector.id}`}\n title={`Reset ${sector.label} styles`}\n onClick={(e) => handleResetSector(e, sector)}\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition\"\n >\n <ComponentIcon iconOrType=\"reset\" size={11} />\n </button>\n )}\n <span\n className={`text-slate-400 transform transition-transform duration-200 ${\n isOpen ? 'rotate-180' : 'rotate-0'\n }`}\n >\n <ComponentIcon iconOrType=\"chevron-down\" size={13} />\n </span>\n </div>\n </button>\n\n {/* Sector Body / Animated Container */}\n {isOpen && (\n <div\n id={`sector-content-${sector.id}`}\n data-testid={`sector-body-${sector.id}`}\n className=\"p-3 border-t border-slate-100 bg-white animate-fadeIn\"\n >\n {sector.id === 'spacing' && (\n <div className=\"flex flex-col gap-3\">\n {/* Visual Box Model Diagram */}\n <BoxModelEditor\n values={styles}\n onChange={(prop, val) => onCommitStyle(prop, val)}\n />\n\n {/* Quick Field Grid */}\n <div className=\"pt-2 border-t border-slate-100\">\n <div className=\"text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5\">\n Side Inputs\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs\">\n {['marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'].map(\n (prop) => (\n <div key={prop} className=\"flex items-center justify-between gap-1 bg-slate-50 px-2 py-1 rounded border border-slate-200\">\n <span className=\"text-[11px] text-slate-500 font-medium truncate\">\n {prop.replace(/([A-Z])/g, ' $1').toLowerCase()}\n </span>\n <input\n type=\"text\"\n placeholder=\"0\"\n value={String(styles[prop] ?? '')}\n onChange={(e) => onCommitStyle(prop, e.target.value)}\n className=\"w-14 text-right font-mono text-[11px] bg-white border border-slate-200 rounded px-1.5 py-0.5 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n </div>\n ),\n )}\n </div>\n </div>\n </div>\n )}\n\n {sector.id === 'dimension' && (\n <DimensionSectorControls\n styles={styles}\n onChange={onCommitStyle}\n />\n )}\n\n {sector.id === 'typography' && (\n <TypographySectorControls\n styles={styles}\n onChange={onCommitStyle}\n />\n )}\n\n {sector.id === 'decorations' && (\n <div className=\"flex flex-col gap-2.5\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Background Color</label>\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"color\"\n value={typeof styles.backgroundColor === 'string' && styles.backgroundColor.startsWith('#') ? styles.backgroundColor : '#ffffff'}\n onChange={(e) => onCommitStyle('backgroundColor', e.target.value)}\n className=\"w-7 h-7 rounded border border-slate-300 cursor-pointer p-0.5\"\n />\n <input\n type=\"text\"\n placeholder=\"transparent / #ffffff\"\n value={String(styles.backgroundColor ?? '')}\n onChange={(e) => onCommitStyle('backgroundColor', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none font-mono\"\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Border Radius</label>\n <input\n type=\"text\"\n placeholder=\"0px\"\n value={String(styles.borderRadius ?? '')}\n onChange={(e) => onCommitStyle('borderRadius', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Border Style</label>\n <select\n value={String(styles.borderStyle ?? 'none')}\n onChange={(e) => onCommitStyle('borderStyle', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"none\">None</option>\n <option value=\"solid\">Solid</option>\n <option value=\"dashed\">Dashed</option>\n <option value=\"dotted\">Dotted</option>\n </select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Border Color</label>\n <input\n type=\"text\"\n placeholder=\"#e2e8f0\"\n value={String(styles.borderColor ?? '')}\n onChange={(e) => onCommitStyle('borderColor', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Box Shadow</label>\n <input\n type=\"text\"\n placeholder=\"none\"\n value={String(styles.boxShadow ?? '')}\n onChange={(e) => onCommitStyle('boxShadow', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none font-mono\"\n />\n </div>\n </div>\n </div>\n )}\n\n {sector.id === 'flex' && (\n <div className=\"flex flex-col gap-2.5\">\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Direction</label>\n <select\n value={String(styles.flexDirection ?? 'row')}\n onChange={(e) => onCommitStyle('flexDirection', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"row\">Row (Horizontal)</option>\n <option value=\"column\">Column (Vertical)</option>\n <option value=\"row-reverse\">Row Reverse</option>\n <option value=\"column-reverse\">Column Reverse</option>\n </select>\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Wrap</label>\n <select\n value={String(styles.flexWrap ?? 'nowrap')}\n onChange={(e) => onCommitStyle('flexWrap', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"nowrap\">No Wrap</option>\n <option value=\"wrap\">Wrap</option>\n <option value=\"wrap-reverse\">Wrap Reverse</option>\n </select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Justify Content</label>\n <select\n value={String(styles.justifyContent ?? 'flex-start')}\n onChange={(e) => onCommitStyle('justifyContent', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"space-between\">Space Between</option>\n <option value=\"space-around\">Space Around</option>\n <option value=\"space-evenly\">Space Evenly</option>\n </select>\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Align Items</label>\n <select\n value={String(styles.alignItems ?? 'stretch')}\n onChange={(e) => onCommitStyle('alignItems', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"stretch\">Stretch</option>\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"baseline\">Baseline</option>\n </select>\n </div>\n </div>\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Gap</label>\n <input\n type=\"text\"\n placeholder=\"0px / 1rem\"\n value={String(styles.gap ?? '')}\n onChange={(e) => onCommitStyle('gap', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono\"\n />\n </div>\n </div>\n )}\n\n {sector.id === 'motion' && (\n <MotionSectorControls\n animation={animation}\n onChange={onCommitAnimation ?? (() => {})}\n onReplay={onReplayAnimation}\n />\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\n\nexport interface BoxModelValues {\n marginTop?: string | number;\n marginRight?: string | number;\n marginBottom?: string | number;\n marginLeft?: string | number;\n\n borderTopWidth?: string | number;\n borderRightWidth?: string | number;\n borderBottomWidth?: string | number;\n borderLeftWidth?: string | number;\n\n paddingTop?: string | number;\n paddingRight?: string | number;\n paddingBottom?: string | number;\n paddingLeft?: string | number;\n}\n\nexport interface BoxModelEditorProps {\n values?: BoxModelValues | Record<string, unknown>;\n onChange?: (property: string, value: string) => void;\n className?: string;\n disabled?: boolean;\n}\n\nexport function parseBoxValue(val: unknown): { num: string; unit: string; raw: string } {\n if (val === undefined || val === null || val === '') {\n return { num: '-', unit: 'px', raw: '' };\n }\n if (typeof val === 'number') {\n return { num: String(val), unit: 'px', raw: `${val}px` };\n }\n const str = String(val).trim();\n if (str.toLowerCase() === 'auto') {\n return { num: 'auto', unit: 'auto', raw: 'auto' };\n }\n const match = str.match(/^(-?\\d*\\.?\\d+)\\s*(px|rem|%|em|vh|vw)?$/i);\n if (match) {\n const unit = match[2]?.toLowerCase() || 'px';\n return { num: match[1], unit, raw: str };\n }\n return { num: str, unit: 'px', raw: str };\n}\n\ninterface BoxSideInputProps {\n property: string;\n label: string;\n value: unknown;\n onChange?: (property: string, value: string) => void;\n theme: 'margin' | 'border' | 'padding';\n allowAuto?: boolean;\n disabled?: boolean;\n}\n\nconst BoxSideInput: React.FC<BoxSideInputProps> = ({\n property,\n label,\n value,\n onChange,\n theme,\n allowAuto = false,\n disabled = false,\n}) => {\n const parsed = parseBoxValue(value);\n const [isEditing, setIsEditing] = useState(false);\n const [inputValue, setInputValue] = useState(parsed.raw === '' ? '' : parsed.num);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!isEditing) {\n setInputValue(parsed.raw === '' ? '' : parsed.num);\n }\n }, [value, isEditing, parsed.num, parsed.raw]);\n\n const commitValue = (rawInput: string) => {\n const trimmed = rawInput.trim();\n if (trimmed === '' || trimmed === '-') {\n onChange?.(property, '');\n return;\n }\n if (allowAuto && trimmed.toLowerCase() === 'auto') {\n onChange?.(property, 'auto');\n return;\n }\n const matchWithUnit = trimmed.match(/^(-?\\d*\\.?\\d+)\\s*(px|rem|%|em|vh|vw)$/i);\n if (matchWithUnit) {\n onChange?.(property, `${matchWithUnit[1]}${matchWithUnit[2].toLowerCase()}`);\n return;\n }\n const numOnly = Number(trimmed);\n if (!Number.isNaN(numOnly)) {\n const currentUnit = parsed.unit && parsed.unit !== 'auto' ? parsed.unit : 'px';\n onChange?.(property, `${trimmed}${currentUnit}`);\n return;\n }\n onChange?.(property, trimmed);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commitValue(inputValue);\n setIsEditing(false);\n } else if (e.key === 'Escape') {\n setIsEditing(false);\n setInputValue(parsed.raw === '' ? '' : parsed.num);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const currentNum = Number(inputValue) || 0;\n const step = e.shiftKey ? 10 : 1;\n const nextNum = e.key === 'ArrowUp' ? currentNum + step : Math.max(0, currentNum - step);\n const strVal = String(nextNum);\n setInputValue(strVal);\n commitValue(strVal);\n }\n };\n\n const themeInputStyles = {\n margin:\n 'text-amber-900 bg-amber-100 border-amber-400 focus:ring-amber-500 hover:border-amber-500',\n border:\n 'text-slate-900 bg-slate-200 border-slate-400 focus:ring-slate-500 hover:border-slate-500',\n padding:\n 'text-emerald-900 bg-emerald-100 border-emerald-400 focus:ring-emerald-500 hover:border-emerald-500',\n }[theme];\n\n const displayText = parsed.num === '-' ? '0' : parsed.num;\n\n if (isEditing && !disabled) {\n return (\n <input\n ref={inputRef}\n type=\"text\"\n aria-label={label}\n data-testid={`box-input-${property}`}\n value={inputValue}\n autoFocus\n onChange={(e) => {\n setInputValue(e.target.value);\n commitValue(e.target.value);\n }}\n onBlur={() => {\n commitValue(inputValue);\n setIsEditing(false);\n }}\n onKeyDown={handleKeyDown}\n className={`w-9 text-center font-mono text-[10px] font-semibold py-0 px-0.5 rounded border focus:outline-none focus:ring-1 shadow-2xs transition ${themeInputStyles}`}\n />\n );\n }\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={label}\n data-testid={`box-btn-${property}`}\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => inputRef.current?.select(), 10);\n }}\n title={`${label}: ${parsed.raw || '0px'} (Click to edit)`}\n className={`min-w-[20px] max-w-[38px] truncate px-1 py-0.5 text-center font-mono text-[10px] font-semibold rounded cursor-pointer transition select-none hover:bg-white/80 active:scale-95 ${\n parsed.num !== '-' && parsed.num !== '0'\n ? 'bg-white/90 shadow-2xs font-bold text-slate-900'\n : 'text-slate-600 hover:text-slate-900'\n }`}\n >\n {displayText}\n </button>\n );\n};\n\nexport const BoxModelEditor: React.FC<BoxModelEditorProps> = ({\n values = {},\n onChange,\n className = '',\n disabled = false,\n}) => {\n return (\n <div\n className={`w-full max-w-full select-none rounded-lg p-2 bg-slate-50 border border-slate-200 text-slate-800 box-border overflow-hidden shadow-2xs ${className}`}\n data-testid=\"visual-box-model\"\n >\n {/* MARGIN LAYER (Outer - Orange/Amber) */}\n <div className=\"relative w-full rounded-md border-2 border-dashed border-amber-400/80 bg-amber-500/10 p-2 box-border transition-colors\">\n <span className=\"absolute top-1 left-1.5 text-[8px] font-black uppercase tracking-wider text-amber-700 pointer-events-none select-none\">\n Margin\n </span>\n\n {/* Margin Top */}\n <div className=\"flex justify-center mb-1\">\n <BoxSideInput\n property=\"marginTop\"\n label=\"Margin Top\"\n value={values.marginTop}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n\n <div className=\"flex items-center gap-1 min-w-0\">\n {/* Margin Left */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"marginLeft\"\n label=\"Margin Left\"\n value={values.marginLeft}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n\n {/* BORDER LAYER (Middle - Slate/Gray) */}\n <div className=\"relative flex-1 min-w-0 rounded-md border-2 border-solid border-slate-300 bg-slate-200/50 p-2 box-border transition-colors\">\n <span className=\"absolute top-1 left-1.5 text-[8px] font-black uppercase tracking-wider text-slate-600 pointer-events-none select-none\">\n Border\n </span>\n\n {/* Border Top */}\n <div className=\"flex justify-center mb-1\">\n <BoxSideInput\n property=\"borderTopWidth\"\n label=\"Border Top Width\"\n value={values.borderTopWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n\n <div className=\"flex items-center gap-1 min-w-0\">\n {/* Border Left */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"borderLeftWidth\"\n label=\"Border Left Width\"\n value={values.borderLeftWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n\n {/* PADDING LAYER (Inner - Emerald/Green) */}\n <div className=\"relative flex-1 min-w-0 rounded-md border-2 border-dashed border-emerald-400/80 bg-emerald-500/15 p-2 box-border transition-colors\">\n <span className=\"absolute top-1 left-1.5 text-[8px] font-black uppercase tracking-wider text-emerald-700 pointer-events-none select-none\">\n Padding\n </span>\n\n {/* Padding Top */}\n <div className=\"flex justify-center mb-1\">\n <BoxSideInput\n property=\"paddingTop\"\n label=\"Padding Top\"\n value={values.paddingTop}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n\n <div className=\"flex items-center gap-1 min-w-0\">\n {/* Padding Left */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"paddingLeft\"\n label=\"Padding Left\"\n value={values.paddingLeft}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n\n {/* CONTENT LAYER (Center - Blue/Neutral) */}\n <div className=\"flex-1 min-w-0 flex items-center justify-center py-1 px-1 rounded bg-blue-500/15 border border-blue-300 text-blue-800 shadow-2xs\">\n <span className=\"text-[9px] font-bold tracking-wider uppercase text-blue-700 truncate\">\n Content\n </span>\n </div>\n\n {/* Padding Right */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"paddingRight\"\n label=\"Padding Right\"\n value={values.paddingRight}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Padding Bottom */}\n <div className=\"flex justify-center mt-1\">\n <BoxSideInput\n property=\"paddingBottom\"\n label=\"Padding Bottom\"\n value={values.paddingBottom}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Border Right */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"borderRightWidth\"\n label=\"Border Right Width\"\n value={values.borderRightWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Border Bottom */}\n <div className=\"flex justify-center mt-1\">\n <BoxSideInput\n property=\"borderBottomWidth\"\n label=\"Border Bottom Width\"\n value={values.borderBottomWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Margin Right */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"marginRight\"\n label=\"Margin Right\"\n value={values.marginRight}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Margin Bottom */}\n <div className=\"flex justify-center mt-1\">\n <BoxSideInput\n property=\"marginBottom\"\n label=\"Margin Bottom\"\n value={values.marginBottom}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport const VisualBoxModel = BoxModelEditor;\n","import React, { useState, useEffect, useRef } from 'react';\n\nexport const DIMENSION_UNITS = ['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none'] as const;\nexport type DimensionUnit = (typeof DIMENSION_UNITS)[number];\n\nexport interface ParsedDimension {\n num: string;\n unit: DimensionUnit;\n raw: string;\n}\n\nexport function parseDimensionValue(\n val: unknown,\n defaultUnit: DimensionUnit = 'px',\n): ParsedDimension {\n if (val === undefined || val === null || val === '') {\n return { num: '', unit: defaultUnit, raw: '' };\n }\n if (typeof val === 'number') {\n return { num: String(val), unit: 'px', raw: `${val}px` };\n }\n const str = String(val).trim();\n if (str.toLowerCase() === 'auto') {\n return { num: 'auto', unit: 'auto', raw: 'auto' };\n }\n if (str.toLowerCase() === 'none') {\n return { num: 'none', unit: 'none', raw: 'none' };\n }\n const match = str.match(/^(-?\\d*\\.?\\d+)\\s*(px|%|rem|em|vw|vh)?$/i);\n if (match) {\n const unitMatch = (match[2]?.toLowerCase() || defaultUnit) as DimensionUnit;\n return {\n num: match[1],\n unit: (DIMENSION_UNITS as readonly string[]).includes(unitMatch) ? unitMatch : defaultUnit,\n raw: str,\n };\n }\n return { num: str, unit: defaultUnit, raw: str };\n}\n\nexport interface DimensionUnitInputProps {\n property: string;\n label: string;\n value: unknown;\n onChange: (property: string, value: string) => void;\n allowedUnits?: DimensionUnit[];\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport const DimensionUnitInput: React.FC<DimensionUnitInputProps> = ({\n property,\n label,\n value,\n onChange,\n allowedUnits = ['px', '%', 'rem', 'em', 'vw', 'vh', 'auto'],\n placeholder = 'auto',\n disabled = false,\n}) => {\n const parsed = parseDimensionValue(value);\n const [num, setNum] = useState(parsed.num);\n const [unit, setUnit] = useState<DimensionUnit>(parsed.unit);\n const isSpecialValue = unit === 'auto' || unit === 'none' || num === 'auto' || num === 'none';\n\n useEffect(() => {\n const next = parseDimensionValue(value);\n setNum(next.num);\n setUnit(next.unit);\n }, [value]);\n\n const handleNumChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawVal = e.target.value;\n setNum(rawVal);\n\n const trimmed = rawVal.trim();\n if (trimmed === '') {\n onChange(property, '');\n return;\n }\n if (trimmed.toLowerCase() === 'auto' && allowedUnits.includes('auto')) {\n setUnit('auto');\n onChange(property, 'auto');\n return;\n }\n if (trimmed.toLowerCase() === 'none' && allowedUnits.includes('none')) {\n setUnit('none');\n onChange(property, 'none');\n return;\n }\n\n // Check if user typed dimension like 100% or 2.5rem\n const match = trimmed.match(/^(-?\\d*\\.?\\d+)\\s*(px|%|rem|em|vw|vh)$/i);\n if (match) {\n const typedUnit = match[2].toLowerCase() as DimensionUnit;\n if (allowedUnits.includes(typedUnit)) {\n setUnit(typedUnit);\n onChange(property, `${match[1]}${typedUnit}`);\n return;\n }\n }\n\n const currentUnit = unit === 'auto' || unit === 'none' ? 'px' : unit;\n if (unit === 'auto' || unit === 'none') {\n setUnit('px');\n }\n onChange(property, `${trimmed}${currentUnit}`);\n };\n\n const handleUnitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const nextUnit = e.target.value as DimensionUnit;\n setUnit(nextUnit);\n\n if (nextUnit === 'auto') {\n setNum('auto');\n onChange(property, 'auto');\n return;\n }\n if (nextUnit === 'none') {\n setNum('none');\n onChange(property, 'none');\n return;\n }\n\n if (num === 'auto' || num === 'none' || num.trim() === '') {\n setNum('');\n onChange(property, '');\n return;\n }\n\n onChange(property, `${num.trim()}${nextUnit}`);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n if (isSpecialValue) return;\n const currentNum = Number(num) || 0;\n const step = e.shiftKey ? 10 : 1;\n const nextNum = e.key === 'ArrowUp' ? currentNum + step : Math.max(0, currentNum - step);\n const strVal = String(nextNum);\n setNum(strVal);\n onChange(property, `${strVal}${unit}`);\n }\n };\n\n return (\n <div className=\"flex flex-col\">\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">{label}</label>\n <div className=\"flex items-center rounded border border-slate-300 bg-white focus-within:ring-1 focus-within:ring-blue-500 focus-within:border-blue-500 overflow-hidden shadow-2xs\">\n <input\n type={isSpecialValue ? 'text' : 'number'}\n data-testid={`dimension-input-${property}`}\n aria-label={label}\n value={num}\n placeholder={placeholder}\n disabled={disabled}\n onChange={handleNumChange}\n onKeyDown={handleKeyDown}\n className=\"w-full min-w-0 text-xs bg-white text-slate-900 px-2 py-1 focus:outline-none disabled:bg-slate-100 disabled:text-slate-500 font-mono\"\n />\n <select\n data-testid={`dimension-unit-${property}`}\n aria-label={`${label} Unit`}\n value={unit}\n disabled={disabled}\n onChange={handleUnitChange}\n className=\"shrink-0 text-[11px] bg-slate-100 text-slate-700 font-medium px-1.5 py-1 border-l border-slate-200 focus:outline-none cursor-pointer hover:bg-slate-200 transition\"\n >\n {allowedUnits.map((u) => (\n <option key={u} value={u}>\n {u}\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n};\n\nexport interface DimensionSectorControlsProps {\n styles?: Record<string, unknown>;\n onChange: (property: string, value: string) => void;\n disabled?: boolean;\n className?: string;\n}\n\nexport const DimensionSectorControls: React.FC<DimensionSectorControlsProps> = ({\n styles = {},\n onChange,\n disabled = false,\n className = '',\n}) => {\n return (\n <div className={`flex flex-col gap-3 ${className}`} data-testid=\"dimension-sector-controls\">\n {/* Display & Overflow */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Display</label>\n <select\n data-testid=\"dimension-select-display\"\n aria-label=\"Display\"\n value={String(styles.display ?? 'block')}\n disabled={disabled}\n onChange={(e) => onChange('display', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <option value=\"block\">Block</option>\n <option value=\"flex\">Flex</option>\n <option value=\"inline-flex\">Inline Flex</option>\n <option value=\"inline-block\">Inline Block</option>\n <option value=\"inline\">Inline</option>\n <option value=\"grid\">Grid</option>\n <option value=\"inline-grid\">Inline Grid</option>\n <option value=\"none\">None</option>\n </select>\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Overflow</label>\n <select\n data-testid=\"dimension-select-overflow\"\n aria-label=\"Overflow\"\n value={String(styles.overflow ?? 'visible')}\n disabled={disabled}\n onChange={(e) => onChange('overflow', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <option value=\"visible\">Visible</option>\n <option value=\"hidden\">Hidden</option>\n <option value=\"scroll\">Scroll</option>\n <option value=\"auto\">Auto</option>\n </select>\n </div>\n </div>\n\n {/* Width & Height */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"width\"\n label=\"Width\"\n value={styles.width}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"height\"\n label=\"Height\"\n value={styles.height}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n </div>\n\n {/* Min Width & Max Width */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"minWidth\"\n label=\"Min Width\"\n value={styles.minWidth}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"maxWidth\"\n label=\"Max Width\"\n value={styles.maxWidth}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"none\"\n disabled={disabled}\n />\n </div>\n\n {/* Min Height & Max Height */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"minHeight\"\n label=\"Min Height\"\n value={styles.minHeight}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"maxHeight\"\n label=\"Max Height\"\n value={styles.maxHeight}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"none\"\n disabled={disabled}\n />\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { DimensionUnitInput } from './dimension-sector-controls';\nimport { AlignLeft, AlignCenter, AlignRight, AlignJustify } from 'lucide-react';\n\nexport interface FontOption {\n label: string;\n value: string;\n category: 'sans-serif' | 'serif' | 'display' | 'monospace' | 'system';\n googleFontName?: string;\n}\n\nexport const GOOGLE_FONTS: FontOption[] = [\n // System / Default\n { label: 'Default (Inherit)', value: '', category: 'system' },\n {\n label: 'System UI',\n value: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n category: 'system',\n },\n\n // Sans-Serif Google Fonts\n { label: 'Inter', value: '\"Inter\", sans-serif', category: 'sans-serif', googleFontName: 'Inter' },\n {\n label: 'Plus Jakarta Sans',\n value: '\"Plus Jakarta Sans\", sans-serif',\n category: 'sans-serif',\n googleFontName: 'Plus Jakarta Sans',\n },\n { label: 'Outfit', value: '\"Outfit\", sans-serif', category: 'sans-serif', googleFontName: 'Outfit' },\n { label: 'Poppins', value: '\"Poppins\", sans-serif', category: 'sans-serif', googleFontName: 'Poppins' },\n { label: 'Roboto', value: '\"Roboto\", sans-serif', category: 'sans-serif', googleFontName: 'Roboto' },\n { label: 'Montserrat', value: '\"Montserrat\", sans-serif', category: 'sans-serif', googleFontName: 'Montserrat' },\n { label: 'Open Sans', value: '\"Open Sans\", sans-serif', category: 'sans-serif', googleFontName: 'Open Sans' },\n { label: 'Lato', value: '\"Lato\", sans-serif', category: 'sans-serif', googleFontName: 'Lato' },\n { label: 'DM Sans', value: '\"DM Sans\", sans-serif', category: 'sans-serif', googleFontName: 'DM Sans' },\n { label: 'Nunito', value: '\"Nunito\", sans-serif', category: 'sans-serif', googleFontName: 'Nunito' },\n\n // Serif Google Fonts\n {\n label: 'Playfair Display',\n value: '\"Playfair Display\", serif',\n category: 'serif',\n googleFontName: 'Playfair Display',\n },\n {\n label: 'Merriweather',\n value: '\"Merriweather\", serif',\n category: 'serif',\n googleFontName: 'Merriweather',\n },\n { label: 'Lora', value: '\"Lora\", serif', category: 'serif', googleFontName: 'Lora' },\n { label: 'Cinzel', value: '\"Cinzel\", serif', category: 'serif', googleFontName: 'Cinzel' },\n { label: 'PT Serif', value: '\"PT Serif\", serif', category: 'serif', googleFontName: 'PT Serif' },\n\n // Display / Modern Google Fonts\n {\n label: 'Space Grotesk',\n value: '\"Space Grotesk\", sans-serif',\n category: 'display',\n googleFontName: 'Space Grotesk',\n },\n { label: 'Syne', value: '\"Syne\", sans-serif', category: 'display', googleFontName: 'Syne' },\n { label: 'Bebas Neue', value: '\"Bebas Neue\", sans-serif', category: 'display', googleFontName: 'Bebas Neue' },\n\n // Monospace Google Fonts\n {\n label: 'JetBrains Mono',\n value: '\"JetBrains Mono\", monospace',\n category: 'monospace',\n googleFontName: 'JetBrains Mono',\n },\n { label: 'Fira Code', value: '\"Fira Code\", monospace', category: 'monospace', googleFontName: 'Fira Code' },\n {\n label: 'Source Code Pro',\n value: '\"Source Code Pro\", monospace',\n category: 'monospace',\n googleFontName: 'Source Code Pro',\n },\n];\n\nexport function loadGoogleFont(fontName: string): void {\n if (typeof document === 'undefined' || !fontName) return;\n const safeId = `google-font-${fontName.replace(/\\s+/g, '-').toLowerCase()}`;\n if (document.getElementById(safeId)) return;\n\n const link = document.createElement('link');\n link.id = safeId;\n link.rel = 'stylesheet';\n const queryName = fontName.replace(/\\s+/g, '+');\n link.href = `https://fonts.googleapis.com/css2?family=${queryName}:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,700&display=swap`;\n document.head.appendChild(link);\n}\n\nexport interface TypographySectorControlsProps {\n styles?: Record<string, unknown>;\n onChange: (property: string, value: string) => void;\n disabled?: boolean;\n className?: string;\n}\n\nexport const TypographySectorControls: React.FC<TypographySectorControlsProps> = ({\n styles = {},\n onChange,\n disabled = false,\n className = '',\n}) => {\n const currentFont = typeof styles.fontFamily === 'string' ? styles.fontFamily : '';\n const [isCustomFont, setIsCustomFont] = useState(false);\n const [customFontText, setCustomFontText] = useState(currentFont);\n\n // Check if currentFont matches one of the preset Google Fonts\n const matchedFont = GOOGLE_FONTS.find(\n (f) => f.value === currentFont || (f.googleFontName && currentFont.includes(f.googleFontName)),\n );\n\n useEffect(() => {\n if (matchedFont?.googleFontName) {\n loadGoogleFont(matchedFont.googleFontName);\n }\n }, [matchedFont]);\n\n const handleFontSelect = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const val = e.target.value;\n if (val === '__custom__') {\n setIsCustomFont(true);\n return;\n }\n setIsCustomFont(false);\n const selected = GOOGLE_FONTS.find((f) => f.value === val);\n if (selected?.googleFontName) {\n loadGoogleFont(selected.googleFontName);\n }\n onChange('fontFamily', val);\n };\n\n const handleCustomFontBlur = () => {\n if (customFontText.trim() !== '') {\n loadGoogleFont(customFontText.trim());\n onChange('fontFamily', customFontText.trim());\n } else {\n onChange('fontFamily', '');\n }\n };\n\n return (\n <div className={`flex flex-col gap-3 ${className}`} data-testid=\"typography-sector-controls\">\n {/* Font Family (Google Fonts) */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"block text-[11px] font-medium text-slate-600\">Font Family (Google Fonts)</label>\n <button\n type=\"button\"\n onClick={() => setIsCustomFont(!isCustomFont)}\n className=\"text-[10px] text-blue-600 hover:text-blue-800 underline cursor-pointer\"\n >\n {isCustomFont ? 'Choose from list' : 'Custom font'}\n </button>\n </div>\n\n {!isCustomFont ? (\n <select\n data-testid=\"typography-select-font-family\"\n aria-label=\"Font Family\"\n value={matchedFont ? matchedFont.value : currentFont ? '__custom__' : ''}\n disabled={disabled}\n onChange={handleFontSelect}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <optgroup label=\"System\">\n {GOOGLE_FONTS.filter((f) => f.category === 'system').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Sans-Serif\">\n {GOOGLE_FONTS.filter((f) => f.category === 'sans-serif').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Serif\">\n {GOOGLE_FONTS.filter((f) => f.category === 'serif').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Display\">\n {GOOGLE_FONTS.filter((f) => f.category === 'display').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Monospace\">\n {GOOGLE_FONTS.filter((f) => f.category === 'monospace').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <option value=\"__custom__\">Custom font name...</option>\n </select>\n ) : (\n <input\n type=\"text\"\n data-testid=\"typography-input-custom-font\"\n placeholder=\"e.g. Poppins, Outfit, serif\"\n value={customFontText}\n disabled={disabled}\n onChange={(e) => setCustomFontText(e.target.value)}\n onBlur={handleCustomFontBlur}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCustomFontBlur();\n }}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs font-mono\"\n />\n )}\n </div>\n\n {/* Font Size & Font Weight */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"fontSize\"\n label=\"Font Size\"\n value={styles.fontSize}\n onChange={onChange}\n allowedUnits={['px', 'rem', 'em', 'vw', 'vh']}\n placeholder=\"16px\"\n disabled={disabled}\n />\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Font Weight</label>\n <select\n data-testid=\"typography-select-font-weight\"\n aria-label=\"Font Weight\"\n value={String(styles.fontWeight ?? 'normal')}\n disabled={disabled}\n onChange={(e) => onChange('fontWeight', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <option value=\"100\">100 - Thin</option>\n <option value=\"200\">200 - Extra Light</option>\n <option value=\"300\">300 - Light</option>\n <option value=\"400\">400 - Regular</option>\n <option value=\"500\">500 - Medium</option>\n <option value=\"600\">600 - Semi Bold</option>\n <option value=\"700\">700 - Bold</option>\n <option value=\"800\">800 - Extra Bold</option>\n <option value=\"900\">900 - Black</option>\n </select>\n </div>\n </div>\n\n {/* Line Height & Letter Spacing */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"lineHeight\"\n label=\"Line Height\"\n value={styles.lineHeight}\n onChange={onChange}\n allowedUnits={['px', 'rem', 'em', '%', 'auto']}\n placeholder=\"1.5\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"letterSpacing\"\n label=\"Letter Spacing\"\n value={styles.letterSpacing}\n onChange={onChange}\n allowedUnits={['px', 'rem', 'em', 'auto']}\n placeholder=\"0px\"\n disabled={disabled}\n />\n </div>\n\n {/* Color & Text Align */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Text Color</label>\n <div className=\"flex items-center rounded border border-slate-300 bg-white p-0.5 focus-within:ring-1 focus-within:ring-blue-500 shadow-2xs\">\n <input\n type=\"color\"\n data-testid=\"typography-color-picker\"\n aria-label=\"Color Picker\"\n value={typeof styles.color === 'string' && styles.color.startsWith('#') ? styles.color : '#000000'}\n disabled={disabled}\n onChange={(e) => onChange('color', e.target.value)}\n className=\"w-6 h-6 rounded border border-slate-200 cursor-pointer p-0 shrink-0\"\n />\n <input\n type=\"text\"\n data-testid=\"typography-input-color\"\n placeholder=\"#000000\"\n value={String(styles.color ?? '')}\n disabled={disabled}\n onChange={(e) => onChange('color', e.target.value)}\n className=\"w-full min-w-0 text-xs bg-white text-slate-900 px-1.5 py-0.5 focus:outline-none font-mono\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Text Align</label>\n <div className=\"grid grid-cols-4 rounded border border-slate-300 bg-slate-100 p-0.5 gap-0.5 shadow-2xs\">\n {[\n { id: 'left', label: 'Left', icon: <AlignLeft className=\"w-3.5 h-3.5 mx-auto\" /> },\n { id: 'center', label: 'Center', icon: <AlignCenter className=\"w-3.5 h-3.5 mx-auto\" /> },\n { id: 'right', label: 'Right', icon: <AlignRight className=\"w-3.5 h-3.5 mx-auto\" /> },\n { id: 'justify', label: 'Justify', icon: <AlignJustify className=\"w-3.5 h-3.5 mx-auto\" /> },\n ].map((btn) => {\n const isActive = (styles.textAlign ?? 'left') === btn.id;\n return (\n <button\n key={btn.id}\n type=\"button\"\n data-testid={`typography-align-${btn.id}`}\n title={`Align ${btn.label}`}\n disabled={disabled}\n onClick={() => onChange('textAlign', btn.id)}\n className={`py-1 text-xs font-bold rounded transition cursor-pointer flex items-center justify-center ${\n isActive\n ? 'bg-white text-blue-600 shadow-xs'\n : 'text-slate-600 hover:bg-slate-200 hover:text-slate-900'\n }`}\n >\n {btn.icon}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Text Decoration & Text Transform */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Decoration</label>\n <div className=\"grid grid-cols-4 rounded border border-slate-300 bg-slate-100 p-0.5 gap-0.5 shadow-2xs\">\n {[\n { id: 'none', label: 'None', text: '—' },\n { id: 'underline', label: 'Underline', text: 'U', style: { textDecoration: 'underline' } },\n { id: 'line-through', label: 'Line-Through', text: 'S', style: { textDecoration: 'line-through' } },\n { id: 'overline', label: 'Overline', text: 'O', style: { textDecoration: 'overline' } },\n ].map((btn) => {\n const isActive = (styles.textDecoration ?? 'none') === btn.id;\n return (\n <button\n key={btn.id}\n type=\"button\"\n data-testid={`typography-decor-${btn.id}`}\n title={`Decoration: ${btn.label}`}\n disabled={disabled}\n style={btn.style}\n onClick={() => onChange('textDecoration', btn.id)}\n className={`py-1 text-xs font-bold rounded transition cursor-pointer ${\n isActive\n ? 'bg-white text-blue-600 shadow-xs'\n : 'text-slate-600 hover:bg-slate-200 hover:text-slate-900'\n }`}\n >\n {btn.text}\n </button>\n );\n })}\n </div>\n </div>\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Transform</label>\n <div className=\"grid grid-cols-4 rounded border border-slate-300 bg-slate-100 p-0.5 gap-0.5 shadow-2xs\">\n {[\n { id: 'none', label: 'None', text: '—' },\n { id: 'uppercase', label: 'UPPERCASE', text: 'TT' },\n { id: 'lowercase', label: 'lowercase', text: 'tt' },\n { id: 'capitalize', label: 'Capitalize', text: 'Tt' },\n ].map((btn) => {\n const isActive = (styles.textTransform ?? 'none') === btn.id;\n return (\n <button\n key={btn.id}\n type=\"button\"\n data-testid={`typography-transform-${btn.id}`}\n title={`Transform: ${btn.label}`}\n disabled={disabled}\n onClick={() => onChange('textTransform', btn.id)}\n className={`py-1 text-xs font-bold rounded transition cursor-pointer ${\n isActive\n ? 'bg-white text-blue-600 shadow-xs'\n : 'text-slate-600 hover:bg-slate-200 hover:text-slate-900'\n }`}\n >\n {btn.text}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { AnimationConfig, DEFAULT_ANIMATION_CONFIG } from '@kubuild/schema';\nimport { ComponentIcon } from './icons';\n\nexport interface MotionSectorControlsProps {\n animation?: Partial<AnimationConfig>;\n onChange: (animation: Partial<AnimationConfig>) => void;\n onReplay?: () => void;\n disabled?: boolean;\n}\n\nexport const ANIMATION_TYPES = [\n\n { value: 'none', label: 'None' },\n {\n group: 'Fade Effects',\n items: [\n { value: 'fade', label: 'Fade' },\n { value: 'fade-up', label: 'Fade Up' },\n { value: 'fade-down', label: 'Fade Down' },\n { value: 'fade-left', label: 'Fade Left' },\n { value: 'fade-right', label: 'Fade Right' },\n ],\n },\n {\n group: 'Zoom Effects',\n items: [\n { value: 'zoom-in', label: 'Zoom In' },\n { value: 'zoom-out', label: 'Zoom Out' },\n ],\n },\n {\n group: 'Slide Effects',\n items: [\n { value: 'slide-up', label: 'Slide Up' },\n { value: 'slide-down', label: 'Slide Down' },\n { value: 'slide-left', label: 'Slide Left' },\n { value: 'slide-right', label: 'Slide Right' },\n ],\n },\n {\n group: 'Flip Effects',\n items: [\n { value: 'flip-up', label: 'Flip Up' },\n { value: 'flip-down', label: 'Flip Down' },\n ],\n },\n];\n\nexport const EASING_OPTIONS = [\n { value: 'ease-out', label: 'Ease Out' },\n { value: 'ease', label: 'Ease' },\n { value: 'linear', label: 'Linear' },\n { value: 'ease-in', label: 'Ease In' },\n { value: 'ease-in-out', label: 'Ease In Out' },\n];\n\nexport const HOVER_EFFECTS = [\n { value: 'none', label: 'None' },\n { value: 'lift', label: 'Lift' },\n { value: 'scale', label: 'Scale' },\n { value: 'glow', label: 'Glow' },\n { value: 'tilt', label: 'Tilt' },\n];\n\nexport const LOOP_EFFECTS = [\n { value: 'none', label: 'None' },\n { value: 'pulse', label: 'Pulse' },\n { value: 'bounce', label: 'Bounce' },\n { value: 'spin', label: 'Spin' },\n { value: 'float', label: 'Float' },\n { value: 'shimmer', label: 'Shimmer' },\n];\n\nexport const MotionSectorControls: React.FC<MotionSectorControlsProps> = ({\n animation,\n onChange,\n onReplay,\n disabled = false,\n}) => {\n const currentConfig: AnimationConfig = {\n ...DEFAULT_ANIMATION_CONFIG,\n ...(animation ?? {}),\n };\n\n const handleTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ type: e.target.value });\n };\n\n const handleDurationChange = (val: number) => {\n onChange({ duration: Math.max(0, val) });\n };\n\n const handleDelayChange = (val: number) => {\n onChange({ delay: Math.max(0, val) });\n };\n\n const handleEasingChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ easing: e.target.value });\n };\n\n const handleOnceToggle = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ once: e.target.checked });\n };\n\n const handleHoverChange = (effect: string) => {\n onChange({ hoverEffect: effect });\n };\n\n const handleLoopChange = (effect: string) => {\n onChange({ loopEffect: effect });\n };\n\n const isAnimated =\n currentConfig.type !== 'none' ||\n currentConfig.hoverEffect !== 'none' ||\n currentConfig.loopEffect !== 'none';\n\n return (\n <div className=\"flex flex-col gap-4 text-xs text-slate-700\" data-testid=\"motion-sector-controls\">\n {/* Live Replay Button (STORA-262) */}\n {isAnimated && onReplay && (\n <button\n type=\"button\"\n data-testid=\"motion-replay-button\"\n onClick={onReplay}\n disabled={disabled}\n className=\"flex items-center justify-center gap-1.5 w-full py-1.5 px-3 rounded bg-blue-50 hover:bg-blue-100 text-blue-700 border border-blue-200 font-medium transition shadow-2xs cursor-pointer\"\n >\n <ComponentIcon iconOrType=\"play\" size={13} className=\"text-blue-600\" />\n <span>Play / Replay Animation</span>\n </button>\n )}\n\n {/* 1. Scroll / Entrance Animation Type */}\n <div className=\"flex flex-col gap-1\">\n <label htmlFor=\"motion-animation-type\" className=\"font-semibold text-slate-600 flex items-center justify-between\">\n <span>Entrance / Scroll Effect</span>\n {currentConfig.type !== 'none' && (\n <span className=\"text-[10px] font-medium text-blue-600 bg-blue-50 px-1.5 py-0.5 rounded border border-blue-200\">\n Active\n </span>\n )}\n </label>\n <select\n id=\"motion-animation-type\"\n data-testid=\"motion-animation-type\"\n value={currentConfig.type}\n onChange={handleTypeChange}\n disabled={disabled}\n className=\"w-full bg-white text-slate-900 border border-slate-300 rounded px-2.5 py-1.5 text-xs focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 shadow-2xs\"\n >\n {ANIMATION_TYPES.map((opt) => {\n if ('items' in opt && Array.isArray(opt.items)) {\n return (\n <optgroup key={opt.group} label={opt.group}>\n {opt.items.map((item) => (\n <option key={item.value} value={item.value}>\n {item.label}\n </option>\n ))}\n </optgroup>\n );\n }\n if ('value' in opt) {\n return (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n );\n }\n return null;\n })}\n </select>\n </div>\n\n {/* 2. Duration & Delay Sliders */}\n <div className=\"flex flex-col gap-3 p-2.5 bg-slate-50/70 border border-slate-200 rounded-lg\">\n {/* Duration */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label htmlFor=\"motion-duration-slider\" className=\"font-medium text-slate-600\">\n Duration\n </label>\n <div className=\"flex items-center gap-1\">\n <input\n id=\"motion-duration-input\"\n data-testid=\"motion-duration-input\"\n type=\"number\"\n min={0}\n max={10000}\n step={50}\n value={currentConfig.duration}\n onChange={(e) => handleDurationChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-16 bg-white text-slate-900 border border-slate-300 rounded px-1.5 py-0.5 text-right font-mono text-[11px] focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-slate-400 text-[10px]\">ms</span>\n </div>\n </div>\n <input\n id=\"motion-duration-slider\"\n data-testid=\"motion-duration-slider\"\n type=\"range\"\n min={0}\n max={3000}\n step={50}\n value={Math.min(currentConfig.duration, 3000)}\n onChange={(e) => handleDurationChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-full accent-blue-600 h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n\n {/* Delay */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label htmlFor=\"motion-delay-slider\" className=\"font-medium text-slate-600\">\n Delay\n </label>\n <div className=\"flex items-center gap-1\">\n <input\n id=\"motion-delay-input\"\n data-testid=\"motion-delay-input\"\n type=\"number\"\n min={0}\n max={10000}\n step={50}\n value={currentConfig.delay}\n onChange={(e) => handleDelayChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-16 bg-white text-slate-900 border border-slate-300 rounded px-1.5 py-0.5 text-right font-mono text-[11px] focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-slate-400 text-[10px]\">ms</span>\n </div>\n </div>\n <input\n id=\"motion-delay-slider\"\n data-testid=\"motion-delay-slider\"\n type=\"range\"\n min={0}\n max={2000}\n step={50}\n value={Math.min(currentConfig.delay, 2000)}\n onChange={(e) => handleDelayChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-full accent-blue-600 h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n\n {/* Easing & Trigger Once */}\n <div className=\"grid grid-cols-2 gap-2 pt-1 border-t border-slate-200/80\">\n <div className=\"flex flex-col gap-1\">\n <label htmlFor=\"motion-easing-select\" className=\"text-[11px] font-medium text-slate-500\">\n Easing Curve\n </label>\n <select\n id=\"motion-easing-select\"\n data-testid=\"motion-easing-select\"\n value={currentConfig.easing}\n onChange={handleEasingChange}\n disabled={disabled}\n className=\"bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 text-[11px] focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n {EASING_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"flex flex-col justify-end\">\n <label\n htmlFor=\"motion-once-toggle\"\n className=\"flex items-center gap-1.5 text-[11px] font-medium text-slate-600 cursor-pointer select-none py-1\"\n >\n <input\n id=\"motion-once-toggle\"\n data-testid=\"motion-once-toggle\"\n type=\"checkbox\"\n checked={currentConfig.once}\n onChange={handleOnceToggle}\n disabled={disabled}\n className=\"rounded border-slate-300 text-blue-600 focus:ring-blue-500\"\n />\n <span>Trigger Once</span>\n </label>\n </div>\n </div>\n </div>\n\n {/* 3. Hover Micro-Interactions (Segmented Buttons) */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label className=\"font-semibold text-slate-600\">Hover Micro-Interaction</label>\n {currentConfig.hoverEffect !== 'none' && (\n <span className=\"text-[10px] font-medium text-amber-700 bg-amber-50 px-1.5 py-0.5 rounded border border-amber-200\">\n {currentConfig.hoverEffect}\n </span>\n )}\n </div>\n <div\n role=\"radiogroup\"\n aria-label=\"Hover Micro-Interaction\"\n className=\"flex items-center gap-1 p-1 bg-slate-100 border border-slate-200 rounded-lg flex-wrap\"\n data-testid=\"motion-hover-segmented\"\n >\n {HOVER_EFFECTS.map((item) => {\n const isSelected = currentConfig.hoverEffect === item.value;\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n data-testid={`motion-hover-${item.value}`}\n onClick={() => handleHoverChange(item.value)}\n disabled={disabled}\n className={`flex-1 min-w-[50px] py-1 px-2 text-[11px] font-medium rounded text-center transition cursor-pointer ${\n isSelected\n ? 'bg-white text-blue-700 font-semibold shadow-xs border border-slate-200'\n : 'text-slate-600 hover:text-slate-900 hover:bg-slate-200/60'\n }`}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* 4. Continuous Loop Effect (Segmented Buttons) */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label className=\"font-semibold text-slate-600\">Loop Animation</label>\n {currentConfig.loopEffect !== 'none' && (\n <span className=\"text-[10px] font-medium text-indigo-700 bg-indigo-50 px-1.5 py-0.5 rounded border border-indigo-200\">\n {currentConfig.loopEffect}\n </span>\n )}\n </div>\n <div\n role=\"radiogroup\"\n aria-label=\"Loop Animation\"\n className=\"flex items-center gap-1 p-1 bg-slate-100 border border-slate-200 rounded-lg flex-wrap\"\n data-testid=\"motion-loop-segmented\"\n >\n {LOOP_EFFECTS.map((item) => {\n const isSelected = currentConfig.loopEffect === item.value;\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n data-testid={`motion-loop-${item.value}`}\n onClick={() => handleLoopChange(item.value)}\n disabled={disabled}\n className={`flex-1 min-w-[50px] py-1 px-1.5 text-[11px] font-medium rounded text-center transition cursor-pointer ${\n isSelected\n ? 'bg-white text-indigo-700 font-semibold shadow-xs border border-slate-200'\n : 'text-slate-600 hover:text-slate-900 hover:bg-slate-200/60'\n }`}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport {\n ComponentRegistry,\n ComponentTraitDefinition,\n TRAIT_GROUP_ORDER,\n TRAIT_GROUP_LABELS,\n TraitGroup,\n} from '@kubuild/components';\nimport { findNodeById } from '@kubuild/core';\nimport { PageDocument } from '@kubuild/schema';\nimport { X } from 'lucide-react';\n\nexport interface TraitsPanelProps {\n registry: ComponentRegistry;\n document: PageDocument;\n selectedNodeId: string | null;\n /** Commit a single trait value to the node's props. */\n onCommitTrait: (traitName: string, value: unknown) => void;\n className?: string;\n}\n\nfunction ErrorText({ message }: { message: string | null | undefined }) {\n if (!message) return null;\n return (\n <div\n role=\"alert\"\n className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1 mt-1\"\n >\n {message}\n </div>\n );\n}\n\ninterface TraitStringControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: string) => void;\n}\n\nconst TraitStringControl: React.FC<TraitStringControlProps> = ({ trait, value, onCommit }) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value]);\n\n return (\n <input\n type=\"text\"\n value={text}\n onFocus={() => {\n isFocusedRef.current = true;\n }}\n onChange={(e) => {\n setText(e.target.value);\n onCommit(e.target.value);\n }}\n onBlur={() => {\n isFocusedRef.current = false;\n onCommit(text);\n }}\n placeholder={trait.defaultValue !== undefined ? String(trait.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\nconst TraitMediaSrcControl: React.FC<TraitStringControlProps> = ({ trait, value, onCommit }) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value]);\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n setText(dataUrl);\n onCommit(dataUrl);\n };\n reader.readAsDataURL(file);\n e.target.value = '';\n };\n\n const isDataUrl = text.startsWith('data:image/');\n const hasPreview = text.trim().length > 0 && (isDataUrl || text.startsWith('http://') || text.startsWith('https://') || text.startsWith('blob:'));\n const isLocalFilePath = text.trim().startsWith('file:') || /^[a-zA-Z]:\\\\/.test(text.trim());\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileUpload}\n accept=\"image/png, image/jpeg, image/jpg, image/webp, image/svg+xml, image/gif, image/avif\"\n className=\"hidden\"\n />\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={text}\n onFocus={() => {\n isFocusedRef.current = true;\n }}\n onChange={(e) => {\n setText(e.target.value);\n onCommit(e.target.value);\n }}\n onBlur={() => {\n isFocusedRef.current = false;\n onCommit(text);\n }}\n placeholder={trait.defaultValue !== undefined ? String(trait.defaultValue) : 'https://... or upload local image'}\n className=\"flex-1 min-w-0 text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono text-[11px]\"\n />\n <button\n type=\"button\"\n title=\"Upload local image from device\"\n aria-label=\"Upload local image from device\"\n onClick={() => fileInputRef.current?.click()}\n className=\"shrink-0 p-1.5 rounded border border-slate-300 bg-white text-slate-600 hover:text-blue-600 hover:border-blue-400 hover:bg-blue-50/50 transition flex items-center gap-1 text-xs font-medium cursor-pointer\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n <span className=\"text-[11px]\">Upload</span>\n </button>\n </div>\n\n {hasPreview && (\n <div className=\"flex items-center gap-2 bg-slate-50 border border-slate-200 rounded p-1.5\">\n <img\n src={text}\n alt=\"Preview\"\n className=\"w-8 h-8 object-cover rounded border border-slate-300 bg-white\"\n onError={(e) => {\n (e.target as HTMLElement).style.display = 'none';\n }}\n />\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <span className=\"text-[11px] font-medium text-slate-700 truncate\">\n {isDataUrl ? 'Local Image (Embedded)' : text}\n </span>\n <span className=\"text-[10px] text-slate-400\">\n {isDataUrl ? 'Base64 image data' : 'URL / Asset'}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n setText('');\n onCommit('');\n }}\n title=\"Clear image\"\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition cursor-pointer text-xs\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n {isLocalFilePath && (\n <div className=\"text-[11px] text-amber-700 bg-amber-50 border border-amber-200 rounded p-1.5 leading-tight\">\n Browsers cannot open direct local paths (<code className=\"font-mono\">file://</code>). Click <strong>Upload</strong> above to select and load the local image directly.\n </div>\n )}\n </div>\n );\n};\n\ninterface TraitNumberControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: number | undefined) => void;\n}\n\nconst TraitNumberControl: React.FC<TraitNumberControlProps> = ({ trait, value, onCommit }) => {\n const valueNum = typeof value === 'number' ? value : undefined;\n const [text, setText] = useState(valueNum !== undefined ? String(valueNum) : '');\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(valueNum !== undefined ? String(valueNum) : '');\n }\n }, [value]);\n\n const commit = (raw: string) => {\n if (raw.trim() === '') {\n onCommit(undefined);\n return;\n }\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) {\n onCommit(parsed);\n }\n };\n\n return (\n <input\n type=\"number\"\n value={text}\n onFocus={() => {\n isFocusedRef.current = true;\n }}\n onChange={(e) => {\n setText(e.target.value);\n commit(e.target.value);\n }}\n onBlur={() => {\n isFocusedRef.current = false;\n commit(text);\n }}\n placeholder={trait.defaultValue !== undefined ? String(trait.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface TraitBooleanControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: boolean) => void;\n}\n\nconst TraitBooleanControl: React.FC<TraitBooleanControlProps> = ({ trait, value, onCommit }) => {\n const checked = Boolean(value);\n return (\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onCommit(e.target.checked)}\n className=\"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-500 cursor-pointer\"\n />\n <span className=\"text-xs text-slate-600\">{checked ? 'Enabled' : 'Disabled'}</span>\n </label>\n );\n};\n\ninterface TraitSelectControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: unknown) => void;\n}\n\nconst TraitSelectControl: React.FC<TraitSelectControlProps> = ({ trait, value, onCommit }) => {\n const options = trait.options ?? [];\n const currentStr = value !== undefined && value !== null ? String(value) : '';\n\n return (\n <select\n value={currentStr}\n onChange={(e) => {\n const option = options.find((o) => String(o.value) === e.target.value);\n onCommit(option ? option.value : e.target.value);\n }}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n {trait.defaultValue === undefined && <option value=\"\">— none —</option>}\n {options.map((opt) => (\n <option key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n};\n\nfunction renderTraitControl(\n trait: ComponentTraitDefinition,\n value: unknown,\n onCommit: (value: unknown) => void,\n): React.ReactNode {\n switch (trait.type) {\n case 'number':\n return <TraitNumberControl trait={trait} value={value} onCommit={onCommit} />;\n case 'boolean':\n return <TraitBooleanControl trait={trait} value={value} onCommit={onCommit} />;\n case 'select':\n return <TraitSelectControl trait={trait} value={value} onCommit={onCommit} />;\n case 'string':\n default:\n if (trait.name === 'src') {\n return <TraitMediaSrcControl trait={trait} value={value} onCommit={onCommit} />;\n }\n return <TraitStringControl trait={trait} value={value} onCommit={onCommit} />;\n }\n}\n\n/**\n * Composite link control (STORA-212): URL input + \"Open in new tab\" toggle +\n * rel attribute select, rendered as one card in place of the separate\n * href/target/rel traits. Values are committed per-trait via `onCommitTrait`.\n */\ninterface LinkTraitControlProps {\n traits: ComponentTraitDefinition[];\n props: Record<string, unknown> | undefined;\n onCommitTrait: (traitName: string, value: unknown) => void;\n}\n\nconst LinkTraitControl: React.FC<LinkTraitControlProps> = ({ traits, props, onCommitTrait }) => {\n const hrefTrait = traits.find((t) => t.name === 'href');\n const targetTrait = traits.find((t) => t.name === 'target');\n const relTrait = traits.find((t) => t.name === 'rel');\n\n const href = typeof props?.href === 'string' ? props.href : '';\n const target = typeof props?.target === 'string' ? props.target : '';\n const rel = typeof props?.rel === 'string' ? props.rel : '';\n const openInNewTab = target === '_blank';\n\n const handleToggleNewTab = (checked: boolean) => {\n onCommitTrait('target', checked ? '_blank' : '');\n // Reset rel when disabling so stale `noopener noreferrer` doesn't linger.\n if (!checked && rel) {\n onCommitTrait('rel', '');\n }\n };\n\n return (\n <div className=\"rounded border border-slate-200 bg-slate-50/60 p-2.5 flex flex-col gap-3\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">Link</div>\n\n {hrefTrait && (\n <div>\n <label className=\"flex items-center gap-1 text-xs font-medium text-slate-600 mb-1\">\n {hrefTrait.label}\n {hrefTrait.required && <span className=\"text-red-500\">*</span>}\n </label>\n <TraitStringControl\n trait={hrefTrait}\n value={href}\n onCommit={(v) => onCommitTrait('href', v)}\n />\n {hrefTrait.description && (\n <div className=\"text-[10px] text-slate-400 mt-0.5\">{hrefTrait.description}</div>\n )}\n </div>\n )}\n\n {targetTrait && (\n <div>\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={openInNewTab}\n onChange={(e) => handleToggleNewTab(e.target.checked)}\n className=\"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-500 cursor-pointer\"\n />\n <span className=\"text-xs font-medium text-slate-600\">Open in new tab</span>\n {openInNewTab && (\n <span className=\"ml-auto text-[10px] font-mono text-slate-400\">target=\"_blank\"</span>\n )}\n </label>\n </div>\n )}\n\n {relTrait && (\n <div>\n <label className=\"flex items-center gap-1 text-xs font-medium text-slate-600 mb-1\">\n {relTrait.label}\n {openInNewTab && !rel && (\n <span className=\"ml-auto text-[10px] text-slate-400 italic\">\n auto: noopener noreferrer\n </span>\n )}\n </label>\n <TraitSelectControl\n trait={relTrait}\n value={rel}\n onCommit={(v) => onCommitTrait('rel', v)}\n />\n {relTrait.description && (\n <div className=\"text-[10px] text-slate-400 mt-0.5\">{relTrait.description}</div>\n )}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Traits tab content (STORA-211): renders the functional/HTML attribute\n * metadata declared on the selected component's definition, grouped by\n * trait group (identity, link, media, form, behavior, semantic, accessibility).\n */\nexport const TraitsPanel: React.FC<TraitsPanelProps> = ({\n registry,\n document,\n selectedNodeId,\n onCommitTrait,\n className,\n}) => {\n const node = selectedNodeId ? findNodeById(document.document, selectedNodeId) : null;\n const definition = node ? registry.get(node.type) : undefined;\n\n if (!node || !definition) {\n return (\n <div className={`p-3 text-xs text-slate-500 ${className || ''}`}>No element selected.</div>\n );\n }\n\n const traits = definition.traits ?? [];\n\n if (traits.length === 0) {\n return (\n <div className={`p-3 text-xs text-slate-500 ${className || ''}`}>\n <div className=\"mb-1 font-medium text-slate-600\">{definition.label}</div>\n This component has no configurable HTML attributes.\n </div>\n );\n }\n\n // Group traits by their declared group, preserving TRAIT_GROUP_ORDER.\n const grouped = new Map<TraitGroup | undefined, ComponentTraitDefinition[]>();\n for (const trait of traits) {\n const key = trait.group;\n const list = grouped.get(key) ?? [];\n list.push(trait);\n grouped.set(key, list);\n }\n\n const orderedGroups = [\n ...TRAIT_GROUP_ORDER.filter((g) => grouped.has(g)),\n ...(grouped.has(undefined) ? [undefined as TraitGroup | undefined] : []),\n ];\n\n return (\n <div className={`flex flex-col gap-4 ${className ?? 'p-3'} text-sm text-slate-900`}>\n {orderedGroups.map((group) => {\n const groupTraits = grouped.get(group) ?? [];\n // Composite link control (STORA-212): when the group holds href/target/rel,\n // render one unified Link card instead of three separate fields.\n const traitNames = new Set(groupTraits.map((t) => t.name));\n const isLinkGroup = group === 'link' && traitNames.has('href');\n return (\n <div key={group ?? 'ungrouped'}>\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide mb-2\">\n {group ? TRAIT_GROUP_LABELS[group] : 'Other'}\n </div>\n {isLinkGroup ? (\n <LinkTraitControl\n traits={groupTraits}\n props={node.props}\n onCommitTrait={onCommitTrait}\n />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {groupTraits.map((trait) => {\n const value = node.props?.[trait.name];\n return (\n <div key={trait.name}>\n <label className=\"flex items-center gap-1 text-xs font-medium text-slate-600 mb-1\">\n {trait.label}\n {trait.required && <span className=\"text-red-500\">*</span>}\n {trait.attribute && trait.attribute !== trait.name && (\n <span\n className=\"ml-auto text-[10px] font-mono text-slate-400\"\n title={`HTML attribute: ${trait.attribute}`}\n >\n {trait.attribute}\n </span>\n )}\n </label>\n {renderTraitControl(trait, value, (v) => onCommitTrait(trait.name, v))}\n {trait.description && (\n <div className=\"text-[10px] text-slate-400 mt-0.5\">{trait.description}</div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport { Node } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { findNodeById, findNodeLocation, isDescendantOf, getAncestorChain } from '@kubuild/core';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\nimport { ChevronDown, ChevronRight, X, GripVertical } from 'lucide-react';\n\nexport interface LayersPanelProps {\n registry: ComponentRegistry;\n className?: string;\n}\n\ninterface DropCandidate {\n parentId: string;\n index?: number;\n position: 'before' | 'after' | 'inside';\n}\n\nexport const LayersPanel: React.FC<LayersPanelProps> = ({ registry, className }) => {\n const {\n document,\n selectedNodeId,\n hoveredNodeId,\n navigatorMode,\n setNavigatorMode,\n selectNode,\n hoverNode,\n moveComponent,\n } = useEditorStore();\n\n const [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set([document.document.id]));\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropCandidate, setDropCandidate] = useState<DropCandidate | null>(null);\n\n // Floating window position state\n const [pos, setPos] = useState({ x: 280, y: 70 });\n const [isDraggingWindow, setIsDraggingWindow] = useState(false);\n const dragStartRef = useRef<{ startX: number; startY: number; posX: number; posY: number }>({\n startX: 0,\n startY: 0,\n posX: 280,\n posY: 70,\n });\n\n const handleHeaderMouseDown = (e: React.MouseEvent) => {\n if ((e.target as HTMLElement).closest('button')) return;\n setIsDraggingWindow(true);\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n posX: pos.x,\n posY: pos.y,\n };\n };\n\n useEffect(() => {\n if (!isDraggingWindow) return;\n const handleMouseMove = (e: MouseEvent) => {\n const dx = e.clientX - dragStartRef.current.startX;\n const dy = e.clientY - dragStartRef.current.startY;\n setPos({\n x: Math.max(10, Math.min(window.innerWidth - 280, dragStartRef.current.posX + dx)),\n y: Math.max(10, Math.min(window.innerHeight - 120, dragStartRef.current.posY + dy)),\n });\n };\n const handleMouseUp = () => {\n setIsDraggingWindow(false);\n };\n window.addEventListener('mousemove', handleMouseMove);\n window.addEventListener('mouseup', handleMouseUp);\n return () => {\n window.removeEventListener('mousemove', handleMouseMove);\n window.removeEventListener('mouseup', handleMouseUp);\n };\n }, [isDraggingWindow]);\n\n useEffect(() => {\n if (!selectedNodeId) return;\n const ancestors = getAncestorChain(document.document, selectedNodeId);\n if (ancestors.length === 0) return;\n setExpandedIds((prev) => {\n let changed = false;\n const next = new Set(prev);\n for (const id of ancestors) {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [selectedNodeId, document]);\n\n const toggleExpanded = (nodeId: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n return next;\n });\n };\n\n const handleRowDragStart = (e: React.DragEvent, node: Node) => {\n if (node.id === document.document.id) {\n e.preventDefault();\n return;\n }\n e.stopPropagation();\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', node.id);\n setDraggingId(node.id);\n selectNode(node.id);\n };\n\n const handleRowDragOver = (e: React.DragEvent, node: Node) => {\n if (!draggingId) return;\n e.stopPropagation();\n\n const draggedNode = findNodeById(document.document, draggingId);\n if (!draggedNode || isDescendantOf(draggedNode, node.id)) {\n setDropCandidate(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const ratio = rect.height > 0 ? (e.clientY - rect.top) / rect.height : 0.5;\n\n const targetDef = registry.get(node.type);\n const acceptsChildren = !!targetDef?.acceptsChildren;\n\n let candidate: DropCandidate | null = null;\n\n if (acceptsChildren && ratio > 0.25 && ratio < 0.75) {\n const policy = registry.canInsertChild(node.type, draggedNode.type);\n if (policy.valid) {\n candidate = { parentId: node.id, position: 'inside' };\n }\n }\n\n if (!candidate) {\n const loc = findNodeLocation(document.document, node.id);\n if (loc && loc.parent) {\n const policy = registry.canInsertChild(loc.parent.type, draggedNode.type);\n if (policy.valid) {\n if (ratio <= 0.5) {\n candidate = { parentId: loc.parent.id, index: loc.index, position: 'before' };\n } else {\n candidate = { parentId: loc.parent.id, index: loc.index + 1, position: 'after' };\n }\n }\n }\n }\n\n if (candidate) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setDropCandidate(candidate);\n } else {\n setDropCandidate(null);\n e.dataTransfer.dropEffect = 'none';\n }\n };\n\n const handleRowDrop = (e: React.DragEvent) => {\n if (!draggingId || !dropCandidate) return;\n e.preventDefault();\n e.stopPropagation();\n\n moveComponent(draggingId, dropCandidate.parentId, registry, dropCandidate.index);\n setDraggingId(null);\n setDropCandidate(null);\n };\n\n const handleRowDragEnd = () => {\n setDraggingId(null);\n setDropCandidate(null);\n };\n\n const renderRow = (node: Node, depth: number): React.ReactNode => {\n const hasChildren = !!node.children?.length;\n const isExpanded = expandedIds.has(node.id);\n const isSelected = node.id === selectedNodeId;\n const isHovered = node.id === hoveredNodeId;\n const isRoot = node.id === document.document.id;\n const isDropTarget = dropCandidate?.position === 'inside' && dropCandidate.parentId === node.id;\n\n return (\n <div key={node.id}>\n <div\n data-kubuild-layer={node.id}\n draggable={!isRoot}\n style={{ paddingLeft: depth * 14 + 6 }}\n onClick={(e) => {\n e.stopPropagation();\n selectNode(node.id);\n }}\n onMouseEnter={() => hoverNode(node.id)}\n onMouseLeave={() => hoverNode(null)}\n onDragStart={(e) => handleRowDragStart(e, node)}\n onDragOver={(e) => handleRowDragOver(e, node)}\n onDrop={handleRowDrop}\n onDragEnd={handleRowDragEnd}\n className={`flex items-center gap-1 py-1 pr-2 text-xs cursor-pointer rounded-sm border-l-2 ${\n isSelected\n ? 'bg-blue-50 border-blue-500 text-blue-700 font-medium'\n : isHovered\n ? 'bg-slate-50 border-slate-300'\n : 'border-transparent text-slate-700'\n } ${isDropTarget ? 'ring-1 ring-inset ring-green-500' : ''}`}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded(node.id);\n }}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n className=\"w-4 shrink-0 text-slate-400 hover:text-slate-700 flex items-center justify-center\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" aria-hidden=\"true\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" aria-hidden=\"true\" />\n )}\n </button>\n ) : (\n <span className=\"w-4 shrink-0\" />\n )}\n <span className=\"shrink-0 text-slate-400\">\n <ComponentIcon iconOrType={registry.get(node.type)?.icon ?? node.type} size={13} />\n </span>\n <span className=\"truncate\">{registry.get(node.type)?.label ?? node.type}</span>\n <span className=\"text-slate-400 truncate text-[10px]\">#{node.id}</span>\n </div>\n {hasChildren && isExpanded && node.children!.map((child) => renderRow(child, depth + 1))}\n </div>\n );\n };\n\n if (navigatorMode === 'hidden') {\n return null;\n }\n\n const isFloating = navigatorMode === 'floating';\n\n const panelContent = (\n <div className=\"flex-1 overflow-y-auto p-1.5 text-xs\">\n {renderRow(document.document, 0)}\n </div>\n );\n\n const header = (\n <div\n onMouseDown={isFloating ? handleHeaderMouseDown : undefined}\n className={`flex items-center justify-between px-3 py-2 border-b border-slate-200/90 select-none ${\n isFloating ? 'cursor-grab active:cursor-grabbing bg-slate-50/90 rounded-t-xl' : 'bg-slate-50'\n }`}\n >\n <div className=\"flex items-center gap-1.5 font-semibold text-xs text-slate-700\">\n {isFloating && <GripVertical className=\"w-3 h-3 text-slate-400 mr-0.5\" aria-hidden=\"true\" />}\n <ComponentIcon iconOrType=\"layout\" size={13} />\n <span>Navigator</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setNavigatorMode(isFloating ? 'docked' : 'floating')}\n title={isFloating ? 'Dock to sidebar' : 'Make floating'}\n className=\"p-1 text-slate-400 hover:text-blue-600 rounded hover:bg-slate-200/50 transition\"\n >\n {isFloating ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n ) : (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"14\" height=\"14\" x=\"7\" y=\"7\" rx=\"2\" />\n <path d=\"M17 3H5a2 2 0 0 0-2 2v12\" />\n </svg>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setNavigatorMode('hidden')}\n title=\"Hide Navigator\"\n className=\"p-1 text-slate-400 hover:text-red-600 rounded hover:bg-red-50 transition\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n );\n\n if (isFloating) {\n return (\n <div\n style={{ left: `${pos.x}px`, top: `${pos.y}px` }}\n className={`fixed z-50 w-72 bg-white/95 backdrop-blur-md rounded-xl shadow-2xl border border-slate-200/90 flex flex-col max-h-[460px] overflow-hidden ${\n className || ''\n }`}\n >\n {header}\n {panelContent}\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col h-full overflow-hidden bg-white ${className || ''}`}>\n {header}\n {panelContent}\n </div>\n );\n};\n","import React from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry, createDefaultComponentRegistry } from '@kubuild/components';\nimport { getNodeAncestors } from '@kubuild/core';\nimport { useEditorStore } from './store';\n\nexport interface HierarchyBreadcrumbsProps {\n registry?: ComponentRegistry;\n document?: PageDocument;\n selectedNodeId?: string | null;\n className?: string;\n}\n\n/**\n * Bottom Hierarchy Breadcrumbs Bar — STORA-231.\n * Displays the ancestor hierarchy path: Page > Section > Container > ... > SelectedElement.\n * Clicking any breadcrumb item selects that element across canvas and inspector.\n */\nexport const HierarchyBreadcrumbs: React.FC<HierarchyBreadcrumbsProps> = ({\n registry = createDefaultComponentRegistry(),\n document: propDoc,\n selectedNodeId: propSelectedNodeId,\n className,\n}) => {\n const storeState = useEditorStore();\n const document = propDoc ?? storeState.document;\n const selectedNodeId =\n propSelectedNodeId !== undefined ? propSelectedNodeId : storeState.selectedNodeId;\n const selectNode = storeState.selectNode;\n\n if (!document?.document) return null;\n\n // Retrieve the full ancestor path from root down to the selected node in O(N)\n const ancestors = selectedNodeId\n ? getNodeAncestors(document.document, selectedNodeId)\n : [document.document];\n\n // If node is not found in the tree, fallback to root\n const path = ancestors.length > 0 ? ancestors : [document.document];\n\n return (\n <nav\n aria-label=\"Hierarchy Breadcrumbs\"\n data-testid=\"hierarchy-breadcrumbs\"\n className={`flex items-center gap-1 px-4 py-2 bg-white border-t border-slate-200 text-xs text-slate-600 select-none overflow-x-auto min-h-[36px] w-full shrink-0 shadow-sm ${\n className || ''\n }`}\n >\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-slate-400 mr-1 shrink-0\">\n Path:\n </span>\n {path.map((node, index) => {\n const isLast = index === path.length - 1;\n const isSelected = node.id === selectedNodeId;\n const def = registry.get(node.type);\n const label =\n node.type === 'page'\n ? document.metadata?.title || 'Page'\n : def?.label || node.type;\n\n return (\n <React.Fragment key={node.id}>\n {index > 0 && (\n <span\n aria-hidden=\"true\"\n className=\"text-slate-300 font-semibold mx-0.5 select-none shrink-0\"\n >\n >\n </span>\n )}\n <button\n type=\"button\"\n data-testid={`breadcrumb-${node.id}`}\n onClick={() => selectNode(node.id)}\n className={`px-1.5 py-0.5 rounded transition shrink-0 flex items-center gap-1 ${\n isSelected || isLast\n ? 'bg-blue-50 text-blue-700 font-semibold border border-blue-200 shadow-xs'\n : 'text-slate-600 hover:text-slate-900 hover:bg-slate-100 font-medium'\n }`}\n title={`Select ${label} (${node.id})`}\n >\n <span>{label}</span>\n {node.props && typeof node.props === 'object' && 'tag' in node.props && (\n <span className=\"text-[10px] text-slate-400 font-mono\">\n <{String(node.props.tag)}>\n </span>\n )}\n </button>\n </React.Fragment>\n );\n })}\n </nav>\n );\n};\n","import React, { useState } from 'react';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { Boxes, Blocks, Layers } from 'lucide-react';\nimport { ComponentPanel } from './component-panel';\nimport { BlocksPanel } from './blocks-panel';\nimport { LayersPanel } from './layers-panel';\nimport { EditorSidebarConfig, LeftSidebarTab } from './config';\n\nexport type { LeftSidebarTab };\n\nexport interface LeftSidebarProps {\n registry: ComponentRegistry;\n defaultTab?: LeftSidebarTab;\n availableTabs?: LeftSidebarTab[];\n config?: EditorSidebarConfig;\n className?: string;\n}\n\n/**\n * Left Sidebar with tabs: Components, Blocks, and Layers — STORA-240.\n */\nexport const LeftSidebar: React.FC<LeftSidebarProps> = ({\n registry,\n defaultTab: propDefaultTab,\n availableTabs: propAvailableTabs,\n config,\n className,\n}) => {\n const tabsList = config?.availableTabs ?? propAvailableTabs ?? ['components', 'blocks', 'layers'];\n const initialTabCandidate = config?.defaultTab ?? propDefaultTab ?? 'components';\n const initialTab = tabsList.includes(initialTabCandidate)\n ? initialTabCandidate\n : tabsList[0] ?? 'components';\n\n const [activeTab, setActiveTab] = useState<LeftSidebarTab>(initialTab);\n\n React.useEffect(() => {\n if (!tabsList.includes(activeTab) && tabsList.length > 0) {\n setActiveTab(tabsList[0]);\n }\n }, [tabsList, activeTab]);\n\n const showTabBar = tabsList.length > 1;\n\n return (\n <div className={`flex flex-col h-full min-h-0 bg-white border-r border-slate-200 ${className || ''}`}>\n {/* Sidebar Top Tab Switcher */}\n {showTabBar && (\n <div\n role=\"tablist\"\n aria-label=\"Sidebar Navigation\"\n className=\"flex items-center border-b border-slate-200 bg-slate-50/80 px-2 pt-2 gap-1 shrink-0 select-none\"\n >\n {tabsList.includes('components') && (\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-components\"\n aria-selected={activeTab === 'components'}\n aria-controls=\"tabpanel-components\"\n data-testid=\"tab-components\"\n onClick={() => setActiveTab('components')}\n className={`flex-1 py-2 px-2 text-xs font-semibold rounded-t-md transition-all flex items-center justify-center gap-1.5 border-t border-x ${\n activeTab === 'components'\n ? 'bg-white text-blue-600 border-slate-200 border-b-white -mb-px shadow-xs'\n : 'border-transparent text-slate-500 hover:text-slate-800 hover:bg-slate-100'\n }`}\n >\n <Boxes className=\"w-3.5 h-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>Components</span>\n </button>\n )}\n\n {tabsList.includes('blocks') && (\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-blocks\"\n aria-selected={activeTab === 'blocks'}\n aria-controls=\"tabpanel-blocks\"\n data-testid=\"tab-blocks\"\n onClick={() => setActiveTab('blocks')}\n className={`flex-1 py-2 px-2 text-xs font-semibold rounded-t-md transition-all flex items-center justify-center gap-1.5 border-t border-x ${\n activeTab === 'blocks'\n ? 'bg-white text-blue-600 border-slate-200 border-b-white -mb-px shadow-xs'\n : 'border-transparent text-slate-500 hover:text-slate-800 hover:bg-slate-100'\n }`}\n >\n <Blocks className=\"w-3.5 h-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>Blocks</span>\n </button>\n )}\n\n {tabsList.includes('layers') && (\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-layers\"\n aria-selected={activeTab === 'layers'}\n aria-controls=\"tabpanel-layers\"\n data-testid=\"tab-layers\"\n onClick={() => setActiveTab('layers')}\n className={`flex-1 py-2 px-2 text-xs font-semibold rounded-t-md transition-all flex items-center justify-center gap-1.5 border-t border-x ${\n activeTab === 'layers'\n ? 'bg-white text-blue-600 border-slate-200 border-b-white -mb-px shadow-xs'\n : 'border-transparent text-slate-500 hover:text-slate-800 hover:bg-slate-100'\n }`}\n >\n <Layers className=\"w-3.5 h-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>Layers</span>\n </button>\n )}\n </div>\n )}\n\n {/* Tab Panels */}\n <div className=\"flex-1 overflow-hidden min-h-0\">\n {activeTab === 'components' && tabsList.includes('components') && (\n <div role=\"tabpanel\" id=\"tabpanel-components\" aria-labelledby=\"tab-components\" className=\"h-full\">\n <ComponentPanel registry={registry} />\n </div>\n )}\n {activeTab === 'blocks' && tabsList.includes('blocks') && (\n <div role=\"tabpanel\" id=\"tabpanel-blocks\" aria-labelledby=\"tab-blocks\" className=\"h-full\">\n <BlocksPanel registry={registry} />\n </div>\n )}\n {activeTab === 'layers' && tabsList.includes('layers') && (\n <div role=\"tabpanel\" id=\"tabpanel-layers\" aria-labelledby=\"tab-layers\" className=\"h-full\">\n <LayersPanel registry={registry} />\n </div>\n )}\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { ComponentRegistry, ComponentCategory, ComponentDefinition } from '@kubuild/components';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\n\nexport interface ComponentPanelProps {\n registry: ComponentRegistry;\n className?: string;\n}\n\nconst CATEGORY_ORDER: ComponentCategory[] = [\n 'layout',\n 'typography',\n 'media',\n 'form',\n 'interactive',\n 'data',\n 'custom',\n];\n\nconst CATEGORY_LABELS: Record<ComponentCategory, string> = {\n layout: 'Layout',\n typography: 'Typography',\n media: 'Media',\n form: 'Forms',\n interactive: 'Interactive',\n data: 'Data',\n custom: 'Custom',\n};\n\nexport const ComponentPanel: React.FC<ComponentPanelProps> = ({ registry, className }) => {\n const insertComponent = useEditorStore((s) => s.insertComponent);\n const setDragPayload = useEditorStore((s) => s.setDragPayload);\n const [error, setError] = useState<string | null>(null);\n\n const groups = CATEGORY_ORDER.map((category) => ({\n category,\n items: registry.listByCategory(category),\n })).filter((group) => group.items.length > 0);\n\n const handleInsert = (definition: ComponentDefinition) => {\n const result = insertComponent(definition.type, registry);\n setError(result.success ? null : (result.error ?? `Could not insert \"${definition.label}\".`));\n };\n\n const handleDragStart = (e: React.DragEvent, definition: ComponentDefinition) => {\n e.dataTransfer.effectAllowed = 'copy';\n e.dataTransfer.setData('text/plain', `component:${definition.type}`);\n e.dataTransfer.setData('application/kubuild-drag-type', 'component');\n e.dataTransfer.setData('application/kubuild-component-type', definition.type);\n setDragPayload({ type: 'component', componentType: definition.type });\n };\n\n const handleDragEnd = () => {\n setDragPayload(null);\n };\n\n return (\n <div className={`flex flex-col gap-4 p-3 overflow-y-auto h-full min-h-0 ${className || ''}`}>\n {error && (\n <div\n role=\"alert\"\n className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1\"\n >\n {error}\n </div>\n )}\n {groups.map(({ category, items }) => (\n <div key={category}>\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide mb-2\">\n {CATEGORY_LABELS[category]}\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {items.map((definition) => (\n <button\n key={definition.type}\n type=\"button\"\n draggable={true}\n onDragStart={(e) => handleDragStart(e, definition)}\n onDragEnd={handleDragEnd}\n onClick={() => handleInsert(definition)}\n data-testid={`component-item-${definition.type}`}\n title={\n definition.description || `Click to insert or drag to canvas: ${definition.label}`\n }\n className=\"flex flex-col items-center justify-center p-2.5 min-h-[74px] rounded-lg border border-slate-200 bg-white hover:border-blue-400 hover:bg-blue-50/50 hover:shadow text-slate-700 transition group cursor-grab active:cursor-grabbing text-center select-none\"\n >\n <span className=\"mb-1.5 text-slate-500 group-hover:text-blue-600 transition-colors pointer-events-none\">\n <ComponentIcon iconOrType={definition.icon ?? definition.type} size={22} />\n </span>\n <span className=\"text-[11px] font-medium text-slate-700 group-hover:text-blue-600 text-center leading-tight break-words w-full pointer-events-none\">\n {definition.label}\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n};\n","import React, { useState, useMemo } from 'react';\nimport { STARTER_BLOCKS, BlockDefinition, ComponentRegistry } from '@kubuild/components';\nimport { insertNode, collectNodeIdSet } from '@kubuild/core';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\nimport { Image as ImageIcon } from 'lucide-react';\n\nexport interface BlocksPanelProps {\n registry?: ComponentRegistry;\n blocks?: BlockDefinition[];\n className?: string;\n onInsertBlock?: (block: BlockDefinition) => void;\n}\n\n/**\n * Thumbnail schematic preview component for blocks\n */\nexport const BlockThumbnail: React.FC<{ block: BlockDefinition }> = ({ block }) => {\n switch (block.id) {\n case 'layout-1-col':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center p-1\">\n <div className=\"w-full h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[9px] text-blue-700 font-medium\">\n 100%\n </div>\n </div>\n );\n case 'layout-2-col-50-50':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[9px] text-blue-700 font-medium\">\n 50%\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[9px] text-blue-700 font-medium\">\n 50%\n </div>\n </div>\n );\n case 'layout-2-col-30-70':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"w-[30%] h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 30%\n </div>\n <div className=\"w-[70%] h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 70%\n </div>\n </div>\n );\n case 'layout-3-col':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 1/3\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 1/3\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 1/3\n </div>\n </div>\n );\n case 'layout-4-col':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n </div>\n );\n case 'hero-section':\n return (\n <div className=\"w-full h-12 bg-slate-100 border border-slate-200 rounded flex flex-col items-center justify-center p-1.5 gap-1\">\n <div className=\"w-2/3 h-1.5 bg-slate-800 rounded-full\" />\n <div className=\"w-1/2 h-1 bg-slate-400 rounded-full\" />\n <div className=\"w-1/3 h-2 bg-blue-600 rounded mt-0.5\" />\n </div>\n );\n case 'feature-card':\n return (\n <div className=\"w-full h-12 bg-white border border-slate-200 rounded flex flex-col p-1.5 justify-between shadow-xs\">\n <div className=\"w-6 h-1.5 bg-blue-500 rounded-full\" />\n <div className=\"w-3/4 h-1.5 bg-slate-700 rounded\" />\n <div className=\"w-full h-1 bg-slate-300 rounded\" />\n </div>\n );\n case 'media-object':\n return (\n <div className=\"w-full h-12 bg-white border border-slate-200 rounded flex items-center gap-1.5 p-1.5\">\n <div className=\"w-7 h-7 bg-indigo-50 border border-indigo-200 rounded shrink-0 flex items-center justify-center\">\n <ImageIcon className=\"w-4 h-4 text-indigo-600\" />\n </div>\n <div className=\"flex-1 flex flex-col gap-1\">\n <div className=\"w-3/4 h-1.5 bg-slate-700 rounded\" />\n <div className=\"w-full h-1 bg-slate-300 rounded\" />\n </div>\n </div>\n );\n case 'pricing-table':\n return (\n <div className=\"w-full h-12 bg-white border-2 border-blue-400 rounded flex flex-col items-center justify-center p-1 gap-1\">\n <div className=\"w-10 h-1.5 bg-slate-700 rounded\" />\n <div className=\"w-8 h-2 bg-blue-600 rounded font-bold text-[8px] text-white flex items-center justify-center\">\n $$$\n </div>\n </div>\n );\n case 'cta-banner':\n return (\n <div className=\"w-full h-12 bg-slate-900 border border-slate-800 rounded flex flex-col items-center justify-center p-1.5 gap-1 text-white\">\n <div className=\"w-3/4 h-1.5 bg-white rounded\" />\n <div className=\"w-1/3 h-2 bg-blue-500 rounded text-[8px] flex items-center justify-center font-bold\">\n CTA\n </div>\n </div>\n );\n default:\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center text-slate-400\">\n <ComponentIcon iconOrType={block.icon ?? 'layout'} size={20} />\n </div>\n );\n }\n};\n\n/**\n * Tab \"Blocks\" di Sidebar Kiri Editor — STORA-240.\n * Displays grid of ready-to-use layout & pre-composed template block cards per category.\n */\nexport const BlocksPanel: React.FC<BlocksPanelProps> = ({\n blocks = STARTER_BLOCKS,\n className,\n onInsertBlock,\n}) => {\n const { document, selectedNodeId, dispatch, selectNode } = useEditorStore();\n const [selectedCategory, setSelectedCategory] = useState<string>('all');\n const [searchQuery, setSearchQuery] = useState<string>('');\n\n const categories = useMemo(() => {\n const set = new Set<string>();\n blocks.forEach((b) => set.add(b.category));\n return ['all', ...Array.from(set)];\n }, [blocks]);\n\n const filteredBlocks = useMemo(() => {\n return blocks.filter((b) => {\n const matchCat = selectedCategory === 'all' || b.category === selectedCategory;\n const matchQuery =\n !searchQuery ||\n b.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n (b.description && b.description.toLowerCase().includes(searchQuery.toLowerCase()));\n return matchCat && matchQuery;\n });\n }, [blocks, selectedCategory, searchQuery]);\n\n const handleInsert = (block: BlockDefinition) => {\n if (onInsertBlock) {\n onInsertBlock(block);\n return;\n }\n\n const existingIds = collectNodeIdSet(document.document);\n let counter = 1;\n const generateId = (prefix = 'block') => {\n let id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n while (existingIds.has(id)) {\n id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n }\n existingIds.add(id);\n return id;\n };\n\n const nodeTree = block.createNodeTree(generateId);\n const targetParentId = selectedNodeId ?? document.document.id;\n\n try {\n dispatch((doc) => insertNode(doc, { parentId: targetParentId, node: nodeTree }));\n selectNode(nodeTree.id);\n } catch {\n // Fallback: insert at page root\n dispatch((doc) => insertNode(doc, { parentId: document.document.id, node: nodeTree }));\n selectNode(nodeTree.id);\n }\n };\n\n const setDragPayload = useEditorStore((s) => s.setDragPayload);\n\n const handleDragStart = (e: React.DragEvent, block: BlockDefinition) => {\n e.dataTransfer.effectAllowed = 'copy';\n e.dataTransfer.setData('text/plain', `block:${block.id}`);\n e.dataTransfer.setData('application/kubuild-drag-type', 'block');\n e.dataTransfer.setData('application/kubuild-block-id', block.id);\n setDragPayload({ type: 'block', blockId: block.id });\n };\n\n const handleDragEnd = () => {\n setDragPayload(null);\n };\n\n return (\n <div\n data-testid=\"blocks-panel\"\n className={`flex flex-col h-full min-h-0 bg-white text-slate-800 ${className || ''}`}\n >\n {/* Search Input */}\n <div className=\"p-3 pb-2 border-b border-slate-100\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search blocks...\"\n className=\"w-full text-xs px-2.5 py-1.5 rounded border border-slate-300 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 bg-slate-50 placeholder-slate-400\"\n />\n </div>\n\n {/* Category Pills */}\n <div className=\"flex items-center gap-1 px-3 py-2 overflow-x-auto border-b border-slate-100 no-scrollbar\">\n {categories.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setSelectedCategory(cat)}\n className={`px-2 py-1 rounded-full text-[11px] font-medium capitalize shrink-0 transition ${\n selectedCategory === cat\n ? 'bg-blue-600 text-white shadow-xs'\n : 'bg-slate-100 text-slate-600 hover:bg-slate-200'\n }`}\n >\n {cat === 'all' ? 'All Blocks' : cat}\n </button>\n ))}\n </div>\n\n {/* Blocks Grid */}\n <div className=\"flex-1 overflow-y-auto p-3 min-h-0\">\n {filteredBlocks.length === 0 ? (\n <div className=\"text-center py-8 text-xs text-slate-400\">No blocks found.</div>\n ) : (\n <div className=\"grid grid-cols-2 gap-2.5\">\n {filteredBlocks.map((block) => (\n <button\n key={block.id}\n type=\"button\"\n draggable={true}\n onDragStart={(e) => handleDragStart(e, block)}\n onDragEnd={handleDragEnd}\n data-testid=\"block-card\"\n data-block-id={block.id}\n onClick={() => handleInsert(block)}\n title={block.description || `Click to insert or drag to canvas: ${block.name}`}\n className=\"flex flex-col justify-between p-2 rounded-lg border border-slate-200 bg-white hover:border-blue-400 hover:shadow-md hover:bg-blue-50/20 transition-all text-left group cursor-grab active:cursor-grabbing select-none\"\n >\n {/* Thumbnail Illustration */}\n <div className=\"mb-2 w-full pointer-events-none\">\n <BlockThumbnail block={block} />\n </div>\n\n {/* Card Title & Info */}\n <div className=\"w-full pointer-events-none\">\n <div className=\"flex items-center justify-between gap-1 mb-0.5\">\n <span className=\"text-[11px] font-semibold text-slate-800 group-hover:text-blue-600 truncate\">\n {block.name}\n </span>\n </div>\n <span className=\"inline-block text-[9px] uppercase tracking-wider font-semibold text-slate-400 bg-slate-100 px-1 py-0.2 rounded\">\n {block.category}\n </span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { StyleSectorId } from './style-manager-accordion';\n\nexport type LeftSidebarTab = 'components' | 'blocks' | 'layers';\n\nexport interface EditorToolbarConfig {\n /** Display page title & status badge in toolbar. Default: true */\n showTitle?: boolean;\n /** Display Navigator (element tree) toggle button. Default: true */\n showNavigatorToggle?: boolean;\n /** Display Undo and Redo buttons. Default: true */\n showHistory?: boolean;\n /** Display Copy, Paste, Duplicate, and Delete buttons. Default: true */\n showClipboard?: boolean;\n /** Display \"View Code\" (< >) modal button. Default: true */\n showCodeViewer?: boolean;\n /** Display Import and Export (.stora / JSON) buttons. Default: true */\n showExportImport?: boolean;\n /** Display Viewport breakpoint switcher (desktop/tablet/mobile). Default: true */\n showViewportSwitcher?: boolean;\n /** Display selected element ID badge on right side. Default: true */\n showSelectionStatus?: boolean;\n /** Custom extra actions or buttons rendered in the toolbar */\n customActions?: React.ReactNode;\n}\n\nexport interface EditorSidebarConfig {\n /** Whether the left sidebar is enabled and visible. Default: true */\n enabled?: boolean;\n /** Default active tab ('components' | 'blocks' | 'layers'). Default: 'components' */\n defaultTab?: LeftSidebarTab;\n /** List of tabs available for user navigation. Default: ['components', 'blocks', 'layers'] */\n availableTabs?: LeftSidebarTab[];\n}\n\nexport interface EditorCanvasConfig {\n /** Display hierarchy breadcrumbs bar below the canvas. Default: true */\n showBreadcrumbs?: boolean;\n /** Display floating action badges on selected node. Default: true */\n showFloatingBadges?: boolean;\n}\n\nexport interface EditorInspectorConfig {\n /** Whether the right inspector panel is enabled and visible. Default: true */\n enabled?: boolean;\n /** Display Props tab/controls. Default: true */\n showProps?: boolean;\n /** Display Traits tab/controls. Default: true */\n showTraits?: boolean;\n /** Display Style Manager section. Default: true */\n showStyles?: boolean;\n /** Display pseudo-state selector (:hover, :active, :focus). Default: true */\n showStateSelector?: boolean;\n /**\n * Filter allowed style sectors ('dimension' | 'spacing' | 'typography' | 'decorations' | 'flex' | 'motion').\n * If omitted, all style sectors are visible.\n */\n allowedStyleSectors?: StyleSectorId[];\n}\n\nexport interface EditorConfig {\n /** Configure or toggle Top Toolbar. If false, toolbar is completely hidden. Default: true */\n toolbar?: boolean | EditorToolbarConfig;\n /** Configure or toggle Left Sidebar. If false, sidebar is completely hidden. Default: true */\n sidebar?: boolean | EditorSidebarConfig;\n /** Configure Canvas UI elements (breadcrumbs, floating badges). */\n canvas?: EditorCanvasConfig;\n /** Configure or toggle Right Inspector. If false, inspector is completely hidden. Default: true */\n inspector?: boolean | EditorInspectorConfig;\n}\n\nexport interface ResolvedEditorConfig {\n toolbar: {\n enabled: boolean;\n showTitle: boolean;\n showNavigatorToggle: boolean;\n showHistory: boolean;\n showClipboard: boolean;\n showCodeViewer: boolean;\n showExportImport: boolean;\n showViewportSwitcher: boolean;\n showSelectionStatus: boolean;\n customActions?: React.ReactNode;\n };\n sidebar: {\n enabled: boolean;\n defaultTab: LeftSidebarTab;\n availableTabs: LeftSidebarTab[];\n };\n canvas: {\n showBreadcrumbs: boolean;\n showFloatingBadges: boolean;\n };\n inspector: {\n enabled: boolean;\n showProps: boolean;\n showTraits: boolean;\n showStyles: boolean;\n showStateSelector: boolean;\n allowedStyleSectors?: StyleSectorId[];\n };\n}\n\nexport function resolveEditorConfig(config?: EditorConfig): ResolvedEditorConfig {\n const toolbarOpt = config?.toolbar;\n const toolbarEnabled = toolbarOpt !== false;\n const toolbarCfg = typeof toolbarOpt === 'object' ? toolbarOpt : {};\n\n const sidebarOpt = config?.sidebar;\n const sidebarEnabled = sidebarOpt !== false && (typeof sidebarOpt !== 'object' || sidebarOpt.enabled !== false);\n const sidebarCfg = typeof sidebarOpt === 'object' ? sidebarOpt : {};\n\n const canvasCfg = config?.canvas ?? {};\n\n const inspectorOpt = config?.inspector;\n const inspectorEnabled = inspectorOpt !== false && (typeof inspectorOpt !== 'object' || inspectorOpt.enabled !== false);\n const inspectorCfg = typeof inspectorOpt === 'object' ? inspectorOpt : {};\n\n const availableTabs: LeftSidebarTab[] = sidebarCfg.availableTabs && sidebarCfg.availableTabs.length > 0\n ? sidebarCfg.availableTabs\n : ['components', 'blocks', 'layers'];\n\n const defaultTab: LeftSidebarTab = sidebarCfg.defaultTab && availableTabs.includes(sidebarCfg.defaultTab)\n ? sidebarCfg.defaultTab\n : availableTabs[0] ?? 'components';\n\n return {\n toolbar: {\n enabled: toolbarEnabled,\n showTitle: toolbarCfg.showTitle ?? true,\n showNavigatorToggle: toolbarCfg.showNavigatorToggle ?? true,\n showHistory: toolbarCfg.showHistory ?? true,\n showClipboard: toolbarCfg.showClipboard ?? true,\n showCodeViewer: toolbarCfg.showCodeViewer ?? true,\n showExportImport: toolbarCfg.showExportImport ?? true,\n showViewportSwitcher: toolbarCfg.showViewportSwitcher ?? true,\n showSelectionStatus: toolbarCfg.showSelectionStatus ?? true,\n customActions: toolbarCfg.customActions,\n },\n sidebar: {\n enabled: sidebarEnabled,\n defaultTab,\n availableTabs,\n },\n canvas: {\n showBreadcrumbs: canvasCfg.showBreadcrumbs ?? true,\n showFloatingBadges: canvasCfg.showFloatingBadges ?? true,\n },\n inspector: {\n enabled: inspectorEnabled,\n showProps: inspectorCfg.showProps ?? true,\n showTraits: inspectorCfg.showTraits ?? true,\n showStyles: inspectorCfg.showStyles ?? true,\n showStateSelector: inspectorCfg.showStateSelector ?? true,\n allowedStyleSectors: inspectorCfg.allowedStyleSectors,\n },\n };\n}\n"],"mappings":"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","names":["import_react","import_components","import_core","document","import_core","import_core","document","import_jsx_runtime","document","container","policy","import_react","import_react","import_core","import_jsx_runtime","import_react","import_renderer","import_core","import_react","import_jsx_runtime","tokens","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","document","import_react","import_components","import_core","import_schema","import_schema","import_components","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_core","import_jsx_runtime","import_lucide_react","import_jsx_runtime","content","import_react","import_schema","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_schema","import_jsx_runtime","import_jsx_runtime","React","import_react","import_components","import_core","import_lucide_react","import_jsx_runtime","document","import_renderer","import_lucide_react","import_jsx_runtime","document","result","import_react","import_core","import_lucide_react","import_jsx_runtime","document","import_react","import_components","import_core","import_jsx_runtime","document","React","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_components","import_core","import_lucide_react","import_jsx_runtime","ImageIcon","document","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","document","React"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/editor.tsx","../src/store.ts","../src/canvas.tsx","../src/floating-badges.tsx","../src/toolbar.tsx","../src/import-modal.tsx","../src/code-viewer-modal.tsx","../src/export-utils.ts","../src/code-highlighter.tsx","../src/inspector-panel.tsx","../src/variable-picker.tsx","../src/asset-manager-modal.tsx","../src/table-spreadsheet-editor.tsx","../src/icons.tsx","../src/style-manager-accordion.tsx","../src/box-model-editor.tsx","../src/dimension-sector-controls.tsx","../src/typography-sector-controls.tsx","../src/motion-sector-controls.tsx","../src/traits-panel.tsx","../src/layers-panel.tsx","../src/breadcrumbs.tsx","../src/left-sidebar.tsx","../src/component-panel.tsx","../src/blocks-panel.tsx","../src/config.ts"],"sourcesContent":["export * from './editor';\nexport * from './store';\nexport * from './canvas';\nexport * from './component-panel';\nexport * from './toolbar';\nexport * from './inspector-panel';\nexport * from './layers-panel';\nexport * from './variable-picker';\nexport * from './import-modal';\nexport * from './asset-manager-modal';\nexport * from './export-utils';\nexport * from './icons';\nexport * from './table-spreadsheet-editor';\nexport * from './box-model-editor';\nexport * from './style-manager-accordion';\nexport * from './dimension-sector-controls';\nexport * from './typography-sector-controls';\nexport * from './floating-badges';\nexport * from './breadcrumbs';\nexport * from './blocks-panel';\nexport * from './left-sidebar';\nexport * from './code-viewer-modal';\nexport * from './code-highlighter';\nexport * from './motion-sector-controls';\nexport * from './config';\n","import React, { useEffect, useMemo, useState } from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry, createDefaultComponentRegistry } from '@kubuild/components';\nimport {\n RuntimeContext,\n VariableCatalog,\n Diagnostic,\n buildSampleVariablesFromCatalog,\n} from '@kubuild/core';\nimport { useEditorStore, Viewport } from './store';\nimport { EditorCanvas } from './canvas';\nimport { EditorToolbar } from './toolbar';\nimport { InspectorPanel } from './inspector-panel';\nimport { LayersPanel } from './layers-panel';\nimport { TableSpreadsheetEditor, findActiveTableNode } from './table-spreadsheet-editor';\nimport { HierarchyBreadcrumbs } from './breadcrumbs';\nimport { LeftSidebar } from './left-sidebar';\nimport { EditorConfig, resolveEditorConfig } from './config';\nimport {\n Monitor,\n Tablet,\n Smartphone,\n Plus,\n Layers,\n Sliders,\n Undo2,\n Redo2,\n X,\n Boxes,\n} from 'lucide-react';\n\nexport interface KubuildEditorProps {\n initialDocument?: PageDocument;\n registry?: ComponentRegistry;\n context?: RuntimeContext;\n /** Host-declared bindable variables + preview-only sample values (STORA-053). Never written to the document. */\n variableCatalog?: VariableCatalog;\n onChange?: (doc: PageDocument) => void;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n config?: EditorConfig;\n className?: string;\n}\n\nexport const KubuildEditor: React.FC<KubuildEditorProps> = ({\n initialDocument,\n registry = createDefaultComponentRegistry(),\n context,\n variableCatalog,\n onChange,\n onDiagnostic,\n config,\n className,\n}) => {\n const {\n document,\n setDocument,\n setOnChangeHandler,\n setVariableCatalog,\n viewport,\n setViewport,\n selectedNodeId,\n navigatorMode,\n tableSpreadsheetMode,\n setTableSpreadsheetMode,\n undo,\n redo,\n canUndo,\n canRedo,\n } = useEditorStore();\n const lastLoadedDocRef = React.useRef<PageDocument | undefined>(undefined);\n\n // Mobile drawer states\n const [isMobileSidebarOpen, setIsMobileSidebarOpen] = useState<boolean>(false);\n const [isMobileInspectorOpen, setIsMobileInspectorOpen] = useState<boolean>(false);\n const [isMobileLayersOpen, setIsMobileLayersOpen] = useState<boolean>(false);\n\n const activeTable = useMemo(\n () => findActiveTableNode(document.document, selectedNodeId),\n [document.document, selectedNodeId],\n );\n\n useEffect(() => {\n if (\n initialDocument &&\n initialDocument !== lastLoadedDocRef.current &&\n initialDocument !== useEditorStore.getState().document\n ) {\n lastLoadedDocRef.current = initialDocument;\n setDocument(initialDocument);\n }\n }, [initialDocument, setDocument]);\n\n useEffect(() => {\n setOnChangeHandler(onChange ?? null);\n }, [onChange, setOnChangeHandler]);\n\n useEffect(() => {\n setVariableCatalog(variableCatalog ?? []);\n }, [variableCatalog, setVariableCatalog]);\n\n const sampleVariables = useMemo(\n () => buildSampleVariablesFromCatalog(variableCatalog),\n [variableCatalog],\n );\n\n // Host-supplied context.variables wins on key conflicts — the catalog only fills gaps\n // so the canvas can preview bindings without the host needing to wire live data itself.\n const previewContext = useMemo<RuntimeContext | undefined>(() => {\n if (Object.keys(sampleVariables).length === 0) {\n return context;\n }\n return { ...context, variables: { ...sampleVariables, ...(context?.variables ?? {}) } };\n }, [context, sampleVariables]);\n\n const viewportWidthMap: Record<Viewport, string> = {\n desktop: 'w-full max-w-6xl',\n tablet: 'w-full max-w-[768px] sm:w-[768px]',\n mobile: 'w-full max-w-[375px] sm:w-[375px]',\n };\n\n const viewportIcons: Record<Viewport, React.ReactNode> = {\n desktop: <Monitor className=\"w-3.5 h-3.5\" />,\n tablet: <Tablet className=\"w-3.5 h-3.5\" />,\n mobile: <Smartphone className=\"w-3.5 h-3.5\" />,\n };\n\n const resolvedConfig = useMemo(() => resolveEditorConfig(config), [config]);\n\n return (\n <div\n className={`flex flex-col h-full bg-slate-100 text-slate-900 relative overflow-hidden ${className || ''}`}\n >\n {/* Floating Navigator */}\n {navigatorMode === 'floating' && <LayersPanel registry={registry} />}\n\n {/* Floating Table Spreadsheet Editor */}\n {activeTable && tableSpreadsheetMode === 'floating' && (\n <TableSpreadsheetEditor\n registry={registry}\n tableNode={activeTable}\n mode=\"floating\"\n onToggleMode={() => setTableSpreadsheetMode('docked')}\n onClose={() => setTableSpreadsheetMode('hidden')}\n />\n )}\n\n {/* Mobile Sidebar Drawer Modal */}\n {isMobileSidebarOpen && resolvedConfig.sidebar.enabled && (\n <div className=\"fixed inset-0 z-50 flex lg:hidden animate-in fade-in duration-200\">\n <div\n className=\"fixed inset-0 bg-slate-950/50 backdrop-blur-xs transition-opacity\"\n onClick={() => setIsMobileSidebarOpen(false)}\n />\n <div className=\"relative w-80 max-w-[85vw] bg-white h-full shadow-2xl flex flex-col z-10 animate-in slide-in-from-left duration-200\">\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-slate-200 bg-slate-50\">\n <div className=\"flex items-center gap-2\">\n <Boxes className=\"w-4 h-4 text-blue-600\" />\n <span className=\"font-bold text-xs text-slate-800\">Add Components & Blocks</span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsMobileSidebarOpen(false)}\n className=\"p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-200 transition\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0\">\n <LeftSidebar registry={registry} config={resolvedConfig.sidebar} />\n </div>\n </div>\n </div>\n )}\n\n {/* Mobile Inspector Drawer Modal */}\n {isMobileInspectorOpen && resolvedConfig.inspector.enabled && (\n <div className=\"fixed inset-0 z-50 flex justify-end lg:hidden animate-in fade-in duration-200\">\n <div\n className=\"fixed inset-0 bg-slate-950/50 backdrop-blur-xs transition-opacity\"\n onClick={() => setIsMobileInspectorOpen(false)}\n />\n <div className=\"relative w-84 max-w-[90vw] sm:max-w-md bg-white h-full shadow-2xl flex flex-col z-10 animate-in slide-in-from-right duration-200\">\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-slate-200 bg-slate-50\">\n <div className=\"flex items-center gap-2\">\n <Sliders className=\"w-4 h-4 text-blue-600\" />\n <span className=\"font-bold text-xs text-slate-800\">\n {selectedNodeId ? `Inspector (#${selectedNodeId})` : 'Inspector & Properties'}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsMobileInspectorOpen(false)}\n className=\"p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-200 transition\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0\">\n <InspectorPanel registry={registry} config={resolvedConfig.inspector} />\n </div>\n </div>\n </div>\n )}\n\n {/* Mobile Layers / Navigator Drawer Modal */}\n {isMobileLayersOpen && (\n <div className=\"fixed inset-0 z-50 flex lg:hidden animate-in fade-in duration-200\">\n <div\n className=\"fixed inset-0 bg-slate-950/50 backdrop-blur-xs transition-opacity\"\n onClick={() => setIsMobileLayersOpen(false)}\n />\n <div className=\"relative w-72 max-w-[85vw] bg-white h-full shadow-2xl flex flex-col z-10 animate-in slide-in-from-left duration-200\">\n <div className=\"flex items-center justify-between px-3.5 py-2.5 border-b border-slate-200 bg-slate-50\">\n <div className=\"flex items-center gap-2\">\n <Layers className=\"w-4 h-4 text-blue-600\" />\n <span className=\"font-bold text-xs text-slate-800\">Element Tree / Layers</span>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsMobileLayersOpen(false)}\n className=\"p-1 rounded-md text-slate-400 hover:text-slate-700 hover:bg-slate-200 transition\"\n >\n <X className=\"w-4 h-4\" />\n </button>\n </div>\n <div className=\"flex-1 overflow-hidden min-h-0\">\n <LayersPanel registry={registry} />\n </div>\n </div>\n </div>\n )}\n\n {/* Editor Top Toolbar */}\n {resolvedConfig.toolbar.enabled && (\n <div className=\"flex items-center justify-between px-3 py-1.5 sm:px-4 sm:py-2 bg-white border-b border-slate-200 gap-2 overflow-x-auto min-h-[44px]\">\n {resolvedConfig.toolbar.showTitle ? (\n <div className=\"flex items-center gap-2 shrink-0\">\n <span className=\"font-bold text-slate-800 text-xs sm:text-sm tracking-tight\">\n KUBUILD Editor\n </span>\n <span className=\"text-[11px] bg-slate-100 text-slate-600 px-1.5 py-0.5 rounded border max-w-[120px] sm:max-w-[200px] truncate font-medium\">\n {document.metadata?.title || 'Untitled'}\n </span>\n </div>\n ) : (\n <div />\n )}\n\n <div className=\"flex items-center gap-2 shrink-0\">\n <EditorToolbar registry={registry} config={resolvedConfig.toolbar} />\n\n {/* Viewport switcher */}\n {resolvedConfig.toolbar.showViewportSwitcher && (\n <div className=\"flex items-center gap-0.5 bg-slate-100 p-0.5 sm:p-1 rounded-md text-xs border border-slate-200/80\">\n {(['desktop', 'tablet', 'mobile'] as Viewport[]).map((vp) => (\n <button\n key={vp}\n type=\"button\"\n onClick={() => setViewport(vp)}\n title={`Switch to ${vp} preview`}\n className={`px-2 py-1 sm:px-2.5 sm:py-1 rounded capitalize font-medium transition flex items-center gap-1 text-[11px] sm:text-xs ${\n viewport === vp\n ? 'bg-white text-blue-600 shadow-xs font-semibold'\n : 'text-slate-600 hover:text-slate-900'\n }`}\n >\n {viewportIcons[vp]}\n <span className=\"hidden md:inline\">{vp}</span>\n </button>\n ))}\n </div>\n )}\n </div>\n\n {resolvedConfig.toolbar.showSelectionStatus && (\n <div className=\"hidden xl:block text-xs text-slate-500 shrink-0 font-mono\">\n {selectedNodeId ? `Selected: #${selectedNodeId}` : 'No element selected'}\n </div>\n )}\n </div>\n )}\n\n {/* Main Body: Desktop Docked Sidebars + Canvas */}\n <div className=\"flex flex-1 overflow-hidden min-h-0 relative\">\n {/* Desktop Left Sidebar */}\n {resolvedConfig.sidebar.enabled && (\n <div className=\"hidden lg:flex w-80 shrink-0 bg-white border-r border-slate-200 overflow-hidden flex-col min-h-0 h-full\">\n <LeftSidebar registry={registry} config={resolvedConfig.sidebar} />\n </div>\n )}\n\n {navigatorMode === 'docked' && (\n <div className=\"hidden lg:flex w-60 shrink-0 bg-white border-r border-slate-200 overflow-hidden flex-col min-h-0 h-full\">\n <LayersPanel registry={registry} />\n </div>\n )}\n\n {/* Central Canvas Area */}\n <div className=\"flex-1 overflow-hidden flex flex-col min-h-0 h-full bg-slate-100/90 relative\">\n <div className=\"flex-1 overflow-auto p-2 sm:p-4 md:p-8 flex justify-center items-start min-h-0\">\n <div\n className={`${viewportWidthMap[viewport]} bg-white shadow-md rounded-lg overflow-hidden transition-all duration-200 min-h-[500px] border border-slate-200`}\n >\n <EditorCanvas\n registry={registry}\n context={previewContext}\n viewport={viewport}\n onDiagnostic={onDiagnostic}\n config={resolvedConfig.canvas}\n />\n </div>\n </div>\n\n {/* Quick Edit Selected Floating Action Pill (Mobile only) */}\n {selectedNodeId && !isMobileInspectorOpen && resolvedConfig.inspector.enabled && (\n <div className=\"lg:hidden fixed bottom-14 left-1/2 -translate-x-1/2 z-30 animate-in fade-in slide-in-from-bottom-2\">\n <button\n type=\"button\"\n onClick={() => setIsMobileInspectorOpen(true)}\n className=\"flex items-center gap-2 bg-blue-600 hover:bg-blue-500 text-white text-xs font-semibold px-4 py-2 rounded-full shadow-xl border border-blue-400/40 active:scale-95 transition\"\n >\n <Sliders className=\"w-3.5 h-3.5\" />\n <span>Edit Element (#{selectedNodeId})</span>\n </button>\n </div>\n )}\n\n {resolvedConfig.canvas.showBreadcrumbs && <HierarchyBreadcrumbs registry={registry} />}\n </div>\n\n {/* Desktop Right Inspector */}\n {resolvedConfig.inspector.enabled && (\n <div className=\"hidden lg:flex w-72 shrink-0 bg-white border-l border-slate-200 overflow-hidden flex-col min-h-0 h-full\">\n <InspectorPanel registry={registry} config={resolvedConfig.inspector} />\n </div>\n )}\n </div>\n\n {/* Mobile Bottom Navigation Bar (Visible only on < lg screens) */}\n <div className=\"flex lg:hidden items-center justify-around bg-white border-t border-slate-200 px-2 py-1.5 z-20 shrink-0 shadow-lg select-none min-h-[48px]\">\n {resolvedConfig.sidebar.enabled && (\n <button\n type=\"button\"\n onClick={() => setIsMobileSidebarOpen(true)}\n className=\"flex flex-col items-center justify-center gap-0.5 px-3 py-1 rounded-md text-slate-600 hover:text-blue-600 hover:bg-slate-50 active:bg-slate-100 transition\"\n >\n <Plus className=\"w-4 h-4 text-blue-600\" />\n <span className=\"text-[10px] font-medium\">Add</span>\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => setIsMobileLayersOpen(true)}\n className=\"flex flex-col items-center justify-center gap-0.5 px-3 py-1 rounded-md text-slate-600 hover:text-blue-600 hover:bg-slate-50 active:bg-slate-100 transition\"\n >\n <Layers className=\"w-4 h-4\" />\n <span className=\"text-[10px] font-medium\">Layers</span>\n </button>\n\n {resolvedConfig.inspector.enabled && (\n <button\n type=\"button\"\n onClick={() => setIsMobileInspectorOpen(true)}\n className={`flex flex-col items-center justify-center gap-0.5 px-3 py-1 rounded-md transition relative ${\n selectedNodeId\n ? 'text-blue-600 font-semibold'\n : 'text-slate-600 hover:text-blue-600 hover:bg-slate-50'\n }`}\n >\n <div className=\"relative\">\n <Sliders className=\"w-4 h-4\" />\n {selectedNodeId && (\n <span className=\"absolute -top-1 -right-1 w-2 h-2 rounded-full bg-blue-600 ring-2 ring-white\" />\n )}\n </div>\n <span className=\"text-[10px]\">{selectedNodeId ? 'Inspect *' : 'Inspect'}</span>\n </button>\n )}\n\n <div className=\"h-5 w-px bg-slate-200 mx-0.5\" />\n\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n disabled={!canUndo}\n onClick={undo}\n title=\"Undo\"\n className=\"p-2 rounded text-slate-600 hover:text-blue-600 disabled:opacity-30 disabled:hover:text-slate-600 transition\"\n >\n <Undo2 className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n disabled={!canRedo}\n onClick={redo}\n title=\"Redo\"\n className=\"p-2 rounded text-slate-600 hover:text-blue-600 disabled:opacity-30 disabled:hover:text-slate-600 transition\"\n >\n <Redo2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import { create } from 'zustand';\nimport {\n PageDocument,\n Node,\n StyleDefinition,\n TemplateRecord,\n AnimationConfig,\n} from '@kubuild/schema';\nimport {\n createBlankDocument,\n findNodeById,\n findNodeLocation,\n isDescendantOf,\n getParentNodeId,\n insertNode,\n moveNode,\n duplicateNode,\n removeNode,\n updateProps,\n updateStyle,\n updateAnimation,\n DocumentHistoryManager,\n CommandResult,\n deepClone,\n cloneTreeWithNewIds,\n collectNodeIdSet,\n VariableCatalog,\n saveDraftAsTemplate,\n cloneTemplateAsPage,\n SaveTemplateMetadata,\n CloneTemplateOptions,\n} from '@kubuild/core';\nimport {\n ComponentRegistry,\n ComponentDefaultChildSpec,\n STARTER_BLOCKS,\n BlockDefinition,\n} from '@kubuild/components';\n\nexport type Viewport = 'desktop' | 'tablet' | 'mobile';\nexport type NavigatorMode = 'docked' | 'floating' | 'hidden';\nexport type TableSpreadsheetMode = 'floating' | 'docked' | 'hidden';\n\nexport type DragPayload =\n | { type: 'component'; componentType: string }\n | { type: 'block'; blockId: string }\n | { type: 'node'; nodeId: string };\n\nexport interface InsertComponentResult {\n success: boolean;\n nodeId?: string;\n error?: string;\n}\n\nexport interface MoveComponentResult {\n success: boolean;\n error?: string;\n}\n\nexport interface DuplicateComponentResult {\n success: boolean;\n nodeId?: string;\n error?: string;\n}\n\nexport interface DeleteComponentResult {\n success: boolean;\n error?: string;\n}\n\nexport interface PasteComponentResult {\n success: boolean;\n nodeId?: string;\n error?: string;\n}\n\nexport interface UpdatePropsResult {\n success: boolean;\n error?: string;\n}\n\nexport interface UpdateStyleResult {\n success: boolean;\n error?: string;\n}\n\nexport interface UpdateAnimationResult {\n success: boolean;\n error?: string;\n}\n\n// Duck-types Zod's issue-array shape (from updateStyle's schema.parse) vs plain\n// Error (from updateProps/removeNode/etc) without adding a zod dependency here.\nfunction formatCommandError(err: unknown): string {\n if (err && typeof err === 'object' && Array.isArray((err as { issues?: unknown }).issues)) {\n const issues = (err as { issues: Array<{ path: (string | number)[]; message: string }> })\n .issues;\n return issues\n .map((i) => (i.path.length ? `${i.path.join('.')}: ${i.message}` : i.message))\n .join('; ');\n }\n return err instanceof Error ? err.message : String(err);\n}\n\n/** Generates a node id unique within `existingIds`, e.g. \"heading-1\", \"heading-2\". */\nfunction generateComponentNodeId(type: string, existingIds: Set<string>): string {\n let counter = 1;\n let candidate = `${type}-${counter}`;\n while (existingIds.has(candidate)) {\n counter += 1;\n candidate = `${type}-${counter}`;\n }\n return candidate;\n}\n\n/** Recursively constructs default child nodes from ComponentDefinition.defaultChildren specs. */\nfunction buildDefaultChildren(\n specs: ComponentDefaultChildSpec[] | undefined,\n existingIds: Set<string>,\n registry: ComponentRegistry,\n): Node[] | undefined {\n if (!specs || specs.length === 0) return undefined;\n return specs.map((spec) => {\n const id = generateComponentNodeId(spec.type, existingIds);\n existingIds.add(id);\n const def = registry.get(spec.type);\n const nodeProps = deepClone(spec.props ?? def?.defaultProps ?? {});\n const nodeStyles = spec.styles ?? def?.defaultStyles;\n const childNodes = buildDefaultChildren(\n spec.children ?? def?.defaultChildren,\n existingIds,\n registry,\n );\n const node: Node = {\n id,\n type: spec.type,\n props: nodeProps,\n ...(nodeStyles ? { styles: deepClone(nodeStyles) } : {}),\n ...(childNodes ? { children: childNodes } : {}),\n };\n return node;\n });\n}\n\nexport interface EditorState {\n document: PageDocument;\n selectedNodeId: string | null;\n hoveredNodeId: string | null;\n dragPayload: DragPayload | null;\n viewport: Viewport;\n isDirty: boolean;\n canUndo: boolean;\n canRedo: boolean;\n clipboard: Node | null;\n onChangeHandler: ((doc: PageDocument) => void) | null;\n /** Host-declared bindable variables + editor/preview-only sample values (STORA-053). Never serialized to the document. */\n variableCatalog: VariableCatalog;\n navigatorMode: NavigatorMode;\n tableSpreadsheetMode: TableSpreadsheetMode;\n\n setDocument: (document: PageDocument) => void;\n setDragPayload: (payload: DragPayload | null) => void;\n setVariableCatalog: (catalog: VariableCatalog) => void;\n setNavigatorMode: (mode: NavigatorMode) => void;\n toggleNavigator: () => void;\n setTableSpreadsheetMode: (mode: TableSpreadsheetMode) => void;\n toggleTableSpreadsheet: () => void;\n setOnChangeHandler: (handler: ((doc: PageDocument) => void) | null) => void;\n dispatch: (executor: (doc: PageDocument) => CommandResult) => void;\n insertComponent: (\n type: string,\n registry: ComponentRegistry,\n parentId?: string,\n index?: number,\n ) => InsertComponentResult;\n insertBlock: (\n blockOrId: BlockDefinition | string,\n parentId?: string,\n index?: number,\n ) => InsertComponentResult;\n moveComponent: (\n nodeId: string,\n targetParentId: string,\n registry: ComponentRegistry,\n index?: number,\n ) => MoveComponentResult;\n duplicateComponent: (nodeId: string, registry: ComponentRegistry) => DuplicateComponentResult;\n deleteComponent: (nodeId: string) => DeleteComponentResult;\n updateNodeProps: (\n nodeId: string,\n props: Record<string, unknown>,\n registry: ComponentRegistry,\n merge?: boolean,\n ) => UpdatePropsResult;\n updateNodeStyle: (\n nodeId: string,\n styles: StyleDefinition,\n breakpoint: 'base' | 'desktop' | 'tablet' | 'mobile',\n merge?: boolean,\n ) => UpdateStyleResult;\n /**\n * Update a pseudo-state style layer (e.g. ':hover') on a node — STORA-221.\n * Writes to node.styles.states[state] without touching default values.\n */\n updateNodeStateStyle: (\n nodeId: string,\n styles: StyleDefinition,\n state: string,\n merge?: boolean,\n ) => UpdateStyleResult;\n updateNodeAnimation: (\n nodeId: string,\n animation: Partial<AnimationConfig> | null,\n merge?: boolean,\n ) => UpdateAnimationResult;\n undo: () => void;\n redo: () => void;\n markSaved: () => void;\n copyNode: (nodeId: string) => void;\n pasteNode: (\n targetParentId: string,\n registry: ComponentRegistry,\n index?: number,\n ) => PasteComponentResult;\n selectNode: (nodeId: string | null) => void;\n selectParent: () => void;\n hoverNode: (nodeId: string | null) => void;\n setViewport: (viewport: Viewport) => void;\n getSelectedNode: () => Node | null;\n saveDraftAsTemplate: (metadata: SaveTemplateMetadata) => TemplateRecord;\n loadTemplate: (template: TemplateRecord | PageDocument, options?: CloneTemplateOptions) => void;\n}\n\n// Held outside reactive Zustand state: a mutable class instance, not serializable.\n// Recreated whenever a new document is loaded via setDocument.\nlet historyManager = new DocumentHistoryManager(createBlankDocument());\n\nfunction selectionAfter(document: PageDocument, selectedNodeId: string | null): string | null {\n if (!selectedNodeId) return null;\n return findNodeById(document.document, selectedNodeId) ? selectedNodeId : null;\n}\n\nexport const useEditorStore = create<EditorState>((set, get) => ({\n document: historyManager.document,\n selectedNodeId: null,\n hoveredNodeId: null,\n dragPayload: null,\n viewport: 'desktop',\n isDirty: false,\n canUndo: false,\n canRedo: false,\n clipboard: null,\n onChangeHandler: null,\n variableCatalog: [],\n navigatorMode: 'floating',\n tableSpreadsheetMode: 'floating',\n\n setDragPayload: (payload) => set({ dragPayload: payload }),\n setVariableCatalog: (catalog) => set({ variableCatalog: catalog }),\n setNavigatorMode: (mode) => set({ navigatorMode: mode }),\n toggleNavigator: () =>\n set((state) => ({\n navigatorMode: state.navigatorMode === 'hidden' ? 'floating' : 'hidden',\n })),\n setTableSpreadsheetMode: (mode) => set({ tableSpreadsheetMode: mode }),\n toggleTableSpreadsheet: () =>\n set((state) => ({\n tableSpreadsheetMode: state.tableSpreadsheetMode === 'hidden' ? 'floating' : 'hidden',\n })),\n\n setDocument: (document) => {\n historyManager = new DocumentHistoryManager(document);\n set({\n document: historyManager.document,\n isDirty: false,\n selectedNodeId: null,\n hoveredNodeId: null,\n dragPayload: null,\n clipboard: null,\n canUndo: false,\n canRedo: false,\n });\n },\n\n setOnChangeHandler: (handler) => set({ onChangeHandler: handler }),\n\n dispatch: (executor) => {\n const result = historyManager.execute(executor);\n const { selectedNodeId, onChangeHandler } = get();\n set({\n document: result.document,\n isDirty: true,\n canUndo: historyManager.canUndo,\n canRedo: historyManager.canRedo,\n selectedNodeId: selectionAfter(result.document, selectedNodeId),\n });\n onChangeHandler?.(result.document);\n },\n\n insertComponent: (type, registry, parentId, index) => {\n const state = get();\n const targetParentId = parentId ?? state.selectedNodeId ?? state.document.document.id;\n const parentNode = findNodeById(state.document.document, targetParentId);\n if (!parentNode) {\n return {\n success: false,\n error: `Insertion target \"${targetParentId}\" was not found in the document.`,\n };\n }\n\n const definition = registry.get(type);\n if (!definition) {\n return { success: false, error: `Unknown component type \"${type}\".` };\n }\n\n const policy = registry.canInsertChild(parentNode.type, type);\n if (!policy.valid) {\n return { success: false, error: policy.errors.join(' ') };\n }\n\n const props = deepClone(definition.defaultProps ?? {});\n if (definition.validateProps) {\n const propResult = definition.validateProps(props);\n if (Array.isArray(propResult) && propResult.length > 0) {\n return { success: false, error: propResult.join(' ') };\n }\n if (propResult === false) {\n return {\n success: false,\n error: `Default props for \"${definition.label}\" failed validation.`,\n };\n }\n }\n\n const existingIds = collectNodeIdSet(state.document.document);\n const nodeId = generateComponentNodeId(type, existingIds);\n existingIds.add(nodeId);\n const children = buildDefaultChildren(definition.defaultChildren, existingIds, registry);\n const node: Node = {\n id: nodeId,\n type,\n props,\n ...(definition.defaultStyles ? { styles: deepClone(definition.defaultStyles) } : {}),\n ...(children ? { children } : {}),\n };\n\n get().dispatch((doc) => insertNode(doc, { parentId: targetParentId, node, index }));\n get().selectNode(nodeId);\n\n return { success: true, nodeId };\n },\n\n insertBlock: (blockOrId, parentId, index) => {\n const state = get();\n const targetParentId = parentId ?? state.selectedNodeId ?? state.document.document.id;\n\n let blockDef: BlockDefinition | undefined;\n if (typeof blockOrId === 'string') {\n blockDef = STARTER_BLOCKS.find((b) => b.id === blockOrId);\n } else {\n blockDef = blockOrId;\n }\n\n if (!blockDef) {\n return { success: false, error: 'Block definition not found.' };\n }\n\n const existingIds = collectNodeIdSet(state.document.document);\n let counter = 1;\n const generateId = (prefix = 'node') => {\n let id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n while (existingIds.has(id)) {\n id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n }\n existingIds.add(id);\n return id;\n };\n\n const nodeTree = blockDef.createNodeTree(generateId);\n\n try {\n get().dispatch((doc) => insertNode(doc, { parentId: targetParentId, node: nodeTree, index }));\n get().selectNode(nodeTree.id);\n return { success: true, nodeId: nodeTree.id };\n } catch {\n // Fallback: try inserting at root\n try {\n get().dispatch((doc) =>\n insertNode(doc, { parentId: state.document.document.id, node: nodeTree }),\n );\n get().selectNode(nodeTree.id);\n return { success: true, nodeId: nodeTree.id };\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n }\n },\n\n moveComponent: (nodeId, targetParentId, registry, index) => {\n const state = get();\n\n if (nodeId === state.document.document.id) {\n return { success: false, error: 'Cannot move the root page node.' };\n }\n\n const sourceLocation = findNodeLocation(state.document.document, nodeId);\n if (!sourceLocation || !sourceLocation.parent) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n const targetParent = findNodeById(state.document.document, targetParentId);\n if (!targetParent) {\n return {\n success: false,\n error: `Move target \"${targetParentId}\" was not found in the document.`,\n };\n }\n\n if (isDescendantOf(sourceLocation.node, targetParentId)) {\n return {\n success: false,\n error: 'Cannot move a node into itself or one of its own descendants.',\n };\n }\n\n const policy = registry.canInsertChild(targetParent.type, sourceLocation.node.type);\n if (!policy.valid) {\n return { success: false, error: policy.errors.join(' ') };\n }\n\n // Reordering within the same parent: the source slot is removed before the\n // target index is applied, so any target position after it shifts left by one.\n const adjustedIndex =\n sourceLocation.parent.id === targetParentId &&\n typeof index === 'number' &&\n index > sourceLocation.index\n ? index - 1\n : index;\n\n get().dispatch((doc) => moveNode(doc, { nodeId, targetParentId, index: adjustedIndex }));\n\n return { success: true };\n },\n\n duplicateComponent: (nodeId, _registry) => {\n const state = get();\n\n if (nodeId === state.document.document.id) {\n return { success: false, error: 'Cannot duplicate the root page node.' };\n }\n\n const location = findNodeLocation(state.document.document, nodeId);\n if (!location || !location.parent) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n let newNodeId: string | undefined;\n try {\n get().dispatch((doc) => {\n const result = duplicateNode(doc, { nodeId });\n newNodeId = result.event.nodeId;\n return result;\n });\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n if (newNodeId) get().selectNode(newNodeId);\n return { success: true, nodeId: newNodeId };\n },\n\n deleteComponent: (nodeId) => {\n const state = get();\n\n if (nodeId === state.document.document.id) {\n return { success: false, error: 'Cannot delete the root page node.' };\n }\n\n if (!findNodeById(state.document.document, nodeId)) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n try {\n get().dispatch((doc) => removeNode(doc, { nodeId }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeProps: (nodeId, props, registry, merge = true) => {\n const state = get();\n const node = findNodeById(state.document.document, nodeId);\n if (!node) {\n return { success: false, error: `Node \"${nodeId}\" was not found in the document.` };\n }\n\n const definition = registry.get(node.type);\n if (!definition) {\n return { success: false, error: `Unknown component type \"${node.type}\".` };\n }\n\n if (definition.validateProps) {\n const candidate = merge\n ? { ...deepClone(node.props ?? {}), ...deepClone(props) }\n : deepClone(props);\n const propResult = definition.validateProps(candidate);\n if (Array.isArray(propResult) && propResult.length > 0) {\n return { success: false, error: propResult.join(' ') };\n }\n if (propResult === false) {\n return { success: false, error: `Props failed validation for \"${definition.label}\".` };\n }\n }\n\n try {\n get().dispatch((doc) => updateProps(doc, { nodeId, props, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeStyle: (nodeId, styles, breakpoint, merge = true) => {\n try {\n get().dispatch((doc) => updateStyle(doc, { nodeId, styles, breakpoint, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeStateStyle: (nodeId, styles, state, merge = true) => {\n try {\n get().dispatch((doc) => updateStyle(doc, { nodeId, styles, state, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeAnimation: (nodeId, animation, merge = true) => {\n try {\n get().dispatch((doc) => updateAnimation(doc, { nodeId, animation, merge }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n undo: () => {\n const restored = historyManager.undo();\n if (!restored) return;\n const { selectedNodeId, onChangeHandler } = get();\n set({\n document: restored,\n isDirty: true,\n canUndo: historyManager.canUndo,\n canRedo: historyManager.canRedo,\n selectedNodeId: selectionAfter(restored, selectedNodeId),\n });\n onChangeHandler?.(restored);\n },\n\n redo: () => {\n const restored = historyManager.redo();\n if (!restored) return;\n const { selectedNodeId, onChangeHandler } = get();\n set({\n document: restored,\n isDirty: true,\n canUndo: historyManager.canUndo,\n canRedo: historyManager.canRedo,\n selectedNodeId: selectionAfter(restored, selectedNodeId),\n });\n onChangeHandler?.(restored);\n },\n\n markSaved: () => set({ isDirty: false }),\n\n copyNode: (nodeId) => {\n const node = findNodeById(get().document.document, nodeId);\n if (!node) return;\n set({ clipboard: deepClone(node) });\n },\n\n pasteNode: (targetParentId, registry, index) => {\n const { clipboard, document } = get();\n if (!clipboard) {\n return { success: false, error: 'Clipboard is empty.' };\n }\n\n const targetParent = findNodeById(document.document, targetParentId);\n if (!targetParent) {\n return {\n success: false,\n error: `Paste target \"${targetParentId}\" was not found in the document.`,\n };\n }\n\n if (isDescendantOf(clipboard, targetParentId)) {\n return {\n success: false,\n error: 'Cannot paste a node into itself or one of its own descendants.',\n };\n }\n\n const policy = registry.canInsertChild(targetParent.type, clipboard.type);\n if (!policy.valid) {\n return { success: false, error: policy.errors.join(' ') };\n }\n\n const existingIds = collectNodeIdSet(document.document);\n const { clonedNode } = cloneTreeWithNewIds(clipboard, undefined, existingIds);\n\n try {\n get().dispatch((doc) =>\n insertNode(doc, { parentId: targetParentId, node: clonedNode, index }),\n );\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n get().selectNode(clonedNode.id);\n return { success: true, nodeId: clonedNode.id };\n },\n\n selectNode: (nodeId) => set({ selectedNodeId: nodeId }),\n selectParent: () => {\n const { document, selectedNodeId } = get();\n if (!selectedNodeId) return;\n const parentId = getParentNodeId(document.document, selectedNodeId);\n if (parentId) {\n set({ selectedNodeId: parentId });\n }\n },\n hoverNode: (nodeId) => set({ hoveredNodeId: nodeId }),\n setViewport: (viewport) => set({ viewport }),\n getSelectedNode: () => {\n const { document, selectedNodeId } = get();\n if (!selectedNodeId) return null;\n return findNodeById(document.document, selectedNodeId);\n },\n\n saveDraftAsTemplate: (metadata) => {\n const currentDoc = get().document;\n return saveDraftAsTemplate(currentDoc, metadata);\n },\n\n loadTemplate: (template, options) => {\n const clonedDoc = cloneTemplateAsPage(template, options);\n get().setDocument(clonedDoc);\n },\n}));\n","import React, { useLayoutEffect, useRef, useState, useEffect } from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { KubuildRenderer } from '@kubuild/renderer';\nimport {\n RuntimeContext,\n Diagnostic,\n getNavigationTarget,\n NavigationDirection,\n findNodeById,\n findNodeLocation,\n isDescendantOf,\n} from '@kubuild/core';\nimport { useEditorStore, Viewport } from './store';\nimport { FloatingActionBadges } from './floating-badges';\nimport { EditorCanvasConfig } from './config';\n\nexport interface EditorCanvasProps {\n document?: PageDocument;\n registry: ComponentRegistry;\n context?: RuntimeContext;\n viewport: Viewport;\n onDiagnostic?: (diagnostic: Diagnostic) => void;\n config?: EditorCanvasConfig;\n}\n\ninterface Rect {\n top: number;\n left: number;\n width: number;\n height: number;\n}\n\nfunction isEditableTarget(target: EventTarget | null): boolean {\n if (!(target instanceof HTMLElement)) return false;\n return target.tagName === 'INPUT' || target.tagName === 'TEXTAREA' || target.isContentEditable;\n}\n\nconst ARROW_DIRECTIONS: Record<string, NavigationDirection> = {\n ArrowUp: 'parent',\n ArrowDown: 'child',\n ArrowLeft: 'previous-sibling',\n ArrowRight: 'next-sibling',\n};\n\ninterface DropTarget {\n parentId: string;\n index?: number;\n position: 'before' | 'after' | 'inside';\n rect: Rect;\n}\n\nfunction rectFor(container: HTMLElement, nodeId: string | null): Rect | null {\n if (!nodeId) return null;\n const el = container.querySelector(`[data-kubuild-node=\"${CSS.escape(nodeId)}\"]`);\n if (!el) return null;\n const containerRect = container.getBoundingClientRect();\n const elRect = el.getBoundingClientRect();\n return {\n top: elRect.top - containerRect.top,\n left: elRect.left - containerRect.left,\n width: elRect.width,\n height: elRect.height,\n };\n}\n\nexport const EditorCanvas: React.FC<EditorCanvasProps> = ({\n document: propDoc,\n registry,\n context,\n viewport,\n onDiagnostic,\n config,\n}) => {\n const {\n document: storeDoc,\n selectedNodeId,\n hoveredNodeId,\n dragPayload,\n selectNode,\n hoverNode,\n updateNodeProps,\n setDragPayload,\n insertComponent,\n insertBlock,\n moveComponent,\n } = useEditorStore();\n const document = propDoc ?? storeDoc;\n const showFloatingBadges = config?.showFloatingBadges !== false;\n const containerRef = useRef<HTMLDivElement>(null);\n const [selectedRect, setSelectedRect] = useState<Rect | null>(null);\n const [hoveredRect, setHoveredRect] = useState<Rect | null>(null);\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropTarget, setDropTarget] = useState<DropTarget | null>(null);\n\n useLayoutEffect(() => {\n const recompute = () => {\n const container = containerRef.current;\n if (!container) return;\n setSelectedRect(rectFor(container, selectedNodeId));\n setHoveredRect(rectFor(container, hoveredNodeId));\n };\n\n recompute();\n const container = containerRef.current;\n window.addEventListener('resize', recompute);\n window.addEventListener('scroll', recompute, true);\n container?.addEventListener('input', recompute);\n return () => {\n window.removeEventListener('resize', recompute);\n window.removeEventListener('scroll', recompute, true);\n container?.removeEventListener('input', recompute);\n };\n }, [document, selectedNodeId, hoveredNodeId, viewport]);\n\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n container.querySelectorAll<HTMLElement>('[data-kubuild-node]').forEach((el) => {\n const id = el.getAttribute('data-kubuild-node');\n const isEditable = el.isContentEditable || el.getAttribute('contenteditable') === 'true';\n el.draggable = !!id && id !== document.document.id && !isEditable;\n });\n }, [document, viewport]);\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (isEditableTarget(e.target)) return;\n\n const state = useEditorStore.getState();\n\n if (e.key === 'Escape') {\n state.selectNode(null);\n return;\n }\n\n const mod = e.metaKey || e.ctrlKey;\n\n if (mod && e.key.toLowerCase() === 'z' && !e.shiftKey) {\n e.preventDefault();\n state.undo();\n return;\n }\n if (mod && (e.key.toLowerCase() === 'y' || (e.key.toLowerCase() === 'z' && e.shiftKey))) {\n e.preventDefault();\n state.redo();\n return;\n }\n\n if (!state.selectedNodeId) return;\n\n if (mod && e.key.toLowerCase() === 'c') {\n state.copyNode(state.selectedNodeId);\n return;\n }\n if (mod && e.key.toLowerCase() === 'v') {\n state.pasteNode(state.selectedNodeId, registry);\n return;\n }\n if (mod && e.key.toLowerCase() === 'd') {\n e.preventDefault();\n state.duplicateComponent(state.selectedNodeId, registry);\n return;\n }\n\n if (e.key === 'Delete' || e.key === 'Backspace') {\n if (state.selectedNodeId === state.document.document.id) return;\n e.preventDefault();\n state.deleteComponent(state.selectedNodeId);\n return;\n }\n\n const direction = ARROW_DIRECTIONS[e.key];\n if (direction) {\n e.preventDefault();\n const target = getNavigationTarget(\n state.document.document,\n state.selectedNodeId,\n direction,\n );\n if (target) state.selectNode(target);\n }\n };\n\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [registry]);\n\n const handleMouseOver = (e: React.MouseEvent) => {\n const el = (e.target as HTMLElement).closest('[data-kubuild-node]');\n if (el) hoverNode(el.getAttribute('data-kubuild-node'));\n };\n\n const handleMouseLeave = () => hoverNode(null);\n\n const handleDragStart = (e: React.DragEvent) => {\n const target = e.target as HTMLElement;\n if (target.isContentEditable || target.closest('[contenteditable=\"true\"]')) {\n e.preventDefault();\n return;\n }\n const el = target.closest('[data-kubuild-node]');\n const nodeId = el?.getAttribute('data-kubuild-node');\n if (!nodeId || nodeId === document.document.id) {\n e.preventDefault();\n return;\n }\n e.stopPropagation();\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', nodeId);\n e.dataTransfer.setData('application/kubuild-drag-type', 'node');\n e.dataTransfer.setData('application/kubuild-node-id', nodeId);\n setDraggingId(nodeId);\n setDragPayload({ type: 'node', nodeId });\n selectNode(nodeId);\n };\n\n const handleDragOver = (e: React.DragEvent) => {\n const activePayload =\n dragPayload ?? (draggingId ? { type: 'node' as const, nodeId: draggingId } : null);\n if (!activePayload) return;\n\n const container = containerRef.current;\n if (!container) return;\n\n const containerRect = container.getBoundingClientRect();\n const hoveredEl = (e.target as HTMLElement).closest(\n '[data-kubuild-node]',\n ) as HTMLElement | null;\n\n let incomingType: string | null = null;\n if (activePayload.type === 'node') {\n const draggedNode = findNodeById(document.document, activePayload.nodeId);\n incomingType = draggedNode?.type ?? null;\n } else if (activePayload.type === 'component') {\n incomingType = activePayload.componentType;\n } else if (activePayload.type === 'block') {\n incomingType = 'section';\n }\n\n if (!incomingType) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n if (!hoveredEl) {\n // Hovering directly over empty canvas container: default to dropping inside root page\n const rootNode = document.document;\n const policy = registry.canInsertChild(rootNode.type, incomingType);\n if (!policy.valid) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n e.preventDefault();\n e.dataTransfer.dropEffect = activePayload.type === 'node' ? 'move' : 'copy';\n setDropTarget({\n parentId: rootNode.id,\n index: rootNode.children?.length ?? 0,\n position: 'inside',\n rect: {\n top: 0,\n left: 0,\n width: containerRect.width,\n height: Math.max(containerRect.height, 200),\n },\n });\n return;\n }\n\n const hoveredId = hoveredEl.getAttribute('data-kubuild-node');\n if (!hoveredId) return;\n\n // If dragging an existing node, prevent dropping into itself or its descendants\n if (activePayload.type === 'node') {\n const draggedNode = findNodeById(document.document, activePayload.nodeId);\n if (!draggedNode || isDescendantOf(draggedNode, hoveredId)) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n }\n\n const hoveredNode = findNodeById(document.document, hoveredId);\n if (!hoveredNode) return;\n\n const elRect = hoveredEl.getBoundingClientRect();\n const ratio = elRect.height > 0 ? (e.clientY - elRect.top) / elRect.height : 0.5;\n const hoveredDef = registry.get(hoveredNode.type);\n const canGoInside = !!hoveredDef?.acceptsChildren;\n const location = findNodeLocation(document.document, hoveredId);\n\n let candidate: {\n parentId: string;\n index?: number;\n position: DropTarget['position'];\n targetType: string;\n };\n\n if (canGoInside && (!location?.parent || (ratio > 0.25 && ratio < 0.75))) {\n candidate = {\n parentId: hoveredId,\n index: hoveredNode.children?.length ?? 0,\n position: 'inside',\n targetType: hoveredNode.type,\n };\n } else if (location?.parent) {\n candidate = {\n parentId: location.parent.id,\n index: location.index + (ratio >= 0.5 ? 1 : 0),\n position: ratio >= 0.5 ? 'after' : 'before',\n targetType: location.parent.type,\n };\n } else {\n // Hovering root directly\n candidate = {\n parentId: document.document.id,\n index: document.document.children?.length ?? 0,\n position: 'inside',\n targetType: document.document.type,\n };\n }\n\n const policy = registry.canInsertChild(candidate.targetType, incomingType);\n if (!policy.valid) {\n setDropTarget(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n e.preventDefault();\n e.dataTransfer.dropEffect = activePayload.type === 'node' ? 'move' : 'copy';\n setDropTarget({\n parentId: candidate.parentId,\n index: candidate.index,\n position: candidate.position,\n rect: {\n top: elRect.top - containerRect.top,\n left: elRect.left - containerRect.left,\n width: elRect.width,\n height: elRect.height,\n },\n });\n };\n\n const handleDrop = (e: React.DragEvent) => {\n e.preventDefault();\n const activePayload =\n dragPayload ?? (draggingId ? { type: 'node' as const, nodeId: draggingId } : null);\n\n if (activePayload && dropTarget) {\n if (activePayload.type === 'node') {\n moveComponent(activePayload.nodeId, dropTarget.parentId, registry, dropTarget.index);\n } else if (activePayload.type === 'component') {\n insertComponent(\n activePayload.componentType,\n registry,\n dropTarget.parentId,\n dropTarget.index,\n );\n } else if (activePayload.type === 'block') {\n insertBlock(activePayload.blockId, dropTarget.parentId, dropTarget.index);\n }\n }\n\n setDraggingId(null);\n setDropTarget(null);\n setDragPayload(null);\n };\n\n const handleDragEnd = () => {\n setDraggingId(null);\n setDropTarget(null);\n setDragPayload(null);\n };\n\n return (\n <div\n ref={containerRef}\n style={{ position: 'relative' }}\n onMouseOver={handleMouseOver}\n onMouseLeave={handleMouseLeave}\n onDragStart={handleDragStart}\n onDragOver={handleDragOver}\n onDrop={handleDrop}\n onDragEnd={handleDragEnd}\n >\n <KubuildRenderer\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode=\"editor\"\n onNodeClick={(id: string) => selectNode(id)}\n onNodePropChange={(nodeId: string, propName: string, value: unknown, isBlur?: boolean) => {\n if (!isBlur && typeof value === 'string' && value.trim() === '') {\n return;\n }\n updateNodeProps(nodeId, { [propName]: value }, registry);\n }}\n onDiagnostic={onDiagnostic}\n />\n {hoveredRect && hoveredNodeId !== selectedNodeId && (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-hover-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n top: hoveredRect.top,\n left: hoveredRect.left,\n width: hoveredRect.width,\n height: hoveredRect.height,\n border: '1px dashed #94a3b8',\n }}\n />\n )}\n {selectedRect && (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-selection-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n top: selectedRect.top,\n left: selectedRect.left,\n width: selectedRect.width,\n height: selectedRect.height,\n border: '2px solid #3b82f6',\n }}\n />\n )}\n {showFloatingBadges && selectedRect && selectedNodeId && (\n <FloatingActionBadges\n selectedNodeId={selectedNodeId}\n document={document}\n registry={registry}\n selectedRect={selectedRect}\n onDragStart={handleDragStart}\n />\n )}\n {dropTarget &&\n (dropTarget.position === 'inside' ? (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-drop-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n top: dropTarget.rect.top,\n left: dropTarget.rect.left,\n width: dropTarget.rect.width,\n height: dropTarget.rect.height,\n border: '2px dashed #16a34a',\n backgroundColor: 'rgba(22, 163, 74, 0.08)',\n }}\n />\n ) : (\n <div\n aria-hidden=\"true\"\n role=\"presentation\"\n data-testid=\"editor-drop-line-overlay\"\n style={{\n position: 'absolute',\n pointerEvents: 'none',\n left: dropTarget.rect.left,\n width: dropTarget.rect.width,\n top:\n dropTarget.position === 'before'\n ? dropTarget.rect.top - 1\n : dropTarget.rect.top + dropTarget.rect.height - 1,\n height: 2,\n backgroundColor: '#16a34a',\n }}\n />\n ))}\n </div>\n );\n};\n","import React from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { findNodeById, getParentNodeId } from '@kubuild/core';\nimport { ArrowUp, Move, Copy, Trash2 } from 'lucide-react';\nimport { useEditorStore } from './store';\n\nexport interface FloatingActionBadgesProps {\n selectedNodeId: string;\n document: PageDocument;\n registry: ComponentRegistry;\n selectedRect: {\n top: number;\n left: number;\n width: number;\n height: number;\n };\n onDragStart?: (e: React.DragEvent) => void;\n}\n\n/**\n * Floating Action Badges rendered above the active bounding box on the canvas — STORA-230.\n * Includes:\n * - Component Type / Tag Badge\n * - Select Parent (ArrowUp)\n * - Move Handle (Move)\n * - Duplicate (Copy)\n * - Delete (Trash2)\n */\nexport const FloatingActionBadges: React.FC<FloatingActionBadgesProps> = ({\n selectedNodeId,\n document,\n registry,\n selectedRect,\n onDragStart,\n}) => {\n const { selectNode, duplicateComponent, deleteComponent } = useEditorStore();\n\n const node = findNodeById(document.document, selectedNodeId);\n if (!node) return null;\n\n const isRoot = node.id === document.document.id;\n const parentId = getParentNodeId(document.document, node.id);\n const definition = registry.get(node.type);\n const label = definition?.label || node.type;\n\n // Position badge directly above the bounding box top, clamped within canvas viewport\n const topPos = selectedRect.top >= 28 ? selectedRect.top - 26 : selectedRect.top;\n const leftPos = selectedRect.left;\n\n return (\n <div\n data-testid=\"floating-action-badges\"\n className=\"absolute flex items-center bg-blue-600 text-white rounded shadow-md text-xs font-medium z-50 select-none overflow-hidden\"\n style={{\n top: `${topPos}px`,\n left: `${leftPos}px`,\n pointerEvents: 'auto',\n transform: selectedRect.top < 28 ? 'translateY(0)' : 'translateY(-100%)',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n {/* Element Tag Label */}\n <span\n data-testid=\"floating-badge-label\"\n className=\"px-2 py-1 bg-blue-700 font-semibold tracking-wide flex items-center gap-1\"\n >\n {label}\n </span>\n\n {/* Select Parent Button */}\n {parentId && (\n <button\n type=\"button\"\n data-testid=\"floating-badge-select-parent\"\n title=\"Select Parent\"\n aria-label=\"Select Parent\"\n onClick={() => selectNode(parentId)}\n className=\"px-1.5 py-1 hover:bg-blue-500 active:bg-blue-700 transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <ArrowUp className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n\n {/* Move Handle */}\n {!isRoot && (\n <div\n data-testid=\"floating-badge-move\"\n title=\"Move / Drag\"\n aria-label=\"Move\"\n draggable={true}\n onDragStart={onDragStart}\n className=\"px-1.5 py-1 hover:bg-blue-500 active:bg-blue-700 cursor-grab active:cursor-grabbing transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <Move className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </div>\n )}\n\n {/* Duplicate Button */}\n {!isRoot && (\n <button\n type=\"button\"\n data-testid=\"floating-badge-duplicate\"\n title=\"Duplicate (⌘D)\"\n aria-label=\"Duplicate\"\n onClick={() => duplicateComponent(node.id, registry)}\n className=\"px-1.5 py-1 hover:bg-blue-500 active:bg-blue-700 transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <Copy className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n\n {/* Delete Button */}\n {!isRoot && (\n <button\n type=\"button\"\n data-testid=\"floating-badge-delete\"\n title=\"Delete (Backspace / Del)\"\n aria-label=\"Delete\"\n onClick={() => deleteComponent(node.id)}\n className=\"px-1.5 py-1 hover:bg-red-500 active:bg-red-700 transition flex items-center justify-center border-l border-blue-500/40 text-[11px]\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { useEditorStore } from './store';\nimport { ImportModal } from './import-modal';\nimport { CodeViewerModal } from './code-viewer-modal';\nimport { downloadDocumentAsStora, downloadDocumentAsJson } from './export-utils';\nimport { Copy, ClipboardPaste, CopyPlus, Trash2, Undo2, Redo2 } from 'lucide-react';\n\nimport { EditorToolbarConfig } from './config';\n\nexport interface EditorToolbarProps {\n registry: ComponentRegistry;\n className?: string;\n showExportImport?: boolean;\n config?: EditorToolbarConfig;\n}\n\ninterface ToolbarIconButtonProps {\n icon: React.ReactNode;\n label: string;\n shortcut?: string;\n onClick: () => void;\n disabled?: boolean;\n danger?: boolean;\n 'data-testid'?: string;\n}\n\nconst ToolbarIconButton: React.FC<ToolbarIconButtonProps> = ({\n icon,\n label,\n shortcut,\n onClick,\n disabled = false,\n danger = false,\n 'data-testid': testId,\n}) => {\n return (\n <div className=\"relative group flex items-center justify-center\">\n <button\n type=\"button\"\n data-testid={testId}\n disabled={disabled}\n onClick={onClick}\n aria-label={`${label}${shortcut ? ` (${shortcut})` : ''}`}\n title={`${label}${shortcut ? ` (${shortcut})` : ''}`}\n className={`p-1.5 rounded border border-slate-200 bg-white transition flex items-center justify-center cursor-pointer ${\n danger\n ? 'text-slate-700 hover:border-red-400 hover:text-red-600 hover:bg-red-50 disabled:opacity-35 disabled:cursor-not-allowed disabled:hover:bg-white disabled:hover:text-slate-700 disabled:hover:border-slate-200'\n : 'text-slate-700 hover:border-blue-400 hover:text-blue-600 hover:bg-blue-50 disabled:opacity-35 disabled:cursor-not-allowed disabled:hover:bg-white disabled:hover:text-slate-700 disabled:hover:border-slate-200'\n }`}\n >\n {icon}\n </button>\n\n {/* Floating tooltip on hover */}\n <div\n role=\"tooltip\"\n className=\"pointer-events-none absolute bottom-full mb-1.5 hidden group-hover:flex flex-col items-center z-50 animate-fadeIn select-none\"\n >\n <div className=\"bg-slate-900 text-white text-[11px] font-medium px-2 py-0.5 rounded shadow-md whitespace-nowrap flex items-center gap-1.5\">\n <span>{label}</span>\n {shortcut && <span className=\"text-slate-400 text-[10px] font-mono\">{shortcut}</span>}\n </div>\n <div className=\"w-1.5 h-1.5 bg-slate-900 rotate-45 -mt-1\" />\n </div>\n </div>\n );\n};\n\nexport const EditorToolbar: React.FC<EditorToolbarProps> = ({\n registry,\n className,\n showExportImport: propShowExportImport = true,\n config,\n}) => {\n const {\n document,\n setDocument,\n selectedNodeId,\n clipboard,\n canUndo,\n canRedo,\n navigatorMode,\n toggleNavigator,\n duplicateComponent,\n deleteComponent,\n copyNode,\n pasteNode,\n undo,\n redo,\n } = useEditorStore();\n const [error, setError] = useState<string | null>(null);\n const [isImportModalOpen, setIsImportModalOpen] = useState<boolean>(false);\n const [isCodeViewerModalOpen, setIsCodeViewerModalOpen] = useState<boolean>(false);\n const [isExporting, setIsExporting] = useState<boolean>(false);\n\n const showNavigatorToggle = config?.showNavigatorToggle !== false;\n const showHistory = config?.showHistory !== false;\n const showClipboard = config?.showClipboard !== false;\n const showCodeViewer = config?.showCodeViewer !== false;\n const showExportImport = propShowExportImport && config?.showExportImport !== false;\n const customActions = config?.customActions;\n\n const rootId = document.document.id;\n const hasSelection = !!selectedNodeId && selectedNodeId !== rootId;\n const canPaste = !!clipboard && !!selectedNodeId;\n\n const handleCopy = () => {\n if (!selectedNodeId) return;\n copyNode(selectedNodeId);\n setError(null);\n };\n\n const handlePaste = () => {\n if (!selectedNodeId) return;\n const result = pasteNode(selectedNodeId, registry);\n setError(result.success ? null : (result.error ?? 'Could not paste here.'));\n };\n\n const handleDuplicate = () => {\n if (!selectedNodeId) return;\n const result = duplicateComponent(selectedNodeId, registry);\n setError(result.success ? null : (result.error ?? 'Could not duplicate.'));\n };\n\n const handleDelete = () => {\n if (!selectedNodeId) return;\n const result = deleteComponent(selectedNodeId);\n setError(result.success ? null : (result.error ?? 'Could not delete.'));\n };\n\n const handleExportStora = async () => {\n setError(null);\n setIsExporting(true);\n try {\n await downloadDocumentAsStora(document, undefined, { componentRegistry: registry });\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Unknown error during export.';\n setError(`Export failed: ${msg}`);\n } finally {\n setIsExporting(false);\n }\n };\n\n const handleExportJson = () => {\n setError(null);\n try {\n downloadDocumentAsJson(document);\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : 'Unknown error during JSON download.';\n setError(`JSON download failed: ${msg}`);\n }\n };\n\n return (\n <>\n <div className={`flex items-center gap-1.5 ${className || ''}`}>\n {error && (\n <div\n role=\"alert\"\n className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1 flex items-center gap-1 mr-1\"\n >\n <span>{error}</span>\n <button\n type=\"button\"\n onClick={() => setError(null)}\n className=\"text-red-400 hover:text-red-600 font-bold ml-1\"\n >\n ×\n </button>\n </div>\n )}\n\n {showNavigatorToggle && (\n <button\n type=\"button\"\n title={`Navigator / Element Tree (${navigatorMode !== 'hidden' ? 'Open' : 'Hidden'})`}\n onClick={toggleNavigator}\n className={`hidden sm:flex items-center gap-1 text-xs px-2.5 py-1 rounded border transition font-medium cursor-pointer ${\n navigatorMode !== 'hidden'\n ? 'border-blue-500 bg-blue-50 text-blue-700 shadow-xs'\n : 'border-slate-200 bg-white hover:border-slate-300 text-slate-700'\n }`}\n >\n <svg\n width=\"13\"\n height=\"13\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n >\n <line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\" />\n <line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\" />\n <line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\" />\n <line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\" />\n <line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\" />\n <line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\" />\n </svg>\n <span>Navigator</span>\n </button>\n )}\n\n {showNavigatorToggle &&\n (showClipboard || showHistory || showCodeViewer || showExportImport) && (\n <div className=\"hidden sm:block h-4 w-px bg-slate-200 mx-1\" />\n )}\n\n {(showClipboard || showHistory) && (\n <div className=\"flex items-center gap-1\">\n {showClipboard && (\n <>\n <ToolbarIconButton\n icon={<Copy className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Copy\"\n shortcut=\"Ctrl/Cmd+C\"\n disabled={!hasSelection}\n onClick={handleCopy}\n data-testid=\"toolbar-copy\"\n />\n <ToolbarIconButton\n icon={<ClipboardPaste className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Paste\"\n shortcut=\"Ctrl/Cmd+V\"\n disabled={!canPaste}\n onClick={handlePaste}\n data-testid=\"toolbar-paste\"\n />\n <ToolbarIconButton\n icon={<CopyPlus className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Duplicate\"\n shortcut=\"Ctrl/Cmd+D\"\n disabled={!hasSelection}\n onClick={handleDuplicate}\n data-testid=\"toolbar-duplicate\"\n />\n <ToolbarIconButton\n icon={<Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Delete\"\n shortcut=\"Del\"\n disabled={!hasSelection}\n onClick={handleDelete}\n danger\n data-testid=\"toolbar-delete\"\n />\n </>\n )}\n {showClipboard && showHistory && <div className=\"h-3.5 w-px bg-slate-200 mx-0.5\" />}\n {showHistory && (\n <>\n <ToolbarIconButton\n icon={<Undo2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Undo\"\n shortcut=\"Ctrl/Cmd+Z\"\n disabled={!canUndo}\n onClick={undo}\n data-testid=\"toolbar-undo\"\n />\n <ToolbarIconButton\n icon={<Redo2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />}\n label=\"Redo\"\n shortcut=\"Ctrl/Cmd+Shift+Z\"\n disabled={!canRedo}\n onClick={redo}\n data-testid=\"toolbar-redo\"\n />\n </>\n )}\n </div>\n )}\n\n {(showClipboard || showHistory) && (showCodeViewer || showExportImport) && (\n <div className=\"hidden sm:block h-4 w-px bg-slate-200 mx-1\" />\n )}\n\n {showCodeViewer && (\n <button\n type=\"button\"\n title=\"View Semantic HTML & CSS (< >)\"\n onClick={() => setIsCodeViewerModalOpen(true)}\n className=\"flex items-center gap-1.5 text-xs px-2 sm:px-2.5 py-1 rounded border border-slate-200 bg-white hover:border-blue-500 hover:text-blue-600 font-medium text-slate-700 transition\"\n >\n <span className=\"font-mono text-[11px] font-bold text-blue-600\"><></span>\n <span className=\"hidden sm:inline\">View Code</span>\n </button>\n )}\n\n {showExportImport && (\n <div className=\"flex items-center gap-1\">\n {showCodeViewer && <div className=\"h-4 w-px bg-slate-200 mx-1\" />}\n <button\n type=\"button\"\n title=\"Import .stora Package\"\n onClick={() => setIsImportModalOpen(true)}\n className=\"text-xs px-2 sm:px-2.5 py-1 rounded border border-slate-200 bg-white hover:border-blue-500 hover:text-blue-600 font-medium text-slate-700 transition\"\n >\n Import\n </button>\n <button\n type=\"button\"\n title=\"Export .stora Archive\"\n disabled={isExporting}\n onClick={handleExportStora}\n className=\"text-xs px-2 sm:px-2.5 py-1 rounded border border-blue-600 bg-blue-600 hover:bg-blue-500 text-white font-medium disabled:opacity-50 transition shadow-xs\"\n >\n {isExporting ? '...' : 'Export'}\n </button>\n <button\n type=\"button\"\n title=\"Download page.json\"\n onClick={handleExportJson}\n className=\"hidden md:inline-block text-xs px-2 py-1 rounded border border-slate-200 bg-white hover:border-slate-400 text-slate-600 transition\"\n >\n JSON\n </button>\n </div>\n )}\n\n {customActions && (\n <>\n <div className=\"h-4 w-px bg-slate-200 mx-1\" />\n <div className=\"flex items-center gap-1\">{customActions}</div>\n </>\n )}\n </div>\n\n <ImportModal\n isOpen={isImportModalOpen}\n onClose={() => setIsImportModalOpen(false)}\n onImport={(importedDoc) => {\n setDocument(importedDoc);\n }}\n registry={registry}\n />\n\n <CodeViewerModal\n isOpen={isCodeViewerModalOpen}\n onClose={() => setIsCodeViewerModalOpen(false)}\n />\n </>\n );\n};\n","import React, { useState, useRef } from 'react';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { PageDocument, PageDocumentSchema } from '@kubuild/schema';\nimport {\n inspectPackage,\n importPackage,\n PreflightReport,\n MissingDependencyPolicy,\n validateDocument,\n} from '@kubuild/core';\n\nexport interface ImportModalProps {\n isOpen: boolean;\n onClose: () => void;\n onImport: (doc: PageDocument) => void;\n registry: ComponentRegistry;\n}\n\nexport const ImportModal: React.FC<ImportModalProps> = ({\n isOpen,\n onClose,\n onImport,\n registry,\n}) => {\n const [file, setFile] = useState<File | null>(null);\n const [fileBytes, setFileBytes] = useState<Uint8Array | null>(null);\n const [isJsonFile, setIsJsonFile] = useState<boolean>(false);\n const [jsonDoc, setJsonDoc] = useState<PageDocument | null>(null);\n\n const [isLoading, setIsLoading] = useState<boolean>(false);\n const [error, setError] = useState<string | null>(null);\n const [preflight, setPreflight] = useState<PreflightReport | null>(null);\n const [dependencyPolicy, setDependencyPolicy] = useState<MissingDependencyPolicy>('import-with-placeholder');\n\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n if (!isOpen) return null;\n\n const resetState = () => {\n setFile(null);\n setFileBytes(null);\n setIsJsonFile(false);\n setJsonDoc(null);\n setIsLoading(false);\n setError(null);\n setPreflight(null);\n setDependencyPolicy('import-with-placeholder');\n };\n\n const handleClose = () => {\n resetState();\n onClose();\n };\n\n const handleFileChange = async (e: React.ChangeEvent<HTMLInputElement>) => {\n const selectedFile = e.target.files?.[0];\n if (!selectedFile) return;\n await processFile(selectedFile);\n };\n\n const handleDrop = async (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n const droppedFile = e.dataTransfer.files?.[0];\n if (!droppedFile) return;\n await processFile(droppedFile);\n };\n\n const defaultSupportedCapabilities = [\n 'assetProvider',\n 'actionRegistry',\n 'variableRegistry',\n 'dataProvider',\n ];\n\n const processFile = async (selectedFile: File) => {\n setFile(selectedFile);\n setError(null);\n setIsLoading(true);\n setPreflight(null);\n setIsJsonFile(false);\n setJsonDoc(null);\n\n try {\n if (selectedFile.name.endsWith('.json')) {\n setIsJsonFile(true);\n const text = await selectedFile.text();\n const parsed = JSON.parse(text);\n const parseCheck = PageDocumentSchema.safeParse(parsed);\n if (!parseCheck.success) {\n throw new Error('Invalid Page Document JSON structure.');\n }\n const valResult = validateDocument(parseCheck.data, { componentRegistry: registry });\n if (!valResult.valid) {\n const firstErr = valResult.errors[0];\n throw new Error(`Document validation error: ${firstErr.message} at ${firstErr.path}`);\n }\n setJsonDoc(parseCheck.data);\n } else {\n // Assume .stora / zip archive\n const arrayBuffer = await selectedFile.arrayBuffer();\n const bytes = new Uint8Array(arrayBuffer);\n setFileBytes(bytes);\n\n const report = await inspectPackage(bytes, {\n componentRegistry: registry,\n supportedCapabilities: defaultSupportedCapabilities,\n dependencyPolicy,\n });\n setPreflight(report);\n }\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n setError(msg);\n } finally {\n setIsLoading(false);\n }\n };\n\n const handlePolicyChange = async (newPolicy: MissingDependencyPolicy) => {\n setDependencyPolicy(newPolicy);\n if (fileBytes) {\n setIsLoading(true);\n try {\n const report = await inspectPackage(fileBytes, {\n componentRegistry: registry,\n supportedCapabilities: defaultSupportedCapabilities,\n dependencyPolicy: newPolicy,\n });\n setPreflight(report);\n } catch (err: unknown) {\n setError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsLoading(false);\n }\n }\n };\n\n const handleConfirmImport = async () => {\n if (isJsonFile && jsonDoc) {\n onImport(jsonDoc);\n handleClose();\n return;\n }\n\n if (!fileBytes) return;\n\n setIsLoading(true);\n setError(null);\n\n try {\n const result = await importPackage(fileBytes, {\n componentRegistry: registry,\n supportedCapabilities: defaultSupportedCapabilities,\n dependencyPolicy,\n });\n\n if (!result.success) {\n const errors = result.errors\n .filter((d) => d.severity === 'error')\n .map((d) => d.message)\n .join('; ');\n throw new Error(`Import failed: ${errors || result.diagnosticMessage || 'Unknown error'}`);\n }\n\n onImport(result.document);\n handleClose();\n } catch (err: unknown) {\n const msg = err instanceof Error ? err.message : String(err);\n setError(msg);\n } finally {\n setIsLoading(false);\n }\n };\n\n const hasBlockingErrors =\n preflight &&\n (!preflight.canImport || preflight.diagnostics.some((d) => d.severity === 'error'));\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm p-4\">\n <div className=\"bg-slate-900 border border-slate-700 rounded-xl shadow-2xl w-full max-w-xl flex flex-col overflow-hidden text-slate-100 animate-in fade-in zoom-in-95 duration-150\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-slate-950/80\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-5 h-5 text-blue-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4\" />\n </svg>\n <h2 className=\"font-semibold text-base\">Import .stora Package</h2>\n </div>\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"text-slate-400 hover:text-slate-200 p-1 rounded-lg hover:bg-slate-800 transition\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Content Body */}\n <div className=\"p-6 flex flex-col gap-4 max-h-[75vh] overflow-y-auto\">\n {/* Dropzone */}\n {!file && (\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n className=\"border-2 border-dashed border-slate-700 hover:border-blue-500 rounded-xl p-8 flex flex-col items-center justify-center gap-3 cursor-pointer bg-slate-950/40 hover:bg-slate-800/40 transition group\"\n >\n <div className=\"w-12 h-12 rounded-full bg-blue-500/10 flex items-center justify-center text-blue-400 group-hover:scale-110 transition\">\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n </div>\n <div className=\"text-center\">\n <p className=\"text-sm font-medium text-slate-200\">\n Click to select or drag and drop package\n </p>\n <p className=\"text-xs text-slate-400 mt-1\">Supports .stora portable archive and .json page document</p>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".stora,.zip,.json\"\n onChange={handleFileChange}\n className=\"hidden\"\n />\n </div>\n )}\n\n {/* Loading Indicator */}\n {isLoading && (\n <div className=\"flex items-center justify-center py-6 gap-3 text-sm text-slate-400\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n Inspecting package preflight...\n </div>\n )}\n\n {/* Error Banner */}\n {error && (\n <div className=\"p-3 bg-red-950/50 border border-red-800/80 rounded-lg text-xs text-red-300 flex items-start gap-2\">\n <svg className=\"w-4 h-4 text-red-400 shrink-0 mt-0.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n <div className=\"flex-1\">{error}</div>\n </div>\n )}\n\n {/* File Selected Badge */}\n {file && !isLoading && (\n <div className=\"flex items-center justify-between p-3 bg-slate-800/50 border border-slate-700/60 rounded-lg text-xs\">\n <div className=\"flex items-center gap-2 truncate\">\n <svg className=\"w-4 h-4 text-blue-400 shrink-0\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M5 8h14M5 8a2 2 0 110-4h14a2 2 0 110 4M5 8v10a2 2 0 002 2h10a2 2 0 002-2V8m-9 4h4\" />\n </svg>\n <span className=\"font-medium text-slate-200 truncate\">{file.name}</span>\n <span className=\"text-slate-400\">({(file.size / 1024).toFixed(1)} KB)</span>\n </div>\n <button\n type=\"button\"\n onClick={resetState}\n className=\"text-slate-400 hover:text-slate-200 px-2 py-1 rounded hover:bg-slate-700/50 transition\"\n >\n Change\n </button>\n </div>\n )}\n\n {/* JSON Preview */}\n {isJsonFile && jsonDoc && (\n <div className=\"bg-slate-950/60 border border-slate-800 rounded-lg p-4 flex flex-col gap-2 text-xs\">\n <div className=\"flex items-center gap-2 text-emerald-400 font-medium\">\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M9 12l2 2 4-4m6 2a9 9 0 11-18 0 9 9 0 0118 0z\" />\n </svg>\n Valid Page Document JSON\n </div>\n <div className=\"text-slate-300\">\n <span className=\"text-slate-400\">Title:</span> {jsonDoc.metadata?.title || 'Untitled'}\n </div>\n <div className=\"text-slate-300\">\n <span className=\"text-slate-400\">Schema Version:</span> {jsonDoc.version}\n </div>\n </div>\n )}\n\n {/* Preflight Report for .stora */}\n {preflight && (\n <div className=\"flex flex-col gap-3\">\n <div className=\"bg-slate-950/60 border border-slate-800 rounded-lg p-4 flex flex-col gap-3 text-xs\">\n <div className=\"flex items-center justify-between border-b border-slate-800/80 pb-2\">\n <div className=\"font-semibold text-slate-200\">Preflight Inspection Report</div>\n <div\n className={`px-2 py-0.5 rounded-full text-[11px] font-medium flex items-center gap-1.5 ${\n preflight.canImport && preflight.diagnostics.length === 0\n ? 'bg-emerald-500/10 text-emerald-400 border border-emerald-500/20'\n : preflight.canImport\n ? 'bg-amber-500/10 text-amber-400 border border-amber-500/20'\n : 'bg-red-500/10 text-red-400 border border-red-500/20'\n }`}\n >\n <span>{preflight.canImport ? (preflight.diagnostics.length === 0 ? 'Ready' : 'Warnings') : 'Blocked'}</span>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2 text-slate-300\">\n <div>\n <span className=\"text-slate-400\">Package Version:</span>{' '}\n {preflight.manifest?.packageVersion || '1.0.0'}\n </div>\n <div>\n <span className=\"text-slate-400\">Schema Version:</span>{' '}\n {preflight.manifest?.schemaVersion || preflight.sourceVersion || '1.0.0'}\n </div>\n <div>\n <span className=\"text-slate-400\">Assets:</span>{' '}\n {preflight.assetCount} item(s)\n </div>\n <div>\n <span className=\"text-slate-400\">Requires Migration:</span>{' '}\n {preflight.requiresMigration ? 'Yes' : 'No'}\n </div>\n </div>\n\n {/* Missing Components */}\n {preflight.missingComponents.length > 0 && (\n <div className=\"mt-2 p-3 bg-amber-950/40 border border-amber-800/60 rounded-lg flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5 text-amber-400 font-medium\">\n <span>Missing Custom Components ({preflight.missingComponents.length})</span>\n </div>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {preflight.missingComponents.map((c) => (\n <span\n key={c}\n className=\"px-1.5 py-0.5 bg-amber-900/40 border border-amber-700/50 rounded font-mono text-[10px] text-amber-200\"\n >\n {c}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Missing Capabilities */}\n {preflight.missingCapabilities.length > 0 && (\n <div className=\"mt-2 p-3 bg-amber-950/40 border border-amber-800/60 rounded-lg flex flex-col gap-1.5\">\n <div className=\"flex items-center gap-1.5 text-amber-400 font-medium\">\n <span>Missing Capabilities ({preflight.missingCapabilities.length})</span>\n </div>\n <div className=\"flex flex-wrap gap-1 mt-1\">\n {preflight.missingCapabilities.map((cap) => (\n <span\n key={cap}\n className=\"px-1.5 py-0.5 bg-amber-900/40 border border-amber-700/50 rounded font-mono text-[10px] text-amber-200\"\n >\n {cap}\n </span>\n ))}\n </div>\n </div>\n )}\n\n {/* Policy Selector if there are missing dependencies */}\n {(preflight.missingComponents.length > 0 || preflight.missingCapabilities.length > 0) && (\n <div className=\"mt-2 flex flex-col gap-1.5\">\n <label className=\"text-slate-400 text-[11px] font-medium\">Import Policy Decision:</label>\n <div className=\"grid grid-cols-2 gap-2\">\n <button\n type=\"button\"\n onClick={() => handlePolicyChange('import-with-placeholder')}\n className={`p-2 rounded-lg border text-left text-xs transition ${\n dependencyPolicy === 'import-with-placeholder'\n ? 'border-blue-500 bg-blue-500/10 text-blue-300 font-medium'\n : 'border-slate-800 bg-slate-900/50 text-slate-400 hover:border-slate-700'\n }`}\n >\n <div className=\"font-medium\">Use Placeholders</div>\n <p className=\"text-[10px] text-slate-400 mt-1\">\n Keep nodes intact for placeholder rendering\n </p>\n </button>\n\n <button\n type=\"button\"\n onClick={() => handlePolicyChange('cancel')}\n className={`p-2 rounded-lg border text-left text-xs transition ${\n dependencyPolicy === 'cancel'\n ? 'border-red-500 bg-red-500/10 text-red-300 font-medium'\n : 'border-slate-800 bg-slate-900/50 text-slate-400 hover:border-slate-700'\n }`}\n >\n <div className=\"font-medium\">Strict (Block)</div>\n <p className=\"text-[10px] text-slate-400 mt-1\">\n Abort import if any dependencies missing\n </p>\n </button>\n </div>\n </div>\n )}\n </div>\n </div>\n )}\n </div>\n\n {/* Footer Actions */}\n <div className=\"flex items-center justify-end gap-2 px-6 py-4 border-t border-slate-800 bg-slate-950/80\">\n <button\n type=\"button\"\n onClick={handleClose}\n className=\"px-4 py-2 rounded-lg text-xs text-slate-400 hover:text-slate-200 hover:bg-slate-800 transition\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={(!preflight && !jsonDoc) || !!hasBlockingErrors || isLoading}\n onClick={handleConfirmImport}\n className=\"px-4 py-2 rounded-lg text-xs font-medium bg-blue-600 hover:bg-blue-500 text-white disabled:opacity-40 disabled:cursor-not-allowed transition shadow-lg shadow-blue-500/20\"\n >\n Import to Editor\n </button>\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useMemo, useCallback } from 'react';\nimport type { PageDocument } from '@kubuild/schema';\nimport {\n generateSemanticHtml,\n generateDocumentCss,\n generateStandaloneHtml,\n} from '@kubuild/renderer';\nimport { useEditorStore } from './store';\nimport { downloadFile, sanitizeDocumentFilename } from './export-utils';\nimport { CodeHighlighter } from './code-highlighter';\n\nexport interface CodeViewerModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n document?: PageDocument;\n}\n\nexport type CodeTab = 'combined' | 'html' | 'css';\n\nexport const CodeViewerModal: React.FC<CodeViewerModalProps> = ({\n isOpen,\n onClose,\n title = 'Live Code Viewer',\n document: customDoc,\n}) => {\n const storeDoc = useEditorStore((state) => state.document);\n const doc = customDoc || storeDoc;\n const [activeTab, setActiveTab] = useState<CodeTab>('combined');\n const [copied, setCopied] = useState<boolean>(false);\n const [includeReset, setIncludeReset] = useState<boolean>(true);\n const [includeNodeClasses, setIncludeNodeClasses] = useState<boolean>(true);\n\n // Generate code based on active document and user options\n const htmlCode = useMemo(() => {\n return generateSemanticHtml(doc, {\n includeNodeClasses,\n indentSize: 2,\n });\n }, [doc, includeNodeClasses]);\n\n const cssCode = useMemo(() => {\n return generateDocumentCss(doc, {\n includeReset,\n });\n }, [doc, includeReset]);\n\n const combinedCode = useMemo(() => {\n return generateStandaloneHtml(doc, {\n htmlOptions: { includeNodeClasses, indentSize: 2 },\n cssOptions: { includeReset },\n });\n }, [doc, includeNodeClasses, includeReset]);\n\n const activeCode = useMemo(() => {\n switch (activeTab) {\n case 'html':\n return htmlCode;\n case 'css':\n return cssCode;\n case 'combined':\n default:\n return combinedCode;\n }\n }, [activeTab, htmlCode, cssCode, combinedCode]);\n\n const lineCount = useMemo(() => {\n return activeCode ? activeCode.split('\\n').length : 0;\n }, [activeCode]);\n\n const charCount = useMemo(() => {\n return activeCode.length;\n }, [activeCode]);\n\n const countNodes = useCallback((node: any): number => {\n let count = 1;\n if (node?.children && Array.isArray(node.children)) {\n for (const child of node.children) {\n count += countNodes(child);\n }\n }\n return count;\n }, []);\n\n const totalNodes = useMemo(() => {\n return countNodes(doc.document);\n }, [doc, countNodes]);\n\n const handleCopy = useCallback(async () => {\n try {\n await navigator.clipboard.writeText(activeCode);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n } catch {\n // Fallback for older browsers or restricted environments\n const textarea = window.document.createElement('textarea');\n textarea.value = activeCode;\n textarea.style.position = 'fixed';\n textarea.style.opacity = '0';\n window.document.body.appendChild(textarea);\n textarea.select();\n window.document.execCommand('copy');\n window.document.body.removeChild(textarea);\n setCopied(true);\n setTimeout(() => setCopied(false), 2000);\n }\n }, [activeCode]);\n\n const handleDownload = useCallback(() => {\n const docTitle = doc.metadata?.title || 'page';\n if (activeTab === 'css') {\n const filename = sanitizeDocumentFilename(docTitle, 'css');\n downloadFile(cssCode, filename, 'text/css');\n } else {\n const filename = sanitizeDocumentFilename(docTitle, 'html');\n downloadFile(activeCode, filename, 'text/html');\n }\n }, [activeTab, activeCode, cssCode, doc.metadata?.title]);\n\n // Handle ESC key to close\n React.useEffect(() => {\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && isOpen) {\n onClose();\n }\n };\n window.addEventListener('keydown', handleKeyDown);\n return () => window.removeEventListener('keydown', handleKeyDown);\n }, [isOpen, onClose]);\n\n if (!isOpen) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"code-viewer-title\"\n className=\"fixed inset-0 z-50 flex items-center justify-center p-4 sm:p-6 bg-black/60 backdrop-blur-xs animate-in fade-in duration-150\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div className=\"relative w-full max-w-5xl h-[85vh] flex flex-col bg-slate-900 border border-slate-700/80 rounded-2xl shadow-2xl overflow-hidden text-slate-100 font-sans\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-slate-900/90 shrink-0\">\n <div className=\"flex items-center gap-3\">\n <div className=\"w-8 h-8 rounded-lg bg-blue-500/10 border border-blue-500/30 flex items-center justify-center text-blue-400 font-mono text-xs font-semibold\">\n <>\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h2 id=\"code-viewer-title\" className=\"text-base font-semibold text-white tracking-tight\">\n {title}\n </h2>\n <span className=\"flex items-center gap-1 text-[10px] font-medium px-2 py-0.5 rounded-full bg-emerald-500/10 text-emerald-400 border border-emerald-500/20\">\n <span className=\"w-1.5 h-1.5 rounded-full bg-emerald-400 animate-pulse\" />\n Live Sync\n </span>\n </div>\n <p className=\"text-xs text-slate-400\">\n Production-ready clean semantic HTML & structured CSS\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {/* Copy Button */}\n <button\n type=\"button\"\n onClick={handleCopy}\n className={`flex items-center gap-1.5 text-xs font-medium px-3.5 py-1.5 rounded-lg border transition shadow-xs ${\n copied\n ? 'bg-emerald-600 border-emerald-500 text-white'\n : 'bg-blue-600 hover:bg-blue-500 border-blue-500 text-white active:scale-95'\n }`}\n title=\"Copy code to clipboard\"\n >\n {copied ? (\n <>\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2.5\">\n <polyline points=\"20 6 9 17 4 12\" />\n </svg>\n <span>Copied!</span>\n </>\n ) : (\n <>\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"14\" height=\"14\" x=\"8\" y=\"8\" rx=\"2\" ry=\"2\" />\n <path d=\"M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2\" />\n </svg>\n <span>Copy Code</span>\n </>\n )}\n </button>\n\n {/* Download Button */}\n <button\n type=\"button\"\n onClick={handleDownload}\n className=\"flex items-center gap-1.5 text-xs font-medium px-3 py-1.5 rounded-lg border border-slate-700 bg-slate-800 hover:bg-slate-700/80 text-slate-200 hover:text-white transition\"\n title={`Download as .${activeTab === 'css' ? 'css' : 'html'}`}\n >\n <svg className=\"w-3.5 h-3.5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n <span>Download</span>\n </button>\n\n {/* Close Button */}\n <button\n type=\"button\"\n onClick={onClose}\n className=\"w-8 h-8 rounded-lg flex items-center justify-center text-slate-400 hover:text-white hover:bg-slate-800 transition\"\n title=\"Close modal (Esc)\"\n aria-label=\"Close modal\"\n >\n <svg className=\"w-5 h-5\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </button>\n </div>\n </div>\n\n {/* Tab & Controls Bar */}\n <div className=\"flex flex-wrap items-center justify-between px-6 py-2.5 border-b border-slate-800 bg-slate-900/60 shrink-0 gap-3\">\n {/* Tabs */}\n <div className=\"flex items-center gap-1 bg-slate-950/60 p-1 rounded-lg border border-slate-800\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('combined')}\n className={`px-3 py-1 text-xs font-medium rounded-md transition ${\n activeTab === 'combined'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200 hover:bg-slate-800/50'\n }`}\n >\n HTML & CSS\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('html')}\n className={`px-3 py-1 text-xs font-medium rounded-md transition ${\n activeTab === 'html'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200 hover:bg-slate-800/50'\n }`}\n >\n Semantic HTML\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('css')}\n className={`px-3 py-1 text-xs font-medium rounded-md transition ${\n activeTab === 'css'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200 hover:bg-slate-800/50'\n }`}\n >\n Structured CSS\n </button>\n </div>\n\n {/* Options Switches */}\n <div className=\"flex items-center gap-4 text-xs text-slate-400\">\n {activeTab !== 'html' && (\n <label className=\"flex items-center gap-1.5 cursor-pointer hover:text-slate-300 transition\">\n <input\n type=\"checkbox\"\n checked={includeReset}\n onChange={(e) => setIncludeReset(e.target.checked)}\n className=\"rounded border-slate-700 bg-slate-800 text-blue-600 focus:ring-0 focus:ring-offset-0\"\n />\n <span>Include CSS Reset</span>\n </label>\n )}\n\n {activeTab !== 'css' && (\n <label className=\"flex items-center gap-1.5 cursor-pointer hover:text-slate-300 transition\">\n <input\n type=\"checkbox\"\n checked={includeNodeClasses}\n onChange={(e) => setIncludeNodeClasses(e.target.checked)}\n className=\"rounded border-slate-700 bg-slate-800 text-blue-600 focus:ring-0 focus:ring-offset-0\"\n />\n <span>Include Node Classes</span>\n </label>\n )}\n </div>\n </div>\n\n {/* Code Content View */}\n <div className=\"flex-1 min-h-0 bg-slate-950 overflow-auto font-mono text-xs text-slate-200 flex select-text\">\n {/* Line Numbers */}\n <div className=\"py-4 pl-4 pr-3 select-none text-right text-slate-600 border-r border-slate-800/80 bg-slate-950/80 shrink-0 sticky left-0\">\n {Array.from({ length: lineCount }, (_, i) => (\n <div key={i + 1} className=\"leading-5 h-5 font-mono text-[11px]\">\n {i + 1}\n </div>\n ))}\n </div>\n\n {/* Syntax Highlighted Code Area */}\n <div className=\"flex-1 p-4 overflow-x-auto\">\n <CodeHighlighter code={activeCode} mode={activeTab} />\n </div>\n </div>\n\n {/* Footer info bar */}\n <div className=\"flex items-center justify-between px-6 py-2.5 border-t border-slate-800 bg-slate-900 text-xs text-slate-400 shrink-0\">\n <div className=\"flex items-center gap-4\">\n <span>\n <strong className=\"text-slate-300 font-semibold\">{totalNodes}</strong> Elements\n </span>\n <span className=\"w-1 h-1 rounded-full bg-slate-700\" />\n <span>\n <strong className=\"text-slate-300 font-semibold\">{lineCount}</strong> Lines\n </span>\n <span className=\"w-1 h-1 rounded-full bg-slate-700\" />\n <span>\n <strong className=\"text-slate-300 font-semibold\">{(charCount / 1024).toFixed(1)}</strong> KB\n </span>\n </div>\n\n <div className=\"text-[11px] text-slate-500\">\n Format: {activeTab === 'combined' ? 'Single-file HTML document' : activeTab === 'html' ? 'Semantic HTML markup' : 'Clean CSS stylesheet'}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { PageDocument } from '@kubuild/schema';\nimport { exportPackage, ExportPackageOptions } from '@kubuild/core';\n\n/**\n * Clean a page title into a safe download filename slug\n */\nexport function sanitizeDocumentFilename(name: string, extension: string): string {\n const clean = name\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, '-')\n .replace(/-+/g, '-')\n .replace(/^-|-$/g, '');\n return `${clean || 'page'}.${extension.replace(/^\\./, '')}`;\n}\n\n/**\n * Triggers a browser download of in-memory binary or text data.\n */\nexport function downloadFile(\n data: Uint8Array | ArrayBuffer | string,\n filename: string,\n mimeType: string = 'application/octet-stream'\n): void {\n if (typeof window === 'undefined' || typeof document === 'undefined') {\n return;\n }\n\n const blob = data instanceof Blob ? data : new Blob([data as BlobPart], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n setTimeout(() => URL.revokeObjectURL(url), 1000);\n}\n\n/**\n * Exports a PageDocument as a .stora portable archive and initiates browser download.\n */\nexport async function downloadDocumentAsStora(\n doc: PageDocument,\n filename?: string,\n options?: ExportPackageOptions\n): Promise<Uint8Array> {\n const result = await exportPackage(doc, {\n allowExternalFallback: true,\n ...options,\n });\n if (!result.success) {\n const errorDetails = result.errors.map((e) => `${e.path}: ${e.message}`).join(', ');\n throw new Error(`Export failed: ${errorDetails || result.diagnosticMessage || 'Unknown error'}`);\n }\n\n const name = filename || sanitizeDocumentFilename(doc.metadata?.title || 'page', 'stora');\n downloadFile(result.archive, name, 'application/vnd.stora.package+zip');\n return result.archive;\n}\n\n/**\n * Exports a PageDocument as a formatted JSON document and initiates browser download.\n */\nexport function downloadDocumentAsJson(doc: PageDocument, filename?: string): void {\n const name = filename || sanitizeDocumentFilename(doc.metadata?.title || 'page', 'json');\n const jsonStr = JSON.stringify(doc, null, 2);\n downloadFile(jsonStr, name, 'application/json');\n}\n","import React from 'react';\n\nexport type LanguageMode = 'combined' | 'html' | 'css';\n\ninterface Token {\n type:\n | 'plain'\n | 'tag-name'\n | 'tag-bracket'\n | 'attr-name'\n | 'attr-equal'\n | 'attr-value'\n | 'comment'\n | 'doctype'\n | 'css-selector-class'\n | 'css-selector-id'\n | 'css-selector-elem'\n | 'css-pseudo'\n | 'css-property'\n | 'css-value-number'\n | 'css-value-color'\n | 'css-value-keyword'\n | 'css-value-string'\n | 'css-value-important'\n | 'css-atrule'\n | 'css-punctuation'\n | 'css-function';\n text: string;\n}\n\nconst TOKEN_STYLES: Record<Token['type'], string> = {\n plain: 'text-slate-200',\n 'tag-name': 'text-sky-400 font-medium',\n 'tag-bracket': 'text-slate-500',\n 'attr-name': 'text-amber-300',\n 'attr-equal': 'text-slate-400',\n 'attr-value': 'text-emerald-400',\n comment: 'text-slate-500 italic',\n doctype: 'text-indigo-400 font-semibold',\n 'css-selector-class': 'text-amber-300 font-medium',\n 'css-selector-id': 'text-amber-400 font-medium',\n 'css-selector-elem': 'text-sky-400',\n 'css-pseudo': 'text-indigo-300',\n 'css-property': 'text-cyan-300',\n 'css-value-number': 'text-emerald-300 font-mono',\n 'css-value-color': 'text-yellow-300',\n 'css-value-keyword': 'text-purple-300',\n 'css-value-string': 'text-emerald-400',\n 'css-value-important': 'text-rose-400 font-semibold',\n 'css-atrule': 'text-purple-400 font-semibold',\n 'css-punctuation': 'text-slate-400',\n 'css-function': 'text-blue-300',\n};\n\nconst CSS_KEYWORDS = new Set([\n 'block', 'inline', 'inline-block', 'flex', 'inline-flex', 'grid', 'inline-grid',\n 'none', 'inherit', 'initial', 'unset', 'revert', 'auto', 'normal', 'bold', 'bolder',\n 'lighter', 'italic', 'center', 'left', 'right', 'justify', 'start', 'end',\n 'flex-start', 'flex-end', 'space-between', 'space-around', 'space-evenly', 'stretch',\n 'baseline', 'row', 'row-reverse', 'column', 'column-reverse', 'wrap', 'nowrap',\n 'wrap-reverse', 'relative', 'absolute', 'fixed', 'sticky', 'static', 'hidden',\n 'visible', 'scroll', 'border-box', 'content-box', 'solid', 'dashed', 'dotted',\n 'double', 'groove', 'ridge', 'inset', 'outset', 'transparent', 'currentColor',\n 'antialiased', 'subpixel-antialiased', 'pointer', 'default', 'not-allowed',\n 'crosshair', 'move', 'text', 'wait', 'grab', 'grabbing', 'nowrap', 'pre', 'pre-wrap',\n 'pre-line', 'break-word', 'break-all', 'contain', 'cover', 'fill', 'scale-down',\n]);\n\nconst HTML_TAG_NAMES = new Set([\n 'html', 'head', 'body', 'title', 'meta', 'link', 'style', 'script', 'base',\n 'div', 'span', 'p', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'section', 'article',\n 'aside', 'header', 'footer', 'nav', 'main', 'figure', 'figcaption', 'ul', 'ol',\n 'li', 'a', 'button', 'input', 'textarea', 'select', 'option', 'form', 'label',\n 'img', 'picture', 'video', 'audio', 'source', 'iframe', 'canvas', 'svg', 'path',\n 'circle', 'rect', 'line', 'polyline', 'polygon', 'g', 'defs', 'clippath', 'table',\n 'thead', 'tbody', 'tfoot', 'tr', 'th', 'td', 'blockquote', 'hr', 'br', 'strong',\n 'em', 'code', 'pre', 'small', 'sub', 'sup', 'i', 'b', 'time', 'address', 'details',\n 'summary', 'dialog',\n]);\n\n/**\n * Tokenize a single line of CSS\n */\nfunction tokenizeCssLine(line: string, inBlockRef: { inBlock: boolean }): Token[] {\n const tokens: Token[] = [];\n let i = 0;\n const len = line.length;\n\n while (i < len) {\n // 1. Whitespace\n if (/\\s/.test(line[i])) {\n let ws = '';\n while (i < len && /\\s/.test(line[i])) {\n ws += line[i++];\n }\n tokens.push({ type: 'plain', text: ws });\n continue;\n }\n\n // 2. CSS Comments: /* ... */\n if (line.slice(i, i + 2) === '/*') {\n const closeIdx = line.indexOf('*/', i + 2);\n if (closeIdx !== -1) {\n tokens.push({ type: 'comment', text: line.slice(i, closeIdx + 2) });\n i = closeIdx + 2;\n } else {\n tokens.push({ type: 'comment', text: line.slice(i) });\n i = len;\n }\n continue;\n }\n\n // 3. At-rules (e.g. @media, @keyframes)\n if (line[i] === '@') {\n let atrule = '';\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i] === '@' ? 'a' : line[i])) {\n atrule += line[i++];\n }\n tokens.push({ type: 'css-atrule', text: atrule });\n continue;\n }\n\n // 4. Braces & Punctuation\n if (line[i] === '{') {\n inBlockRef.inBlock = true;\n tokens.push({ type: 'css-punctuation', text: '{' });\n i++;\n continue;\n }\n if (line[i] === '}') {\n inBlockRef.inBlock = false;\n tokens.push({ type: 'css-punctuation', text: '}' });\n i++;\n continue;\n }\n if (line[i] === ';' || line[i] === ',') {\n tokens.push({ type: 'css-punctuation', text: line[i] });\n i++;\n continue;\n }\n\n // 5. Inside declaration block { ... }\n if (inBlockRef.inBlock) {\n // String literals inside values\n if (line[i] === '\"' || line[i] === \"'\") {\n const quote = line[i];\n let str = quote;\n i++;\n while (i < len && line[i] !== quote) {\n if (line[i] === '\\\\' && i + 1 < len) {\n str += line[i++];\n }\n str += line[i++];\n }\n if (i < len) str += line[i++];\n tokens.push({ type: 'css-value-string', text: str });\n continue;\n }\n\n // Colon ':' separator\n if (line[i] === ':') {\n tokens.push({ type: 'css-punctuation', text: ':' });\n i++;\n continue;\n }\n\n // !important\n if (line.slice(i, i + 10).toLowerCase() === '!important') {\n tokens.push({ type: 'css-value-important', text: line.slice(i, i + 10) });\n i += 10;\n continue;\n }\n\n // Hex colors: #fff, #1a2b3c, etc.\n if (line[i] === '#') {\n let hex = '#';\n i++;\n while (i < len && /[0-9a-fA-F]/.test(line[i])) {\n hex += line[i++];\n }\n tokens.push({ type: 'css-value-color', text: hex });\n continue;\n }\n\n // Function calls: rgb(), rgba(), hsl(), var(), calc(), url()\n const fnMatch = line.slice(i).match(/^([a-zA-Z_-][a-zA-Z0-9_-]*)\\(/);\n if (fnMatch) {\n tokens.push({ type: 'css-function', text: fnMatch[1] });\n tokens.push({ type: 'css-punctuation', text: '(' });\n i += fnMatch[0].length;\n continue;\n }\n\n // Numbers & Units (e.g. 100%, 16px, 1.5, 0, -2rem)\n const numMatch = line.slice(i).match(/^-?\\d+(\\.\\d+)?(px|rem|em|%|vh|vw|vmin|vmax|s|ms|deg|fr|ch|ex)?/);\n if (numMatch && numMatch[0].length > 0) {\n tokens.push({ type: 'css-value-number', text: numMatch[0] });\n i += numMatch[0].length;\n continue;\n }\n\n // Identifiers: Property names or keyword values\n const identMatch = line.slice(i).match(/^-?[a-zA-Z_-][a-zA-Z0-9_-]*/);\n if (identMatch) {\n const ident = identMatch[0];\n // Peek forward: if next non-ws char before ';' or '}' is ':', it's a property name\n const rest = line.slice(i + ident.length);\n const nextColon = rest.match(/^\\s*:/);\n if (nextColon) {\n tokens.push({ type: 'css-property', text: ident });\n } else if (CSS_KEYWORDS.has(ident.toLowerCase())) {\n tokens.push({ type: 'css-value-keyword', text: ident });\n } else {\n tokens.push({ type: 'plain', text: ident });\n }\n i += ident.length;\n continue;\n }\n\n // Fallback char\n tokens.push({ type: 'plain', text: line[i++] });\n continue;\n }\n\n // 6. Outside declaration block: Selectors\n // Class selector (.className)\n if (line[i] === '.') {\n let cls = '.';\n i++;\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n cls += line[i++];\n }\n tokens.push({ type: 'css-selector-class', text: cls });\n continue;\n }\n\n // ID selector (#idName)\n if (line[i] === '#') {\n let idSel = '#';\n i++;\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n idSel += line[i++];\n }\n tokens.push({ type: 'css-selector-id', text: idSel });\n continue;\n }\n\n // Pseudo class or pseudo element (:hover, ::before)\n if (line[i] === ':') {\n let pseudo = ':';\n i++;\n if (i < len && line[i] === ':') {\n pseudo += ':';\n i++;\n }\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n pseudo += line[i++];\n }\n tokens.push({ type: 'css-pseudo', text: pseudo });\n continue;\n }\n\n // Element or Universal selector (* or div or body)\n if (line[i] === '*') {\n tokens.push({ type: 'css-selector-elem', text: '*' });\n i++;\n continue;\n }\n\n const selElemMatch = line.slice(i).match(/^[a-zA-Z0-9_-]+/);\n if (selElemMatch) {\n tokens.push({ type: 'css-selector-elem', text: selElemMatch[0] });\n i += selElemMatch[0].length;\n continue;\n }\n\n // Fallback char in selector (e.g. '>', '+', '~')\n tokens.push({ type: 'css-punctuation', text: line[i++] });\n }\n\n return tokens;\n}\n\n/**\n * Tokenize a single line of HTML\n */\nfunction tokenizeHtmlLine(\n line: string,\n state: { inStyleTag: boolean; inCssBlock: boolean; inHtmlComment: boolean }\n): Token[] {\n // If we are inside multi-line HTML comment\n if (state.inHtmlComment) {\n const endIdx = line.indexOf('-->');\n if (endIdx !== -1) {\n state.inHtmlComment = false;\n const commentPart = line.slice(0, endIdx + 3);\n const rest = line.slice(endIdx + 3);\n return [\n { type: 'comment', text: commentPart },\n ...tokenizeHtmlLine(rest, state),\n ];\n }\n return [{ type: 'comment', text: line }];\n }\n\n // If inside <style> block, parse as CSS until </style>\n if (state.inStyleTag) {\n const closeStyleIdx = line.indexOf('</style>');\n if (closeStyleIdx !== -1) {\n const cssPart = line.slice(0, closeStyleIdx);\n const closeTag = '</style>';\n const rest = line.slice(closeStyleIdx + closeTag.length);\n state.inStyleTag = false;\n\n const cssTokens = tokenizeCssLine(cssPart, { inBlock: state.inCssBlock });\n const tagTokens: Token[] = [\n { type: 'tag-bracket', text: '</' },\n { type: 'tag-name', text: 'style' },\n { type: 'tag-bracket', text: '>' },\n ];\n const restTokens = tokenizeHtmlLine(rest, state);\n return [...cssTokens, ...tagTokens, ...restTokens];\n }\n const blockRef = { inBlock: state.inCssBlock };\n const tokens = tokenizeCssLine(line, blockRef);\n state.inCssBlock = blockRef.inBlock;\n return tokens;\n }\n\n const tokens: Token[] = [];\n let i = 0;\n const len = line.length;\n\n while (i < len) {\n // 1. HTML Comment: <!-- ... -->\n if (line.slice(i, i + 4) === '<!--') {\n const closeIdx = line.indexOf('-->', i + 4);\n if (closeIdx !== -1) {\n tokens.push({ type: 'comment', text: line.slice(i, closeIdx + 3) });\n i = closeIdx + 3;\n } else {\n state.inHtmlComment = true;\n tokens.push({ type: 'comment', text: line.slice(i) });\n i = len;\n }\n continue;\n }\n\n // 2. DOCTYPE declaration: <!DOCTYPE html>\n if (line.slice(i, i + 9).toUpperCase() === '<!DOCTYPE') {\n const closeIdx = line.indexOf('>', i);\n if (closeIdx !== -1) {\n tokens.push({ type: 'doctype', text: line.slice(i, closeIdx + 1) });\n i = closeIdx + 1;\n } else {\n tokens.push({ type: 'doctype', text: line.slice(i) });\n i = len;\n }\n continue;\n }\n\n // 3. HTML Tags: <tag or </tag\n if (line[i] === '<') {\n let isClosing = false;\n let startIdx = i;\n i++; // consume '<'\n\n if (i < len && line[i] === '/') {\n isClosing = true;\n i++; // consume '/'\n }\n\n // Tag name\n let tagName = '';\n while (i < len && /[a-zA-Z0-9_-]/.test(line[i])) {\n tagName += line[i++];\n }\n\n tokens.push({\n type: 'tag-bracket',\n text: isClosing ? '</' : '<',\n });\n\n if (tagName) {\n tokens.push({\n type: 'tag-name',\n text: tagName,\n });\n }\n\n // If it's an opening <style> tag, track state\n if (!isClosing && tagName.toLowerCase() === 'style') {\n state.inStyleTag = true;\n }\n\n // Parse attributes inside tag until '>' or '/>'\n while (i < len && line[i] !== '>') {\n if (line.slice(i, i + 2) === '/>') {\n tokens.push({ type: 'tag-bracket', text: '/>' });\n i += 2;\n break;\n }\n\n // Whitespace in tag\n if (/\\s/.test(line[i])) {\n let ws = '';\n while (i < len && /\\s/.test(line[i])) ws += line[i++];\n tokens.push({ type: 'plain', text: ws });\n continue;\n }\n\n // Attribute name\n const attrMatch = line.slice(i).match(/^[a-zA-Z0-9_:-]+/);\n if (attrMatch) {\n tokens.push({ type: 'attr-name', text: attrMatch[0] });\n i += attrMatch[0].length;\n\n // Check if followed by '='\n let wsBeforeEq = '';\n while (i < len && /\\s/.test(line[i])) wsBeforeEq += line[i++];\n\n if (i < len && line[i] === '=') {\n if (wsBeforeEq) tokens.push({ type: 'plain', text: wsBeforeEq });\n tokens.push({ type: 'attr-equal', text: '=' });\n i++;\n\n // Whitespace after '='\n let wsAfterEq = '';\n while (i < len && /\\s/.test(line[i])) wsAfterEq += line[i++];\n if (wsAfterEq) tokens.push({ type: 'plain', text: wsAfterEq });\n\n // Attribute value\n if (i < len && (line[i] === '\"' || line[i] === \"'\")) {\n const quote = line[i++];\n let val = quote;\n while (i < len && line[i] !== quote) {\n val += line[i++];\n }\n if (i < len) val += line[i++]; // consume closing quote\n tokens.push({ type: 'attr-value', text: val });\n } else {\n // Unquoted attr value\n let unquoted = '';\n while (i < len && !/[\\s>]/.test(line[i])) {\n unquoted += line[i++];\n }\n if (unquoted) {\n tokens.push({ type: 'attr-value', text: unquoted });\n }\n }\n }\n continue;\n }\n\n // Fallback character inside tag\n tokens.push({ type: 'plain', text: line[i++] });\n }\n\n // Closing '>'\n if (i < len && line[i] === '>') {\n tokens.push({ type: 'tag-bracket', text: '>' });\n i++;\n }\n continue;\n }\n\n // 4. Plain text between HTML tags\n let text = '';\n while (i < len && line[i] !== '<') {\n text += line[i++];\n }\n if (text) {\n tokens.push({ type: 'plain', text });\n }\n }\n\n return tokens;\n}\n\n/**\n * Tokenize entire code string line-by-line according to the language mode\n */\nexport function tokenizeCode(code: string, mode: LanguageMode): Token[][] {\n if (!code) return [];\n const lines = code.split('\\n');\n\n if (mode === 'css') {\n const blockRef = { inBlock: false };\n return lines.map((line) => tokenizeCssLine(line, blockRef));\n }\n\n // HTML or Combined\n const state = {\n inStyleTag: false,\n inCssBlock: false,\n inHtmlComment: false,\n };\n\n return lines.map((line) => tokenizeHtmlLine(line, state));\n}\n\nexport interface CodeHighlighterProps {\n code: string;\n mode: LanguageMode;\n}\n\n/**\n * Performant, rich syntax-highlighted code display\n */\nexport const CodeHighlighter: React.FC<CodeHighlighterProps> = ({ code, mode }) => {\n const tokenizedLines = React.useMemo(() => tokenizeCode(code, mode), [code, mode]);\n\n return (\n <div className=\"flex-1 font-mono text-[12px] leading-5 whitespace-pre\">\n {tokenizedLines.map((lineTokens, lineIdx) => (\n <div key={lineIdx} className=\"h-5 leading-5 min-w-full\">\n {lineTokens.length === 0 ? (\n <span className=\"inline-block\"> </span>\n ) : (\n lineTokens.map((tok, tokIdx) => (\n <span key={tokIdx} className={TOKEN_STYLES[tok.type]}>\n {tok.text}\n </span>\n ))\n )}\n </div>\n ))}\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport { ComponentRegistry, ComponentFieldDefinition, isBindableField } from '@kubuild/components';\nimport { findNodeById, findNodeLocation } from '@kubuild/core';\nimport { isVariableBinding, PageDocument, AnimationConfig } from '@kubuild/schema';\nimport { useEditorStore, Viewport } from './store';\nimport { VariableBindingControl, toBindingValue } from './variable-picker';\nimport { AssetManagerModal } from './asset-manager-modal';\nimport { TableSpreadsheetEditor } from './table-spreadsheet-editor';\nimport { BoxModelEditor } from './box-model-editor';\nimport { StyleManagerAccordion } from './style-manager-accordion';\nimport { TraitsPanel } from './traits-panel';\nimport { ComponentIcon } from './icons';\nimport { replayNodeAnimation } from '@kubuild/renderer';\nimport { AlertTriangle, Palette, Settings, Crosshair, Trash2, X } from 'lucide-react';\n\nimport { StyleSectorId } from './style-manager-accordion';\nimport { EditorInspectorConfig } from './config';\n\nexport interface InspectorPanelProps {\n registry: ComponentRegistry;\n className?: string;\n document?: PageDocument;\n selectedNodeId?: string | null;\n config?: EditorInspectorConfig;\n}\n\nconst SPACING_FIELDS: Array<{ name: string; label: string }> = [\n { name: 'marginTop', label: 'Margin Top' },\n { name: 'marginRight', label: 'Margin Right' },\n { name: 'marginBottom', label: 'Margin Bottom' },\n { name: 'marginLeft', label: 'Margin Left' },\n { name: 'paddingTop', label: 'Padding Top' },\n { name: 'paddingRight', label: 'Padding Right' },\n { name: 'paddingBottom', label: 'Padding Bottom' },\n { name: 'paddingLeft', label: 'Padding Left' },\n];\n\nconst SPACING_UNITS = ['px', 'rem', '%', 'em', 'vh', 'vw', 'auto'] as const;\ntype SpacingUnit = (typeof SPACING_UNITS)[number];\n\nfunction parseSpacingValue(val: unknown): { num: string; unit: SpacingUnit } {\n if (typeof val === 'number') {\n return { num: String(val), unit: 'px' };\n }\n if (typeof val !== 'string' || val.trim() === '') {\n return { num: '', unit: 'px' };\n }\n const str = val.trim();\n if (str.toLowerCase() === 'auto') {\n return { num: 'auto', unit: 'auto' };\n }\n const match = str.match(/^(-?\\d*\\.?\\d+)\\s*(px|rem|%|em|vh|vw)?$/i);\n if (match) {\n const unitMatch = (match[2]?.toLowerCase() || 'px') as SpacingUnit;\n return {\n num: match[1],\n unit: (SPACING_UNITS as readonly string[]).includes(unitMatch) ? unitMatch : 'px',\n };\n }\n return { num: str, unit: 'px' };\n}\n\n// Desktop edits target the 'base' style layer (every ComponentDefinition ships its\n// baseline appearance under 'base'; nothing populates a distinct 'desktop' key today).\nfunction styleBreakpointFor(viewport: Viewport): 'base' | 'tablet' | 'mobile' {\n return viewport === 'desktop' ? 'base' : viewport;\n}\n\nfunction ErrorText({ message }: { message: string | null | undefined }) {\n if (!message) return null;\n return (\n <div role=\"alert\" className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1 mt-1\">\n {message}\n </div>\n );\n}\n\ninterface StringPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLInputElement>) => void;\n}\n\nconst StringPropControl: React.FC<StringPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n onKeyDown,\n}) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextVal = e.target.value;\n setText(nextVal);\n onCommit(field, nextVal, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n onCommit(field, text, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onCommit(field, text, false);\n };\n\n return (\n <input\n type=\"text\"\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n placeholder={field.defaultValue !== undefined ? String(field.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface MediaSrcPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n onOpenAssetPicker: () => void;\n}\n\nconst MediaSrcPropControl: React.FC<MediaSrcPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n onOpenAssetPicker,\n}) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const nextVal = e.target.value;\n setText(nextVal);\n onCommit(field, nextVal, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n onCommit(field, text, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onCommit(field, text, false);\n };\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n setText(dataUrl);\n onCommit(field, dataUrl, true);\n };\n reader.readAsDataURL(file);\n e.target.value = '';\n };\n\n const handleClear = () => {\n setText('');\n onCommit(field, '', true);\n };\n\n const isLocalFilePath = text.trim().startsWith('file:') || /^[a-zA-Z]:\\\\/.test(text.trim());\n const isDataUrl = text.startsWith('data:image/');\n const hasPreview = text.trim().length > 0 && (isDataUrl || text.startsWith('http://') || text.startsWith('https://') || text.startsWith('blob:'));\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileUpload}\n accept=\"image/png, image/jpeg, image/jpg, image/webp, image/svg+xml, image/gif, image/avif\"\n className=\"hidden\"\n />\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder=\"https://... or upload local image\"\n className=\"flex-1 min-w-0 text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 font-mono text-[11px]\"\n />\n <button\n type=\"button\"\n title=\"Upload local image from device\"\n aria-label=\"Upload local image from device\"\n onClick={() => fileInputRef.current?.click()}\n className=\"shrink-0 p-1.5 rounded border border-slate-300 bg-white text-slate-600 hover:text-blue-600 hover:border-blue-400 hover:bg-blue-50/50 transition flex items-center gap-1 text-xs font-medium cursor-pointer\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n <span className=\"text-[11px]\">Upload</span>\n </button>\n <button\n type=\"button\"\n title=\"Browse Asset Gallery\"\n aria-label=\"Browse Asset Gallery\"\n onClick={onOpenAssetPicker}\n className=\"shrink-0 p-1.5 rounded border border-slate-300 bg-white text-slate-600 hover:text-blue-600 hover:border-blue-400 hover:bg-blue-50/50 transition cursor-pointer\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\" />\n </svg>\n </button>\n </div>\n\n {hasPreview && (\n <div className=\"flex items-center gap-2 bg-slate-50 border border-slate-200 rounded p-1.5\">\n <img\n src={text}\n alt=\"Preview\"\n className=\"w-8 h-8 object-cover rounded border border-slate-300 bg-white\"\n onError={(e) => {\n (e.target as HTMLElement).style.display = 'none';\n }}\n />\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <span className=\"text-[11px] font-medium text-slate-700 truncate\">\n {isDataUrl ? 'Local Image (Embedded)' : text}\n </span>\n <span className=\"text-[10px] text-slate-400\">\n {isDataUrl ? 'Base64 image data' : 'URL / Asset'}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={handleClear}\n title=\"Clear image\"\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition cursor-pointer text-xs\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n {isLocalFilePath && (\n <div className=\"text-[11px] text-amber-700 bg-amber-50 border border-amber-200 rounded p-1.5 leading-tight\">\n Browsers cannot open direct local paths (<code className=\"font-mono\">file://</code>). Click <strong>Upload</strong> above to select and load the local image directly.\n </div>\n )}\n </div>\n );\n};\n\n\ninterface TextAreaPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n onKeyDown?: (e: React.KeyboardEvent<HTMLTextAreaElement>) => void;\n}\n\nconst TextAreaPropControl: React.FC<TextAreaPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n onKeyDown,\n}) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const nextVal = e.target.value;\n setText(nextVal);\n onCommit(field, nextVal, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n onCommit(field, text, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n onCommit(field, text, false);\n };\n\n return (\n <textarea\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n onKeyDown={onKeyDown}\n rows={3}\n placeholder={field.defaultValue !== undefined ? String(field.defaultValue) : ''}\n className=\"w-full text-xs font-mono bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface NumberPropControlProps {\n nodeId: string;\n field: ComponentFieldDefinition;\n value: unknown;\n onCommit: (field: ComponentFieldDefinition, value: unknown, isBlur: boolean) => void;\n setError: (error: string | null) => void;\n}\n\nconst NumberPropControl: React.FC<NumberPropControlProps> = ({\n nodeId,\n field,\n value,\n onCommit,\n setError,\n}) => {\n const valueStr = typeof value === 'number' ? String(value) : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'number' ? String(value) : '');\n }\n }, [value, nodeId, field.name]);\n\n const handleChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setText(val);\n if (val === '' || val === '-') {\n setError(null);\n return;\n }\n const parsed = Number(val);\n if (Number.isNaN(parsed)) {\n setError('Must be a number.');\n return;\n }\n setError(null);\n onCommit(field, parsed, false);\n };\n\n const handleBlur = () => {\n isFocusedRef.current = false;\n if (text === '') {\n onCommit(field, undefined, true);\n return;\n }\n const parsed = Number(text);\n if (Number.isNaN(parsed)) {\n setError('Must be a number.');\n return;\n }\n onCommit(field, parsed, true);\n };\n\n const handleFocus = () => {\n isFocusedRef.current = true;\n setError(null);\n };\n\n return (\n <input\n type=\"number\"\n value={text}\n onFocus={handleFocus}\n onChange={handleChange}\n onBlur={handleBlur}\n placeholder={field.defaultValue !== undefined ? String(field.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface SpacingControlProps {\n nodeId: string;\n breakpoint: 'base' | 'tablet' | 'mobile';\n fieldName: string;\n fieldLabel: string;\n value: unknown;\n onCommit: (fieldName: string, value: string) => void;\n error?: string | null;\n}\n\nconst SpacingControl: React.FC<SpacingControlProps> = ({\n nodeId,\n breakpoint,\n fieldName,\n fieldLabel,\n value,\n onCommit,\n error,\n}) => {\n const parsed = parseSpacingValue(value);\n const [num, setNum] = useState(parsed.num);\n const [unit, setUnit] = useState<SpacingUnit>(parsed.unit);\n\n useEffect(() => {\n const next = parseSpacingValue(value);\n setNum(next.num);\n setUnit(next.unit);\n }, [value, nodeId, breakpoint]);\n\n const handleNumChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawNum = e.target.value;\n setNum(rawNum);\n if (rawNum.trim() === '') {\n onCommit(fieldName, '');\n return;\n }\n if (unit === 'auto') {\n onCommit(fieldName, 'auto');\n return;\n }\n onCommit(fieldName, `${rawNum.trim()}${unit}`);\n };\n\n const handleUnitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const nextUnit = e.target.value as SpacingUnit;\n setUnit(nextUnit);\n if (nextUnit === 'auto') {\n setNum('auto');\n onCommit(fieldName, 'auto');\n return;\n }\n if (num === 'auto') {\n setNum('');\n onCommit(fieldName, '');\n return;\n }\n if (num.trim() !== '') {\n onCommit(fieldName, `${num.trim()}${nextUnit}`);\n }\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n (e.target as HTMLInputElement).blur();\n }\n };\n\n const isMargin = fieldName.startsWith('margin');\n\n return (\n <div>\n <label className=\"block text-xs font-medium text-slate-600 mb-1\">{fieldLabel}</label>\n <div className=\"flex items-center rounded border border-slate-300 bg-white focus-within:ring-1 focus-within:ring-blue-500 focus-within:border-blue-500 overflow-hidden shadow-xs\">\n <input\n type={unit === 'auto' ? 'text' : 'number'}\n value={num}\n placeholder=\"0\"\n disabled={unit === 'auto'}\n onChange={handleNumChange}\n onKeyDown={handleKeyDown}\n className=\"w-full min-w-0 text-xs bg-white text-slate-900 px-2 py-1.5 focus:outline-none disabled:bg-slate-100 disabled:text-slate-500\"\n />\n <select\n value={unit}\n onChange={handleUnitChange}\n aria-label={`${fieldLabel} Unit`}\n className=\"shrink-0 text-xs bg-slate-100 text-slate-700 font-medium px-1.5 py-1.5 border-l border-slate-200 focus:outline-none cursor-pointer hover:bg-slate-200 transition\"\n >\n <option value=\"px\">px</option>\n <option value=\"rem\">rem</option>\n <option value=\"%\">%</option>\n <option value=\"em\">em</option>\n <option value=\"vh\">vh</option>\n <option value=\"vw\">vw</option>\n {isMargin && <option value=\"auto\">auto</option>}\n </select>\n </div>\n <ErrorText message={error} />\n </div>\n );\n};\n\n/**\n * Amber warning badge shown above the style manager while editing a\n * non-default pseudo-state layer (e.g. `:hover`) — STORA-223.\n */\nexport const StateEditingBadge: React.FC<{ state: string }> = ({ state }) => (\n <div\n data-testid=\"state-editing-badge\"\n className=\"flex items-center gap-1.5 mb-2 px-2 py-1.5 rounded bg-amber-50 border border-amber-300 text-amber-800 text-xs font-medium\"\n >\n <AlertTriangle className=\"w-3.5 h-3.5 text-amber-600 shrink-0\" aria-hidden=\"true\" />\n <span>Editing {state} State</span>\n </div>\n);\n\nexport const InspectorPanel: React.FC<InspectorPanelProps> = ({\n registry,\n className,\n document: propDocument,\n selectedNodeId: propSelectedNodeId,\n config,\n}) => {\n const storeState = useEditorStore((s) => s);\n const document = propDocument ?? storeState.document;\n const selectedNodeId =\n propSelectedNodeId !== undefined ? propSelectedNodeId : storeState.selectedNodeId;\n const {\n viewport,\n updateNodeProps,\n updateNodeStyle,\n updateNodeStateStyle,\n updateNodeAnimation,\n variableCatalog,\n insertComponent,\n deleteComponent,\n selectNode,\n tableSpreadsheetMode,\n setTableSpreadsheetMode,\n } = storeState;\n\n const showProps = config?.showProps !== false;\n const showTraits = config?.showTraits !== false;\n const showStyles = config?.showStyles !== false;\n const showStateSelector = config?.showStateSelector !== false;\n const allowedStyleSectors = config?.allowedStyleSectors;\n\n const initialTab = !showStyles && showTraits ? 'traits' : 'style';\n\n const [fieldErrors, setFieldErrors] = useState<Record<string, string | null>>({});\n const [activeTab, setActiveTab] = useState<'style' | 'traits'>(initialTab);\n // STORA-250 — asset manager modal state (open + which prop field it targets).\n const [assetPickerField, setAssetPickerField] = useState<string | null>(null);\n // Active pseudo-state layer for the style manager — STORA-221.\n const [activeState, setActiveState] = useState<string>('default');\n\n useEffect(() => {\n if (!showStyles && showTraits && activeTab !== 'traits') {\n setActiveTab('traits');\n } else if (!showTraits && showStyles && activeTab !== 'style') {\n setActiveTab('style');\n }\n }, [showStyles, showTraits, activeTab]);\n\n const node = selectedNodeId ? findNodeById(document.document, selectedNodeId) : null;\n const definition = node ? registry.get(node.type) : undefined;\n\n useEffect(() => {\n setFieldErrors({});\n }, [node?.id]);\n\n if (!node || !definition) {\n return (\n <div className={`p-3 text-xs text-slate-500 ${className || ''}`}>No element selected.</div>\n );\n }\n\n const setError = (key: string, error: string | null) => {\n setFieldErrors((prev) => ({ ...prev, [key]: error }));\n };\n\n const commitProp = (field: ComponentFieldDefinition, value: unknown, isBlur = true) => {\n const errorKey = `prop:${field.name}`;\n if (!isBlur) {\n // While typing / focused: allow temporary empty state without showing red error banner\n if (typeof value === 'string' && value.trim() === '') {\n setError(errorKey, null);\n return;\n }\n const result = updateNodeProps(node.id, { [field.name]: value }, registry);\n if (result.success) {\n setError(errorKey, null);\n }\n return;\n }\n\n // On blur: validate and commit final value\n const result = updateNodeProps(node.id, { [field.name]: value }, registry);\n setError(errorKey, result.success ? null : result.error ?? 'Invalid value.');\n };\n\n const renderPropControl = (field: ComponentFieldDefinition) => {\n const currentValue = node.props?.[field.name];\n const errorKey = `prop:${field.name}`;\n\n switch (field.type) {\n case 'boolean':\n return (\n <input\n type=\"checkbox\"\n checked={Boolean(currentValue)}\n onChange={(e) => commitProp(field, e.target.checked, true)}\n />\n );\n case 'select':\n return (\n <select\n value={String(currentValue ?? '')}\n onChange={(e) => {\n const option = field.options?.find((o) => String(o.value) === e.target.value);\n commitProp(field, option ? option.value : e.target.value, true);\n }}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n {(field.options ?? []).map((opt) => (\n <option key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n case 'color':\n return (\n <input\n type=\"color\"\n value={typeof currentValue === 'string' ? currentValue : '#000000'}\n onChange={(e) => commitProp(field, e.target.value, true)}\n className=\"w-full h-8 cursor-pointer rounded border border-slate-300 bg-white p-1\"\n />\n );\n case 'number':\n return (\n <NumberPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n setError={(err) => setError(errorKey, err)}\n />\n );\n case 'image':\n case 'action':\n case 'json':\n return (\n <textarea\n defaultValue={JSON.stringify(currentValue ?? null, null, 2)}\n onBlur={(e) => {\n let parsed: unknown;\n try {\n parsed = JSON.parse(e.target.value);\n } catch {\n setError(errorKey, 'Invalid JSON.');\n }\n commitProp(field, parsed, true);\n }}\n rows={3}\n className=\"w-full text-xs font-mono bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n case 'textarea':\n return (\n <TextAreaPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n />\n );\n case 'string':\n default: {\n const isMediaSrcField = field.name === 'src' || field.name === 'poster';\n if (isMediaSrcField) {\n return (\n <MediaSrcPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n onOpenAssetPicker={() => setAssetPickerField(field.name)}\n />\n );\n }\n return (\n <StringPropControl\n nodeId={node.id}\n field={field}\n value={currentValue}\n onCommit={commitProp}\n onKeyDown={(e) => {\n if (e.key === 'Enter' && node.type === 'list-item' && field.name === 'text') {\n e.preventDefault();\n const location = findNodeLocation(document.document, node.id);\n if (location && location.parent && location.parent.type === 'list') {\n insertComponent('list-item', registry, location.parent.id);\n }\n }\n }}\n />\n );\n }\n }\n };\n\n const activeBreakpoint = styleBreakpointFor(viewport);\n const activeLayer =\n activeState === 'default'\n ? ((node.styles?.[activeBreakpoint] as Record<string, unknown> | undefined) ?? {})\n : ((node.styles?.states?.[activeState] as Record<string, unknown> | undefined) ?? {});\n\n const handleCommitSpacing = (fieldName: string, value: string) => {\n const errorKey = `style:${fieldName}`;\n const result =\n activeState === 'default'\n ? updateNodeStyle(node.id, { [fieldName]: value }, activeBreakpoint)\n : updateNodeStateStyle(node.id, { [fieldName]: value }, activeState);\n setError(errorKey, result.success ? null : result.error ?? 'Invalid value.');\n };\n\n const handleResetStyles = (properties?: string[]) => {\n if (!node) return;\n const targetProps = properties && properties.length > 0 ? properties : Object.keys(activeLayer);\n const resetMap = targetProps.reduce<Record<string, string>>((acc, p) => {\n acc[p] = '';\n return acc;\n }, {});\n if (activeState === 'default') {\n updateNodeStyle(node.id, resetMap, activeBreakpoint);\n } else {\n updateNodeStateStyle(node.id, resetMap, activeState);\n }\n };\n\n const handleAddListItem = (e?: React.SyntheticEvent) => {\n if (e) e.preventDefault();\n const result = insertComponent('list-item', registry, node.id);\n if (result.success && result.nodeId) {\n setTimeout(() => {\n const el = window.document.getElementById(`list-item-input-${result.nodeId}`);\n if (el) {\n (el as HTMLInputElement).focus();\n (el as HTMLInputElement).select();\n }\n }, 50);\n }\n };\n\n const handleCommitTrait = (traitName: string, value: unknown) => {\n const result = updateNodeProps(node.id, { [traitName]: value }, registry);\n setError(`trait:${traitName}`, result.success ? null : result.error ?? 'Invalid value.');\n };\n\n return (\n <div className={`flex flex-col h-full min-h-0 overflow-hidden text-sm text-slate-900 ${className || ''}`}>\n {/* STORA-250 — Asset Manager Modal: picking an asset updates the target prop instantly. */}\n {assetPickerField && (\n <AssetManagerModal\n isOpen\n onClose={() => setAssetPickerField(null)}\n onSelect={(url) => {\n const result = updateNodeProps(node.id, { [assetPickerField]: url }, registry);\n setError(`prop:${assetPickerField}`, result.success ? null : result.error ?? 'Invalid value.');\n }}\n />\n )}\n {/* Tab bar: Style / Traits — STORA-211 */}\n {showStyles && showTraits && (\n <div className=\"flex shrink-0 border-b border-slate-200 bg-slate-50\">\n <button\n type=\"button\"\n onClick={() => setActiveTab('style')}\n className={`flex-1 px-3 py-2 text-xs font-medium transition border-b-2 flex items-center justify-center gap-1.5 ${\n activeTab === 'style'\n ? 'text-blue-600 border-blue-600 bg-white'\n : 'text-slate-500 border-transparent hover:text-slate-700 hover:bg-slate-100'\n }`}\n >\n <Palette className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n <span>Style</span>\n </button>\n <button\n type=\"button\"\n onClick={() => setActiveTab('traits')}\n className={`flex-1 px-3 py-2 text-xs font-medium transition border-b-2 flex items-center justify-center gap-1.5 ${\n activeTab === 'traits'\n ? 'text-blue-600 border-blue-600 bg-white'\n : 'text-slate-500 border-transparent hover:text-slate-700 hover:bg-slate-100'\n }`}\n >\n <Settings className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n <span>Traits</span>\n </button>\n </div>\n )}\n\n <div className=\"flex-1 min-h-0 overflow-y-auto overflow-x-hidden flex flex-col gap-4 p-3 min-w-0\">\n {node.type === 'list' && (\n <div className=\"pb-3 border-b border-slate-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n List Items ({node.children?.length ?? 0})\n </div>\n <button\n type=\"button\"\n onClick={handleAddListItem}\n className=\"px-2 py-1 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n >\n + Add Item\n </button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {(!node.children || node.children.length === 0) && (\n <div className=\"text-xs text-slate-400 italic\">No items yet. Click \"+ Add Item\" or press Enter.</div>\n )}\n {node.children?.map((child, idx) => (\n <div\n key={child.id}\n className=\"flex items-center gap-1.5 bg-slate-50 p-1.5 rounded border border-slate-200\"\n >\n <span className=\"text-[11px] font-mono text-slate-400 w-4 text-center\">{idx + 1}.</span>\n <input\n id={`list-item-input-${child.id}`}\n type=\"text\"\n value={typeof child.props?.text === 'string' ? child.props.text : ''}\n onChange={(e) => updateNodeProps(child.id, { text: e.target.value }, registry)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n handleAddListItem(e);\n }\n }}\n placeholder={`Item ${idx + 1}`}\n className=\"flex-1 text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <button\n type=\"button\"\n title=\"Select Item\"\n onClick={() => selectNode(child.id)}\n className=\"p-1 text-slate-400 hover:text-blue-600 rounded flex items-center justify-center\"\n >\n <Crosshair className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n title=\"Delete Item\"\n onClick={() => deleteComponent(child.id)}\n className=\"p-1 text-slate-400 hover:text-red-600 rounded flex items-center justify-center\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {node.type === 'table' && (\n <div className=\"pb-3 border-b border-slate-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Spreadsheet Grid\n </div>\n <div className=\"flex items-center gap-1\">\n {tableSpreadsheetMode === 'docked' ? (\n <button\n type=\"button\"\n onClick={() => setTableSpreadsheetMode('floating')}\n className=\"px-2 py-0.5 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n title=\"Pop out to floating window\"\n >\n Pop out (Float)\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => setTableSpreadsheetMode('docked')}\n className=\"px-2 py-0.5 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n title=\"Dock grid into inspector\"\n >\n Dock Grid Here\n </button>\n )}\n </div>\n </div>\n\n {tableSpreadsheetMode === 'docked' ? (\n <div className=\"mb-2\">\n <TableSpreadsheetEditor\n registry={registry}\n tableNode={node}\n mode=\"docked\"\n onToggleMode={() => setTableSpreadsheetMode('floating')}\n />\n </div>\n ) : (\n <div className=\"flex flex-col gap-1.5 mb-2\">\n <div className=\"flex items-center justify-between p-2 bg-blue-50/70 border border-blue-200 rounded text-xs text-blue-800\">\n <span className=\"font-medium flex items-center gap-1.5\">\n <ComponentIcon iconOrType=\"table\" size={13} />\n <span>\n {tableSpreadsheetMode === 'floating'\n ? 'Grid is Floating on Canvas'\n : 'Grid is Hidden'}\n </span>\n </span>\n <button\n type=\"button\"\n onClick={() =>\n setTableSpreadsheetMode(\n tableSpreadsheetMode === 'floating' ? 'docked' : 'floating',\n )\n }\n className=\"px-2 py-0.5 text-xs font-medium bg-white text-blue-700 hover:bg-blue-100 rounded border border-blue-300 transition\"\n >\n {tableSpreadsheetMode === 'floating' ? 'Dock Here' : 'Open Float Grid'}\n </button>\n </div>\n </div>\n )}\n\n <div className=\"flex items-center justify-between mb-2 mt-3\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Table Rows ({node.children?.length ?? 0})\n </div>\n <button\n type=\"button\"\n onClick={() => {\n const cellCount = node.children?.[0]?.children?.length || 2;\n const result = insertComponent('table-row', registry, node.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < cellCount; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n }\n }}\n className=\"px-2 py-1 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n >\n + Add Row\n </button>\n </div>\n <div className=\"flex flex-col gap-1.5\">\n {(!node.children || node.children.length === 0) && (\n <div className=\"text-xs text-slate-400 italic\">No rows yet. Click \"+ Add Row\" to add one.</div>\n )}\n {node.children?.map((row, idx) => (\n <div\n key={row.id}\n className=\"flex items-center justify-between bg-slate-50 px-2 py-1.5 rounded border border-slate-200 text-xs\"\n >\n <span className=\"font-medium text-slate-700\">\n Row {idx + 1} ({row.children?.length ?? 0} cells)\n </span>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => insertComponent('table-cell', registry, row.id)}\n className=\"px-1.5 py-0.5 text-[11px] text-blue-600 bg-blue-50 hover:bg-blue-100 rounded\"\n title=\"Add Cell to Row\"\n >\n + Cell\n </button>\n <button\n type=\"button\"\n title=\"Select Row\"\n onClick={() => selectNode(row.id)}\n className=\"p-1 text-slate-400 hover:text-blue-600 rounded flex items-center justify-center\"\n >\n <Crosshair className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n <button\n type=\"button\"\n title=\"Delete Row\"\n onClick={() => deleteComponent(row.id)}\n className=\"p-1 text-slate-400 hover:text-red-600 rounded flex items-center justify-center\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n ))}\n </div>\n </div>\n )}\n\n {node.type === 'table-row' && (\n <div className=\"pb-3 border-b border-slate-200\">\n <div className=\"flex items-center justify-between mb-2\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">\n Row Cells ({node.children?.length ?? 0})\n </div>\n <button\n type=\"button\"\n onClick={() => insertComponent('table-cell', registry, node.id)}\n className=\"px-2 py-1 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 rounded border border-blue-200 transition\"\n >\n + Add Cell\n </button>\n </div>\n </div>\n )}\n\n {activeTab === 'style' && (\n <>\n {showProps && (\n <div>\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide mb-2\">\n {definition.label} Props\n </div>\n <div className=\"flex flex-col gap-3\">\n {(definition.propFields ?? []).map((field) => {\n const currentValue = node.props?.[field.name];\n const bound = isVariableBinding(currentValue);\n return (\n <div key={field.name}>\n <label className=\"block text-xs font-medium text-slate-600 mb-1\">{field.label}</label>\n {!bound && renderPropControl(field)}\n {isBindableField(field) && (\n <VariableBindingControl\n field={field}\n currentValue={currentValue}\n catalog={variableCatalog}\n onBind={(key) => commitProp(field, toBindingValue(key), true)}\n onRevert={() => commitProp(field, field.defaultValue ?? '', true)}\n />\n )}\n <ErrorText message={fieldErrors[`prop:${field.name}`]} />\n </div>\n );\n })}\n </div>\n </div>\n )}\n\n {showStyles && (\n <div className=\"pt-2 border-t border-slate-200 min-w-0 max-w-full\">\n {/* Active state warning badge — STORA-223 */}\n {activeState !== 'default' && <StateEditingBadge state={activeState} />}\n {/* Pseudo-state selector — STORA-221 */}\n {showStateSelector && (\n <div className=\"flex items-center gap-2 mb-2\">\n <label\n htmlFor=\"style-state-selector\"\n className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide shrink-0\"\n >\n State\n </label>\n <select\n id=\"style-state-selector\"\n value={activeState}\n onChange={(e) => setActiveState(e.target.value)}\n className={`flex-1 text-xs rounded px-2 py-1.5 border focus:outline-none focus:ring-1 transition cursor-pointer ${\n activeState !== 'default'\n ? 'bg-amber-50 text-amber-900 border-amber-400 focus:ring-amber-400 focus:border-amber-400'\n : 'bg-white text-slate-900 border-slate-300 hover:border-slate-400 focus:ring-blue-500 focus:border-blue-500 shadow-xs'\n }`}\n >\n <option value=\"default\">Default</option>\n <option value=\":hover\">:hover</option>\n <option value=\":active\">:active</option>\n <option value=\":focus\">:focus</option>\n </select>\n </div>\n )}\n <StyleManagerAccordion\n key={`${node.id}-${activeBreakpoint}-${activeState}`}\n styles={activeLayer}\n animation={node.animation}\n allowedSectors={allowedStyleSectors}\n onCommitStyle={handleCommitSpacing}\n onCommitAnimation={(anim) => {\n const result = updateNodeAnimation(node.id, anim);\n if (!result.success && result.error) {\n setError('animation', result.error);\n }\n }}\n onResetAnimation={() => {\n updateNodeAnimation(node.id, null);\n }}\n onReplayAnimation={() => {\n if (node?.id) {\n replayNodeAnimation(node.id);\n }\n }}\n errors={fieldErrors}\n breakpoint={activeBreakpoint}\n />\n </div>\n )}\n </>\n )}\n\n {activeTab === 'traits' && showTraits && (\n <TraitsPanel\n registry={registry}\n document={document}\n selectedNodeId={node.id}\n onCommitTrait={handleCommitTrait}\n className=\"p-0\"\n />\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { isVariableBinding, VariableBinding } from '@kubuild/schema';\nimport { ComponentFieldDefinition, primitiveTypeForField } from '@kubuild/components';\nimport { VariableCatalog, VariableDefinition } from '@kubuild/core';\n\n/**\n * Filters a host catalog down to entries whose type is compatible with a given\n * bindable prop field — 'array'/'object' catalog entries are never offered onto\n * scalar-bindable fields (string/number/boolean), since resolvePropsForNode's\n * type check would reject them at render time anyway.\n */\nexport function getCompatibleCatalogEntries(\n field: ComponentFieldDefinition,\n catalog: VariableCatalog | undefined,\n): VariableDefinition[] {\n const expectedType = primitiveTypeForField(field);\n if (!expectedType || !catalog) {\n return [];\n }\n return catalog.filter((entry) => entry.type === expectedType);\n}\n\nexport function toBindingValue(key: string): VariableBinding {\n return { type: 'variable', key };\n}\n\nexport interface VariableBindingControlProps {\n field: ComponentFieldDefinition;\n currentValue: unknown;\n catalog: VariableCatalog;\n onBind: (key: string) => void;\n onRevert: () => void;\n}\n\nexport const VariableBindingControl: React.FC<VariableBindingControlProps> = ({\n field,\n currentValue,\n catalog,\n onBind,\n onRevert,\n}) => {\n const compatibleEntries = getCompatibleCatalogEntries(field, catalog);\n\n if (isVariableBinding(currentValue)) {\n const bound = catalog.find((entry) => entry.key === currentValue.key);\n return (\n <div className=\"flex items-center gap-2 mt-1 text-xs\">\n <span\n data-testid={`bound-chip-${field.name}`}\n className=\"px-2 py-0.5 rounded bg-blue-50 text-blue-700 border border-blue-200\"\n >\n bound to <code>{currentValue.key}</code>\n {bound ? ` (sample: ${JSON.stringify(bound.sampleValue)})` : ''}\n </span>\n <button\n type=\"button\"\n data-testid={`revert-${field.name}`}\n onClick={onRevert}\n className=\"text-slate-500 hover:text-slate-700 underline\"\n >\n Revert to static\n </button>\n </div>\n );\n }\n\n if (compatibleEntries.length === 0) {\n return null;\n }\n\n return (\n <div className=\"mt-1\">\n <select\n data-testid={`bind-variable-${field.name}`}\n value=\"\"\n onChange={(e) => {\n if (e.target.value) onBind(e.target.value);\n }}\n className=\"w-full text-xs bg-white text-slate-700 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n <option value=\"\">Bind variable…</option>\n {compatibleEntries.map((entry) => (\n <option key={entry.key} value={entry.key}>\n {entry.label} ({JSON.stringify(entry.sampleValue)})\n </option>\n ))}\n </select>\n </div>\n );\n};\n","import React, { useCallback, useMemo, useRef, useState } from 'react';\nimport { AssetProvider, AssetInfo } from '@kubuild/core';\n\nexport interface AssetManagerModalProps {\n isOpen: boolean;\n onClose: () => void;\n /** Called with the resolved URL of the picked asset. */\n onSelect: (url: string) => void;\n /** Optional host-provided asset provider backing the local gallery tab. */\n assetProvider?: AssetProvider;\n /** Acceptable MIME types, e.g. ['image/*']. Defaults to images only. */\n accept?: string[];\n /** Title shown in the modal header. */\n title?: string;\n}\n\ntype TabId = 'gallery' | 'url' | 'upload';\n\ninterface GalleryItem {\n id: string;\n url: string;\n name: string;\n mimeType: string;\n}\n\nconst DEFAULT_ACCEPT = ['image/'];\n\nconst isAccepted = (mimeType: string, accept: string[]): boolean =>\n accept.some((pattern) => {\n // Normalize 'image/*' and 'image/' to a prefix match on 'image/'.\n const prefix = pattern.endsWith('/*') ? pattern.slice(0, -1) : pattern;\n return mimeType.startsWith(prefix);\n });\n\n/**\n * STORA-250 — Unified asset picker modal.\n *\n * Three sources:\n * - Gallery: assets listed by the host `AssetProvider` (local `.stora` gallery).\n * - URL: direct CDN / external URL entry.\n * - Upload: drag-and-drop or file-picker upload, resolved via\n * `assetProvider.upload` when available, otherwise an in-memory object URL.\n *\n * Selecting an asset immediately invokes `onSelect(url)` so the caller can\n * update the target node's `src` prop instantly.\n */\nexport const AssetManagerModal: React.FC<AssetManagerModalProps> = ({\n isOpen,\n onClose,\n onSelect,\n assetProvider,\n accept = DEFAULT_ACCEPT,\n title = 'Asset Manager',\n}) => {\n const [activeTab, setActiveTab] = useState<TabId>('gallery');\n const [urlValue, setUrlValue] = useState('');\n const [urlError, setUrlError] = useState<string | null>(null);\n const [uploadError, setUploadError] = useState<string | null>(null);\n const [isUploading, setIsUploading] = useState(false);\n const [uploaded, setUploaded] = useState<GalleryItem[]>([]);\n const [providerAssets, setProviderAssets] = useState<GalleryItem[] | null>(null);\n const [providerError, setProviderError] = useState<string | null>(null);\n const [isDragOver, setIsDragOver] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const galleryItems = useMemo<GalleryItem[]>(() => {\n if (providerAssets) return providerAssets;\n return uploaded;\n }, [providerAssets, uploaded]);\n\n const loadProviderAssets = useCallback(async () => {\n if (!assetProvider?.list) {\n setProviderAssets([]);\n return;\n }\n try {\n const list = await assetProvider.list();\n setProviderAssets(\n list\n .filter((a: AssetInfo) => isAccepted(a.mimeType || '', accept))\n .map((a: AssetInfo) => ({\n id: a.id,\n url: a.url,\n name: a.alt || a.id,\n mimeType: a.mimeType || '',\n })),\n );\n setProviderError(null);\n } catch (err: unknown) {\n setProviderError(err instanceof Error ? err.message : String(err));\n setProviderAssets([]);\n }\n }, [assetProvider, accept]);\n\n // Load gallery assets each time the modal opens on the gallery tab.\n React.useEffect(() => {\n if (isOpen && activeTab === 'gallery' && providerAssets === null) {\n void loadProviderAssets();\n }\n }, [isOpen, activeTab, providerAssets, loadProviderAssets]);\n\n if (!isOpen) return null;\n\n const handlePick = (item: GalleryItem) => {\n onSelect(item.url);\n onClose();\n };\n\n const handleUrlSubmit = () => {\n const trimmed = urlValue.trim();\n if (!trimmed) {\n setUrlError('URL is required.');\n return;\n }\n try {\n // Validate it is a well-formed absolute URL.\n const parsed = new URL(trimmed);\n if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {\n setUrlError('Only http(s) URLs are supported.');\n return;\n }\n } catch {\n setUrlError('Enter a valid absolute URL (https://…).');\n return;\n }\n setUrlError(null);\n onSelect(trimmed);\n onClose();\n };\n\n const processFiles = async (files: FileList | File[]) => {\n const list = Array.from(files);\n if (list.length === 0) return;\n setIsUploading(true);\n setUploadError(null);\n const results: GalleryItem[] = [];\n try {\n for (const file of list) {\n if (!isAccepted(file.type || '', accept)) {\n throw new Error(`Unsupported file type: ${file.type || file.name}`);\n }\n if (assetProvider?.upload) {\n const info = await assetProvider.upload(file);\n results.push({\n id: info.id,\n url: info.url,\n name: info.alt || file.name,\n mimeType: info.mimeType || file.type,\n });\n } else {\n // Fallback: convert file to base64 Data URL so local images persist reliably.\n const dataUrl = await new Promise<string>((resolve, reject) => {\n const reader = new FileReader();\n reader.onload = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(file);\n });\n results.push({\n id: `local-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`,\n url: dataUrl,\n name: file.name,\n mimeType: file.type,\n });\n }\n }\n setUploaded((prev) => [...results, ...prev]);\n // Merge into provider list view if it was loaded.\n if (providerAssets !== null) {\n setProviderAssets([...results, ...providerAssets]);\n }\n // Instantly select the first uploaded asset.\n handlePick(results[0]);\n } catch (err: unknown) {\n setUploadError(err instanceof Error ? err.message : String(err));\n } finally {\n setIsUploading(false);\n }\n };\n\n const handleDrop = (e: React.DragEvent<HTMLDivElement>) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDragOver(false);\n if (e.dataTransfer.files?.length) {\n void processFiles(e.dataTransfer.files);\n }\n };\n\n const tabs: Array<{ id: TabId; label: string }> = [\n { id: 'gallery', label: 'Gallery' },\n { id: 'url', label: 'CDN URL' },\n { id: 'upload', label: 'Upload' },\n ];\n\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 backdrop-blur-sm p-4\"\n onClick={onClose}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title}\n >\n <div\n className=\"bg-slate-900 border border-slate-700 rounded-xl shadow-2xl w-full max-w-2xl flex flex-col overflow-hidden text-slate-100 animate-in fade-in zoom-in-95 duration-150\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-slate-800 bg-slate-950/80\">\n <div className=\"flex items-center gap-2\">\n <svg className=\"w-5 h-5 text-blue-400\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16l4.586-4.586a2 2 0 012.828 0L16 16m-2-2l1.586-1.586a2 2 0 012.828 0L20 14m-6-6h.01M6 20h12a2 2 0 002-2V6a2 2 0 00-2-2H6a2 2 0 00-2 2v12a2 2 0 002 2z\"\n />\n </svg>\n <h2 className=\"font-semibold text-base\">{title}</h2>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-slate-400 hover:text-slate-200 p-1 rounded-lg hover:bg-slate-800 transition\"\n aria-label=\"Close asset manager\"\n >\n <svg className=\"w-4 h-4\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M6 18L18 6M6 6l12 12\" />\n </svg>\n </button>\n </div>\n\n {/* Tabs */}\n <div className=\"flex border-b border-slate-800 bg-slate-950/40 px-6 gap-1\">\n {tabs.map((tab) => (\n <button\n key={tab.id}\n type=\"button\"\n onClick={() => setActiveTab(tab.id)}\n className={`px-4 py-2.5 text-xs font-medium border-b-2 -mb-px transition ${\n activeTab === tab.id\n ? 'border-blue-500 text-blue-400'\n : 'border-transparent text-slate-400 hover:text-slate-200'\n }`}\n >\n {tab.label}\n </button>\n ))}\n </div>\n\n {/* Body */}\n <div className=\"p-6 flex flex-col gap-4 max-h-[65vh] overflow-y-auto\">\n {activeTab === 'gallery' && (\n <div className=\"flex flex-col gap-3\">\n {providerError && (\n <div className=\"p-3 bg-red-950/50 border border-red-800/80 rounded-lg text-xs text-red-300\">\n Failed to load gallery: {providerError}\n </div>\n )}\n {providerAssets === null ? (\n <div className=\"flex items-center justify-center py-8 gap-3 text-sm text-slate-400\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n Loading gallery…\n </div>\n ) : galleryItems.length === 0 ? (\n <div className=\"py-10 text-center text-sm text-slate-500\">\n <p className=\"font-medium text-slate-400\">No assets in the local gallery yet.</p>\n <p className=\"text-xs mt-1\">\n Upload files in the Upload tab, or provide an <code className=\"text-slate-400\">AssetProvider</code> to\n list package assets.\n </p>\n </div>\n ) : (\n <div className=\"grid grid-cols-3 sm:grid-cols-4 gap-3\">\n {galleryItems.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handlePick(item)}\n title={item.name}\n className=\"group relative aspect-square rounded-lg overflow-hidden border border-slate-700 hover:border-blue-500 bg-slate-950/60 transition focus:outline-none focus:ring-2 focus:ring-blue-500\"\n >\n <img\n src={item.url}\n alt={item.name}\n className=\"w-full h-full object-cover group-hover:scale-105 transition\"\n loading=\"lazy\"\n />\n <div className=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 to-transparent px-2 py-1.5\">\n <span className=\"block text-[10px] text-slate-200 truncate\">{item.name}</span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'url' && (\n <div className=\"flex flex-col gap-3\">\n <label className=\"text-xs font-medium text-slate-300\" htmlFor=\"asset-url-input\">\n Image URL\n </label>\n <div className=\"flex gap-2\">\n <input\n id=\"asset-url-input\"\n type=\"url\"\n value={urlValue}\n onChange={(e) => {\n setUrlValue(e.target.value);\n setUrlError(null);\n }}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleUrlSubmit();\n }}\n placeholder=\"https://cdn.example.com/image.jpg\"\n className=\"flex-1 text-xs bg-slate-950/60 text-slate-100 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 placeholder:text-slate-600\"\n />\n <button\n type=\"button\"\n onClick={handleUrlSubmit}\n className=\"px-4 py-2 text-xs font-medium bg-blue-600 hover:bg-blue-500 text-white rounded-lg transition\"\n >\n Use URL\n </button>\n </div>\n {urlError && (\n <div className=\"text-xs text-red-400\" role=\"alert\">\n {urlError}\n </div>\n )}\n {urlValue.trim() && !urlError && (\n <div className=\"mt-2 rounded-lg border border-slate-700 bg-slate-950/60 p-3 flex items-center justify-center\">\n <img\n src={urlValue}\n alt=\"Preview\"\n className=\"max-h-48 rounded object-contain\"\n onError={(e) => {\n (e.target as HTMLImageElement).style.display = 'none';\n }}\n />\n </div>\n )}\n </div>\n )}\n\n {activeTab === 'upload' && (\n <div className=\"flex flex-col gap-3\">\n <div\n onDragOver={(e) => {\n e.preventDefault();\n setIsDragOver(true);\n }}\n onDragLeave={() => setIsDragOver(false)}\n onDrop={handleDrop}\n onClick={() => fileInputRef.current?.click()}\n className={`border-2 border-dashed rounded-xl p-8 flex flex-col items-center justify-center gap-3 cursor-pointer transition ${\n isDragOver\n ? 'border-blue-500 bg-blue-500/10'\n : 'border-slate-700 hover:border-blue-500 bg-slate-950/40 hover:bg-slate-800/40'\n } group`}\n >\n <div className=\"w-12 h-12 rounded-full bg-blue-500/10 flex items-center justify-center text-blue-400 group-hover:scale-110 transition\">\n <svg className=\"w-6 h-6\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n strokeWidth={2}\n d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\"\n />\n </svg>\n </div>\n <div className=\"text-center\">\n <p className=\"text-sm font-medium text-slate-200\">\n {isUploading ? 'Uploading…' : 'Drag and drop files here, or click to browse'}\n </p>\n <p className=\"text-xs text-slate-400 mt-1\">\n {assetProvider?.upload\n ? 'Files are uploaded via the host asset provider.'\n : 'Files are kept in-memory for this session.'}\n </p>\n </div>\n <input\n ref={fileInputRef}\n type=\"file\"\n multiple\n accept={accept.join(',')}\n onChange={(e) => {\n if (e.target.files?.length) void processFiles(e.target.files);\n e.target.value = '';\n }}\n className=\"hidden\"\n />\n </div>\n {isUploading && (\n <div className=\"flex items-center justify-center gap-3 text-sm text-slate-400\">\n <div className=\"w-4 h-4 border-2 border-blue-500 border-t-transparent rounded-full animate-spin\" />\n Uploading…\n </div>\n )}\n {uploadError && (\n <div className=\"p-3 bg-red-950/50 border border-red-800/80 rounded-lg text-xs text-red-300\" role=\"alert\">\n {uploadError}\n </div>\n )}\n {uploaded.length > 0 && (\n <div className=\"grid grid-cols-3 sm:grid-cols-4 gap-3\">\n {uploaded.map((item) => (\n <button\n key={item.id}\n type=\"button\"\n onClick={() => handlePick(item)}\n title={item.name}\n className=\"group relative aspect-square rounded-lg overflow-hidden border border-slate-700 hover:border-blue-500 bg-slate-950/60 transition\"\n >\n <img src={item.url} alt={item.name} className=\"w-full h-full object-cover\" />\n <div className=\"absolute inset-x-0 bottom-0 bg-gradient-to-t from-black/80 to-transparent px-2 py-1.5\">\n <span className=\"block text-[10px] text-slate-200 truncate\">{item.name}</span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useState, useRef, useEffect } from 'react';\nimport { createPortal } from 'react-dom';\nimport { Node } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { findNodeById, getAncestorChain, deepClone } from '@kubuild/core';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\nimport { X, Trash2 } from 'lucide-react';\n\nexport interface TableSpreadsheetEditorProps {\n registry: ComponentRegistry;\n tableNode?: Node | null;\n mode?: 'floating' | 'docked';\n onClose?: () => void;\n onToggleMode?: () => void;\n className?: string;\n}\n\nexport function findActiveTableNode(documentRoot: Node, selectedNodeId: string | null): Node | null {\n if (!selectedNodeId) return null;\n const node = findNodeById(documentRoot, selectedNodeId);\n if (!node) return null;\n if (node.type === 'table') return node;\n\n const ancestors = getAncestorChain(documentRoot, selectedNodeId);\n for (let i = ancestors.length - 1; i >= 0; i--) {\n const anc = findNodeById(documentRoot, ancestors[i]);\n if (anc && anc.type === 'table') {\n return anc;\n }\n }\n return null;\n}\n\nconst COLUMN_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';\n\nexport function parseCsv(text: string): string[][] {\n const rows: string[][] = [];\n let currentRow: string[] = [];\n let currentVal = '';\n let insideQuotes = false;\n\n const str = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n');\n\n for (let i = 0; i < str.length; i++) {\n const char = str[i];\n const nextChar = str[i + 1];\n\n if (char === '\"') {\n if (insideQuotes && nextChar === '\"') {\n currentVal += '\"';\n i++;\n } else {\n insideQuotes = !insideQuotes;\n }\n } else if ((char === ',' || char === '\\t' || char === ';') && !insideQuotes) {\n currentRow.push(currentVal.trim());\n currentVal = '';\n } else if (char === '\\n' && !insideQuotes) {\n currentRow.push(currentVal.trim());\n if (currentRow.some((c) => c.length > 0)) {\n rows.push(currentRow);\n }\n currentRow = [];\n currentVal = '';\n } else {\n currentVal += char;\n }\n }\n\n if (currentVal.length > 0 || currentRow.length > 0) {\n currentRow.push(currentVal.trim());\n if (currentRow.some((c) => c.length > 0)) {\n rows.push(currentRow);\n }\n }\n\n return rows;\n}\n\nfunction getColumnLabel(index: number): string {\n if (index < 26) return COLUMN_LETTERS[index];\n const first = COLUMN_LETTERS[Math.floor(index / 26) - 1];\n const second = COLUMN_LETTERS[index % 26];\n return `${first}${second}`;\n}\n\nexport const TableSpreadsheetEditor: React.FC<TableSpreadsheetEditorProps> = ({\n registry,\n tableNode: propTableNode,\n mode = 'floating',\n onClose,\n onToggleMode,\n className = '',\n}) => {\n const {\n document: editorDoc,\n selectedNodeId,\n selectNode,\n insertComponent,\n deleteComponent,\n updateNodeProps,\n dispatch,\n } = useEditorStore();\n\n const tableNode = propTableNode ?? findActiveTableNode(editorDoc.document, selectedNodeId);\n\n // CSV Import State\n const [isImportModalOpen, setIsImportModalOpen] = useState(false);\n const [csvInputText, setCsvInputText] = useState('');\n const [hasHeaderRow, setHasHeaderRow] = useState(true);\n const [importMode, setImportMode] = useState<'replace' | 'append'>('replace');\n const [isDraggingFileOverGrid, setIsDraggingFileOverGrid] = useState(false);\n const [isDraggingFileOverModal, setIsDraggingFileOverModal] = useState(false);\n const fileInputRef = useRef<HTMLInputElement>(null);\n\n const readAndProcessCsvFile = (file: File) => {\n const reader = new FileReader();\n reader.onload = (event) => {\n const content = event.target?.result as string;\n if (content) {\n setCsvInputText(content);\n setIsImportModalOpen(true);\n }\n };\n reader.readAsText(file);\n };\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n readAndProcessCsvFile(file);\n e.target.value = '';\n };\n\n const handleExecuteImport = () => {\n if (!csvInputText.trim() || !tableNode) return;\n const parsedRows = parseCsv(csvInputText);\n if (parsedRows.length === 0) return;\n\n const parsedMaxCols = Math.max(...parsedRows.map((r) => r.length));\n\n const newRowNodes: Node[] = parsedRows.map((row, rowIdx) => {\n const isHeader = hasHeaderRow && (importMode === 'replace' ? rowIdx === 0 : false);\n const rowId = `row_${Date.now()}_${rowIdx}_${Math.random().toString(36).substring(2, 7)}`;\n const cells: Node[] = Array.from({ length: parsedMaxCols }).map((_, colIdx) => ({\n id: `cell_${Date.now()}_${rowIdx}_${colIdx}_${Math.random().toString(36).substring(2, 7)}`,\n type: 'table-cell',\n props: {\n tag: isHeader ? 'th' : 'td',\n text: row[colIdx] ?? '',\n },\n }));\n\n return {\n id: rowId,\n type: 'table-row',\n children: cells,\n };\n });\n\n dispatch((doc) => {\n const nextDoc = deepClone(doc);\n const tbl = findNodeById(nextDoc.document, tableNode.id);\n if (!tbl) {\n throw new Error('Table not found');\n }\n if (importMode === 'replace') {\n tbl.children = newRowNodes;\n } else {\n tbl.children = [...(tbl.children || []), ...newRowNodes];\n }\n return {\n document: nextDoc,\n event: {\n type: 'NODE_INSERTED',\n timestamp: new Date().toISOString(),\n nodeId: tableNode.id,\n },\n };\n });\n\n setIsImportModalOpen(false);\n setCsvInputText('');\n };\n\n // Floating window position state\n const [pos, setPos] = useState(() => ({\n x: typeof window !== 'undefined' ? Math.max(10, Math.min(window.innerWidth - 400, 20)) : 20,\n y: 120,\n }));\n const [isDragging, setIsDragging] = useState(false);\n const dragStartRef = useRef<{ startX: number; startY: number; posX: number; posY: number }>({\n startX: 0,\n startY: 0,\n posX: 20,\n posY: 120,\n });\n\n const handleHeaderPointerDown = (e: React.PointerEvent) => {\n if ((e.target as HTMLElement).closest('button, input, select, textarea')) return;\n setIsDragging(true);\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n posX: pos.x,\n posY: pos.y,\n };\n };\n\n useEffect(() => {\n if (!isDragging) return;\n const handlePointerMove = (e: PointerEvent) => {\n const dx = e.clientX - dragStartRef.current.startX;\n const dy = e.clientY - dragStartRef.current.startY;\n const maxX = Math.max(8, window.innerWidth - 320);\n const maxY = Math.max(8, window.innerHeight - 100);\n setPos({\n x: Math.max(8, Math.min(maxX, dragStartRef.current.posX + dx)),\n y: Math.max(8, Math.min(maxY, dragStartRef.current.posY + dy)),\n });\n };\n const handlePointerUp = () => {\n setIsDragging(false);\n };\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerUp);\n return () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerUp);\n };\n }, [isDragging]);\n\n if (!tableNode) return null;\n\n const rows = (tableNode.children || []).filter((child) => child.type === 'table-row');\n const maxCols = Math.max(\n 1,\n ...rows.map((row) => (row.children || []).filter((c) => c.type === 'table-cell').length),\n );\n\n // Table operations\n const handleAddRow = () => {\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < maxCols; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n }\n };\n\n const handleAddColumn = () => {\n if (rows.length === 0) {\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n return;\n }\n\n rows.forEach((row, rowIdx) => {\n const isHeaderRow = rowIdx === 0 && row.children?.[0]?.props?.tag === 'th';\n const cellResult = insertComponent('table-cell', registry, row.id);\n if (cellResult.success && cellResult.nodeId && isHeaderRow) {\n updateNodeProps(cellResult.nodeId, { tag: 'th', text: `Header ${maxCols + 1}` }, registry);\n }\n });\n };\n\n const handleDeleteColumn = (colIndex: number) => {\n if (maxCols <= 1) return;\n rows.forEach((row) => {\n const cells = (row.children || []).filter((c) => c.type === 'table-cell');\n if (cells[colIndex]) {\n deleteComponent(cells[colIndex].id);\n }\n });\n };\n\n // Input references for keyboard navigation\n const inputRefs = useRef<Map<string, HTMLInputElement>>(new Map());\n\n const focusCell = (r: number, c: number) => {\n const targetRow = rows[r];\n if (!targetRow) return;\n const targetCells = (targetRow.children || []).filter((ch) => ch.type === 'table-cell');\n const targetCell = targetCells[c];\n if (targetCell) {\n selectNode(targetCell.id);\n const inputEl = inputRefs.current.get(`${r},${c}`);\n if (inputEl) {\n inputEl.focus();\n inputEl.select?.();\n }\n }\n };\n\n const handleCellKeyDown = (\n e: React.KeyboardEvent<HTMLInputElement>,\n rowIdx: number,\n colIdx: number,\n ) => {\n if (e.key === 'Tab') {\n e.preventDefault();\n if (e.shiftKey) {\n // Shift+Tab: Move to previous cell\n if (colIdx > 0) {\n focusCell(rowIdx, colIdx - 1);\n } else if (rowIdx > 0) {\n const prevRowCells = (rows[rowIdx - 1]?.children || []).filter(\n (ch) => ch.type === 'table-cell',\n );\n focusCell(rowIdx - 1, Math.max(0, prevRowCells.length - 1));\n }\n } else {\n // Tab: Move to next cell\n if (colIdx < maxCols - 1) {\n focusCell(rowIdx, colIdx + 1);\n } else if (rowIdx < rows.length - 1) {\n focusCell(rowIdx + 1, 0);\n } else {\n // At the very last cell -> Create new row and focus first cell\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < maxCols; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n setTimeout(() => focusCell(rowIdx + 1, 0), 40);\n }\n }\n }\n } else if (e.key === 'Enter') {\n e.preventDefault();\n if (e.shiftKey) {\n // Shift+Enter: Move to cell above\n if (rowIdx > 0) {\n focusCell(rowIdx - 1, colIdx);\n }\n } else {\n // Enter: Move to cell below or create new row if on last row\n if (rowIdx < rows.length - 1) {\n focusCell(rowIdx + 1, colIdx);\n } else {\n const result = insertComponent('table-row', registry, tableNode.id);\n if (result.success && result.nodeId) {\n for (let i = 0; i < maxCols; i++) {\n insertComponent('table-cell', registry, result.nodeId);\n }\n setTimeout(() => focusCell(rowIdx + 1, colIdx), 40);\n }\n }\n }\n } else if (e.key === 'ArrowUp') {\n if (rowIdx > 0) {\n e.preventDefault();\n focusCell(rowIdx - 1, colIdx);\n }\n } else if (e.key === 'ArrowDown') {\n if (rowIdx < rows.length - 1) {\n e.preventDefault();\n focusCell(rowIdx + 1, colIdx);\n }\n }\n };\n\n const isFloating = mode === 'floating';\n\n const modalContent = isImportModalOpen ? (\n <div className=\"fixed inset-0 z-[9999] flex items-center justify-center bg-slate-900/60 backdrop-blur-xs p-4 select-auto\">\n <div\n className=\"bg-white rounded-xl shadow-2xl border border-slate-200 w-full max-w-lg overflow-hidden flex flex-col animate-in fade-in zoom-in-95 duration-150\"\n onClick={(e) => e.stopPropagation()}\n >\n {/* Modal Header */}\n <div className=\"flex items-center justify-between px-4 py-3 bg-slate-50 border-b border-slate-200\">\n <div className=\"flex items-center gap-2.5\">\n <span className=\"p-1.5 bg-emerald-100 text-emerald-700 rounded-lg\">\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M14 2H6a2 2 0 0 0-2 2v16a2 2 0 0 0 2 2h12a2 2 0 0 0 2-2V8z\" />\n <polyline points=\"14 2 14 8 20 8\" />\n <line x1=\"8\" y1=\"13\" x2=\"16\" y2=\"13\" />\n <line x1=\"8\" y1=\"17\" x2=\"16\" y2=\"17\" />\n </svg>\n </span>\n <div>\n <h3 className=\"text-sm font-semibold text-slate-800\">Import CSV into Table</h3>\n <p className=\"text-xs text-slate-500\">Upload file or paste CSV / TSV text directly</p>\n </div>\n </div>\n <button\n type=\"button\"\n onClick={() => setIsImportModalOpen(false)}\n className=\"text-slate-400 hover:text-slate-600 p-1.5 rounded-md transition flex items-center justify-center\"\n >\n <X className=\"w-4 h-4\" aria-hidden=\"true\" />\n </button>\n </div>\n\n {/* Modal Body */}\n <div className=\"p-4 flex flex-col gap-3\">\n <div\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverModal(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverModal(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverModal(false);\n const file = e.dataTransfer.files?.[0];\n if (file) readAndProcessCsvFile(file);\n }}\n onClick={() => fileInputRef.current?.click()}\n className={`w-full flex flex-col items-center justify-center gap-1.5 py-4 px-3 border-2 border-dashed rounded-lg text-xs font-medium cursor-pointer transition ${\n isDraggingFileOverModal\n ? 'bg-emerald-100/80 border-emerald-500 text-emerald-800 scale-[1.01]'\n : 'bg-slate-50 hover:bg-emerald-50/50 border-slate-300 hover:border-emerald-400 text-slate-700'\n }`}\n >\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" className=\"text-emerald-600\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n <span className=\"font-semibold\">\n {isDraggingFileOverModal ? 'Drop CSV file here!' : 'Click to select or Drag & Drop .csv file here'}\n </span>\n <span className=\"text-[10px] text-slate-400\">Supports .csv and text/tsv files</span>\n </div>\n\n <div>\n <label className=\"block text-xs font-medium text-slate-700 mb-1\">\n Or Paste CSV / Tab-Separated Data:\n </label>\n <textarea\n rows={6}\n value={csvInputText}\n onChange={(e) => setCsvInputText(e.target.value)}\n placeholder=\"Header 1, Header 2, Header 3 Value 1, Value 2, Value 3 Value 4, Value 5, Value 6\"\n className=\"w-full text-xs font-mono p-2.5 border border-slate-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-emerald-500 resize-none bg-slate-50 text-slate-900\"\n />\n </div>\n\n {/* Options */}\n <div className=\"grid grid-cols-2 gap-3 pt-1 border-t border-slate-100 text-xs\">\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={hasHeaderRow}\n onChange={(e) => setHasHeaderRow(e.target.checked)}\n className=\"rounded text-emerald-600 focus:ring-emerald-500\"\n />\n <span className=\"text-slate-700 font-medium\">First row is Header (<th>)</span>\n </label>\n\n <div className=\"flex items-center gap-3\">\n <span className=\"text-slate-500\">Mode:</span>\n <label className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"csv-import-mode\"\n checked={importMode === 'replace'}\n onChange={() => setImportMode('replace')}\n className=\"text-emerald-600 focus:ring-emerald-500\"\n />\n <span className=\"text-slate-700\">Replace</span>\n </label>\n <label className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"radio\"\n name=\"csv-import-mode\"\n checked={importMode === 'append'}\n onChange={() => setImportMode('append')}\n className=\"text-emerald-600 focus:ring-emerald-500\"\n />\n <span className=\"text-slate-700\">Append</span>\n </label>\n </div>\n </div>\n\n {/* Live Preview info */}\n {csvInputText.trim() && (\n <div className=\"bg-emerald-50 border border-emerald-200 rounded-lg px-3 py-2 text-xs text-emerald-800 flex items-center justify-between\">\n <span>\n Detected: {parseCsv(csvInputText).length} rows,{' '}\n {Math.max(0, ...parseCsv(csvInputText).map((r) => r.length))} columns\n </span>\n <span className=\"font-semibold text-emerald-700\">Ready to import</span>\n </div>\n )}\n </div>\n\n {/* Modal Footer */}\n <div className=\"flex items-center justify-end gap-2 px-4 py-3 bg-slate-50 border-t border-slate-200\">\n <button\n type=\"button\"\n onClick={() => setIsImportModalOpen(false)}\n className=\"px-3 py-1.5 text-xs font-medium text-slate-600 hover:bg-slate-200 rounded-lg transition\"\n >\n Cancel\n </button>\n <button\n type=\"button\"\n disabled={!csvInputText.trim()}\n onClick={handleExecuteImport}\n className=\"px-4 py-1.5 text-xs font-semibold text-white bg-emerald-600 hover:bg-emerald-500 disabled:opacity-50 disabled:pointer-events-none rounded-lg shadow-sm transition\"\n >\n Import to Table\n </button>\n </div>\n </div>\n </div>\n ) : null;\n\n const renderedModal =\n typeof window !== 'undefined' && typeof document !== 'undefined' && modalContent\n ? createPortal(modalContent, document.body)\n : modalContent;\n\n const content = (\n <div className=\"flex flex-col h-full overflow-hidden\">\n {/* Hidden file input for CSV */}\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\".csv,text/csv,text/plain\"\n onChange={handleFileUpload}\n className=\"hidden\"\n />\n\n {/* Toolbar / Actions inside Spreadsheet */}\n <div className=\"flex items-center justify-between px-3 py-1.5 bg-slate-100/90 border-b border-slate-200 text-xs select-none\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-slate-700 flex items-center gap-1.5\">\n <ComponentIcon iconOrType=\"table\" size={14} />\n <span>Table Grid ({rows.length} × {maxCols})</span>\n </span>\n <span className=\"text-[10px] text-slate-400 font-mono\">#{tableNode.id}</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <button\n type=\"button\"\n onClick={() => setIsImportModalOpen(true)}\n title=\"Import CSV data into table\"\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-emerald-700 bg-emerald-50 hover:bg-emerald-100 border border-emerald-300 rounded shadow-xs transition\"\n >\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"7 10 12 15 17 10\" />\n <line x1=\"12\" y1=\"15\" x2=\"12\" y2=\"3\" />\n </svg>\n <span>Import CSV</span>\n </button>\n <button\n type=\"button\"\n onClick={handleAddRow}\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-blue-600 bg-white hover:bg-blue-50 border border-slate-300 rounded shadow-xs transition\"\n >\n <span>+ Row</span>\n </button>\n <button\n type=\"button\"\n onClick={handleAddColumn}\n className=\"flex items-center gap-1 px-2 py-0.5 text-xs font-medium text-blue-600 bg-white hover:bg-blue-50 border border-slate-300 rounded shadow-xs transition\"\n >\n <span>+ Column</span>\n </button>\n {onToggleMode && (\n <button\n type=\"button\"\n onClick={onToggleMode}\n title={isFloating ? 'Dock to inspector panel' : 'Make floating window'}\n className=\"p-1 text-slate-500 hover:text-blue-600 hover:bg-slate-200 rounded transition\"\n >\n {isFloating ? (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n ) : (\n <svg width=\"13\" height=\"13\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"14\" height=\"14\" x=\"7\" y=\"7\" rx=\"2\" />\n <path d=\"M17 3H5a2 2 0 0 0-2 2v12\" />\n </svg>\n )}\n </button>\n )}\n {onClose && (\n <button\n type=\"button\"\n onClick={onClose}\n title=\"Close Spreadsheet view\"\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition flex items-center justify-center\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </div>\n\n {/* Spreadsheet Grid Table */}\n <div\n onDragOver={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverGrid(true);\n }}\n onDragLeave={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverGrid(false);\n }}\n onDrop={(e) => {\n e.preventDefault();\n e.stopPropagation();\n setIsDraggingFileOverGrid(false);\n const file = e.dataTransfer.files?.[0];\n if (file) readAndProcessCsvFile(file);\n }}\n className=\"flex-1 overflow-auto p-2 bg-slate-50 relative\"\n >\n {/* Drag over grid overlay */}\n {isDraggingFileOverGrid && (\n <div className=\"absolute inset-0 z-30 bg-emerald-600/90 backdrop-blur-xs flex flex-col items-center justify-center text-white p-4 animate-in fade-in duration-150 select-none\">\n <svg\n width=\"36\"\n height=\"36\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n className=\"animate-bounce mb-2\"\n >\n <path d=\"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4\" />\n <polyline points=\"17 8 12 3 7 8\" />\n <line x1=\"12\" y1=\"3\" x2=\"12\" y2=\"15\" />\n </svg>\n <span className=\"text-sm font-bold\">Drop CSV File to Import</span>\n <span className=\"text-xs text-emerald-100\">Instantly populate this table</span>\n </div>\n )}\n\n <table className=\"border-collapse w-full text-xs bg-white border border-slate-300 shadow-xs\">\n <thead>\n <tr className=\"bg-slate-100 border-b border-slate-300 text-slate-500 select-none\">\n <th className=\"w-9 p-1 text-center font-mono text-[10px] bg-slate-200/80 border-r border-slate-300\">\n #\n </th>\n {Array.from({ length: maxCols }).map((_, colIdx) => (\n <th\n key={colIdx}\n className=\"p-1 text-center font-mono text-[11px] font-semibold border-r border-slate-300 group min-w-[100px]\"\n >\n <div className=\"flex items-center justify-between px-1\">\n <span className=\"mx-auto\">{getColumnLabel(colIdx)}</span>\n {maxCols > 1 && (\n <button\n type=\"button\"\n onClick={() => handleDeleteColumn(colIdx)}\n title={`Delete Column ${getColumnLabel(colIdx)}`}\n className=\"opacity-0 group-hover:opacity-100 text-slate-400 hover:text-red-600 p-0.5 rounded flex items-center justify-center\"\n >\n <Trash2 className=\"w-2.5 h-2.5\" aria-hidden=\"true\" />\n </button>\n )}\n </div>\n </th>\n ))}\n <th className=\"w-8 p-1 text-center text-slate-400 font-normal\">\n <button\n type=\"button\"\n onClick={handleAddColumn}\n title=\"Add Column\"\n className=\"hover:text-blue-600 font-bold\"\n >\n +\n </button>\n </th>\n </tr>\n </thead>\n <tbody>\n {rows.map((row, rowIdx) => {\n const cells = (row.children || []).filter((c) => c.type === 'table-cell');\n const isSelectedRow = row.id === selectedNodeId;\n\n return (\n <tr\n key={row.id}\n className={`border-b border-slate-200 ${\n isSelectedRow ? 'bg-blue-50/40' : 'hover:bg-slate-50/60'\n }`}\n >\n {/* Row Number Header */}\n <td\n onClick={() => selectNode(row.id)}\n title=\"Click to select row\"\n className=\"p-1 text-center font-mono text-[10px] text-slate-500 bg-slate-100 border-r border-slate-300 select-none cursor-pointer hover:bg-blue-100 hover:text-blue-700\"\n >\n {rowIdx + 1}\n </td>\n\n {/* Row Cells */}\n {Array.from({ length: maxCols }).map((_, colIdx) => {\n const cell = cells[colIdx];\n if (!cell) {\n return (\n <td\n key={`empty-${colIdx}`}\n className=\"p-1 border-r border-slate-200 bg-slate-50/50 text-center\"\n >\n <button\n type=\"button\"\n onClick={() => insertComponent('table-cell', registry, row.id)}\n className=\"text-[10px] text-blue-500 hover:underline\"\n >\n + Add Cell\n </button>\n </td>\n );\n }\n\n const isHeaderCell = cell.props?.tag === 'th';\n const isSelectedCell = cell.id === selectedNodeId;\n const cellText = typeof cell.props?.text === 'string' ? cell.props.text : '';\n\n return (\n <td\n key={cell.id}\n onClick={() => selectNode(cell.id)}\n className={`p-1 border-r border-slate-200 transition relative group ${\n isSelectedCell\n ? 'ring-2 ring-blue-500 ring-inset bg-blue-50/80 z-10'\n : isHeaderCell\n ? 'bg-slate-100/70 font-semibold'\n : 'bg-white'\n }`}\n >\n <div className=\"flex items-center gap-1\">\n <input\n ref={(el) => {\n if (el) {\n inputRefs.current.set(`${rowIdx},${colIdx}`, el);\n } else {\n inputRefs.current.delete(`${rowIdx},${colIdx}`);\n }\n }}\n type=\"text\"\n value={cellText}\n onChange={(e) =>\n updateNodeProps(cell.id, { text: e.target.value }, registry)\n }\n onKeyDown={(e) => handleCellKeyDown(e, rowIdx, colIdx)}\n onFocus={() => selectNode(cell.id)}\n placeholder={isHeaderCell ? 'Header...' : 'Data...'}\n className={`w-full bg-transparent border-0 focus:outline-none focus:ring-0 text-xs px-1 py-0.5 rounded text-slate-900 ${\n isHeaderCell ? 'font-semibold text-slate-800' : ''\n }`}\n />\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n updateNodeProps(\n cell.id,\n { tag: isHeaderCell ? 'td' : 'th' },\n registry,\n );\n }}\n title={`Current: ${isHeaderCell ? 'Header (TH)' : 'Data (TD)'}. Click to switch.`}\n className={`opacity-0 group-hover:opacity-100 text-[9px] px-1 py-0.5 rounded font-mono uppercase transition ${\n isHeaderCell\n ? 'bg-purple-100 text-purple-700 hover:bg-purple-200'\n : 'bg-slate-100 text-slate-600 hover:bg-slate-200'\n }`}\n >\n {isHeaderCell ? 'TH' : 'TD'}\n </button>\n </div>\n </td>\n );\n })}\n\n {/* Row Delete Action */}\n <td className=\"p-1 text-center border-l border-slate-200\">\n <button\n type=\"button\"\n onClick={() => deleteComponent(row.id)}\n title={`Delete Row ${rowIdx + 1}`}\n className=\"text-slate-400 hover:text-red-600 p-1 rounded flex items-center justify-center mx-auto\"\n >\n <Trash2 className=\"w-3 h-3\" aria-hidden=\"true\" />\n </button>\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n </div>\n </div>\n );\n\n if (isFloating) {\n return (\n <>\n {renderedModal}\n <div\n style={{ left: `${pos.x}px`, top: `${pos.y}px`, touchAction: 'none' }}\n onPointerDown={handleHeaderPointerDown}\n className={`fixed z-40 min-w-[320px] sm:min-w-[380px] max-w-[620px] bg-white/95 backdrop-blur-md rounded-xl shadow-2xl border border-slate-300 flex flex-col max-h-[460px] overflow-hidden cursor-grab active:cursor-grabbing touch-none ${className}`}\n >\n {content}\n </div>\n </>\n );\n }\n\n return (\n <>\n {renderedModal}\n <div className={`flex flex-col border border-slate-200 rounded-lg overflow-hidden bg-white shadow-xs ${className}`}>\n {content}\n </div>\n </>\n );\n};\n","import React from 'react';\n\nexport interface ComponentIconProps {\n iconOrType?: string;\n className?: string;\n size?: number;\n}\n\nexport const ComponentIcon: React.FC<ComponentIconProps> = ({\n iconOrType,\n className = '',\n size = 15,\n}) => {\n const iconProps = {\n width: size,\n height: size,\n viewBox: '0 0 24 24',\n fill: 'none',\n stroke: 'currentColor',\n strokeWidth: 2,\n strokeLinecap: 'round' as const,\n strokeLinejoin: 'round' as const,\n className,\n };\n\n switch (iconOrType) {\n case 'layout':\n case 'page':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M9 21V9\" />\n </svg>\n );\n case 'rows':\n case 'section':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 10h18\" />\n <path d=\"M3 15h18\" />\n </svg>\n );\n case 'box':\n case 'container':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <rect width=\"10\" height=\"10\" x=\"7\" y=\"7\" rx=\"1\" strokeDasharray=\"2 2\" />\n </svg>\n );\n case 'columns':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M12 3v18\" />\n </svg>\n );\n case 'heading':\n return (\n <svg {...iconProps}>\n <path d=\"M6 12h12\" />\n <path d=\"M6 4v16\" />\n <path d=\"M18 4v16\" />\n </svg>\n );\n case 'type':\n case 'text':\n return (\n <svg {...iconProps}>\n <path d=\"M4 7V4h16v3\" />\n <path d=\"M9 20h6\" />\n <path d=\"M12 4v16\" />\n </svg>\n );\n case 'image':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <circle cx=\"9\" cy=\"9\" r=\"2\" />\n <path d=\"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21\" />\n </svg>\n );\n case 'mouse-pointer':\n case 'button':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"12\" x=\"3\" y=\"6\" rx=\"3\" />\n <path d=\"M8 12h8\" />\n </svg>\n );\n case 'database':\n case 'collection':\n return (\n <svg {...iconProps}>\n <ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\" />\n <path d=\"M3 5v14c0 1.66 4 3 9 3s9-1.34 9-3V5\" />\n <path d=\"M3 12c0 1.66 4 3 9 3s9-1.34 9-3\" />\n </svg>\n );\n case 'list':\n case 'list-item':\n return (\n <svg {...iconProps}>\n <line x1=\"8\" x2=\"21\" y1=\"6\" y2=\"6\" />\n <line x1=\"8\" x2=\"21\" y1=\"12\" y2=\"12\" />\n <line x1=\"8\" x2=\"21\" y1=\"18\" y2=\"18\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"6\" y2=\"6\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"12\" y2=\"12\" />\n <line x1=\"3\" x2=\"3.01\" y1=\"18\" y2=\"18\" />\n </svg>\n );\n case 'paragraph':\n return (\n <svg {...iconProps}>\n <path d=\"M13 4v16\" />\n <path d=\"M17 4v16\" />\n <path d=\"M19 4H9.5a4.5 4.5 0 0 0 0 9H13\" />\n </svg>\n );\n case 'link':\n return (\n <svg {...iconProps}>\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n );\n case 'blockquote':\n case 'quote':\n return (\n <svg {...iconProps}>\n <path d=\"M3 21c3 0 7-1 7-8V5c0-1.25-.756-2.017-2-2H4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2 1 0 1 0 1 1v1c0 1-1 2-2 2s-1 .008-1 1.031V20c0 1 0 1 1 1z\" />\n <path d=\"M15 21c3 0 7-1 7-8V5c0-1.25-.757-2.017-2-2h-4c-1.25 0-2 .75-2 1.972V11c0 1.25.75 2 2 2h.75c0 2.25.25 4-2.75 4v3c0 1 0 1 1 1z\" />\n </svg>\n );\n case 'badge':\n case 'tag':\n return (\n <svg {...iconProps}>\n <path d=\"M12 2H2v10l9.29 9.29c.94.94 2.48.94 3.42 0l6.58-6.58c.94-.94.94-2.48 0-3.42L12 2Z\" />\n <path d=\"M7 7h.01\" />\n </svg>\n );\n case 'code-block':\n case 'code':\n return (\n <svg {...iconProps}>\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n </svg>\n );\n case 'table':\n case 'table-row':\n case 'table-cell':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M3 9h18\" />\n <path d=\"M3 15h18\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n case 'icon':\n case 'sparkles':\n case 'star':\n return (\n <svg {...iconProps}>\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\" />\n </svg>\n );\n case 'html-embed':\n return (\n <svg {...iconProps}>\n <polyline points=\"16 18 22 12 16 6\" />\n <polyline points=\"8 6 2 12 8 18\" />\n <line x1=\"14\" x2=\"10\" y1=\"4\" y2=\"20\" />\n </svg>\n );\n case 'video':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"14\" x=\"3\" y=\"5\" rx=\"2\" />\n <polygon points=\"10 9 15 12 10 15 10 9\" />\n </svg>\n );\n case 'divider':\n case 'hr':\n return (\n <svg {...iconProps}>\n <line x1=\"3\" x2=\"21\" y1=\"12\" y2=\"12\" />\n </svg>\n );\n case 'form':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M7 8h10\" />\n <path d=\"M7 12h10\" />\n <path d=\"M7 16h6\" />\n </svg>\n );\n case 'input':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"12\" x=\"3\" y=\"6\" rx=\"2\" />\n <path d=\"M7 10v4\" />\n </svg>\n );\n case 'textarea':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M7 7h10\" />\n <path d=\"M7 11h10\" />\n <path d=\"M7 15h4\" />\n </svg>\n );\n case 'select':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"12\" x=\"3\" y=\"6\" rx=\"2\" />\n <path d=\"m15 10 2 2-2 2\" />\n </svg>\n );\n case 'checkbox':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"m9 12 2 2 4-4\" />\n </svg>\n );\n case 'radio':\n return (\n <svg {...iconProps}>\n <circle cx=\"12\" cy=\"12\" r=\"9\" />\n <circle cx=\"12\" cy=\"12\" r=\"4\" fill=\"currentColor\" />\n </svg>\n );\n case 'dimension':\n case 'maximize':\n return (\n <svg {...iconProps}>\n <path d=\"M8 3H5a2 2 0 0 0-2 2v3m18 0V5a2 2 0 0 0-2-2h-3m0 18h3a2 2 0 0 0 2-2v-3M3 16v3a2 2 0 0 0 2 2h3\" />\n </svg>\n );\n case 'spacing':\n case 'box-model':\n case 'margin':\n return (\n <svg {...iconProps}>\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" strokeDasharray=\"3 3\" />\n <rect width=\"10\" height=\"10\" x=\"7\" y=\"7\" rx=\"1\" />\n </svg>\n );\n case 'typography':\n return (\n <svg {...iconProps}>\n <polyline points=\"4 7 4 4 20 4 20 7\" />\n <line x1=\"9\" x2=\"15\" y1=\"20\" y2=\"20\" />\n <line x1=\"12\" x2=\"12\" y1=\"4\" y2=\"20\" />\n </svg>\n );\n case 'decorations':\n case 'palette':\n return (\n <svg {...iconProps}>\n <circle cx=\"13.5\" cy=\"6.5\" r=\".5\" fill=\"currentColor\" />\n <circle cx=\"17.5\" cy=\"10.5\" r=\".5\" fill=\"currentColor\" />\n <circle cx=\"8.5\" cy=\"7.5\" r=\".5\" fill=\"currentColor\" />\n <circle cx=\"6.5\" cy=\"12.5\" r=\".5\" fill=\"currentColor\" />\n <path d=\"M12 2C6.5 2 2 6.5 2 12s4.5 10 10 10c.926 0 1.648-.746 1.648-1.688 0-.437-.18-.835-.437-1.125-.29-.289-.438-.652-.438-1.125a1.64 1.64 0 0 1 1.668-1.668h1.996c3.051 0 5.555-2.503 5.555-5.554C21.965 6.012 17.461 2 12 2z\" />\n </svg>\n );\n case 'flex':\n case 'alignment':\n case 'align':\n return (\n <svg {...iconProps}>\n <rect width=\"6\" height=\"14\" x=\"4\" y=\"5\" rx=\"1\" />\n <rect width=\"6\" height=\"10\" x=\"14\" y=\"7\" rx=\"1\" />\n </svg>\n );\n case 'motion':\n case 'animation':\n return (\n <svg {...iconProps}>\n <path d=\"m12 3-1.912 5.813a2 2 0 0 1-1.275 1.275L3 12l5.813 1.912a2 2 0 0 1 1.275 1.275L12 21l1.912-5.813a2 2 0 0 1 1.275-1.275L21 12l-5.813-1.912a2 2 0 0 1-1.275-1.275L12 3Z\" />\n <path d=\"M5 3v4\" />\n <path d=\"M19 17v4\" />\n <path d=\"M3 5h4\" />\n <path d=\"M17 19h4\" />\n </svg>\n );\n case 'play':\n return (\n <svg {...iconProps}>\n <polygon points=\"6 3 20 12 6 21 6 3\" fill=\"currentColor\" />\n </svg>\n );\n case 'chevron-down':\n return (\n <svg {...iconProps}>\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n case 'chevron-right':\n return (\n <svg {...iconProps}>\n <path d=\"m9 18 6-6-6-6\" />\n </svg>\n );\n case 'reset':\n case 'rotate-ccw':\n case 'refresh':\n return (\n <svg {...iconProps}>\n <path d=\"M3 12a9 9 0 1 0 9-9 9.75 9.75 0 0 0-6.74 2.74L3 8\" />\n <path d=\"M3 3v5h5\" />\n </svg>\n );\n default:\n return (\n <svg {...iconProps}>\n <path d=\"M21 16V8a2 2 0 0 0-1-1.73l-7-4a2 2 0 0 0-2 0l-7 4A2 2 0 0 0 3 8v8a2 2 0 0 0 1 1.73l7 4a2 2 0 0 0 2 0l7-4A2 2 0 0 0 21 16z\" />\n </svg>\n );\n }\n};\n","import React, { useState, useEffect, useCallback } from 'react';\nimport { AnimationConfig, DEFAULT_ANIMATION_CONFIG } from '@kubuild/schema';\nimport { ComponentIcon } from './icons';\nimport { BoxModelEditor } from './box-model-editor';\nimport { DimensionSectorControls } from './dimension-sector-controls';\nimport { TypographySectorControls } from './typography-sector-controls';\nimport { MotionSectorControls } from './motion-sector-controls';\n\nexport type StyleSectorId = 'dimension' | 'spacing' | 'typography' | 'decorations' | 'flex' | 'motion';\n\nexport interface StyleSectorDefinition {\n id: StyleSectorId;\n label: string;\n icon: string;\n description?: string;\n properties: string[];\n}\n\nexport const STYLE_SECTORS: StyleSectorDefinition[] = [\n {\n id: 'dimension',\n label: 'Dimension',\n icon: 'dimension',\n description: 'Width, height, min/max limits, display & overflow',\n properties: ['display', 'width', 'height', 'minWidth', 'maxWidth', 'minHeight', 'maxHeight', 'overflow'],\n },\n {\n id: 'spacing',\n label: 'Spacing (Box Model)',\n icon: 'spacing',\n description: 'Margin, border widths, padding & box dimensions',\n properties: [\n 'marginTop',\n 'marginRight',\n 'marginBottom',\n 'marginLeft',\n 'paddingTop',\n 'paddingRight',\n 'paddingBottom',\n 'paddingLeft',\n 'borderTopWidth',\n 'borderRightWidth',\n 'borderBottomWidth',\n 'borderLeftWidth',\n ],\n },\n {\n id: 'typography',\n label: 'Typography',\n icon: 'typography',\n description: 'Font family, size, weight, line-height, text color & align',\n properties: ['fontFamily', 'fontSize', 'fontWeight', 'lineHeight', 'letterSpacing', 'color', 'textAlign', 'textDecoration', 'textTransform'],\n },\n {\n id: 'decorations',\n label: 'Decorations',\n icon: 'decorations',\n description: 'Background, borders, radius, shadow & opacity',\n properties: ['backgroundColor', 'backgroundImage', 'borderStyle', 'borderWidth', 'borderColor', 'borderRadius', 'boxShadow', 'opacity'],\n },\n {\n id: 'flex',\n label: 'Flex / Alignment',\n icon: 'flex',\n description: 'Flex direction, alignment, wrapping & gap',\n properties: ['flexDirection', 'justifyContent', 'alignItems', 'flexWrap', 'gap', 'alignContent', 'flexGrow', 'flexShrink'],\n },\n {\n id: 'motion',\n label: 'Motion / Animation',\n icon: 'motion',\n description: 'Scroll entrance effects, duration, delay, hover & loop animations',\n properties: ['type', 'duration', 'delay', 'easing', 'once', 'hoverEffect', 'loopEffect'],\n },\n];\n\nexport const STORAGE_KEY_ACCORDION = 'kubuild:style-manager-accordion';\n\nexport const DEFAULT_ACCORDION_STATE: Record<StyleSectorId, boolean> = {\n dimension: true,\n spacing: true,\n typography: false,\n decorations: false,\n flex: false,\n motion: false,\n};\n\nlet memoryStorage: Record<string, string> = {};\n\nexport function getStorage(): {\n getItem: (key: string) => string | null;\n setItem: (key: string, value: string) => void;\n removeItem: (key: string) => void;\n} {\n try {\n if (typeof window !== 'undefined' && window.localStorage) {\n return window.localStorage;\n }\n if (typeof localStorage !== 'undefined') {\n return localStorage;\n }\n } catch {\n // restricted storage fallback\n }\n return {\n getItem: (k: string) => memoryStorage[k] ?? null,\n setItem: (k: string, v: string) => {\n memoryStorage[k] = v;\n },\n removeItem: (k: string) => {\n delete memoryStorage[k];\n },\n };\n}\n\nexport function clearMemoryStorage(): void {\n memoryStorage = {};\n}\n\nexport function loadAccordionState(): Record<StyleSectorId, boolean> {\n const storage = getStorage();\n try {\n const raw = storage.getItem(STORAGE_KEY_ACCORDION);\n if (!raw) return { ...DEFAULT_ACCORDION_STATE };\n const parsed = JSON.parse(raw);\n return {\n ...DEFAULT_ACCORDION_STATE,\n ...parsed,\n };\n } catch {\n return { ...DEFAULT_ACCORDION_STATE };\n }\n}\n\nexport function saveAccordionState(state: Record<StyleSectorId, boolean>): void {\n const storage = getStorage();\n try {\n storage.setItem(STORAGE_KEY_ACCORDION, JSON.stringify(state));\n } catch {\n // ignore quota/security errors\n }\n}\n\nexport interface StyleManagerAccordionProps {\n styles?: Record<string, unknown>;\n animation?: Partial<AnimationConfig>;\n onCommitStyle: (property: string, value: string) => void;\n onCommitAnimation?: (animation: Partial<AnimationConfig>) => void;\n onResetStyles?: (properties?: string[]) => void;\n onResetAnimation?: () => void;\n onReplayAnimation?: () => void;\n errors?: Record<string, string | null>;\n breakpoint?: 'base' | 'tablet' | 'mobile';\n className?: string;\n initialState?: Partial<Record<StyleSectorId, boolean>>;\n /** Optional filter for allowed style sectors. If omitted, all sectors are displayed. */\n allowedSectors?: StyleSectorId[];\n}\n\nexport const StyleManagerAccordion: React.FC<StyleManagerAccordionProps> = ({\n styles = {},\n animation,\n onCommitStyle,\n onCommitAnimation,\n onResetStyles,\n onResetAnimation,\n onReplayAnimation,\n errors = {},\n breakpoint = 'base',\n className = '',\n initialState,\n allowedSectors,\n}) => {\n const visibleSectors = React.useMemo(() => {\n if (!allowedSectors || allowedSectors.length === 0) return STYLE_SECTORS;\n return STYLE_SECTORS.filter((sector) => allowedSectors.includes(sector.id));\n }, [allowedSectors]);\n\n const [openState, setOpenState] = useState<Record<StyleSectorId, boolean>>(() => ({\n ...loadAccordionState(),\n ...initialState,\n }));\n\n const toggleSector = useCallback((sectorId: StyleSectorId) => {\n setOpenState((prev) => {\n const next = { ...prev, [sectorId]: !prev[sectorId] };\n saveAccordionState(next);\n return next;\n });\n }, []);\n\n const expandAll = useCallback(() => {\n const next: Record<StyleSectorId, boolean> = {\n dimension: true,\n spacing: true,\n typography: true,\n decorations: true,\n flex: true,\n motion: true,\n };\n setOpenState(next);\n saveAccordionState(next);\n }, []);\n\n const collapseAll = useCallback(() => {\n const next: Record<StyleSectorId, boolean> = {\n dimension: false,\n spacing: false,\n typography: false,\n decorations: false,\n flex: false,\n motion: false,\n };\n setOpenState(next);\n saveAccordionState(next);\n }, []);\n\n const handleResetSector = useCallback(\n (e: React.MouseEvent, sector: StyleSectorDefinition) => {\n e.stopPropagation();\n if (sector.id === 'motion') {\n if (onResetAnimation) {\n onResetAnimation();\n } else if (onCommitAnimation) {\n onCommitAnimation(DEFAULT_ANIMATION_CONFIG);\n }\n return;\n }\n\n if (onResetStyles) {\n onResetStyles(sector.properties);\n } else {\n sector.properties.forEach((prop) => {\n if (styles[prop] !== undefined && styles[prop] !== null && styles[prop] !== '') {\n onCommitStyle(prop, '');\n }\n });\n }\n },\n [onResetStyles, onCommitStyle, onResetAnimation, onCommitAnimation, styles],\n );\n\n const handleResetAll = useCallback(() => {\n if (onResetStyles) {\n onResetStyles();\n } else {\n Object.keys(styles).forEach((prop) => {\n if (styles[prop] !== undefined && styles[prop] !== null && styles[prop] !== '') {\n onCommitStyle(prop, '');\n }\n });\n }\n if (onResetAnimation) {\n onResetAnimation();\n } else if (onCommitAnimation) {\n onCommitAnimation(DEFAULT_ANIMATION_CONFIG);\n }\n }, [onResetStyles, onCommitStyle, onResetAnimation, onCommitAnimation, styles]);\n\n // Compute number of active custom properties per sector\n const getActivePropertyCount = (sector: StyleSectorDefinition): number => {\n if (sector.id === 'motion') {\n let count = 0;\n if (animation?.type && animation.type !== 'none') count++;\n if (animation?.delay !== undefined && animation.delay > 0) count++;\n if (animation?.hoverEffect && animation.hoverEffect !== 'none') count++;\n if (animation?.loopEffect && animation.loopEffect !== 'none') count++;\n return count;\n }\n\n return sector.properties.filter((prop) => {\n const val = styles[prop];\n return val !== undefined && val !== null && val !== '';\n }).length;\n };\n\n const isMotionActive =\n Boolean(animation?.type && animation.type !== 'none') ||\n Boolean(animation?.hoverEffect && animation.hoverEffect !== 'none') ||\n Boolean(animation?.loopEffect && animation.loopEffect !== 'none') ||\n Boolean(animation?.delay !== undefined && animation.delay > 0);\n\n const totalActiveStyles =\n Object.values(styles).filter(\n (val) => val !== undefined && val !== null && val !== '',\n ).length + (isMotionActive ? 1 : 0);\n\n return (\n <div className={`flex flex-col gap-2 w-full min-w-0 max-w-full ${className}`} data-testid=\"style-manager-accordion\">\n {/* Top Header Controls — stacked in two rows so the narrow inspector\n panel (w-72) never overflows: title+badge on top, actions below. */}\n <div className=\"flex flex-col gap-1 px-1 py-0.5 min-w-0\">\n <div className=\"flex items-center gap-1.5 text-xs font-semibold text-slate-500 uppercase tracking-wide min-w-0\">\n <span className=\"truncate\">Style Manager</span>\n <span className=\"shrink-0 px-1.5 py-0.2 text-[10px] font-medium bg-slate-100 text-slate-600 rounded border border-slate-200\">\n {breakpoint === 'base' ? 'base' : `${breakpoint} override`}\n </span>\n </div>\n <div className=\"flex items-center gap-1 flex-wrap\">\n <button\n type=\"button\"\n onClick={expandAll}\n title=\"Expand All Sectors\"\n className=\"px-1.5 py-0.5 text-[10px] font-medium text-slate-500 hover:text-slate-800 hover:bg-slate-100 rounded transition whitespace-nowrap\"\n >\n Expand All\n </button>\n <span className=\"text-slate-300 text-xs\">|</span>\n <button\n type=\"button\"\n onClick={collapseAll}\n title=\"Collapse All Sectors\"\n className=\"px-1.5 py-0.5 text-[10px] font-medium text-slate-500 hover:text-slate-800 hover:bg-slate-100 rounded transition whitespace-nowrap\"\n >\n Collapse All\n </button>\n {totalActiveStyles > 0 && (\n <>\n <span className=\"text-slate-300 text-xs\">|</span>\n <button\n type=\"button\"\n data-testid=\"style-manager-reset-all\"\n onClick={handleResetAll}\n title=\"Reset all styles on active node\"\n className=\"flex items-center gap-1 px-1.5 py-0.5 text-[10px] font-medium text-red-600 hover:text-red-800 hover:bg-red-50 rounded transition whitespace-nowrap\"\n >\n <ComponentIcon iconOrType=\"reset\" size={11} />\n <span>Reset CSS</span>\n </button>\n </>\n )}\n </div>\n </div>\n\n {/* Accordion Sectors List */}\n <div className=\"flex flex-col gap-1.5\">\n {visibleSectors.map((sector) => {\n const isOpen = Boolean(openState[sector.id]);\n const activeCount = getActivePropertyCount(sector);\n\n return (\n <div\n key={sector.id}\n data-testid={`sector-${sector.id}`}\n className=\"rounded-lg border border-slate-200 bg-white overflow-hidden shadow-2xs transition-colors\"\n >\n {/* Sector Header / Toggle Button */}\n <button\n type=\"button\"\n onClick={() => toggleSector(sector.id)}\n aria-expanded={isOpen}\n aria-controls={`sector-content-${sector.id}`}\n data-testid={`sector-header-${sector.id}`}\n className=\"w-full flex items-center justify-between px-3 py-2 text-left bg-slate-50/70 hover:bg-slate-100/70 transition cursor-pointer select-none\"\n >\n <div className=\"flex items-center gap-2 min-w-0\">\n <span className=\"text-slate-500 shrink-0\">\n <ComponentIcon iconOrType={sector.icon} size={14} />\n </span>\n <span className=\"text-xs font-semibold text-slate-700 truncate\">\n {sector.label}\n </span>\n {activeCount > 0 && (\n <span\n title={`${activeCount} custom properties set`}\n className=\"px-1.5 py-0.2 text-[9px] font-bold bg-blue-100 text-blue-700 rounded-full border border-blue-200 leading-none\"\n >\n {activeCount}\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5 shrink-0 ml-2\">\n {activeCount > 0 && (\n <button\n type=\"button\"\n data-testid={`sector-reset-${sector.id}`}\n title={`Reset ${sector.label} styles`}\n onClick={(e) => handleResetSector(e, sector)}\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition\"\n >\n <ComponentIcon iconOrType=\"reset\" size={11} />\n </button>\n )}\n <span\n className={`text-slate-400 transform transition-transform duration-200 ${\n isOpen ? 'rotate-180' : 'rotate-0'\n }`}\n >\n <ComponentIcon iconOrType=\"chevron-down\" size={13} />\n </span>\n </div>\n </button>\n\n {/* Sector Body / Animated Container */}\n {isOpen && (\n <div\n id={`sector-content-${sector.id}`}\n data-testid={`sector-body-${sector.id}`}\n className=\"p-3 border-t border-slate-100 bg-white animate-fadeIn\"\n >\n {sector.id === 'spacing' && (\n <div className=\"flex flex-col gap-3\">\n {/* Visual Box Model Diagram */}\n <BoxModelEditor\n values={styles}\n onChange={(prop, val) => onCommitStyle(prop, val)}\n />\n\n {/* Quick Field Grid */}\n <div className=\"pt-2 border-t border-slate-100\">\n <div className=\"text-[10px] font-semibold text-slate-400 uppercase tracking-wider mb-1.5\">\n Side Inputs\n </div>\n <div className=\"grid grid-cols-2 gap-2 text-xs\">\n {['marginTop', 'marginRight', 'marginBottom', 'marginLeft', 'paddingTop', 'paddingRight', 'paddingBottom', 'paddingLeft'].map(\n (prop) => (\n <div key={prop} className=\"flex items-center justify-between gap-1 bg-slate-50 px-2 py-1 rounded border border-slate-200\">\n <span className=\"text-[11px] text-slate-500 font-medium truncate\">\n {prop.replace(/([A-Z])/g, ' $1').toLowerCase()}\n </span>\n <input\n type=\"text\"\n placeholder=\"0\"\n value={String(styles[prop] ?? '')}\n onChange={(e) => onCommitStyle(prop, e.target.value)}\n className=\"w-14 text-right font-mono text-[11px] bg-white border border-slate-200 rounded px-1.5 py-0.5 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n </div>\n ),\n )}\n </div>\n </div>\n </div>\n )}\n\n {sector.id === 'dimension' && (\n <DimensionSectorControls\n styles={styles}\n onChange={onCommitStyle}\n />\n )}\n\n {sector.id === 'typography' && (\n <TypographySectorControls\n styles={styles}\n onChange={onCommitStyle}\n />\n )}\n\n {sector.id === 'decorations' && (\n <div className=\"flex flex-col gap-2.5\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Background Color</label>\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"color\"\n value={typeof styles.backgroundColor === 'string' && styles.backgroundColor.startsWith('#') ? styles.backgroundColor : '#ffffff'}\n onChange={(e) => onCommitStyle('backgroundColor', e.target.value)}\n className=\"w-7 h-7 rounded border border-slate-300 cursor-pointer p-0.5\"\n />\n <input\n type=\"text\"\n placeholder=\"transparent / #ffffff\"\n value={String(styles.backgroundColor ?? '')}\n onChange={(e) => onCommitStyle('backgroundColor', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none font-mono\"\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Border Radius</label>\n <input\n type=\"text\"\n placeholder=\"0px\"\n value={String(styles.borderRadius ?? '')}\n onChange={(e) => onCommitStyle('borderRadius', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Border Style</label>\n <select\n value={String(styles.borderStyle ?? 'none')}\n onChange={(e) => onCommitStyle('borderStyle', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"none\">None</option>\n <option value=\"solid\">Solid</option>\n <option value=\"dashed\">Dashed</option>\n <option value=\"dotted\">Dotted</option>\n </select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Border Color</label>\n <input\n type=\"text\"\n placeholder=\"#e2e8f0\"\n value={String(styles.borderColor ?? '')}\n onChange={(e) => onCommitStyle('borderColor', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none font-mono\"\n />\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Box Shadow</label>\n <input\n type=\"text\"\n placeholder=\"none\"\n value={String(styles.boxShadow ?? '')}\n onChange={(e) => onCommitStyle('boxShadow', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none font-mono\"\n />\n </div>\n </div>\n </div>\n )}\n\n {sector.id === 'flex' && (\n <div className=\"flex flex-col gap-2.5\">\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Direction</label>\n <select\n value={String(styles.flexDirection ?? 'row')}\n onChange={(e) => onCommitStyle('flexDirection', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"row\">Row (Horizontal)</option>\n <option value=\"column\">Column (Vertical)</option>\n <option value=\"row-reverse\">Row Reverse</option>\n <option value=\"column-reverse\">Column Reverse</option>\n </select>\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Wrap</label>\n <select\n value={String(styles.flexWrap ?? 'nowrap')}\n onChange={(e) => onCommitStyle('flexWrap', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"nowrap\">No Wrap</option>\n <option value=\"wrap\">Wrap</option>\n <option value=\"wrap-reverse\">Wrap Reverse</option>\n </select>\n </div>\n </div>\n\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Justify Content</label>\n <select\n value={String(styles.justifyContent ?? 'flex-start')}\n onChange={(e) => onCommitStyle('justifyContent', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"space-between\">Space Between</option>\n <option value=\"space-around\">Space Around</option>\n <option value=\"space-evenly\">Space Evenly</option>\n </select>\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Align Items</label>\n <select\n value={String(styles.alignItems ?? 'stretch')}\n onChange={(e) => onCommitStyle('alignItems', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n <option value=\"stretch\">Stretch</option>\n <option value=\"flex-start\">Start</option>\n <option value=\"center\">Center</option>\n <option value=\"flex-end\">End</option>\n <option value=\"baseline\">Baseline</option>\n </select>\n </div>\n </div>\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Gap</label>\n <input\n type=\"text\"\n placeholder=\"0px / 1rem\"\n value={String(styles.gap ?? '')}\n onChange={(e) => onCommitStyle('gap', e.target.value)}\n className=\"w-full text-xs bg-white border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono\"\n />\n </div>\n </div>\n )}\n\n {sector.id === 'motion' && (\n <MotionSectorControls\n animation={animation}\n onChange={onCommitAnimation ?? (() => {})}\n onReplay={onReplayAnimation}\n />\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useRef } from 'react';\n\nexport interface BoxModelValues {\n marginTop?: string | number;\n marginRight?: string | number;\n marginBottom?: string | number;\n marginLeft?: string | number;\n\n borderTopWidth?: string | number;\n borderRightWidth?: string | number;\n borderBottomWidth?: string | number;\n borderLeftWidth?: string | number;\n\n paddingTop?: string | number;\n paddingRight?: string | number;\n paddingBottom?: string | number;\n paddingLeft?: string | number;\n}\n\nexport interface BoxModelEditorProps {\n values?: BoxModelValues | Record<string, unknown>;\n onChange?: (property: string, value: string) => void;\n className?: string;\n disabled?: boolean;\n}\n\nexport function parseBoxValue(val: unknown): { num: string; unit: string; raw: string } {\n if (val === undefined || val === null || val === '') {\n return { num: '-', unit: 'px', raw: '' };\n }\n if (typeof val === 'number') {\n return { num: String(val), unit: 'px', raw: `${val}px` };\n }\n const str = String(val).trim();\n if (str.toLowerCase() === 'auto') {\n return { num: 'auto', unit: 'auto', raw: 'auto' };\n }\n const match = str.match(/^(-?\\d*\\.?\\d+)\\s*(px|rem|%|em|vh|vw)?$/i);\n if (match) {\n const unit = match[2]?.toLowerCase() || 'px';\n return { num: match[1], unit, raw: str };\n }\n return { num: str, unit: 'px', raw: str };\n}\n\ninterface BoxSideInputProps {\n property: string;\n label: string;\n value: unknown;\n onChange?: (property: string, value: string) => void;\n theme: 'margin' | 'border' | 'padding';\n allowAuto?: boolean;\n disabled?: boolean;\n}\n\nconst BoxSideInput: React.FC<BoxSideInputProps> = ({\n property,\n label,\n value,\n onChange,\n theme,\n allowAuto = false,\n disabled = false,\n}) => {\n const parsed = parseBoxValue(value);\n const [isEditing, setIsEditing] = useState(false);\n const [inputValue, setInputValue] = useState(parsed.raw === '' ? '' : parsed.num);\n const inputRef = useRef<HTMLInputElement>(null);\n\n useEffect(() => {\n if (!isEditing) {\n setInputValue(parsed.raw === '' ? '' : parsed.num);\n }\n }, [value, isEditing, parsed.num, parsed.raw]);\n\n const commitValue = (rawInput: string) => {\n const trimmed = rawInput.trim();\n if (trimmed === '' || trimmed === '-') {\n onChange?.(property, '');\n return;\n }\n if (allowAuto && trimmed.toLowerCase() === 'auto') {\n onChange?.(property, 'auto');\n return;\n }\n const matchWithUnit = trimmed.match(/^(-?\\d*\\.?\\d+)\\s*(px|rem|%|em|vh|vw)$/i);\n if (matchWithUnit) {\n onChange?.(property, `${matchWithUnit[1]}${matchWithUnit[2].toLowerCase()}`);\n return;\n }\n const numOnly = Number(trimmed);\n if (!Number.isNaN(numOnly)) {\n const currentUnit = parsed.unit && parsed.unit !== 'auto' ? parsed.unit : 'px';\n onChange?.(property, `${trimmed}${currentUnit}`);\n return;\n }\n onChange?.(property, trimmed);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n commitValue(inputValue);\n setIsEditing(false);\n } else if (e.key === 'Escape') {\n setIsEditing(false);\n setInputValue(parsed.raw === '' ? '' : parsed.num);\n } else if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n const currentNum = Number(inputValue) || 0;\n const step = e.shiftKey ? 10 : 1;\n const nextNum = e.key === 'ArrowUp' ? currentNum + step : Math.max(0, currentNum - step);\n const strVal = String(nextNum);\n setInputValue(strVal);\n commitValue(strVal);\n }\n };\n\n const themeInputStyles = {\n margin:\n 'text-amber-900 bg-amber-100 border-amber-400 focus:ring-amber-500 hover:border-amber-500',\n border:\n 'text-slate-900 bg-slate-200 border-slate-400 focus:ring-slate-500 hover:border-slate-500',\n padding:\n 'text-emerald-900 bg-emerald-100 border-emerald-400 focus:ring-emerald-500 hover:border-emerald-500',\n }[theme];\n\n const displayText = parsed.num === '-' ? '0' : parsed.num;\n\n if (isEditing && !disabled) {\n return (\n <input\n ref={inputRef}\n type=\"text\"\n aria-label={label}\n data-testid={`box-input-${property}`}\n value={inputValue}\n autoFocus\n onChange={(e) => {\n setInputValue(e.target.value);\n commitValue(e.target.value);\n }}\n onBlur={() => {\n commitValue(inputValue);\n setIsEditing(false);\n }}\n onKeyDown={handleKeyDown}\n className={`w-9 text-center font-mono text-[10px] font-semibold py-0 px-0.5 rounded border focus:outline-none focus:ring-1 shadow-2xs transition ${themeInputStyles}`}\n />\n );\n }\n\n return (\n <button\n type=\"button\"\n disabled={disabled}\n aria-label={label}\n data-testid={`box-btn-${property}`}\n onClick={() => {\n setIsEditing(true);\n setTimeout(() => inputRef.current?.select(), 10);\n }}\n title={`${label}: ${parsed.raw || '0px'} (Click to edit)`}\n className={`min-w-[20px] max-w-[38px] truncate px-1 py-0.5 text-center font-mono text-[10px] font-semibold rounded cursor-pointer transition select-none hover:bg-white/80 active:scale-95 ${\n parsed.num !== '-' && parsed.num !== '0'\n ? 'bg-white/90 shadow-2xs font-bold text-slate-900'\n : 'text-slate-600 hover:text-slate-900'\n }`}\n >\n {displayText}\n </button>\n );\n};\n\nexport const BoxModelEditor: React.FC<BoxModelEditorProps> = ({\n values = {},\n onChange,\n className = '',\n disabled = false,\n}) => {\n return (\n <div\n className={`w-full max-w-full select-none rounded-lg p-2 bg-slate-50 border border-slate-200 text-slate-800 box-border overflow-hidden shadow-2xs ${className}`}\n data-testid=\"visual-box-model\"\n >\n {/* MARGIN LAYER (Outer - Orange/Amber) */}\n <div className=\"relative w-full rounded-md border-2 border-dashed border-amber-400/80 bg-amber-500/10 p-2 box-border transition-colors\">\n <span className=\"absolute top-1 left-1.5 text-[8px] font-black uppercase tracking-wider text-amber-700 pointer-events-none select-none\">\n Margin\n </span>\n\n {/* Margin Top */}\n <div className=\"flex justify-center mb-1\">\n <BoxSideInput\n property=\"marginTop\"\n label=\"Margin Top\"\n value={values.marginTop}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n\n <div className=\"flex items-center gap-1 min-w-0\">\n {/* Margin Left */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"marginLeft\"\n label=\"Margin Left\"\n value={values.marginLeft}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n\n {/* BORDER LAYER (Middle - Slate/Gray) */}\n <div className=\"relative flex-1 min-w-0 rounded-md border-2 border-solid border-slate-300 bg-slate-200/50 p-2 box-border transition-colors\">\n <span className=\"absolute top-1 left-1.5 text-[8px] font-black uppercase tracking-wider text-slate-600 pointer-events-none select-none\">\n Border\n </span>\n\n {/* Border Top */}\n <div className=\"flex justify-center mb-1\">\n <BoxSideInput\n property=\"borderTopWidth\"\n label=\"Border Top Width\"\n value={values.borderTopWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n\n <div className=\"flex items-center gap-1 min-w-0\">\n {/* Border Left */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"borderLeftWidth\"\n label=\"Border Left Width\"\n value={values.borderLeftWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n\n {/* PADDING LAYER (Inner - Emerald/Green) */}\n <div className=\"relative flex-1 min-w-0 rounded-md border-2 border-dashed border-emerald-400/80 bg-emerald-500/15 p-2 box-border transition-colors\">\n <span className=\"absolute top-1 left-1.5 text-[8px] font-black uppercase tracking-wider text-emerald-700 pointer-events-none select-none\">\n Padding\n </span>\n\n {/* Padding Top */}\n <div className=\"flex justify-center mb-1\">\n <BoxSideInput\n property=\"paddingTop\"\n label=\"Padding Top\"\n value={values.paddingTop}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n\n <div className=\"flex items-center gap-1 min-w-0\">\n {/* Padding Left */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"paddingLeft\"\n label=\"Padding Left\"\n value={values.paddingLeft}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n\n {/* CONTENT LAYER (Center - Blue/Neutral) */}\n <div className=\"flex-1 min-w-0 flex items-center justify-center py-1 px-1 rounded bg-blue-500/15 border border-blue-300 text-blue-800 shadow-2xs\">\n <span className=\"text-[9px] font-bold tracking-wider uppercase text-blue-700 truncate\">\n Content\n </span>\n </div>\n\n {/* Padding Right */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"paddingRight\"\n label=\"Padding Right\"\n value={values.paddingRight}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Padding Bottom */}\n <div className=\"flex justify-center mt-1\">\n <BoxSideInput\n property=\"paddingBottom\"\n label=\"Padding Bottom\"\n value={values.paddingBottom}\n onChange={onChange}\n theme=\"padding\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Border Right */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"borderRightWidth\"\n label=\"Border Right Width\"\n value={values.borderRightWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Border Bottom */}\n <div className=\"flex justify-center mt-1\">\n <BoxSideInput\n property=\"borderBottomWidth\"\n label=\"Border Bottom Width\"\n value={values.borderBottomWidth}\n onChange={onChange}\n theme=\"border\"\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Margin Right */}\n <div className=\"shrink-0 flex items-center justify-center\">\n <BoxSideInput\n property=\"marginRight\"\n label=\"Margin Right\"\n value={values.marginRight}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n </div>\n\n {/* Margin Bottom */}\n <div className=\"flex justify-center mt-1\">\n <BoxSideInput\n property=\"marginBottom\"\n label=\"Margin Bottom\"\n value={values.marginBottom}\n onChange={onChange}\n theme=\"margin\"\n allowAuto\n disabled={disabled}\n />\n </div>\n </div>\n </div>\n );\n};\n\nexport const VisualBoxModel = BoxModelEditor;\n","import React, { useState, useEffect, useRef } from 'react';\n\nexport const DIMENSION_UNITS = ['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none'] as const;\nexport type DimensionUnit = (typeof DIMENSION_UNITS)[number];\n\nexport interface ParsedDimension {\n num: string;\n unit: DimensionUnit;\n raw: string;\n}\n\nexport function parseDimensionValue(\n val: unknown,\n defaultUnit: DimensionUnit = 'px',\n): ParsedDimension {\n if (val === undefined || val === null || val === '') {\n return { num: '', unit: defaultUnit, raw: '' };\n }\n if (typeof val === 'number') {\n return { num: String(val), unit: 'px', raw: `${val}px` };\n }\n const str = String(val).trim();\n if (str.toLowerCase() === 'auto') {\n return { num: 'auto', unit: 'auto', raw: 'auto' };\n }\n if (str.toLowerCase() === 'none') {\n return { num: 'none', unit: 'none', raw: 'none' };\n }\n const match = str.match(/^(-?\\d*\\.?\\d+)\\s*(px|%|rem|em|vw|vh)?$/i);\n if (match) {\n const unitMatch = (match[2]?.toLowerCase() || defaultUnit) as DimensionUnit;\n return {\n num: match[1],\n unit: (DIMENSION_UNITS as readonly string[]).includes(unitMatch) ? unitMatch : defaultUnit,\n raw: str,\n };\n }\n return { num: str, unit: defaultUnit, raw: str };\n}\n\nexport interface DimensionUnitInputProps {\n property: string;\n label: string;\n value: unknown;\n onChange: (property: string, value: string) => void;\n allowedUnits?: DimensionUnit[];\n placeholder?: string;\n disabled?: boolean;\n}\n\nexport const DimensionUnitInput: React.FC<DimensionUnitInputProps> = ({\n property,\n label,\n value,\n onChange,\n allowedUnits = ['px', '%', 'rem', 'em', 'vw', 'vh', 'auto'],\n placeholder = 'auto',\n disabled = false,\n}) => {\n const parsed = parseDimensionValue(value);\n const [num, setNum] = useState(parsed.num);\n const [unit, setUnit] = useState<DimensionUnit>(parsed.unit);\n const isSpecialValue = unit === 'auto' || unit === 'none' || num === 'auto' || num === 'none';\n\n useEffect(() => {\n const next = parseDimensionValue(value);\n setNum(next.num);\n setUnit(next.unit);\n }, [value]);\n\n const handleNumChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const rawVal = e.target.value;\n setNum(rawVal);\n\n const trimmed = rawVal.trim();\n if (trimmed === '') {\n onChange(property, '');\n return;\n }\n if (trimmed.toLowerCase() === 'auto' && allowedUnits.includes('auto')) {\n setUnit('auto');\n onChange(property, 'auto');\n return;\n }\n if (trimmed.toLowerCase() === 'none' && allowedUnits.includes('none')) {\n setUnit('none');\n onChange(property, 'none');\n return;\n }\n\n // Check if user typed dimension like 100% or 2.5rem\n const match = trimmed.match(/^(-?\\d*\\.?\\d+)\\s*(px|%|rem|em|vw|vh)$/i);\n if (match) {\n const typedUnit = match[2].toLowerCase() as DimensionUnit;\n if (allowedUnits.includes(typedUnit)) {\n setUnit(typedUnit);\n onChange(property, `${match[1]}${typedUnit}`);\n return;\n }\n }\n\n const currentUnit = unit === 'auto' || unit === 'none' ? 'px' : unit;\n if (unit === 'auto' || unit === 'none') {\n setUnit('px');\n }\n onChange(property, `${trimmed}${currentUnit}`);\n };\n\n const handleUnitChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const nextUnit = e.target.value as DimensionUnit;\n setUnit(nextUnit);\n\n if (nextUnit === 'auto') {\n setNum('auto');\n onChange(property, 'auto');\n return;\n }\n if (nextUnit === 'none') {\n setNum('none');\n onChange(property, 'none');\n return;\n }\n\n if (num === 'auto' || num === 'none' || num.trim() === '') {\n setNum('');\n onChange(property, '');\n return;\n }\n\n onChange(property, `${num.trim()}${nextUnit}`);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (e.key === 'ArrowUp' || e.key === 'ArrowDown') {\n e.preventDefault();\n if (isSpecialValue) return;\n const currentNum = Number(num) || 0;\n const step = e.shiftKey ? 10 : 1;\n const nextNum = e.key === 'ArrowUp' ? currentNum + step : Math.max(0, currentNum - step);\n const strVal = String(nextNum);\n setNum(strVal);\n onChange(property, `${strVal}${unit}`);\n }\n };\n\n return (\n <div className=\"flex flex-col\">\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">{label}</label>\n <div className=\"flex items-center rounded border border-slate-300 bg-white focus-within:ring-1 focus-within:ring-blue-500 focus-within:border-blue-500 overflow-hidden shadow-2xs\">\n <input\n type={isSpecialValue ? 'text' : 'number'}\n data-testid={`dimension-input-${property}`}\n aria-label={label}\n value={num}\n placeholder={placeholder}\n disabled={disabled}\n onChange={handleNumChange}\n onKeyDown={handleKeyDown}\n className=\"w-full min-w-0 text-xs bg-white text-slate-900 px-2 py-1 focus:outline-none disabled:bg-slate-100 disabled:text-slate-500 font-mono\"\n />\n <select\n data-testid={`dimension-unit-${property}`}\n aria-label={`${label} Unit`}\n value={unit}\n disabled={disabled}\n onChange={handleUnitChange}\n className=\"shrink-0 text-[11px] bg-slate-100 text-slate-700 font-medium px-1.5 py-1 border-l border-slate-200 focus:outline-none cursor-pointer hover:bg-slate-200 transition\"\n >\n {allowedUnits.map((u) => (\n <option key={u} value={u}>\n {u}\n </option>\n ))}\n </select>\n </div>\n </div>\n );\n};\n\nexport interface DimensionSectorControlsProps {\n styles?: Record<string, unknown>;\n onChange: (property: string, value: string) => void;\n disabled?: boolean;\n className?: string;\n}\n\nexport const DimensionSectorControls: React.FC<DimensionSectorControlsProps> = ({\n styles = {},\n onChange,\n disabled = false,\n className = '',\n}) => {\n return (\n <div className={`flex flex-col gap-3 ${className}`} data-testid=\"dimension-sector-controls\">\n {/* Display & Overflow */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Display</label>\n <select\n data-testid=\"dimension-select-display\"\n aria-label=\"Display\"\n value={String(styles.display ?? 'block')}\n disabled={disabled}\n onChange={(e) => onChange('display', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <option value=\"block\">Block</option>\n <option value=\"flex\">Flex</option>\n <option value=\"inline-flex\">Inline Flex</option>\n <option value=\"inline-block\">Inline Block</option>\n <option value=\"inline\">Inline</option>\n <option value=\"grid\">Grid</option>\n <option value=\"inline-grid\">Inline Grid</option>\n <option value=\"none\">None</option>\n </select>\n </div>\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Overflow</label>\n <select\n data-testid=\"dimension-select-overflow\"\n aria-label=\"Overflow\"\n value={String(styles.overflow ?? 'visible')}\n disabled={disabled}\n onChange={(e) => onChange('overflow', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <option value=\"visible\">Visible</option>\n <option value=\"hidden\">Hidden</option>\n <option value=\"scroll\">Scroll</option>\n <option value=\"auto\">Auto</option>\n </select>\n </div>\n </div>\n\n {/* Width & Height */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"width\"\n label=\"Width\"\n value={styles.width}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"height\"\n label=\"Height\"\n value={styles.height}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n </div>\n\n {/* Min Width & Max Width */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"minWidth\"\n label=\"Min Width\"\n value={styles.minWidth}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"maxWidth\"\n label=\"Max Width\"\n value={styles.maxWidth}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"none\"\n disabled={disabled}\n />\n </div>\n\n {/* Min Height & Max Height */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"minHeight\"\n label=\"Min Height\"\n value={styles.minHeight}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"auto\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"maxHeight\"\n label=\"Max Height\"\n value={styles.maxHeight}\n onChange={onChange}\n allowedUnits={['px', '%', 'rem', 'em', 'vw', 'vh', 'auto', 'none']}\n placeholder=\"none\"\n disabled={disabled}\n />\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect } from 'react';\nimport { DimensionUnitInput } from './dimension-sector-controls';\nimport { AlignLeft, AlignCenter, AlignRight, AlignJustify } from 'lucide-react';\n\nexport interface FontOption {\n label: string;\n value: string;\n category: 'sans-serif' | 'serif' | 'display' | 'monospace' | 'system';\n googleFontName?: string;\n}\n\nexport const GOOGLE_FONTS: FontOption[] = [\n // System / Default\n { label: 'Default (Inherit)', value: '', category: 'system' },\n {\n label: 'System UI',\n value: 'system-ui, -apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, sans-serif',\n category: 'system',\n },\n\n // Sans-Serif Google Fonts\n { label: 'Inter', value: '\"Inter\", sans-serif', category: 'sans-serif', googleFontName: 'Inter' },\n {\n label: 'Plus Jakarta Sans',\n value: '\"Plus Jakarta Sans\", sans-serif',\n category: 'sans-serif',\n googleFontName: 'Plus Jakarta Sans',\n },\n { label: 'Outfit', value: '\"Outfit\", sans-serif', category: 'sans-serif', googleFontName: 'Outfit' },\n { label: 'Poppins', value: '\"Poppins\", sans-serif', category: 'sans-serif', googleFontName: 'Poppins' },\n { label: 'Roboto', value: '\"Roboto\", sans-serif', category: 'sans-serif', googleFontName: 'Roboto' },\n { label: 'Montserrat', value: '\"Montserrat\", sans-serif', category: 'sans-serif', googleFontName: 'Montserrat' },\n { label: 'Open Sans', value: '\"Open Sans\", sans-serif', category: 'sans-serif', googleFontName: 'Open Sans' },\n { label: 'Lato', value: '\"Lato\", sans-serif', category: 'sans-serif', googleFontName: 'Lato' },\n { label: 'DM Sans', value: '\"DM Sans\", sans-serif', category: 'sans-serif', googleFontName: 'DM Sans' },\n { label: 'Nunito', value: '\"Nunito\", sans-serif', category: 'sans-serif', googleFontName: 'Nunito' },\n\n // Serif Google Fonts\n {\n label: 'Playfair Display',\n value: '\"Playfair Display\", serif',\n category: 'serif',\n googleFontName: 'Playfair Display',\n },\n {\n label: 'Merriweather',\n value: '\"Merriweather\", serif',\n category: 'serif',\n googleFontName: 'Merriweather',\n },\n { label: 'Lora', value: '\"Lora\", serif', category: 'serif', googleFontName: 'Lora' },\n { label: 'Cinzel', value: '\"Cinzel\", serif', category: 'serif', googleFontName: 'Cinzel' },\n { label: 'PT Serif', value: '\"PT Serif\", serif', category: 'serif', googleFontName: 'PT Serif' },\n\n // Display / Modern Google Fonts\n {\n label: 'Space Grotesk',\n value: '\"Space Grotesk\", sans-serif',\n category: 'display',\n googleFontName: 'Space Grotesk',\n },\n { label: 'Syne', value: '\"Syne\", sans-serif', category: 'display', googleFontName: 'Syne' },\n { label: 'Bebas Neue', value: '\"Bebas Neue\", sans-serif', category: 'display', googleFontName: 'Bebas Neue' },\n\n // Monospace Google Fonts\n {\n label: 'JetBrains Mono',\n value: '\"JetBrains Mono\", monospace',\n category: 'monospace',\n googleFontName: 'JetBrains Mono',\n },\n { label: 'Fira Code', value: '\"Fira Code\", monospace', category: 'monospace', googleFontName: 'Fira Code' },\n {\n label: 'Source Code Pro',\n value: '\"Source Code Pro\", monospace',\n category: 'monospace',\n googleFontName: 'Source Code Pro',\n },\n];\n\nexport function loadGoogleFont(fontName: string): void {\n if (typeof document === 'undefined' || !fontName) return;\n const safeId = `google-font-${fontName.replace(/\\s+/g, '-').toLowerCase()}`;\n if (document.getElementById(safeId)) return;\n\n const link = document.createElement('link');\n link.id = safeId;\n link.rel = 'stylesheet';\n const queryName = fontName.replace(/\\s+/g, '+');\n link.href = `https://fonts.googleapis.com/css2?family=${queryName}:ital,wght@0,300;0,400;0,500;0,600;0,700;0,800;1,400;1,700&display=swap`;\n document.head.appendChild(link);\n}\n\nexport interface TypographySectorControlsProps {\n styles?: Record<string, unknown>;\n onChange: (property: string, value: string) => void;\n disabled?: boolean;\n className?: string;\n}\n\nexport const TypographySectorControls: React.FC<TypographySectorControlsProps> = ({\n styles = {},\n onChange,\n disabled = false,\n className = '',\n}) => {\n const currentFont = typeof styles.fontFamily === 'string' ? styles.fontFamily : '';\n const [isCustomFont, setIsCustomFont] = useState(false);\n const [customFontText, setCustomFontText] = useState(currentFont);\n\n // Check if currentFont matches one of the preset Google Fonts\n const matchedFont = GOOGLE_FONTS.find(\n (f) => f.value === currentFont || (f.googleFontName && currentFont.includes(f.googleFontName)),\n );\n\n useEffect(() => {\n if (matchedFont?.googleFontName) {\n loadGoogleFont(matchedFont.googleFontName);\n }\n }, [matchedFont]);\n\n const handleFontSelect = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const val = e.target.value;\n if (val === '__custom__') {\n setIsCustomFont(true);\n return;\n }\n setIsCustomFont(false);\n const selected = GOOGLE_FONTS.find((f) => f.value === val);\n if (selected?.googleFontName) {\n loadGoogleFont(selected.googleFontName);\n }\n onChange('fontFamily', val);\n };\n\n const handleCustomFontBlur = () => {\n if (customFontText.trim() !== '') {\n loadGoogleFont(customFontText.trim());\n onChange('fontFamily', customFontText.trim());\n } else {\n onChange('fontFamily', '');\n }\n };\n\n return (\n <div className={`flex flex-col gap-3 ${className}`} data-testid=\"typography-sector-controls\">\n {/* Font Family (Google Fonts) */}\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"block text-[11px] font-medium text-slate-600\">Font Family (Google Fonts)</label>\n <button\n type=\"button\"\n onClick={() => setIsCustomFont(!isCustomFont)}\n className=\"text-[10px] text-blue-600 hover:text-blue-800 underline cursor-pointer\"\n >\n {isCustomFont ? 'Choose from list' : 'Custom font'}\n </button>\n </div>\n\n {!isCustomFont ? (\n <select\n data-testid=\"typography-select-font-family\"\n aria-label=\"Font Family\"\n value={matchedFont ? matchedFont.value : currentFont ? '__custom__' : ''}\n disabled={disabled}\n onChange={handleFontSelect}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <optgroup label=\"System\">\n {GOOGLE_FONTS.filter((f) => f.category === 'system').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Sans-Serif\">\n {GOOGLE_FONTS.filter((f) => f.category === 'sans-serif').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Serif\">\n {GOOGLE_FONTS.filter((f) => f.category === 'serif').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Display\">\n {GOOGLE_FONTS.filter((f) => f.category === 'display').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <optgroup label=\"Google Monospace\">\n {GOOGLE_FONTS.filter((f) => f.category === 'monospace').map((f) => (\n <option key={f.label} value={f.value}>\n {f.label}\n </option>\n ))}\n </optgroup>\n <option value=\"__custom__\">Custom font name...</option>\n </select>\n ) : (\n <input\n type=\"text\"\n data-testid=\"typography-input-custom-font\"\n placeholder=\"e.g. Poppins, Outfit, serif\"\n value={customFontText}\n disabled={disabled}\n onChange={(e) => setCustomFontText(e.target.value)}\n onBlur={handleCustomFontBlur}\n onKeyDown={(e) => {\n if (e.key === 'Enter') handleCustomFontBlur();\n }}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs font-mono\"\n />\n )}\n </div>\n\n {/* Font Size & Font Weight */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"fontSize\"\n label=\"Font Size\"\n value={styles.fontSize}\n onChange={onChange}\n allowedUnits={['px', 'rem', 'em', 'vw', 'vh']}\n placeholder=\"16px\"\n disabled={disabled}\n />\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Font Weight</label>\n <select\n data-testid=\"typography-select-font-weight\"\n aria-label=\"Font Weight\"\n value={String(styles.fontWeight ?? 'normal')}\n disabled={disabled}\n onChange={(e) => onChange('fontWeight', e.target.value)}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-2xs cursor-pointer hover:border-slate-400 transition\"\n >\n <option value=\"100\">100 - Thin</option>\n <option value=\"200\">200 - Extra Light</option>\n <option value=\"300\">300 - Light</option>\n <option value=\"400\">400 - Regular</option>\n <option value=\"500\">500 - Medium</option>\n <option value=\"600\">600 - Semi Bold</option>\n <option value=\"700\">700 - Bold</option>\n <option value=\"800\">800 - Extra Bold</option>\n <option value=\"900\">900 - Black</option>\n </select>\n </div>\n </div>\n\n {/* Line Height & Letter Spacing */}\n <div className=\"grid grid-cols-2 gap-2\">\n <DimensionUnitInput\n property=\"lineHeight\"\n label=\"Line Height\"\n value={styles.lineHeight}\n onChange={onChange}\n allowedUnits={['px', 'rem', 'em', '%', 'auto']}\n placeholder=\"1.5\"\n disabled={disabled}\n />\n <DimensionUnitInput\n property=\"letterSpacing\"\n label=\"Letter Spacing\"\n value={styles.letterSpacing}\n onChange={onChange}\n allowedUnits={['px', 'rem', 'em', 'auto']}\n placeholder=\"0px\"\n disabled={disabled}\n />\n </div>\n\n {/* Color & Text Align */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Text Color</label>\n <div className=\"flex items-center rounded border border-slate-300 bg-white p-0.5 focus-within:ring-1 focus-within:ring-blue-500 shadow-2xs\">\n <input\n type=\"color\"\n data-testid=\"typography-color-picker\"\n aria-label=\"Color Picker\"\n value={typeof styles.color === 'string' && styles.color.startsWith('#') ? styles.color : '#000000'}\n disabled={disabled}\n onChange={(e) => onChange('color', e.target.value)}\n className=\"w-6 h-6 rounded border border-slate-200 cursor-pointer p-0 shrink-0\"\n />\n <input\n type=\"text\"\n data-testid=\"typography-input-color\"\n placeholder=\"#000000\"\n value={String(styles.color ?? '')}\n disabled={disabled}\n onChange={(e) => onChange('color', e.target.value)}\n className=\"w-full min-w-0 text-xs bg-white text-slate-900 px-1.5 py-0.5 focus:outline-none font-mono\"\n />\n </div>\n </div>\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Text Align</label>\n <div className=\"grid grid-cols-4 rounded border border-slate-300 bg-slate-100 p-0.5 gap-0.5 shadow-2xs\">\n {[\n { id: 'left', label: 'Left', icon: <AlignLeft className=\"w-3.5 h-3.5 mx-auto\" /> },\n { id: 'center', label: 'Center', icon: <AlignCenter className=\"w-3.5 h-3.5 mx-auto\" /> },\n { id: 'right', label: 'Right', icon: <AlignRight className=\"w-3.5 h-3.5 mx-auto\" /> },\n { id: 'justify', label: 'Justify', icon: <AlignJustify className=\"w-3.5 h-3.5 mx-auto\" /> },\n ].map((btn) => {\n const isActive = (styles.textAlign ?? 'left') === btn.id;\n return (\n <button\n key={btn.id}\n type=\"button\"\n data-testid={`typography-align-${btn.id}`}\n title={`Align ${btn.label}`}\n disabled={disabled}\n onClick={() => onChange('textAlign', btn.id)}\n className={`py-1 text-xs font-bold rounded transition cursor-pointer flex items-center justify-center ${\n isActive\n ? 'bg-white text-blue-600 shadow-xs'\n : 'text-slate-600 hover:bg-slate-200 hover:text-slate-900'\n }`}\n >\n {btn.icon}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n\n {/* Text Decoration & Text Transform */}\n <div className=\"grid grid-cols-2 gap-2\">\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Decoration</label>\n <div className=\"grid grid-cols-4 rounded border border-slate-300 bg-slate-100 p-0.5 gap-0.5 shadow-2xs\">\n {[\n { id: 'none', label: 'None', text: '—' },\n { id: 'underline', label: 'Underline', text: 'U', style: { textDecoration: 'underline' } },\n { id: 'line-through', label: 'Line-Through', text: 'S', style: { textDecoration: 'line-through' } },\n { id: 'overline', label: 'Overline', text: 'O', style: { textDecoration: 'overline' } },\n ].map((btn) => {\n const isActive = (styles.textDecoration ?? 'none') === btn.id;\n return (\n <button\n key={btn.id}\n type=\"button\"\n data-testid={`typography-decor-${btn.id}`}\n title={`Decoration: ${btn.label}`}\n disabled={disabled}\n style={btn.style}\n onClick={() => onChange('textDecoration', btn.id)}\n className={`py-1 text-xs font-bold rounded transition cursor-pointer ${\n isActive\n ? 'bg-white text-blue-600 shadow-xs'\n : 'text-slate-600 hover:bg-slate-200 hover:text-slate-900'\n }`}\n >\n {btn.text}\n </button>\n );\n })}\n </div>\n </div>\n\n <div>\n <label className=\"block text-[11px] font-medium text-slate-600 mb-1\">Transform</label>\n <div className=\"grid grid-cols-4 rounded border border-slate-300 bg-slate-100 p-0.5 gap-0.5 shadow-2xs\">\n {[\n { id: 'none', label: 'None', text: '—' },\n { id: 'uppercase', label: 'UPPERCASE', text: 'TT' },\n { id: 'lowercase', label: 'lowercase', text: 'tt' },\n { id: 'capitalize', label: 'Capitalize', text: 'Tt' },\n ].map((btn) => {\n const isActive = (styles.textTransform ?? 'none') === btn.id;\n return (\n <button\n key={btn.id}\n type=\"button\"\n data-testid={`typography-transform-${btn.id}`}\n title={`Transform: ${btn.label}`}\n disabled={disabled}\n onClick={() => onChange('textTransform', btn.id)}\n className={`py-1 text-xs font-bold rounded transition cursor-pointer ${\n isActive\n ? 'bg-white text-blue-600 shadow-xs'\n : 'text-slate-600 hover:bg-slate-200 hover:text-slate-900'\n }`}\n >\n {btn.text}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { AnimationConfig, DEFAULT_ANIMATION_CONFIG } from '@kubuild/schema';\nimport { ComponentIcon } from './icons';\n\nexport interface MotionSectorControlsProps {\n animation?: Partial<AnimationConfig>;\n onChange: (animation: Partial<AnimationConfig>) => void;\n onReplay?: () => void;\n disabled?: boolean;\n}\n\nexport const ANIMATION_TYPES = [\n\n { value: 'none', label: 'None' },\n {\n group: 'Fade Effects',\n items: [\n { value: 'fade', label: 'Fade' },\n { value: 'fade-up', label: 'Fade Up' },\n { value: 'fade-down', label: 'Fade Down' },\n { value: 'fade-left', label: 'Fade Left' },\n { value: 'fade-right', label: 'Fade Right' },\n ],\n },\n {\n group: 'Zoom Effects',\n items: [\n { value: 'zoom-in', label: 'Zoom In' },\n { value: 'zoom-out', label: 'Zoom Out' },\n ],\n },\n {\n group: 'Slide Effects',\n items: [\n { value: 'slide-up', label: 'Slide Up' },\n { value: 'slide-down', label: 'Slide Down' },\n { value: 'slide-left', label: 'Slide Left' },\n { value: 'slide-right', label: 'Slide Right' },\n ],\n },\n {\n group: 'Flip Effects',\n items: [\n { value: 'flip-up', label: 'Flip Up' },\n { value: 'flip-down', label: 'Flip Down' },\n ],\n },\n];\n\nexport const EASING_OPTIONS = [\n { value: 'ease-out', label: 'Ease Out' },\n { value: 'ease', label: 'Ease' },\n { value: 'linear', label: 'Linear' },\n { value: 'ease-in', label: 'Ease In' },\n { value: 'ease-in-out', label: 'Ease In Out' },\n];\n\nexport const HOVER_EFFECTS = [\n { value: 'none', label: 'None' },\n { value: 'lift', label: 'Lift' },\n { value: 'scale', label: 'Scale' },\n { value: 'glow', label: 'Glow' },\n { value: 'tilt', label: 'Tilt' },\n];\n\nexport const LOOP_EFFECTS = [\n { value: 'none', label: 'None' },\n { value: 'pulse', label: 'Pulse' },\n { value: 'bounce', label: 'Bounce' },\n { value: 'spin', label: 'Spin' },\n { value: 'float', label: 'Float' },\n { value: 'shimmer', label: 'Shimmer' },\n];\n\nexport const MotionSectorControls: React.FC<MotionSectorControlsProps> = ({\n animation,\n onChange,\n onReplay,\n disabled = false,\n}) => {\n const currentConfig: AnimationConfig = {\n ...DEFAULT_ANIMATION_CONFIG,\n ...(animation ?? {}),\n };\n\n const handleTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ type: e.target.value });\n };\n\n const handleDurationChange = (val: number) => {\n onChange({ duration: Math.max(0, val) });\n };\n\n const handleDelayChange = (val: number) => {\n onChange({ delay: Math.max(0, val) });\n };\n\n const handleEasingChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n onChange({ easing: e.target.value });\n };\n\n const handleOnceToggle = (e: React.ChangeEvent<HTMLInputElement>) => {\n onChange({ once: e.target.checked });\n };\n\n const handleHoverChange = (effect: string) => {\n onChange({ hoverEffect: effect });\n };\n\n const handleLoopChange = (effect: string) => {\n onChange({ loopEffect: effect });\n };\n\n const isAnimated =\n currentConfig.type !== 'none' ||\n currentConfig.hoverEffect !== 'none' ||\n currentConfig.loopEffect !== 'none';\n\n return (\n <div className=\"flex flex-col gap-4 text-xs text-slate-700\" data-testid=\"motion-sector-controls\">\n {/* Live Replay Button (STORA-262) */}\n {isAnimated && onReplay && (\n <button\n type=\"button\"\n data-testid=\"motion-replay-button\"\n onClick={onReplay}\n disabled={disabled}\n className=\"flex items-center justify-center gap-1.5 w-full py-1.5 px-3 rounded bg-blue-50 hover:bg-blue-100 text-blue-700 border border-blue-200 font-medium transition shadow-2xs cursor-pointer\"\n >\n <ComponentIcon iconOrType=\"play\" size={13} className=\"text-blue-600\" />\n <span>Play / Replay Animation</span>\n </button>\n )}\n\n {/* 1. Scroll / Entrance Animation Type */}\n <div className=\"flex flex-col gap-1\">\n <label htmlFor=\"motion-animation-type\" className=\"font-semibold text-slate-600 flex items-center justify-between\">\n <span>Entrance / Scroll Effect</span>\n {currentConfig.type !== 'none' && (\n <span className=\"text-[10px] font-medium text-blue-600 bg-blue-50 px-1.5 py-0.5 rounded border border-blue-200\">\n Active\n </span>\n )}\n </label>\n <select\n id=\"motion-animation-type\"\n data-testid=\"motion-animation-type\"\n value={currentConfig.type}\n onChange={handleTypeChange}\n disabled={disabled}\n className=\"w-full bg-white text-slate-900 border border-slate-300 rounded px-2.5 py-1.5 text-xs focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 shadow-2xs\"\n >\n {ANIMATION_TYPES.map((opt) => {\n if ('items' in opt && Array.isArray(opt.items)) {\n return (\n <optgroup key={opt.group} label={opt.group}>\n {opt.items.map((item) => (\n <option key={item.value} value={item.value}>\n {item.label}\n </option>\n ))}\n </optgroup>\n );\n }\n if ('value' in opt) {\n return (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n );\n }\n return null;\n })}\n </select>\n </div>\n\n {/* 2. Duration & Delay Sliders */}\n <div className=\"flex flex-col gap-3 p-2.5 bg-slate-50/70 border border-slate-200 rounded-lg\">\n {/* Duration */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label htmlFor=\"motion-duration-slider\" className=\"font-medium text-slate-600\">\n Duration\n </label>\n <div className=\"flex items-center gap-1\">\n <input\n id=\"motion-duration-input\"\n data-testid=\"motion-duration-input\"\n type=\"number\"\n min={0}\n max={10000}\n step={50}\n value={currentConfig.duration}\n onChange={(e) => handleDurationChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-16 bg-white text-slate-900 border border-slate-300 rounded px-1.5 py-0.5 text-right font-mono text-[11px] focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-slate-400 text-[10px]\">ms</span>\n </div>\n </div>\n <input\n id=\"motion-duration-slider\"\n data-testid=\"motion-duration-slider\"\n type=\"range\"\n min={0}\n max={3000}\n step={50}\n value={Math.min(currentConfig.duration, 3000)}\n onChange={(e) => handleDurationChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-full accent-blue-600 h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n\n {/* Delay */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label htmlFor=\"motion-delay-slider\" className=\"font-medium text-slate-600\">\n Delay\n </label>\n <div className=\"flex items-center gap-1\">\n <input\n id=\"motion-delay-input\"\n data-testid=\"motion-delay-input\"\n type=\"number\"\n min={0}\n max={10000}\n step={50}\n value={currentConfig.delay}\n onChange={(e) => handleDelayChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-16 bg-white text-slate-900 border border-slate-300 rounded px-1.5 py-0.5 text-right font-mono text-[11px] focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-slate-400 text-[10px]\">ms</span>\n </div>\n </div>\n <input\n id=\"motion-delay-slider\"\n data-testid=\"motion-delay-slider\"\n type=\"range\"\n min={0}\n max={2000}\n step={50}\n value={Math.min(currentConfig.delay, 2000)}\n onChange={(e) => handleDelayChange(parseInt(e.target.value, 10))}\n disabled={disabled}\n className=\"w-full accent-blue-600 h-1.5 bg-slate-200 rounded-lg appearance-none cursor-pointer\"\n />\n </div>\n\n {/* Easing & Trigger Once */}\n <div className=\"grid grid-cols-2 gap-2 pt-1 border-t border-slate-200/80\">\n <div className=\"flex flex-col gap-1\">\n <label htmlFor=\"motion-easing-select\" className=\"text-[11px] font-medium text-slate-500\">\n Easing Curve\n </label>\n <select\n id=\"motion-easing-select\"\n data-testid=\"motion-easing-select\"\n value={currentConfig.easing}\n onChange={handleEasingChange}\n disabled={disabled}\n className=\"bg-white text-slate-900 border border-slate-300 rounded px-2 py-1 text-[11px] focus:outline-none focus:ring-1 focus:ring-blue-500\"\n >\n {EASING_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </div>\n\n <div className=\"flex flex-col justify-end\">\n <label\n htmlFor=\"motion-once-toggle\"\n className=\"flex items-center gap-1.5 text-[11px] font-medium text-slate-600 cursor-pointer select-none py-1\"\n >\n <input\n id=\"motion-once-toggle\"\n data-testid=\"motion-once-toggle\"\n type=\"checkbox\"\n checked={currentConfig.once}\n onChange={handleOnceToggle}\n disabled={disabled}\n className=\"rounded border-slate-300 text-blue-600 focus:ring-blue-500\"\n />\n <span>Trigger Once</span>\n </label>\n </div>\n </div>\n </div>\n\n {/* 3. Hover Micro-Interactions (Segmented Buttons) */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label className=\"font-semibold text-slate-600\">Hover Micro-Interaction</label>\n {currentConfig.hoverEffect !== 'none' && (\n <span className=\"text-[10px] font-medium text-amber-700 bg-amber-50 px-1.5 py-0.5 rounded border border-amber-200\">\n {currentConfig.hoverEffect}\n </span>\n )}\n </div>\n <div\n role=\"radiogroup\"\n aria-label=\"Hover Micro-Interaction\"\n className=\"flex items-center gap-1 p-1 bg-slate-100 border border-slate-200 rounded-lg flex-wrap\"\n data-testid=\"motion-hover-segmented\"\n >\n {HOVER_EFFECTS.map((item) => {\n const isSelected = currentConfig.hoverEffect === item.value;\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n data-testid={`motion-hover-${item.value}`}\n onClick={() => handleHoverChange(item.value)}\n disabled={disabled}\n className={`flex-1 min-w-[50px] py-1 px-2 text-[11px] font-medium rounded text-center transition cursor-pointer ${\n isSelected\n ? 'bg-white text-blue-700 font-semibold shadow-xs border border-slate-200'\n : 'text-slate-600 hover:text-slate-900 hover:bg-slate-200/60'\n }`}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* 4. Continuous Loop Effect (Segmented Buttons) */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <label className=\"font-semibold text-slate-600\">Loop Animation</label>\n {currentConfig.loopEffect !== 'none' && (\n <span className=\"text-[10px] font-medium text-indigo-700 bg-indigo-50 px-1.5 py-0.5 rounded border border-indigo-200\">\n {currentConfig.loopEffect}\n </span>\n )}\n </div>\n <div\n role=\"radiogroup\"\n aria-label=\"Loop Animation\"\n className=\"flex items-center gap-1 p-1 bg-slate-100 border border-slate-200 rounded-lg flex-wrap\"\n data-testid=\"motion-loop-segmented\"\n >\n {LOOP_EFFECTS.map((item) => {\n const isSelected = currentConfig.loopEffect === item.value;\n return (\n <button\n key={item.value}\n type=\"button\"\n role=\"radio\"\n aria-checked={isSelected}\n data-testid={`motion-loop-${item.value}`}\n onClick={() => handleLoopChange(item.value)}\n disabled={disabled}\n className={`flex-1 min-w-[50px] py-1 px-1.5 text-[11px] font-medium rounded text-center transition cursor-pointer ${\n isSelected\n ? 'bg-white text-indigo-700 font-semibold shadow-xs border border-slate-200'\n : 'text-slate-600 hover:text-slate-900 hover:bg-slate-200/60'\n }`}\n >\n {item.label}\n </button>\n );\n })}\n </div>\n </div>\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport {\n ComponentRegistry,\n ComponentTraitDefinition,\n TRAIT_GROUP_ORDER,\n TRAIT_GROUP_LABELS,\n TraitGroup,\n} from '@kubuild/components';\nimport { findNodeById } from '@kubuild/core';\nimport { PageDocument } from '@kubuild/schema';\nimport { X } from 'lucide-react';\n\nexport interface TraitsPanelProps {\n registry: ComponentRegistry;\n document: PageDocument;\n selectedNodeId: string | null;\n /** Commit a single trait value to the node's props. */\n onCommitTrait: (traitName: string, value: unknown) => void;\n className?: string;\n}\n\nfunction ErrorText({ message }: { message: string | null | undefined }) {\n if (!message) return null;\n return (\n <div\n role=\"alert\"\n className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1 mt-1\"\n >\n {message}\n </div>\n );\n}\n\ninterface TraitStringControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: string) => void;\n}\n\nconst TraitStringControl: React.FC<TraitStringControlProps> = ({ trait, value, onCommit }) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value]);\n\n return (\n <input\n type=\"text\"\n value={text}\n onFocus={() => {\n isFocusedRef.current = true;\n }}\n onChange={(e) => {\n setText(e.target.value);\n onCommit(e.target.value);\n }}\n onBlur={() => {\n isFocusedRef.current = false;\n onCommit(text);\n }}\n placeholder={trait.defaultValue !== undefined ? String(trait.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\nconst TraitMediaSrcControl: React.FC<TraitStringControlProps> = ({ trait, value, onCommit }) => {\n const valueStr = typeof value === 'string' ? value : '';\n const [text, setText] = useState(valueStr);\n const fileInputRef = useRef<HTMLInputElement>(null);\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(typeof value === 'string' ? value : '');\n }\n }, [value]);\n\n const handleFileUpload = (e: React.ChangeEvent<HTMLInputElement>) => {\n const file = e.target.files?.[0];\n if (!file) return;\n const reader = new FileReader();\n reader.onload = () => {\n const dataUrl = reader.result as string;\n setText(dataUrl);\n onCommit(dataUrl);\n };\n reader.readAsDataURL(file);\n e.target.value = '';\n };\n\n const isDataUrl = text.startsWith('data:image/');\n const hasPreview = text.trim().length > 0 && (isDataUrl || text.startsWith('http://') || text.startsWith('https://') || text.startsWith('blob:'));\n const isLocalFilePath = text.trim().startsWith('file:') || /^[a-zA-Z]:\\\\/.test(text.trim());\n\n return (\n <div className=\"flex flex-col gap-1.5\">\n <input\n type=\"file\"\n ref={fileInputRef}\n onChange={handleFileUpload}\n accept=\"image/png, image/jpeg, image/jpg, image/webp, image/svg+xml, image/gif, image/avif\"\n className=\"hidden\"\n />\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={text}\n onFocus={() => {\n isFocusedRef.current = true;\n }}\n onChange={(e) => {\n setText(e.target.value);\n onCommit(e.target.value);\n }}\n onBlur={() => {\n isFocusedRef.current = false;\n onCommit(text);\n }}\n placeholder={trait.defaultValue !== undefined ? String(trait.defaultValue) : 'https://... or upload local image'}\n className=\"flex-1 min-w-0 text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono text-[11px]\"\n />\n <button\n type=\"button\"\n title=\"Upload local image from device\"\n aria-label=\"Upload local image from device\"\n onClick={() => fileInputRef.current?.click()}\n className=\"shrink-0 p-1.5 rounded border border-slate-300 bg-white text-slate-600 hover:text-blue-600 hover:border-blue-400 hover:bg-blue-50/50 transition flex items-center gap-1 text-xs font-medium cursor-pointer\"\n >\n <svg className=\"w-3.5 h-3.5\" fill=\"none\" viewBox=\"0 0 24 24\" stroke=\"currentColor\">\n <path strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={2} d=\"M4 16v1a3 3 0 003 3h10a3 3 0 003-3v-1m-4-8l-4-4m0 0L8 8m4-4v12\" />\n </svg>\n <span className=\"text-[11px]\">Upload</span>\n </button>\n </div>\n\n {hasPreview && (\n <div className=\"flex items-center gap-2 bg-slate-50 border border-slate-200 rounded p-1.5\">\n <img\n src={text}\n alt=\"Preview\"\n className=\"w-8 h-8 object-cover rounded border border-slate-300 bg-white\"\n onError={(e) => {\n (e.target as HTMLElement).style.display = 'none';\n }}\n />\n <div className=\"flex-1 min-w-0 flex flex-col\">\n <span className=\"text-[11px] font-medium text-slate-700 truncate\">\n {isDataUrl ? 'Local Image (Embedded)' : text}\n </span>\n <span className=\"text-[10px] text-slate-400\">\n {isDataUrl ? 'Base64 image data' : 'URL / Asset'}\n </span>\n </div>\n <button\n type=\"button\"\n onClick={() => {\n setText('');\n onCommit('');\n }}\n title=\"Clear image\"\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition cursor-pointer text-xs\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n )}\n\n {isLocalFilePath && (\n <div className=\"text-[11px] text-amber-700 bg-amber-50 border border-amber-200 rounded p-1.5 leading-tight\">\n Browsers cannot open direct local paths (<code className=\"font-mono\">file://</code>). Click <strong>Upload</strong> above to select and load the local image directly.\n </div>\n )}\n </div>\n );\n};\n\ninterface TraitNumberControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: number | undefined) => void;\n}\n\nconst TraitNumberControl: React.FC<TraitNumberControlProps> = ({ trait, value, onCommit }) => {\n const valueNum = typeof value === 'number' ? value : undefined;\n const [text, setText] = useState(valueNum !== undefined ? String(valueNum) : '');\n const isFocusedRef = useRef(false);\n\n useEffect(() => {\n if (!isFocusedRef.current) {\n setText(valueNum !== undefined ? String(valueNum) : '');\n }\n }, [value]);\n\n const commit = (raw: string) => {\n if (raw.trim() === '') {\n onCommit(undefined);\n return;\n }\n const parsed = Number(raw);\n if (!Number.isNaN(parsed)) {\n onCommit(parsed);\n }\n };\n\n return (\n <input\n type=\"number\"\n value={text}\n onFocus={() => {\n isFocusedRef.current = true;\n }}\n onChange={(e) => {\n setText(e.target.value);\n commit(e.target.value);\n }}\n onBlur={() => {\n isFocusedRef.current = false;\n commit(text);\n }}\n placeholder={trait.defaultValue !== undefined ? String(trait.defaultValue) : ''}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n />\n );\n};\n\ninterface TraitBooleanControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: boolean) => void;\n}\n\nconst TraitBooleanControl: React.FC<TraitBooleanControlProps> = ({ trait, value, onCommit }) => {\n const checked = Boolean(value);\n return (\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onCommit(e.target.checked)}\n className=\"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-500 cursor-pointer\"\n />\n <span className=\"text-xs text-slate-600\">{checked ? 'Enabled' : 'Disabled'}</span>\n </label>\n );\n};\n\ninterface TraitSelectControlProps {\n trait: ComponentTraitDefinition;\n value: unknown;\n onCommit: (value: unknown) => void;\n}\n\nconst TraitSelectControl: React.FC<TraitSelectControlProps> = ({ trait, value, onCommit }) => {\n const options = trait.options ?? [];\n const currentStr = value !== undefined && value !== null ? String(value) : '';\n\n return (\n <select\n value={currentStr}\n onChange={(e) => {\n const option = options.find((o) => String(o.value) === e.target.value);\n onCommit(option ? option.value : e.target.value);\n }}\n className=\"w-full text-xs bg-white text-slate-900 border border-slate-300 rounded px-2 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500\"\n >\n {trait.defaultValue === undefined && <option value=\"\">— none —</option>}\n {options.map((opt) => (\n <option key={String(opt.value)} value={String(opt.value)}>\n {opt.label}\n </option>\n ))}\n </select>\n );\n};\n\nfunction renderTraitControl(\n trait: ComponentTraitDefinition,\n value: unknown,\n onCommit: (value: unknown) => void,\n): React.ReactNode {\n switch (trait.type) {\n case 'number':\n return <TraitNumberControl trait={trait} value={value} onCommit={onCommit} />;\n case 'boolean':\n return <TraitBooleanControl trait={trait} value={value} onCommit={onCommit} />;\n case 'select':\n return <TraitSelectControl trait={trait} value={value} onCommit={onCommit} />;\n case 'string':\n default:\n if (trait.name === 'src') {\n return <TraitMediaSrcControl trait={trait} value={value} onCommit={onCommit} />;\n }\n return <TraitStringControl trait={trait} value={value} onCommit={onCommit} />;\n }\n}\n\n/**\n * Composite link control (STORA-212): URL input + \"Open in new tab\" toggle +\n * rel attribute select, rendered as one card in place of the separate\n * href/target/rel traits. Values are committed per-trait via `onCommitTrait`.\n */\ninterface LinkTraitControlProps {\n traits: ComponentTraitDefinition[];\n props: Record<string, unknown> | undefined;\n onCommitTrait: (traitName: string, value: unknown) => void;\n}\n\nconst LinkTraitControl: React.FC<LinkTraitControlProps> = ({ traits, props, onCommitTrait }) => {\n const hrefTrait = traits.find((t) => t.name === 'href');\n const targetTrait = traits.find((t) => t.name === 'target');\n const relTrait = traits.find((t) => t.name === 'rel');\n\n const href = typeof props?.href === 'string' ? props.href : '';\n const target = typeof props?.target === 'string' ? props.target : '';\n const rel = typeof props?.rel === 'string' ? props.rel : '';\n const openInNewTab = target === '_blank';\n\n const handleToggleNewTab = (checked: boolean) => {\n onCommitTrait('target', checked ? '_blank' : '');\n // Reset rel when disabling so stale `noopener noreferrer` doesn't linger.\n if (!checked && rel) {\n onCommitTrait('rel', '');\n }\n };\n\n return (\n <div className=\"rounded border border-slate-200 bg-slate-50/60 p-2.5 flex flex-col gap-3\">\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide\">Link</div>\n\n {hrefTrait && (\n <div>\n <label className=\"flex items-center gap-1 text-xs font-medium text-slate-600 mb-1\">\n {hrefTrait.label}\n {hrefTrait.required && <span className=\"text-red-500\">*</span>}\n </label>\n <TraitStringControl\n trait={hrefTrait}\n value={href}\n onCommit={(v) => onCommitTrait('href', v)}\n />\n {hrefTrait.description && (\n <div className=\"text-[10px] text-slate-400 mt-0.5\">{hrefTrait.description}</div>\n )}\n </div>\n )}\n\n {targetTrait && (\n <div>\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={openInNewTab}\n onChange={(e) => handleToggleNewTab(e.target.checked)}\n className=\"h-3.5 w-3.5 rounded border-slate-300 text-blue-600 focus:ring-blue-500 cursor-pointer\"\n />\n <span className=\"text-xs font-medium text-slate-600\">Open in new tab</span>\n {openInNewTab && (\n <span className=\"ml-auto text-[10px] font-mono text-slate-400\">target=\"_blank\"</span>\n )}\n </label>\n </div>\n )}\n\n {relTrait && (\n <div>\n <label className=\"flex items-center gap-1 text-xs font-medium text-slate-600 mb-1\">\n {relTrait.label}\n {openInNewTab && !rel && (\n <span className=\"ml-auto text-[10px] text-slate-400 italic\">\n auto: noopener noreferrer\n </span>\n )}\n </label>\n <TraitSelectControl\n trait={relTrait}\n value={rel}\n onCommit={(v) => onCommitTrait('rel', v)}\n />\n {relTrait.description && (\n <div className=\"text-[10px] text-slate-400 mt-0.5\">{relTrait.description}</div>\n )}\n </div>\n )}\n </div>\n );\n};\n\n/**\n * Traits tab content (STORA-211): renders the functional/HTML attribute\n * metadata declared on the selected component's definition, grouped by\n * trait group (identity, link, media, form, behavior, semantic, accessibility).\n */\nexport const TraitsPanel: React.FC<TraitsPanelProps> = ({\n registry,\n document,\n selectedNodeId,\n onCommitTrait,\n className,\n}) => {\n const node = selectedNodeId ? findNodeById(document.document, selectedNodeId) : null;\n const definition = node ? registry.get(node.type) : undefined;\n\n if (!node || !definition) {\n return (\n <div className={`p-3 text-xs text-slate-500 ${className || ''}`}>No element selected.</div>\n );\n }\n\n const traits = definition.traits ?? [];\n\n if (traits.length === 0) {\n return (\n <div className={`p-3 text-xs text-slate-500 ${className || ''}`}>\n <div className=\"mb-1 font-medium text-slate-600\">{definition.label}</div>\n This component has no configurable HTML attributes.\n </div>\n );\n }\n\n // Group traits by their declared group, preserving TRAIT_GROUP_ORDER.\n const grouped = new Map<TraitGroup | undefined, ComponentTraitDefinition[]>();\n for (const trait of traits) {\n const key = trait.group;\n const list = grouped.get(key) ?? [];\n list.push(trait);\n grouped.set(key, list);\n }\n\n const orderedGroups = [\n ...TRAIT_GROUP_ORDER.filter((g) => grouped.has(g)),\n ...(grouped.has(undefined) ? [undefined as TraitGroup | undefined] : []),\n ];\n\n return (\n <div className={`flex flex-col gap-4 ${className ?? 'p-3'} text-sm text-slate-900`}>\n {orderedGroups.map((group) => {\n const groupTraits = grouped.get(group) ?? [];\n // Composite link control (STORA-212): when the group holds href/target/rel,\n // render one unified Link card instead of three separate fields.\n const traitNames = new Set(groupTraits.map((t) => t.name));\n const isLinkGroup = group === 'link' && traitNames.has('href');\n return (\n <div key={group ?? 'ungrouped'}>\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide mb-2\">\n {group ? TRAIT_GROUP_LABELS[group] : 'Other'}\n </div>\n {isLinkGroup ? (\n <LinkTraitControl\n traits={groupTraits}\n props={node.props}\n onCommitTrait={onCommitTrait}\n />\n ) : (\n <div className=\"flex flex-col gap-3\">\n {groupTraits.map((trait) => {\n const value = node.props?.[trait.name];\n return (\n <div key={trait.name}>\n <label className=\"flex items-center gap-1 text-xs font-medium text-slate-600 mb-1\">\n {trait.label}\n {trait.required && <span className=\"text-red-500\">*</span>}\n {trait.attribute && trait.attribute !== trait.name && (\n <span\n className=\"ml-auto text-[10px] font-mono text-slate-400\"\n title={`HTML attribute: ${trait.attribute}`}\n >\n {trait.attribute}\n </span>\n )}\n </label>\n {renderTraitControl(trait, value, (v) => onCommitTrait(trait.name, v))}\n {trait.description && (\n <div className=\"text-[10px] text-slate-400 mt-0.5\">{trait.description}</div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport { Node } from '@kubuild/schema';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { findNodeById, findNodeLocation, isDescendantOf, getAncestorChain } from '@kubuild/core';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\nimport { ChevronDown, ChevronRight, X, GripVertical } from 'lucide-react';\n\nexport interface LayersPanelProps {\n registry: ComponentRegistry;\n className?: string;\n}\n\ninterface DropCandidate {\n parentId: string;\n index?: number;\n position: 'before' | 'after' | 'inside';\n}\n\nexport const LayersPanel: React.FC<LayersPanelProps> = ({ registry, className }) => {\n const {\n document,\n selectedNodeId,\n hoveredNodeId,\n navigatorMode,\n setNavigatorMode,\n selectNode,\n hoverNode,\n moveComponent,\n } = useEditorStore();\n\n const [expandedIds, setExpandedIds] = useState<Set<string>>(() => new Set([document.document.id]));\n const [draggingId, setDraggingId] = useState<string | null>(null);\n const [dropCandidate, setDropCandidate] = useState<DropCandidate | null>(null);\n\n // Floating window position state\n const [pos, setPos] = useState(() => ({\n x: typeof window !== 'undefined' ? Math.max(12, Math.min(window.innerWidth - 300, 24)) : 24,\n y: 70,\n }));\n const [isDraggingWindow, setIsDraggingWindow] = useState(false);\n const dragStartRef = useRef<{ startX: number; startY: number; posX: number; posY: number }>({\n startX: 0,\n startY: 0,\n posX: 24,\n posY: 70,\n });\n\n const handleHeaderPointerDown = (e: React.PointerEvent) => {\n if ((e.target as HTMLElement).closest('button, input, select, textarea')) return;\n setIsDraggingWindow(true);\n dragStartRef.current = {\n startX: e.clientX,\n startY: e.clientY,\n posX: pos.x,\n posY: pos.y,\n };\n };\n\n useEffect(() => {\n if (!isDraggingWindow) return;\n const handlePointerMove = (e: PointerEvent) => {\n const dx = e.clientX - dragStartRef.current.startX;\n const dy = e.clientY - dragStartRef.current.startY;\n const maxX = Math.max(8, window.innerWidth - 296);\n const maxY = Math.max(8, window.innerHeight - 100);\n setPos({\n x: Math.max(8, Math.min(maxX, dragStartRef.current.posX + dx)),\n y: Math.max(8, Math.min(maxY, dragStartRef.current.posY + dy)),\n });\n };\n const handlePointerUp = () => {\n setIsDraggingWindow(false);\n };\n window.addEventListener('pointermove', handlePointerMove);\n window.addEventListener('pointerup', handlePointerUp);\n window.addEventListener('pointercancel', handlePointerUp);\n return () => {\n window.removeEventListener('pointermove', handlePointerMove);\n window.removeEventListener('pointerup', handlePointerUp);\n window.removeEventListener('pointercancel', handlePointerUp);\n };\n }, [isDraggingWindow]);\n\n useEffect(() => {\n if (!selectedNodeId) return;\n const ancestors = getAncestorChain(document.document, selectedNodeId);\n if (ancestors.length === 0) return;\n setExpandedIds((prev) => {\n let changed = false;\n const next = new Set(prev);\n for (const id of ancestors) {\n if (!next.has(id)) {\n next.add(id);\n changed = true;\n }\n }\n return changed ? next : prev;\n });\n }, [selectedNodeId, document]);\n\n const toggleExpanded = (nodeId: string) => {\n setExpandedIds((prev) => {\n const next = new Set(prev);\n if (next.has(nodeId)) next.delete(nodeId);\n else next.add(nodeId);\n return next;\n });\n };\n\n const handleRowDragStart = (e: React.DragEvent, node: Node) => {\n if (node.id === document.document.id) {\n e.preventDefault();\n return;\n }\n e.stopPropagation();\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('text/plain', node.id);\n setDraggingId(node.id);\n selectNode(node.id);\n };\n\n const handleRowDragOver = (e: React.DragEvent, node: Node) => {\n if (!draggingId) return;\n e.stopPropagation();\n\n const draggedNode = findNodeById(document.document, draggingId);\n if (!draggedNode || isDescendantOf(draggedNode, node.id)) {\n setDropCandidate(null);\n e.dataTransfer.dropEffect = 'none';\n return;\n }\n\n const rect = (e.currentTarget as HTMLElement).getBoundingClientRect();\n const ratio = rect.height > 0 ? (e.clientY - rect.top) / rect.height : 0.5;\n\n const targetDef = registry.get(node.type);\n const acceptsChildren = !!targetDef?.acceptsChildren;\n\n let candidate: DropCandidate | null = null;\n\n if (acceptsChildren && ratio > 0.25 && ratio < 0.75) {\n const policy = registry.canInsertChild(node.type, draggedNode.type);\n if (policy.valid) {\n candidate = { parentId: node.id, position: 'inside' };\n }\n }\n\n if (!candidate) {\n const loc = findNodeLocation(document.document, node.id);\n if (loc && loc.parent) {\n const policy = registry.canInsertChild(loc.parent.type, draggedNode.type);\n if (policy.valid) {\n if (ratio <= 0.5) {\n candidate = { parentId: loc.parent.id, index: loc.index, position: 'before' };\n } else {\n candidate = { parentId: loc.parent.id, index: loc.index + 1, position: 'after' };\n }\n }\n }\n }\n\n if (candidate) {\n e.preventDefault();\n e.dataTransfer.dropEffect = 'move';\n setDropCandidate(candidate);\n } else {\n setDropCandidate(null);\n e.dataTransfer.dropEffect = 'none';\n }\n };\n\n const handleRowDrop = (e: React.DragEvent) => {\n if (!draggingId || !dropCandidate) return;\n e.preventDefault();\n e.stopPropagation();\n\n moveComponent(draggingId, dropCandidate.parentId, registry, dropCandidate.index);\n setDraggingId(null);\n setDropCandidate(null);\n };\n\n const handleRowDragEnd = () => {\n setDraggingId(null);\n setDropCandidate(null);\n };\n\n const renderRow = (node: Node, depth: number): React.ReactNode => {\n const hasChildren = !!node.children?.length;\n const isExpanded = expandedIds.has(node.id);\n const isSelected = node.id === selectedNodeId;\n const isHovered = node.id === hoveredNodeId;\n const isRoot = node.id === document.document.id;\n const isDropTarget = dropCandidate?.position === 'inside' && dropCandidate.parentId === node.id;\n\n return (\n <div key={node.id}>\n <div\n data-kubuild-layer={node.id}\n draggable={!isRoot}\n style={{ paddingLeft: depth * 14 + 6 }}\n onClick={(e) => {\n e.stopPropagation();\n selectNode(node.id);\n }}\n onMouseEnter={() => hoverNode(node.id)}\n onMouseLeave={() => hoverNode(null)}\n onDragStart={(e) => handleRowDragStart(e, node)}\n onDragOver={(e) => handleRowDragOver(e, node)}\n onDrop={handleRowDrop}\n onDragEnd={handleRowDragEnd}\n className={`flex items-center gap-1 py-1 pr-2 text-xs cursor-pointer rounded-sm border-l-2 ${\n isSelected\n ? 'bg-blue-50 border-blue-500 text-blue-700 font-medium'\n : isHovered\n ? 'bg-slate-50 border-slate-300'\n : 'border-transparent text-slate-700'\n } ${isDropTarget ? 'ring-1 ring-inset ring-green-500' : ''}`}\n >\n {hasChildren ? (\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n toggleExpanded(node.id);\n }}\n aria-label={isExpanded ? 'Collapse' : 'Expand'}\n className=\"w-4 shrink-0 text-slate-400 hover:text-slate-700 flex items-center justify-center\"\n >\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3\" aria-hidden=\"true\" />\n ) : (\n <ChevronRight className=\"w-3 h-3\" aria-hidden=\"true\" />\n )}\n </button>\n ) : (\n <span className=\"w-4 shrink-0\" />\n )}\n <span className=\"shrink-0 text-slate-400\">\n <ComponentIcon iconOrType={registry.get(node.type)?.icon ?? node.type} size={13} />\n </span>\n <span className=\"truncate\">{registry.get(node.type)?.label ?? node.type}</span>\n <span className=\"text-slate-400 truncate text-[10px]\">#{node.id}</span>\n </div>\n {hasChildren && isExpanded && node.children!.map((child) => renderRow(child, depth + 1))}\n </div>\n );\n };\n\n if (navigatorMode === 'hidden') {\n return null;\n }\n\n const isFloating = navigatorMode === 'floating';\n\n const panelContent = (\n <div className=\"flex-1 overflow-y-auto p-1.5 text-xs\">\n {renderRow(document.document, 0)}\n </div>\n );\n\n const header = (\n <div\n onPointerDown={isFloating ? handleHeaderPointerDown : undefined}\n style={{ touchAction: isFloating ? 'none' : 'auto' }}\n className={`flex items-center justify-between px-3 py-2 border-b border-slate-200/90 select-none ${\n isFloating ? 'cursor-grab active:cursor-grabbing bg-slate-50/90 rounded-t-xl touch-none' : 'bg-slate-50'\n }`}\n >\n <div className=\"flex items-center gap-1.5 font-semibold text-xs text-slate-700\">\n {isFloating && <GripVertical className=\"w-3 h-3 text-slate-400 mr-0.5\" aria-hidden=\"true\" />}\n <ComponentIcon iconOrType=\"layout\" size={13} />\n <span>Navigator</span>\n </div>\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setNavigatorMode(isFloating ? 'docked' : 'floating')}\n title={isFloating ? 'Dock to sidebar' : 'Make floating'}\n className=\"p-1 text-slate-400 hover:text-blue-600 rounded hover:bg-slate-200/50 transition\"\n >\n {isFloating ? (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n </svg>\n ) : (\n <svg width=\"12\" height=\"12\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\">\n <rect width=\"14\" height=\"14\" x=\"7\" y=\"7\" rx=\"2\" />\n <path d=\"M17 3H5a2 2 0 0 0-2 2v12\" />\n </svg>\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => setNavigatorMode('hidden')}\n title=\"Hide Navigator\"\n className=\"p-1 text-slate-400 hover:text-red-600 rounded hover:bg-red-50 transition\"\n >\n <X className=\"w-3.5 h-3.5\" aria-hidden=\"true\" />\n </button>\n </div>\n </div>\n );\n\n if (isFloating) {\n return (\n <div\n style={{ left: `${pos.x}px`, top: `${pos.y}px` }}\n className={`fixed z-50 w-72 bg-white/95 backdrop-blur-md rounded-xl shadow-2xl border border-slate-200/90 flex flex-col max-h-[460px] overflow-hidden ${\n className || ''\n }`}\n >\n {header}\n {panelContent}\n </div>\n );\n }\n\n return (\n <div className={`flex flex-col h-full overflow-hidden bg-white ${className || ''}`}>\n {header}\n {panelContent}\n </div>\n );\n};\n","import React from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry, createDefaultComponentRegistry } from '@kubuild/components';\nimport { getNodeAncestors } from '@kubuild/core';\nimport { useEditorStore } from './store';\n\nexport interface HierarchyBreadcrumbsProps {\n registry?: ComponentRegistry;\n document?: PageDocument;\n selectedNodeId?: string | null;\n className?: string;\n}\n\n/**\n * Bottom Hierarchy Breadcrumbs Bar — STORA-231.\n * Displays the ancestor hierarchy path: Page > Section > Container > ... > SelectedElement.\n * Clicking any breadcrumb item selects that element across canvas and inspector.\n */\nexport const HierarchyBreadcrumbs: React.FC<HierarchyBreadcrumbsProps> = ({\n registry = createDefaultComponentRegistry(),\n document: propDoc,\n selectedNodeId: propSelectedNodeId,\n className,\n}) => {\n const storeState = useEditorStore();\n const document = propDoc ?? storeState.document;\n const selectedNodeId =\n propSelectedNodeId !== undefined ? propSelectedNodeId : storeState.selectedNodeId;\n const selectNode = storeState.selectNode;\n\n if (!document?.document) return null;\n\n // Retrieve the full ancestor path from root down to the selected node in O(N)\n const ancestors = selectedNodeId\n ? getNodeAncestors(document.document, selectedNodeId)\n : [document.document];\n\n // If node is not found in the tree, fallback to root\n const path = ancestors.length > 0 ? ancestors : [document.document];\n\n return (\n <nav\n aria-label=\"Hierarchy Breadcrumbs\"\n data-testid=\"hierarchy-breadcrumbs\"\n className={`flex items-center gap-1 px-4 py-2 bg-white border-t border-slate-200 text-xs text-slate-600 select-none overflow-x-auto min-h-[36px] w-full shrink-0 shadow-sm ${\n className || ''\n }`}\n >\n <span className=\"text-[10px] font-bold uppercase tracking-wider text-slate-400 mr-1 shrink-0\">\n Path:\n </span>\n {path.map((node, index) => {\n const isLast = index === path.length - 1;\n const isSelected = node.id === selectedNodeId;\n const def = registry.get(node.type);\n const label =\n node.type === 'page'\n ? document.metadata?.title || 'Page'\n : def?.label || node.type;\n\n return (\n <React.Fragment key={node.id}>\n {index > 0 && (\n <span\n aria-hidden=\"true\"\n className=\"text-slate-300 font-semibold mx-0.5 select-none shrink-0\"\n >\n >\n </span>\n )}\n <button\n type=\"button\"\n data-testid={`breadcrumb-${node.id}`}\n onClick={() => selectNode(node.id)}\n className={`px-1.5 py-0.5 rounded transition shrink-0 flex items-center gap-1 ${\n isSelected || isLast\n ? 'bg-blue-50 text-blue-700 font-semibold border border-blue-200 shadow-xs'\n : 'text-slate-600 hover:text-slate-900 hover:bg-slate-100 font-medium'\n }`}\n title={`Select ${label} (${node.id})`}\n >\n <span>{label}</span>\n {node.props && typeof node.props === 'object' && 'tag' in node.props && (\n <span className=\"text-[10px] text-slate-400 font-mono\">\n <{String(node.props.tag)}>\n </span>\n )}\n </button>\n </React.Fragment>\n );\n })}\n </nav>\n );\n};\n","import React, { useState } from 'react';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { Boxes, Blocks, Layers } from 'lucide-react';\nimport { ComponentPanel } from './component-panel';\nimport { BlocksPanel } from './blocks-panel';\nimport { LayersPanel } from './layers-panel';\nimport { EditorSidebarConfig, LeftSidebarTab } from './config';\n\nexport type { LeftSidebarTab };\n\nexport interface LeftSidebarProps {\n registry: ComponentRegistry;\n defaultTab?: LeftSidebarTab;\n availableTabs?: LeftSidebarTab[];\n config?: EditorSidebarConfig;\n className?: string;\n}\n\n/**\n * Left Sidebar with tabs: Components, Blocks, and Layers — STORA-240.\n */\nexport const LeftSidebar: React.FC<LeftSidebarProps> = ({\n registry,\n defaultTab: propDefaultTab,\n availableTabs: propAvailableTabs,\n config,\n className,\n}) => {\n const tabsList = config?.availableTabs ?? propAvailableTabs ?? ['components', 'blocks', 'layers'];\n const initialTabCandidate = config?.defaultTab ?? propDefaultTab ?? 'components';\n const initialTab = tabsList.includes(initialTabCandidate)\n ? initialTabCandidate\n : tabsList[0] ?? 'components';\n\n const [activeTab, setActiveTab] = useState<LeftSidebarTab>(initialTab);\n\n React.useEffect(() => {\n if (!tabsList.includes(activeTab) && tabsList.length > 0) {\n setActiveTab(tabsList[0]);\n }\n }, [tabsList, activeTab]);\n\n const showTabBar = tabsList.length > 1;\n\n return (\n <div className={`flex flex-col h-full min-h-0 bg-white border-r border-slate-200 ${className || ''}`}>\n {/* Sidebar Top Tab Switcher */}\n {showTabBar && (\n <div\n role=\"tablist\"\n aria-label=\"Sidebar Navigation\"\n className=\"flex items-center border-b border-slate-200 bg-slate-50/80 px-2 pt-2 gap-1 shrink-0 select-none\"\n >\n {tabsList.includes('components') && (\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-components\"\n aria-selected={activeTab === 'components'}\n aria-controls=\"tabpanel-components\"\n data-testid=\"tab-components\"\n onClick={() => setActiveTab('components')}\n className={`flex-1 py-2 px-2 text-xs font-semibold rounded-t-md transition-all flex items-center justify-center gap-1.5 border-t border-x ${\n activeTab === 'components'\n ? 'bg-white text-blue-600 border-slate-200 border-b-white -mb-px shadow-xs'\n : 'border-transparent text-slate-500 hover:text-slate-800 hover:bg-slate-100'\n }`}\n >\n <Boxes className=\"w-3.5 h-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>Components</span>\n </button>\n )}\n\n {tabsList.includes('blocks') && (\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-blocks\"\n aria-selected={activeTab === 'blocks'}\n aria-controls=\"tabpanel-blocks\"\n data-testid=\"tab-blocks\"\n onClick={() => setActiveTab('blocks')}\n className={`flex-1 py-2 px-2 text-xs font-semibold rounded-t-md transition-all flex items-center justify-center gap-1.5 border-t border-x ${\n activeTab === 'blocks'\n ? 'bg-white text-blue-600 border-slate-200 border-b-white -mb-px shadow-xs'\n : 'border-transparent text-slate-500 hover:text-slate-800 hover:bg-slate-100'\n }`}\n >\n <Blocks className=\"w-3.5 h-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>Blocks</span>\n </button>\n )}\n\n {tabsList.includes('layers') && (\n <button\n type=\"button\"\n role=\"tab\"\n id=\"tab-layers\"\n aria-selected={activeTab === 'layers'}\n aria-controls=\"tabpanel-layers\"\n data-testid=\"tab-layers\"\n onClick={() => setActiveTab('layers')}\n className={`flex-1 py-2 px-2 text-xs font-semibold rounded-t-md transition-all flex items-center justify-center gap-1.5 border-t border-x ${\n activeTab === 'layers'\n ? 'bg-white text-blue-600 border-slate-200 border-b-white -mb-px shadow-xs'\n : 'border-transparent text-slate-500 hover:text-slate-800 hover:bg-slate-100'\n }`}\n >\n <Layers className=\"w-3.5 h-3.5 shrink-0\" aria-hidden=\"true\" />\n <span>Layers</span>\n </button>\n )}\n </div>\n )}\n\n {/* Tab Panels */}\n <div className=\"flex-1 overflow-hidden min-h-0\">\n {activeTab === 'components' && tabsList.includes('components') && (\n <div role=\"tabpanel\" id=\"tabpanel-components\" aria-labelledby=\"tab-components\" className=\"h-full\">\n <ComponentPanel registry={registry} />\n </div>\n )}\n {activeTab === 'blocks' && tabsList.includes('blocks') && (\n <div role=\"tabpanel\" id=\"tabpanel-blocks\" aria-labelledby=\"tab-blocks\" className=\"h-full\">\n <BlocksPanel registry={registry} />\n </div>\n )}\n {activeTab === 'layers' && tabsList.includes('layers') && (\n <div role=\"tabpanel\" id=\"tabpanel-layers\" aria-labelledby=\"tab-layers\" className=\"h-full\">\n <LayersPanel registry={registry} />\n </div>\n )}\n </div>\n </div>\n );\n};\n","import React, { useState } from 'react';\nimport { ComponentRegistry, ComponentCategory, ComponentDefinition } from '@kubuild/components';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\n\nexport interface ComponentPanelProps {\n registry: ComponentRegistry;\n className?: string;\n}\n\nconst CATEGORY_ORDER: ComponentCategory[] = [\n 'layout',\n 'typography',\n 'media',\n 'form',\n 'interactive',\n 'data',\n 'custom',\n];\n\nconst CATEGORY_LABELS: Record<ComponentCategory, string> = {\n layout: 'Layout',\n typography: 'Typography',\n media: 'Media',\n form: 'Forms',\n interactive: 'Interactive',\n data: 'Data',\n custom: 'Custom',\n};\n\nexport const ComponentPanel: React.FC<ComponentPanelProps> = ({ registry, className }) => {\n const insertComponent = useEditorStore((s) => s.insertComponent);\n const setDragPayload = useEditorStore((s) => s.setDragPayload);\n const [error, setError] = useState<string | null>(null);\n\n const groups = CATEGORY_ORDER.map((category) => ({\n category,\n items: registry.listByCategory(category),\n })).filter((group) => group.items.length > 0);\n\n const handleInsert = (definition: ComponentDefinition) => {\n const result = insertComponent(definition.type, registry);\n setError(result.success ? null : (result.error ?? `Could not insert \"${definition.label}\".`));\n };\n\n const handleDragStart = (e: React.DragEvent, definition: ComponentDefinition) => {\n e.dataTransfer.effectAllowed = 'copy';\n e.dataTransfer.setData('text/plain', `component:${definition.type}`);\n e.dataTransfer.setData('application/kubuild-drag-type', 'component');\n e.dataTransfer.setData('application/kubuild-component-type', definition.type);\n setDragPayload({ type: 'component', componentType: definition.type });\n };\n\n const handleDragEnd = () => {\n setDragPayload(null);\n };\n\n return (\n <div className={`flex flex-col gap-4 p-3 overflow-y-auto h-full min-h-0 ${className || ''}`}>\n {error && (\n <div\n role=\"alert\"\n className=\"text-xs text-red-600 bg-red-50 border border-red-200 rounded px-2 py-1\"\n >\n {error}\n </div>\n )}\n {groups.map(({ category, items }) => (\n <div key={category}>\n <div className=\"text-xs font-semibold text-slate-500 uppercase tracking-wide mb-2\">\n {CATEGORY_LABELS[category]}\n </div>\n <div className=\"grid grid-cols-2 gap-2\">\n {items.map((definition) => (\n <button\n key={definition.type}\n type=\"button\"\n draggable={true}\n onDragStart={(e) => handleDragStart(e, definition)}\n onDragEnd={handleDragEnd}\n onClick={() => handleInsert(definition)}\n data-testid={`component-item-${definition.type}`}\n title={\n definition.description || `Click to insert or drag to canvas: ${definition.label}`\n }\n className=\"flex flex-col items-center justify-center p-2.5 min-h-[74px] rounded-lg border border-slate-200 bg-white hover:border-blue-400 hover:bg-blue-50/50 hover:shadow text-slate-700 transition group cursor-grab active:cursor-grabbing text-center select-none\"\n >\n <span className=\"mb-1.5 text-slate-500 group-hover:text-blue-600 transition-colors pointer-events-none\">\n <ComponentIcon iconOrType={definition.icon ?? definition.type} size={22} />\n </span>\n <span className=\"text-[11px] font-medium text-slate-700 group-hover:text-blue-600 text-center leading-tight break-words w-full pointer-events-none\">\n {definition.label}\n </span>\n </button>\n ))}\n </div>\n </div>\n ))}\n </div>\n );\n};\n","import React, { useState, useMemo } from 'react';\nimport { STARTER_BLOCKS, BlockDefinition, ComponentRegistry } from '@kubuild/components';\nimport { insertNode, collectNodeIdSet } from '@kubuild/core';\nimport { useEditorStore } from './store';\nimport { ComponentIcon } from './icons';\nimport { Image as ImageIcon } from 'lucide-react';\n\nexport interface BlocksPanelProps {\n registry?: ComponentRegistry;\n blocks?: BlockDefinition[];\n className?: string;\n onInsertBlock?: (block: BlockDefinition) => void;\n}\n\n/**\n * Thumbnail schematic preview component for blocks\n */\nexport const BlockThumbnail: React.FC<{ block: BlockDefinition }> = ({ block }) => {\n switch (block.id) {\n case 'layout-1-col':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center p-1\">\n <div className=\"w-full h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[9px] text-blue-700 font-medium\">\n 100%\n </div>\n </div>\n );\n case 'layout-2-col-50-50':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[9px] text-blue-700 font-medium\">\n 50%\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[9px] text-blue-700 font-medium\">\n 50%\n </div>\n </div>\n );\n case 'layout-2-col-30-70':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"w-[30%] h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 30%\n </div>\n <div className=\"w-[70%] h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 70%\n </div>\n </div>\n );\n case 'layout-3-col':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 1/3\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 1/3\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded flex items-center justify-center text-[8px] text-blue-700 font-medium\">\n 1/3\n </div>\n </div>\n );\n case 'layout-4-col':\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center gap-1 p-1\">\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n <div className=\"flex-1 h-full bg-blue-100/70 border border-blue-300 rounded text-[7px] text-blue-700 font-medium flex items-center justify-center\">\n 1/4\n </div>\n </div>\n );\n case 'hero-section':\n return (\n <div className=\"w-full h-12 bg-slate-100 border border-slate-200 rounded flex flex-col items-center justify-center p-1.5 gap-1\">\n <div className=\"w-2/3 h-1.5 bg-slate-800 rounded-full\" />\n <div className=\"w-1/2 h-1 bg-slate-400 rounded-full\" />\n <div className=\"w-1/3 h-2 bg-blue-600 rounded mt-0.5\" />\n </div>\n );\n case 'feature-card':\n return (\n <div className=\"w-full h-12 bg-white border border-slate-200 rounded flex flex-col p-1.5 justify-between shadow-xs\">\n <div className=\"w-6 h-1.5 bg-blue-500 rounded-full\" />\n <div className=\"w-3/4 h-1.5 bg-slate-700 rounded\" />\n <div className=\"w-full h-1 bg-slate-300 rounded\" />\n </div>\n );\n case 'media-object':\n return (\n <div className=\"w-full h-12 bg-white border border-slate-200 rounded flex items-center gap-1.5 p-1.5\">\n <div className=\"w-7 h-7 bg-indigo-50 border border-indigo-200 rounded shrink-0 flex items-center justify-center\">\n <ImageIcon className=\"w-4 h-4 text-indigo-600\" />\n </div>\n <div className=\"flex-1 flex flex-col gap-1\">\n <div className=\"w-3/4 h-1.5 bg-slate-700 rounded\" />\n <div className=\"w-full h-1 bg-slate-300 rounded\" />\n </div>\n </div>\n );\n case 'pricing-table':\n return (\n <div className=\"w-full h-12 bg-white border-2 border-blue-400 rounded flex flex-col items-center justify-center p-1 gap-1\">\n <div className=\"w-10 h-1.5 bg-slate-700 rounded\" />\n <div className=\"w-8 h-2 bg-blue-600 rounded font-bold text-[8px] text-white flex items-center justify-center\">\n $$$\n </div>\n </div>\n );\n case 'cta-banner':\n return (\n <div className=\"w-full h-12 bg-slate-900 border border-slate-800 rounded flex flex-col items-center justify-center p-1.5 gap-1 text-white\">\n <div className=\"w-3/4 h-1.5 bg-white rounded\" />\n <div className=\"w-1/3 h-2 bg-blue-500 rounded text-[8px] flex items-center justify-center font-bold\">\n CTA\n </div>\n </div>\n );\n default:\n return (\n <div className=\"w-full h-12 bg-slate-50 border border-slate-200 rounded flex items-center justify-center text-slate-400\">\n <ComponentIcon iconOrType={block.icon ?? 'layout'} size={20} />\n </div>\n );\n }\n};\n\n/**\n * Tab \"Blocks\" di Sidebar Kiri Editor — STORA-240.\n * Displays grid of ready-to-use layout & pre-composed template block cards per category.\n */\nexport const BlocksPanel: React.FC<BlocksPanelProps> = ({\n blocks = STARTER_BLOCKS,\n className,\n onInsertBlock,\n}) => {\n const { document, selectedNodeId, dispatch, selectNode } = useEditorStore();\n const [selectedCategory, setSelectedCategory] = useState<string>('all');\n const [searchQuery, setSearchQuery] = useState<string>('');\n\n const categories = useMemo(() => {\n const set = new Set<string>();\n blocks.forEach((b) => set.add(b.category));\n return ['all', ...Array.from(set)];\n }, [blocks]);\n\n const filteredBlocks = useMemo(() => {\n return blocks.filter((b) => {\n const matchCat = selectedCategory === 'all' || b.category === selectedCategory;\n const matchQuery =\n !searchQuery ||\n b.name.toLowerCase().includes(searchQuery.toLowerCase()) ||\n (b.description && b.description.toLowerCase().includes(searchQuery.toLowerCase()));\n return matchCat && matchQuery;\n });\n }, [blocks, selectedCategory, searchQuery]);\n\n const handleInsert = (block: BlockDefinition) => {\n if (onInsertBlock) {\n onInsertBlock(block);\n return;\n }\n\n const existingIds = collectNodeIdSet(document.document);\n let counter = 1;\n const generateId = (prefix = 'block') => {\n let id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n while (existingIds.has(id)) {\n id = `${prefix}-${Date.now().toString(36)}-${counter++}`;\n }\n existingIds.add(id);\n return id;\n };\n\n const nodeTree = block.createNodeTree(generateId);\n const targetParentId = selectedNodeId ?? document.document.id;\n\n try {\n dispatch((doc) => insertNode(doc, { parentId: targetParentId, node: nodeTree }));\n selectNode(nodeTree.id);\n } catch {\n // Fallback: insert at page root\n dispatch((doc) => insertNode(doc, { parentId: document.document.id, node: nodeTree }));\n selectNode(nodeTree.id);\n }\n };\n\n const setDragPayload = useEditorStore((s) => s.setDragPayload);\n\n const handleDragStart = (e: React.DragEvent, block: BlockDefinition) => {\n e.dataTransfer.effectAllowed = 'copy';\n e.dataTransfer.setData('text/plain', `block:${block.id}`);\n e.dataTransfer.setData('application/kubuild-drag-type', 'block');\n e.dataTransfer.setData('application/kubuild-block-id', block.id);\n setDragPayload({ type: 'block', blockId: block.id });\n };\n\n const handleDragEnd = () => {\n setDragPayload(null);\n };\n\n return (\n <div\n data-testid=\"blocks-panel\"\n className={`flex flex-col h-full min-h-0 bg-white text-slate-800 ${className || ''}`}\n >\n {/* Search Input */}\n <div className=\"p-3 pb-2 border-b border-slate-100\">\n <input\n type=\"text\"\n value={searchQuery}\n onChange={(e) => setSearchQuery(e.target.value)}\n placeholder=\"Search blocks...\"\n className=\"w-full text-xs px-2.5 py-1.5 rounded border border-slate-300 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:border-blue-500 bg-slate-50 placeholder-slate-400\"\n />\n </div>\n\n {/* Category Pills */}\n <div className=\"flex items-center gap-1 px-3 py-2 overflow-x-auto border-b border-slate-100 no-scrollbar\">\n {categories.map((cat) => (\n <button\n key={cat}\n type=\"button\"\n onClick={() => setSelectedCategory(cat)}\n className={`px-2 py-1 rounded-full text-[11px] font-medium capitalize shrink-0 transition ${\n selectedCategory === cat\n ? 'bg-blue-600 text-white shadow-xs'\n : 'bg-slate-100 text-slate-600 hover:bg-slate-200'\n }`}\n >\n {cat === 'all' ? 'All Blocks' : cat}\n </button>\n ))}\n </div>\n\n {/* Blocks Grid */}\n <div className=\"flex-1 overflow-y-auto p-3 min-h-0\">\n {filteredBlocks.length === 0 ? (\n <div className=\"text-center py-8 text-xs text-slate-400\">No blocks found.</div>\n ) : (\n <div className=\"grid grid-cols-2 gap-2.5\">\n {filteredBlocks.map((block) => (\n <button\n key={block.id}\n type=\"button\"\n draggable={true}\n onDragStart={(e) => handleDragStart(e, block)}\n onDragEnd={handleDragEnd}\n data-testid=\"block-card\"\n data-block-id={block.id}\n onClick={() => handleInsert(block)}\n title={block.description || `Click to insert or drag to canvas: ${block.name}`}\n className=\"flex flex-col justify-between p-2 rounded-lg border border-slate-200 bg-white hover:border-blue-400 hover:shadow-md hover:bg-blue-50/20 transition-all text-left group cursor-grab active:cursor-grabbing select-none\"\n >\n {/* Thumbnail Illustration */}\n <div className=\"mb-2 w-full pointer-events-none\">\n <BlockThumbnail block={block} />\n </div>\n\n {/* Card Title & Info */}\n <div className=\"w-full pointer-events-none\">\n <div className=\"flex items-center justify-between gap-1 mb-0.5\">\n <span className=\"text-[11px] font-semibold text-slate-800 group-hover:text-blue-600 truncate\">\n {block.name}\n </span>\n </div>\n <span className=\"inline-block text-[9px] uppercase tracking-wider font-semibold text-slate-400 bg-slate-100 px-1 py-0.2 rounded\">\n {block.category}\n </span>\n </div>\n </button>\n ))}\n </div>\n )}\n </div>\n </div>\n );\n};\n","import React from 'react';\nimport { StyleSectorId } from './style-manager-accordion';\n\nexport type LeftSidebarTab = 'components' | 'blocks' | 'layers';\n\nexport interface EditorToolbarConfig {\n /** Display page title & status badge in toolbar. Default: true */\n showTitle?: boolean;\n /** Display Navigator (element tree) toggle button. Default: true */\n showNavigatorToggle?: boolean;\n /** Display Undo and Redo buttons. Default: true */\n showHistory?: boolean;\n /** Display Copy, Paste, Duplicate, and Delete buttons. Default: true */\n showClipboard?: boolean;\n /** Display \"View Code\" (< >) modal button. Default: true */\n showCodeViewer?: boolean;\n /** Display Import and Export (.stora / JSON) buttons. Default: true */\n showExportImport?: boolean;\n /** Display Viewport breakpoint switcher (desktop/tablet/mobile). Default: true */\n showViewportSwitcher?: boolean;\n /** Display selected element ID badge on right side. Default: true */\n showSelectionStatus?: boolean;\n /** Custom extra actions or buttons rendered in the toolbar */\n customActions?: React.ReactNode;\n}\n\nexport interface EditorSidebarConfig {\n /** Whether the left sidebar is enabled and visible. Default: true */\n enabled?: boolean;\n /** Default active tab ('components' | 'blocks' | 'layers'). Default: 'components' */\n defaultTab?: LeftSidebarTab;\n /** List of tabs available for user navigation. Default: ['components', 'blocks', 'layers'] */\n availableTabs?: LeftSidebarTab[];\n}\n\nexport interface EditorCanvasConfig {\n /** Display hierarchy breadcrumbs bar below the canvas. Default: true */\n showBreadcrumbs?: boolean;\n /** Display floating action badges on selected node. Default: true */\n showFloatingBadges?: boolean;\n}\n\nexport interface EditorInspectorConfig {\n /** Whether the right inspector panel is enabled and visible. Default: true */\n enabled?: boolean;\n /** Display Props tab/controls. Default: true */\n showProps?: boolean;\n /** Display Traits tab/controls. Default: true */\n showTraits?: boolean;\n /** Display Style Manager section. Default: true */\n showStyles?: boolean;\n /** Display pseudo-state selector (:hover, :active, :focus). Default: true */\n showStateSelector?: boolean;\n /**\n * Filter allowed style sectors ('dimension' | 'spacing' | 'typography' | 'decorations' | 'flex' | 'motion').\n * If omitted, all style sectors are visible.\n */\n allowedStyleSectors?: StyleSectorId[];\n}\n\nexport interface EditorConfig {\n /** Configure or toggle Top Toolbar. If false, toolbar is completely hidden. Default: true */\n toolbar?: boolean | EditorToolbarConfig;\n /** Configure or toggle Left Sidebar. If false, sidebar is completely hidden. Default: true */\n sidebar?: boolean | EditorSidebarConfig;\n /** Configure Canvas UI elements (breadcrumbs, floating badges). */\n canvas?: EditorCanvasConfig;\n /** Configure or toggle Right Inspector. If false, inspector is completely hidden. Default: true */\n inspector?: boolean | EditorInspectorConfig;\n}\n\nexport interface ResolvedEditorConfig {\n toolbar: {\n enabled: boolean;\n showTitle: boolean;\n showNavigatorToggle: boolean;\n showHistory: boolean;\n showClipboard: boolean;\n showCodeViewer: boolean;\n showExportImport: boolean;\n showViewportSwitcher: boolean;\n showSelectionStatus: boolean;\n customActions?: React.ReactNode;\n };\n sidebar: {\n enabled: boolean;\n defaultTab: LeftSidebarTab;\n availableTabs: LeftSidebarTab[];\n };\n canvas: {\n showBreadcrumbs: boolean;\n showFloatingBadges: boolean;\n };\n inspector: {\n enabled: boolean;\n showProps: boolean;\n showTraits: boolean;\n showStyles: boolean;\n showStateSelector: boolean;\n allowedStyleSectors?: StyleSectorId[];\n };\n}\n\nexport function resolveEditorConfig(config?: EditorConfig): ResolvedEditorConfig {\n const toolbarOpt = config?.toolbar;\n const toolbarEnabled = toolbarOpt !== false;\n const toolbarCfg = typeof toolbarOpt === 'object' ? toolbarOpt : {};\n\n const sidebarOpt = config?.sidebar;\n const sidebarEnabled = sidebarOpt !== false && (typeof sidebarOpt !== 'object' || sidebarOpt.enabled !== false);\n const sidebarCfg = typeof sidebarOpt === 'object' ? sidebarOpt : {};\n\n const canvasCfg = config?.canvas ?? {};\n\n const inspectorOpt = config?.inspector;\n const inspectorEnabled = inspectorOpt !== false && (typeof inspectorOpt !== 'object' || inspectorOpt.enabled !== false);\n const inspectorCfg = typeof inspectorOpt === 'object' ? inspectorOpt : {};\n\n const availableTabs: LeftSidebarTab[] = sidebarCfg.availableTabs && sidebarCfg.availableTabs.length > 0\n ? sidebarCfg.availableTabs\n : ['components', 'blocks', 'layers'];\n\n const defaultTab: LeftSidebarTab = sidebarCfg.defaultTab && availableTabs.includes(sidebarCfg.defaultTab)\n ? sidebarCfg.defaultTab\n : availableTabs[0] ?? 'components';\n\n return {\n toolbar: {\n enabled: toolbarEnabled,\n showTitle: toolbarCfg.showTitle ?? true,\n showNavigatorToggle: toolbarCfg.showNavigatorToggle ?? true,\n showHistory: toolbarCfg.showHistory ?? true,\n showClipboard: toolbarCfg.showClipboard ?? true,\n showCodeViewer: toolbarCfg.showCodeViewer ?? true,\n showExportImport: toolbarCfg.showExportImport ?? true,\n showViewportSwitcher: toolbarCfg.showViewportSwitcher ?? true,\n showSelectionStatus: toolbarCfg.showSelectionStatus ?? true,\n customActions: toolbarCfg.customActions,\n },\n sidebar: {\n enabled: sidebarEnabled,\n defaultTab,\n availableTabs,\n },\n canvas: {\n showBreadcrumbs: canvasCfg.showBreadcrumbs ?? true,\n showFloatingBadges: canvasCfg.showFloatingBadges ?? true,\n },\n inspector: {\n enabled: inspectorEnabled,\n showProps: inspectorCfg.showProps ?? true,\n showTraits: inspectorCfg.showTraits ?? true,\n showStyles: inspectorCfg.showStyles ?? true,\n showStateSelector: inspectorCfg.showStateSelector ?? true,\n allowedStyleSectors: inspectorCfg.allowedStyleSectors,\n },\n };\n}\n"],"mappings":"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","names":["import_react","import_components","import_core","document","import_core","import_core","document","import_jsx_runtime","document","container","policy","import_react","import_react","import_core","import_jsx_runtime","import_react","import_renderer","import_core","import_react","import_jsx_runtime","tokens","React","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","document","import_react","import_components","import_core","import_schema","import_schema","import_components","import_jsx_runtime","import_react","import_jsx_runtime","React","import_react","import_core","import_jsx_runtime","import_lucide_react","import_jsx_runtime","content","import_react","import_schema","import_react","import_jsx_runtime","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","import_schema","import_jsx_runtime","import_jsx_runtime","React","import_react","import_components","import_core","import_lucide_react","import_jsx_runtime","document","import_renderer","import_lucide_react","import_jsx_runtime","document","result","import_react","import_core","import_lucide_react","import_jsx_runtime","document","import_react","import_components","import_core","import_jsx_runtime","document","React","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_components","import_core","import_lucide_react","import_jsx_runtime","ImageIcon","document","import_jsx_runtime","React","import_lucide_react","import_jsx_runtime","document","React"]}
|