vue-quokit 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/style.css ADDED
@@ -0,0 +1 @@
1
+ .quote-sheet[data-v-b623c085]{background:#fff;padding:32px 40px;border-radius:4px;box-shadow:0 2px 12px #0000000f}.q-title[data-v-b623c085]{margin:0 0 12px;font-size:18px;font-weight:700;color:#303133;text-align:center}.q-divider[data-v-b623c085]{border-top:1px solid #dcdfe6;margin:10px 0}.q-text[data-v-b623c085]{margin:4px 0;font-size:13px;color:#606266}.q-row[data-v-b623c085]{display:flex;margin-bottom:4px}.q-cell[data-v-b623c085]{padding:8px 12px;font-size:13px;background:#fff;box-sizing:border-box}.q-label[data-v-b623c085]{color:#909399}.q-value[data-v-b623c085]{color:#303133;font-weight:500}.q-table-wrap[data-v-b623c085]{margin-top:14px}.q-table[data-v-b623c085]{width:100%;border-collapse:collapse;font-size:13px}.q-table th[data-v-b623c085]{background:#f5f7fa;padding:10px 12px;border:1px solid #dcdfe6;text-align:center;font-weight:600;color:#303133}.q-table td[data-v-b623c085]{padding:9px 12px;border:1px solid #dcdfe6;color:#606266;text-align:center;vertical-align:middle}.q-table td.merged-cell[data-v-b623c085]{background:#fafbfc;font-weight:500}.q-table tr.subtotal-row td.subtotal-label[data-v-b623c085]{background:#f0f9ff;color:#409eff;font-weight:600;text-align:right;padding-right:16px;font-style:italic}.q-table tr.subtotal-row td.subtotal-value[data-v-b623c085]{background:#f0f9ff;color:#409eff;font-weight:600;text-align:right}.q-empty[data-v-b623c085]{text-align:center;padding:30px;color:#c0c4cc;font-size:14px}.q-summary[data-v-b623c085]{margin-top:12px;margin-left:auto;width:320px}.q-summary-row[data-v-b623c085]{display:flex;justify-content:space-between;padding:6px 0;border-bottom:1px dashed #ebeef5;font-size:13px}.q-summary-label[data-v-b623c085]{color:#606266}.q-summary-value[data-v-b623c085]{font-variant-numeric:tabular-nums}.toolbar[data-v-e3cbb539]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap;flex-shrink:0}.tip[data-v-e3cbb539]{color:#909399;font-size:13px;margin-right:auto}.tip code[data-v-e3cbb539]{background:#f5f7fa;padding:1px 6px;border-radius:3px}.btn-group-inline[data-v-e3cbb539]{display:flex;gap:6px}.btn[data-v-e3cbb539]{padding:6px 14px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}.btn[data-v-e3cbb539]:hover{border-color:#409eff;color:#409eff}.btn-primary[data-v-e3cbb539]{background:#409eff;border-color:#409eff;color:#fff}.btn-primary[data-v-e3cbb539]:hover{background:#66b1ff;color:#fff}.design-table[data-v-e3cbb539]{width:100%;border-collapse:collapse;font-size:13px}.design-table th[data-v-e3cbb539],.design-table td[data-v-e3cbb539]{border:1px solid #ebeef5;padding:6px 8px;text-align:left}.design-table th[data-v-e3cbb539]{background:#f5f7fa;font-weight:600;color:#303133}.design-table td.idx[data-v-e3cbb539]{text-align:center;color:#909399;background:#fafbfc;width:50px}.design-table tbody tr[data-v-e3cbb539]:hover{background:#fafbfc}.cell-input[data-v-e3cbb539]{width:100%;border:1px solid #dcdfe6;border-radius:3px;padding:4px 8px;font-size:13px;outline:none}.cell-input[data-v-e3cbb539]:focus{border-color:#409eff}.muted[data-v-e3cbb539]{color:#c0c4cc;font-size:12px}.mini-btn[data-v-e3cbb539]{background:transparent;border:1px solid #dcdfe6;border-radius:3px;padding:2px 8px;cursor:pointer;font-size:12px;margin-right:3px}.mini-btn[data-v-e3cbb539]:hover{border-color:#409eff;color:#409eff}.mini-btn[data-v-e3cbb539]:disabled{opacity:.3;cursor:not-allowed}.mini-btn.danger[data-v-e3cbb539]:hover{border-color:#f56c6c;color:#f56c6c}.col-merge label[data-v-e3cbb539]{display:flex;align-items:center;gap:4px;font-size:12px;cursor:pointer}.table-wrap[data-v-e3cbb539]{width:100%;overflow:auto;flex:1;min-height:0}.table-wrap.is-narrow .design-table[data-v-e3cbb539]{min-width:900px}.gr-mask[data-v-bd77a67d]{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.gr-dialog[data-v-bd77a67d]{width:380px;background:#fff;border-radius:8px;box-shadow:0 8px 28px #0003}.gr-header[data-v-bd77a67d]{padding:12px 16px;border-bottom:1px solid #ebeef5;display:flex;justify-content:space-between;align-items:center;font-size:15px;font-weight:600;color:#303133}.gr-close[data-v-bd77a67d]{border:none;background:transparent;cursor:pointer;font-size:16px;color:#909399}.gr-close[data-v-bd77a67d]:hover{color:#f56c6c}.gr-content[data-v-bd77a67d]{padding:14px 16px;max-height:70vh;overflow-y:auto}.gr-footer[data-v-bd77a67d]{padding:10px 16px;border-top:1px solid #ebeef5;text-align:right}.gr-tips[data-v-bd77a67d]{background:#ecf5ff;border:1px solid #d9ecff;border-radius:6px;padding:8px 10px;margin-bottom:14px}.gr-tips p[data-v-bd77a67d]{font-size:12px;color:#606266;margin:4px 0;line-height:1.6}.gr-tips code[data-v-bd77a67d]{background:#fff;padding:1px 6px;border-radius:3px;font-size:11px}.gr-form[data-v-bd77a67d]{display:flex;flex-direction:column;gap:10px}.gr-form-row[data-v-bd77a67d]{display:flex;align-items:center;gap:10px}.gr-form-label[data-v-bd77a67d]{width:80px;text-align:right;font-size:12px;color:#606266;flex-shrink:0}.cell-input[data-v-bd77a67d]{width:100%;border:1px solid #dcdfe6;border-radius:3px;padding:4px 8px;font-size:13px;outline:none}.cell-input[data-v-bd77a67d]:focus{border-color:#409eff}.btn[data-v-bd77a67d]{padding:6px 14px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}.btn[data-v-bd77a67d]:hover{border-color:#409eff;color:#409eff}.toolbar[data-v-197b51e4]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap;flex-shrink:0}.tip[data-v-197b51e4]{color:#909399;font-size:13px;margin-right:auto}.btn[data-v-197b51e4]{padding:6px 14px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}.btn[data-v-197b51e4]:hover{border-color:#409eff;color:#409eff}.btn-ghost[data-v-197b51e4]{background:transparent;border:1px dashed #dcdfe6;color:#909399;margin-top:8px}.two-col[data-v-197b51e4]{display:flex;gap:16px;flex:1;min-height:0;overflow:hidden}.col-left[data-v-197b51e4]{flex:1;min-width:0;overflow-y:auto;padding-right:4px}.col-right[data-v-197b51e4]{width:360px;flex-shrink:0;overflow-y:auto;max-height:100%}.two-col.is-narrow[data-v-197b51e4]{flex-direction:column;overflow-y:auto}.two-col.is-narrow .col-right[data-v-197b51e4]{width:100%;flex-shrink:0;overflow:visible}.two-col.is-narrow .col-left[data-v-197b51e4]{overflow:visible}.two-col.is-narrow .preview-box[data-v-197b51e4]{position:static}.sec-block[data-v-197b51e4]{border:1px solid #ebeef5;border-radius:6px;padding:12px;margin-bottom:10px;background:#fafbfc}.sec-header[data-v-197b51e4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.sec-type[data-v-197b51e4]{font-size:13px;font-weight:600;color:#409eff;background:#ecf5ff;padding:2px 8px;border-radius:3px}.sec-actions[data-v-197b51e4]{display:flex;gap:2px}.sec-row[data-v-197b51e4]{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.sec-row label[data-v-197b51e4]{font-size:12px;color:#606266;min-width:54px;flex-shrink:0}.inline-group[data-v-197b51e4]{display:inline-flex;align-items:center;gap:6px;flex-shrink:0}.cell-input[data-v-197b51e4]{flex:1;border:1px solid #dcdfe6;border-radius:3px;padding:4px 8px;font-size:13px;outline:none;min-width:0}.cell-input[data-v-197b51e4]:focus{border-color:#409eff}.cell-input.small[data-v-197b51e4]{flex:0 0 160px;max-width:100%}.muted[data-v-197b51e4]{color:#c0c4cc;font-size:12px}.mini-btn[data-v-197b51e4]{background:transparent;border:1px solid #dcdfe6;border-radius:3px;padding:2px 8px;cursor:pointer;font-size:12px;margin-right:3px}.mini-btn[data-v-197b51e4]:hover{border-color:#409eff;color:#409eff}.mini-btn[data-v-197b51e4]:disabled{opacity:.3;cursor:not-allowed}.mini-btn.danger[data-v-197b51e4]:hover{border-color:#f56c6c;color:#f56c6c}.cells-list[data-v-197b51e4]{display:flex;flex-direction:column;gap:8px}.cell-block[data-v-197b51e4]{border:1px dashed #dcdfe6;border-radius:4px;padding:8px;background:#fff}.cell-toolbar[data-v-197b51e4]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px;color:#909399}.border-config[data-v-197b51e4]{flex-wrap:wrap}.border-config>.label[data-v-197b51e4]{width:100%;margin-bottom:4px}.border-group[data-v-197b51e4]{display:flex;flex-wrap:wrap;gap:4px;flex:1}.border-item[data-v-197b51e4]{display:flex;align-items:center;gap:2px;padding:2px 4px;background:#f8f9fb;border-radius:3px;font-size:11px;color:#606266}.border-item>span[data-v-197b51e4]{min-width:12px;text-align:center}.border-config .mini-btn[data-v-197b51e4]{margin-left:4px}.color-input[data-v-197b51e4]{width:24px;height:22px;border:1px solid #dcdfe6;border-radius:3px;padding:0;cursor:pointer;background:#fff}.cell-input.tiny[data-v-197b51e4]{width:56px;height:22px;font-size:11px;padding:0 4px}.preview-box[data-v-197b51e4]{border:1px solid #dcdfe6;border-radius:6px;overflow:hidden;background:#fff;position:sticky;top:20px}.preview-label[data-v-197b51e4]{padding:8px 12px;background:#f5f7fa;font-size:13px;font-weight:600;color:#606266;border-bottom:1px solid #ebeef5}.preview-inner[data-v-197b51e4]{padding:14px}.p-title[data-v-197b51e4]{margin:6px 0 10px}.p-divider[data-v-197b51e4]{height:1px;background:#dcdfe6;margin:8px 0}.p-text[data-v-197b51e4]{margin:4px 0;font-size:13px;color:#606266}.p-row[data-v-197b51e4]{display:flex;margin-bottom:6px}.p-cell[data-v-197b51e4]{padding:6px 10px;font-size:12px;background:#fff}.p-label[data-v-197b51e4]{color:#909399}.p-value[data-v-197b51e4]{color:#409eff;font-weight:500}.chk-label[data-v-197b51e4]{font-size:12px;color:#606266;display:inline-flex;align-items:center;gap:3px;flex-shrink:0}.toolbar[data-v-3b5d8a7a]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.tip[data-v-3b5d8a7a]{color:#909399;font-size:13px;margin-right:auto}.btn[data-v-3b5d8a7a]{padding:6px 14px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}.btn[data-v-3b5d8a7a]:hover{border-color:#409eff;color:#409eff}.btn-ghost[data-v-3b5d8a7a]{background:transparent;border:1px dashed #dcdfe6;color:#909399;margin-top:8px}.two-col[data-v-3b5d8a7a]{display:flex;gap:16px;flex:1;min-height:0;overflow:hidden}.col-left[data-v-3b5d8a7a]{flex:1;min-width:0;overflow-y:auto;padding-right:4px}.col-right[data-v-3b5d8a7a]{width:360px;flex-shrink:0;overflow-y:auto;max-height:100%}.two-col.is-narrow[data-v-3b5d8a7a]{flex-direction:column;overflow-y:auto}.two-col.is-narrow .col-right[data-v-3b5d8a7a]{width:100%;flex-shrink:0;overflow:visible}.two-col.is-narrow .col-left[data-v-3b5d8a7a]{overflow:visible}.sec-block[data-v-3b5d8a7a]{border:1px solid #ebeef5;border-radius:6px;padding:12px;margin-bottom:10px;background:#fafbfc}.sec-header[data-v-3b5d8a7a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.sec-type[data-v-3b5d8a7a]{font-size:13px;font-weight:600;color:#409eff;background:#ecf5ff;padding:2px 8px;border-radius:3px}.sec-actions[data-v-3b5d8a7a]{display:flex;gap:2px}.sec-row[data-v-3b5d8a7a]{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.sec-row label[data-v-3b5d8a7a]{font-size:12px;color:#606266;min-width:54px;flex-shrink:0}.inline-group[data-v-3b5d8a7a]{display:inline-flex;align-items:center;gap:6px;flex-shrink:0}.cell-input[data-v-3b5d8a7a]{flex:1;border:1px solid #dcdfe6;border-radius:3px;padding:4px 8px;font-size:13px;outline:none;min-width:0}.cell-input[data-v-3b5d8a7a]:focus{border-color:#409eff}.cell-input.small[data-v-3b5d8a7a]{flex:0 0 160px;max-width:100%}.muted[data-v-3b5d8a7a]{color:#c0c4cc;font-size:12px}.mini-btn[data-v-3b5d8a7a]{background:transparent;border:1px solid #dcdfe6;border-radius:3px;padding:2px 8px;cursor:pointer;font-size:12px;margin-right:3px}.mini-btn[data-v-3b5d8a7a]:hover{border-color:#409eff;color:#409eff}.mini-btn[data-v-3b5d8a7a]:disabled{opacity:.3;cursor:not-allowed}.mini-btn.danger[data-v-3b5d8a7a]:hover{border-color:#f56c6c;color:#f56c6c}.cells-list[data-v-3b5d8a7a]{display:flex;flex-direction:column;gap:8px}.cell-block[data-v-3b5d8a7a]{border:1px dashed #dcdfe6;border-radius:4px;padding:8px;background:#fff}.cell-toolbar[data-v-3b5d8a7a]{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;font-size:12px;color:#909399}.border-config[data-v-3b5d8a7a]{flex-wrap:wrap}.border-group[data-v-3b5d8a7a]{display:flex;flex-wrap:wrap;gap:4px;flex:1}.border-item[data-v-3b5d8a7a]{display:flex;align-items:center;gap:2px;padding:2px 4px;background:#f8f9fb;border-radius:3px;font-size:11px;color:#606266}.border-item>span[data-v-3b5d8a7a]{min-width:12px;text-align:center}.color-input[data-v-3b5d8a7a]{width:24px;height:22px;border:1px solid #dcdfe6;border-radius:3px;padding:0;cursor:pointer;background:#fff}.cell-input.tiny[data-v-3b5d8a7a]{width:56px;height:22px;font-size:11px;padding:0 4px}.preview-box[data-v-3b5d8a7a]{border:1px solid #dcdfe6;border-radius:6px;overflow:hidden;background:#fff;position:sticky;top:20px}.preview-label[data-v-3b5d8a7a]{padding:8px 12px;background:#f5f7fa;font-size:13px;font-weight:600;color:#606266;border-bottom:1px solid #ebeef5}.preview-inner[data-v-3b5d8a7a]{padding:14px}.p-divider[data-v-3b5d8a7a]{height:1px;background:#dcdfe6;margin:8px 0}.p-text[data-v-3b5d8a7a]{margin:4px 0;font-size:13px;color:#606266}.p-row[data-v-3b5d8a7a]{display:flex;margin-bottom:6px}.p-cell[data-v-3b5d8a7a]{padding:6px 10px;font-size:12px;background:#fff}.chk-label[data-v-3b5d8a7a]{font-size:12px;color:#606266;display:inline-flex;align-items:center;gap:3px}.toolbar[data-v-8464c396]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.tip[data-v-8464c396]{color:#909399;font-size:13px;margin-right:auto}.btn[data-v-8464c396]{padding:6px 14px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}.btn[data-v-8464c396]:hover{border-color:#409eff;color:#409eff}.btn-primary[data-v-8464c396]{background:#409eff;border-color:#409eff;color:#fff}.btn-primary[data-v-8464c396]:hover{background:#66b1ff;color:#fff}.two-col[data-v-8464c396]{display:flex;gap:16px;flex:1;min-height:0;overflow:hidden}.col-left[data-v-8464c396]{flex:1;min-width:0;overflow-y:auto;padding-right:4px}.col-right[data-v-8464c396]{width:360px;flex-shrink:0;overflow-y:auto;max-height:100%}.two-col.is-narrow[data-v-8464c396]{flex-direction:column;overflow-y:auto}.two-col.is-narrow .col-right[data-v-8464c396]{width:100%;flex-shrink:0;overflow:visible}.two-col.is-narrow .col-left[data-v-8464c396]{overflow:visible}.sec-block[data-v-8464c396]{border:1px solid #ebeef5;border-radius:6px;padding:12px;margin-bottom:10px;background:#fafbfc}.sec-header[data-v-8464c396]{display:flex;justify-content:space-between;align-items:center;margin-bottom:10px}.sec-type[data-v-8464c396]{font-size:13px;font-weight:600;color:#409eff;background:#ecf5ff;padding:2px 8px;border-radius:3px}.sec-actions[data-v-8464c396]{display:flex;gap:2px}.sec-row[data-v-8464c396]{display:flex;align-items:center;gap:6px;margin-bottom:6px;flex-wrap:wrap}.sec-row label[data-v-8464c396]{font-size:12px;color:#606266;min-width:60px;flex-shrink:0}.cell-input[data-v-8464c396]{flex:1;border:1px solid #dcdfe6;border-radius:3px;padding:4px 8px;font-size:13px;outline:none;min-width:0}.cell-input[data-v-8464c396]:focus{border-color:#409eff}.cell-input.tiny[data-v-8464c396]{width:48px;height:22px;font-size:11px;padding:0 4px;flex:none}.mini-btn[data-v-8464c396]{background:transparent;border:1px solid #dcdfe6;border-radius:3px;padding:2px 8px;cursor:pointer;font-size:12px}.mini-btn[data-v-8464c396]:hover{border-color:#409eff;color:#409eff}.mini-btn[data-v-8464c396]:disabled{opacity:.3;cursor:not-allowed}.mini-btn.danger[data-v-8464c396]:hover{border-color:#f56c6c;color:#f56c6c}.empty-hint[data-v-8464c396]{text-align:center;padding:20px;color:#c0c4cc;font-size:13px}.preview-title[data-v-8464c396]{font-size:13px;font-weight:600;color:#606266;margin:0 0 10px}.summary-preview[data-v-8464c396]{border:1px solid #ebeef5;border-radius:6px;padding:12px;background:#fff}.sp-row[data-v-8464c396]{display:flex;justify-content:space-between;align-items:center;padding:6px 0;font-size:13px}.sp-label[data-v-8464c396]{color:#606266}.sp-value[data-v-8464c396]{font-weight:500;font-size:12px}.preview-help[data-v-8464c396]{margin-top:12px;padding:10px 12px;background:#f4f4f5;border-radius:6px;font-size:12px;color:#909399;line-height:1.8}.preview-help b[data-v-8464c396]{color:#606266}.preview-help code[data-v-8464c396]{background:#e9e9eb;padding:1px 5px;border-radius:3px;color:#606266;font-family:monospace}.color-input[data-v-8464c396]{width:24px;height:22px;border:1px solid #dcdfe6;border-radius:3px;padding:0;cursor:pointer;background:#fff}.chk-label[data-v-8464c396]{font-size:12px;color:#606266;display:inline-flex;align-items:center;gap:3px}.help-modal[data-v-9af33ede]{position:fixed;top:0;left:0;right:0;bottom:0;background:#00000073;z-index:9999;display:flex;align-items:center;justify-content:center}.help-dialog[data-v-9af33ede]{background:#fff;border-radius:10px;width:780px;max-width:92vw;max-height:86vh;display:flex;flex-direction:column;box-shadow:0 10px 40px #00000040}.help-header[data-v-9af33ede]{padding:16px 24px;border-bottom:1px solid #ebeef5;display:flex;justify-content:space-between;align-items:center}.help-header h3[data-v-9af33ede]{margin:0;font-size:17px;color:#303133}.close-btn[data-v-9af33ede]{background:transparent;border:none;font-size:20px;cursor:pointer;color:#909399;padding:4px 10px;border-radius:4px}.close-btn[data-v-9af33ede]:hover{background:#f5f7fa;color:#303133}.help-body[data-v-9af33ede]{padding:20px 28px 28px;overflow-y:auto;font-size:13px;color:#606266;line-height:1.7}.help-section[data-v-9af33ede]{margin-bottom:24px}.help-section h4[data-v-9af33ede]{font-size:15px;color:#409eff;margin:0 0 10px;padding-bottom:6px;border-bottom:1px dashed #dcdfe6}.help-section p[data-v-9af33ede]{margin:6px 0}.help-section ul[data-v-9af33ede],.help-section ol[data-v-9af33ede]{margin:6px 0 6px 22px;padding:0}.help-section li[data-v-9af33ede]{margin:3px 0}.help-section code[data-v-9af33ede]{background:#f0f2f5;color:#d63384;padding:1px 6px;border-radius:3px;font-size:12px;font-family:Consolas,monospace}.help-section pre.code[data-v-9af33ede]{background:#f5f7fa;border:1px solid #ebeef5;border-radius:5px;padding:10px 14px;overflow-x:auto;font-size:12px;font-family:Consolas,Monaco,monospace;line-height:1.55;margin:8px 0;color:#495057}.help-table[data-v-9af33ede]{width:100%;border-collapse:collapse;margin:10px 0;font-size:12.5px}.help-table th[data-v-9af33ede],.help-table td[data-v-9af33ede]{border:1px solid #ebeef5;padding:7px 10px;text-align:left}.help-table th[data-v-9af33ede]{background:#f5f7fa;font-weight:600;color:#303133}.help-table td[data-v-9af33ede]:first-child{white-space:nowrap;font-weight:500}.tip-box[data-v-9af33ede]{background:#ecf5ff;border-left:3px solid #409eff;padding:8px 14px;border-radius:3px;color:#606266;margin:10px 0;font-size:12.5px}.tip-box.final-tip[data-v-9af33ede]{background:#f0f9eb;border-left-color:#67c23a;font-size:13px;padding:14px 18px}.steps[data-v-9af33ede]{padding-left:22px}.steps li[data-v-9af33ede]{margin-bottom:4px}.designer[data-v-88fcba25]{padding:0;display:flex;flex-direction:column;height:100%;min-height:0}.tabs[data-v-88fcba25]{display:flex;gap:0;border-bottom:2px solid #ebeef5;margin-bottom:16px;flex-shrink:0}.tab[data-v-88fcba25]{padding:10px 20px;cursor:pointer;font-size:14px;color:#909399;border-bottom:2px solid transparent;margin-bottom:-2px;transition:all .2s}.tab[data-v-88fcba25]:hover{color:#409eff}.tab.active[data-v-88fcba25]{color:#409eff;border-bottom-color:#409eff;font-weight:600}.tab-content[data-v-88fcba25]{padding:10px 0;flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden}.tab-content[data-v-88fcba25]>*{flex:1;min-height:0;display:flex;flex-direction:column}.tab-content-preview[data-v-88fcba25]{overflow-y:auto}.tab-content-preview[data-v-88fcba25]>*{flex:none;min-height:0}.toolbar[data-v-554cd100]{display:flex;align-items:center;gap:10px;margin-bottom:12px;flex-wrap:wrap}.tip[data-v-554cd100]{color:#909399;font-size:13px;margin-right:auto}.btn[data-v-554cd100]{padding:7px 16px;border:1px solid #dcdfe6;border-radius:4px;background:#fff;cursor:pointer;font-size:13px}.btn[data-v-554cd100]:hover{border-color:#409eff;color:#409eff}.de-mask[data-v-554cd100]{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000080;display:flex;align-items:center;justify-content:center;z-index:1000}.de-dialog[data-v-554cd100]{background:#fff;border-radius:10px;width:420px;max-width:92vw;max-height:86vh;display:flex;flex-direction:column;box-shadow:0 10px 40px #00000040}.de-header[data-v-554cd100]{padding:16px 20px;border-bottom:1px solid #ebeef5;display:flex;justify-content:space-between;align-items:center;font-size:15px;font-weight:600;color:#303133;flex-shrink:0}.de-close[data-v-554cd100]{border:none;background:transparent;cursor:pointer;font-size:16px;color:#909399}.de-close[data-v-554cd100]:hover{color:#f56c6c}.de-content[data-v-554cd100]{padding:16px 20px;flex:1;overflow-y:auto}.de-footer[data-v-554cd100]{padding:12px 20px;border-top:1px solid #ebeef5;text-align:right;flex-shrink:0}.form-grid[data-v-554cd100]{display:grid;grid-template-columns:1fr 1fr;gap:12px}.form-cell.full[data-v-554cd100]{grid-column:1 / -1}.form-cell-label[data-v-554cd100]{display:block;font-size:13px;color:#606266;margin-bottom:6px}.page[data-v-554cd100]{padding:20px;background:#fff;border-radius:8px;height:100%;overflow-y:auto}.btn-primary[data-v-554cd100]{background:#409eff;border-color:#409eff;color:#fff}.btn-primary[data-v-554cd100]:hover{background:#66b1ff;color:#fff}.empty-tip[data-v-554cd100]{text-align:center;padding:60px 20px;background:#fafbfc;border:2px dashed #dcdfe6;border-radius:8px}.empty-icon[data-v-554cd100]{font-size:48px;margin-bottom:12px}.empty-text[data-v-554cd100]{color:#909399;font-size:14px;margin-bottom:16px}.data-table[data-v-554cd100]{border:1px solid #ebeef5;border-radius:6px;overflow:hidden;margin-bottom:16px}.main-table[data-v-554cd100]{width:100%;border-collapse:collapse;font-size:13px}.main-table th[data-v-554cd100]{background:#f5f7fa;padding:10px 12px;text-align:left;font-weight:600;color:#303133;border:1px solid #ebeef5}.main-table td[data-v-554cd100]{padding:10px 12px;border:1px solid #ebeef5;color:#606266}.main-table tbody tr[data-v-554cd100]{cursor:pointer;transition:background .15s}.main-table tbody tr[data-v-554cd100]:hover{background:#f5f7fa}.subtotal[data-v-554cd100]{color:#67c23a;font-weight:500;text-align:right;display:block}.op-cell[data-v-554cd100]{white-space:nowrap}.row-btn[data-v-554cd100]{background:none;border:none;cursor:pointer;font-size:13px;color:#409eff;margin-right:10px;padding:2px 4px;border-radius:3px}.row-btn[data-v-554cd100]:hover{text-decoration:underline}.row-btn.danger[data-v-554cd100]{color:#f56c6c}.cell-input[data-v-554cd100]{border:1px solid #dcdfe6;border-radius:3px;padding:5px 8px;font-size:13px;outline:none;width:100%}.cell-input[data-v-554cd100]:focus{border-color:#409eff}
package/package.json ADDED
@@ -0,0 +1,35 @@
1
+ {
2
+ "name": "vue-quokit",
3
+ "version": "0.1.0",
4
+ "type": "module",
5
+ "main": "dist/index.cjs",
6
+ "module": "dist/index.js",
7
+ "types": "src/components/vue-quokit/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./src/components/vue-quokit/index.d.ts",
11
+ "import": "./dist/index.js",
12
+ "require": "./dist/index.cjs"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist",
17
+ "src/components/vue-quokit/index.d.ts"
18
+ ],
19
+ "scripts": {
20
+ "dev": "vite",
21
+ "build": "vite build",
22
+ "preview": "vite preview",
23
+ "prepublishOnly": "npm run build"
24
+ },
25
+ "dependencies": {
26
+ "exceljs": "^4.4.0"
27
+ },
28
+ "peerDependencies": {
29
+ "vue": "^3.4.21"
30
+ },
31
+ "devDependencies": {
32
+ "@vitejs/plugin-vue": "^5.0.4",
33
+ "vite": "^5.2.0"
34
+ }
35
+ }
@@ -0,0 +1,193 @@
1
+ import type { DefineComponent, Ref, ComputedRef } from 'vue';
2
+
3
+ /* ---------- 数据结构 ---------- */
4
+
5
+ export interface ColumnDef {
6
+ field: string;
7
+ title: string;
8
+ editor: 'INPUT' | 'NUMBER' | 'SELECT' | 'TEXTAREA' | 'DATE' | 'CHECKBOX' | 'AUTO_SEQ' | 'AUTO_CALC' | string;
9
+ width: number;
10
+ dict?: string[];
11
+ formula?: string;
12
+ merge_on_group?: boolean;
13
+ dictStr?: string;
14
+ [key: string]: any;
15
+ }
16
+
17
+ export interface GroupRules {
18
+ merge_field?: string;
19
+ show_detail_subtotal?: boolean;
20
+ }
21
+
22
+ export interface SectionCell {
23
+ type: 'text' | 'image' | 'field' | 'separator';
24
+ text?: string;
25
+ field?: string;
26
+ width?: string | number;
27
+ align?: 'left' | 'center' | 'right';
28
+ bold?: boolean;
29
+ italic?: boolean;
30
+ fontSize?: number;
31
+ color?: string;
32
+ border?: { top: string; bottom: string; left: string; right: string };
33
+ colspan?: number;
34
+ rowspan?: number;
35
+ [key: string]: any;
36
+ }
37
+
38
+ export interface SectionRow {
39
+ cells: SectionCell[];
40
+ [key: string]: any;
41
+ }
42
+
43
+ export interface SummaryField {
44
+ field: string;
45
+ label: string;
46
+ type: 'MANUAL_INPUT' | 'AUTO_CALC' | 'AUTO_SUM' | string;
47
+ default?: any;
48
+ formula?: string;
49
+ [key: string]: any;
50
+ }
51
+
52
+ export interface QuokitTemplateData {
53
+ columns: ColumnDef[];
54
+ group_rules?: GroupRules | null;
55
+ header_sections?: SectionRow[];
56
+ footer_sections?: SectionRow[];
57
+ summary_fields?: SummaryField[];
58
+ }
59
+
60
+ /* ---------- Composables ---------- */
61
+
62
+ export interface UseColumnsReturn {
63
+ columns: Ref<ColumnDef[]>;
64
+ groupRules: Ref<Required<GroupRules>>;
65
+ tpl: ComputedRef<{ columns: ColumnDef[]; group_rules: GroupRules | null }>;
66
+ setColumns(raw: ColumnDef[]): void;
67
+ setGroupRules(raw: GroupRules): void;
68
+ }
69
+
70
+ export function useColumns(
71
+ initialColumns?: ColumnDef[],
72
+ initialGroupRules?: GroupRules
73
+ ): UseColumnsReturn;
74
+
75
+ export interface UseSectionsReturn {
76
+ sections: Ref<SectionRow[]>;
77
+ setSections(raw: SectionRow[]): void;
78
+ toTpl(): SectionRow[];
79
+ }
80
+
81
+ export function useSections(
82
+ initialSections?: SectionRow[],
83
+ options?: { isHeader?: boolean }
84
+ ): UseSectionsReturn;
85
+
86
+ export interface UseSummaryReturn {
87
+ fields: Ref<SummaryField[]>;
88
+ tpl: ComputedRef<SummaryField[]>;
89
+ setFields(raw: SummaryField[]): void;
90
+ toTpl(): SummaryField[];
91
+ }
92
+
93
+ export function useSummary(initialFields?: SummaryField[]): UseSummaryReturn;
94
+
95
+ /* ---------- 工具 ---------- */
96
+
97
+ export function generateMockRows(columns: ColumnDef[], count?: number): Record<string, any>[];
98
+
99
+ /* ---------- Vue 组件 ---------- */
100
+
101
+ type Comp<P, X = {}> = DefineComponent<P, {}, any, {}, {}, {}, {}, X>;
102
+
103
+ /**
104
+ * 报价单模板设计器(整体容器,5 个 tab)
105
+ *
106
+ * @example
107
+ * ```vue
108
+ * <script setup lang="ts">
109
+ * import { ref } from 'vue';
110
+ * import { QuokitTemplate, type QuokitTemplateData } from 'vue-quokit';
111
+ *
112
+ * const tpl = ref<QuokitTemplateData>({ columns: [], group_rules: null });
113
+ * const designerRef = ref<InstanceType<typeof QuokitTemplate> | null>(null);
114
+ *
115
+ * function handleSave() {
116
+ * const json = designerRef.value?.getTemplateJSON();
117
+ * console.log(json);
118
+ * }
119
+ * </script>
120
+ *
121
+ * <template>
122
+ * <QuokitTemplate ref="designerRef" v-model:tpl="tpl" />
123
+ * </template>
124
+ * ```
125
+ */
126
+ export declare const QuokitTemplate: Comp<
127
+ { tpl?: QuokitTemplateData; breakpoint?: number },
128
+ {
129
+ /** 取当前设计器里的完整模板 JSON */
130
+ getTemplateJSON(): QuokitTemplateData;
131
+ /** 弹出帮助对话框 */
132
+ showHelp(): void;
133
+ }
134
+ >;
135
+
136
+ /**
137
+ * 报价单数据填写器
138
+ *
139
+ * @example
140
+ * ```vue
141
+ * <script setup lang="ts">
142
+ * import { ref } from 'vue';
143
+ * import { QuokitData, type QuokitTemplateData } from 'vue-quokit';
144
+ *
145
+ * const tpl = ref<QuokitTemplateData>({ columns: [], group_rules: null });
146
+ * const data = ref<Record<string, any>[]>([]);
147
+ * </script>
148
+ *
149
+ * <template>
150
+ * <QuokitData :tpl="tpl" v-model:data="data" />
151
+ * </template>
152
+ * ```
153
+ */
154
+ export declare const QuokitData: Comp<{
155
+ tpl: QuokitTemplateData;
156
+ data?: Record<string, any>[];
157
+ }>;
158
+
159
+ /**
160
+ * 报价单预览 / 导出 / 打印
161
+ *
162
+ * @example
163
+ * ```vue
164
+ * <script setup lang="ts">
165
+ * import { ref } from 'vue';
166
+ * import { QuokitSheet, type QuokitTemplateData } from 'vue-quokit';
167
+ *
168
+ * const tpl = ref<QuokitTemplateData>({ columns: [], group_rules: null });
169
+ * const data = ref<Record<string, any>[]>([]);
170
+ * const sheetRef = ref<InstanceType<typeof QuokitSheet> | null>(null);
171
+ *
172
+ * function doExport() {
173
+ * sheetRef.value?.exportExcel();
174
+ * }
175
+ * function doPrint() {
176
+ * sheetRef.value?.print();
177
+ * }
178
+ * </script>
179
+ *
180
+ * <template>
181
+ * <QuokitSheet ref="sheetRef" :tpl="tpl" :data="data" />
182
+ * </template>
183
+ * ```
184
+ */
185
+ export declare const QuokitSheet: Comp<
186
+ { tpl: QuokitTemplateData; data?: Record<string, any>[]; placeholder?: string },
187
+ {
188
+ /** 导出 Excel。撑长模式下会自动加高行高。 */
189
+ exportExcel(expandRowHeight?: boolean): Promise<void>;
190
+ /** 打印报价单。竖版时 width 设为 800。 */
191
+ print(vertical?: boolean): void;
192
+ }
193
+ >;