@borurio-print/print-designer 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/README.md +117 -0
  2. package/dist-lib/PrintDesigner.vue.d.ts +3 -0
  3. package/dist-lib/assets/iconfont/iconfont.d.ts +1 -0
  4. package/dist-lib/components/IconFont.vue.d.ts +14 -0
  5. package/dist-lib/core/componentRegistry.d.ts +25 -0
  6. package/dist-lib/core/dynamicText.d.ts +21 -0
  7. package/dist-lib/core/elementInteraction.d.ts +31 -0
  8. package/dist-lib/core/pdfGenerator.d.ts +5 -0
  9. package/dist-lib/core/types.d.ts +117 -0
  10. package/dist-lib/html2canvas.esm-BWVIUcAF.js +4802 -0
  11. package/dist-lib/iconfont-BnrPP-u4.js +35 -0
  12. package/dist-lib/index-CWXXAPGm.js +6957 -0
  13. package/dist-lib/index.d.ts +8 -0
  14. package/dist-lib/index.es-D9S6l8PM.js +6649 -0
  15. package/dist-lib/index.js +11 -0
  16. package/dist-lib/locales/en-US.d.ts +87 -0
  17. package/dist-lib/locales/zh-CN.d.ts +87 -0
  18. package/dist-lib/pdfGenerator-CjZCu1Cq.js +9594 -0
  19. package/dist-lib/purify.es-C841O74m.js +897 -0
  20. package/dist-lib/style.css +1 -0
  21. package/dist-lib/views/print-designer/components/BarcodeSvgElement.vue.d.ts +11 -0
  22. package/dist-lib/views/print-designer/components/ComponentPanel.vue.d.ts +8 -0
  23. package/dist-lib/views/print-designer/components/ElementListPanel.vue.d.ts +14 -0
  24. package/dist-lib/views/print-designer/components/ElementPropertiesPanel.vue.d.ts +12 -0
  25. package/dist-lib/views/print-designer/components/PdfPagesRenderer.vue.d.ts +14 -0
  26. package/dist-lib/views/print-designer/components/PreviewPanel.vue.d.ts +14 -0
  27. package/dist-lib/views/print-designer/components/PrintDialog.vue.d.ts +16 -0
  28. package/dist-lib/views/print-designer/components/QrcodeSvgElement.vue.d.ts +11 -0
  29. package/dist-lib/views/print-designer/components/SvgElementsRenderer.vue.d.ts +27 -0
  30. package/dist-lib/views/print-designer/components/SvgSelectionBox.vue.d.ts +11 -0
  31. package/dist-lib/views/print-designer/components/TemplateCanvas.vue.d.ts +19 -0
  32. package/dist-lib/views/print-designer/components/TemplateInfoDialog.vue.d.ts +17 -0
  33. package/dist-lib/views/print-designer/components/TemplateInfoPanel.vue.d.ts +13 -0
  34. package/dist-lib/views/print-designer/components/WorkspaceToolbar.vue.d.ts +19 -0
  35. package/dist-lib/views/print-designer/components/properties/ContentProperty.vue.d.ts +12 -0
  36. package/dist-lib/views/print-designer/components/properties/FixedTimeProperty.vue.d.ts +12 -0
  37. package/dist-lib/views/print-designer/components/properties/FontSizeProperty.vue.d.ts +12 -0
  38. package/dist-lib/views/print-designer/components/properties/FontWeightProperty.vue.d.ts +12 -0
  39. package/dist-lib/views/print-designer/components/properties/HeightProperty.vue.d.ts +12 -0
  40. package/dist-lib/views/print-designer/components/properties/IncludeTimeProperty.vue.d.ts +12 -0
  41. package/dist-lib/views/print-designer/components/properties/RotationProperty.vue.d.ts +12 -0
  42. package/dist-lib/views/print-designer/components/properties/StrokeWidthProperty.vue.d.ts +12 -0
  43. package/dist-lib/views/print-designer/components/properties/TimeModeProperty.vue.d.ts +12 -0
  44. package/dist-lib/views/print-designer/components/properties/WidthProperty.vue.d.ts +12 -0
  45. package/package.json +61 -0
package/README.md ADDED
@@ -0,0 +1,117 @@
1
+ # Borurio Print Designer
2
+
3
+ 这是一个 Vue 3 标签打印设计器基础项目,同时支持独立 Web/iframe 页面和 npm 组件包两种使用方式。
4
+
5
+ ## 入口说明
6
+
7
+ - `src/main.ts`:独立 Web/iframe 入口,创建 Vue 应用并挂载到 `#app`。
8
+ - `src/index.ts`:npm 包入口,只导出组件、类型和语言包,不创建应用。
9
+ - `src/PrintDesigner.vue`:设计器根组件,持有模板、网格和缩放状态。
10
+
11
+ ## 目录职责
12
+
13
+ - `src/components`:可跨业务模块复用的基础组件,目前包含 Symbol 图标组件。
14
+ - `src/core`:与界面无关的领域类型。
15
+ - `src/locales`:中英文语言包及独立 Web 模式的 i18n 实例。
16
+ - `src/views/print-designer/components`:打印设计器内部使用的界面组件。
17
+ - `src/assets/iconfont`:Iconfont 平台生成的本地 Symbol 脚本,不建议手动修改。
18
+
19
+ ## 构建配置
20
+
21
+ - `vite.config.ts`:生成可部署到服务器并通过 iframe 打开的 `dist`。
22
+ - `vite.lib.config.ts`:从 `src/index.ts` 生成 npm 使用的 `dist-lib`。
23
+ - `tsconfig.app.json`:检查 Web 应用源码,不输出文件。
24
+ - `tsconfig.lib.json`:为 npm 包生成 TypeScript 声明文件。
25
+ - `tsconfig.node.json`:检查 Vite 配置文件。
26
+
27
+ ## 常用命令
28
+
29
+ - `pnpm dev`:启动本地 Web 开发服务。
30
+ - `pnpm build:web`:构建 iframe/Web 版本并执行类型检查。
31
+ - `pnpm build:lib`:构建 npm 版本并生成类型声明。
32
+ - `pnpm build`:依次构建 npm 和 Web 两种版本。
33
+
34
+ ## npm 包使用
35
+
36
+ 当前包名为 `@borurio-print/print-designer`。业务项目需要使用 Vue 3,并安装组件声明的
37
+ `vue`、`vue-i18n` 和 `element-plus` peer dependencies。
38
+
39
+ ```bash
40
+ npm install @borurio-print/print-designer
41
+ ```
42
+
43
+ 如果业务项目尚未安装上述 peer dependencies,再按 npm 提示补充安装。
44
+
45
+ 在 Vue 页面中引入组件和独立样式文件:
46
+
47
+ ```vue
48
+ <script setup lang="ts">
49
+ import { PrintDesigner } from '@borurio-print/print-designer'
50
+ import '@borurio-print/print-designer/style.css'
51
+ </script>
52
+
53
+ <template>
54
+ <div class="print-designer-page">
55
+ <PrintDesigner />
56
+ </div>
57
+ </template>
58
+
59
+ <style scoped>
60
+ .print-designer-page {
61
+ width: 100%;
62
+ height: 100vh;
63
+ }
64
+ </style>
65
+ ```
66
+
67
+ 组件使用业务应用已经注册的 `vue-i18n` 实例。业务应用需要把组件语言包合并到
68
+ 对应语言中:
69
+
70
+ ```ts
71
+ import { createI18n } from 'vue-i18n'
72
+ import {
73
+ enUS as printDesignerEnUS,
74
+ zhCN as printDesignerZhCN,
75
+ } from '@borurio-print/print-designer'
76
+
77
+ const i18n = createI18n({
78
+ legacy: false,
79
+ locale: 'zh-CN',
80
+ messages: {
81
+ 'zh-CN': printDesignerZhCN,
82
+ 'en-US': printDesignerEnUS,
83
+ },
84
+ })
85
+
86
+ app.use(i18n)
87
+ ```
88
+
89
+ 如果业务应用已经存在语言包,可以使用 `mergeLocaleMessage` 合并,避免覆盖原有文案:
90
+
91
+ ```ts
92
+ i18n.global.mergeLocaleMessage('zh-CN', printDesignerZhCN)
93
+ i18n.global.mergeLocaleMessage('en-US', printDesignerEnUS)
94
+ ```
95
+
96
+ ## npm 发布
97
+
98
+ 首次发布前,需要确认当前 npm 账号拥有 `@borurio-print` 组织作用域的发布权限。先登录并检查
99
+ 即将进入安装包的文件:
100
+
101
+ ```bash
102
+ npm login
103
+ pnpm build:lib
104
+ npm pack --dry-run
105
+ ```
106
+
107
+ 确认内容无误后发布公开包:
108
+
109
+ ```bash
110
+ pnpm publish --access public
111
+ ```
112
+
113
+ 同一个版本号不能重复发布;后续修改需要先更新 `package.json` 中的版本号。
114
+
115
+ ## 自动生成文件
116
+
117
+ `src/auto-imports.d.ts` 和 `src/components.d.ts` 由自动按需引入插件生成;`pnpm-lock.yaml` 由 pnpm 生成。这些文件不应手动添加说明或修改内容。
@@ -0,0 +1,3 @@
1
+ declare const __VLS_export: import("vue").DefineComponent<{}, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<{}> & Readonly<{}>, {}, {}, {}, {}, string, import("vue").ComponentProvideOptions, true, {}, any>;
2
+ declare const _default: typeof __VLS_export;
3
+ export default _default;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,14 @@
1
+ /**
2
+ * name 对应 Iconfont Symbol 的 id,例如 icon-wenzi。
3
+ * size 同时控制 SVG 的宽和高;title 存在时图标会作为可访问图片暴露。
4
+ */
5
+ type __VLS_Props = {
6
+ name: string;
7
+ size?: number | string;
8
+ title?: string;
9
+ };
10
+ declare const __VLS_export: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
11
+ size: number | string;
12
+ }, {}, {}, {}, string, import("vue").ComponentProvideOptions, false, {}, any>;
13
+ declare const _default: typeof __VLS_export;
14
+ export default _default;
@@ -0,0 +1,25 @@
1
+ import type { DesignerElementType, ElementPropertyConfig, ElementPropertyKey } from './types';
2
+ /**
3
+ * 一个左侧组件的完整能力声明。
4
+ * properties 的顺序同时决定右侧属性编辑器的展示顺序,因此每个组件都能
5
+ * 在一个位置明确配置“它允许用户进行哪些操作”。
6
+ */
7
+ export interface ComponentDefinition {
8
+ field: DesignerElementType;
9
+ icon: string;
10
+ titleKey: string;
11
+ properties: readonly ElementPropertyConfig[];
12
+ }
13
+ /**
14
+ * 设计器组件注册表。
15
+ *
16
+ * - 文字开放内容、字号、加粗和旋转。
17
+ * - 二维码、条形码开放内容、宽度、高度和旋转。
18
+ * - 边框开放宽高、线宽和旋转;横线、竖线只开放各自长度方向与线宽。
19
+ * - 序号和时间暂时保留空属性数组,维持原有入口但不提前引入未完成逻辑。
20
+ */
21
+ export declare const componentItems: readonly ComponentDefinition[];
22
+ /** 根据元素类型取得其属性能力,供根组件和右侧面板共用。 */
23
+ export declare function getComponentDefinition(field: DesignerElementType): ComponentDefinition | undefined;
24
+ /** 获取指定元素某个属性的约束,供输入组件和拖拽计算共用。 */
25
+ export declare function getElementPropertyConfig(field: DesignerElementType, property: ElementPropertyKey): ElementPropertyConfig | undefined;
@@ -0,0 +1,21 @@
1
+ import type { DesignerElement, TextStyleDesignerElement } from './types';
2
+ /** 打印阶段解析动态文字所需的批次上下文。 */
3
+ export interface DynamicTextContext {
4
+ /** 当前数据在数组中的零基下标。 */
5
+ index: number;
6
+ /** 本次打印数据数组的总长度。 */
7
+ total: number;
8
+ /** 整个打印批次共用的时间,避免多页之间出现秒数差异。 */
9
+ printTime: Date;
10
+ }
11
+ /** 使用稳定格式保存和打印日期,避免浏览器语言环境改变输出顺序。 */
12
+ export declare function formatDesignerDate(value: Date, includeTime?: boolean): string;
13
+ /** 保留明确的日期时间格式化入口,供已有打印调用方继续使用。 */
14
+ export declare function formatDesignerDateTime(value: Date): string;
15
+ /** 集中判断文字类元素,供测量、SVG 渲染和缩放逻辑共同使用。 */
16
+ export declare function isTextStyleElement(element: DesignerElement): element is TextStyleDesignerElement;
17
+ /**
18
+ * 把设计元素解析成最终打印文本。
19
+ * 调用方应对同一批次复用同一个 printTime,确保“实时打印时间”完全一致。
20
+ */
21
+ export declare function resolveDesignerText(element: TextStyleDesignerElement, context: DynamicTextContext): string;
@@ -0,0 +1,31 @@
1
+ import type { DesignerElement, ElementTransformPatch, ResizeHandle } from './types';
2
+ export interface SvgPoint {
3
+ x: number;
4
+ y: number;
5
+ }
6
+ interface ElementGeometrySnapshot {
7
+ xMm: number;
8
+ yMm: number;
9
+ widthMm: number;
10
+ heightMm: number;
11
+ rotation: number;
12
+ fontSizePt?: number;
13
+ }
14
+ /** 将响应式元素复制为一次交互期间不再变化的初始快照。 */
15
+ export declare function createGeometrySnapshot(element: DesignerElement): ElementGeometrySnapshot;
16
+ /**
17
+ * 把浏览器客户区坐标转换为 SVG viewBox 坐标。
18
+ * viewBox 使用毫米,所以该结果天然就是毫米,不需要手动除以画布缩放比例。
19
+ */
20
+ export declare function clientPointToSvgPoint(svg: SVGSVGElement, clientX: number, clientY: number): SvgPoint | null;
21
+ /**
22
+ * 计算元素移动结果,并按旋转后的真实外接边界限制在标签内部。
23
+ */
24
+ export declare function calculateMovePatch(start: ElementGeometrySnapshot, startPointer: SvgPoint, currentPointer: SvgPoint, canvasWidthMm: number, canvasHeightMm: number): ElementTransformPatch;
25
+ /**
26
+ * 按元素自身旋转后的横轴和纵轴计算缩放。
27
+ * 这比直接使用屏幕 dx/dy 更重要:元素旋转 90° 后,“右侧控制点”仍应沿
28
+ * 元素自己的右侧方向改变宽度,而不是沿屏幕水平方向错误拉伸。
29
+ */
30
+ export declare function calculateResizePatch(element: DesignerElement, start: ElementGeometrySnapshot, handle: ResizeHandle, startPointer: SvgPoint, currentPointer: SvgPoint, canvasWidthMm: number, canvasHeightMm: number): ElementTransformPatch | null;
31
+ export {};
@@ -0,0 +1,5 @@
1
+ /**
2
+ * 将已完成动态字段解析的逐页 SVG 生成一个 PDF Blob。
3
+ * 每个 SVG 对应一个物理页面,页面尺寸严格使用模板设置中的毫米值。
4
+ */
5
+ export declare function generateTemplatePdf(pageSvgs: SVGSVGElement[], widthMm: number, heightMm: number): Promise<Blob>;
@@ -0,0 +1,117 @@
1
+ /** 标签的物理尺寸,统一使用毫米,避免业务数据和屏幕像素混用。 */
2
+ export interface TemplateSize {
3
+ widthMm: number;
4
+ heightMm: number;
5
+ }
6
+ /** 当前标签模板的基础信息。 */
7
+ export interface TemplateInfo extends TemplateSize {
8
+ name: string;
9
+ }
10
+ /**
11
+ * 设计器支持的组件类型。
12
+ *
13
+ * 这里保留尚未实现编辑能力的组件类型,是为了让左侧组件注册表始终使用
14
+ * 稳定的业务标识;后续实现方框、线条等组件时不需要修改已有模板字段。
15
+ */
16
+ export type DesignerElementType = 'text' | 'rectangle' | 'horizontalLine' | 'verticalLine' | 'qrcode' | 'barcode' | 'serialNumber' | 'pageNumber' | 'time';
17
+ /** 右侧属性面板中可独立组合的属性编辑器标识。 */
18
+ export type ElementPropertyKey = 'content' | 'width' | 'height' | 'fontSize' | 'fontWeight' | 'strokeWidth' | 'rotation' | 'timeMode' | 'includeTime' | 'fixedTime';
19
+ /**
20
+ * 单个属性编辑器的能力与数值约束。
21
+ * 数值范围跟随组件类型配置,输入框和 SVG 控制点共用,避免两处规则不一致。
22
+ */
23
+ export interface ElementPropertyConfig {
24
+ key: ElementPropertyKey;
25
+ min?: number;
26
+ max?: number;
27
+ step?: number;
28
+ precision?: number;
29
+ /** 属性是否适用于元素当前状态,例如固定时间只在“固定”模式下展示。 */
30
+ visibleWhen?: (element: DesignerElement) => boolean;
31
+ }
32
+ /**
33
+ * 所有可编辑元素共用的布局数据。
34
+ * 坐标和尺寸统一使用毫米,rotation 统一使用角度,避免保存屏幕像素后
35
+ * 在浏览器打印、PDF 和不同 DPI 打印机之间产生尺寸偏差。
36
+ */
37
+ export interface BaseDesignerElement {
38
+ id: string;
39
+ type: 'text' | 'rectangle' | 'horizontalLine' | 'verticalLine' | 'qrcode' | 'barcode' | 'serialNumber' | 'pageNumber' | 'time';
40
+ xMm: number;
41
+ yMm: number;
42
+ widthMm: number;
43
+ heightMm: number;
44
+ rotation: number;
45
+ zIndex: number;
46
+ }
47
+ /** 普通文字元素独有的排版属性。 */
48
+ export interface TextDesignerElement extends BaseDesignerElement {
49
+ type: 'text';
50
+ content: string;
51
+ fontSizePt: number;
52
+ fontWeight: 400 | 700;
53
+ }
54
+ /** 带有文字排版能力的动态字段基础结构。 */
55
+ export interface DynamicTextBaseDesignerElement extends BaseDesignerElement {
56
+ type: 'serialNumber' | 'pageNumber' | 'time';
57
+ fontSizePt: number;
58
+ fontWeight: 400 | 700;
59
+ }
60
+ /** 序号在打印阶段根据零基数组下标生成从 1 开始的显示值。 */
61
+ export interface SerialNumberDesignerElement extends DynamicTextBaseDesignerElement {
62
+ type: 'serialNumber';
63
+ }
64
+ /** 页码在打印阶段根据数组下标和总长度生成“当前页/总页数”。 */
65
+ export interface PageNumberDesignerElement extends DynamicTextBaseDesignerElement {
66
+ type: 'pageNumber';
67
+ }
68
+ export type TimeMode = 'realtime' | 'fixed';
69
+ /** 时间可在打印时实时生成,也可保存用户选择的固定日期时间。 */
70
+ export interface TimeDesignerElement extends DynamicTextBaseDesignerElement {
71
+ type: 'time';
72
+ timeMode: TimeMode;
73
+ includeTime: boolean;
74
+ fixedTime: string;
75
+ }
76
+ /** 所有可按文字方式测量、渲染和缩放的元素。 */
77
+ export type TextStyleDesignerElement = TextDesignerElement | SerialNumberDesignerElement | PageNumberDesignerElement | TimeDesignerElement;
78
+ /** 二维码首期只保存内容;纠错等级等高级选项可继续独立注册为属性。 */
79
+ export interface QrcodeDesignerElement extends BaseDesignerElement {
80
+ type: 'qrcode';
81
+ content: string;
82
+ }
83
+ /** 条形码首期固定使用通用的 CODE128 编码。 */
84
+ export interface BarcodeDesignerElement extends BaseDesignerElement {
85
+ type: 'barcode';
86
+ content: string;
87
+ }
88
+ /** 无填充边框元素,strokeWidthMm 表示实际打印线宽。 */
89
+ export interface RectangleDesignerElement extends BaseDesignerElement {
90
+ type: 'rectangle';
91
+ strokeWidthMm: number;
92
+ }
93
+ /**
94
+ * 横线和竖线共用数据结构。
95
+ * 横线使用 widthMm 表示长度,竖线使用 heightMm 表示长度;另一个尺寸等于线宽。
96
+ */
97
+ export interface LineDesignerElement extends BaseDesignerElement {
98
+ type: 'horizontalLine' | 'verticalLine';
99
+ strokeWidthMm: number;
100
+ }
101
+ /** 当前已经具备创建、属性编辑和 SVG 渲染能力的元素集合。 */
102
+ export type DesignerElement = TextDesignerElement | RectangleDesignerElement | LineDesignerElement | QrcodeDesignerElement | BarcodeDesignerElement | SerialNumberDesignerElement | PageNumberDesignerElement | TimeDesignerElement;
103
+ /** 独立属性编辑器使用的统一值类型。 */
104
+ export type ElementPropertyValue = string | number | boolean;
105
+ /** SVG 选区八个缩放控制点的稳定标识。 */
106
+ export type ResizeHandle = 'topLeft' | 'top' | 'topRight' | 'right' | 'bottomRight' | 'bottom' | 'bottomLeft' | 'left';
107
+ /**
108
+ * 拖动或缩放过程中允许画布回写的布局字段。
109
+ * fontSizePt 只会在文字按比例缩放时出现,其他元素仍只更新毫米几何数据。
110
+ */
111
+ export interface ElementTransformPatch {
112
+ xMm: number;
113
+ yMm: number;
114
+ widthMm: number;
115
+ heightMm: number;
116
+ fontSizePt?: number;
117
+ }