zc-lowcode 0.0.2 → 0.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +437 -3
- package/designer.d.ts +5 -0
- package/dist/assets/code-editor.css +1 -0
- package/dist/assets/designer.css +1 -0
- package/dist/assets/materials.css +1 -0
- package/dist/assets/runtime-definitions.css +1 -0
- package/dist/assets/runtime.css +1 -0
- package/dist/assets/sortable.css +1 -0
- package/dist/code-editor-DJwwp3uU.js +9 -0
- package/dist/code-editor-DJwwp3uU.js.map +1 -0
- package/dist/code-editor.vue_vue_type_script_setup_true_lang-aA043pnA.js +40176 -0
- package/dist/code-editor.vue_vue_type_script_setup_true_lang-aA043pnA.js.map +1 -0
- package/dist/core/index.d.ts +560 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core.js +881 -0
- package/dist/core.js.map +1 -0
- package/dist/designer/canvas/draggable-list.vue.d.ts +15 -0
- package/dist/designer/canvas/draggable-list.vue.d.ts.map +1 -0
- package/dist/designer/canvas/widget-node.vue.d.ts +11 -0
- package/dist/designer/canvas/widget-node.vue.d.ts.map +1 -0
- package/dist/designer/canvas/workspace.vue.d.ts +3 -0
- package/dist/designer/canvas/workspace.vue.d.ts.map +1 -0
- package/dist/designer/datasource/data-editor.vue.d.ts +13 -0
- package/dist/designer/datasource/data-editor.vue.d.ts.map +1 -0
- package/dist/designer/datasource/datasource-help.d.ts +9 -0
- package/dist/designer/datasource/datasource-help.d.ts.map +1 -0
- package/dist/designer/datasource/panel.vue.d.ts +3 -0
- package/dist/designer/datasource/panel.vue.d.ts.map +1 -0
- package/dist/designer/designer.d.ts +119 -0
- package/dist/designer/designer.d.ts.map +1 -0
- package/dist/designer/designer.vue.d.ts +40 -0
- package/dist/designer/designer.vue.d.ts.map +1 -0
- package/dist/designer/index.d.ts +13 -0
- package/dist/designer/index.d.ts.map +1 -0
- package/dist/designer/material-registry.d.ts +19 -0
- package/dist/designer/material-registry.d.ts.map +1 -0
- package/dist/designer/materials/widget-library.vue.d.ts +3 -0
- package/dist/designer/materials/widget-library.vue.d.ts.map +1 -0
- package/dist/designer/methods/api-method-params-list.vue.d.ts +14 -0
- package/dist/designer/methods/api-method-params-list.vue.d.ts.map +1 -0
- package/dist/designer/methods/api-param-bind-button.vue.d.ts +17 -0
- package/dist/designer/methods/api-param-bind-button.vue.d.ts.map +1 -0
- package/dist/designer/methods/api-param-list.vue.d.ts +19 -0
- package/dist/designer/methods/api-param-list.vue.d.ts.map +1 -0
- package/dist/designer/methods/api-result-rules-list.vue.d.ts +16 -0
- package/dist/designer/methods/api-result-rules-list.vue.d.ts.map +1 -0
- package/dist/designer/methods/method-api-config-form.vue.d.ts +15 -0
- package/dist/designer/methods/method-api-config-form.vue.d.ts.map +1 -0
- package/dist/designer/methods/page-method-api.d.ts +37 -0
- package/dist/designer/methods/page-method-api.d.ts.map +1 -0
- package/dist/designer/methods/page-method-editor-modal.vue.d.ts +30 -0
- package/dist/designer/methods/page-method-editor-modal.vue.d.ts.map +1 -0
- package/dist/designer/methods/page-method-simulate-args-modal.vue.d.ts +18 -0
- package/dist/designer/methods/page-method-simulate-args-modal.vue.d.ts.map +1 -0
- package/dist/designer/methods/page-methods.vue.d.ts +3 -0
- package/dist/designer/methods/page-methods.vue.d.ts.map +1 -0
- package/dist/designer/methods/use-page-methods-editor.d.ts +163 -0
- package/dist/designer/methods/use-page-methods-editor.d.ts.map +1 -0
- package/dist/designer/outline/panel.vue.d.ts +5 -0
- package/dist/designer/outline/panel.vue.d.ts.map +1 -0
- package/dist/designer/properties/panel.vue.d.ts +18 -0
- package/dist/designer/properties/panel.vue.d.ts.map +1 -0
- package/dist/designer/shared/code-editor-page-context-completion.d.ts +39 -0
- package/dist/designer/shared/code-editor-page-context-completion.d.ts.map +1 -0
- package/dist/designer/shared/code-editor.vue.d.ts +93 -0
- package/dist/designer/shared/code-editor.vue.d.ts.map +1 -0
- package/dist/designer/use-designer-shortcuts.d.ts +21 -0
- package/dist/designer/use-designer-shortcuts.d.ts.map +1 -0
- package/dist/designer-style.js +4 -0
- package/dist/designer.js +3215 -0
- package/dist/designer.js.map +1 -0
- package/dist/materials/definitions.d.ts +3 -0
- package/dist/materials/definitions.d.ts.map +1 -0
- package/dist/materials/index.d.ts +11 -0
- package/dist/materials/index.d.ts.map +1 -0
- package/dist/materials/packages/button/index.d.ts +4 -0
- package/dist/materials/packages/button/index.d.ts.map +1 -0
- package/dist/materials/packages/button/options.d.ts +45 -0
- package/dist/materials/packages/button/options.d.ts.map +1 -0
- package/dist/materials/packages/button/setter.vue.d.ts +7 -0
- package/dist/materials/packages/button/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/button/view.vue.d.ts +11 -0
- package/dist/materials/packages/button/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/card/index.d.ts +4 -0
- package/dist/materials/packages/card/index.d.ts.map +1 -0
- package/dist/materials/packages/card/options.d.ts +24 -0
- package/dist/materials/packages/card/options.d.ts.map +1 -0
- package/dist/materials/packages/card/setter.vue.d.ts +7 -0
- package/dist/materials/packages/card/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/card/view.vue.d.ts +28 -0
- package/dist/materials/packages/card/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/carousel/carousel-slide/options.d.ts +12 -0
- package/dist/materials/packages/carousel/carousel-slide/options.d.ts.map +1 -0
- package/dist/materials/packages/carousel/carousel-slide/setter.vue.d.ts +7 -0
- package/dist/materials/packages/carousel/carousel-slide/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/carousel/carousel-slide/view.vue.d.ts +24 -0
- package/dist/materials/packages/carousel/carousel-slide/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/carousel/designer.vue.d.ts +30 -0
- package/dist/materials/packages/carousel/designer.vue.d.ts.map +1 -0
- package/dist/materials/packages/carousel/index.d.ts +5 -0
- package/dist/materials/packages/carousel/index.d.ts.map +1 -0
- package/dist/materials/packages/carousel/options.d.ts +65 -0
- package/dist/materials/packages/carousel/options.d.ts.map +1 -0
- package/dist/materials/packages/carousel/setter.vue.d.ts +7 -0
- package/dist/materials/packages/carousel/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/carousel/view.vue.d.ts +41 -0
- package/dist/materials/packages/carousel/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/divider/index.d.ts +4 -0
- package/dist/materials/packages/divider/index.d.ts.map +1 -0
- package/dist/materials/packages/divider/options.d.ts +39 -0
- package/dist/materials/packages/divider/options.d.ts.map +1 -0
- package/dist/materials/packages/divider/setter.vue.d.ts +7 -0
- package/dist/materials/packages/divider/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/divider/view.vue.d.ts +11 -0
- package/dist/materials/packages/divider/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/grid/designer.vue.d.ts +160 -0
- package/dist/materials/packages/grid/designer.vue.d.ts.map +1 -0
- package/dist/materials/packages/grid/index.d.ts +4 -0
- package/dist/materials/packages/grid/index.d.ts.map +1 -0
- package/dist/materials/packages/grid/options.d.ts +41 -0
- package/dist/materials/packages/grid/options.d.ts.map +1 -0
- package/dist/materials/packages/grid/setter.vue.d.ts +7 -0
- package/dist/materials/packages/grid/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/grid/split.d.ts +18 -0
- package/dist/materials/packages/grid/split.d.ts.map +1 -0
- package/dist/materials/packages/grid/view.vue.d.ts +35 -0
- package/dist/materials/packages/grid/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/image/index.d.ts +4 -0
- package/dist/materials/packages/image/index.d.ts.map +1 -0
- package/dist/materials/packages/image/options.d.ts +31 -0
- package/dist/materials/packages/image/options.d.ts.map +1 -0
- package/dist/materials/packages/image/setter.vue.d.ts +7 -0
- package/dist/materials/packages/image/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/image/view.vue.d.ts +11 -0
- package/dist/materials/packages/image/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/list/designer.vue.d.ts +29 -0
- package/dist/materials/packages/list/designer.vue.d.ts.map +1 -0
- package/dist/materials/packages/list/index.d.ts +4 -0
- package/dist/materials/packages/list/index.d.ts.map +1 -0
- package/dist/materials/packages/list/options.d.ts +60 -0
- package/dist/materials/packages/list/options.d.ts.map +1 -0
- package/dist/materials/packages/list/setter.vue.d.ts +7 -0
- package/dist/materials/packages/list/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/list/view.vue.d.ts +31 -0
- package/dist/materials/packages/list/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/tab/designer.vue.d.ts +30 -0
- package/dist/materials/packages/tab/designer.vue.d.ts.map +1 -0
- package/dist/materials/packages/tab/index.d.ts +5 -0
- package/dist/materials/packages/tab/index.d.ts.map +1 -0
- package/dist/materials/packages/tab/options.d.ts +48 -0
- package/dist/materials/packages/tab/options.d.ts.map +1 -0
- package/dist/materials/packages/tab/setter.vue.d.ts +7 -0
- package/dist/materials/packages/tab/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/tab/tab-pane/options.d.ts +13 -0
- package/dist/materials/packages/tab/tab-pane/options.d.ts.map +1 -0
- package/dist/materials/packages/tab/tab-pane/setter.vue.d.ts +7 -0
- package/dist/materials/packages/tab/tab-pane/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/tab/tab-pane/view.vue.d.ts +24 -0
- package/dist/materials/packages/tab/tab-pane/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/tab/view.vue.d.ts +34 -0
- package/dist/materials/packages/tab/view.vue.d.ts.map +1 -0
- package/dist/materials/packages/text/index.d.ts +4 -0
- package/dist/materials/packages/text/index.d.ts.map +1 -0
- package/dist/materials/packages/text/options.d.ts +29 -0
- package/dist/materials/packages/text/options.d.ts.map +1 -0
- package/dist/materials/packages/text/setter.vue.d.ts +7 -0
- package/dist/materials/packages/text/setter.vue.d.ts.map +1 -0
- package/dist/materials/packages/text/view.vue.d.ts +11 -0
- package/dist/materials/packages/text/view.vue.d.ts.map +1 -0
- package/dist/materials/page/index.d.ts +4 -0
- package/dist/materials/page/index.d.ts.map +1 -0
- package/dist/materials/page/lifecycle-panel.vue.d.ts +13 -0
- package/dist/materials/page/lifecycle-panel.vue.d.ts.map +1 -0
- package/dist/materials/page/setter-slots.d.ts +7 -0
- package/dist/materials/page/setter-slots.d.ts.map +1 -0
- package/dist/materials/page/setter.vue.d.ts +25 -0
- package/dist/materials/page/setter.vue.d.ts.map +1 -0
- package/dist/materials/page/view.vue.d.ts +26 -0
- package/dist/materials/page/view.vue.d.ts.map +1 -0
- package/dist/materials/runtime-definitions.d.ts +10 -0
- package/dist/materials/runtime-definitions.d.ts.map +1 -0
- package/dist/materials/shared/designer/container-children.vue.d.ts +24 -0
- package/dist/materials/shared/designer/container-children.vue.d.ts.map +1 -0
- package/dist/materials/shared/designer/helpers.d.ts +68 -0
- package/dist/materials/shared/designer/helpers.d.ts.map +1 -0
- package/dist/materials/shared/designer/icon.vue.d.ts +8 -0
- package/dist/materials/shared/designer/icon.vue.d.ts.map +1 -0
- package/dist/materials/shared/designer/selection-chrome.vue.d.ts +31 -0
- package/dist/materials/shared/designer/selection-chrome.vue.d.ts.map +1 -0
- package/dist/materials/shared/designer/use-keyed-slot-sync.d.ts +15 -0
- package/dist/materials/shared/designer/use-keyed-slot-sync.d.ts.map +1 -0
- package/dist/materials/shared/designer/use-widget-size-resize.d.ts +16 -0
- package/dist/materials/shared/designer/use-widget-size-resize.d.ts.map +1 -0
- package/dist/materials/shared/envelopes/internal-pane-view.vue.d.ts +29 -0
- package/dist/materials/shared/envelopes/internal-pane-view.vue.d.ts.map +1 -0
- package/dist/materials/shared/envelopes/item-scope-provider.vue.d.ts +22 -0
- package/dist/materials/shared/envelopes/item-scope-provider.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/binding-form-item.vue.d.ts +40 -0
- package/dist/materials/shared/setter/components/binding-form-item.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/binding-picker/binding-scope-tree.d.ts +83 -0
- package/dist/materials/shared/setter/components/binding-picker/binding-scope-tree.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/binding-picker/binding-utils.d.ts +105 -0
- package/dist/materials/shared/setter/components/binding-picker/binding-utils.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/binding-picker/index.vue.d.ts +30 -0
- package/dist/materials/shared/setter/components/binding-picker/index.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/box-model.vue.d.ts +11 -0
- package/dist/materials/shared/setter/components/box-model.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/color-input.vue.d.ts +14 -0
- package/dist/materials/shared/setter/components/color-input.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/image-upload.vue.d.ts +25 -0
- package/dist/materials/shared/setter/components/image-upload.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/keyed-slot-child-list.vue.d.ts +17 -0
- package/dist/materials/shared/setter/components/keyed-slot-child-list.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/offset-box.vue.d.ts +11 -0
- package/dist/materials/shared/setter/components/offset-box.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/percent-input.vue.d.ts +19 -0
- package/dist/materials/shared/setter/components/percent-input.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/components/style-property-input.vue.d.ts +92 -0
- package/dist/materials/shared/setter/components/style-property-input.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/composables/use-page-data-field-options.d.ts +15 -0
- package/dist/materials/shared/setter/composables/use-page-data-field-options.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/animation-panel.vue.d.ts +7 -0
- package/dist/materials/shared/setter/panels/animation-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/background-panel.vue.d.ts +11 -0
- package/dist/materials/shared/setter/panels/background-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/border-panel.vue.d.ts +11 -0
- package/dist/materials/shared/setter/panels/border-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/event-panel.vue.d.ts +14 -0
- package/dist/materials/shared/setter/panels/event-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/layout-panel.vue.d.ts +25 -0
- package/dist/materials/shared/setter/panels/layout-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/position-panel.vue.d.ts +16 -0
- package/dist/materials/shared/setter/panels/position-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/typography-panel.vue.d.ts +11 -0
- package/dist/materials/shared/setter/panels/typography-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/panels/widget-style-panel.vue.d.ts +30 -0
- package/dist/materials/shared/setter/panels/widget-style-panel.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/shell.vue.d.ts +21 -0
- package/dist/materials/shared/setter/shell.vue.d.ts.map +1 -0
- package/dist/materials/shared/setter/use-widget-setter.d.ts +35 -0
- package/dist/materials/shared/setter/use-widget-setter.d.ts.map +1 -0
- package/dist/materials-style.js +3 -0
- package/dist/materials.js +14703 -0
- package/dist/materials.js.map +1 -0
- package/dist/runtime/index.d.ts +6 -0
- package/dist/runtime/index.d.ts.map +1 -0
- package/dist/runtime/page-renderer.vue.d.ts +4 -0
- package/dist/runtime/page-renderer.vue.d.ts.map +1 -0
- package/dist/runtime/runtime.d.ts +585 -0
- package/dist/runtime/runtime.d.ts.map +1 -0
- package/dist/runtime/scoped-style-block.vue.d.ts +7 -0
- package/dist/runtime/scoped-style-block.vue.d.ts.map +1 -0
- package/dist/runtime/widget-node.vue.d.ts +9 -0
- package/dist/runtime/widget-node.vue.d.ts.map +1 -0
- package/dist/runtime-definitions-BGShdDBK.js +1984 -0
- package/dist/runtime-definitions-BGShdDBK.js.map +1 -0
- package/dist/runtime-style.js +3 -0
- package/dist/runtime.js +262 -0
- package/dist/runtime.js.map +1 -0
- package/dist/sortable.esm-DbutZcEr.js +18104 -0
- package/dist/sortable.esm-DbutZcEr.js.map +1 -0
- package/dist/style.js +3 -0
- package/package.json +73 -37
- package/runtime.d.ts +5 -0
- package/dist/lowcode-editor.es.js +0 -45473
- package/dist/lowcode-editor.umd.js +0 -45472
- package/dist/packages/install.d.ts +0 -4
- package/dist/packages/locale/en-US.d.ts +0 -315
- package/dist/packages/locale/index.d.ts +0 -635
- package/dist/packages/locale/zh-CN.d.ts +0 -315
- package/dist/packages/lowcode-editor/components/design-panel/components/wrapper.vue.d.ts +0 -40
- package/dist/packages/lowcode-editor/components/design-panel/index.vue.d.ts +0 -64
- package/dist/packages/lowcode-editor/components/layout-panel/index.vue.d.ts +0 -33
- package/dist/packages/lowcode-editor/components/setter-panel/index.vue.d.ts +0 -22
- package/dist/packages/lowcode-editor/components/widget-panel/index.vue.d.ts +0 -100
- package/dist/packages/lowcode-editor/index.vue.d.ts +0 -349
- package/dist/packages/lowcode-editor-renderer/index.vue.d.ts +0 -100
- package/dist/packages/lowcode-editor-widgets/components/property-editor/property.d.ts +0 -4
- package/dist/packages/lowcode-editor-widgets/components/property.vue.d.ts +0 -53
- package/dist/packages/lowcode-editor-widgets/components/setter-base/index.vue.d.ts +0 -20
- package/dist/packages/lowcode-editor-widgets/components/usePropertyRegister.d.ts +0 -7
- package/dist/packages/lowcode-editor-widgets/index.d.ts +0 -4
- package/dist/packages/lowcode-editor-widgets/widgets/container/card/index.d.ts +0 -38
- package/dist/packages/lowcode-editor-widgets/widgets/container/card/setter.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/container/card/view.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/container/grid/index.d.ts +0 -67
- package/dist/packages/lowcode-editor-widgets/widgets/container/grid/setter.vue.d.ts +0 -18
- package/dist/packages/lowcode-editor-widgets/widgets/container/grid/view.vue.d.ts +0 -24
- package/dist/packages/lowcode-editor-widgets/widgets/container/grid-col/index.d.ts +0 -68
- package/dist/packages/lowcode-editor-widgets/widgets/container/grid-col/setter.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/container/grid-col/view.vue.d.ts +0 -40
- package/dist/packages/lowcode-editor-widgets/widgets/container/tab/index.d.ts +0 -38
- package/dist/packages/lowcode-editor-widgets/widgets/container/tab/setter.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/container/tab/view.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/form/radio/index.d.ts +0 -38
- package/dist/packages/lowcode-editor-widgets/widgets/form/radio/setter.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/form/radio/view.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/form/text/index.d.ts +0 -38
- package/dist/packages/lowcode-editor-widgets/widgets/form/text/setter.vue.d.ts +0 -15
- package/dist/packages/lowcode-editor-widgets/widgets/form/text/view.vue.d.ts +0 -15
- package/dist/packages/type.d.ts +0 -28
- package/dist/style.css +0 -154
package/dist/core.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core.js","sources":["../src/core/index.ts"],"sourcesContent":["/**\n * @fp-mall/lowcode Core 引擎(单文件入口)\n *\n * 职责划分:\n * - 模型:Widget / Page 持久化结构与编辑态字段\n * - 物料:MaterialDefinition 注册表与组件名解析\n * - 树操作:查找、移动、复制、快照序列化\n * - 命令:设计器对页面树的增删改\n * - 历史:Undo / Redo 快照栈\n * - 事件:设计器面板间的轻量 pub/sub\n * - 页面数据:data 字段校验、类型推断与 JSON 编辑辅助\n */\nimport type { App, Component } from 'vue'\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 模型类型:样式 · 事件 · 页面脚本 · Widget / Page\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 与 Ant Design Grid 一致的响应式断点 */\nexport type StyleBreakpoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl'\n\nexport const STYLE_BREAKPOINTS: StyleBreakpoint[] = ['xs', 'sm', 'md', 'lg', 'xl', 'xxl']\n\nexport const STYLE_BREAKPOINT_MIN_WIDTH: Record<Exclude<StyleBreakpoint, 'xs'>, number> = {\n sm: 576,\n md: 768,\n lg: 992,\n xl: 1200,\n xxl: 1600\n}\n\nexport const STYLE_BREAKPOINT_META: Record<StyleBreakpoint, { label: string; hint: string }> = {\n xs: { label: 'XS', hint: '<576px' },\n sm: { label: 'SM', hint: '≥576px' },\n md: { label: 'MD', hint: '≥768px' },\n lg: { label: 'LG', hint: '≥992px' },\n xl: { label: 'XL', hint: '≥1200px' },\n xxl: { label: 'XXL', hint: '≥1600px' }\n}\n\n/** 单属性在各断点下的取值 */\nexport type ResponsiveStyleValue = Partial<Record<StyleBreakpoint, string>>\n\nexport type CssStyleValue = string | ResponsiveStyleValue\n\n/** 内联 CSS 键值(可序列化,供 Page / Widget options 与样式面板共用) */\nexport type CssStyle = Record<string, CssStyleValue>\n\n/** 已按断点展平、可直接绑定 DOM :style 的样式 */\nexport type FlatCssStyle = Record<string, string>\n\n/** 样式面板编辑态:默认 + 交互伪类态 */\nexport type WidgetStyleState = 'default' | 'hover' | 'active' | 'focus'\n\nexport type WidgetPseudoStyleState = Exclude<WidgetStyleState, 'default'>\n\n/** 动画触发方式 */\nexport type WidgetAnimationTrigger = 'mount' | 'hover' | 'active' | 'focus' | 'click' | 'inView'\n\n/** 内置关键帧预设 id */\nexport type WidgetAnimationPreset =\n | 'fadeIn'\n | 'fadeOut'\n | 'slideUp'\n | 'slideDown'\n | 'slideLeft'\n | 'slideRight'\n | 'zoomIn'\n | 'zoomOut'\n | 'pulse'\n | 'shake'\n | 'custom'\n\nexport type WidgetAnimationFillMode = 'none' | 'forwards' | 'backwards' | 'both'\n\n/** 自定义关键帧单步(preset === 'custom' 时使用) */\nexport type WidgetAnimationKeyframeStep = {\n offset: number | 'from' | 'to'\n styles: Record<string, string>\n}\n\n/** 关键帧动画配置 */\nexport type WidgetAnimationConfig = {\n enabled?: boolean\n preset: WidgetAnimationPreset\n trigger: WidgetAnimationTrigger\n duration?: string\n delay?: string\n timingFunction?: string\n iterationCount?: string\n fillMode?: WidgetAnimationFillMode\n /** inView:仅播放一次 */\n once?: boolean\n /** inView:可见比例阈值 0–1 */\n threshold?: number\n keyframes?: WidgetAnimationKeyframeStep[]\n}\n\n/** CSS Transition 配置(作用于 default 态) */\nexport type WidgetTransitionConfig = {\n enabled?: boolean\n property?: string\n duration?: string\n timingFunction?: string\n delay?: string\n}\n\n/** 动画 / 过渡(挂在 styles.motion,由 runtime 编译为 scoped CSS) */\nexport type WidgetMotionStyles = {\n transition?: WidgetTransitionConfig\n animation?: WidgetAnimationConfig\n}\n\n/** 组件各视觉态样式(default 为默认态,其余为伪类覆盖) */\nexport type WidgetStyles = {\n default?: CssStyle\n hover?: CssStyle\n active?: CssStyle\n focus?: CssStyle\n motion?: WidgetMotionStyles\n}\n\nexport const WIDGET_ANIMATION_TRIGGER_LABELS: Record<WidgetAnimationTrigger, string> = {\n mount: '进入页面',\n hover: '悬停',\n active: '按下',\n focus: '聚焦',\n click: '点击',\n inView: '进入视口'\n}\n\nexport const WIDGET_ANIMATION_PRESET_LABELS: Record<WidgetAnimationPreset, string> = {\n fadeIn: '淡入',\n fadeOut: '淡出',\n slideUp: '上滑入',\n slideDown: '下滑入',\n slideLeft: '左滑入',\n slideRight: '右滑入',\n zoomIn: '放大入',\n zoomOut: '缩小出',\n pulse: '脉冲',\n shake: '摇晃',\n custom: '自定义'\n}\n\nexport const WIDGET_ANIMATION_TRIGGERS: WidgetAnimationTrigger[] = ['mount', 'hover', 'active', 'focus', 'click', 'inView']\n\nexport const WIDGET_ANIMATION_PRESETS: WidgetAnimationPreset[] = [\n 'fadeIn',\n 'fadeOut',\n 'slideUp',\n 'slideDown',\n 'slideLeft',\n 'slideRight',\n 'zoomIn',\n 'zoomOut',\n 'pulse',\n 'shake',\n 'custom'\n]\n\nexport const WIDGET_PSEUDO_STYLE_STATES: WidgetPseudoStyleState[] = ['hover', 'active', 'focus']\n\nexport const WIDGET_STYLE_STATE_LABELS: Record<WidgetStyleState, string> = {\n default: '默认',\n hover: 'Hover',\n active: 'Active',\n focus: 'Focus'\n}\n\nexport function isResponsiveStyleValue(value: unknown): value is ResponsiveStyleValue {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nexport function readStyleValue(style: CssStyle | undefined, key: string, breakpoint: StyleBreakpoint = 'xs'): string {\n const raw = style?.[key]\n if (raw == null || raw === '') return ''\n if (typeof raw === 'string') return raw\n return resolveResponsiveValue(raw, breakpoint)\n}\n\n/** 移动优先:未配置的断点继承上一档 */\nexport function resolveResponsiveValue(value: ResponsiveStyleValue, breakpoint: StyleBreakpoint): string {\n let last = ''\n for (const bp of STYLE_BREAKPOINTS) {\n const custom = value[bp]\n if (typeof custom === 'string' && custom.trim()) {\n last = custom.trim()\n }\n if (bp === breakpoint) break\n }\n return last\n}\n\nexport function resolveBreakpointByWidth(width: number): StyleBreakpoint {\n let active: StyleBreakpoint = 'xs'\n for (const breakpoint of STYLE_BREAKPOINTS) {\n if (breakpoint === 'xs') continue\n if (width >= STYLE_BREAKPOINT_MIN_WIDTH[breakpoint]) {\n active = breakpoint\n }\n }\n return active\n}\n\nexport function cleanResponsiveValue(value: ResponsiveStyleValue): CssStyleValue | undefined {\n const cleaned: ResponsiveStyleValue = {}\n for (const bp of STYLE_BREAKPOINTS) {\n const item = value[bp]\n if (typeof item === 'string' && item.trim()) {\n cleaned[bp] = item.trim()\n }\n }\n const keys = Object.keys(cleaned) as StyleBreakpoint[]\n if (!keys.length) return undefined\n if (keys.length === 1 && keys[0] === 'xs') return cleaned.xs\n return cleaned\n}\n\nexport function hasResponsiveStyle(style?: CssStyle): boolean {\n if (!style) return false\n return Object.values(style).some(isResponsiveStyleValue)\n}\n\nexport function resolveFlatCssStyle(style: CssStyle | undefined, breakpoint: StyleBreakpoint): Record<string, string> {\n const flat: Record<string, string> = {}\n if (!style) return flat\n for (const [key, value] of Object.entries(style)) {\n if (value == null || value === '') continue\n const resolved = typeof value === 'string' ? value : resolveResponsiveValue(value, breakpoint)\n if (resolved) flat[key] = resolved\n }\n return flat\n}\n\n/** 单条事件绑定 */\nexport type WidgetEventItem = {\n /** 列表项稳定 key(用于增删) */\n key: number\n /** DOM / 组件事件名,如 click */\n name: string\n /** 事件处理函数源码,如 (event, widgetCtx) => { await context.methods.xxx() } */\n handler: string\n}\n\n/** 组件事件绑定列表 */\nexport type WidgetEvents = WidgetEventItem[]\n\n/** 添加事件时的常用预设(可选) */\nexport type WidgetEventPreset = {\n name: string\n label: string\n placeholder?: string\n hint?: string\n}\n\nexport type EventHandlerContext = {\n widget: {\n id: number\n type: string\n name: string\n options: Record<string, unknown>\n }\n /** 列表行事件作用域 */\n item?: Record<string, unknown>\n index?: number\n}\n\nexport type WidgetEventHandler = (event: Event, context: EventHandlerContext) => void\n\n/** 设计模式下需 preventDefault 的交互事件,避免误触跳转等默认行为 */\nexport const DESIGN_MODE_PREVENT_DEFAULT_EVENTS = new Set(['click', 'dblclick'])\n\n/** 页面生命周期钩子名 */\nexport type PageLifecycleKey = 'beforeMount' | 'mounted' | 'beforeUpdate' | 'updated' | 'beforeDestroy' | 'destroyed'\n\n/** 当前仅接口模板 */\nexport type PageMethodTemplate = 'api'\n\n/** 接口请求 HTTP 配置 */\nexport type PageMethodHttpRequest = {\n url: string\n method?: 'GET' | 'POST' | 'PUT' | 'DELETE'\n headers?: string\n query?: string\n body?: string\n}\n\n/** 响应 → context.data 映射规则 */\nexport type PageMethodApiResultRule = {\n target: string\n /** 相对响应根的路径,如 data.items;空=整段响应 */\n sourcePath?: string\n /** 可选兜底,字面量或 {{字段}}/{{入参}} */\n fallback?: string\n}\n\n/** 接口请求 UI 配置(保存时 generate handler) */\nexport type PageMethodApiConfig = {\n loadingField?: string\n params?: string\n request: PageMethodHttpRequest\n result?: PageMethodApiResultRule[]\n}\n\n/** 设计器元数据,runtime 不读 */\nexport type PageMethodMeta = {\n template: PageMethodTemplate\n api: PageMethodApiConfig\n}\n\n/** 页面自定义方法 */\nexport type PageMethodItem = {\n key: number\n name: string\n handler: string\n meta?: PageMethodMeta\n}\n\n/** 生命周期钩子源码 */\nexport type PageLifecycleSource = Partial<Record<PageLifecycleKey, string>>\n\n/** 页面方法列表 */\nexport type PageMethods = PageMethodItem[]\n\n/** 页面脚本运行时上下文 */\nexport type PageScriptContext = {\n data: Record<string, unknown>\n methods: Record<string, (...args: unknown[]) => unknown>\n}\n\n/** 页面数据字段值类型(JSON 可序列化) */\nexport type PageDataValueType = 'string' | 'number' | 'boolean' | 'null' | 'object' | 'array'\n\n/** 单条页面数据字段(设计器可编辑的初始值) */\nexport type PageDataItem = {\n key: number\n /** 写入 context.data 的键名 */\n name: string\n value: unknown\n}\n\nexport type PageData = PageDataItem[]\n\nexport type PageLifecyclePreset = {\n name: PageLifecycleKey\n label: string\n placeholder?: string\n hint?: string\n}\n\n/** 各物料 options 的公共字段(core 层宽松结构;各物料 options.ts 负责具体字段与 ensure) */\nexport type WidgetOptions = {\n [key: string]: unknown\n}\n\n/**\n * 可持久化的节点字段(保存 / 历史快照 / v-model 出站应仅含此结构)。\n * 运行时编辑字段见 {@link WidgetEditorFields}。\n */\nexport type WidgetPersisted = {\n id: number\n type: string\n /** 组件类型名称(来自物料定义,不可编辑) */\n name: string\n /** 用户自定义展示名称(大纲树等;默认等于 name,修改后不同步 name) */\n title?: string\n /** 锁定后设计器内不可移动、删除或修改属性(可持久化) */\n locked?: boolean\n styles?: WidgetStyles\n events?: WidgetEvents\n options: WidgetOptions\n children?: WidgetPersisted[]\n}\n\n/** 带 activeKey 的子项容器(标签页、走马灯等)的通用配置 */\nexport type KeyedSlotContainerConfig = {\n /** 判断 widget 是否为该类型的 keyed slot 容器 */\n isContainer: (widget: Widget) => boolean\n /** 判断 widget 是否为该容器的直接子项(如 tab-pane) */\n isChild: (widget: Widget) => boolean\n /** 从 container.children 中筛出合法子项列表 */\n getChildren: (widget: Widget) => Widget[]\n /** 根据当前子项计算 options.activeKey */\n resolveActiveKey: (widget: Widget) => number | undefined\n /** 创建一个新的子项 widget */\n createChild: (title?: string) => Widget\n /** 容器无子项时创建的默认子项列表 */\n createDefaultChildren: (count?: number) => Widget[]\n /** 补全容器 widget / options 默认值 */\n ensureContainerOptions: (widget: Widget) => void\n /** 补全子项 options 默认值 */\n ensureChildOptions: (child: Widget) => void\n /** 从子项 options 生成展示标题 */\n getChildTitle: (child: Widget) => string\n /** 新建子项时的标题前缀,如「标签」 */\n childTitlePrefix: string\n /** 容器节点 normalize 前的额外处理(如走马灯高度迁移) */\n onBeforeNormalizeContainer?: (widget: Widget) => void\n}\n\n/** 加载 / 复制后对整棵组件树执行 in-place 规范化的函数签名 */\nexport type WidgetNormalizer = (root: Widget) => void\n\n/** 仅设计器使用的字段(不入库;历史栈会通过 page-snapshot 剥离) */\nexport type WidgetEditorFields = {\n icon?: string | object\n component?: object\n setterComponent?: object\n /** 画布编辑态外壳(如 grid 剪刀);无则直接渲染 view */\n designerComponent?: object\n eventPresets?: WidgetEventPreset[]\n keyedSlotConfig?: KeyedSlotContainerConfig\n normalize?: WidgetNormalizer\n copyNeedsNormalize?: boolean\n /** 容器 view 是否通过 #item slot 逐子项渲染 */\n usesItemSlot?: boolean | ((widget: Widget) => boolean)\n /** 内部子节点(不入库;加载时按 type 与树位置推导) */\n internal?: boolean\n /** 画布/大纲是否允许挂载任意子组件(非 keyed slot 容器的子项类型) */\n isContainer?: boolean\n}\n\n/** 画布节点:持久化结构 + 编辑态引用 */\nexport type Widget = WidgetPersisted & WidgetEditorFields\n\nexport function ensureWidgetStyles(widget: Widget): WidgetStyles {\n if (!widget.styles || typeof widget.styles !== 'object') {\n widget.styles = {}\n }\n return widget.styles\n}\n\nexport function ensureWidgetMotion(styles: WidgetStyles): WidgetMotionStyles {\n if (!styles.motion || typeof styles.motion !== 'object') {\n styles.motion = {}\n }\n return styles.motion\n}\n\nexport function isWidgetAnimationEnabled(animation?: WidgetAnimationConfig): boolean {\n if (!animation?.preset) return false\n return animation.enabled !== false\n}\n\nexport function isWidgetTransitionEnabled(transition?: WidgetTransitionConfig): boolean {\n if (!transition) return false\n if (transition.enabled === false) return false\n return !!(transition.duration?.trim() || transition.property?.trim() || transition.timingFunction?.trim() || transition.delay?.trim())\n}\n\nexport function hasWidgetAnimation(styles?: WidgetStyles): boolean {\n return isWidgetAnimationEnabled(styles?.motion?.animation)\n}\n\nexport function hasWidgetTransition(styles?: WidgetStyles): boolean {\n return isWidgetTransitionEnabled(styles?.motion?.transition)\n}\n\nexport function hasWidgetAnimationForTrigger(styles: WidgetStyles | undefined, trigger: WidgetAnimationTrigger): boolean {\n const animation = styles?.motion?.animation\n if (!isWidgetAnimationEnabled(animation)) return false\n return animation!.trigger === trigger\n}\n\nexport function hasWidgetMotion(styles?: WidgetStyles): boolean {\n return hasWidgetTransition(styles) || hasWidgetAnimation(styles)\n}\n\nexport function getWidgetDefaultStyle(widget: Widget): CssStyle {\n return widget.styles?.default ?? {}\n}\n\nexport function getWidgetPseudoStyle(widget: Widget, state: WidgetPseudoStyleState): CssStyle {\n return widget.styles?.[state] ?? {}\n}\n\nexport function isNonEmptyCssStyle(style?: CssStyle): boolean {\n if (!style) return false\n for (const value of Object.values(style)) {\n if (value == null || value === '') continue\n if (typeof value === 'string') return true\n if (isResponsiveStyleValue(value) && Object.values(value).some(item => typeof item === 'string' && item.trim())) {\n return true\n }\n }\n return false\n}\n\nexport function hasWidgetPseudoStyle(widget: Widget, state: WidgetPseudoStyleState): boolean {\n return isNonEmptyCssStyle(widget.styles?.[state])\n}\n\n/** 页面实例(根 Widget,附加脚本配置) */\nexport type Page = Widget & {\n type: 'page'\n data?: PageData\n lifecycle?: PageLifecycleSource\n methods?: PageMethods\n}\n\n/** 物料面板分组 */\nexport type LowcodePackage = {\n name: string\n children: Widget[]\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 事件预设\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 通用「点击」事件预设,供 EventPanel 快速添加 */\nexport const COMMON_CLICK_EVENT_PRESET: WidgetEventPreset = {\n name: 'click',\n label: '点击',\n placeholder: '例如:console.log(event, context)',\n hint: '可用参数:event(事件对象)、context.widget(当前组件)'\n}\n\n/** 容器类物料常用交互事件预设列表 */\nexport const COMMON_CONTAINER_EVENT_PRESETS: WidgetEventPreset[] = [COMMON_CLICK_EVENT_PRESET, { name: 'dblclick', label: '双击' }, { name: 'mouseenter', label: '鼠标进入' }, { name: 'mouseleave', label: '鼠标离开' }, { name: 'contextmenu', label: '右键菜单' }]\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 组件树:遍历 · ID 分配 · 快照 · 布局\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 布局计算所需的物料注册表能力(避免 widget-tree ↔ material 循环依赖) */\nexport type WidgetDisplayRegistry = {\n /** 获取物料 type 的默认 display 值 */\n getMaterialDisplayDefault: (type: string) => string\n}\n\n/** 页面树节点 id 的起始值(空页) */\nexport const WIDGET_ID_START = 1\n\n/**\n * 深度优先遍历组件树。\n * @returns visitor 返回 true 时提前终止遍历\n */\nfunction walkWidgetTree(root: Widget, visitor: (widget: Widget) => boolean | void): void {\n /** 递归访问子节点;返回 true 表示向上终止遍历 */\n const walk = (widget: Widget): boolean => {\n if (visitor(widget) === true) return true\n for (const child of widget.children ?? []) {\n if (walk(child)) return true\n }\n return false\n }\n walk(root)\n}\n\n/** 页面树中当前最大节点 id(无节点时为 0) */\nexport function getMaxWidgetId(root: Widget): number {\n let max = 0\n walkWidgetTree(root, widget => {\n if (Number.isFinite(widget.id) && widget.id > max) {\n max = widget.id\n }\n })\n return max\n}\n\n/** 页面树节点 id 分配器 */\nexport type WidgetIdAllocator = {\n /** 分配下一个唯一 id 并自增 */\n allocate: () => number\n}\n\n/** 基于页面树 max(id)+1 递增分配节点 id */\nexport function createWidgetIdAllocator(root: Widget): WidgetIdAllocator {\n let next = getMaxWidgetId(root) + 1\n return {\n /** @see WidgetIdAllocator.allocate */\n allocate() {\n return next++\n }\n }\n}\n\n/** JSON 深拷贝;兼容 Vue reactive 代理,undefined 输入返回 undefined */\nexport function deepClone<T>(origin: T): T {\n if (origin === undefined) {\n return origin\n }\n return JSON.parse(JSON.stringify(origin)) as T\n}\n\n/** 原地移动数组元素 */\nexport function moveArrayIndex<T>(array: T[], fromIndex: number, toIndex: number): void {\n const [item] = array.splice(fromIndex, 1)\n array.splice(toIndex, 0, item)\n}\n\n/** 依次执行物料注册的 normalize 函数 */\nexport function applyWidgetNormalizers(root: Widget, normalizers: WidgetNormalizer[]): void {\n for (const normalize of normalizers) {\n normalize(root)\n }\n}\n\n/** 编辑态专用字段,持久化前需剥离 */\nconst RUNTIME_WIDGET_KEYS: (keyof WidgetEditorFields)[] = ['component', 'setterComponent', 'designerComponent', 'icon', 'eventPresets', 'keyedSlotConfig', 'normalize', 'copyNeedsNormalize', 'usesItemSlot', 'internal']\n\nconst INTERNAL_WIDGET_TYPES = new Set(['tab-pane', 'carousel-slide'])\n\n/** 根据 type 与父节点判断是否为内部子节点(与 {@link applyWidgetInternalFlags} 规则一致) */\nexport function resolveWidgetInternal(widget: Widget, parentWidget?: Widget | null): boolean {\n if (INTERNAL_WIDGET_TYPES.has(widget.type)) return true\n if (widget.type === 'grid' && parentWidget?.type === 'grid') {\n const layout = parentWidget.options?.childrenLayout\n if (layout === 'row' || layout === 'column') return true\n }\n return false\n}\n\n/** 为页面树各节点写入设计态 internal 标记 */\nexport function applyWidgetInternalFlags(root: Widget, parentWidget?: Widget | null): void {\n root.internal = resolveWidgetInternal(root, parentWidget)\n for (const child of root.children ?? []) {\n applyWidgetInternalFlags(child, root)\n }\n}\n\n/** 节点自身是否处于锁定状态 */\nexport function isWidgetSelfLocked(widget: Widget): boolean {\n return widget.locked === true\n}\n\n/** 自 root 至 target 路径上(不含 target)是否存在 locked 祖先 */\nexport function findLockedAncestor(root: Widget, target: Widget): Widget | null {\n const path = findWidgetPath(root, target.id)\n if (!path || path.length <= 1) return null\n for (let index = path.length - 2; index >= 0; index--) {\n const ancestor = path[index]\n if (isWidgetSelfLocked(ancestor)) return ancestor\n }\n return null\n}\n\n/** 自身或任意祖先 locked 时视为设计器只读 */\nexport function isWidgetEffectivelyLocked(root: Page, widget: Widget): boolean {\n if (isWidgetSelfLocked(widget)) return true\n return findLockedAncestor(root, widget) != null\n}\n\n/** 是否允许结构变更:移动 / 删除 / 排序 / 拖入拖出 */\nexport function canMutateWidgetStructure(root: Page, widget: Widget): boolean {\n if (widget.type === 'page') return false\n return !isWidgetEffectivelyLocked(root, widget)\n}\n\n/** 是否允许修改 options / style / events / title 等属性 */\nexport function canMutateWidgetContent(root: Page, widget: Widget): boolean {\n return !isWidgetEffectivelyLocked(root, widget)\n}\n\n/** 是否允许切换 locked(不受自身 locked 影响;祖先 locked 时不可改子节点锁态) */\nexport function canToggleWidgetLock(root: Page, widget: Widget): boolean {\n if (widget.type === 'page') return false\n return findLockedAncestor(root, widget) == null\n}\n\n/** 解析大纲/面板展示名称;优先 title,回退类型名 name */\nexport function resolveWidgetEditorTitle(widget: Widget, fallback = ''): string {\n const title = typeof widget.title === 'string' ? widget.title.trim() : ''\n if (title) return title\n const name = typeof widget.name === 'string' ? widget.name.trim() : ''\n return name || fallback\n}\n\n/** 补全 title:无自定义展示名时默认取组件类型名(name 或传入的 typeName) */\nexport function ensureWidgetEditorTitle(widget: Widget, typeName?: string): void {\n if (widget.title?.trim()) return\n widget.title = (typeName?.trim() || widget.name?.trim()) || ''\n}\n\n/** 读取页面标题 */\nexport function resolvePageTitle(page: Page | null | undefined): string {\n if (!page) return ''\n return resolveWidgetEditorTitle(page)\n}\n\n/** 剥离仅用于编辑态的字段,减小历史栈体积 */\nexport function stripWidgetRuntimeFields(widget: Widget): void {\n for (const key of RUNTIME_WIDGET_KEYS) {\n delete (widget as Record<string, unknown>)[key]\n }\n widget.children?.forEach(stripWidgetRuntimeFields)\n}\n\n/**\n * 生成可持久化的页面快照({@link WidgetPersisted} 形态)。\n * 使用 JSON 深拷贝以兼容 Vue reactive,并自然丢弃不可序列化字段。\n */\nexport function clonePageSnapshot(page: Page): Page {\n const snapshot = deepClone(page)\n stripWidgetRuntimeFields(snapshot)\n return snapshot\n}\n\n/** 比较两份页面树的可序列化内容是否一致 */\nexport function isSamePageSnapshot(a: Page, b: Page): boolean {\n return JSON.stringify(clonePageSnapshot(a)) === JSON.stringify(clonePageSnapshot(b))\n}\n\n/** 序列化为可持久化 JSON 字符串(剥离编辑态字段) */\nexport function serializePageSnapshot(page: Page, space?: string | number): string {\n return JSON.stringify(clonePageSnapshot(page), null, space)\n}\n\n/** 行内级 display 取值 */\nconst INLINE_DISPLAY_VALUES = ['inline', 'inline-block'] as const\n\n/** 判断 CSS display 是否为行内级(inline / inline-block) */\nexport function isInlineLevelDisplay(display: string): boolean {\n return INLINE_DISPLAY_VALUES.includes(display as (typeof INLINE_DISPLAY_VALUES)[number])\n}\n\n/** 解析 widget 最终生效的 display;style 未设置时回退到物料默认值 */\nexport function resolveEffectiveDisplay(style: CssStyle | undefined, displayDefault = 'block', breakpoint: StyleBreakpoint = 'xl'): string {\n const display = readStyleValue(style, 'display', breakpoint)\n if (display) return display\n return displayDefault\n}\n\n/** 根据 style.display 判断是否应占满父级宽度(块级 / 弹性 vs 行内 / 行内块) */\nexport function shouldWidgetStretchFullWidth(widget: Widget, registry: WidgetDisplayRegistry): boolean {\n const display = resolveEffectiveDisplay(getWidgetDefaultStyle(widget), registry.getMaterialDisplayDefault(widget.type))\n if (display === 'none') return false\n return !isInlineLevelDisplay(display)\n}\n\n/** 逐子项 scoped slot 的参数 */\nexport type WidgetItemSlotScope = {\n item: Widget\n index: number\n /** tab / carousel 用于控制仅渲染当前项 */\n visible?: boolean\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 物料注册表\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type MaterialDefinition = {\n widget: Widget\n /** 出现在左侧物料面板 */\n palette?: boolean\n /** 面板分组名(仅 palette 物料) */\n packageName?: string\n}\n\n/** 从物料定义中提取 widget 模板(拖拽到画布时的原型) */\nexport function toMaterialWidget(def: MaterialDefinition): Widget {\n return def.widget\n}\n\n/** 从设计器全量定义生成运行时轻量定义(仅保留 view 与行为字段) */\nexport function toRuntimeMaterialDefinitions(definitions: MaterialDefinition[]): MaterialDefinition[] {\n return definitions.map(def => ({\n widget: {\n id: 0,\n type: def.widget.type,\n name: def.widget.name,\n component: def.widget.component,\n usesItemSlot: def.widget.usesItemSlot,\n keyedSlotConfig: def.widget.keyedSlotConfig,\n normalize: def.widget.normalize,\n copyNeedsNormalize: def.widget.copyNeedsNormalize,\n eventPresets: def.widget.eventPresets,\n styles: def.widget.styles?.default?.display !== undefined ? { default: { display: def.widget.styles.default.display } } : undefined,\n options: {},\n children: []\n }\n }))\n}\n\n/** 按 packageName 聚合物料面板分组 */\nexport function buildMaterialPackages(definitions: MaterialDefinition[]): LowcodePackage[] {\n const byPackage = new Map<string, Widget[]>()\n for (const def of definitions) {\n if (!def.palette || !def.packageName) continue\n const list = byPackage.get(def.packageName) ?? []\n list.push(def.widget)\n byPackage.set(def.packageName, list)\n }\n return [...byPackage.entries()].map(([name, children]) => ({ name, children }))\n}\n\n/** 生成运行时 view 组件的全局注册名,如 widget-button */\nexport function getViewComponentName(type: string): string {\n return `widget-${type}`\n}\n\n/** 生成属性面板 setter 组件的全局注册名,如 widget-button-setter */\nexport function getSetterComponentName(type: string): string {\n return `widget-${type}-setter`\n}\n\n/** 生成设计器编辑态外壳组件的全局注册名,如 widget-button-designer */\nexport function getDesignerComponentName(type: string): string {\n return `widget-${type}-designer`\n}\n\nexport type WidgetComponentEntry = {\n type: string\n view?: Component\n setter?: Component\n designer?: Component\n}\n\n/** 从物料定义列表收集各 type 对应的 view / setter / designer 组件引用 */\nexport function collectWidgetComponents(definitions: MaterialDefinition[]): WidgetComponentEntry[] {\n return definitions.map(def => ({\n type: def.widget.type,\n view: def.widget.component as Component | undefined,\n setter: def.widget.setterComponent as Component | undefined,\n designer: def.widget.designerComponent as Component | undefined\n }))\n}\n\n/** 运行时仅注册 view 组件 */\nexport function registerRuntimeWidgetViews(app: App, registry: MaterialRegistry): void {\n for (const entry of registry.componentEntries) {\n const viewName = getViewComponentName(entry.type)\n if (entry.view && !app.component(viewName)) {\n app.component(viewName, entry.view)\n }\n }\n}\n\nexport type MaterialRegistry = {\n definitions: MaterialDefinition[]\n extraWidgets: Widget[]\n allWidgets: Widget[]\n componentEntries: WidgetComponentEntry[]\n widgetNormalizers: WidgetNormalizer[]\n copyNormalizeTypes: ReadonlySet<string>\n /** @see createMaterialRegistry 内 getMaterialDisplayDefault */\n getMaterialDisplayDefault: (type: string) => string\n /** @see createMaterialRegistry 内 getWidgetTypeLabel */\n getWidgetTypeLabel: (type: string) => string\n /** @see createMaterialRegistry 内 getWidgetTypeIcon */\n getWidgetTypeIcon: (type: string) => string | object | undefined\n /** @see createMaterialRegistry 内 getEventPresets */\n getEventPresets: (type: string) => WidgetEventPreset[]\n /** @see createMaterialRegistry 内 getKeyedSlotConfig */\n getKeyedSlotConfig: (type: string) => KeyedSlotContainerConfig | undefined\n /** @see createMaterialRegistry 内 resolveUsesItemSlot */\n resolveUsesItemSlot: (widget: Widget) => boolean\n /** @see createMaterialRegistry 内 isContainerType */\n isContainerType: (type: string) => boolean\n /** @see createMaterialRegistry 内 widgetCanBeParent */\n widgetCanBeParent: (parent: Widget) => boolean\n /** @see createMaterialRegistry 内 widgetAcceptsChild */\n widgetAcceptsChild: (parent: Widget, child: Widget) => boolean\n}\n\n/** 从物料定义列表构建查询索引,供设计器与运行时共用 */\nexport function createMaterialRegistry(allDefinitions: MaterialDefinition[]): MaterialRegistry {\n const extraDefinitions = allDefinitions.filter(def => !def.palette)\n const extraWidgets = extraDefinitions.map(def => def.widget)\n const allWidgets = allDefinitions.map(def => def.widget)\n const componentEntries = collectWidgetComponents(allDefinitions)\n\n const widgetNormalizers: WidgetNormalizer[] = []\n const seenNormalizers = new Set<WidgetNormalizer>()\n for (const widget of allWidgets) {\n if (!widget.normalize || seenNormalizers.has(widget.normalize)) continue\n seenNormalizers.add(widget.normalize)\n widgetNormalizers.push(widget.normalize)\n }\n\n const copyNormalizeTypes = new Set(allWidgets.filter(w => w.copyNeedsNormalize).map(w => w.type))\n\n const eventPresetsByType = new Map<string, WidgetEventPreset[]>()\n for (const def of allDefinitions) {\n const presets = def.widget.eventPresets\n if (presets?.length) {\n eventPresetsByType.set(def.widget.type, presets)\n }\n }\n\n const keyedSlotConfigByType = new Map(allWidgets.filter(w => w.keyedSlotConfig).map(w => [w.type, w.keyedSlotConfig!]))\n\n const usesItemSlotByType = new Map(allWidgets.filter(w => w.usesItemSlot !== undefined).map(w => [w.type, w.usesItemSlot!]))\n\n const materialDisplayDefaultByType = new Map(allWidgets.map(w => [w.type, w.styles?.default?.display as string | undefined]))\n\n const widgetMetaByType = new Map(allWidgets.map(w => [w.type, { name: w.name, icon: w.icon }]))\n\n /** 获取物料 type 对应的默认 display(未设置 style.display 时使用) */\n function getMaterialDisplayDefault(type: string): string {\n return materialDisplayDefaultByType.get(type) ?? 'block'\n }\n\n /** 获取物料 type 对应的中文展示名 */\n function getWidgetTypeLabel(type: string): string {\n return widgetMetaByType.get(type)?.name ?? type\n }\n\n /** 获取物料 type 对应的图标(字符串或组件) */\n function getWidgetTypeIcon(type: string): string | object | undefined {\n return widgetMetaByType.get(type)?.icon\n }\n\n /** 获取物料 type 在 EventPanel 中可添加的事件预设 */\n function getEventPresets(type: string): WidgetEventPreset[] {\n return eventPresetsByType.get(type) ?? []\n }\n\n /** 获取物料 type 的 keyed slot 容器配置(标签页 / 走马灯等) */\n function getKeyedSlotConfig(type: string): KeyedSlotContainerConfig | undefined {\n return keyedSlotConfigByType.get(type)\n }\n\n /** 判断容器 view 是否应通过 #item slot 逐子项渲染 */\n function resolveUsesItemSlot(widget: Widget): boolean {\n const keyedConfig = getKeyedSlotConfig(widget.type)\n if (keyedConfig?.isContainer(widget)) {\n return true\n }\n const resolver = usesItemSlotByType.get(widget.type)\n if (resolver === undefined) {\n return false\n }\n return typeof resolver === 'function' ? resolver(widget) : resolver\n }\n\n const containerTypes = new Set(allWidgets.filter(w => w.isContainer).map(w => w.type))\n containerTypes.add('page')\n\n const placementContext: WidgetTreePlacementContext = {\n isContainerType: type => containerTypes.has(type),\n getKeyedSlotConfig\n }\n\n /** 物料 type 是否为可挂载任意子组件的容器 */\n function isContainerType(type: string): boolean {\n return containerTypes.has(type)\n }\n\n /** 节点是否可作为父级(含 keyed slot 容器,仅接受特定子项类型) */\n function widgetCanBeParent(parent: Widget): boolean {\n return widgetCanBeParentWidget(parent, placementContext)\n }\n\n /** 判断 parent 是否允许挂载 child */\n function widgetAcceptsChild(parent: Widget, child: Widget): boolean {\n return widgetAcceptsChildWidget(parent, child, placementContext)\n }\n\n return {\n definitions: allDefinitions,\n extraWidgets,\n allWidgets,\n componentEntries,\n widgetNormalizers,\n copyNormalizeTypes,\n getMaterialDisplayDefault,\n getWidgetTypeLabel,\n getWidgetTypeIcon,\n getEventPresets,\n getKeyedSlotConfig,\n resolveUsesItemSlot,\n isContainerType,\n widgetCanBeParent,\n widgetAcceptsChild\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// Keyed Slot 容器(标签页 / 走马灯等)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 向 keyed slot 容器末尾追加一个子项(如新增标签页) */\nexport function addKeyedSlotChild(container: Widget, config: KeyedSlotContainerConfig, page?: Page): boolean {\n if (!config.isContainer(container)) return false\n if (page && !canMutateWidgetStructure(page, container)) return false\n container.children ??= []\n\n const nextIndex = config.getChildren(container).length + 1\n const child = config.createChild(`${config.childTitlePrefix}${nextIndex}`)\n container.children.push(child)\n return true\n}\n\n/** 在 keyed slot 容器内按 offset 移动子项顺序(-1 上移,1 下移) */\nexport function moveKeyedSlotChild(container: Widget, childIndex: number, offset: -1 | 1, config: KeyedSlotContainerConfig, page?: Page): boolean {\n if (!config.isContainer(container) || !container.children) return false\n\n const children = config.getChildren(container)\n const child = children[childIndex]\n if (!child) return false\n if (page && (!canMutateWidgetStructure(page, container) || !canMutateWidgetStructure(page, child))) return false\n\n const currentIndex = container.children.findIndex(item => item.id === child.id)\n const targetIndex = currentIndex + offset\n if (currentIndex < 0 || targetIndex < 0 || targetIndex >= container.children.length) return false\n\n moveArrayIndex(container.children, currentIndex, targetIndex)\n return true\n}\n\n/** 递归规范化 keyed slot 容器及其子项(补全默认子项、activeKey 等) */\nexport function normalizeKeyedSlotWidget(widget: Widget, config: KeyedSlotContainerConfig): void {\n if (!config.isContainer(widget)) {\n widget.children?.forEach(child => normalizeKeyedSlotWidget(child, config))\n return\n }\n\n widget.options ??= {}\n\n config.onBeforeNormalizeContainer?.(widget)\n config.ensureContainerOptions(widget)\n\n if (!Array.isArray(widget.children)) {\n widget.children = config.createDefaultChildren()\n }\n\n widget.children = widget.children.map(child => {\n if (!config.isChild(child)) {\n return child\n }\n\n child.options ??= {}\n config.ensureChildOptions(child)\n ensureWidgetEditorTitle(child, config.getChildTitle(child))\n child.children ??= []\n\n child.children.forEach(grandchild => normalizeKeyedSlotWidget(grandchild, config))\n return child\n })\n\n if (!config.getChildren(widget).length) {\n widget.children = config.createDefaultChildren()\n }\n\n widget.options.activeKey = config.resolveActiveKey(widget)\n widget.children?.forEach(child => normalizeKeyedSlotWidget(child, config))\n}\n\nexport type KeyedSlotSelectionContext = {\n selectedWidget: Widget | null\n /** 判断 ancestor 子树是否包含 targetId */\n widgetTreeContains: (ancestor: Widget, targetId: number) => boolean\n /** 删除子项后重新选中容器或其它节点 */\n onReselect: (widget: Widget) => void\n}\n\n/** 删除 keyed slot 子项,并修正选中态与 activeKey */\nexport function removeKeyedSlotChild(container: Widget, child: Widget, config: KeyedSlotContainerConfig, selection: KeyedSlotSelectionContext, page?: Page): boolean {\n if (!config.isContainer(container) || !container.children) return false\n\n const children = config.getChildren(container)\n if (children.length <= 1) return false\n if (page && (!canMutateWidgetStructure(page, container) || !canMutateWidgetStructure(page, child))) return false\n\n const index = container.children.findIndex(item => item.id === child.id)\n if (index < 0) return false\n\n container.children.splice(index, 1)\n\n if (selection.selectedWidget) {\n if (selection.widgetTreeContains(child, selection.selectedWidget.id) || selection.selectedWidget.id === child.id) {\n selection.onReselect(container)\n }\n }\n\n container.options ??= {}\n container.options.activeKey = config.resolveActiveKey(container)\n return true\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 页面默认值\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 空页面的默认 data / lifecycle / methods 初始值 */\nexport const DEFAULT_PAGE_DATA: PageData = []\n/** 新建页面的默认名称 */\nexport const DEFAULT_PAGE_NAME = '页面'\n\n/** 新建页面的默认 styles */\nexport const DEFAULT_PAGE_STYLES: WidgetStyles = { default: {} }\n\n/** 创建页面脚本部分的默认值(data / lifecycle / methods) */\nexport function createDefaultPageScript(): Pick<Page, 'data' | 'lifecycle' | 'methods'> {\n return {\n data: DEFAULT_PAGE_DATA,\n lifecycle: {},\n methods: []\n }\n}\n\n/** 创建空白 Page 实例(含默认脚本字段) */\nexport function createDefaultPage(): Page {\n return {\n id: WIDGET_ID_START,\n type: 'page',\n name: DEFAULT_PAGE_NAME,\n title: DEFAULT_PAGE_NAME,\n styles: { default: { ...DEFAULT_PAGE_STYLES.default } },\n options: {},\n children: [],\n ...createDefaultPageScript()\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 页面数据(Page Data):校验 · 归一化 · 类型转换\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 为列表项补全唯一 key(保留已有合法 key) */\nfunction ensureListItemKeys<T extends { key: number }>(items: T[]): T[] {\n const used = new Set<number>()\n let nextKey = 1\n\n return items.map(item => {\n if (Number.isFinite(item.key) && item.key > 0 && !used.has(item.key)) {\n used.add(item.key)\n nextKey = Math.max(nextKey, item.key + 1)\n return item\n }\n const key = nextKey++\n used.add(key)\n return { ...item, key }\n })\n}\n\n/** 校验 PageData 字段名是否为合法 JS 标识符 */\nexport function isValidPageDataName(name: string): boolean {\n return /^[A-Za-z_$][\\w$]*$/.test(name.trim())\n}\n\n/** 检查 PageData 中是否已存在同名项(可排除指定 key) */\nexport function isPageDataNameUsed(items: PageData, name: string, excludeKey?: number): boolean {\n const normalized = name.trim()\n if (!normalized) return false\n return items.some(item => item.key !== excludeKey && item.name.trim() === normalized)\n}\n\n/** 将未知结构归一化为 PageDataItem;无效输入返回 null */\nfunction normalizePageDataItem(raw: unknown): PageDataItem | null {\n if (!raw || typeof raw !== 'object') return null\n\n const item = raw as Partial<PageDataItem>\n return {\n key: typeof item.key === 'number' && item.key > 0 ? item.key : 0,\n name: typeof item.name === 'string' ? item.name : '',\n value: item.value\n }\n}\n\n/** 按 name 去重,保留首次出现项 */\nexport function dedupePageData(items: PageData): PageData {\n const seen = new Set<string>()\n const result: PageData = []\n\n for (const item of items) {\n const name = item.name.trim()\n if (!name) {\n result.push(item)\n continue\n }\n if (seen.has(name)) continue\n seen.add(name)\n result.push(item)\n }\n\n return ensureListItemKeys(result)\n}\n\n/** 归一化 PageData:解析每项、去重、补全 key */\nexport function normalizePageData(items: PageData | undefined): PageData {\n if (!Array.isArray(items)) return []\n\n return ensureListItemKeys(dedupePageData(items.map(normalizePageDataItem).filter((item): item is PageDataItem => item !== null)))\n}\n\n/** {@link normalizePageData} 的别名,语义上表示「确保为合法 PageData」 */\nexport function ensurePageData(items: PageData | undefined): PageData {\n return normalizePageData(items)\n}\n\n/** 创建一条 PageData 项(key 由后续 normalize 补全) */\nexport function createPageDataItem(partial?: Partial<Pick<PageDataItem, 'name' | 'value'>>): PageDataItem {\n return {\n key: 0,\n name: partial?.name ?? '',\n value: partial?.value ?? ''\n }\n}\n\n/** 将 PageData 列表转为 context.data 使用的 Record */\nexport function pageDataItemsToRecord(items: PageData | undefined): Record<string, unknown> {\n const record: Record<string, unknown> = {}\n\n for (const item of normalizePageData(items)) {\n const name = item.name.trim()\n if (!name) continue\n record[name] = item.value\n }\n\n return record\n}\n\n/** 将 Record 转为 PageData 列表(补全 key) */\nexport function recordToPageDataItems(record: Record<string, unknown>): PageData {\n return ensureListItemKeys(Object.entries(record).map(([name, value]) => createPageDataItem({ name, value })))\n}\n\n/** 根据运行时值推断 PageData 字段类型 */\nexport function inferPageDataValueType(value: unknown): PageDataValueType {\n if (value === null) return 'null'\n if (Array.isArray(value)) return 'array'\n switch (typeof value) {\n case 'string':\n return 'string'\n case 'number':\n return 'number'\n case 'boolean':\n return 'boolean'\n case 'object':\n return 'object'\n default:\n return 'string'\n }\n}\n\n/** 设计器列表中展示的值摘要(截断过长文本) */\nexport function getPageDataValueSummary(value: unknown, maxLength = 48): string {\n const type = inferPageDataValueType(value)\n\n if (type === 'string') {\n const text = String(value)\n return text.length > maxLength ? `${text.slice(0, maxLength)}…` : text || '\"\"'\n }\n\n if (type === 'null') return 'null'\n if (type === 'boolean') return value ? 'true' : 'false'\n if (type === 'number') return String(value)\n\n try {\n const text = JSON.stringify(value)\n return text.length > maxLength ? `${text.slice(0, maxLength)}…` : text\n } catch {\n return String(value)\n }\n}\n\n/** 判断值能否被 JSON.stringify 序列化 */\nexport function isJsonSerializableValue(value: unknown): boolean {\n try {\n JSON.stringify(value)\n return true\n } catch {\n return false\n }\n}\n\n/** 解析 PageData 批量编辑用的 JSON 对象字符串 */\nexport function parsePageDataJson(source: string): { ok: true; record: Record<string, unknown> } | { ok: false; error: string } {\n const trimmed = source.trim()\n if (!trimmed) {\n return { ok: true, record: {} }\n }\n\n try {\n const parsed = JSON.parse(trimmed) as unknown\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n return { ok: false, error: '需为 JSON 对象,如 { \"count\": 0 }' }\n }\n return { ok: true, record: parsed as Record<string, unknown> }\n } catch {\n return { ok: false, error: 'JSON 解析失败,请检查语法' }\n }\n}\n\n/** 将 PageData Record 格式化为带缩进的 JSON 字符串(空对象保留占位) */\nexport function serializePageDataJson(record: Record<string, unknown>): string {\n if (Object.keys(record).length === 0) return '{\\n \\n}'\n return JSON.stringify(record, null, 2)\n}\n\n/** 设计器 PageData 值类型下拉选项 */\nexport const PAGE_DATA_VALUE_TYPE_OPTIONS: Array<{ value: PageDataValueType; label: string }> = [\n { value: 'string', label: 'string' },\n { value: 'number', label: 'number' },\n { value: 'boolean', label: 'boolean' },\n { value: 'null', label: 'null' },\n { value: 'object', label: 'object' },\n { value: 'array', label: 'array' }\n]\n\n/** 按目标类型强制转换 PageData 字段值 */\nexport function coercePageDataValue(type: PageDataValueType, raw: unknown): unknown {\n if (type === 'null') return null\n if (type === 'boolean') return Boolean(raw)\n if (type === 'number') {\n const num = typeof raw === 'number' ? raw : Number(raw)\n return Number.isFinite(num) ? num : 0\n }\n if (type === 'string') return raw == null ? '' : String(raw)\n if (type === 'array') return Array.isArray(raw) ? raw : []\n if (type === 'object') return raw && typeof raw === 'object' && !Array.isArray(raw) ? raw : {}\n return raw\n}\n\n/** 解析设计器中单条 PageData 字段的草稿文本为 typed 值 */\nexport function parseDraftPageDataValue(type: PageDataValueType, draft: string): { ok: true; value: unknown } | { ok: false; error: string } {\n if (type === 'string') {\n return { ok: true, value: draft }\n }\n\n if (type === 'number') {\n const num = Number(draft.trim())\n if (!Number.isFinite(num)) {\n return { ok: false, error: '请输入有效数字' }\n }\n return { ok: true, value: num }\n }\n\n if (type === 'boolean') {\n const normalized = draft.trim().toLowerCase()\n if (normalized === 'true') return { ok: true, value: true }\n if (normalized === 'false') return { ok: true, value: false }\n return { ok: false, error: '布尔值请填写 true 或 false' }\n }\n\n if (type === 'null') {\n return { ok: true, value: null }\n }\n\n const trimmed = draft.trim() || (type === 'array' ? '[]' : '{}')\n\n try {\n const value = JSON.parse(trimmed) as unknown\n if (type === 'array') {\n if (!Array.isArray(value)) {\n return { ok: false, error: '需为 JSON 数组' }\n }\n return { ok: true, value }\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n return { ok: false, error: '需为 JSON 对象' }\n }\n return { ok: true, value }\n } catch {\n return { ok: false, error: 'JSON 解析失败,请检查语法' }\n }\n}\n\n/** 将 PageData 字段值格式化为设计器编辑框中的草稿文本 */\nexport function formatDraftPageDataValue(type: PageDataValueType, value: unknown): string {\n if (type === 'string') return typeof value === 'string' ? value : String(value ?? '')\n if (type === 'number') return String(typeof value === 'number' ? value : 0)\n if (type === 'boolean') return value ? 'true' : 'false'\n if (type === 'null') return 'null'\n try {\n return JSON.stringify(value ?? (type === 'array' ? [] : {}), null, 2)\n } catch {\n return type === 'array' ? '[]' : '{}'\n }\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 页面树命令(设计器增删改移)\n// ═══════════════════════════════════════════════════════════════════════════════\n\n/** 组件树挂载校验上下文(由物料注册表提供) */\nexport type WidgetTreePlacementContext = {\n isContainerType: (type: string) => boolean\n getKeyedSlotConfig?: (type: string) => KeyedSlotContainerConfig | undefined\n}\n\n/** 节点是否可作为父级(页面根、容器类、keyed slot 容器) */\nexport function widgetCanBeParentWidget(parent: Widget, ctx: WidgetTreePlacementContext): boolean {\n if (parent.type === 'page') return true\n const keyedConfig = ctx.getKeyedSlotConfig?.(parent.type)\n if (keyedConfig?.isContainer(parent)) return true\n return ctx.isContainerType(parent.type)\n}\n\n/** 判断 parent 是否允许挂载 child(含 keyed slot 仅接受特定子项) */\nexport function widgetAcceptsChildWidget(parent: Widget, child: Widget, ctx: WidgetTreePlacementContext): boolean {\n if (parent.type === 'page') return true\n const keyedConfig = ctx.getKeyedSlotConfig?.(parent.type)\n if (keyedConfig?.isContainer(parent)) {\n return keyedConfig.isChild(child)\n }\n return ctx.isContainerType(parent.type)\n}\n\n/** 容器是否可作为拖放目标(物料允许;页面根始终可接收;locked 容器不可接收) */\nexport function widgetCanAcceptDropTarget(root: Page, parent: Widget, ctx: WidgetTreePlacementContext): boolean {\n if (!widgetCanBeParentWidget(parent, ctx)) return false\n if (parent.id === root.id || parent.type === 'page') return true\n return canMutateWidgetStructure(root, parent)\n}\n\n/** 设计器页面树命令上下文(page + id 分配 + normalize 配置) */\nexport type PageCommandBus = {\n page: Page\n widgetNormalizers: WidgetNormalizer[]\n copyNormalizeTypes: ReadonlySet<string>\n /** 分配新 widget 节点 id */\n allocateWidgetId: () => number\n /** 判断 parent 是否允许挂载 child */\n widgetAcceptsChild: (parent: Widget, child: Widget) => boolean\n}\n\n/** 在组件树中查找拥有指定 children 列表的父节点 */\nexport function findWidgetOwningChildrenList(root: Widget, list: Widget[]): Widget | null {\n if (root.children === list) return root\n for (const child of root.children ?? []) {\n const found = findWidgetOwningChildrenList(child, list)\n if (found) return found\n }\n return null\n}\n\n/** 在组件树中按 id 查找节点,未找到返回 null */\nexport function findWidgetInTree(root: Widget, id: number): Widget | null {\n let found: Widget | null = null\n walkWidgetTree(root, widget => {\n if (widget.id === id) {\n found = widget\n return true\n }\n })\n return found\n}\n\n/** 自 root 至 targetId 的路径(含两端),未找到返回 null */\nexport function findWidgetPath(root: Widget, targetId: number): Widget[] | null {\n function walk(node: Widget, path: Widget[]): Widget[] | null {\n const next = [...path, node]\n if (node.id === targetId) return next\n for (const child of node.children ?? []) {\n const found = walk(child, next)\n if (found) return found\n }\n return null\n }\n return walk(root, [])\n}\n\n/** 判断 ancestor 子树中是否包含 targetId 对应节点(含自身) */\nexport function widgetTreeContainsNode(ancestor: Widget, targetId: number): boolean {\n if (ancestor.id === targetId) return true\n return ancestor.children?.some(child => widgetTreeContainsNode(child, targetId)) ?? false\n}\n\n/** 从整棵树中移除指定节点(可保留 keepList 内的引用,用于同列表内移动) */\nexport function removeWidgetFromTree(root: Widget, widget: Widget, keepList?: Widget[]): void {\n /** 从指定 children 列表中移除目标 widget(跳过 keepList) */\n const removeFrom = (list: Widget[] | undefined) => {\n if (!list || list === keepList) return\n const index = list.findIndex(item => item.id === widget.id)\n if (index >= 0) list.splice(index, 1)\n }\n /** 自 root 起递归扫描各层 children */\n const walk = (node: Widget) => {\n removeFrom(node.children)\n node.children?.forEach(walk)\n }\n walk(root)\n}\n\n/** 将 widget 移入 targetList;若已在列表内则按 newIndex 调整顺序 */\nexport function moveWidgetToList(bus: PageCommandBus, widget: Widget, targetList: Widget[], newIndex?: number): void {\n const parent = findWidgetOwningChildrenList(bus.page, targetList)\n if (parent && !bus.widgetAcceptsChild(parent, widget)) return\n if (!canMutateWidgetStructure(bus.page, widget)) return\n if (parent && parent !== bus.page && !canMutateWidgetStructure(bus.page, parent)) return\n\n removeWidgetFromTree(bus.page, widget, targetList)\n const insertAt = Math.max(0, Math.min(newIndex ?? targetList.length, targetList.length))\n const currentIndex = targetList.findIndex(item => item.id === widget.id)\n if (currentIndex === -1) {\n targetList.splice(insertAt, 0, widget)\n return\n }\n if (currentIndex === insertAt) return\n targetList.splice(currentIndex, 1)\n const adjusted = currentIndex < insertAt ? insertAt - 1 : insertAt\n targetList.splice(adjusted, 0, widget)\n}\n\n/** 深拷贝 widget 并重新分配 id;复制后按需执行 normalize */\nexport function copyNewWidget(bus: PageCommandBus, origin: Widget): Widget {\n const widget = deepClone(origin)\n delete widget.component\n delete widget.setterComponent\n delete widget.icon\n delete widget.internal\n /** 递归为节点及其子树分配新 id */\n const assignIds = (node: Widget) => {\n node.id = bus.allocateWidgetId()\n node.children?.forEach(assignIds)\n }\n assignIds(widget)\n if (bus.copyNormalizeTypes.has(widget.type)) {\n applyWidgetNormalizers(widget, bus.widgetNormalizers)\n }\n return widget\n}\n\n/** 复制物料模板并插入页面树,返回带新 id 的实例;父级不接受子节点时返回 null */\nexport function addWidgetToTree(bus: PageCommandBus, widget: Widget, parentWidget?: Widget): Widget | null {\n if (parentWidget && !bus.widgetAcceptsChild(parentWidget, widget)) {\n return null\n }\n if (parentWidget && parentWidget !== bus.page && !canMutateWidgetStructure(bus.page, parentWidget)) {\n return null\n }\n\n const newWidget = copyNewWidget(bus, widget)\n if (parentWidget) {\n parentWidget.children = [...(parentWidget.children ?? []), newWidget]\n } else {\n bus.page.children = [...(bus.page.children ?? []), newWidget]\n }\n return newWidget\n}\n\n/** 从指定父节点(或页面根 children)中移除 widget */\nexport function removeWidgetFromParent(page: Page, widget: Widget, parentWidget?: Widget): void {\n if (!canMutateWidgetStructure(page, widget)) return\n if (parentWidget && parentWidget !== page && !canMutateWidgetStructure(page, parentWidget)) return\n if (parentWidget) {\n parentWidget.children = parentWidget.children?.filter(item => item.id !== widget.id)\n } else {\n page.children = page.children?.filter(item => item.id !== widget.id)\n }\n}\n\n/** 加载外部 JSON 后执行物料 normalize */\nexport function normalizeLoadedPage(page: Page, widgetNormalizers: WidgetNormalizer[]): Page {\n const normalized = deepClone(page)\n applyWidgetNormalizers(normalized, widgetNormalizers)\n applyWidgetInternalFlags(normalized)\n return normalized\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 历史记录(Undo / Redo)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type DesignerHistory = {\n maxStep: number\n steps: Page[]\n index: number\n}\n\nexport type HistoryRecordOptions = {\n maxStep?: number\n}\n\nexport type PageHistoryController = {\n history: DesignerHistory\n isApplyingHistory: boolean\n historyRecordSuspended: number\n /** 在回调执行期间暂停历史记录(如批量操作、undo/redo 回放) */\n runWithoutRecording: <T>(fn: () => T) => T\n /** 若与当前步快照不同则立即写入历史栈,有变更时返回 true */\n commitIfChanged: (page: Page) => boolean\n /** 立即 commitIfChanged(与 commitIfChanged 相同,保留语义化入口) */\n recordNow: (page: Page) => boolean\n /** 清空历史并以当前 page 作为唯一起始快照 */\n resetWithPage: (page: Page) => void\n /** 将 history.index 指向的快照交给 onApply 应用到页面 */\n applyStep: (page: Page, onApply: (snapshot: Page) => void) => void\n /** 回退一步并应用快照,成功返回 true */\n undo: (page: Page, onApply: (snapshot: Page) => void) => boolean\n /** 前进一步并应用快照,成功返回 true */\n redo: (page: Page, onApply: (snapshot: Page) => void) => boolean\n /** 是否可 undo(index > 0) */\n undoEnabled: () => boolean\n /** 是否可 redo(index 未到栈顶) */\n redoEnabled: () => boolean\n}\n\n/** 创建页面历史控制器:即时写入快照栈,支持 undo/redo */\nexport function createPageHistoryController(options: HistoryRecordOptions = {}): PageHistoryController {\n const maxStep = options.maxStep ?? 20\n\n const controller: PageHistoryController = {\n history: { maxStep, steps: [], index: -1 },\n isApplyingHistory: false,\n historyRecordSuspended: 0,\n\n /** @see PageHistoryController.runWithoutRecording */\n runWithoutRecording<T>(fn: () => T): T {\n controller.historyRecordSuspended++\n try {\n return fn()\n } finally {\n controller.historyRecordSuspended--\n }\n },\n\n /** @see PageHistoryController.commitIfChanged */\n commitIfChanged(page: Page): boolean {\n if (controller.isApplyingHistory || controller.historyRecordSuspended > 0) return false\n const snapshot = clonePageSnapshot(page)\n const current = controller.history.steps[controller.history.index]\n if (current && isSamePageSnapshot(current, snapshot)) return false\n pushSnapshot(controller.history, snapshot)\n return true\n },\n\n /** @see PageHistoryController.recordNow */\n recordNow(page: Page): boolean {\n return controller.commitIfChanged(page)\n },\n\n /** @see PageHistoryController.resetWithPage */\n resetWithPage(page: Page): void {\n controller.history.steps = []\n controller.history.index = -1\n pushSnapshot(controller.history, clonePageSnapshot(page))\n },\n\n /** @see PageHistoryController.applyStep */\n applyStep(_page: Page, onApply: (snapshot: Page) => void): void {\n const snapshot = controller.history.steps[controller.history.index]\n if (!snapshot) return\n controller.isApplyingHistory = true\n try {\n onApply(snapshot)\n } finally {\n // 延迟清除:Vue watch 在 microtask 中触发,须覆盖 undo/redo 回放窗口,避免误写入历史\n queueMicrotask(() => {\n controller.isApplyingHistory = false\n })\n }\n },\n\n /** @see PageHistoryController.undo */\n undo(page: Page, onApply: (snapshot: Page) => void): boolean {\n if (!controller.undoEnabled()) return false\n controller.history.index--\n controller.applyStep(page, onApply)\n return true\n },\n\n /** @see PageHistoryController.redo */\n redo(page: Page, onApply: (snapshot: Page) => void): boolean {\n if (!controller.redoEnabled()) return false\n controller.history.index++\n controller.applyStep(page, onApply)\n return true\n },\n\n /** @see PageHistoryController.undoEnabled */\n undoEnabled(): boolean {\n return controller.history.index > 0 && controller.history.steps.length > 0\n },\n\n /** @see PageHistoryController.redoEnabled */\n redoEnabled(): boolean {\n return controller.history.index < controller.history.steps.length - 1\n }\n }\n\n return controller\n}\n\n/** 写入快照并截断 redo 分支;超出 maxStep 时丢弃最旧记录 */\nfunction pushSnapshot(history: DesignerHistory, snapshot: Page): void {\n if (history.index < history.steps.length - 1) {\n history.steps.splice(history.index + 1)\n }\n history.steps.push(snapshot)\n if (history.steps.length > history.maxStep) {\n history.steps.shift()\n }\n history.index = history.steps.length - 1\n}\n\n// ═══════════════════════════════════════════════════════════════════════════════\n// 事件总线(设计器面板间通信)\n// ═══════════════════════════════════════════════════════════════════════════════\n\nexport type CoreEventMap = {\n 'page:changed': Page\n 'widget:selected': Widget | null\n 'history:changed': DesignerHistory\n}\n\nexport type CoreEventBus = {\n /** 订阅事件,返回取消订阅函数 */\n on<K extends keyof CoreEventMap>(event: K, handler: (payload: CoreEventMap[K]) => void): () => void\n /** 向所有订阅者派发事件 */\n emit<K extends keyof CoreEventMap>(event: K, payload: CoreEventMap[K]): void\n}\n\n/** 简易 typed 事件总线;on 返回取消订阅函数 */\nexport function createCoreEventBus(): CoreEventBus {\n const listeners = new Map<keyof CoreEventMap, Set<(payload: unknown) => void>>()\n\n return {\n /** @see CoreEventBus.on */\n on(event, handler) {\n const set = listeners.get(event) ?? new Set()\n set.add(handler as (payload: unknown) => void)\n listeners.set(event, set)\n return () => set.delete(handler as (payload: unknown) => void)\n },\n /** @see CoreEventBus.emit */\n emit(event, payload) {\n listeners.get(event)?.forEach(handler => handler(payload))\n }\n }\n}\n"],"names":["STYLE_BREAKPOINTS","STYLE_BREAKPOINT_MIN_WIDTH","STYLE_BREAKPOINT_META","WIDGET_ANIMATION_TRIGGER_LABELS","WIDGET_ANIMATION_PRESET_LABELS","WIDGET_ANIMATION_TRIGGERS","WIDGET_ANIMATION_PRESETS","WIDGET_PSEUDO_STYLE_STATES","WIDGET_STYLE_STATE_LABELS","isResponsiveStyleValue","value","readStyleValue","style","key","breakpoint","raw","resolveResponsiveValue","last","bp","custom","resolveBreakpointByWidth","width","active","cleanResponsiveValue","cleaned","item","keys","hasResponsiveStyle","resolveFlatCssStyle","flat","resolved","DESIGN_MODE_PREVENT_DEFAULT_EVENTS","ensureWidgetStyles","widget","ensureWidgetMotion","styles","isWidgetAnimationEnabled","animation","isWidgetTransitionEnabled","transition","_a","_b","_c","_d","hasWidgetAnimation","hasWidgetTransition","hasWidgetAnimationForTrigger","trigger","hasWidgetMotion","getWidgetDefaultStyle","getWidgetPseudoStyle","state","isNonEmptyCssStyle","hasWidgetPseudoStyle","COMMON_CLICK_EVENT_PRESET","COMMON_CONTAINER_EVENT_PRESETS","WIDGET_ID_START","walkWidgetTree","root","visitor","walk","child","getMaxWidgetId","max","createWidgetIdAllocator","next","deepClone","origin","moveArrayIndex","array","fromIndex","toIndex","applyWidgetNormalizers","normalizers","normalize","RUNTIME_WIDGET_KEYS","INTERNAL_WIDGET_TYPES","resolveWidgetInternal","parentWidget","layout","applyWidgetInternalFlags","isWidgetSelfLocked","findLockedAncestor","target","path","findWidgetPath","index","ancestor","isWidgetEffectivelyLocked","canMutateWidgetStructure","canMutateWidgetContent","canToggleWidgetLock","resolveWidgetEditorTitle","fallback","title","ensureWidgetEditorTitle","typeName","resolvePageTitle","page","stripWidgetRuntimeFields","clonePageSnapshot","snapshot","isSamePageSnapshot","a","b","serializePageSnapshot","space","INLINE_DISPLAY_VALUES","isInlineLevelDisplay","display","resolveEffectiveDisplay","displayDefault","shouldWidgetStretchFullWidth","registry","toMaterialWidget","def","toRuntimeMaterialDefinitions","definitions","buildMaterialPackages","byPackage","list","name","children","getViewComponentName","type","getSetterComponentName","getDesignerComponentName","collectWidgetComponents","registerRuntimeWidgetViews","app","entry","viewName","createMaterialRegistry","allDefinitions","extraWidgets","allWidgets","componentEntries","widgetNormalizers","seenNormalizers","copyNormalizeTypes","w","eventPresetsByType","presets","keyedSlotConfigByType","usesItemSlotByType","materialDisplayDefaultByType","widgetMetaByType","getMaterialDisplayDefault","getWidgetTypeLabel","getWidgetTypeIcon","getEventPresets","getKeyedSlotConfig","resolveUsesItemSlot","keyedConfig","resolver","containerTypes","placementContext","isContainerType","widgetCanBeParent","parent","widgetCanBeParentWidget","widgetAcceptsChild","widgetAcceptsChildWidget","addKeyedSlotChild","container","config","nextIndex","moveKeyedSlotChild","childIndex","offset","currentIndex","targetIndex","normalizeKeyedSlotWidget","grandchild","removeKeyedSlotChild","selection","DEFAULT_PAGE_DATA","DEFAULT_PAGE_NAME","DEFAULT_PAGE_STYLES","createDefaultPageScript","createDefaultPage","ensureListItemKeys","items","used","nextKey","isValidPageDataName","isPageDataNameUsed","excludeKey","normalized","normalizePageDataItem","dedupePageData","seen","result","normalizePageData","ensurePageData","createPageDataItem","partial","pageDataItemsToRecord","record","recordToPageDataItems","inferPageDataValueType","getPageDataValueSummary","maxLength","text","isJsonSerializableValue","parsePageDataJson","source","trimmed","parsed","serializePageDataJson","PAGE_DATA_VALUE_TYPE_OPTIONS","coercePageDataValue","num","parseDraftPageDataValue","draft","formatDraftPageDataValue","ctx","widgetCanAcceptDropTarget","findWidgetOwningChildrenList","found","findWidgetInTree","id","targetId","node","widgetTreeContainsNode","removeWidgetFromTree","keepList","removeFrom","moveWidgetToList","bus","targetList","newIndex","insertAt","adjusted","copyNewWidget","assignIds","addWidgetToTree","newWidget","removeWidgetFromParent","normalizeLoadedPage","createPageHistoryController","options","controller","fn","current","pushSnapshot","_page","onApply","history","createCoreEventBus","listeners","event","handler","set","payload"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Designer } from '../designer.ts';
|
|
2
|
+
import { Widget } from '../../core/index.ts';
|
|
3
|
+
type __VLS_Props = {
|
|
4
|
+
designer: Designer;
|
|
5
|
+
parentWidget?: Widget | null;
|
|
6
|
+
widgets: Widget[];
|
|
7
|
+
emptyHint?: string;
|
|
8
|
+
dropZoneId?: number;
|
|
9
|
+
};
|
|
10
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
11
|
+
parentWidget: Widget | null;
|
|
12
|
+
emptyHint: string;
|
|
13
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
14
|
+
export default _default;
|
|
15
|
+
//# sourceMappingURL=draggable-list.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"draggable-list.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/canvas/draggable-list.vue"],"names":[],"mappings":"AA8SA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AA8OjD,KAAK,WAAW,GAAG;IACf,QAAQ,EAAE,QAAQ,CAAA;IAClB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,OAAO,EAAE,MAAM,EAAE,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB,CAAC;;kBAJe,MAAM,GAAG,IAAI;eAEhB,MAAM;;AAiItB,wBAOG"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Designer } from '../designer.ts';
|
|
2
|
+
import { Widget } from '../../core/index.ts';
|
|
3
|
+
type __VLS_Props = {
|
|
4
|
+
designer: Designer;
|
|
5
|
+
widget: Widget;
|
|
6
|
+
parentWidget?: Widget | null;
|
|
7
|
+
index?: number;
|
|
8
|
+
};
|
|
9
|
+
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>;
|
|
10
|
+
export default _default;
|
|
11
|
+
//# sourceMappingURL=widget-node.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-node.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/canvas/widget-node.vue"],"names":[],"mappings":"AA0CA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AAC9C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAOjD,KAAK,WAAW,GAAG;IACjB,QAAQ,EAAE,QAAQ,CAAA;IAClB,MAAM,EAAE,MAAM,CAAA;IACd,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IAC5B,KAAK,CAAC,EAAE,MAAM,CAAA;CACf,CAAC;;AAqGF,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, {}, any>;
|
|
2
|
+
export default _default;
|
|
3
|
+
//# sourceMappingURL=workspace.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workspace.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/canvas/workspace.vue"],"names":[],"mappings":";AA0iBA,wBAKG"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { PageData } from '../../core/index.ts';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
modelValue?: PageData;
|
|
4
|
+
};
|
|
5
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
6
|
+
"update:modelValue": (value: PageData) => any;
|
|
7
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
8
|
+
"onUpdate:modelValue"?: ((value: PageData) => any) | undefined;
|
|
9
|
+
}>, {
|
|
10
|
+
modelValue: PageData;
|
|
11
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
12
|
+
export default _default;
|
|
13
|
+
//# sourceMappingURL=data-editor.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-editor.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/datasource/data-editor.vue"],"names":[],"mappings":"AAmbA,OAAO,KAAK,EAAE,QAAQ,EAAmC,MAAM,qBAAqB,CAAA;AAmCpF,KAAK,WAAW,GAAG;IACf,UAAU,CAAC,EAAE,QAAQ,CAAA;CACtB,CAAC;;;;;;gBADa,QAAQ;;AAm3BzB,wBAQG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasource-help.d.ts","sourceRoot":"","sources":["../../../src/designer/datasource/datasource-help.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,GAAG;IAClC,GAAG,EAAE,MAAM,CAAA;IACX,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB,CAAA;AAED,eAAO,MAAM,yBAAyB,EAAE,qBAAqB,EAiD5D,CAAA"}
|
|
@@ -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=panel.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"panel.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/datasource/panel.vue"],"names":[],"mappings":";AAgLA,wBAMG"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { InjectionKey } from 'vue';
|
|
2
|
+
import { KeyedSlotContainerConfig, Page, Widget, WidgetPseudoStyleState, CoreEventBus, DesignerHistory, WidgetNormalizer } from '../core/index.ts';
|
|
3
|
+
export type { DesignerHistory } from '../core/index.ts';
|
|
4
|
+
/** `createDesigner` 初始化参数 */
|
|
5
|
+
export type DesignerInitOptions = {
|
|
6
|
+
page: Page;
|
|
7
|
+
/** 加载/规范化页面时依次应用的 widget normalizer */
|
|
8
|
+
widgetNormalizers?: WidgetNormalizer[];
|
|
9
|
+
/** 复制 widget 时需额外走 normalizer 的 type 集合 */
|
|
10
|
+
copyNormalizeTypes?: ReadonlySet<string>;
|
|
11
|
+
/** 判断 parent 是否允许挂载 child(由物料注册表提供) */
|
|
12
|
+
widgetAcceptsChild?: (parent: Widget, child: Widget) => boolean;
|
|
13
|
+
/** 可选事件总线,用于向 UI 广播 page / history / selection 变更 */
|
|
14
|
+
eventBus?: CoreEventBus;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* 设计器运行时 API(由 `createDesigner` 构造,`DESIGNER_KEY` 注入子组件)。
|
|
18
|
+
*
|
|
19
|
+
* 变更页面树的操作分两类:
|
|
20
|
+
* - **显式入栈**:`addWidget`、`removeWidget`、拖拽结束等调用 `recordHistoryNow`
|
|
21
|
+
* - **自动入栈**:属性面板等编辑由外层 watch `page` 后即时调用 `commitHistoryIfChanged`
|
|
22
|
+
*/
|
|
23
|
+
export type Designer = {
|
|
24
|
+
/** 当前编辑的页面(根 widget 即 page 自身) */
|
|
25
|
+
page: Page;
|
|
26
|
+
/** 画布/大纲当前选中的 widget,默认选中页面根 */
|
|
27
|
+
selectedWidget: Widget | null;
|
|
28
|
+
/** 鼠标悬停中的 widget,用于高亮提示 */
|
|
29
|
+
hoveredWidget: Widget | null;
|
|
30
|
+
/** 组件库拖入画布前暂存的 widget 模板 */
|
|
31
|
+
pendingPaletteWidget: Widget | null;
|
|
32
|
+
/** 拖拽悬停的空容器 zone id,用于高亮可放置区域 */
|
|
33
|
+
dropHoverEmptyZoneId: number | null;
|
|
34
|
+
/** 撤销/重做快照栈(只读引用,由 historyCtrl 维护) */
|
|
35
|
+
history: DesignerHistory;
|
|
36
|
+
/** 历史栈变更世代号,供 UI 响应式刷新 undo/redo 按钮 */
|
|
37
|
+
historyRevision: number;
|
|
38
|
+
/** 页面树结构变更世代号,供画布强制刷新(如双击添加等 in-place 变更) */
|
|
39
|
+
pageTreeRevision: number;
|
|
40
|
+
/** 拖拽等批量变更期间 >0,暂停 page watch 自动入栈 */
|
|
41
|
+
pageHistoryWatchSuspended: number;
|
|
42
|
+
/** 在回调执行期间暂停历史记录,避免 loadPage / undo 等操作产生多余快照 */
|
|
43
|
+
runWithoutHistoryRecording: <T>(fn: () => T) => T;
|
|
44
|
+
/** 开始暂停 page watch 自动入栈(须与 endPageHistoryWatchSuspend 配对) */
|
|
45
|
+
beginPageHistoryWatchSuspend: () => void;
|
|
46
|
+
/** 结束暂停 page watch 自动入栈 */
|
|
47
|
+
endPageHistoryWatchSuspend: () => void;
|
|
48
|
+
/** 若当前 page 与栈顶快照不同则立即入栈,并广播 `history:changed` */
|
|
49
|
+
commitHistoryIfChanged: () => void;
|
|
50
|
+
/** 立即入栈(与 commitHistoryIfChanged 相同,用于结构操作结束等语义化场景) */
|
|
51
|
+
recordHistoryNow: () => void;
|
|
52
|
+
/** 外部 v-model 灌入新页面:跳过重放历史,重置栈并规范化 widget */
|
|
53
|
+
loadPage: (page: Page) => void;
|
|
54
|
+
/** 页面树替换后,按 id 重新解析选中项;找不到则回退到页面根 */
|
|
55
|
+
syncSelectionAfterPageChange: () => void;
|
|
56
|
+
/** 设置/清除组件库拖放中的 widget 模板 */
|
|
57
|
+
setPendingPaletteWidget: (widget: Widget | null) => void;
|
|
58
|
+
/** 设置/清除拖拽悬停的空容器 zone id */
|
|
59
|
+
setDropHoverEmptyZoneId: (parentId: number | null) => void;
|
|
60
|
+
/** 分配下一个全局唯一的 widget id */
|
|
61
|
+
allocateWidgetId: () => number;
|
|
62
|
+
/** 自页面根起按 id 深度优先查找 widget */
|
|
63
|
+
findWidgetById: (id: number) => Widget | null;
|
|
64
|
+
/** 从整棵页面树中移除 widget(拖拽排序等底层操作) */
|
|
65
|
+
removeWidgetFromTree: (widget: Widget, keepList?: Widget[]) => void;
|
|
66
|
+
/** 将 widget 移动到目标 children 列表的指定位置 */
|
|
67
|
+
moveWidgetToList: (widget: Widget, targetList: Widget[], newIndex?: number) => void;
|
|
68
|
+
/** 深拷贝 widget 并分配新 id(含子树与 copy normalizer) */
|
|
69
|
+
copyNewWidget: (origin: Widget) => Widget;
|
|
70
|
+
/** 向页面树插入 widget,并立即记录历史 */
|
|
71
|
+
addWidget: (widget: Widget, parentWidget?: Widget) => void;
|
|
72
|
+
/** 从父节点移除 widget,修正选中态并立即记录历史 */
|
|
73
|
+
removeWidget: (widget: Widget, parentWidget?: Widget) => void;
|
|
74
|
+
/** 清空页面根下所有子 widget,选中回退到页面根 */
|
|
75
|
+
clearWidgetList: () => void;
|
|
76
|
+
/** 设置选中 widget 并广播 `widget:selected` */
|
|
77
|
+
setSelected: (widget: Widget) => void;
|
|
78
|
+
/** 设置/清除悬停 widget */
|
|
79
|
+
setHoveredWidget: (widget: Widget | null) => void;
|
|
80
|
+
/** 样式面板固定预览(hover / active / focus) */
|
|
81
|
+
stylePreview: {
|
|
82
|
+
widgetId: number | null;
|
|
83
|
+
state: WidgetPseudoStyleState | null;
|
|
84
|
+
pinned: boolean;
|
|
85
|
+
};
|
|
86
|
+
setStylePreview: (widgetId: number | null, state: WidgetPseudoStyleState | null, pinned?: boolean) => void;
|
|
87
|
+
clearStylePreview: () => void;
|
|
88
|
+
/** 判断 ancestor 自身或其子孙是否包含 targetId */
|
|
89
|
+
widgetTreeContains: (ancestor: Widget, targetId: number) => boolean;
|
|
90
|
+
/** 在 sibling 列表中将 index 位置的 widget 上移一位 */
|
|
91
|
+
moveUpWidget: (parentWidget: Widget | undefined, index: number) => void;
|
|
92
|
+
/** 在 sibling 列表中将 index 位置的 widget 下移一位 */
|
|
93
|
+
moveDownWidget: (parentWidget: Widget | undefined, index: number) => void;
|
|
94
|
+
/** 向 keyed slot 容器追加一个子 pane/slide 并分配 id */
|
|
95
|
+
addKeyedSlotChild: (container: Widget, config: KeyedSlotContainerConfig) => void;
|
|
96
|
+
/** 从 keyed slot 容器移除子项,必要时重选兄弟节点 */
|
|
97
|
+
removeKeyedSlotChild: (container: Widget, child: Widget, config: KeyedSlotContainerConfig) => void;
|
|
98
|
+
/** 在 keyed slot 容器内按 offset 移动子项顺序 */
|
|
99
|
+
moveKeyedSlotChild: (container: Widget, childIndex: number, offset: -1 | 1, config: KeyedSlotContainerConfig) => void;
|
|
100
|
+
/** 切换组件锁定状态(自身 locked;祖先 locked 时不可改子节点) */
|
|
101
|
+
toggleWidgetLock: (widget: Widget) => void;
|
|
102
|
+
/** 撤销上一步页面变更 */
|
|
103
|
+
undo: () => void;
|
|
104
|
+
/** 重做下一步页面变更 */
|
|
105
|
+
redo: () => void;
|
|
106
|
+
/** 是否可撤销 */
|
|
107
|
+
undoEnabled: () => boolean;
|
|
108
|
+
/** 是否可重做 */
|
|
109
|
+
redoEnabled: () => boolean;
|
|
110
|
+
};
|
|
111
|
+
/** Vue provide/inject 键,见 `useInjectDesigner` */
|
|
112
|
+
export declare const DESIGNER_KEY: InjectionKey<Designer>;
|
|
113
|
+
/**
|
|
114
|
+
* 创建设计器状态对象。
|
|
115
|
+
* @param options 初始页面与 normalizer、事件总线等配置
|
|
116
|
+
* @returns 须再包一层 `reactive()` 后 provide 的设计器实例
|
|
117
|
+
*/
|
|
118
|
+
export declare function createDesigner(options: DesignerInitOptions): Designer;
|
|
119
|
+
//# sourceMappingURL=designer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designer.d.ts","sourceRoot":"","sources":["../../src/designer/designer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Page } from '../core/index.ts';
|
|
2
|
+
import { PageSetterOptionsSlotProps } from '../materials/page/setter-slots.ts';
|
|
3
|
+
import { LowcodeDesignerProps } from '../runtime/runtime.ts';
|
|
4
|
+
type __VLS_Props = LowcodeDesignerProps;
|
|
5
|
+
type __VLS_PublicProps = {
|
|
6
|
+
'page'?: Page;
|
|
7
|
+
} & __VLS_Props;
|
|
8
|
+
declare function __VLS_template(): {
|
|
9
|
+
attrs: Partial<{}>;
|
|
10
|
+
slots: Readonly<{
|
|
11
|
+
'page-setter-options'(props: PageSetterOptionsSlotProps): unknown;
|
|
12
|
+
}> & {
|
|
13
|
+
'page-setter-options'(props: PageSetterOptionsSlotProps): unknown;
|
|
14
|
+
};
|
|
15
|
+
refs: {
|
|
16
|
+
themeScopeRootEl: HTMLDivElement;
|
|
17
|
+
sidebarPanelRef: HTMLDivElement;
|
|
18
|
+
};
|
|
19
|
+
rootEl: any;
|
|
20
|
+
};
|
|
21
|
+
type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
|
|
22
|
+
declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
23
|
+
"update:page": (value: Page) => any;
|
|
24
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
25
|
+
"onUpdate:page"?: ((value: Page) => any) | undefined;
|
|
26
|
+
}>, {
|
|
27
|
+
width: string;
|
|
28
|
+
height: string;
|
|
29
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
|
|
30
|
+
themeScopeRootEl: HTMLDivElement;
|
|
31
|
+
sidebarPanelRef: HTMLDivElement;
|
|
32
|
+
}, any>;
|
|
33
|
+
declare const _default: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
|
|
34
|
+
export default _default;
|
|
35
|
+
type __VLS_WithTemplateSlots<T, S> = T & {
|
|
36
|
+
new (): {
|
|
37
|
+
$slots: S;
|
|
38
|
+
};
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=designer.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"designer.vue.d.ts","sourceRoot":"","sources":["../../src/designer/designer.vue"],"names":[],"mappings":"AAqOA,OAAO,EAA4D,KAAK,IAAI,EAAE,MAAM,kBAAkB,CAAA;AAItG,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AACnF,OAAO,EAAoQ,KAAK,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAmBnU,KAAK,WAAW,GAAG,oBAAoB,CAAC;AAuIxC,KAAK,iBAAiB,GAAG;IACzB,MAAM,CAAC,EAAE,IAAI,CAAC;CACb,GAAG,WAAW,CAAC;AAKhB,iBAAS,cAAc;WAuPT,OAAO,IAA6B;;qCArZnB,0BAA0B,GAAG,OAAO;;qCAApC,0BAA0B,GAAG,OAAO;;;;;;;EA0ZlE;AA+BD,KAAK,oBAAoB,GAAG,UAAU,CAAC,OAAO,cAAc,CAAC,CAAC;AAC9D,QAAA,MAAM,eAAe;;;;;;;;;;OAUnB,CAAC;wBACkB,uBAAuB,CAAC,OAAO,eAAe,EAAE,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAAnG,wBAAoG;AAapG,KAAK,uBAAuB,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,GAAG;IACxC,QAAO;QACN,MAAM,EAAE,CAAC,CAAC;KAEV,CAAA;CACD,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export { default as LowcodeDesigner } from './designer.vue';
|
|
2
|
+
export { createDesigner, DESIGNER_KEY, type Designer, type DesignerHistory, type DesignerInitOptions } from './designer.ts';
|
|
3
|
+
export { type DesignMaterialRegistry } from './material-registry.ts';
|
|
4
|
+
export { getDesignerComponentName, getSetterComponentName } from '../core/index.ts';
|
|
5
|
+
export { createDefaultPage, createDefaultPageScript, resolvePageTitle } from '../core/index.ts';
|
|
6
|
+
export type { Page, MaterialDefinition, WidgetOptions } from '../core/index.ts';
|
|
7
|
+
export type { PageSetterOptionsSlotProps } from '../materials/page/setter-slots.ts';
|
|
8
|
+
export { provideLowcodeUpload, applyLowcodeThemeCssVariables } from '../runtime/runtime.ts';
|
|
9
|
+
export { LOWCODE_UPLOAD_KEY, type LowcodeUploadHandler, type LowcodeUploadInput } from '../runtime/runtime.ts';
|
|
10
|
+
export { useLowcodeToken } from '../runtime/runtime.ts';
|
|
11
|
+
export { DEFAULT_LOWCODE_DESIGNER_HEIGHT, DEFAULT_LOWCODE_DESIGNER_WIDTH, DEFAULT_LOWCODE_DESIGNER_LOCALE, DEFAULT_LOWCODE_DESIGNER_THEME, type LowcodeDesignerLocale, type LowcodeDesignerThemeConfig, type LowcodeDesignerProps, type LowcodeRuntimeProps } from '../runtime/runtime.ts';
|
|
12
|
+
export { useInjectDesigner, useInjectMaterialRegistry } from './material-registry.ts';
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/designer/index.ts"],"names":[],"mappings":"AAAA,OAAO,kCAAkC,CAAA;AAEzC,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE3D,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,QAAQ,EAAE,KAAK,eAAe,EAAE,KAAK,mBAAmB,EAAE,MAAM,eAAe,CAAA;AAC3H,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,wBAAwB,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,kBAAkB,CAAA;AAEnF,OAAO,EAAE,iBAAiB,EAAE,uBAAuB,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAE/F,YAAY,EAAE,IAAI,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAC/E,YAAY,EAAE,0BAA0B,EAAE,MAAM,mCAAmC,CAAA;AAEnF,OAAO,EAAE,oBAAoB,EAAE,6BAA6B,EAAE,MAAM,uBAAuB,CAAA;AAC3F,OAAO,EAAE,kBAAkB,EAAE,KAAK,oBAAoB,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAA;AAC9G,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA;AAEvD,OAAO,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,+BAA+B,EAAE,8BAA8B,EAAE,KAAK,qBAAqB,EAAE,KAAK,0BAA0B,EAAE,KAAK,oBAAoB,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAA;AAE1R,OAAO,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { App } from 'vue';
|
|
2
|
+
import { Designer } from './designer.ts';
|
|
3
|
+
import { LowcodePackage, MaterialDefinition, MaterialRegistry, Widget } from '../core/index.ts';
|
|
4
|
+
export type DesignMaterialRegistry = MaterialRegistry & {
|
|
5
|
+
packages: LowcodePackage[];
|
|
6
|
+
paletteWidgets: Widget[];
|
|
7
|
+
hasDesignerComponent: (type: string) => boolean;
|
|
8
|
+
resolveDesignViewComponentName: (type: string) => string;
|
|
9
|
+
};
|
|
10
|
+
export declare function useInjectDesigner(): Designer | undefined;
|
|
11
|
+
export declare function useInjectMaterialRegistry(): DesignMaterialRegistry;
|
|
12
|
+
export type { Designer };
|
|
13
|
+
/**
|
|
14
|
+
* 在设计器物料注册表基础上扩展 palette 分组、设计态组件解析等能力。
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDesignerMaterialRegistry(allDefinitions: MaterialDefinition[]): DesignMaterialRegistry;
|
|
17
|
+
/** 向 Vue app 注册设计态 view / designer / setter 组件(已注册则跳过) */
|
|
18
|
+
export declare function registerDesignWidgetComponents(app: App, registry: DesignMaterialRegistry): void;
|
|
19
|
+
//# sourceMappingURL=material-registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"material-registry.d.ts","sourceRoot":"","sources":["../../src/designer/material-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,GAAG,EAAkB,MAAM,KAAK,CAAA;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAIpG,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,GAAG;IACtD,QAAQ,EAAE,cAAc,EAAE,CAAA;IAC1B,cAAc,EAAE,MAAM,EAAE,CAAA;IACxB,oBAAoB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAA;IAC/C,8BAA8B,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,CAAA;CACzD,CAAA;AAED,wBAAgB,iBAAiB,yBAEhC;AAED,wBAAgB,yBAAyB,IAAI,sBAAsB,CAElE;AAED,YAAY,EAAE,QAAQ,EAAE,CAAA;AAExB;;GAEG;AACH,wBAAgB,8BAA8B,CAAC,cAAc,EAAE,kBAAkB,EAAE,GAAG,sBAAsB,CAwB3G;AAED,0DAA0D;AAC1D,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,sBAAsB,GAAG,IAAI,CAc/F"}
|
|
@@ -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=widget-library.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"widget-library.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/materials/widget-library.vue"],"names":[],"mappings":";AAgfA,wBAMG"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ApiMethodParamEntry } from './page-method-api.ts';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
invalid?: boolean;
|
|
4
|
+
};
|
|
5
|
+
type __VLS_PublicProps = {
|
|
6
|
+
'entries': ApiMethodParamEntry[];
|
|
7
|
+
} & __VLS_Props;
|
|
8
|
+
declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
9
|
+
"update:entries": (value: ApiMethodParamEntry[]) => any;
|
|
10
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
11
|
+
"onUpdate:entries"?: ((value: ApiMethodParamEntry[]) => any) | undefined;
|
|
12
|
+
}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
13
|
+
export default _default;
|
|
14
|
+
//# sourceMappingURL=api-method-params-list.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-method-params-list.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/methods/api-method-params-list.vue"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAA;AAM/D,KAAK,WAAW,GAAG;IACjB,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB,CAAC;AAiBF,KAAK,iBAAiB,GAAG;IACzB,SAAS,EAAE,mBAAmB,EAAE,CAAC;CAChC,GAAG,WAAW,CAAC;;;;;;AA+KhB,wBAQG"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
dataFields?: string[];
|
|
3
|
+
methodParams?: string[];
|
|
4
|
+
/** true: 写入 {{name}};false: 写入裸字段名(用于 target) */
|
|
5
|
+
bindAsExpression?: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare const _default: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {
|
|
8
|
+
select: (value: string) => any;
|
|
9
|
+
}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
10
|
+
onSelect?: ((value: string) => any) | undefined;
|
|
11
|
+
}>, {
|
|
12
|
+
dataFields: string[];
|
|
13
|
+
methodParams: string[];
|
|
14
|
+
bindAsExpression: boolean;
|
|
15
|
+
}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
16
|
+
export default _default;
|
|
17
|
+
//# sourceMappingURL=api-param-bind-button.vue.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-param-bind-button.vue.d.ts","sourceRoot":"","sources":["../../../src/designer/methods/api-param-bind-button.vue"],"names":[],"mappings":"AAuDA,KAAK,WAAW,GAAG;IACf,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAA;IACvB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAA;CAC3B,CAAC;;;;;;gBAJa,MAAM,EAAE;kBACN,MAAM,EAAE;sBAEJ,OAAO;;AA4M9B,wBAQG"}
|