:root{font-family:Inter,"PingFang SC","Microsoft YaHei",sans-serif;color:#172033;background:#f4f7fb;font-size:14px}*{box-sizing:border-box}body{margin:0}button,input,select,textarea{font:inherit}button{cursor:pointer}#app{display:grid;grid-template-columns:190px 1fr;min-height:100vh}aside{background:#142f58;color:#fff;padding:20px 14px;display:flex;flex-direction:column}.brand{font-size:18px;font-weight:700;padding:3px 10px 22px}nav button{display:block;width:100%;border:0;background:transparent;color:#ccd8eb;text-align:left;padding:11px 12px;border-radius:8px;margin:2px 0}nav button.active{background:#2e65b1;color:white;font-weight:600}.aside-foot{margin-top:auto;border-top:1px solid #395170;padding:15px 8px 0}.aside-foot label,.aside-foot small{display:block;color:#c4d0e2;font-size:12px;margin:5px 0}.aside-foot select{width:100%;padding:8px;border-radius:7px;border:0}main{padding:22px;min-width:0}header{display:flex;justify-content:space-between;align-items:center;margin-bottom:18px}h1{font-size:23px;margin:0 0 4px}header p,.muted{margin:0;color:#708096;font-size:13px}.primary,.secondary,.danger-btn{border-radius:8px;padding:8px 13px;min-height:38px;border:1px solid #ccd6e4}.primary{background:#2862ad;border-color:#2862ad;color:white}.secondary{background:#fff;color:#28364a}.danger-btn{background:#b93642;border-color:#b93642;color:white}.metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px}.metric,.panel{background:#fff;border:1px solid #dfe6ef;border-radius:11px}.metric{padding:16px}.metric strong{font-size:27px;display:block;margin-top:7px}.red{color:#bd3440}.orange{color:#b86712}.blue{color:#2862ad}.green{color:#147553}.panel-title{padding:14px 16px;border-bottom:1px solid #e7ecf3;font-weight:650}.task-row{padding:13px 16px;border-bottom:1px solid #edf1f6;display:grid;grid-template-columns:minmax(220px,1.5fr) 120px 120px 1fr auto;gap:12px;align-items:center}.task-row:last-child{border:0}.task-row:hover,.case-table tbody tr:hover{background:#f7f9fc}.client{font-weight:650}.code{font-size:11px;color:#7a889b;margin-top:3px}.badge{display:inline-block;padding:3px 7px;border-radius:12px;font-size:11px;background:#e8f1ff;color:#285e9c}.badge.ext{background:#fff0d8;color:#9a5708}.badge.late{background:#fdebed;color:#ad303b}.toolbar{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:11px}.toolbar input,.toolbar select,.form-grid input,.form-grid select,.form-grid textarea{border:1px solid #ccd6e4;border-radius:7px;padding:8px;background:white;min-height:38px}.toolbar input{min-width:230px}.quick{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:12px}.quick button{border:1px solid #d3dce8;border-radius:18px;padding:6px 10px;background:white}.quick button.active{background:#2862ad;color:white;border-color:#2862ad}.table-wrap{overflow:auto;background:white;border:1px solid #dfe6ef;border-radius:11px}.case-table{border-collapse:collapse;width:100%;min-width:1120px}.case-table th,.case-table td{padding:10px;border-bottom:1px solid #edf1f6;text-align:left;white-space:nowrap}.case-table th{font-size:12px;color:#68778b;background:#fafbfc;position:sticky;top:0}.case-table tbody tr{cursor:pointer}.next{max-width:190px;overflow:hidden;text-overflow:ellipsis}.pager{display:flex;justify-content:space-between;align-items:center;margin-top:10px}.tabs{display:flex;gap:7px;margin-bottom:13px}.tabs button{border:1px solid #d2dbe7;background:white;border-radius:8px;padding:8px 12px}.tabs button.active{background:#2862ad;color:#fff;border-color:#2862ad}.calendar{display:grid;grid-template-columns:repeat(7,1fr);gap:6px}.day{background:#fff;border:1px solid #dfe6ef;border-radius:8px;min-height:105px;padding:8px}.day b{font-size:12px}.day .event{font-size:11px;background:#eaf2ff;color:#285e9c;padding:5px;border-radius:5px;margin-top:6px}.forecast-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px}.month-card{padding:18px}.bar-row{display:grid;grid-template-columns:90px 1fr 55px;gap:10px;align-items:center;margin:12px 0}.bar-track{height:9px;background:#e8edf4;border-radius:8px}.bar{height:9px;background:#2d66b2;border-radius:8px}.admin-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px}.admin-box{padding:18px}.admin-box input{display:block;width:100%;margin:10px 0}.notice{padding:10px;background:#eef4ff;color:#285e9c;border-radius:7px;margin:10px 0}.modal{position:fixed;inset:0;background:rgba(8,15,28,.5);z-index:var(--z-overlay);display:flex;justify-content:flex-end}.modal.hidden,.hidden{display:none!important}.modal-card{width:min(600px,100%);height:100%;background:#fff;padding:19px;overflow:auto;box-shadow:-12px 0 30px rgba(0,0,0,.2)}.modal-head{display:flex;justify-content:space-between;border-bottom:1px solid #e2e8f0;padding-bottom:13px}.modal h2{margin:0 0 5px}.modal p{margin:0;color:#718096}.icon{border:0;background:transparent;font-size:25px}.case-strip{display:grid;grid-template-columns:repeat(3,1fr);gap:8px;background:#f4f7fb;border-radius:8px;padding:11px;margin:13px 0}.case-strip span{display:block;font-size:11px;color:#748296}.action-select{display:grid;grid-template-columns:120px 1fr;gap:10px;align-items:center;margin:14px 0}.action-select select{padding:9px;border:1px solid #ccd6e4;border-radius:7px}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}.field.full{grid-column:1/-1}.field label{display:block;color:#607086;font-size:12px;margin-bottom:5px}.field input,.field select,.field textarea{width:100%}.field textarea{min-height:70px;resize:vertical}.req{color:#bd3440;float:right}.error{background:#fdebed;color:#a82e39;padding:9px;border-radius:7px;margin-top:12px}.modal-actions{border-top:1px solid #e2e8f0;margin-top:16px;padding-top:14px;display:flex;justify-content:flex-end;align-items:center;gap:8px}.modal-actions span{margin-right:auto;color:#147553}.empty{text-align:center;color:#718096;padding:45px}.new-form{padding-top:5px}
@media(max-width:760px){#app{grid-template-columns:1fr}aside{padding:10px}.brand{padding:3px 7px 8px}nav{display:flex;overflow:auto}nav button{width:auto;white-space:nowrap}.aside-foot{display:none}main{padding:13px}header{align-items:flex-start}header .primary{display:none}.metrics{grid-template-columns:1fr 1fr}.task-row{grid-template-columns:1fr auto}.task-row>:nth-child(3),.task-row>:nth-child(4){display:none}.forecast-grid,.admin-grid{grid-template-columns:1fr}.modal{align-items:flex-end}.modal-card{height:auto;max-height:93%;border-radius:14px 14px 0 0}.form-grid{grid-template-columns:1fr}.field.full{grid-column:auto}.case-strip{grid-template-columns:1fr 1fr}.calendar{grid-template-columns:1fr}.day{min-height:auto}.action-select{grid-template-columns:1fr}}

/* Notion-inspired interface */
:root{color:#37352f;background:#fff}body{background:#fff}#app{grid-template-columns:220px 1fr}aside{background:#f7f7f5;color:#37352f;border-right:1px solid #ecece9;padding:14px 10px}.brand{font-size:15px;color:#2f2f2b;padding:8px 10px 16px}nav button{color:#5f5e5a;border-radius:5px;padding:8px 10px}nav button:hover{background:#eeeeeb}nav button.active{background:#e8e8e5;color:#252521;font-weight:600}.aside-foot{border-color:#e3e3df}.aside-foot label,.aside-foot small{color:var(--text-secondary)}.aside-foot select{border:1px solid #dededb;background:#fff;color:#37352f}main{max-width:1600px;padding:28px 32px}h1{font-size:25px}.primary{background:#37352f;border-color:#37352f}.secondary{border-color:#dededb;color:#37352f}.metric,.panel,.table-wrap{border-color:#e6e6e2;border-radius:6px;box-shadow:none}.metric strong{font-size:25px}.toolbar input,.toolbar select,.form-grid input,.form-grid select,.form-grid textarea{border-color:#dededb;border-radius:5px}.quick button,.tabs button{border-color:#dededb;border-radius:5px}.quick button.active,.tabs button.active{background:#37352f;border-color:#37352f}.badge{border-radius:4px;background:#e7f0f8;color:#315d7d}.modal-card{box-shadow:-4px 0 18px rgba(0,0,0,.12)}
.kanban{display:grid;grid-template-columns:repeat(4,minmax(260px,1fr));gap:12px;overflow-x:auto;align-items:start;padding-bottom:12px}.kanban-column{background:#f7f7f5;border-radius:6px;min-height:420px;padding:8px}.kanban-head{display:flex;justify-content:space-between;align-items:center;padding:5px 5px 10px;font-size:13px;font-weight:600}.kanban-head b{font-weight:400;color:var(--text-secondary)}.kanban-list{display:flex;flex-direction:column;gap:7px}.case-card{background:#fff;border:1px solid #e4e4e0;border-radius:5px;padding:11px;cursor:pointer;box-shadow:0 1px 2px rgba(0,0,0,.03)}.case-card:hover{background:#fbfbfa}.case-card.dragging{opacity:.45}.kanban-column.drag-over{background:#eeeee9;outline:2px solid #b8b8b2}.case-card-top{display:flex;justify-content:space-between;gap:8px;align-items:flex-start}.case-card .client{white-space:normal;line-height:1.4}.expiry{font-size:11px;color:#576f55;background:#edf3ec;padding:3px 5px;border-radius:4px;white-space:nowrap}.expiry.over{color:#9f3434;background:#f7e9e9}.model{font-size:12px;color:var(--text-secondary);margin:9px 0}.inline-fields{display:grid;grid-template-columns:1fr 1fr;gap:7px;border-top:1px solid #eeeeeb;padding-top:9px}.inline-fields label{font-size:10px;color:var(--text-secondary)}.inline-fields input,.inline-fields select{display:block;width:100%;margin-top:4px;border:1px solid #e3e3df;border-radius:4px;padding:5px;background:#fff;color:#37352f;font-size:12px}.card-next{display:flex;justify-content:space-between;gap:8px;color:var(--text-secondary);font-size:11px;margin-top:9px}.column-empty{color:var(--text-tertiary);text-align:center;padding:24px 8px;font-size:12px}.other-cases{margin-top:12px;color:var(--text-secondary)}.other-cases summary{cursor:pointer;padding:8px}.kanban.loose{grid-template-columns:minmax(260px,360px);margin-top:8px}
@media(max-width:760px){#app{grid-template-columns:1fr}aside{background:#f7f7f5}main{padding:16px}.kanban{grid-template-columns:repeat(4,82vw)}.inline-fields input,.inline-fields select{font-size:16px}}
.metric-link{border:1px solid #e6e6e2;text-align:left;color:inherit}.metric-link:hover,.issue-grid button:hover{background:#f7f7f5}.issue-panel{margin-bottom:14px}.issue-grid{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:#ecece9}.issue-grid button{border:0;background:#fff;padding:14px;text-align:left}.issue-grid b{display:block;font-size:22px}.issue-grid span{font-size:12px;color:var(--text-secondary)}.quick-table{overflow:auto}.quick-row{display:grid;grid-template-columns:minmax(280px,1fr) 170px 180px auto;gap:8px;align-items:center;padding:10px 14px;border-bottom:1px solid #eeeeeb}.quick-row small{display:block;color:var(--text-secondary);margin-top:4px}.quick-row input,.quick-row select,.column-sort{border:1px solid #dededb;border-radius:4px;padding:7px;background:#fff}.status-checks{display:flex;align-items:center;gap:10px;padding:5px 8px;border:1px solid #dededb;border-radius:5px}.status-checks label{white-space:nowrap;font-size:12px}.kanban-head>div{display:flex;align-items:center;gap:6px}.column-sort{padding:3px;font-size:11px}.timers{display:flex;flex-direction:column;align-items:flex-end;gap:4px}.appointment-left,.stage-age{font-size:10px;border-radius:3px;padding:2px 4px;white-space:nowrap}.appointment-left.safe{background:#edf3ec;color:#4d714a}.appointment-left.warn{background:#fbf1dd;color:#96651e}.appointment-left.urgent{background:#f7e9e9;color:#a33c3c}.stage-age{background:#f1f1ef;color:#6f6e69}.attention-actions{display:flex;gap:5px;margin-top:9px}.attention-actions button{flex:1;border:1px solid #dededb;background:#fff;border-radius:4px;padding:5px;font-size:11px}.history{border-top:1px solid #eeeeeb;border-bottom:1px solid #eeeeeb;padding:10px 0;margin-bottom:15px}.history summary{cursor:pointer;font-weight:600}.history>div{padding:7px 4px;border-top:1px solid #f0f0ed;font-size:12px}.history small{display:block;color:var(--text-secondary);margin-top:3px}.task-board{display:grid;grid-template-columns:repeat(3,minmax(260px,1fr));gap:12px}.task-column{background:#f7f7f5;border-radius:6px;padding:8px;min-height:420px}.task-list{display:flex;flex-direction:column;gap:8px}.task-card{background:#fff;border:1px solid #e4e4e0;border-radius:5px;padding:11px}.task-card.p0{border-left:3px solid #c94a4a}.task-card-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:9px}.due-count{font-size:11px;color:#b63838}.task-card p{font-size:12px;color:#5f5e5a}.task-card button{width:100%}.quality-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin:14px 0}.monthly-new{padding-bottom:12px}.monthly-new .toolbar,.bar-box,#newBars{padding:12px 16px;margin:0}.month-card strong{font-size:26px}
.quick-row.saved{background:#f3f8f4}.quick-row button:disabled{cursor:default;opacity:.72}
@media(max-width:760px){.issue-grid{grid-template-columns:1fr 1fr}.quick-row{grid-template-columns:1fr}.status-checks{overflow:auto;width:100%}.task-board{grid-template-columns:repeat(3,82vw);overflow:auto}.quality-grid{grid-template-columns:1fr}.case-filters input{width:100%}}
.status-menu{position:relative;min-width:210px}.status-menu summary{list-style:none;border:1px solid #dededb;border-radius:5px;padding:10px 34px 10px 11px;background:#fff;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.status-menu summary:after{content:'⌄';position:absolute;right:12px}.status-menu>div{position:absolute;z-index:var(--z-dropdown);top:44px;left:0;width:210px;background:#fff;border:1px solid #dededb;border-radius:6px;padding:7px;box-shadow:0 8px 24px rgba(0,0,0,.12)}.status-menu label{display:block;padding:7px}.status-menu input{accent-color:#16835b;margin-right:8px}.sort-buttons{display:flex;gap:3px}.sort-buttons button{border:0;background:transparent;color:var(--text-secondary);font-size:11px;padding:3px}.sort-buttons button:hover{background:#e9e9e5}.case-card{position:relative}.maintained-dot{position:absolute;right:-4px;top:-4px;width:13px;height:13px;border-radius:50%;background:#c9c9c5;border:2px solid #fff}.maintained-dot.done{background:#28a36a}.line-chart{width:100%;min-width:680px;height:245px}.line-chart text{font-size:11px;fill:var(--text-secondary)}#newChart{overflow:auto;padding:8px 14px}
.type-panel{margin-bottom:14px}.type-grid{display:grid;grid-template-columns:repeat(4,1fr)}.type-grid button{border:0;border-right:1px solid #eee;border-bottom:1px solid #eee;background:#fff;padding:14px;text-align:left;display:flex;justify-content:space-between;gap:12px}.type-grid b{font-size:22px;color:#c33}.dashboard-grid{display:grid;grid-template-columns:1fr 1fr;gap:14px;margin:14px 0}.summary-grid{display:grid;grid-template-columns:repeat(4,1fr)}.summary-grid div{padding:18px;border-right:1px solid #eee}.summary-grid b{display:block;font-size:24px}.summary-grid span{font-size:12px;color:var(--text-secondary)}.funnel{padding:12px}.funnel div{display:flex;justify-content:space-between;padding:7px 10px;margin:4px auto;background:#eaf0f8}.funnel div:nth-child(2){width:90%}.funnel div:nth-child(3){width:80%}.funnel div:nth-child(4){width:70%}.month-table table{border-collapse:collapse;width:100%;min-width:1050px}.month-table th,.month-table td{border:1px solid #e6e6e2;padding:7px;text-align:center}.table-scroll{overflow:auto}.task-type-strip{display:flex;gap:7px;overflow:auto;margin-bottom:12px}.task-type-strip span{min-width:165px;border:1px solid #e6e6e2;border-radius:5px;padding:10px;background:#fff;font-size:11px}.task-type-strip b{font-size:20px;color:#c33;margin-right:8px}.quick-maintain{margin-bottom:14px}.card-actions{display:flex;gap:5px;margin-top:9px}.card-actions button{flex:1;border:1px solid #dededb;background:#fff;border-radius:4px;padding:5px;font-size:11px}.attention-month{font-size:12px;color:#8a5a16;background:#fbf1dd;padding:7px;border-radius:4px}
@media(max-width:760px){.type-grid{grid-template-columns:1fr 1fr}.dashboard-grid{grid-template-columns:1fr}.summary-grid{grid-template-columns:1fr 1fr}}
.quick-maintain .quick-table{max-height:360px;overflow:auto}
.todo-pair{display:grid;grid-template-columns:1fr 1fr;gap:14px}.todo-pair .type-panel{margin:0}.todo-pair .type-grid{display:block}.todo-pair .type-grid button{width:100%;border-right:0;min-height:47px;align-items:center}.task-type-strip button{min-width:165px;border:1px solid #e6e6e2;border-radius:5px;padding:10px;background:#fff;font-size:11px;text-align:left}.task-type-strip button.active{border-color:#37352f;background:#f2f2ef}.task-type-strip button b{font-size:20px;color:#c33;margin-right:8px}.selected-task-list{display:grid;grid-template-columns:repeat(3,minmax(250px,1fr));gap:10px;padding:12px}.selected-task-list>.empty{grid-column:1/-1}
@media(max-width:760px){.todo-pair{grid-template-columns:1fr}.selected-task-list{grid-template-columns:1fr}}

/* Quiet, high-density polish for the existing working layout */
:root{--ink:#2f2f2b;--muted:var(--text-secondary);--line:#e7e6e2;--soft:#f7f7f5;--blue:#2f6fba;--red:#c13f45;--shadow:0 1px 2px rgba(15,15,15,.04),0 5px 18px rgba(15,15,15,.035)}
body{background:#fbfbfa;color:var(--ink);letter-spacing:.005em}
aside{background:#f4f4f2;box-shadow:inset -1px 0 #e8e7e3}
main{background:linear-gradient(180deg,#fff 0,#fbfbfa 210px)}
header{padding-bottom:15px;border-bottom:1px solid #efefec}
header p,.muted{color:var(--muted)}
button,input,select,textarea{transition:border-color .15s ease,background-color .15s ease,box-shadow .15s ease,transform .15s ease}
button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible{outline:2px solid rgba(47,111,186,.28);outline-offset:2px}
.primary:hover{background:#292824;border-color:#292824}.secondary:hover,.tabs button:hover,.task-type-strip button:hover{background:#f5f5f2}
.panel,.metric,.table-wrap{background:rgba(255,255,255,.96);box-shadow:var(--shadow)}
.panel-title{min-height:50px;display:flex;align-items:center;justify-content:space-between;color:#383732}
.todo-pair .type-grid button:hover{background:#f8f8f6;padding-left:17px}
.todo-pair .type-grid button b,.task-type-strip button b{font-variant-numeric:tabular-nums}
.case-card,.task-card{box-shadow:0 1px 2px rgba(15,15,15,.045)}
.case-card:hover,.task-card:hover{border-color:#cfcec9;box-shadow:0 5px 16px rgba(15,15,15,.07);transform:translateY(-1px)}
.kanban-column,.task-column{border:1px solid #efefec}
.modal{backdrop-filter:blur(2px)}.modal-card{border-left:1px solid #e5e4df}
.overdue-monitor{margin:14px 0;overflow:hidden}.overdue-monitor .panel-title small{display:block;color:var(--muted);font-weight:400;margin-top:3px}.monitor-date{font-size:12px;color:var(--muted);font-weight:400}
.overdue-summary{display:grid;grid-template-columns:repeat(4,1fr);border-bottom:1px solid var(--line)}.overdue-summary>div{padding:15px 17px;border-right:1px solid var(--line)}.overdue-summary>div:last-child{border-right:0}.overdue-summary b{display:block;font-size:24px;color:var(--red);font-variant-numeric:tabular-nums}.overdue-summary span{font-size:12px;color:var(--muted)}
.overdue-table{width:100%;border-collapse:collapse;min-width:980px}.overdue-table th,.overdue-table td{padding:10px 13px;border-bottom:1px solid #efefec;text-align:center;font-size:12px}.overdue-table th{position:sticky;top:0;background:#fafaf8;color:var(--muted);font-weight:550}.overdue-table th:first-child,.overdue-table td:first-child{text-align:left}.overdue-table tr:last-child td{border-bottom:0}.overdue-table tr.has-overdue{background:#fffafa}.overdue-table tr.has-overdue:hover{background:#fff5f4}.overdue-number{font-weight:700;color:var(--red);font-size:14px!important;font-variant-numeric:tabular-nums}
@media(max-width:760px){.overdue-summary{grid-template-columns:1fr 1fr}.overdue-summary>div:nth-child(2){border-right:0}.overdue-summary>div:nth-child(-n+2){border-bottom:1px solid var(--line)}}

/* UI/UX Pro Max revision: restrained Notion-like working surface */
:root{--ui-text:#37352f;--ui-muted:var(--text-secondary);--ui-border:#e7e7e3;--ui-soft:#f7f7f5;--ui-hover:#efefec;--ui-focus:#2f6fba;--ui-danger:#c63f46;--ui-success:#23875d;--ui-warning:#a86a18}
body{background:#fff;color:var(--ui-text);font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;letter-spacing:0}
.skip-link{position:fixed;z-index:var(--z-toast);top:8px;left:8px;transform:translateY(-150%);padding:7px 11px;border-radius:5px;background:#37352f;color:#fff;text-decoration:none}.skip-link:focus{transform:none}
aside{background:#f7f7f5;border-right:1px solid #e8e8e4;box-shadow:none}.brand{display:block;color:#2f2f2b;font-size:15px;font-weight:650;padding:8px 10px 16px}
nav button{min-height:36px;color:#5f5e5a;font-weight:450}nav button:hover{background:#eeeeeb;color:#37352f}nav button.active{background:#e9e9e6;color:#252521;box-shadow:none;font-weight:600}
.aside-foot{border-color:#e3e3df}.aside-foot label,.aside-foot small{color:var(--ui-muted)}.aside-foot select{border:1px solid #dededb;box-shadow:none}
main{background:#fff}header{border-color:#efefec}h1{color:#2f2f2b;font-weight:700;letter-spacing:-.015em}header p,.muted{color:var(--ui-muted)}
.primary{background:#37352f;border-color:#37352f;color:#fff;box-shadow:none}.primary:hover{background:#292824;border-color:#292824}.secondary{background:#fff;border-color:#dededb;color:#37352f}.secondary:hover{background:#f7f7f5;border-color:#c8c8c3}.danger-btn{background:#b93b43;border-color:#b93b43}
button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:2px solid rgba(47,111,186,.32);outline-offset:2px}
.panel,.metric,.table-wrap{background:#fff;border-color:var(--ui-border);border-radius:6px;box-shadow:none}.panel-title{background:#fff;border-color:#ededE9;color:#37352f;font-weight:600}
.todo-pair .type-grid button,.type-grid button{border-color:#eeeeeb;background:#fff}.todo-pair .type-grid button:hover{background:#f7f7f5;padding-left:14px}.type-grid b,.task-type-strip button b{color:var(--ui-danger);font-weight:650}
.summary-grid div{border-color:#eeeeeb}.summary-grid b,.metric strong,.month-card strong{color:#2f2f2b;font-variant-numeric:tabular-nums}
.funnel div{background:#f1f1ef;color:#5f5e5a}.funnel div b{color:#37352f}
.kanban-column,.task-column{background:#f7f7f5;border-color:#eeeeeb;border-radius:6px}.kanban-head{color:#37352f}.case-card,.task-card{border-color:#e4e4e0;border-radius:5px;box-shadow:0 1px 2px rgba(15,15,15,.03)}.case-card:hover,.task-card:hover{background:#fbfbfa;border-color:#d2d2cd;box-shadow:0 2px 6px rgba(15,15,15,.05);transform:none}
.client{color:#37352f}.code,.model,.card-next{color:var(--ui-muted)}.expiry{background:#edf3ec;color:#4e704d}.expiry.over{background:#f7e9e9;color:#9f3434}.badge{background:#e7f0f8;color:#315d7d}.badge.ext{background:#fff0d8;color:#915708}.badge.late{background:#f8e9e9;color:#a43a40}
.inline-fields input,.inline-fields select,.toolbar input,.toolbar select,.form-grid input,.form-grid select,.form-grid textarea,.quick-row input,.quick-row select,.column-sort,.status-menu summary{border-color:#dededb;background:#fff}.inline-fields input:hover,.inline-fields select:hover,.toolbar input:hover,.toolbar select:hover,.form-grid input:hover,.form-grid select:hover,.form-grid textarea:hover{border-color:#bdbdb7}
.tabs button,.task-type-strip button{border-color:#dededb;background:#fff;color:#5f5e5a}.tabs button.active,.task-type-strip button.active{background:#37352f;border-color:#37352f;color:#fff}.status-menu>div{border-color:#dededb;box-shadow:0 8px 24px rgba(15,15,15,.12)}
.month-table th,.month-table td,.overdue-table th,.overdue-table td{border-color:#e8e8e4}.month-table thead th,.overdue-table th,.case-table th{background:#fafaf9;color:#6f6e69}.month-table tbody tr:hover,.overdue-table tbody tr:hover{background:#fafaf9}
.line-chart polyline{stroke:#4979ae}.line-chart circle{fill:#4979ae}
.modal{background:rgba(15,15,15,.38)}.modal-card{border-color:#e4e4e0;box-shadow:-8px 0 28px rgba(15,15,15,.14)}.modal-head,.modal-actions{border-color:#e6e6e2}.icon{display:grid;place-items:center;width:38px;height:38px;border-radius:5px;color:var(--text-secondary)}.icon:hover{background:#f1f1ef;color:#37352f}.case-strip{background:#f7f7f5}.error{background:#f8e9e9;color:#9f3434;border:1px solid #edd0d0}
.maintained-dot.done{background:var(--ui-success)}.appointment-left.safe{background:#edf3ec;color:#4e704d}.appointment-left.warn{background:#fff0d8;color:#915708}.appointment-left.urgent{background:#f7e9e9;color:#9f3434}
.overdue-summary b,.overdue-number{color:var(--ui-danger)}.overdue-table tr.has-overdue{background:#fffafa}.overdue-table tr.has-overdue:hover{background:#fff6f5}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important}.case-card:hover,.task-card:hover{transform:none}}

/* Notion proportion pass: compact, neutral, database-first */
:root{--notion-text:#37352f;--notion-muted:var(--text-secondary);--notion-faint:var(--text-tertiary);--notion-line:rgba(55,53,47,.12);--notion-hover:rgba(55,53,47,.06);--notion-selected:rgba(55,53,47,.09);--notion-red:#d44c47;--notion-red-bg:rgba(212,76,71,.10);--notion-green:#448361;--notion-blue:#337ea9}
#app{grid-template-columns:220px minmax(0,1fr)}
aside{position:sticky;top:0;height:100vh;min-height:0;padding:12px 10px;background:#f7f7f5;overflow:hidden}
.brand{display:flex;align-items:center;gap:8px;height:38px;padding:5px 8px 9px;font-size:14px;font-weight:600;color:var(--notion-text)}
.brand-logo{display:grid;place-items:center;width:22px;height:22px;flex:0 0 22px;border:1px solid rgba(55,53,47,.16);border-radius:5px;background:#fff;color:#4f4e49;font-size:11px;font-weight:700;box-shadow:0 1px 2px rgba(15,15,15,.04)}
nav button{min-height:32px;margin:1px 0;padding:5px 8px;border-radius:5px;font-size:14px;line-height:22px;color:#4f4e49}nav button:hover{background:var(--notion-hover)}nav button.active{background:var(--notion-selected);color:var(--notion-text)}
.aside-foot{position:sticky;bottom:0;margin-top:auto;padding:12px 8px 5px;background:#f7f7f5;border-color:var(--notion-line)}.aside-foot label{margin:0 0 6px;font-size:11px;color:var(--notion-muted)}.aside-foot select{height:34px;padding:5px 8px;border-color:var(--notion-line);border-radius:5px;font-size:13px}.aside-foot small{margin:6px 0 0;font-size:11px;line-height:1.35;color:var(--notion-muted)}
main{width:100%;max-width:none;padding:24px clamp(24px,2.5vw,42px)}header{margin-bottom:14px;padding-bottom:13px}h1{font-size:24px;line-height:1.25}header p{margin-top:3px;font-size:12px}
.panel-title{min-height:40px;padding:9px 14px;font-size:13px}.panel{border-radius:5px}
.todo-pair{gap:12px}.todo-pair .type-grid button{min-height:35px;padding:6px 14px;font-size:13px;line-height:20px}.todo-pair .type-grid button:hover{padding-left:14px;background:var(--notion-hover)}.todo-pair .type-grid b{font-size:17px;line-height:20px;color:var(--notion-red);font-weight:600}
.dashboard-grid{gap:12px;margin:12px 0}.summary-grid div{padding:13px 15px}.summary-grid b{font-size:20px}.summary-grid span{font-size:11px}.funnel{padding:9px 12px}.funnel div{padding:5px 9px;margin:3px auto;font-size:12px}
.red,.due-count,.type-grid b,.task-type-strip button b,.overdue-summary b,.overdue-number{color:var(--notion-red)!important}.type-grid b,.task-type-strip button b,.due-count,.overdue-number{font-variant-numeric:tabular-nums}.task-type-strip button b{font-size:17px;font-weight:600}.overdue-summary b{font-size:20px}
.tabs{gap:4px;margin-bottom:10px}.tabs button{min-height:32px;padding:5px 11px;border-color:transparent;background:transparent}.tabs button:hover{background:var(--notion-hover)}.tabs button.active,.task-type-strip button.active{background:var(--notion-selected);border-color:transparent;color:var(--notion-text);box-shadow:none}.task-type-strip{gap:5px;margin-bottom:10px}.task-type-strip button{min-width:150px;padding:8px 10px;border-radius:5px;border-color:var(--notion-line)}
.month-table table,.overdue-table,.case-table{border-collapse:collapse;background:#fff}.month-table th,.month-table td,.overdue-table th,.overdue-table td,.case-table th,.case-table td{height:34px;padding:6px 9px;border-color:var(--notion-line);font-size:12px}.month-table thead th,.overdue-table th,.case-table th{background:#f7f7f5;color:#6f6e69;font-weight:500}.month-table tbody th{background:#fafaf9;font-weight:500}.month-table tbody tr:hover,.overdue-table tbody tr:hover,.case-table tbody tr:hover{background:rgba(55,53,47,.035)}
.calendar{display:grid;grid-template-columns:repeat(7,minmax(110px,1fr));gap:0;border-top:1px solid var(--notion-line);border-left:1px solid var(--notion-line);background:#fff;overflow:auto}.calendar-weekday{height:32px;padding:6px 8px;border-right:1px solid var(--notion-line);border-bottom:1px solid var(--notion-line);background:#f7f7f5;color:var(--notion-muted);font-size:11px;font-weight:500;text-align:left}.day{min-height:112px;padding:7px;border:0;border-right:1px solid var(--notion-line);border-bottom:1px solid var(--notion-line);border-radius:0;background:#fff}.day.blank{background:#fafaf9}.day b{display:inline-grid;place-items:center;min-width:22px;height:22px;font-size:11px;font-weight:500;color:#5f5e5a}.day.today b{border-radius:50%;background:var(--notion-text);color:#fff}.day .event{margin-top:4px;padding:3px 5px;border-radius:3px;background:rgba(51,126,169,.11);color:#3d6f8f;font-size:10px;line-height:1.35}
.badge{font-size:10px}.badge.late{background:var(--notion-red-bg);color:#a63d39}.appointment-left.urgent{background:var(--notion-red-bg);color:#a63d39}.maintained-dot.done{background:var(--notion-green)}
.primary{background:#4f4e49;border-color:#4f4e49}.primary:hover{background:#37352f;border-color:#37352f}.modal-card{width:min(580px,100%)}
@media(max-width:760px){#app{grid-template-columns:1fr}aside{position:static;height:auto;overflow:visible}.brand-logo{display:none}.aside-foot{display:none}main{padding:14px}.todo-pair{grid-template-columns:1fr}.calendar{grid-template-columns:repeat(7,minmax(105px,1fr));overflow:auto}.day{min-height:90px}}

/* Compact navigation and calmer actions */
nav button{display:flex;align-items:center;gap:10px;font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Microsoft YaHei",sans-serif;font-size:14px;font-weight:450;letter-spacing:0}
nav button svg{width:17px;height:17px;flex:0 0 17px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.primary{background:#5b5a55;border-color:#5b5a55}.primary:hover{background:#474640;border-color:#474640}
.modal-actions{gap:12px;padding-top:16px}.modal-actions button{min-width:76px;padding-inline:18px}
.admin-box p+.primary,.admin-box p+button{margin-top:14px}.admin-box h2{margin-bottom:16px}.admin-box p{line-height:1.65}
.assignment-board{margin:12px 0;overflow:hidden}.assignment-board .panel-title small{display:block;margin-top:3px;color:var(--notion-muted);font-size:11px;font-weight:400}.assignment-board .panel-title>b{color:var(--notion-red);font-size:16px}.assignment-list{max-height:390px;overflow:auto}.assignment-row{display:grid;grid-template-columns:minmax(260px,1fr) 190px 170px 92px;gap:8px;align-items:center;padding:9px 12px;border-bottom:1px solid var(--notion-line)}.assignment-row:last-child{border-bottom:0}.assignment-case{min-width:0}.assignment-case>b,.assignment-case>small{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.assignment-case>b{font-size:13px}.assignment-case>small{margin-top:3px;color:var(--notion-muted);font-size:11px}.assignment-row select{min-width:0;height:34px;padding:5px 8px;border:1px solid var(--notion-line);border-radius:5px;background:#fff;color:var(--notion-text);font-size:12px}.assignment-row button{min-height:34px;padding:5px 9px;font-size:12px}
.status-menu{min-width:160px}.status-menu summary{min-height:34px;padding:6px 30px 6px 9px;font-size:12px}.status-menu>div{top:38px;width:180px;padding:5px}.status-menu label{display:flex;align-items:center;gap:7px;padding:5px 6px;font-size:12px;line-height:18px}.status-menu input{width:15px;height:15px;margin:0;flex:0 0 15px}
#app{grid-template-columns:210px minmax(0,1fr)}nav button{font-size:13.5px;gap:9px}nav button svg{width:16px;height:16px;flex-basis:16px}
@media(max-width:900px){.assignment-row{grid-template-columns:1fr 1fr}.assignment-row button{grid-column:2}.assignment-case{grid-column:1/-1}}
@media(max-width:760px){.assignment-row{grid-template-columns:1fr}.assignment-row button,.assignment-case{grid-column:auto}}

/* ── 登录页与已登录身份 ─────────────────────────────────────── */
.boot-view{min-height:100vh;display:grid;place-items:center;color:var(--text-secondary);font-size:13px}
.user-badge{padding:2px 0 4px}
.user-badge .badge-label{display:block;font-size:11px;color:var(--text-tertiary);margin-bottom:4px}
.user-badge b{display:block;font-size:15px;color:#2f2f2b}
.user-badge #selfRole{display:block;font-size:11.5px;color:var(--text-secondary);margin-top:2px}
.self-actions{display:flex;gap:6px;margin-top:10px}
.self-actions button{flex:1;border:1px solid #dededb;background:#fff;border-radius:5px;padding:6px 4px;font-size:11.5px;color:#37352f}
.self-actions button:hover{background:#f1f1ef}
@media(max-width:760px){
  body.authed .aside-foot{display:block;border-top:0;padding:8px 7px 0}
  body.authed #userPicker{display:none}
  body.authed:has(#userPicker:not(.hidden)) #userPicker{display:block}
}

/* 待办周期、逾期提示与案件视图切换 */
.todo-periods{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}.todo-periods .type-panel{margin:0}.todo-clear{padding:20px 14px;color:var(--text-tertiary);font-size:12px;text-align:center}
.overdue-alert{display:flex;width:100%;align-items:center;justify-content:space-between;min-height:42px;margin-bottom:12px;padding:8px 13px;border:1px solid #ecd2d2;border-radius:8px;background:var(--danger-soft);color:#8f3d3d;text-align:left}.overdue-alert b{display:grid;min-width:24px;height:24px;place-items:center;border-radius:12px;background:var(--danger);color:#fff;font-size:11px;font-variant-numeric:tabular-nums}
nav button{position:relative}.nav-warning{display:grid;min-width:18px;height:18px;margin-left:auto;padding:0 5px;place-items:center;border-radius:9px;background:var(--danger);color:#fff;font-size:9px;line-height:18px;font-variant-numeric:tabular-nums}
.view-switch{display:flex;margin-left:auto;padding:2px;border:1px solid var(--border);border-radius:7px;background:var(--surface-subtle)}.view-switch button{min-height:28px;padding:4px 10px;border:0;border-radius:5px;background:transparent;color:var(--text-secondary);font-size:11px}.view-switch button.active{background:var(--surface);color:var(--text);box-shadow:0 1px 2px rgba(36,35,32,.08)}
.case-list-view .case-table{min-width:1280px}.case-list-view tbody tr{cursor:pointer}.case-list-view tbody tr:hover{background:var(--surface-subtle)}
@media(max-width:980px){.todo-periods{grid-template-columns:1fr}.view-switch{margin-left:0}}

/* 综合管理部 · 状态日报 */
.status-report-toolbar{display:flex;align-items:flex-end;gap:8px;padding:12px 14px;margin-bottom:12px}
.date-field{display:grid;gap:4px}.date-field label{color:var(--text-secondary);font-size:11px;font-weight:550}
.date-field input{width:146px;min-height:36px;padding:6px 9px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface);color:var(--text)}
.date-separator{padding:0 2px 9px;color:var(--text-tertiary);font-size:12px}
.status-summary{display:flex;align-items:center;gap:22px;min-height:44px;padding:0 4px 12px;color:var(--text-secondary);font-size:12px}
.status-summary>span{margin-right:auto}.status-summary b{color:var(--text);font-size:15px}
.status-dot{display:inline-block;width:7px;height:7px;margin-right:6px;border-radius:50%;vertical-align:1px}.status-dot.extension{background:#c28b35}.status-dot.closed{background:var(--danger)}
.status-report-table td{vertical-align:middle}.status-report-table td:nth-child(1){white-space:nowrap;color:var(--text-secondary)}
.status-report-table td:nth-child(3) b{display:block;font-weight:600}.status-report-table td:nth-child(3) small{display:block;margin-top:2px;color:var(--text-tertiary)}
.change-badge{display:inline-flex;align-items:center;min-height:24px;padding:3px 7px;border-radius:5px;font-size:11px;font-weight:600;white-space:nowrap}
.change-badge.extension{background:#fbf3e4;color:#8a6228}.change-badge.closed{background:var(--danger-soft);color:#984141}
@media(max-width:760px){.status-report-toolbar{align-items:stretch;flex-wrap:wrap}.date-field{flex:1;min-width:130px}.date-field input{width:100%}.date-separator{display:none}.status-report-toolbar button{flex:1}.status-summary{align-items:flex-start;gap:8px 16px;flex-wrap:wrap}.status-summary>span{width:100%}.status-report-table{min-width:980px}}

/* Impeccable polish — one final visual contract, no structural changes */
:root{
  --surface:#ffffff;
  --surface-subtle:#f7f7f5;
  --surface-hover:#f1f1ee;
  --text:#2f2e2a;
  --text-secondary:#6f6e68;
  --text-tertiary:#96958f;
  --border:#e5e4df;
  --border-strong:#d5d4ce;
  --accent:#4f6f64;
  --accent-hover:#405d54;
  --danger:#bd4b4b;
  --danger-soft:#f8eeee;
  --focus:rgba(74,109,151,.28);
  --radius-sm:6px;
  --radius-md:10px;
  --shadow-float:0 12px 36px rgba(36,35,32,.12),0 2px 8px rgba(36,35,32,.06)
}
html{color-scheme:light;scrollbar-color:#c9c8c2 transparent;scrollbar-width:thin}
body{background:var(--surface);color:var(--text);font-size:14px;line-height:1.5;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased}
::selection{background:#dce7e2;color:#23352f}
*{scrollbar-width:thin;scrollbar-color:#cbc9c3 transparent}
*::-webkit-scrollbar{width:8px;height:8px}
*::-webkit-scrollbar-thumb{background:#cbc9c3;border:2px solid transparent;border-radius:8px;background-clip:padding-box}
*::-webkit-scrollbar-thumb:hover{background:#aaa9a3;border:2px solid transparent;background-clip:padding-box}

#app{grid-template-columns:208px minmax(0,1fr)}
aside{padding:10px 9px;background:var(--surface-subtle);border-right:1px solid var(--border);box-shadow:none}
.brand{height:42px;padding:6px 8px 10px;font-size:14px;font-weight:650;letter-spacing:-.01em}
.brand-logo{width:24px;height:24px;flex-basis:24px;border-color:var(--border-strong);border-radius:6px;color:#55544f;box-shadow:none}
nav{display:grid;gap:2px}
nav button{min-height:34px;margin:0;padding:6px 9px;border-radius:var(--radius-sm);color:#595852;font-size:13.5px;font-weight:450}
nav button svg{width:16px;height:16px;stroke-width:1.65}
nav button:hover{background:var(--surface-hover);color:var(--text)}
nav button.active{background:#e9e9e5;color:var(--text);font-weight:600}
.aside-foot{padding:12px 7px 4px;background:var(--surface-subtle);border-color:var(--border)}
.aside-foot select{height:34px;border-color:var(--border-strong);border-radius:var(--radius-sm);font-size:12.5px}
.user-badge b{font-size:14px}.user-badge #selfRole{line-height:1.45}
.self-actions button{min-height:32px;border-color:var(--border-strong);border-radius:var(--radius-sm);background:var(--surface)}

main{padding:24px clamp(24px,3vw,46px);background:var(--surface)}
header{min-height:56px;margin-bottom:16px;padding-bottom:14px;border-color:var(--border)}
h1{font-size:23px;line-height:1.25;font-weight:700;letter-spacing:-.025em}
header p{margin-top:4px;color:var(--text-secondary);font-size:12.5px}

button,input,select,textarea,summary{accent-color:var(--accent)}
button{font-weight:500}
.primary,.secondary,.danger-btn{min-height:36px;padding:7px 13px;border-radius:var(--radius-sm)}
.primary{background:var(--accent);border-color:var(--accent);color:#fff}
.primary:hover{background:var(--accent-hover);border-color:var(--accent-hover)}
.secondary{background:var(--surface);border-color:var(--border-strong);color:var(--text)}
.secondary:hover{background:var(--surface-hover);border-color:#c8c7c0}
.danger-btn{background:var(--danger);border-color:var(--danger)}
button:disabled{cursor:not-allowed;opacity:.52}
button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible{outline:3px solid var(--focus);outline-offset:1px}

.panel,.metric,.table-wrap{border:1px solid var(--border);border-radius:var(--radius-md);background:var(--surface);box-shadow:none}
.panel-title{min-height:43px;padding:10px 14px;border-color:var(--border);font-size:13px;font-weight:650}
.todo-pair{gap:12px}
.todo-pair .type-grid button{min-height:38px;padding:7px 14px;border-color:#edede9;color:#44433e}
.todo-pair .type-grid button:hover{padding-left:14px;background:var(--surface-subtle)}
.todo-pair .type-grid b,.task-type-strip button b,.overdue-number,.due-count{color:var(--danger)!important}
.dashboard-grid{gap:12px}.summary-grid div{padding:13px 14px}.summary-grid b{font-size:20px;letter-spacing:-.02em}
.funnel div{border-radius:4px;background:#eef2f0;color:#4f5f59}
.funnel{display:flex;flex-direction:column;align-items:center;gap:6px;padding:13px 16px}
.funnel .funnel-row{display:flex;align-items:center;justify-content:center;min-height:37px;margin:0;padding:7px 12px;border-radius:7px;background:#dfeae5;color:#334b42;font-weight:650;white-space:nowrap;transition:width .2s ease}
.funnel .funnel-row:nth-child(2){background:#e4ece8}.funnel .funnel-row:nth-child(3){background:#e8eeeb}.funnel .funnel-row:nth-child(4){background:#edf1ef}
.funnel .funnel-row.zero{background:#f2f2ef;color:var(--text-tertiary);font-weight:500}
.panel-title{display:flex;align-items:center;justify-content:space-between;gap:12px}.panel-title small{color:var(--text-tertiary);font-size:11px;font-weight:400}
.dashboard-filters{display:flex;align-items:flex-end;gap:10px;margin:12px 0;padding:12px 14px;flex-wrap:wrap}
.dashboard-filters>div{min-width:180px}.dashboard-filters label{display:block;margin-bottom:5px;color:var(--text-secondary);font-size:11px}.dashboard-filters select{width:100%;min-height:36px;padding:7px 30px 7px 9px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:#fff}.dashboard-filters>span,.dashboard-filters>small{align-self:center;color:var(--text-tertiary);font-size:11px}.dashboard-filters>small{margin-left:auto}
.analytics-stack{display:grid;gap:12px;margin:12px 0}.analytics-table{overflow:hidden}.analytics-table table{min-width:1120px;table-layout:fixed}.analytics-table th:first-child{width:145px;text-align:left}.analytics-table th:last-child,.analytics-table td:last-child{width:86px;background:#fafaf8}.analytics-table .above-average{color:#bd3f43;font-weight:700}.analytics-table .below-average{color:#258058;font-weight:650}.month-table .above-average{color:#bd3f43;font-weight:700}.month-table .below-average{color:#258058;font-weight:650}.month-table .total-row th,.month-table .total-row td{border-top:2px solid #d8d7d1;background:#f7f7f5;font-weight:700}
@media(max-width:760px){.dashboard-filters>div{width:100%}.dashboard-filters>span{display:none}.dashboard-filters>small{width:100%;margin-left:0}.funnel .funnel-row{min-width:34%}}

.tabs{padding-bottom:2px;border-bottom:1px solid var(--border)}
.tabs button{position:relative;min-height:34px;padding:6px 11px;border:0;border-radius:var(--radius-sm);color:var(--text-secondary)}
.tabs button.active,.task-type-strip button.active{background:#e9e9e5;border-color:transparent;color:var(--text)}
.tabs button.active::after{content:"";position:absolute;right:10px;bottom:-3px;left:10px;height:2px;border-radius:2px;background:var(--accent)}
.task-type-strip{gap:6px;padding:1px 0 3px}.task-type-strip button{min-width:154px;border-color:var(--border);border-radius:8px}

.kanban{gap:12px}.kanban-column,.task-column{padding:9px;border:1px solid #ebebe7;border-radius:var(--radius-md);background:var(--surface-subtle)}
.kanban-head{padding:5px 4px 11px;color:#464540}
.case-card,.task-card{padding:11px;border-color:var(--border);border-radius:8px;background:var(--surface);box-shadow:0 1px 2px rgba(36,35,32,.025)}
.case-card:hover,.task-card:hover{border-color:#cccbc4;background:var(--surface);box-shadow:0 5px 15px rgba(36,35,32,.065);transform:translateY(-1px)}
.case-card:active,.task-card:active{transform:translateY(0)}
.client{font-weight:650;letter-spacing:-.01em}.code,.model,.card-next{color:var(--text-secondary)}
.badge,.expiry,.appointment-left,.stage-age{border-radius:5px}
.maintained-dot{box-shadow:0 0 0 1px rgba(255,255,255,.8)}

.toolbar{gap:7px;margin-bottom:12px}
.toolbar input,.toolbar select,.form-grid input,.form-grid select,.form-grid textarea,.quick-row input,.quick-row select,.assignment-row select,.status-menu summary{min-height:36px;border:1px solid var(--border-strong);border-radius:var(--radius-sm);background:var(--surface);color:var(--text)}
.toolbar input::placeholder,.form-grid input::placeholder,.form-grid textarea::placeholder{color:var(--text-tertiary)}
.toolbar input:hover,.toolbar select:hover,.form-grid input:hover,.form-grid select:hover,.form-grid textarea:hover{border-color:#bdbcb5}
.status-menu summary{padding:7px 30px 7px 10px}.status-menu>div{top:40px;border-color:var(--border);border-radius:8px;box-shadow:var(--shadow-float)}
.status-menu label{border-radius:5px}.status-menu label:hover{background:var(--surface-hover)}
.toolbar .status-menu>div{width:190px;padding:6px;background:var(--surface)}
.toolbar .status-menu label{display:flex;align-items:center;gap:9px;min-height:34px;padding:6px 8px;color:var(--text);font-size:12.5px;line-height:1.4;white-space:nowrap}
.toolbar .status-menu input[type="checkbox"]{appearance:auto;width:16px;min-width:16px;height:16px;min-height:16px;margin:0;flex:0 0 16px;accent-color:#238b63}

/* Dense operational lists and configurable case table */
.todo-periods{align-items:start}
.todo-periods .type-panel{overflow:hidden}
.todo-periods .type-grid{display:block}
.todo-periods .type-grid button{width:100%;min-height:38px;padding:8px 13px;border-right:0;align-items:center;line-height:1.35}
.todo-periods .type-grid button span{min-width:0;white-space:normal}
.todo-periods .type-grid button b{flex:0 0 auto;font-size:17px}
.stage-step{min-width:112px;height:30px;padding:4px 24px 4px 8px;border:1px solid var(--border);border-radius:5px;background:var(--surface);color:var(--text);font-size:12px}
.stage-step:hover{border-color:var(--border-strong);background:var(--surface-subtle)}
.column-picker{position:relative;margin-left:auto}
.column-picker>summary{display:flex;align-items:center;min-height:32px;padding:5px 10px;border:1px solid var(--border);border-radius:6px;background:var(--surface);color:var(--text-secondary);font-size:11px;cursor:pointer;list-style:none}
.column-picker>summary::-webkit-details-marker{display:none}
.column-picker>summary::after{content:'〈';margin-left:7px;transform:rotate(-90deg);color:var(--text-tertiary)}
.column-picker[open]>summary{background:var(--surface-subtle)}
.column-picker>div{position:absolute;z-index:var(--z-dropdown);top:calc(100% + 6px);right:0;display:grid;grid-template-columns:repeat(3,minmax(130px,1fr));width:520px;max-height:390px;padding:8px;overflow:auto;border:1px solid var(--border);border-radius:8px;background:var(--surface);box-shadow:0 8px 24px rgba(36,35,32,.12)}
.column-picker header{grid-column:1/-1;display:flex;align-items:center;justify-content:space-between;padding:4px 6px 8px;border-bottom:1px solid var(--border);font-size:12px}
.column-picker header button{border:0;background:transparent;color:var(--text-secondary);font-size:11px}
.column-picker label{display:flex;align-items:center;gap:7px;min-height:32px;padding:5px 6px;border-radius:5px;font-size:11px}
.column-picker label:hover{background:var(--surface-subtle)}
.column-picker input{width:14px;min-width:14px;height:14px;min-height:14px;margin:0;accent-color:#238b63}
.status-report-table{min-width:1180px;table-layout:fixed}
.status-report-table .col-time{width:140px}.status-report-table .col-status{width:82px}.status-report-table .col-client{width:230px}.status-report-table .col-owner{width:105px}.status-report-table .col-assist{width:115px}.status-report-table .col-person{width:115px}.status-report-table .col-operator{width:105px}.status-report-table .col-note{width:auto}
.status-report-table th,.status-report-table td{padding:8px 10px}
.status-report-table td{vertical-align:top}
.status-report-table td:nth-child(8){white-space:normal;line-height:1.55;overflow-wrap:anywhere}
@media(max-width:980px){.column-picker{margin-left:0}.column-picker>div{right:auto;left:0;width:min(520px,calc(100vw - 48px));grid-template-columns:repeat(2,minmax(120px,1fr))}}
.contract-action{border-color:#c9ddd5!important;background:#edf6f2!important;color:#24664f!important;font-weight:600}
.case-profile{grid-template-columns:repeat(3,minmax(0,1fr))}.case-profile .wide{grid-column:span 2}.case-profile b{overflow-wrap:anywhere}
.history-entry{padding:10px 4px!important}.history-entry.initial{background:var(--surface-subtle);padding:10px!important;border-radius:6px}.history-line{display:flex;align-items:center;gap:8px;flex-wrap:wrap}.history-line>b{font-variant-numeric:tabular-nums}.history-line>strong{font-size:12px}.history-line>span{color:var(--text-secondary)}.history-fields{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:5px 12px;margin-top:8px}.history-fields span{display:flex;gap:6px;min-width:0;color:var(--text);font-size:11px;overflow-wrap:anywhere}.history-fields em{flex:0 0 auto;color:var(--text-tertiary);font-style:normal}.history-entry p{margin:7px 0 0!important;padding:7px 9px;border-radius:5px;background:var(--surface-subtle);color:var(--text)!important;white-space:pre-wrap}
.report-filters{display:flex;gap:7px;flex-wrap:wrap;margin-bottom:9px}.report-filters select{min-height:34px;padding:5px 28px 5px 9px;border:1px solid var(--border-strong);border-radius:6px;background:var(--surface);color:var(--text);font-size:11px}.report-filters button{min-height:34px;padding:5px 10px;font-size:11px}.status-report-table th button{display:flex;width:100%;align-items:center;justify-content:space-between;gap:5px;padding:0;border:0;background:transparent;color:inherit;text-align:left;font-weight:inherit}.status-report-table th button span{color:var(--text-tertiary);font-size:10px}.status-report-table th button.active{color:var(--text)}
@media(max-width:760px){.case-profile{grid-template-columns:1fr 1fr}.case-profile .wide{grid-column:1/-1}.history-fields{grid-template-columns:1fr}}
.modal-card{width:min(760px,100%)}
.case-profile{grid-template-columns:minmax(150px,.9fr) minmax(190px,1.15fr) minmax(170px,1fr);gap:12px 18px;padding:14px 16px}
.case-profile>div{min-width:0}.case-profile span{margin-bottom:3px}.case-profile b{display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.case-profile .wide{grid-column:span 2}
.case-profile>div:last-child{grid-column:span 2}.case-profile>div:last-child b{overflow:visible;text-overflow:clip}
.history-entry{padding:9px 4px!important}.history-line{flex-wrap:nowrap}.history-line>*{white-space:nowrap}.history-entry p{line-height:1.6}.history-fields{grid-template-columns:repeat(3,minmax(0,1fr))}
.table-head-action{display:flex;width:100%;align-items:center;justify-content:space-between;gap:8px;padding:0;border:0;background:transparent;color:inherit;text-align:left;font:inherit}.table-head-action span{color:var(--text-tertiary);font-size:9px;font-weight:500}.table-head-action.active{color:var(--text)}
@media(max-width:760px){.modal-card{width:100%}.case-profile{grid-template-columns:1fr 1fr}.case-profile .wide{grid-column:1/-1}.history-line{flex-wrap:wrap}.history-fields{grid-template-columns:1fr}}

.table-wrap{overflow:auto}.case-table th,.case-table td,.month-table th,.month-table td,.overdue-table th,.overdue-table td{height:36px;padding:7px 10px;border-color:var(--border);font-size:12px}
.case-table th,.month-table thead th,.overdue-table th{background:var(--surface-subtle);color:var(--text-secondary);font-weight:550}
.case-table tbody tr:hover,.month-table tbody tr:hover,.overdue-table tbody tr:hover{background:#fafaf8}

.modal{background:rgba(30,29,27,.32);backdrop-filter:blur(3px)}
.modal-card{width:min(590px,100%);padding:20px 22px;border-left:1px solid var(--border);box-shadow:-12px 0 38px rgba(30,29,27,.14)}
.modal-head{padding-bottom:14px;border-color:var(--border)}.modal h2{font-size:20px;letter-spacing:-.02em}.modal p{color:var(--text-secondary);font-size:12px}
.icon{width:34px;height:34px;font-size:22px}.case-strip{padding:12px;border:1px solid #ecece8;border-radius:8px;background:var(--surface-subtle)}
.field label{margin-bottom:6px;color:var(--text-secondary)}.field textarea{min-height:82px}.req{color:var(--danger)}
.modal-actions{position:sticky;bottom:-20px;margin:18px -22px -20px;padding:14px 22px 18px;border-color:var(--border);background:rgba(255,255,255,.96);backdrop-filter:blur(8px)}
.error{border-color:#eccfcf;border-radius:7px;background:var(--danger-soft);color:#983d3d}

.assignment-row{padding:10px 13px}.assignment-row:hover{background:#fafaf8}
.assignment-list{scrollbar-gutter:stable}.assignment-board .panel-title>b{color:var(--danger)}

@media(max-width:980px){main{padding-inline:22px}.todo-pair{grid-template-columns:1fr 1fr}.dashboard-grid{grid-template-columns:1fr}.summary-grid{grid-template-columns:repeat(4,1fr)}}
.report-overview{display:grid;grid-template-columns:1.25fr 1fr 1fr;gap:12px;margin:12px 0}.report-kpi-grid{display:grid;grid-template-columns:repeat(3,1fr);padding:16px}.report-kpi-grid div{display:flex;flex-direction:column;gap:4px}.report-kpi-grid b{font-size:24px;font-variant-numeric:tabular-nums}.report-kpi-grid span,.report-breakdown span{color:var(--text-secondary);font-size:12px}.report-breakdown>div:not(.panel-title){display:flex;justify-content:space-between;gap:12px;padding:9px 14px;border-bottom:1px solid var(--border)}.report-breakdown>div:last-child{border-bottom:0}.maintenance-table{min-width:1100px}.maintenance-table td:nth-child(1){white-space:nowrap}.maintenance-table td:nth-child(3) small,.workflow-table td:nth-child(3) small{display:block;margin-top:2px;color:var(--text-tertiary)}.report-note{max-width:360px;white-space:normal!important;line-height:1.5}.workflow-summary{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin:12px 0}.workflow-summary>div{display:flex;align-items:baseline;justify-content:space-between;padding:12px 14px;border:1px solid var(--border);border-radius:8px;background:var(--surface)}.workflow-summary b{font-size:20px}.workflow-summary span{font-size:11px;color:var(--text-secondary)}.workflow-summary .attention{border-color:#e4b2b2;background:#fff7f7}.workflow-summary .attention b{color:#a43a3a}.workflow-table{min-width:1550px}.workflow-table td{vertical-align:middle}.workflow-table td:last-child{min-width:430px}.workflow-confirm,.workflow-reply,.workflow-attention{display:flex;align-items:center;gap:6px}.workflow-confirm select,.workflow-reply input,.workflow-attention input{height:34px;min-width:120px;border:1px solid var(--border-strong);border-radius:6px;padding:5px 8px;background:#fff}.workflow-reply input[type=date],.workflow-attention input[type=date]{min-width:140px}.workflow-table button{min-height:34px;padding:5px 9px;font-size:11px;white-space:nowrap}.workflow-state{display:inline-flex;padding:4px 7px;border-radius:5px;background:var(--surface-subtle);font-size:11px}.workflow-state.attention,.attention-flag{background:#f9e7e7;color:#a43a3a;font-weight:700}.attention-flag{padding:5px 8px;border-radius:5px;white-space:nowrap}.workflow-done{color:#267356;font-weight:600}.stage-menu{min-width:220px}.stage-menu>div{width:220px}
.maintenance-filters{margin-top:0;margin-bottom:12px}.maintenance-filters select{min-width:180px}.maintenance-filters .muted{margin-left:auto}
@media(max-width:980px){.report-overview{grid-template-columns:1fr}.workflow-summary{grid-template-columns:repeat(2,1fr)}}
@media(max-width:760px){
  #app{grid-template-columns:1fr}aside{position:static;height:auto;padding:8px;overflow:visible;border-right:0;border-bottom:1px solid var(--border)}
  .brand{height:34px;padding:3px 7px 7px}.brand-logo{display:grid;width:22px;height:22px;flex-basis:22px}
  nav{display:flex;gap:3px;overflow-x:auto;padding-bottom:2px}nav button{width:auto;min-width:max-content;padding-inline:9px}nav button svg{width:15px;height:15px}
  main{padding:16px 14px 24px}header{min-height:50px;margin-bottom:13px}h1{font-size:21px}
  .todo-pair{grid-template-columns:1fr}.summary-grid{grid-template-columns:1fr 1fr}.kanban{grid-template-columns:repeat(4,84vw)}
  .modal-card{padding:18px 16px}.modal-actions{bottom:-18px;margin:16px -16px -18px;padding:12px 16px 16px}
}

/* ==========================================================================
   响应式适配层（平板 / 手机）  2026-09-15
   --------------------------------------------------------------------------
   背景：本文件此前累积了 16 个 @media(max-width:760px) 块，彼此覆盖、难以推断
   最终结果。本层位于文件末尾，作为「移动端样式的唯一权威来源」统一收口，
   不再往旧层里追加零散规则。

   关键根因（本次修复）：旧规则把移动端 #app 的网格轨道从
   `208px minmax(0,1fr)` 改写成 `1fr`，丢掉了 minmax(0,…)。于是侧栏导航条
   的 min-content（约 620px）把整条轨道撑到 636px，main 与其中所有宽表格、
   看板跟着被撑宽 —— 这才是页面横向溢出近 2700px 的真正原因。
   表格自身的 .table-wrap 滚动容器原本是正常的。

   依据 UI/UX Pro Max 规范：
     Responsive/Mobile First      按 1024 → 760 → 430 三档递进
     Responsive/Horizontal Scroll 页面本身不得横向滚动；宽内容在自身容器内滚动
     Responsive/Table Handling    宽表用滚动容器承载，不压缩列宽
     Responsive/Viewport Meta     已有 width=device-width, initial-scale=1
     Touch/Touch Target Size      可点区域 ≥44px，相邻目标间距 ≥8px
     Touch/Tap Delay              touch-action:manipulation
     Touch/Hover vs Tap           触屏不依赖 hover 反馈
     Forms/Mobile Keyboards       输入框字号 ≥16px，避免 iOS 聚焦自动放大
     Layout/Viewport Units        用 dvh 代替 100vh
     Navigation/Sticky Navigation 固定导航不得遮挡首屏内容
   ========================================================================== */

/* ---------- 0. 全局：文本缩放 / 触控反馈 / 禁止整页横向滚动 ---------- */
html {
  -webkit-text-size-adjust: 100%;
  text-size-adjust: 100%;
}
body {
  max-width: 100%;
  overflow-x: hidden;   /* 旧内核兜底 */
  overflow-x: clip;     /* 现代内核：不额外产生滚动容器 */
  -webkit-tap-highlight-color: transparent;
}
/* 移动浏览器地址栏会吃掉 100vh 的高度，改用 dvh */
#app { min-height: 100vh; min-height: 100dvh; }

/* 触屏设备：去掉 300ms 点击延迟；禁止用 hover 位移作为唯一反馈 */
@media (hover: none), (pointer: coarse) {
  button, summary, select, input, a, label, [role="button"], .case-card, .task-card {
    touch-action: manipulation;
  }
  .case-card:hover, .task-card:hover,
  .case-card:active, .task-card:active { transform: none; }
}

/* ---------- 1. ≤1024px：滚动容器收口 + 网格子项不撑破父级 ---------- */
@media (max-width: 1024px) {
  /* 网格/弹性子项的自动最小尺寸会按内容撑宽父级，必须显式归零。
     min-width 只放宽下限，永远不会让内容变大，因此可以安全地大范围套用。 */
  #app, #app > *, main, #page, #page > *,
  .panel, .panel > *, .metric,
  .todo-pair, .todo-pair > *, .todo-periods, .todo-periods > *,
  .dashboard-grid, .dashboard-grid > *, .forecast-grid, .forecast-grid > *,
  .admin-grid, .admin-grid > *, .summary-grid, .summary-grid > *,
  .issue-grid, .issue-grid > *, .quality-grid, .quality-grid > *,
  .selected-task-list, .selected-task-list > *, .case-strip, .case-strip > *,
  .workflow-summary, .workflow-summary > *, .report-overview, .report-overview > * {
    min-width: 0;
  }
  /* 固定列数的卡片网格在窄屏会撑破容器：
     例如 .selected-task-list 基础是 repeat(3, minmax(250px,1fr))，
     3×250 + 间距 = 770px，容器只有 514px（768 平板）就溢出了。
     改用 auto-fit + min(100%, …)，任何宽度都不会溢出，列数自动增减。 */
  .task-board, .selected-task-list, .issue-grid, .quality-grid, .report-overview {
    grid-template-columns: repeat(auto-fit, minmax(min(100%, 260px), 1fr));
  }

  /* 宽内容一律在自己的容器里横向滚动，不再撑宽整页 */
  .table-wrap, .quick-table, .table-scroll, .month-table, .analytics-table,
  .status-report, .overdue-monitor, .calendar {
    overflow-x: auto;
    max-width: 100%;
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;
  }
  .kanban, .task-board {
    max-width: 100%;
    overscroll-behavior-x: contain;
    scroll-snap-type: x proximity;
    scrollbar-width: thin;
  }
  .kanban > *, .task-board > * { scroll-snap-align: start; }

  /* 平板/触屏笔电：把偏小的可点区域抬到舒适区间（≥40px） */
  nav button { min-height: 40px; }
  .tabs button, .task-type-strip button, .view-switch button { min-height: 36px; }
  .column-picker > summary, .status-menu summary { min-height: 38px; }
  .aside-foot select, .column-picker label,
  .status-menu label, .toolbar .status-menu label { min-height: 40px; }
  .column-picker input, .status-menu input, .toolbar .status-menu input[type="checkbox"] {
    width: 18px; min-width: 18px; height: 18px; min-height: 18px; flex-basis: 18px;
  }
  /* 看板列头排序按钮与维护日报筛选控件在平板上也偏小 */
  .sort-buttons { gap: 4px; }
  .sort-buttons button { min-height: 36px; min-width: 44px; padding: 5px 8px; border-radius: 5px; }
  .maintenance-filters select, #maintClear, .maintenance-filters button { min-height: 40px; }
  /* 案件卡片操作按钮是最常点的控件，平板上原本只有 29px 高 */
  .card-actions { gap: 6px; }
  .card-actions button { min-height: 36px; padding: 8px 9px; font-size: 12px; }

  /* 表格右侧渐隐，暗示「还可以往右滑」 */
  .table-wrap { position: relative; }
  .case-table th { scroll-margin: 0; }
}

/* ---------- 2. ≤760px：手机 ---------- */
@media (max-width: 760px) {

  /* 2.1 骨架 —— 横向溢出的根因在这里修 */
  #app {
    grid-template-columns: minmax(0, 1fr);   /* 关键：保留 minmax(0,…) */
    grid-template-rows: auto minmax(0, 1fr); /* 顶栏行按内容高，剩下全给内容 */
    align-content: start;                    /* 内容不满一屏时不要把多余高度摊给顶栏 */
    min-height: 100dvh;
  }
  main { min-width: 0; width: 100%; padding: 14px 12px calc(24px + env(safe-area-inset-bottom)); }

  /* 2.2 顶栏：改为常驻的横向标签条（原来是可滚动但会随页面滚走） */
  aside {
    position: sticky;
    top: 0;
    z-index:var(--z-sticky);
    height: auto;
    min-width: 0;
    max-height: none;
    padding: 6px 8px 0;
    overflow: visible;
    border-right: 0;
    border-bottom: 1px solid var(--border);
    background: var(--surface-subtle);
  }
  .brand { height: auto; padding: 4px 2px 6px; font-size: 13px; }
  .brand-logo { width: 20px; height: 20px; flex-basis: 20px; font-size: 10px; }
  nav {
    display: flex;
    gap: 2px;
    margin: 0 -8px;
    padding: 0 8px 4px;
    overflow-x: auto;
    overscroll-behavior-x: contain;
    -webkit-overflow-scrolling: touch;
    scrollbar-width: none;
  }
  nav::-webkit-scrollbar { display: none; }
  nav button {
    width: auto;
    min-width: max-content;
    min-height: 44px;            /* 触控目标 */
    padding: 8px 11px;
    margin: 0;
    gap: 6px;
    font-size: 13px;
  }
  nav button svg { width: 16px; height: 16px; flex-basis: 16px; }
  .nav-warning { min-width: 16px; height: 16px; line-height: 16px; font-size: 9px; }

  /* 当前使用人 / 当前登录：收成一行，别把常驻顶栏顶高 */
  .aside-foot {
    position: static;
    margin: 0 -8px;
    padding: 5px 10px;
    border-top: 1px solid var(--border);
    background: var(--surface-subtle);
  }
  .aside-foot label { margin: 0 6px 0 0; font-size: 11px; }
  .aside-foot select { height: 36px; }
  .user-badge { display: flex; align-items: center; gap: 8px; padding: 0; }
  .user-badge .badge-label { display: none; }
  .user-badge b { display: inline; font-size: 13px; }
  .user-badge #selfRole { display: inline; margin: 0; font-size: 11px; }
  .self-actions { margin: 0 0 0 auto; }
  .self-actions button { min-height: 36px; padding: 6px 10px; font-size: 11.5px; }

  /* 2.3 页头：恢复被隐藏的主操作按钮（原来手机上无法新增案件） */
  header { align-items: flex-start; gap: 10px; flex-wrap: wrap; margin-bottom: 12px; padding-bottom: 11px; }
  header .primary { display: inline-flex; min-height: 40px; padding-inline: 14px; font-size: 13px; }
  h1 { font-size: 20px; }

  /* 2.4 触控目标：可点区域 ≥44px，相邻间距 ≥8px */
  .tabs button, .view-switch button, .column-picker > summary,
  .quick-row button, .modal-actions button, .status-menu summary { min-height: 44px; }
  .tabs { gap: 6px; padding-bottom: 0; overflow-x: auto; overscroll-behavior-x: contain; }
  .tabs button { white-space: nowrap; }
  .view-switch { padding: 3px; }
  .view-switch button { padding: 8px 12px; font-size: 12px; }
  .self-actions, .modal-actions { gap: 8px; }

  /* 状态多选：不要固定宽度，下拉面板贴合屏幕 */
  .status-menu { min-width: 0; flex: 1 1 160px; }
  .status-menu summary { padding: 10px 30px 10px 11px; }
  .status-menu > div,
  .toolbar .status-menu > div {
    top: calc(100% + 4px);
    right: auto;
    left: 0;
    width: min(86vw, 300px);
    max-height: 60dvh;
    overflow: auto;
  }
  .status-menu label,
  .toolbar .status-menu label { min-height: 44px; padding: 8px 8px; font-size: 13px; }
  .status-menu input,
  .toolbar .status-menu input[type="checkbox"] {
    width: 20px; min-width: 20px; height: 20px; min-height: 20px; flex-basis: 20px;
  }
  .column-picker > div { width: calc(100vw - 32px); max-height: 62dvh; grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .column-picker label { min-height: 40px; font-size: 12px; }
  .column-picker input { width: 18px; min-width: 18px; height: 18px; min-height: 18px; }

  /* 2.5 表单：字号 ≥16px 才不会在 iOS 上聚焦时自动放大。
     这里用 !important 是为了压过文件中更高优先级的旧规则
     （如 `.toolbar select{min-height:36px}`），并已排除勾选框/单选框，
     避免把它们的尺寸也撑到 44px。 */
  input:not([type="checkbox"]):not([type="radio"]), select, textarea,
  .inline-fields input, .inline-fields select,
  .toolbar input, .toolbar select,
  .form-grid input, .form-grid select, .form-grid textarea,
  .quick-row input, .quick-row select,
  .login-field input, .login-field select {
    font-size: 16px !important;
    min-height: 44px !important;
  }
  textarea { min-height: 88px !important; }
  /* 2.5b 维护日报的日期区间工具条：
     日期输入框在 16px 字号下 min-width:auto 会按内容撑宽（约 150px+），
     把整行挤爆，后面「今天/本月/查询」被压上来重叠。
     这里把 min-width 归零，改成两行排布：日期一行，按钮一行。 */
  .status-report-toolbar {
    display: flex;
    flex-wrap: wrap;
    align-items: stretch;
    gap: 8px;
    padding: 10px 12px;
  }
  .date-field { flex: 1 1 calc(50% - 4px); min-width: 0; }
  .date-field input { width: 100%; min-width: 0; }
  .status-report-toolbar button { flex: 1 1 auto; min-width: 84px; min-height: 44px; }
  .date-separator { display: none; }

  /* 输入框在弹性/网格里一律不按内容撑宽 */
  .toolbar input, .toolbar select, .case-filters input, .case-filters select,
  .form-grid input, .form-grid select, .quick-row input, .quick-row select,
  .maintenance-filters select { min-width: 0; }

  .inline-fields { grid-template-columns: 1fr 1fr; gap: 8px; }
  /* 案件筛选：两个短下拉并排，长文本（阶段）与搜索框独占一行，省一屏高度 */
  .case-filters { flex-wrap: wrap; align-items: stretch; gap: 8px; }
  .case-filters > #caseSearch,
  .case-filters > .stage-menu,
  .case-filters > #ownerFilter { flex: 1 1 100%; width: 100%; }
  .case-filters > #resultFilter,
  .case-filters > .status-menu:not(.stage-menu) { flex: 1 1 calc(50% - 4px); min-width: 0; }
  .maintenance-filters select { min-width: 0; width: 100%; }
  .maintenance-filters .muted { margin-left: 0; }
  .form-grid, .case-profile, .history-fields, .assignment-row { grid-template-columns: 1fr; }
  .field.full, .case-profile .wide { grid-column: auto / span 1; }

  /* 2.6 看板 / 任务板：一次一列，列间吸附，右缘露出下一列暗示可滑动 */
  .kanban, .task-board {
    grid-template-columns: repeat(4, minmax(calc(100vw - 46px), 1fr));
    gap: 10px;
    margin-inline: -12px;
    padding: 0 12px 10px;
    scroll-snap-type: x mandatory;
  }
  .task-board { grid-template-columns: repeat(3, minmax(calc(100vw - 46px), 1fr)); }
  .kanban-column, .task-column { min-height: 0; }
  .kanban-list { min-height: 0; }

  /* 2.7 弹窗：手机用底部抽屉，按钮常驻可点 */
  .modal { align-items: flex-end; }
  .modal-card {
    width: 100%;
    max-height: 92dvh;
    height: auto;
    padding: 16px 14px calc(16px + env(safe-area-inset-bottom));
    border-left: 0;
    border-radius: 14px 14px 0 0;
    box-shadow: 0 -10px 34px rgba(30, 29, 27, .2);
  }
  .modal-actions {
    position: sticky;
    bottom: calc(-16px - env(safe-area-inset-bottom));
    margin: 14px -14px calc(-16px - env(safe-area-inset-bottom));
    padding: 12px 14px calc(12px + env(safe-area-inset-bottom));
    gap: 10px;
  }
  .modal-actions button { flex: 1; min-height: 46px; font-size: 15px; }
  .modal-actions span { flex: 1 1 100%; margin: 0 0 2px; text-align: center; }

  /* 2.8 其余容器 */
  .table-wrap { border-radius: 8px; }

  /* 案件卡片上的操作按钮是全站点击最频繁的控件，
     原本只有 11px 字号 / 5px 内边距（实测高 29px），手机上很容易点错 */
  .case-card { padding: 12px; }
  .card-actions { flex-wrap: wrap; gap: 8px; margin-top: 10px; }
  .card-actions button {
    flex: 1 1 calc(50% - 4px);
    min-height: 40px;
    padding: 9px 10px;
    font-size: 13px;
  }
  .card-actions button:only-child { flex: 1 1 100%; }
  /* 看板列头的「时间优先 / 价格优先」排序按钮 */
  .sort-buttons { gap: 4px; }
  .sort-buttons button { min-height: 36px; min-width: 44px; padding: 6px 8px; font-size: 12px; border-radius: 5px; }
  /* 维护日报的「清除筛选」等零散按钮 */
  #maintClear, .maintenance-filters button { min-height: 44px; padding-inline: 12px; }

  .case-table, .month-table table, .overdue-table,
  .status-report-table, .maintenance-table, .workflow-table, .analytics-table table { font-size: 12px; }
  .case-table th, .case-table td { padding: 8px 10px; }
  .task-type-strip { gap: 6px; padding-bottom: 4px; }
  .task-type-strip button { min-width: 62vw; min-height: 64px; }
  .todo-periods, .dashboard-grid, .forecast-grid, .admin-grid, .todo-pair,
  .selected-task-list, .issue-grid, .quality-grid, .report-overview { grid-template-columns: 1fr; }
  .summary-grid, .overdue-summary, .case-strip { grid-template-columns: 1fr 1fr; }
  .empty { padding: 30px 16px; }
  .quick-maintain .quick-table { max-height: 56dvh; }

  /* 滚动容器不要引发整页左右弹跳 */
  .table-wrap, .quick-table, .table-scroll, .month-table, .calendar, .task-type-strip, .tabs {
    overscroll-behavior-x: contain;
  }
}

/* ---------- 3. ≤430px：小屏手机（iPhone SE / 安卓小屏） ---------- */
@media (max-width: 430px) {
  main { padding-inline: 10px; }
  h1 { font-size: 18px; }
  header p { font-size: 11.5px; }
  nav button { padding: 8px 9px; font-size: 12px; }
  .brand { font-size: 12px; }
  .summary-grid, .overdue-summary, .case-strip { grid-template-columns: 1fr; }
  .inline-fields { grid-template-columns: 1fr; }
  .kanban, .task-board { grid-template-columns: repeat(4, minmax(calc(100vw - 36px), 1fr)); }
  .task-board { grid-template-columns: repeat(3, minmax(calc(100vw - 36px), 1fr)); }
  .task-type-strip button { min-width: 74vw; }
  .modal-card { padding: 14px 12px calc(14px + env(safe-area-inset-bottom)); }
}

/* ---------- 4. 横屏矮屏：别让常驻顶栏吃掉内容 ---------- */
@media (max-width: 900px) and (orientation: landscape) and (max-height: 500px) {
  aside { position: static; }
  .modal-card { max-height: 96dvh; }
}

/* ═══ 工作台筛选多选 + 预测看板构成清单（2026-09-15） ═══ */
.mfilter{position:relative}
.mfilter-toggle{min-height:36px;padding:7px 12px;text-align:left}
.mfilter-caret{opacity:.55;font-size:11px;margin-left:4px}
.mfilter-panel{position:absolute;z-index:var(--z-overlay);top:calc(100% + 6px);left:0;width:max-content;min-width:230px;max-width:min(320px,calc(100vw - 32px));max-height:min(360px,60vh);overflow:auto;background:var(--panel-bg,#fff);border:1px solid var(--border-strong,#cbd5e1);border-radius:var(--radius-md,12px);padding:10px 14px 12px;box-shadow:0 12px 32px rgba(15,23,42,.16)}
.mfilter-sec{font-size:11px;color:var(--text-tertiary,#94a3b8);margin:10px 0 2px;font-weight:600}
.mfilter-sec:first-child{margin-top:2px}
.mfilter-panel label{display:flex;align-items:center;gap:8px;padding:6px 4px;border-radius:8px;cursor:pointer;font-size:14px;color:var(--text-primary,#0f172a)}
.mfilter-panel label:hover{background:rgba(0,0,0,.05)}
.mfilter-panel input[type="checkbox"]{width:16px;height:16px;min-height:0;accent-color:var(--primary,#2563eb);margin:0}
.forecast-detail{margin-top:14px}
/* ═══ 签单构成：归属组卡片（统一 Notion 暖灰设计语言） ═══ */
.fd-group{margin:12px 0 0;background:#fff;border:1px solid var(--border);border-radius:8px;overflow:hidden;box-shadow:0 1px 2px rgba(36,35,32,.03)}
.fd-cat{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:8px 12px;background:var(--surface-subtle);border-bottom:1px solid var(--border);font-weight:600;font-size:12.5px;color:var(--text);flex-wrap:wrap}
.fd-cat-name{display:inline-flex;align-items:center;gap:7px;min-width:0}
.fd-cat-name::before{content:"";flex:0 0 auto;width:4px;height:13px;border-radius:2px;background:var(--text)}
.fd-cat-meta{font-weight:450;color:var(--text-secondary);font-size:12px;white-space:nowrap}
.fd-case{display:flex;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid #efefec;font-size:13px;transition:background .12s}
.fd-case:last-child{border-bottom:none}
.fd-case:hover{background:#fafaf8}
.fd-case .fd-cust{font-weight:600;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:46%}
.fd-case .fd-desc{color:var(--text-secondary);font-size:12px;flex:1;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;text-align:left}
.fd-case b{white-space:nowrap;font-variant-numeric:tabular-nums;font-size:13px}
/* 拿单概率徽章：高=绿 中=橙 低=红 未填=灰 */
.fd-case .fd-prob{display:inline-flex;align-items:center;padding:2px 10px;border-radius:20px;font-size:12px;font-weight:600;white-space:nowrap;flex:0 0 auto;font-variant-numeric:tabular-nums}
.fd-case .fd-prob.p-high{background:#e6f5ee;color:#0f6b46}
.fd-case .fd-prob.p-mid{background:#fdf3e3;color:#915708}
.fd-case .fd-prob.p-low{background:#fdecec;color:#b3261e}
.fd-case .fd-prob.p-none{background:#eef2f6;color:#7c8aa0}
@media(max-width:760px){
  .mfilter{width:100%}
  .mfilter-toggle{width:100%}
  .mfilter-panel{left:0;right:auto}
  .fd-case{flex-wrap:wrap;gap:4px 10px;padding:8px 10px}
  .fd-case .fd-cust{max-width:100%;white-space:normal}
  .fd-case .fd-desc{flex-basis:100%}
  .fd-cat{padding:7px 10px}
}

/* ═══ 详情弹窗·报备表备注行（2026-09-15） ═══ */
.remark-row b{font-weight:500;line-height:1.55;white-space:normal;word-break:break-word}

/* ═══ 状态日报·已签单徽章与状态点（2026-09-15） ═══ */
.status-dot.signed{background:#147553}
.change-badge.signed{background:#e6f5ee;color:#0f6b46}
/* 预测看板：月份卡片可点击切换（选中态对齐全站灰黑选中语言） */
.forecast-grid .month-card{cursor:pointer;transition:border-color .15s,box-shadow .15s,background .15s}
.forecast-grid .month-card:hover{border-color:var(--border-strong);box-shadow:0 2px 10px rgba(36,35,32,.08)}
.forecast-grid .month-card.sel{border-color:var(--text);box-shadow:inset 0 0 0 1px var(--text);background:var(--surface-subtle)}
.forecast-grid .month-card.sel strong{color:var(--text)}
.forecast-grid .month-card:focus-visible{outline:2px solid var(--text);outline-offset:2px}

/* ═══ 状态申请处理：退回按钮 + 维护日报：申请结果徽章（2026-09-16） ═══ */
.workflow-confirm [data-flow-action="reject"]{border-color:#d9dde3;color:#5b6472}
.workflow-confirm [data-flow-action="reject"]:hover{border-color:#b3261e;color:#b3261e;background:#fdf2f1}
.wf-chip{display:inline-block;margin-left:6px;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:500;vertical-align:middle;white-space:nowrap}
.wf-chip.ok{background:#e6f5ee;color:#0f6b46}
.wf-chip.pending{background:#fdf3e3;color:#915708}
.wf-chip.reject{background:#fdecec;color:#b3261e}

/* ═══ 预测看板：构成清单拿单概率（cs34 徽章样式并入上方 fd-case 块） ═══ */

/* ═══ 状态申请处理：固定状态标记（2026-09-16） ═══ */
.workflow-fixed{display:inline-block;margin-right:6px;padding:3px 10px;border-radius:6px;background:#eef1f5;color:#3d4654;font-size:13px;font-weight:500;white-space:nowrap}

/* ═══ 状态申请处理：综合管理直转标记（2026-09-17） ═══ */
.direct-flag{display:inline-block;margin-right:6px;padding:3px 8px;border-radius:6px;background:#fdf3e3;color:#915708;font-size:12px;font-weight:600;white-space:nowrap}
.workflow-confirm{flex-wrap:wrap}

/* ═══ 合同管理（2026-09-16） ═══ */
.contract-list{display:flex;flex-direction:column;gap:8px}
.contract-card{padding:0;overflow:hidden}
.contract-head{display:flex;justify-content:space-between;align-items:center;gap:16px;padding:10px 16px;cursor:pointer;user-select:none}
.contract-head:hover{background:#f7f9fb}
.ct-title{display:flex;align-items:center;min-width:0}
.contract-head strong{font-size:15px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.ct-summary{display:flex;align-items:center;gap:14px;flex:0 0 auto}
.ct-meta{font-size:13px;color:var(--text-secondary,#64748b);white-space:nowrap}
.ct-price{font-size:14px;font-weight:600;color:#1d4ed8;font-variant-numeric:tabular-nums;white-space:nowrap}
.ct-prog{font-size:12px;padding:2px 10px;border-radius:12px;background:#eaf2ff;color:#1d4ed8;white-space:nowrap}
.ct-prog.full{background:#e6f5ee;color:#0f6b46}.ct-alert{font-size:12px;padding:2px 10px;border-radius:12px;white-space:nowrap;font-weight:500}.ct-alert.over{background:#fdecec;color:#b3261e}.ct-alert.soon{background:#fdf3e3;color:#915708}
.ct-arrow{color:#9aa3af;font-size:14px;transition:transform .18s;flex:0 0 auto}
.contract-card.open .ct-arrow{transform:rotate(180deg)}
.contract-detail{display:none;padding:2px 16px 16px;border-top:1px dashed #e5e8ec}
.contract-card.open .contract-detail{display:block}
.ct-no{display:inline-block;margin-left:8px;padding:1px 8px;border-radius:6px;background:#eef1f5;color:#3d4654;font-size:12px;white-space:nowrap}
.ct-src{display:inline-block;margin-left:6px;padding:1px 7px;border-radius:10px;background:#e6f5ee;color:#0f6b46;font-size:12px;white-space:nowrap}
.contract-grid{display:grid;grid-template-columns:repeat(8,1fr);gap:6px 12px;margin-top:12px}
.contract-grid div{display:flex;flex-direction:column}
.contract-grid span{font-size:11px;color:var(--text-secondary,#64748b);white-space:nowrap}
.contract-grid b{font-size:13px;font-weight:500;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.contract-terms,.contract-cases{margin-top:12px;padding-top:10px;border-top:1px dashed #e5e8ec;display:flex;flex-wrap:wrap;gap:5px;align-items:center}
.contract-terms .muted,.contract-cases .muted{width:100%;font-size:12px;margin-bottom:2px}
.contract-items{margin-top:12px;padding-top:10px;border-top:1px dashed #e5e8ec}
.contract-items .muted{width:100%;font-size:12px;margin-bottom:4px;display:flex;justify-content:space-between;align-items:center}
.contract-items .item-edit{font-size:12px;padding:2px 8px}
.ct-title .info-edit{font-size:12px;padding:2px 9px;flex-shrink:0;margin-left:4px}
.case-card-top .case-info-edit{font-size:12px;padding:2px 9px;flex-shrink:0}
.cu-nv{font-size:12px;padding:3px 8px;border:1px solid #c9d6e8;border-radius:6px;background:#f8fbff;color:#1f3a5f}
.cu-nv-txt{width:250px}
.fg-title{grid-column:1/-1;font-weight:600;color:#2d66b2;font-size:12px;margin:10px 0 0;padding-left:8px;border-left:3px solid #2d66b2}
/* cs39：合同表格视图 */
.ct-twrap{margin-top:10px}
.ct-table{min-width:1350px;font-size:12px}
.ct-table th{white-space:nowrap;background:var(--surface-subtle);position:sticky;top:0;z-index:var(--z-card);font-size:12px;font-weight:500;color:var(--text-secondary);border-bottom:1px solid var(--border);text-align:left}
.ct-table th.ct-th-plain{padding:8px 9px}
.ct-sort{display:flex;width:100%;align-items:center;justify-content:space-between;gap:6px;padding:8px 9px;border:0;background:transparent;color:inherit;font:inherit;font-weight:500;text-align:left;cursor:pointer}
.ct-sort:hover{color:var(--text);background:rgba(55,53,47,.045)}
.ct-sort.active{color:var(--text)}
.ct-sort .ct-sort-ic{flex:0 0 auto;font-size:10px;color:var(--text-tertiary);font-weight:400}
.ct-sort.active .ct-sort-ic{color:var(--text)}
.ct-table td{padding:5px 8px;vertical-align:middle;white-space:nowrap}
.ctb>tr{cursor:pointer}
.ctb>tr:hover>td{background:#fafaf8}
.ctb>tr:first-child>td{border-top:2px solid var(--border-strong)}
.ctr-expand>td{background:#fbfbfa;padding:6px 14px 14px;cursor:default;white-space:normal}
.ctr-expand .contract-detail{display:block!important;padding:8px 0 0;border-top:none}
.ct-td-txt{max-width:150px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ct-table td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.ct-ops{white-space:nowrap}
.ct-it-brand{min-width:58px;white-space:nowrap}
.ct-it-name{min-width:110px;white-space:nowrap}
.ct-it-model{min-width:150px;white-space:nowrap}
.ct-table td.nw{white-space:nowrap}
.ct-table td.ct-td-co{min-width:150px;white-space:nowrap;font-weight:400}
.ct-table td.ct-td-co b{font-weight:600}
.item-row{display:flex;gap:8px;align-items:center;font-size:13px;padding:3px 0;border-bottom:1px solid #f2f4f7}
.item-row:last-child{border-bottom:none}
.item-row .item-brand{min-width:60px;font-weight:600;color:#2d4a75}
.item-row .item-name{flex:1;color:#3d4654}
.item-row .item-qty{color:#6b7280;min-width:40px}
.item-row .item-price{font-weight:600;color:#0f6b46;min-width:80px;text-align:right}
.item-row .item-tag{font-size:11px;background:#eef1f5;color:#6b7280;border-radius:4px;padding:1px 5px}
.item-row .item-unit{color:#8a93a3;font-size:12px;min-width:96px;text-align:right}
/* cs16：子项弹窗主项行 / 汇总表 / 确认行合计 / 月历 */
.main-item-row{display:flex;gap:6px;align-items:center;margin-bottom:8px;padding:6px 8px;background:#f7faf8;border:1px solid #dcefe4;border-radius:8px}
.main-item-row input{flex:1;min-width:0}
.main-item-row .item-tag{background:#dcefe4;color:#0f6b46;white-space:nowrap}
.sum-table{width:100%;border-collapse:collapse;font-size:13px;margin:6px 0 2px}
.sum-table th,.sum-table td{border:1px solid #e5e8ec;padding:5px 8px;text-align:left}
.sum-table th{background:#f5f7fa;color:#5b6472;font-weight:500}
.sum-table tfoot td{background:#f7faf8;font-weight:600}
.wf-amount{font-size:12px;color:#0f6b46;font-weight:600;white-space:nowrap}
.cstep.overpay{box-shadow:inset 0 0 0 1.5px #d9880f}
.ev-contbar{height:12px;border-radius:3px;margin:2px 0;opacity:.55}
.cal-toolbar{display:flex;gap:8px;align-items:center;margin-bottom:8px}
.items-editor{display:flex;flex-direction:column;gap:6px;margin-bottom:6px}
.item-edit-row{display:flex;gap:6px;align-items:center}
.item-edit-row input{flex:1;min-width:0}
.item-edit-row input[data-it=brand]{flex:0 0 80px}
.item-edit-row input[data-it=quantity]{flex:0 0 60px}
.item-edit-row input[data-it=sale_price]{flex:0 0 90px}
.contract-filters{display:flex;gap:8px;align-items:center;flex-wrap:wrap;row-gap:6px}
.contract-filters .mf-hint{color:var(--text-tertiary);font-size:12px;white-space:nowrap;line-height:1.5}
.contract-filters select{min-width:110px}
.term-chip{display:inline-block;padding:3px 10px;border-radius:12px;background:#f0f4fa;color:#2d4a75;font-size:12px;white-space:nowrap}.term-chip b{font-weight:600;margin-left:4px}.term-chip.st-done{background:#e6f5ee;color:#0f6b46}.term-chip.st-over{background:#fdecec;color:#b3261e}.term-chip.st-soon{background:#fdf3e3;color:#915708}.term-chip.st-due{background:#eaf2ff;color:#1d4ed8}.term-chip.st-wait{background:#f3f4f6;color:#7a828e}.term-edit{padding:3px 10px;font-size:12px;min-height:0;border-radius:12px;margin-left:4px;flex:0 0 auto}.term-empty{font-size:12px;color:#915708;background:#fdf3e3;border:1px dashed #e5c988;padding:3px 10px;border-radius:12px}
.case-chip{display:inline-block;padding:3px 10px;border-radius:6px;background:#eef1f5;color:#3d4654;font-size:13px}
.contract-import-list{display:flex;flex-direction:column;gap:10px}
.contract-import-row{padding:14px 16px}
.ci-main{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.ci-main strong{font-size:15px}
.ci-status{font-size:12px;padding:1px 8px;border-radius:10px}
.ci-status.pending{background:#fdf3e3;color:#915708}
.ci-status.ok{background:#e6f5ee;color:#0f6b46}
.ci-status.reject{background:#fdecec;color:#b3261e}
.ci-meta{margin-bottom:8px}
.ci-actions{display:flex;gap:8px}
/* cs20：同合同号合并展示 */
.ct-cnt{font-size:12px;padding:1px 8px;border-radius:10px;background:#e8f0fb;color:#2b5fa8;white-space:nowrap}
.ci-items{display:flex;flex-direction:column;gap:4px;margin:2px 0 8px;padding:8px 10px;background:#f8f9fb;border:1px solid #e7eaf0;border-radius:8px}
.ci-item{display:flex;align-items:center;gap:8px;font-size:13px;color:#3d4654}
.ci-item .ci-brand{flex:none;padding:0 6px;border-radius:5px;background:#eef4ee;color:#0f6b46;font-size:12px}
.ci-item em{font-style:normal;color:#8a93a3;font-size:12px}
.ci-item b{margin-left:auto;font-weight:600;color:#1f2937}
.tabs.sub{margin-top:8px}
.terms-editor{display:flex;flex-direction:column;gap:8px;margin-bottom:8px}
.term-row{display:flex;gap:8px;align-items:center}
.term-row select,.term-row input{flex:1;min-width:0}
.term-row select:disabled{background:#f3f5f8;color:#5b6472;cursor:not-allowed}
.term-pw{flex:0 0 auto;display:inline-flex;align-items:center;gap:4px;font-size:12px;color:#5b6472;white-space:nowrap;cursor:pointer}
.term-pw input{flex:0 0 auto!important;width:auto}
.term-no{width:22px;text-align:center;font-weight:600;color:#2d4a75}
.term-amt{flex:0 0 auto;min-width:86px;max-width:110px;text-align:right;font-size:12px;font-weight:600;color:#1b7f4d;background:#eef7f2;padding:4px 8px;border-radius:8px;white-space:nowrap}
@media(max-width:1180px){.contract-grid{grid-template-columns:repeat(4,1fr)}.contract-grid b{white-space:normal}}@media(max-width:760px){.contract-grid{grid-template-columns:repeat(2,1fr)}}

/* ═══ 合同履约步骤条（2026-09-16） ═══ */
.contract-steps{margin-top:12px;padding-top:10px;border-top:1px dashed #e5e8ec}
.cs-head{font-size:12px;margin-bottom:6px;display:flex;align-items:center;justify-content:space-between;gap:10px}.cs-more{border:0;background:none;color:#2862ad;font-size:12px;padding:2px 4px;cursor:pointer}.cs-more:hover{text-decoration:underline}
.cstepper{display:flex;flex-wrap:nowrap;align-items:center;gap:3px 1px;overflow-x:auto;padding-bottom:2px}
.cstep{display:inline-flex;align-items:center;gap:4px;padding:3px 8px;border-radius:12px;border:1px solid #e2e6ec;background:#f6f8fa;color:#5b6472;font-size:12px;cursor:pointer;line-height:1.3;white-space:nowrap;flex:0 0 auto}.cstep-body{display:flex;flex-direction:column;align-items:flex-start;line-height:1.15;min-width:0}.cstep-name{white-space:nowrap}.cstep-date{font-style:normal;font-size:10px;line-height:1.2;white-space:nowrap;color:#8a94a3;font-variant-numeric:tabular-nums}.cstep.done .cstep-date{color:#0f6b46}.cstep.cur .cstep-date{color:#1d4ed8}.cstep-date.plan{color:#2862ad;opacity:.85}.cstep-date.plan.over{color:#b3261e;opacity:1;font-weight:600}
.cstep i{font-style:normal;width:15px;height:15px;border-radius:50%;border:1px solid #c3cad4;display:inline-flex;align-items:center;justify-content:center;font-size:10px;line-height:1;background:#fff;flex:0 0 auto}
.cstep.done{background:#e6f5ee;border-color:#bfe3d2;color:#0f6b46}
.cstep.done i{border-color:#0f6b46;background:#0f6b46;color:#fff}
.cstep.cur{background:#eaf2ff;border-color:#7ea6e0;color:#1d4ed8;font-weight:600}
.cstep.cur i{border-color:#7ea6e0;background:#fff}
.cstep.skip{background:#f3f4f6;border-color:#d9dde3;color:#9aa3af}
.cstep.skip i{border-color:#d9dde3;background:#f3f4f6;color:#9aa3af}
.cstep:hover{border-color:#7ea6e0}
.cstep-arrow{color:#c3cad4;font-size:10px;flex:0 0 auto}
.check-row{display:flex;align-items:center;gap:6px;margin-top:10px;font-size:14px;color:#3d4654;cursor:pointer}
.form-grid label.check-row{align-self:end;margin:0 0 10px}
label.ck-line{grid-column:1/-1;display:flex;align-items:center;gap:9px;margin:4px 0 2px;padding:10px 12px;border:1px solid #d7e0ec;border-radius:8px;background:#f8fafd;font-size:13px;color:#3d4654;cursor:pointer;user-select:none}
label.ck-line:hover{border-color:#7ea6e0;background:#f2f7fd}
label.ck-line input[type=checkbox]{width:16px;height:16px;min-height:0;padding:0;border:1px solid #9fb2ca;border-radius:4px;accent-color:#2862ad;flex:0 0 auto;cursor:pointer;appearance:auto}
label.ck-line span{line-height:1.4}


/* ═══ 合同履约步骤定制交互（2026-09-16） ═══ */
.cstep.bad{border-color:#e5a0a0;background:#fdecec;color:#b3261e}
.cstep.bad i{border-color:#e5a0a0;background:#fdecec;color:#b3261e}
.cstep.warn{border-color:#e5c988;background:#fdf3e3;color:#915708}
.cstep.warn i{border-color:#e5c988;background:#fdf3e3;color:#915708}
.cstep-date.bad{color:#b3261e;font-weight:600}
.cstep-date.due{color:#b3261e;font-weight:600}

/* 款项核对弹窗 */
.pay-expect{background:#f6f8fa;border:1px solid #e2e6ec;border-radius:10px;padding:12px 14px;margin-bottom:12px;display:flex;flex-direction:column;gap:4px}
.pay-expect span{font-size:12px;color:var(--text-secondary,#64748b)}
.pay-expect b{font-size:20px;color:#0f6b46}
.pay-expect small{font-size:12px;color:#8a94a3}
.pay-actions{display:flex;gap:10px;margin-top:14px}
.pay-ok{flex:1;padding:10px 14px;border:1px solid #0f6b46;background:#0f6b46;color:#fff;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer}
.pay-ok:hover{background:#0c5b3a}
.pay-bad{flex:1;padding:10px 14px;border:1px solid #e5a0a0;background:#fdecec;color:#b3261e;border-radius:10px;font-size:14px;font-weight:600;cursor:pointer}
.pay-bad:hover{background:#fadcdc}
#payNoteRow{margin-top:12px}


/* ═══ 合同履约提醒表（工作台） ═══ */
.contract-reminders .rem-badge{display:inline-block;padding:1px 8px;border-radius:10px;font-size:11px;font-weight:600}
.contract-reminders .rem-badge.danger{background:#fdecec;color:#b3261e}
.contract-reminders .rem-badge.warn{background:#fdf3e3;color:#915708}
.contract-reminders tr.rem-danger{background:#fff7f7}
.contract-reminders .rem-go{padding:3px 10px;font-size:12px;min-height:0;border-radius:8px}
.rem-filter{display:flex;align-items:center;gap:10px;padding:10px 14px;border-bottom:1px solid var(--notion-line,#efefec);background:#fbfbfa}
.rem-filter-label{font-size:12px;color:var(--notion-muted,var(--text-secondary));font-weight:500}
.rem-filter select{height:32px;padding:4px 10px;border:1px solid var(--notion-line,#dededb);border-radius:6px;background:#fff;font-size:13px;color:var(--notion-text,#37352f)}
.rem-filter-count{font-size:12px;color:var(--notion-muted,var(--text-secondary))}
.rem-table{min-width:820px}
.rem-table .rem-title{font-weight:500;font-size:13px;color:var(--notion-text,#37352f)}
.rem-table .rem-sub{font-size:11px;color:var(--notion-muted,var(--text-secondary));margin-top:2px}
.rem-table .rem-owner{white-space:nowrap}
.rem-table .rem-date{white-space:nowrap;font-variant-numeric:tabular-nums}
.rem-table .rem-days-cell{white-space:nowrap}
.rem-table .rem-amount{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;font-weight:500}
.rem-days{display:inline-block;padding:1px 8px;border-radius:10px;font-size:11px;font-weight:600}
.rem-days.bad{background:#fdecec;color:#b3261e}
.rem-days.ok{background:#e8f2eb;color:#1c7a43}
@media(max-width:760px){.rem-filter{flex-wrap:wrap}.rem-table{min-width:760px}}

/* ═══ 月历安装/培训日程颜色 ═══ */
.cal-filter{margin-bottom:8px}
.day .event.ev-task{background:rgba(51,126,169,.11);color:#3d6f8f}
.day .event.ev-install{background:#e6f5ee;color:#0f6b46}
.day .event.ev-train{background:#fdf3e3;color:#915708}
.day .event.ev-arrive{background:#ece9fb;color:#5b4bc4}
.day .event.ev-done{background:#f3f4f6;color:#9aa3af;text-decoration:line-through}
.event.ev-fin{opacity:.78;font-weight:600}
.event.ev-fin.ev-contbar{opacity:.4}

/* 款项核对弹窗：合同总额 × 比例 算式 */
.pay-expect .pay-calc{display:block;font-size:12px;color:#51607a;background:#eef2f8;border-radius:6px;padding:4px 8px}
.pay-expect .pay-calc:first-child{margin-top:2px}

/* cs22：预测看板子页签 + 拿单概率分析 */
.forecast-tabs{margin-bottom:12px}
.prob-bar{display:flex;justify-content:space-between;align-items:center;gap:12px;margin:12px 0;flex-wrap:wrap}
.prob-chips{display:flex;gap:8px;flex-wrap:wrap}
.prob-chip{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--border);border-radius:999px;padding:7px 13px;background:var(--surface);cursor:pointer;font-size:13px;color:var(--text)}
.prob-chip b{font-size:13px}
.prob-chip small{font-size:11px;color:var(--text-secondary);font-weight:400}
.prob-chip:hover{border-color:var(--border-strong)}
.prob-chip.active{border-color:var(--text);box-shadow:inset 0 0 0 1px var(--text);font-weight:600}
.prob-chip.pc-high{border-color:#bfe3d2;background:#e6f5ee}.prob-chip.pc-high b{color:#0f6b46}
.prob-chip.pc-mid{border-color:#e5c988;background:#fdf3e3}.prob-chip.pc-mid b{color:#915708}
.prob-chip.pc-low{border-color:#e5a0a0;background:#fdecec}.prob-chip.pc-low b{color:#b3261e}
.prob-chip.pc-none{border-color:var(--border);background:var(--surface)}.prob-chip.pc-none b{color:var(--text-tertiary)}
.prob-month{height:36px;border:1px solid var(--border-strong);border-radius:8px;padding:4px 10px;background:#fff;font-size:13px}
.prob-table{min-width:960px}
.prob-table th{white-space:nowrap}
.prob-table td{vertical-align:middle}
.prob-table td small{display:block;margin-top:2px;color:var(--text-tertiary);font-size:11px}
.prob-table td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap}
.prob-table tbody tr{cursor:pointer}
.prob-table tbody tr:hover{background:#f5f8fc}
.prob-table .prob-chip{cursor:default;padding:4px 10px;font-size:12px}
.pc-cust{font-weight:550;color:var(--notion-text,#37352f);font-size:13px}
.pc-opp{font-size:11px;color:var(--notion-muted,var(--text-secondary));margin-top:2px;font-variant-numeric:tabular-nums}
.pc-prod{color:var(--notion-text,#37352f);font-size:12.5px}
.pc-amt{font-weight:600;font-size:13px}
.pc-month{white-space:nowrap;font-variant-numeric:tabular-nums;color:var(--notion-text,#37352f)}
.pc-cat{display:inline-block;padding:2px 9px;border-radius:10px;background:#f3f4f6;color:#5f5e5a;font-size:11.5px;white-space:nowrap}
.pc-next{font-size:12px;color:var(--notion-muted,var(--text-secondary))}
.pc-next small{display:block;margin-top:2px;font-size:11px;color:var(--notion-faint,var(--text-tertiary))}
.prob-table tbody tr:hover .pc-cust{color:var(--notion-blue,#337ea9)}
@media(max-width:980px){.prob-bar{flex-direction:column;align-items:stretch}.prob-month{width:100%}}

/* cs27：履约确认明细折叠 */
.cu-detail{margin:8px 0 2px}
.cu-detail summary{cursor:pointer;font-size:13px;color:#1c6dd0;padding:4px 0;user-select:none}
.cu-detail .table-wrap{margin:8px 0 4px;max-height:340px;overflow:auto;border:1px solid var(--border);border-radius:8px}
.cu-detail .prob-table td,.cu-detail .prob-table th{padding:6px 10px;font-size:12.5px}

/* ═══ cs44：等待三丰回复行按钮联动 ═══ */
.workflow-reply{flex-wrap:wrap}
.wr-actions{display:inline-flex;align-items:center;gap:6px}

/* ═══ cs46：履约确认新值行内校验错误 ═══ */
.cu-nv.cu-err{border-color:#d3455b;box-shadow:0 0 0 2px rgba(211,69,91,.14);background:#fff7f7}
.cu-err-msg{display:block;color:#b3261e;font-size:11px;line-height:1.4;margin-top:2px;font-weight:600}

/* ════════════════════════════════════════════════════════════════════════
   cs49：移动端补充适配（cs39-cs48 新增组件）  2026-09-19
   -----------------------------------------------------------------------
   背景：2026-09-15 的响应式层（上方）只覆盖了当时的组件；cs39 起的
   合同表格视图、状态日报各子页、履约确认、款项核对、步骤条、筛选多选
   等新组件未纳入。CDP 真机模拟（390px）实测两类问题：
   ① 触控目标 <44px：.ct-sort 表头排序、.secondary 小按钮（.info-edit/
     .term-edit/.rem-go/.item-edit/.case-info-edit/.cs-more 等，均被各自
     padding:2~3px 覆盖成 19~26px 高）、.cstep 步骤条 chip。
   ② contracts-cards 视图横向溢出被裁：.contract-card{overflow:hidden}
     叠加 .ct-summary{flex:0 0 auto;nowrap}，标题右侧金额/进度/报警徽章
     被裁掉（实测 447~476px 宽 vs 容器 370px）。
   整页无横向滚动（hasHScroll=False），宽表均已由 .table-wrap/.table-scroll
   横向滚动承载 —— 本层只补齐触控目标与卡片视图的换行。
   ════════════════════════════════════════════════════════════════════════ */
@media (max-width: 760px) {

  /* 1. 合同卡片视图：标题与元信息（金额/进度/报警）换行，不再被 overflow 裁掉 */
  .contract-head { flex-wrap: wrap; gap: 8px 12px; padding: 12px 14px; }
  .contract-head strong { font-size: 14px; white-space: normal; }
  .ct-title { flex: 1 1 100%; }
  .ct-summary { flex: 1 1 auto; flex-wrap: wrap; gap: 6px 12px; justify-content: flex-start; }
  .ct-meta, .ct-price, .ct-prog, .ct-alert, .ct-no, .ct-src { white-space: normal; }
  .contract-detail { padding: 2px 14px 14px; }

  /* 2. 合同表格视图：表头排序按钮抬到可点高度（表头本身 sticky，加高不影响横向滚动） */
  .ct-sort { min-height: 44px !important; padding: 6px 9px !important; }
  .ct-table th { padding: 0; }               /* 让 .ct-sort 撑满单元格 */
  .ct-table th.ct-th-plain { padding: 8px 9px; min-height: 44px; }

  /* 3. 合同表格内的操作按钮（✎ 编辑 / 点行展开）抬到可点高度 */
  .ct-ops .info-edit, .ct-title .info-edit, .case-card-top .case-info-edit {
    min-height: 40px; padding: 8px 12px; font-size: 13px;
  }

  /* 4. 付款条款/款项/导入行里的小按钮统一抬到 ≥40px。
        注意：这些按钮的 base 规则用 padding:2~3px 且部分带 min-height:0
        （如 .contract-reminders .rem-go、.term-edit），双类选择器优先级更高，
        故这里必须用 !important 强制覆盖。 */
  .term-edit, .term-del, .rem-go, .item-edit, .item-del, .info-edit,
  .contract-items .item-edit, .contract-import-row .secondary,
  .contract-reminders .rem-go, .ct-title .info-edit, .ct-ops .info-edit,
  .case-card-top .case-info-edit {
    min-height: 40px !important;
    padding: 8px 12px !important;
    font-size: 13px !important;
  }
  /* 条款编辑器里的「加一期」与删除按钮 */
  .terms-editor .secondary { min-height: 40px !important; padding: 8px 12px !important; }
  /* 合同表格「恢复默认」按钮（列选择器内，实测 19px 高） */
  [data-ctcols-reset] { min-height: 40px !important; padding: 8px 12px !important; font-size: 13px !important; }

  /* 5. 履约进度步骤条：chip 抬到可点高度（横向滚动条内用 40px，避免过高） */
  .cstep { min-height: 40px !important; padding: 6px 11px !important; }
  .cs-more { min-height: 40px !important; padding: 8px 10px !important; font-size: 13px !important; }

  /* 6. 工作台「多选筛选」按钮 + 预测看板概率 chip + 付款/案件 chip */
  .mfilter-toggle { min-height: 44px; padding: 9px 14px; }
  .prob-chip { min-height: 44px; padding: 10px 14px; }
  .term-chip, .case-chip { min-height: 36px; padding: 8px 12px; }

  /* 7. 状态日报子页：操作按钮（确认/退回/转延期/成功/失败）允许换行 + 抬触控目标 */
  .workflow-confirm, .workflow-reply { gap: 8px; }
  .workflow-confirm .primary, .workflow-confirm .secondary,
  .workflow-reply .primary, .workflow-reply .secondary,
  .wr-actions .primary, .wr-actions .secondary,
  .workflow-judge .primary, .workflow-judge .secondary {
    min-height: 44px; padding: 9px 13px; font-size: 13px;
  }
  .wr-actions { flex-wrap: wrap; gap: 8px; }
  .contract-fields input { min-width: 0; width: 100%; }

  /* 8. 履约确认页：行内「新值」编辑控件抬到可点高度 */
  .cu-nv { min-height: 40px; padding: 7px 10px; font-size: 13px; }
  .cu-nv-txt { width: 100%; }

  /* 9. 款项核对弹窗按钮 */
  .pay-ok, .pay-bad { min-height: 48px; font-size: 15px; }
}
@media (max-width: 430px) {
  .ct-summary { gap: 6px 8px; }
  .contract-head { padding: 11px 12px; }
  .contract-detail { padding: 2px 12px 12px; }
}

/* ═══ cs50：时间段日历拖选 + 子项批量增加 ═══ */
.rpick{position:relative}
.rpick-box{width:100%;min-height:38px;padding:7px 10px;border:1px solid var(--border-strong);border-radius:8px;background:#fff;text-align:left;font-size:13px;cursor:pointer;color:var(--text)}
.rpick-box:hover{border-color:#bdbcb5}
.rpick-ph{color:var(--text-tertiary,#9aa3af)}
.rpick-panel{position:absolute;z-index:var(--z-overlay);top:calc(100% + 6px);left:0;width:286px;max-width:calc(100vw - 60px);background:#fff;border:1px solid var(--border);border-radius:10px;box-shadow:0 12px 32px rgba(15,23,42,.16);padding:10px}
.rpick-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px;font-size:13px}
.rpick-nav{border:0;background:none;font-size:16px;cursor:pointer;padding:2px 10px;color:var(--text)}
.rpick-nav:hover{background:#f1f3f6;border-radius:6px}
.rpick-week,.rpick-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.rpick-week span{text-align:center;font-size:11px;color:var(--text-tertiary,#8a93a3);padding:2px 0}
.rpick-day{border:0;background:none;text-align:center;padding:6px 0;border-radius:6px;cursor:pointer;font-size:12.5px;color:var(--text);touch-action:manipulation}
.rpick-day:hover{background:#f1f3f6}
.rpick-day.rpick-today{box-shadow:inset 0 0 0 1px #b9c2cf}
.rpick-day.rpick-in{background:#e8f0fb;border-radius:0}
.rpick-day.rpick-edge{background:#2d66b2;color:#fff;font-weight:600}
.rpick-foot{margin-top:7px;font-size:11px;color:var(--text-tertiary,#8a93a3);line-height:1.5}
/* cs53：共享日历浮层（全局唯一，点击输入框弹出/选完自动收起/点外收起） */
.rpick-pop{position:fixed;z-index:var(--z-toast);width:286px;max-width:calc(100vw - 20px);background:#fff;border:1px solid var(--border);border-radius:10px;box-shadow:0 16px 40px rgba(15,23,42,.22);padding:10px}
.done-txt{color:#1b7f4d;font-weight:600}
/* cs53：推定完成（日期待补）黄色标识 + 必填缺失徽章 */
.cstep.pinf{border-color:#e6c26a!important;background:#fdf6e3!important}
.cstep.pinf .cstep-name::after{content:'待补';font-size:10px;color:#a06e00;background:#f7e7b5;border-radius:8px;padding:0 6px;margin-left:4px}
.cstep-date.inf{color:#a06e00;background:#f7e7b5;border-radius:8px;padding:0 6px;font-size:11px}
.inf-txt{color:#a06e00;font-weight:600}
.ct-alert.miss{background:#fdf2d7;color:#8a5a00;border:1px solid #ecd9a0}
/* cs53：审批页履约校验徽章 */
.ci-prog{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0 2px;font-size:12px}
.ci-ok{color:#1b7f4d;background:#e6f5ee;border-radius:8px;padding:2px 10px}
.ci-bad{color:#b3261e;background:#fdecea;border-radius:8px;padding:2px 10px;font-weight:600}
.ci-warn{color:#8a5a00;background:#fdf2d7;border-radius:8px;padding:2px 10px}
.item-add-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.item-add-panel{display:inline-flex;align-items:center;gap:6px;font-size:13px;color:var(--text)}
.item-add-panel input{width:56px;min-height:34px}

/* ═══ cs51：履约联动——悬停提示 / 质保状态色 / 详情网格 ═══ */
#gtip{position:fixed;z-index:var(--z-toast);max-width:300px;background:#1f2933;color:#fff;padding:9px 12px;border-radius:9px;font-size:12px;line-height:1.65;box-shadow:0 8px 24px rgba(15,23,42,.28);pointer-events:none;white-space:normal;word-break:break-all}
#gtip b{color:#ffd58a}
.cstep.wexpired{opacity:.45;filter:grayscale(.55)}
.cstep.wexpired .cstep-date{color:var(--text-tertiary,#8a93a3)}
.fact-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:4px 18px;margin:2px 0 8px}
.fact-row{display:flex;gap:8px;font-size:12px;line-height:1.6;min-width:0}
.fact-row.full{grid-column:1/-1}
.fact-row.full .fact-v{white-space:normal}
.fact-k{flex:0 0 auto;color:var(--text-tertiary,#8a93a3)}
.fact-v{color:var(--text);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
@media(max-width:760px){.fact-grid{grid-template-columns:repeat(2,1fr)}}
.fact-row.ok .fact-v{color:#1b7f4d;font-weight:600}
.fact-row.dim .fact-v{color:var(--text-tertiary,#8a93a3)}

/* ==========================================================================
   UI Handbook 规范对齐层 · cs57
   规范来源：形色场 UI Handbook — https://github.com/zzhzhouzhou/UI-handbook
   本地 skill：~/.workbuddy/skills/ui-handbook（含体检脚本 scripts/ui-audit.mjs）
   本层只做三件事，不改布局、间距、字号、圆角：
     ① 文字对比度达标（原 --text-tertiary 白底只有 2.81:1，而它承载的是 9–12px 小字）
     ② z-index 从 9 个散值（1/5/7/10/30/60/70/100/3000/9999）收敛为 6 档
     ③ 四代令牌（--ink / --ui-* / --notion-* / 现行 --text-*）收敛为单一来源
   ========================================================================== */

/* ① 令牌：单一来源 + 对比度达标 --------------------------------------------- */
:root{
  /* 文字三档 —— 实测对比度（--surface 白底 / --surface-subtle #f7f7f5 / --surface-hover #f1f1ee）
     主 13.59/12.67/12.01、次 6.12/5.71/5.41、辅 5.43/5.06/4.79，全部 ≥4.5:1（WCAG AA） */
  --text:#2f2e2a;            /* 主文字：不变 */
  --text-secondary:#63625b;  /* 次要文字：原 #6f6e68（在 --danger-soft 红底上仅 4.49:1，差一点） */
  --text-tertiary:#6b6a64;   /* 辅助小字：原 #96958f（白底 2.81:1，小字基本读不清） */

  /* 旧四代令牌一律降级为别名，值统一收口到上面三档，不再各自维护 */
  --ink:var(--text);
  --ui-text:var(--text);
  --notion-text:var(--text);
  --muted:var(--text-secondary);
  --ui-muted:var(--text-secondary);
  --notion-muted:var(--text-secondary);
  --notion-faint:var(--text-tertiary);   /* 原是死令牌，从未被引用 */

  /* 语义色收敛：原来红/琥珀各有多个近似值，统一到已有的 project 令牌上 */
  --notion-red:var(--danger);            /* 原 #d44c47 白底 4.26:1 → #bd4b4b 4.92:1 */
  --warning-strong:#915708;              /* 履约提醒徽章文字：原 #9a6b1a 在 #fdf3e3 上 4.25:1 → 5.35:1 */

  /* z-index 六档（全站只用这些值，禁止 3000 / 9999 这类魔法数字） */
  --z-base:0;        /* 页面内容 */
  --z-card:10;       /* 悬浮卡片 / 表格吸顶表头 */
  --z-dropdown:20;   /* 下拉 / 气泡 */
  --z-sticky:40;     /* 粘性顶栏 / 侧边栏 */
  --z-overlay:50;    /* 遮罩 + 弹窗 + 浮层面板 */
  --z-toast:60;      /* 全局提示，永远最上 */
}

/* ② z-index 收敛：已在上面的原始声明处就地改成 var()，此处仅留映射表备查
   —— 全站层级关系（从低到高）：表头 < 下拉 < 粘性顶栏 < 浮层面板/弹窗 < 固定浮层/提示
      .ct-table th            --z-card      10   （原 1）
      .status-menu>div        --z-dropdown  20   （原 5）
      .column-picker>div      --z-dropdown  20   （原 7）
      aside（≤760px 顶栏）     --z-sticky    40   （原 30）
      .modal                  --z-overlay   50   （原 10）★ 唯一有意的层级修正
      .mfilter-panel          --z-overlay   50   （原 60）
      .rpick-panel            --z-overlay   50   （原 70）
      .skip-link              --z-toast     60   （原 100）
      .rpick-pop              --z-toast     60   （原 3000）
      #gtip                   --z-toast     60   （原 9999）
   ★ 修正原因：.modal 原为 10，低于移动端顶栏(30) 与下拉(5/7)，
     会出现「打开弹窗时顶栏浮在遮罩之上」。提到遮罩档后弹窗正确压住一切下层元素。 */

/* ③ 补丁：选中态浅灰底（#e9e9e5）上的红色计数，--danger 只有 4.04:1，单独压深一档 */
.task-type-strip button.active b{color:#b03636!important}

/* ==========================================================================
   cs58 · 「合同管理」与「预测看板·拿单概率分析」Notion 重设计
   只改观感，不动 DOM 结构、不动业务逻辑、不动表格列序。
   设计口径（Notion database table）：
     · 表头 12px 中灰、极淡底 #fbfbfa、1px 细下边线，不加粗不抢戏
     · 每行一条极淡分隔线 rgba(55,53,47,.055)，hover 用中性灰而不是蓝色
     · 标签统一 4px 圆角 / 11px / 18px 行高，取代原来的 10~12px 大药丸
     · 表单控件统一 32px 高、5px 圆角、自绘下拉箭头（原生 select 一律替换）
     · 排序箭头默认隐藏，hover 表头才淡出 —— 和 Notion 一致
   ========================================================================== */

/* ---------- A. 数据表通用语言 ---------- */

/* 表头：两张表统一 */
.ct-twrap .ct-table thead th,
.table-wrap:not(.ct-twrap) .prob-table thead th{
  background:#fbfbfa;
  color:#6b6a64;
  font-size:12px;
  font-weight:500;
  letter-spacing:.01em;
  border-bottom:1px solid rgba(55,53,47,.09);
  white-space:nowrap;
}
.ct-twrap .ct-table thead th{text-align:left}
.table-wrap:not(.ct-twrap) .prob-table thead th{text-align:left}
/* 第 3 列「预计金额」的单元格是 .num 右对齐，表头也要跟着右对齐，否则两者错开 */
.table-wrap:not(.ct-twrap) .prob-table thead th:nth-child(3){text-align:right;padding-right:12px}

/* 行分隔线 + 中性 hover（覆盖原来 .prob-table 的蓝色 #f5f8fc） */
.ct-twrap .ct-table tbody td,
.table-wrap:not(.ct-twrap) .prob-table tbody td{
  border-bottom:1px solid rgba(55,53,47,.055);
}
.ct-twrap .ct-table tbody tr:last-child td,
.table-wrap:not(.ct-twrap) .prob-table tbody tr:last-child td{border-bottom:0}
.ct-twrap .ct-table tbody tr:hover td,
.table-wrap:not(.ct-twrap) .prob-table tbody tr:hover td{background:rgba(55,53,47,.03)}
.ct-twrap .ct-table tbody tr.ctr-expand td{background:var(--surface-subtle)}

/* 外层卡片：Notion 的细边框、小圆角、无投影 */
.ct-twrap{border:1px solid rgba(55,53,47,.09);border-radius:6px;background:#fff;box-shadow:none}

/* 排序箭头：默认隐形，hover 表头才出现；激活态常显并加深 */
.ct-twrap .ct-sort .ct-sort-ic{opacity:0;transition:opacity .12s ease,color .12s ease;font-size:9px}
.ct-twrap .ct-table thead th:hover .ct-sort-ic{opacity:.5}
.ct-twrap .ct-sort.active .ct-sort-ic{opacity:1;color:var(--text)}

/* 单元格排版：单位名称是「标题列」，用 500 字重而不是 600 */
.ct-twrap .ct-table td.ct-td-co b{font-weight:500;color:var(--text)}
.ct-twrap .ct-table tbody td{font-size:12.5px;color:var(--text)}
.ct-twrap .ct-table tbody td b{font-variant-numeric:tabular-nums}
.ct-twrap .ct-table .muted{color:var(--text-tertiary)}

/* 合同表标签：统一成 Notion tag（4px 圆角 / 11px / 18px 高） */
.ct-no,.ct-src,.ct-prog,.ct-alert,.ct-cnt{
  display:inline-block;
  padding:0 6px;
  border-radius:4px;
  font-size:11px;
  line-height:18px;
  font-weight:500;
  white-space:nowrap;
  vertical-align:middle;
  font-variant-numeric:tabular-nums;
}
.ct-prog{background:#eaf2fb;color:#2f6a9e}
.ct-prog.full{background:#e9f5ef;color:#0f6b46}
.ct-alert.over{background:#fdecec;color:#b3261e}
.ct-alert.soon{background:#fdf3e3;color:#915708}
.ct-alert.miss{background:#fdf2d7;color:#8a5a00;border:0}
.ct-no{background:#f1f1ef;color:#4a4945;margin-left:6px}
.ct-src{background:#e9f5ef;color:#0f6b46;margin-left:5px}
.ct-cnt{background:#f1f1ef;color:#4a4945}

/* ---------- B. 工具栏控件统一 ---------- */

/* 原生 select 一律替换为 Notion 选择器（自绘箭头，去掉系统外观） */
.contract-filters select,
.page-toolbar select,
.prob-month,
.dashboard-filters select{
  -webkit-appearance:none;
  appearance:none;
  padding:0 26px 0 10px;
  border:1px solid rgba(55,53,47,.16);
  border-radius:5px;
  background-color:#fff;
  background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12'%3E%3Cpath d='M3.2 4.8 6 7.6l2.8-2.8' fill='none' stroke='%236b6a64' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;
  background-position:right 8px center;
  color:var(--text);
  font-size:12.5px;
  cursor:pointer;
  transition:border-color .12s ease,background-color .12s ease;
}
.contract-filters select:hover,
.page-toolbar select:hover,
.prob-month:hover,
.dashboard-filters select:hover{border-color:rgba(55,53,47,.32)}

/* 下载履约进度 Excel：这一页的主行动，给强调色，和全站 .primary 保持一致 */
#exportProgressBtn{
  background:var(--accent);
  border-color:var(--accent);
  color:#fff;
  font-weight:500;
}
#exportProgressBtn:hover{background:var(--accent-hover);border-color:var(--accent-hover)}

/* 显示字段 */
.column-picker>summary{
  border-color:rgba(55,53,47,.16);
  border-radius:5px;
  color:var(--text-secondary);
  font-size:12px;
}
.column-picker>summary:hover{border-color:rgba(55,53,47,.32);color:var(--text)}

/* ---------- C. 预测看板：视图切换 + 筛选 ---------- */

/* 按月预测 / 拿单概率分析 → Notion 视图切换器（浅灰轨道 + 白色浮起段） */
.forecast-tabs{
  display:inline-flex;
  gap:2px;
  width:max-content;
  margin-bottom:12px;
  padding:2px;
  border:0;
  border-bottom:0;
  border-radius:8px;
  background:#f1f1ef;
}
.forecast-tabs button{
  min-height:30px;
  padding:4px 12px;
  border:0;
  border-radius:6px;
  background:transparent;
  color:var(--text-secondary);
  font-size:13px;
  font-weight:500;
}
.forecast-tabs button:hover{background:rgba(55,53,47,.05)}
.forecast-tabs button.active{
  background:#fff;
  color:var(--text);
  font-weight:600;
  box-shadow:0 1px 2px rgba(15,15,15,.08),0 0 0 1px rgba(55,53,47,.06);
}
.forecast-tabs button.active::after{content:none}

/* 筛选 chips：去掉 999px 大药丸和双层描边，收敛成 6px 小圆角 */
.prob-chips .prob-chip{
  gap:5px;
  padding:4px 10px;
  border:1px solid rgba(55,53,47,.12);
  border-radius:6px;
  background:#fff;
  color:var(--text-secondary);
  font-size:12.5px;
  transition:background .12s ease,border-color .12s ease,color .12s ease;
}
.prob-chips .prob-chip b{font-size:12.5px;font-weight:600;color:var(--text)}
.prob-chips .prob-chip small{font-size:11px;color:var(--text-tertiary)}
.prob-chips .prob-chip:hover{background:#f7f7f5;border-color:rgba(55,53,47,.22)}
.prob-chips .prob-chip.active{
  background:#f1f1ef;
  border-color:rgba(55,53,47,.3);
  box-shadow:none;
  font-weight:600;
}
.prob-chips .prob-chip.pc-high{background:#e9f5ef;border-color:transparent}
.prob-chips .prob-chip.pc-high b{color:#0f6b46}
.prob-chips .prob-chip.pc-mid{background:#fdf3e3;border-color:transparent}
.prob-chips .prob-chip.pc-mid b{color:#915708}
.prob-chips .prob-chip.pc-low{background:#fdecec;border-color:transparent}
.prob-chips .prob-chip.pc-low b{color:#b3261e}
.prob-chips .prob-chip.pc-none{background:#f1f1ef;border-color:transparent}
.prob-chips .prob-chip.pc-none b{color:var(--text-secondary)}
.prob-chips .prob-chip.active{border-color:rgba(55,53,47,.3)}

/* ---------- D. 概率表 ---------- */

/* 表格内的概率标签：4px 小圆角 tag，不再是药丸 */
.prob-table .prob-chip{
  display:inline-block;
  padding:0 7px;
  border:0;
  border-radius:4px;
  font-size:11px;
  font-weight:500;
  line-height:18px;
}
.prob-table .prob-chip.pc-high{background:#e9f5ef;color:#0f6b46}
.prob-table .prob-chip.pc-mid{background:#fdf3e3;color:#915708}
.prob-table .prob-chip.pc-low{background:#fdecec;color:#b3261e}
.prob-table .prob-chip.pc-none{background:#f1f1ef;color:#6b6a64}

/* 客户名 / 机会号 / 产品 / 归属 */
.pc-cust{font-weight:500;color:var(--text);font-size:13px}
.pc-opp{font-size:11px;color:var(--text-tertiary);margin-top:1px}
.pc-prod{color:var(--text);font-size:12.5px}
.pc-amt{font-weight:600;font-size:13px;font-variant-numeric:tabular-nums}
.pc-month{font-size:12.5px;color:var(--text-secondary)}
.pc-next{font-size:12.5px;color:var(--text-secondary)}
.pc-next small{color:var(--text-tertiary)}
.pc-cat{
  padding:0 7px;
  border-radius:4px;
  background:#f1f1ef;
  color:#5f5e5a;
  font-size:11px;
  line-height:18px;
}
.prob-table tbody tr:hover .pc-cust{color:#2f6a9e}

/* 面板标题：Notion 用 600 而不是 650 */
.panel-title{font-weight:600}

/* ---------- E. 桌面端密度（≥761px 才收紧，避免覆盖移动端 44px 触控目标） ---------- */
@media (min-width:761px){
  .contract-filters select,.page-toolbar select,.prob-month,.dashboard-filters select{height:32px;min-height:32px}
  .contract-filters .mfilter-toggle,
  .contract-filters .secondary,
  #exportProgressBtn,
  .column-picker>summary{height:32px;min-height:32px;padding-top:0;padding-bottom:0}

  /* 合同表：表头 34px、行 40px，比原来的 48px 紧凑，接近 Notion 密度 */
  .ct-twrap .ct-table thead th{height:34px}
  .ct-twrap .ct-table th.ct-th-plain{padding:0 10px}
  .ct-twrap .ct-sort{min-height:34px;padding:0 10px}
  .ct-twrap .ct-table tbody td{height:40px;padding:0 10px}

  /* 概率表 */
  .table-wrap:not(.ct-twrap) .prob-table thead th{height:34px;padding:0 12px}
  .table-wrap:not(.ct-twrap) .prob-table tbody td{height:44px;padding:6px 12px;font-size:12.5px}
  .prob-chips .prob-chip{min-height:32px}
}

/* ---------- F. 合同管理页头重排（只在这一个工具栏上生效） ----------
   原状：全局 header 已经有大标题「合同管理」，页面内又重复一个 h2「合同管理」；
        提示文案「可多选：…」和控件挤在同一行，整行很挤。
   改后：左侧留计数，右侧是筛选项，提示降级为下一行的小字说明。
   用 :has(.contract-filters) 精准命中——合同审批 / 履约确认两个子页的 page-toolbar
   没有 .contract-filters，不受影响。（:has 不被支持时自动退化为原布局，不会坏） */
.page-toolbar:has(.contract-filters){
  display:flex;
  align-items:center;
  flex-wrap:wrap;
  gap:8px 16px;
  margin-bottom:12px;
}
.page-toolbar:has(.contract-filters)>div:first-child{flex:0 0 auto}
.page-toolbar:has(.contract-filters) h2{display:none}
.page-toolbar:has(.contract-filters) p{margin:0;font-size:12.5px;color:var(--text-secondary)}
.page-toolbar:has(.contract-filters) .contract-filters{flex:1 1 0;min-width:0;justify-content:flex-end}
.page-toolbar:has(.contract-filters) .mf-hint{
  order:10;
  flex:1 0 100%;
  margin-top:2px;
  text-align:right;
  font-size:11.5px;
}

/* 「显示字段」的箭头原来用 '〈' 旋转 -90° 拼出来，字形很怪；
   换成和 select 下拉箭头同一枚 SVG，工具栏里所有箭头就统一了 */
.column-picker>summary::after{
  content:'';
  width:12px;
  height:12px;
  margin-left:6px;
  transform:none;
  background:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12'%3E%3Cpath d='M3.2 4.8 6 7.6l2.8-2.8' fill='none' stroke='%236b6a64' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center/12px;
}

/* 「全部担当」的下拉三角形原来是 ▾ 字符，和 select 的 SVG 箭头不是一套。
   用 font-size:0 把字符隐掉（保留 span 的尺寸），换成同一枚 SVG。 */
.contract-filters .mfilter-caret{
  display:inline-block;   /* inline 元素上 width/height 不生效，箭头会消失 */
  vertical-align:-1px;
  width:12px;
  height:12px;
  margin-left:5px;
  opacity:1;
  font-size:0;
  background:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12'%3E%3Cpath d='M3.2 4.8 6 7.6l2.8-2.8' fill='none' stroke='%236b6a64' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E") no-repeat center/12px;
}

/* ==========================================================================
   cs59 · Twenty CRM 设计语言
   ==========================================================================
   来源（数值均为源码原值，color(display-p3) 已换算为 sRGB）：
     twenty/packages/twenty-ui/src/theme/theme-light.css
     twenty/packages/twenty-ui/src/primitives/input/Button/Button.module.scss
     twenty/packages/twenty-ui/src/primitives/data-display/Tag/Tag.module.scss
     twenty/packages/twenty-ui/src/primitives/data-display/Chip/Chip.module.scss
     twenty/packages/twenty-ui/src/primitives/surfaces/Card/Card.module.scss
     twenty/packages/twenty-ui/src/styles/abstracts/_mixins.scss   （focus-ring）
     twenty/packages/twenty-front/src/index.css                    （html font-size:13px）
     twenty/packages/twenty-front/.../NavigationDrawerItem.tsx     （侧栏菜单项）

   只改样式，不动 DOM、不动任何业务逻辑。
   ========================================================================== */

/* ---------- A. 令牌层：Twenty 设计令牌 ---------- */
:root{
  /* 灰阶 12 级 */
  --t-gray1:#ffffff;  --t-gray2:#fcfcfc;  --t-gray3:#f9f9f9;  --t-gray4:#f1f1f1;
  --t-gray5:#ebebeb;  --t-gray6:#d6d6d6;  --t-gray7:#cccccc;  --t-gray8:#b3b3b3;
  --t-gray9:#999999;  --t-gray10:#838383; --t-gray11:#666666; --t-gray12:#333333;

  /* 语义 */
  --t-bg-primary:var(--t-gray1);
  --t-bg-secondary:var(--t-gray2);
  --t-bg-tertiary:var(--t-gray4);
  --t-bg-quaternary:var(--t-gray5);
  --t-bg-inverted:#333333;
  --t-bg-inverted-hover:#666666;
  --t-bg-danger:#feebec;
  --t-fg-primary:#333333;
  --t-fg-secondary:#666666;
  --t-fg-inverted:#ffffff;
  --t-fg-danger:#ce2c31;
  --t-border-light:var(--t-gray4);
  --t-border-medium:var(--t-gray5);
  --t-border-strong:var(--t-gray6);

  /* 透明黑：Twenty 的全部交互底色都建立在这四档上 */
  --t-tp-lighter:rgba(0,0,0,.02);
  --t-tp-light:rgba(0,0,0,.04);
  --t-tp-medium:rgba(0,0,0,.08);
  --t-tp-strong:rgba(0,0,0,.16);
  --t-overlay:rgba(0,0,0,.36);

  /* 强调蓝 */
  --t-blue:#3e63dd;  --t-blue-hover:#3358d4;  --t-blue-soft:#edf2fe;  --t-blue-line:#abbdf9;

  /* 间距：4 网格 */
  --t-sp1:4px; --t-sp2:8px; --t-sp3:12px; --t-sp4:16px; --t-sp6:24px; --t-sp8:32px;

  /* 圆角（基础刻度；@supports(corner-shape:squircle) 里的翻倍版本是 Safari 专属，不采用） */
  --t-r-xs:2px; --t-r-sm:4px; --t-r-md:8px; --t-r-lg:16px; --t-r-xl:20px; --t-r-pill:999px;

  /* 阴影（原值） */
  --t-shadow-light:0 2px 4px rgba(0,0,0,.039), 0 0 4px rgba(0,0,0,.078);
  --t-shadow-strong:2px 4px 16px rgba(0,0,0,.161), 0 2px 4px rgba(0,0,0,.078);
  --t-shadow-heavy:0 0 8px rgba(0,0,0,.161), 0 8px 64px -16px rgba(0,0,0,.478), 0 24px 56px -16px rgba(0,0,0,.078);

  /* 字号：Twenty 的 html{font-size:13px}，所以 md = 13px */
  --t-fs-xs:11px; --t-fs-sm:12px; --t-fs-md:13px; --t-fs-lg:16px; --t-fs-xl:20px; --t-fs-2xl:24px;
  --t-fw-400:400; --t-fw-500:500; --t-fw-600:600;

  /* 动效 */
  --t-dur-instant:.075s; --t-dur-fast:.15s; --t-dur-normal:.3s;

  /* 标签配色：底取 Twenty 色阶 3、字取色阶 11。
     绿/琥珀/橙 的色阶 11 原值分别只有 4.36 / 4.27 / 3.87，压深一档到 ≥4.5。 */
  --t-tag-gray-bg:#f9f9f9;   --t-tag-gray-fg:#666666;    /* 5.45:1 */
  --t-tag-blue-bg:#edf2fe;   --t-tag-blue-fg:#3a5bc7;    /* 5.35:1 */
  --t-tag-green-bg:#e6f6eb;  --t-tag-green-fg:#00734a;   /* 5.28:1（原值 #00824d 仅 4.36） */
  --t-tag-amber-bg:#fff7c2;  --t-tag-amber-fg:#9c5800;   /* 5.08:1（原值 #ad6200 仅 4.27） */
  --t-tag-orange-bg:#ffefd6; --t-tag-orange-fg:#bc4600;  /* 4.63:1（原值 #d14e00 仅 3.87） */
  --t-tag-red-bg:#feebec;    --t-tag-red-fg:#ce2c31;     /* 4.54:1 */
  --t-tag-iris-bg:#f0f1fe;   --t-tag-iris-fg:#5753c6;    /* 5.41:1 */

  /* ---- 把项目既有的语义令牌重新指向 Twenty（全站后代都在用这些，等于一次性换肤） ---- */
  --surface:var(--t-bg-primary);
  --surface-subtle:var(--t-bg-secondary);
  --surface-hover:var(--t-bg-tertiary);
  --text:var(--t-fg-primary);
  --text-secondary:var(--t-fg-secondary);
  /* 偏离 1：Twenty 的 font-color-tertiary 是 #999999，白底只有 2.85:1。
     这一档承载的是真文字（辅助说明、表头、备注），不能照搬。
     改用 #6a6a6a —— 实测在所有浅底上全部 ≥4.5：
       白 5.41 / #fcfcfc 5.27 / #f9f9f9 5.14 / #f1f1f1 4.79 / #ebebeb 4.54
     Twenty 真正的「装饰性浅灰」保留在 --t-gray8(#b3b3b3)，用于分隔线、箭头这类非文字元素。 */
  --text-tertiary:#6a6a6a;
  --border:var(--t-border-medium);
  --border-strong:var(--t-border-strong);
  --accent:var(--t-bg-inverted);        /* Twenty 的主按钮是反色深灰，不是彩色 */
  --accent-hover:var(--t-bg-inverted-hover);
  --danger:var(--t-fg-danger);
  --danger-soft:var(--t-bg-danger);
  --focus:var(--t-blue);
  --radius-sm:var(--t-r-sm);
  --radius-md:var(--t-r-md);
  --warning-strong:var(--t-tag-amber-fg);
  --notion-red:var(--t-fg-danger);
}

/* ---------- B. 全局壳：灰底 + 白色内容卡 ---------- */
body{
  background:var(--t-bg-tertiary);
  color:var(--t-fg-primary);
  font-size:var(--t-fs-md);
  line-height:1.5;
}
#app{background:var(--t-bg-tertiary)}
aside{background:transparent;border-right:0;box-shadow:none}
main{background:var(--t-bg-primary)}
header{border-bottom:0}
h1{font-size:var(--t-fs-xl);font-weight:var(--t-fw-600);letter-spacing:-.01em;color:var(--t-fg-primary)}
header p{font-size:var(--t-fs-md);color:var(--t-fg-secondary)}
.brand{color:var(--t-fg-primary);font-weight:var(--t-fw-600);font-size:var(--t-fs-md)}
.brand-logo{border-color:var(--t-border-strong);border-radius:var(--t-r-md);color:var(--t-fg-secondary)}

/* 侧栏菜单项：32px 高 / 8px 圆角 / 中性文字，激活态只用一层 4% 黑底 */
nav{gap:2px}
nav button{
  border-radius:var(--t-r-md);
  color:var(--t-fg-secondary);
  font-size:var(--t-fs-md);
  font-weight:var(--t-fw-500);
  background:transparent;
  box-shadow:none;
  transition:background var(--t-dur-fast) ease,color var(--t-dur-fast) ease;
}
nav button:hover{background:var(--t-tp-light);color:var(--t-fg-primary)}
nav button.active{background:var(--t-tp-light);color:var(--t-fg-primary);font-weight:var(--t-fw-500);box-shadow:none}
.aside-foot{border-color:var(--t-border-medium)}
.aside-foot label,.aside-foot small{color:var(--t-fg-secondary)}

/* ---------- C. 按钮：Twenty Button 口径 ---------- */
.primary,.secondary,.danger-btn{
  padding:0 var(--t-sp2);
  border-radius:var(--t-r-md);
  font-size:var(--t-fs-md);
  font-weight:var(--t-fw-500);
  white-space:nowrap;      /* Twenty Button 的原始声明，防移动端标签折行 */
  transition:background var(--t-dur-fast) ease,border-color var(--t-dur-fast) ease;
}
.primary{background:var(--t-bg-inverted);border:1px solid var(--t-tp-strong);color:var(--t-fg-inverted)}
.primary:hover{background:var(--t-bg-inverted-hover);border-color:var(--t-tp-strong)}
.secondary{background:var(--t-tp-lighter);border:1px solid var(--t-tp-light);color:var(--t-fg-secondary)}
.secondary:hover{background:var(--t-bg-tertiary);border-color:var(--t-tp-light);color:var(--t-fg-primary)}
.danger-btn{background:var(--t-fg-danger);border:1px solid var(--t-fg-danger);color:#fff}
.danger-btn:hover{background:#b3252a;border-color:#b3252a}
button:disabled{opacity:.5}
.icon{color:var(--t-fg-secondary);border-radius:var(--t-r-md)}
.icon:hover{background:var(--t-tp-light);color:var(--t-fg-primary)}

/* 焦点环：Twenty 的 focus-ring 原样（2px 实心蓝 + 1px offset） */
button:focus-visible,input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible,a:focus-visible{
  outline:2px solid var(--t-blue);
  outline-offset:1px;
}

/* Twenty 的所有按钮都不折行；这里统一兜住，顺带修掉移动端「修改密码」被折成两行 */
button{white-space:nowrap}
.self-actions button{padding:0 var(--t-sp2);border-radius:var(--t-r-md);font-size:var(--t-fs-md)}

/* ---------- D. 输入控件 ---------- */
input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]),select,textarea{
  min-height:32px;
  padding:0 var(--t-sp2);
  border:1px solid var(--t-border-strong);
  border-radius:var(--t-r-md);
  background:var(--t-bg-primary);
  color:var(--t-fg-primary);
  font-size:var(--t-fs-md);
  transition:border-color var(--t-dur-fast) ease;
}
input:not([type="checkbox"]):not([type="radio"]):not([type="hidden"]):hover,
select:hover,textarea:hover{border-color:var(--t-gray10)}
textarea{padding:var(--t-sp2);min-height:72px}
input::placeholder,textarea::placeholder{color:var(--text-tertiary);opacity:1}
input[type="checkbox"],input[type="radio"]{accent-color:var(--t-bg-inverted)}

/* ---------- E. 标签：Twenty Tag 口径（高 20 / 圆角 4 / 内距 8 / 13px） ---------- */
.badge,.expiry,.appointment-left,.stage-age,.change-badge,.wf-chip,
.ct-no,.ct-src,.ct-prog,.ct-alert,.ct-cnt,.pc-cat,.contract-reminders .rem-badge{
  display:inline-flex;
  align-items:center;
  height:20px;
  padding:0 var(--t-sp2);
  border:0;
  border-radius:var(--t-r-sm);
  font-size:var(--t-fs-md);
  font-weight:var(--t-fw-400);
  line-height:1;
  white-space:nowrap;
  vertical-align:middle;
  font-variant-numeric:tabular-nums;
}
/* 灰 = 中性 */
.stage-age,.ct-no,.ct-cnt,.pc-cat{background:var(--t-tag-gray-bg);color:var(--t-tag-gray-fg)}
/* 蓝 = 进行中 */
.badge,.ct-prog{background:var(--t-tag-blue-bg);color:var(--t-tag-blue-fg)}
/* 绿 = 已完成 / 正常 */
.expiry,.ct-src,.ct-prog.full,.wf-chip.ok,.change-badge.signed,.appointment-left.safe{
  background:var(--t-tag-green-bg);color:var(--t-tag-green-fg);
}
/* 琥珀 = 临近 / 待处理 */
.badge.ext,.ct-alert.soon,.ct-alert.miss,.wf-chip.pending,.change-badge.extension,
.appointment-left.warn,.contract-reminders .rem-badge.warn{
  background:var(--t-tag-amber-bg);color:var(--t-tag-amber-fg);
}
/* 红 = 逾期 / 失败 */
.badge.late,.expiry.over,.ct-alert.over,.wf-chip.reject,.change-badge.closed,
.appointment-left.urgent,.contract-reminders .rem-badge.danger{
  background:var(--t-tag-red-bg);color:var(--t-tag-red-fg);
}

/* ---------- F. 卡片与表格 ---------- */
.panel,.metric,.table-wrap,.case-card,.task-card,.month-card,.kanban-column,.task-column,
.case-strip,.admin-box,.login-card,.quality-grid>div,.summary-grid>div,.issue-grid>div{
  border:1px solid var(--t-border-medium);
  border-radius:var(--t-r-md);
  background:var(--t-bg-primary);
  box-shadow:none;
}
.panel-title{border-color:var(--t-border-light);color:var(--t-fg-primary);font-weight:var(--t-fw-600)}
.case-card:hover,.task-card:hover{
  background:var(--t-bg-secondary);
  border-color:var(--t-border-strong);
  box-shadow:none;
  transform:none;
}
/* 表格口径沿用 cs58，只换成 Twenty 的灰 */
.ct-twrap .ct-table thead th,
.table-wrap:not(.ct-twrap) .prob-table thead th{
  background:var(--t-bg-secondary);
  color:var(--t-fg-secondary);
  border-bottom:1px solid var(--t-border-medium);
}
.ct-twrap .ct-table tbody td,
.table-wrap:not(.ct-twrap) .prob-table tbody td{border-bottom:1px solid var(--t-border-light)}
.ct-twrap .ct-table tbody tr:hover td,
.table-wrap:not(.ct-twrap) .prob-table tbody tr:hover td{background:var(--t-tp-light)}
.ct-twrap{border:1px solid var(--t-border-medium);border-radius:var(--t-r-md)}
.overdue-table th,.month-table thead th,.case-table th{background:var(--t-bg-secondary);color:var(--t-fg-secondary)}
.overdue-table td,.month-table td,.case-table td{border-color:var(--t-border-light)}
.overdue-table tbody tr:hover,.month-table tbody tr:hover,.case-table tbody tr:hover,.assignment-row:hover{background:var(--t-tp-light)}
.empty{color:var(--text-tertiary)}

/* ---------- G. 浮层 ---------- */
.modal{background:var(--t-overlay)}
.modal-card{border:1px solid var(--t-border-medium);border-radius:var(--t-r-lg);box-shadow:var(--t-shadow-heavy)}
.modal-head,.modal-actions{border-color:var(--t-border-light)}
#gtip{background:var(--t-bg-inverted);border-radius:var(--t-r-md);box-shadow:var(--t-shadow-strong)}
.mfilter-panel,.column-picker>div,.status-menu>div,.rpick-panel,.rpick-pop{
  border:1px solid var(--t-border-medium);
  border-radius:var(--t-r-md);
  box-shadow:var(--t-shadow-strong);
}

/* cs58 的控件口径向 Twenty 收敛：圆角 5→8、描边换成灰阶 */
.contract-filters select,.page-toolbar select,.prob-month,.dashboard-filters select,
.column-picker>summary,.status-menu summary{
  border-color:var(--t-border-strong);
  border-radius:var(--t-r-md);
}
.contract-filters select:hover,.page-toolbar select:hover,.prob-month:hover,
.dashboard-filters select:hover,.column-picker>summary:hover,.status-menu summary:hover{border-color:var(--t-gray10)}
.forecast-tabs{background:var(--t-bg-tertiary);border-radius:var(--t-r-md)}
.forecast-tabs button{border-radius:var(--t-r-sm);color:var(--t-fg-secondary)}
.forecast-tabs button.active{background:var(--t-bg-primary);color:var(--t-fg-primary);box-shadow:var(--t-shadow-light)}

/* 筛选 chips = Twenty 按钮（高 32 / 圆角 8 / 4% 描边），语义色只落在数字上 */
.prob-chips .prob-chip{
  min-height:32px;
  padding:0 var(--t-sp2);
  border:1px solid var(--t-tp-light);
  border-radius:var(--t-r-md);
  background:var(--t-tp-lighter);
  color:var(--t-fg-secondary);
}
.prob-chips .prob-chip b{color:var(--t-fg-primary)}
.prob-chips .prob-chip small{color:var(--text-tertiary)}
.prob-chips .prob-chip:hover{background:var(--t-bg-tertiary);border-color:var(--t-tp-light)}
.prob-chips .prob-chip.pc-high,.prob-chips .prob-chip.pc-mid,
.prob-chips .prob-chip.pc-low,.prob-chips .prob-chip.pc-none{background:var(--t-tp-lighter);border-color:var(--t-tp-light)}
.prob-chips .prob-chip.pc-high b{color:var(--t-tag-green-fg)}
.prob-chips .prob-chip.pc-mid b{color:var(--t-tag-amber-fg)}
.prob-chips .prob-chip.pc-low b{color:var(--t-tag-red-fg)}
.prob-chips .prob-chip.pc-none b{color:var(--t-fg-secondary)}
.prob-chips .prob-chip.active{background:var(--t-tp-light);border-color:var(--t-tp-medium);color:var(--t-fg-primary)}

/* 表格内的概率标签走 Tag 口径 */
.prob-table .prob-chip{
  height:20px;
  padding:0 var(--t-sp2);
  border:0;
  border-radius:var(--t-r-sm);
  font-size:var(--t-fs-md);
  font-weight:var(--t-fw-400);
  line-height:1;
}
.prob-table .prob-chip.pc-high{background:var(--t-tag-green-bg);color:var(--t-tag-green-fg)}
.prob-table .prob-chip.pc-mid{background:var(--t-tag-amber-bg);color:var(--t-tag-amber-fg)}
.prob-table .prob-chip.pc-low{background:var(--t-tag-red-bg);color:var(--t-tag-red-fg)}
.prob-table .prob-chip.pc-none{background:var(--t-tag-gray-bg);color:var(--t-tag-gray-fg)}
.prob-table tbody tr:hover .pc-cust{color:var(--t-blue)}
.pc-cust{font-weight:var(--t-fw-500)}
.pc-amt{font-weight:var(--t-fw-600)}
.pc-opp{color:var(--text-tertiary)}

/* 选中态浅灰底上的红字：Twenty 红 11 在 #e9e9e5 上只有 4.04，压深一档 */
.task-type-strip button.active b{color:#b3252a!important}

/* ---------- H. 登录页 ---------- */
.login-view,.boot-view{background:var(--t-bg-tertiary)}
.login-card{border:1px solid var(--t-border-medium);border-radius:var(--t-r-lg);box-shadow:var(--t-shadow-light)}
.login-hint{color:var(--text-tertiary)}
.error{background:var(--t-bg-danger);border:1px solid #ffcdce;border-radius:var(--t-r-md);color:var(--t-fg-danger)}

/* ---------- I. 桌面密度（≥761px，避免覆盖 ≤760 的 44px 触控规则） ---------- */
@media (min-width:761px){
  #app{grid-template-columns:200px minmax(0,1fr)}
  aside{padding:var(--t-sp2) var(--t-sp2) var(--t-sp2) var(--t-sp3)}
  /* 内容区 = 浮在灰底上的白卡（Twenty 的招牌布局） */
  main{
    width:auto;              /* 原有规则里的 width:100% 会吃掉右侧边距，必须放开 */
    max-width:none;
    margin:var(--t-sp2) var(--t-sp2) var(--t-sp2) 0;
    padding:var(--t-sp4) var(--t-sp6) var(--t-sp8);
    border:1px solid var(--t-border-medium);
    border-radius:var(--t-r-md);
    min-height:calc(100dvh - 16px);
  }
  header{min-height:0;margin-bottom:var(--t-sp4);padding-bottom:0}
  nav button{min-height:32px;padding:var(--t-sp1) var(--t-sp2)}
  .brand{height:36px;padding:var(--t-sp1) var(--t-sp2)}
  .primary,.secondary,.danger-btn{min-height:32px;padding:0 var(--t-sp3)}
  .ct-twrap .ct-table thead th,
  .table-wrap:not(.ct-twrap) .prob-table thead th{height:36px}
  .ct-twrap .ct-sort{min-height:36px;padding:0 var(--t-sp2)}
  .ct-twrap .ct-table th.ct-th-plain{padding:0 var(--t-sp2)}
  .ct-twrap .ct-table tbody td{height:40px;padding:0 var(--t-sp2)}
  .table-wrap:not(.ct-twrap) .prob-table thead th{padding:0 var(--t-sp3)}
  .table-wrap:not(.ct-twrap) .prob-table tbody td{padding:6px var(--t-sp3)}
}

/* ==========================================================================
   cs60 · 状态申请处理工具条 + 案件表格状态下拉
   说明：本段**自包含**，不依赖任何设计令牌，可以单独拿到旧版（cs56 及以前）上使用。
   ========================================================================== */

/* R5：状态申请处理的搜索 / 导出工具条 */
.workflow-toolbar{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 12px;
}
.workflow-toolbar #wfSearch{
  flex:1 1 260px;min-width:200px;max-width:420px;
  height:32px;min-height:32px;padding:0 10px;
  border:1px solid #d6d6d6;border-radius:6px;background:#fff;
  font-size:13px;color:#333;
}
.workflow-toolbar #wfSearch:focus-visible{outline:2px solid #3e63dd;outline-offset:1px}
.workflow-toolbar .secondary{
  height:32px;min-height:32px;padding:0 12px;
  border:1px solid #d6d6d6;border-radius:6px;background:#fff;
  font-size:13px;color:#333;cursor:pointer;white-space:nowrap;
}
.workflow-toolbar .secondary:hover{background:#f1f1f1}
.workflow-toolbar .wf-hint{
  flex:1 1 100%;margin-top:-2px;font-size:11.5px;color:#6a6a6a;line-height:1.5;
}
.workflow-toolbar .wf-hint b{color:#9c5800;font-weight:600}

/* R5：相邻相同值合并后的单元格 */
.workflow-table td.wf-merged{
  vertical-align:top;background:#fcfcfc;
  border-right:1px solid #f1f1f1;font-weight:500;white-space:nowrap;
}

/* R4：案件表格里的「状态」下拉（仅综合管理部可见） */
.case-table select.status-step{
  -webkit-appearance:none;appearance:none;
  height:26px;min-height:26px;padding:0 22px 0 6px;
  border:1px solid #d6d6d6;border-radius:4px;
  font-size:12px;color:#333;background-color:#fff;cursor:pointer;
  background-image:url("data:image/svg+xml;utf8,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12'%3E%3Cpath d='M3.2 4.8 6 7.6l2.8-2.8' fill='none' stroke='%23666666' stroke-width='1.3' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 6px center;
}
.case-table select.status-step:hover{border-color:#838383}
.case-table select.status-step:focus-visible{outline:2px solid #3e63dd;outline-offset:1px}

/* 移动端：工具条纵向排列、控件撑到 44px 触控下限 */
@media (max-width:760px){
  .workflow-toolbar{flex-direction:column;align-items:stretch}
  .workflow-toolbar #wfSearch{max-width:none;height:44px;min-height:44px}
  .workflow-toolbar .secondary{min-height:44px}
  .case-table select.status-step{height:40px;min-height:40px;font-size:13px}
}

/* ==========================================================================
   cs73 · 状态申请处理：一屏紧凑布局
   六组信息代替九个宽列；回复输入、结果与操作始终保持在同一行。
   窄屏改为卡片，页面本身不产生横向滚动。
   ========================================================================== */
.workflow-wrap{overflow-x:hidden}
.workflow-table{width:100%;min-width:0!important;table-layout:fixed}
.workflow-table .wf-col-request{width:10%}
.workflow-table .wf-col-customer{width:15%}
.workflow-table .wf-col-owner{width:10%}
.workflow-table .wf-col-state{width:9%}
.workflow-table .wf-col-note{width:14%}
.workflow-table .wf-col-reply{width:42%}
.workflow-table th,.workflow-table td{padding:8px!important;overflow:hidden}
.workflow-table tbody tr{height:54px;cursor:default}
.workflow-table .wf-request,.workflow-table .wf-customer,.workflow-table .wf-owner{white-space:normal}
.wf-request,.wf-customer,.wf-owner{min-width:0}
.wf-request .wf-time{font-size:11px;color:var(--text-tertiary);white-space:nowrap}
.wf-request .wf-time,.wf-request .change-badge{display:block;width:max-content}
.wf-request .change-badge{margin:3px 0 0}
.wf-customer b{display:block;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12.5px}
.wf-customer small,.wf-owner small{display:block;color:var(--text-tertiary);font-size:11px;line-height:1.25}
.wf-owner b{font-size:12px;font-weight:550}
.workflow-table td.report-note{display:-webkit-box;max-width:none;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;white-space:normal!important;line-height:1.45;font-size:11.5px}
.workflow-state{white-space:nowrap}
.wf-reply-cell{overflow:visible!important}
.workflow-reply-stack{display:flex;min-width:0;flex-direction:column;gap:5px}
.workflow-reply{display:grid;grid-template-columns:minmax(100px,1fr) 84px auto;align-items:center;gap:6px;min-width:0;flex-wrap:nowrap}
.workflow-reply input[data-reply-content]{width:100%;min-width:0;height:32px;padding:0 9px;border:1px solid var(--border-strong);border-radius:6px;background:var(--surface);color:var(--text);font-size:12px}
.workflow-reply input[data-reply-content]:focus{outline:2px solid var(--n-accent-soft);border-color:var(--n-accent)}
.workflow-reply select{width:84px;min-width:0;height:32px;padding:0 5px;border:1px solid var(--border-strong);border-radius:6px;background:var(--surface);font-size:12px}
.workflow-reply .wr-actions{display:flex;flex-wrap:nowrap;gap:5px;min-width:0}
.workflow-confirm{display:flex;align-items:center;gap:6px;flex-wrap:nowrap;min-width:0}
.workflow-confirm .contract-fields{display:inline-flex;align-items:center;gap:5px;min-width:0;flex-wrap:nowrap}
.workflow-confirm.close-decision{display:flex;align-items:center;gap:6px;flex-wrap:nowrap}
.workflow-reply-stack .early-extension-note{padding:5px 8px;border:1px solid #ead8ad;border-radius:5px;background:#fff9ea;color:#7a5712;font-size:11px;line-height:1.35}
.workflow-table .workflow-reply button,.workflow-table .workflow-judge button,.workflow-table .workflow-confirm button{min-height:32px;height:32px;padding:0 9px;font-size:11.5px}
.workflow-judge{display:flex;align-items:center;gap:6px;flex-wrap:nowrap}
.workflow-toolbar{flex-wrap:nowrap;align-items:center}
.workflow-toolbar #wfSearch{max-width:360px}
.workflow-toolbar .wf-hint{flex:1 1 auto;margin:0;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.workflow-summary{gap:6px;margin:8px 0 10px}
.workflow-summary>div{min-width:0;padding:8px 10px;border-radius:6px}
.workflow-summary b{font-size:18px}
.workflow-summary span{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

@media (max-width:1100px){
  .workflow-wrap{overflow:visible;border:0;background:transparent}
  .workflow-table,.workflow-table tbody{display:block;width:100%}
  .workflow-table thead,.workflow-table colgroup{display:none}
  .workflow-table tbody{display:grid;gap:10px}
  .workflow-table tbody tr{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));height:auto;padding:10px;border:1px solid var(--border);border-radius:8px;background:var(--surface)}
  .workflow-table tbody td{display:block!important;height:auto;padding:6px 8px!important;border:0;overflow:visible}
  .workflow-table tbody td::before{content:attr(data-label);display:block;margin-bottom:3px;color:var(--text-tertiary);font-size:10px;font-weight:600}
  .workflow-table tbody .report-note,.workflow-table tbody .wf-reply-cell{grid-column:1/-1}
  .workflow-table td.report-note{-webkit-line-clamp:2}
  .workflow-toolbar{flex-wrap:wrap}
  .workflow-toolbar .wf-hint{flex-basis:100%}
}

@media (max-width:760px){
  .workflow-summary{grid-template-columns:repeat(2,minmax(0,1fr))}
  .workflow-table tbody tr{grid-template-columns:1fr;padding:10px}
  .workflow-table tbody .report-note,.workflow-table tbody .wf-reply-cell{grid-column:auto}
  .workflow-reply{grid-template-columns:1fr 96px}
  .workflow-reply .wr-actions{grid-column:1/-1}
  .workflow-reply .wr-actions button{flex:1;min-height:44px;height:44px}
  .workflow-reply input[data-reply-content],.workflow-reply select{height:44px}
  .workflow-toolbar #wfSearch{max-width:none}
}

/* ==========================================================================
   cs61 · 销售管道 / 正式预测 口径说明条（Q-02）
   自包含，不依赖设计令牌。
   ========================================================================== */
.stage-note{
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  margin:0 0 12px;padding:10px 12px;
  border:1px solid #ebebeb;border-radius:8px;background:#fcfcfc;
  font-size:12.5px;line-height:1.6;color:#666;
}
.stage-note .sn-tag{
  flex:0 0 auto;padding:0 8px;border-radius:4px;
  font-size:11px;line-height:20px;font-weight:500;
}
.stage-note .sn-pipe{background:#edf2fe;color:#3a5bc7}
.stage-note .sn-fcast{background:#e6f6eb;color:#00734a}
.stage-note .sn-txt{flex:1 1 auto}
.stage-note .sn-txt b{color:#333;font-variant-numeric:tabular-nums}
@media (max-width:760px){
  .stage-note{flex-direction:column;align-items:flex-start;gap:4px}
}

/* ==========================================================================
   cs64 数据中心（纯追加段，回滚 = 删除本段）
   类名统一 dc- 前缀，不改动任何既有选择器。
   设计语言沿用 cs59（Twenty CRM 令牌：--t-*）
   ========================================================================== */
.dc{display:flex;flex-direction:column;gap:var(--t-sp4)}
.dc-cats{display:flex;flex-wrap:wrap;gap:var(--t-sp1);padding:var(--t-sp2);background:var(--t-bg-quaternary);border-radius:var(--t-r-md)}
.dc-cats button{font:inherit;font-size:13px;line-height:1;min-height:32px;padding:8px 14px;border:1px solid transparent;border-radius:var(--t-r-sm);background:transparent;color:var(--t-fg-secondary);cursor:pointer}
.dc-cats button:hover{background:var(--t-tp-light)}
.dc-cats button.active{background:var(--t-bg-primary);border-color:var(--t-border-strong);color:var(--t-fg-primary);font-weight:500;box-shadow:var(--t-shadow-light)}
.dc-cats button:focus-visible{outline:2px solid var(--t-blue);outline-offset:1px}
.dc-intro{margin:0;font-size:13px;line-height:1.6;color:var(--text-secondary)}
.dc-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(min(330px,100%),1fr));gap:var(--t-sp4);align-items:start}
.dc-card{min-width:0;display:flex;flex-direction:column;gap:var(--t-sp3);padding:var(--t-sp4);background:var(--surface);border:1px solid var(--t-border-medium);border-radius:var(--t-r-md)}
.dc-card.dc-off{border-style:dashed}
.dc-card-h{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:var(--t-sp2);flex-wrap:wrap}
.dc-card-h h3{margin:0;font-size:14px;font-weight:500;color:var(--text)}
.dc-badge{font-size:11px;line-height:18px;padding:0 8px;border-radius:var(--t-r-sm);background:var(--t-bg-quaternary);color:var(--text-secondary);white-space:nowrap}
.dc-flow{display:flex;align-items:center;gap:4px;flex-wrap:wrap;font-size:11px;color:var(--text-tertiary)}
.dc-flow i{font-style:normal;color:var(--text-tertiary)}
.dc-flow span{padding:0 6px;line-height:18px;border:1px solid var(--t-border-medium);border-radius:var(--t-r-sm);background:var(--t-bg-tertiary)}
.dc-flow span.on{border-color:var(--t-blue-line);background:var(--t-blue-soft);color:#2c4699}
.dc-desc{margin:0;font-size:13px;line-height:1.65;color:var(--text-secondary)}
.dc-body{min-width:0;display:flex;flex-direction:column;gap:var(--t-sp2)}
.dc-file{min-width:0;display:flex;align-items:center;gap:var(--t-sp2);flex-wrap:wrap}
.dc-file input[type=file]{min-width:0;flex:1 1 auto;font-size:12px;max-width:100%}
.dc-result{display:flex;flex-direction:column;gap:var(--t-sp2);padding:var(--t-sp3);border:1px solid var(--t-border-medium);border-radius:var(--t-r-sm);background:var(--t-bg-secondary);font-size:12px;line-height:1.6;color:var(--text-secondary)}
.dc-result.ok{border-color:var(--t-blue-line);background:var(--t-blue-soft)}
.dc-result.err{border-color:#e3b7b7;background:var(--danger-soft);color:#8b3a3a}
.dc-kv{display:flex;flex-wrap:wrap;gap:var(--t-sp3) var(--t-sp4)}
.dc-kv>div{display:flex;align-items:baseline;gap:6px}
.dc-kv b{font-size:17px;font-weight:500;color:var(--text);font-variant-numeric:tabular-nums}
.dc-kv>div:nth-child(2) b{color:var(--text)}
.dc-kv span{font-size:12px;color:var(--text-secondary)}
.dc-hint{margin:0;font-size:12px;line-height:1.6;color:var(--text-secondary)}
.dc-hint b{color:var(--text);font-weight:500}
.dc-warn{padding:6px 9px;border:1px solid #eddcb8;border-radius:var(--t-r-sm);background:#fdf6e6;color:var(--warning-strong);font-size:12px;line-height:1.6}
.dc-det{border-top:1px solid var(--t-border-medium);padding-top:var(--t-sp2)}
.dc-det>summary{cursor:pointer;font-size:12px;color:var(--text-secondary);list-style:none}
.dc-det>summary::-webkit-details-marker{display:none}
.dc-det>summary::before{content:'\25b8 ';color:var(--text-tertiary)}
.dc-det[open]>summary::before{content:'\25be '}
.dc-det .dc-tblwrap{margin-top:var(--t-sp2)}
.dc-tblwrap{max-height:280px;overflow:auto;border:1px solid var(--t-border-medium);border-radius:var(--t-r-sm);background:var(--surface)}
.dc-tbl{width:100%;border-collapse:collapse;font-size:12px}
.dc-tbl th{position:sticky;top:0;background:var(--t-bg-tertiary);color:var(--text-secondary);font-weight:500;text-align:left;padding:6px 9px;border-bottom:1px solid var(--t-border-medium);white-space:nowrap}
.dc-tbl td{padding:6px 9px;border-bottom:1px solid var(--t-border-light);color:var(--text);white-space:nowrap}
.dc-tbl tbody tr:last-child td{border-bottom:0}
.dc-tbl tbody tr:hover{background:var(--t-tp-lighter)}
.dc-line{padding:4px 0;border-bottom:1px solid var(--t-border-light);color:var(--text-secondary)}
.dc-line:last-child{border-bottom:0}
.dc-spin{color:var(--text-secondary)}
.dc-link{font:inherit;font-size:12px;padding:0;border:0;background:none;color:#2c4699;text-decoration:underline;cursor:pointer}
.dc-link:hover{color:var(--t-blue-hover)}
.dc-link:focus-visible{outline:2px solid var(--t-blue);outline-offset:2px}
.dc-foot{margin:0;padding-top:var(--t-sp3);border-top:1px solid var(--t-border-light);font-size:12px;line-height:1.7;color:var(--text-tertiary)}
@media (max-width:760px){
  .dc-grid{grid-template-columns:minmax(0,1fr)}
  .dc-cats button{min-height:44px;padding:10px 14px}
  .dc-card{padding:var(--t-sp3)}
  .dc-tblwrap{max-height:240px}
  /* 触控目标：本页主按钮在移动端抬到 44px（全局 .primary 只有 36px） */
  .dc .primary,.dc .secondary,.dc-body button{min-height:44px}
  .dc-body button{width:100%}
  .dc-link{display:inline-block;padding:8px 0}
}

/* ==========================================================================
   cs65 状态申请处理：表格形态对齐「合同管理」表（纯追加段，回滚 = 删除本段）
   ① 去掉 rowspan 合并 → 一行一记录，每个字段独立成列，不再把相同值竖着并成一格
   ② 列头排序复用 .ct-sort（⇅ 默认隐藏 / hover 淡出 / ↑↓ 激活常显），全部数据列可排序
   ========================================================================== */
.workflow-table{min-width:1560px}
.workflow-table thead th{padding:0}
.workflow-table thead th.ct-th-plain{padding:8px 9px}
.workflow-table thead .ct-sort{width:100%}
.workflow-table td.wf-time{white-space:nowrap;color:var(--text-secondary);font-variant-numeric:tabular-nums}
.workflow-table td.wf-code{font-family:ui-monospace,SFMono-Regular,Menlo,Consolas,monospace;font-size:11.5px;color:var(--text-secondary);white-space:nowrap}
.workflow-table td.report-note{max-width:300px;white-space:normal;line-height:1.55;color:var(--text-secondary)}
@media (max-width:760px){
  .workflow-table td.report-note{max-width:200px}
}

/* ==========================================================================
   cs66 数据中心视觉重做（对齐设计原型）+ 新增「统计分析」分类
   纯追加段，回滚 = 删除本段。规则写在 cs64 之后，同优先级自然覆盖。
   ① 分类切换器：药丸型，激活 = 深色实心
   ② 分类区：标题 + 副标题
   ③ 卡片：小图标 + 标题 + 描述 + 右箭头，整卡可点
   ④ 统计分析：面板 + 每张表独立下载按钮
   ========================================================================== */
.dc{gap:var(--t-sp6)}
.dc-cats{gap:8px;padding:0;background:none;border-radius:0}
.dc-cats button{min-height:38px;padding:0 18px;border:1px solid var(--t-border-strong);border-radius:999px;background:var(--surface);color:var(--text-secondary);font-size:14px;line-height:1}
.dc-cats button:hover{background:var(--t-bg-quaternary);color:var(--text)}
.dc-cats button.active{background:#333333;border-color:#333333;color:#ffffff;font-weight:500}
.dc-sec{margin:0}
.dc-sec h3{margin:0 0 5px;font-size:20px;font-weight:600;letter-spacing:-.2px;color:var(--text)}
.dc-sec p{margin:0;font-size:13.5px;line-height:1.6;color:var(--text-secondary)}
.dc-grid{gap:var(--t-sp4);grid-template-columns:repeat(auto-fill,minmax(min(420px,100%),1fr))}
.dc-card{padding:0;gap:0;overflow:hidden;border-radius:12px}
.dc-card-main{display:grid;grid-template-columns:24px minmax(0,1fr) 16px;gap:0 12px;align-items:center;width:100%;padding:18px;border:0;background:none;font:inherit;text-align:left;color:inherit;cursor:pointer}
.dc-card-main:hover{background:rgba(55,53,47,.028)}
.dc-card-main:focus-visible{outline:2px solid var(--t-blue);outline-offset:-2px}
.dc-card-static,.dc-card-static:hover{cursor:default;background:none}
.dc-ico{grid-column:1;align-self:start;margin-top:1px;color:var(--text-secondary)}
.dc-ico svg{display:block;width:21px;height:21px;fill:none;stroke:currentColor;stroke-width:1.7;stroke-linecap:round;stroke-linejoin:round}
.dc-card-main:hover .dc-ico,.dc-card-main:hover .dc-chev{color:var(--text)}
.dc-txt{grid-column:2;display:flex;flex-direction:column;gap:6px;min-width:0}
.dc-txt b{font-size:15px;font-weight:600;line-height:1.4;color:var(--text)}
.dc-txt i{font-style:normal;font-size:13px;line-height:1.6;color:var(--text-secondary)}
.dc-chev{grid-column:3;justify-self:end;align-self:center;font-size:17px;line-height:1;color:var(--text-tertiary)}
.dc-body{padding:14px 18px 18px;border-top:1px solid var(--t-border-light)}
.dc-body>.dc-flow{margin-bottom:12px}
.dc-card>.dc-result{margin:0 18px 18px}
.dc-analytics{display:flex;flex-direction:column;gap:var(--t-sp4)}
.dc-analytics>.panel{margin:0}
.dc-panel-right{display:inline-flex;align-items:center;gap:10px}
.dc-panel-right small{color:var(--text-tertiary);font-size:11.5px;font-weight:400;margin:0}
.dc-dl{min-height:30px;padding:0 12px;border:1px solid var(--t-border-strong);border-radius:8px;background:var(--surface);color:var(--text);font-size:12.5px;line-height:1;cursor:pointer;white-space:nowrap}
.dc-dl:hover{background:var(--t-bg-quaternary)}
.dc-dl:focus-visible{outline:2px solid var(--t-blue);outline-offset:1px}
.dc-actions{display:flex;flex-direction:column;gap:8px;align-items:flex-start;padding-top:var(--t-sp3);border-top:1px solid var(--t-border-light)}
.dc-actions small{color:var(--text-tertiary);font-size:12px}
.dc-err-box{padding:14px 16px;border:1px solid #f0cccc;border-radius:10px;background:var(--danger-soft);color:#8b3a3a;font-size:13px}
@media (max-width:760px){
  .dc-cats{flex-wrap:nowrap;overflow-x:auto;padding-bottom:4px}
  .dc-cats button{flex:0 0 auto;min-height:44px;padding:0 16px}
  .dc-sec h3{font-size:18px}
  .dc-card-main{padding:16px}
  .dc-body{padding:12px 16px 16px}
  .dc-card>.dc-result{margin:0 16px 16px}
  .dc-dl{min-height:40px;padding:0 14px}
  .dc-panel-right small{display:none}
}

/* ==========================================================================
   cs67 · Notion 设计系统（唯一真源）— 全站 UI/UX 美化
   --------------------------------------------------------------------------
   本段做三件事，且**不删除任何历史段落**（历史段落改为指向本段令牌）：
     ① 建立唯一 Design Token 真源（--n-*）：Notion 色板 / 排版 / 间距 / 圆角
     ② 别名层：把历史 5 代令牌（--ink/--muted → --ui-* → --notion-* →
        语义 --surface/--text-* → cs59 的 --t-*）**全部重指向本段**，
        自此全站只有一套颜色来源；8 个 :root 块不再是 8 套配色
     ③ 收敛通用组件的最终外观（按钮/表格/标签/输入/弹窗/侧边栏）
   回滚：删除本段即可；或 `git checkout main -- static/style.css`
   ========================================================================== */

/* ---------- ① 唯一真源 ---------- */
:root{
  /* 色板（对齐 Notion Workspace 规范） */
  --n-bg:#FFFFFF;
  --n-bg-sidebar:#F7F7F5;
  --n-bg-subtle:#FBFBFA;
  --n-bg-hover:#EFEFEC;
  --n-bg-active:#E8E8E5;
  --n-text:#2F3437;
  --n-text-2:#666B6D;
  --n-text-3:#6B6F71;
  --n-border:#E9E9E7;
  --n-border-2:#DCDCD8;
  --n-accent:#326852;
  --n-accent-hover:#285642;
  --n-accent-soft:#E9F3ED;
  --n-focus:rgba(50,104,82,.28);
  /* 业务语义色（按要求保留可识别度） */
  --n-red:#A63E40;   --n-red-bg:#FFF0F0;
  --n-green:#0F6B46; --n-green-bg:#E9F5EF;
  --n-amber:#9C671B; --n-amber-bg:#FFF4E5;
  --n-orange:#BC4600;--n-orange-bg:#FDEEE4;
  --n-blue:#315E89;  --n-blue-bg:#EAF2FA;
  --n-iris:#5753C6;  --n-iris-bg:#F0F1FE;
  --n-gray-fg:#5F5E5A;--n-gray-bg:#F1F1EF;
  /* 排版 */
  --n-font:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  --n-fs-h1:26px; --n-fs-h2:18px; --n-fs-h3:15px;
  --n-fs-body:14px; --n-fs-sm:13px; --n-fs-xs:12px; --n-fs-tag:11px;
  --n-lh:1.6;
  /* 间距（统一 4 的倍数） */
  --n-sp1:4px; --n-sp2:8px; --n-sp3:12px; --n-sp4:16px; --n-sp5:24px; --n-sp6:32px;
  /* 圆角 / 阴影 */
  --n-r-sm:4px; --n-r-md:6px; --n-r-lg:10px;
  --n-shadow:0 1px 2px rgba(15,15,15,.05),0 0 0 1px rgba(15,15,15,.03);
  --n-sidebar:232px;
}

/* ---------- ② 别名层：5 代历史令牌 → 全部指向真源 ---------- */
:root{
  /* 初代 */
  --ink:var(--n-text); --muted:var(--n-text-2); --line:var(--n-border); --soft:var(--n-bg-subtle);
  --blue:var(--n-blue); --red:var(--n-red); --shadow:var(--n-shadow);
  /* 二代 --ui-* */
  --ui-text:var(--n-text); --ui-muted:var(--n-text-2); --ui-border:var(--n-border);
  --ui-soft:var(--n-bg-subtle); --ui-hover:var(--n-bg-hover); --ui-focus:var(--n-focus);
  --ui-danger:var(--n-red); --ui-success:var(--n-green); --ui-warning:var(--n-amber);
  /* 三代 --notion-* */
  --notion-text:var(--n-text); --notion-muted:var(--n-text-2); --notion-faint:var(--n-text-3);
  --notion-line:var(--n-border); --notion-hover:var(--n-bg-hover); --notion-selected:var(--n-bg-active);
  --notion-red:var(--n-red); --notion-red-bg:var(--n-red-bg);
  --notion-green:var(--n-green); --notion-blue:var(--n-blue);
  /* 四代 语义令牌（cs59 曾指向 Twenty，现拉回 Notion） */
  --surface:var(--n-bg); --surface-subtle:var(--n-bg-subtle); --surface-hover:var(--n-bg-hover);
  --text:var(--n-text); --text-secondary:var(--n-text-2); --text-tertiary:var(--n-text-3);
  --border:var(--n-border); --border-strong:var(--n-border-2);
  --accent:var(--n-accent); --accent-hover:var(--n-accent-hover);
  --danger:var(--n-red); --danger-soft:var(--n-red-bg);
  --focus:var(--n-focus); --warning-strong:var(--n-amber);
  --radius-sm:var(--n-r-sm); --radius-md:var(--n-r-md); --shadow-float:var(--n-shadow);
  /* 五代 cs59 --t-*（Twenty）→ 同源 */
  --t-gray1:#FFFFFF; --t-gray2:var(--n-bg-subtle); --t-gray3:#F9F9F8; --t-gray4:var(--n-bg-hover);
  --t-gray5:var(--n-border); --t-gray6:var(--n-border-2); --t-gray7:#CFCEC8; --t-gray8:#B4B2A9;
  --t-gray9:var(--n-text-2); --t-gray10:var(--n-text-3); --t-gray11:#5F5E5A; --t-gray12:var(--n-text);
  --t-bg-primary:var(--n-bg); --t-bg-secondary:var(--n-bg-subtle);
  --t-bg-tertiary:var(--n-bg-sidebar); --t-bg-quaternary:var(--n-bg-hover);
  --t-bg-inverted:var(--n-accent); --t-bg-inverted-hover:var(--n-accent-hover);
  --t-bg-danger:var(--n-red-bg);
  --t-fg-primary:var(--n-text); --t-fg-secondary:var(--n-text-2);
  --t-fg-inverted:#FFFFFF; --t-fg-danger:var(--n-red);
  --t-border-light:var(--n-border); --t-border-medium:var(--n-border); --t-border-strong:var(--n-border-2);
  --t-blue:var(--n-accent); --t-blue-hover:var(--n-accent-hover);
  --t-blue-soft:var(--n-accent-soft); --t-blue-line:#B9CFC6;
  --t-tag-green-fg:var(--n-green);  --t-tag-green-bg:var(--n-green-bg);
  --t-tag-amber-fg:var(--n-amber);  --t-tag-amber-bg:var(--n-amber-bg);
  --t-tag-orange-fg:var(--n-orange);--t-tag-orange-bg:var(--n-orange-bg);
  --t-tag-blue-fg:var(--n-blue);    --t-tag-blue-bg:var(--n-blue-bg);
  --t-tag-iris-fg:var(--n-iris);    --t-tag-iris-bg:var(--n-iris-bg);
  --t-tag-gray-fg:var(--n-gray-fg); --t-tag-gray-bg:var(--n-gray-bg);
  --t-tag-red-fg:var(--n-red);      --t-tag-red-bg:var(--n-red-bg);
  --t-r-xs:3px; --t-r-sm:var(--n-r-sm); --t-r-md:var(--n-r-md); --t-r-lg:12px; --t-r-xl:16px;
  --t-shadow-light:var(--n-shadow); --t-shadow-strong:0 4px 12px rgba(15,15,15,.10);
  --t-fw-600:600;
}

/* ---------- ③ 外壳：字体基线 / 侧边栏 / 内容区 / 标题层级 ---------- */
html{font-size:16px;scrollbar-color:#D3D1C7 transparent}
body{font-family:var(--n-font);font-size:var(--n-fs-body);line-height:var(--n-lh);
  color:var(--n-text);background:var(--n-bg);letter-spacing:0;-webkit-font-smoothing:antialiased}
#app{grid-template-columns:var(--n-sidebar) minmax(0,1fr);background:var(--n-bg)}
aside{width:var(--n-sidebar);background:var(--n-bg-sidebar);
  border-right:1px solid var(--n-border);box-shadow:none}
main{background:var(--n-bg)}
h1{font-size:var(--n-fs-h1);line-height:1.25;font-weight:600;letter-spacing:-.02em;color:var(--n-text)}
header p,#pageSub{font-size:var(--n-fs-sm);color:var(--n-text-2);margin-top:var(--n-sp1)}

/* 侧边栏 */
.brand{font-size:var(--n-fs-body);font-weight:600;color:var(--n-text)}
.brand-logo{border-radius:var(--n-r-sm);background:var(--n-accent);color:#fff;
  border-color:var(--n-accent);font-weight:600}
nav button{color:var(--n-gray-fg);border-radius:var(--n-r-sm);font-size:var(--n-fs-body);font-weight:400}
nav button:hover{background:var(--n-bg-hover);color:var(--n-text)}
nav button.active{background:var(--n-bg-active);color:var(--n-text);font-weight:500}
nav button svg{stroke:currentColor}
.aside-foot{border-top:1px solid var(--n-border)}
.aside-foot label,.aside-foot small{color:var(--n-text-2)}

/* 通用按钮 */
.primary,.secondary,.danger-btn{border-radius:var(--n-r-sm);font-size:var(--n-fs-sm);
  font-weight:500;transition:background .12s ease,border-color .12s ease,color .12s ease}
.primary{background:var(--n-accent);border-color:var(--n-accent);color:#fff;box-shadow:none}
.primary:hover{background:var(--n-accent-hover);border-color:var(--n-accent-hover)}
.secondary{background:var(--n-bg);border-color:var(--n-border-2);color:var(--n-text)}
.secondary:hover{background:var(--n-bg-hover);border-color:var(--n-border-2)}
.danger-btn{background:var(--n-red);border-color:var(--n-red);color:#fff}
button:focus-visible,.primary:focus-visible,.secondary:focus-visible,
input:focus-visible,select:focus-visible,textarea:focus-visible,summary:focus-visible,
a:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}

/* 面板 / 卡片 */
.panel,.admin-box,.month-card,.case-card,.task-card,.dc-card,
.workflow-summary,.overdue-summary>div,.issue-grid>div,.summary-grid>div{
  background:var(--n-bg);border:1px solid var(--n-border);border-radius:var(--n-r-md);box-shadow:none}
.panel-title{min-height:44px;padding:var(--n-sp3) var(--n-sp4);border-bottom:1px solid var(--n-border);
  background:var(--n-bg);color:var(--n-text);font-size:var(--n-fs-sm);font-weight:600}
.panel-title small{color:var(--n-text-3);font-size:var(--n-fs-tag);font-weight:400}

/* 表格（Notion：轻表头 + 细行线 + 浅灰悬停） */
table{font-size:var(--n-fs-xs)}
.case-table th,.month-table th,.overdue-table th,.analytics-table th,.dc-tbl th,
table thead th{background:var(--n-bg-subtle);color:var(--n-text-3);font-weight:500;
  font-size:var(--n-fs-xs);border-color:var(--n-border)}
.case-table td,.month-table td,.overdue-table td,.analytics-table td,.dc-tbl td,table tbody td{
  border-color:var(--n-border);color:var(--n-text)}
.case-table tbody tr:hover,.month-table tbody tr:hover,.analytics-table tbody tr:hover,
.dc-tbl tbody tr:hover,table tbody tr:hover{background:var(--n-bg-subtle)}
.total-row th,.total-row td{background:var(--n-bg-subtle)}

/* 标签 / 状态标记（4px 圆角，浅底深字） */
.badge,.wf-chip,.ct-no,.ct-src,.change-badge,.stage-note span,.status-chip{
  border-radius:var(--n-r-sm);font-size:var(--n-fs-tag);line-height:18px;font-weight:500}

/* 表单控件 */
input,select,textarea{border-radius:var(--n-r-sm);border-color:var(--n-border-2);
  color:var(--n-text);background:var(--n-bg);font-family:inherit}
input::placeholder,textarea::placeholder{color:var(--n-text-3)}

/* 弹窗 */
.modal-card{border-radius:var(--n-r-lg);border:1px solid var(--n-border);box-shadow:var(--t-shadow-heavy)}
.modal-head{border-bottom:1px solid var(--n-border)}
.modal-head h2{font-size:var(--n-fs-h2);font-weight:600;color:var(--n-text)}
.modal-head p{color:var(--n-text-2);font-size:var(--n-fs-sm)}
.modal-actions{border-top:1px solid var(--n-border)}

/* Tabs（Notion 视图切换器：灰轨道 + 白浮起段） */
.tabs{border-bottom:1px solid var(--n-border)}
.tabs button{color:var(--n-text-2);font-size:var(--n-fs-sm)}
.tabs button:hover{color:var(--n-text);background:var(--n-bg-hover)}
.tabs button.active{color:var(--n-text);font-weight:500;border-color:var(--n-text)}

/* ---------- ④ cs69：页面骨架与报备案件样板 ---------- */
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.page-breadcrumb{margin-bottom:var(--n-sp2);color:var(--n-text-3);font-size:var(--n-fs-xs);line-height:1.4}
.page-header{display:flex;align-items:flex-start;justify-content:space-between;gap:var(--n-sp4);margin-bottom:var(--n-sp5);padding-bottom:var(--n-sp4);border-bottom:1px solid var(--n-border)}
.page-header h1{margin:0}
.page-actions{display:flex;align-items:center;gap:var(--n-sp2);min-height:34px}
.brand{display:flex;align-items:center;gap:9px;min-height:44px}
.brand-logo{display:inline-grid;place-items:center;width:24px;height:24px;flex:0 0 24px}
nav button{display:flex;align-items:center;gap:9px;min-height:36px}
nav button svg{width:16px;height:16px;flex:0 0 16px}
.case-workspace{display:grid;gap:var(--n-sp3)}
.case-viewbar{display:flex;align-items:center;justify-content:space-between;gap:var(--n-sp4);min-height:40px;border-bottom:1px solid var(--n-border)}
.view-switch{display:flex;align-items:center;gap:2px}
.view-switch button{min-height:36px;padding:0 11px;border:0;border-bottom:2px solid transparent;background:transparent;color:var(--n-text-2);font-size:var(--n-fs-sm)}
.view-switch button:hover{background:var(--n-bg-hover);color:var(--n-text)}
.view-switch button.active{border-bottom-color:var(--n-accent);color:var(--n-text);font-weight:600}
.case-view-meta{display:flex;align-items:center;gap:6px;color:var(--n-text-3);font-size:var(--n-fs-xs)}
.case-view-meta strong{color:var(--n-text);font-size:var(--n-fs-sm)}
.case-filters{align-items:center;margin:0;padding:var(--n-sp3);border:1px solid var(--n-border);border-radius:var(--n-r-md);background:var(--n-bg-subtle)}
.case-filters .case-search{flex:1;min-width:220px}
.case-filters .case-search input{width:100%;min-width:0}
.case-content{min-width:0}
.case-list-view{border-radius:var(--n-r-md)}
.case-table tbody tr{height:42px}
.case-table tbody tr:focus-visible{outline:2px solid var(--n-accent);outline-offset:-2px;background:var(--n-accent-soft)}
.case-pager{display:flex;align-items:center;justify-content:space-between;gap:var(--n-sp4);padding:var(--n-sp3) 2px;color:var(--n-text-2);font-size:var(--n-fs-xs)}
.case-pager>div{display:flex;align-items:center;gap:var(--n-sp2)}
.case-pager .secondary{min-height:32px;padding:5px 10px}
.case-pager button:disabled{cursor:not-allowed;opacity:.45}
.kanban{gap:var(--n-sp3)}
.kanban-column{border:1px solid var(--n-border);background:var(--n-bg-subtle);padding:var(--n-sp2)}
.case-card{position:relative;padding:var(--n-sp3);box-shadow:none;transition:background .12s ease,border-color .12s ease}
.case-card:hover,.case-card:focus-within{background:var(--n-bg);border-color:var(--n-border-2)}
.case-card:focus-visible{outline:2px solid var(--n-accent);outline-offset:1px}
.case-card-top{padding-right:0}
.case-card-meta{display:flex;flex-wrap:wrap;gap:5px 10px;padding-top:var(--n-sp2);border-top:1px solid var(--n-border);color:var(--n-text-3);font-size:var(--n-fs-tag)}
.case-card-menu{position:absolute;top:8px;right:8px;z-index:2}
.case-card-menu>summary{display:grid;place-items:center;width:28px;height:28px;border-radius:var(--n-r-sm);color:var(--n-text-2);cursor:pointer;list-style:none;font-weight:700;letter-spacing:1px}
.case-card-menu>summary::-webkit-details-marker{display:none}
.case-card-menu>summary:hover,.case-card-menu[open]>summary{background:var(--n-bg-hover);color:var(--n-text)}
.case-card-popover{position:absolute;top:32px;right:0;width:260px;padding:var(--n-sp3);border:1px solid var(--n-border);border-radius:var(--n-r-md);background:var(--n-bg);box-shadow:0 6px 20px rgba(15,15,15,.12)}
.case-card-popover .inline-fields{margin-bottom:var(--n-sp2)}
.case-card-popover .card-actions{display:grid;grid-template-columns:1fr;gap:var(--n-sp2);margin:0}
.case-card-popover .card-actions button{min-height:34px;text-align:left}
@media(prefers-reduced-motion:reduce){*,*::before,*::after{scroll-behavior:auto!important;transition-duration:.01ms!important;animation-duration:.01ms!important;animation-iteration-count:1!important}}

/* ---------- ⑤ 桌面密度（≥761px，避免覆盖移动端 44px 触控规则）---------- */
@media (min-width:761px){
  main{padding:var(--n-sp6) var(--n-sp6) 64px}
  header{margin-bottom:var(--n-sp5);padding-bottom:var(--n-sp4)}
  .case-table th,.case-table td{padding:7px 10px}
  .panel-title{min-height:44px}
  .dc-grid{gap:var(--n-sp4)}
}

/* ---------- ⑥ 移动端（≤760px 保持宽松触控目标）---------- */
@media (max-width:760px){
  html{font-size:16px}
  body{font-size:var(--n-fs-body)}
  /* 必须重新声明：上面无条件的 #app 规则会盖掉更早的移动端单列布局 */
  #app{grid-template-columns:1fr}
  aside{width:auto}
  main{padding:var(--n-sp4)}
  h1{font-size:20px}
  .page-header{align-items:flex-start}
  .page-actions .primary{display:inline-flex;min-height:44px}
  .case-viewbar{align-items:flex-start;flex-direction:column;padding-bottom:var(--n-sp2)}
  .case-view-meta{width:100%;justify-content:space-between}
  .case-filters{display:grid;grid-template-columns:1fr 1fr;width:100%}
  .case-filters .case-search{grid-column:1/-1;min-width:0}
  .case-filters>*{min-height:44px;min-width:0}
  .case-pager{align-items:flex-start;flex-direction:column}
  .case-pager>div{width:100%;justify-content:space-between}
  .kanban{grid-template-columns:repeat(4,minmax(82vw,1fr))}
  .case-card-menu>summary{width:44px;height:44px;margin:-8px -8px 0 0}
  .case-card-popover{width:min(300px,76vw)}
}

/* 登录页：Notion 风格的灰白企业工作台 */
.login-view{min-height:100vh;background:#f5f5f3;color:#2f3437}
.login-shell{display:grid;grid-template-rows:auto minmax(0,1fr) auto;min-height:100vh;background:#f5f5f3}
.login-topbar{display:flex;align-items:center;min-height:76px;margin:0;padding:20px 40px;border:0;border-bottom:1px solid #e6e6e2;background:rgba(250,250,248,.92)}
.login-company{display:flex;align-items:center;gap:14px;color:#3d413f;font-size:14px;font-weight:600;letter-spacing:-.01em}
.login-logo-image{width:86px;height:30px;object-fit:contain;background:transparent;mix-blend-mode:multiply}
.login-main{display:grid;place-items:center;width:auto;max-width:none;min-height:0;margin:0;padding:48px 24px;border:0;border-radius:0;background:transparent}
.login-card{width:min(420px,100%);padding:36px;border:1px solid #deded9;border-radius:12px;background:#fff;box-shadow:0 12px 34px rgba(34,39,36,.06)}
.login-heading{margin-bottom:30px}
.login-heading h1{margin:0 0 8px;color:#252a27;font-size:27px;line-height:1.25;font-weight:650;letter-spacing:-.025em}
.login-heading p{margin:0;color:#6f756f;font-size:13px;line-height:1.6}
.login-field{display:block;margin-bottom:18px}
.login-field>span{display:block;margin-bottom:8px;color:#4e5551;font-size:12px;font-weight:600}
.login-field select,.login-field input{width:100%;min-height:48px;padding:10px 13px;border:1px solid #d2d5d1;border-radius:7px;background:#fff;color:#2f3437;font-size:14px;transition:border-color .15s ease,box-shadow .15s ease,background .15s ease}
.login-field select:hover,.login-field input:hover{border-color:#b8bdb9}
.login-field select:focus,.login-field input:focus{outline:0;border-color:#326852;box-shadow:0 0 0 3px rgba(50,104,82,.14)}
.login-field input::placeholder{color:#6f756f}
.login-card .login-submit{width:100%;min-height:48px;margin-top:4px;border-radius:7px;background:#326852;border-color:#326852;color:#fff;font-size:14px;font-weight:600}
.login-card .login-submit:hover{background:#285642;border-color:#285642}
.login-card .login-submit:disabled{cursor:wait;background:#718f81;border-color:#718f81}
.login-card .error{margin:0 0 14px;padding:10px 12px;border:1px solid #edcccc;border-radius:7px;background:#fff4f4;color:#973b3d;font-size:12px;line-height:1.55}
.login-footer{display:flex;justify-content:space-between;gap:24px;padding:20px 40px;border-top:1px solid #e6e6e2;color:#686e6a;font-size:11px;background:rgba(250,250,248,.78)}
.login-footer p{margin:0}
.login-view ::selection{background:#dce9e1;color:#24372d}
.login-view button:focus-visible,.login-view select:focus-visible,.login-view input:focus-visible{outline:2px solid #326852;outline-offset:2px}
.brand{gap:9px}.brand-image{width:76px;height:28px;object-fit:contain;border-radius:4px;background:#fff}.brand>span{display:flex;align-items:baseline;gap:4px;white-space:nowrap}.brand>span b{font-size:13px}.brand>span small{color:var(--n-muted);font-size:9px;font-weight:700;letter-spacing:.08em}
#userPicker{padding:10px;border:1px solid var(--n-line);border-radius:9px;background:#fff}#userPicker label{font-size:11px;font-weight:650;color:var(--n-text)}#userPicker select{min-height:36px;margin-top:6px;border-color:var(--n-line);border-radius:6px;background:#fafafa}#userPicker #roleText{display:block;margin-top:6px;color:var(--n-muted);font-size:10px;line-height:1.45}
.user-badge{margin-top:8px;padding:10px;border:1px solid var(--n-line);border-radius:9px;background:#f7f7f5}.user-badge b{font-size:14px}.user-badge #selfRole{line-height:1.45}.self-actions button{border-color:var(--n-line);border-radius:6px}
.dc-scope{display:grid;grid-template-columns:auto 1fr;align-items:center;gap:3px 10px;padding:12px 14px;border:1px solid #d7dce5;border-left:3px solid #263670;border-radius:8px;background:#f7f8fb;color:#646b78}.dc-scope>span{font-size:11px}.dc-scope>b{color:#202f69;font-size:13px}.dc-scope>small{grid-column:1/-1;color:#7b8290;font-size:11px}.dc-actions small b{color:#202f69}
@media(max-width:760px){
  .login-topbar{min-height:66px;padding:16px 20px}
  .login-company{gap:11px;font-size:13px}
  .login-logo-image{width:72px;height:26px}
  .login-main{place-items:start center;padding:40px 20px}
  .login-card{padding:28px 24px;border-radius:10px;box-shadow:none}
  .login-heading{margin-bottom:26px}
  .login-heading h1{font-size:24px}
  .login-footer{display:block;padding:18px 20px;line-height:1.7}
  .login-footer p+p{margin-top:3px}
  .brand-image{width:68px}.brand>span{display:none}
}
@media(max-width:430px){
  .login-main{padding:28px 16px}
  .login-card{padding:26px 20px}
}

/* cs73 最终覆盖：放在历史兼容样式之后，确保旧版 1560px 宽表规则不再生效。 */
.workflow-wrap .workflow-table{width:100%;min-width:0!important;table-layout:fixed}
.workflow-wrap .workflow-table td{min-width:0!important}
.workflow-wrap .workflow-table td.report-note{max-width:none}

/* cs74 · 全站配色收敛、无底色品牌标识与下载型统计入口 */
:root{
  --n-bg:#fcfdfb;
  --n-bg-sidebar:#f3f6f2;
  --n-bg-subtle:#f7f9f6;
  --n-bg-hover:#e9efe9;
  --n-bg-active:#dfe9e2;
  --n-text:#29332e;
  --n-text-2:#626d67;
  --n-text-3:#7a847f;
  --n-border:#e1e7e2;
  --n-border-2:#cfd8d1;
  --n-accent:#326852;
  --n-accent-hover:#285642;
  --n-accent-soft:#e6f0e9;
}
body,#app,main{background:var(--n-bg)}
aside{background:var(--n-bg-sidebar)}
.brand-image{width:82px;height:30px;border-radius:0;background:transparent;mix-blend-mode:multiply}
nav button.active{background:var(--n-bg-active);color:var(--n-accent)}
.tabs button.active{border-color:var(--n-accent);color:var(--n-accent)}
.dc-cats button.active{background:var(--n-accent);border-color:var(--n-accent);color:#fff}
.dc-cats button.active:hover{background:var(--n-accent-hover);border-color:var(--n-accent-hover)}
.dc-scope{border-color:var(--n-border-2);border-left-color:var(--n-accent);background:var(--n-bg-subtle);color:var(--n-text-2)}
.dc-scope>b,.dc-actions small b{color:var(--n-accent)}
.dc-download-only{display:grid;grid-template-columns:44px minmax(0,1fr) auto;align-items:center;gap:16px;padding:24px;border:1px solid var(--n-border);border-radius:var(--n-r-lg);background:var(--n-bg)}
.dc-download-icon{display:grid;place-items:center;width:44px;height:44px;border-radius:10px;background:var(--n-accent-soft);color:var(--n-accent)}
.dc-download-icon svg{width:23px;height:23px;fill:none;stroke:currentColor;stroke-width:1.8;stroke-linecap:round;stroke-linejoin:round}
.dc-download-only h4{margin:0 0 4px;color:var(--n-text);font-size:16px}
.dc-download-only p{margin:0 0 5px;color:var(--n-text-2);font-size:13px}
.dc-download-only small{color:var(--n-text-3);font-size:12px}
.dc-download-only small b{color:var(--n-accent)}
.dc-download-only .primary{min-height:40px;white-space:nowrap}

@media(min-width:1101px){
  .workflow-table tbody tr{height:auto}
  .workflow-table td.report-note{display:table-cell!important;-webkit-line-clamp:unset;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}
}
@media(max-width:1100px){
  .workflow-table td.report-note{display:grid!important;-webkit-line-clamp:unset;overflow:visible;text-overflow:clip;overflow-wrap:anywhere;word-break:break-word}
}
@media(max-width:760px){
  .brand-image{width:74px;background:transparent}
  .dc-download-only{grid-template-columns:44px 1fr;padding:18px}
  .dc-download-only .primary{grid-column:1/-1;width:100%;min-height:44px}
}

/* cs77 · 案件编辑入口与二次确认 */
.case-table th.case-edit-col,.case-table td.case-edit-col{position:sticky;right:0;z-index:2;width:72px;min-width:72px;background:var(--n-bg)}
.case-table thead th.case-edit-col{z-index:4;background:var(--n-bg-subtle);font-weight:600}
.case-table tbody tr:hover td.case-edit-col{background:var(--n-bg-subtle)}
.case-edit-btn{min-height:32px;padding:4px 12px;border-color:var(--n-border-2);background:#fff;color:var(--n-accent);white-space:nowrap}
.case-edit-hint{margin:10px 0 0!important;padding:11px 12px;border-radius:7px;background:var(--n-bg-subtle);line-height:1.65}
.case-edit-review{padding-top:22px}
.case-edit-review-head{padding-bottom:16px;border-bottom:1px solid var(--n-border)}
.case-edit-review-head>span{display:inline-block;margin-bottom:8px;color:var(--n-accent);font-size:11px;font-weight:700;letter-spacing:.08em}
.case-edit-review-head h3{margin:0 0 6px;color:var(--n-text);font-size:20px}
.case-edit-review-head p{color:var(--n-text-2);font-size:12px}
.case-edit-changes{margin:14px 0;border:1px solid var(--n-border);border-radius:9px;overflow:hidden}
.case-edit-changes>div{display:grid;grid-template-columns:120px minmax(0,1fr) 20px minmax(0,1fr);gap:10px;align-items:center;padding:11px 12px;border-bottom:1px solid var(--n-border);font-size:12px}
.case-edit-changes>div:last-child{border-bottom:0}.case-edit-changes b{color:var(--n-text)}.case-edit-changes span{color:var(--n-text-3);overflow-wrap:anywhere}.case-edit-changes i{color:var(--n-text-3);font-style:normal;text-align:center}.case-edit-changes strong{color:var(--n-accent);overflow-wrap:anywhere}
.case-edit-transfer{display:grid;gap:4px;padding:12px;border:1px solid #d4dfd7;border-radius:8px;background:var(--n-accent-soft);color:var(--n-text);font-size:12px;line-height:1.55}.case-edit-transfer span{color:var(--n-text-2)}
.case-edit-back{margin-top:14px}
.notice-actions{margin-top:10px}
@media(max-width:620px){.case-edit-changes>div{grid-template-columns:1fr 18px 1fr}.case-edit-changes b{grid-column:1/-1}.case-edit-col{right:0}}
