z-certificate-editor 1.0.0 → 1.0.2

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
@@ -130,8 +130,8 @@ const fields = extractFields(text)
130
130
 
131
131
  ### 环境要求
132
132
 
133
- - Node.js >= 16.0.0
134
- - npm >= 7.0.0
133
+ - Node.js >= 22.21.0
134
+ - npm >= 11.6.2
135
135
 
136
136
  ### 安装依赖
137
137
 
@@ -147,41 +147,6 @@ npm run dev
147
147
 
148
148
  启动后访问 `http://localhost:3000`(或终端显示的地址)
149
149
 
150
- ### 构建 npm 包
151
-
152
- ```bash
153
- npm run build
154
- ```
155
-
156
- 构建产物将输出到 `dist` 目录,包含:
157
- - `z-certificate-editor.es.js` - ES 模块版本
158
- - `z-certificate-editor.umd.js` - UMD 版本
159
- - `style.css` - 样式文件
160
-
161
- ### 预览生产版本
162
-
163
- ```bash
164
- npm run preview
165
- ```
166
-
167
- ## 📤 发布到 npm
168
-
169
- 1. 确保已登录 npm:
170
- ```bash
171
- npm login
172
- ```
173
-
174
- 2. 更新版本号(可选):
175
- ```bash
176
- npm version patch # 或 minor, major
177
- ```
178
-
179
- 3. 发布:
180
- ```bash
181
- npm publish
182
- ```
183
-
184
- 注意:发布前会自动执行 `npm run build` 构建包。
185
150
 
186
151
  ## 📖 使用说明
187
152
 
package/dist/style.css CHANGED
@@ -1 +1 @@
1
- .design-panel[data-v-b694f9ff]{display:flex;flex-direction:column;height:100%;background:#fff}.panel-tabs[data-v-b694f9ff]{display:flex;border-bottom:1px solid #e0e0e0;background:#fafafa}.tab-item[data-v-b694f9ff]{flex:1;padding:12px;text-align:center;cursor:pointer;font-size:14px;color:#666;border-bottom:2px solid transparent;transition:all .3s}.tab-item[data-v-b694f9ff]:hover{color:#1890ff;background:#f0f0f0}.tab-item.active[data-v-b694f9ff]{color:#1890ff;border-bottom-color:#1890ff;background:#fff;font-weight:500}.panel-content[data-v-b694f9ff]{flex:1;overflow-y:auto;padding:16px}.elements-section[data-v-b694f9ff]{width:100%}.elements-grid[data-v-b694f9ff]{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.element-item[data-v-b694f9ff]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;border:1px solid #e0e0e0;border-radius:4px;cursor:pointer;transition:all .3s;background:#fff}.element-item[data-v-b694f9ff]:hover{border-color:#1890ff;background:#f0f7ff;transform:translateY(-2px);box-shadow:0 2px 8px #1890ff33}.element-icon[data-v-b694f9ff]{font-size:32px;margin-bottom:8px}.element-label[data-v-b694f9ff]{font-size:12px;color:#333}.templates-section[data-v-b694f9ff]{width:100%}.upload-section[data-v-b694f9ff]{padding:16px;border:1px dashed #d9d9d9;border-radius:4px;text-align:center;background:#fafafa;margin-bottom:16px}.template-type-switch[data-v-b694f9ff]{display:flex;gap:8px;margin-bottom:16px;padding:4px;background:#f5f5f5;border-radius:4px}.switch-btn[data-v-b694f9ff]{flex:1;padding:6px 12px;border:none;background:transparent;color:#666;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s}.switch-btn.active[data-v-b694f9ff]{background:#fff;color:#1890ff;font-weight:500;box-shadow:0 1px 2px #0000001a}.templates-list[data-v-b694f9ff]{display:flex;flex-direction:column;gap:12px;margin-bottom:16px}.template-item[data-v-b694f9ff]{border:1px solid #e0e0e0;border-radius:4px;overflow:hidden;cursor:pointer;transition:all .3s;background:#fff}.template-item[data-v-b694f9ff]:hover{border-color:#1890ff;box-shadow:0 2px 8px #1890ff33}.template-preview[data-v-b694f9ff]{width:100%;height:120px;background:#f5f5f5}.template-name[data-v-b694f9ff]{padding:8px 12px;font-size:13px;color:#333;text-align:center;background:#fff}.upload-btn[data-v-b694f9ff]{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:8px 16px;border:1px solid #d9d9d9;background:#fff;color:#333;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s;margin-bottom:8px}.upload-btn[data-v-b694f9ff]:hover{border-color:#1890ff;color:#1890ff}.upload-hint[data-v-b694f9ff]{font-size:11px;color:#999;line-height:1.5}.canvas-area[data-v-ac0f08fc]{width:100%;height:100%;overflow:auto;background:#f0f0f0;display:flex;justify-content:center;align-items:flex-start;padding:40px 20px}.certificate-canvas[data-v-ac0f08fc]{position:relative;width:800px;min-height:1000px;background:#fff;box-shadow:0 4px 12px #0000001a;padding:60px 50px}.certificate-border[data-v-ac0f08fc]{position:absolute;top:0;left:0;right:0;bottom:0;border:12px solid #1890ff;background-image:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(255,255,255,.1) 2px,rgba(255,255,255,.1) 4px),repeating-linear-gradient(90deg,transparent,transparent 2px,rgba(255,255,255,.1) 2px,rgba(255,255,255,.1) 4px);background-size:20px 20px;box-shadow:inset 0 0 0 2px #ffffff4d,inset 0 0 0 4px #1890ff,inset 0 0 0 6px #ffffff4d}.editable-element[data-v-ac0f08fc]{position:absolute;border:1px dashed #ccc;cursor:move;min-width:50px;min-height:30px;padding:4px}.editable-element.selected[data-v-ac0f08fc]{border-color:#1890ff;border-width:2px;background:#1890ff0d}.editable-element.text[data-v-ac0f08fc],.editable-element.longtext[data-v-ac0f08fc]{border:1px dashed #999}.editable-element.text.selected[data-v-ac0f08fc],.editable-element.longtext.selected[data-v-ac0f08fc]{border-color:#1890ff;border-width:2px}.text-content[data-v-ac0f08fc]{width:100%;height:100%;word-wrap:break-word;white-space:pre-wrap;padding:2px;min-height:20px}.field-placeholder-highlight[data-v-ac0f08fc]{background:#e6f7ff;color:#1890ff;padding:2px 4px;border-radius:2px;font-weight:500}.field-value[data-v-ac0f08fc]{color:#52c41a;font-weight:500}.image-placeholder[data-v-ac0f08fc],.qrcode-placeholder[data-v-ac0f08fc]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:#f5f5f5;border:1px dashed #ccc;color:#999}.image-element[data-v-ac0f08fc],.qrcode-element[data-v-ac0f08fc]{width:100%;height:100%;overflow:hidden}.element-image[data-v-ac0f08fc]{width:100%;height:100%;object-fit:contain;display:block}.qrcode-content[data-v-ac0f08fc]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#f5f5f5;border:1px dashed #ccc;padding:8px}.qrcode-placeholder-text[data-v-ac0f08fc]{font-size:12px;color:#999;margin-bottom:4px}.qrcode-info[data-v-ac0f08fc]{font-size:10px;color:#666;word-break:break-all;text-align:center}.resize-handles[data-v-ac0f08fc]{position:absolute;top:-4px;left:-4px;right:-4px;bottom:-4px;pointer-events:none}.handle[data-v-ac0f08fc]{position:absolute;width:8px;height:8px;background:#1890ff;border:1px solid #fff;pointer-events:all;cursor:nwse-resize}.handle-nw[data-v-ac0f08fc]{top:-4px;left:-4px;cursor:nwse-resize}.handle-ne[data-v-ac0f08fc]{top:-4px;right:-4px;cursor:nesw-resize}.handle-sw[data-v-ac0f08fc]{bottom:-4px;left:-4px;cursor:nesw-resize}.handle-se[data-v-ac0f08fc]{bottom:-4px;right:-4px;cursor:nwse-resize}.delete-btn[data-v-ac0f08fc]{position:absolute;top:-12px;right:-12px;width:24px;height:24px;border-radius:50%;background:#ff4d4f;color:#fff;border:none;cursor:pointer;font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 4px #0003}.delete-btn[data-v-ac0f08fc]:hover{background:#ff7875}.field-dialog-overlay[data-v-6745c3ca]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.field-dialog[data-v-6745c3ca]{background:#fff;border-radius:8px;width:600px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #00000026}.dialog-header[data-v-6745c3ca]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e0e0e0}.dialog-header h3[data-v-6745c3ca]{font-size:18px;font-weight:500;color:#333;margin:0}.close-btn[data-v-6745c3ca]{width:32px;height:32px;border:none;background:transparent;font-size:24px;color:#999;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .3s}.close-btn[data-v-6745c3ca]:hover{background:#f5f5f5;color:#333}.dialog-content[data-v-6745c3ca]{flex:1;display:flex;flex-direction:column;padding:20px;overflow:hidden}.search-box[data-v-6745c3ca]{margin-bottom:16px}.search-input[data-v-6745c3ca]{width:100%;padding:8px 12px;border:1px solid #d9d9d9;border-radius:4px;font-size:14px}.search-input[data-v-6745c3ca]:focus{outline:none;border-color:#1890ff}.table-container[data-v-6745c3ca]{flex:1;overflow-y:auto;border:1px solid #e0e0e0;border-radius:4px}.fields-table[data-v-6745c3ca]{width:100%;border-collapse:collapse;background:#fff}.fields-table thead[data-v-6745c3ca]{background:#fafafa;position:sticky;top:0;z-index:10}.fields-table th[data-v-6745c3ca]{padding:12px 16px;text-align:left;font-size:14px;font-weight:500;color:#333;border-bottom:1px solid #e0e0e0}.fields-table th[data-v-6745c3ca]:first-child{width:70%}.fields-table th[data-v-6745c3ca]:last-child{width:30%;text-align:center}.fields-table tbody tr[data-v-6745c3ca]{border-bottom:1px solid #f0f0f0;transition:background .2s}.fields-table tbody tr[data-v-6745c3ca]:hover{background:#fafafa}.fields-table tbody tr[data-v-6745c3ca]:last-child{border-bottom:none}.field-row[data-v-6745c3ca]{cursor:pointer}.field-name[data-v-6745c3ca]{padding:12px 16px;font-size:14px;color:#333}.field-action[data-v-6745c3ca]{padding:12px 16px;text-align:center}.select-btn[data-v-6745c3ca]{padding:4px 16px;border:1px solid #1890ff;background:#fff;color:#1890ff;border-radius:4px;font-size:14px;cursor:pointer;transition:all .3s}.select-btn[data-v-6745c3ca]:hover{background:#1890ff;color:#fff}.pagination[data-v-6745c3ca]{display:flex;justify-content:center;align-items:center;gap:8px;margin-top:16px;padding-top:16px;border-top:1px solid #e0e0e0}.page-btn[data-v-6745c3ca]{min-width:32px;height:32px;padding:0 8px;border:1px solid #d9d9d9;background:#fff;color:#333;border-radius:4px;font-size:14px;cursor:pointer;transition:all .3s}.page-btn[data-v-6745c3ca]:hover:not(:disabled){border-color:#1890ff;color:#1890ff}.page-btn.active[data-v-6745c3ca]{background:#1890ff;border-color:#1890ff;color:#fff}.page-btn[data-v-6745c3ca]:disabled{opacity:.5;cursor:not-allowed}.properties-panel[data-v-f3dab8d1]{display:flex;flex-direction:column;height:100%;background:#fff}.panel-header[data-v-f3dab8d1]{padding:12px 16px;border-bottom:1px solid #e0e0e0}.panel-header h3[data-v-f3dab8d1]{font-size:14px;font-weight:500;color:#333;margin:0}.panel-content[data-v-f3dab8d1]{flex:1;overflow-y:auto;padding:16px}.section-title[data-v-f3dab8d1]{font-size:13px;font-weight:500;color:#666;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #f0f0f0}.form-group[data-v-f3dab8d1]{margin-bottom:16px}.form-label[data-v-f3dab8d1]{display:block;font-size:12px;color:#666;margin-bottom:6px}.form-input[data-v-f3dab8d1],.form-select[data-v-f3dab8d1]{width:100%;padding:6px 10px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px}.form-input[data-v-f3dab8d1]:focus,.form-select[data-v-f3dab8d1]:focus{outline:none;border-color:#1890ff}.content-input-wrapper[data-v-f3dab8d1]{display:flex;flex-direction:column;gap:8px}.content-textarea[data-v-f3dab8d1]{width:100%;padding:8px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px;resize:vertical}.content-textarea[data-v-f3dab8d1]:focus{outline:none;border-color:#1890ff}.insert-field-btn[data-v-f3dab8d1]{display:flex;align-items:center;gap:4px;padding:6px 12px;border:1px solid #d9d9d9;background:#fff;color:#666;border-radius:4px;font-size:12px;cursor:pointer;transition:all .3s}.insert-field-btn[data-v-f3dab8d1]:hover{border-color:#1890ff;color:#1890ff}.style-buttons[data-v-f3dab8d1]{display:flex;gap:8px}.style-btn[data-v-f3dab8d1]{width:32px;height:32px;border:1px solid #d9d9d9;background:#fff;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s}.style-btn[data-v-f3dab8d1]:hover{border-color:#1890ff}.style-btn.active[data-v-f3dab8d1]{background:#1890ff;border-color:#1890ff;color:#fff}.color-input[data-v-f3dab8d1]{width:100%;height:32px;border:1px solid #d9d9d9;border-radius:4px;cursor:pointer}.align-buttons[data-v-f3dab8d1]{display:flex;gap:8px}.align-btn[data-v-f3dab8d1]{flex:1;padding:6px 12px;border:1px solid #d9d9d9;background:#fff;border-radius:4px;font-size:12px;cursor:pointer;transition:all .3s}.align-btn[data-v-f3dab8d1]:hover{border-color:#1890ff}.align-btn.active[data-v-f3dab8d1]{background:#1890ff;border-color:#1890ff;color:#fff}.radio-group[data-v-f3dab8d1]{display:flex;gap:16px}.radio-label[data-v-f3dab8d1]{display:flex;align-items:center;gap:6px;font-size:13px;cursor:pointer}.image-upload-wrapper[data-v-f3dab8d1],.qrcode-upload-wrapper[data-v-f3dab8d1]{display:flex;flex-direction:column;gap:8px}.upload-btn[data-v-f3dab8d1]{width:100%;padding:10px 16px;border:2px solid #1890ff;background:#1890ff;color:#fff;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .3s;display:flex;align-items:center;justify-content:center;gap:6px}.upload-btn[data-v-f3dab8d1]:hover{background:#40a9ff;border-color:#40a9ff;box-shadow:0 2px 8px #1890ff4d}.upload-btn[data-v-f3dab8d1]:active{background:#096dd9;border-color:#096dd9}.image-url-input[data-v-f3dab8d1],.qrcode-input[data-v-f3dab8d1]{width:100%;padding:6px 10px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px}.image-url-input[data-v-f3dab8d1]:focus,.qrcode-input[data-v-f3dab8d1]:focus{outline:none;border-color:#1890ff}.remove-btn[data-v-f3dab8d1]{padding:4px 12px;border:1px solid #ff4d4f;background:#fff;color:#ff4d4f;border-radius:4px;font-size:12px;cursor:pointer;transition:all .3s;align-self:flex-start}.remove-btn[data-v-f3dab8d1]:hover{background:#ff4d4f;color:#fff}.image-preview[data-v-f3dab8d1],.qrcode-preview[data-v-f3dab8d1]{margin-top:8px;padding:8px;border:1px solid #e0e0e0;border-radius:4px;background:#fafafa}.image-preview img[data-v-f3dab8d1],.qrcode-preview img[data-v-f3dab8d1]{max-width:100%;max-height:200px;display:block}.field-preview[data-v-f3dab8d1]{margin-top:8px;padding:6px 10px;background:#f0f7ff;border:1px solid #d6e4ff;border-radius:4px;font-size:12px;color:#1890ff}.form-row[data-v-f3dab8d1]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.field-data-panel[data-v-33e53b63]{display:flex;flex-direction:column;height:100%;background:#fff;border-top:1px solid #e0e0e0}.panel-header[data-v-33e53b63]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #e0e0e0}.panel-header h3[data-v-33e53b63]{font-size:14px;font-weight:500;color:#333;margin:0}.reset-btn[data-v-33e53b63]{padding:4px 12px;border:1px solid #d9d9d9;background:#fff;border-radius:4px;font-size:12px;color:#666;cursor:pointer}.reset-btn[data-v-33e53b63]:hover{border-color:#1890ff;color:#1890ff}.panel-content[data-v-33e53b63]{flex:1;overflow-y:auto;padding:16px}.field-category[data-v-33e53b63]{margin-bottom:24px}.category-title[data-v-33e53b63]{font-size:13px;font-weight:500;color:#666;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #f0f0f0}.fields-list[data-v-33e53b63]{display:flex;flex-direction:column;gap:16px}.field-item[data-v-33e53b63]{display:flex;flex-direction:column;gap:6px}.field-label[data-v-33e53b63]{font-size:13px;color:#333;font-weight:500}.field-input[data-v-33e53b63]{padding:6px 10px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px}.field-input[data-v-33e53b63]:focus{outline:none;border-color:#1890ff}.field-hint[data-v-33e53b63]{font-size:11px;color:#999}.preview-overlay[data-v-2c0e9417]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:2000}.preview-dialog[data-v-2c0e9417]{background:#fff;border-radius:8px;width:90%;max-width:1200px;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #0000004d}.preview-header[data-v-2c0e9417]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e0e0e0}.preview-header h3[data-v-2c0e9417]{font-size:18px;font-weight:500;color:#333;margin:0}.close-btn[data-v-2c0e9417]{width:32px;height:32px;border:none;background:transparent;font-size:24px;color:#999;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .3s}.close-btn[data-v-2c0e9417]:hover{background:#f5f5f5;color:#333}.preview-content[data-v-2c0e9417]{flex:1;overflow:auto;padding:40px;display:flex;justify-content:center;align-items:flex-start;background:#f5f5f5}.preview-canvas-wrapper[data-v-2c0e9417]{display:flex;justify-content:center;align-items:flex-start}.preview-canvas[data-v-2c0e9417]{background:#fff;box-shadow:0 4px 12px #00000026;position:relative;padding:60px 50px}.preview-element[data-v-2c0e9417]{position:absolute}.preview-text-content[data-v-2c0e9417]{width:100%;height:100%;word-wrap:break-word;white-space:pre-wrap}.preview-image-element[data-v-2c0e9417],.preview-qrcode-element[data-v-2c0e9417]{width:100%;height:100%;overflow:hidden}.preview-element-image[data-v-2c0e9417]{width:100%;height:100%;object-fit:contain;display:block}.preview-qrcode-text[data-v-2c0e9417]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:#f5f5f5;border:1px solid #e0e0e0;font-size:12px;color:#666;word-break:break-all;padding:8px}.certificate-editor[data-v-b6b9b7fa]{display:flex;flex-direction:column;width:100vw;height:100vh;background:#f5f5f5}.toolbar[data-v-b6b9b7fa]{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#fff;border-bottom:1px solid #e0e0e0;box-shadow:0 2px 4px #0000000d;flex-shrink:0}.toolbar-btn[data-v-b6b9b7fa]{display:flex;align-items:center;gap:6px;padding:8px 16px;border:1px solid #d9d9d9;background:#fff;color:#333;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s}.toolbar-btn[data-v-b6b9b7fa]:hover{border-color:#1890ff;color:#1890ff}.toolbar-btn.preview-btn[data-v-b6b9b7fa]:hover{background:#e6f7ff;border-color:#1890ff}.toolbar-btn.save-btn[data-v-b6b9b7fa]:hover{background:#f6ffed;border-color:#52c41a;color:#52c41a}.certificate-editor-content[data-v-b6b9b7fa]{display:flex;flex:1;min-height:0;overflow:hidden}.left-panel[data-v-b6b9b7fa]{width:280px;background:#fff;border-right:1px solid #e0e0e0;overflow-y:auto}.canvas-area[data-v-b6b9b7fa]{flex:1;overflow:auto;display:flex;justify-content:center;align-items:flex-start;padding:20px}.right-panel[data-v-b6b9b7fa]{width:350px;background:#fff;border-left:1px solid #e0e0e0;display:flex;flex-direction:column;overflow:hidden}.properties-section[data-v-b6b9b7fa]{flex:1;overflow-y:auto;border-bottom:1px solid #e0e0e0}.field-data-section[data-v-b6b9b7fa]{height:300px;overflow-y:auto}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;overflow:hidden}#app{width:100vw;height:100vh}
1
+ .design-panel[data-v-b694f9ff]{display:flex;flex-direction:column;height:100%;background:#fff}.panel-tabs[data-v-b694f9ff]{display:flex;border-bottom:1px solid #e0e0e0;background:#fafafa}.tab-item[data-v-b694f9ff]{flex:1;padding:12px;text-align:center;cursor:pointer;font-size:14px;color:#666;border-bottom:2px solid transparent;transition:all .3s}.tab-item[data-v-b694f9ff]:hover{color:#1890ff;background:#f0f0f0}.tab-item.active[data-v-b694f9ff]{color:#1890ff;border-bottom-color:#1890ff;background:#fff;font-weight:500}.panel-content[data-v-b694f9ff]{flex:1;overflow-y:auto;padding:16px}.elements-section[data-v-b694f9ff]{width:100%}.elements-grid[data-v-b694f9ff]{display:grid;grid-template-columns:repeat(2,1fr);gap:12px}.element-item[data-v-b694f9ff]{display:flex;flex-direction:column;align-items:center;justify-content:center;padding:16px;border:1px solid #e0e0e0;border-radius:4px;cursor:pointer;transition:all .3s;background:#fff}.element-item[data-v-b694f9ff]:hover{border-color:#1890ff;background:#f0f7ff;transform:translateY(-2px);box-shadow:0 2px 8px #1890ff33}.element-icon[data-v-b694f9ff]{font-size:32px;margin-bottom:8px}.element-label[data-v-b694f9ff]{font-size:12px;color:#333}.templates-section[data-v-b694f9ff]{width:100%}.upload-section[data-v-b694f9ff]{padding:16px;border:1px dashed #d9d9d9;border-radius:4px;text-align:center;background:#fafafa;margin-bottom:16px}.template-type-switch[data-v-b694f9ff]{display:flex;gap:8px;margin-bottom:16px;padding:4px;background:#f5f5f5;border-radius:4px}.switch-btn[data-v-b694f9ff]{flex:1;padding:6px 12px;border:none;background:transparent;color:#666;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s}.switch-btn.active[data-v-b694f9ff]{background:#fff;color:#1890ff;font-weight:500;box-shadow:0 1px 2px #0000001a}.templates-list[data-v-b694f9ff]{display:flex;flex-direction:column;gap:12px;margin-bottom:16px}.template-item[data-v-b694f9ff]{border:1px solid #e0e0e0;border-radius:4px;overflow:hidden;cursor:pointer;transition:all .3s;background:#fff}.template-item[data-v-b694f9ff]:hover{border-color:#1890ff;box-shadow:0 2px 8px #1890ff33}.template-preview[data-v-b694f9ff]{width:100%;height:120px;background:#f5f5f5}.template-name[data-v-b694f9ff]{padding:8px 12px;font-size:13px;color:#333;text-align:center;background:#fff}.upload-btn[data-v-b694f9ff]{display:flex;align-items:center;justify-content:center;gap:6px;width:100%;padding:8px 16px;border:1px solid #d9d9d9;background:#fff;color:#333;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s;margin-bottom:8px}.upload-btn[data-v-b694f9ff]:hover{border-color:#1890ff;color:#1890ff}.upload-hint[data-v-b694f9ff]{font-size:11px;color:#999;line-height:1.5}.canvas-area[data-v-ac0f08fc]{width:100%;height:100%;overflow:auto;background:#f0f0f0;display:flex;justify-content:center;align-items:flex-start;padding:40px 20px}.certificate-canvas[data-v-ac0f08fc]{position:relative;width:800px;min-height:1000px;background:#fff;box-shadow:0 4px 12px #0000001a;padding:60px 50px}.certificate-border[data-v-ac0f08fc]{position:absolute;top:0;left:0;right:0;bottom:0;border:12px solid #1890ff;background-image:repeating-linear-gradient(0deg,transparent,transparent 2px,rgba(255,255,255,.1) 2px,rgba(255,255,255,.1) 4px),repeating-linear-gradient(90deg,transparent,transparent 2px,rgba(255,255,255,.1) 2px,rgba(255,255,255,.1) 4px);background-size:20px 20px;box-shadow:inset 0 0 0 2px #ffffff4d,inset 0 0 0 4px #1890ff,inset 0 0 0 6px #ffffff4d}.editable-element[data-v-ac0f08fc]{position:absolute;border:1px dashed #ccc;cursor:move;min-width:50px;min-height:30px;padding:4px}.editable-element.selected[data-v-ac0f08fc]{border-color:#1890ff;border-width:2px;background:#1890ff0d}.editable-element.text[data-v-ac0f08fc],.editable-element.longtext[data-v-ac0f08fc]{border:1px dashed #999}.editable-element.text.selected[data-v-ac0f08fc],.editable-element.longtext.selected[data-v-ac0f08fc]{border-color:#1890ff;border-width:2px}.text-content[data-v-ac0f08fc]{width:100%;height:100%;word-wrap:break-word;white-space:pre-wrap;padding:2px;min-height:20px}.field-placeholder-highlight[data-v-ac0f08fc]{background:#e6f7ff;color:#1890ff;padding:2px 4px;border-radius:2px;font-weight:500}.field-value[data-v-ac0f08fc]{color:#52c41a;font-weight:500}.image-placeholder[data-v-ac0f08fc],.qrcode-placeholder[data-v-ac0f08fc]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:#f5f5f5;border:1px dashed #ccc;color:#999}.image-element[data-v-ac0f08fc],.qrcode-element[data-v-ac0f08fc]{width:100%;height:100%;overflow:hidden}.element-image[data-v-ac0f08fc]{width:100%;height:100%;object-fit:contain;display:block}.qrcode-content[data-v-ac0f08fc]{width:100%;height:100%;display:flex;flex-direction:column;align-items:center;justify-content:center;background:#f5f5f5;border:1px dashed #ccc;padding:8px}.qrcode-placeholder-text[data-v-ac0f08fc]{font-size:12px;color:#999;margin-bottom:4px}.qrcode-info[data-v-ac0f08fc]{font-size:10px;color:#666;word-break:break-all;text-align:center}.resize-handles[data-v-ac0f08fc]{position:absolute;top:-4px;left:-4px;right:-4px;bottom:-4px;pointer-events:none}.handle[data-v-ac0f08fc]{position:absolute;width:8px;height:8px;background:#1890ff;border:1px solid #fff;pointer-events:all;cursor:nwse-resize}.handle-nw[data-v-ac0f08fc]{top:-4px;left:-4px;cursor:nwse-resize}.handle-ne[data-v-ac0f08fc]{top:-4px;right:-4px;cursor:nesw-resize}.handle-sw[data-v-ac0f08fc]{bottom:-4px;left:-4px;cursor:nesw-resize}.handle-se[data-v-ac0f08fc]{bottom:-4px;right:-4px;cursor:nwse-resize}.delete-btn[data-v-ac0f08fc]{position:absolute;top:-12px;right:-12px;width:24px;height:24px;border-radius:50%;background:#ff4d4f;color:#fff;border:none;cursor:pointer;font-size:18px;line-height:1;display:flex;align-items:center;justify-content:center;box-shadow:0 2px 4px #0003}.delete-btn[data-v-ac0f08fc]:hover{background:#ff7875}.field-dialog-overlay[data-v-6745c3ca]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.field-dialog[data-v-6745c3ca]{background:#fff;border-radius:8px;width:600px;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #00000026}.dialog-header[data-v-6745c3ca]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e0e0e0}.dialog-header h3[data-v-6745c3ca]{font-size:18px;font-weight:500;color:#333;margin:0}.close-btn[data-v-6745c3ca]{width:32px;height:32px;border:none;background:transparent;font-size:24px;color:#999;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .3s}.close-btn[data-v-6745c3ca]:hover{background:#f5f5f5;color:#333}.dialog-content[data-v-6745c3ca]{flex:1;display:flex;flex-direction:column;padding:20px;overflow:hidden}.search-box[data-v-6745c3ca]{margin-bottom:16px}.search-input[data-v-6745c3ca]{width:100%;padding:8px 12px;border:1px solid #d9d9d9;border-radius:4px;font-size:14px}.search-input[data-v-6745c3ca]:focus{outline:none;border-color:#1890ff}.table-container[data-v-6745c3ca]{flex:1;overflow-y:auto;border:1px solid #e0e0e0;border-radius:4px}.fields-table[data-v-6745c3ca]{width:100%;border-collapse:collapse;background:#fff}.fields-table thead[data-v-6745c3ca]{background:#fafafa;position:sticky;top:0;z-index:10}.fields-table th[data-v-6745c3ca]{padding:12px 16px;text-align:left;font-size:14px;font-weight:500;color:#333;border-bottom:1px solid #e0e0e0}.fields-table th[data-v-6745c3ca]:first-child{width:70%}.fields-table th[data-v-6745c3ca]:last-child{width:30%;text-align:center}.fields-table tbody tr[data-v-6745c3ca]{border-bottom:1px solid #f0f0f0;transition:background .2s}.fields-table tbody tr[data-v-6745c3ca]:hover{background:#fafafa}.fields-table tbody tr[data-v-6745c3ca]:last-child{border-bottom:none}.field-row[data-v-6745c3ca]{cursor:pointer}.field-name[data-v-6745c3ca]{padding:12px 16px;font-size:14px;color:#333}.field-action[data-v-6745c3ca]{padding:12px 16px;text-align:center}.select-btn[data-v-6745c3ca]{padding:4px 16px;border:1px solid #1890ff;background:#fff;color:#1890ff;border-radius:4px;font-size:14px;cursor:pointer;transition:all .3s}.select-btn[data-v-6745c3ca]:hover{background:#1890ff;color:#fff}.pagination[data-v-6745c3ca]{display:flex;justify-content:center;align-items:center;gap:8px;margin-top:16px;padding-top:16px;border-top:1px solid #e0e0e0}.page-btn[data-v-6745c3ca]{min-width:32px;height:32px;padding:0 8px;border:1px solid #d9d9d9;background:#fff;color:#333;border-radius:4px;font-size:14px;cursor:pointer;transition:all .3s}.page-btn[data-v-6745c3ca]:hover:not(:disabled){border-color:#1890ff;color:#1890ff}.page-btn.active[data-v-6745c3ca]{background:#1890ff;border-color:#1890ff;color:#fff}.page-btn[data-v-6745c3ca]:disabled{opacity:.5;cursor:not-allowed}.properties-panel[data-v-f3dab8d1]{display:flex;flex-direction:column;height:100%;background:#fff}.panel-header[data-v-f3dab8d1]{padding:12px 16px;border-bottom:1px solid #e0e0e0}.panel-header h3[data-v-f3dab8d1]{font-size:14px;font-weight:500;color:#333;margin:0}.panel-content[data-v-f3dab8d1]{flex:1;overflow-y:auto;padding:16px}.section-title[data-v-f3dab8d1]{font-size:13px;font-weight:500;color:#666;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #f0f0f0}.form-group[data-v-f3dab8d1]{margin-bottom:16px}.form-label[data-v-f3dab8d1]{display:block;font-size:12px;color:#666;margin-bottom:6px}.form-input[data-v-f3dab8d1],.form-select[data-v-f3dab8d1]{width:100%;padding:6px 10px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px}.form-input[data-v-f3dab8d1]:focus,.form-select[data-v-f3dab8d1]:focus{outline:none;border-color:#1890ff}.content-input-wrapper[data-v-f3dab8d1]{display:flex;flex-direction:column;gap:8px}.content-textarea[data-v-f3dab8d1]{width:100%;padding:8px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px;resize:vertical}.content-textarea[data-v-f3dab8d1]:focus{outline:none;border-color:#1890ff}.insert-field-btn[data-v-f3dab8d1]{display:flex;align-items:center;gap:4px;padding:6px 12px;border:1px solid #d9d9d9;background:#fff;color:#666;border-radius:4px;font-size:12px;cursor:pointer;transition:all .3s}.insert-field-btn[data-v-f3dab8d1]:hover{border-color:#1890ff;color:#1890ff}.style-buttons[data-v-f3dab8d1]{display:flex;gap:8px}.style-btn[data-v-f3dab8d1]{width:32px;height:32px;border:1px solid #d9d9d9;background:#fff;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s}.style-btn[data-v-f3dab8d1]:hover{border-color:#1890ff}.style-btn.active[data-v-f3dab8d1]{background:#1890ff;border-color:#1890ff;color:#fff}.color-input[data-v-f3dab8d1]{width:100%;height:32px;border:1px solid #d9d9d9;border-radius:4px;cursor:pointer}.align-buttons[data-v-f3dab8d1]{display:flex;gap:8px}.align-btn[data-v-f3dab8d1]{flex:1;padding:6px 12px;border:1px solid #d9d9d9;background:#fff;border-radius:4px;font-size:12px;cursor:pointer;transition:all .3s}.align-btn[data-v-f3dab8d1]:hover{border-color:#1890ff}.align-btn.active[data-v-f3dab8d1]{background:#1890ff;border-color:#1890ff;color:#fff}.radio-group[data-v-f3dab8d1]{display:flex;gap:16px}.radio-label[data-v-f3dab8d1]{display:flex;align-items:center;gap:6px;font-size:13px;cursor:pointer}.image-upload-wrapper[data-v-f3dab8d1],.qrcode-upload-wrapper[data-v-f3dab8d1]{display:flex;flex-direction:column;gap:8px}.upload-btn[data-v-f3dab8d1]{width:100%;padding:10px 16px;border:2px solid #1890ff;background:#1890ff;color:#fff;border-radius:4px;font-size:14px;font-weight:500;cursor:pointer;transition:all .3s;display:flex;align-items:center;justify-content:center;gap:6px}.upload-btn[data-v-f3dab8d1]:hover{background:#40a9ff;border-color:#40a9ff;box-shadow:0 2px 8px #1890ff4d}.upload-btn[data-v-f3dab8d1]:active{background:#096dd9;border-color:#096dd9}.image-url-input[data-v-f3dab8d1],.qrcode-input[data-v-f3dab8d1]{width:100%;padding:6px 10px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px}.image-url-input[data-v-f3dab8d1]:focus,.qrcode-input[data-v-f3dab8d1]:focus{outline:none;border-color:#1890ff}.remove-btn[data-v-f3dab8d1]{padding:4px 12px;border:1px solid #ff4d4f;background:#fff;color:#ff4d4f;border-radius:4px;font-size:12px;cursor:pointer;transition:all .3s;align-self:flex-start}.remove-btn[data-v-f3dab8d1]:hover{background:#ff4d4f;color:#fff}.image-preview[data-v-f3dab8d1],.qrcode-preview[data-v-f3dab8d1]{margin-top:8px;padding:8px;border:1px solid #e0e0e0;border-radius:4px;background:#fafafa}.image-preview img[data-v-f3dab8d1],.qrcode-preview img[data-v-f3dab8d1]{max-width:100%;max-height:200px;display:block}.field-preview[data-v-f3dab8d1]{margin-top:8px;padding:6px 10px;background:#f0f7ff;border:1px solid #d6e4ff;border-radius:4px;font-size:12px;color:#1890ff}.form-row[data-v-f3dab8d1]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.field-data-panel[data-v-33e53b63]{display:flex;flex-direction:column;height:100%;background:#fff;border-top:1px solid #e0e0e0}.panel-header[data-v-33e53b63]{display:flex;justify-content:space-between;align-items:center;padding:12px 16px;border-bottom:1px solid #e0e0e0}.panel-header h3[data-v-33e53b63]{font-size:14px;font-weight:500;color:#333;margin:0}.reset-btn[data-v-33e53b63]{padding:4px 12px;border:1px solid #d9d9d9;background:#fff;border-radius:4px;font-size:12px;color:#666;cursor:pointer}.reset-btn[data-v-33e53b63]:hover{border-color:#1890ff;color:#1890ff}.panel-content[data-v-33e53b63]{flex:1;overflow-y:auto;padding:16px}.field-category[data-v-33e53b63]{margin-bottom:24px}.category-title[data-v-33e53b63]{font-size:13px;font-weight:500;color:#666;margin-bottom:12px;padding-bottom:8px;border-bottom:1px solid #f0f0f0}.fields-list[data-v-33e53b63]{display:flex;flex-direction:column;gap:16px}.field-item[data-v-33e53b63]{display:flex;flex-direction:column;gap:6px}.field-label[data-v-33e53b63]{font-size:13px;color:#333;font-weight:500}.field-input[data-v-33e53b63]{padding:6px 10px;border:1px solid #d9d9d9;border-radius:4px;font-size:13px}.field-input[data-v-33e53b63]:focus{outline:none;border-color:#1890ff}.field-hint[data-v-33e53b63]{font-size:11px;color:#999}.preview-overlay[data-v-2c0e9417]{position:fixed;top:0;left:0;right:0;bottom:0;background:#000000b3;display:flex;align-items:center;justify-content:center;z-index:2000}.preview-dialog[data-v-2c0e9417]{background:#fff;border-radius:8px;width:90%;max-width:1200px;max-height:90vh;display:flex;flex-direction:column;box-shadow:0 4px 20px #0000004d}.preview-header[data-v-2c0e9417]{display:flex;justify-content:space-between;align-items:center;padding:16px 20px;border-bottom:1px solid #e0e0e0}.preview-header h3[data-v-2c0e9417]{font-size:18px;font-weight:500;color:#333;margin:0}.close-btn[data-v-2c0e9417]{width:32px;height:32px;border:none;background:transparent;font-size:24px;color:#999;cursor:pointer;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:all .3s}.close-btn[data-v-2c0e9417]:hover{background:#f5f5f5;color:#333}.preview-content[data-v-2c0e9417]{flex:1;overflow:auto;padding:40px;display:flex;justify-content:center;align-items:flex-start;background:#f5f5f5}.preview-canvas-wrapper[data-v-2c0e9417]{display:flex;justify-content:center;align-items:flex-start}.preview-canvas[data-v-2c0e9417]{background:#fff;box-shadow:0 4px 12px #00000026;position:relative;padding:60px 50px}.preview-element[data-v-2c0e9417]{position:absolute}.preview-text-content[data-v-2c0e9417]{width:100%;height:100%;word-wrap:break-word;white-space:pre-wrap}.preview-image-element[data-v-2c0e9417],.preview-qrcode-element[data-v-2c0e9417]{width:100%;height:100%;overflow:hidden}.preview-element-image[data-v-2c0e9417]{width:100%;height:100%;object-fit:contain;display:block}.preview-qrcode-text[data-v-2c0e9417]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;background:#f5f5f5;border:1px solid #e0e0e0;font-size:12px;color:#666;word-break:break-all;padding:8px}.certificate-editor[data-v-22544f2c]{display:flex;flex-direction:column;width:100%;height:100%;background:#f5f5f5}.toolbar[data-v-22544f2c]{display:flex;align-items:center;gap:12px;padding:12px 20px;background:#fff;border-bottom:1px solid #e0e0e0;box-shadow:0 2px 4px #0000000d;flex-shrink:0}.toolbar-btn[data-v-22544f2c]{display:flex;align-items:center;gap:6px;padding:8px 16px;border:1px solid #d9d9d9;background:#fff;color:#333;border-radius:4px;cursor:pointer;font-size:14px;transition:all .3s}.toolbar-btn[data-v-22544f2c]:hover{border-color:#1890ff;color:#1890ff}.toolbar-btn.preview-btn[data-v-22544f2c]:hover{background:#e6f7ff;border-color:#1890ff}.toolbar-btn.save-btn[data-v-22544f2c]:hover{background:#f6ffed;border-color:#52c41a;color:#52c41a}.certificate-editor-content[data-v-22544f2c]{display:flex;flex:1;min-height:0;overflow:hidden}.left-panel[data-v-22544f2c]{width:280px;background:#fff;border-right:1px solid #e0e0e0;overflow-y:auto}.canvas-area[data-v-22544f2c]{flex:1;overflow:auto;display:flex;justify-content:center;align-items:flex-start;padding:20px}.right-panel[data-v-22544f2c]{width:350px;background:#fff;border-left:1px solid #e0e0e0;display:flex;flex-direction:column;overflow:hidden}.properties-section[data-v-22544f2c]{flex:1;overflow-y:auto;border-bottom:1px solid #e0e0e0}.field-data-section[data-v-22544f2c]{height:300px;overflow-y:auto}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif;overflow:hidden}#app{width:100vw;height:100vh}
@@ -1577,7 +1577,7 @@ const le = [
1577
1577
  }, null, 8, ["visible", "elements", "template", "field-data"])
1578
1578
  ]));
1579
1579
  }
1580
- }, Hl = /* @__PURE__ */ O(Rl, [["__scopeId", "data-v-b6b9b7fa"]]);
1580
+ }, Hl = /* @__PURE__ */ O(Rl, [["__scopeId", "data-v-22544f2c"]]);
1581
1581
  export {
1582
1582
  nt as CanvasArea,
1583
1583
  Hl as CertificateEditor,
@@ -1 +1 @@
1
- (function(N,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(N=typeof globalThis<"u"?globalThis:N||self,e(N.CertificateEditor={},N.Vue))})(this,function(N,e){"use strict";const q=[{id:"vertical-1",name:"竖版模板1",type:"vertical",width:972,height:1378,background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",description:"经典竖版证书模板"},{id:"vertical-2",name:"竖版模板2",type:"vertical",width:972,height:1378,background:"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)",description:"优雅竖版证书模板"},{id:"vertical-3",name:"竖版模板3",type:"vertical",width:972,height:1378,background:"linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)",description:"现代竖版证书模板"},{id:"horizontal-1",name:"横版模板1",type:"horizontal",width:1303,height:897,background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",description:"经典横版证书模板"},{id:"horizontal-2",name:"横版模板2",type:"horizontal",width:1303,height:897,background:"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)",description:"优雅横版证书模板"},{id:"horizontal-3",name:"横版模板3",type:"horizontal",width:1303,height:897,background:"linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)",description:"现代横版证书模板"}],P=d=>["image/jpeg","image/jpg","image/png"].includes(d.type)?d.size>2097152?{valid:!1,error:"图片大小不能超过 2MB"}:{valid:!0}:{valid:!1,error:"只支持 JPG、JPEG、PNG 格式的图片"},R=d=>new Promise((g,o)=>{const E=new FileReader;E.onload=()=>g(E.result),E.onerror=o,E.readAsDataURL(d)}),H=d=>d==="vertical"?{width:972,height:1378}:{width:1303,height:897},z=(d,g)=>{const o=d.__vccOpts||d;for(const[E,m]of g)o[E]=m;return o},ne={class:"design-panel"},ae={class:"panel-tabs"},ie={class:"panel-content"},se={key:0,class:"elements-section"},re={class:"elements-grid"},de={key:1,class:"templates-section"},ce={class:"upload-section"},me={class:"upload-hint"},pe={class:"template-type-switch"},ge={class:"templates-list"},fe=["onClick"],ue={class:"template-name"},Y=z({__name:"DesignPanel",emits:["add-element","select-template","upload-template"],setup(d,{emit:g}){const o=g,E=e.ref("elements"),m=e.ref("vertical"),f=e.ref(null),h=e.computed(()=>q.filter(k=>k.type===m.value)),B=k=>{o("select-template",k)},C=()=>{var k;(k=f.value)==null||k.click()},V=async k=>{var i;const l=(i=k.target.files)==null?void 0:i[0];if(!l)return;const r=P(l);if(!r.valid){alert(r.error);return}try{const n=await R(l),p=H(m.value),$={id:`custom-${Date.now()}`,name:"自定义模板",type:m.value,width:p.width,height:p.height,background:n,description:"自定义上传的模板"};o("upload-template",$)}catch(n){alert("上传失败,请重试"),console.error(n)}f.value&&(f.value.value="")};return(k,l)=>(e.openBlock(),e.createElementBlock("div",ne,[e.createElementVNode("div",ae,[e.createElementVNode("div",{class:e.normalizeClass(["tab-item",{active:E.value==="elements"}]),onClick:l[0]||(l[0]=r=>E.value="elements")}," 设计元素 ",2),e.createElementVNode("div",{class:e.normalizeClass(["tab-item",{active:E.value==="templates"}]),onClick:l[1]||(l[1]=r=>E.value="templates")}," 底图模板 ",2)]),e.createElementVNode("div",ie,[E.value==="elements"?(e.openBlock(),e.createElementBlock("div",se,[e.createElementVNode("div",re,[e.createElementVNode("div",{class:"element-item",onClick:l[2]||(l[2]=r=>k.$emit("add-element","text"))},[...l[8]||(l[8]=[e.createElementVNode("div",{class:"element-icon"},"📝",-1),e.createElementVNode("div",{class:"element-label"},"短文本",-1)])]),e.createElementVNode("div",{class:"element-item",onClick:l[3]||(l[3]=r=>k.$emit("add-element","longtext"))},[...l[9]||(l[9]=[e.createElementVNode("div",{class:"element-icon"},"📄",-1),e.createElementVNode("div",{class:"element-label"},"长文本",-1)])]),e.createElementVNode("div",{class:"element-item",onClick:l[4]||(l[4]=r=>k.$emit("add-element","image"))},[...l[10]||(l[10]=[e.createElementVNode("div",{class:"element-icon"},"🖼️",-1),e.createElementVNode("div",{class:"element-label"},"图片",-1)])]),e.createElementVNode("div",{class:"element-item",onClick:l[5]||(l[5]=r=>k.$emit("add-element","qrcode"))},[...l[11]||(l[11]=[e.createElementVNode("div",{class:"element-icon"},"🔲",-1),e.createElementVNode("div",{class:"element-label"},"二维码",-1)])])])])):e.createCommentVNode("",!0),E.value==="templates"?(e.openBlock(),e.createElementBlock("div",de,[e.createElementVNode("div",ce,[e.createElementVNode("input",{ref_key:"fileInputRef",ref:f,type:"file",accept:"image/jpeg,image/jpg,image/png",onChange:V,style:{display:"none"}},null,544),e.createElementVNode("button",{class:"upload-btn",onClick:C},[...l[12]||(l[12]=[e.createElementVNode("span",null,"📁",-1),e.createElementVNode("span",null,"上传模板",-1)])]),e.createElementVNode("div",me,[l[13]||(l[13]=e.createTextVNode(" 支持:jpg、jpeg、png 小于2M",-1)),l[14]||(l[14]=e.createElementVNode("br",null,null,-1)),e.createTextVNode(" 建议尺寸:"+e.toDisplayString(m.value==="vertical"?"972 x 1378":"1303 x 897"),1)])]),e.createElementVNode("div",pe,[e.createElementVNode("button",{class:e.normalizeClass(["switch-btn",{active:m.value==="vertical"}]),onClick:l[6]||(l[6]=r=>m.value="vertical")}," 竖版 ",2),e.createElementVNode("button",{class:e.normalizeClass(["switch-btn",{active:m.value==="horizontal"}]),onClick:l[7]||(l[7]=r=>m.value="horizontal")}," 横版 ",2)]),e.createElementVNode("div",ge,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:"template-item",onClick:i=>B(r)},[e.createElementVNode("div",{class:"template-preview",style:e.normalizeStyle({background:r.background})},null,4),e.createElementVNode("div",ue,e.toDisplayString(r.name),1)],8,fe))),128))])])):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-b694f9ff"]]),D=[{key:"name",label:"姓名",placeholder:"{{姓名}}",category:"基本信息",description:"证书持有人的姓名"},{key:"gender",label:"性别称呼",placeholder:"{{性别称呼}}",category:"基本信息",description:"先生/女士"},{key:"examName",label:"考试名称",placeholder:"{{考试名称}}",category:"考试信息",description:"参加的考试名称"},{key:"score",label:"成绩",placeholder:"{{成绩}}",category:"考试信息",description:"考试成绩"},{key:"scoreLevel",label:"成绩等级",placeholder:"{{成绩等级}}",category:"考试信息",description:"成绩等级(如:优秀、良好、合格等)"},{key:"certificateNumber",label:"证书编号",placeholder:"{{证书编号}}",category:"证书信息",description:"证书的唯一编号"},{key:"validityPeriod",label:"有效期",placeholder:"{{有效期}}",category:"证书信息",description:"证书的有效期限"},{key:"issueDate",label:"颁发日期",placeholder:"{{颁发日期}}",category:"证书信息",description:"证书颁发的日期"},{key:"organization",label:"颁发机构",placeholder:"{{颁发机构}}",category:"证书信息",description:"颁发证书的机构名称"},{key:"idNumber",label:"身份证号",placeholder:"{{身份证号}}",category:"基本信息",description:"身份证号码"},{key:"phone",label:"联系电话",placeholder:"{{联系电话}}",category:"基本信息",description:"联系电话"},{key:"email",label:"电子邮箱",placeholder:"{{电子邮箱}}",category:"基本信息",description:"电子邮箱地址"},{key:"account",label:"账号",placeholder:"{{账号}}",category:"基本信息",description:"用户账号"},{key:"examScore",label:"考试得分",placeholder:"{{考试得分}}",category:"考试信息",description:"考试得分"},{key:"issueDateMonth",label:"颁证时间(月)",placeholder:"{{颁证时间(月)}}",category:"证书信息",description:"证书颁发的月份"},{key:"issueDateDay",label:"颁证时间(日)",placeholder:"{{颁证时间(日)}}",category:"证书信息",description:"证书颁发的日期"}],O=D.reduce((d,g)=>(d[g.category]||(d[g.category]=[]),d[g.category].push(g),d),{}),W=d=>D.find(g=>g.key===d),Ee=d=>{const g=W(d);return g?g.placeholder:`{{${d}}}`},ye=(d,g={})=>{if(!d)return"";let o=d;return D.forEach(E=>{const m=E.placeholder,f=g[E.key]||E.placeholder,h=new RegExp(m.replace(/[{}]/g,"\\$&"),"g");o=o.replace(h,f)}),o},ke=d=>{if(!d)return[];const g=[];return D.forEach(o=>{d.includes(o.placeholder)&&g.push(o)}),g},he=d=>d?D.some(g=>d.includes(g.placeholder)):!1,Q={name:"张三",gender:"先生",examName:"计算机应用能力考试",score:"95",scoreLevel:"优秀",certificateNumber:"CERT-2024-001234",validityPeriod:"2024-01-01 至 2027-01-01",issueDate:"2024-01-01",organization:"考试认证中心",idNumber:"110101199001011234",phone:"13800138000",email:"zhangsan@example.com",account:"user001",examScore:"95",issueDateMonth:"01",issueDateDay:"01"},be={class:"canvas-area"},Ve={key:0,class:"certificate-border"},Ne=["onClick","onMousedown"],we={key:0,class:"text-content"},xe=["innerHTML"],Be={key:1,class:"image-element"},Ce=["src"],$e={key:1,class:"image-placeholder"},Se={key:2,class:"qrcode-element"},De=["src"],_e={key:1,class:"qrcode-content"},Fe={class:"qrcode-info"},ve={key:2,class:"qrcode-placeholder"},Me={key:3,class:"resize-handles"},Te=["onMousedown"],Ue=["onMousedown"],ze=["onMousedown"],Le=["onMousedown"],Ie=["onClick"],K=z({__name:"CanvasArea",props:{elements:{type:Array,default:()=>[]},selectedElement:{type:Object,default:null},fieldData:{type:Object,default:()=>({})},template:{type:Object,default:null}},emits:["select-element","update-element","delete-element"],setup(d,{emit:g}){const o=d,E=g,m=a=>{if(!a)return"";const y=o.fieldData||{};let c=a;return D.forEach(x=>{const S=x.placeholder,_=y[x.key]||S;if(y[x.key]){const w=new RegExp(S.replace(/[{}]/g,"\\$&"),"g");c=c.replace(w,`<span class="field-value">${_}</span>`)}else{const w=new RegExp(S.replace(/[{}]/g,"\\$&"),"g");c=c.replace(w,`<span class="field-placeholder-highlight">${S}</span>`)}}),c},f=a=>{if(!a)return null;if(a.imageSource==="field"){const y=a.imageField;return y&&o.fieldData&&o.fieldData[y]?o.fieldData[y]:null}else return a.imageUrl||null},h=a=>{if(!a)return null;if(a.qrcodeSource==="field"){const y=a.qrcodeField;return y&&o.fieldData&&o.fieldData[y]?o.fieldData[y]:null}else return a.qrcodeContent||null},B=a=>{if(!a)return!1;if(a.startsWith("data:image/"))return!0;if(a.startsWith("http://")||a.startsWith("https://")){const y=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"],c=a.toLowerCase();return y.some(x=>c.includes(x))}return!1},C=()=>{const a={};return o.template?(a.width=`${o.template.width}px`,a.minHeight=`${o.template.height}px`):(a.width="800px",a.minHeight="1000px"),o.template&&o.template.background&&(o.template.background.startsWith("data:")||o.template.background.startsWith("http")?(a.backgroundImage=`url(${o.template.background})`,a.backgroundSize="100% 100%",a.backgroundPosition="center",a.backgroundRepeat="no-repeat"):(a.background=o.template.background,a.backgroundSize="100% 100%",a.backgroundPosition="center",a.backgroundRepeat="no-repeat")),a},V=e.ref(null),k=e.ref(!1),l=e.ref(!1),r=e.ref({x:0,y:0}),i=e.ref({x:0,y:0,width:0,height:0}),n=e.ref(null),p=e.ref(""),$=a=>{var c,x,S,_,w,L,I,A;const y={position:"absolute",left:`${a.x}px`,top:`${a.y}px`,width:`${a.width}px`,minHeight:`${a.height}px`};return a.type==="text"||a.type==="longtext"?{...y,fontSize:`${((c=a.style)==null?void 0:c.fontSize)||18}px`,fontFamily:((x=a.style)==null?void 0:x.fontFamily)||"方正书宋简体",fontWeight:((S=a.style)==null?void 0:S.fontWeight)||"normal",fontStyle:((_=a.style)==null?void 0:_.fontStyle)||"normal",textDecoration:((w=a.style)==null?void 0:w.textDecoration)||"none",color:((L=a.style)==null?void 0:L.color)||"#000000",textAlign:((I=a.style)==null?void 0:I.textAlign)||"left",lineHeight:((A=a.style)==null?void 0:A.lineHeight)||1.2}:y},F=(a,y)=>{a.target.closest(".handle")||a.target.closest(".delete-btn")||(k.value=!0,n.value=y,r.value={x:a.clientX-y.x,y:a.clientY-y.y},document.addEventListener("mousemove",M),document.addEventListener("mouseup",b))},M=a=>{if(k.value&&n.value){const y=a.clientX-r.value.x,c=a.clientY-r.value.y,x={...n.value,x:Math.max(0,y),y:Math.max(0,c)};E("update-element",x)}else if(l.value&&n.value){const y=a.clientX-i.value.x,c=a.clientY-i.value.y;let x=i.value.width,S=i.value.height,_=n.value.x,w=n.value.y;p.value.includes("e")&&(x=Math.max(50,i.value.width+y)),p.value.includes("w")&&(x=Math.max(50,i.value.width-y),_=n.value.x+(i.value.width-x)),p.value.includes("s")&&(S=Math.max(30,i.value.height+c)),p.value.includes("n")&&(S=Math.max(30,i.value.height-c),w=n.value.y+(i.value.height-S));const L={...n.value,x:_,y:w,width:x,height:S};E("update-element",L)}},b=()=>{k.value=!1,l.value=!1,n.value=null,p.value="",document.removeEventListener("mousemove",M),document.removeEventListener("mouseup",b)},T=(a,y,c)=>{a.stopPropagation(),l.value=!0,n.value=y,p.value=c,i.value={x:a.clientX,y:a.clientY,width:y.width,height:y.height},document.addEventListener("mousemove",M),document.addEventListener("mouseup",b)};return e.onUnmounted(()=>{document.removeEventListener("mousemove",M),document.removeEventListener("mouseup",b)}),(a,y)=>(e.openBlock(),e.createElementBlock("div",be,[e.createElementVNode("div",{class:"certificate-canvas",ref_key:"canvasRef",ref:V,style:e.normalizeStyle(C())},[!o.template||!o.template.background?(e.openBlock(),e.createElementBlock("div",Ve)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.elements,c=>{var x,S,_;return e.openBlock(),e.createElementBlock("div",{key:c.id,class:e.normalizeClass(["editable-element",c.type,{selected:((x=d.selectedElement)==null?void 0:x.id)===c.id}]),style:e.normalizeStyle($(c)),onClick:e.withModifiers(w=>a.$emit("select-element",c),["stop"]),onMousedown:w=>F(w,c)},[c.type==="text"||c.type==="longtext"?(e.openBlock(),e.createElementBlock("div",we,[e.createElementVNode("span",{innerHTML:m(c.content)},null,8,xe)])):c.type==="image"?(e.openBlock(),e.createElementBlock("div",Be,[f(c)?(e.openBlock(),e.createElementBlock("img",{key:0,src:f(c),alt:"图片",class:"element-image"},null,8,Ce)):(e.openBlock(),e.createElementBlock("div",$e,[...y[0]||(y[0]=[e.createElementVNode("span",null,"🖼️ 请设置图片",-1)])]))])):c.type==="qrcode"?(e.openBlock(),e.createElementBlock("div",Se,[h(c)&&B(h(c))?(e.openBlock(),e.createElementBlock("img",{key:0,src:h(c),alt:"二维码",class:"element-image"},null,8,De)):h(c)?(e.openBlock(),e.createElementBlock("div",_e,[y[1]||(y[1]=e.createElementVNode("div",{class:"qrcode-placeholder-text"},"二维码",-1)),e.createElementVNode("div",Fe,e.toDisplayString(h(c)),1)])):(e.openBlock(),e.createElementBlock("div",ve,[...y[2]||(y[2]=[e.createElementVNode("span",null,"🔲 请设置二维码",-1)])]))])):e.createCommentVNode("",!0),((S=d.selectedElement)==null?void 0:S.id)===c.id?(e.openBlock(),e.createElementBlock("div",Me,[e.createElementVNode("div",{class:"handle handle-nw",onMousedown:e.withModifiers(w=>T(w,c,"nw"),["stop"])},null,40,Te),e.createElementVNode("div",{class:"handle handle-ne",onMousedown:e.withModifiers(w=>T(w,c,"ne"),["stop"])},null,40,Ue),e.createElementVNode("div",{class:"handle handle-sw",onMousedown:e.withModifiers(w=>T(w,c,"sw"),["stop"])},null,40,ze),e.createElementVNode("div",{class:"handle handle-se",onMousedown:e.withModifiers(w=>T(w,c,"se"),["stop"])},null,40,Le)])):e.createCommentVNode("",!0),((_=d.selectedElement)==null?void 0:_.id)===c.id?(e.openBlock(),e.createElementBlock("button",{key:4,class:"delete-btn",onClick:e.withModifiers(w=>a.$emit("delete-element",c.id),["stop"])}," × ",8,Ie)):e.createCommentVNode("",!0)],46,Ne)}),128))],4)]))}},[["__scopeId","data-v-ac0f08fc"]]),qe={class:"field-dialog"},Pe={class:"dialog-content"},Re={class:"search-box"},Ae={class:"table-container"},We={class:"fields-table"},je={class:"field-name"},He={class:"field-action"},Ye=["onClick"],Oe={key:0,class:"pagination"},Qe=["disabled"],Ke=["onClick"],Xe=["disabled"],j=10,X=z({__name:"FieldDialog",props:{visible:{type:Boolean,default:!1},currentText:{type:String,default:""},selectionStart:{type:Number,default:0},selectionEnd:{type:Number,default:0}},emits:["close","insert"],setup(d,{emit:g}){const o=g,E=e.ref(""),m=e.ref(1),f=e.computed(()=>{if(!E.value.trim())return D;const r=E.value.toLowerCase();return D.filter(i=>i.label.toLowerCase().includes(r)||i.key.toLowerCase().includes(r)||i.description.toLowerCase().includes(r))}),h=e.computed(()=>Math.ceil(f.value.length/j)),B=e.computed(()=>{const r=(m.value-1)*j,i=r+j;return f.value.slice(r,i)}),C=()=>{m.value=1},V=r=>{r>=1&&r<=h.value&&(m.value=r)},k=r=>{o("insert",[r])},l=()=>{E.value="",m.value=1,o("close")};return(r,i)=>d.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"field-dialog-overlay",onClick:e.withModifiers(l,["self"])},[e.createElementVNode("div",qe,[e.createElementVNode("div",{class:"dialog-header"},[i[3]||(i[3]=e.createElementVNode("h3",null,"选择字段",-1)),e.createElementVNode("button",{class:"close-btn",onClick:l},"×")]),e.createElementVNode("div",Pe,[e.createElementVNode("div",Re,[e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":i[0]||(i[0]=n=>E.value=n),placeholder:"搜索字段...",class:"search-input",onInput:C},null,544),[[e.vModelText,E.value]])]),e.createElementVNode("div",Ae,[e.createElementVNode("table",We,[i[4]||(i[4]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",null,"系统字段"),e.createElementVNode("th",null,"操作")])],-1)),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(B.value,n=>(e.openBlock(),e.createElementBlock("tr",{key:n.key,class:"field-row"},[e.createElementVNode("td",je,e.toDisplayString(n.label),1),e.createElementVNode("td",He,[e.createElementVNode("button",{class:"select-btn",onClick:p=>k(n)}," 选择 ",8,Ye)])]))),128))])])]),h.value>1?(e.openBlock(),e.createElementBlock("div",Oe,[e.createElementVNode("button",{class:"page-btn",disabled:m.value===1,onClick:i[1]||(i[1]=n=>V(m.value-1))}," < ",8,Qe),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,n=>(e.openBlock(),e.createElementBlock("button",{key:n,class:e.normalizeClass(["page-btn",{active:n===m.value}]),onClick:p=>V(n)},e.toDisplayString(n),11,Ke))),128)),e.createElementVNode("button",{class:"page-btn",disabled:m.value===h.value,onClick:i[2]||(i[2]=n=>V(m.value+1))}," > ",8,Xe)])):e.createCommentVNode("",!0)])])])):e.createCommentVNode("",!0)}},[["__scopeId","data-v-6745c3ca"]]),Ge={class:"properties-panel"},Je={class:"panel-content"},Ze={key:0,class:"content-section"},et={class:"form-group"},tt={class:"content-input-wrapper"},lt=["rows"],ot={key:1,class:"style-section"},nt={class:"form-group"},at={class:"form-group"},it={class:"form-group"},st={class:"style-buttons"},rt={class:"form-group"},dt={class:"form-group"},ct={class:"align-buttons"},mt={class:"form-group"},pt={key:2,class:"image-section"},gt={class:"form-group"},ft={class:"radio-group"},ut={class:"radio-label"},Et={class:"radio-label"},yt={key:0,class:"form-group"},kt={class:"image-upload-wrapper"},ht={key:0,class:"image-preview"},bt=["src"],Vt={key:1,class:"form-group"},Nt=["value"],wt={key:0,class:"field-preview"},xt={key:3,class:"qrcode-section"},Bt={class:"form-group"},Ct={class:"radio-group"},$t={class:"radio-label"},St={class:"radio-label"},Dt={key:0,class:"form-group"},_t={class:"qrcode-upload-wrapper"},Ft={key:0,class:"qrcode-preview"},vt=["src"],Mt={key:1,class:"form-group"},Tt=["value"],Ut={key:0,class:"field-preview"},zt={class:"position-section"},Lt={class:"form-row"},It={class:"form-group"},qt={class:"form-group"},Pt={class:"form-row"},Rt={class:"form-group"},At={class:"form-group"},G=z({__name:"PropertiesPanel",props:{element:{type:Object,required:!0}},emits:["update-element"],setup(d,{emit:g}){const o=d,E=g,m=e.ref(""),f=e.ref({}),h=e.ref("url"),B=e.ref(""),C=e.ref(""),V=e.ref("url"),k=e.ref(""),l=e.ref(""),r=e.ref(!1),i=e.ref(0),n=e.ref(0),p=e.ref(null),$=e.ref(null),F=e.ref(null),M=()=>{m.value=o.element.content||"",f.value={...o.element.style},o.element.type==="image"&&(h.value=o.element.imageSource||"url",B.value=o.element.imageUrl||"",C.value=o.element.imageField||""),o.element.type==="qrcode"&&(V.value=o.element.qrcodeSource||"url",k.value=o.element.qrcodeContent||"",l.value=o.element.qrcodeField||"")};e.watch(()=>o.element,M,{immediate:!0,deep:!0});const b=()=>{const u={...o.element};(o.element.type==="text"||o.element.type==="longtext")&&(u.content=m.value,u.style={...f.value}),o.element.type==="image"&&(u.imageSource=h.value,u.imageUrl=B.value,u.imageField=C.value),o.element.type==="qrcode"&&(u.qrcodeSource=V.value,u.qrcodeContent=k.value,u.qrcodeField=l.value),E("update-element",u)},T=()=>{b()},a=u=>{i.value=u.target.selectionStart,n.value=u.target.selectionEnd},y=u=>{if(u.length>0){const t=u[0],s=p.value;if(s){const v=i.value,U=n.value,le=m.value,gl=le.substring(0,v)+t.placeholder+le.substring(U);m.value=gl,setTimeout(()=>{const oe=v+t.placeholder.length;s.setSelectionRange(oe,oe),s.focus()},0),b()}}},c=(u,t,s)=>{f.value[u]=f.value[u]===t?s:t,b()},x=u=>{f.value.textAlign=u,b()},S=()=>{b()},_=()=>{var u;(u=$.value)==null||u.click()},w=async u=>{var v;const t=(v=u.target.files)==null?void 0:v[0];if(!t)return;const s=P(t);if(!s.valid){alert(s.error);return}try{const U=await R(t);B.value=U,h.value="url",b()}catch(U){alert("上传失败,请重试"),console.error(U)}$.value&&($.value.value="")},L=()=>{B.value="",b()},I=()=>{b()},A=()=>{var u;(u=F.value)==null||u.click()},cl=async u=>{var v;const t=(v=u.target.files)==null?void 0:v[0];if(!t)return;const s=P(t);if(!s.valid){alert(s.error);return}try{const U=await R(t);k.value=U,V.value="url",b()}catch(U){alert("上传失败,请重试"),console.error(U)}F.value&&(F.value.value="")},ml=()=>{k.value="",b()},te=u=>{const t=W(u);return t?t.label:u},pl=u=>{if(!u)return!1;if(u.startsWith("data:image/"))return!0;if(u.startsWith("http://")||u.startsWith("https://")){const t=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"],s=u.toLowerCase();return t.some(v=>s.includes(v))}return!1};return(u,t)=>(e.openBlock(),e.createElementBlock("div",Ge,[t[60]||(t[60]=e.createElementVNode("div",{class:"panel-header"},[e.createElementVNode("h3",null,"属性设置")],-1)),e.createElementVNode("div",Je,[d.element.type==="text"||d.element.type==="longtext"?(e.openBlock(),e.createElementBlock("div",Ze,[e.createElementVNode("div",et,[t[26]||(t[26]=e.createElementVNode("label",{class:"form-label"},"内容",-1)),e.createElementVNode("div",tt,[e.withDirectives(e.createElementVNode("textarea",{ref_key:"contentTextareaRef",ref:p,"onUpdate:modelValue":t[0]||(t[0]=s=>m.value=s),onInput:T,onFocus:a,rows:d.element.type==="longtext"?6:3,class:"content-textarea"},null,40,lt),[[e.vModelText,m.value]]),e.createElementVNode("button",{class:"insert-field-btn",onClick:t[1]||(t[1]=s=>r.value=!0)},[...t[25]||(t[25]=[e.createElementVNode("span",null,"+",-1),e.createElementVNode("span",null,"在内容中关联系统字段",-1)])])])])])):e.createCommentVNode("",!0),d.element.type==="text"||d.element.type==="longtext"?(e.openBlock(),e.createElementBlock("div",ot,[t[38]||(t[38]=e.createElementVNode("div",{class:"section-title"},"文本样式",-1)),e.createElementVNode("div",nt,[t[28]||(t[28]=e.createElementVNode("label",{class:"form-label"},"字体大小",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[2]||(t[2]=s=>f.value.fontSize=s),onChange:b,class:"form-select"},[...t[27]||(t[27]=[e.createElementVNode("option",{value:12},"12px",-1),e.createElementVNode("option",{value:14},"14px",-1),e.createElementVNode("option",{value:16},"16px",-1),e.createElementVNode("option",{value:18},"18px",-1),e.createElementVNode("option",{value:20},"20px",-1),e.createElementVNode("option",{value:24},"24px",-1),e.createElementVNode("option",{value:28},"28px",-1),e.createElementVNode("option",{value:32},"32px",-1),e.createElementVNode("option",{value:36},"36px",-1),e.createElementVNode("option",{value:48},"48px",-1)])],544),[[e.vModelSelect,f.value.fontSize,void 0,{number:!0}]])]),e.createElementVNode("div",at,[t[30]||(t[30]=e.createElementVNode("label",{class:"form-label"},"字体",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[3]||(t[3]=s=>f.value.fontFamily=s),onChange:b,class:"form-select"},[...t[29]||(t[29]=[e.createStaticVNode('<option value="方正书宋简体" data-v-f3dab8d1>方正书宋简体</option><option value="微软雅黑" data-v-f3dab8d1>微软雅黑</option><option value="宋体" data-v-f3dab8d1>宋体</option><option value="黑体" data-v-f3dab8d1>黑体</option><option value="Arial" data-v-f3dab8d1>Arial</option>',5)])],544),[[e.vModelSelect,f.value.fontFamily]])]),e.createElementVNode("div",it,[t[34]||(t[34]=e.createElementVNode("label",{class:"form-label"},"文字样式",-1)),e.createElementVNode("div",st,[e.createElementVNode("button",{class:e.normalizeClass(["style-btn",{active:f.value.fontWeight==="bold"}]),onClick:t[4]||(t[4]=s=>c("fontWeight","bold","normal"))},[...t[31]||(t[31]=[e.createElementVNode("strong",null,"B",-1)])],2),e.createElementVNode("button",{class:e.normalizeClass(["style-btn",{active:f.value.fontStyle==="italic"}]),onClick:t[5]||(t[5]=s=>c("fontStyle","italic","normal"))},[...t[32]||(t[32]=[e.createElementVNode("em",null,"I",-1)])],2),e.createElementVNode("button",{class:e.normalizeClass(["style-btn",{active:f.value.textDecoration==="underline"}]),onClick:t[6]||(t[6]=s=>c("textDecoration","underline","none"))},[...t[33]||(t[33]=[e.createElementVNode("u",null,"U",-1)])],2)])]),e.createElementVNode("div",rt,[t[35]||(t[35]=e.createElementVNode("label",{class:"form-label"},"颜色",-1)),e.withDirectives(e.createElementVNode("input",{type:"color","onUpdate:modelValue":t[7]||(t[7]=s=>f.value.color=s),onChange:b,class:"color-input"},null,544),[[e.vModelText,f.value.color]])]),e.createElementVNode("div",dt,[t[36]||(t[36]=e.createElementVNode("label",{class:"form-label"},"对齐方式",-1)),e.createElementVNode("div",ct,[e.createElementVNode("button",{class:e.normalizeClass(["align-btn",{active:f.value.textAlign==="left"}]),onClick:t[8]||(t[8]=s=>x("left"))}," 左对齐 ",2),e.createElementVNode("button",{class:e.normalizeClass(["align-btn",{active:f.value.textAlign==="center"}]),onClick:t[9]||(t[9]=s=>x("center"))}," 居中 ",2),e.createElementVNode("button",{class:e.normalizeClass(["align-btn",{active:f.value.textAlign==="right"}]),onClick:t[10]||(t[10]=s=>x("right"))}," 右对齐 ",2)])]),e.createElementVNode("div",mt,[t[37]||(t[37]=e.createElementVNode("label",{class:"form-label"},"行高",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[11]||(t[11]=s=>f.value.lineHeight=s),onInput:b,step:"0.1",min:"0.5",max:"3",class:"form-input"},null,544),[[e.vModelText,f.value.lineHeight,void 0,{number:!0}]])])])):e.createCommentVNode("",!0),d.element.type==="image"?(e.openBlock(),e.createElementBlock("div",pt,[t[46]||(t[46]=e.createElementVNode("div",{class:"section-title"},"图片设置",-1)),e.createElementVNode("div",gt,[t[41]||(t[41]=e.createElementVNode("label",{class:"form-label"},"图片来源",-1)),e.createElementVNode("div",ft,[e.createElementVNode("label",ut,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"url","onUpdate:modelValue":t[12]||(t[12]=s=>h.value=s),onChange:S},null,544),[[e.vModelRadio,h.value]]),t[39]||(t[39]=e.createElementVNode("span",null,"URL",-1))]),e.createElementVNode("label",Et,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"field","onUpdate:modelValue":t[13]||(t[13]=s=>h.value=s),onChange:S},null,544),[[e.vModelRadio,h.value]]),t[40]||(t[40]=e.createElementVNode("span",null,"关联字段",-1))])])]),h.value==="url"?(e.openBlock(),e.createElementBlock("div",yt,[t[43]||(t[43]=e.createElementVNode("label",{class:"form-label"},"图片URL",-1)),e.createElementVNode("div",kt,[e.createElementVNode("input",{ref_key:"imageFileInputRef",ref:$,type:"file",accept:"image/jpeg,image/jpg,image/png",onChange:w,style:{display:"none"}},null,544),e.createElementVNode("button",{class:"upload-btn",onClick:_},[...t[42]||(t[42]=[e.createElementVNode("span",null,"📁",-1),e.createElementVNode("span",null,"本地上传",-1)])]),e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":t[14]||(t[14]=s=>B.value=s),onInput:b,placeholder:"请输入图片URL",class:"image-url-input"},null,544),[[e.vModelText,B.value]]),B.value?(e.openBlock(),e.createElementBlock("button",{key:0,class:"remove-btn",onClick:L},"移除")):e.createCommentVNode("",!0)]),B.value?(e.openBlock(),e.createElementBlock("div",ht,[e.createElementVNode("img",{src:B.value,alt:"预览"},null,8,bt)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),h.value==="field"?(e.openBlock(),e.createElementBlock("div",Vt,[t[45]||(t[45]=e.createElementVNode("label",{class:"form-label"},"关联字段",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[15]||(t[15]=s=>C.value=s),onChange:b,class:"form-select"},[t[44]||(t[44]=e.createElementVNode("option",{value:""},"请选择字段",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(D),s=>(e.openBlock(),e.createElementBlock("option",{key:s.key,value:s.key},e.toDisplayString(s.label)+" ("+e.toDisplayString(s.placeholder)+") ",9,Nt))),128))],544),[[e.vModelSelect,C.value]]),C.value?(e.openBlock(),e.createElementBlock("div",wt," 字段: "+e.toDisplayString(te(C.value)),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),d.element.type==="qrcode"?(e.openBlock(),e.createElementBlock("div",xt,[t[54]||(t[54]=e.createElementVNode("div",{class:"section-title"},"二维码设置",-1)),e.createElementVNode("div",Bt,[t[49]||(t[49]=e.createElementVNode("label",{class:"form-label"},"二维码来源",-1)),e.createElementVNode("div",Ct,[e.createElementVNode("label",$t,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"url","onUpdate:modelValue":t[16]||(t[16]=s=>V.value=s),onChange:I},null,544),[[e.vModelRadio,V.value]]),t[47]||(t[47]=e.createElementVNode("span",null,"URL/内容",-1))]),e.createElementVNode("label",St,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"field","onUpdate:modelValue":t[17]||(t[17]=s=>V.value=s),onChange:I},null,544),[[e.vModelRadio,V.value]]),t[48]||(t[48]=e.createElementVNode("span",null,"关联字段",-1))])])]),V.value==="url"?(e.openBlock(),e.createElementBlock("div",Dt,[t[51]||(t[51]=e.createElementVNode("label",{class:"form-label"},"二维码内容/图片URL",-1)),e.createElementVNode("div",_t,[e.createElementVNode("input",{ref_key:"qrcodeFileInputRef",ref:F,type:"file",accept:"image/jpeg,image/jpg,image/png",onChange:cl,style:{display:"none"}},null,544),e.createElementVNode("button",{class:"upload-btn",onClick:A},[...t[50]||(t[50]=[e.createElementVNode("span",null,"📁",-1),e.createElementVNode("span",null,"本地上传",-1)])]),e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":t[18]||(t[18]=s=>k.value=s),onInput:b,placeholder:"请输入二维码内容或图片URL",class:"qrcode-input"},null,544),[[e.vModelText,k.value]]),k.value?(e.openBlock(),e.createElementBlock("button",{key:0,class:"remove-btn",onClick:ml},"移除")):e.createCommentVNode("",!0)]),k.value&&pl(k.value)?(e.openBlock(),e.createElementBlock("div",Ft,[e.createElementVNode("img",{src:k.value,alt:"预览"},null,8,vt)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),V.value==="field"?(e.openBlock(),e.createElementBlock("div",Mt,[t[53]||(t[53]=e.createElementVNode("label",{class:"form-label"},"关联字段",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[19]||(t[19]=s=>l.value=s),onChange:b,class:"form-select"},[t[52]||(t[52]=e.createElementVNode("option",{value:""},"请选择字段",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(D),s=>(e.openBlock(),e.createElementBlock("option",{key:s.key,value:s.key},e.toDisplayString(s.label)+" ("+e.toDisplayString(s.placeholder)+") ",9,Tt))),128))],544),[[e.vModelSelect,l.value]]),l.value?(e.openBlock(),e.createElementBlock("div",Ut," 字段: "+e.toDisplayString(te(l.value)),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",zt,[t[59]||(t[59]=e.createElementVNode("div",{class:"section-title"},"位置和尺寸",-1)),e.createElementVNode("div",Lt,[e.createElementVNode("div",It,[t[55]||(t[55]=e.createElementVNode("label",{class:"form-label"},"X",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[20]||(t[20]=s=>d.element.x=s),onInput:b,class:"form-input"},null,544),[[e.vModelText,d.element.x,void 0,{number:!0}]])]),e.createElementVNode("div",qt,[t[56]||(t[56]=e.createElementVNode("label",{class:"form-label"},"Y",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[21]||(t[21]=s=>d.element.y=s),onInput:b,class:"form-input"},null,544),[[e.vModelText,d.element.y,void 0,{number:!0}]])])]),e.createElementVNode("div",Pt,[e.createElementVNode("div",Rt,[t[57]||(t[57]=e.createElementVNode("label",{class:"form-label"},"宽度",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[22]||(t[22]=s=>d.element.width=s),onInput:b,class:"form-input"},null,544),[[e.vModelText,d.element.width,void 0,{number:!0}]])]),e.createElementVNode("div",At,[t[58]||(t[58]=e.createElementVNode("label",{class:"form-label"},"高度",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[23]||(t[23]=s=>d.element.height=s),onInput:b,class:"form-input"},null,544),[[e.vModelText,d.element.height,void 0,{number:!0}]])])])])]),e.createVNode(X,{visible:r.value,"current-text":m.value,"selection-start":i.value,"selection-end":n.value,onClose:t[24]||(t[24]=s=>r.value=!1),onInsert:y},null,8,["visible","current-text","selection-start","selection-end"])]))}},[["__scopeId","data-v-f3dab8d1"]]),Wt={class:"field-data-panel"},jt={class:"panel-content"},Ht={class:"category-title"},Yt={class:"fields-list"},Ot={class:"field-label"},Qt=["onUpdate:modelValue","placeholder"],Kt={class:"field-hint"},J=z({__name:"FieldDataPanel",props:{fieldData:{type:Object,default:()=>({})}},emits:["update-field-data"],setup(d,{emit:g}){const o=d,E=g,m=e.ref({...o.fieldData}),f=e.computed(()=>O);e.watch(()=>o.fieldData,C=>{m.value={...C}},{deep:!0});const h=()=>{E("update-field-data",{...m.value})},B=()=>{m.value={...Q},h()};return(C,V)=>(e.openBlock(),e.createElementBlock("div",Wt,[e.createElementVNode("div",{class:"panel-header"},[V[0]||(V[0]=e.createElementVNode("h3",null,"字段数据",-1)),e.createElementVNode("button",{class:"reset-btn",onClick:B},"重置")]),e.createElementVNode("div",jt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,(k,l)=>(e.openBlock(),e.createElementBlock("div",{key:l,class:"field-category"},[e.createElementVNode("div",Ht,e.toDisplayString(l),1),e.createElementVNode("div",Yt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k,r=>(e.openBlock(),e.createElementBlock("div",{key:r.key,class:"field-item"},[e.createElementVNode("label",Ot,e.toDisplayString(r.label),1),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":i=>m.value[r.key]=i,onInput:h,type:"text",class:"field-input",placeholder:r.placeholder},null,40,Qt),[[e.vModelText,m.value[r.key]]]),e.createElementVNode("div",Kt,e.toDisplayString(r.description),1)]))),128))])]))),128))])]))}},[["__scopeId","data-v-33e53b63"]]),Xt={class:"preview-dialog"},Gt={class:"preview-content"},Jt={class:"preview-canvas-wrapper"},Zt={key:0,class:"preview-text-content"},el=["innerHTML"],tl={key:1,class:"preview-image-element"},ll=["src"],ol={key:2,class:"preview-qrcode-element"},nl=["src"],al={key:1,class:"preview-qrcode-text"},Z=z({__name:"CertificatePreview",props:{visible:{type:Boolean,default:!1},elements:{type:Array,default:()=>[]},template:{type:Object,default:null},fieldData:{type:Object,default:()=>({})}},emits:["close"],setup(d,{emit:g}){const o=d,E=g,m=()=>{E("close")},f=()=>{const l={};return o.template?(l.width=`${o.template.width}px`,l.height=`${o.template.height}px`):(l.width="800px",l.height="1000px"),o.template&&o.template.background&&(o.template.background.startsWith("data:")||o.template.background.startsWith("http")?(l.backgroundImage=`url(${o.template.background})`,l.backgroundSize="100% 100%",l.backgroundPosition="center",l.backgroundRepeat="no-repeat"):(l.background=o.template.background,l.backgroundSize="100% 100%",l.backgroundPosition="center",l.backgroundRepeat="no-repeat")),l},h=l=>{var i,n,p,$,F,M,b,T;const r={position:"absolute",left:`${l.x}px`,top:`${l.y}px`,width:`${l.width}px`,minHeight:`${l.height}px`};return l.type==="text"||l.type==="longtext"?{...r,fontSize:`${((i=l.style)==null?void 0:i.fontSize)||18}px`,fontFamily:((n=l.style)==null?void 0:n.fontFamily)||"方正书宋简体",fontWeight:((p=l.style)==null?void 0:p.fontWeight)||"normal",fontStyle:(($=l.style)==null?void 0:$.fontStyle)||"normal",textDecoration:((F=l.style)==null?void 0:F.textDecoration)||"none",color:((M=l.style)==null?void 0:M.color)||"#000000",textAlign:((b=l.style)==null?void 0:b.textAlign)||"left",lineHeight:((T=l.style)==null?void 0:T.lineHeight)||1.2}:r},B=l=>{if(!l)return"";const r=o.fieldData||{};let i=l;return D.forEach(n=>{const p=n.placeholder,$=r[n.key]||p,F=new RegExp(p.replace(/[{}]/g,"\\$&"),"g");i=i.replace(F,$)}),i},C=l=>{if(!l)return null;if(l.imageSource==="field"){const r=l.imageField;return r&&o.fieldData&&o.fieldData[r]?o.fieldData[r]:null}else return l.imageUrl||null},V=l=>{if(!l)return null;if(l.qrcodeSource==="field"){const r=l.qrcodeField;return r&&o.fieldData&&o.fieldData[r]?o.fieldData[r]:null}else return l.qrcodeContent||null},k=l=>{if(!l)return!1;if(l.startsWith("data:image/"))return!0;if(l.startsWith("http://")||l.startsWith("https://")){const r=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"],i=l.toLowerCase();return r.some(n=>i.includes(n))}return!1};return(l,r)=>d.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"preview-overlay",onClick:e.withModifiers(m,["self"])},[e.createElementVNode("div",Xt,[e.createElementVNode("div",{class:"preview-header"},[r[0]||(r[0]=e.createElementVNode("h3",null,"证书预览",-1)),e.createElementVNode("button",{class:"close-btn",onClick:m},"×")]),e.createElementVNode("div",Gt,[e.createElementVNode("div",Jt,[e.createElementVNode("div",{class:"preview-canvas",style:e.normalizeStyle(f())},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.elements,i=>(e.openBlock(),e.createElementBlock("div",{key:i.id,class:e.normalizeClass(["preview-element",i.type]),style:e.normalizeStyle(h(i))},[i.type==="text"||i.type==="longtext"?(e.openBlock(),e.createElementBlock("div",Zt,[e.createElementVNode("span",{innerHTML:B(i.content)},null,8,el)])):i.type==="image"?(e.openBlock(),e.createElementBlock("div",tl,[C(i)?(e.openBlock(),e.createElementBlock("img",{key:0,src:C(i),alt:"图片",class:"preview-element-image"},null,8,ll)):e.createCommentVNode("",!0)])):i.type==="qrcode"?(e.openBlock(),e.createElementBlock("div",ol,[V(i)&&k(V(i))?(e.openBlock(),e.createElementBlock("img",{key:0,src:V(i),alt:"二维码",class:"preview-element-image"},null,8,nl)):V(i)?(e.openBlock(),e.createElementBlock("div",al,e.toDisplayString(V(i)),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],6))),128))],4)])])])])):e.createCommentVNode("",!0)}},[["__scopeId","data-v-2c0e9417"]]),il={class:"certificate-editor"},sl={class:"toolbar"},rl={class:"certificate-editor-content"},dl={class:"right-panel"},ee=z({__name:"CertificateEditor",setup(d){const g=e.ref([]),o=e.ref(null),E=e.ref({}),m=e.ref(!1),f=e.ref(q.find(n=>n.type==="vertical")||q[0]);e.onMounted(()=>{g.value=[{id:1,type:"text",x:115,y:466,width:698,height:29,content:"{{姓名}} ({{性别称呼}})",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}},{id:2,type:"longtext",x:115,y:520,width:698,height:80,content:'您参加了"{{考试名称}}"考试,成绩: {{成绩等级}},经审定,准予颁发考试证书!',style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}},{id:3,type:"text",x:115,y:620,width:698,height:29,content:"证书编号: {{证书编号}}",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}},{id:4,type:"text",x:115,y:660,width:698,height:29,content:"有效期: {{有效期}}",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}}]});const h=n=>{const p={id:Date.now(),type:n,x:100,y:100,width:n==="text"?200:n==="qrcode"?100:150,height:n==="text"?50:n==="qrcode"?100:150,content:n==="text"?"新文本":"",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}};n==="image"&&(p.imageSource="url",p.imageUrl="",p.imageField=""),n==="qrcode"&&(p.qrcodeSource="url",p.qrcodeContent="",p.qrcodeField=""),g.value.push(p),o.value=p},B=n=>{o.value=n},C=n=>{const p=g.value.findIndex($=>$.id===n.id);p!==-1&&(g.value[p]={...n},o.value=g.value[p])},V=n=>{var p;g.value=g.value.filter($=>$.id!==n),((p=o.value)==null?void 0:p.id)===n&&(o.value=null)},k=n=>{E.value={...n}},l=n=>{f.value=n},r=n=>{f.value=n},i=()=>{const n={template:f.value,elements:g.value,fieldData:E.value,timestamp:new Date().toISOString()};console.log("=== 证书配置数据 ==="),console.log(JSON.stringify(n,null,2)),console.log("=================="),alert("证书配置已保存到控制台,请打开浏览器开发者工具查看")};return(n,p)=>(e.openBlock(),e.createElementBlock("div",il,[e.createElementVNode("div",sl,[e.createElementVNode("button",{class:"toolbar-btn preview-btn",onClick:p[0]||(p[0]=$=>m.value=!0)},[...p[2]||(p[2]=[e.createElementVNode("span",null,"👁️",-1),e.createElementVNode("span",null,"预览",-1)])]),e.createElementVNode("button",{class:"toolbar-btn save-btn",onClick:i},[...p[3]||(p[3]=[e.createElementVNode("span",null,"💾",-1),e.createElementVNode("span",null,"保存",-1)])])]),e.createElementVNode("div",rl,[e.createVNode(Y,{onAddElement:h,onSelectTemplate:l,onUploadTemplate:r,class:"left-panel"}),e.createVNode(K,{elements:g.value,"selected-element":o.value,"field-data":E.value,template:f.value,onSelectElement:B,onUpdateElement:C,onDeleteElement:V,class:"canvas-area"},null,8,["elements","selected-element","field-data","template"]),e.createElementVNode("div",dl,[o.value?(e.openBlock(),e.createBlock(G,{key:0,element:o.value,onUpdateElement:C,class:"properties-section"},null,8,["element"])):e.createCommentVNode("",!0),e.createVNode(J,{"field-data":E.value,onUpdateFieldData:k,class:"field-data-section"},null,8,["field-data"])])]),e.createVNode(Z,{visible:m.value,elements:g.value,template:f.value,"field-data":E.value,onClose:p[1]||(p[1]=$=>m.value=!1)},null,8,["visible","elements","template","field-data"])]))}},[["__scopeId","data-v-b6b9b7fa"]]);N.CanvasArea=K,N.CertificateEditor=ee,N.CertificatePreview=Z,N.DEFAULT_FIELD_DATA=Q,N.DesignPanel=Y,N.FIELDS_BY_CATEGORY=O,N.FieldDataPanel=J,N.FieldDialog=X,N.PRESET_TEMPLATES=q,N.PropertiesPanel=G,N.SYSTEM_FIELDS=D,N.default=ee,N.extractFields=ke,N.fileToBase64=R,N.getFieldByKey=W,N.getPlaceholderByKey=Ee,N.getTemplateSizeSuggestion=H,N.hasFields=he,N.replaceFields=ye,N.validateImageFile=P,Object.defineProperties(N,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
1
+ (function(N,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(N=typeof globalThis<"u"?globalThis:N||self,e(N.CertificateEditor={},N.Vue))})(this,function(N,e){"use strict";const q=[{id:"vertical-1",name:"竖版模板1",type:"vertical",width:972,height:1378,background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",description:"经典竖版证书模板"},{id:"vertical-2",name:"竖版模板2",type:"vertical",width:972,height:1378,background:"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)",description:"优雅竖版证书模板"},{id:"vertical-3",name:"竖版模板3",type:"vertical",width:972,height:1378,background:"linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)",description:"现代竖版证书模板"},{id:"horizontal-1",name:"横版模板1",type:"horizontal",width:1303,height:897,background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",description:"经典横版证书模板"},{id:"horizontal-2",name:"横版模板2",type:"horizontal",width:1303,height:897,background:"linear-gradient(135deg, #f093fb 0%, #f5576c 100%)",description:"优雅横版证书模板"},{id:"horizontal-3",name:"横版模板3",type:"horizontal",width:1303,height:897,background:"linear-gradient(135deg, #4facfe 0%, #00f2fe 100%)",description:"现代横版证书模板"}],P=d=>["image/jpeg","image/jpg","image/png"].includes(d.type)?d.size>2097152?{valid:!1,error:"图片大小不能超过 2MB"}:{valid:!0}:{valid:!1,error:"只支持 JPG、JPEG、PNG 格式的图片"},R=d=>new Promise((g,o)=>{const E=new FileReader;E.onload=()=>g(E.result),E.onerror=o,E.readAsDataURL(d)}),H=d=>d==="vertical"?{width:972,height:1378}:{width:1303,height:897},z=(d,g)=>{const o=d.__vccOpts||d;for(const[E,m]of g)o[E]=m;return o},ne={class:"design-panel"},ae={class:"panel-tabs"},ie={class:"panel-content"},se={key:0,class:"elements-section"},re={class:"elements-grid"},de={key:1,class:"templates-section"},ce={class:"upload-section"},me={class:"upload-hint"},pe={class:"template-type-switch"},ge={class:"templates-list"},fe=["onClick"],ue={class:"template-name"},Y=z({__name:"DesignPanel",emits:["add-element","select-template","upload-template"],setup(d,{emit:g}){const o=g,E=e.ref("elements"),m=e.ref("vertical"),f=e.ref(null),h=e.computed(()=>q.filter(k=>k.type===m.value)),B=k=>{o("select-template",k)},C=()=>{var k;(k=f.value)==null||k.click()},b=async k=>{var i;const l=(i=k.target.files)==null?void 0:i[0];if(!l)return;const r=P(l);if(!r.valid){alert(r.error);return}try{const n=await R(l),p=H(m.value),$={id:`custom-${Date.now()}`,name:"自定义模板",type:m.value,width:p.width,height:p.height,background:n,description:"自定义上传的模板"};o("upload-template",$)}catch(n){alert("上传失败,请重试"),console.error(n)}f.value&&(f.value.value="")};return(k,l)=>(e.openBlock(),e.createElementBlock("div",ne,[e.createElementVNode("div",ae,[e.createElementVNode("div",{class:e.normalizeClass(["tab-item",{active:E.value==="elements"}]),onClick:l[0]||(l[0]=r=>E.value="elements")}," 设计元素 ",2),e.createElementVNode("div",{class:e.normalizeClass(["tab-item",{active:E.value==="templates"}]),onClick:l[1]||(l[1]=r=>E.value="templates")}," 底图模板 ",2)]),e.createElementVNode("div",ie,[E.value==="elements"?(e.openBlock(),e.createElementBlock("div",se,[e.createElementVNode("div",re,[e.createElementVNode("div",{class:"element-item",onClick:l[2]||(l[2]=r=>k.$emit("add-element","text"))},[...l[8]||(l[8]=[e.createElementVNode("div",{class:"element-icon"},"📝",-1),e.createElementVNode("div",{class:"element-label"},"短文本",-1)])]),e.createElementVNode("div",{class:"element-item",onClick:l[3]||(l[3]=r=>k.$emit("add-element","longtext"))},[...l[9]||(l[9]=[e.createElementVNode("div",{class:"element-icon"},"📄",-1),e.createElementVNode("div",{class:"element-label"},"长文本",-1)])]),e.createElementVNode("div",{class:"element-item",onClick:l[4]||(l[4]=r=>k.$emit("add-element","image"))},[...l[10]||(l[10]=[e.createElementVNode("div",{class:"element-icon"},"🖼️",-1),e.createElementVNode("div",{class:"element-label"},"图片",-1)])]),e.createElementVNode("div",{class:"element-item",onClick:l[5]||(l[5]=r=>k.$emit("add-element","qrcode"))},[...l[11]||(l[11]=[e.createElementVNode("div",{class:"element-icon"},"🔲",-1),e.createElementVNode("div",{class:"element-label"},"二维码",-1)])])])])):e.createCommentVNode("",!0),E.value==="templates"?(e.openBlock(),e.createElementBlock("div",de,[e.createElementVNode("div",ce,[e.createElementVNode("input",{ref_key:"fileInputRef",ref:f,type:"file",accept:"image/jpeg,image/jpg,image/png",onChange:b,style:{display:"none"}},null,544),e.createElementVNode("button",{class:"upload-btn",onClick:C},[...l[12]||(l[12]=[e.createElementVNode("span",null,"📁",-1),e.createElementVNode("span",null,"上传模板",-1)])]),e.createElementVNode("div",me,[l[13]||(l[13]=e.createTextVNode(" 支持:jpg、jpeg、png 小于2M",-1)),l[14]||(l[14]=e.createElementVNode("br",null,null,-1)),e.createTextVNode(" 建议尺寸:"+e.toDisplayString(m.value==="vertical"?"972 x 1378":"1303 x 897"),1)])]),e.createElementVNode("div",pe,[e.createElementVNode("button",{class:e.normalizeClass(["switch-btn",{active:m.value==="vertical"}]),onClick:l[6]||(l[6]=r=>m.value="vertical")}," 竖版 ",2),e.createElementVNode("button",{class:e.normalizeClass(["switch-btn",{active:m.value==="horizontal"}]),onClick:l[7]||(l[7]=r=>m.value="horizontal")}," 横版 ",2)]),e.createElementVNode("div",ge,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,r=>(e.openBlock(),e.createElementBlock("div",{key:r.id,class:"template-item",onClick:i=>B(r)},[e.createElementVNode("div",{class:"template-preview",style:e.normalizeStyle({background:r.background})},null,4),e.createElementVNode("div",ue,e.toDisplayString(r.name),1)],8,fe))),128))])])):e.createCommentVNode("",!0)])]))}},[["__scopeId","data-v-b694f9ff"]]),D=[{key:"name",label:"姓名",placeholder:"{{姓名}}",category:"基本信息",description:"证书持有人的姓名"},{key:"gender",label:"性别称呼",placeholder:"{{性别称呼}}",category:"基本信息",description:"先生/女士"},{key:"examName",label:"考试名称",placeholder:"{{考试名称}}",category:"考试信息",description:"参加的考试名称"},{key:"score",label:"成绩",placeholder:"{{成绩}}",category:"考试信息",description:"考试成绩"},{key:"scoreLevel",label:"成绩等级",placeholder:"{{成绩等级}}",category:"考试信息",description:"成绩等级(如:优秀、良好、合格等)"},{key:"certificateNumber",label:"证书编号",placeholder:"{{证书编号}}",category:"证书信息",description:"证书的唯一编号"},{key:"validityPeriod",label:"有效期",placeholder:"{{有效期}}",category:"证书信息",description:"证书的有效期限"},{key:"issueDate",label:"颁发日期",placeholder:"{{颁发日期}}",category:"证书信息",description:"证书颁发的日期"},{key:"organization",label:"颁发机构",placeholder:"{{颁发机构}}",category:"证书信息",description:"颁发证书的机构名称"},{key:"idNumber",label:"身份证号",placeholder:"{{身份证号}}",category:"基本信息",description:"身份证号码"},{key:"phone",label:"联系电话",placeholder:"{{联系电话}}",category:"基本信息",description:"联系电话"},{key:"email",label:"电子邮箱",placeholder:"{{电子邮箱}}",category:"基本信息",description:"电子邮箱地址"},{key:"account",label:"账号",placeholder:"{{账号}}",category:"基本信息",description:"用户账号"},{key:"examScore",label:"考试得分",placeholder:"{{考试得分}}",category:"考试信息",description:"考试得分"},{key:"issueDateMonth",label:"颁证时间(月)",placeholder:"{{颁证时间(月)}}",category:"证书信息",description:"证书颁发的月份"},{key:"issueDateDay",label:"颁证时间(日)",placeholder:"{{颁证时间(日)}}",category:"证书信息",description:"证书颁发的日期"}],O=D.reduce((d,g)=>(d[g.category]||(d[g.category]=[]),d[g.category].push(g),d),{}),W=d=>D.find(g=>g.key===d),Ee=d=>{const g=W(d);return g?g.placeholder:`{{${d}}}`},ye=(d,g={})=>{if(!d)return"";let o=d;return D.forEach(E=>{const m=E.placeholder,f=g[E.key]||E.placeholder,h=new RegExp(m.replace(/[{}]/g,"\\$&"),"g");o=o.replace(h,f)}),o},ke=d=>{if(!d)return[];const g=[];return D.forEach(o=>{d.includes(o.placeholder)&&g.push(o)}),g},he=d=>d?D.some(g=>d.includes(g.placeholder)):!1,Q={name:"张三",gender:"先生",examName:"计算机应用能力考试",score:"95",scoreLevel:"优秀",certificateNumber:"CERT-2024-001234",validityPeriod:"2024-01-01 至 2027-01-01",issueDate:"2024-01-01",organization:"考试认证中心",idNumber:"110101199001011234",phone:"13800138000",email:"zhangsan@example.com",account:"user001",examScore:"95",issueDateMonth:"01",issueDateDay:"01"},Ve={class:"canvas-area"},be={key:0,class:"certificate-border"},Ne=["onClick","onMousedown"],we={key:0,class:"text-content"},xe=["innerHTML"],Be={key:1,class:"image-element"},Ce=["src"],$e={key:1,class:"image-placeholder"},Se={key:2,class:"qrcode-element"},De=["src"],_e={key:1,class:"qrcode-content"},Fe={class:"qrcode-info"},ve={key:2,class:"qrcode-placeholder"},Me={key:3,class:"resize-handles"},Te=["onMousedown"],Ue=["onMousedown"],ze=["onMousedown"],Le=["onMousedown"],Ie=["onClick"],K=z({__name:"CanvasArea",props:{elements:{type:Array,default:()=>[]},selectedElement:{type:Object,default:null},fieldData:{type:Object,default:()=>({})},template:{type:Object,default:null}},emits:["select-element","update-element","delete-element"],setup(d,{emit:g}){const o=d,E=g,m=a=>{if(!a)return"";const y=o.fieldData||{};let c=a;return D.forEach(x=>{const S=x.placeholder,_=y[x.key]||S;if(y[x.key]){const w=new RegExp(S.replace(/[{}]/g,"\\$&"),"g");c=c.replace(w,`<span class="field-value">${_}</span>`)}else{const w=new RegExp(S.replace(/[{}]/g,"\\$&"),"g");c=c.replace(w,`<span class="field-placeholder-highlight">${S}</span>`)}}),c},f=a=>{if(!a)return null;if(a.imageSource==="field"){const y=a.imageField;return y&&o.fieldData&&o.fieldData[y]?o.fieldData[y]:null}else return a.imageUrl||null},h=a=>{if(!a)return null;if(a.qrcodeSource==="field"){const y=a.qrcodeField;return y&&o.fieldData&&o.fieldData[y]?o.fieldData[y]:null}else return a.qrcodeContent||null},B=a=>{if(!a)return!1;if(a.startsWith("data:image/"))return!0;if(a.startsWith("http://")||a.startsWith("https://")){const y=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"],c=a.toLowerCase();return y.some(x=>c.includes(x))}return!1},C=()=>{const a={};return o.template?(a.width=`${o.template.width}px`,a.minHeight=`${o.template.height}px`):(a.width="800px",a.minHeight="1000px"),o.template&&o.template.background&&(o.template.background.startsWith("data:")||o.template.background.startsWith("http")?(a.backgroundImage=`url(${o.template.background})`,a.backgroundSize="100% 100%",a.backgroundPosition="center",a.backgroundRepeat="no-repeat"):(a.background=o.template.background,a.backgroundSize="100% 100%",a.backgroundPosition="center",a.backgroundRepeat="no-repeat")),a},b=e.ref(null),k=e.ref(!1),l=e.ref(!1),r=e.ref({x:0,y:0}),i=e.ref({x:0,y:0,width:0,height:0}),n=e.ref(null),p=e.ref(""),$=a=>{var c,x,S,_,w,L,I,A;const y={position:"absolute",left:`${a.x}px`,top:`${a.y}px`,width:`${a.width}px`,minHeight:`${a.height}px`};return a.type==="text"||a.type==="longtext"?{...y,fontSize:`${((c=a.style)==null?void 0:c.fontSize)||18}px`,fontFamily:((x=a.style)==null?void 0:x.fontFamily)||"方正书宋简体",fontWeight:((S=a.style)==null?void 0:S.fontWeight)||"normal",fontStyle:((_=a.style)==null?void 0:_.fontStyle)||"normal",textDecoration:((w=a.style)==null?void 0:w.textDecoration)||"none",color:((L=a.style)==null?void 0:L.color)||"#000000",textAlign:((I=a.style)==null?void 0:I.textAlign)||"left",lineHeight:((A=a.style)==null?void 0:A.lineHeight)||1.2}:y},F=(a,y)=>{a.target.closest(".handle")||a.target.closest(".delete-btn")||(k.value=!0,n.value=y,r.value={x:a.clientX-y.x,y:a.clientY-y.y},document.addEventListener("mousemove",M),document.addEventListener("mouseup",V))},M=a=>{if(k.value&&n.value){const y=a.clientX-r.value.x,c=a.clientY-r.value.y,x={...n.value,x:Math.max(0,y),y:Math.max(0,c)};E("update-element",x)}else if(l.value&&n.value){const y=a.clientX-i.value.x,c=a.clientY-i.value.y;let x=i.value.width,S=i.value.height,_=n.value.x,w=n.value.y;p.value.includes("e")&&(x=Math.max(50,i.value.width+y)),p.value.includes("w")&&(x=Math.max(50,i.value.width-y),_=n.value.x+(i.value.width-x)),p.value.includes("s")&&(S=Math.max(30,i.value.height+c)),p.value.includes("n")&&(S=Math.max(30,i.value.height-c),w=n.value.y+(i.value.height-S));const L={...n.value,x:_,y:w,width:x,height:S};E("update-element",L)}},V=()=>{k.value=!1,l.value=!1,n.value=null,p.value="",document.removeEventListener("mousemove",M),document.removeEventListener("mouseup",V)},T=(a,y,c)=>{a.stopPropagation(),l.value=!0,n.value=y,p.value=c,i.value={x:a.clientX,y:a.clientY,width:y.width,height:y.height},document.addEventListener("mousemove",M),document.addEventListener("mouseup",V)};return e.onUnmounted(()=>{document.removeEventListener("mousemove",M),document.removeEventListener("mouseup",V)}),(a,y)=>(e.openBlock(),e.createElementBlock("div",Ve,[e.createElementVNode("div",{class:"certificate-canvas",ref_key:"canvasRef",ref:b,style:e.normalizeStyle(C())},[!o.template||!o.template.background?(e.openBlock(),e.createElementBlock("div",be)):e.createCommentVNode("",!0),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.elements,c=>{var x,S,_;return e.openBlock(),e.createElementBlock("div",{key:c.id,class:e.normalizeClass(["editable-element",c.type,{selected:((x=d.selectedElement)==null?void 0:x.id)===c.id}]),style:e.normalizeStyle($(c)),onClick:e.withModifiers(w=>a.$emit("select-element",c),["stop"]),onMousedown:w=>F(w,c)},[c.type==="text"||c.type==="longtext"?(e.openBlock(),e.createElementBlock("div",we,[e.createElementVNode("span",{innerHTML:m(c.content)},null,8,xe)])):c.type==="image"?(e.openBlock(),e.createElementBlock("div",Be,[f(c)?(e.openBlock(),e.createElementBlock("img",{key:0,src:f(c),alt:"图片",class:"element-image"},null,8,Ce)):(e.openBlock(),e.createElementBlock("div",$e,[...y[0]||(y[0]=[e.createElementVNode("span",null,"🖼️ 请设置图片",-1)])]))])):c.type==="qrcode"?(e.openBlock(),e.createElementBlock("div",Se,[h(c)&&B(h(c))?(e.openBlock(),e.createElementBlock("img",{key:0,src:h(c),alt:"二维码",class:"element-image"},null,8,De)):h(c)?(e.openBlock(),e.createElementBlock("div",_e,[y[1]||(y[1]=e.createElementVNode("div",{class:"qrcode-placeholder-text"},"二维码",-1)),e.createElementVNode("div",Fe,e.toDisplayString(h(c)),1)])):(e.openBlock(),e.createElementBlock("div",ve,[...y[2]||(y[2]=[e.createElementVNode("span",null,"🔲 请设置二维码",-1)])]))])):e.createCommentVNode("",!0),((S=d.selectedElement)==null?void 0:S.id)===c.id?(e.openBlock(),e.createElementBlock("div",Me,[e.createElementVNode("div",{class:"handle handle-nw",onMousedown:e.withModifiers(w=>T(w,c,"nw"),["stop"])},null,40,Te),e.createElementVNode("div",{class:"handle handle-ne",onMousedown:e.withModifiers(w=>T(w,c,"ne"),["stop"])},null,40,Ue),e.createElementVNode("div",{class:"handle handle-sw",onMousedown:e.withModifiers(w=>T(w,c,"sw"),["stop"])},null,40,ze),e.createElementVNode("div",{class:"handle handle-se",onMousedown:e.withModifiers(w=>T(w,c,"se"),["stop"])},null,40,Le)])):e.createCommentVNode("",!0),((_=d.selectedElement)==null?void 0:_.id)===c.id?(e.openBlock(),e.createElementBlock("button",{key:4,class:"delete-btn",onClick:e.withModifiers(w=>a.$emit("delete-element",c.id),["stop"])}," × ",8,Ie)):e.createCommentVNode("",!0)],46,Ne)}),128))],4)]))}},[["__scopeId","data-v-ac0f08fc"]]),qe={class:"field-dialog"},Pe={class:"dialog-content"},Re={class:"search-box"},Ae={class:"table-container"},We={class:"fields-table"},je={class:"field-name"},He={class:"field-action"},Ye=["onClick"],Oe={key:0,class:"pagination"},Qe=["disabled"],Ke=["onClick"],Xe=["disabled"],j=10,X=z({__name:"FieldDialog",props:{visible:{type:Boolean,default:!1},currentText:{type:String,default:""},selectionStart:{type:Number,default:0},selectionEnd:{type:Number,default:0}},emits:["close","insert"],setup(d,{emit:g}){const o=g,E=e.ref(""),m=e.ref(1),f=e.computed(()=>{if(!E.value.trim())return D;const r=E.value.toLowerCase();return D.filter(i=>i.label.toLowerCase().includes(r)||i.key.toLowerCase().includes(r)||i.description.toLowerCase().includes(r))}),h=e.computed(()=>Math.ceil(f.value.length/j)),B=e.computed(()=>{const r=(m.value-1)*j,i=r+j;return f.value.slice(r,i)}),C=()=>{m.value=1},b=r=>{r>=1&&r<=h.value&&(m.value=r)},k=r=>{o("insert",[r])},l=()=>{E.value="",m.value=1,o("close")};return(r,i)=>d.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"field-dialog-overlay",onClick:e.withModifiers(l,["self"])},[e.createElementVNode("div",qe,[e.createElementVNode("div",{class:"dialog-header"},[i[3]||(i[3]=e.createElementVNode("h3",null,"选择字段",-1)),e.createElementVNode("button",{class:"close-btn",onClick:l},"×")]),e.createElementVNode("div",Pe,[e.createElementVNode("div",Re,[e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":i[0]||(i[0]=n=>E.value=n),placeholder:"搜索字段...",class:"search-input",onInput:C},null,544),[[e.vModelText,E.value]])]),e.createElementVNode("div",Ae,[e.createElementVNode("table",We,[i[4]||(i[4]=e.createElementVNode("thead",null,[e.createElementVNode("tr",null,[e.createElementVNode("th",null,"系统字段"),e.createElementVNode("th",null,"操作")])],-1)),e.createElementVNode("tbody",null,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(B.value,n=>(e.openBlock(),e.createElementBlock("tr",{key:n.key,class:"field-row"},[e.createElementVNode("td",je,e.toDisplayString(n.label),1),e.createElementVNode("td",He,[e.createElementVNode("button",{class:"select-btn",onClick:p=>k(n)}," 选择 ",8,Ye)])]))),128))])])]),h.value>1?(e.openBlock(),e.createElementBlock("div",Oe,[e.createElementVNode("button",{class:"page-btn",disabled:m.value===1,onClick:i[1]||(i[1]=n=>b(m.value-1))}," < ",8,Qe),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(h.value,n=>(e.openBlock(),e.createElementBlock("button",{key:n,class:e.normalizeClass(["page-btn",{active:n===m.value}]),onClick:p=>b(n)},e.toDisplayString(n),11,Ke))),128)),e.createElementVNode("button",{class:"page-btn",disabled:m.value===h.value,onClick:i[2]||(i[2]=n=>b(m.value+1))}," > ",8,Xe)])):e.createCommentVNode("",!0)])])])):e.createCommentVNode("",!0)}},[["__scopeId","data-v-6745c3ca"]]),Ge={class:"properties-panel"},Je={class:"panel-content"},Ze={key:0,class:"content-section"},et={class:"form-group"},tt={class:"content-input-wrapper"},lt=["rows"],ot={key:1,class:"style-section"},nt={class:"form-group"},at={class:"form-group"},it={class:"form-group"},st={class:"style-buttons"},rt={class:"form-group"},dt={class:"form-group"},ct={class:"align-buttons"},mt={class:"form-group"},pt={key:2,class:"image-section"},gt={class:"form-group"},ft={class:"radio-group"},ut={class:"radio-label"},Et={class:"radio-label"},yt={key:0,class:"form-group"},kt={class:"image-upload-wrapper"},ht={key:0,class:"image-preview"},Vt=["src"],bt={key:1,class:"form-group"},Nt=["value"],wt={key:0,class:"field-preview"},xt={key:3,class:"qrcode-section"},Bt={class:"form-group"},Ct={class:"radio-group"},$t={class:"radio-label"},St={class:"radio-label"},Dt={key:0,class:"form-group"},_t={class:"qrcode-upload-wrapper"},Ft={key:0,class:"qrcode-preview"},vt=["src"],Mt={key:1,class:"form-group"},Tt=["value"],Ut={key:0,class:"field-preview"},zt={class:"position-section"},Lt={class:"form-row"},It={class:"form-group"},qt={class:"form-group"},Pt={class:"form-row"},Rt={class:"form-group"},At={class:"form-group"},G=z({__name:"PropertiesPanel",props:{element:{type:Object,required:!0}},emits:["update-element"],setup(d,{emit:g}){const o=d,E=g,m=e.ref(""),f=e.ref({}),h=e.ref("url"),B=e.ref(""),C=e.ref(""),b=e.ref("url"),k=e.ref(""),l=e.ref(""),r=e.ref(!1),i=e.ref(0),n=e.ref(0),p=e.ref(null),$=e.ref(null),F=e.ref(null),M=()=>{m.value=o.element.content||"",f.value={...o.element.style},o.element.type==="image"&&(h.value=o.element.imageSource||"url",B.value=o.element.imageUrl||"",C.value=o.element.imageField||""),o.element.type==="qrcode"&&(b.value=o.element.qrcodeSource||"url",k.value=o.element.qrcodeContent||"",l.value=o.element.qrcodeField||"")};e.watch(()=>o.element,M,{immediate:!0,deep:!0});const V=()=>{const u={...o.element};(o.element.type==="text"||o.element.type==="longtext")&&(u.content=m.value,u.style={...f.value}),o.element.type==="image"&&(u.imageSource=h.value,u.imageUrl=B.value,u.imageField=C.value),o.element.type==="qrcode"&&(u.qrcodeSource=b.value,u.qrcodeContent=k.value,u.qrcodeField=l.value),E("update-element",u)},T=()=>{V()},a=u=>{i.value=u.target.selectionStart,n.value=u.target.selectionEnd},y=u=>{if(u.length>0){const t=u[0],s=p.value;if(s){const v=i.value,U=n.value,le=m.value,gl=le.substring(0,v)+t.placeholder+le.substring(U);m.value=gl,setTimeout(()=>{const oe=v+t.placeholder.length;s.setSelectionRange(oe,oe),s.focus()},0),V()}}},c=(u,t,s)=>{f.value[u]=f.value[u]===t?s:t,V()},x=u=>{f.value.textAlign=u,V()},S=()=>{V()},_=()=>{var u;(u=$.value)==null||u.click()},w=async u=>{var v;const t=(v=u.target.files)==null?void 0:v[0];if(!t)return;const s=P(t);if(!s.valid){alert(s.error);return}try{const U=await R(t);B.value=U,h.value="url",V()}catch(U){alert("上传失败,请重试"),console.error(U)}$.value&&($.value.value="")},L=()=>{B.value="",V()},I=()=>{V()},A=()=>{var u;(u=F.value)==null||u.click()},cl=async u=>{var v;const t=(v=u.target.files)==null?void 0:v[0];if(!t)return;const s=P(t);if(!s.valid){alert(s.error);return}try{const U=await R(t);k.value=U,b.value="url",V()}catch(U){alert("上传失败,请重试"),console.error(U)}F.value&&(F.value.value="")},ml=()=>{k.value="",V()},te=u=>{const t=W(u);return t?t.label:u},pl=u=>{if(!u)return!1;if(u.startsWith("data:image/"))return!0;if(u.startsWith("http://")||u.startsWith("https://")){const t=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"],s=u.toLowerCase();return t.some(v=>s.includes(v))}return!1};return(u,t)=>(e.openBlock(),e.createElementBlock("div",Ge,[t[60]||(t[60]=e.createElementVNode("div",{class:"panel-header"},[e.createElementVNode("h3",null,"属性设置")],-1)),e.createElementVNode("div",Je,[d.element.type==="text"||d.element.type==="longtext"?(e.openBlock(),e.createElementBlock("div",Ze,[e.createElementVNode("div",et,[t[26]||(t[26]=e.createElementVNode("label",{class:"form-label"},"内容",-1)),e.createElementVNode("div",tt,[e.withDirectives(e.createElementVNode("textarea",{ref_key:"contentTextareaRef",ref:p,"onUpdate:modelValue":t[0]||(t[0]=s=>m.value=s),onInput:T,onFocus:a,rows:d.element.type==="longtext"?6:3,class:"content-textarea"},null,40,lt),[[e.vModelText,m.value]]),e.createElementVNode("button",{class:"insert-field-btn",onClick:t[1]||(t[1]=s=>r.value=!0)},[...t[25]||(t[25]=[e.createElementVNode("span",null,"+",-1),e.createElementVNode("span",null,"在内容中关联系统字段",-1)])])])])])):e.createCommentVNode("",!0),d.element.type==="text"||d.element.type==="longtext"?(e.openBlock(),e.createElementBlock("div",ot,[t[38]||(t[38]=e.createElementVNode("div",{class:"section-title"},"文本样式",-1)),e.createElementVNode("div",nt,[t[28]||(t[28]=e.createElementVNode("label",{class:"form-label"},"字体大小",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[2]||(t[2]=s=>f.value.fontSize=s),onChange:V,class:"form-select"},[...t[27]||(t[27]=[e.createElementVNode("option",{value:12},"12px",-1),e.createElementVNode("option",{value:14},"14px",-1),e.createElementVNode("option",{value:16},"16px",-1),e.createElementVNode("option",{value:18},"18px",-1),e.createElementVNode("option",{value:20},"20px",-1),e.createElementVNode("option",{value:24},"24px",-1),e.createElementVNode("option",{value:28},"28px",-1),e.createElementVNode("option",{value:32},"32px",-1),e.createElementVNode("option",{value:36},"36px",-1),e.createElementVNode("option",{value:48},"48px",-1)])],544),[[e.vModelSelect,f.value.fontSize,void 0,{number:!0}]])]),e.createElementVNode("div",at,[t[30]||(t[30]=e.createElementVNode("label",{class:"form-label"},"字体",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[3]||(t[3]=s=>f.value.fontFamily=s),onChange:V,class:"form-select"},[...t[29]||(t[29]=[e.createStaticVNode('<option value="方正书宋简体" data-v-f3dab8d1>方正书宋简体</option><option value="微软雅黑" data-v-f3dab8d1>微软雅黑</option><option value="宋体" data-v-f3dab8d1>宋体</option><option value="黑体" data-v-f3dab8d1>黑体</option><option value="Arial" data-v-f3dab8d1>Arial</option>',5)])],544),[[e.vModelSelect,f.value.fontFamily]])]),e.createElementVNode("div",it,[t[34]||(t[34]=e.createElementVNode("label",{class:"form-label"},"文字样式",-1)),e.createElementVNode("div",st,[e.createElementVNode("button",{class:e.normalizeClass(["style-btn",{active:f.value.fontWeight==="bold"}]),onClick:t[4]||(t[4]=s=>c("fontWeight","bold","normal"))},[...t[31]||(t[31]=[e.createElementVNode("strong",null,"B",-1)])],2),e.createElementVNode("button",{class:e.normalizeClass(["style-btn",{active:f.value.fontStyle==="italic"}]),onClick:t[5]||(t[5]=s=>c("fontStyle","italic","normal"))},[...t[32]||(t[32]=[e.createElementVNode("em",null,"I",-1)])],2),e.createElementVNode("button",{class:e.normalizeClass(["style-btn",{active:f.value.textDecoration==="underline"}]),onClick:t[6]||(t[6]=s=>c("textDecoration","underline","none"))},[...t[33]||(t[33]=[e.createElementVNode("u",null,"U",-1)])],2)])]),e.createElementVNode("div",rt,[t[35]||(t[35]=e.createElementVNode("label",{class:"form-label"},"颜色",-1)),e.withDirectives(e.createElementVNode("input",{type:"color","onUpdate:modelValue":t[7]||(t[7]=s=>f.value.color=s),onChange:V,class:"color-input"},null,544),[[e.vModelText,f.value.color]])]),e.createElementVNode("div",dt,[t[36]||(t[36]=e.createElementVNode("label",{class:"form-label"},"对齐方式",-1)),e.createElementVNode("div",ct,[e.createElementVNode("button",{class:e.normalizeClass(["align-btn",{active:f.value.textAlign==="left"}]),onClick:t[8]||(t[8]=s=>x("left"))}," 左对齐 ",2),e.createElementVNode("button",{class:e.normalizeClass(["align-btn",{active:f.value.textAlign==="center"}]),onClick:t[9]||(t[9]=s=>x("center"))}," 居中 ",2),e.createElementVNode("button",{class:e.normalizeClass(["align-btn",{active:f.value.textAlign==="right"}]),onClick:t[10]||(t[10]=s=>x("right"))}," 右对齐 ",2)])]),e.createElementVNode("div",mt,[t[37]||(t[37]=e.createElementVNode("label",{class:"form-label"},"行高",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[11]||(t[11]=s=>f.value.lineHeight=s),onInput:V,step:"0.1",min:"0.5",max:"3",class:"form-input"},null,544),[[e.vModelText,f.value.lineHeight,void 0,{number:!0}]])])])):e.createCommentVNode("",!0),d.element.type==="image"?(e.openBlock(),e.createElementBlock("div",pt,[t[46]||(t[46]=e.createElementVNode("div",{class:"section-title"},"图片设置",-1)),e.createElementVNode("div",gt,[t[41]||(t[41]=e.createElementVNode("label",{class:"form-label"},"图片来源",-1)),e.createElementVNode("div",ft,[e.createElementVNode("label",ut,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"url","onUpdate:modelValue":t[12]||(t[12]=s=>h.value=s),onChange:S},null,544),[[e.vModelRadio,h.value]]),t[39]||(t[39]=e.createElementVNode("span",null,"URL",-1))]),e.createElementVNode("label",Et,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"field","onUpdate:modelValue":t[13]||(t[13]=s=>h.value=s),onChange:S},null,544),[[e.vModelRadio,h.value]]),t[40]||(t[40]=e.createElementVNode("span",null,"关联字段",-1))])])]),h.value==="url"?(e.openBlock(),e.createElementBlock("div",yt,[t[43]||(t[43]=e.createElementVNode("label",{class:"form-label"},"图片URL",-1)),e.createElementVNode("div",kt,[e.createElementVNode("input",{ref_key:"imageFileInputRef",ref:$,type:"file",accept:"image/jpeg,image/jpg,image/png",onChange:w,style:{display:"none"}},null,544),e.createElementVNode("button",{class:"upload-btn",onClick:_},[...t[42]||(t[42]=[e.createElementVNode("span",null,"📁",-1),e.createElementVNode("span",null,"本地上传",-1)])]),e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":t[14]||(t[14]=s=>B.value=s),onInput:V,placeholder:"请输入图片URL",class:"image-url-input"},null,544),[[e.vModelText,B.value]]),B.value?(e.openBlock(),e.createElementBlock("button",{key:0,class:"remove-btn",onClick:L},"移除")):e.createCommentVNode("",!0)]),B.value?(e.openBlock(),e.createElementBlock("div",ht,[e.createElementVNode("img",{src:B.value,alt:"预览"},null,8,Vt)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),h.value==="field"?(e.openBlock(),e.createElementBlock("div",bt,[t[45]||(t[45]=e.createElementVNode("label",{class:"form-label"},"关联字段",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[15]||(t[15]=s=>C.value=s),onChange:V,class:"form-select"},[t[44]||(t[44]=e.createElementVNode("option",{value:""},"请选择字段",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(D),s=>(e.openBlock(),e.createElementBlock("option",{key:s.key,value:s.key},e.toDisplayString(s.label)+" ("+e.toDisplayString(s.placeholder)+") ",9,Nt))),128))],544),[[e.vModelSelect,C.value]]),C.value?(e.openBlock(),e.createElementBlock("div",wt," 字段: "+e.toDisplayString(te(C.value)),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),d.element.type==="qrcode"?(e.openBlock(),e.createElementBlock("div",xt,[t[54]||(t[54]=e.createElementVNode("div",{class:"section-title"},"二维码设置",-1)),e.createElementVNode("div",Bt,[t[49]||(t[49]=e.createElementVNode("label",{class:"form-label"},"二维码来源",-1)),e.createElementVNode("div",Ct,[e.createElementVNode("label",$t,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"url","onUpdate:modelValue":t[16]||(t[16]=s=>b.value=s),onChange:I},null,544),[[e.vModelRadio,b.value]]),t[47]||(t[47]=e.createElementVNode("span",null,"URL/内容",-1))]),e.createElementVNode("label",St,[e.withDirectives(e.createElementVNode("input",{type:"radio",value:"field","onUpdate:modelValue":t[17]||(t[17]=s=>b.value=s),onChange:I},null,544),[[e.vModelRadio,b.value]]),t[48]||(t[48]=e.createElementVNode("span",null,"关联字段",-1))])])]),b.value==="url"?(e.openBlock(),e.createElementBlock("div",Dt,[t[51]||(t[51]=e.createElementVNode("label",{class:"form-label"},"二维码内容/图片URL",-1)),e.createElementVNode("div",_t,[e.createElementVNode("input",{ref_key:"qrcodeFileInputRef",ref:F,type:"file",accept:"image/jpeg,image/jpg,image/png",onChange:cl,style:{display:"none"}},null,544),e.createElementVNode("button",{class:"upload-btn",onClick:A},[...t[50]||(t[50]=[e.createElementVNode("span",null,"📁",-1),e.createElementVNode("span",null,"本地上传",-1)])]),e.withDirectives(e.createElementVNode("input",{type:"text","onUpdate:modelValue":t[18]||(t[18]=s=>k.value=s),onInput:V,placeholder:"请输入二维码内容或图片URL",class:"qrcode-input"},null,544),[[e.vModelText,k.value]]),k.value?(e.openBlock(),e.createElementBlock("button",{key:0,class:"remove-btn",onClick:ml},"移除")):e.createCommentVNode("",!0)]),k.value&&pl(k.value)?(e.openBlock(),e.createElementBlock("div",Ft,[e.createElementVNode("img",{src:k.value,alt:"预览"},null,8,vt)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),b.value==="field"?(e.openBlock(),e.createElementBlock("div",Mt,[t[53]||(t[53]=e.createElementVNode("label",{class:"form-label"},"关联字段",-1)),e.withDirectives(e.createElementVNode("select",{"onUpdate:modelValue":t[19]||(t[19]=s=>l.value=s),onChange:V,class:"form-select"},[t[52]||(t[52]=e.createElementVNode("option",{value:""},"请选择字段",-1)),(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(e.unref(D),s=>(e.openBlock(),e.createElementBlock("option",{key:s.key,value:s.key},e.toDisplayString(s.label)+" ("+e.toDisplayString(s.placeholder)+") ",9,Tt))),128))],544),[[e.vModelSelect,l.value]]),l.value?(e.openBlock(),e.createElementBlock("div",Ut," 字段: "+e.toDisplayString(te(l.value)),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0),e.createElementVNode("div",zt,[t[59]||(t[59]=e.createElementVNode("div",{class:"section-title"},"位置和尺寸",-1)),e.createElementVNode("div",Lt,[e.createElementVNode("div",It,[t[55]||(t[55]=e.createElementVNode("label",{class:"form-label"},"X",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[20]||(t[20]=s=>d.element.x=s),onInput:V,class:"form-input"},null,544),[[e.vModelText,d.element.x,void 0,{number:!0}]])]),e.createElementVNode("div",qt,[t[56]||(t[56]=e.createElementVNode("label",{class:"form-label"},"Y",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[21]||(t[21]=s=>d.element.y=s),onInput:V,class:"form-input"},null,544),[[e.vModelText,d.element.y,void 0,{number:!0}]])])]),e.createElementVNode("div",Pt,[e.createElementVNode("div",Rt,[t[57]||(t[57]=e.createElementVNode("label",{class:"form-label"},"宽度",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[22]||(t[22]=s=>d.element.width=s),onInput:V,class:"form-input"},null,544),[[e.vModelText,d.element.width,void 0,{number:!0}]])]),e.createElementVNode("div",At,[t[58]||(t[58]=e.createElementVNode("label",{class:"form-label"},"高度",-1)),e.withDirectives(e.createElementVNode("input",{type:"number","onUpdate:modelValue":t[23]||(t[23]=s=>d.element.height=s),onInput:V,class:"form-input"},null,544),[[e.vModelText,d.element.height,void 0,{number:!0}]])])])])]),e.createVNode(X,{visible:r.value,"current-text":m.value,"selection-start":i.value,"selection-end":n.value,onClose:t[24]||(t[24]=s=>r.value=!1),onInsert:y},null,8,["visible","current-text","selection-start","selection-end"])]))}},[["__scopeId","data-v-f3dab8d1"]]),Wt={class:"field-data-panel"},jt={class:"panel-content"},Ht={class:"category-title"},Yt={class:"fields-list"},Ot={class:"field-label"},Qt=["onUpdate:modelValue","placeholder"],Kt={class:"field-hint"},J=z({__name:"FieldDataPanel",props:{fieldData:{type:Object,default:()=>({})}},emits:["update-field-data"],setup(d,{emit:g}){const o=d,E=g,m=e.ref({...o.fieldData}),f=e.computed(()=>O);e.watch(()=>o.fieldData,C=>{m.value={...C}},{deep:!0});const h=()=>{E("update-field-data",{...m.value})},B=()=>{m.value={...Q},h()};return(C,b)=>(e.openBlock(),e.createElementBlock("div",Wt,[e.createElementVNode("div",{class:"panel-header"},[b[0]||(b[0]=e.createElementVNode("h3",null,"字段数据",-1)),e.createElementVNode("button",{class:"reset-btn",onClick:B},"重置")]),e.createElementVNode("div",jt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(f.value,(k,l)=>(e.openBlock(),e.createElementBlock("div",{key:l,class:"field-category"},[e.createElementVNode("div",Ht,e.toDisplayString(l),1),e.createElementVNode("div",Yt,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(k,r=>(e.openBlock(),e.createElementBlock("div",{key:r.key,class:"field-item"},[e.createElementVNode("label",Ot,e.toDisplayString(r.label),1),e.withDirectives(e.createElementVNode("input",{"onUpdate:modelValue":i=>m.value[r.key]=i,onInput:h,type:"text",class:"field-input",placeholder:r.placeholder},null,40,Qt),[[e.vModelText,m.value[r.key]]]),e.createElementVNode("div",Kt,e.toDisplayString(r.description),1)]))),128))])]))),128))])]))}},[["__scopeId","data-v-33e53b63"]]),Xt={class:"preview-dialog"},Gt={class:"preview-content"},Jt={class:"preview-canvas-wrapper"},Zt={key:0,class:"preview-text-content"},el=["innerHTML"],tl={key:1,class:"preview-image-element"},ll=["src"],ol={key:2,class:"preview-qrcode-element"},nl=["src"],al={key:1,class:"preview-qrcode-text"},Z=z({__name:"CertificatePreview",props:{visible:{type:Boolean,default:!1},elements:{type:Array,default:()=>[]},template:{type:Object,default:null},fieldData:{type:Object,default:()=>({})}},emits:["close"],setup(d,{emit:g}){const o=d,E=g,m=()=>{E("close")},f=()=>{const l={};return o.template?(l.width=`${o.template.width}px`,l.height=`${o.template.height}px`):(l.width="800px",l.height="1000px"),o.template&&o.template.background&&(o.template.background.startsWith("data:")||o.template.background.startsWith("http")?(l.backgroundImage=`url(${o.template.background})`,l.backgroundSize="100% 100%",l.backgroundPosition="center",l.backgroundRepeat="no-repeat"):(l.background=o.template.background,l.backgroundSize="100% 100%",l.backgroundPosition="center",l.backgroundRepeat="no-repeat")),l},h=l=>{var i,n,p,$,F,M,V,T;const r={position:"absolute",left:`${l.x}px`,top:`${l.y}px`,width:`${l.width}px`,minHeight:`${l.height}px`};return l.type==="text"||l.type==="longtext"?{...r,fontSize:`${((i=l.style)==null?void 0:i.fontSize)||18}px`,fontFamily:((n=l.style)==null?void 0:n.fontFamily)||"方正书宋简体",fontWeight:((p=l.style)==null?void 0:p.fontWeight)||"normal",fontStyle:(($=l.style)==null?void 0:$.fontStyle)||"normal",textDecoration:((F=l.style)==null?void 0:F.textDecoration)||"none",color:((M=l.style)==null?void 0:M.color)||"#000000",textAlign:((V=l.style)==null?void 0:V.textAlign)||"left",lineHeight:((T=l.style)==null?void 0:T.lineHeight)||1.2}:r},B=l=>{if(!l)return"";const r=o.fieldData||{};let i=l;return D.forEach(n=>{const p=n.placeholder,$=r[n.key]||p,F=new RegExp(p.replace(/[{}]/g,"\\$&"),"g");i=i.replace(F,$)}),i},C=l=>{if(!l)return null;if(l.imageSource==="field"){const r=l.imageField;return r&&o.fieldData&&o.fieldData[r]?o.fieldData[r]:null}else return l.imageUrl||null},b=l=>{if(!l)return null;if(l.qrcodeSource==="field"){const r=l.qrcodeField;return r&&o.fieldData&&o.fieldData[r]?o.fieldData[r]:null}else return l.qrcodeContent||null},k=l=>{if(!l)return!1;if(l.startsWith("data:image/"))return!0;if(l.startsWith("http://")||l.startsWith("https://")){const r=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp"],i=l.toLowerCase();return r.some(n=>i.includes(n))}return!1};return(l,r)=>d.visible?(e.openBlock(),e.createElementBlock("div",{key:0,class:"preview-overlay",onClick:e.withModifiers(m,["self"])},[e.createElementVNode("div",Xt,[e.createElementVNode("div",{class:"preview-header"},[r[0]||(r[0]=e.createElementVNode("h3",null,"证书预览",-1)),e.createElementVNode("button",{class:"close-btn",onClick:m},"×")]),e.createElementVNode("div",Gt,[e.createElementVNode("div",Jt,[e.createElementVNode("div",{class:"preview-canvas",style:e.normalizeStyle(f())},[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(d.elements,i=>(e.openBlock(),e.createElementBlock("div",{key:i.id,class:e.normalizeClass(["preview-element",i.type]),style:e.normalizeStyle(h(i))},[i.type==="text"||i.type==="longtext"?(e.openBlock(),e.createElementBlock("div",Zt,[e.createElementVNode("span",{innerHTML:B(i.content)},null,8,el)])):i.type==="image"?(e.openBlock(),e.createElementBlock("div",tl,[C(i)?(e.openBlock(),e.createElementBlock("img",{key:0,src:C(i),alt:"图片",class:"preview-element-image"},null,8,ll)):e.createCommentVNode("",!0)])):i.type==="qrcode"?(e.openBlock(),e.createElementBlock("div",ol,[b(i)&&k(b(i))?(e.openBlock(),e.createElementBlock("img",{key:0,src:b(i),alt:"二维码",class:"preview-element-image"},null,8,nl)):b(i)?(e.openBlock(),e.createElementBlock("div",al,e.toDisplayString(b(i)),1)):e.createCommentVNode("",!0)])):e.createCommentVNode("",!0)],6))),128))],4)])])])])):e.createCommentVNode("",!0)}},[["__scopeId","data-v-2c0e9417"]]),il={class:"certificate-editor"},sl={class:"toolbar"},rl={class:"certificate-editor-content"},dl={class:"right-panel"},ee=z({__name:"CertificateEditor",setup(d){const g=e.ref([]),o=e.ref(null),E=e.ref({}),m=e.ref(!1),f=e.ref(q.find(n=>n.type==="vertical")||q[0]);e.onMounted(()=>{g.value=[{id:1,type:"text",x:115,y:466,width:698,height:29,content:"{{姓名}} ({{性别称呼}})",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}},{id:2,type:"longtext",x:115,y:520,width:698,height:80,content:'您参加了"{{考试名称}}"考试,成绩: {{成绩等级}},经审定,准予颁发考试证书!',style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}},{id:3,type:"text",x:115,y:620,width:698,height:29,content:"证书编号: {{证书编号}}",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}},{id:4,type:"text",x:115,y:660,width:698,height:29,content:"有效期: {{有效期}}",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}}]});const h=n=>{const p={id:Date.now(),type:n,x:100,y:100,width:n==="text"?200:n==="qrcode"?100:150,height:n==="text"?50:n==="qrcode"?100:150,content:n==="text"?"新文本":"",style:{fontSize:18,fontFamily:"方正书宋简体",fontWeight:"normal",fontStyle:"normal",textDecoration:"none",color:"#000000",textAlign:"left",lineHeight:1.2}};n==="image"&&(p.imageSource="url",p.imageUrl="",p.imageField=""),n==="qrcode"&&(p.qrcodeSource="url",p.qrcodeContent="",p.qrcodeField=""),g.value.push(p),o.value=p},B=n=>{o.value=n},C=n=>{const p=g.value.findIndex($=>$.id===n.id);p!==-1&&(g.value[p]={...n},o.value=g.value[p])},b=n=>{var p;g.value=g.value.filter($=>$.id!==n),((p=o.value)==null?void 0:p.id)===n&&(o.value=null)},k=n=>{E.value={...n}},l=n=>{f.value=n},r=n=>{f.value=n},i=()=>{const n={template:f.value,elements:g.value,fieldData:E.value,timestamp:new Date().toISOString()};console.log("=== 证书配置数据 ==="),console.log(JSON.stringify(n,null,2)),console.log("=================="),alert("证书配置已保存到控制台,请打开浏览器开发者工具查看")};return(n,p)=>(e.openBlock(),e.createElementBlock("div",il,[e.createElementVNode("div",sl,[e.createElementVNode("button",{class:"toolbar-btn preview-btn",onClick:p[0]||(p[0]=$=>m.value=!0)},[...p[2]||(p[2]=[e.createElementVNode("span",null,"👁️",-1),e.createElementVNode("span",null,"预览",-1)])]),e.createElementVNode("button",{class:"toolbar-btn save-btn",onClick:i},[...p[3]||(p[3]=[e.createElementVNode("span",null,"💾",-1),e.createElementVNode("span",null,"保存",-1)])])]),e.createElementVNode("div",rl,[e.createVNode(Y,{onAddElement:h,onSelectTemplate:l,onUploadTemplate:r,class:"left-panel"}),e.createVNode(K,{elements:g.value,"selected-element":o.value,"field-data":E.value,template:f.value,onSelectElement:B,onUpdateElement:C,onDeleteElement:b,class:"canvas-area"},null,8,["elements","selected-element","field-data","template"]),e.createElementVNode("div",dl,[o.value?(e.openBlock(),e.createBlock(G,{key:0,element:o.value,onUpdateElement:C,class:"properties-section"},null,8,["element"])):e.createCommentVNode("",!0),e.createVNode(J,{"field-data":E.value,onUpdateFieldData:k,class:"field-data-section"},null,8,["field-data"])])]),e.createVNode(Z,{visible:m.value,elements:g.value,template:f.value,"field-data":E.value,onClose:p[1]||(p[1]=$=>m.value=!1)},null,8,["visible","elements","template","field-data"])]))}},[["__scopeId","data-v-22544f2c"]]);N.CanvasArea=K,N.CertificateEditor=ee,N.CertificatePreview=Z,N.DEFAULT_FIELD_DATA=Q,N.DesignPanel=Y,N.FIELDS_BY_CATEGORY=O,N.FieldDataPanel=J,N.FieldDialog=X,N.PRESET_TEMPLATES=q,N.PropertiesPanel=G,N.SYSTEM_FIELDS=D,N.default=ee,N.extractFields=ke,N.fileToBase64=R,N.getFieldByKey=W,N.getPlaceholderByKey=Ee,N.getTemplateSizeSuggestion=H,N.hasFields=he,N.replaceFields=ye,N.validateImageFile=P,Object.defineProperties(N,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}})});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "z-certificate-editor",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "一个功能强大的基于 Vue 3 的可视化证书编辑器,支持拖拽编辑、系统字段关联、模板管理、图片/二维码处理等功能",
5
5
  "type": "module",
6
6
  "main": "./dist/z-certificate-editor.umd.js",