@kubuild/editor 0.1.3 → 0.3.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.
- package/README.md +106 -0
- package/dist/ai/enhance-node.d.ts +100 -0
- package/dist/ai/enhance-node.d.ts.map +1 -0
- package/dist/ai/generate-page.d.ts +80 -0
- package/dist/ai/generate-page.d.ts.map +1 -0
- package/dist/ai/index.d.ts +3 -0
- package/dist/ai/index.d.ts.map +1 -0
- package/dist/components/action-builder/action-branch-editor.d.ts +18 -0
- package/dist/components/action-builder/action-branch-editor.d.ts.map +1 -0
- package/dist/components/action-builder/action-builder-modal.d.ts +32 -0
- package/dist/components/action-builder/action-builder-modal.d.ts.map +1 -0
- package/dist/components/action-builder/action-step-form.d.ts +71 -0
- package/dist/components/action-builder/action-step-form.d.ts.map +1 -0
- package/dist/components/action-builder/index.d.ts +4 -0
- package/dist/components/action-builder/index.d.ts.map +1 -0
- package/dist/components/ai-chat/ai-chat-panel.d.ts +66 -0
- package/dist/components/ai-chat/ai-chat-panel.d.ts.map +1 -0
- package/dist/components/ai-chat/index.d.ts +2 -0
- package/dist/components/ai-chat/index.d.ts.map +1 -0
- package/dist/components/canvas/breadcrumbs.d.ts.map +1 -0
- package/dist/components/canvas/canvas-pan-zoom.d.ts +61 -0
- package/dist/components/canvas/canvas-pan-zoom.d.ts.map +1 -0
- package/dist/components/canvas/canvas.d.ts +63 -0
- package/dist/components/canvas/canvas.d.ts.map +1 -0
- package/dist/components/canvas/distance-meter.d.ts +27 -0
- package/dist/components/canvas/distance-meter.d.ts.map +1 -0
- package/dist/components/canvas/floating-badges.d.ts.map +1 -0
- package/dist/components/canvas/grid-guidelines-overlay.d.ts +18 -0
- package/dist/components/canvas/grid-guidelines-overlay.d.ts.map +1 -0
- package/dist/components/canvas/index.d.ts +13 -0
- package/dist/components/canvas/index.d.ts.map +1 -0
- package/dist/components/canvas/marquee-selection.d.ts +25 -0
- package/dist/components/canvas/marquee-selection.d.ts.map +1 -0
- package/dist/components/canvas/multi-device-preview.d.ts +30 -0
- package/dist/components/canvas/multi-device-preview.d.ts.map +1 -0
- package/dist/components/canvas/resize-handles.d.ts +18 -0
- package/dist/components/canvas/resize-handles.d.ts.map +1 -0
- package/dist/components/canvas/smart-guides.d.ts +37 -0
- package/dist/components/canvas/smart-guides.d.ts.map +1 -0
- package/dist/components/canvas/spacing-sliders.d.ts +21 -0
- package/dist/components/canvas/spacing-sliders.d.ts.map +1 -0
- package/dist/components/canvas/viewport-resizer.d.ts +83 -0
- package/dist/components/canvas/viewport-resizer.d.ts.map +1 -0
- package/dist/components/index.d.ts +10 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/{editor.d.ts → components/layout/editor.d.ts} +12 -1
- package/dist/components/layout/editor.d.ts.map +1 -0
- package/dist/components/layout/index.d.ts +3 -0
- package/dist/components/layout/index.d.ts.map +1 -0
- package/dist/components/layout/toolbar.d.ts +17 -0
- package/dist/components/layout/toolbar.d.ts.map +1 -0
- package/dist/components/modals/asset-manager-modal.d.ts.map +1 -0
- package/dist/components/modals/code-viewer-modal.d.ts.map +1 -0
- package/dist/components/modals/import-modal.d.ts.map +1 -0
- package/dist/components/modals/index.d.ts +4 -0
- package/dist/components/modals/index.d.ts.map +1 -0
- package/dist/components/panels/action-debugger-panel.d.ts +11 -0
- package/dist/components/panels/action-debugger-panel.d.ts.map +1 -0
- package/dist/components/panels/action-prop-control.d.ts +30 -0
- package/dist/components/panels/action-prop-control.d.ts.map +1 -0
- package/dist/components/panels/blocks-panel.d.ts.map +1 -0
- package/dist/{component-panel.d.ts → components/panels/component-panel.d.ts} +2 -0
- package/dist/components/panels/component-panel.d.ts.map +1 -0
- package/dist/components/panels/form-validation-rules-panel.d.ts +27 -0
- package/dist/components/panels/form-validation-rules-panel.d.ts.map +1 -0
- package/dist/components/panels/index.d.ts +10 -0
- package/dist/components/panels/index.d.ts.map +1 -0
- package/dist/{inspector-panel.d.ts → components/panels/inspector-panel.d.ts} +7 -1
- package/dist/components/panels/inspector-panel.d.ts.map +1 -0
- package/dist/{layers-panel.d.ts → components/panels/layers-panel.d.ts} +4 -0
- package/dist/components/panels/layers-panel.d.ts.map +1 -0
- package/dist/{left-sidebar.d.ts → components/panels/left-sidebar.d.ts} +1 -1
- package/dist/components/panels/left-sidebar.d.ts.map +1 -0
- package/dist/{traits-panel.d.ts → components/panels/traits-panel.d.ts} +3 -1
- package/dist/components/panels/traits-panel.d.ts.map +1 -0
- package/dist/components/style-manager/auto-layout-controls.d.ts +24 -0
- package/dist/components/style-manager/auto-layout-controls.d.ts.map +1 -0
- package/dist/components/style-manager/box-model-editor.d.ts.map +1 -0
- package/dist/components/style-manager/color-gradient-picker.d.ts +35 -0
- package/dist/components/style-manager/color-gradient-picker.d.ts.map +1 -0
- package/dist/components/style-manager/design-tokens-panel.d.ts +30 -0
- package/dist/components/style-manager/design-tokens-panel.d.ts.map +1 -0
- package/dist/{dimension-sector-controls.d.ts → components/style-manager/dimension-sector-controls.d.ts} +12 -1
- package/dist/components/style-manager/dimension-sector-controls.d.ts.map +1 -0
- package/dist/components/style-manager/effects-sector-controls.d.ts +52 -0
- package/dist/components/style-manager/effects-sector-controls.d.ts.map +1 -0
- package/dist/components/style-manager/grid-controls.d.ts +19 -0
- package/dist/components/style-manager/grid-controls.d.ts.map +1 -0
- package/dist/components/style-manager/index.d.ts +12 -0
- package/dist/components/style-manager/index.d.ts.map +1 -0
- package/dist/components/style-manager/inheritance-indicator.d.ts +52 -0
- package/dist/components/style-manager/inheritance-indicator.d.ts.map +1 -0
- package/dist/components/style-manager/motion-sector-controls.d.ts.map +1 -0
- package/dist/{style-manager-accordion.d.ts → components/style-manager/style-manager-accordion.d.ts} +10 -0
- package/dist/components/style-manager/style-manager-accordion.d.ts.map +1 -0
- package/dist/{typography-sector-controls.d.ts → components/style-manager/typography-sector-controls.d.ts} +4 -0
- package/dist/components/style-manager/typography-sector-controls.d.ts.map +1 -0
- package/dist/components/table-editor/index.d.ts +2 -0
- package/dist/components/table-editor/index.d.ts.map +1 -0
- package/dist/components/table-editor/table-spreadsheet-editor.d.ts.map +1 -0
- package/dist/components/ui/code-highlighter.d.ts.map +1 -0
- package/dist/components/ui/icons.d.ts.map +1 -0
- package/dist/components/ui/index.d.ts +5 -0
- package/dist/components/ui/index.d.ts.map +1 -0
- package/dist/components/ui/variable-autocomplete-input.d.ts +42 -0
- package/dist/components/ui/variable-autocomplete-input.d.ts.map +1 -0
- package/dist/components/ui/variable-picker.d.ts.map +1 -0
- package/dist/config/ai-config.d.ts +69 -0
- package/dist/config/ai-config.d.ts.map +1 -0
- package/dist/{config.d.ts → config/config.d.ts} +72 -4
- package/dist/config/config.d.ts.map +1 -0
- package/dist/config/index.d.ts +3 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/index.cjs +16649 -5163
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +3 -23
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16825 -5322
- package/dist/index.js.map +1 -1
- package/dist/store/index.d.ts +2 -0
- package/dist/store/index.d.ts.map +1 -0
- package/dist/store/store.d.ts +272 -0
- package/dist/store/store.d.ts.map +1 -0
- package/dist/utils/ai-context.d.ts +25 -0
- package/dist/utils/ai-context.d.ts.map +1 -0
- package/dist/utils/document-scanner.d.ts +35 -0
- package/dist/utils/document-scanner.d.ts.map +1 -0
- package/dist/{export-utils.d.ts → utils/export-utils.d.ts} +8 -0
- package/dist/utils/export-utils.d.ts.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/package.json +8 -6
- package/dist/asset-manager-modal.d.ts.map +0 -1
- package/dist/blocks-panel.d.ts.map +0 -1
- package/dist/box-model-editor.d.ts.map +0 -1
- package/dist/breadcrumbs.d.ts.map +0 -1
- package/dist/canvas.d.ts +0 -16
- package/dist/canvas.d.ts.map +0 -1
- package/dist/code-highlighter.d.ts.map +0 -1
- package/dist/code-viewer-modal.d.ts.map +0 -1
- package/dist/component-panel.d.ts.map +0 -1
- package/dist/config.d.ts.map +0 -1
- package/dist/dimension-sector-controls.d.ts.map +0 -1
- package/dist/editor.d.ts.map +0 -1
- package/dist/export-utils.d.ts.map +0 -1
- package/dist/floating-badges.d.ts.map +0 -1
- package/dist/icons.d.ts.map +0 -1
- package/dist/import-modal.d.ts.map +0 -1
- package/dist/inspector-panel.d.ts.map +0 -1
- package/dist/layers-panel.d.ts.map +0 -1
- package/dist/left-sidebar.d.ts.map +0 -1
- package/dist/motion-sector-controls.d.ts.map +0 -1
- package/dist/store.d.ts +0 -103
- package/dist/store.d.ts.map +0 -1
- package/dist/style-manager-accordion.d.ts.map +0 -1
- package/dist/table-spreadsheet-editor.d.ts.map +0 -1
- package/dist/toolbar.d.ts +0 -11
- package/dist/toolbar.d.ts.map +0 -1
- package/dist/traits-panel.d.ts.map +0 -1
- package/dist/typography-sector-controls.d.ts.map +0 -1
- package/dist/variable-picker.d.ts.map +0 -1
- /package/dist/{breadcrumbs.d.ts → components/canvas/breadcrumbs.d.ts} +0 -0
- /package/dist/{floating-badges.d.ts → components/canvas/floating-badges.d.ts} +0 -0
- /package/dist/{asset-manager-modal.d.ts → components/modals/asset-manager-modal.d.ts} +0 -0
- /package/dist/{code-viewer-modal.d.ts → components/modals/code-viewer-modal.d.ts} +0 -0
- /package/dist/{import-modal.d.ts → components/modals/import-modal.d.ts} +0 -0
- /package/dist/{blocks-panel.d.ts → components/panels/blocks-panel.d.ts} +0 -0
- /package/dist/{box-model-editor.d.ts → components/style-manager/box-model-editor.d.ts} +0 -0
- /package/dist/{motion-sector-controls.d.ts → components/style-manager/motion-sector-controls.d.ts} +0 -0
- /package/dist/{table-spreadsheet-editor.d.ts → components/table-editor/table-spreadsheet-editor.d.ts} +0 -0
- /package/dist/{code-highlighter.d.ts → components/ui/code-highlighter.d.ts} +0 -0
- /package/dist/{icons.d.ts → components/ui/icons.d.ts} +0 -0
- /package/dist/{variable-picker.d.ts → components/ui/variable-picker.d.ts} +0 -0
package/README.md
ADDED
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# @kubuild/editor
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@kubuild/editor)
|
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
|
5
|
+
[](https://www.typescriptlang.org/)
|
|
6
|
+
|
|
7
|
+
Visual page builder editor for **KUBUILD** featuring an interactive canvas, Action Builder modal, Form Validation & Debugger panels, variable autocomplete, style manager, and mobile-responsive layout.
|
|
8
|
+
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
## 📦 Installation
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
# Using pnpm (recommended)
|
|
15
|
+
pnpm add @kubuild/editor @kubuild/components @kubuild/core @kubuild/renderer @kubuild/schema react react-dom zustand lucide-react
|
|
16
|
+
|
|
17
|
+
# Using npm
|
|
18
|
+
npm install @kubuild/editor @kubuild/components @kubuild/core @kubuild/renderer @kubuild/schema react react-dom zustand lucide-react
|
|
19
|
+
|
|
20
|
+
# Using yarn
|
|
21
|
+
yarn add @kubuild/editor @kubuild/components @kubuild/core @kubuild/renderer @kubuild/schema react react-dom zustand lucide-react
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
## ✨ Features
|
|
27
|
+
|
|
28
|
+
- **Interactive Visual Canvas**:
|
|
29
|
+
- Drag-and-drop components and pre-built starter blocks from side panels onto the canvas with real-time drop indicators.
|
|
30
|
+
- Inline text editing with rich styling support.
|
|
31
|
+
- Multi-viewport switcher (Desktop, Tablet, Mobile) with zoom, pan, and alignment guides.
|
|
32
|
+
- Breadcrumbs navigator and tree hierarchy layers panel.
|
|
33
|
+
- **Action Builder System**:
|
|
34
|
+
- `ActionBuilderModal`: Visual modal for composing multi-step action workflows (`onClick`, `onSubmit`, `onChange`).
|
|
35
|
+
- `ActionStepForm`: Dedicated configuration forms for API requests, Toast feedback, Modal toggles, Navigation, and Custom handlers.
|
|
36
|
+
- `ActionBranchEditor`: Visual branch management for handling Success and Error outcomes in asynchronous actions.
|
|
37
|
+
- **Form Validation & Live Debugger**:
|
|
38
|
+
- `ActionDebuggerPanel`: Real-time inspection of runtime state, form input values, and live action execution logs.
|
|
39
|
+
- `FormValidationRulesPanel`: Visual editor for managing form field validation rules (required, regex, email, min/max length).
|
|
40
|
+
- **Variable System & Autocomplete**:
|
|
41
|
+
- `VariableAutocompleteInput` & Textarea: Intelligent suggestion popups for template variables (e.g. `{{form.email}}`, `{{user.name}}`).
|
|
42
|
+
- `VariablePicker`: Hierarchical variable catalog for browsing available data sources.
|
|
43
|
+
- **Style Manager Accordion**:
|
|
44
|
+
- Granular control over Dimensions, Typography, Backgrounds, Borders, Layouts (Flexbox & CSS Grid), Spacing (Box Model), and Motion/Animations.
|
|
45
|
+
- **Mobile & Touch Friendly**:
|
|
46
|
+
- Adaptive toolbar and bottom navigation bar for mobile devices.
|
|
47
|
+
- Pointer and touch event drag support for floating navigator and table spreadsheet modals.
|
|
48
|
+
- Responsive slide-over drawer drawers for sidebars and inspectors.
|
|
49
|
+
- **State Management**:
|
|
50
|
+
- High-performance reactive store built on Zustand, seamlessly wired to `@kubuild/core` CommandEngine for unlimited undo/redo.
|
|
51
|
+
|
|
52
|
+
---
|
|
53
|
+
|
|
54
|
+
## 🚀 Quick Usage
|
|
55
|
+
|
|
56
|
+
### Embedding the Editor
|
|
57
|
+
|
|
58
|
+
```tsx
|
|
59
|
+
import React from 'react';
|
|
60
|
+
import { Editor, useEditorStore } from '@kubuild/editor';
|
|
61
|
+
import type { PageDocument } from '@kubuild/schema';
|
|
62
|
+
|
|
63
|
+
const initialPage: PageDocument = {
|
|
64
|
+
schema: 'stora.page',
|
|
65
|
+
version: '1.0.0',
|
|
66
|
+
metadata: { title: 'New Web Page' },
|
|
67
|
+
document: {
|
|
68
|
+
id: 'root',
|
|
69
|
+
type: 'container',
|
|
70
|
+
children: []
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
export const PageBuilderApp: React.FC = () => {
|
|
75
|
+
return (
|
|
76
|
+
<div style={{ width: '100vw', height: '100vh' }}>
|
|
77
|
+
<Editor
|
|
78
|
+
initialDocument={initialPage}
|
|
79
|
+
onSave={(document) => {
|
|
80
|
+
console.log('Saved document:', document);
|
|
81
|
+
}}
|
|
82
|
+
onExport={(format, data) => {
|
|
83
|
+
console.log(`Exported as ${format}:`, data);
|
|
84
|
+
}}
|
|
85
|
+
/>
|
|
86
|
+
</div>
|
|
87
|
+
);
|
|
88
|
+
};
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Accessing Editor State Programmatically
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { useEditorStore } from '@kubuild/editor';
|
|
95
|
+
|
|
96
|
+
// Access active selection or trigger commands outside the canvas
|
|
97
|
+
const selectedNodeId = useEditorStore((state) => state.selectedNodeId);
|
|
98
|
+
const undo = useEditorStore((state) => state.undo);
|
|
99
|
+
const redo = useEditorStore((state) => state.redo);
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## 📄 License
|
|
105
|
+
|
|
106
|
+
MIT © [KUBUILD](https://github.com/kustora/kubuild)
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import type { Node, StyleDefinition } from '@kubuild/schema';
|
|
2
|
+
import type { AiRefactorNodeRequest } from '@kubuild/ai';
|
|
3
|
+
import type { DocumentSecurityLimits } from '@kubuild/core';
|
|
4
|
+
/**
|
|
5
|
+
* STORA-513 — one changed prop/style/state field between the original node and an AI
|
|
6
|
+
* enhance candidate. `path` is a dotted pointer such as `props.label`,
|
|
7
|
+
* `styles.base.color`, or `styles.states.:hover.color` — used to render a targeted diff
|
|
8
|
+
* line instead of a full object dump (explicitly disallowed by the ticket).
|
|
9
|
+
*/
|
|
10
|
+
export interface EnhanceFieldDiff {
|
|
11
|
+
path: string;
|
|
12
|
+
before: unknown;
|
|
13
|
+
after: unknown;
|
|
14
|
+
}
|
|
15
|
+
export interface EnhanceNodeDiff {
|
|
16
|
+
fields: EnhanceFieldDiff[];
|
|
17
|
+
/**
|
|
18
|
+
* True when the candidate's `children` subtree differs structurally from the
|
|
19
|
+
* original (not just a props/styles tweak) — e.g. the AI regenerated nested content.
|
|
20
|
+
* `updateNodeProps`/`updateNodeStyle` can't express this; Apply (STORA-514) falls back
|
|
21
|
+
* to the `replaceNode` command engine command when this is true.
|
|
22
|
+
*/
|
|
23
|
+
childrenChanged: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* STORA-513 — pure diff between an original node and a validated AI enhance candidate.
|
|
27
|
+
* Only ever surfaces props/styles(+pseudo-state) fields that actually changed, plus a
|
|
28
|
+
* coarse `childrenChanged` flag — never a full node dump.
|
|
29
|
+
*/
|
|
30
|
+
export declare function diffEnhanceNode(original: Node, candidate: Node): EnhanceNodeDiff;
|
|
31
|
+
export type EnhanceNodeOutcome = {
|
|
32
|
+
status: 'success';
|
|
33
|
+
originalNode: Node;
|
|
34
|
+
candidateNode: Node;
|
|
35
|
+
}
|
|
36
|
+
/** Network/provider/abort failure — already surfaced via `useAiGenerator`'s own `error` state. */
|
|
37
|
+
| {
|
|
38
|
+
status: 'no-result';
|
|
39
|
+
}
|
|
40
|
+
/** The candidate failed the STORA-509 normalize/validate pipeline. */
|
|
41
|
+
| {
|
|
42
|
+
status: 'invalid';
|
|
43
|
+
message: string;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* STORA-512 — wires `useAiGenerator().refactorNode` into the same document-safety
|
|
47
|
+
* pipeline `generate-page.ts` uses for `streamPage` sections: the raw result is
|
|
48
|
+
* re-validated through `@kubuild/ai`'s `normalizeAndValidateRefactoredNode` (normalize ->
|
|
49
|
+
* Zod schema validate -> `validateDocumentSecurity`) *before* it is ever shown to the
|
|
50
|
+
* user as a candidate. This is defense-in-depth, exactly like `runStreamPageGeneration`:
|
|
51
|
+
* regardless of whether the configured provider already validated server-side via
|
|
52
|
+
* `KubuildAiEngine`, a host's custom HTTP endpoint may not have.
|
|
53
|
+
*
|
|
54
|
+
* Critically, this function never touches the document or the command engine — it only
|
|
55
|
+
* ever returns a candidate for the caller to hold in local/component state. The original
|
|
56
|
+
* node is not mutated until the caller explicitly applies the result (STORA-514).
|
|
57
|
+
*/
|
|
58
|
+
export declare function runEnhanceNode(refactorNode: (params: AiRefactorNodeRequest) => Promise<Node | null>, params: AiRefactorNodeRequest, deps?: {
|
|
59
|
+
securityLimits?: DocumentSecurityLimits;
|
|
60
|
+
}): Promise<EnhanceNodeOutcome>;
|
|
61
|
+
export interface EnhanceCandidate {
|
|
62
|
+
originalNode: Node;
|
|
63
|
+
candidateNode: Node;
|
|
64
|
+
diff: EnhanceNodeDiff;
|
|
65
|
+
}
|
|
66
|
+
export interface ApplyEnhanceResult {
|
|
67
|
+
success: boolean;
|
|
68
|
+
error?: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Dependency-injected store bindings for `applyEnhanceCandidate` (STORA-514) — mirrors
|
|
72
|
+
* `StreamPageGenerationDeps` in `generate-page.ts`: every mutation goes through the exact
|
|
73
|
+
* same store actions manual editing uses (`updateNodeProps`/`updateNodeStyle`/
|
|
74
|
+
* `updateNodeStateStyle`), so it lands in `DocumentHistoryManager` and `undo()` reverts it.
|
|
75
|
+
*/
|
|
76
|
+
export interface ApplyEnhanceCandidateDeps {
|
|
77
|
+
updateNodeProps: (nodeId: string, props: Record<string, unknown>, merge: boolean) => ApplyEnhanceResult;
|
|
78
|
+
updateNodeStyle: (nodeId: string, styles: StyleDefinition, breakpoint: 'base' | 'desktop' | 'tablet' | 'mobile', merge: boolean) => ApplyEnhanceResult;
|
|
79
|
+
updateNodeStateStyle: (nodeId: string, styles: StyleDefinition, state: string, merge: boolean) => ApplyEnhanceResult;
|
|
80
|
+
/** Only invoked when `diff.childrenChanged` — falls back to the `replaceNode` command. */
|
|
81
|
+
replaceNodeSubtree: (nodeId: string, node: Node) => ApplyEnhanceResult;
|
|
82
|
+
/** Groups a multi-field apply (props + several style layers) into one undo entry. */
|
|
83
|
+
beginHistoryTransaction: () => void;
|
|
84
|
+
endHistoryTransaction: () => void;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* STORA-514 — applies a validated enhance candidate through the command engine, the same
|
|
88
|
+
* path manual editing already uses. Reuses `updateNodeProps`/`updateNodeStyle` for the
|
|
89
|
+
* common case (only props/styles changed); falls back to a whole-subtree `replaceNode`
|
|
90
|
+
* only when `diff.childrenChanged` is true, since `updateNodeProps`/`updateNodeStyle`
|
|
91
|
+
* can't express a nested-children change.
|
|
92
|
+
*
|
|
93
|
+
* The `replaceNode` fallback re-attaches the *original* node's `animation`/`actions`/
|
|
94
|
+
* `formConfig` onto the candidate before dispatching: `normalizeAndValidateRefactoredNode`
|
|
95
|
+
* never reads or preserves those fields (the AI enhance pipeline is props/styles/children
|
|
96
|
+
* only), so without this the candidate would silently wipe out any existing interactivity
|
|
97
|
+
* config on Apply.
|
|
98
|
+
*/
|
|
99
|
+
export declare function applyEnhanceCandidate(candidate: EnhanceCandidate, deps: ApplyEnhanceCandidateDeps): ApplyEnhanceResult;
|
|
100
|
+
//# sourceMappingURL=enhance-node.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"enhance-node.d.ts","sourceRoot":"","sources":["../../src/ai/enhance-node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAEzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,eAAe,CAAC;AAE5D;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,KAAK,EAAE,OAAO,CAAC;CAChB;AAED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,gBAAgB,EAAE,CAAC;IAC3B;;;;;OAKG;IACH,eAAe,EAAE,OAAO,CAAC;CAC1B;AAWD;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,GAAG,eAAe,CA+ChF;AAED,MAAM,MAAM,kBAAkB,GAC1B;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,IAAI,CAAC;IAAC,aAAa,EAAE,IAAI,CAAA;CAAE;AAChE,kGAAkG;GAChG;IAAE,MAAM,EAAE,WAAW,CAAA;CAAE;AACzB,sEAAsE;GACpE;IAAE,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C;;;;;;;;;;;;GAYG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,CAAC,MAAM,EAAE,qBAAqB,KAAK,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,EACrE,MAAM,EAAE,qBAAqB,EAC7B,IAAI,GAAE;IAAE,cAAc,CAAC,EAAE,sBAAsB,CAAA;CAAO,GACrD,OAAO,CAAC,kBAAkB,CAAC,CAgB7B;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,IAAI,CAAC;IACnB,aAAa,EAAE,IAAI,CAAC;IACpB,IAAI,EAAE,eAAe,CAAC;CACvB;AAED,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,OAAO,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED;;;;;GAKG;AACH,MAAM,WAAW,yBAAyB;IACxC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,kBAAkB,CAAC;IACxG,eAAe,EAAE,CACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,EACpD,KAAK,EAAE,OAAO,KACX,kBAAkB,CAAC;IACxB,oBAAoB,EAAE,CACpB,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,eAAe,EACvB,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,OAAO,KACX,kBAAkB,CAAC;IACxB,0FAA0F;IAC1F,kBAAkB,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,kBAAkB,CAAC;IACvE,qFAAqF;IACrF,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,qBAAqB,EAAE,MAAM,IAAI,CAAC;CACnC;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,qBAAqB,CACnC,SAAS,EAAE,gBAAgB,EAC3B,IAAI,EAAE,yBAAyB,GAC9B,kBAAkB,CA6DpB"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { PageDocument } from '@kubuild/schema';
|
|
2
|
+
import type { AiGeneratePageRequest, AiStreamCallbacks } from '@kubuild/ai';
|
|
3
|
+
import { type CommandResult, type DocumentSecurityLimits, type Diagnostic } from '@kubuild/core';
|
|
4
|
+
/**
|
|
5
|
+
* Progressive-preview status for one `streamPage` session (STORA-508). A canvas/chat
|
|
6
|
+
* panel subscribes to this via `StreamPageGenerationDeps.onPlaceholderChange` to show a
|
|
7
|
+
* loading placeholder for the section currently being generated, and to hide it the
|
|
8
|
+
* instant the real section lands (the real section is rendered by the normal
|
|
9
|
+
* store -> `KubuildRenderer` path, not a separate preview tree).
|
|
10
|
+
*/
|
|
11
|
+
export interface AiGenerationPlaceholderStatus {
|
|
12
|
+
/** True while more sections are still expected in this streaming session. */
|
|
13
|
+
active: boolean;
|
|
14
|
+
totalSections: number;
|
|
15
|
+
completedSections: number;
|
|
16
|
+
currentLabel?: string;
|
|
17
|
+
}
|
|
18
|
+
export interface StreamPageGenerationDeps {
|
|
19
|
+
/** The editor store's `dispatch` — the only sanctioned document mutation path. */
|
|
20
|
+
dispatch: (executor: (doc: PageDocument) => CommandResult) => void;
|
|
21
|
+
/** Reads the live document (called fresh on every section so ids stay collision-free). */
|
|
22
|
+
getDocument: () => PageDocument;
|
|
23
|
+
/** Groups every section inserted during the session into one undo entry (STORA-510). */
|
|
24
|
+
beginHistoryTransaction: () => void;
|
|
25
|
+
endHistoryTransaction: () => void;
|
|
26
|
+
/** Reused non-fatal reporting channel — same `onDiagnostic` prop used elsewhere in the editor. */
|
|
27
|
+
onDiagnostic?: (diagnostic: Diagnostic) => void;
|
|
28
|
+
/** STORA-508 progressive-preview hook. */
|
|
29
|
+
onPlaceholderChange?: (status: AiGenerationPlaceholderStatus | null) => void;
|
|
30
|
+
/** Same security limits `.stora` import uses; omit to use `@kubuild/core`'s defaults. */
|
|
31
|
+
securityLimits?: DocumentSecurityLimits;
|
|
32
|
+
/** Insertion target for generated sections. Defaults to the document's root page node. */
|
|
33
|
+
parentId?: string;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Pure visibility rule for the STORA-508 canvas placeholder — kept as a standalone
|
|
37
|
+
* function (rather than inlined JSX conditionals) so it's trivially unit-testable
|
|
38
|
+
* without needing to render the canvas: the placeholder only ever shows on the active
|
|
39
|
+
* artboard, never in preview mode, and only while a generation session reports itself
|
|
40
|
+
* as still active.
|
|
41
|
+
*/
|
|
42
|
+
export declare function shouldShowAiGenerationPlaceholder(params: {
|
|
43
|
+
isActive: boolean;
|
|
44
|
+
previewMode: boolean;
|
|
45
|
+
aiGenerationStatus: AiGenerationPlaceholderStatus | null | undefined;
|
|
46
|
+
}): boolean;
|
|
47
|
+
export interface StreamPageGenerationSummary {
|
|
48
|
+
insertedSectionIds: string[];
|
|
49
|
+
failedSectionCount: number;
|
|
50
|
+
totalSections: number;
|
|
51
|
+
/** Whether the stream itself emitted an `error` event (network/provider/parse failure). */
|
|
52
|
+
streamErrored: boolean;
|
|
53
|
+
}
|
|
54
|
+
type StreamPageFn = (params: AiGeneratePageRequest, callbacks?: AiStreamCallbacks) => Promise<PageDocument | null>;
|
|
55
|
+
/**
|
|
56
|
+
* STORA-507/509/510 — wires `useAiGenerator().streamPage()` into the editor's command
|
|
57
|
+
* engine and history.
|
|
58
|
+
*
|
|
59
|
+
* Every `section` event is independently re-run through `@kubuild/ai`'s
|
|
60
|
+
* `normalizeAndValidateSectionNode` — the same normalize -> Zod schema validate ->
|
|
61
|
+
* `validateDocumentSecurity` pipeline used for `.stora` import (docs/ARCHITECTURE.md
|
|
62
|
+
* §31/§40) — before ever being dispatched as `insertNode`. This is defense-in-depth:
|
|
63
|
+
* it re-validates regardless of whether the configured provider already went through
|
|
64
|
+
* `KubuildAiEngine` server-side (a host's custom HTTP endpoint may not have).
|
|
65
|
+
*
|
|
66
|
+
* - **Partial success (STORA-507)**: a section that fails validation, or that fails to
|
|
67
|
+
* insert (e.g. an id collision `insertNode` rejects), is reported via `onDiagnostic`
|
|
68
|
+
* and skipped — it never blocks subsequent sections. Because validation always runs
|
|
69
|
+
* strictly before dispatch, every section that *is* inserted is independently valid,
|
|
70
|
+
* so the document is never left in a partially-invalid state, including when the
|
|
71
|
+
* stream later emits an `error` event.
|
|
72
|
+
* - **Progressive preview (STORA-508)**: `onPlaceholderChange` fires as each section
|
|
73
|
+
* starts/finishes generating so a canvas placeholder can be shown/hidden; the real
|
|
74
|
+
* section renders through the exact same store/renderer path as any manual edit.
|
|
75
|
+
* - **Batched history (STORA-510)**: the whole session is wrapped in one history
|
|
76
|
+
* transaction, so a single `undo()` reverts every section this call inserted.
|
|
77
|
+
*/
|
|
78
|
+
export declare function runStreamPageGeneration(streamPage: StreamPageFn, params: AiGeneratePageRequest, deps: StreamPageGenerationDeps): Promise<StreamPageGenerationSummary>;
|
|
79
|
+
export {};
|
|
80
|
+
//# sourceMappingURL=generate-page.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-page.d.ts","sourceRoot":"","sources":["../../src/ai/generate-page.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAQ,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,qBAAqB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAE5E,OAAO,EAIL,KAAK,aAAa,EAClB,KAAK,sBAAsB,EAC3B,KAAK,UAAU,EAChB,MAAM,eAAe,CAAC;AAEvB;;;;;;GAMG;AACH,MAAM,WAAW,6BAA6B;IAC5C,6EAA6E;IAC7E,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,wBAAwB;IACvC,kFAAkF;IAClF,QAAQ,EAAE,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,YAAY,KAAK,aAAa,KAAK,IAAI,CAAC;IACnE,0FAA0F;IAC1F,WAAW,EAAE,MAAM,YAAY,CAAC;IAChC,wFAAwF;IACxF,uBAAuB,EAAE,MAAM,IAAI,CAAC;IACpC,qBAAqB,EAAE,MAAM,IAAI,CAAC;IAClC,kGAAkG;IAClG,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAChD,0CAA0C;IAC1C,mBAAmB,CAAC,EAAE,CAAC,MAAM,EAAE,6BAA6B,GAAG,IAAI,KAAK,IAAI,CAAC;IAC7E,yFAAyF;IACzF,cAAc,CAAC,EAAE,sBAAsB,CAAC;IACxC,0FAA0F;IAC1F,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,wBAAgB,iCAAiC,CAAC,MAAM,EAAE;IACxD,QAAQ,EAAE,OAAO,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,kBAAkB,EAAE,6BAA6B,GAAG,IAAI,GAAG,SAAS,CAAC;CACtE,GAAG,OAAO,CAEV;AAED,MAAM,WAAW,2BAA2B;IAC1C,kBAAkB,EAAE,MAAM,EAAE,CAAC;IAC7B,kBAAkB,EAAE,MAAM,CAAC;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,2FAA2F;IAC3F,aAAa,EAAE,OAAO,CAAC;CACxB;AAED,KAAK,YAAY,GAAG,CAClB,MAAM,EAAE,qBAAqB,EAC7B,SAAS,CAAC,EAAE,iBAAiB,KAC1B,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAsB,uBAAuB,CAC3C,UAAU,EAAE,YAAY,EACxB,MAAM,EAAE,qBAAqB,EAC7B,IAAI,EAAE,wBAAwB,GAC7B,OAAO,CAAC,2BAA2B,CAAC,CAmGtC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/ai/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ActionStep, PageDocument } from '@kubuild/schema';
|
|
3
|
+
export interface ActionBranchEditorProps {
|
|
4
|
+
parentStep: ActionStep;
|
|
5
|
+
document?: PageDocument;
|
|
6
|
+
onUpdateSuccessSteps: (steps: ActionStep[]) => void;
|
|
7
|
+
onUpdateErrorSteps: (steps: ActionStep[]) => void;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface BranchLaneProps {
|
|
11
|
+
branchType: 'success' | 'error';
|
|
12
|
+
steps: ActionStep[];
|
|
13
|
+
document?: PageDocument;
|
|
14
|
+
onUpdateSteps: (steps: ActionStep[]) => void;
|
|
15
|
+
}
|
|
16
|
+
export declare const BranchLane: React.FC<BranchLaneProps>;
|
|
17
|
+
export declare const ActionBranchEditor: React.FC<ActionBranchEditorProps>;
|
|
18
|
+
//# sourceMappingURL=action-branch-editor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-branch-editor.d.ts","sourceRoot":"","sources":["../../../src/components/action-builder/action-branch-editor.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AACxC,OAAO,EACL,UAAU,EAEV,YAAY,EACb,MAAM,iBAAiB,CAAC;AAmBzB,MAAM,WAAW,uBAAuB;IACtC,UAAU,EAAE,UAAU,CAAC;IACvB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,oBAAoB,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IACpD,kBAAkB,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;IAClD,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC;IAChC,KAAK,EAAE,UAAU,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,aAAa,EAAE,CAAC,KAAK,EAAE,UAAU,EAAE,KAAK,IAAI,CAAC;CAC9C;AAED,eAAO,MAAM,UAAU,EAAE,KAAK,CAAC,EAAE,CAAC,eAAe,CAsQhD,CAAC;AAEF,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CAuChE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { PageDocument, ActionStep, ActionStepType, ActionTriggerType } from '@kubuild/schema';
|
|
3
|
+
export interface ActionBuilderModalProps {
|
|
4
|
+
isOpen: boolean;
|
|
5
|
+
onClose: () => void;
|
|
6
|
+
nodeId?: string | null;
|
|
7
|
+
initialTrigger?: ActionTriggerType;
|
|
8
|
+
document?: PageDocument;
|
|
9
|
+
}
|
|
10
|
+
export interface TriggerMeta {
|
|
11
|
+
type: ActionTriggerType;
|
|
12
|
+
label: string;
|
|
13
|
+
description: string;
|
|
14
|
+
badge: string;
|
|
15
|
+
}
|
|
16
|
+
export declare const TRIGGER_OPTIONS: TriggerMeta[];
|
|
17
|
+
export interface StepTypeMeta {
|
|
18
|
+
type: ActionStepType;
|
|
19
|
+
label: string;
|
|
20
|
+
description: string;
|
|
21
|
+
category: 'network' | 'ui' | 'navigation' | 'state' | 'utility';
|
|
22
|
+
icon: React.ComponentType<{
|
|
23
|
+
className?: string;
|
|
24
|
+
}>;
|
|
25
|
+
defaultPayload: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
export declare const STEP_TYPE_OPTIONS: StepTypeMeta[];
|
|
28
|
+
export declare function getStepTypeMeta(type: ActionStepType): StepTypeMeta;
|
|
29
|
+
export declare function getCategoryBadgeClass(category: 'network' | 'ui' | 'navigation' | 'state' | 'utility'): string;
|
|
30
|
+
export declare function formatStepSummary(step: ActionStep): string;
|
|
31
|
+
export declare const ActionBuilderModal: React.FC<ActionBuilderModalProps>;
|
|
32
|
+
//# sourceMappingURL=action-builder-modal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-builder-modal.d.ts","sourceRoot":"","sources":["../../../src/components/action-builder/action-builder-modal.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAoD,MAAM,OAAO,CAAC;AACzE,OAAO,EACL,YAAY,EAEZ,UAAU,EACV,cAAc,EACd,iBAAiB,EAClB,MAAM,iBAAiB,CAAC;AA6BzB,MAAM,WAAW,uBAAuB;IACtC,MAAM,EAAE,OAAO,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,cAAc,CAAC,EAAE,iBAAiB,CAAC;IACnC,QAAQ,CAAC,EAAE,YAAY,CAAC;CACzB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,iBAAiB,CAAC;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,eAAO,MAAM,eAAe,EAAE,WAAW,EAqCxC,CAAC;AAEF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,cAAc,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,CAAC;IAChE,IAAI,EAAE,KAAK,CAAC,aAAa,CAAC;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAClD,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAED,eAAO,MAAM,iBAAiB,EAAE,YAAY,EAkG3C,CAAC;AAEF,wBAAgB,eAAe,CAAC,IAAI,EAAE,cAAc,GAAG,YAAY,CAWlE;AAED,wBAAgB,qBAAqB,CAAC,QAAQ,EAAE,SAAS,GAAG,IAAI,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAc7G;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM,CA6C1D;AAED,eAAO,MAAM,kBAAkB,EAAE,KAAK,CAAC,EAAE,CAAC,uBAAuB,CA+qBhE,CAAC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { ActionStep, PageDocument } from '@kubuild/schema';
|
|
3
|
+
export interface ActionStepFormProps {
|
|
4
|
+
step: ActionStep;
|
|
5
|
+
document?: PageDocument;
|
|
6
|
+
onUpdatePayload: (payload: Record<string, unknown>) => void;
|
|
7
|
+
onUpdateMeta?: (meta: {
|
|
8
|
+
label?: string;
|
|
9
|
+
timeout?: number;
|
|
10
|
+
continueOnError?: boolean;
|
|
11
|
+
}) => void;
|
|
12
|
+
onUpdateBranches?: (branches: {
|
|
13
|
+
onSuccess?: ActionStep[];
|
|
14
|
+
onError?: ActionStep[];
|
|
15
|
+
}) => void;
|
|
16
|
+
className?: string;
|
|
17
|
+
hideBranches?: boolean;
|
|
18
|
+
}
|
|
19
|
+
export interface KeyValueEditorProps {
|
|
20
|
+
title: string;
|
|
21
|
+
entries: Record<string, unknown> | undefined;
|
|
22
|
+
onChange: (updated: Record<string, string>) => void;
|
|
23
|
+
document?: PageDocument;
|
|
24
|
+
keyPlaceholder?: string;
|
|
25
|
+
valuePlaceholder?: string;
|
|
26
|
+
emptyLabel?: string;
|
|
27
|
+
}
|
|
28
|
+
export declare const KeyValueEditor: React.FC<KeyValueEditorProps>;
|
|
29
|
+
export declare const ApiRequestStepForm: React.FC<{
|
|
30
|
+
payload: Record<string, unknown>;
|
|
31
|
+
document?: PageDocument;
|
|
32
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
33
|
+
}>;
|
|
34
|
+
export declare const ShowToastStepForm: React.FC<{
|
|
35
|
+
payload: Record<string, unknown>;
|
|
36
|
+
document?: PageDocument;
|
|
37
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
38
|
+
}>;
|
|
39
|
+
export declare const NavigateStepForm: React.FC<{
|
|
40
|
+
payload: Record<string, unknown>;
|
|
41
|
+
document?: PageDocument;
|
|
42
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
43
|
+
}>;
|
|
44
|
+
export declare const ModalStepForm: React.FC<{
|
|
45
|
+
payload: Record<string, unknown>;
|
|
46
|
+
isOpenAction: boolean;
|
|
47
|
+
document?: PageDocument;
|
|
48
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
49
|
+
}>;
|
|
50
|
+
export declare const SetStateStepForm: React.FC<{
|
|
51
|
+
payload: Record<string, unknown>;
|
|
52
|
+
document?: PageDocument;
|
|
53
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
54
|
+
}>;
|
|
55
|
+
export declare const ResetFormStepForm: React.FC<{
|
|
56
|
+
payload: Record<string, unknown>;
|
|
57
|
+
document?: PageDocument;
|
|
58
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
59
|
+
}>;
|
|
60
|
+
export declare const CopyClipboardStepForm: React.FC<{
|
|
61
|
+
payload: Record<string, unknown>;
|
|
62
|
+
document?: PageDocument;
|
|
63
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
64
|
+
}>;
|
|
65
|
+
export declare const CustomEventStepForm: React.FC<{
|
|
66
|
+
payload: Record<string, unknown>;
|
|
67
|
+
document?: PageDocument;
|
|
68
|
+
onChange: (payload: Record<string, unknown>) => void;
|
|
69
|
+
}>;
|
|
70
|
+
export declare const ActionStepForm: React.FC<ActionStepFormProps>;
|
|
71
|
+
//# sourceMappingURL=action-step-form.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"action-step-form.d.ts","sourceRoot":"","sources":["../../../src/components/action-builder/action-step-form.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/action-builder/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC;AACvC,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { PageDocument } from '@kubuild/schema';
|
|
3
|
+
import { type Diagnostic } from '@kubuild/core';
|
|
4
|
+
import { ComponentRegistry } from '@kubuild/components';
|
|
5
|
+
import type { AiChatHistoryStorageAdapter } from '@kubuild/ai/react';
|
|
6
|
+
import type { AiChatMessage } from '@kubuild/ai';
|
|
7
|
+
import { ResolvedAiEditorConfig } from '../../config';
|
|
8
|
+
export interface AiChatPanelProps {
|
|
9
|
+
/** Fully-resolved AI config (STORA-501) — panel must only ever be mounted when this is enabled. */
|
|
10
|
+
aiConfig: ResolvedAiEditorConfig;
|
|
11
|
+
/** `'hidden'` is handled by the caller not mounting this component at all. */
|
|
12
|
+
mode: 'docked' | 'floating';
|
|
13
|
+
onClose?: () => void;
|
|
14
|
+
onToggleMode?: () => void;
|
|
15
|
+
className?: string;
|
|
16
|
+
/**
|
|
17
|
+
* Seeds `useAiChat`'s message history (e.g. a persisted chat restored by the host, or a
|
|
18
|
+
* fixture in tests). Passed straight through to `useAiChat({ initialMessages })`.
|
|
19
|
+
*/
|
|
20
|
+
initialMessages?: AiChatMessage[];
|
|
21
|
+
/**
|
|
22
|
+
* Optional chat history persistence adapter (STORA-520), passed straight through to
|
|
23
|
+
* `useAiChat({ historyStorage })`. Without it, chat history stays pure in-memory React
|
|
24
|
+
* state and is lost on reload — exactly as before. Hosts can implement this with
|
|
25
|
+
* `localStorage`, a Stora.page backend call, etc.; `@kubuild/ai`/`@kubuild/editor`
|
|
26
|
+
* never assume a concrete storage mechanism.
|
|
27
|
+
*/
|
|
28
|
+
historyStorage?: AiChatHistoryStorageAdapter;
|
|
29
|
+
/**
|
|
30
|
+
* Optional overrides for the document/selection this panel builds AI context from,
|
|
31
|
+
* following the same prop-over-store precedence as `InspectorPanel`. Falls back to the
|
|
32
|
+
* live editor store when omitted — real usage should always omit these.
|
|
33
|
+
*/
|
|
34
|
+
document?: PageDocument;
|
|
35
|
+
selectedNodeId?: string | null;
|
|
36
|
+
/**
|
|
37
|
+
* Component registry used to validate an AI enhance candidate's props before Apply
|
|
38
|
+
* (STORA-514), the same registry manual editing (`InspectorPanel`) validates against.
|
|
39
|
+
* Defaults to `createDefaultComponentRegistry()` so existing callers/tests that predate
|
|
40
|
+
* STORA-512 keep compiling without passing one.
|
|
41
|
+
*/
|
|
42
|
+
registry?: ComponentRegistry;
|
|
43
|
+
/**
|
|
44
|
+
* Non-fatal reporting channel for full-page generation (STORA-507/509) — the same
|
|
45
|
+
* `onDiagnostic` prop `KubuildEditorProps` already exposes for import/validation
|
|
46
|
+
* diagnostics elsewhere in the editor. A section that fails validation is reported
|
|
47
|
+
* here and skipped; it never silently corrupts the document or blocks other sections.
|
|
48
|
+
*/
|
|
49
|
+
onDiagnostic?: (diagnostic: Diagnostic) => void;
|
|
50
|
+
}
|
|
51
|
+
/** Exported for isolated unit testing (STORA-505) — the loading/typing bubble. */
|
|
52
|
+
export declare function AiChatTypingIndicator(): React.JSX.Element;
|
|
53
|
+
/** Exported for isolated unit testing (STORA-505) — a single user/assistant chat bubble. */
|
|
54
|
+
export declare function AiChatBubble({ message }: {
|
|
55
|
+
message: AiChatMessage;
|
|
56
|
+
}): React.JSX.Element;
|
|
57
|
+
/**
|
|
58
|
+
* Exported for isolated unit testing (STORA-505) — network/provider error bubble with a
|
|
59
|
+
* Retry action, never a silent fail (PRD §4 NFR-5 graceful degradation).
|
|
60
|
+
*/
|
|
61
|
+
export declare function AiChatErrorBubble({ message, onRetry, }: {
|
|
62
|
+
message: string;
|
|
63
|
+
onRetry: () => void;
|
|
64
|
+
}): React.JSX.Element;
|
|
65
|
+
export declare const AiChatPanel: React.FC<AiChatPanelProps>;
|
|
66
|
+
//# sourceMappingURL=ai-chat-panel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ai-chat-panel.d.ts","sourceRoot":"","sources":["../../../src/components/ai-chat/ai-chat-panel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA+C,MAAM,OAAO,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAC9D,OAAO,EAAE,iBAAiB,EAAkC,MAAM,qBAAqB,CAAC;AAExF,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AA2BtD,MAAM,WAAW,gBAAgB;IAC/B,mGAAmG;IACnG,QAAQ,EAAE,sBAAsB,CAAC;IACjC,8EAA8E;IAC9E,IAAI,EAAE,QAAQ,GAAG,UAAU,CAAC;IAC5B,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,aAAa,EAAE,CAAC;IAClC;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,2BAA2B,CAAC;IAC7C;;;;OAIG;IACH,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B;;;;;OAKG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;;OAKG;IACH,YAAY,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;CACjD;AAsCD,kFAAkF;AAClF,wBAAgB,qBAAqB,sBAYpC;AAED,4FAA4F;AAC5F,wBAAgB,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE;IAAE,OAAO,EAAE,aAAa,CAAA;CAAE,qBA0BnE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,EAChC,OAAO,EACP,OAAO,GACR,EAAE;IACD,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB,qBAsBA;AAED,eAAO,MAAM,WAAW,EAAE,KAAK,CAAC,EAAE,CAAC,gBAAgB,CAmqBlD,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/ai-chat/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"breadcrumbs.d.ts","sourceRoot":"","sources":["../../../src/components/canvas/breadcrumbs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,iBAAiB,EAAkC,MAAM,qBAAqB,CAAC;AAIxF,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,QAAQ,CAAC,EAAE,YAAY,CAAC;IACxB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;GAIG;AACH,eAAO,MAAM,oBAAoB,EAAE,KAAK,CAAC,EAAE,CAAC,yBAAyB,CA2EpE,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface CanvasPanZoomState {
|
|
3
|
+
pan: {
|
|
4
|
+
x: number;
|
|
5
|
+
y: number;
|
|
6
|
+
};
|
|
7
|
+
zoom: number;
|
|
8
|
+
isPanning: boolean;
|
|
9
|
+
isSpacePressed: boolean;
|
|
10
|
+
}
|
|
11
|
+
export interface CanvasZoomToolbarProps {
|
|
12
|
+
zoom: number;
|
|
13
|
+
onZoomChange: (newZoom: number) => void;
|
|
14
|
+
onReset: () => void;
|
|
15
|
+
onFit?: () => void;
|
|
16
|
+
className?: string;
|
|
17
|
+
/** Active navigation tool mode: 'select' (V) or 'hand' (H) */
|
|
18
|
+
toolMode?: 'select' | 'hand';
|
|
19
|
+
/** Callback when user changes navigation tool mode */
|
|
20
|
+
onToolModeChange?: (mode: 'select' | 'hand') => void;
|
|
21
|
+
/** Whether multi-device side-by-side preview mode is active (STORA-143) */
|
|
22
|
+
multiDeviceMode?: boolean;
|
|
23
|
+
/** Callback to toggle multi-device preview mode (STORA-143) */
|
|
24
|
+
onToggleMultiDevice?: () => void;
|
|
25
|
+
}
|
|
26
|
+
export declare const MIN_ZOOM = 0.25;
|
|
27
|
+
export declare const MAX_ZOOM = 2;
|
|
28
|
+
export declare function clampZoom(val: number): number;
|
|
29
|
+
/**
|
|
30
|
+
* Zoom Presets Toolbar (STORA-131).
|
|
31
|
+
* Supports presets (50%, 75%, 100%, 150%, Fit) and step in/out buttons.
|
|
32
|
+
*/
|
|
33
|
+
export declare const CanvasZoomToolbar: React.FC<CanvasZoomToolbarProps>;
|
|
34
|
+
export interface UseCanvasPanZoomOptions {
|
|
35
|
+
containerRef: React.RefObject<HTMLElement | null>;
|
|
36
|
+
enabled?: boolean;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Hook for Canvas Pan (Trackpad swipe, Hand tool, Space+Drag, Middle-click) & Zoom (Cmd/Ctrl + Wheel) (STORA-130, STORA-131).
|
|
40
|
+
*/
|
|
41
|
+
export declare function useCanvasPanZoom({ containerRef, enabled, }: UseCanvasPanZoomOptions): {
|
|
42
|
+
pan: {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
};
|
|
46
|
+
setPan: React.Dispatch<React.SetStateAction<{
|
|
47
|
+
x: number;
|
|
48
|
+
y: number;
|
|
49
|
+
}>>;
|
|
50
|
+
zoom: number;
|
|
51
|
+
setZoom: React.Dispatch<React.SetStateAction<number>>;
|
|
52
|
+
isPanning: boolean;
|
|
53
|
+
isSpacePressed: boolean;
|
|
54
|
+
toolMode: "select" | "hand";
|
|
55
|
+
setToolMode: React.Dispatch<React.SetStateAction<"select" | "hand">>;
|
|
56
|
+
cursorStyle: string | undefined;
|
|
57
|
+
handlePointerDown: (e: React.PointerEvent) => void;
|
|
58
|
+
resetPanZoom: () => void;
|
|
59
|
+
fitPanZoom: () => void;
|
|
60
|
+
};
|
|
61
|
+
//# sourceMappingURL=canvas-pan-zoom.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canvas-pan-zoom.d.ts","sourceRoot":"","sources":["../../../src/components/canvas/canvas-pan-zoom.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmD,MAAM,OAAO,CAAC;AAGxE,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,8DAA8D;IAC9D,QAAQ,CAAC,EAAE,QAAQ,GAAG,MAAM,CAAC;IAC7B,sDAAsD;IACtD,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,QAAQ,GAAG,MAAM,KAAK,IAAI,CAAC;IACrD,2EAA2E;IAC3E,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,+DAA+D;IAC/D,mBAAmB,CAAC,EAAE,MAAM,IAAI,CAAC;CAClC;AAED,eAAO,MAAM,QAAQ,OAAO,CAAC;AAC7B,eAAO,MAAM,QAAQ,IAAM,CAAC;AAE5B,wBAAgB,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAE7C;AAED;;;GAGG;AACH,eAAO,MAAM,iBAAiB,EAAE,KAAK,CAAC,EAAE,CAAC,sBAAsB,CAyL9D,CAAC;AAEF,MAAM,WAAW,uBAAuB;IACtC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClD,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAC/B,YAAY,EACZ,OAAc,GACf,EAAE,uBAAuB;;WACY,MAAM;WAAK,MAAM;;;WAAjB,MAAM;WAAK,MAAM;;;;;;;;;2BAiG/C,KAAK,CAAC,YAAY;;;EAmFzB"}
|