@cluadwong/form-designer 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +261 -0
  3. package/dist/chunks/designer-ui.js +3092 -0
  4. package/dist/chunks/renderer-core.js +2635 -0
  5. package/dist/components/designer/CanvasSurface.vue.d.ts +64 -0
  6. package/dist/components/designer/CanvasSurface.vue.d.ts.map +1 -0
  7. package/dist/components/designer/DesignerToolbar.vue.d.ts +49 -0
  8. package/dist/components/designer/DesignerToolbar.vue.d.ts.map +1 -0
  9. package/dist/components/designer/FormDesigner.vue.d.ts +25 -0
  10. package/dist/components/designer/FormDesigner.vue.d.ts.map +1 -0
  11. package/dist/components/designer/HelpPanel.vue.d.ts +10 -0
  12. package/dist/components/designer/HelpPanel.vue.d.ts.map +1 -0
  13. package/dist/components/designer/InspectorPanel.vue.d.ts +48 -0
  14. package/dist/components/designer/InspectorPanel.vue.d.ts.map +1 -0
  15. package/dist/components/designer/NodeTreeItem.vue.d.ts +18 -0
  16. package/dist/components/designer/NodeTreeItem.vue.d.ts.map +1 -0
  17. package/dist/components/designer/PaletteSidebar.vue.d.ts +29 -0
  18. package/dist/components/designer/PaletteSidebar.vue.d.ts.map +1 -0
  19. package/dist/components/designer/StatusBar.vue.d.ts +25 -0
  20. package/dist/components/designer/StatusBar.vue.d.ts.map +1 -0
  21. package/dist/components/designer/composables/treeControl.d.ts +65 -0
  22. package/dist/components/designer/composables/treeControl.d.ts.map +1 -0
  23. package/dist/components/designer/composables/useFillData.d.ts +34 -0
  24. package/dist/components/designer/composables/useFillData.d.ts.map +1 -0
  25. package/dist/components/designer/composables/useNodeSelection.d.ts +56 -0
  26. package/dist/components/designer/composables/useNodeSelection.d.ts.map +1 -0
  27. package/dist/components/designer/composables/useSchemaDocument.d.ts +44 -0
  28. package/dist/components/designer/composables/useSchemaDocument.d.ts.map +1 -0
  29. package/dist/components/designer/composables/useSchemaEdits.d.ts +111 -0
  30. package/dist/components/designer/composables/useSchemaEdits.d.ts.map +1 -0
  31. package/dist/components/designer/config.d.ts +40 -0
  32. package/dist/components/designer/config.d.ts.map +1 -0
  33. package/dist/components/designer/export-api.d.ts +81 -0
  34. package/dist/components/designer/export-api.d.ts.map +1 -0
  35. package/dist/components/designer/inspectors/CellInspector.vue.d.ts +20 -0
  36. package/dist/components/designer/inspectors/CellInspector.vue.d.ts.map +1 -0
  37. package/dist/components/designer/inspectors/FieldPInspector.vue.d.ts +10 -0
  38. package/dist/components/designer/inspectors/FieldPInspector.vue.d.ts.map +1 -0
  39. package/dist/components/designer/inspectors/GridInspector.vue.d.ts +10 -0
  40. package/dist/components/designer/inspectors/GridInspector.vue.d.ts.map +1 -0
  41. package/dist/components/designer/inspectors/HeaderFooterFields.vue.d.ts +14 -0
  42. package/dist/components/designer/inspectors/HeaderFooterFields.vue.d.ts.map +1 -0
  43. package/dist/components/designer/inspectors/HtmlInspector.vue.d.ts +10 -0
  44. package/dist/components/designer/inspectors/HtmlInspector.vue.d.ts.map +1 -0
  45. package/dist/components/designer/inspectors/ImageInspector.vue.d.ts +10 -0
  46. package/dist/components/designer/inspectors/ImageInspector.vue.d.ts.map +1 -0
  47. package/dist/components/designer/inspectors/IssuesPanel.vue.d.ts +11 -0
  48. package/dist/components/designer/inspectors/IssuesPanel.vue.d.ts.map +1 -0
  49. package/dist/components/designer/inspectors/PageInspector.vue.d.ts +27 -0
  50. package/dist/components/designer/inspectors/PageInspector.vue.d.ts.map +1 -0
  51. package/dist/components/designer/inspectors/TableInspector.vue.d.ts +10 -0
  52. package/dist/components/designer/inspectors/TableInspector.vue.d.ts.map +1 -0
  53. package/dist/components/designer/inspectors/TextInspector.vue.d.ts +10 -0
  54. package/dist/components/designer/inspectors/TextInspector.vue.d.ts.map +1 -0
  55. package/dist/components/designer/inspectors/TextStyleFields.vue.d.ts +10 -0
  56. package/dist/components/designer/inspectors/TextStyleFields.vue.d.ts.map +1 -0
  57. package/dist/components/renderer-v2/FormRenderer.vue.d.ts +106 -0
  58. package/dist/components/renderer-v2/FormRenderer.vue.d.ts.map +1 -0
  59. package/dist/components/renderer-v2/GridFormRenderer.vue.d.ts +49 -0
  60. package/dist/components/renderer-v2/GridFormRenderer.vue.d.ts.map +1 -0
  61. package/dist/components/renderer-v2/GridSchemaNode.vue.d.ts +46 -0
  62. package/dist/components/renderer-v2/GridSchemaNode.vue.d.ts.map +1 -0
  63. package/dist/components/renderer-v2/HtmlBlock.vue.d.ts +16 -0
  64. package/dist/components/renderer-v2/HtmlBlock.vue.d.ts.map +1 -0
  65. package/dist/components/renderer-v2/PaperViewport.vue.d.ts +63 -0
  66. package/dist/components/renderer-v2/PaperViewport.vue.d.ts.map +1 -0
  67. package/dist/components/renderer-v2/collectFieldValues.d.ts +29 -0
  68. package/dist/components/renderer-v2/collectFieldValues.d.ts.map +1 -0
  69. package/dist/components/renderer-v2/index.d.ts +13 -0
  70. package/dist/components/renderer-v2/index.d.ts.map +1 -0
  71. package/dist/components/renderer-v2/measure-rows.d.ts +12 -0
  72. package/dist/components/renderer-v2/measure-rows.d.ts.map +1 -0
  73. package/dist/components/renderer-v2/page-size-style.d.ts +28 -0
  74. package/dist/components/renderer-v2/page-size-style.d.ts.map +1 -0
  75. package/dist/components/renderer-v2/print-form.d.ts +20 -0
  76. package/dist/components/renderer-v2/print-form.d.ts.map +1 -0
  77. package/dist/designer-ui.css +5 -0
  78. package/dist/designer.d.ts +16 -0
  79. package/dist/designer.d.ts.map +1 -0
  80. package/dist/designer.js +16 -0
  81. package/dist/engine-v2/derivation.d.ts +81 -0
  82. package/dist/engine-v2/derivation.d.ts.map +1 -0
  83. package/dist/engine-v2/index.d.ts +3 -0
  84. package/dist/engine-v2/index.d.ts.map +1 -0
  85. package/dist/engine-v2/node-address.d.ts +25 -0
  86. package/dist/engine-v2/node-address.d.ts.map +1 -0
  87. package/dist/engine-v2/pagination.d.ts +120 -0
  88. package/dist/engine-v2/pagination.d.ts.map +1 -0
  89. package/dist/i18n/en.d.ts +7 -0
  90. package/dist/i18n/en.d.ts.map +1 -0
  91. package/dist/i18n/index.d.ts +14 -0
  92. package/dist/i18n/index.d.ts.map +1 -0
  93. package/dist/i18n/types.d.ts +5 -0
  94. package/dist/i18n/types.d.ts.map +1 -0
  95. package/dist/i18n/zh-CN.d.ts +7 -0
  96. package/dist/i18n/zh-CN.d.ts.map +1 -0
  97. package/dist/index.d.ts +9 -0
  98. package/dist/index.d.ts.map +1 -0
  99. package/dist/index.js +107 -0
  100. package/dist/renderer-core.css +1 -0
  101. package/dist/renderer.d.ts +22 -0
  102. package/dist/renderer.d.ts.map +1 -0
  103. package/dist/renderer.js +93 -0
  104. package/dist/samples/types.d.ts +18 -0
  105. package/dist/samples/types.d.ts.map +1 -0
  106. package/dist/ticket-designer.css +5 -0
  107. package/dist/types/index.d.ts +8 -0
  108. package/dist/types/index.d.ts.map +1 -0
  109. package/dist/types/schema-v2-index.d.ts +15 -0
  110. package/dist/types/schema-v2-index.d.ts.map +1 -0
  111. package/dist/types/schema-v2-operations.d.ts +124 -0
  112. package/dist/types/schema-v2-operations.d.ts.map +1 -0
  113. package/dist/types/schema-v2-serialization.d.ts +30 -0
  114. package/dist/types/schema-v2-serialization.d.ts.map +1 -0
  115. package/dist/types/schema-v2-table-rows.d.ts +17 -0
  116. package/dist/types/schema-v2-table-rows.d.ts.map +1 -0
  117. package/dist/types/schema-v2-validation.d.ts +10 -0
  118. package/dist/types/schema-v2-validation.d.ts.map +1 -0
  119. package/dist/types/schema-v2.d.ts +283 -0
  120. package/dist/types/schema-v2.d.ts.map +1 -0
  121. package/dist/utils/date-format.d.ts +34 -0
  122. package/dist/utils/date-format.d.ts.map +1 -0
  123. package/package.json +96 -0
@@ -0,0 +1,64 @@
1
+ import type { FormSchemaV2, FormDataV2 } from "../../types";
2
+ /**
3
+ * 设计表面层(A5 + A6 分层重构 · Batch 2 + Batch 3)
4
+ *
5
+ * 渲染内核(renderer-v2)只负责 schema + data → 版式 DOM,不认识「选中 / 拖拽 / 落点」。
6
+ * 本组件是内核之上的「设计表面」,承接来自设计态的全部交互关注点:
7
+ * - 选中高亮(A5):在渲染 DOM 上加 `.is-design-selected`(MutationObserver)。
8
+ * - 拖拽(A6):落点(dragover / drop / dragend)与**源**(dragstart)均在本层以事件委托处理。
9
+ * 原生 dragstart 冒泡到表面层根后,由本层确定被拖节点、套用拦截规则(表格内部节点 /
10
+ * 设计态字段 p 需 Alt)、写入 NODE_MOVE_MIME,再计算合法投放格与插入下标;
11
+ * 内核不再感知拖拽:落点(dragover / drop / dragend)与**源**(dragstart)均在本层以事件委托处理,
12
+ * 插入指示线也由本层用 overlay 绝对定位绘制(见 `indicatorStyle`),内核模板零拖拽 DOM 分支(D3)。
13
+ * - 透传 `node-drag-start` / `field-change` 给上层 FormDesigner;
14
+ * 落点结果以语义事件 `drop-node` / `drop-palette` / `drag-end` 上抛,由 FormDesigner 提交 schema。
15
+ *
16
+ * 关键拆分:内核不再持有 `selectedNodeId`、不处理拖拽 DOM 事件(A5/A6);
17
+ * 选中与拖拽交互均在本表面层完成,内核保持纯净(分层约束见 docs/design.md)。
18
+ */
19
+ type CanvasSurfaceMode = "design" | "preview";
20
+ type NodeKind = "text" | "field" | "table" | "html" | "image" | "grid";
21
+ type __VLS_Props = {
22
+ schema: FormSchemaV2;
23
+ /** 渲染模式,透传给内核(design / preview)。仅 design 态允许拖拽交互。 */
24
+ mode?: CanvasSurfaceMode;
25
+ data?: FormDataV2 | null;
26
+ readonly?: boolean;
27
+ /** 当前选中的节点 id(设计态);预览/填充态传 null(选中高亮仅设计态出现)。 */
28
+ selectedNodeId?: string | null;
29
+ /** 无外壳模式(嵌入消费页)。 */
30
+ bare?: boolean;
31
+ /** 分页开关(预览/填写/打印强制分页;设计态可关为整页连续)。 */
32
+ paginate?: boolean;
33
+ };
34
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
35
+ "field-change": (field: string, value: string) => any;
36
+ "node-drag-start": (id: string) => any;
37
+ "drop-node": (detail: {
38
+ moveId: string;
39
+ cellId: string;
40
+ index: number;
41
+ }) => any;
42
+ "drop-palette": (detail: {
43
+ kind: NodeKind;
44
+ cellId: string;
45
+ }) => any;
46
+ "drag-end": () => any;
47
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
48
+ "onField-change"?: ((field: string, value: string) => any) | undefined;
49
+ "onNode-drag-start"?: ((id: string) => any) | undefined;
50
+ "onDrop-node"?: ((detail: {
51
+ moveId: string;
52
+ cellId: string;
53
+ index: number;
54
+ }) => any) | undefined;
55
+ "onDrop-palette"?: ((detail: {
56
+ kind: NodeKind;
57
+ cellId: string;
58
+ }) => any) | undefined;
59
+ "onDrag-end"?: (() => any) | undefined;
60
+ }>, {
61
+ paginate: boolean;
62
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
63
+ export default _default;
64
+ //# sourceMappingURL=CanvasSurface.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CanvasSurface.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/CanvasSurface.vue"],"names":[],"mappings":"AAydA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAc,MAAM,SAAS,CAAC;AAEpE;;;;;;;;;;;;;;;;GAgBG;AACH,KAAK,iBAAiB,GAAG,QAAQ,GAAG,SAAS,CAAC;AAC9C,KAAK,QAAQ,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAEvE,KAAK,WAAW,GAAG;IACf,MAAM,EAAE,YAAY,CAAC;IACrB,qDAAqD;IACrD,IAAI,CAAC,EAAE,iBAAiB,CAAC;IACzB,IAAI,CAAC,EAAE,UAAU,GAAG,IAAI,CAAC;IACzB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oBAAoB;IACpB,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,qCAAqC;IACrC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB,CAAC;;;;;gBASiC,MAAM;gBAAU,MAAM;eAAS,MAAM;;;cACpC,QAAQ;gBAAU,MAAM;;;;;;;gBADzB,MAAM;gBAAU,MAAM;eAAS,MAAM;;;cACpC,QAAQ;gBAAU,MAAM;;;;cAX/C,OAAO;;AA0btB,wBAQG"}
@@ -0,0 +1,49 @@
1
+ import type { SampleEntry } from "../../samples/types";
2
+ import { type DesignerUIConfig } from "./config";
3
+ type __VLS_Props = {
4
+ /** 可载入样例集(B3 注入,正式版可为空数组)。 */
5
+ samples?: SampleEntry[];
6
+ /** 模板脏标记(左上「未保存 / 已保存」)。 */
7
+ dirty: boolean;
8
+ canUndo: boolean;
9
+ canRedo: boolean;
10
+ /** 预览态:决定预览按钮激活态与文案(填充数据组的导出/保存已不限预览态)。 */
11
+ previewMode: boolean;
12
+ /** 全局 UI 配置(设计页可见性开关),缺省见 `defaultDesignerUIConfig`。 */
13
+ uiConfig?: Partial<DesignerUIConfig>;
14
+ };
15
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
16
+ help: () => any;
17
+ "reset-blank": () => any;
18
+ "load-sample": (sample: SampleEntry) => any;
19
+ undo: () => any;
20
+ redo: () => any;
21
+ "save-template": () => any;
22
+ "load-template": () => any;
23
+ "export-template": () => any;
24
+ "import-template": () => any;
25
+ "import-fill-data": () => any;
26
+ "export-fill-data": () => any;
27
+ "load-fill-data": () => any;
28
+ "save-fill-data": () => any;
29
+ "toggle-preview": () => any;
30
+ print: () => any;
31
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
32
+ onHelp?: (() => any) | undefined;
33
+ "onReset-blank"?: (() => any) | undefined;
34
+ "onLoad-sample"?: ((sample: SampleEntry) => any) | undefined;
35
+ onUndo?: (() => any) | undefined;
36
+ onRedo?: (() => any) | undefined;
37
+ "onSave-template"?: (() => any) | undefined;
38
+ "onLoad-template"?: (() => any) | undefined;
39
+ "onExport-template"?: (() => any) | undefined;
40
+ "onImport-template"?: (() => any) | undefined;
41
+ "onImport-fill-data"?: (() => any) | undefined;
42
+ "onExport-fill-data"?: (() => any) | undefined;
43
+ "onLoad-fill-data"?: (() => any) | undefined;
44
+ "onSave-fill-data"?: (() => any) | undefined;
45
+ "onToggle-preview"?: (() => any) | undefined;
46
+ onPrint?: (() => any) | undefined;
47
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
48
+ export default _default;
49
+ //# sourceMappingURL=DesignerToolbar.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DesignerToolbar.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/DesignerToolbar.vue"],"names":[],"mappings":"AA4OA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAA2B,KAAK,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAG1E,KAAK,WAAW,GAAG;IACjB,8BAA8B;IAC9B,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB,4BAA4B;IAC5B,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,OAAO,CAAC;IACjB,2CAA2C;IAC3C,WAAW,EAAE,OAAO,CAAC;IACrB,wDAAwD;IACxD,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACtC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2SF,wBAOG"}
@@ -0,0 +1,25 @@
1
+ import type { SampleEntry } from "../../samples/types";
2
+ import type { DesignerUIConfig } from "./config";
3
+ /** 表单数据采集口径类型(`getFormData` 的脱敏 / 回源开关)。 */
4
+ import type { CollectFieldValuesOptions } from "../renderer-v2";
5
+ import type { FormDataV2, FormSchemaV2 } from "../../types";
6
+ import "./styles/designer-ui.css";
7
+ type __VLS_Props = {
8
+ initialSchema?: FormSchemaV2;
9
+ /** 可载入的样例集(由外层注入,设计器不依赖 dev 目录,见 B3)。 */
10
+ samples?: SampleEntry[];
11
+ /** 全局 UI 配置(设计页可见性开关):缺省见 `defaultDesignerUIConfig`,
12
+ * 默认显示全部模块(含「填充数据」组);宿主可局部传 `false` 关闭。 */
13
+ uiConfig?: Partial<DesignerUIConfig>;
14
+ };
15
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {
16
+ getSchema: () => FormSchemaV2;
17
+ getFormData: (options?: CollectFieldValuesOptions) => FormDataV2;
18
+ setSchema: (next: FormSchemaV2 | string) => void;
19
+ exportSchemaFile: () => void;
20
+ exportFillDataFile: () => void;
21
+ print: () => void;
22
+ resetBlank: () => void;
23
+ }, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
24
+ export default _default;
25
+ //# sourceMappingURL=FormDesigner.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormDesigner.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/FormDesigner.vue"],"names":[],"mappings":"AAgpBA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAIjD,4CAA4C;AAC5C,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AAE1E,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAexD,OAAO,0BAA0B,CAAC;AAUlC,KAAK,WAAW,GAAG;IACjB,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,yCAAyC;IACzC,OAAO,CAAC,EAAE,WAAW,EAAE,CAAC;IACxB;gDAC4C;IAC5C,QAAQ,CAAC,EAAE,OAAO,CAAC,gBAAgB,CAAC,CAAC;CACtC,CAAC;;;yBA5CF,CAtjBqB;;;;;;;AA45CrB,wBAOG"}
@@ -0,0 +1,10 @@
1
+ type __VLS_Props = {
2
+ open: boolean;
3
+ };
4
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
5
+ close: () => any;
6
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
7
+ onClose?: (() => any) | undefined;
8
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
9
+ export default _default;
10
+ //# sourceMappingURL=HelpPanel.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HelpPanel.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/HelpPanel.vue"],"names":[],"mappings":"AAkbA,KAAK,WAAW,GAAG;IAAE,IAAI,EAAE,OAAO,CAAA;CAAE,CAAC;;;;;;AA6arC,wBAOG"}
@@ -0,0 +1,48 @@
1
+ import type { EditorNodeV2, HeaderFooterV2, SchemaIssueV2 } from "../../types";
2
+ import type { SchemaEdits } from "./composables/useSchemaEdits";
3
+ type __VLS_Props = {
4
+ /** 当前选中节点(Table 内派生节点不可选中,故为 null 时不渲染类型分支)。 */
5
+ node: EditorNodeV2 | null;
6
+ nodeId: string | null;
7
+ /** 中文类型名(未选择时为「未选择」)。 */
8
+ nodeType: string;
9
+ cellContext: {
10
+ rowIndex: number;
11
+ columnIndex: number;
12
+ hasNextSibling: boolean;
13
+ canSplit: boolean;
14
+ } | null;
15
+ cellBox: {
16
+ align?: string;
17
+ verticalAlign?: string;
18
+ } | null;
19
+ issues: SchemaIssueV2[];
20
+ api: SchemaEdits;
21
+ paperSize: "A4" | "A3";
22
+ baseRowHeight: number;
23
+ /** 四边边距(mm),独立配置;选中页面时取该页 margin,否则回退 12。 */
24
+ paperMarginTop: number;
25
+ paperMarginRight: number;
26
+ paperMarginBottom: number;
27
+ paperMarginLeft: number;
28
+ /** 页眉配置(paper 级,透传给 PageInspector)。 */
29
+ header?: HeaderFooterV2;
30
+ /** 页脚配置(paper 级,透传给 PageInspector)。 */
31
+ footer?: HeaderFooterV2;
32
+ };
33
+ type __VLS_PublicProps = __VLS_Props & {
34
+ /** 分页开关(仅设计态生效):双向绑定到宿主的 `paginate`。 */
35
+ "paginate": boolean;
36
+ };
37
+ declare const _default: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
38
+ "update:paginate": (value: boolean) => any;
39
+ selectIssue: (issue: SchemaIssueV2) => any;
40
+ }, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
41
+ "onUpdate:paginate"?: ((value: boolean) => any) | undefined;
42
+ onSelectIssue?: ((issue: SchemaIssueV2) => any) | undefined;
43
+ }>, {
44
+ node: EditorNodeV2 | null;
45
+ nodeId: string | null;
46
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
47
+ export default _default;
48
+ //# sourceMappingURL=InspectorPanel.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"InspectorPanel.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/InspectorPanel.vue"],"names":[],"mappings":"AA8KA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC3E,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAchE,KAAK,WAAW,GAAG;IACf,gDAAgD;IAChD,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IAC1B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,yBAAyB;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE;QACX,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,cAAc,EAAE,OAAO,CAAC;QACxB,QAAQ,EAAE,OAAO,CAAC;KACnB,GAAG,IAAI,CAAC;IACT,OAAO,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAC3D,MAAM,EAAE,aAAa,EAAE,CAAC;IACxB,GAAG,EAAE,WAAW,CAAC;IACjB,SAAS,EAAE,IAAI,GAAG,IAAI,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,6CAA6C;IAC7C,cAAc,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,uCAAuC;IACvC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,uCAAuC;IACvC,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB,CAAC;AA8CJ,KAAK,iBAAiB,GAAG,WAAW,GAAG;IACvC,wCAAwC;IACxC,UAAU,EAAE,OAAO,CAAC;CACnB,CAAC;;;;;;;;UAzEQ,YAAY,GAAG,IAAI;YACjB,MAAM,GAAG,IAAI;;AAyRzB,wBAQG"}
@@ -0,0 +1,18 @@
1
+ export interface TreeNode {
2
+ id: string;
3
+ type: string;
4
+ label: string;
5
+ children: TreeNode[];
6
+ }
7
+ type __VLS_Props = {
8
+ node: TreeNode;
9
+ selectedId: string | null;
10
+ depth: number;
11
+ };
12
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
13
+ select: (id: string) => any;
14
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
15
+ onSelect?: ((id: string) => any) | undefined;
16
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
17
+ export default _default;
18
+ //# sourceMappingURL=NodeTreeItem.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeTreeItem.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/NodeTreeItem.vue"],"names":[],"mappings":"AAkKA,MAAM,WAAW,QAAQ;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,QAAQ,EAAE,CAAC;CACtB;AAID,KAAK,WAAW,GAAG;IACjB,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC;;;;;;AA+JF,wBAOG"}
@@ -0,0 +1,29 @@
1
+ import type { TreeNode } from "./NodeTreeItem.vue";
2
+ import type { NodeKind } from "./composables/useSchemaEdits";
3
+ type __VLS_Props = {
4
+ /** 统一编辑闸门(C1):非设计态零件库禁用、删除按钮禁用。 */
5
+ editable: boolean;
6
+ /** 删除按钮完整禁用态(含 page/grid-cell 不可删判定),由宿主计算。 */
7
+ canRemove: boolean;
8
+ nodeTree: TreeNode[];
9
+ selectedNodeId: string | null;
10
+ };
11
+ declare const _default: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {} & {
12
+ select: (id: string) => any;
13
+ "add-node": (kind: NodeKind) => any;
14
+ "add-grid": () => any;
15
+ "palette-drag": (kind: NodeKind, event: DragEvent) => any;
16
+ "remove-selected": () => any;
17
+ "collapse-all": () => any;
18
+ "expand-all": () => any;
19
+ }, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
20
+ onSelect?: ((id: string) => any) | undefined;
21
+ "onAdd-node"?: ((kind: NodeKind) => any) | undefined;
22
+ "onAdd-grid"?: (() => any) | undefined;
23
+ "onPalette-drag"?: ((kind: NodeKind, event: DragEvent) => any) | undefined;
24
+ "onRemove-selected"?: (() => any) | undefined;
25
+ "onCollapse-all"?: (() => any) | undefined;
26
+ "onExpand-all"?: (() => any) | undefined;
27
+ }>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
28
+ export default _default;
29
+ //# sourceMappingURL=PaletteSidebar.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PaletteSidebar.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/PaletteSidebar.vue"],"names":[],"mappings":"AAuTA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAG7D,KAAK,WAAW,GAAG;IACjB,mCAAmC;IACnC,QAAQ,EAAE,OAAO,CAAC;IAClB,+CAA+C;IAC/C,SAAS,EAAE,OAAO,CAAC;IACnB,QAAQ,EAAE,QAAQ,EAAE,CAAC;IACrB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B,CAAC;;;;;;;;;;;;;;;;;;AA2RF,wBAOG"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * 底部状态栏
3
+ *
4
+ * 职责(v1 阶段 3.2 骨架 + 2026-09-02 十九续):
5
+ * - 显示当前**逻辑**页数
6
+ * - 显示**物理(打印)页数**:与逻辑页数不同时才提示,用于暴露「内容超高 → 换页」
7
+ * (此前分页结果只能靠肉眼在画布里找;十九续起由状态栏统一暴露打印张数与分页告警)
8
+ * - 显示分页警告数(结构校验警告 + 分页超高告警)
9
+ * - 缩放控件占位(阶段 5 完善)
10
+ *
11
+ * 设计依据:docs/design-biz.md §2.1(设计器界面)。
12
+ */
13
+ type __VLS_Props = {
14
+ /** 当前逻辑页数 */
15
+ pageCount: number;
16
+ /** 结构校验警告数 */
17
+ warningCount: number;
18
+ /** 物理(打印)页数,由分页引擎算出;等于逻辑页数时不额外展示。 */
19
+ physicalPageCount?: number | null;
20
+ /** 分页超高告警数(单个节点比整页还高、被强制放入而可能裁切)。 */
21
+ paginateWarningCount?: number;
22
+ };
23
+ 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>;
24
+ export default _default;
25
+ //# sourceMappingURL=StatusBar.vue.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StatusBar.vue.d.ts","sourceRoot":"","sources":["../../../src/components/designer/StatusBar.vue"],"names":[],"mappings":"AA2GA;;;;;;;;;;;GAWG;AAEH,KAAK,WAAW,GAAG;IACjB,aAAa;IACb,SAAS,EAAE,MAAM,CAAA;IACjB,cAAc;IACd,YAAY,EAAE,MAAM,CAAA;IACpB,qCAAqC;IACrC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACjC,qCAAqC;IACrC,oBAAoB,CAAC,EAAE,MAAM,CAAA;CAC9B,CAAC;;AAgGF,wBAMG"}
@@ -0,0 +1,65 @@
1
+ import type { InjectionKey, Ref } from "vue";
2
+ import type { TreeNode } from "../NodeTreeItem.vue";
3
+ /**
4
+ * 结构树共享信号(折叠/展开 + 定位)。
5
+ *
6
+ * 设计器左侧结构树是 `NodeTreeItem` 递归组件,每个节点默认持有**局部**
7
+ * `expanded` 状态(可单独展开/折叠)。要支持全局「折叠全部 / 展开全部」,
8
+ * 需由一个统一信号驱动所有节点重设展开态:
9
+ *
10
+ * - `token`:每次触发「折叠全部 / 展开全部」自增 1,挂载中的 `NodeTreeItem`
11
+ * 通过 `watch(token)` 把自己的局部 `expanded` 同步到 `target`;
12
+ * - `target`:`true` = 展开,`false` = 折叠。新挂载的节点以当前 `target`
13
+ * 作为初始态(例如「折叠全部」后再新增节点,新节点也应处于折叠态)。
14
+ *
15
+ * 单独的节点点击仍走局部 `onToggle`,与全局信号互不干扰;随后的全局操作
16
+ * 会再次覆盖(符合「点折叠全部后,仍可单独展开某个节点」的预期)。
17
+ *
18
+ * 「定位」(画布点选 → 左侧结构树定位)复用同一信号对象:
19
+ * - `focusId`:待定位的节点 id;
20
+ * - `focusToken`:每次定位自增 1。`NodeTreeItem` 在 `token` 变化时判断
21
+ * `focusId` 是否落在自己的子树内,是则展开自己(保证目标行被渲染出来);
22
+ * 滚动到可见由 `PaletteSidebar` 负责(只有它持有 `.v2-tree` 容器)。
23
+ *
24
+ * 为什么拆成两个 ref 而不是一个 payload:`watch` 需要在**每次**定位都触发,
25
+ * 而连续两次定位可能指向同一 id —— 只看 `focusId` 会漏掉第二次。`token`
26
+ * 单调自增保证每次都驱动一轮副作用。
27
+ */
28
+ export interface TreeControl {
29
+ token: Ref<number>;
30
+ target: Ref<boolean>;
31
+ focusId: Ref<string | null>;
32
+ focusToken: Ref<number>;
33
+ }
34
+ export declare const TreeControlKey: InjectionKey<TreeControl>;
35
+ /** `node` 自身或其任一后代是否为 `id`(`id` 为空返回 false)。 */
36
+ export declare function treeContainsId(node: TreeNode, id: string | null): boolean;
37
+ /** 滚动容器与目标行所需的最小结构(便于单测用假对象注入尺寸)。 */
38
+ export interface ScrollableView {
39
+ clientHeight: number;
40
+ scrollTop: number;
41
+ getBoundingClientRect(): {
42
+ top: number;
43
+ bottom: number;
44
+ };
45
+ }
46
+ export interface Measurable {
47
+ getBoundingClientRect(): {
48
+ top: number;
49
+ bottom: number;
50
+ };
51
+ }
52
+ /**
53
+ * 计算「让 `row` 在 `view` 内可见」所需的最小滚动位移(就近滚动)。
54
+ *
55
+ * 取 `nearest` 语义:已在视野内不动;上方越界则上移,下方越界则下移,
56
+ * 两侧各留 `padding` 像素余量。**只返回新的 `scrollTop`,不写 DOM**,
57
+ * 便于单测(jsdom 无布局,真实 rect 恒为 0)。
58
+ */
59
+ export declare function computeRevealScrollTop(view: ScrollableView, row: Measurable, padding?: number): number;
60
+ /**
61
+ * 把 `row` 就近滚动到 `view` 可见区域。返回是否真的发生了滚动
62
+ * (测试与调用方可用于判断「已经在视野内」)。
63
+ */
64
+ export declare function scrollRowIntoView(view: ScrollableView, row: Measurable, padding?: number): boolean;
65
+ //# sourceMappingURL=treeControl.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"treeControl.d.ts","sourceRoot":"","sources":["../../../../src/components/designer/composables/treeControl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnB,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACrB,OAAO,EAAE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC5B,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CACzB;AAED,eAAO,MAAM,cAAc,EAAE,YAAY,CAAC,WAAW,CAEpD,CAAC;AAEF,gDAAgD;AAChD,wBAAgB,cAAc,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,GAAG,IAAI,GAAG,OAAO,CAIzE;AAED,qCAAqC;AACrC,MAAM,WAAW,cAAc;IAC7B,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,CAAC;IAClB,qBAAqB,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED,MAAM,WAAW,UAAU;IACzB,qBAAqB,IAAI;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;CAC1D;AAED;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,cAAc,EACpB,GAAG,EAAE,UAAU,EACf,OAAO,SAAI,GACV,MAAM,CASR;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,cAAc,EAAE,GAAG,EAAE,UAAU,EAAE,OAAO,SAAI,GAAG,OAAO,CAK7F"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * 填充数据生命周期:表单数据本身 + 导入 / 导出 / 存本地 / 读本地。
3
+ *
4
+ * 从 `FormDesigner.vue` 抽出(2026-09-07 批次 1 拆分):只管「表单数据」,
5
+ * 与 schema 存储键隔离(`DATA_STORAGE_KEY` vs `SCHEMA_STORAGE_KEY`)。
6
+ *
7
+ * **导出 / 保存数据不限预览态**(2026-09-11 改):值一律经 `collectFieldValues` 遍历渲染
8
+ * DOM 采集(薄封装 `collectFormData`),设计态同样有渲染 DOM(字段的默认值),
9
+ * 没有配置任何字段时结果就是 `{}`。
10
+ */
11
+ import { type Ref } from "vue";
12
+ import type { FormDataV2 } from "../../../types";
13
+ export declare const DATA_STORAGE_KEY = "ticket-designer-fill-data-v2";
14
+ /** 「导出数据」在控制台打印的标签(内容即表单数据 JSON 文本)。 */
15
+ export declare const FILL_DATA_LOG_LABEL = "[ticket-designer] \u8868\u5355\u6570\u636E JSON";
16
+ export type FillData = ReturnType<typeof useFillData>;
17
+ export declare function useFillData(options: {
18
+ /** 画布根元素:导出/保存时遍历其 DOM 采集字段与值。 */
19
+ canvasEl: Ref<HTMLElement | null>;
20
+ /** 载入数据并进入预览态(含清选中),由宿主编排。 */
21
+ enterPreview: (data: FormDataV2) => void;
22
+ }): {
23
+ previewFormData: {
24
+ value: FormDataV2 | null;
25
+ };
26
+ previewData: import("vue").ComputedRef<FormDataV2 | null>;
27
+ fillDataFileInput: Ref<HTMLInputElement | null, HTMLInputElement | null>;
28
+ importFillDataFile: (event: Event) => void;
29
+ triggerImportFillData: () => void;
30
+ exportFillDataFile: () => void;
31
+ saveFillDataToLocal: () => void;
32
+ loadFillDataFromLocal: () => void;
33
+ };
34
+ //# sourceMappingURL=useFillData.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useFillData.d.ts","sourceRoot":"","sources":["../../../../src/components/designer/composables/useFillData.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,EAA2B,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAS1C,eAAO,MAAM,gBAAgB,iCAAiC,CAAC;AAE/D,wCAAwC;AACxC,eAAO,MAAM,mBAAmB,oDAAgC,CAAC;AAEjE,MAAM,MAAM,QAAQ,GAAG,UAAU,CAAC,OAAO,WAAW,CAAC,CAAC;AAEtD,wBAAgB,WAAW,CAAC,OAAO,EAAE;IACnC,kCAAkC;IAClC,QAAQ,EAAE,GAAG,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAClC,8BAA8B;IAC9B,YAAY,EAAE,CAAC,IAAI,EAAE,UAAU,KAAK,IAAI,CAAC;CAC1C;;eAC2C,UAAU,GAAG,IAAI;;;;gCAOxB,KAAK,KAAG,IAAI;iCAyBb,IAAI;8BAUP,IAAI;+BAsBH,IAAI;iCAmBF,IAAI;EAyBvC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * 设计器选择态:当前选中节点、层级循环选中、结构树构建、插入槽判定。
3
+ *
4
+ * 从 `FormDesigner.vue` 抽出(2026-09-07 批次 1 拆分):只管「选的是谁」,
5
+ * 不负责改 schema(改结构在 `useSchemaEdits`),也不渲染任何 DOM。
6
+ *
7
+ * 选中规则:
8
+ * - `grid-row` 只是布局容器,不进树、不可选中;
9
+ * - `grid-cell` 可选中(仅样式可编辑、不可删除);
10
+ * - Table 行模板内的节点不可单独选中,点击归到所属 Table。
11
+ */
12
+ import { type Ref } from "vue";
13
+ import type { EditorNodeV2, FormSchemaV2, GridCellV2, GridNodeV2, SchemaIssueV2 } from "../../../types";
14
+ import type { TreeNode } from "../NodeTreeItem.vue";
15
+ /**
16
+ * 节点类型的用户可见中文名(面向普通用户;grid 称「网格」,grid-cell 称「格子」,
17
+ * 与左侧组件面板的叫法保持一致)。
18
+ */
19
+ export declare const NODE_TYPE_LABELS: Record<string, string>;
20
+ export declare function nodeTypeLabel(type: string): string;
21
+ export declare function nodeLabel(node: EditorNodeV2): string;
22
+ export declare function buildTreeNode(node: EditorNodeV2): TreeNode;
23
+ export declare function buildGridTree(grid: GridNodeV2): TreeNode;
24
+ export declare function buildCellTree(cell: GridCellV2, ri: number, ci: number, colCount: number, rowCount: number): TreeNode;
25
+ /** 选择态句柄:类型由实现推断,避免手写签名与实现漂移。 */
26
+ export type NodeSelection = ReturnType<typeof useNodeSelection>;
27
+ export declare function useNodeSelection(schema: Ref<FormSchemaV2>, options: {
28
+ editable: () => boolean;
29
+ }): {
30
+ selectedNodeId: Ref<string | null, string | null>;
31
+ selectedInsertionSlotId: Ref<string | null, string | null>;
32
+ selectionPathIds: Ref<string[], string[]>;
33
+ selectionPathIndex: Ref<number, number>;
34
+ nodeIndex: import("vue").ComputedRef<import("../../../types").EditorNodeIndexV2>;
35
+ selectedNode: import("vue").ComputedRef<EditorNodeV2 | null>;
36
+ selectedNodeType: import("vue").ComputedRef<string>;
37
+ selectedOwnerCell: import("vue").ComputedRef<GridCellV2 | import("../../../types").TableCellTemplateV2 | null>;
38
+ selectedCell: import("vue").ComputedRef<GridCellV2 | null>;
39
+ selectedOwnerGridOfCell: import("vue").ComputedRef<GridNodeV2 | null>;
40
+ selectedCellBox: import("vue").ComputedRef<import("../../../engine-v2/derivation").ResolvedCellBoxV2 | null>;
41
+ selectedCellContext: import("vue").ComputedRef<{
42
+ rowIndex: number;
43
+ columnIndex: number;
44
+ hasNextSibling: boolean;
45
+ canSplit: boolean;
46
+ } | null>;
47
+ insertionSlot: import("vue").ComputedRef<GridCellV2 | import("../../../types").TableCellTemplateV2 | null>;
48
+ nodeTree: import("vue").ComputedRef<TreeNode[]>;
49
+ isInsideTable: (id: string) => boolean;
50
+ isStyleEditableNodeId: (id: string) => boolean;
51
+ clearSelection: () => void;
52
+ selectNode: (event: MouseEvent) => void;
53
+ selectNodeById: (id: string) => void;
54
+ selectIssue: (issue: SchemaIssueV2) => void;
55
+ };
56
+ //# sourceMappingURL=useNodeSelection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useNodeSelection.d.ts","sourceRoot":"","sources":["../../../../src/components/designer/composables/useNodeSelection.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAiB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAK9C,OAAO,KAAK,EACV,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,UAAU,EAEV,aAAa,EACd,MAAM,SAAS,CAAC;AAGjB,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CASnD,CAAC;AAEF,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,YAAY,GAAG,MAAM,CAmBpD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,YAAY,GAAG,QAAQ,CAW1D;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,UAAU,GAAG,QAAQ,CAQxD;AAED,wBAAgB,aAAa,CAC3B,IAAI,EAAE,UAAU,EAChB,EAAE,EAAE,MAAM,EACV,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,MAAM,GACf,QAAQ,CASV;AAED,iCAAiC;AACjC,MAAM,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE,wBAAgB,gBAAgB,CAC9B,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,EACzB,OAAO,EAAE;IAAE,QAAQ,EAAE,MAAM,OAAO,CAAA;CAAE;;;;;;;;;;;;;kBA8DxB,MAAM;qBACH,MAAM;wBACH,OAAO;kBACb,OAAO;;;;wBApDQ,MAAM,KAAG,OAAO;gCAUR,MAAM,KAAG,OAAO;0BA0ExB,IAAI;wBAUJ,UAAU,KAAG,IAAI;yBAyDhB,MAAM,KAAG,IAAI;yBAtBb,aAAa,KAAG,IAAI;EA+DjD"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * 设计器文档状态:schema / 提交与历史 / 本地持久化 / 文件导入导出。
3
+ *
4
+ * 从 `FormDesigner.vue` 抽出(2026-09-07 批次 1 拆分):只管「文档本身」,
5
+ * 不认识选中、不认识 DOM、不认识视图模式,可脱离组件单测。
6
+ *
7
+ * 使用方通过 `commit()` 提交新的不可变 schema;结构性改动不带 tag(各自独立
8
+ * 撤销步),检查器输入带 per-node tag(800ms 内连续输入合并为一步)。
9
+ */
10
+ import { type Ref } from "vue";
11
+ import type { FormSchemaV2 } from "../../../types";
12
+ /**
13
+ * 「导出文件」在控制台打印的标签。宿主联调时用它一眼认出设计器的输出,
14
+ * 也便于自动化脚本按前缀捕获(`console.log` 内容即 schema JSON 文本)。
15
+ */
16
+ export declare const SCHEMA_LOG_LABEL = "[ticket-designer] schema \u914D\u7F6E JSON";
17
+ export declare const SCHEMA_STORAGE_KEY = "ticket-designer-schema-v2";
18
+ /** 空白初始化:空 page + 一个根 Grid,便于用户从空白开始设计。 */
19
+ export declare function buildBlankSchema(): FormSchemaV2;
20
+ export interface SchemaDocument {
21
+ schema: Ref<FormSchemaV2>;
22
+ dirty: Ref<boolean>;
23
+ canUndo: Ref<boolean>;
24
+ canRedo: Ref<boolean>;
25
+ fileInput: Ref<HTMLInputElement | null>;
26
+ commit: (next: FormSchemaV2, tag?: string) => void;
27
+ resetHistory: (next: FormSchemaV2) => void;
28
+ undo: () => void;
29
+ redo: () => void;
30
+ saveToLocal: () => void;
31
+ loadFromLocal: () => void;
32
+ exportFile: () => void;
33
+ importFile: (event: Event) => void;
34
+ triggerImport: () => void;
35
+ }
36
+ export interface SchemaDocumentOptions {
37
+ /**
38
+ * 整份文档被替换后(读取本地 / 导入文件)的回调:宿主通常在此清空选中,
39
+ * 否则选中态会指向已不存在的节点。
40
+ */
41
+ onReset?: () => void;
42
+ }
43
+ export declare function useSchemaDocument(initialSchema?: FormSchemaV2, options?: SchemaDocumentOptions): SchemaDocument;
44
+ //# sourceMappingURL=useSchemaDocument.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useSchemaDocument.d.ts","sourceRoot":"","sources":["../../../../src/components/designer/composables/useSchemaDocument.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,OAAO,EAAwB,KAAK,GAAG,EAAE,MAAM,KAAK,CAAC;AAQrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAQ5C;;;GAGG;AACH,eAAO,MAAM,gBAAgB,+CAAqC,CAAC;AAEnE,eAAO,MAAM,kBAAkB,8BAA8B,CAAC;AAM9D,2CAA2C;AAC3C,wBAAgB,gBAAgB,IAAI,YAAY,CAI/C;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;IAC1B,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACpB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;IACtB,SAAS,EAAE,GAAG,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAAC;IACxC,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACnD,YAAY,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAC;IAC3C,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,UAAU,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IACnC,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAED,MAAM,WAAW,qBAAqB;IACpC;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAED,wBAAgB,iBAAiB,CAC/B,aAAa,CAAC,EAAE,YAAY,EAC5B,OAAO,GAAE,qBAA0B,GAClC,cAAc,CA+JhB"}