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/README.md +271 -0
- package/dist/index.cjs +14 -0
- package/dist/index.js +2538 -0
- package/dist/style.css +1 -0
- package/package.json +35 -0
- package/src/components/vue-quokit/index.d.ts +193 -0
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
|
+
>;
|