@worm-vue3-print/canvas 1.0.1
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 +54 -0
- package/dist/canvas.css +1 -0
- package/dist/components/CanvasArea.vue.d.ts +102 -0
- package/dist/components/CanvasPaper.vue.d.ts +50 -0
- package/dist/components/DesignerToolbar.vue.d.ts +59 -0
- package/dist/components/ExpressionEditor.vue.d.ts +16 -0
- package/dist/components/FieldTreePanel.vue.d.ts +11 -0
- package/dist/components/LayerPanel.vue.d.ts +14 -0
- package/dist/components/LeftPanel.vue.d.ts +24 -0
- package/dist/components/PresetColorPicker.vue.d.ts +10 -0
- package/dist/components/PrintDesigner.vue.d.ts +27 -0
- package/dist/components/PrintHtmlPreview.vue.d.ts +23 -0
- package/dist/components/PropertyPanel.vue.d.ts +23 -0
- package/dist/components/Ruler.vue.d.ts +12 -0
- package/dist/components/StatusBar.vue.d.ts +14 -0
- package/dist/components/WatermarkConfig.vue.d.ts +12 -0
- package/dist/components/elements/BarcodeElement.vue.d.ts +9 -0
- package/dist/components/elements/BaseElement.vue.d.ts +45 -0
- package/dist/components/elements/CellBarcode.vue.d.ts +10 -0
- package/dist/components/elements/HtmlElement.vue.d.ts +9 -0
- package/dist/components/elements/ImageElement.vue.d.ts +9 -0
- package/dist/components/elements/LineElement.vue.d.ts +7 -0
- package/dist/components/elements/LongTextElement.vue.d.ts +9 -0
- package/dist/components/elements/PageNumberElement.vue.d.ts +9 -0
- package/dist/components/elements/QrcodeElement.vue.d.ts +9 -0
- package/dist/components/elements/ShapeElement.vue.d.ts +7 -0
- package/dist/components/elements/TableContextMenu.vue.d.ts +19 -0
- package/dist/components/elements/TableElement.vue.d.ts +17 -0
- package/dist/components/elements/TextElement.vue.d.ts +9 -0
- package/dist/components/property/AdvancedGroup.vue.d.ts +13 -0
- package/dist/components/property/AppearanceGroup.vue.d.ts +10 -0
- package/dist/components/property/BindingControl.vue.d.ts +13 -0
- package/dist/components/property/BorderBgGroup.vue.d.ts +9 -0
- package/dist/components/property/CodeGroup.vue.d.ts +13 -0
- package/dist/components/property/ImageContentUpload.vue.d.ts +10 -0
- package/dist/components/property/PaginationGroup.vue.d.ts +9 -0
- package/dist/components/property/PositionSizeGroup.vue.d.ts +9 -0
- package/dist/components/property/PropertyGroup.vue.d.ts +19 -0
- package/dist/components/property/PropertySearch.vue.d.ts +7 -0
- package/dist/components/property/TableCellGroup.vue.d.ts +12 -0
- package/dist/components/property/TableRowGroup.vue.d.ts +8 -0
- package/dist/components/property/TableSettingsGroup.vue.d.ts +8 -0
- package/dist/composables/useAdsorb.d.ts +26 -0
- package/dist/composables/useAdsorbManager.d.ts +31 -0
- package/dist/composables/useAlign.d.ts +5 -0
- package/dist/composables/useBindingDisplay.d.ts +11 -0
- package/dist/composables/useClipboard.d.ts +251 -0
- package/dist/composables/useDesignerState.d.ts +1149 -0
- package/dist/composables/useDrag.d.ts +51 -0
- package/dist/composables/useGroup.d.ts +7 -0
- package/dist/composables/useGuides.d.ts +12 -0
- package/dist/composables/useHistory.d.ts +31 -0
- package/dist/composables/useHostAdapter.d.ts +4 -0
- package/dist/composables/useKeyboard.d.ts +22 -0
- package/dist/composables/useResize.d.ts +26 -0
- package/dist/composables/useSelection.d.ts +26 -0
- package/dist/composables/useStudioChrome.d.ts +8 -0
- package/dist/composables/useTableSelection.d.ts +10 -0
- package/dist/index.cjs +4 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +6444 -0
- package/dist/index.js.map +1 -0
- package/dist/render/browser-code-renderer.d.ts +3 -0
- package/dist/render/browser-pagination.d.ts +17 -0
- package/dist/types.d.ts +282 -0
- package/dist/utils/binding-registry.d.ts +8 -0
- package/dist/utils/binding.d.ts +16 -0
- package/dist/utils/default-config.d.ts +13 -0
- package/dist/utils/demo-data.d.ts +2 -0
- package/dist/utils/element-factory.d.ts +4 -0
- package/dist/utils/engine.d.ts +2 -0
- package/dist/utils/expression-eval.d.ts +30 -0
- package/dist/utils/field-groups.d.ts +21 -0
- package/dist/utils/migrate.d.ts +2 -0
- package/dist/utils/preset-colors.d.ts +2 -0
- package/dist/utils/property-search.d.ts +18 -0
- package/dist/utils/ruler.d.ts +7 -0
- package/dist/utils/scale.d.ts +2 -0
- package/dist/utils/table-matrix.d.ts +61 -0
- package/dist/utils/units.d.ts +4 -0
- package/dist/utils/zone-layout.d.ts +27 -0
- package/package.json +55 -0
package/README.md
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
# @worm-vue3-print/canvas
|
|
2
|
+
|
|
3
|
+
Vue 3 可视化打印模板设计器画布(`worm-vue3-print` monorepo)。纯 Vue 3 + HTML/CSS/SVG +
|
|
4
|
+
原生控件实现,**不依赖 Element Plus、不依赖宿主 API/路由/租户**。模板保存、字段查询、
|
|
5
|
+
截图、图片上传、消息提示等能力由宿主通过 props / 事件 / 适配器注入。
|
|
6
|
+
|
|
7
|
+
## 安装
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @worm-vue3-print/canvas @worm-vue3-print/core
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## 宿主接入
|
|
14
|
+
|
|
15
|
+
```ts
|
|
16
|
+
import { PrintDesigner, PrintHtmlPreview } from '@worm-vue3-print/canvas'
|
|
17
|
+
import '@worm-vue3-print/canvas/style.css'
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
```vue
|
|
21
|
+
<PrintDesigner
|
|
22
|
+
:fields="fields"
|
|
23
|
+
:load-default-template="loadDefaultTemplate"
|
|
24
|
+
:request-screenshot="requestScreenshot"
|
|
25
|
+
:upload-image="uploadImage"
|
|
26
|
+
@save="onSave"
|
|
27
|
+
@preview="onPreview"
|
|
28
|
+
@back="onBack"
|
|
29
|
+
/>
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
- `fields`:业务字段(宿主查询后传入,扁平 `PrintBusinessField[]`)。`fieldKey` 为打印数据中的
|
|
33
|
+
完整路径(如 `supplier.name`、`receiver.phone`、`goods.spec`),字段树/表达式编辑器按首段
|
|
34
|
+
自动分组;无点且作为其它字段前缀的记录为分组容器(如 `supplier`、`goods`),其中
|
|
35
|
+
`fieldType: 'list'` 的容器(如 `goods`)作为表格「列表数据源」选项,拖拽/双击叶子字段插入
|
|
36
|
+
的表达式即为完整路径 `{goods.spec}`。左侧字段树、表达式编辑器、绑定下拉均以此为唯一数据源。
|
|
37
|
+
- `loadDefaultTemplate()`:可选。返回默认布局 `TemplateData`(支持异步,返回 null/undefined
|
|
38
|
+
视为无默认布局);未注入时工具栏不展示「加载默认布局」按钮。
|
|
39
|
+
- `requestScreenshot({ templateJson, printData }) => Promise<Blob>`:叠层对比截图。
|
|
40
|
+
- `uploadImage(file) => Promise<string>`:图片元素上传,返回可访问 URL。
|
|
41
|
+
|
|
42
|
+
> 模板名称、业务类型、备注等元信息不属于设计器核心:模板 JSON 不含元信息,宿主在自己的
|
|
43
|
+
> 列表/保存流程中管理。
|
|
44
|
+
|
|
45
|
+
## 开发
|
|
46
|
+
|
|
47
|
+
```bash
|
|
48
|
+
cd worm-vue3-print
|
|
49
|
+
npm install
|
|
50
|
+
cd packages/print-canvas
|
|
51
|
+
npm test # vitest(happy-dom + @vue/test-utils)
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
> 构建产物位于 `dist/`,使用 Vite Vue 库模式构建(external Vue,抽离 CSS,生成 d.ts)。
|
package/dist/canvas.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.pd-form{display:flex;flex-direction:column;gap:10px;font-size:12px;color:var(--pd-text, #303133)}.pd-field{display:flex;flex-direction:column;gap:4px}.pd-label{font-size:11px;color:var(--pd-text-muted, #909399)}.pd-input,.pd-select,.pd-color,textarea.pd-input{width:100%;min-height:26px;padding:3px 6px;border:1px solid var(--pd-border, #d9dde6);border-radius:6px;background:#fff;color:inherit;font:inherit;transition:border-color .14s ease,box-shadow .14s ease}.pd-input:hover,.pd-select:hover{border-color:var(--pd-text-faint, #b4b9c4)}textarea.pd-input{min-height:48px;resize:vertical}.pd-input:focus,.pd-select:focus,.pd-color:focus{outline:none;border-color:var(--pd-accent, #165DFF);box-shadow:0 0 0 2px #165dff1f}.pd-select{appearance:auto}.pd-color{padding:1px;height:26px}.pd-switch{appearance:none;width:32px;height:18px;margin:0;border:1px solid var(--pd-border, #dcdfe6);border-radius:999px;background:#dcdfe6;position:relative;cursor:pointer;transition:background .2s,border-color .2s}.pd-switch:checked{background:var(--pd-accent, #165DFF);border-color:var(--pd-accent, #165DFF)}.pd-switch:after{content:"";position:absolute;top:2px;left:2px;width:12px;height:12px;border-radius:50%;background:#fff;transition:transform .2s}.pd-switch:checked:after{transform:translate(14px)}.pd-range{width:100%;accent-color:var(--pd-accent, #165DFF)}.pd-radio-group,.pd-checkbox-group{display:flex;flex-wrap:wrap;gap:6px}.pd-radio,.pd-checkbox{display:inline-flex;align-items:center;gap:4px;min-height:24px;padding:0 7px;border:1px solid var(--pd-border, #d9dde6);border-radius:6px;background:#fff;cursor:pointer;transition:border-color .14s ease,background .14s ease,color .14s ease}.pd-radio:has(input:checked),.pd-checkbox:has(input:checked){color:var(--pd-accent, #165DFF);border-color:var(--pd-accent, #165DFF);background:#165dff0f}.pd-button-group{display:inline-flex;gap:4px}.pd-button,.pd-tab{display:inline-flex;align-items:center;justify-content:center;gap:4px;min-height:26px;padding:3px 8px;border:1px solid var(--pd-border, #d9dde6);border-radius:6px;background:var(--pd-bg, #f4f6fa);color:var(--pd-text, #2a2e37);font:inherit;cursor:pointer;transition:background .14s ease,border-color .14s ease,color .14s ease}.pd-button:hover{background:var(--pd-sidebar-hover, #f0f3f9);border-color:var(--pd-text-faint, #b4b9c4)}.pd-button.primary{background:var(--pd-accent, #165DFF);border-color:var(--pd-accent, #165DFF);color:#fff}.pd-button.danger{background:#f56c6c;border-color:#f56c6c;color:#fff}.pd-button.small{min-height:22px;padding:1px 6px;font-size:11px}.pd-button:disabled{opacity:.55;cursor:not-allowed}.pd-tabs{display:flex;flex-direction:column;min-height:0}.pd-tab-bar{display:flex;gap:4px;padding:8px 12px 0;border-bottom:1px solid var(--pd-border-soft, #ebeef5)}.pd-tab{border:0;border-bottom:2px solid transparent;border-radius:5px 5px 0 0;background:transparent;transition:color .14s ease,background .14s ease}.pd-tab-bar .pd-tab:hover{color:var(--pd-text, #2a2e37);background:var(--pd-sidebar-hover, #f0f3f9)}.pd-tab.active{color:var(--pd-accent, #165DFF);border-bottom-color:var(--pd-accent, #165DFF);background:transparent;font-weight:600}.pd-tab-pane{min-height:0;overflow:auto}.pd-divider{margin:6px 0;font-size:11px;color:var(--pd-text-muted, #909399)}.pd-empty{margin:16px 0;color:var(--pd-text-muted, #909399);text-align:center}.pd-badge{padding:0 4px;border-radius:3px;background:#67c23a1f;color:#529b2e;font-size:10px}.pd-dialog-overlay{position:fixed;inset:0;z-index:2000;display:grid;place-items:center;padding:16px;background:#00000073}.pd-dialog{display:flex;flex-direction:column;width:min(950px,90vw);max-height:90vh;overflow:hidden;background:#fff;border-radius:12px;box-shadow:var(--pd-shadow-md, 0 12px 40px rgba(23, 32, 60, .18))}.pd-dialog-small{width:min(400px,92vw)}.pd-dialog-large{width:min(950px,90vw)}.pd-dialog-header,.pd-dialog-footer{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:12px 16px}.pd-dialog-header{border-bottom:1px solid var(--pd-border-soft, #ebeef5)}.pd-dialog-footer{justify-content:flex-end;border-top:1px solid var(--pd-border-soft, #ebeef5)}.pd-dialog-body{flex:1;min-height:0;overflow:auto;padding:16px}.pd-close{width:22px;height:22px;border:0;background:transparent;color:var(--pd-text-muted, #909399);font-size:16px;cursor:pointer}.pd-icon{display:inline-flex;width:14px;height:14px}.designer-container{scrollbar-width:thin;scrollbar-color:rgba(23,32,60,.18) transparent}.designer-container ::-webkit-scrollbar{width:9px;height:9px}.designer-container ::-webkit-scrollbar-track{background:transparent}.designer-container ::-webkit-scrollbar-thumb{background:#17203c29;border-radius:999px;border:2px solid transparent;background-clip:content-box}.designer-container ::-webkit-scrollbar-thumb:hover{background:#17203c4d;border:2px solid transparent;background-clip:content-box}.designer-container ::-webkit-scrollbar-corner{background:transparent}.designer-container button:focus-visible,.designer-container [tabindex]:focus-visible,.designer-container .pd-tab:focus-visible{outline:2px solid var(--pd-accent, #165DFF);outline-offset:1px}@media(prefers-reduced-motion:reduce){.designer-container *,.designer-container *:before,.designer-container *:after{transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}.designer-toolbar[data-v-2895245c]{display:flex;align-items:center;gap:2px;padding:0 12px;height:50px;background:var(--pd-surface, #ffffff);border-bottom:1px solid var(--pd-border-soft, #e9ecf2);box-shadow:0 1px 2px #17203c0a,0 6px 16px -12px #17203c40;flex-shrink:0;position:relative;z-index:20}.tb-group[data-v-2895245c]{display:flex;align-items:center;gap:2px;padding:0 8px}.tb-group+.tb-group[data-v-2895245c]{border-left:1px solid var(--pd-border-soft, #e9ecf2)}.tb-btn[data-v-2895245c]{height:30px;min-width:30px;padding:0 8px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--pd-text-muted, #8b909c);font-size:12px;cursor:pointer;display:inline-flex;align-items:center;justify-content:center;gap:5px;transition:background .14s ease,color .14s ease,border-color .14s ease,box-shadow .14s ease}.tb-btn[data-v-2895245c]:hover{color:var(--pd-text, #2a2e37);background:var(--pd-sidebar-hover, #f0f3f9)}.tb-btn[data-v-2895245c]:active{background:var(--pd-border-soft, #e9ecf2)}.tb-btn[data-v-2895245c]:disabled{opacity:.32;cursor:default;background:transparent;color:var(--pd-text-faint, #b4b9c4)}.tb-btn.on[data-v-2895245c]{color:var(--pd-accent, #165DFF);background:var(--pd-accent-soft, rgba(22, 93, 255, .09));font-weight:600}.tb-btn.warn[data-v-2895245c]{color:var(--pd-accent-secondary, #f56c6c);background:var(--pd-danger-soft, rgba(245, 108, 108, .1));font-weight:600}.tb-btn .dot[data-v-2895245c]{width:6px;height:6px;border-radius:50%;background:var(--pd-text-faint, #b4b9c4);display:inline-block;transition:background .14s ease,box-shadow .14s ease}.tb-btn.on .dot[data-v-2895245c]{background:var(--pd-accent, #165DFF);box-shadow:0 0 0 3px #165dff1f}.tb-icon[data-v-2895245c]{font-size:15px;line-height:1}.tb-mark[data-v-2895245c]{width:28px;height:28px;margin-right:2px;border-radius:8px;display:inline-flex;align-items:center;justify-content:center;color:#fff;background:linear-gradient(150deg,var(--pd-accent-2, #3D7BFF),var(--pd-accent, #165DFF));box-shadow:0 3px 8px #165dff47,inset 0 1px #ffffff38;flex-shrink:0}.tb-mark svg[data-v-2895245c]{width:16px;height:16px}.tb-title[data-v-2895245c]{display:flex;flex-direction:column;line-height:1.2;padding-left:6px}.tb-title-name[data-v-2895245c]{font-size:13px;font-weight:600;color:var(--pd-text, #2a2e37);letter-spacing:.2px}.tb-title-sub[data-v-2895245c]{font-size:10px;color:var(--pd-text-muted, #8b909c);letter-spacing:.8px}.tb-zoom[data-v-2895245c]{font-size:12px;color:var(--pd-text, #2a2e37);font-variant-numeric:tabular-nums;min-width:46px;text-align:center}.tb-spacer[data-v-2895245c]{flex:1}.btn-primary[data-v-2895245c],.btn-secondary[data-v-2895245c]{height:32px;padding:0 16px;border-radius:7px;font-size:13px;font-weight:600;cursor:pointer;transition:filter .14s ease,background .14s ease,border-color .14s ease,box-shadow .14s ease}.btn-secondary[data-v-2895245c]{background:var(--pd-field-bg, #f4f6fa);color:var(--pd-text-muted, #606266);border:1px solid var(--pd-border, #d9dde6)}.btn-secondary[data-v-2895245c]:hover{border-color:var(--pd-accent, #165DFF);color:var(--pd-accent, #165DFF);background:var(--pd-accent-soft, rgba(22, 93, 255, .06))}.btn-primary[data-v-2895245c]{background:linear-gradient(180deg,var(--pd-accent-2, #3D7BFF),var(--pd-accent, #165DFF));color:#fff;border:none;box-shadow:0 3px 10px #165dff47,inset 0 1px #ffffff2e}.btn-primary[data-v-2895245c]:hover{filter:brightness(1.07);box-shadow:0 5px 14px #165dff57,inset 0 1px #ffffff2e}.btn-primary[data-v-2895245c]:active{filter:brightness(.97)}.layer-panel[data-v-d091c3fa]{border-top:1px solid var(--pd-border);padding:8px 12px;height:100%;box-sizing:border-box;overflow-y:auto}.panel-title[data-v-d091c3fa]{font-size:11px;color:var(--pd-text-muted);text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.layer-item[data-v-d091c3fa]{display:flex;align-items:center;gap:6px;padding:4px 6px;margin-bottom:2px;border-radius:4px;cursor:pointer;font-size:12px;transition:background .1s}.layer-item[data-v-d091c3fa]:hover{background:var(--pd-sidebar-hover, #f0f2f5)}.layer-item.active[data-v-d091c3fa]{background:#165dff1a;color:var(--pd-accent, #165DFF);box-shadow:inset 2px 0 0 var(--pd-accent, #165DFF)}.layer-icon[data-v-d091c3fa]{width:18px;text-align:center;font-size:12px;color:var(--pd-text-muted, #909399)}.layer-name[data-v-d091c3fa]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--pd-text, #303133)}.layer-zone[data-v-d091c3fa]{flex-shrink:0;padding:0 4px;font-size:10px;line-height:14px;color:var(--pd-ink-green, #67c23a);background:#67c23a1a;border-radius:3px}.layer-zindex[data-v-d091c3fa]{font-size:10px;color:var(--pd-text-muted, #909399);font-variant-numeric:tabular-nums}.layer-actions[data-v-d091c3fa]{display:flex;gap:4px;margin-top:8px}.field-tree-panel[data-v-cc814de0]{padding:0}.panel-title[data-v-cc814de0]{font-size:11px;color:var(--pd-text-muted);text-transform:uppercase;letter-spacing:.5px;padding:4px 0 8px;margin-bottom:8px;border-bottom:1px solid var(--pd-border)}.search-input[data-v-cc814de0]{margin-bottom:8px}.tree-container[data-v-cc814de0]{overflow-y:auto;min-height:0}.field-group-header[data-v-cc814de0]{display:flex;align-items:center;gap:4px;padding:5px 8px;border-radius:4px;font-size:13px;color:var(--pd-text, #303133);cursor:pointer;-webkit-user-select:none;user-select:none;transition:background .1s}.field-group-header[data-v-cc814de0]:hover{background:var(--pd-sidebar-hover, #f0f2f5)}.field-group-header.is-list[data-v-cc814de0]{color:var(--pd-accent, #165DFF);font-weight:500}.expand-icon[data-v-cc814de0]{width:12px;font-size:8px;flex-shrink:0;color:var(--pd-text-muted, #909399)}.field-row[data-v-cc814de0]{display:flex;align-items:center;gap:4px;padding:5px 8px;border-radius:4px;font-size:13px;color:var(--pd-text, #303133);cursor:grab;-webkit-user-select:none;user-select:none;transition:background .1s}.field-row[data-v-cc814de0]:hover{background:var(--pd-sidebar-hover, #f0f2f5)}.node-icon[data-v-cc814de0]{font-size:14px;flex-shrink:0;filter:saturate(.6);opacity:.9}.node-label[data-v-cc814de0]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.node-key[data-v-cc814de0]{font-size:11px;color:var(--pd-text-muted, #909399);flex-shrink:0}.group-label[data-v-cc814de0]{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.left-panel[data-v-eb646f19]{width:224px;min-width:224px;background:var(--pd-sidebar, #ffffff);border-right:1px solid var(--pd-border-soft, #e9ecf2);display:flex;flex-direction:column;overflow:hidden;transition:width .18s ease}.left-panel.collapsed[data-v-eb646f19]{width:36px;min-width:36px;border-right:1px solid var(--pd-border-soft, #e9ecf2)}.left-collapsed[data-v-eb646f19]{display:flex;flex-direction:column;align-items:center;gap:8px;padding-top:12px;flex:1}.lc-btn[data-v-eb646f19]{width:26px;height:26px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--pd-text-muted, #8b909c);font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .14s ease}.lc-btn[data-v-eb646f19]:hover{color:var(--pd-text, #2a2e37);background:var(--pd-sidebar-hover, #f0f3f9)}.lc-btn.on[data-v-eb646f19]{color:var(--pd-accent, #165DFF);background:var(--pd-accent-soft, rgba(22, 93, 255, .09))}.left-head[data-v-eb646f19]{display:flex;align-items:center;justify-content:space-between;height:42px;padding:0 12px;flex-shrink:0;border-bottom:1px solid var(--pd-border-soft, #e9ecf2)}.left-title[data-v-eb646f19]{font-size:12px;font-weight:600;color:var(--pd-text, #2a2e37);letter-spacing:1.2px;display:inline-flex;align-items:center;gap:7px}.left-title[data-v-eb646f19]:before{content:"";width:3px;height:12px;border-radius:2px;background:linear-gradient(180deg,var(--pd-accent-2, #3D7BFF),var(--pd-accent, #165DFF))}.collapse-btn[data-v-eb646f19]{border:none;background:transparent;color:var(--pd-text-muted, #8b909c);font-size:14px;cursor:pointer;width:24px;height:24px;border-radius:5px;transition:all .14s ease}.collapse-btn[data-v-eb646f19]:hover{color:var(--pd-text, #2a2e37);background:var(--pd-sidebar-hover, #f0f3f9)}.left-tabs[data-v-eb646f19]{flex:1;display:flex;flex-direction:column;overflow:hidden}.left-tabs .pd-tab-pane[data-v-eb646f19]{flex:1;min-height:0;overflow-y:auto;padding:12px}.panel-title[data-v-eb646f19]{font-size:11px;color:var(--pd-text-muted, #8b909c);letter-spacing:.6px;padding:2px 2px 8px;margin-bottom:10px;border-bottom:1px solid var(--pd-border-soft, #e9ecf2)}.material-card[data-v-eb646f19]{display:flex;align-items:center;gap:10px;padding:8px 10px;margin-bottom:7px;border:1px solid var(--pd-border-soft, #e9ecf2);border-radius:8px;background:var(--pd-field-bg, #f4f6fa);cursor:grab;-webkit-user-select:none;user-select:none;transition:border-color .14s ease,background .14s ease,transform .14s ease,box-shadow .14s ease}.material-card[data-v-eb646f19]:hover{border-color:#165dff73;background:var(--pd-surface, #ffffff);transform:translateY(-1px);box-shadow:var(--pd-shadow-sm, 0 1px 2px rgba(23, 32, 60, .05))}.material-card[data-v-eb646f19]:active{cursor:grabbing;transform:translateY(0)}.material-icon[data-v-eb646f19]{width:30px;height:24px;border:1px dashed var(--pd-border, #d9dde6);border-radius:5px;display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--pd-accent, #165DFF);background:var(--pd-surface, #ffffff);flex-shrink:0;transition:border-color .14s ease,background .14s ease}.material-card:hover .material-icon[data-v-eb646f19]{border-style:solid;border-color:var(--pd-accent, #165DFF);background:var(--pd-accent-soft, rgba(22, 93, 255, .09))}.material-label[data-v-eb646f19]{font-size:12.5px;color:var(--pd-text, #2a2e37)}.print-image[data-v-530ee54f]{width:100%;height:100%;overflow:hidden}.print-image img[data-v-530ee54f]{width:100%;height:100%;display:block}.image-placeholder[data-v-530ee54f]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;color:#bbb;font-size:12px;border:1px dashed #ddd;box-sizing:border-box}.table-ctx-menu[data-v-3f0b28d4]{position:fixed;z-index:3000;min-width:140px;padding:4px 0;background:#fff;border:1px solid #dcdfe6;border-radius:4px;box-shadow:0 2px 12px #00000026;font-size:13px}.menu-item[data-v-3f0b28d4]{padding:5px 14px;cursor:pointer;color:#333}.menu-item[data-v-3f0b28d4]:hover{background:#f5f7fa}.menu-item.disabled[data-v-3f0b28d4]{color:#c0c4cc;cursor:not-allowed}.menu-item.active[data-v-3f0b28d4]{color:#165dff}.menu-divider[data-v-3f0b28d4]{height:1px;margin:4px 0;background:#ebeef5}.menu-group-title[data-v-3f0b28d4]{padding:4px 14px;font-size:12px;color:#909399}.cell-barcode[data-v-8ff197a1]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden}.cell-barcode svg[data-v-8ff197a1]{width:100%;height:100%}.cell-barcode img[data-v-8ff197a1]{max-width:100%;max-height:100%}.cell-barcode-fallback[data-v-8ff197a1]{font-style:italic;opacity:.6}.print-table[data-v-e3e66079]{position:relative;width:100%;height:100%}.print-table table[data-v-e3e66079]{border-collapse:collapse;table-layout:fixed;width:100%}.print-table td[data-v-e3e66079]{box-sizing:border-box;word-break:break-all}.cell-selected[data-v-e3e66079]{outline:2px solid #165DFF;outline-offset:-2px;background-color:#165dff14}.row-data-bg[data-v-e3e66079]{background-image:repeating-linear-gradient(45deg,rgba(22,93,255,.04) 0 6px,transparent 6px 12px)}.data-placeholder[data-v-e3e66079]{color:#909399;font-style:italic}.cell-editor[data-v-e3e66079]{width:100%;border:none;outline:none;background:#fffbe6;font:inherit}.row-badges[data-v-e3e66079]{position:absolute;left:-16px;top:0;width:14px}.row-badge[data-v-e3e66079]{position:absolute;width:14px;display:flex;align-items:center;justify-content:center;font-size:10px;color:#909399;background:#f5f7fa;border-radius:2px}.print-barcode[data-v-a71e7c44]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden}.print-barcode svg[data-v-a71e7c44]{width:100%;height:100%}.print-qrcode[data-v-90b31b7e]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden}.print-qrcode img[data-v-90b31b7e]{max-width:100%;max-height:100%}.print-html[data-v-f0a224c2],.page-number-element[data-v-c3750ca3]{width:100%;height:100%;overflow:hidden}.print-element[data-v-ab693d09]{box-sizing:border-box;cursor:pointer;-webkit-user-select:none;user-select:none}.print-element.design-mode[data-v-ab693d09]{outline:1px dashed #C3C9D6}.print-element.design-mode.zone-header[data-v-ab693d09],.print-element.design-mode.zone-footer[data-v-ab693d09]{outline:1px dashed var(--pd-ink-green, #67c23a)}.print-element.design-mode.zone-overlay[data-v-ab693d09]{outline:1px dashed #06B6D4}.print-element.selected[data-v-ab693d09]{outline:1.5px solid var(--pd-accent, #165DFF);background:#165dff0a}.print-element.previewed[data-v-ab693d09]{outline:1.5px solid rgba(22,93,255,.5);background:#165dff1a}.print-element.design-mode[data-v-ab693d09]:hover{outline:1px dashed var(--pd-accent, #165DFF)}.print-element.locked[data-v-ab693d09]{cursor:not-allowed}.print-element.locked[data-v-ab693d09]:not(.selected){outline:1.5px dashed #999}.print-element.hidden[data-v-ab693d09]{opacity:.3;pointer-events:none}.print-element.drag-ghost[data-v-ab693d09]{opacity:.4}.drag-preview[data-v-ab693d09]{position:absolute;inset:0;border:2px dashed var(--pd-accent, #165DFF);pointer-events:none;z-index:1000;box-sizing:border-box}.selected-indicator[data-v-ab693d09]{position:absolute;top:-18px;left:0;font-size:10px;white-space:nowrap;pointer-events:none;z-index:20}.position-label[data-v-ab693d09]{background:var(--pd-accent, #165DFF);color:#fff;padding:1px 6px;border-radius:3px;font-family:ui-monospace,SF Mono,Menlo,monospace;font-size:10px;font-variant-numeric:tabular-nums;letter-spacing:0;box-shadow:0 2px 6px #00000026}.binding-badge[data-v-ab693d09]{position:absolute;top:-1px;left:-1px;font-size:9px;font-family:monospace;padding:1px 4px;background:#ffffffeb;border:1px solid currentColor;border-radius:2px;line-height:1.4;max-width:calc(100% - 4px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;pointer-events:none;z-index:1}.resize-handles[data-v-ab693d09]{position:absolute;inset:0;pointer-events:none}.resize-handle[data-v-ab693d09]{position:absolute;width:7px;height:7px;background:var(--pd-handle, #165DFF);border:1.5px solid #fff;border-radius:2px;box-sizing:border-box;transform:translate(-50%,-50%);box-shadow:0 1px 3px #0000002e;z-index:10;pointer-events:auto}.handle-nw[data-v-ab693d09]{top:0;left:0;cursor:nw-resize}.handle-n[data-v-ab693d09]{top:0;left:50%;cursor:n-resize}.handle-ne[data-v-ab693d09]{top:0;left:100%;cursor:ne-resize}.handle-e[data-v-ab693d09]{top:50%;left:100%;cursor:e-resize}.handle-se[data-v-ab693d09]{top:100%;left:100%;cursor:se-resize}.handle-s[data-v-ab693d09]{top:100%;left:50%;cursor:s-resize}.handle-sw[data-v-ab693d09]{top:100%;left:0;cursor:sw-resize}.handle-w[data-v-ab693d09]{top:50%;left:0;cursor:w-resize}.pd-ruler[data-v-fdb82e87]{position:absolute;top:0;left:0;pointer-events:auto;cursor:crosshair;z-index:5;display:block}.pd-ruler[data-v-fdb82e87]:nth-of-type(1){box-shadow:0 1px 0 var(--pd-border-soft, #e9ecf2)}.pd-ruler[data-v-fdb82e87]:nth-of-type(2){box-shadow:1px 0 0 var(--pd-border-soft, #e9ecf2)}.hiprint-printPaper[data-v-0f1286d9]{transition:transform .15s ease-out}.zone-layer[data-v-0f1286d9]{box-sizing:border-box}.zone-layer.zone-header.design-mode[data-v-0f1286d9],.zone-layer.zone-footer.design-mode[data-v-0f1286d9]{outline:1px dashed var(--pd-ink-green, #67c23a);background:#67c23a0a}.zone-layer.zone-content.design-mode[data-v-0f1286d9]{outline:1px dashed #C3C9D6}.zone-overlay[data-v-0f1286d9]{position:absolute;top:0;left:0;width:100%;outline:1px dashed #06B6D4;background:#06b6d40a;box-sizing:border-box;pointer-events:none;z-index:1}.zone-label[data-v-0f1286d9]{position:absolute;top:2px;right:4px;font-size:9px;color:#909399;pointer-events:none;-webkit-user-select:none;user-select:none}.zone-resize-handle[data-v-0f1286d9]{position:absolute;left:0;width:100%;height:6px;cursor:ns-resize;z-index:5}.zone-resize-handle.handle-bottom[data-v-0f1286d9]{bottom:-3px}.zone-resize-handle.handle-top[data-v-0f1286d9]{top:-3px}.zone-resize-handle[data-v-0f1286d9]:hover{background:#10b98140}.zone-height-tip[data-v-0f1286d9]{position:absolute;right:4px;top:-22px;padding:1px 6px;font-size:11px;color:#fff;background:#10b981;border-radius:3px;white-space:nowrap;pointer-events:none}.grid-bg[data-v-0f1286d9]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:0}.snap-indicator[data-v-0f1286d9]{position:absolute;width:6px;height:6px;background:var(--pd-accent, #165DFF);border-radius:50%;transform:translate(-50%,-50%);pointer-events:none;z-index:10;animation:snap-pulse-0f1286d9 .3s ease-out}@keyframes snap-pulse-0f1286d9{0%{transform:translate(-50%,-50%) scale(2);opacity:.5}to{transform:translate(-50%,-50%) scale(1);opacity:0}}.watermark-layer[data-v-0f1286d9]{pointer-events:none}.adsorb-guide[data-v-0f1286d9]{position:absolute;pointer-events:none;z-index:9999}.adsorb-guide.guide-vertical[data-v-0f1286d9]{border-left:1px dashed var(--pd-accent-secondary, #f56c6c)}.adsorb-guide.guide-horizontal[data-v-0f1286d9]{border-top:1px dashed var(--pd-accent-secondary, #f56c6c)}.manual-guide[data-v-0f1286d9]{position:absolute;pointer-events:auto;z-index:9998;cursor:move}.manual-guide.guide-vertical[data-v-0f1286d9]{border-left:1px solid #3B82F6;width:0}.manual-guide.guide-horizontal[data-v-0f1286d9]{border-top:1px solid #3B82F6;height:0}.manual-guide[data-v-0f1286d9]:hover{border-color:#ef4444!important}.canvas-area[data-v-c6288512]{flex:1;overflow:auto;background-color:var(--pd-canvas-bg, #e6e9f0);background-image:radial-gradient(circle,rgba(23,32,60,.13) 1px,transparent 1.2px);background-size:20px 20px;background-position:center;display:flex;justify-content:center;padding:44px 28px 32px 44px;position:relative}.canvas-scroll[data-v-c6288512]{display:flex;flex-direction:column;align-items:center;gap:20px;position:relative}.overlay-layer[data-v-c6288512]{position:absolute;top:0;left:0;pointer-events:none;z-index:100}.overlay-image[data-v-c6288512]{width:100%;display:block}.marquee-selection[data-v-c6288512]{position:fixed;border:1.5px solid rgba(22,93,255,.7);background:#165dff14;border-radius:2px;pointer-events:none;z-index:10000}.context-menu[data-v-c6288512]{position:absolute;background:var(--pd-surface, #ffffff);border:1px solid var(--pd-border-soft, #e9ecf2);border-radius:8px;box-shadow:var(--pd-shadow-md, 0 10px 28px rgba(23, 32, 60, .12));padding:5px;z-index:10001;min-width:132px}.context-menu-item[data-v-c6288512]{padding:7px 12px;border-radius:5px;font-size:12.5px;cursor:pointer;color:var(--pd-text, #2a2e37);-webkit-user-select:none;user-select:none;transition:background .12s ease,color .12s ease}.context-menu-item[data-v-c6288512]:hover{background:var(--pd-accent-soft, rgba(22, 93, 255, .09));color:var(--pd-accent, #165DFF)}.context-menu-item.disabled[data-v-c6288512]{color:var(--pd-text-faint, #b4b9c4);cursor:not-allowed}.context-menu-item.disabled[data-v-c6288512]:hover{background:transparent;color:var(--pd-text-faint, #b4b9c4)}.context-menu-sep[data-v-c6288512]{height:1px;background:var(--pd-border-soft, #e9ecf2);margin:5px 8px}.property-search[data-v-10ab6c84]{padding:0 0 10px;background:transparent}.property-group[data-v-2ba57031]{border:1px solid var(--pd-border-soft, #e9ecf2);border-radius:8px;margin-bottom:10px;background:var(--pd-surface, #ffffff);overflow:hidden;transition:border-color .14s ease,box-shadow .14s ease}.property-group[data-v-2ba57031]:last-child{margin-bottom:2px}.property-group.is-expanded[data-v-2ba57031]{border-color:var(--pd-border-soft, #e9ecf2)}.group-header[data-v-2ba57031]{display:flex;align-items:center;padding:9px 12px;cursor:pointer;-webkit-user-select:none;user-select:none;background:var(--pd-field-bg, #f4f6fa);transition:background .14s ease}.group-header[data-v-2ba57031]:hover{background:var(--pd-sidebar-hover, #f0f3f9)}.property-group.is-expanded .group-header[data-v-2ba57031]{border-bottom:1px solid var(--pd-border-soft, #e9ecf2)}.group-icon[data-v-2ba57031]{margin-right:8px;color:var(--pd-accent, #165DFF)}.group-title[data-v-2ba57031]{flex:1;font-size:12px;font-weight:600;color:var(--pd-text, #2a2e37);letter-spacing:.3px}.expand-icon[data-v-2ba57031]{color:var(--pd-text-muted, #8b909c);font-size:10px}.group-content[data-v-2ba57031]{padding:10px 12px 12px;background:var(--pd-surface, #ffffff)}.position-grid[data-v-fc2cae86]{display:grid;grid-template-columns:1fr 1fr;gap:8px}.preset-color-trigger[data-v-db3c3d71]{display:flex;align-items:center;width:100%;min-height:26px;padding:1px;border:1px solid var(--pd-border, #d9dde6);border-radius:6px;background:#fff;cursor:pointer;transition:border-color .14s ease,box-shadow .14s ease}.preset-color-trigger[data-v-db3c3d71]:hover,.preset-color-trigger[aria-expanded=true][data-v-db3c3d71]{border-color:var(--pd-accent, #165DFF)}.preset-color-trigger[data-v-db3c3d71]:focus-visible{outline:none;border-color:var(--pd-accent, #165DFF);box-shadow:0 0 0 2px #165dff1f}.preset-color-swatch[data-v-db3c3d71]{width:100%;height:22px;border-radius:4px;background-image:linear-gradient(45deg,#e9ecef 25%,transparent 25%,transparent 75%,#e9ecef 75%);background-size:8px 8px;background-position:0 0,4px 4px}.preset-color-panel[data-v-db3c3d71]{position:fixed;z-index:3000;width:190px;padding:10px;border:1px solid var(--pd-border, #d9dde6);border-radius:8px;background:#fff;box-shadow:0 8px 24px #17203c29}.picker-preview[data-v-db3c3d71]{display:flex;align-items:center;gap:8px;margin-bottom:8px}.picker-current[data-v-db3c3d71]{flex:0 0 26px;height:24px;border:1px solid rgb(0 0 0 / 12%);border-radius:5px}.picker-hex[data-v-db3c3d71]{flex:1;min-width:0;height:24px;padding:0 6px;border:1px solid var(--pd-border, #d9dde6);border-radius:5px;color:var(--pd-text, #303133);font:inherit;font-size:11px;text-transform:uppercase}.picker-hex[data-v-db3c3d71]:focus{outline:none;border-color:var(--pd-accent, #165DFF);box-shadow:0 0 0 2px #165dff1f}.picker-area[data-v-db3c3d71]{position:relative;height:100px;border:1px solid rgb(0 0 0 / 12%);border-radius:6px;overflow:hidden;cursor:crosshair;touch-action:none;background:linear-gradient(to top,#000,transparent),linear-gradient(to right,#fff,hsl(var(--picker-hue) 100% 50%))}.picker-handle[data-v-db3c3d71]{position:absolute;width:12px;height:12px;border:2px solid #fff;border-radius:50%;transform:translate(-50%,-50%);box-shadow:0 0 3px #00000073;pointer-events:none}.picker-hue[data-v-db3c3d71]{width:100%;height:14px;margin:10px 0 0;appearance:none;border:1px solid rgb(0 0 0 / 12%);border-radius:999px;background:linear-gradient(to right,red,#ff0,#0f0,#0ff,#00f,#f0f,red);cursor:pointer}.picker-hue[data-v-db3c3d71]::-webkit-slider-thumb{appearance:none;width:12px;height:12px;border:2px solid #fff;border-radius:50%;background:transparent;box-shadow:0 0 3px #00000073}.picker-hue[data-v-db3c3d71]::-moz-range-thumb{width:8px;height:8px;border:2px solid #fff;border-radius:50%;background:transparent;box-shadow:0 0 3px #00000073}.picker-heading[data-v-db3c3d71]{margin-top:10px;margin-bottom:6px;font-size:11px;color:var(--pd-text-muted, #909399)}.preset-color-grid[data-v-db3c3d71]{display:grid;grid-template-columns:repeat(6,1fr);gap:5px}.preset-color-item[data-v-db3c3d71]{width:22px;height:22px;padding:0;border:1px solid rgb(0 0 0 / 12%);border-radius:5px;cursor:pointer}.preset-color-item.active[data-v-db3c3d71]{box-shadow:0 0 0 2px #fff,0 0 0 3px var(--pd-accent, #165DFF)}.color-row[data-v-8d28f858]{display:flex;gap:16px}.expression-editor[data-v-5edaa764]{display:flex;height:450px;gap:0}.ee-nav[data-v-5edaa764]{width:100px;background:var(--pd-sidebar);border-right:1px solid var(--pd-border);display:flex;flex-direction:column;flex-shrink:0}.ee-nav-title[data-v-5edaa764]{padding:10px;border-bottom:1px solid var(--pd-border);font-weight:600;font-size:13px;color:var(--pd-text);text-align:center}.ee-nav-tabs[data-v-5edaa764]{flex:1;display:flex;flex-direction:column;padding:6px;gap:4px}.ee-nav-tab[data-v-5edaa764]{padding:8px 10px;border-radius:6px;cursor:pointer;font-size:12px;text-align:center;transition:all .2s}.ee-nav-tab.active[data-v-5edaa764]{background:var(--pd-accent);color:#fff}.ee-nav-tab[data-v-5edaa764]:not(.active){background:#fff;border:1px solid var(--pd-border);color:var(--pd-text)}.ee-nav-tab[data-v-5edaa764]:hover:not(.active){background:#ecf5ff;border-color:var(--pd-accent)}.ee-content[data-v-5edaa764]{width:300px;display:flex;flex-direction:column;border-right:1px solid var(--pd-border);flex-shrink:0}.ee-content-search[data-v-5edaa764]{padding:10px;border-bottom:1px solid var(--pd-border)}.ee-content-list[data-v-5edaa764]{flex:1;padding:8px;overflow-y:auto;min-height:0}.ee-func-group[data-v-5edaa764]{margin-bottom:12px}.ee-func-group-title[data-v-5edaa764]{font-size:11px;font-weight:600;color:var(--pd-text-muted);padding:4px 10px 6px;border-bottom:1px solid var(--pd-border);margin-bottom:4px;text-transform:uppercase;letter-spacing:.5px}.ee-field-group[data-v-5edaa764]{display:flex;align-items:center;gap:4px;padding:6px 10px;font-size:12px;font-weight:600;color:var(--pd-text)}.ee-field-group.is-list[data-v-5edaa764]{color:var(--pd-accent, #165DFF)}.ee-field-group-icon[data-v-5edaa764]{font-size:13px;filter:saturate(.6)}.ee-list-item[data-v-5edaa764]{padding:8px 10px;cursor:pointer;border-radius:4px;margin-bottom:4px;transition:all .2s}.ee-field-row[data-v-5edaa764]{display:flex;align-items:center;gap:6px}.ee-field-row .ee-item-label[data-v-5edaa764]{flex:1}.ee-list-item[data-v-5edaa764]:hover{background:#ecf5ff;border-color:var(--pd-accent)}.ee-list-item .ee-item-label[data-v-5edaa764]{font-size:12px;color:var(--pd-text)}.ee-list-item .ee-item-key[data-v-5edaa764]{font-size:10px;color:var(--pd-text-muted);font-family:monospace;margin-top:2px}.ee-editor[data-v-5edaa764]{flex:1;display:flex;flex-direction:column;background:var(--pd-sidebar);min-width:0}.ee-editor-section[data-v-5edaa764]{padding:12px;border-bottom:1px solid var(--pd-border)}.ee-editor-title[data-v-5edaa764]{font-size:11px;color:var(--pd-text-muted);margin-bottom:6px;text-transform:uppercase;letter-spacing:.5px}.ee-textarea[data-v-5edaa764]{width:100%;border:1px solid var(--pd-border);border-radius:6px;padding:10px;font-family:monospace;font-size:13px;resize:vertical;box-sizing:border-box;min-height:100px}.ee-textarea[data-v-5edaa764]:focus{outline:none;border-color:var(--pd-accent)}.ee-preview[data-v-5edaa764]{padding:10px;background:var(--pd-bg);border:1px solid var(--pd-border);border-radius:6px;min-height:30px;font-size:13px;color:var(--pd-text);line-height:1.6}.ee-preview-error[data-v-5edaa764]{color:#e53e3e;background:#fef2f2;border-color:#fecaca}.ee-help-section[data-v-5edaa764]{flex:1;padding:12px;overflow-y:auto;min-height:0}.ee-help-title[data-v-5edaa764]{font-size:11px;color:var(--pd-text-muted);margin-bottom:8px;text-transform:uppercase;letter-spacing:.5px}.ee-help-grid[data-v-5edaa764]{display:grid;grid-template-columns:1fr 1fr;gap:8px}.ee-help-card[data-v-5edaa764]{border-radius:6px;padding:10px}.ee-help-card-title[data-v-5edaa764]{font-size:12px;font-weight:600;margin-bottom:4px}.ee-help-card-content[data-v-5edaa764]{font-size:11px;line-height:1.5;color:var(--pd-text)}.ee-help-field[data-v-5edaa764]{background:#f0f9ff;border:1px solid #bae6fd}.ee-help-field .ee-help-card-title[data-v-5edaa764]{color:#0369a1}.ee-help-function[data-v-5edaa764]{background:#f0fdf4;border:1px solid #bbf7d0}.ee-help-function .ee-help-card-title[data-v-5edaa764]{color:#166534}.ee-help-variable[data-v-5edaa764]{background:#fefce8;border:1px solid #fde68a}.ee-help-variable .ee-help-card-title[data-v-5edaa764]{color:#854d0e}.ee-help-conditional[data-v-5edaa764]{background:#fdf2f8;border:1px solid #fbcfe8}.ee-help-conditional .ee-help-card-title[data-v-5edaa764]{color:#9d174d}.expression-editor[data-v-5edaa764]{max-height:min(600px,80vh);overflow-y:auto;padding:16px}.binding-control[data-v-135d160a]{display:flex;align-items:center;gap:8px}.col-width-row[data-v-50fbdef9]{display:flex;align-items:center;gap:8px;margin-bottom:4px;width:100%}.border-row[data-v-292c1503],.advanced-row[data-v-0a3c93f7]{display:flex;gap:16px}.image-content-upload[data-v-b730e8e6]{display:flex;flex-direction:column;align-items:flex-start;gap:4px;margin-top:4px}.upload-label[data-v-b730e8e6]{cursor:pointer}.upload-label.disabled[data-v-b730e8e6]{opacity:.6;cursor:not-allowed}.upload-tip[data-v-b730e8e6]{margin:0;font-size:11px;color:var(--pd-text-muted, #909399)}.visually-hidden[data-v-b730e8e6]{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap}.cell-style-grid[data-v-23f9c444]{display:grid;grid-template-columns:1fr 1fr;gap:0 8px}.border-style-row[data-v-23f9c444]{display:flex;gap:6px;margin-bottom:8px}.border-presets[data-v-23f9c444]{margin-bottom:8px}.merge-btns[data-v-23f9c444]{margin-top:8px;display:flex;gap:8px}.field-row[data-v-23f9c444]{display:flex;align-items:center;gap:8px;width:100%}.property-panel[data-v-3e539040]{width:280px;min-width:280px;background:var(--pd-sidebar, #ffffff);border-left:1px solid var(--pd-border-soft, #e9ecf2);display:flex;flex-direction:column;overflow:hidden;transition:width .18s ease}.property-panel.collapsed[data-v-3e539040]{width:36px;min-width:36px;border-left:1px solid var(--pd-border-soft, #e9ecf2)}.prop-collapsed[data-v-3e539040]{display:flex;flex-direction:column;align-items:center;gap:8px;padding-top:12px;flex:1}.pc-btn[data-v-3e539040]{width:26px;height:26px;border-radius:6px;border:1px solid transparent;background:transparent;color:var(--pd-text-muted, #8b909c);font-size:12px;cursor:pointer;display:flex;align-items:center;justify-content:center;transition:all .14s ease}.pc-btn[data-v-3e539040]:hover{color:var(--pd-text, #2a2e37);background:var(--pd-sidebar-hover, #f0f3f9)}.pc-btn.on[data-v-3e539040]{color:var(--pd-accent, #165DFF);background:var(--pd-accent-soft, rgba(22, 93, 255, .09))}.prop-head[data-v-3e539040]{display:flex;align-items:center;justify-content:space-between;height:42px;padding:0 12px;flex-shrink:0;border-bottom:1px solid var(--pd-border-soft, #e9ecf2)}.prop-title[data-v-3e539040]{font-size:12px;font-weight:600;color:var(--pd-text, #2a2e37);letter-spacing:1.2px;display:inline-flex;align-items:center;gap:7px}.prop-title[data-v-3e539040]:before{content:"";width:3px;height:12px;border-radius:2px;background:linear-gradient(180deg,var(--pd-accent-2, #3D7BFF),var(--pd-accent, #165DFF))}.collapse-btn[data-v-3e539040]{border:none;background:transparent;color:var(--pd-text-muted, #8b909c);font-size:14px;cursor:pointer;width:24px;height:24px;border-radius:5px;transition:all .14s ease}.collapse-btn[data-v-3e539040]:hover{color:var(--pd-text, #2a2e37);background:var(--pd-sidebar-hover, #f0f3f9)}.prop-tabs[data-v-3e539040]{flex:1;display:flex;flex-direction:column;overflow:hidden}.prop-tabs .pd-tab-pane[data-v-3e539040]{flex:1;min-height:0;overflow-y:auto;padding:12px}.property-content[data-v-3e539040]{padding:0}.margin-grid[data-v-3e539040]{display:grid;grid-template-columns:1fr 1fr;gap:0 12px}.custom-size-grid[data-v-3e539040]{display:grid;grid-template-columns:1fr auto 1fr;align-items:center;gap:4px;width:100%}.custom-size-x[data-v-3e539040]{color:var(--pd-text-muted, #8b909c);font-size:12px}.status-bar[data-v-eb34e9a7]{display:flex;align-items:center;gap:20px;height:30px;padding:0 16px;background:var(--pd-surface, #ffffff);border-top:1px solid var(--pd-border-soft, #e9ecf2);box-shadow:0 -1px 2px #17203c08;font-size:11.5px;color:var(--pd-text-muted, #8b909c);-webkit-user-select:none;user-select:none;flex-shrink:0}.status-item[data-v-eb34e9a7]{white-space:nowrap;font-variant-numeric:tabular-nums;display:inline-flex;align-items:center}.coord[data-v-eb34e9a7]{font-variant-numeric:tabular-nums;color:var(--pd-text, #2a2e37)}.status-paper[data-v-eb34e9a7]{margin-left:auto;font-variant-numeric:tabular-nums;color:var(--pd-accent, #165DFF);font-weight:600}.status-dirty[data-v-eb34e9a7]{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;color:var(--pd-text-muted, #8b909c)}.status-dirty.on[data-v-eb34e9a7]{color:var(--pd-accent-secondary, #f56c6c)}.dirty-dot[data-v-eb34e9a7]{width:7px;height:7px;border-radius:50%;background:var(--pd-ink-green, #67c23a)}.status-dirty.on .dirty-dot[data-v-eb34e9a7]{background:var(--pd-accent-secondary, #f56c6c);box-shadow:0 0 0 3px #f56c6c24;animation:dirty-pulse-eb34e9a7 1.6s ease-in-out infinite}@keyframes dirty-pulse-eb34e9a7{0%,to{box-shadow:0 0 0 2px #f56c6c1f}50%{box-shadow:0 0 0 4px #f56c6c0d}}@media(prefers-reduced-motion:reduce){.status-dirty.on .dirty-dot[data-v-eb34e9a7]{animation:none}}.designer-container[data-v-9da9f665]{--pd-bg: #f3f5f9;--pd-surface: #ffffff;--pd-field-bg: #f4f6fa;--pd-sidebar: #ffffff;--pd-sidebar-hover: #f0f3f9;--pd-canvas-bg: #e6e9f0;--pd-paper: #FFFFFF;--pd-accent: #165DFF;--pd-accent-2: #3D7BFF;--pd-accent-soft: rgba(22, 93, 255, .09);--pd-accent-secondary: #f56c6c;--pd-danger-soft: rgba(245, 108, 108, .1);--pd-ink-green: #67c23a;--pd-text: #2a2e37;--pd-text-muted: #8b909c;--pd-text-faint: #b4b9c4;--pd-border: #d9dde6;--pd-border-soft: #e9ecf2;--pd-handle: #165DFF;--pd-ruler: #9aa1af;--pd-ruler-bg: #f8f9fc;--pd-ruler-cursor: #165DFF;--pd-radius: 6px;--pd-shadow-sm: 0 1px 2px rgba(23, 32, 60, .05);--pd-shadow-md: 0 2px 8px rgba(23, 32, 60, .06), 0 10px 28px rgba(23, 32, 60, .07);--pd-shadow-paper: 0 0 0 1px rgba(23, 32, 60, .05), 0 1px 2px rgba(23, 32, 60, .06), 0 8px 20px rgba(23, 32, 60, .08), 0 26px 60px rgba(23, 32, 60, .15);height:100%;display:flex;flex-direction:column;background:var(--pd-bg)}.designer-body[data-v-9da9f665]{flex:1;display:flex;overflow:hidden}.print-html-preview[data-v-1841dcea]{width:100%;height:100%;position:relative;background:#e9ebee}.print-html-preview-iframe[data-v-1841dcea]{width:100%;height:100%;border:0;background:#fff}.print-html-preview-loading[data-v-1841dcea],.print-html-preview-error[data-v-1841dcea]{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#909399;font-size:14px}.print-html-preview-error[data-v-1841dcea]{color:#f56c6c}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
import type { RuntimeElement, TemplateData, AlignLine } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
templateData: TemplateData;
|
|
4
|
+
elements: RuntimeElement[];
|
|
5
|
+
scale: number;
|
|
6
|
+
showGrid?: boolean;
|
|
7
|
+
snapToGrid?: boolean;
|
|
8
|
+
showTableGhostBorder?: boolean;
|
|
9
|
+
hasClipboard?: boolean;
|
|
10
|
+
guides?: AlignLine[];
|
|
11
|
+
overlayVisible?: boolean;
|
|
12
|
+
screenshotUrl?: string;
|
|
13
|
+
overlayOpacity?: number;
|
|
14
|
+
selectedElementHasGroup?: boolean;
|
|
15
|
+
};
|
|
16
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
17
|
+
delete: () => any;
|
|
18
|
+
copy: () => any;
|
|
19
|
+
cut: () => any;
|
|
20
|
+
paste: () => any;
|
|
21
|
+
select: (id: string, multiple: boolean) => any;
|
|
22
|
+
group: () => any;
|
|
23
|
+
ungroup: () => any;
|
|
24
|
+
preview: (ids: string[]) => any;
|
|
25
|
+
"move-layer": (direction: string) => any;
|
|
26
|
+
zoom: (delta: number) => any;
|
|
27
|
+
"dblclick-element": (id: string) => any;
|
|
28
|
+
"dblclick-cell": (elementId: string, r: number, c: number) => any;
|
|
29
|
+
"drag-start": () => any;
|
|
30
|
+
"drag-stop": () => any;
|
|
31
|
+
"clone-element": (element: RuntimeElement, position: {
|
|
32
|
+
left: number;
|
|
33
|
+
top: number;
|
|
34
|
+
}) => any;
|
|
35
|
+
"add-guide": (type: "vertical" | "horizontal", positionMm: number) => any;
|
|
36
|
+
"zone-height-change": (zone: "header" | "footer", height: number) => any;
|
|
37
|
+
"zone-height-commit": (zone: "header" | "footer") => any;
|
|
38
|
+
"guide-move": (id: string, positionMm: number) => any;
|
|
39
|
+
"guide-remove": (id: string) => any;
|
|
40
|
+
"drop-element": (type: string, dropPoint?: {
|
|
41
|
+
x: number;
|
|
42
|
+
y: number;
|
|
43
|
+
} | undefined) => any;
|
|
44
|
+
"drop-field": (field: {
|
|
45
|
+
fieldKey: string;
|
|
46
|
+
fieldLabel: string;
|
|
47
|
+
}, dropPoint?: {
|
|
48
|
+
x: number;
|
|
49
|
+
y: number;
|
|
50
|
+
} | undefined) => any;
|
|
51
|
+
"select-all": () => any;
|
|
52
|
+
"clear-selection": () => any;
|
|
53
|
+
"commit-preview": () => any;
|
|
54
|
+
coordinate: (pos: {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
} | null) => any;
|
|
58
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
59
|
+
onDelete?: (() => any) | undefined;
|
|
60
|
+
onCopy?: (() => any) | undefined;
|
|
61
|
+
onCut?: (() => any) | undefined;
|
|
62
|
+
onPaste?: (() => any) | undefined;
|
|
63
|
+
onSelect?: ((id: string, multiple: boolean) => any) | undefined;
|
|
64
|
+
onGroup?: (() => any) | undefined;
|
|
65
|
+
onUngroup?: (() => any) | undefined;
|
|
66
|
+
onPreview?: ((ids: string[]) => any) | undefined;
|
|
67
|
+
"onMove-layer"?: ((direction: string) => any) | undefined;
|
|
68
|
+
onZoom?: ((delta: number) => any) | undefined;
|
|
69
|
+
"onDblclick-element"?: ((id: string) => any) | undefined;
|
|
70
|
+
"onDblclick-cell"?: ((elementId: string, r: number, c: number) => any) | undefined;
|
|
71
|
+
"onDrag-start"?: (() => any) | undefined;
|
|
72
|
+
"onDrag-stop"?: (() => any) | undefined;
|
|
73
|
+
"onClone-element"?: ((element: RuntimeElement, position: {
|
|
74
|
+
left: number;
|
|
75
|
+
top: number;
|
|
76
|
+
}) => any) | undefined;
|
|
77
|
+
"onAdd-guide"?: ((type: "vertical" | "horizontal", positionMm: number) => any) | undefined;
|
|
78
|
+
"onZone-height-change"?: ((zone: "header" | "footer", height: number) => any) | undefined;
|
|
79
|
+
"onZone-height-commit"?: ((zone: "header" | "footer") => any) | undefined;
|
|
80
|
+
"onGuide-move"?: ((id: string, positionMm: number) => any) | undefined;
|
|
81
|
+
"onGuide-remove"?: ((id: string) => any) | undefined;
|
|
82
|
+
"onDrop-element"?: ((type: string, dropPoint?: {
|
|
83
|
+
x: number;
|
|
84
|
+
y: number;
|
|
85
|
+
} | undefined) => any) | undefined;
|
|
86
|
+
"onDrop-field"?: ((field: {
|
|
87
|
+
fieldKey: string;
|
|
88
|
+
fieldLabel: string;
|
|
89
|
+
}, dropPoint?: {
|
|
90
|
+
x: number;
|
|
91
|
+
y: number;
|
|
92
|
+
} | undefined) => any) | undefined;
|
|
93
|
+
"onSelect-all"?: (() => any) | undefined;
|
|
94
|
+
"onClear-selection"?: (() => any) | undefined;
|
|
95
|
+
"onCommit-preview"?: (() => any) | undefined;
|
|
96
|
+
onCoordinate?: ((pos: {
|
|
97
|
+
x: number;
|
|
98
|
+
y: number;
|
|
99
|
+
} | null) => any) | undefined;
|
|
100
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
101
|
+
declare const _default: typeof __VLS_export;
|
|
102
|
+
export default _default;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { RuntimeElement, TemplateData, AlignLine } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
templateData: TemplateData;
|
|
4
|
+
runtimeElements: RuntimeElement[];
|
|
5
|
+
designMode?: boolean;
|
|
6
|
+
printData?: Record<string, any>[];
|
|
7
|
+
scale?: number;
|
|
8
|
+
showRuler?: boolean;
|
|
9
|
+
showGrid?: boolean;
|
|
10
|
+
snapToGrid?: boolean;
|
|
11
|
+
showTableGhostBorder?: boolean;
|
|
12
|
+
guides?: AlignLine[];
|
|
13
|
+
};
|
|
14
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
15
|
+
contentRef: import("vue").Ref<HTMLElement | null, HTMLElement | null>;
|
|
16
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
17
|
+
contextmenu: (id: string, e: MouseEvent) => any;
|
|
18
|
+
select: (id: string, multiple: boolean) => any;
|
|
19
|
+
"dblclick-element": (id: string) => any;
|
|
20
|
+
"dblclick-cell": (elementId: string, r: number, c: number) => any;
|
|
21
|
+
"drag-start": () => any;
|
|
22
|
+
"drag-stop": () => any;
|
|
23
|
+
"clone-element": (element: RuntimeElement, position: {
|
|
24
|
+
left: number;
|
|
25
|
+
top: number;
|
|
26
|
+
}) => any;
|
|
27
|
+
"add-guide": (type: "vertical" | "horizontal", positionMm: number) => any;
|
|
28
|
+
"zone-height-change": (zone: "header" | "footer", height: number) => any;
|
|
29
|
+
"zone-height-commit": (zone: "header" | "footer") => any;
|
|
30
|
+
"guide-move": (id: string, positionMm: number) => any;
|
|
31
|
+
"guide-remove": (id: string) => any;
|
|
32
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
33
|
+
onContextmenu?: ((id: string, e: MouseEvent) => any) | undefined;
|
|
34
|
+
onSelect?: ((id: string, multiple: boolean) => any) | undefined;
|
|
35
|
+
"onDblclick-element"?: ((id: string) => any) | undefined;
|
|
36
|
+
"onDblclick-cell"?: ((elementId: string, r: number, c: number) => any) | undefined;
|
|
37
|
+
"onDrag-start"?: (() => any) | undefined;
|
|
38
|
+
"onDrag-stop"?: (() => any) | undefined;
|
|
39
|
+
"onClone-element"?: ((element: RuntimeElement, position: {
|
|
40
|
+
left: number;
|
|
41
|
+
top: number;
|
|
42
|
+
}) => any) | undefined;
|
|
43
|
+
"onAdd-guide"?: ((type: "vertical" | "horizontal", positionMm: number) => any) | undefined;
|
|
44
|
+
"onZone-height-change"?: ((zone: "header" | "footer", height: number) => any) | undefined;
|
|
45
|
+
"onZone-height-commit"?: ((zone: "header" | "footer") => any) | undefined;
|
|
46
|
+
"onGuide-move"?: ((id: string, positionMm: number) => any) | undefined;
|
|
47
|
+
"onGuide-remove"?: ((id: string) => any) | undefined;
|
|
48
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
49
|
+
declare const _default: typeof __VLS_export;
|
|
50
|
+
export default _default;
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
isEdit?: boolean;
|
|
3
|
+
canUndo?: boolean;
|
|
4
|
+
canRedo?: boolean;
|
|
5
|
+
hasMultiSelection?: boolean;
|
|
6
|
+
hasSelection?: boolean;
|
|
7
|
+
showGrid?: boolean;
|
|
8
|
+
snapToGrid?: boolean;
|
|
9
|
+
showTableGhostBorder?: boolean;
|
|
10
|
+
selectedElementHasGroup?: boolean;
|
|
11
|
+
overlayVisible?: boolean;
|
|
12
|
+
/** 是否展示「加载默认布局」按钮(宿主注入 loadDefaultTemplate 时由 PrintDesigner 开启) */
|
|
13
|
+
showLoadDefault?: boolean;
|
|
14
|
+
};
|
|
15
|
+
type __VLS_ModelProps = {
|
|
16
|
+
'scale'?: number;
|
|
17
|
+
};
|
|
18
|
+
type __VLS_PublicProps = __VLS_Props & __VLS_ModelProps;
|
|
19
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_PublicProps, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
20
|
+
align: (mode: string) => any;
|
|
21
|
+
group: () => any;
|
|
22
|
+
ungroup: () => any;
|
|
23
|
+
undo: () => any;
|
|
24
|
+
redo: () => any;
|
|
25
|
+
back: () => any;
|
|
26
|
+
preview: () => any;
|
|
27
|
+
save: () => any;
|
|
28
|
+
"load-default": () => any;
|
|
29
|
+
"move-layer": (direction: string) => any;
|
|
30
|
+
"toggle-grid": () => any;
|
|
31
|
+
"toggle-snap": () => any;
|
|
32
|
+
"toggle-table-ghost-border": () => any;
|
|
33
|
+
"toggle-overlay": () => any;
|
|
34
|
+
"add-overlay-element": () => any;
|
|
35
|
+
"fit-window": () => any;
|
|
36
|
+
zoom: (delta: number) => any;
|
|
37
|
+
"update:scale": (value: number) => any;
|
|
38
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_PublicProps> & Readonly<{
|
|
39
|
+
onAlign?: ((mode: string) => any) | undefined;
|
|
40
|
+
onGroup?: (() => any) | undefined;
|
|
41
|
+
onUngroup?: (() => any) | undefined;
|
|
42
|
+
onUndo?: (() => any) | undefined;
|
|
43
|
+
onRedo?: (() => any) | undefined;
|
|
44
|
+
onBack?: (() => any) | undefined;
|
|
45
|
+
onPreview?: (() => any) | undefined;
|
|
46
|
+
onSave?: (() => any) | undefined;
|
|
47
|
+
"onLoad-default"?: (() => any) | undefined;
|
|
48
|
+
"onMove-layer"?: ((direction: string) => any) | undefined;
|
|
49
|
+
"onToggle-grid"?: (() => any) | undefined;
|
|
50
|
+
"onToggle-snap"?: (() => any) | undefined;
|
|
51
|
+
"onToggle-table-ghost-border"?: (() => any) | undefined;
|
|
52
|
+
"onToggle-overlay"?: (() => any) | undefined;
|
|
53
|
+
"onAdd-overlay-element"?: (() => any) | undefined;
|
|
54
|
+
"onFit-window"?: (() => any) | undefined;
|
|
55
|
+
onZoom?: ((delta: number) => any) | undefined;
|
|
56
|
+
"onUpdate:scale"?: ((value: number) => any) | undefined;
|
|
57
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
58
|
+
declare const _default: typeof __VLS_export;
|
|
59
|
+
export default _default;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { PrintBusinessField } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
modelValue: boolean;
|
|
4
|
+
expression: string;
|
|
5
|
+
/** 宿主传入的业务字段(字段页数据源) */
|
|
6
|
+
fields?: PrintBusinessField[];
|
|
7
|
+
};
|
|
8
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
9
|
+
"update:modelValue": (value: boolean) => any;
|
|
10
|
+
"update:expression": (value: string) => any;
|
|
11
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
12
|
+
"onUpdate:modelValue"?: ((value: boolean) => any) | undefined;
|
|
13
|
+
"onUpdate:expression"?: ((value: string) => any) | undefined;
|
|
14
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
15
|
+
declare const _default: typeof __VLS_export;
|
|
16
|
+
export default _default;
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { PrintBusinessField } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
fields: PrintBusinessField[];
|
|
4
|
+
};
|
|
5
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
6
|
+
"field-drag": (field: PrintBusinessField) => any;
|
|
7
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
8
|
+
"onField-drag"?: ((field: PrintBusinessField) => any) | undefined;
|
|
9
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
10
|
+
declare const _default: typeof __VLS_export;
|
|
11
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { RuntimeElement } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
elements: RuntimeElement[];
|
|
4
|
+
selectedIds: Set<string>;
|
|
5
|
+
};
|
|
6
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
|
+
select: (id: string, multiple: boolean) => any;
|
|
8
|
+
"move-layer": (direction: string) => any;
|
|
9
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
10
|
+
onSelect?: ((id: string, multiple: boolean) => any) | undefined;
|
|
11
|
+
"onMove-layer"?: ((direction: string) => any) | undefined;
|
|
12
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
13
|
+
declare const _default: typeof __VLS_export;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { PrintBusinessField, RuntimeElement } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
fields: PrintBusinessField[];
|
|
4
|
+
elements: RuntimeElement[];
|
|
5
|
+
selectedIds: Set<string>;
|
|
6
|
+
collapsed: boolean;
|
|
7
|
+
};
|
|
8
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
9
|
+
select: (id: string, multiple: boolean) => any;
|
|
10
|
+
"move-layer": (direction: string) => any;
|
|
11
|
+
"field-drag": (field: PrintBusinessField) => any;
|
|
12
|
+
"toggle-visible": (id: string) => any;
|
|
13
|
+
"toggle-locked": (id: string) => any;
|
|
14
|
+
"toggle-collapse": () => any;
|
|
15
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
16
|
+
onSelect?: ((id: string, multiple: boolean) => any) | undefined;
|
|
17
|
+
"onMove-layer"?: ((direction: string) => any) | undefined;
|
|
18
|
+
"onField-drag"?: ((field: PrintBusinessField) => any) | undefined;
|
|
19
|
+
"onToggle-visible"?: ((id: string) => any) | undefined;
|
|
20
|
+
"onToggle-locked"?: ((id: string) => any) | undefined;
|
|
21
|
+
"onToggle-collapse"?: (() => any) | undefined;
|
|
22
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
23
|
+
declare const _default: typeof __VLS_export;
|
|
24
|
+
export default _default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
modelValue?: string;
|
|
3
|
+
};
|
|
4
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
5
|
+
"update:modelValue": (value: string) => any;
|
|
6
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
7
|
+
"onUpdate:modelValue"?: ((value: string) => any) | undefined;
|
|
8
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
9
|
+
declare const _default: typeof __VLS_export;
|
|
10
|
+
export default _default;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import '../styles/native-controls.css';
|
|
2
|
+
import type { RuntimeElement, PrintBusinessField, TemplateData, RequestScreenshotFn, UploadImageFn } from '../types';
|
|
3
|
+
type __VLS_Props = {
|
|
4
|
+
initialTemplate?: TemplateData;
|
|
5
|
+
initialElements?: RuntimeElement[];
|
|
6
|
+
fields?: PrintBusinessField[];
|
|
7
|
+
isEdit?: boolean;
|
|
8
|
+
/** 截图适配器(叠层对比):未注入时该功能不可用 */
|
|
9
|
+
requestScreenshot?: RequestScreenshotFn;
|
|
10
|
+
/** 图片上传适配器:未注入时图片上传不可用 */
|
|
11
|
+
uploadImage?: UploadImageFn;
|
|
12
|
+
/** 加载默认布局回调(宿主实现业务逻辑;未注入时工具栏不展示该按钮),返回 null/undefined 视为无默认布局 */
|
|
13
|
+
loadDefaultTemplate?: () => TemplateData | Promise<TemplateData | null | undefined> | null | undefined;
|
|
14
|
+
};
|
|
15
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
16
|
+
getTemplateJson: () => TemplateData;
|
|
17
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
18
|
+
back: () => any;
|
|
19
|
+
preview: () => any;
|
|
20
|
+
save: (json: string) => any;
|
|
21
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
22
|
+
onBack?: (() => any) | undefined;
|
|
23
|
+
onPreview?: (() => any) | undefined;
|
|
24
|
+
onSave?: ((json: string) => any) | undefined;
|
|
25
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
26
|
+
declare const _default: typeof __VLS_export;
|
|
27
|
+
export default _default;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
/** 模板 JSON(设计器 TemplateData 结构兼容) */
|
|
3
|
+
templateJson?: Record<string, any> | null;
|
|
4
|
+
/** 业务打印数据 */
|
|
5
|
+
printData?: Record<string, any> | Record<string, any>[];
|
|
6
|
+
/** 图片相对路径拼接前缀(与服务端 baseUrl 同源) */
|
|
7
|
+
baseUrl?: string;
|
|
8
|
+
};
|
|
9
|
+
declare function rerender(): Promise<void>;
|
|
10
|
+
/** 触发浏览器原生打印(iframe 内 @page 规则控制纸张尺寸与分页) */
|
|
11
|
+
declare function print(): void;
|
|
12
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {
|
|
13
|
+
print: typeof print;
|
|
14
|
+
rerender: typeof rerender;
|
|
15
|
+
}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
16
|
+
error: (message: string) => any;
|
|
17
|
+
rendered: (pageCount: number) => any;
|
|
18
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
19
|
+
onError?: ((message: string) => any) | undefined;
|
|
20
|
+
onRendered?: ((pageCount: number) => any) | undefined;
|
|
21
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
22
|
+
declare const _default: typeof __VLS_export;
|
|
23
|
+
export default _default;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { RuntimeElement, PrintBusinessField, TemplateData, TableSelection } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
element: RuntimeElement | null;
|
|
4
|
+
templateData?: TemplateData;
|
|
5
|
+
fields: PrintBusinessField[];
|
|
6
|
+
activeTab?: 'element' | 'page';
|
|
7
|
+
tableSelection?: TableSelection | null;
|
|
8
|
+
recordHistory?: () => void;
|
|
9
|
+
collapsed: boolean;
|
|
10
|
+
};
|
|
11
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
12
|
+
"toggle-collapse": () => any;
|
|
13
|
+
"delete-element": () => any;
|
|
14
|
+
"update:templateData": (data: TemplateData) => any;
|
|
15
|
+
"update:activeTab": (tab: "element" | "page") => any;
|
|
16
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
17
|
+
"onToggle-collapse"?: (() => any) | undefined;
|
|
18
|
+
"onDelete-element"?: (() => any) | undefined;
|
|
19
|
+
"onUpdate:templateData"?: ((data: TemplateData) => any) | undefined;
|
|
20
|
+
"onUpdate:activeTab"?: ((tab: "element" | "page") => any) | undefined;
|
|
21
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
22
|
+
declare const _default: typeof __VLS_export;
|
|
23
|
+
export default _default;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
orientation: 'horizontal' | 'vertical';
|
|
3
|
+
lengthMM: number;
|
|
4
|
+
scale?: number;
|
|
5
|
+
};
|
|
6
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
|
+
"add-guide": (type: "vertical" | "horizontal", positionMm: number) => any;
|
|
8
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
9
|
+
"onAdd-guide"?: ((type: "vertical" | "horizontal", positionMm: number) => any) | undefined;
|
|
10
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
11
|
+
declare const _default: typeof __VLS_export;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
coordinate: {
|
|
3
|
+
x: number;
|
|
4
|
+
y: number;
|
|
5
|
+
} | null;
|
|
6
|
+
scale: number;
|
|
7
|
+
elementCount: number;
|
|
8
|
+
selectedCount: number;
|
|
9
|
+
paper: string;
|
|
10
|
+
dirty: boolean;
|
|
11
|
+
};
|
|
12
|
+
declare const __VLS_export: 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>;
|
|
13
|
+
declare const _default: typeof __VLS_export;
|
|
14
|
+
export default _default;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { WatermarkOptions, PrintBusinessField } from '../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
modelValue?: WatermarkOptions;
|
|
4
|
+
fields?: PrintBusinessField[];
|
|
5
|
+
};
|
|
6
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
7
|
+
"update:modelValue": (value: WatermarkOptions) => any;
|
|
8
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
9
|
+
"onUpdate:modelValue"?: ((value: WatermarkOptions) => any) | undefined;
|
|
10
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
11
|
+
declare const _default: typeof __VLS_export;
|
|
12
|
+
export default _default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { RuntimeElement } from '../../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
element: RuntimeElement;
|
|
4
|
+
data?: Record<string, any>[];
|
|
5
|
+
designMode?: boolean;
|
|
6
|
+
};
|
|
7
|
+
declare const __VLS_export: 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>;
|
|
8
|
+
declare const _default: typeof __VLS_export;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { RuntimeElement, ElementRect, AdsorbResult } from '../../types';
|
|
2
|
+
type __VLS_Props = {
|
|
3
|
+
element: RuntimeElement;
|
|
4
|
+
/** @deprecated 通过 inject 获取,保留用于向后兼容 */
|
|
5
|
+
isSelected?: boolean;
|
|
6
|
+
designMode?: boolean;
|
|
7
|
+
printData?: Record<string, any>[];
|
|
8
|
+
scale?: number;
|
|
9
|
+
allElements?: RuntimeElement[];
|
|
10
|
+
snapToGrid?: boolean;
|
|
11
|
+
/** 设计态下无边框表格单元格的虚拟虚线开关(透传给 TableElement) */
|
|
12
|
+
showTableGhostBorder?: boolean;
|
|
13
|
+
/** 元素所在区域(影响设计态边框颜色) */
|
|
14
|
+
zone?: 'content' | 'header' | 'footer' | 'overlay';
|
|
15
|
+
/** 由 CanvasPaper 层吸附管理器提供:同步返回吸附修正结果并渲染引导线 */
|
|
16
|
+
adsorbHandler?: (rect: ElementRect) => AdsorbResult;
|
|
17
|
+
clearAdsorbGuides?: () => void;
|
|
18
|
+
};
|
|
19
|
+
declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {
|
|
20
|
+
contextmenu: (id: string, e: MouseEvent) => any;
|
|
21
|
+
select: (id: string, multiple: boolean) => any;
|
|
22
|
+
"dblclick-element": (id: string) => any;
|
|
23
|
+
"dblclick-cell": (elementId: string, r: number, c: number) => any;
|
|
24
|
+
"update:element": (element: RuntimeElement) => any;
|
|
25
|
+
"drag-start": () => any;
|
|
26
|
+
"drag-stop": () => any;
|
|
27
|
+
"clone-element": (element: RuntimeElement, position: {
|
|
28
|
+
left: number;
|
|
29
|
+
top: number;
|
|
30
|
+
}) => any;
|
|
31
|
+
}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{
|
|
32
|
+
onContextmenu?: ((id: string, e: MouseEvent) => any) | undefined;
|
|
33
|
+
onSelect?: ((id: string, multiple: boolean) => any) | undefined;
|
|
34
|
+
"onDblclick-element"?: ((id: string) => any) | undefined;
|
|
35
|
+
"onDblclick-cell"?: ((elementId: string, r: number, c: number) => any) | undefined;
|
|
36
|
+
"onUpdate:element"?: ((element: RuntimeElement) => any) | undefined;
|
|
37
|
+
"onDrag-start"?: (() => any) | undefined;
|
|
38
|
+
"onDrag-stop"?: (() => any) | undefined;
|
|
39
|
+
"onClone-element"?: ((element: RuntimeElement, position: {
|
|
40
|
+
left: number;
|
|
41
|
+
top: number;
|
|
42
|
+
}) => any) | undefined;
|
|
43
|
+
}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
|
|
44
|
+
declare const _default: typeof __VLS_export;
|
|
45
|
+
export default _default;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
cellType: 'barcode' | 'qrcode';
|
|
3
|
+
value: string;
|
|
4
|
+
barcodeType?: string;
|
|
5
|
+
qrCodeLevel?: string;
|
|
6
|
+
showText?: boolean;
|
|
7
|
+
};
|
|
8
|
+
declare const __VLS_export: 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>;
|
|
9
|
+
declare const _default: typeof __VLS_export;
|
|
10
|
+
export default _default;
|