@cocoar/vue-page-builder 2.1.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 (65) hide show
  1. package/dist/CoarPageBuilder.vue.d.ts +21 -0
  2. package/dist/CoarPageBuilder.vue.d.ts.map +1 -0
  3. package/dist/CoarPageRenderer.vue.d.ts +22 -0
  4. package/dist/CoarPageRenderer.vue.d.ts.map +1 -0
  5. package/dist/PageNode.vue.d.ts +7 -0
  6. package/dist/PageNode.vue.d.ts.map +1 -0
  7. package/dist/builder/BuilderCanvas.vue.d.ts +3 -0
  8. package/dist/builder/BuilderCanvas.vue.d.ts.map +1 -0
  9. package/dist/builder/BuilderCanvasNode.vue.d.ts +9 -0
  10. package/dist/builder/BuilderCanvasNode.vue.d.ts.map +1 -0
  11. package/dist/builder/BuilderOutline.vue.d.ts +3 -0
  12. package/dist/builder/BuilderOutline.vue.d.ts.map +1 -0
  13. package/dist/builder/BuilderOutlineNode.vue.d.ts +14 -0
  14. package/dist/builder/BuilderOutlineNode.vue.d.ts.map +1 -0
  15. package/dist/builder/BuilderPropsPanel.vue.d.ts +3 -0
  16. package/dist/builder/BuilderPropsPanel.vue.d.ts.map +1 -0
  17. package/dist/builder/builderContext.d.ts +10 -0
  18. package/dist/builder/builderContext.d.ts.map +1 -0
  19. package/dist/builder/nodeDefaults.d.ts +14 -0
  20. package/dist/builder/nodeDefaults.d.ts.map +1 -0
  21. package/dist/builder/operations.d.ts +21 -0
  22. package/dist/builder/operations.d.ts.map +1 -0
  23. package/dist/builder/props/ButtonProps.vue.d.ts +8 -0
  24. package/dist/builder/props/ButtonProps.vue.d.ts.map +1 -0
  25. package/dist/builder/props/CardProps.vue.d.ts +8 -0
  26. package/dist/builder/props/CardProps.vue.d.ts.map +1 -0
  27. package/dist/builder/props/CheckboxProps.vue.d.ts +8 -0
  28. package/dist/builder/props/CheckboxProps.vue.d.ts.map +1 -0
  29. package/dist/builder/props/HeadingProps.vue.d.ts +8 -0
  30. package/dist/builder/props/HeadingProps.vue.d.ts.map +1 -0
  31. package/dist/builder/props/ImageProps.vue.d.ts +8 -0
  32. package/dist/builder/props/ImageProps.vue.d.ts.map +1 -0
  33. package/dist/builder/props/LinkProps.vue.d.ts +8 -0
  34. package/dist/builder/props/LinkProps.vue.d.ts.map +1 -0
  35. package/dist/builder/props/ParagraphProps.vue.d.ts +8 -0
  36. package/dist/builder/props/ParagraphProps.vue.d.ts.map +1 -0
  37. package/dist/builder/props/SectionProps.vue.d.ts +8 -0
  38. package/dist/builder/props/SectionProps.vue.d.ts.map +1 -0
  39. package/dist/builder/props/SelectProps.vue.d.ts +8 -0
  40. package/dist/builder/props/SelectProps.vue.d.ts.map +1 -0
  41. package/dist/builder/props/SpacerProps.vue.d.ts +8 -0
  42. package/dist/builder/props/SpacerProps.vue.d.ts.map +1 -0
  43. package/dist/builder/props/StackProps.vue.d.ts +8 -0
  44. package/dist/builder/props/StackProps.vue.d.ts.map +1 -0
  45. package/dist/builder/props/StyleProps.vue.d.ts +8 -0
  46. package/dist/builder/props/StyleProps.vue.d.ts.map +1 -0
  47. package/dist/builder/props/TextInputProps.vue.d.ts +8 -0
  48. package/dist/builder/props/TextInputProps.vue.d.ts.map +1 -0
  49. package/dist/builder/props/registry.d.ts +15 -0
  50. package/dist/builder/props/registry.d.ts.map +1 -0
  51. package/dist/builder/useBuilderDnd.d.ts +26 -0
  52. package/dist/builder/useBuilderDnd.d.ts.map +1 -0
  53. package/dist/builder/usePageBuilder.d.ts +28 -0
  54. package/dist/builder/usePageBuilder.d.ts.map +1 -0
  55. package/dist/builder/useSchemaValidation.d.ts +28 -0
  56. package/dist/builder/useSchemaValidation.d.ts.map +1 -0
  57. package/dist/context.d.ts +24 -0
  58. package/dist/context.d.ts.map +1 -0
  59. package/dist/index.css +2 -0
  60. package/dist/index.d.ts +6 -0
  61. package/dist/index.d.ts.map +1 -0
  62. package/dist/index.js +2454 -0
  63. package/dist/schema.d.ts +185 -0
  64. package/dist/schema.d.ts.map +1 -0
  65. package/package.json +47 -0
@@ -0,0 +1,21 @@
1
+ import { PageNode, PageConfig } from './schema';
2
+ type __VLS_Props = {
3
+ /**
4
+ * Security/allowlist config. The SAME config must also be passed to
5
+ * `<CoarPageRenderer>` so disallowed elements are filtered both during
6
+ * authoring (palette + add-child menu) and at render time (security boundary).
7
+ */
8
+ config?: PageConfig;
9
+ };
10
+ type __VLS_PublicProps = {
11
+ modelValue?: PageNode;
12
+ } & __VLS_Props;
13
+ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
14
+ "update:modelValue": (value: PageNode) => any;
15
+ }, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
16
+ "onUpdate:modelValue"?: ((value: PageNode) => any) | undefined;
17
+ }>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
18
+ rootRef: HTMLDivElement;
19
+ }, HTMLDivElement>;
20
+ export default _default;
21
+ //# sourceMappingURL=CoarPageBuilder.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoarPageBuilder.vue.d.ts","sourceRoot":"","sources":["../src/CoarPageBuilder.vue"],"names":[],"mappings":"AA6rBA,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAerD,KAAK,WAAW,GAAG;IACjB;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,CAAC;AA8JF,KAAK,iBAAiB,GAAG;IACzB,UAAU,CAAC,EAAE,QAAQ,CAAC;CACrB,GAAG,WAAW,CAAC;;;;;;;;AAygBhB,wBASG"}
@@ -0,0 +1,22 @@
1
+ import { PageNode, PageConfig } from './schema';
2
+ import { ActionHandler, CustomValidator } from './context';
3
+ type __VLS_Props = {
4
+ schema: PageNode;
5
+ actions?: Record<string, ActionHandler>;
6
+ /**
7
+ * Developer-only: async or complex cross-field validation that cannot be
8
+ * expressed declaratively. Returns fieldName → error message.
9
+ * Not exposed in the builder UI — tenant-facing rules live in the schema.
10
+ */
11
+ onValidate?: CustomValidator;
12
+ assetResolver?: (id: string) => string;
13
+ /**
14
+ * Security/allowlist config. Disallowed element types are skipped at render
15
+ * time even if they appear in the schema — this is the security boundary
16
+ * for hand-written or tampered-with JSON.
17
+ */
18
+ config?: PageConfig;
19
+ };
20
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
21
+ export default _default;
22
+ //# sourceMappingURL=CoarPageRenderer.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CoarPageRenderer.vue.d.ts","sourceRoot":"","sources":["../src/CoarPageRenderer.vue"],"names":[],"mappings":"AA8KA,OAAO,KAAK,EAAE,QAAQ,EAA2C,UAAU,EAAE,MAAM,UAAU,CAAC;AAC9F,OAAO,EAEL,KAAK,aAAa,EAElB,KAAK,eAAe,EAErB,MAAM,WAAW,CAAC;AAGnB,KAAK,WAAW,GAAG;IACjB,MAAM,EAAE,QAAQ,CAAA;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC;;;;OAIG;IACH,UAAU,CAAC,EAAE,eAAe,CAAA;IAC5B,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;IACtC;;;;OAIG;IACH,MAAM,CAAC,EAAE,UAAU,CAAA;CACpB,CAAC;;AAsLF,wBAOG"}
@@ -0,0 +1,7 @@
1
+ import { PageNode } from './schema';
2
+ type __VLS_Props = {
3
+ node: PageNode;
4
+ };
5
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
6
+ export default _default;
7
+ //# sourceMappingURL=PageNode.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PageNode.vue.d.ts","sourceRoot":"","sources":["../src/PageNode.vue"],"names":[],"mappings":"AA+VA,OAAO,EAAoB,KAAK,QAAQ,EAAkB,MAAM,UAAU,CAAC;AAK3E,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;;AA2gBtC,wBAMG"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
3
+ //# sourceMappingURL=BuilderCanvas.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderCanvas.vue.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderCanvas.vue"],"names":[],"mappings":";AAgiBA,wBAMG"}
@@ -0,0 +1,9 @@
1
+ import { PageNode } from '../schema';
2
+ import { NodePath } from './operations';
3
+ interface Props {
4
+ node: PageNode;
5
+ path: NodePath;
6
+ }
7
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
8
+ export default _default;
9
+ //# sourceMappingURL=BuilderCanvasNode.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderCanvasNode.vue.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderCanvasNode.vue"],"names":[],"mappings":"AA+pBA,OAAO,EAAmB,KAAK,QAAQ,EAAoB,MAAM,WAAW,CAAC;AAG7E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI7C,UAAU,KAAK;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;CAChB;;AA2mBD,wBAOG"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLDivElement>;
2
+ export default _default;
3
+ //# sourceMappingURL=BuilderOutline.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderOutline.vue.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderOutline.vue"],"names":[],"mappings":";AAuFA,wBAMG"}
@@ -0,0 +1,14 @@
1
+ import { PageNode } from '../schema';
2
+ import { NodePath } from './operations';
3
+ interface Props {
4
+ node: PageNode;
5
+ path: NodePath;
6
+ depth?: number;
7
+ }
8
+ declare const _default: import('vue').DefineComponent<Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<Props> & Readonly<{}>, {
9
+ depth: number;
10
+ }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
11
+ addMenuRoot: HTMLDivElement;
12
+ }, HTMLDivElement>;
13
+ export default _default;
14
+ //# sourceMappingURL=BuilderOutlineNode.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderOutlineNode.vue.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderOutlineNode.vue"],"names":[],"mappings":"AAghBA,OAAO,EAAqC,KAAK,QAAQ,EAAoB,MAAM,WAAW,CAAC;AAE/F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAI7C,UAAU,KAAK;IACb,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;;WADS,MAAM;;;;AAudhB,wBASG"}
@@ -0,0 +1,3 @@
1
+ declare const _default: import('vue').DefineComponent<{}, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, true, {}, HTMLElement>;
2
+ export default _default;
3
+ //# sourceMappingURL=BuilderPropsPanel.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuilderPropsPanel.vue.d.ts","sourceRoot":"","sources":["../../src/builder/BuilderPropsPanel.vue"],"names":[],"mappings":";AA8YA,wBAMG"}
@@ -0,0 +1,10 @@
1
+ import { ComputedRef, InjectionKey } from 'vue';
2
+ import { PageConfig } from '../schema';
3
+ import { UsePageBuilderReturn } from './usePageBuilder';
4
+ import { UseSchemaValidationReturn } from './useSchemaValidation';
5
+ export declare const BUILDER_API: InjectionKey<UsePageBuilderReturn>;
6
+ /** Builder-side config (the same `PageConfig` is also passed to the renderer). */
7
+ export declare const BUILDER_CONFIG: InjectionKey<ComputedRef<PageConfig | undefined>>;
8
+ /** Reactive validation issues for the current schema, keyed by node id. */
9
+ export declare const BUILDER_VALIDATION: InjectionKey<UseSchemaValidationReturn>;
10
+ //# sourceMappingURL=builderContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builderContext.d.ts","sourceRoot":"","sources":["../../src/builder/builderContext.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAC7D,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAEvE,eAAO,MAAM,WAAW,EAAE,YAAY,CAAC,oBAAoB,CAA4B,CAAC;AAExF,kFAAkF;AAClF,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,WAAW,CAAC,UAAU,GAAG,SAAS,CAAC,CAChD,CAAC;AAE9B,2EAA2E;AAC3E,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAAC,yBAAyB,CACtC,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { ElementType, PageNode } from '../schema';
2
+ export type { ElementType };
3
+ export declare function resetIdCounter(): void;
4
+ export declare function defaultNode(type: ElementType): PageNode;
5
+ export interface PaletteGroup {
6
+ label: string;
7
+ items: {
8
+ type: ElementType;
9
+ label: string;
10
+ icon: string;
11
+ }[];
12
+ }
13
+ export declare const PALETTE_GROUPS: PaletteGroup[];
14
+ //# sourceMappingURL=nodeDefaults.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeDefaults.d.ts","sourceRoot":"","sources":["../../src/builder/nodeDefaults.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACvD,YAAY,EAAE,WAAW,EAAE,CAAC;AAO5B,wBAAgB,cAAc,IAAI,IAAI,CAAiB;AAEvD,wBAAgB,WAAW,CAAC,IAAI,EAAE,WAAW,GAAG,QAAQ,CAoBvD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE;QAAE,IAAI,EAAE,WAAW,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC7D;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,EAuCxC,CAAC"}
@@ -0,0 +1,21 @@
1
+ import { PageNode, ElementType } from '../schema';
2
+ export type NodePath = readonly number[];
3
+ export interface NodeLocation {
4
+ path: NodePath;
5
+ node: PageNode;
6
+ parent: (PageNode & {
7
+ children: PageNode[];
8
+ }) | null;
9
+ index: number;
10
+ }
11
+ export declare function getNodeAt(root: PageNode, path: NodePath): NodeLocation | null;
12
+ export declare function findPath(root: PageNode, target: PageNode): NodePath | null;
13
+ export declare function isAncestor(ancestor: NodePath, path: NodePath): boolean;
14
+ export declare function insertChild(root: PageNode, parentPath: NodePath, index: number, newChild: PageNode): PageNode;
15
+ export declare function removeNode(root: PageNode, path: NodePath): PageNode;
16
+ export declare function replaceNode(root: PageNode, path: NodePath, replacement: PageNode): PageNode;
17
+ export declare function patchNode(root: PageNode, path: NodePath, patch: Partial<PageNode>): PageNode;
18
+ export declare function moveNode(root: PageNode, fromPath: NodePath, toParentPath: NodePath, toIndex: number): PageNode;
19
+ export declare function moveSibling(root: PageNode, path: NodePath, delta: -1 | 1): PageNode;
20
+ export type { PageNode, ElementType };
21
+ //# sourceMappingURL=operations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../../src/builder/operations.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAmB,KAAK,QAAQ,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAAG,SAAS,MAAM,EAAE,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,QAAQ,CAAC;IACf,IAAI,EAAE,QAAQ,CAAC;IACf,MAAM,EAAE,CAAC,QAAQ,GAAG;QAAE,QAAQ,EAAE,QAAQ,EAAE,CAAA;KAAE,CAAC,GAAG,IAAI,CAAC;IACrD,KAAK,EAAE,MAAM,CAAC;CACf;AAID,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,YAAY,GAAG,IAAI,CAY7E;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAa1E;AAED,wBAAgB,UAAU,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,OAAO,CAMtE;AAID,wBAAgB,WAAW,CACzB,IAAI,EAAE,QAAQ,EACd,UAAU,EAAE,QAAQ,EACpB,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,QAAQ,GACjB,QAAQ,CAaV;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,GAAG,QAAQ,CAQnE;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,GAAG,QAAQ,CAW3F;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,QAAQ,CAiB5F;AAED,wBAAgB,QAAQ,CACtB,IAAI,EAAE,QAAQ,EACd,QAAQ,EAAE,QAAQ,EAClB,YAAY,EAAE,QAAQ,EACtB,OAAO,EAAE,MAAM,GACd,QAAQ,CAUV;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,QAAQ,CASnF;AAwBD,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,CAAC"}
@@ -0,0 +1,8 @@
1
+ import { ButtonNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: ButtonNode;
4
+ patch: (update: Partial<ButtonNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=ButtonProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ButtonProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/ButtonProps.vue"],"names":[],"mappings":"AA2HA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;CAC9C,CAAC;;AAqRF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { CardNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: CardNode;
4
+ patch: (update: Partial<CardNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
7
+ export default _default;
8
+ //# sourceMappingURL=CardProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CardProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/CardProps.vue"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAE7C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CAC5C,CAAC;;AAmEF,wBAOG"}
@@ -0,0 +1,8 @@
1
+ import { CheckboxNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: CheckboxNode;
4
+ patch: (update: Partial<CheckboxNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=CheckboxProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CheckboxProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/CheckboxProps.vue"],"names":[],"mappings":"AAyCA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,YAAY,CAAC;IACnB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,YAAY,CAAC,KAAK,IAAI,CAAC;CAChD,CAAC;;AA0IF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { HeadingNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: HeadingNode;
4
+ patch: (update: Partial<HeadingNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=HeadingProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HeadingProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/HeadingProps.vue"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CAC/C,CAAC;;AA2GF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { ImageNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: ImageNode;
4
+ patch: (update: Partial<ImageNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=ImageProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ImageProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/ImageProps.vue"],"names":[],"mappings":"AAiJA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAG9C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;CAC7C,CAAC;;AAiOF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { LinkNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: LinkNode;
4
+ patch: (update: Partial<LinkNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=LinkProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LinkProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/LinkProps.vue"],"names":[],"mappings":"AAmEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAG7C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC;CAC5C,CAAC;;AA4IF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { ParagraphNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: ParagraphNode;
4
+ patch: (update: Partial<ParagraphNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
7
+ export default _default;
8
+ //# sourceMappingURL=ParagraphProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ParagraphProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/ParagraphProps.vue"],"names":[],"mappings":"AA4CA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;CACjD,CAAC;;AA8DF,wBAOG"}
@@ -0,0 +1,8 @@
1
+ import { SectionNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: SectionNode;
4
+ patch: (update: Partial<SectionNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
7
+ export default _default;
8
+ //# sourceMappingURL=SectionProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SectionProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/SectionProps.vue"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAEhD,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;CAC/C,CAAC;;AAmEF,wBAOG"}
@@ -0,0 +1,8 @@
1
+ import { SelectNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: SelectNode;
4
+ patch: (update: Partial<SelectNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=SelectProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/SelectProps.vue"],"names":[],"mappings":"AA+CA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;CAC9C,CAAC;;AAsKF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { SpacerNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: SpacerNode;
4
+ patch: (update: Partial<SpacerNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, HTMLDivElement>;
7
+ export default _default;
8
+ //# sourceMappingURL=SpacerProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SpacerProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/SpacerProps.vue"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC;CAC9C,CAAC;;AAuEF,wBAOG"}
@@ -0,0 +1,8 @@
1
+ import { StackNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: StackNode;
4
+ patch: (update: Partial<StackNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=StackProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StackProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/StackProps.vue"],"names":[],"mappings":"AA8FA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9C,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,SAAS,CAAC;IAChB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;CAC7C,CAAC;;AAkGF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { PageNode, NodeStyle } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: PageNode;
4
+ patchStyle: (update: Partial<NodeStyle>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=StyleProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StyleProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/StyleProps.vue"],"names":[],"mappings":"AAoEA,OAAO,EAAmB,KAAK,QAAQ,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAE9E,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,SAAS,CAAC,KAAK,IAAI,CAAC;CAClD,CAAC;;AA+KF,wBAMG"}
@@ -0,0 +1,8 @@
1
+ import { TextInputNode } from '../../schema';
2
+ type __VLS_Props = {
3
+ node: TextInputNode;
4
+ patch: (update: Partial<TextInputNode>) => void;
5
+ };
6
+ declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
7
+ export default _default;
8
+ //# sourceMappingURL=TextInputProps.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TextInputProps.vue.d.ts","sourceRoot":"","sources":["../../../src/builder/props/TextInputProps.vue"],"names":[],"mappings":"AAyEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,KAAK,IAAI,CAAC;CACjD,CAAC;;AA6MF,wBAMG"}
@@ -0,0 +1,15 @@
1
+ import { Component } from 'vue';
2
+ import { ElementType } from '../../schema';
3
+ export interface PropsRegistryEntry {
4
+ /** Component to render for the element-specific props section. */
5
+ component: Component;
6
+ /** Title shown above the element section. */
7
+ sectionTitle: string;
8
+ }
9
+ /**
10
+ * Per-element-type props registry. An entry is absent when an element type has
11
+ * no type-specific properties (`page`, `divider`) — only the universal style
12
+ * section is shown for those.
13
+ */
14
+ export declare const PROPS_REGISTRY: Partial<Record<ElementType, PropsRegistryEntry>>;
15
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/builder/props/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,KAAK,CAAC;AACrC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAehD,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,SAAS,EAAE,SAAS,CAAC;IACrB,6CAA6C;IAC7C,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;GAIG;AACH,eAAO,MAAM,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,kBAAkB,CAAC,CAa3E,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { InjectionKey, Ref } from 'vue';
2
+ import { NodePath } from './operations';
3
+ import { ElementType } from '../schema';
4
+ import { UsePageBuilderReturn } from './usePageBuilder';
5
+ export type DragPayload = {
6
+ kind: 'new';
7
+ type: ElementType;
8
+ } | {
9
+ kind: 'move';
10
+ path: NodePath;
11
+ };
12
+ export interface BuilderDndContext {
13
+ isDragging: Ref<boolean>;
14
+ payload: Ref<DragPayload | null>;
15
+ activeZoneKey: Ref<string | null>;
16
+ startDrag(payload: DragPayload): void;
17
+ endDrag(): void;
18
+ onZoneEnter(key: string, parentPath: NodePath): boolean;
19
+ onZoneLeave(key: string): void;
20
+ onZoneDrop(parentPath: NodePath, index: number): void;
21
+ canDrop(parentPath: NodePath): boolean;
22
+ }
23
+ export declare const BUILDER_DND: InjectionKey<BuilderDndContext>;
24
+ export declare function provideBuilderDnd(builder: UsePageBuilderReturn): BuilderDndContext;
25
+ export declare function useBuilderDnd(): BuilderDndContext;
26
+ //# sourceMappingURL=useBuilderDnd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useBuilderDnd.d.ts","sourceRoot":"","sources":["../../src/builder/useBuilderDnd.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,KAAK,YAAY,EAAE,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACxE,OAAO,EAAc,KAAK,QAAQ,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAE7D,MAAM,MAAM,WAAW,GACnB;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,IAAI,EAAE,WAAW,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,QAAQ,CAAA;CAAE,CAAC;AAErC,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACzB,OAAO,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IACjC,aAAa,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAClC,SAAS,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,CAAC;IACtC,OAAO,IAAI,IAAI,CAAC;IAChB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC;IACxD,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,CAAC,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACtD,OAAO,CAAC,UAAU,EAAE,QAAQ,GAAG,OAAO,CAAC;CACxC;AAED,eAAO,MAAM,WAAW,EAAE,YAAY,CAAC,iBAAiB,CAA4B,CAAC;AAIrF,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,oBAAoB,GAAG,iBAAiB,CA8ElF;AAED,wBAAgB,aAAa,IAAI,iBAAiB,CAIjD"}
@@ -0,0 +1,28 @@
1
+ import { Ref } from 'vue';
2
+ import { PageNode } from '../schema';
3
+ import { ElementType } from './nodeDefaults';
4
+ import { NodePath } from './operations';
5
+ export interface UsePageBuilderOptions {
6
+ schema?: Ref<PageNode>;
7
+ initial?: PageNode;
8
+ }
9
+ export declare function usePageBuilder(options?: UsePageBuilderOptions): {
10
+ schema: Ref<PageNode, PageNode>;
11
+ selectedPath: Ref<readonly number[] | null, NodePath | readonly number[] | null>;
12
+ selectedNode: import('vue').ComputedRef<PageNode | null>;
13
+ structuralVersion: Ref<number, number>;
14
+ canUndo: import('vue').ComputedRef<boolean>;
15
+ canRedo: import('vue').ComputedRef<boolean>;
16
+ select: (path: NodePath | null) => void;
17
+ selectNode: (node: PageNode) => void;
18
+ addChild: (parentPath: NodePath, type: ElementType, atIndex?: number) => void;
19
+ remove: (path: NodePath) => void;
20
+ move: (path: NodePath, delta: -1 | 1) => void;
21
+ moveTo: (fromPath: NodePath, toParentPath: NodePath, toIndex: number) => void;
22
+ patch: (path: NodePath, update: Partial<PageNode>) => void;
23
+ replaceSchema: (next: PageNode) => void;
24
+ undo: () => void;
25
+ redo: () => void;
26
+ };
27
+ export type UsePageBuilderReturn = ReturnType<typeof usePageBuilder>;
28
+ //# sourceMappingURL=usePageBuilder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"usePageBuilder.d.ts","sourceRoot":"","sources":["../../src/builder/usePageBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAEL,KAAK,WAAW,EACjB,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAQL,KAAK,QAAQ,EACd,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,qBAAqB;IACpC,MAAM,CAAC,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IACvB,OAAO,CAAC,EAAE,QAAQ,CAAC;CACpB;AAID,wBAAgB,cAAc,CAAC,OAAO,GAAE,qBAA0B;;;;;;;mBA2E1C,QAAQ,GAAG,IAAI;uBACX,QAAQ;2BAGJ,QAAQ,QAAQ,WAAW,YAAY,MAAM;mBAarD,QAAQ;iBAkBV,QAAQ,SAAS,CAAC,CAAC,GAAG,CAAC;uBAWjB,QAAQ,gBAAgB,QAAQ,WAAW,MAAM;kBAUtD,QAAQ,UAAU,OAAO,CAAC,QAAQ,CAAC;0BAQ3B,QAAQ;;;EA0BtC;AAED,MAAM,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -0,0 +1,28 @@
1
+ import { Ref } from 'vue';
2
+ import { PageConfig, PageNode } from '../schema';
3
+ export type IssueSeverity = 'warning' | 'error';
4
+ export interface ValidationIssue {
5
+ /** Stable ID of the node the issue belongs to. */
6
+ nodeId: string;
7
+ /** Which property of the node is the problem (used to surface the issue near a specific field). */
8
+ field?: string;
9
+ /** Human-readable explanation. */
10
+ message: string;
11
+ severity: IssueSeverity;
12
+ }
13
+ /**
14
+ * Walk the schema reactively and surface common authoring mistakes — buttons
15
+ * without actions, duplicate field names, images without assets, action IDs
16
+ * that aren't in the configured allowlist. Builder UI consumes these to draw
17
+ * warning icons in the outline and inline hints in the props panel.
18
+ *
19
+ * The renderer does NOT consult these — disallowed elements (the actual
20
+ * security boundary) are enforced separately. Validation is purely a UX
21
+ * scaffold for the builder.
22
+ */
23
+ export declare function useSchemaValidation(schema: Ref<PageNode>, config: Ref<PageConfig | undefined>): {
24
+ issues: import('vue').ComputedRef<ValidationIssue[]>;
25
+ byNodeId: import('vue').ComputedRef<Map<string, ValidationIssue[]>>;
26
+ };
27
+ export type UseSchemaValidationReturn = ReturnType<typeof useSchemaValidation>;
28
+ //# sourceMappingURL=useSchemaValidation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSchemaValidation.d.ts","sourceRoot":"","sources":["../../src/builder/useSchemaValidation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEtD,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,OAAO,CAAC;AAEhD,MAAM,WAAW,eAAe;IAC9B,kDAAkD;IAClD,MAAM,EAAE,MAAM,CAAA;IACd,mGAAmG;IACnG,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,kCAAkC;IAClC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,aAAa,CAAA;CACxB;AAED;;;;;;;;;GASG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,EACrB,MAAM,EAAE,GAAG,CAAC,UAAU,GAAG,SAAS,CAAC;;;EAgGpC;AASD,MAAM,MAAM,yBAAyB,GAAG,UAAU,CAAC,OAAO,mBAAmB,CAAC,CAAC"}
@@ -0,0 +1,24 @@
1
+ import { ComputedRef, InjectionKey } from 'vue';
2
+ import { PageConfig } from './schema';
3
+ export type ActionValues = Record<string, unknown>;
4
+ export type ActionHandler = (values: ActionValues) => void;
5
+ export type CustomValidator = (values: ActionValues) => Record<string, string>;
6
+ export interface PageRendererContext {
7
+ actions?: Record<string, ActionHandler>;
8
+ assetResolver?: (id: string) => string;
9
+ /** Optional security/allowlist config. When set, disallowed elements are skipped. */
10
+ config?: PageConfig;
11
+ /** Called by PageNode when it skips a disallowed type — used to console.warn once. */
12
+ reportDisallowed?: (type: string) => void;
13
+ /** Whether all named fields currently pass validation (quiet, no errors shown). */
14
+ isFormValid: ComputedRef<boolean>;
15
+ getValue: (name: string) => unknown;
16
+ setValue: (name: string, value: unknown) => void;
17
+ /** Returns the error for a field only if it has been touched. */
18
+ getError: (name: string) => string;
19
+ /** Mark a field as touched (called on blur). */
20
+ markTouched: (name: string) => void;
21
+ triggerAction: (id: string, validates?: boolean) => void;
22
+ }
23
+ export declare const PAGE_RENDERER_KEY: InjectionKey<PageRendererContext>;
24
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,KAAK,CAAC;AACrD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE3C,MAAM,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACnD,MAAM,MAAM,aAAa,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,IAAI,CAAC;AAC3D,MAAM,MAAM,eAAe,GAAG,CAAC,MAAM,EAAE,YAAY,KAAK,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAE/E,MAAM,WAAW,mBAAmB;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACvC,aAAa,CAAC,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAA;IACtC,qFAAqF;IACrF,MAAM,CAAC,EAAE,UAAU,CAAA;IACnB,sFAAsF;IACtF,gBAAgB,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACzC,mFAAmF;IACnF,WAAW,EAAE,WAAW,CAAC,OAAO,CAAC,CAAA;IACjC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IACnC,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAChD,iEAAiE;IACjE,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;IAClC,gDAAgD;IAChD,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IACnC,aAAa,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,OAAO,KAAK,IAAI,CAAA;CACzD;AAED,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAAC,mBAAmB,CAA2B,CAAC"}
package/dist/index.css ADDED
@@ -0,0 +1,2 @@
1
+ .pb-stack[data-v-0632b6f4]{flex-direction:column;min-width:0;display:flex}.pb-stack--row[data-v-0632b6f4]{flex-direction:row}.pb-stack--row[data-v-0632b6f4]>*{flex:1;min-width:0}.pb-stack--wrap[data-v-0632b6f4]{flex-wrap:wrap}.pb-card-body[data-v-0632b6f4]{flex-direction:column;min-width:0;display:flex}.pb-section[data-v-0632b6f4]{display:block}.pb-section__title[data-v-0632b6f4]{margin:0 0 var(--coar-spacing-s,8px);font-size:var(--coar-body-base-size,14px);color:var(--coar-text-neutral-primary,#111);font-weight:600}.pb-section__body[data-v-0632b6f4]{flex-direction:column;display:flex}.pb-heading[data-v-0632b6f4]{color:var(--coar-text-neutral-primary,#111);margin:0;font-weight:600}.pb-paragraph[data-v-0632b6f4]{color:var(--coar-text-neutral-secondary,#666);margin:0}.pb-button[data-v-0632b6f4],.pb-link[data-v-0632b6f4],.pb-image[data-v-0632b6f4]{width:fit-content;max-width:100%}.pb-link[data-v-0632b6f4]{cursor:pointer;color:var(--coar-text-accent,#06c);font-size:inherit;background:0 0;border:none;padding:0;text-decoration:underline}.pb-link[data-v-0632b6f4]:hover{color:var(--coar-text-accent-hover,#004fa3)}.pb-image[data-v-0632b6f4]{display:block}.pb-spacer[data-v-0632b6f4]{flex-shrink:0}.coar-page-renderer[data-v-8ff147bf]{display:contents}.pb-tree-node[data-v-be04973b]{color:var(--coar-text-neutral-primary,#111);font-size:13px}.pb-tree-row[data-v-be04973b]{cursor:pointer;border-radius:4px;align-items:center;gap:6px;height:30px;padding-right:8px;display:flex;position:relative}.pb-tree-row[data-v-be04973b]:hover{background:var(--coar-surface-neutral-subtle,#f1f1f3)}.pb-tree-node--selected>.pb-tree-row[data-v-be04973b]{background:var(--coar-surface-accent-subtle,#e6eefa);color:var(--coar-text-accent,#1666cc)}.pb-tree-node--selected>.pb-tree-row[data-v-be04973b]:before{content:"";background:var(--coar-background-accent-primary,#1666cc);border-radius:2px;width:3px;position:absolute;top:3px;bottom:3px;left:0}.pb-tree-grip[data-v-be04973b]{width:12px;color:var(--coar-icon-neutral-disabled,#b8b8bc);opacity:0;flex-shrink:0;justify-content:center;align-items:center;transition:opacity .12s ease-out;display:inline-flex}.pb-tree-row:hover .pb-tree-grip[data-v-be04973b],.pb-tree-node--selected>.pb-tree-row .pb-tree-grip[data-v-be04973b]{opacity:1}.pb-tree-type-icon[data-v-be04973b]{color:var(--coar-icon-neutral-secondary,#5a5a60);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.pb-tree-node--selected>.pb-tree-row .pb-tree-type-icon[data-v-be04973b]{color:var(--coar-icon-accent,#1666cc)}.pb-tree-label[data-v-be04973b]{flex:1;align-items:baseline;gap:6px;min-width:0;display:inline-flex}.pb-tree-label-text[data-v-be04973b]{white-space:nowrap;text-overflow:ellipsis;font-weight:500;overflow:hidden}.pb-tree-label-key[data-v-be04973b]{color:var(--coar-text-neutral-tertiary,#8a8a90);white-space:nowrap;text-overflow:ellipsis;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11px;overflow:hidden}.pb-tree-node--selected>.pb-tree-row .pb-tree-label-key[data-v-be04973b]{color:var(--coar-text-accent,#1666cc);opacity:.7}.pb-tree-issue[data-v-be04973b]{flex-shrink:0;justify-content:center;align-items:center;width:18px;height:18px;margin-right:30px;display:inline-flex}.pb-tree-issue--warning[data-v-be04973b]{color:var(--coar-icon-semantic-warning,#b45309)}.pb-tree-issue--error[data-v-be04973b]{color:var(--coar-icon-semantic-error,#c0392b)}.pb-tree-actions[data-v-be04973b]{opacity:0;background:var(--coar-surface-neutral-subtle,#f1f1f3);border-radius:4px;gap:1px;padding:1px;transition:opacity .12s ease-out;display:flex;position:absolute;top:50%;right:4px;transform:translateY(-50%)}.pb-tree-row:hover .pb-tree-actions[data-v-be04973b],.pb-tree-node--selected>.pb-tree-row .pb-tree-actions[data-v-be04973b]{opacity:1}.pb-tree-node--selected>.pb-tree-row .pb-tree-actions[data-v-be04973b]{background:var(--coar-surface-accent-subtle,#e6eefa)}.pb-tree-btn[data-v-be04973b]{width:22px;height:22px;color:var(--coar-icon-neutral-secondary,#5a5a60);cursor:pointer;background:0 0;border:none;border-radius:3px;justify-content:center;align-items:center;padding:0;transition:background-color .12s ease-out,color .12s ease-out;display:inline-flex}.pb-tree-btn[data-v-be04973b]:hover:not(:disabled){background:var(--coar-surface-neutral-default,#dedee2);color:var(--coar-icon-neutral-primary,#111)}.pb-tree-btn[data-v-be04973b]:disabled{opacity:.3;cursor:not-allowed}.pb-tree-btn--danger[data-v-be04973b]:hover:not(:disabled){background:var(--coar-surface-semantic-error-subtle,#fde8e4);color:var(--coar-text-semantic-error-bold,#c0392b)}.pb-tree-add[data-v-be04973b]{padding-top:2px;padding-bottom:2px;padding-right:8px;position:relative}.pb-tree-add__trigger[data-v-be04973b]{border:1px dashed var(--coar-border-neutral,#cecece);height:26px;color:var(--coar-text-neutral-secondary,#666);cursor:pointer;background:0 0;border-radius:4px;align-items:center;gap:6px;padding:0 10px;font-family:inherit;font-size:12px;transition:border-color .12s,color .12s,background-color .12s;display:inline-flex}.pb-tree-add__trigger[data-v-be04973b]:hover,.pb-tree-add__trigger--open[data-v-be04973b]{border-color:var(--coar-border-accent,#1666cc);color:var(--coar-text-accent,#1666cc);background:var(--coar-surface-accent-subtle,#e6eefa)}.pb-tree-add__menu[data-v-be04973b]{top:calc(100% + 4px);left:inherit;background:var(--coar-surface-default,#fff);border:1px solid var(--coar-border-neutral,#dcdce0);z-index:10;border-radius:6px;flex-direction:column;min-width:200px;padding:4px;display:flex;position:absolute;box-shadow:0 8px 24px #0000001f}.pb-tree-add__group-label[data-v-be04973b]{text-transform:uppercase;letter-spacing:.04em;color:var(--coar-text-neutral-tertiary,#8a8a90);padding:6px 8px 2px;font-size:11px}.pb-tree-add__divider[data-v-be04973b]{background:var(--coar-border-neutral-subtle,#eeeef0);height:1px;margin:4px 0}.pb-tree-add__item[data-v-be04973b]{color:var(--coar-text-neutral-primary,#111);text-align:left;cursor:pointer;background:0 0;border:none;border-radius:4px;align-items:center;gap:10px;padding:6px 8px;font-family:inherit;font-size:13px;transition:background-color .12s;display:inline-flex}.pb-tree-add__item[data-v-be04973b]:hover{background:var(--coar-surface-accent-subtle,#e6eefa);color:var(--coar-text-accent,#1666cc)}.pb-tree-add__item[data-v-be04973b]>:first-child{color:var(--coar-icon-neutral-secondary,#5a5a60);flex-shrink:0}.pb-tree-add__item[data-v-be04973b]:hover>:first-child{color:var(--coar-icon-accent,#1666cc)}.pb-outline-wrap[data-v-fc62f26e]{height:100%;padding:4px 0;overflow-y:auto}.canvas-node[data-v-3ae4c5ac]{--canvas-border:#66666e4d;--canvas-border-selected:#1666ccb3;--canvas-tab-fg:#5a5a60;--canvas-tab-bg:#fff;--canvas-tab-border:#66666e59}.canvas-node--container[data-v-3ae4c5ac]{--canvas-border:#1666cc61;--canvas-tab-fg:#1666cc;--canvas-tab-border:#1666cc73}.canvas-node--element[data-v-3ae4c5ac]{--canvas-border:#05966959;--canvas-tab-fg:#047857;--canvas-tab-border:#05966973}.canvas-node[data-v-3ae4c5ac]{border:1px dashed var(--canvas-border);cursor:pointer;border-radius:6px;min-width:0;padding:16px 10px 10px;transition:border-color .12s ease-out,background-color .12s ease-out;position:relative}.canvas-node[data-v-3ae4c5ac]:hover{background:#1666cc08}.canvas-node--selected[data-v-3ae4c5ac]{border-color:var(--canvas-border-selected);background:#1666cc0d;border-style:solid}.canvas-node--dragging[data-v-3ae4c5ac]{opacity:.4}.canvas-node--root[data-v-3ae4c5ac]{min-height:80px;padding:20px 14px 14px}.canvas-node__tab[data-v-3ae4c5ac]{background:var(--canvas-tab-bg);border:1px solid var(--canvas-tab-border);height:18px;color:var(--canvas-tab-fg);white-space:nowrap;text-overflow:ellipsis;-webkit-user-select:none;user-select:none;border-radius:4px;align-items:center;gap:4px;max-width:calc(100% - 40px);padding:0 6px;font-size:11px;font-weight:500;display:inline-flex;position:absolute;top:-9px;left:10px;overflow:hidden}.canvas-node__tab--grabbable[data-v-3ae4c5ac]{cursor:grab}.canvas-node__tab--grabbable[data-v-3ae4c5ac]:active{cursor:grabbing}.canvas-node--selected .canvas-node__tab[data-v-3ae4c5ac]{border-color:var(--canvas-border-selected);color:var(--canvas-border-selected);font-weight:600}.canvas-node__tab-label[data-v-3ae4c5ac]{text-overflow:ellipsis;line-height:1;overflow:hidden}.canvas-node__delete[data-v-3ae4c5ac]{border:1px solid var(--canvas-tab-border);background:var(--canvas-tab-bg);width:18px;height:18px;color:var(--canvas-tab-fg);cursor:pointer;opacity:0;border-radius:4px;justify-content:center;align-items:center;padding:0;transition:opacity .12s ease-out,background-color .12s ease-out,border-color .12s ease-out,color .12s ease-out;display:inline-flex;position:absolute;top:-9px;right:10px}.canvas-node--selected>.canvas-node__delete[data-v-3ae4c5ac]{opacity:1}.canvas-node:hover:not(:has(.canvas-node:hover))>.canvas-node__delete[data-v-3ae4c5ac]{opacity:1}.canvas-node__delete[data-v-3ae4c5ac]:hover{background:var(--coar-surface-semantic-error-subtle,#fde8e4);border-color:var(--coar-text-semantic-error-bold,#c0392b);color:var(--coar-text-semantic-error-bold,#c0392b)}.canvas-node__body[data-v-3ae4c5ac]{min-height:24px}.canvas-node__body--dir-row>.canvas-node[data-v-3ae4c5ac]{flex:1;min-width:0}.canvas-node__body--card[data-v-3ae4c5ac]{background:var(--coar-surface-default,#fff);border:1px solid var(--coar-border-neutral,#e0e0e0);border-radius:6px;padding:12px;box-shadow:0 1px 4px #00000012}.canvas-node__section-title[data-v-3ae4c5ac]{color:var(--coar-text-neutral-primary,#111);border-bottom:1px solid var(--coar-border-neutral,#e0e0e0);margin-bottom:8px;padding-bottom:6px;font-size:13px;font-weight:600}.canvas-dropzone[data-v-3ae4c5ac]{box-sizing:border-box;opacity:0;pointer-events:none;background:#1666cc1f;border:1px dashed #1666cc73;border-radius:3px;flex-shrink:0;transition:background-color .12s ease-out,border-color .12s ease-out,opacity .15s ease-out,width .14s ease-out,min-width .14s ease-out,height .14s ease-out,min-height .14s ease-out}.canvas-dropzone--empty[data-v-3ae4c5ac]{opacity:1;pointer-events:auto;color:var(--coar-text-neutral-tertiary,#8a8a90);text-align:center;min-height:unset;background:#66666e0a;border-color:#66666e40;height:auto;padding:14px 12px;font-size:12px;font-style:italic}.canvas-dropzone--drag-active[data-v-3ae4c5ac]{background:#1666cc33;border-color:#1666ccb3}.canvas-dropzone--over[data-v-3ae4c5ac]{background:#1666cc59;border-style:solid;border-color:#1666ccf2;box-shadow:inset 0 0 0 1px #1666cc99}.canvas-dropzone--disabled[data-v-3ae4c5ac]{opacity:.55;background:#64646a14;border-color:#64646a4d}.canvas-dropzone--row[data-v-3ae4c5ac]{align-self:stretch;width:0;min-width:0}.canvas-dropzone--row.canvas-dropzone--drag-active[data-v-3ae4c5ac]{width:10px;min-width:10px}.canvas-dropzone--row.canvas-dropzone--over[data-v-3ae4c5ac]{width:24px;min-width:24px}.canvas-dropzone--column[data-v-3ae4c5ac]{width:auto;height:0;min-height:0}.canvas-dropzone--column.canvas-dropzone--drag-active[data-v-3ae4c5ac]{height:10px;min-height:10px}.canvas-dropzone--column.canvas-dropzone--over[data-v-3ae4c5ac]{height:24px;min-height:24px}.canvas-node__preview[data-v-3ae4c5ac]{pointer-events:none}.canvas-node__spacer-preview[data-v-3ae4c5ac]{background:repeating-linear-gradient(45deg,#00000008 0 4px,#0000 4px 8px);border:1px dashed #0000001f;border-radius:2px;height:20px}.canvas-node__heading[data-v-3ae4c5ac]{color:var(--coar-text-neutral-primary,#111);margin:0;font-weight:600}h1.canvas-node__heading[data-v-3ae4c5ac]{font-size:28px}h2.canvas-node__heading[data-v-3ae4c5ac]{font-size:22px}h3.canvas-node__heading[data-v-3ae4c5ac]{font-size:18px}h4.canvas-node__heading[data-v-3ae4c5ac]{font-size:15px}h5.canvas-node__heading[data-v-3ae4c5ac]{font-size:13px}h6.canvas-node__heading[data-v-3ae4c5ac]{font-size:12px}.canvas-node__paragraph[data-v-3ae4c5ac]{color:var(--coar-text-neutral-secondary,#555);margin:0;font-size:14px}.canvas-node__link[data-v-3ae4c5ac]{cursor:default;color:var(--coar-text-accent,#1666cc);background:0 0;border:none;padding:0;font-size:14px;text-decoration:underline}.canvas-node__image-preview[data-v-3ae4c5ac]{border-radius:4px;max-width:100%;height:auto;display:block}.canvas-node__image-placeholder[data-v-3ae4c5ac]{background:var(--coar-surface-subtle,#f7f7f9);color:var(--coar-text-neutral-secondary,#888);border:1px dashed #00000026;border-radius:4px;flex-direction:column;justify-content:center;align-items:center;gap:6px;padding:20px;font-size:12px;display:flex}.pb-canvas-shell[data-v-4d674269]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.pb-palette[data-v-4d674269]{background:var(--coar-surface-neutral-subtle,#f7f7f9);border-bottom:1px solid var(--coar-border-neutral,#e2e2e6);flex-wrap:wrap;flex-shrink:0;align-items:center;gap:10px;padding:8px 12px;display:flex}.pb-palette__group[data-v-4d674269]{flex-wrap:wrap;align-items:center;gap:4px;display:inline-flex}.pb-palette__label[data-v-4d674269]{text-transform:uppercase;letter-spacing:.06em;color:var(--coar-text-neutral-tertiary,#8a8a90);white-space:nowrap;margin-right:2px;font-size:10px;font-weight:600}.pb-palette__divider[data-v-4d674269]{background:var(--coar-border-neutral,#d8d8dc);flex-shrink:0;width:1px;height:20px}.pb-palette__card[data-v-4d674269]{border:1px solid var(--card-border,#66666e40);height:24px;color:var(--card-fg,#5a5a60);cursor:grab;-webkit-user-select:none;user-select:none;white-space:nowrap;background:#fff;border-radius:4px;align-items:center;gap:4px;padding:0 7px;font-family:inherit;font-size:12px;font-weight:500;transition:background-color .12s,border-color .12s,transform 80ms;display:inline-flex}.pb-palette__card[data-v-4d674269]:hover{background:var(--card-bg-hover,#1666cc0f);border-color:var(--card-border-hover,#1666cc66);color:var(--card-fg-hover,#1666cc)}.pb-palette__card[data-v-4d674269]:active{transform:scale(.97)}.pb-palette__card--dragging[data-v-4d674269]{opacity:.4;cursor:grabbing}.pb-palette__card--container[data-v-4d674269]{--card-fg:#1666cc;--card-fg-hover:#1666cc;--card-border:#1666cc4d;--card-border-hover:#1666cc8c;--card-bg-hover:#1666cc14}.pb-palette__card--element[data-v-4d674269]{--card-fg:#047857;--card-fg-hover:#047857;--card-border:#0596694d;--card-border-hover:#0596698c;--card-bg-hover:#05966914}.pb-canvas[data-v-4d674269]{background:repeating-linear-gradient(45deg,#00000004 0 6px,#0000 6px 12px);flex:1;padding:28px 20px 20px;overflow:auto}.pb-prop-group[data-v-e4171f7c]{flex-direction:column;gap:4px;display:flex}.pb-prop-label[data-v-e4171f7c]{color:var(--coar-text-neutral-primary,#111);font-size:12px;font-weight:500}.pb-prop-seg[data-v-e4171f7c]{border:1px solid var(--coar-border-neutral,#d0d0d0);background:var(--coar-surface-base,#fff);border-radius:6px;display:inline-flex;overflow:hidden}.pb-prop-seg__btn[data-v-e4171f7c]{color:var(--coar-text-neutral-secondary,#555);cursor:pointer;background:0 0;border:none;flex:1;padding:6px 12px;font-family:inherit;font-size:12px;transition:background-color .12s,color .12s}.pb-prop-seg__btn+.pb-prop-seg__btn[data-v-e4171f7c]{border-left:1px solid var(--coar-border-neutral,#d0d0d0)}.pb-prop-seg__btn[data-v-e4171f7c]:hover:not(.pb-prop-seg__btn--active){background:var(--coar-surface-neutral-subtle,#f0f0f2)}.pb-prop-seg__btn--active[data-v-e4171f7c]{background:var(--coar-surface-accent-subtle,#e6eefa);color:var(--coar-text-accent,#1666cc);font-weight:600}.pb-prop-textarea[data-v-13b6b029]{border:1px solid var(--coar-border-neutral,#d0d0d0);width:100%;color:var(--coar-text-neutral-primary,#111);background:var(--coar-surface-base,#fff);resize:vertical;box-sizing:border-box;border-radius:6px;min-height:60px;padding:6px 10px;font-family:inherit;font-size:13px}.pb-prop-textarea[data-v-13b6b029]:focus{outline:2px solid var(--coar-border-accent,#1a73e8);outline-offset:-1px}.pb-image-asset[data-v-49a42b45]{align-items:stretch;gap:10px;display:flex}.pb-image-asset__thumb[data-v-49a42b45]{background:var(--coar-surface-neutral-subtle,#f0f0f2);border:1px solid var(--coar-border-neutral,#e0e0e0);border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;width:80px;height:80px;display:flex;overflow:hidden}.pb-image-asset__thumb img[data-v-49a42b45]{object-fit:cover;width:100%;height:100%;display:block}.pb-image-asset__empty[data-v-49a42b45]{color:var(--coar-icon-neutral-disabled,#b0b0b6);flex-direction:column;align-items:center;gap:2px;font-size:10px;display:flex}.pb-image-asset__empty-label[data-v-49a42b45]{font-size:10px}.pb-image-asset__controls[data-v-49a42b45]{flex-direction:column;justify-content:center;gap:6px;display:flex}.pb-props[data-v-380ec929]{background:var(--coar-surface-default,#fff);height:100%;min-height:0;font-family:var(--coar-body-base-family,sans-serif);flex-direction:column;display:flex}.pb-props__header[data-v-380ec929]{box-sizing:border-box;border-bottom:1px solid var(--coar-border-neutral,#e2e2e6);height:44px;color:var(--coar-text-neutral-secondary,#5a5a60);flex-shrink:0;align-items:center;gap:8px;padding:0 14px;display:flex}.pb-props__title[data-v-380ec929]{text-transform:uppercase;letter-spacing:.06em;color:var(--coar-text-neutral-secondary,#5a5a60);font-size:11px;font-weight:600}.pb-props__body[data-v-380ec929]{flex-direction:column;flex:1;padding:16px;display:flex;overflow:auto}.pb-props__section[data-v-380ec929]{flex-direction:column;gap:12px;display:flex}.pb-props__section--separated[data-v-380ec929]{border-top:1px solid var(--coar-border-neutral-subtle,#eeeef0);margin-top:20px;padding-top:16px}.pb-props__section-title[data-v-380ec929]{text-transform:uppercase;letter-spacing:.06em;color:var(--coar-text-neutral-tertiary,#8a8a90);margin:0;font-size:10px;font-weight:600}.pb-props__empty[data-v-380ec929]{color:var(--coar-icon-neutral-disabled,#b0b0b6);text-align:center;flex-direction:column;flex:1;justify-content:center;align-items:center;gap:6px;padding:32px 16px;display:flex}.pb-props__empty-title[data-v-380ec929]{font-size:var(--coar-body-small-base-size,14px);color:var(--coar-text-neutral-secondary,#5a5a60);margin:8px 0 0;font-weight:500}.pb-props__empty-hint[data-v-380ec929]{font-size:var(--coar-body-caption-size,12px);color:var(--coar-text-neutral-tertiary,#8a8a90);margin:0}.pb-props__issues[data-v-380ec929]{flex-direction:column;gap:6px;margin:0 0 16px;padding:0;list-style:none;display:flex}.pb-props__issue[data-v-380ec929]{border-radius:6px;align-items:flex-start;gap:8px;padding:8px 10px;font-size:12px;line-height:1.4;display:flex}.pb-props__issue--warning[data-v-380ec929]{background:var(--coar-surface-semantic-warning-subtle,#fef3c7);color:var(--coar-text-semantic-warning-bold,#92400e)}.pb-props__issue--error[data-v-380ec929]{background:var(--coar-surface-semantic-error-subtle,#fde8e4);color:var(--coar-text-semantic-error-bold,#c0392b)}.pb-builder[data-v-fb26dca9]{grid-template-columns:var(--v0d1c4c4b) 1px minmax(360px, 1fr) 1px var(--v0f378b9d);background:var(--coar-surface-default,#fff);border:1px solid var(--coar-border-neutral,#e2e2e6);height:100%;min-height:520px;font-family:var(--coar-body-base-family,sans-serif);border-radius:8px;transition:grid-template-columns .18s ease-out;display:grid;overflow:hidden}.pb-builder--resizing[data-v-fb26dca9]{-webkit-user-select:none;user-select:none;cursor:col-resize;transition:none}.pb-builder__pane[data-v-fb26dca9]{background:var(--coar-surface-default,#fff);flex-direction:column;min-width:0;min-height:0;display:flex;position:relative;overflow:hidden}.pb-builder__pane--rail[data-v-fb26dca9]{justify-content:flex-start;align-items:center;padding:8px 0}.pb-builder__pane-header[data-v-fb26dca9]{box-sizing:border-box;border-bottom:1px solid var(--coar-border-neutral,#e2e2e6);height:44px;color:var(--coar-text-neutral-secondary,#5a5a60);flex-shrink:0;align-items:center;gap:8px;padding:0 14px;display:flex}.pb-builder__pane-title[data-v-fb26dca9]{text-transform:uppercase;letter-spacing:.06em;color:var(--coar-text-neutral-secondary,#5a5a60);flex:1;font-size:11px;font-weight:600}.pb-builder[data-v-fb26dca9] .coar-tab-list{box-sizing:border-box;align-items:stretch;min-height:44px}.pb-builder[data-v-fb26dca9] .coar-tab-button{align-items:center;padding-top:0;padding-bottom:0;display:inline-flex}.pb-builder[data-v-fb26dca9] .pb-props__header{box-sizing:border-box;height:44px;padding:0 14px}.pb-builder[data-v-fb26dca9] .coar-tab-content{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.pb-builder[data-v-fb26dca9] .coar-tab-panel{display:none}.pb-builder[data-v-fb26dca9] .coar-tab-panel.active{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.pb-builder__tree-scroll[data-v-fb26dca9]{flex:1;padding:6px 6px 12px;overflow:auto}.pb-builder__pane-inner[data-v-fb26dca9]{border:none;border-radius:0;flex:1;min-height:0}.pb-builder__divider[data-v-fb26dca9]{background:var(--coar-border-neutral,#e2e2e6);cursor:col-resize;z-index:1;transition:background-color .12s ease-out;position:relative}.pb-builder__divider[data-v-fb26dca9]:after{content:"";cursor:inherit;position:absolute;inset:0 -3px}.pb-builder__divider[data-v-fb26dca9]:hover,.pb-builder--resizing .pb-builder__divider[data-v-fb26dca9]{background:var(--coar-background-accent-primary,#1666cc)}.pb-builder__divider--inert[data-v-fb26dca9]{cursor:default;pointer-events:none}.pb-builder__divider--inert[data-v-fb26dca9]:after{pointer-events:none}.pb-builder__icon-btn[data-v-fb26dca9]{width:26px;height:26px;color:var(--coar-icon-neutral-secondary,#5a5a60);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,color .12s,border-color .12s;display:inline-flex}.pb-builder__icon-btn[data-v-fb26dca9]:hover:not(:disabled){background:var(--coar-surface-neutral-subtle,#f0f0f2);border-color:var(--coar-border-neutral,#dcdce0);color:var(--coar-icon-neutral-primary,#111)}.pb-builder__icon-btn[data-v-fb26dca9]:disabled{opacity:.3;cursor:not-allowed}.pb-builder__icon-btn--corner[data-v-fb26dca9]{z-index:2;position:absolute;top:9px;right:10px}.pb-builder__rail-btn[data-v-fb26dca9]{width:28px;height:28px;color:var(--coar-icon-neutral-secondary,#5a5a60);cursor:pointer;background:0 0;border:1px solid #0000;border-radius:4px;justify-content:center;align-items:center;padding:0;transition:background-color .12s,border-color .12s,color .12s;display:inline-flex}.pb-builder__rail-btn[data-v-fb26dca9]:hover{background:var(--coar-surface-neutral-subtle,#f0f0f2);border-color:var(--coar-border-neutral,#dcdce0);color:var(--coar-icon-neutral-primary,#111)}.pb-builder__pane--center[data-v-fb26dca9]{padding:0}.pb-builder__tabs[data-v-fb26dca9]{flex-direction:column;flex:1;min-height:0;display:flex}.pb-builder__tab-label[data-v-fb26dca9]{align-items:center;gap:6px;display:inline-flex}.pb-builder__preview-pane[data-v-fb26dca9]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.pb-builder__preview-toolbar[data-v-fb26dca9]{border-bottom:1px solid var(--coar-border-neutral,#e2e2e6);background:var(--coar-surface-neutral-subtle,#f7f7f9);flex-shrink:0;align-items:center;gap:8px;padding:8px 12px;display:flex}.pb-builder__seg[data-v-fb26dca9]{border:1px solid var(--coar-border-neutral,#d0d0d0);background:var(--coar-surface-base,#fff);border-radius:6px;display:inline-flex;overflow:hidden}.pb-builder__seg-btn[data-v-fb26dca9]{color:var(--coar-text-neutral-secondary,#555);cursor:pointer;background:0 0;border:none;align-items:center;gap:5px;padding:4px 10px;font-family:inherit;font-size:12px;transition:background-color .12s,color .12s;display:inline-flex}.pb-builder__seg-btn+.pb-builder__seg-btn[data-v-fb26dca9]{border-left:1px solid var(--coar-border-neutral,#d0d0d0)}.pb-builder__seg-btn[data-v-fb26dca9]:hover:not(.pb-builder__seg-btn--active){background:var(--coar-surface-neutral-subtle,#f0f0f2)}.pb-builder__seg-btn--active[data-v-fb26dca9]{background:var(--coar-surface-accent-subtle,#e6eefa);color:var(--coar-text-accent,#1666cc);font-weight:600}.pb-builder__preview[data-v-fb26dca9]{box-sizing:border-box;background:repeating-linear-gradient(45deg,#00000004 0 6px,#0000 6px 12px);flex:1;min-height:0;padding:20px 24px;overflow:auto}.pb-builder__preview-frame[data-v-fb26dca9]{background:var(--coar-surface-default,#fff);border:1px solid var(--coar-border-neutral,#e2e2e6);border-radius:8px;transition:max-width .18s ease-out,width .18s ease-out;overflow:hidden}.pb-builder__json-pane[data-v-fb26dca9]{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.pb-builder__json-toolbar[data-v-fb26dca9]{border-bottom:1px solid var(--coar-border-neutral,#e2e2e6);background:var(--coar-surface-neutral-subtle,#f7f7f9);flex-shrink:0;align-items:center;gap:8px;padding:6px 12px;display:flex}.pb-builder__json-hint[data-v-fb26dca9]{color:var(--coar-text-neutral-secondary,#888);flex:1;font-size:12px}.pb-builder__json-error[data-v-fb26dca9]{color:var(--coar-text-semantic-error-bold,#c0392b);font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px}.pb-builder__json-apply[data-v-fb26dca9]{background:var(--coar-background-accent-primary,#1666cc);color:#fff;cursor:pointer;white-space:nowrap;border:none;border-radius:4px;padding:4px 14px;font-family:inherit;font-size:12px;font-weight:500}.pb-builder__json-apply[data-v-fb26dca9]:disabled{opacity:.4;cursor:default}.pb-builder__json-apply[data-v-fb26dca9]:not(:disabled):hover{filter:brightness(.92)}.pb-builder__json-editor[data-v-fb26dca9]{resize:none;color:var(--coar-text-neutral-primary,#111);background:var(--coar-surface-neutral-subtle,#f7f7f9);border:none;outline:none;flex:1;padding:16px;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;line-height:1.55}
2
+ /*$vite$:1*/
@@ -0,0 +1,6 @@
1
+ export { default as CoarPageRenderer } from './CoarPageRenderer.vue';
2
+ export { default as CoarPageBuilder } from './CoarPageBuilder.vue';
3
+ export type { ActionValues, ActionHandler, CustomValidator } from './context';
4
+ export type { PageNode, ElementType, NodeStyle, ContainerNode, PageRootNode, StackNode, CardNode, SectionNode, DividerNode, SpacerNode, HeadingNode, ParagraphNode, TextInputNode, CheckboxNode, SelectNode, ButtonNode, LinkNode, ImageNode, PageConfig, } from './schema';
5
+ export { isContainerNode, isElementAllowed } from './schema';
6
+ //# sourceMappingURL=index.d.ts.map