@kubuild/editor 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/README.md +106 -0
  2. package/dist/action-branch-editor.d.ts +18 -0
  3. package/dist/action-branch-editor.d.ts.map +1 -0
  4. package/dist/action-builder-modal.d.ts +32 -0
  5. package/dist/action-builder-modal.d.ts.map +1 -0
  6. package/dist/action-debugger-panel.d.ts +11 -0
  7. package/dist/action-debugger-panel.d.ts.map +1 -0
  8. package/dist/action-step-form.d.ts +84 -0
  9. package/dist/action-step-form.d.ts.map +1 -0
  10. package/dist/blocks-panel.d.ts.map +1 -1
  11. package/dist/canvas.d.ts.map +1 -1
  12. package/dist/components/action-builder/action-branch-editor.d.ts +18 -0
  13. package/dist/components/action-builder/action-branch-editor.d.ts.map +1 -0
  14. package/dist/components/action-builder/action-builder-modal.d.ts +32 -0
  15. package/dist/components/action-builder/action-builder-modal.d.ts.map +1 -0
  16. package/dist/components/action-builder/action-step-form.d.ts +71 -0
  17. package/dist/components/action-builder/action-step-form.d.ts.map +1 -0
  18. package/dist/components/action-builder/index.d.ts +4 -0
  19. package/dist/components/action-builder/index.d.ts.map +1 -0
  20. package/dist/components/canvas/breadcrumbs.d.ts +16 -0
  21. package/dist/components/canvas/breadcrumbs.d.ts.map +1 -0
  22. package/dist/components/canvas/canvas.d.ts +16 -0
  23. package/dist/components/canvas/canvas.d.ts.map +1 -0
  24. package/dist/components/canvas/floating-badges.d.ts +26 -0
  25. package/dist/components/canvas/floating-badges.d.ts.map +1 -0
  26. package/dist/components/canvas/index.d.ts +4 -0
  27. package/dist/components/canvas/index.d.ts.map +1 -0
  28. package/dist/components/index.d.ts +9 -0
  29. package/dist/components/index.d.ts.map +1 -0
  30. package/dist/components/layout/editor.d.ts +18 -0
  31. package/dist/components/layout/editor.d.ts.map +1 -0
  32. package/dist/components/layout/index.d.ts +3 -0
  33. package/dist/components/layout/index.d.ts.map +1 -0
  34. package/dist/components/layout/toolbar.d.ts +11 -0
  35. package/dist/components/layout/toolbar.d.ts.map +1 -0
  36. package/dist/components/modals/asset-manager-modal.d.ts +28 -0
  37. package/dist/components/modals/asset-manager-modal.d.ts.map +1 -0
  38. package/dist/components/modals/code-viewer-modal.d.ts +11 -0
  39. package/dist/components/modals/code-viewer-modal.d.ts.map +1 -0
  40. package/dist/components/modals/import-modal.d.ts +11 -0
  41. package/dist/components/modals/import-modal.d.ts.map +1 -0
  42. package/dist/components/modals/index.d.ts +4 -0
  43. package/dist/components/modals/index.d.ts.map +1 -0
  44. package/dist/components/panels/action-debugger-panel.d.ts +11 -0
  45. package/dist/components/panels/action-debugger-panel.d.ts.map +1 -0
  46. package/dist/components/panels/blocks-panel.d.ts +20 -0
  47. package/dist/components/panels/blocks-panel.d.ts.map +1 -0
  48. package/dist/components/panels/component-panel.d.ts +8 -0
  49. package/dist/components/panels/component-panel.d.ts.map +1 -0
  50. package/dist/components/panels/form-validation-rules-panel.d.ts +27 -0
  51. package/dist/components/panels/form-validation-rules-panel.d.ts.map +1 -0
  52. package/dist/components/panels/index.d.ts +9 -0
  53. package/dist/components/panels/index.d.ts.map +1 -0
  54. package/dist/components/panels/inspector-panel.d.ts +20 -0
  55. package/dist/components/panels/inspector-panel.d.ts.map +1 -0
  56. package/dist/components/panels/layers-panel.d.ts +8 -0
  57. package/dist/components/panels/layers-panel.d.ts.map +1 -0
  58. package/dist/components/panels/left-sidebar.d.ts +16 -0
  59. package/dist/components/panels/left-sidebar.d.ts.map +1 -0
  60. package/dist/components/panels/traits-panel.d.ts +20 -0
  61. package/dist/components/panels/traits-panel.d.ts.map +1 -0
  62. package/dist/components/style-manager/box-model-editor.d.ts +29 -0
  63. package/dist/components/style-manager/box-model-editor.d.ts.map +1 -0
  64. package/dist/components/style-manager/dimension-sector-controls.d.ts +27 -0
  65. package/dist/components/style-manager/dimension-sector-controls.d.ts.map +1 -0
  66. package/dist/components/style-manager/index.d.ts +6 -0
  67. package/dist/components/style-manager/index.d.ts.map +1 -0
  68. package/dist/components/style-manager/motion-sector-controls.d.ts +36 -0
  69. package/dist/components/style-manager/motion-sector-controls.d.ts.map +1 -0
  70. package/dist/components/style-manager/style-manager-accordion.d.ts +38 -0
  71. package/dist/components/style-manager/style-manager-accordion.d.ts.map +1 -0
  72. package/dist/components/style-manager/typography-sector-controls.d.ts +17 -0
  73. package/dist/components/style-manager/typography-sector-controls.d.ts.map +1 -0
  74. package/dist/components/table-editor/index.d.ts +2 -0
  75. package/dist/components/table-editor/index.d.ts.map +1 -0
  76. package/dist/components/table-editor/table-spreadsheet-editor.d.ts +15 -0
  77. package/dist/components/table-editor/table-spreadsheet-editor.d.ts.map +1 -0
  78. package/dist/components/ui/code-highlighter.d.ts +20 -0
  79. package/dist/components/ui/code-highlighter.d.ts.map +1 -0
  80. package/dist/components/ui/icons.d.ts +8 -0
  81. package/dist/components/ui/icons.d.ts.map +1 -0
  82. package/dist/components/ui/index.d.ts +5 -0
  83. package/dist/components/ui/index.d.ts.map +1 -0
  84. package/dist/components/ui/variable-autocomplete-input.d.ts +42 -0
  85. package/dist/components/ui/variable-autocomplete-input.d.ts.map +1 -0
  86. package/dist/components/ui/variable-picker.d.ts +21 -0
  87. package/dist/components/ui/variable-picker.d.ts.map +1 -0
  88. package/dist/config/config.d.ts +103 -0
  89. package/dist/config/config.d.ts.map +1 -0
  90. package/dist/config/index.d.ts +2 -0
  91. package/dist/config/index.d.ts.map +1 -0
  92. package/dist/config.d.ts +6 -0
  93. package/dist/config.d.ts.map +1 -1
  94. package/dist/editor.d.ts.map +1 -1
  95. package/dist/form-validation-rules-panel.d.ts +27 -0
  96. package/dist/form-validation-rules-panel.d.ts.map +1 -0
  97. package/dist/index.cjs +5010 -1467
  98. package/dist/index.cjs.map +1 -1
  99. package/dist/index.d.ts +2 -23
  100. package/dist/index.d.ts.map +1 -1
  101. package/dist/index.js +4983 -1402
  102. package/dist/index.js.map +1 -1
  103. package/dist/inspector-panel.d.ts.map +1 -1
  104. package/dist/store/index.d.ts +2 -0
  105. package/dist/store/index.d.ts.map +1 -0
  106. package/dist/store/store.d.ts +148 -0
  107. package/dist/store/store.d.ts.map +1 -0
  108. package/dist/store.d.ts +46 -1
  109. package/dist/store.d.ts.map +1 -1
  110. package/dist/toolbar.d.ts.map +1 -1
  111. package/dist/traits-panel.d.ts +3 -1
  112. package/dist/traits-panel.d.ts.map +1 -1
  113. package/dist/utils/document-scanner.d.ts +31 -0
  114. package/dist/utils/document-scanner.d.ts.map +1 -0
  115. package/dist/utils/export-utils.d.ts +19 -0
  116. package/dist/utils/export-utils.d.ts.map +1 -0
  117. package/dist/utils/index.d.ts +3 -0
  118. package/dist/utils/index.d.ts.map +1 -0
  119. package/dist/variable-autocomplete-input.d.ts +43 -0
  120. package/dist/variable-autocomplete-input.d.ts.map +1 -0
  121. package/package.json +5 -5
@@ -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\">&lt;&gt;</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 &lt;&gt;\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 &amp; 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\">&nbsp;</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&#10;Value 1, Value 2, Value 3&#10;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 (&lt;th&gt;)</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 &gt;\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 &lt;{String(node.props.tag)}&gt;\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/components/action-builder/action-branch-editor.tsx","../src/components/action-builder/action-builder-modal.tsx","../src/store/store.ts","../src/components/action-builder/action-step-form.tsx","../src/components/ui/variable-autocomplete-input.tsx","../src/utils/document-scanner.ts","../src/components/canvas/breadcrumbs.tsx","../src/components/canvas/canvas.tsx","../src/components/canvas/floating-badges.tsx","../src/components/layout/editor.tsx","../src/components/layout/toolbar.tsx","../src/components/modals/import-modal.tsx","../src/components/modals/code-viewer-modal.tsx","../src/utils/export-utils.ts","../src/components/ui/code-highlighter.tsx","../src/components/panels/inspector-panel.tsx","../src/components/ui/variable-picker.tsx","../src/components/modals/asset-manager-modal.tsx","../src/components/table-editor/table-spreadsheet-editor.tsx","../src/components/ui/icons.tsx","../src/components/style-manager/style-manager-accordion.tsx","../src/components/style-manager/box-model-editor.tsx","../src/components/style-manager/dimension-sector-controls.tsx","../src/components/style-manager/typography-sector-controls.tsx","../src/components/style-manager/motion-sector-controls.tsx","../src/components/panels/traits-panel.tsx","../src/components/panels/form-validation-rules-panel.tsx","../src/components/panels/layers-panel.tsx","../src/components/panels/left-sidebar.tsx","../src/components/panels/component-panel.tsx","../src/components/panels/blocks-panel.tsx","../src/components/panels/action-debugger-panel.tsx","../src/config/config.ts"],"sourcesContent":["export * from './components';\nexport * from './store';\nexport * from './config';\nexport * from './utils';\n","import React, { useState } from 'react';\nimport {\n ActionStep,\n ActionStepType,\n PageDocument,\n} from '@kubuild/schema';\nimport {\n CheckCircle2,\n AlertOctagon,\n Plus,\n Trash2,\n ChevronUp,\n ChevronDown,\n Sliders,\n Sparkles,\n GitBranch,\n} from 'lucide-react';\nimport {\n STEP_TYPE_OPTIONS,\n getStepTypeMeta,\n formatStepSummary,\n} from './action-builder-modal';\nimport { ActionStepForm } from './action-step-form';\n\nexport interface ActionBranchEditorProps {\n parentStep: ActionStep;\n document?: PageDocument;\n onUpdateSuccessSteps: (steps: ActionStep[]) => void;\n onUpdateErrorSteps: (steps: ActionStep[]) => void;\n className?: string;\n}\n\nexport interface BranchLaneProps {\n branchType: 'success' | 'error';\n steps: ActionStep[];\n document?: PageDocument;\n onUpdateSteps: (steps: ActionStep[]) => void;\n}\n\nexport const BranchLane: React.FC<BranchLaneProps> = ({\n branchType,\n steps,\n document,\n onUpdateSteps,\n}) => {\n const isSuccess = branchType === 'success';\n const [isAddMenuOpen, setIsAddMenuOpen] = useState(false);\n const [editingSubStepId, setEditingSubStepId] = useState<string | null>(null);\n\n const theme = isSuccess\n ? {\n title: 'On Success (HTTP 2xx)',\n description: 'Run these action steps when the request completes successfully',\n badgeBg: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/30',\n cardBorder: 'border-emerald-900/60 hover:border-emerald-700/60',\n activeBorder: 'border-emerald-500 ring-1 ring-emerald-500/40',\n lineColor: 'border-emerald-500/30',\n stepNumberBg: 'bg-emerald-950 border-emerald-500/80 text-emerald-300',\n btnBg: 'bg-emerald-500/10 hover:bg-emerald-500/20 text-emerald-300 border-emerald-500/30',\n icon: CheckCircle2,\n prefix: 'S',\n }\n : {\n title: 'On Error (HTTP 4xx / 5xx / Network Failure)',\n description: 'Run these action steps if the request fails or times out',\n badgeBg: 'bg-rose-500/10 text-rose-400 border-rose-500/30',\n cardBorder: 'border-rose-900/60 hover:border-rose-700/60',\n activeBorder: 'border-rose-500 ring-1 ring-rose-500/40',\n lineColor: 'border-rose-500/30',\n stepNumberBg: 'bg-rose-950 border-rose-500/80 text-rose-300',\n btnBg: 'bg-rose-500/10 hover:bg-rose-500/20 text-rose-300 border-rose-500/30',\n icon: AlertOctagon,\n prefix: 'E',\n };\n\n const IconComponent = theme.icon;\n\n const handleAddStep = (type: ActionStepType) => {\n const meta = getStepTypeMeta(type);\n const newStepId = `substep-${branchType}-${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 6)}`;\n \n // Customize default payload for success/error presets\n const payload = { ...meta.defaultPayload };\n if (type === 'show_toast') {\n payload.type = isSuccess ? 'success' : 'error';\n payload.variant = isSuccess ? 'success' : 'error';\n payload.message = isSuccess\n ? 'Request completed successfully!'\n : 'Request failed. Please try again.';\n }\n\n const newStep: ActionStep = {\n id: newStepId,\n type,\n label: `${meta.label} (${isSuccess ? 'Success' : 'Error'})`,\n payload,\n };\n\n const nextSteps = [...steps, newStep];\n onUpdateSteps(nextSteps);\n setIsAddMenuOpen(false);\n setEditingSubStepId(newStepId);\n };\n\n const handleRemoveStep = (stepId: string) => {\n const nextSteps = steps.filter((s) => s.id !== stepId);\n onUpdateSteps(nextSteps);\n if (editingSubStepId === stepId) {\n setEditingSubStepId(null);\n }\n };\n\n const handleMoveStep = (index: number, direction: 'up' | 'down') => {\n const targetIndex = direction === 'up' ? index - 1 : index + 1;\n if (targetIndex < 0 || targetIndex >= steps.length) return;\n const nextSteps = [...steps];\n const [moved] = nextSteps.splice(index, 1);\n nextSteps.splice(targetIndex, 0, moved);\n onUpdateSteps(nextSteps);\n };\n\n const handleUpdateSubStepPayload = (stepId: string, payload: Record<string, unknown>) => {\n const nextSteps = steps.map((s) => (s.id === stepId ? { ...s, payload } : s));\n onUpdateSteps(nextSteps);\n };\n\n const handleUpdateSubStepMeta = (\n stepId: string,\n meta: { label?: string; timeout?: number; continueOnError?: boolean },\n ) => {\n const nextSteps = steps.map((s) => (s.id === stepId ? { ...s, ...meta } : s));\n onUpdateSteps(nextSteps);\n };\n\n return (\n <div\n data-testid={`branch-lane-${branchType}`}\n className={`flex flex-col gap-3 p-3.5 rounded-xl bg-slate-950/70 border ${\n isSuccess ? 'border-emerald-950/80' : 'border-rose-950/80'\n }`}\n >\n {/* Branch Header */}\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <div className={`p-1 rounded-md border ${theme.badgeBg}`}>\n <IconComponent className=\"w-4 h-4\" />\n </div>\n <div>\n <span className=\"text-xs font-semibold text-white block\">{theme.title}</span>\n <span className=\"text-[10px] text-slate-400 block\">{theme.description}</span>\n </div>\n </div>\n\n {/* Add Step Button */}\n <div className=\"relative\">\n <button\n type=\"button\"\n data-testid={`add-${branchType}-step-btn`}\n onClick={() => setIsAddMenuOpen(!isAddMenuOpen)}\n className={`px-2 py-1 text-[11px] font-medium border rounded-md flex items-center gap-1 transition cursor-pointer ${theme.btnBg}`}\n >\n <Plus className=\"w-3 h-3\" />\n <span>Add Step</span>\n </button>\n\n {isAddMenuOpen && (\n <div className=\"absolute right-0 top-full mt-1.5 w-60 bg-slate-900 border border-slate-700 rounded-xl shadow-2xl z-30 p-1.5 flex flex-col gap-0.5 animate-in fade-in zoom-in-95 duration-100\">\n <div className=\"px-2 py-1 text-[10px] font-semibold text-slate-400 uppercase tracking-wider\">\n Select Action Step Type\n </div>\n {STEP_TYPE_OPTIONS.map((opt) => {\n const OptIcon = opt.icon;\n return (\n <button\n key={opt.type}\n type=\"button\"\n onClick={() => handleAddStep(opt.type)}\n className=\"flex items-center gap-2 px-2 py-1.5 rounded-lg text-xs text-left text-slate-200 hover:bg-slate-800 hover:text-white transition cursor-pointer\"\n >\n <OptIcon className=\"w-3.5 h-3.5 text-blue-400 shrink-0\" />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"font-medium\">{opt.label}</span>\n <span className=\"text-[10px] text-slate-400 truncate\">{opt.description}</span>\n </div>\n </button>\n );\n })}\n </div>\n )}\n </div>\n </div>\n\n {/* Sub-steps List */}\n {steps.length === 0 ? (\n <div className=\"text-[11px] text-slate-500 italic py-3 text-center border border-dashed border-slate-800/80 rounded-lg bg-slate-900/20\">\n {`No ${branchType} action steps configured yet`}\n </div>\n ) : (\n <div className={`flex flex-col gap-2.5 pl-2 relative border-l-2 ${theme.lineColor} ml-2`}>\n {steps.map((subStep, idx) => {\n const meta = getStepTypeMeta(subStep.type);\n const SubIcon = meta.icon;\n const summary = formatStepSummary(subStep);\n const isFirst = idx === 0;\n const isLast = idx === steps.length - 1;\n const isEditing = editingSubStepId === subStep.id;\n\n return (\n <div\n key={subStep.id}\n data-testid={`branch-step-card-${subStep.id}`}\n className={`flex flex-col p-3 rounded-lg bg-slate-900 border transition shadow-xs ${\n isEditing ? theme.activeBorder : theme.cardBorder\n }`}\n >\n <div className=\"flex items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2 min-w-0 flex-1\">\n <div\n className={`w-5 h-5 rounded-full border text-[10px] font-mono font-bold flex items-center justify-center shrink-0 ${theme.stepNumberBg}`}\n >\n {`${theme.prefix}${idx + 1}`}\n </div>\n <span className=\"inline-flex items-center gap-1 px-1.5 py-0.5 rounded text-[10px] font-semibold bg-blue-500/10 text-blue-400 border border-blue-500/20 shrink-0\">\n <SubIcon className=\"w-2.5 h-2.5\" />\n <span>{meta.label}</span>\n </span>\n <span className=\"text-xs text-slate-200 truncate font-medium\">\n {subStep.label || summary}\n </span>\n </div>\n\n {/* Actions */}\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n type=\"button\"\n data-testid={`toggle-edit-substep-${subStep.id}`}\n onClick={() => setEditingSubStepId(isEditing ? null : subStep.id)}\n className={`p-1 rounded text-xs transition cursor-pointer ${\n isEditing\n ? 'bg-blue-600 text-white'\n : 'text-slate-400 hover:text-white hover:bg-slate-800'\n }`}\n title={isEditing ? 'Collapse' : 'Configure parameters'}\n >\n <Sliders className=\"w-3.5 h-3.5\" />\n </button>\n <button\n type=\"button\"\n disabled={isFirst}\n onClick={() => handleMoveStep(idx, 'up')}\n className=\"p-1 rounded text-slate-400 hover:text-white hover:bg-slate-800 disabled:opacity-30 disabled:pointer-events-none transition cursor-pointer\"\n title=\"Move up\"\n >\n <ChevronUp className=\"w-3.5 h-3.5\" />\n </button>\n <button\n type=\"button\"\n disabled={isLast}\n onClick={() => handleMoveStep(idx, 'down')}\n className=\"p-1 rounded text-slate-400 hover:text-white hover:bg-slate-800 disabled:opacity-30 disabled:pointer-events-none transition cursor-pointer\"\n title=\"Move down\"\n >\n <ChevronDown className=\"w-3.5 h-3.5\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveStep(subStep.id)}\n className=\"p-1 rounded text-slate-400 hover:text-red-400 hover:bg-red-500/10 transition cursor-pointer\"\n title=\"Delete step\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Summary bar */}\n <div className=\"text-[11px] font-mono text-slate-400 bg-slate-950/60 rounded px-2 py-1 mt-1.5 truncate border border-slate-800/80\">\n {summary}\n </div>\n\n {/* Sub-step configuration form */}\n {isEditing && (\n <div className=\"mt-3 pt-3 border-t border-slate-800\">\n <ActionStepForm\n step={subStep}\n document={document}\n hideBranches={true}\n onUpdatePayload={(newPayload) =>\n handleUpdateSubStepPayload(subStep.id, newPayload)\n }\n onUpdateMeta={(meta) => handleUpdateSubStepMeta(subStep.id, meta)}\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n );\n};\n\nexport const ActionBranchEditor: React.FC<ActionBranchEditorProps> = ({\n parentStep,\n document,\n onUpdateSuccessSteps,\n onUpdateErrorSteps,\n className = '',\n}) => {\n const successSteps = parentStep.onSuccess || [];\n const errorSteps = parentStep.onError || [];\n\n return (\n <div\n data-testid={`action-branch-editor-${parentStep.id}`}\n className={`flex flex-col gap-3.5 p-3.5 rounded-xl bg-slate-900 border border-slate-800 shadow-inner ${className}`}\n >\n <div className=\"flex items-center gap-2 text-xs font-semibold text-slate-300\">\n <GitBranch className=\"w-4 h-4 text-blue-400\" />\n <span>Response Branching Pipeline (Success / Error Execution)</span>\n </div>\n\n <div className=\"flex flex-col gap-3\">\n {/* On Success Branch */}\n <BranchLane\n branchType=\"success\"\n steps={successSteps}\n document={document}\n onUpdateSteps={onUpdateSuccessSteps}\n />\n\n {/* On Error Branch */}\n <BranchLane\n branchType=\"error\"\n steps={errorSteps}\n document={document}\n onUpdateSteps={onUpdateErrorSteps}\n />\n </div>\n </div>\n );\n};\n","import React, { useState, useEffect, useMemo, useCallback } from 'react';\nimport {\n PageDocument,\n ActionPipeline,\n ActionStep,\n ActionStepType,\n ActionTriggerType,\n} from '@kubuild/schema';\nimport { findNodeById } from '@kubuild/core';\nimport { useEditorStore } from '../../store';\nimport { ActionStepForm } from './action-step-form';\nimport {\n Zap,\n Plus,\n Trash2,\n ChevronUp,\n ChevronDown,\n Globe,\n Bell,\n Navigation,\n Maximize2,\n Minimize2,\n Database,\n RotateCcw,\n Copy,\n Check,\n X,\n Sparkles,\n ChevronRight,\n Sliders,\n Search,\n CopyPlus,\n GitBranch,\n AlertOctagon,\n} from 'lucide-react';\n\nexport interface ActionBuilderModalProps {\n isOpen: boolean;\n onClose: () => void;\n nodeId?: string | null;\n initialTrigger?: ActionTriggerType;\n document?: PageDocument;\n}\n\nexport interface TriggerMeta {\n type: ActionTriggerType;\n label: string;\n description: string;\n badge: string;\n}\n\nexport const TRIGGER_OPTIONS: TriggerMeta[] = [\n {\n type: 'click',\n label: 'On Click',\n description: 'Triggered when the user clicks or taps this element',\n badge: 'Click',\n },\n {\n type: 'submit',\n label: 'On Submit',\n description: 'Triggered when the form is submitted (validation passes)',\n badge: 'Submit',\n },\n {\n type: 'change',\n label: 'On Change',\n description: 'Triggered when the input or select value changes',\n badge: 'Change',\n },\n {\n type: 'blur',\n label: 'On Blur',\n description: 'Triggered when this element loses focus',\n badge: 'Blur',\n },\n {\n type: 'focus',\n label: 'On Focus',\n description: 'Triggered when this element receives focus',\n badge: 'Focus',\n },\n {\n type: 'load',\n label: 'On Load',\n description: 'Triggered automatically when the component mounts',\n badge: 'Load',\n },\n];\n\nexport interface StepTypeMeta {\n type: ActionStepType;\n label: string;\n description: string;\n category: 'network' | 'ui' | 'navigation' | 'state' | 'utility';\n icon: React.ComponentType<{ className?: string }>;\n defaultPayload: Record<string, unknown>;\n}\n\nexport const STEP_TYPE_OPTIONS: StepTypeMeta[] = [\n {\n type: 'api_request',\n label: 'API / Webhook Request',\n description: 'Send an HTTP REST or Webhook request (GET, POST, PUT, DELETE)',\n category: 'network',\n icon: Globe,\n defaultPayload: {\n url: 'https://api.example.com/endpoint',\n method: 'POST',\n },\n },\n {\n type: 'show_toast',\n label: 'Show Toast Notification',\n description: 'Display a floating alert toast (Success, Error, Info, Warning)',\n category: 'ui',\n icon: Bell,\n defaultPayload: {\n message: 'Operation completed successfully!',\n type: 'success',\n duration: 3000,\n },\n },\n {\n type: 'navigate',\n label: 'Navigate / Redirect',\n description: 'Redirect to external URL, open new tab, or scroll to section',\n category: 'navigation',\n icon: Navigation,\n defaultPayload: {\n url: 'https://example.com',\n target: '_self',\n },\n },\n {\n type: 'open_modal',\n label: 'Open Modal Dialog',\n description: 'Open and reveal a modal overlay component by Node ID',\n category: 'ui',\n icon: Maximize2,\n defaultPayload: {\n modalNodeId: 'modal-1',\n },\n },\n {\n type: 'close_modal',\n label: 'Close Modal Dialog',\n description: 'Dismiss an active modal overlay component',\n category: 'ui',\n icon: Minimize2,\n defaultPayload: {\n modalNodeId: 'modal-1',\n },\n },\n {\n type: 'set_state',\n label: 'Set State Variable',\n description: 'Save or update dynamic runtime/session variables',\n category: 'state',\n icon: Database,\n defaultPayload: {\n key: 'user_selection',\n value: '',\n scope: 'runtime',\n },\n },\n {\n type: 'reset_form',\n label: 'Reset Form',\n description: 'Clear all input fields and errors in the target form',\n category: 'state',\n icon: RotateCcw,\n defaultPayload: {},\n },\n {\n type: 'copy_clipboard',\n label: 'Copy to Clipboard',\n description: 'Copy static text or resolved dynamic variable to clipboard',\n category: 'utility',\n icon: Copy,\n defaultPayload: {\n text: 'Sample text to copy',\n notify: true,\n toastMessage: 'Copied to clipboard!',\n },\n },\n {\n type: 'custom_event',\n label: 'Dispatch Custom Event',\n description: 'Emit a custom DOM / Window event for third-party scripts',\n category: 'utility',\n icon: Zap,\n defaultPayload: {\n eventName: 'custom:element-action',\n bubbles: true,\n },\n },\n];\n\nexport function getStepTypeMeta(type: ActionStepType): StepTypeMeta {\n const found = STEP_TYPE_OPTIONS.find((s) => s.type === type);\n if (found) return found;\n return {\n type,\n label: type.replace('_', ' ').toUpperCase(),\n description: 'Custom action operation',\n category: 'utility',\n icon: Zap,\n defaultPayload: {},\n };\n}\n\nexport function getCategoryBadgeClass(category: 'network' | 'ui' | 'navigation' | 'state' | 'utility'): string {\n switch (category) {\n case 'network':\n return 'bg-blue-500/15 text-blue-400 border-blue-500/30';\n case 'ui':\n return 'bg-emerald-500/15 text-emerald-400 border-emerald-500/30';\n case 'navigation':\n return 'bg-purple-500/15 text-purple-400 border-purple-500/30';\n case 'state':\n return 'bg-cyan-500/15 text-cyan-400 border-cyan-500/30';\n case 'utility':\n default:\n return 'bg-slate-800 text-slate-300 border-slate-700';\n }\n}\n\nexport function formatStepSummary(step: ActionStep): string {\n const payload = step.payload || {};\n switch (step.type) {\n case 'api_request': {\n const method = (payload.method as string) || 'GET';\n const url = (payload.url as string) || '';\n return `${method} ${url}`;\n }\n case 'show_toast': {\n const type = (payload.type as string) || 'info';\n const msg = (payload.message as string) || '';\n return `[${type.toUpperCase()}] \"${msg}\"`;\n }\n case 'navigate': {\n const url = (payload.url as string) || '';\n const target = payload.target === '_blank' ? '(New tab)' : '';\n return `Go to ${url} ${target}`.trim();\n }\n case 'open_modal': {\n const targetId = (payload.modalNodeId as string) || (payload.modalId as string) || '';\n return `Open Modal #${targetId}`;\n }\n case 'close_modal': {\n const targetId = (payload.modalNodeId as string) || (payload.modalId as string) || '';\n return `Close Modal #${targetId}`;\n }\n case 'set_state': {\n const key = (payload.key as string) || '';\n return `Set ${key}`;\n }\n case 'reset_form': {\n const formId = (payload.formId as string) || '';\n return formId ? `Reset #${formId}` : 'Reset Form';\n }\n case 'copy_clipboard': {\n const text = (payload.text as string) || '';\n return `Copy \"${text.slice(0, 30)}${text.length > 30 ? '...' : ''}\"`;\n }\n case 'custom_event': {\n const eventName = (payload.eventName as string) || '';\n return `Emit \"${eventName}\"`;\n }\n default:\n return JSON.stringify(payload);\n }\n}\n\nexport const ActionBuilderModal: React.FC<ActionBuilderModalProps> = ({\n isOpen,\n onClose,\n nodeId: propNodeId,\n initialTrigger = 'click',\n document: customDoc,\n}) => {\n const storeState = useEditorStore((s) => s);\n const document = customDoc ?? storeState.document;\n const activeNodeId = propNodeId ?? storeState.selectedNodeId;\n const node = activeNodeId ? findNodeById(document.document, activeNodeId) : null;\n const updateNodeActions = storeState.updateNodeActions;\n\n // Selected trigger tab\n const [selectedTrigger, setSelectedTrigger] = useState<ActionTriggerType>(initialTrigger);\n const [isAddStepMenuOpen, setIsAddStepMenuOpen] = useState<boolean>(false);\n const [editingStepId, setEditingStepId] = useState<string | null>(null);\n const [stepSearchQuery, setStepSearchQuery] = useState<string>('');\n\n const filteredStepTypes = useMemo(() => {\n if (!stepSearchQuery.trim()) return STEP_TYPE_OPTIONS;\n const q = stepSearchQuery.toLowerCase();\n return STEP_TYPE_OPTIONS.filter(\n (opt) =>\n opt.label.toLowerCase().includes(q) ||\n opt.description.toLowerCase().includes(q) ||\n opt.type.toLowerCase().includes(q) ||\n opt.category.toLowerCase().includes(q),\n );\n }, [stepSearchQuery]);\n\n // Synchronize initial trigger\n useEffect(() => {\n if (initialTrigger) {\n setSelectedTrigger(initialTrigger);\n }\n }, [initialTrigger]);\n\n // Handle ESC key to close\n 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 // Extract action pipelines from active node\n const pipelines: ActionPipeline[] = useMemo(() => {\n if (!node || !Array.isArray(node.actions)) return [];\n return node.actions;\n }, [node]);\n\n // Find or determine active pipeline for currently selected trigger\n const currentPipeline = useMemo(() => {\n return pipelines.find((p) => p.trigger === selectedTrigger) || null;\n }, [pipelines, selectedTrigger]);\n\n // Count active triggers\n const triggerPipelineMap = useMemo(() => {\n const map = new Map<ActionTriggerType, ActionPipeline>();\n for (const p of pipelines) {\n map.set(p.trigger, p);\n }\n return map;\n }, [pipelines]);\n\n // Helper to commit new pipelines array to the node\n const commitPipelines = useCallback(\n (newPipelines: ActionPipeline[]) => {\n if (!node) return;\n updateNodeActions(node.id, newPipelines.length > 0 ? newPipelines : null);\n },\n [node, updateNodeActions],\n );\n\n // Add new step to current trigger's pipeline\n const handleAddStep = (stepType: ActionStepType) => {\n if (!node) return;\n const typeMeta = getStepTypeMeta(stepType);\n const newStepId = `step-${Date.now().toString(36)}-${Math.random().toString(36).substring(2, 6)}`;\n const newStep: ActionStep = {\n id: newStepId,\n type: stepType,\n label: typeMeta.label,\n payload: { ...typeMeta.defaultPayload },\n };\n\n let updatedPipelines: ActionPipeline[];\n\n if (currentPipeline) {\n // Append step to existing pipeline\n updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return {\n ...p,\n steps: [...p.steps, newStep],\n };\n }\n return p;\n });\n } else {\n // Create new pipeline with this step\n const newPipeline: ActionPipeline = {\n id: `pipeline-${selectedTrigger}-${Date.now().toString(36)}`,\n trigger: selectedTrigger,\n label: `${TRIGGER_OPTIONS.find((t) => t.type === selectedTrigger)?.label || selectedTrigger} Pipeline`,\n enabled: true,\n steps: [newStep],\n };\n updatedPipelines = [...pipelines, newPipeline];\n }\n\n commitPipelines(updatedPipelines);\n setIsAddStepMenuOpen(false);\n setEditingStepId(newStepId);\n };\n\n // Remove a step\n const handleRemoveStep = (stepId: string) => {\n if (!currentPipeline) return;\n const nextSteps = currentPipeline.steps.filter((s) => s.id !== stepId);\n let updatedPipelines: ActionPipeline[];\n if (nextSteps.length === 0) {\n // If no steps left, remove the pipeline entirely\n updatedPipelines = pipelines.filter((p) => p.id !== currentPipeline.id);\n } else {\n updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return { ...p, steps: nextSteps };\n }\n return p;\n });\n }\n commitPipelines(updatedPipelines);\n if (editingStepId === stepId) {\n setEditingStepId(null);\n }\n };\n\n // Reorder steps (move up / down)\n const handleMoveStep = (stepIndex: number, direction: 'up' | 'down') => {\n if (!currentPipeline) return;\n const targetIndex = direction === 'up' ? stepIndex - 1 : stepIndex + 1;\n if (targetIndex < 0 || targetIndex >= currentPipeline.steps.length) return;\n\n const newSteps = [...currentPipeline.steps];\n const [moved] = newSteps.splice(stepIndex, 1);\n newSteps.splice(targetIndex, 0, moved);\n\n const updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return { ...p, steps: newSteps };\n }\n return p;\n });\n commitPipelines(updatedPipelines);\n };\n\n // Toggle pipeline enabled\n const handleTogglePipelineEnabled = () => {\n if (!currentPipeline) return;\n const updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return { ...p, enabled: p.enabled === false ? true : false };\n }\n return p;\n });\n commitPipelines(updatedPipelines);\n };\n\n // Update pipeline preventDuplicate\n const handleTogglePreventDuplicate = () => {\n if (!currentPipeline) return;\n const updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return { ...p, preventDuplicate: !p.preventDuplicate };\n }\n return p;\n });\n commitPipelines(updatedPipelines);\n };\n\n // Update step payload\n const handleUpdateStepPayload = (stepId: string, payload: Record<string, unknown>) => {\n if (!currentPipeline) return;\n const updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return {\n ...p,\n steps: p.steps.map((s) => (s.id === stepId ? { ...s, payload } : s)),\n };\n }\n return p;\n });\n commitPipelines(updatedPipelines);\n };\n\n // Update step metadata (label, timeout, continueOnError)\n const handleUpdateStepMeta = (\n stepId: string,\n meta: { label?: string; timeout?: number; continueOnError?: boolean },\n ) => {\n if (!currentPipeline) return;\n const updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return {\n ...p,\n steps: p.steps.map((s) => (s.id === stepId ? { ...s, ...meta } : s)),\n };\n }\n return p;\n });\n commitPipelines(updatedPipelines);\n };\n\n // Update step branching (onSuccess, onError)\n const handleUpdateStepBranches = (\n stepId: string,\n branches: { onSuccess?: ActionStep[]; onError?: ActionStep[] },\n ) => {\n if (!currentPipeline) return;\n const updatedPipelines = pipelines.map((p) => {\n if (p.id === currentPipeline.id) {\n return {\n ...p,\n steps: p.steps.map((s) => {\n if (s.id === stepId) {\n const updated = { ...s };\n if (branches.onSuccess !== undefined) {\n if (branches.onSuccess.length === 0) delete updated.onSuccess;\n else updated.onSuccess = branches.onSuccess;\n }\n if (branches.onError !== undefined) {\n if (branches.onError.length === 0) delete updated.onError;\n else updated.onError = branches.onError;\n }\n return updated;\n }\n return s;\n }),\n };\n }\n return p;\n });\n commitPipelines(updatedPipelines);\n };\n\n // Delete entire current pipeline\n const handleDeletePipeline = () => {\n if (!currentPipeline) return;\n const updatedPipelines = pipelines.filter((p) => p.id !== currentPipeline.id);\n commitPipelines(updatedPipelines);\n setEditingStepId(null);\n };\n\n if (!isOpen) return null;\n\n return (\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby=\"action-builder-title\"\n data-testid=\"action-builder-modal\"\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 select-none\"\n onClick={(e) => {\n if (e.target === e.currentTarget) onClose();\n }}\n >\n <div className=\"relative w-full max-w-4xl 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-amber-500/10 border border-amber-500/30 flex items-center justify-center text-amber-400 font-semibold shadow-xs\">\n <Zap className=\"w-4 h-4\" />\n </div>\n <div>\n <div className=\"flex items-center gap-2\">\n <h2 id=\"action-builder-title\" className=\"text-base font-semibold text-white tracking-tight\">\n Visual Action Builder\n </h2>\n {node && (\n <span className=\"text-xs font-mono px-2 py-0.5 rounded bg-slate-800 text-slate-300 border border-slate-700\">\n {`<${node.type}> #${node.id}`}\n </span>\n )}\n {pipelines.length > 0 && (\n <span className=\"text-[11px] font-medium px-2 py-0.5 rounded-full bg-blue-500/10 text-blue-400 border border-blue-500/20\">\n {`${pipelines.reduce((sum, p) => sum + p.steps.length, 0)} Total Steps`}\n </span>\n )}\n </div>\n <p className=\"text-xs text-slate-400\">\n Configure event triggers, asynchronous workflows, and UI feedback for this element\n </p>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\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 cursor-pointer\"\n title=\"Close modal (Esc)\"\n aria-label=\"Close modal\"\n >\n <X className=\"w-5 h-5\" />\n </button>\n </div>\n </div>\n\n {/* Trigger Selector Bar */}\n <div className=\"flex items-center px-6 py-2.5 border-b border-slate-800 bg-slate-900/60 shrink-0 overflow-x-auto gap-2 [scrollbar-width:none] [&::-webkit-scrollbar]:hidden\">\n <div className=\"flex items-center gap-1.5 min-w-max\">\n <span className=\"text-xs font-semibold text-slate-400 uppercase tracking-wider mr-2 flex items-center gap-1\">\n <Sparkles className=\"w-3.5 h-3.5 text-amber-400\" />\n <span>Event Trigger:</span>\n </span>\n {TRIGGER_OPTIONS.map((trig) => {\n const activeForTrig = triggerPipelineMap.get(trig.type);\n const isSelected = selectedTrigger === trig.type;\n const stepCount = activeForTrig?.steps.length ?? 0;\n\n return (\n <button\n key={trig.type}\n type=\"button\"\n data-testid={`trigger-tab-${trig.type}`}\n onClick={() => {\n setSelectedTrigger(trig.type);\n setIsAddStepMenuOpen(false);\n }}\n className={`flex items-center gap-2 px-3 py-1.5 rounded-lg text-xs font-medium transition cursor-pointer ${\n isSelected\n ? 'bg-blue-600 text-white shadow-md shadow-blue-500/20 border border-blue-400/30'\n : 'bg-slate-800/80 text-slate-300 hover:bg-slate-800 hover:text-white border border-slate-700/60'\n }`}\n >\n <span>{trig.label}</span>\n {stepCount > 0 && (\n <span\n className={`text-[10px] px-1.5 py-0.2 rounded-full font-semibold ${\n isSelected\n ? 'bg-blue-800 text-blue-100'\n : 'bg-amber-500/20 text-amber-300 border border-amber-500/30'\n }`}\n >\n {stepCount}\n </span>\n )}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Content Area: Action Timeline & Step List */}\n <div className=\"flex-1 min-h-0 bg-slate-950 overflow-y-auto p-6 select-text flex flex-col gap-4\">\n <div className=\"max-w-3xl mx-auto w-full flex flex-col gap-4\">\n {/* Active Trigger Info Banner */}\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-3 p-3.5 rounded-xl bg-slate-900 border border-slate-800/90 text-xs text-slate-300\">\n <div className=\"flex items-center gap-2.5 min-w-0\">\n <div className=\"w-7 h-7 rounded-lg bg-blue-500/20 text-blue-400 flex items-center justify-center font-bold border border-blue-500/30 shrink-0\">\n {selectedTrigger.charAt(0).toUpperCase()}\n </div>\n <div className=\"min-w-0\">\n <div className=\"flex items-center gap-2\">\n <span className=\"font-semibold text-white\">\n {TRIGGER_OPTIONS.find((t) => t.type === selectedTrigger)?.label}\n </span>\n {currentPipeline ? (\n <span className=\"text-[11px] text-emerald-400 flex items-center gap-1 font-medium\">\n <Check className=\"w-3 h-3\" />\n <span>{`${currentPipeline.steps.length} step(s) configured`}</span>\n </span>\n ) : (\n <span className=\"text-[11px] text-slate-500 italic\">No action steps yet</span>\n )}\n </div>\n <span className=\"text-slate-400 text-[11px] truncate block mt-0.5\">\n {TRIGGER_OPTIONS.find((t) => t.type === selectedTrigger)?.description}\n </span>\n </div>\n </div>\n\n {currentPipeline && (\n <div className=\"flex items-center gap-3.5 shrink-0 pt-2 sm:pt-0 border-t sm:border-t-0 border-slate-800 text-xs text-slate-300\">\n <label className=\"flex items-center gap-1.5 cursor-pointer hover:text-white transition select-none\">\n <input\n type=\"checkbox\"\n checked={currentPipeline.enabled !== false}\n onChange={handleTogglePipelineEnabled}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-3.5 h-3.5 cursor-pointer\"\n />\n <span>Active</span>\n </label>\n\n <label className=\"flex items-center gap-1.5 cursor-pointer hover:text-white transition select-none\">\n <input\n type=\"checkbox\"\n checked={Boolean(currentPipeline.preventDuplicate)}\n onChange={handleTogglePreventDuplicate}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-3.5 h-3.5 cursor-pointer\"\n />\n <span>Prevent Double Clicks</span>\n </label>\n\n <button\n type=\"button\"\n onClick={handleDeletePipeline}\n title=\"Delete this trigger pipeline\"\n className=\"p-1 px-1.5 rounded text-slate-400 hover:text-red-400 hover:bg-red-500/10 border border-slate-700/60 hover:border-red-500/30 transition flex items-center gap-1 cursor-pointer ml-1\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n <span className=\"text-[11px]\">Clear</span>\n </button>\n </div>\n )}\n </div>\n\n {/* Timeline View */}\n {currentPipeline && currentPipeline.steps.length > 0 ? (\n <div className=\"flex flex-col gap-3 relative before:absolute before:top-4 before:bottom-4 before:left-[19px] before:w-0.5 before:bg-slate-800\">\n {currentPipeline.steps.map((step, idx) => {\n const typeMeta = getStepTypeMeta(step.type);\n const Icon = typeMeta.icon;\n const summary = formatStepSummary(step);\n const isFirst = idx === 0;\n const isLast = idx === currentPipeline.steps.length - 1;\n const isExpanded = editingStepId === step.id;\n\n return (\n <div\n key={step.id}\n data-testid={`action-step-card-${step.id}`}\n className={`relative flex flex-col p-4 rounded-xl bg-slate-900/90 border transition shadow-sm ${\n isExpanded\n ? 'border-blue-500/80 ring-1 ring-blue-500/40 bg-slate-900'\n : 'border-slate-800 hover:border-slate-700/80'\n }`}\n >\n <div className=\"flex items-start gap-4\">\n {/* Step Indicator Node */}\n <div\n onClick={() => setEditingStepId(isExpanded ? null : step.id)}\n className={`relative z-10 w-8 h-8 rounded-full flex items-center justify-center font-mono text-xs font-bold shrink-0 shadow-sm cursor-pointer transition ${\n isExpanded\n ? 'bg-blue-600 border-2 border-blue-300 text-white'\n : 'bg-slate-800 border-2 border-blue-500 text-blue-400'\n }`}\n >\n {idx + 1}\n </div>\n\n {/* Step Details */}\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-2 mb-1\">\n <div\n onClick={() => setEditingStepId(isExpanded ? null : step.id)}\n className=\"flex items-center gap-2 cursor-pointer flex-1 min-w-0 flex-wrap\"\n >\n <span className={`inline-flex items-center gap-1 px-2 py-0.5 rounded text-[11px] font-semibold border shrink-0 ${getCategoryBadgeClass(typeMeta.category)}`}>\n <Icon className=\"w-3 h-3\" />\n <span>{typeMeta.label}</span>\n </span>\n {step.label && (\n <span className=\"text-xs font-medium text-slate-200 truncate\">\n {step.label}\n </span>\n )}\n\n {/* Status Badges */}\n {step.continueOnError && (\n <span className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-medium bg-amber-500/15 text-amber-300 border border-amber-500/30\">\n Continues on Error\n </span>\n )}\n {(Boolean(step.onSuccess?.length) || Boolean(step.onError?.length)) && (\n <span className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-medium bg-emerald-500/15 text-emerald-300 border border-emerald-500/30\">\n <GitBranch className=\"w-2.5 h-2.5\" />\n <span>{`Branches (${(step.onSuccess?.length || 0) + (step.onError?.length || 0)})`}</span>\n </span>\n )}\n {step.condition && (\n <span className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-medium bg-purple-500/15 text-purple-300 border border-purple-500/30\">\n Conditional\n </span>\n )}\n {step.timeout && step.timeout > 0 && (\n <span className=\"inline-flex items-center gap-0.5 px-1.5 py-0.5 rounded text-[10px] font-medium bg-slate-800 text-slate-300 border border-slate-700\">\n {`${step.timeout}ms`}\n </span>\n )}\n </div>\n\n {/* Reorder, Configure and Delete Controls */}\n <div className=\"flex items-center gap-1 shrink-0\">\n <button\n type=\"button\"\n data-testid={`toggle-edit-step-${step.id}`}\n onClick={() => setEditingStepId(isExpanded ? null : step.id)}\n title={isExpanded ? 'Collapse config' : 'Edit step parameters'}\n className={`px-2 py-1 text-[11px] font-medium rounded flex items-center gap-1 transition cursor-pointer ${\n isExpanded\n ? 'bg-blue-600 text-white shadow-xs'\n : 'bg-slate-800 text-slate-300 hover:text-white hover:bg-slate-700'\n }`}\n >\n <Sliders className=\"w-3 h-3\" />\n <span>{isExpanded ? 'Collapse' : 'Configure'}</span>\n </button>\n\n <button\n type=\"button\"\n disabled={isFirst}\n onClick={() => handleMoveStep(idx, 'up')}\n title=\"Move step up\"\n aria-label=\"Move step up\"\n className=\"p-1 rounded text-slate-400 hover:text-white hover:bg-slate-800 disabled:opacity-30 disabled:pointer-events-none transition cursor-pointer\"\n >\n <ChevronUp className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n disabled={isLast}\n onClick={() => handleMoveStep(idx, 'down')}\n title=\"Move step down\"\n aria-label=\"Move step down\"\n className=\"p-1 rounded text-slate-400 hover:text-white hover:bg-slate-800 disabled:opacity-30 disabled:pointer-events-none transition cursor-pointer\"\n >\n <ChevronDown className=\"w-4 h-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => handleRemoveStep(step.id)}\n title=\"Delete step\"\n aria-label=\"Delete step\"\n className=\"p-1 rounded text-slate-400 hover:text-red-400 hover:bg-red-500/10 transition ml-1 cursor-pointer\"\n >\n <Trash2 className=\"w-4 h-4\" />\n </button>\n </div>\n </div>\n\n {/* Summary / Description */}\n <div\n onClick={() => setEditingStepId(isExpanded ? null : step.id)}\n className=\"text-xs font-mono text-slate-400 bg-slate-950/70 rounded px-2.5 py-1.5 border border-slate-800/80 truncate cursor-pointer hover:border-slate-700 transition\"\n >\n {summary}\n </div>\n </div>\n </div>\n\n {/* Expandable Action Step Configuration Form */}\n {isExpanded && (\n <div className=\"mt-4 pt-4 border-t border-slate-800 animate-in fade-in slide-in-from-top-1 duration-150\">\n <ActionStepForm\n step={step}\n document={document}\n onUpdatePayload={(newPayload) =>\n handleUpdateStepPayload(step.id, newPayload)\n }\n onUpdateMeta={(meta) => handleUpdateStepMeta(step.id, meta)}\n onUpdateBranches={(branches) =>\n handleUpdateStepBranches(step.id, branches)\n }\n />\n </div>\n )}\n </div>\n );\n })}\n </div>\n ) : (\n /* Empty State */\n <div className=\"flex flex-col items-center justify-center p-12 text-center border-2 border-dashed border-slate-800 rounded-2xl bg-slate-900/30 gap-3\">\n <div className=\"w-12 h-12 rounded-2xl bg-slate-800 text-slate-400 flex items-center justify-center mb-1\">\n <Zap className=\"w-6 h-6 text-slate-500\" />\n </div>\n <h3 className=\"text-sm font-semibold text-slate-200\">\n No Action Steps for {TRIGGER_OPTIONS.find((t) => t.type === selectedTrigger)?.label}\n </h3>\n <p className=\"text-xs text-slate-400 max-w-sm\">\n Add steps like API requests, toast feedback, modal triggers, or navigation to make this element interactive.\n </p>\n </div>\n )}\n\n {/* Add Action Step Controls */}\n <div className=\"relative mt-2\">\n <button\n type=\"button\"\n data-testid=\"add-action-step-btn\"\n onClick={() => {\n setIsAddStepMenuOpen(!isAddStepMenuOpen);\n setStepSearchQuery('');\n }}\n className=\"w-full flex items-center justify-center gap-2 py-3 rounded-xl border border-dashed border-blue-500/40 hover:border-blue-500 bg-blue-500/5 hover:bg-blue-500/10 text-blue-400 font-medium text-xs transition cursor-pointer shadow-xs active:scale-[0.99]\"\n >\n <Plus className=\"w-4 h-4\" />\n <span>Add Action Step</span>\n </button>\n\n {/* Step Type Dropdown Menu with Search */}\n {isAddStepMenuOpen && (\n <div\n data-testid=\"step-type-menu\"\n className=\"absolute left-0 right-0 top-full mt-2 z-20 flex flex-col p-2 bg-slate-900 border border-slate-700/90 rounded-xl shadow-2xl animate-in fade-in slide-in-from-top-2 duration-150 gap-2 max-h-80 overflow-y-auto\"\n >\n <div className=\"flex items-center gap-2 px-2.5 py-1.5 bg-slate-950 rounded-lg border border-slate-800 text-xs\">\n <Search className=\"w-3.5 h-3.5 text-slate-400 shrink-0\" />\n <input\n type=\"text\"\n data-testid=\"step-type-search-input\"\n value={stepSearchQuery}\n onChange={(e) => setStepSearchQuery(e.target.value)}\n placeholder=\"Search action types (e.g. toast, api, modal)...\"\n style={{ color: '#f1f5f9' }}\n className=\"w-full bg-transparent text-slate-100 placeholder-slate-500 focus:outline-none text-xs\"\n autoFocus\n />\n </div>\n\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-1.5\">\n {filteredStepTypes.map((option) => {\n const Icon = option.icon;\n const catBadge = getCategoryBadgeClass(option.category);\n return (\n <button\n key={option.type}\n type=\"button\"\n data-testid={`add-step-option-${option.type}`}\n onClick={() => {\n handleAddStep(option.type);\n setStepSearchQuery('');\n }}\n className=\"flex items-start gap-3 p-2.5 rounded-lg text-left hover:bg-slate-800/90 transition text-slate-200 hover:text-white cursor-pointer group border border-slate-800 hover:border-slate-700\"\n >\n <div className={`w-7 h-7 rounded border flex items-center justify-center shrink-0 transition ${catBadge}`}>\n <Icon className=\"w-3.5 h-3.5\" />\n </div>\n <div className=\"flex-1 min-w-0\">\n <div className=\"text-xs font-semibold text-slate-100 group-hover:text-blue-300 flex items-center gap-1.5\">\n <span>{option.label}</span>\n </div>\n <div className=\"text-[11px] text-slate-400 leading-tight truncate\">\n {option.description}\n </div>\n </div>\n </button>\n );\n })}\n </div>\n </div>\n )}\n </div>\n </div>\n </div>\n\n {/* Footer info & Done button */}\n <div className=\"flex items-center justify-between px-6 py-3 border-t border-slate-800 bg-slate-900 text-xs text-slate-400 shrink-0\">\n <div className=\"flex items-center gap-3\">\n <span>\n Target: <strong className=\"text-slate-200\">#{node?.id || activeNodeId}</strong>\n </span>\n <span className=\"w-1 h-1 rounded-full bg-slate-700\" />\n <span>\n Active Triggers:{' '}\n <strong className=\"text-slate-200\">{pipelines.length}</strong>\n </span>\n </div>\n\n <button\n type=\"button\"\n data-testid=\"action-builder-done-btn\"\n onClick={onClose}\n className=\"px-4 py-1.5 rounded-lg bg-blue-600 hover:bg-blue-500 text-white font-medium text-xs transition shadow-xs cursor-pointer\"\n >\n Done\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 ActionPipeline,\n FormConfig,\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 updateActions,\n updateFormConfig,\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 interface ActionLogEntry {\n id: string;\n timestamp: string;\n trigger: string;\n actionType: string;\n nodeId?: string;\n status: 'pending' | 'success' | 'error';\n payload?: Record<string, unknown>;\n output?: unknown;\n error?: string;\n durationMs?: number;\n}\n\nexport interface LiveFormState {\n formId?: string;\n values: Record<string, unknown>;\n errors: Record<string, string>;\n touched: Record<string, boolean>;\n isSubmitting: boolean;\n isValid: boolean;\n dirty: boolean;\n}\n\nexport interface UpdateFormConfigResult {\n success: boolean;\n error?: string;\n}\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\nexport interface UpdateActionsResult {\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 previewMode: boolean;\n actionDebuggerOpen: boolean;\n actionLogs: ActionLogEntry[];\n liveFormState: LiveFormState | null;\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 setPreviewMode: (enabled: boolean) => void;\n togglePreviewMode: () => void;\n setActionDebuggerOpen: (open: boolean) => void;\n toggleActionDebugger: () => void;\n addActionLog: (entry: Omit<ActionLogEntry, 'id' | 'timestamp'> & { id?: string; timestamp?: string }) => void;\n clearActionLogs: () => void;\n setLiveFormState: (state: LiveFormState | null) => 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 updateNodeActions: (\n nodeId: string,\n actions: ActionPipeline[] | null,\n ) => UpdateActionsResult;\n updateNodeFormConfig: (\n nodeId: string,\n formConfig: Partial<FormConfig> | null,\n merge?: boolean,\n ) => UpdateFormConfigResult;\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 previewMode: false,\n actionDebuggerOpen: false,\n actionLogs: [],\n liveFormState: null,\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 setPreviewMode: (enabled) =>\n set((state) => ({\n previewMode: enabled,\n actionDebuggerOpen: enabled ? state.actionDebuggerOpen : false,\n selectedNodeId: enabled ? null : state.selectedNodeId,\n hoveredNodeId: null,\n })),\n togglePreviewMode: () =>\n set((state) => {\n const next = !state.previewMode;\n return {\n previewMode: next,\n actionDebuggerOpen: next ? state.actionDebuggerOpen : false,\n selectedNodeId: next ? null : state.selectedNodeId,\n hoveredNodeId: null,\n };\n }),\n setActionDebuggerOpen: (open) => set({ actionDebuggerOpen: open }),\n toggleActionDebugger: () => set((state) => ({ actionDebuggerOpen: !state.actionDebuggerOpen })),\n addActionLog: (entry) =>\n set((state) => ({\n actionLogs: [\n {\n id: entry.id || `act-log-${Date.now()}-${Math.random().toString(36).slice(2, 6)}`,\n timestamp: entry.timestamp || new Date().toISOString(),\n ...entry,\n },\n ...state.actionLogs,\n ].slice(0, 100),\n })),\n clearActionLogs: () => set({ actionLogs: [] }),\n setLiveFormState: (formState) => set({ liveFormState: formState }),\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 updateNodeActions: (nodeId, actions) => {\n try {\n get().dispatch((doc) => updateActions(doc, { nodeId, actions }));\n } catch (err) {\n return { success: false, error: formatCommandError(err) };\n }\n\n return { success: true };\n },\n\n updateNodeFormConfig: (nodeId, formConfig, merge = true) => {\n try {\n get().dispatch((doc) => updateFormConfig(doc, { nodeId, formConfig, 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, { useState, useEffect, useMemo } from 'react';\nimport {\n ActionStep,\n PageDocument,\n Node,\n} from '@kubuild/schema';\nimport {\n Plus,\n Trash2,\n Check,\n AlertCircle,\n Sparkles,\n} from 'lucide-react';\nimport { ActionBranchEditor } from './action-branch-editor';\nimport {\n VariableAutocompleteInput,\n VariableAutocompleteTextarea,\n} from '../ui/variable-autocomplete-input';\nimport {\n collectDocumentNodes,\n collectDocumentModals,\n collectDocumentForms,\n collectDocumentAnchors,\n collectDocumentFormFields,\n} from '../../utils/document-scanner';\n\n\nexport interface ActionStepFormProps {\n step: ActionStep;\n document?: PageDocument;\n onUpdatePayload: (payload: Record<string, unknown>) => void;\n onUpdateMeta?: (meta: { label?: string; timeout?: number; continueOnError?: boolean }) => void;\n onUpdateBranches?: (branches: { onSuccess?: ActionStep[]; onError?: ActionStep[] }) => void;\n className?: string;\n hideBranches?: boolean;\n}\n\n// ------------------------------------------------------------------------------------------------\n// Key-Value Pair Editor (for Headers, Query Params, Details)\n// ------------------------------------------------------------------------------------------------\n\nexport interface KeyValueEditorProps {\n title: string;\n entries: Record<string, unknown> | undefined;\n onChange: (updated: Record<string, string>) => void;\n document?: PageDocument;\n keyPlaceholder?: string;\n valuePlaceholder?: string;\n emptyLabel?: string;\n}\n\nexport const KeyValueEditor: React.FC<KeyValueEditorProps> = ({\n title,\n entries = {},\n onChange,\n document,\n keyPlaceholder = 'Key',\n valuePlaceholder = 'Value (e.g. {{form.email}})',\n emptyLabel = 'No entries configured',\n}) => {\n const [rows, setRows] = useState<Array<{ id: string; key: string; value: string }>>(() => {\n return Object.entries(entries).map(([k, v], idx) => ({\n id: `row-${idx}-${k}`,\n key: k,\n value: typeof v === 'string' ? v : String(v ?? ''),\n }));\n });\n\n useEffect(() => {\n const currentKeys = Object.keys(entries);\n const rowKeys = rows.map((r) => r.key);\n // Sync only when external keys actually differ\n const keysDiffer =\n currentKeys.length !== rowKeys.length ||\n currentKeys.some((k) => entries[k] !== rows.find((r) => r.key === k)?.value);\n\n if (keysDiffer) {\n setRows(\n Object.entries(entries).map(([k, v], idx) => ({\n id: `row-${idx}-${k}`,\n key: k,\n value: typeof v === 'string' ? v : String(v ?? ''),\n })),\n );\n }\n }, [entries]);\n\n const commitRows = (newRows: Array<{ id: string; key: string; value: string }>) => {\n setRows(newRows);\n const record: Record<string, string> = {};\n for (const r of newRows) {\n if (r.key.trim()) {\n record[r.key.trim()] = r.value;\n }\n }\n onChange(record);\n };\n\n const handleAddRow = () => {\n const newRows = [...rows, { id: `row-${Date.now()}-${Math.random()}`, key: '', value: '' }];\n commitRows(newRows);\n };\n\n const handleRemoveRow = (id: string) => {\n const newRows = rows.filter((r) => r.id !== id);\n commitRows(newRows);\n };\n\n const handleUpdateRow = (id: string, field: 'key' | 'value', val: string) => {\n const newRows = rows.map((r) => (r.id === id ? { ...r, [field]: val } : r));\n commitRows(newRows);\n };\n\n return (\n <div className=\"flex flex-col gap-2 bg-slate-950/60 p-3 rounded-xl border border-slate-800/80\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-xs font-semibold text-slate-300\">{title}</span>\n <button\n type=\"button\"\n onClick={handleAddRow}\n className=\"px-2 py-0.5 text-[11px] font-medium text-blue-400 bg-blue-500/10 hover:bg-blue-500/20 border border-blue-500/30 rounded flex items-center gap-1 transition cursor-pointer\"\n >\n <Plus className=\"w-3 h-3\" />\n <span>Add</span>\n </button>\n </div>\n\n {rows.length === 0 ? (\n <div className=\"text-[11px] text-slate-500 italic py-1 text-center\">{emptyLabel}</div>\n ) : (\n <div className=\"flex flex-col gap-1.5\">\n {rows.map((row) => (\n <div key={row.id} className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={row.key}\n onChange={(e) => handleUpdateRow(row.id, 'key', e.target.value)}\n placeholder={keyPlaceholder}\n style={{ color: '#f1f5f9' }}\n className=\"w-1/3 text-xs bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700/80 rounded-lg px-2.5 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono text-[11px] shadow-inner\"\n />\n <div className=\"flex-1 min-w-0\">\n <VariableAutocompleteInput\n value={row.value}\n document={document}\n onChange={(val) => handleUpdateRow(row.id, 'value', val)}\n placeholder={valuePlaceholder}\n className=\"py-1.5\"\n />\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveRow(row.id)}\n title=\"Remove entry\"\n className=\"p-1.5 text-slate-400 hover:text-red-400 hover:bg-red-500/10 rounded transition cursor-pointer shrink-0\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n ))}\n </div>\n )}\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 1. API Request Step Form\n// ------------------------------------------------------------------------------------------------\n\nexport const ApiRequestStepForm: React.FC<{\n payload: Record<string, unknown>;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, document, onChange }) => {\n const method = (payload.method as string) || 'GET';\n const url = (payload.url as string) || '';\n const bodyFormat = (payload.bodyFormat as string) || (payload.bodyType as string) || 'json';\n const timeout = typeof payload.timeout === 'number' ? payload.timeout : '';\n const headers = (payload.headers as Record<string, string>) || {};\n const queryParams = (payload.queryParams as Record<string, string>) || {};\n\n // Convert payload.body to string for Raw mode\n const bodyStr = useMemo(() => {\n if (payload.body === undefined || payload.body === null) return '';\n if (typeof payload.body === 'string') return payload.body;\n try {\n return JSON.stringify(payload.body, null, 2);\n } catch {\n return String(payload.body);\n }\n }, [payload.body]);\n\n const [rawBody, setRawBody] = useState<string>(bodyStr);\n const [jsonError, setJsonError] = useState<string | null>(null);\n\n // Determine initial body mode: 'fields' (form inputs) by default unless it's raw text or non-object string\n const initialMode = useMemo<'fields' | 'raw'>(() => {\n if (bodyFormat === 'raw' || bodyFormat === 'text') return 'raw';\n if (typeof payload.body === 'string' && payload.body.trim()) {\n try {\n const parsed = JSON.parse(payload.body);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return 'fields';\n }\n return 'raw';\n } catch {\n return 'raw';\n }\n }\n return 'fields';\n }, [bodyFormat, payload.body]);\n\n const [bodyMode, setBodyMode] = useState<'fields' | 'raw'>(initialMode);\n\n // Key-value rows for Form mode\n const [bodyRows, setBodyRows] = useState<Array<{ id: string; key: string; value: string }>>(() => {\n if (typeof payload.body === 'object' && payload.body !== null && !Array.isArray(payload.body)) {\n return Object.entries(payload.body).map(([k, v], idx) => ({\n id: `brow-${idx}-${k}`,\n key: k,\n value: typeof v === 'string' ? v : JSON.stringify(v),\n }));\n }\n if (typeof payload.body === 'string' && payload.body.trim()) {\n try {\n const parsed = JSON.parse(payload.body);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n return Object.entries(parsed).map(([k, v], idx) => ({\n id: `brow-${idx}-${k}`,\n key: k,\n value: typeof v === 'string' ? v : JSON.stringify(v),\n }));\n }\n } catch {\n // ignore\n }\n }\n return [];\n });\n\n useEffect(() => {\n setRawBody(bodyStr);\n }, [bodyStr]);\n\n // Sync rows if payload.body changes externally in fields mode\n useEffect(() => {\n if (bodyMode === 'fields' && typeof payload.body === 'object' && payload.body !== null && !Array.isArray(payload.body)) {\n const currentKeys = Object.keys(payload.body);\n const rowKeys = bodyRows.map((r) => r.key);\n const differs =\n currentKeys.length !== rowKeys.length ||\n currentKeys.some((k) => (payload.body as Record<string, unknown>)[k] !== bodyRows.find((r) => r.key === k)?.value);\n\n if (differs) {\n setBodyRows(\n Object.entries(payload.body).map(([k, v], idx) => ({\n id: `brow-${idx}-${k}`,\n key: k,\n value: typeof v === 'string' ? v : JSON.stringify(v),\n })),\n );\n }\n }\n }, [payload.body, bodyMode]);\n\n const commitBodyRows = (newRows: Array<{ id: string; key: string; value: string }>) => {\n setBodyRows(newRows);\n const record: Record<string, string> = {};\n for (const r of newRows) {\n if (r.key.trim()) {\n record[r.key.trim()] = r.value;\n }\n }\n const hasKeys = Object.keys(record).length > 0;\n onChange({ ...payload, body: hasKeys ? record : undefined });\n setRawBody(hasKeys ? JSON.stringify(record, null, 2) : '');\n setJsonError(null);\n };\n\n const handleAddBodyRow = () => {\n const newRows = [...bodyRows, { id: `brow-${Date.now()}-${Math.random()}`, key: '', value: '' }];\n commitBodyRows(newRows);\n };\n\n const handleRemoveBodyRow = (id: string) => {\n const newRows = bodyRows.filter((r) => r.id !== id);\n commitBodyRows(newRows);\n };\n\n const handleUpdateBodyRow = (id: string, field: 'key' | 'value', val: string) => {\n const newRows = bodyRows.map((r) => (r.id === id ? { ...r, [field]: val } : r));\n commitBodyRows(newRows);\n };\n\n const detectedFormFields = useMemo(() => {\n return collectDocumentFormFields(document);\n }, [document]);\n\n const handleAutoFillFormFields = () => {\n const existingKeys = new Set(bodyRows.map((r) => r.key.trim().toLowerCase()));\n const newRows = [...bodyRows];\n\n for (const field of detectedFormFields) {\n if (!existingKeys.has(field.toLowerCase())) {\n newRows.push({\n id: `brow-auto-${Date.now()}-${field}`,\n key: field,\n value: `{{form.${field}}}`,\n });\n existingKeys.add(field.toLowerCase());\n }\n }\n\n commitBodyRows(newRows);\n };\n\n const handleSetBodyMode = (mode: 'fields' | 'raw') => {\n if (mode === 'fields') {\n if (rawBody.trim()) {\n try {\n const parsed = JSON.parse(rawBody);\n if (typeof parsed === 'object' && parsed !== null && !Array.isArray(parsed)) {\n const parsedRows = Object.entries(parsed).map(([k, v], idx) => ({\n id: `brow-${idx}-${k}`,\n key: k,\n value: typeof v === 'string' ? v : JSON.stringify(v),\n }));\n setBodyRows(parsedRows);\n commitBodyRows(parsedRows);\n setJsonError(null);\n setBodyMode('fields');\n } else {\n setJsonError('Cannot switch to form fields: JSON root must be an object { \"key\": \"value\" }');\n }\n } catch {\n setJsonError('Cannot switch to form fields: please fix invalid JSON syntax first');\n }\n } else {\n setBodyRows([]);\n setJsonError(null);\n setBodyMode('fields');\n }\n } else {\n const record: Record<string, string> = {};\n for (const r of bodyRows) {\n if (r.key.trim()) {\n record[r.key.trim()] = r.value;\n }\n }\n setRawBody(Object.keys(record).length > 0 ? JSON.stringify(record, null, 2) : '');\n setJsonError(null);\n setBodyMode('raw');\n }\n };\n\n const handleMethodChange = (m: string) => {\n onChange({ ...payload, method: m });\n };\n\n const handleUrlChange = (u: string) => {\n onChange({ ...payload, url: u });\n };\n\n const handleBodyFormatChange = (fmt: string) => {\n onChange({ ...payload, bodyFormat: fmt, bodyType: fmt });\n if (fmt === 'raw' || fmt === 'text') {\n setBodyMode('raw');\n }\n };\n\n const handleRawBodyChange = (txt: string) => {\n setRawBody(txt);\n if (!txt.trim()) {\n setJsonError(null);\n onChange({ ...payload, body: undefined });\n return;\n }\n\n if (bodyFormat === 'json') {\n try {\n const parsed = JSON.parse(txt);\n setJsonError(null);\n onChange({ ...payload, body: parsed });\n } catch {\n setJsonError('Invalid JSON format');\n onChange({ ...payload, body: txt });\n }\n } else {\n setJsonError(null);\n onChange({ ...payload, body: txt });\n }\n };\n\n const handleTimeoutChange = (t: string) => {\n const num = Number(t);\n onChange({ ...payload, timeout: !isNaN(num) && num > 0 ? num : undefined });\n };\n\n return (\n <div className=\"flex flex-col gap-4 text-xs\">\n {/* Endpoint Bar: Method + URL */}\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1.5\">\n HTTP Method &amp; Endpoint URL\n </label>\n <div className=\"flex items-center gap-2\">\n <select\n value={method}\n onChange={(e) => handleMethodChange(e.target.value)}\n style={{ color: '#60a5fa' }}\n className=\"shrink-0 text-xs font-bold bg-slate-950 text-blue-400 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500 cursor-pointer shadow-xs\"\n >\n <option value=\"GET\" className=\"bg-slate-900 text-slate-100\">GET</option>\n <option value=\"POST\" className=\"bg-slate-900 text-slate-100\">POST</option>\n <option value=\"PUT\" className=\"bg-slate-900 text-slate-100\">PUT</option>\n <option value=\"DELETE\" className=\"bg-slate-900 text-slate-100\">DELETE</option>\n <option value=\"PATCH\" className=\"bg-slate-900 text-slate-100\">PATCH</option>\n <option value=\"HEAD\" className=\"bg-slate-900 text-slate-100\">HEAD</option>\n <option value=\"OPTIONS\" className=\"bg-slate-900 text-slate-100\">OPTIONS</option>\n </select>\n\n <div className=\"relative flex-1 min-w-0\">\n <VariableAutocompleteInput\n value={url}\n document={document}\n onChange={handleUrlChange}\n placeholder=\"https://api.example.com/endpoint or {{form.webhookUrl}}\"\n />\n </div>\n </div>\n <span className=\"text-[10px] text-slate-500 mt-1 block\">\n Tip: You can interpolate form fields like <code className=\"font-mono text-slate-400\">{'{{form.email}}'}</code> or runtime variables in the URL.\n </span>\n </div>\n\n {/* Headers Key-Value Editor */}\n <KeyValueEditor\n title=\"HTTP Headers\"\n entries={headers}\n document={document}\n onChange={(hdrs) => onChange({ ...payload, headers: hdrs })}\n keyPlaceholder=\"Header (e.g. Authorization)\"\n valuePlaceholder=\"Value (e.g. Bearer {{variables.token}})\"\n emptyLabel=\"No custom headers (default Content-Type: application/json applies)\"\n />\n\n {/* Query Params Key-Value Editor */}\n <KeyValueEditor\n title=\"Query Parameters\"\n entries={queryParams}\n document={document}\n onChange={(qp) => onChange({ ...payload, queryParams: qp })}\n keyPlaceholder=\"Param Name\"\n valuePlaceholder=\"Value\"\n emptyLabel=\"No query parameters configured\"\n />\n\n {/* Body Payload Section (for POST/PUT/PATCH/DELETE) */}\n {method !== 'GET' && method !== 'HEAD' && (\n <div className=\"flex flex-col gap-3 bg-slate-950/60 p-3.5 rounded-xl border border-slate-800/80\">\n <div className=\"flex flex-col sm:flex-row sm:items-center justify-between gap-2\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-xs font-semibold text-slate-200\">Request Body Payload</span>\n {/* Mode Switch Tabs: Form Inputs vs Raw Code */}\n <div className=\"flex items-center bg-slate-900 p-0.5 rounded-lg border border-slate-700/80 text-[11px]\">\n <button\n type=\"button\"\n data-testid=\"body-mode-fields-btn\"\n onClick={() => handleSetBodyMode('fields')}\n className={`px-2.5 py-0.5 rounded-md font-medium transition cursor-pointer ${\n bodyMode === 'fields'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Form Inputs\n </button>\n <button\n type=\"button\"\n data-testid=\"body-mode-raw-btn\"\n onClick={() => handleSetBodyMode('raw')}\n className={`px-2.5 py-0.5 rounded-md font-medium transition cursor-pointer ${\n bodyMode === 'raw'\n ? 'bg-blue-600 text-white shadow-xs'\n : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n Raw Code\n </button>\n </div>\n </div>\n\n <div className=\"flex items-center gap-2\">\n <span className=\"text-[11px] text-slate-400\">Format:</span>\n <select\n value={bodyFormat}\n onChange={(e) => handleBodyFormatChange(e.target.value)}\n style={{ color: '#e2e8f0' }}\n className=\"text-[11px] font-medium bg-slate-950 text-slate-200 border border-slate-700 rounded-md px-2.5 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 cursor-pointer\"\n >\n <option value=\"json\" className=\"bg-slate-900 text-slate-100\">JSON</option>\n <option value=\"formData\" className=\"bg-slate-900 text-slate-100\">FormData</option>\n <option value=\"urlencoded\" className=\"bg-slate-900 text-slate-100\">URL-Encoded</option>\n <option value=\"raw\" className=\"bg-slate-900 text-slate-100\">Raw Text</option>\n </select>\n </div>\n </div>\n\n {bodyMode === 'fields' ? (\n /* Form Inputs Mode (Key-Value Builder with Variable Autocomplete) */\n <div className=\"flex flex-col gap-2\">\n {bodyRows.length === 0 ? (\n <div className=\"text-[11px] text-slate-500 italic py-2.5 text-center bg-slate-900/40 rounded-lg border border-dashed border-slate-800\">\n No payload fields configured. Click &quot;Add Field&quot; or auto-fill from form fields on the page.\n </div>\n ) : (\n <div className=\"flex flex-col gap-1.5\">\n {bodyRows.map((row) => (\n <div key={row.id} className=\"flex items-center gap-1.5\">\n <input\n type=\"text\"\n value={row.key}\n onChange={(e) => handleUpdateBodyRow(row.id, 'key', e.target.value)}\n placeholder=\"Field Key (e.g. email)\"\n style={{ color: '#f1f5f9' }}\n className=\"w-1/3 text-xs bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700/80 rounded-lg px-2.5 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 font-mono text-[11px] shadow-inner\"\n />\n <div className=\"flex-1 min-w-0\">\n <VariableAutocompleteInput\n value={row.value}\n document={document}\n onChange={(val) => handleUpdateBodyRow(row.id, 'value', val)}\n placeholder=\"Field Value (e.g. {{form.email}})\"\n className=\"py-1.5\"\n />\n </div>\n <button\n type=\"button\"\n onClick={() => handleRemoveBodyRow(row.id)}\n title=\"Remove field\"\n className=\"p-1.5 text-slate-400 hover:text-red-400 hover:bg-red-500/10 rounded-lg transition cursor-pointer shrink-0\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n ))}\n </div>\n )}\n\n {/* Action Controls for Form Mode */}\n <div className=\"flex items-center justify-between gap-2 pt-1\">\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n data-testid=\"add-body-field-btn\"\n onClick={handleAddBodyRow}\n className=\"px-2.5 py-1 text-[11px] font-medium text-blue-400 bg-blue-500/10 hover:bg-blue-500/20 border border-blue-500/30 rounded-lg flex items-center gap-1 transition cursor-pointer\"\n >\n <Plus className=\"w-3 h-3\" />\n <span>Add Field</span>\n </button>\n\n {detectedFormFields.length > 0 && (\n <button\n type=\"button\"\n data-testid=\"autofill-body-fields-btn\"\n onClick={handleAutoFillFormFields}\n title=\"Automatically populate fields from form elements on this page\"\n className=\"px-2.5 py-1 text-[11px] font-medium text-amber-300 bg-amber-500/10 hover:bg-amber-500/20 border border-amber-500/30 rounded-lg flex items-center gap-1 transition cursor-pointer\"\n >\n <Sparkles className=\"w-3 h-3 text-amber-400\" />\n <span>Auto-fill from Form ({detectedFormFields.length})</span>\n </button>\n )}\n </div>\n\n <span className=\"text-[10px] text-slate-500 font-mono\">\n {bodyFormat === 'formData'\n ? 'multipart/form-data'\n : bodyFormat === 'urlencoded'\n ? 'application/x-www-form-urlencoded'\n : 'application/json'}\n </span>\n </div>\n </div>\n ) : (\n /* Raw Code Editor Mode */\n <div className=\"flex flex-col gap-2\">\n <VariableAutocompleteTextarea\n value={rawBody}\n document={document}\n onChange={handleRawBodyChange}\n rows={5}\n placeholder={\n bodyFormat === 'json'\n ? '{\\n \"email\": \"{{form.email}}\",\\n \"name\": \"{{form.name}}\"\\n}'\n : 'key1=value1&key2=value2'\n }\n />\n\n {jsonError && (\n <div className=\"flex items-center gap-1.5 text-[11px] text-amber-400 bg-amber-500/10 border border-amber-500/20 rounded p-1.5\">\n <AlertCircle className=\"w-3.5 h-3.5 shrink-0\" />\n <span>{jsonError}</span>\n </div>\n )}\n </div>\n )}\n </div>\n )}\n\n {/* Timeout setting */}\n <div className=\"flex items-center justify-between p-2.5 rounded-lg bg-slate-900/80 border border-slate-800\">\n <div>\n <span className=\"text-xs font-medium text-slate-200 block\">Request Timeout</span>\n <span className=\"text-[10px] text-slate-400\">Abort request if no response within ms</span>\n </div>\n <div className=\"flex items-center gap-1.5\">\n <input\n type=\"number\"\n value={timeout}\n onChange={(e) => handleTimeoutChange(e.target.value)}\n placeholder=\"10000\"\n style={{ color: '#f1f5f9' }}\n className=\"w-24 text-xs font-mono bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700 rounded px-2 py-1 text-right focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-xs text-slate-400\">ms</span>\n </div>\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 2. Show Toast Step Form\n// ------------------------------------------------------------------------------------------------\n\nexport const ShowToastStepForm: React.FC<{\n payload: Record<string, unknown>;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, document, onChange }) => {\n const type = (payload.type as string) || (payload.variant as string) || 'success';\n const message = (payload.message as string) || '';\n const title = (payload.title as string) || '';\n const duration = typeof payload.duration === 'number' ? payload.duration : 3000;\n const position = (payload.position as string) || 'bottom-right';\n\n const TOAST_TYPES: Array<{ id: string; label: string; colorClass: string }> = [\n { id: 'success', label: 'Success', colorClass: 'bg-emerald-500/20 text-emerald-300 border-emerald-500/40' },\n { id: 'error', label: 'Error', colorClass: 'bg-red-500/20 text-red-300 border-red-500/40' },\n { id: 'warning', label: 'Warning', colorClass: 'bg-amber-500/20 text-amber-300 border-amber-500/40' },\n { id: 'info', label: 'Info', colorClass: 'bg-blue-500/20 text-blue-300 border-blue-500/40' },\n ];\n\n return (\n <div className=\"flex flex-col gap-3.5 text-xs\">\n {/* Toast Type Badges */}\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1.5\">Notification Type</label>\n <div className=\"grid grid-cols-4 gap-2\">\n {TOAST_TYPES.map((t) => {\n const isSelected = type === t.id;\n return (\n <button\n key={t.id}\n type=\"button\"\n onClick={() => onChange({ ...payload, type: t.id, variant: t.id })}\n className={`flex items-center justify-center gap-1.5 py-1.5 px-2 rounded-lg text-xs font-semibold border transition cursor-pointer ${\n isSelected\n ? `${t.colorClass} ring-2 ring-blue-500/50 shadow-xs`\n : 'bg-slate-900 text-slate-400 border-slate-700/80 hover:text-slate-200'\n }`}\n >\n {isSelected && <Check className=\"w-3 h-3\" />}\n <span>{t.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Message input */}\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">\n Toast Message <span className=\"text-red-400\">*</span>\n </label>\n <VariableAutocompleteTextarea\n rows={2}\n value={message}\n document={document}\n onChange={(val) => onChange({ ...payload, message: val })}\n placeholder=\"e.g. Your submission was received successfully!\"\n />\n </div>\n\n {/* Optional Title input */}\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">Title (Optional)</label>\n <VariableAutocompleteInput\n value={title}\n document={document}\n onChange={(val) => onChange({ ...payload, title: val || undefined })}\n placeholder=\"e.g. Success\"\n />\n </div>\n\n {/* Duration slider & Position */}\n <div className=\"grid grid-cols-1 sm:grid-cols-2 gap-3 bg-slate-950/60 p-3 rounded-xl border border-slate-800/80\">\n <div>\n <div className=\"flex items-center justify-between mb-1\">\n <label className=\"text-xs font-medium text-slate-300\">Duration</label>\n <span className=\"text-[11px] font-mono text-blue-400\">\n {duration === 0 ? 'Persistent' : `${duration} ms`}\n </span>\n </div>\n <input\n type=\"range\"\n min={0}\n max={10000}\n step={500}\n value={duration}\n onChange={(e) => onChange({ ...payload, duration: Number(e.target.value) })}\n className=\"w-full accent-blue-500 cursor-pointer\"\n />\n </div>\n\n <div>\n <label className=\"block text-xs font-medium text-slate-300 mb-1\">Screen Position</label>\n <select\n value={position}\n onChange={(e) => onChange({ ...payload, position: e.target.value })}\n style={{ color: '#e2e8f0' }}\n className=\"w-full text-xs bg-slate-950 text-slate-200 border border-slate-700 rounded-lg px-2.5 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 cursor-pointer\"\n >\n <option value=\"bottom-right\" className=\"bg-slate-900 text-slate-100\">Bottom Right</option>\n <option value=\"bottom-left\" className=\"bg-slate-900 text-slate-100\">Bottom Left</option>\n <option value=\"bottom-center\" className=\"bg-slate-900 text-slate-100\">Bottom Center</option>\n <option value=\"top-right\" className=\"bg-slate-900 text-slate-100\">Top Right</option>\n <option value=\"top-left\" className=\"bg-slate-900 text-slate-100\">Top Left</option>\n <option value=\"top-center\" className=\"bg-slate-900 text-slate-100\">Top Center</option>\n </select>\n </div>\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 3. Navigate Step Form\n// ------------------------------------------------------------------------------------------------\n\nexport const NavigateStepForm: React.FC<{\n payload: Record<string, unknown>;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, document, onChange }) => {\n const url = (payload.url as string) || '';\n const target = (payload.target as string) || '_self';\n const scroll = Boolean(payload.scroll);\n const behavior = (payload.behavior as string) || 'smooth';\n const replace = Boolean(payload.replace);\n\n const availableAnchors = useMemo(() => collectDocumentAnchors(document), [document]);\n\n return (\n <div className=\"flex flex-col gap-3.5 text-xs\">\n {/* Target URL */}\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">\n Target Destination URL or Route <span className=\"text-red-400\">*</span>\n </label>\n <div className=\"flex items-center gap-2\">\n <VariableAutocompleteInput\n value={url}\n document={document}\n onChange={(val) => onChange({ ...payload, url: val })}\n placeholder=\"https://example.com, /dashboard, or #section-id\"\n />\n </div>\n </div>\n\n {/* Anchor Quick Selector if sections available */}\n {availableAnchors.length > 0 && (\n <div className=\"bg-slate-950/60 p-2.5 rounded-xl border border-slate-800/80\">\n <label className=\"block text-[11px] font-medium text-slate-400 mb-1\">\n Or select document section to scroll:\n </label>\n <select\n value={url.startsWith('#') ? url : ''}\n onChange={(e) => {\n if (e.target.value) {\n onChange({ ...payload, url: e.target.value, scroll: true });\n }\n }}\n style={{ color: '#e2e8f0' }}\n className=\"w-full text-xs bg-slate-950 text-slate-200 border border-slate-700 rounded-lg px-2.5 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500 cursor-pointer\"\n >\n <option value=\"\" className=\"bg-slate-900 text-slate-100\">— Select Section Anchor —</option>\n {availableAnchors.map((anc) => (\n <option key={anc.id} value={`#${anc.id}`} className=\"bg-slate-900 text-slate-100\">\n {anc.label}\n </option>\n ))}\n </select>\n </div>\n )}\n\n {/* Navigation Options */}\n <div className=\"flex flex-col gap-2 bg-slate-900/80 p-3 rounded-xl border border-slate-800\">\n <label className=\"flex items-center justify-between cursor-pointer\">\n <span className=\"text-xs text-slate-200\">Open in New Tab</span>\n <input\n type=\"checkbox\"\n checked={target === '_blank'}\n onChange={(e) => onChange({ ...payload, target: e.target.checked ? '_blank' : '_self' })}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-4 h-4 cursor-pointer\"\n />\n </label>\n\n <label className=\"flex items-center justify-between cursor-pointer\">\n <span className=\"text-xs text-slate-200\">Smooth Scroll into View</span>\n <input\n type=\"checkbox\"\n checked={scroll}\n onChange={(e) => onChange({ ...payload, scroll: e.target.checked })}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-4 h-4 cursor-pointer\"\n />\n </label>\n\n <label className=\"flex items-center justify-between cursor-pointer\">\n <span className=\"text-xs text-slate-200\">Replace History Entry</span>\n <input\n type=\"checkbox\"\n checked={replace}\n onChange={(e) => onChange({ ...payload, replace: e.target.checked })}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-4 h-4 cursor-pointer\"\n />\n </label>\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 4. Modal Step Form (Open / Close Modal)\n// ------------------------------------------------------------------------------------------------\n\nexport const ModalStepForm: React.FC<{\n payload: Record<string, unknown>;\n isOpenAction: boolean;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, isOpenAction, document, onChange }) => {\n const modalNodeId = (payload.modalNodeId as string) || (payload.modalId as string) || '';\n const detectedModals = useMemo(() => collectDocumentModals(document), [document]);\n\n return (\n <div className=\"flex flex-col gap-3.5 text-xs\">\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">\n Target Modal Node ID <span className=\"text-red-400\">*</span>\n </label>\n\n {detectedModals.length > 0 && (\n <select\n value={modalNodeId}\n onChange={(e) =>\n onChange({ ...payload, modalNodeId: e.target.value, modalId: e.target.value })\n }\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs bg-slate-950 text-slate-100 border border-slate-700 rounded-lg px-3 py-2 mb-2 focus:outline-none focus:ring-1 focus:ring-blue-500 cursor-pointer\"\n >\n <option value=\"\" className=\"bg-slate-900 text-slate-100\">— Select Detected Modal —</option>\n {detectedModals.map((m) => (\n <option key={m.id} value={m.id} className=\"bg-slate-900 text-slate-100\">\n {`${m.label} (#${m.id})`}\n </option>\n ))}\n </select>\n )}\n\n <input\n type=\"text\"\n value={modalNodeId}\n onChange={(e) =>\n onChange({ ...payload, modalNodeId: e.target.value, modalId: e.target.value })\n }\n placeholder=\"e.g. modal-contact-us or modal-1\"\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs font-mono bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-[10px] text-slate-500 mt-1 block\">\n Specify the unique Node ID of the modal component to {isOpenAction ? 'open' : 'close'}.\n </span>\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 5. Set State Step Form\n// ------------------------------------------------------------------------------------------------\n\nexport const SetStateStepForm: React.FC<{\n payload: Record<string, unknown>;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, document, onChange }) => {\n const key = (payload.key as string) || '';\n const value = payload.value !== undefined ? String(payload.value) : '';\n const scope = (payload.scope as string) || 'runtime';\n\n return (\n <div className=\"flex flex-col gap-3.5 text-xs\">\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">\n State Variable Key <span className=\"text-red-400\">*</span>\n </label>\n <input\n type=\"text\"\n value={key}\n onChange={(e) => onChange({ ...payload, key: e.target.value })}\n placeholder=\"e.g. selectedProduct, isLoggedIn, cartCount\"\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs font-mono bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">Value Expression</label>\n <VariableAutocompleteInput\n value={value}\n document={document}\n onChange={(val) => onChange({ ...payload, value: val })}\n placeholder=\"e.g. true, 42, {{form.name}}, active\"\n />\n </div>\n\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">Storage Scope</label>\n <select\n value={scope}\n onChange={(e) => onChange({ ...payload, scope: e.target.value })}\n style={{ color: '#e2e8f0' }}\n className=\"w-full text-xs bg-slate-950 text-slate-200 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none cursor-pointer\"\n >\n <option value=\"runtime\" className=\"bg-slate-900 text-slate-100\">Runtime (Current page view memory)</option>\n <option value=\"session\" className=\"bg-slate-900 text-slate-100\">Session (Browser sessionStorage)</option>\n <option value=\"local\" className=\"bg-slate-900 text-slate-100\">Local (Browser localStorage)</option>\n <option value=\"document\" className=\"bg-slate-900 text-slate-100\">Document (Portable document state)</option>\n </select>\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 6. Reset Form Step Form\n// ------------------------------------------------------------------------------------------------\n\nexport const ResetFormStepForm: React.FC<{\n payload: Record<string, unknown>;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, document, onChange }) => {\n const formId = (payload.formId as string) || '';\n const detectedForms = useMemo(() => collectDocumentForms(document), [document]);\n\n return (\n <div className=\"flex flex-col gap-3.5 text-xs\">\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">Target Form</label>\n\n {detectedForms.length > 0 && (\n <select\n value={formId}\n onChange={(e) => onChange({ ...payload, formId: e.target.value || undefined })}\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs bg-slate-950 text-slate-100 border border-slate-700 rounded-lg px-3 py-2 mb-2 focus:outline-none focus:ring-1 focus:ring-blue-500 cursor-pointer\"\n >\n <option value=\"\" className=\"bg-slate-900 text-slate-100\">— Parent Form / Active Form Container —</option>\n {detectedForms.map((f) => (\n <option key={f.id} value={f.id} className=\"bg-slate-900 text-slate-100\">\n {`${f.label} (#${f.id})`}\n </option>\n ))}\n </select>\n )}\n\n <input\n type=\"text\"\n value={formId}\n onChange={(e) => onChange({ ...payload, formId: e.target.value || undefined })}\n placeholder=\"Optional: explicit form ID (e.g. contact-form)\"\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs font-mono bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-[10px] text-slate-500 mt-1 block\">\n Leave blank to automatically target the enclosing parent form.\n </span>\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 7. Copy Clipboard Step Form\n// ------------------------------------------------------------------------------------------------\n\nexport const CopyClipboardStepForm: React.FC<{\n payload: Record<string, unknown>;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, document, onChange }) => {\n const text = (payload.text as string) || '';\n const notify = payload.notify !== false;\n const toastMessage = (payload.toastMessage as string) || 'Copied to clipboard!';\n\n return (\n <div className=\"flex flex-col gap-3.5 text-xs\">\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">\n Text / Value to Copy <span className=\"text-red-400\">*</span>\n </label>\n <VariableAutocompleteTextarea\n rows={2}\n value={text}\n document={document}\n onChange={(val) => onChange({ ...payload, text: val })}\n placeholder=\"Static text or {{variables.discountCode}} or {{form.referral}}\"\n />\n </div>\n\n <div className=\"flex flex-col gap-2 bg-slate-950/60 p-3 rounded-xl border border-slate-800/80\">\n <label className=\"flex items-center justify-between cursor-pointer\">\n <span className=\"text-xs text-slate-200\">Show Toast Notification on Copy</span>\n <input\n type=\"checkbox\"\n checked={notify}\n onChange={(e) => onChange({ ...payload, notify: e.target.checked })}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-4 h-4 cursor-pointer\"\n />\n </label>\n\n {notify && (\n <div className=\"mt-1\">\n <label className=\"block text-[11px] text-slate-400 mb-1\">Feedback Message</label>\n <input\n type=\"text\"\n value={toastMessage}\n onChange={(e) => onChange({ ...payload, toastMessage: e.target.value })}\n placeholder=\"Copied to clipboard!\"\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700 rounded-lg px-2.5 py-1.5 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n </div>\n )}\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// 8. Custom Event Step Form\n// ------------------------------------------------------------------------------------------------\n\nexport const CustomEventStepForm: React.FC<{\n payload: Record<string, unknown>;\n document?: PageDocument;\n onChange: (payload: Record<string, unknown>) => void;\n}> = ({ payload, document, onChange }) => {\n const eventName = (payload.eventName as string) || '';\n const bubbles = payload.bubbles !== false;\n const cancelable = payload.cancelable !== false;\n const detail = (payload.detail as Record<string, unknown>) || {};\n\n return (\n <div className=\"flex flex-col gap-3.5 text-xs\">\n <div>\n <label className=\"block text-xs font-semibold text-slate-300 mb-1\">\n Custom Event Name <span className=\"text-red-400\">*</span>\n </label>\n <input\n type=\"text\"\n value={eventName}\n onChange={(e) => onChange({ ...payload, eventName: e.target.value })}\n placeholder=\"e.g. analytics:purchase or app:user-registered\"\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs font-mono bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500\"\n />\n <span className=\"text-[10px] text-slate-500 mt-1 block\">\n Dispatches <code className=\"font-mono text-slate-400\">new CustomEvent(name, detail)</code> on the window.\n </span>\n </div>\n\n <KeyValueEditor\n title=\"Event Detail Payload\"\n entries={detail}\n document={document}\n onChange={(det) => onChange({ ...payload, detail: det })}\n keyPlaceholder=\"Key\"\n valuePlaceholder=\"Value (e.g. {{form.email}})\"\n emptyLabel=\"No custom detail properties configured\"\n />\n\n <div className=\"flex items-center gap-4 bg-slate-950/60 p-3 rounded-xl border border-slate-800/80\">\n <label className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={bubbles}\n onChange={(e) => onChange({ ...payload, bubbles: e.target.checked })}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-4 h-4 cursor-pointer\"\n />\n <span className=\"text-xs text-slate-300\">Bubbles</span>\n </label>\n\n <label className=\"flex items-center gap-1.5 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={cancelable}\n onChange={(e) => onChange({ ...payload, cancelable: e.target.checked })}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-4 h-4 cursor-pointer\"\n />\n <span className=\"text-xs text-slate-300\">Cancelable</span>\n </label>\n </div>\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// Master Step Form Container\n// ------------------------------------------------------------------------------------------------\n\nexport const ActionStepForm: React.FC<ActionStepFormProps> = ({\n step,\n document,\n onUpdatePayload,\n onUpdateMeta,\n onUpdateBranches,\n className = '',\n hideBranches = false,\n}) => {\n const [label, setLabel] = useState<string>(step.label || '');\n const [continueOnError, setContinueOnError] = useState<boolean>(Boolean(step.continueOnError));\n\n useEffect(() => {\n setLabel(step.label || '');\n setContinueOnError(Boolean(step.continueOnError));\n }, [step.id, step.label, step.continueOnError]);\n\n const handleLabelChange = (val: string) => {\n setLabel(val);\n onUpdateMeta?.({ label: val });\n };\n\n const handleContinueOnErrorChange = (checked: boolean) => {\n setContinueOnError(checked);\n onUpdateMeta?.({ continueOnError: checked });\n };\n\n const renderTypeForm = () => {\n const payload = step.payload || {};\n switch (step.type) {\n case 'api_request':\n return <ApiRequestStepForm payload={payload} document={document} onChange={onUpdatePayload} />;\n case 'show_toast':\n return <ShowToastStepForm payload={payload} document={document} onChange={onUpdatePayload} />;\n case 'navigate':\n return <NavigateStepForm payload={payload} document={document} onChange={onUpdatePayload} />;\n case 'open_modal':\n return (\n <ModalStepForm\n payload={payload}\n isOpenAction={true}\n document={document}\n onChange={onUpdatePayload}\n />\n );\n case 'close_modal':\n return (\n <ModalStepForm\n payload={payload}\n isOpenAction={false}\n document={document}\n onChange={onUpdatePayload}\n />\n );\n case 'set_state':\n return <SetStateStepForm payload={payload} document={document} onChange={onUpdatePayload} />;\n case 'reset_form':\n return <ResetFormStepForm payload={payload} document={document} onChange={onUpdatePayload} />;\n case 'copy_clipboard':\n return <CopyClipboardStepForm payload={payload} document={document} onChange={onUpdatePayload} />;\n case 'custom_event':\n return <CustomEventStepForm payload={payload} document={document} onChange={onUpdatePayload} />;\n default:\n return (\n <div className=\"text-xs text-slate-400 italic p-3 bg-slate-950 rounded\">\n No specialized configuration available for step type: {step.type}\n </div>\n );\n }\n };\n\n return (\n <div\n data-testid={`action-step-form-${step.id}`}\n className={`flex flex-col gap-4 p-4 rounded-xl bg-slate-900 border border-slate-800 shadow-inner text-slate-100 ${className}`}\n >\n {/* Step Label Meta Input */}\n <div>\n <label className=\"block text-xs font-semibold text-slate-400 uppercase tracking-wider mb-1.5\">\n Step Description / Label\n </label>\n <input\n type=\"text\"\n value={label}\n onChange={(e) => handleLabelChange(e.target.value)}\n placeholder={`Describe this ${step.type} step`}\n style={{ color: '#f1f5f9' }}\n className=\"w-full text-xs font-medium bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700/80 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-inner\"\n />\n </div>\n\n {/* Dynamic Type-specific Form */}\n <div className=\"pt-2 border-t border-slate-800/80\">{renderTypeForm()}</div>\n\n {/* Branching Editor (for API Request steps) */}\n {step.type === 'api_request' && !hideBranches && onUpdateBranches && (\n <div className=\"pt-2 border-t border-slate-800/80\">\n <ActionBranchEditor\n parentStep={step}\n document={document}\n onUpdateSuccessSteps={(successSteps) =>\n onUpdateBranches({ onSuccess: successSteps, onError: step.onError })\n }\n onUpdateErrorSteps={(errorSteps) =>\n onUpdateBranches({ onSuccess: step.onSuccess, onError: errorSteps })\n }\n />\n </div>\n )}\n\n {/* Advanced Error Policy Options */}\n <div className=\"pt-2 border-t border-slate-800/80 flex items-center justify-between\">\n <label className=\"flex items-center gap-2 cursor-pointer select-none\">\n <input\n type=\"checkbox\"\n checked={continueOnError}\n onChange={(e) => handleContinueOnErrorChange(e.target.checked)}\n className=\"rounded border-slate-600 bg-slate-950 text-blue-600 focus:ring-0 accent-blue-600 w-4 h-4 cursor-pointer\"\n />\n <span className=\"text-xs text-slate-400 hover:text-slate-300 transition\">\n Continue pipeline execution if this step fails (Ignore Error)\n </span>\n </label>\n </div>\n </div>\n );\n};\n","import React, { useState, useRef, useEffect, useMemo, useCallback } from 'react';\nimport { PageDocument, Node } from '@kubuild/schema';\nimport {\n Code2,\n FileText,\n Database,\n Globe,\n Variable,\n Layers,\n Sparkles,\n Check,\n X,\n} from 'lucide-react';\nimport {\n collectDocumentNodes,\n collectDocumentFormFields,\n} from '../../utils/document-scanner';\n\nexport type VariableCategory = 'form' | 'variables' | 'response' | 'state';\n\nexport interface VariableSuggestionItem {\n key: string;\n label: string;\n category: VariableCategory;\n description: string;\n sample?: string;\n}\n\n// ------------------------------------------------------------------------------------------------\n// Document Scanners & Suggestion Generators\n// ------------------------------------------------------------------------------------------------\n\n\nexport function getAllVariableSuggestions(doc?: PageDocument): VariableSuggestionItem[] {\n const dynamicFormFields = collectDocumentFormFields(doc);\n const baseFormFields = ['email', 'name', 'phone', 'message', 'address', 'searchQuery', 'quantity'];\n const allFormFields = Array.from(new Set([...dynamicFormFields, ...baseFormFields]));\n\n const suggestions: VariableSuggestionItem[] = [];\n\n // 1. Form fields: form.<field>\n for (const field of allFormFields) {\n suggestions.push({\n key: `form.${field}`,\n label: `form.${field}`,\n category: 'form',\n description: `Value of the \"${field}\" form field`,\n sample: field === 'email' ? 'user@example.com' : field === 'name' ? 'Jane Doe' : undefined,\n });\n }\n\n // 2. Variables: variables.<key>\n const variableKeys = [\n { key: 'variables.token', desc: 'Auth token or session bearer', sample: 'eyJhbGciOi...' },\n { key: 'variables.userId', desc: 'Current authenticated user ID', sample: 'usr_94821' },\n { key: 'variables.apiKey', desc: 'Public or workspace API key', sample: 'pk_live_...' },\n { key: 'variables.currentTimestamp', desc: 'Unix timestamp of trigger event', sample: '1741234567' },\n { key: 'variables.currentPage', desc: 'Current route or page path', sample: '/checkout' },\n ];\n for (const v of variableKeys) {\n suggestions.push({\n key: v.key,\n label: v.key,\n category: 'variables',\n description: v.desc,\n sample: v.sample,\n });\n }\n\n // 3. Response fields: response.<field>\n const responseKeys = [\n { key: 'response.data', desc: 'Parsed JSON response body object', sample: '{\"id\": 1}' },\n { key: 'response.id', desc: 'Primary ID returned by API response', sample: '101' },\n { key: 'response.token', desc: 'Token or secret returned by endpoint', sample: 'tok_abc...' },\n { key: 'response.message', desc: 'Status message from API response', sample: 'Success' },\n { key: 'response.status', desc: 'HTTP status code (e.g. 200, 201)', sample: '200' },\n ];\n for (const r of responseKeys) {\n suggestions.push({\n key: r.key,\n label: r.key,\n category: 'response',\n description: r.desc,\n sample: r.sample,\n });\n }\n\n // 4. Runtime state: state.<key>\n const stateKeys = [\n { key: 'state.isSubmitted', desc: 'State flag whether form was submitted', sample: 'true' },\n { key: 'state.selectedPlan', desc: 'User selected plan or tier', sample: 'pro' },\n { key: 'state.cartCount', desc: 'Number of items in shopping cart', sample: '3' },\n ];\n for (const s of stateKeys) {\n suggestions.push({\n key: s.key,\n label: s.key,\n category: 'state',\n description: s.desc,\n sample: s.sample,\n });\n }\n\n return suggestions;\n}\n\nexport function filterVariableSuggestions(\n query: string,\n doc?: PageDocument,\n): VariableSuggestionItem[] {\n const all = getAllVariableSuggestions(doc);\n const cleanQuery = query.toLowerCase().trim().replace(/^\\{\\{/, '').replace(/\\}\\}$/, '');\n\n if (!cleanQuery) return all;\n\n return all.filter(\n (item) =>\n item.key.toLowerCase().includes(cleanQuery) ||\n item.description.toLowerCase().includes(cleanQuery) ||\n item.category.toLowerCase().includes(cleanQuery),\n );\n}\n\n/**\n * Replaces or inserts the variable token at cursor position.\n * If cursor is right after `{{...`, it replaces the partial `{{...` with `{{variableKey}}`.\n */\nexport function insertVariableToken(\n currentText: string,\n cursorPosition: number,\n variableKey: string,\n): { nextText: string; newCursorPos: number } {\n const templateStr = `{{${variableKey}}}`;\n const textBefore = currentText.substring(0, cursorPosition);\n const textAfter = currentText.substring(cursorPosition);\n\n // Check if there is an unclosed `{{` right before the cursor\n const lastOpenBraceIndex = textBefore.lastIndexOf('{{');\n const lastCloseBraceIndex = textBefore.lastIndexOf('}}');\n\n if (lastOpenBraceIndex !== -1 && lastOpenBraceIndex > lastCloseBraceIndex) {\n // Replace from `{{` to cursor (and skip any immediately following closing `}}` if present)\n const prefix = textBefore.substring(0, lastOpenBraceIndex);\n let suffix = textAfter;\n if (suffix.startsWith('}}')) {\n suffix = suffix.substring(2);\n }\n const nextText = `${prefix}${templateStr}${suffix}`;\n const newCursorPos = prefix.length + templateStr.length;\n return { nextText, newCursorPos };\n }\n\n // Otherwise, simple insertion at cursor\n const nextText = `${textBefore}${templateStr}${textAfter}`;\n const newCursorPos = textBefore.length + templateStr.length;\n return { nextText, newCursorPos };\n}\n\n// ------------------------------------------------------------------------------------------------\n// Autocomplete Suggestion Popup Menu Component\n// ------------------------------------------------------------------------------------------------\n\nexport interface VariableSuggestionMenuProps {\n suggestions: VariableSuggestionItem[];\n selectedIndex: number;\n onSelect: (item: VariableSuggestionItem) => void;\n onClose: () => void;\n}\n\nexport const VariableSuggestionMenu: React.FC<VariableSuggestionMenuProps> = ({\n suggestions,\n selectedIndex,\n onSelect,\n onClose,\n}) => {\n const getCategoryMeta = (category: VariableCategory) => {\n switch (category) {\n case 'form':\n return {\n label: 'Form Field',\n icon: FileText,\n colorClass: 'bg-emerald-500/10 text-emerald-400 border-emerald-500/20',\n };\n case 'variables':\n return {\n label: 'Variable',\n icon: Variable,\n colorClass: 'bg-blue-500/10 text-blue-400 border-blue-500/20',\n };\n case 'response':\n return {\n label: 'API Response',\n icon: Globe,\n colorClass: 'bg-amber-500/10 text-amber-400 border-amber-500/20',\n };\n case 'state':\n return {\n label: 'State',\n icon: Database,\n colorClass: 'bg-purple-500/10 text-purple-400 border-purple-500/20',\n };\n }\n };\n\n return (\n <div\n data-testid=\"variable-autocomplete-menu\"\n className=\"absolute left-0 top-full mt-1.5 w-80 max-h-64 overflow-y-auto bg-slate-900 border border-slate-700/90 rounded-xl shadow-2xl z-50 p-1.5 flex flex-col gap-0.5 animate-in fade-in zoom-in-95 duration-100 select-none\"\n >\n <div className=\"flex items-center justify-between px-2.5 py-1 border-b border-slate-800 text-[10px] font-semibold text-slate-400 uppercase tracking-wider\">\n <span className=\"flex items-center gap-1\">\n <Sparkles className=\"w-3 h-3 text-amber-400\" />\n <span>Insert Variable ({suggestions.length})</span>\n </span>\n <span className=\"text-[9px] text-slate-500\">Tab / Enter to pick</span>\n </div>\n\n {suggestions.length === 0 ? (\n <div className=\"p-3 text-xs text-slate-500 text-center italic\">\n No matching variables found\n </div>\n ) : (\n suggestions.map((item, idx) => {\n const meta = getCategoryMeta(item.category);\n const Icon = meta.icon;\n const isSelected = idx === selectedIndex;\n\n return (\n <button\n key={item.key}\n type=\"button\"\n data-testid={`variable-option-${item.key}`}\n onMouseDown={(e) => {\n e.preventDefault(); // Prevent input blur\n onSelect(item);\n }}\n className={`flex items-start gap-2.5 p-2 rounded-lg text-left transition cursor-pointer ${\n isSelected\n ? 'bg-blue-600 text-white'\n : 'text-slate-200 hover:bg-slate-800/90'\n }`}\n >\n <div\n className={`p-1 rounded mt-0.5 border ${\n isSelected ? 'bg-blue-700 text-white border-blue-400' : meta.colorClass\n }`}\n >\n <Icon className=\"w-3 h-3 shrink-0\" />\n </div>\n\n <div className=\"flex-1 min-w-0\">\n <div className=\"flex items-center justify-between gap-1\">\n <span className=\"font-mono text-xs font-semibold truncate\">{`{{${item.key}}}`}</span>\n <span\n className={`text-[9px] font-medium px-1.5 py-0.2 rounded border ${\n isSelected\n ? 'bg-blue-700/60 text-blue-100 border-blue-400'\n : meta.colorClass\n }`}\n >\n {meta.label}\n </span>\n </div>\n <p\n className={`text-[10px] truncate mt-0.5 ${\n isSelected ? 'text-blue-100' : 'text-slate-400'\n }`}\n >\n {item.description}\n {item.sample && ` (e.g. ${item.sample})`}\n </p>\n </div>\n </button>\n );\n })\n )}\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// Variable Autocomplete Input Component\n// ------------------------------------------------------------------------------------------------\n\nexport interface VariableAutocompleteInputProps\n extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'onChange'> {\n value: string;\n onChange: (value: string) => void;\n document?: PageDocument;\n containerClassName?: string;\n}\n\nexport const VariableAutocompleteInput: React.FC<VariableAutocompleteInputProps> = ({\n value,\n onChange,\n document,\n placeholder,\n className = '',\n containerClassName = '',\n ...inputProps\n}) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const suggestions = useMemo(() => {\n return filterVariableSuggestions(searchQuery, document);\n }, [searchQuery, document]);\n\n // Check if cursor is right after `{{`\n const handleInputChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n const cursorPos = e.target.selectionStart || 0;\n onChange(val);\n\n const textBefore = val.substring(0, cursorPos);\n const lastOpenIndex = textBefore.lastIndexOf('{{');\n const lastCloseIndex = textBefore.lastIndexOf('}}');\n\n if (lastOpenIndex !== -1 && lastOpenIndex > lastCloseIndex) {\n const query = textBefore.substring(lastOpenIndex + 2);\n setSearchQuery(query);\n setSelectedIndex(0);\n setIsOpen(true);\n } else if (isOpen && !val.includes('{{')) {\n setIsOpen(false);\n }\n };\n\n const handleSelectSuggestion = (item: VariableSuggestionItem) => {\n const el = inputRef.current;\n const cursorPos = el?.selectionStart ?? value.length;\n const { nextText, newCursorPos } = insertVariableToken(value, cursorPos, item.key);\n\n onChange(nextText);\n setIsOpen(false);\n\n setTimeout(() => {\n if (el) {\n el.focus();\n el.setSelectionRange(newCursorPos, newCursorPos);\n }\n }, 0);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLInputElement>) => {\n if (!isOpen) {\n if (e.key === '{' && (value.endsWith('{') || e.currentTarget.selectionStart === 0)) {\n // Typing second `{`\n setIsOpen(true);\n setSearchQuery('');\n setSelectedIndex(0);\n }\n return;\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex((prev) => (prev + 1) % Math.max(suggestions.length, 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex((prev) => (prev - 1 + suggestions.length) % Math.max(suggestions.length, 1));\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n if (suggestions.length > 0 && selectedIndex >= 0 && selectedIndex < suggestions.length) {\n e.preventDefault();\n handleSelectSuggestion(suggestions[selectedIndex]);\n }\n } else if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n const togglePicker = () => {\n setSearchQuery('');\n setSelectedIndex(0);\n setIsOpen(!isOpen);\n if (!isOpen && inputRef.current) {\n inputRef.current.focus();\n }\n };\n\n return (\n <div className={`relative flex items-center w-full ${containerClassName}`}>\n <input\n ref={inputRef}\n type=\"text\"\n value={value}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n onBlur={() => {\n // Delay closing so mouseDown on options registers\n setTimeout(() => setIsOpen(false), 200);\n }}\n placeholder={placeholder}\n style={{ color: '#f1f5f9', ...inputProps.style }}\n className={`w-full pr-8 text-xs font-mono bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700/90 rounded-lg px-3 py-2 focus:outline-none focus:ring-1 focus:ring-blue-500 shadow-inner transition ${className}`}\n {...inputProps}\n />\n\n {/* Quick Variable Chip Launcher Button */}\n <button\n type=\"button\"\n tabIndex={-1}\n data-testid=\"toggle-variable-picker-btn\"\n onClick={togglePicker}\n title=\"Insert dynamic variable ({{...}})\"\n className=\"absolute right-1.5 p-1 rounded text-slate-400 hover:text-blue-400 hover:bg-slate-800 transition cursor-pointer\"\n >\n <Code2 className=\"w-3.5 h-3.5\" />\n </button>\n\n {/* Floating Autocomplete Suggestion Menu */}\n {isOpen && (\n <VariableSuggestionMenu\n suggestions={suggestions}\n selectedIndex={selectedIndex}\n onSelect={handleSelectSuggestion}\n onClose={() => setIsOpen(false)}\n />\n )}\n </div>\n );\n};\n\n// ------------------------------------------------------------------------------------------------\n// Variable Autocomplete Textarea Component\n// ------------------------------------------------------------------------------------------------\n\nexport interface VariableAutocompleteTextareaProps\n extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'onChange'> {\n value: string;\n onChange: (value: string) => void;\n document?: PageDocument;\n containerClassName?: string;\n}\n\nexport const VariableAutocompleteTextarea: React.FC<VariableAutocompleteTextareaProps> = ({\n value,\n onChange,\n document,\n placeholder,\n rows = 4,\n className = '',\n containerClassName = '',\n ...textareaProps\n}) => {\n const textareaRef = useRef<HTMLTextAreaElement>(null);\n const [isOpen, setIsOpen] = useState(false);\n const [searchQuery, setSearchQuery] = useState('');\n const [selectedIndex, setSelectedIndex] = useState(0);\n\n const suggestions = useMemo(() => {\n return filterVariableSuggestions(searchQuery, document);\n }, [searchQuery, document]);\n\n const handleTextareaChange = (e: React.ChangeEvent<HTMLTextAreaElement>) => {\n const val = e.target.value;\n const cursorPos = e.target.selectionStart || 0;\n onChange(val);\n\n const textBefore = val.substring(0, cursorPos);\n const lastOpenIndex = textBefore.lastIndexOf('{{');\n const lastCloseIndex = textBefore.lastIndexOf('}}');\n\n if (lastOpenIndex !== -1 && lastOpenIndex > lastCloseIndex) {\n const query = textBefore.substring(lastOpenIndex + 2);\n setSearchQuery(query);\n setSelectedIndex(0);\n setIsOpen(true);\n } else if (isOpen && !val.includes('{{')) {\n setIsOpen(false);\n }\n };\n\n const handleSelectSuggestion = (item: VariableSuggestionItem) => {\n const el = textareaRef.current;\n const cursorPos = el?.selectionStart ?? value.length;\n const { nextText, newCursorPos } = insertVariableToken(value, cursorPos, item.key);\n\n onChange(nextText);\n setIsOpen(false);\n\n setTimeout(() => {\n if (el) {\n el.focus();\n el.setSelectionRange(newCursorPos, newCursorPos);\n }\n }, 0);\n };\n\n const handleKeyDown = (e: React.KeyboardEvent<HTMLTextAreaElement>) => {\n if (!isOpen) return;\n\n if (e.key === 'ArrowDown') {\n e.preventDefault();\n setSelectedIndex((prev) => (prev + 1) % Math.max(suggestions.length, 1));\n } else if (e.key === 'ArrowUp') {\n e.preventDefault();\n setSelectedIndex((prev) => (prev - 1 + suggestions.length) % Math.max(suggestions.length, 1));\n } else if (e.key === 'Enter' || e.key === 'Tab') {\n if (suggestions.length > 0 && selectedIndex >= 0 && selectedIndex < suggestions.length) {\n e.preventDefault();\n handleSelectSuggestion(suggestions[selectedIndex]);\n }\n } else if (e.key === 'Escape') {\n setIsOpen(false);\n }\n };\n\n const togglePicker = () => {\n setSearchQuery('');\n setSelectedIndex(0);\n setIsOpen(!isOpen);\n if (!isOpen && textareaRef.current) {\n textareaRef.current.focus();\n }\n };\n\n return (\n <div className={`relative flex flex-col w-full ${containerClassName}`}>\n <div className=\"relative\">\n <textarea\n ref={textareaRef}\n value={value}\n rows={rows}\n onChange={handleTextareaChange}\n onKeyDown={handleKeyDown}\n onBlur={() => {\n setTimeout(() => setIsOpen(false), 200);\n }}\n placeholder={placeholder}\n style={{ color: '#f1f5f9', ...textareaProps.style }}\n className={`w-full text-xs font-mono bg-slate-950 text-slate-100 placeholder:text-slate-500 border border-slate-700/90 rounded-lg p-2.5 pr-8 focus:outline-none focus:ring-1 focus:ring-blue-500 leading-relaxed shadow-inner transition ${className}`}\n {...textareaProps}\n />\n\n <button\n type=\"button\"\n tabIndex={-1}\n data-testid=\"toggle-textarea-variable-picker-btn\"\n onClick={togglePicker}\n title=\"Insert dynamic variable ({{...}})\"\n className=\"absolute right-2 top-2 p-1 rounded text-slate-400 hover:text-blue-400 hover:bg-slate-800 transition cursor-pointer\"\n >\n <Code2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {isOpen && (\n <VariableSuggestionMenu\n suggestions={suggestions}\n selectedIndex={selectedIndex}\n onSelect={handleSelectSuggestion}\n onClose={() => setIsOpen(false)}\n />\n )}\n </div>\n );\n};\n","import { Node, PageDocument } from '@kubuild/schema';\n\n/**\n * Recursively scans a document Node tree and collects nodes matching a predicate.\n */\nexport function collectDocumentNodes(\n node: Node,\n predicate: (n: Node) => boolean,\n acc: Node[] = [],\n): Node[] {\n if (predicate(node)) {\n acc.push(node);\n }\n if (Array.isArray(node.children)) {\n for (const child of node.children) {\n collectDocumentNodes(child, predicate, acc);\n }\n }\n return acc;\n}\n\n/**\n * Scans a document for modal or dialog nodes.\n */\nexport function collectDocumentModals(doc?: PageDocument): Array<{ id: string; label: string }> {\n if (!doc?.document) return [];\n const nodes = collectDocumentNodes(\n doc.document,\n (n) => n.type === 'modal' || n.type === 'dialog' || n.id.toLowerCase().includes('modal'),\n );\n return nodes.map((n) => ({\n id: n.id,\n label: (n.props?.title as string) || (n.props?.label as string) || `<${n.type}> #${n.id}`,\n }));\n}\n\n/**\n * Scans a document for form nodes.\n */\nexport function collectDocumentForms(doc?: PageDocument): Array<{ id: string; label: string }> {\n if (!doc?.document) return [];\n const nodes = collectDocumentNodes(\n doc.document,\n (n) => n.type === 'form' || n.id.toLowerCase().includes('form'),\n );\n return nodes.map((n) => ({\n id: n.id,\n label: (n.props?.name as string) || (n.props?.ariaLabel as string) || `<${n.type}> #${n.id}`,\n }));\n}\n\n/**\n * Scans a document for section/container anchor targets.\n */\nexport function collectDocumentAnchors(doc?: PageDocument): Array<{ id: string; label: string }> {\n if (!doc?.document) return [];\n const nodes = collectDocumentNodes(\n doc.document,\n (n) => n.type === 'section' || n.type === 'container' || Boolean(n.props?.id),\n );\n return nodes.map((n) => ({\n id: n.id,\n label: (n.props?.title as string) || (n.props?.heading as string) || `#${n.id} (${n.type})`,\n }));\n}\n\n/**\n * Collects input field names from form and input nodes in the document.\n */\nexport function collectDocumentFormFields(doc?: PageDocument): string[] {\n if (!doc?.document) return [];\n const fieldSet = new Set<string>();\n\n const inputNodes = collectDocumentNodes(\n doc.document,\n (n) =>\n ['input', 'textarea', 'select', 'checkbox', 'radio', 'switch'].includes(n.type) ||\n Boolean(n.props?.name) ||\n Boolean(n.props?.fieldName),\n );\n\n for (const node of inputNodes) {\n const fieldName =\n (node.props?.name as string) ||\n (node.props?.fieldName as string) ||\n (node.props?.key as string);\n if (fieldName && typeof fieldName === 'string' && fieldName.trim()) {\n fieldSet.add(fieldName.trim());\n } else if (node.id) {\n // Fallback: sanitized node ID (e.g. \"input-email\" -> \"email\")\n const cleanId = node.id.replace(/^(input|text|field|select|textarea)-/i, '');\n if (cleanId) fieldSet.add(cleanId);\n }\n }\n\n return Array.from(fieldSet);\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 &gt;\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 &lt;{String(node.props.tag)}&gt;\n </span>\n )}\n </button>\n </React.Fragment>\n );\n })}\n </nav>\n );\n};\n","import React, { useLayoutEffect, useRef, useState, useEffect } from 'react';\nimport { PageDocument } from '@kubuild/schema';\nimport { ComponentRegistry, STARTER_BLOCKS } 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 previewMode,\n addActionLog,\n setLiveFormState,\n } = useEditorStore();\n const document = propDoc ?? storeDoc;\n const showFloatingBadges = config?.showFloatingBadges !== false && !previewMode;\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 const blockDef = STARTER_BLOCKS.find((b) => b.id === activePayload.blockId);\n if (blockDef) {\n try {\n const sample = blockDef.createNodeTree(() => 'sample');\n incomingType = sample.type;\n } catch {\n incomingType = 'section';\n }\n } else {\n incomingType = 'section';\n }\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={previewMode ? undefined : handleMouseOver}\n onMouseLeave={previewMode ? undefined : handleMouseLeave}\n onDragStart={previewMode ? undefined : handleDragStart}\n onDragOver={previewMode ? undefined : handleDragOver}\n onDrop={previewMode ? undefined : handleDrop}\n onDragEnd={previewMode ? undefined : handleDragEnd}\n >\n <KubuildRenderer\n document={document}\n registry={registry}\n context={context}\n viewport={viewport}\n mode={previewMode ? 'runtime' : 'editor'}\n onNodeClick={(id: string) => {\n if (!previewMode) {\n selectNode(id);\n }\n }}\n onNodePropChange={(nodeId: string, propName: string, value: unknown, isBlur?: boolean) => {\n if (previewMode) {\n return;\n }\n if (!isBlur && typeof value === 'string' && value.trim() === '') {\n return;\n }\n updateNodeProps(nodeId, { [propName]: value }, registry);\n }}\n onActionDispatch={(actionType: string, payload: Record<string, unknown> | undefined, nodeId: string) => {\n if (previewMode) {\n addActionLog({\n actionType,\n trigger: 'dispatch',\n nodeId,\n status: 'success',\n payload,\n });\n if (actionType === 'submit' && payload) {\n setLiveFormState({\n formId: nodeId,\n values: payload,\n errors: {},\n touched: {},\n isSubmitting: false,\n isValid: true,\n dirty: true,\n });\n }\n }\n }}\n onDiagnostic={(diag) => {\n if (previewMode && diag.code === 'ACTION_EXECUTION_ERROR') {\n addActionLog({\n actionType: diag.actionType || 'action_error',\n trigger: 'error',\n nodeId: diag.nodeId,\n status: 'error',\n error: diag.message,\n });\n }\n onDiagnostic?.(diag);\n }}\n />\n {!previewMode && 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 {!previewMode && 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 {!previewMode && 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, { 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/canvas';\nimport { EditorToolbar } from './toolbar';\nimport { InspectorPanel } from '../panels/inspector-panel';\nimport { LayersPanel } from '../panels/layers-panel';\nimport { TableSpreadsheetEditor, findActiveTableNode } from '../table-editor/table-spreadsheet-editor';\nimport { HierarchyBreadcrumbs } from '../canvas/breadcrumbs';\nimport { LeftSidebar } from '../panels/left-sidebar';\nimport { ActionDebuggerPanel } from '../panels/action-debugger-panel';\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 previewMode,\n actionDebuggerOpen,\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\n {/* STORA-345: Live Form Testing & Action Debugger in Preview Mode */}\n {previewMode && actionDebuggerOpen && (\n <div className=\"fixed bottom-4 right-4 z-50 animate-in fade-in slide-in-from-bottom-3 duration-200\">\n <ActionDebuggerPanel />\n </div>\n )}\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 React, { useState } from 'react';\nimport { ComponentRegistry } from '@kubuild/components';\nimport { useEditorStore } from '../../store';\nimport { ImportModal } from '../modals/import-modal';\nimport { CodeViewerModal } from '../modals/code-viewer-modal';\nimport { downloadDocumentAsStora, downloadDocumentAsJson } from '../../utils';\nimport { Copy, ClipboardPaste, CopyPlus, Trash2, Undo2, Redo2, Play, Square, Terminal } 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 previewMode,\n togglePreviewMode,\n actionDebuggerOpen,\n toggleActionDebugger,\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 showPreviewToggle = config?.showPreviewToggle !== false;\n const showActionDebugger = config?.showActionDebugger !== 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\">&lt;&gt;</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 cursor-pointer\"\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 cursor-pointer\"\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 cursor-pointer\"\n >\n JSON\n </button>\n </div>\n )}\n\n {showPreviewToggle && (\n <>\n <div className=\"h-4 w-px bg-slate-200 mx-1\" />\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n data-testid=\"toolbar-preview-toggle\"\n title={previewMode ? 'Exit Preview (Switch to Edit mode)' : 'Interactive Preview Mode'}\n onClick={togglePreviewMode}\n className={`text-xs px-2.5 py-1 rounded border transition font-medium flex items-center gap-1.5 cursor-pointer shadow-xs ${\n previewMode\n ? 'border-emerald-600 bg-emerald-600 text-white hover:bg-emerald-700 font-semibold'\n : 'border-slate-200 bg-white hover:border-blue-500 hover:text-blue-600 text-slate-700'\n }`}\n >\n {previewMode ? (\n <>\n <Square className=\"w-3.5 h-3.5 fill-current\" />\n <span>Editing</span>\n </>\n ) : (\n <>\n <Play className=\"w-3.5 h-3.5 fill-current text-emerald-600\" />\n <span>Preview</span>\n </>\n )}\n </button>\n\n {previewMode && showActionDebugger && (\n <button\n type=\"button\"\n data-testid=\"toolbar-debugger-toggle\"\n title={actionDebuggerOpen ? 'Hide Form & Action Debugger' : 'Show Form & Action Debugger'}\n onClick={toggleActionDebugger}\n className={`text-xs px-2 py-1 rounded border transition font-medium flex items-center gap-1.5 cursor-pointer ${\n actionDebuggerOpen\n ? 'border-blue-600 bg-blue-600 text-white shadow-xs'\n : 'border-slate-700 bg-slate-900 text-slate-200 hover:bg-slate-800'\n }`}\n >\n <Terminal className=\"w-3.5 h-3.5\" />\n <span>Debugger</span>\n </button>\n )}\n </div>\n </>\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 '../../utils';\nimport { CodeHighlighter } from '../ui/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 &lt;&gt;\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 &amp; 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\">&nbsp;</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 '../ui/variable-picker';\nimport { AssetManagerModal } from '../modals/asset-manager-modal';\nimport { ActionBuilderModal } from '../action-builder/action-builder-modal';\nimport { TableSpreadsheetEditor } from '../table-editor/table-spreadsheet-editor';\nimport { BoxModelEditor } from '../style-manager/box-model-editor';\nimport { StyleManagerAccordion } from '../style-manager/style-manager-accordion';\nimport { TraitsPanel } from './traits-panel';\nimport { ComponentIcon } from '../ui/icons';\nimport { replayNodeAnimation } from '@kubuild/renderer';\nimport { AlertTriangle, Palette, Settings, Crosshair, Trash2, X, Zap } from 'lucide-react';\n\nimport { StyleSectorId } from '../style-manager/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 updateNodeFormConfig,\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 // STORA-340 — Visual Action Builder modal state\n const [isActionBuilderOpen, setIsActionBuilderOpen] = useState<boolean>(false);\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 {/* STORA-340 — Action Builder Modal */}\n {isActionBuilderOpen && (\n <ActionBuilderModal\n isOpen\n onClose={() => setIsActionBuilderOpen(false)}\n nodeId={node.id}\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 {/* STORA-340 — Interactivity & Action Builder Card */}\n <div className=\"pb-3 border-b border-slate-200\">\n <div className=\"flex items-center justify-between p-2 rounded-lg bg-slate-50 border border-slate-200 hover:border-blue-300 transition\">\n <div className=\"flex items-center gap-2 min-w-0\">\n <div className=\"w-6 h-6 rounded-md bg-amber-100 text-amber-600 flex items-center justify-center shrink-0\">\n <Zap className=\"w-3.5 h-3.5\" />\n </div>\n <div className=\"flex flex-col min-w-0\">\n <span className=\"text-xs font-semibold text-slate-700 leading-tight\">Interactivity &amp; Actions</span>\n <span className=\"text-[10px] text-slate-500 truncate\">\n {node.actions && node.actions.length > 0\n ? `${node.actions.reduce((sum, p) => sum + p.steps.length, 0)} step(s) across ${node.actions.length} trigger(s)`\n : 'No actions configured'}\n </span>\n </div>\n </div>\n <button\n type=\"button\"\n data-testid=\"open-action-builder-btn\"\n onClick={() => setIsActionBuilderOpen(true)}\n className=\"px-2.5 py-1 text-xs font-medium text-blue-600 bg-blue-50 hover:bg-blue-100 border border-blue-200 rounded-md transition flex items-center gap-1 cursor-pointer shrink-0 shadow-2xs\"\n >\n <Zap className=\"w-3 h-3\" />\n <span>Actions</span>\n {node.actions && node.actions.length > 0 && (\n <span className=\"ml-0.5 px-1 py-0.2 text-[9px] font-bold bg-blue-600 text-white rounded-full\">\n {node.actions.length}\n </span>\n )}\n </button>\n </div>\n </div>\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 onUpdateFormConfig={(cfg) => {\n const result = updateNodeFormConfig(node.id, cfg);\n if (!result.success && result.error) {\n setError('formConfig', result.error);\n }\n }}\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 '../ui/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&#10;Value 1, Value 2, Value 3&#10;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 (&lt;th&gt;)</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 '../ui/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 '../ui/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, FormConfig } from '@kubuild/schema';\nimport { X } from 'lucide-react';\nimport { FormValidationRulesPanel, isFormFieldNode } from './form-validation-rules-panel';\nimport { useEditorStore } from '../../store';\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 /** Commit form configuration updates (including validation rules) to the node. */\n onUpdateFormConfig?: (formConfig: Partial<FormConfig> | null) => 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 onUpdateFormConfig,\n className,\n}) => {\n const node = selectedNodeId ? findNodeById(document.document, selectedNodeId) : null;\n const definition = node ? registry.get(node.type) : undefined;\n const storeUpdateFormConfig = useEditorStore((s) => s.updateNodeFormConfig);\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 handleUpdateFormConfig = (cfg: Partial<FormConfig> | null) => {\n if (onUpdateFormConfig) {\n onUpdateFormConfig(cfg);\n } else {\n storeUpdateFormConfig(node.id, cfg);\n }\n };\n\n const isForm = isFormFieldNode(node);\n const traits = definition.traits ?? [];\n\n if (traits.length === 0 && !isForm) {\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 {/* STORA-344: Form Validation Rules Inspector Panel */}\n {isForm && (\n <FormValidationRulesPanel\n node={node}\n onUpdateFormConfig={handleUpdateFormConfig}\n onCommitProp={onCommitTrait}\n />\n )}\n\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, { useState } from 'react';\nimport { Node, ValidationRule, ValidationRuleType, FormConfig } from '@kubuild/schema';\nimport {\n ShieldCheck,\n Plus,\n Trash2,\n CheckCircle2,\n Mail,\n Code2,\n Minimize,\n Maximize,\n AlertCircle,\n HelpCircle,\n} from 'lucide-react';\n\nexport interface FormValidationRulesPanelProps {\n node: Node;\n onUpdateFormConfig: (formConfig: Partial<FormConfig> | null) => void;\n onCommitProp?: (propName: string, value: unknown) => void;\n className?: string;\n}\n\ninterface RuleTypeDefinition {\n type: ValidationRuleType;\n label: string;\n description: string;\n icon: React.ComponentType<{ className?: string }>;\n defaultMessage: string;\n hasValue: boolean;\n valueType?: 'number' | 'string';\n defaultValue?: unknown;\n valuePlaceholder?: string;\n}\n\nexport const SUPPORTED_RULES: RuleTypeDefinition[] = [\n {\n type: 'required',\n label: 'Required',\n description: 'Field must not be empty or blank',\n icon: CheckCircle2,\n defaultMessage: 'This field is required',\n hasValue: false,\n },\n {\n type: 'email',\n label: 'Email',\n description: 'Must be a valid email format',\n icon: Mail,\n defaultMessage: 'Please enter a valid email address',\n hasValue: false,\n },\n {\n type: 'custom_regex',\n label: 'Custom Regex',\n description: 'Must match custom Regular Expression pattern',\n icon: Code2,\n defaultMessage: 'Input format is invalid',\n hasValue: true,\n valueType: 'string',\n defaultValue: '^[a-zA-Z0-9_-]+$',\n valuePlaceholder: 'e.g. ^[0-9]{5}$',\n },\n {\n type: 'min_length',\n label: 'Min Length',\n description: 'Minimum number of characters required',\n icon: Minimize,\n defaultMessage: 'Must be at least 3 characters',\n hasValue: true,\n valueType: 'number',\n defaultValue: 3,\n valuePlaceholder: 'Min characters count',\n },\n {\n type: 'max_length',\n label: 'Max Length',\n description: 'Maximum number of characters allowed',\n icon: Maximize,\n defaultMessage: 'Must not exceed 50 characters',\n hasValue: true,\n valueType: 'number',\n defaultValue: 50,\n valuePlaceholder: 'Max characters count',\n },\n];\n\nexport function getRuleDefinition(type: string): RuleTypeDefinition | undefined {\n return SUPPORTED_RULES.find((r) => r.type === type);\n}\n\nexport function isFormFieldNode(node: Node | null): boolean {\n if (!node) return false;\n const formTypes = ['input', 'textarea', 'select', 'checkbox', 'radio'];\n if (formTypes.includes(node.type)) return true;\n if (node.props && typeof node.props.name === 'string' && node.props.name.trim().length > 0) {\n return true;\n }\n return false;\n}\n\nexport const FormValidationRulesPanel: React.FC<FormValidationRulesPanelProps> = ({\n node,\n onUpdateFormConfig,\n onCommitProp,\n className,\n}) => {\n const [isAddMenuOpen, setIsAddMenuOpen] = useState<boolean>(false);\n\n // Read rules from node.formConfig.rules or node.props.rules\n const existingRules: ValidationRule[] =\n node.formConfig?.rules || (node.props?.rules as ValidationRule[]) || [];\n\n const handleCommitRules = (nextRules: ValidationRule[]) => {\n const currentFormConfig = node.formConfig;\n const updatedFormConfig: FormConfig = {\n formId: currentFormConfig?.formId || (node.props?.name as string) || node.id,\n resetOnSubmit: currentFormConfig?.resetOnSubmit ?? false,\n scrollToFirstError: currentFormConfig?.scrollToFirstError ?? true,\n validateOn: currentFormConfig?.validateOn ?? 'submit',\n initialValues: currentFormConfig?.initialValues,\n rules: nextRules,\n };\n\n onUpdateFormConfig(updatedFormConfig);\n onCommitProp?.('rules', nextRules);\n };\n\n const handleAddRule = (ruleDef: RuleTypeDefinition) => {\n setIsAddMenuOpen(false);\n const newRule: ValidationRule = {\n type: ruleDef.type,\n message: ruleDef.defaultMessage,\n ...(ruleDef.hasValue ? { value: ruleDef.defaultValue } : {}),\n };\n\n const nextRules = [...existingRules, newRule];\n handleCommitRules(nextRules);\n };\n\n const handleDeleteRule = (index: number) => {\n const nextRules = existingRules.filter((_, idx) => idx !== index);\n handleCommitRules(nextRules);\n };\n\n const handleUpdateRuleMessage = (index: number, message: string) => {\n const nextRules = existingRules.map((rule, idx) => {\n if (idx !== index) return rule;\n return { ...rule, message };\n });\n handleCommitRules(nextRules);\n };\n\n const handleUpdateRuleValue = (index: number, rawVal: unknown, valueType?: 'number' | 'string') => {\n const nextRules = existingRules.map((rule, idx) => {\n if (idx !== index) return rule;\n let finalVal = rawVal;\n if (valueType === 'number') {\n const parsed = Number(rawVal);\n finalVal = Number.isNaN(parsed) ? 0 : parsed;\n }\n return { ...rule, value: finalVal };\n });\n handleCommitRules(nextRules);\n };\n\n return (\n <div\n data-testid=\"form-validation-rules-panel\"\n className={`rounded-lg border border-slate-200 bg-slate-50/70 p-3 flex flex-col gap-3 ${className || ''}`}\n >\n {/* Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5\">\n <ShieldCheck className=\"w-4 h-4 text-blue-600\" />\n <span className=\"text-xs font-semibold text-slate-700 uppercase tracking-wide\">\n Validation Rules\n </span>\n {existingRules.length > 0 && (\n <span\n data-testid=\"rules-count-badge\"\n className=\"px-1.5 py-0.5 text-[10px] font-bold bg-blue-100 text-blue-700 rounded-full\"\n >\n {existingRules.length}\n </span>\n )}\n </div>\n\n {/* Add Rule Dropdown Toggle */}\n <div className=\"relative\">\n <button\n type=\"button\"\n data-testid=\"add-rule-btn\"\n onClick={() => setIsAddMenuOpen(!isAddMenuOpen)}\n className=\"px-2 py-1 text-xs font-medium text-blue-600 bg-white hover:bg-blue-50 border border-blue-200 rounded-md transition flex items-center gap-1 cursor-pointer shadow-2xs\"\n >\n <Plus className=\"w-3.5 h-3.5\" />\n <span>Add Rule</span>\n </button>\n\n {isAddMenuOpen && (\n <>\n <div\n className=\"fixed inset-0 z-40\"\n onClick={() => setIsAddMenuOpen(false)}\n />\n <div\n data-testid=\"add-rule-menu\"\n className=\"absolute right-0 top-full mt-1 w-56 bg-white rounded-lg shadow-xl border border-slate-200 z-50 py-1 overflow-hidden animate-in fade-in zoom-in-95 duration-150\"\n >\n <div className=\"px-2.5 py-1 text-[10px] font-bold text-slate-400 uppercase tracking-wider border-b border-slate-100\">\n Select Rule Type\n </div>\n {SUPPORTED_RULES.map((ruleDef) => {\n const Icon = ruleDef.icon;\n return (\n <button\n key={ruleDef.type}\n type=\"button\"\n data-testid={`add-rule-${ruleDef.type}`}\n onClick={() => handleAddRule(ruleDef)}\n className=\"w-full text-left px-2.5 py-1.5 hover:bg-blue-50 text-xs text-slate-700 hover:text-blue-700 flex items-start gap-2 transition cursor-pointer\"\n >\n <Icon className=\"w-3.5 h-3.5 mt-0.5 text-slate-500 group-hover:text-blue-600 shrink-0\" />\n <div className=\"flex flex-col min-w-0\">\n <span className=\"font-semibold text-[11px] leading-tight text-slate-800\">\n {ruleDef.label}\n </span>\n <span className=\"text-[10px] text-slate-400 truncate\">\n {ruleDef.description}\n </span>\n </div>\n </button>\n );\n })}\n </div>\n </>\n )}\n </div>\n </div>\n\n {/* Rules List */}\n {existingRules.length === 0 ? (\n <div\n data-testid=\"empty-rules-state\"\n className=\"text-center py-3 px-2 border border-dashed border-slate-200 rounded-md bg-white text-slate-400 text-xs flex flex-col items-center gap-1\"\n >\n <HelpCircle className=\"w-4 h-4 text-slate-300\" />\n <span>No validation rules configured.</span>\n <span className=\"text-[10px] text-slate-400\">\n Click \"+ Add Rule\" to enforce required fields, email format, or min/max lengths.\n </span>\n </div>\n ) : (\n <div className=\"flex flex-col gap-2.5\" data-testid=\"active-rules-list\">\n {existingRules.map((rule, idx) => {\n const ruleDef = getRuleDefinition(rule.type);\n const Icon = ruleDef?.icon || AlertCircle;\n const hasValue = ruleDef?.hasValue ?? (rule.value !== undefined);\n const valueType = ruleDef?.valueType || (typeof rule.value === 'number' ? 'number' : 'string');\n\n return (\n <div\n key={`${rule.type}-${idx}`}\n data-testid={`rule-card-${idx}`}\n className=\"rounded-md border border-slate-200 bg-white p-2.5 shadow-2xs flex flex-col gap-2 transition hover:border-slate-300\"\n >\n {/* Rule Item Header */}\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-1.5\">\n <div className=\"w-5 h-5 rounded bg-blue-50 text-blue-600 flex items-center justify-center shrink-0\">\n <Icon className=\"w-3 h-3\" />\n </div>\n <span className=\"font-semibold text-xs text-slate-800\">\n {ruleDef?.label || rule.type}\n </span>\n <span className=\"text-[10px] font-mono text-slate-400\">\n #{idx + 1}\n </span>\n </div>\n\n <button\n type=\"button\"\n data-testid={`delete-rule-${idx}`}\n title=\"Delete rule\"\n onClick={() => handleDeleteRule(idx)}\n className=\"p-1 text-slate-400 hover:text-red-600 hover:bg-red-50 rounded transition cursor-pointer\"\n >\n <Trash2 className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n\n {/* Optional Value Input (for min/max/regex) */}\n {hasValue && (\n <div>\n <label className=\"block text-[10px] font-medium text-slate-500 mb-0.5\">\n {rule.type === 'min_length'\n ? 'Min Characters'\n : rule.type === 'max_length'\n ? 'Max Characters'\n : rule.type === 'custom_regex' || rule.type === 'pattern'\n ? 'Regex Pattern'\n : 'Rule Value'}\n </label>\n <input\n type={valueType === 'number' ? 'number' : 'text'}\n data-testid={`rule-value-${idx}`}\n value={rule.value !== undefined && rule.value !== null ? String(rule.value) : ''}\n placeholder={ruleDef?.valuePlaceholder || ''}\n onChange={(e) => handleUpdateRuleValue(idx, e.target.value, valueType)}\n className=\"w-full text-xs font-mono bg-slate-50 text-slate-900 border border-slate-200 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:bg-white\"\n />\n </div>\n )}\n\n {/* Custom Error Message Input */}\n <div>\n <label className=\"block text-[10px] font-medium text-slate-500 mb-0.5\">\n Custom Error Message\n </label>\n <input\n type=\"text\"\n data-testid={`rule-message-${idx}`}\n value={rule.message || ''}\n placeholder=\"Enter custom error message displayed to user\"\n onChange={(e) => handleUpdateRuleMessage(idx, e.target.value)}\n className=\"w-full text-xs bg-slate-50 text-slate-900 border border-slate-200 rounded px-2 py-1 focus:outline-none focus:ring-1 focus:ring-blue-500 focus:bg-white\"\n />\n </div>\n </div>\n );\n })}\n </div>\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 '../ui/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, { 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 '../ui/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 '../ui/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 case 'form-contact-us':\n return (\n <div className=\"w-full h-12 bg-white border border-slate-200 rounded flex flex-col justify-between p-1.5 shadow-xs\">\n <div className=\"w-1/2 h-1 bg-slate-700 rounded-full\" />\n <div className=\"flex gap-1 w-full\">\n <div className=\"flex-1 h-1 bg-slate-200 border border-slate-300 rounded-xs\" />\n <div className=\"flex-1 h-1 bg-slate-200 border border-slate-300 rounded-xs\" />\n </div>\n <div className=\"w-full h-2 bg-slate-100 border border-slate-300 rounded-xs\" />\n <div className=\"w-full h-1.5 bg-blue-600 rounded-xs\" />\n </div>\n );\n case 'form-newsletter':\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.5\">\n <div className=\"w-2/3 h-1 bg-slate-700 rounded-full\" />\n <div className=\"w-full flex items-center gap-1\">\n <div className=\"flex-1 h-2.5 bg-white border border-slate-300 rounded-xs\" />\n <div className=\"w-5 h-2.5 bg-blue-600 rounded-xs text-[6px] text-white flex items-center justify-center font-bold\">\n &gt;\n </div>\n </div>\n </div>\n );\n case 'form-lead-gen':\n return (\n <div className=\"w-full h-12 bg-white border border-slate-200 rounded flex flex-col justify-between p-1.5 shadow-xs\">\n <div className=\"flex items-center gap-1\">\n <div className=\"w-4 h-1 bg-blue-500 rounded-full\" />\n <div className=\"w-10 h-1 bg-slate-700 rounded-full\" />\n </div>\n <div className=\"w-full h-1 bg-slate-200 border border-slate-300 rounded-xs\" />\n <div className=\"w-full h-1 bg-slate-100 border border-slate-300 rounded-xs flex items-center justify-between px-0.5\">\n <div className=\"w-4 h-0.5 bg-slate-400 rounded-full\" />\n <div className=\"w-1 h-0.5 bg-slate-400 rounded-full\" />\n </div>\n <div className=\"w-full h-1.5 bg-blue-600 rounded-xs\" />\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, { useState } from 'react';\nimport { useEditorStore, ActionLogEntry, LiveFormState } from '../../store';\nimport {\n Terminal,\n Activity,\n CheckCircle2,\n XCircle,\n Clock,\n Trash2,\n Copy,\n Check,\n ChevronRight,\n ChevronDown,\n RotateCcw,\n Sliders,\n Sparkles,\n Maximize2,\n Minimize2,\n X,\n AlertCircle,\n FileCode,\n} from 'lucide-react';\n\nexport interface ActionDebuggerPanelProps {\n className?: string;\n onClose?: () => void;\n onResetForm?: () => void;\n formState?: LiveFormState | null;\n logs?: ActionLogEntry[];\n}\n\nexport const ActionDebuggerPanel: React.FC<ActionDebuggerPanelProps> = ({\n className,\n onClose,\n onResetForm,\n formState: propFormState,\n logs: propLogs,\n}) => {\n const storeLogs = useEditorStore((s) => s.actionLogs);\n const clearActionLogs = useEditorStore((s) => s.clearActionLogs);\n const storeLiveFormState = useEditorStore((s) => s.liveFormState);\n const setLiveFormState = useEditorStore((s) => s.setLiveFormState);\n const setActionDebuggerOpen = useEditorStore((s) => s.setActionDebuggerOpen);\n\n const actionLogs = propLogs ?? storeLogs;\n const liveFormState = propFormState !== undefined ? propFormState : storeLiveFormState;\n\n const [activeTab, setActiveTab] = useState<'form' | 'logs'>('form');\n const [expandedLogId, setExpandedLogId] = useState<string | null>(null);\n const [copiedSection, setCopiedSection] = useState<string | null>(null);\n const [isMinimized, setIsMinimized] = useState<boolean>(false);\n\n const handleCopy = (text: string, sectionKey: string) => {\n navigator.clipboard.writeText(text);\n setCopiedSection(sectionKey);\n setTimeout(() => {\n setCopiedSection(null);\n }, 1500);\n };\n\n const handleResetForm = () => {\n onResetForm?.();\n if (liveFormState) {\n setLiveFormState({\n ...liveFormState,\n values: {},\n errors: {},\n touched: {},\n isSubmitting: false,\n isValid: true,\n dirty: false,\n });\n }\n };\n\n const hasFormErrors = liveFormState && Object.keys(liveFormState.errors || {}).length > 0;\n const errorCount = liveFormState ? Object.keys(liveFormState.errors || {}).length : 0;\n\n return (\n <div\n data-testid=\"action-debugger-panel\"\n className={`bg-slate-900 text-slate-100 rounded-xl shadow-2xl border border-slate-700 overflow-hidden flex flex-col transition-all duration-200 z-40 ${\n isMinimized ? 'h-11 w-80' : 'h-96 w-96 sm:w-[480px]'\n } ${className || ''}`}\n >\n {/* Top Header Bar */}\n <div className=\"flex items-center justify-between px-3 py-2 bg-slate-950 border-b border-slate-800 shrink-0 select-none\">\n <div className=\"flex items-center gap-2\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"relative flex h-2 w-2\">\n <span className=\"animate-ping absolute inline-flex h-full w-full rounded-full bg-emerald-400 opacity-75\" />\n <span className=\"relative inline-flex rounded-full h-2 w-2 bg-emerald-500\" />\n </span>\n <span className=\"font-mono text-xs font-bold text-slate-200\">LIVE DEBUGGER</span>\n </div>\n\n <div className=\"h-3 w-px bg-slate-700 mx-1\" />\n\n {/* Tab Switcher */}\n {!isMinimized && (\n <div className=\"flex items-center bg-slate-900 rounded-md p-0.5 border border-slate-800\">\n <button\n type=\"button\"\n data-testid=\"debugger-tab-form\"\n onClick={() => setActiveTab('form')}\n className={`px-2 py-0.5 text-[11px] font-medium rounded transition flex items-center gap-1 cursor-pointer ${\n activeTab === 'form'\n ? 'bg-blue-600 text-white font-semibold'\n : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n <Sliders className=\"w-3 h-3\" />\n <span>Form State</span>\n {hasFormErrors && (\n <span className=\"px-1 py-0.2 text-[9px] bg-red-500 text-white rounded-full font-bold\">\n {errorCount}\n </span>\n )}\n </button>\n <button\n type=\"button\"\n data-testid=\"debugger-tab-logs\"\n onClick={() => setActiveTab('logs')}\n className={`px-2 py-0.5 text-[11px] font-medium rounded transition flex items-center gap-1 cursor-pointer ${\n activeTab === 'logs'\n ? 'bg-blue-600 text-white font-semibold'\n : 'text-slate-400 hover:text-slate-200'\n }`}\n >\n <Terminal className=\"w-3 h-3\" />\n <span>Action Logs</span>\n {actionLogs.length > 0 && (\n <span className=\"px-1 py-0.2 text-[9px] bg-slate-700 text-slate-200 rounded-full font-bold\">\n {actionLogs.length}\n </span>\n )}\n </button>\n </div>\n )}\n </div>\n\n {/* Window Controls */}\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n data-testid=\"debugger-minimize-btn\"\n title={isMinimized ? 'Expand Debugger' : 'Minimize Debugger'}\n onClick={() => setIsMinimized(!isMinimized)}\n className=\"p-1 text-slate-400 hover:text-slate-200 hover:bg-slate-800 rounded transition cursor-pointer\"\n >\n {isMinimized ? <Maximize2 className=\"w-3.5 h-3.5\" /> : <Minimize2 className=\"w-3.5 h-3.5\" />}\n </button>\n <button\n type=\"button\"\n data-testid=\"debugger-close-btn\"\n title=\"Close Debugger\"\n onClick={() => {\n setActionDebuggerOpen(false);\n onClose?.();\n }}\n className=\"p-1 text-slate-400 hover:text-red-400 hover:bg-slate-800 rounded transition cursor-pointer\"\n >\n <X className=\"w-3.5 h-3.5\" />\n </button>\n </div>\n </div>\n\n {/* Body Area */}\n {!isMinimized && (\n <div className=\"flex-1 overflow-hidden flex flex-col min-h-0 bg-slate-900\">\n {activeTab === 'form' ? (\n /* Live Form State Tab */\n <div className=\"flex-1 overflow-y-auto p-3 flex flex-col gap-3 font-sans text-xs\">\n {/* Form Status Banner */}\n <div className=\"flex items-center justify-between p-2 rounded-lg bg-slate-950 border border-slate-800\">\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[11px] text-slate-400 font-medium\">Status:</span>\n {liveFormState?.isSubmitting ? (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-amber-500/20 text-amber-400 border border-amber-500/30 flex items-center gap-1\">\n <span className=\"animate-spin w-2.5 h-2.5 border-2 border-amber-400 border-t-transparent rounded-full\" />\n Submitting...\n </span>\n ) : liveFormState?.isValid === false || hasFormErrors ? (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-red-500/20 text-red-400 border border-red-500/30\">\n Invalid\n </span>\n ) : (\n <span className=\"px-1.5 py-0.5 rounded text-[10px] font-bold bg-emerald-500/20 text-emerald-400 border border-emerald-500/30\">\n Valid / Ready\n </span>\n )}\n </div>\n\n <div className=\"flex items-center gap-1.5\">\n <span className=\"text-[11px] text-slate-400 font-medium\">Dirty:</span>\n <span\n className={`px-1.5 py-0.5 rounded text-[10px] font-semibold ${\n liveFormState?.dirty\n ? 'bg-blue-500/20 text-blue-300'\n : 'bg-slate-800 text-slate-400'\n }`}\n >\n {liveFormState?.dirty ? 'Yes' : 'No'}\n </span>\n </div>\n </div>\n\n <button\n type=\"button\"\n data-testid=\"reset-form-btn\"\n onClick={handleResetForm}\n className=\"px-2 py-1 text-[11px] text-slate-300 hover:text-white bg-slate-800 hover:bg-slate-700 border border-slate-700 rounded transition flex items-center gap-1 cursor-pointer\"\n >\n <RotateCcw className=\"w-3 h-3\" />\n <span>Reset Form</span>\n </button>\n </div>\n\n {/* Form Values Section */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] font-bold text-slate-400 uppercase tracking-wider flex items-center gap-1\">\n <FileCode className=\"w-3.5 h-3.5 text-blue-400\" />\n <span>Live Form Values (JSON)</span>\n </span>\n <button\n type=\"button\"\n data-testid=\"copy-values-btn\"\n onClick={() =>\n handleCopy(\n JSON.stringify(liveFormState?.values || {}, null, 2),\n 'values',\n )\n }\n className=\"text-[10px] text-slate-400 hover:text-slate-200 flex items-center gap-1 px-1.5 py-0.5 rounded hover:bg-slate-800 transition cursor-pointer\"\n >\n {copiedSection === 'values' ? (\n <>\n <Check className=\"w-3 h-3 text-emerald-400\" />\n <span className=\"text-emerald-400\">Copied!</span>\n </>\n ) : (\n <>\n <Copy className=\"w-3 h-3\" />\n <span>Copy JSON</span>\n </>\n )}\n </button>\n </div>\n <div\n data-testid=\"form-values-json\"\n className=\"p-2.5 rounded-lg bg-slate-950 border border-slate-800 font-mono text-[11px] text-emerald-300 max-h-36 overflow-y-auto whitespace-pre leading-relaxed select-text\"\n >\n {JSON.stringify(liveFormState?.values || {}, null, 2)}\n </div>\n </div>\n\n {/* Form Errors Section */}\n <div className=\"flex flex-col gap-1.5\">\n <div className=\"flex items-center justify-between\">\n <span className=\"text-[11px] font-bold text-slate-400 uppercase tracking-wider flex items-center gap-1\">\n <AlertCircle className=\"w-3.5 h-3.5 text-red-400\" />\n <span>{`Validation Errors (${errorCount})`}</span>\n </span>\n </div>\n {hasFormErrors ? (\n <div\n data-testid=\"form-errors-list\"\n className=\"flex flex-col gap-1.5 max-h-32 overflow-y-auto\"\n >\n {Object.entries(liveFormState?.errors || {}).map(([field, err]) => (\n <div\n key={field}\n className=\"flex items-start gap-2 p-2 rounded bg-red-950/40 border border-red-900/50 text-red-200 text-xs\"\n >\n <span className=\"font-mono font-bold text-red-400 shrink-0\">\n {field}:\n </span>\n <span className=\"flex-1\">{err}</span>\n </div>\n ))}\n </div>\n ) : (\n <div\n data-testid=\"no-errors-badge\"\n className=\"p-2 rounded bg-slate-950 border border-slate-800/80 text-slate-500 text-xs flex items-center gap-1.5\"\n >\n <CheckCircle2 className=\"w-3.5 h-3.5 text-emerald-500\" />\n <span>No validation errors. Form passes all active rules.</span>\n </div>\n )}\n </div>\n </div>\n ) : (\n /* Action Execution Logs Tab */\n <div className=\"flex-1 overflow-y-auto p-3 flex flex-col gap-2.5 font-sans text-xs\">\n <div className=\"flex items-center justify-between pb-1 border-b border-slate-800\">\n <span className=\"text-[11px] font-bold text-slate-400 uppercase tracking-wider\">\n Dispatched Actions ({actionLogs.length})\n </span>\n {actionLogs.length > 0 && (\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n data-testid=\"copy-logs-btn\"\n onClick={() => handleCopy(JSON.stringify(actionLogs, null, 2), 'logs')}\n className=\"text-[10px] text-slate-400 hover:text-slate-200 flex items-center gap-1 px-1.5 py-0.5 rounded hover:bg-slate-800 transition cursor-pointer\"\n >\n {copiedSection === 'logs' ? (\n <>\n <Check className=\"w-3 h-3 text-emerald-400\" />\n <span className=\"text-emerald-400\">Copied!</span>\n </>\n ) : (\n <>\n <Copy className=\"w-3 h-3\" />\n <span>Copy All</span>\n </>\n )}\n </button>\n <button\n type=\"button\"\n data-testid=\"clear-logs-btn\"\n onClick={clearActionLogs}\n className=\"text-[10px] text-slate-400 hover:text-red-400 flex items-center gap-1 px-1.5 py-0.5 rounded hover:bg-slate-800 transition cursor-pointer\"\n >\n <Trash2 className=\"w-3 h-3\" />\n <span>Clear</span>\n </button>\n </div>\n )}\n </div>\n\n {actionLogs.length === 0 ? (\n <div\n data-testid=\"empty-logs-state\"\n className=\"flex-1 flex flex-col items-center justify-center p-6 text-center text-slate-500 gap-1.5\"\n >\n <Activity className=\"w-6 h-6 text-slate-600 animate-pulse\" />\n <span className=\"text-xs font-medium text-slate-400\">No actions executed yet.</span>\n <span className=\"text-[10px] text-slate-500 max-w-[280px]\">\n Interact with buttons, inputs, or form submissions in the preview canvas to watch live action dispatches.\n </span>\n </div>\n ) : (\n <div className=\"flex flex-col gap-2\" data-testid=\"action-logs-list\">\n {actionLogs.map((log) => {\n const isExpanded = expandedLogId === log.id;\n const isSuccess = log.status === 'success';\n const isError = log.status === 'error';\n\n return (\n <div\n key={log.id}\n data-testid={`action-log-entry-${log.id}`}\n className=\"rounded-lg bg-slate-950 border border-slate-800 overflow-hidden text-xs transition\"\n >\n {/* Log Item Header */}\n <div\n onClick={() => setExpandedLogId(isExpanded ? null : log.id)}\n className=\"flex items-center justify-between p-2 hover:bg-slate-800/50 cursor-pointer select-none gap-2\"\n >\n <div className=\"flex items-center gap-1.5 min-w-0\">\n {isSuccess ? (\n <CheckCircle2 className=\"w-3.5 h-3.5 text-emerald-400 shrink-0\" />\n ) : isError ? (\n <XCircle className=\"w-3.5 h-3.5 text-red-400 shrink-0\" />\n ) : (\n <Clock className=\"w-3.5 h-3.5 text-amber-400 shrink-0 animate-spin\" />\n )}\n <span className=\"font-mono text-[11px] font-bold text-blue-400 truncate\">\n {log.actionType}\n </span>\n <span className=\"px-1 py-0.2 rounded text-[9px] font-semibold bg-slate-800 text-slate-300\">\n {log.trigger}\n </span>\n </div>\n\n <div className=\"flex items-center gap-1.5 shrink-0\">\n <span className=\"text-[10px] font-mono text-slate-500\">\n {log.timestamp.slice(11, 19)}\n </span>\n {isExpanded ? (\n <ChevronDown className=\"w-3 h-3 text-slate-400\" />\n ) : (\n <ChevronRight className=\"w-3 h-3 text-slate-400\" />\n )}\n </div>\n </div>\n\n {/* Expanded Payload & Result Details */}\n {isExpanded && (\n <div className=\"p-2.5 border-t border-slate-800/80 bg-slate-950/70 flex flex-col gap-2 font-mono text-[10px]\">\n {log.payload && (\n <div>\n <span className=\"text-slate-400 font-bold block mb-0.5\">Payload:</span>\n <div className=\"p-1.5 rounded bg-slate-900 border border-slate-800 text-emerald-300 overflow-x-auto whitespace-pre\">\n {JSON.stringify(log.payload, null, 2)}\n </div>\n </div>\n )}\n\n {log.output !== undefined && (\n <div>\n <span className=\"text-slate-400 font-bold block mb-0.5\">Output / Result:</span>\n <div className=\"p-1.5 rounded bg-slate-900 border border-slate-800 text-blue-300 overflow-x-auto whitespace-pre\">\n {JSON.stringify(log.output, null, 2)}\n </div>\n </div>\n )}\n\n {log.error && (\n <div>\n <span className=\"text-red-400 font-bold block mb-0.5\">Error:</span>\n <div className=\"p-1.5 rounded bg-red-950/50 border border-red-900/50 text-red-300 overflow-x-auto\">\n {log.error}\n </div>\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n )}\n </div>\n )}\n </div>\n );\n};\n","import React from 'react';\nimport { StyleSectorId } from '../components/style-manager/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 Preview / Edit mode toggle button. Default: true */\n showPreviewToggle?: boolean;\n /** Display Action Debugger toggle button in preview mode. Default: true */\n showActionDebugger?: 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 showPreviewToggle: boolean;\n showActionDebugger: 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 showPreviewToggle: toolbarCfg.showPreviewToggle ?? true,\n showActionDebugger: toolbarCfg.showActionDebugger ?? 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_lucide_react","import_react","import_core","document","import_react","import_lucide_react","nextText","newCursorPos","document","import_jsx_runtime","document","import_lucide_react","import_jsx_runtime","document","import_jsx_runtime","document","meta","import_react","import_components","import_core","import_jsx_runtime","document","React","import_react","import_components","import_core","import_core","import_lucide_react","import_jsx_runtime","document","import_jsx_runtime","document","container","policy","import_react","import_components","import_core","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_react","import_lucide_react","import_jsx_runtime","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_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_react","import_lucide_react","import_jsx_runtime","import_lucide_react","import_jsx_runtime","document","React"]}