template-designer 0.1.4 → 0.1.5

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 CHANGED
@@ -1,135 +1,176 @@
1
- # Template Designer Library
1
+ # 模板设计器组件库
2
2
 
3
- 一个基于 Vue 3 的模板拖拽设计器组件库,可复用于多个项目。
3
+ 一个基于Vue 3的可视化模板设计器组件库,支持拖拽、缩放、旋转等操作。
4
4
 
5
- ## 特性
5
+ ## 功能特性
6
6
 
7
- - 🎨 拖拽式模板设计
8
- - 📱 响应式布局
9
- - 🎯 精确的组件定位
10
- - 🔄 旋转和缩放功能
11
- - 📊 支持文本、条形码、二维码等组件
12
- - 💾 数据导出功能
7
+ - 🎨 可视化模板设计
8
+ - 📝 文本组件
9
+ - 📊 条形码组件
10
+ - 🔲 二维码组件
11
+ - 🖼️ 图片组件(支持上传)
12
+ - 📐 矩形框组件
13
+ - ➖ 线段组件
14
+ - 🎯 组件拖拽、缩放、旋转
15
+ - 📋 属性面板配置
16
+ - 🖼️ 模板预览导出
17
+ - 🔧 **双重组件控制**
13
18
 
14
- ## 安装
19
+ ## 双重组件控制功能
15
20
 
16
- ```bash
17
- npm install template-designer
18
- ```
21
+ ### 功能说明
19
22
 
20
- ## 配置
23
+ 组件库现在支持双重控制来隐藏/显示组件:
21
24
 
22
- 在入口文件引用样式
25
+ 1. **通过config参数控制**
26
+ 2. **通过配置文件控制** 如果配置文件中没有某个组件的配置,则不展示该组件
23
27
 
24
- ```bash
25
- ...
26
- import 'template-designer/dist/style.css'
27
- ...
28
- ```
28
+ ### 使用方法
29
29
 
30
- 在vue.config.js中添加
30
+ #### 1. 通过config参数控制
31
31
 
32
- ```bash
33
- configureWebpack: {
34
- ...
35
- resolve: {
36
- alias: {
37
- 'vue': path.resolve(__dirname, 'node_modules/vue')
38
- }
39
- }
40
- ...
32
+ ```javascript
33
+ // 隐藏特定组件
34
+ const config = {
35
+ text: { hidden: true }, // 隐藏文本组件
36
+ barcode: { hidden: true }, // 隐藏一维码组件
37
+ image: { hidden: true }, // 隐藏图片组件
38
+ rectangle: { hidden: true } // 隐藏矩形框组件
41
39
  }
40
+
41
+ // 使用组件
42
+ <TemplateDesigner :config="config" />
42
43
  ```
43
44
 
44
- ## 依赖要求
45
+ #### 2. 通过配置文件控制
45
46
 
46
- 本组件库依赖以下包,请确保在宿主项目中已安装:
47
+ 在 `src/js/config/props/` 目录下创建配置文件,只包含需要显示的组件:
47
48
 
48
- ```bash
49
- npm install vue@^3.0.0 element-plus@^2.0.0 html2canvas@^1.0.0 jsbarcode@^3.0.0
49
+ ```javascript
50
+ // src/js/config/props/xxx.js
51
+ export default {
52
+ text: {
53
+ // 文本组件配置
54
+ },
55
+ barcode: {
56
+ // 一维码组件配置
57
+ }
58
+ ...
59
+ }
50
60
  ```
51
61
 
52
- **注意**:这些依赖需要在宿主项目中安装,以避免版本冲突和重复加载。
53
-
54
- ## 使用
55
-
56
- ### 全局注册
62
+ 系统会自动根据 `template-type` 动态加载对应的配置文件:
57
63
 
58
64
  ```javascript
59
- ...
60
- import TemplateDesigner from 'template-designer-lib'
61
- app.use(TemplateDesigner)
62
- ...
65
+ // src/js/config/index.js
66
+ export async function getPropsConfig(type) {
67
+ try {
68
+ // 直接通过type对应文件名动态导入
69
+ const config = await import(`./props/${type}.js`)
70
+ return config.default
71
+ } catch (error) {
72
+ // 如果指定的配置文件不存在,返回lodop配置作为默认值
73
+ const defaultConfig = await import('./props/lodop.js')
74
+ return defaultConfig.default
75
+ }
76
+ }
63
77
  ```
64
78
 
65
- ### 局部注册
79
+ #### 3. 双重控制示例
66
80
 
67
81
  ```vue
68
82
  <template>
69
- <div>
70
- <TemplateDesigner :templateData="templateData" :options="options" :show-graph-config="showGraphConfig" :config="config"/>
71
- </div>
83
+ <TemplateDesigner
84
+ :template-type="currentTemplateType"
85
+ :config="componentConfig"
86
+ />
72
87
  </template>
73
88
 
74
89
  <script setup>
75
- import TemplateDesigner from 'template-designer-lib'
76
-
77
- const templateData = {
78
- // 你的模板数据
79
- }
80
-
81
- // options传入的结构须为{[optionsKey(config下配置文件中对应optionsKey)]: [{label: xx: value: xx}, ...],因为考虑实际使用场景,就没有加自定义key支持
82
- const options = {
83
- // 属性选项值
84
- }
90
+ import { ref } from 'vue'
85
91
 
86
- // 是否显示标签图像绘制
87
- const showGraphConfig = true
92
+ const currentTemplateType = ref('rfid') // 使用rfid配置文件
88
93
 
89
- // 组件配置
90
- const config = {
91
- text: { hidden: true }, // 隐藏文本组件
92
- barcode: { hidden: true }, // 隐藏一维码组件
93
- qrcode: { hidden: true }, // 隐藏二维码组件
94
- image: { hidden: true, request: () => {图片上传} }, // 隐藏图片组件
95
- rectangle: { hidden: true }, // 隐藏矩形框组件
96
- horline: { hidden: true } // 隐藏线段组件
94
+ const componentConfig = ref({
95
+ text: { hidden: false }, // 显示文本组件
96
+ barcode: { hidden: true }, // 隐藏一维码组件
97
+ // 注意:即使config中设置了显示,如果配置文件中没有该组件,仍然不会显示
98
+ })
97
99
 
100
+ // 切换模板类型
101
+ const changeTemplateType = (type) => {
102
+ currentTemplateType.value = type
98
103
  }
99
104
  </script>
100
105
  ```
101
106
 
102
- ## 开发
107
+ ### 实际效果
103
108
 
104
- ```bash
105
- # 安装依赖
106
- npm install
109
+ - **LODOP配置**:显示所有组件(text, barcode, qrcode, image, rectangle, horline)
110
+ - **RFID配置**:显示所有组件(text, barcode, qrcode)
107
111
 
108
- # 启动开发服务器
109
- npm run dev
112
+ ## 安装和使用
110
113
 
111
- # 构建
112
- npm run build
114
+ ```bash
115
+ npm install template-designer
113
116
  ```
114
117
 
115
- ## 发布
118
+ ```vue
119
+ <template>
120
+ <TemplateDesigner
121
+ :templateData="templateData"
122
+ :config="config"
123
+ :options="{ fields }"
124
+ template-type="lodop"
125
+ />
126
+ </template>
116
127
 
117
- ```bash
118
- npm run build
119
- npm publish
128
+ <script setup>
129
+ import { TemplateDesigner } from 'template-designer'
130
+
131
+ const templateData = ref({
132
+ width: 100,
133
+ height: 30,
134
+ printWidth: 103,
135
+ printHeight: 40,
136
+ items: []
137
+ })
138
+
139
+ const config = ref({
140
+ // 组件显示配置
141
+ })
142
+
143
+ const fields = ref([
144
+ { label: '商品条码', value: 'goodsSn' },
145
+ { label: '商品名称', value: 'goodsName' }
146
+ ])
147
+ </script>
120
148
  ```
121
149
 
122
- ## 目录结构
150
+ ## 配置说明
151
+
152
+ ### 支持的模板类型
153
+
154
+ - `lodop` - 默认配置,包含所有组件(对应 `lodop.js`)
155
+ - `rfid` - RFID标签配置,包含所有组件(对应 `rfid.js`)
156
+ - 其他任何类型 - 系统会尝试加载 `./props/{type}.js` 文件,如果不存在则使用lodop配置作为默认值
157
+
158
+ ### 组件类型
159
+
160
+ - `text` - 文本组件
161
+ - `barcode` - 一维码组件
162
+ - `qrcode` - 二维码组件
163
+ - `image` - 图片组件
164
+ - `rectangle` - 矩形框组件
165
+ - `horline` - 线段组件
166
+
167
+ ## 开发
123
168
 
124
169
  ```bash
125
- src/
126
- ├── components/ # 组件定义
127
- ├── js/ # 工具函数和钩子
128
- ├── assets/ # 静态资源
129
- ├── style/ # 样式文件
130
- └── index.vue # 主组件
170
+ npm run dev
171
+ npm run build
131
172
  ```
132
173
 
133
- ## 维护者
174
+ ## 许可证
134
175
 
135
- zhangxingbin
176
+ MIT
@@ -0,0 +1,255 @@
1
+ const e = {
2
+ text: {
3
+ x: 0,
4
+ y: 0,
5
+ width: 20,
6
+ height: 4.2,
7
+ rotation: 0,
8
+ Title: "",
9
+ FieldName: "",
10
+ Text: "测试文本",
11
+ FontName: "黑体",
12
+ FontSize: 10,
13
+ FontColor: "#000000",
14
+ Bold: 0,
15
+ Italic: 0,
16
+ Underline: 0,
17
+ Alignment: 2,
18
+ TextWrap: 1,
19
+ HOrient: 0,
20
+ VOrient: 0,
21
+ PenWidth: 0,
22
+ PenStyle: 0,
23
+ Stretch: 1,
24
+ PreviewOnly: 0,
25
+ ReadOnly: 0,
26
+ propertyPanel: [
27
+ {
28
+ prop: "Title",
29
+ label: "标题",
30
+ default: ""
31
+ },
32
+ {
33
+ prop: "FieldName",
34
+ label: "字段名称",
35
+ type: "select",
36
+ optionsKey: "fields",
37
+ default: ""
38
+ },
39
+ {
40
+ prop: "Text",
41
+ label: "测试数据",
42
+ default: "测试文本"
43
+ },
44
+ {
45
+ prop: "FontName",
46
+ label: "字体名称",
47
+ type: "select",
48
+ options: [
49
+ { label: "黑体", value: "黑体", cssValue: "SimHei" },
50
+ { label: "楷体", value: "楷体", cssValue: "KaiTi" },
51
+ { label: "宋体", value: "宋体", cssValue: "SimSun" }
52
+ ],
53
+ default: "黑体"
54
+ },
55
+ {
56
+ prop: "FontSize",
57
+ label: "字体大小",
58
+ type: "number",
59
+ min: 1,
60
+ max: 100,
61
+ default: 10
62
+ },
63
+ {
64
+ prop: "FontColor",
65
+ label: "字体颜色",
66
+ type: "color",
67
+ hide: !0,
68
+ default: "#000000"
69
+ },
70
+ {
71
+ prop: "Bold",
72
+ label: "字体加粗",
73
+ type: "select",
74
+ options: [
75
+ { label: "加粗", value: 1 },
76
+ { label: "不加粗", value: 0 }
77
+ ],
78
+ default: 0
79
+ },
80
+ {
81
+ prop: "Italic",
82
+ label: "是否斜体",
83
+ type: "select",
84
+ options: [
85
+ { label: "是", value: 1 },
86
+ { label: "否", value: 0 }
87
+ ],
88
+ default: 0
89
+ },
90
+ {
91
+ prop: "Alignment",
92
+ label: "对齐方式",
93
+ type: "select",
94
+ options: [
95
+ { label: "居左", value: 1 },
96
+ { label: "居中", value: 2 },
97
+ { label: "居右", value: 3 }
98
+ ],
99
+ default: 2
100
+ },
101
+ {
102
+ prop: "TextWrap",
103
+ label: "文本换行",
104
+ type: "select",
105
+ options: [
106
+ { label: "换行", value: 1 },
107
+ { label: "不换行&省略", value: 2 },
108
+ { label: "不换行&隐藏", value: 3 }
109
+ ],
110
+ default: 1
111
+ }
112
+ ]
113
+ },
114
+ barcode: {
115
+ x: 0,
116
+ y: 0,
117
+ width: 20,
118
+ height: 6,
119
+ rotation: 0,
120
+ FieldName: "goodsSn",
121
+ BarcodeValue: "1234567890",
122
+ CodeType: "128Auto",
123
+ AlignJustify: 0,
124
+ LineColor: "#000000",
125
+ propertyPanel: [
126
+ {
127
+ prop: "FieldName",
128
+ label: "字段名称",
129
+ type: "select",
130
+ optionsKey: "fields",
131
+ default: "goodsSn"
132
+ },
133
+ {
134
+ prop: "BarcodeValue",
135
+ label: "测试数据",
136
+ type: "text",
137
+ default: "1234567890"
138
+ },
139
+ {
140
+ prop: "CodeType",
141
+ label: "条码类型",
142
+ type: "select",
143
+ options: [
144
+ { label: "CODE128", value: "128Auto", compValue: "CODE128" },
145
+ { label: "CODE39", value: "Code39", compValue: "CODE39" },
146
+ { label: "EAN13", value: "EAN13", compValue: "EAN13" }
147
+ ],
148
+ hide: !0,
149
+ default: "128Auto"
150
+ },
151
+ {
152
+ prop: "AlignJustify",
153
+ label: "对齐方式",
154
+ type: "select",
155
+ options: [
156
+ { label: "两端对齐", value: 0 },
157
+ { label: "左", value: 1 },
158
+ { label: "中", value: 2 },
159
+ { label: "右", value: 3 }
160
+ ],
161
+ hide: !0,
162
+ default: 0
163
+ },
164
+ {
165
+ prop: "LineColor",
166
+ label: "条形码颜色",
167
+ type: "color",
168
+ hide: !0,
169
+ default: "#000000"
170
+ }
171
+ ]
172
+ },
173
+ qrcode: {
174
+ x: 0,
175
+ y: 0,
176
+ width: 10,
177
+ height: 10,
178
+ rotation: 0,
179
+ FieldName: "",
180
+ QRCodeValue: "FB-GOLD",
181
+ QRCodeVersion: 7,
182
+ QRCodeErrorLevel: "Q",
183
+ QRCodeEncodeMode: "B",
184
+ QRCodeForeground: "#000000",
185
+ QRCodeBackground: "transparent",
186
+ LockAspectRatio: !0,
187
+ lockAspectRatio: !0,
188
+ propertyPanel: [
189
+ {
190
+ prop: "FieldName",
191
+ label: "字段名称",
192
+ type: "select",
193
+ optionsKey: "fields",
194
+ default: ""
195
+ },
196
+ {
197
+ prop: "QRCodeValue",
198
+ label: "测试数据",
199
+ type: "text",
200
+ default: "FB-GOLD"
201
+ },
202
+ {
203
+ prop: "QRCodeVersion",
204
+ label: "二维码版本",
205
+ type: "number",
206
+ min: 1,
207
+ max: 40,
208
+ hide: !0,
209
+ default: 7
210
+ },
211
+ {
212
+ prop: "QRCodeErrorLevel",
213
+ label: "纠错级别",
214
+ type: "select",
215
+ options: [
216
+ { label: "L (7%)", value: "L" },
217
+ { label: "M (15%)", value: "M" },
218
+ { label: "Q (25%)", value: "Q" },
219
+ { label: "H (30%)", value: "H" }
220
+ ],
221
+ hide: !0,
222
+ default: "Q"
223
+ },
224
+ {
225
+ prop: "QRCodeEncodeMode",
226
+ label: "编码模式",
227
+ type: "select",
228
+ options: [
229
+ { label: "数字", value: "N" },
230
+ { label: "二进制或汉语", value: "B" },
231
+ { label: "英文字母", value: "A" }
232
+ ],
233
+ hide: !0,
234
+ default: "B"
235
+ },
236
+ {
237
+ prop: "QRCodeForeground",
238
+ label: "前景色",
239
+ type: "color",
240
+ hide: !0,
241
+ default: "#000000"
242
+ },
243
+ {
244
+ prop: "QRCodeBackground",
245
+ label: "背景景色",
246
+ type: "color",
247
+ hide: !0,
248
+ default: "transparent"
249
+ }
250
+ ]
251
+ }
252
+ };
253
+ export {
254
+ e as default
255
+ };
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .td-text-component{width:100%;height:100%;position:relative;display:flex;align-items:center;overflow:hidden;box-sizing:border-box}.td-text-content{width:100%;min-width:0;box-sizing:border-box}.label[data-v-a7fa57c5]{display:flex;align-items:center;justify-content:flex-start}.property-item[data-v-a7fa57c5]{display:flex;flex-direction:column;gap:4px}.property-item label[data-v-a7fa57c5]{font-size:14px;color:#666}.property-item input[data-v-a7fa57c5],.property-item select[data-v-a7fa57c5]{padding:4px 8px;border:1px solid #ddd;border-radius:4px}.property-item input[type=color][data-v-a7fa57c5]{height:32px;padding:2px}.property-item input[type=checkbox][data-v-a7fa57c5]{width:16px;height:16px}.file-input-container[data-v-a7fa57c5]{position:relative;display:flex;align-items:center;gap:8px}.file-input-container input[data-v-a7fa57c5]{height:100%!important}.file-url-input[data-v-a7fa57c5]{flex:1;padding:4px 8px;border:1px solid #ddd;border-radius:4px;font-size:12px}.file-url-input[data-v-a7fa57c5]:disabled{background-color:#f5f5f5;cursor:not-allowed}.file-input[data-v-a7fa57c5]{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.file-select-btn[data-v-a7fa57c5]{padding:4px 12px;border:1px solid #ddd;border-radius:4px;background:var(--el-color-primary);color:#fff;cursor:pointer;font-size:12px;white-space:nowrap;display:flex;align-items:center;gap:4px}.file-select-btn[data-v-a7fa57c5]:hover:not(:disabled){background:var(--el-color-primary-dark-2);border-color:var(--el-color-primary-dark-2)}.file-select-btn[data-v-a7fa57c5]:disabled{background:#ccc;cursor:not-allowed}.file-info[data-v-a7fa57c5]{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;background-color:#f5f5f5;border-radius:4px;margin-top:4px}.file-name[data-v-a7fa57c5]{font-size:12px;color:#666;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clear-btn[data-v-a7fa57c5]{background:none;border:none;color:#ff4d4f;cursor:pointer;font-size:12px;padding:2px 6px;border-radius:2px}.clear-btn[data-v-a7fa57c5]:hover{background-color:#fff2f0}.property-panel[data-v-f70859fd]{padding:16px;background:#fff;border-left:1px solid #e4e7ed;overflow-y:auto;height:100%}.property-group[data-v-f70859fd]{margin-bottom:16px}.property-group-title[data-v-f70859fd]{font-size:14px;font-weight:500;color:#303133;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #ebeef5}.property-item[data-v-f70859fd]{margin-bottom:12px}.text-property-panel .property-item[data-v-f70859fd]:last-child,.barcode-property-panel .property-item[data-v-f70859fd]:last-child,.qrcode-property-panel .property-item[data-v-f70859fd]:last-child,.image-property-panel .property-item[data-v-f70859fd]:last-child,.rectangle-property-panel .property-item[data-v-f70859fd]:last-child,.horline-property-panel .property-item[data-v-f70859fd]:last-child,.verline-property-panel .property-item[data-v-f70859fd]:last-child{margin-bottom:0}.barcode-component{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;box-sizing:border-box}.barcode-component svg{width:100%!important;height:100%!important;max-width:100%;max-height:100%;display:block}.qrcode-component[data-v-6e726fcb]{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;box-sizing:border-box}.qrcode-canvas-fixed[data-v-6e726fcb]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:0;margin:0}.qrcode-image[data-v-6e726fcb]{display:block;width:100%!important;height:100%!important;padding:0;margin:0;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges;image-rendering:pixelated;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-crisp-edges;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;filter:none;-webkit-filter:none;object-fit:cover;object-position:center}.component-selection-overlay[data-v-6e726fcb]{position:absolute;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.qrcode-property-panel[data-v-cce393d5]{display:flex;flex-direction:column;gap:12px}.property-item[data-v-cce393d5]{display:flex;flex-direction:column;gap:4px}.property-item label[data-v-cce393d5]{font-size:14px;color:#666}.property-item input[data-v-cce393d5],.property-item select[data-v-cce393d5]{padding:4px 8px;border:1px solid #ddd;border-radius:4px}.property-item input[type=color][data-v-cce393d5]{height:32px;padding:2px}.image-component[data-v-6edf2c8f]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative;background-color:#fafafa}.image-placeholder[data-v-6edf2c8f]{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#999;font-size:12px;gap:8px}.image-loading-overlay[data-v-6edf2c8f]{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.6);z-index:5}.image-content[data-v-6edf2c8f]{display:block;max-width:100%;max-height:100%;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges;image-rendering:pixelated;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-crisp-edges;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.component-selection-overlay[data-v-6edf2c8f]{position:absolute;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.image-property-panel[data-v-462c8b63]{display:flex;flex-direction:column;gap:12px}.property-item[data-v-462c8b63]{display:flex;flex-direction:column;gap:4px}.property-item label[data-v-462c8b63]{font-size:14px;color:#666}.property-item input[data-v-462c8b63],.property-item select[data-v-462c8b63]{padding:4px 8px;border:1px solid #ddd;border-radius:4px}.property-item input[type=color][data-v-462c8b63]{height:32px;padding:2px}.rectangle-component{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;overflow:visible;box-sizing:border-box}.rectangle-content{width:100%;height:100%;box-sizing:border-box;position:relative}.hairline-edge{position:absolute;pointer-events:none}.component-selection-overlay{position:absolute;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.rectangle-property-panel[data-v-e06ed44e]{display:flex;flex-direction:column;gap:12px}.horline-component{position:relative;display:flex;align-items:center;justify-content:center;overflow:visible;box-sizing:border-box}.line-selection-outline{position:absolute;left:0;top:0;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.component-list[data-v-3ab62635]{background:#fff;display:flex;flex-direction:column;gap:20px}.component-group[data-v-3ab62635]{display:flex;flex-direction:column;gap:8px}.group-title[data-v-3ab62635]{font-size:14px;font-weight:600;color:#333;padding:8px 12px;border-left:4px solid var(--el-color-primary);background:linear-gradient(135deg,var(--el-color-primary-light-9) 0%,var(--el-color-primary-light-8) 100%);border-radius:0 6px 6px 0;margin-bottom:4px;box-shadow:0 1px 3px #0000001a}.group-content[data-v-3ab62635]{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:8px;grid-column-gap:8px}.component-item[data-v-3ab62635]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4px 0;border:1px solid #ddd;border-radius:4px;cursor:grab;font-size:13px;color:#555;transition:all .2s ease;width:100%;height:70px;background:#fff;box-shadow:0 1px 3px #0000001a}.component-item[data-v-3ab62635]:hover{background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary);color:var(--el-color-primary);box-shadow:0 2px 8px #00000014}.component-item i[data-v-3ab62635]{font-size:24px;margin-bottom:8px;color:var(--el-color-primary)}.component-item span[data-v-3ab62635]{font-size:12px;text-align:center;color:#333}.component-item:hover i[data-v-3ab62635],.component-item:hover span[data-v-3ab62635]{color:var(--el-color-primary)!important}.ruler[data-v-3635eba4]{position:absolute;z-index:1}.ruler.horizontal[data-v-3635eba4]{left:20px;top:0;width:calc(100% - 40px);height:20px;border-bottom:none}.ruler.vertical[data-v-3635eba4]{top:20px;left:0;width:20px;height:calc(100% - 40px);border-right:none}.ruler-unit[data-v-3635eba4]{position:absolute}.ruler.horizontal .ruler-unit[data-v-3635eba4]{height:100%}.ruler.vertical .ruler-unit[data-v-3635eba4]{width:100%}.ruler-mark[data-v-3635eba4]{position:absolute;background:#999}.ruler.horizontal .ruler-mark[data-v-3635eba4]{bottom:0}.ruler.vertical .ruler-mark[data-v-3635eba4]{right:0}.ruler-text[data-v-3635eba4]{position:absolute;font-size:8px;color:#666;white-space:nowrap}.ruler.horizontal .ruler-text[data-v-3635eba4]{bottom:8px;transform:translate(-50%)}.ruler.vertical .ruler-text[data-v-3635eba4]{right:8px;transform:translateY(-50%) rotate(-90deg)}.add-btn[data-v-a4b90b63]{margin:10px 0}.tg-title[data-v-a4b90b63]{display:flex;align-items:center}.tg-title p[data-v-a4b90b63]{font-size:18px;font-weight:700}.tge-main[data-v-a4b90b63]{max-height:82vh;padding:0}.tge-text[data-v-a4b90b63]{font-size:14px;line-height:26px}.tge-content[data-v-a4b90b63]{display:flex;width:100%}.tge-block[data-v-a4b90b63]{display:flex;flex-direction:column;flex:1}.tge-title[data-v-a4b90b63]{padding:6px 0;font-size:14px;color:var(--el-color-primary)}.tge-img[data-v-a4b90b63]{width:100%;height:auto}.table-container[data-v-a4b90b63]{width:100%;border:1px dashed #ddd;border-radius:4px}.empty-placeholder[data-v-a4b90b63]{display:flex;align-items:center;justify-content:center;color:#999;padding:20px;border-radius:4px;min-height:80px}.graph-table[data-v-a4b90b63]{margin-top:10px}.tge-divider[data-v-a4b90b63]{width:1px;background:var(--el-border-color);margin:0 10px}.graph-table .el-table__header,.graph-table .el-table__body{width:100%!important}.graph-table .el-table__body{margin-bottom:10px!important}.graph-table .el-form-item__error{position:static!important;top:0!important}.graph-table .el-input-number{width:auto}.graph-table .el-input-number.is-without-controls .el-input__wrapper{padding-left:4px;padding-right:4px}button[data-v-fd4d9530]{display:flex;align-items:center;justify-content:center}.label-designer[data-v-fd4d9530]{display:flex;height:100%}.toolbar[data-v-fd4d9530]{width:200px;background:#fff;border-right:1px solid #e0e0e0;padding:16px;display:flex;flex-direction:column;gap:16px}.zoom-controls span[data-v-fd4d9530]{width:44px;text-align:center}.zoom-controls[data-v-fd4d9530]{display:flex;align-items:center;gap:8px;background:#f5f5f5;border-radius:4px;padding:4px 8px}.zoom-controls button[data-v-fd4d9530]{width:24px;height:24px;border:1px solid #ddd;background:#fff;border-radius:4px;cursor:pointer}.zoom-controls button[data-v-fd4d9530]:disabled{opacity:.5;cursor:not-allowed}.center-container[data-v-fd4d9530]{display:flex;flex-direction:column;flex:1;overflow:hidden;height:100%}.center-toolbar[data-v-fd4d9530]{display:flex;align-items:center;justify-content:flex-end;padding:16px 16px 0;background:rgba(0,0,0,.05)}.canvas-container[data-v-fd4d9530]{width:100%;flex:1;padding:0 16px 16px;overflow:auto;background:rgba(0,0,0,.05);position:relative;display:flex;flex-direction:column}.canvas-wrapper[data-v-fd4d9530]{position:relative;transform-origin:0 0;overflow:visible;width:fit-content;height:fit-content;margin-top:20px;transition:all .2s ease;transform:translateZ(0);will-change:transform}.ruler-horizontal[data-v-fd4d9530]{position:absolute;left:0;top:0;right:0;height:24px;z-index:10;pointer-events:none}.ruler-vertical[data-v-fd4d9530]{position:absolute;left:0;top:0;bottom:0;width:24px;z-index:10;pointer-events:none}.canvas[data-v-fd4d9530]{position:relative;overflow:visible;z-index:1;position:absolute;left:21px;top:21px}.property-panel[data-v-fd4d9530]{width:260px;background:#fff;border-left:1px solid #ddd;padding:0 16px 16px;display:flex;flex-direction:column;gap:16px;position:relative;z-index:100;overflow-y:auto}.property-panel-title[data-v-fd4d9530]{position:sticky;top:0;left:0;right:0;background:#fff;z-index:100;display:flex;align-items:center;justify-content:flex-start;margin:10px 0 0}.position-controls[data-v-fd4d9530]{display:flex;flex-direction:column;gap:12px;padding:12px;background:#f5f5f5;border-radius:4px}.control-group[data-v-fd4d9530]{display:flex;align-items:center;justify-content:space-between;gap:4px}.control-group label[data-v-fd4d9530]{width:80px;font-size:14px;color:#666;text-align:end}.number-input[data-v-fd4d9530]{display:flex;align-items:center;gap:4px}.number-input input[data-v-fd4d9530]{width:90px;padding:4px;border:1px solid #ddd;border-radius:4px;text-align:center}.number-input button[data-v-fd4d9530]{width:24px;height:24px;border:1px solid #ddd;background:#fff;border-radius:4px;cursor:pointer}.canvas-item[data-v-fd4d9530]{position:absolute;cursor:move;-webkit-user-select:none;user-select:none;z-index:10;transform:translateZ(0);will-change:transform;left:0;top:0}.resize-handle[data-v-fd4d9530]{position:absolute;width:6px;height:6px;background:#1890ff;border:1px solid #fff;box-shadow:0 0 3px #0000004d;cursor:pointer;z-index:1001;transition:all .2s ease;border-radius:1px;display:block!important;visibility:visible!important;opacity:1!important;transform:translateZ(0);will-change:transform;font-size:16px!important;line-height:1!important}.resize-handle[data-v-fd4d9530]:hover{background:#40a9ff;box-shadow:0 0 4px #0006}.resize-handle.top-left[data-v-fd4d9530]{top:-4px;left:-4px;background:#52c41a}.resize-handle.top-left[data-v-fd4d9530]:hover{background:#73d13d}.resize-handle.top-left[data-v-fd4d9530]:active{background:#389e0d}.resize-handle.top[data-v-fd4d9530]{top:-4px;left:50%;transform:translate(-50%)}.resize-handle.top[data-v-fd4d9530]:hover,.resize-handle.top[data-v-fd4d9530]:active{transform:translate(-50%)}.resize-handle.top-right[data-v-fd4d9530]{top:-4px;right:-4px;background:#52c41a}.resize-handle.top-right[data-v-fd4d9530]:hover{background:#73d13d}.resize-handle.top-right[data-v-fd4d9530]:active{background:#389e0d}.resize-handle.right[data-v-fd4d9530]{top:50%;right:-4px;transform:translateY(-50%)}.resize-handle.right[data-v-fd4d9530]:hover,.resize-handle.right[data-v-fd4d9530]:active{transform:translateY(-50%)}.resize-handle.bottom-right[data-v-fd4d9530]{bottom:-4px;right:-4px;background:#52c41a;z-index:1001}.resize-handle.bottom-right[data-v-fd4d9530]:hover{background:#73d13d}.resize-handle.bottom-right[data-v-fd4d9530]:active{background:#389e0d}.resize-handle.bottom[data-v-fd4d9530]{bottom:-4px;left:50%;transform:translate(-50%)}.resize-handle.bottom[data-v-fd4d9530]:hover,.resize-handle.bottom[data-v-fd4d9530]:active{transform:translate(-50%)}.resize-handle.bottom-left[data-v-fd4d9530]{bottom:-4px;left:-4px;background:#52c41a}.resize-handle.bottom-left[data-v-fd4d9530]:hover{background:#73d13d}.resize-handle.bottom-left[data-v-fd4d9530]:active{background:#389e0d}.resize-handle.left[data-v-fd4d9530]{top:50%;left:-4px;transform:translateY(-50%)}.resize-handle.left[data-v-fd4d9530]:hover,.resize-handle.left[data-v-fd4d9530]:active{transform:translateY(-50%)}.rotate-handle[data-v-fd4d9530]{position:absolute;top:-5px;left:50%;transform:translate(-50%);width:10px;height:10px;background:#1890ff;color:#fff;border-radius:50%;cursor:grab;z-index:1002;display:flex;align-items:center;justify-content:center}.size-label[data-v-fd4d9530]{display:flex;justify-content:center;flex-wrap:nowrap;white-space:nowrap;position:absolute;top:-14px;left:-4px;width:auto;min-width:70px;height:auto;background:rgba(255,34,34,.8);color:#fff;font-size:7px;border-radius:6px;z-index:20;line-height:1.2;box-shadow:0 2px 8px #00000014;pointer-events:none;padding:1px 8px 0}.delete-btn[data-v-fd4d9530]{position:absolute;top:-5px;right:-5px;width:10px;height:10px;background:#ff4d4f;color:#fff;border:none;border-radius:50%;cursor:pointer;z-index:1003;display:flex;align-items:center;justify-content:center}.drag-extend-lines[data-v-fd4d9530]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.drag-extend-line[data-v-fd4d9530]{position:absolute;pointer-events:none;z-index:998}.drag-extend-line.horizontal[data-v-fd4d9530]{width:100%;height:0;left:0;border-top:1px dashed rgb(177,179,184)}.drag-extend-line.vertical[data-v-fd4d9530]{width:0;height:100%;top:0;border-left:1px dashed rgb(177,179,184)}.drag-extend-line.rotated[data-v-fd4d9530]{position:absolute;border:1px dashed #1890ff;pointer-events:none;z-index:998}.alignment-guides[data-v-fd4d9530]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9999}.alignment-guide[data-v-fd4d9530]{background-color:transparent;pointer-events:none;z-index:9999}.alignment-guide.horizontal[data-v-fd4d9530]{position:absolute;left:0;right:0;height:1px;background:linear-gradient(to right,#ff4d4f 0%,#ff4d4f 50%,transparent 50%,transparent 100%);background-size:6px 1px;background-repeat:repeat-x;transform:translateZ(0);will-change:auto}.alignment-guide.vertical[data-v-fd4d9530]{position:absolute;top:0;bottom:0;width:1px;background:linear-gradient(to bottom,#ff4d4f 0%,#ff4d4f 50%,transparent 50%,transparent 100%);background-size:1px 6px;background-repeat:repeat-y;transform:translateZ(0);will-change:auto}.number-input input[type=number][data-v-fd4d9530]::-webkit-inner-spin-button,.number-input input[type=number][data-v-fd4d9530]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.switch-input[data-v-fd4d9530]{display:flex;align-items:center}.switch-input input[type=checkbox][data-v-fd4d9530]{width:20px;height:20px;cursor:pointer;accent-color:#1890ff}.component-selected[data-v-fd4d9530],.component-current[data-v-fd4d9530]{outline:1px dashed #1890ff!important;outline-offset:0!important}.component-selected[data-v-fd4d9530],.component-current[data-v-fd4d9530]{box-sizing:border-box}.no-outline.component-selected[data-v-fd4d9530],.no-outline.component-current[data-v-fd4d9530]{outline:none!important}.template-designer[data-v-82f858e6]{overflow-y:hidden}.template-designer-border-top[data-v-82f858e6]{border-top:1px solid #e0e0e0}
1
+ .td-text-component{width:100%;height:100%;position:relative;display:flex;align-items:center;overflow:hidden;box-sizing:border-box}.td-text-content{width:100%;min-width:0;box-sizing:border-box}.label[data-v-a7fa57c5]{display:flex;align-items:center;justify-content:flex-start}.property-item[data-v-a7fa57c5]{display:flex;flex-direction:column;gap:4px}.property-item label[data-v-a7fa57c5]{font-size:14px;color:#666}.property-item input[data-v-a7fa57c5],.property-item select[data-v-a7fa57c5]{padding:4px 8px;border:1px solid #ddd;border-radius:4px}.property-item input[type=color][data-v-a7fa57c5]{height:32px;padding:2px}.property-item input[type=checkbox][data-v-a7fa57c5]{width:16px;height:16px}.file-input-container[data-v-a7fa57c5]{position:relative;display:flex;align-items:center;gap:8px}.file-input-container input[data-v-a7fa57c5]{height:100%!important}.file-url-input[data-v-a7fa57c5]{flex:1;padding:4px 8px;border:1px solid #ddd;border-radius:4px;font-size:12px}.file-url-input[data-v-a7fa57c5]:disabled{background-color:#f5f5f5;cursor:not-allowed}.file-input[data-v-a7fa57c5]{position:absolute;opacity:0;width:0;height:0;pointer-events:none}.file-select-btn[data-v-a7fa57c5]{padding:4px 12px;border:1px solid #ddd;border-radius:4px;background:var(--el-color-primary);color:#fff;cursor:pointer;font-size:12px;white-space:nowrap;display:flex;align-items:center;gap:4px}.file-select-btn[data-v-a7fa57c5]:hover:not(:disabled){background:var(--el-color-primary-dark-2);border-color:var(--el-color-primary-dark-2)}.file-select-btn[data-v-a7fa57c5]:disabled{background:#ccc;cursor:not-allowed}.file-info[data-v-a7fa57c5]{display:flex;align-items:center;justify-content:space-between;padding:4px 8px;background-color:#f5f5f5;border-radius:4px;margin-top:4px}.file-name[data-v-a7fa57c5]{font-size:12px;color:#666;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.clear-btn[data-v-a7fa57c5]{background:none;border:none;color:#ff4d4f;cursor:pointer;font-size:12px;padding:2px 6px;border-radius:2px}.clear-btn[data-v-a7fa57c5]:hover{background-color:#fff2f0}.property-panel[data-v-f70859fd]{padding:16px;background:#fff;border-left:1px solid #e4e7ed;overflow-y:auto;height:100%}.property-group[data-v-f70859fd]{margin-bottom:16px}.property-group-title[data-v-f70859fd]{font-size:14px;font-weight:500;color:#303133;margin-bottom:8px;padding-bottom:4px;border-bottom:1px solid #ebeef5}.property-item[data-v-f70859fd]{margin-bottom:12px}.text-property-panel .property-item[data-v-f70859fd]:last-child,.barcode-property-panel .property-item[data-v-f70859fd]:last-child,.qrcode-property-panel .property-item[data-v-f70859fd]:last-child,.image-property-panel .property-item[data-v-f70859fd]:last-child,.rectangle-property-panel .property-item[data-v-f70859fd]:last-child,.horline-property-panel .property-item[data-v-f70859fd]:last-child,.verline-property-panel .property-item[data-v-f70859fd]:last-child{margin-bottom:0}.barcode-component{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;box-sizing:border-box}.barcode-component svg{width:100%!important;height:100%!important;max-width:100%;max-height:100%;display:block}.qrcode-component[data-v-6e726fcb]{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;overflow:hidden;box-sizing:border-box}.qrcode-canvas-fixed[data-v-6e726fcb]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;padding:0;margin:0}.qrcode-image[data-v-6e726fcb]{display:block;width:100%!important;height:100%!important;padding:0;margin:0;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges;image-rendering:pixelated;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-crisp-edges;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;filter:none;-webkit-filter:none;object-fit:cover;object-position:center}.component-selection-overlay[data-v-6e726fcb]{position:absolute;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.qrcode-property-panel[data-v-cce393d5]{display:flex;flex-direction:column;gap:12px}.property-item[data-v-cce393d5]{display:flex;flex-direction:column;gap:4px}.property-item label[data-v-cce393d5]{font-size:14px;color:#666}.property-item input[data-v-cce393d5],.property-item select[data-v-cce393d5]{padding:4px 8px;border:1px solid #ddd;border-radius:4px}.property-item input[type=color][data-v-cce393d5]{height:32px;padding:2px}.image-component[data-v-6edf2c8f]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;overflow:hidden;position:relative;background-color:#fafafa}.image-placeholder[data-v-6edf2c8f]{display:flex;flex-direction:column;align-items:center;justify-content:center;color:#999;font-size:12px;gap:8px}.image-loading-overlay[data-v-6edf2c8f]{position:absolute;left:0;top:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;background:rgba(255,255,255,.6);z-index:5}.image-content[data-v-6edf2c8f]{display:block;max-width:100%;max-height:100%;image-rendering:-webkit-optimize-contrast;image-rendering:crisp-edges;image-rendering:pixelated;image-rendering:-moz-crisp-edges;image-rendering:-o-crisp-edges;image-rendering:-webkit-crisp-edges;-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:translateZ(0);-webkit-transform:translateZ(0);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;-webkit-user-drag:none;-khtml-user-drag:none;-moz-user-drag:none;-o-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.component-selection-overlay[data-v-6edf2c8f]{position:absolute;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.image-property-panel[data-v-462c8b63]{display:flex;flex-direction:column;gap:12px}.property-item[data-v-462c8b63]{display:flex;flex-direction:column;gap:4px}.property-item label[data-v-462c8b63]{font-size:14px;color:#666}.property-item input[data-v-462c8b63],.property-item select[data-v-462c8b63]{padding:4px 8px;border:1px solid #ddd;border-radius:4px}.property-item input[type=color][data-v-462c8b63]{height:32px;padding:2px}.rectangle-component{width:100%;height:100%;position:relative;display:flex;align-items:center;justify-content:center;overflow:visible;box-sizing:border-box}.rectangle-content{width:100%;height:100%;box-sizing:border-box;position:relative}.hairline-edge{position:absolute;pointer-events:none}.component-selection-overlay{position:absolute;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.rectangle-property-panel[data-v-e06ed44e]{display:flex;flex-direction:column;gap:12px}.horline-component{position:relative;display:flex;align-items:center;justify-content:center;overflow:visible;box-sizing:border-box}.line-selection-outline{position:absolute;left:0;top:0;border:2px dashed #1890ff;pointer-events:none;box-sizing:border-box;z-index:1000}.component-list[data-v-29028fa4]{background:#fff;display:flex;flex-direction:column;gap:20px}.component-group[data-v-29028fa4]{display:flex;flex-direction:column;gap:8px}.group-title[data-v-29028fa4]{font-size:14px;font-weight:600;color:#333;padding:8px 12px;border-left:4px solid var(--el-color-primary);background:linear-gradient(135deg,var(--el-color-primary-light-9) 0%,var(--el-color-primary-light-8) 100%);border-radius:0 6px 6px 0;margin-bottom:4px;box-shadow:0 1px 3px #0000001a}.group-content[data-v-29028fa4]{display:grid;grid-template-columns:1fr 1fr;grid-row-gap:8px;grid-column-gap:8px}.component-item[data-v-29028fa4]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:4px 0;border:1px solid #ddd;border-radius:4px;cursor:grab;font-size:13px;color:#555;transition:all .2s ease;width:100%;height:70px;background:#fff;box-shadow:0 1px 3px #0000001a}.component-item[data-v-29028fa4]:hover{background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary);color:var(--el-color-primary);box-shadow:0 2px 8px #00000014}.component-item i[data-v-29028fa4]{font-size:24px;margin-bottom:8px;color:var(--el-color-primary)}.component-item span[data-v-29028fa4]{font-size:12px;text-align:center;color:#333}.component-item:hover i[data-v-29028fa4],.component-item:hover span[data-v-29028fa4]{color:var(--el-color-primary)!important}.ruler[data-v-3635eba4]{position:absolute;z-index:1}.ruler.horizontal[data-v-3635eba4]{left:20px;top:0;width:calc(100% - 40px);height:20px;border-bottom:none}.ruler.vertical[data-v-3635eba4]{top:20px;left:0;width:20px;height:calc(100% - 40px);border-right:none}.ruler-unit[data-v-3635eba4]{position:absolute}.ruler.horizontal .ruler-unit[data-v-3635eba4]{height:100%}.ruler.vertical .ruler-unit[data-v-3635eba4]{width:100%}.ruler-mark[data-v-3635eba4]{position:absolute;background:#999}.ruler.horizontal .ruler-mark[data-v-3635eba4]{bottom:0}.ruler.vertical .ruler-mark[data-v-3635eba4]{right:0}.ruler-text[data-v-3635eba4]{position:absolute;font-size:8px;color:#666;white-space:nowrap}.ruler.horizontal .ruler-text[data-v-3635eba4]{bottom:8px;transform:translate(-50%)}.ruler.vertical .ruler-text[data-v-3635eba4]{right:8px;transform:translateY(-50%) rotate(-90deg)}.add-btn[data-v-a4b90b63]{margin:10px 0}.tg-title[data-v-a4b90b63]{display:flex;align-items:center}.tg-title p[data-v-a4b90b63]{font-size:18px;font-weight:700}.tge-main[data-v-a4b90b63]{max-height:82vh;padding:0}.tge-text[data-v-a4b90b63]{font-size:14px;line-height:26px}.tge-content[data-v-a4b90b63]{display:flex;width:100%}.tge-block[data-v-a4b90b63]{display:flex;flex-direction:column;flex:1}.tge-title[data-v-a4b90b63]{padding:6px 0;font-size:14px;color:var(--el-color-primary)}.tge-img[data-v-a4b90b63]{width:100%;height:auto}.table-container[data-v-a4b90b63]{width:100%;border:1px dashed #ddd;border-radius:4px}.empty-placeholder[data-v-a4b90b63]{display:flex;align-items:center;justify-content:center;color:#999;padding:20px;border-radius:4px;min-height:80px}.graph-table[data-v-a4b90b63]{margin-top:10px}.tge-divider[data-v-a4b90b63]{width:1px;background:var(--el-border-color);margin:0 10px}.graph-table .el-table__header,.graph-table .el-table__body{width:100%!important}.graph-table .el-table__body{margin-bottom:10px!important}.graph-table .el-form-item__error{position:static!important;top:0!important}.graph-table .el-input-number{width:auto}.graph-table .el-input-number.is-without-controls .el-input__wrapper{padding-left:4px;padding-right:4px}button[data-v-e684cfd3]{display:flex;align-items:center;justify-content:center}.label-designer[data-v-e684cfd3]{display:flex;height:100%}.toolbar[data-v-e684cfd3]{width:200px;background:#fff;border-right:1px solid #e0e0e0;padding:16px;display:flex;flex-direction:column;gap:16px}.zoom-controls span[data-v-e684cfd3]{width:44px;text-align:center}.zoom-controls[data-v-e684cfd3]{display:flex;align-items:center;gap:8px;background:#f5f5f5;border-radius:4px;padding:4px 8px}.zoom-controls button[data-v-e684cfd3]{width:24px;height:24px;border:1px solid #ddd;background:#fff;border-radius:4px;cursor:pointer}.zoom-controls button[data-v-e684cfd3]:disabled{opacity:.5;cursor:not-allowed}.center-container[data-v-e684cfd3]{display:flex;flex-direction:column;flex:1;overflow:hidden;height:100%}.center-toolbar[data-v-e684cfd3]{display:flex;align-items:center;justify-content:flex-end;padding:16px 16px 0;background:rgba(0,0,0,.05)}.canvas-container[data-v-e684cfd3]{width:100%;flex:1;padding:0 16px 16px;overflow:auto;background:rgba(0,0,0,.05);position:relative;display:flex;flex-direction:column}.canvas-wrapper[data-v-e684cfd3]{position:relative;transform-origin:0 0;overflow:visible;width:fit-content;height:fit-content;margin-top:20px;transition:all .2s ease;transform:translateZ(0);will-change:transform}.ruler-horizontal[data-v-e684cfd3]{position:absolute;left:0;top:0;right:0;height:24px;z-index:10;pointer-events:none}.ruler-vertical[data-v-e684cfd3]{position:absolute;left:0;top:0;bottom:0;width:24px;z-index:10;pointer-events:none}.canvas[data-v-e684cfd3]{position:relative;overflow:visible;z-index:1;position:absolute;left:21px;top:21px}.property-panel[data-v-e684cfd3]{width:260px;background:#fff;border-left:1px solid #ddd;padding:0 16px 16px;display:flex;flex-direction:column;gap:16px;position:relative;z-index:100;overflow-y:auto}.property-panel-title[data-v-e684cfd3]{position:sticky;top:0;left:0;right:0;background:#fff;z-index:100;display:flex;align-items:center;justify-content:flex-start;margin:10px 0 0}.position-controls[data-v-e684cfd3]{display:flex;flex-direction:column;gap:12px;padding:12px;background:#f5f5f5;border-radius:4px}.control-group[data-v-e684cfd3]{display:flex;align-items:center;justify-content:space-between;gap:4px}.control-group label[data-v-e684cfd3]{width:80px;font-size:14px;color:#666;text-align:end}.number-input[data-v-e684cfd3]{display:flex;align-items:center;gap:4px}.number-input input[data-v-e684cfd3]{width:90px;padding:4px;border:1px solid #ddd;border-radius:4px;text-align:center}.number-input button[data-v-e684cfd3]{width:24px;height:24px;border:1px solid #ddd;background:#fff;border-radius:4px;cursor:pointer}.canvas-item[data-v-e684cfd3]{position:absolute;cursor:move;-webkit-user-select:none;user-select:none;z-index:10;transform:translateZ(0);will-change:transform;left:0;top:0}.resize-handle[data-v-e684cfd3]{position:absolute;width:6px;height:6px;background:#1890ff;border:1px solid #fff;box-shadow:0 0 3px #0000004d;cursor:pointer;z-index:1001;transition:all .2s ease;border-radius:1px;display:block!important;visibility:visible!important;opacity:1!important;transform:translateZ(0);will-change:transform;font-size:16px!important;line-height:1!important}.resize-handle[data-v-e684cfd3]:hover{background:#40a9ff;box-shadow:0 0 4px #0006}.resize-handle.top-left[data-v-e684cfd3]{top:-4px;left:-4px;background:#52c41a}.resize-handle.top-left[data-v-e684cfd3]:hover{background:#73d13d}.resize-handle.top-left[data-v-e684cfd3]:active{background:#389e0d}.resize-handle.top[data-v-e684cfd3]{top:-4px;left:50%;transform:translate(-50%)}.resize-handle.top[data-v-e684cfd3]:hover,.resize-handle.top[data-v-e684cfd3]:active{transform:translate(-50%)}.resize-handle.top-right[data-v-e684cfd3]{top:-4px;right:-4px;background:#52c41a}.resize-handle.top-right[data-v-e684cfd3]:hover{background:#73d13d}.resize-handle.top-right[data-v-e684cfd3]:active{background:#389e0d}.resize-handle.right[data-v-e684cfd3]{top:50%;right:-4px;transform:translateY(-50%)}.resize-handle.right[data-v-e684cfd3]:hover,.resize-handle.right[data-v-e684cfd3]:active{transform:translateY(-50%)}.resize-handle.bottom-right[data-v-e684cfd3]{bottom:-4px;right:-4px;background:#52c41a;z-index:1001}.resize-handle.bottom-right[data-v-e684cfd3]:hover{background:#73d13d}.resize-handle.bottom-right[data-v-e684cfd3]:active{background:#389e0d}.resize-handle.bottom[data-v-e684cfd3]{bottom:-4px;left:50%;transform:translate(-50%)}.resize-handle.bottom[data-v-e684cfd3]:hover,.resize-handle.bottom[data-v-e684cfd3]:active{transform:translate(-50%)}.resize-handle.bottom-left[data-v-e684cfd3]{bottom:-4px;left:-4px;background:#52c41a}.resize-handle.bottom-left[data-v-e684cfd3]:hover{background:#73d13d}.resize-handle.bottom-left[data-v-e684cfd3]:active{background:#389e0d}.resize-handle.left[data-v-e684cfd3]{top:50%;left:-4px;transform:translateY(-50%)}.resize-handle.left[data-v-e684cfd3]:hover,.resize-handle.left[data-v-e684cfd3]:active{transform:translateY(-50%)}.rotate-handle[data-v-e684cfd3]{position:absolute;top:-5px;left:50%;transform:translate(-50%);width:10px;height:10px;background:#1890ff;color:#fff;border-radius:50%;cursor:grab;z-index:1002;display:flex;align-items:center;justify-content:center}.size-label[data-v-e684cfd3]{display:flex;justify-content:center;flex-wrap:nowrap;white-space:nowrap;position:absolute;top:-14px;left:-4px;width:auto;min-width:70px;height:auto;background:rgba(255,34,34,.8);color:#fff;font-size:7px;border-radius:6px;z-index:20;line-height:1.2;box-shadow:0 2px 8px #00000014;pointer-events:none;padding:1px 8px 0}.delete-btn[data-v-e684cfd3]{position:absolute;top:-5px;right:-5px;width:10px;height:10px;background:#ff4d4f;color:#fff;border:none;border-radius:50%;cursor:pointer;z-index:1003;display:flex;align-items:center;justify-content:center}.drag-extend-lines[data-v-e684cfd3]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.drag-extend-line[data-v-e684cfd3]{position:absolute;pointer-events:none;z-index:998}.drag-extend-line.horizontal[data-v-e684cfd3]{width:100%;height:0;left:0;border-top:1px dashed rgb(177,179,184)}.drag-extend-line.vertical[data-v-e684cfd3]{width:0;height:100%;top:0;border-left:1px dashed rgb(177,179,184)}.drag-extend-line.rotated[data-v-e684cfd3]{position:absolute;border:1px dashed #1890ff;pointer-events:none;z-index:998}.alignment-guides[data-v-e684cfd3]{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none;z-index:9999}.alignment-guide[data-v-e684cfd3]{background-color:transparent;pointer-events:none;z-index:9999}.alignment-guide.horizontal[data-v-e684cfd3]{position:absolute;left:0;right:0;height:1px;background:linear-gradient(to right,#ff4d4f 0%,#ff4d4f 50%,transparent 50%,transparent 100%);background-size:6px 1px;background-repeat:repeat-x;transform:translateZ(0);will-change:auto}.alignment-guide.vertical[data-v-e684cfd3]{position:absolute;top:0;bottom:0;width:1px;background:linear-gradient(to bottom,#ff4d4f 0%,#ff4d4f 50%,transparent 50%,transparent 100%);background-size:1px 6px;background-repeat:repeat-y;transform:translateZ(0);will-change:auto}.number-input input[type=number][data-v-e684cfd3]::-webkit-inner-spin-button,.number-input input[type=number][data-v-e684cfd3]::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.switch-input[data-v-e684cfd3]{display:flex;align-items:center}.switch-input input[type=checkbox][data-v-e684cfd3]{width:20px;height:20px;cursor:pointer;accent-color:#1890ff}.component-selected[data-v-e684cfd3],.component-current[data-v-e684cfd3]{outline:1px dashed #1890ff!important;outline-offset:0!important}.component-selected[data-v-e684cfd3],.component-current[data-v-e684cfd3]{box-sizing:border-box}.no-outline.component-selected[data-v-e684cfd3],.no-outline.component-current[data-v-e684cfd3]{outline:none!important}.component-config-missing[data-v-e684cfd3]{display:flex;align-items:center;justify-content:center;background:#fff3cd;border:1px dashed #ffc107;border-radius:4px;color:#856404;font-size:12px}.missing-config-tip[data-v-e684cfd3]{display:flex;align-items:center;gap:4px;padding:8px}.missing-config-tip .el-icon[data-v-e684cfd3]{font-size:14px;color:#ffc107}.template-designer[data-v-82f858e6]{overflow-y:hidden}.template-designer-border-top[data-v-82f858e6]{border-top:1px solid #e0e0e0}