:root{--color-primary: #1890ff;--color-primary-hover: #40a9ff;--color-danger: #ff4d4f;--color-ok: #52c41a;--color-sidebar: #001529;--color-canvas: #f0f2f5;--color-card: #fff;--color-border: #f0f0f0;--color-border-input: #d9d9d9;--color-text: #333;--color-text-sub: #555;--color-th-bg: #fafafa;--radius: 4px;--radius-lg: 8px;--shadow-card: 0 1px 4px rgba(0,0,0,.08);--font-sm: 12px;--font-base: 13px}body.modal-open{overflow:hidden}.btn{padding:6px 14px;border:1px solid var(--color-border-input);background:#fff;color:var(--color-text);border-radius:var(--radius);font-size:var(--font-base);cursor:pointer;line-height:1.4}.btn:hover{border-color:var(--color-primary);color:var(--color-primary)}.btn-primary{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.btn-primary:hover{background:var(--color-primary-hover);border-color:var(--color-primary-hover);color:#fff}.btn-sm{padding:4px 8px;border:1px solid var(--color-border-input);background:#fff;color:var(--color-text);border-radius:var(--radius);font-size:var(--font-sm);cursor:pointer;white-space:nowrap}.btn-sm:disabled{opacity:.5;cursor:not-allowed}.btn-danger,.btn-sm.danger{background:var(--color-danger);color:#fff;border-color:var(--color-danger)}.btn-add-item{padding:4px 12px;border:1px dashed var(--color-primary);color:var(--color-primary);background:#fff;border-radius:var(--radius);cursor:pointer;font-size:var(--font-sm)}.btn-add-item:hover{background:#e6f7ff}.toolbar{display:flex;gap:8px;margin-bottom:16px;align-items:center;flex-wrap:wrap}.toolbar input,.toolbar select{padding:6px 10px;border:1px solid var(--color-border-input);border-radius:var(--radius);font-size:var(--font-base)}.toolbar button:not([class]){padding:6px 14px;background:var(--color-primary);color:#fff;border:none;border-radius:var(--radius);font-size:var(--font-base);cursor:pointer}.toolbar button:not([class]):hover{background:var(--color-primary-hover)}.table-wrap{overflow-x:auto;background:#fff;border-radius:var(--radius-lg);box-shadow:var(--shadow-card)}.data-table{width:100%;border-collapse:collapse;font-size:var(--font-sm)}.data-table.wide{width:max-content;min-width:100%}.data-table th,.data-table td{padding:8px 10px;text-align:left;border-bottom:1px solid var(--color-border)}.data-table th{background:var(--color-th-bg);font-weight:600;position:sticky;top:0}.data-table--nowrap th,.data-table--nowrap td{white-space:nowrap}.modal{position:fixed;top:0;right:0;bottom:0;left:0;background:#00000073;display:flex;align-items:center;justify-content:center;z-index:100}.modal-content{background:#fff;padding:24px;border-radius:var(--radius-lg);max-height:85vh;overflow-y:auto}.modal-content.sm{width:400px}.modal-content.md{width:600px}.modal-content.lg{width:800px}.modal-btn{display:flex;gap:8px;justify-content:flex-end;margin-top:16px}.modal-btn button{padding:6px 16px;border:1px solid var(--color-border-input);border-radius:var(--radius);cursor:pointer;font-size:var(--font-base);background:#fff}.modal-btn .btn-primary{background:var(--color-primary);color:#fff;border-color:var(--color-primary)}.form-msg{min-height:18px;font-size:var(--font-sm);margin-top:8px}.form-msg.error{color:var(--color-danger)}.form-msg.ok{color:var(--color-ok)}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin:16px 0}.form-grid-3{display:grid;grid-template-columns:1fr 1fr 1fr;gap:10px;margin:16px 0}.form-grid label,.form-grid-3 label{display:flex;flex-direction:column;gap:3px;font-size:var(--font-sm);color:var(--color-text-sub)}.form-grid input,.form-grid select,.form-grid textarea,.form-grid-3 input,.form-grid-3 select,.form-grid-3 textarea{padding:5px 6px;border:1px solid var(--color-border-input);border-radius:var(--radius);font-size:var(--font-sm)}.stat-grid{display:grid;gap:12px;margin-bottom:16px}.stat-grid.cols-3{grid-template-columns:repeat(3,1fr)}.stat-grid.cols-4{grid-template-columns:repeat(4,1fr)}.stat-grid.cols-5{grid-template-columns:repeat(5,1fr)}.stat-grid.cols-6{grid-template-columns:repeat(6,1fr)}.stat-card{background:#fff;padding:18px;border-radius:var(--radius-lg);box-shadow:var(--shadow-card)}.page-title{font-size:16px;font-weight:600;margin-bottom:16px}.section-title{font-size:14px;font-weight:600;margin:16px 0 8px}.readonly-block{padding:10px 12px;background:var(--color-th-bg);border:1px solid #e8e8e8;border-radius:var(--radius);font-size:var(--font-sm);color:var(--color-text-sub)}.empty{padding:32px;text-align:center;color:#999;font-size:var(--font-sm)}:root{--font-md: 15px;--font-lg: 18px;--font-mono: ui-monospace, "Cascadia Code", Consolas, "Courier New", monospace;--color-step-locked: #bfbfbf}.page-title{font-size:var(--font-lg)}.num{font-variant-numeric:tabular-nums;font-family:var(--font-mono)}.data-table tbody tr:nth-child(2n){background:#fbfcfd}.data-table tbody tr:hover{background:#f0f7ff}.pipeline{display:flex;align-items:center;margin:0 0 16px;flex-wrap:wrap}.pipeline-step{display:flex;align-items:center;gap:6px;font-size:var(--font-sm);color:var(--color-step-locked)}.pipeline-step .dot{width:18px;height:18px;border-radius:50%;flex:none;display:inline-flex;align-items:center;justify-content:center;font-size:11px;color:#fff;background:var(--color-step-locked)}.pipeline-step.done{color:var(--color-text)}.pipeline-step.done .dot{background:var(--color-ok)}.pipeline-step.current{color:var(--color-primary);font-weight:600}.pipeline-step.current .dot{background:var(--color-primary)}.pipeline-sep{width:24px;height:2px;background:var(--color-border-input);margin:0 8px;flex:none}.pipeline-sep.done{background:var(--color-ok)}@media (max-width: 640px){.pipeline-sep{width:12px;margin:0 4px}}.kv-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px 24px;padding:10px 12px;background:var(--color-th-bg);border:1px solid #e8e8e8;border-radius:var(--radius)}.kv-grid .kv{display:flex;gap:6px;font-size:var(--font-sm);min-width:0}.kv-grid .k{color:var(--color-text-sub);white-space:nowrap}.kv-grid .v{color:var(--color-text);overflow:hidden;text-overflow:ellipsis}.mini-detail{width:100%;border-collapse:collapse;font-size:var(--font-sm)}.mini-detail th,.mini-detail td{padding:4px 8px;border-bottom:1px solid var(--color-border);text-align:left}.mini-detail th{color:var(--color-text-sub);font-weight:600;background:var(--color-th-bg)}.mini-detail td.num,.mini-detail th.num{text-align:right}.mini-detail .empty-row td{color:#999;text-align:center}.data-table tbody tr.row-overdue{background:#fff1f0}.data-table tbody tr.row-overdue:hover{background:#ffe0de}.data-table tbody tr.row-soon{background:#fffbe6}.data-table tbody tr.row-soon:hover{background:#fff3bf}.badge-overdue{display:inline-block;margin-left:6px;padding:0 6px;border-radius:8px;font-size:11px;color:#fff;background:var(--color-danger)}.badge-today{display:inline-block;margin-left:6px;padding:0 6px;border-radius:8px;font-size:11px;color:#fff;background:#fa8c16}.badge-tomorrow{display:inline-block;margin-left:6px;padding:0 6px;border-radius:8px;font-size:11px;color:#fff;background:var(--color-primary)}.data-table tbody tr.row-upcoming{background:#e6f4ff}.data-table tbody tr.row-upcoming:hover{background:#cfe9ff}.app-header{display:grid;grid-template-columns:1fr auto 1fr;align-items:center}.app-header .header-left{justify-self:start;display:flex;align-items:center;gap:8px}.app-header .header-right{justify-self:end;display:flex;align-items:center;gap:8px}.app-brand{grid-column:2;text-align:center;font-family:Songti SC,STSong,SimSun,Georgia,serif;font-size:20px;font-weight:400;letter-spacing:4px;color:var(--color-sidebar);white-space:nowrap}*{margin:0;padding:0;box-sizing:border-box}body{font-family:Microsoft YaHei,PingFang SC,sans-serif;font-size:14px;color:#333;background:var(--color-canvas)}a{text-decoration:none;color:inherit}
