:root{--ink:#10241f;--ink-2:#18342d;--paper:#fff;--soft:#f4f7f6;--line:#dce5e1;--muted:#6f7f79;--green:#16895f;--green-soft:#e9f6ef;--amber:#a86000;--amber-soft:#fff4df;--red:#b83f42;--red-soft:#ffeff0;--blue:#246ec7;--radius:10px;--shadow:0 5px 16px rgba(16,36,31,.06)}
.conversion-grid{display:grid;grid-template-columns:minmax(0,1.45fr) minmax(290px,.85fr);gap:16px}.funnel{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:8px;padding:16px}.funnel-step{border:1px solid var(--line);border-radius:8px;padding:12px;background:#fbfcfc;min-height:88px}.funnel-step b{display:block;font-size:20px;margin:7px 0 3px}.funnel-step small{color:var(--muted);font-size:11px;line-height:1.4;display:block}.stage-pill{display:inline-flex;align-items:center;border-radius:999px;padding:4px 8px;font-size:11px;background:#edf5ff;color:var(--blue);white-space:nowrap}.stage-pill.good{background:var(--green-soft);color:var(--green)}.stage-pill.warn{background:var(--amber-soft);color:var(--amber)}.goal-note{padding:14px 16px;border-left:3px solid var(--blue);background:#edf5ff;line-height:1.6;font-size:12px}.compact-list{padding:2px 16px 12px}.compact-list .issue-row{grid-template-columns:minmax(0,1fr) auto}.conversion-actions{display:flex;gap:8px;flex-wrap:wrap}.course-cells{display:flex;gap:4px;flex-wrap:wrap}.course-cell{font-size:11px;padding:3px 5px;border-radius:4px;background:var(--soft);color:var(--muted)}.course-cell.done{background:var(--green-soft);color:var(--green)}
.service-action-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;padding:16px}.service-action{border:1px solid var(--line);border-radius:8px;padding:13px;background:#fff;text-align:left;cursor:pointer;font:inherit;color:var(--ink)}.service-action:hover{background:#f0f8f4;border-color:#b9dcca}.service-action b{display:block;margin-bottom:6px}.service-action small{display:block;color:var(--muted);font-size:11px;line-height:1.45}.kpi-strip{display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:16px}.kpi-strip>div{border-radius:8px;background:var(--soft);padding:12px}.kpi-strip label{color:var(--muted);font-size:11px;display:block}.kpi-strip b{font-size:19px;display:block;margin:6px 0 2px}.kpi-strip small{color:var(--muted);font-size:11px}.sales-chart-row{display:grid;grid-template-columns:90px minmax(0,1fr) 52px;gap:10px;align-items:center;padding:10px 16px;border-bottom:1px solid var(--line)}.sales-chart-row:last-child{border-bottom:0}.sales-bar{height:9px;border-radius:999px;background:var(--soft);overflow:hidden}.sales-bar span{display:block;height:100%;background:var(--blue);border-radius:999px}
@media(max-width:1050px){.conversion-grid{grid-template-columns:1fr}.funnel{grid-template-columns:repeat(3,minmax(0,1fr))}.kpi-strip{grid-template-columns:repeat(2,1fr)}}@media(max-width:700px){.service-action-grid{grid-template-columns:1fr 1fr}}@media(max-width:600px){.funnel{grid-template-columns:1fr 1fr}.kpi-strip,.service-action-grid{grid-template-columns:1fr}}
*{box-sizing:border-box}body{margin:0;background:var(--soft);color:var(--ink);font-family:"Microsoft YaHei","PingFang SC",Arial,sans-serif;font-size:14px}.app-shell{display:grid;grid-template-columns:210px minmax(0,1fr);min-height:100vh}.sidebar{background:var(--ink);color:#eff8f4;padding:20px 14px;display:flex;flex-direction:column;gap:20px}.brand{display:flex;align-items:center;gap:10px;font-weight:700;font-size:16px}.brand small{display:block;font-weight:400;font-size:11px;opacity:.72;margin-top:4px}.brand-mark{display:grid;place-items:center;width:36px;height:36px;border-radius:9px;background:var(--green);font-size:20px}.role-switch{display:grid;grid-template-columns:1fr 1fr;gap:4px;padding:4px;background:rgba(255,255,255,.09);border-radius:8px}.role-switch button{border:0;border-radius:6px;background:transparent;color:#eef8f4;opacity:.7;padding:7px 4px;cursor:pointer}.role-switch button.active{background:rgba(255,255,255,.14);opacity:1}.nav{display:grid;gap:4px}.nav button{border:0;background:transparent;color:#e9f4ef;text-align:left;border-radius:7px;padding:10px;cursor:pointer;font:inherit;opacity:.75}.nav button:hover,.nav button.active{background:rgba(255,255,255,.13);opacity:1}.sidebar-foot{margin-top:auto;padding:12px;border-radius:8px;background:rgba(255,255,255,.09)}.sidebar-foot small{opacity:.7}.sidebar-foot strong{display:block;font-size:19px;margin-top:4px}.workspace{min-width:0}.topbar{min-height:72px;background:var(--paper);border-bottom:1px solid var(--line);padding:14px 26px;display:flex;align-items:center;justify-content:space-between;gap:16px}.topbar h1{font-size:20px;margin:0;font-weight:700}.topbar p{margin:5px 0 0;color:var(--muted);font-size:12px}.top-meta{display:flex;align-items:center;flex-wrap:wrap;justify-content:flex-end;gap:12px;color:var(--muted);font-size:12px}.user-chip,.badge{display:inline-block;border-radius:999px;padding:4px 8px;background:var(--soft);color:var(--ink);font-size:12px}.content{padding:22px 26px 30px}.notice{display:flex;justify-content:space-between;gap:12px;align-items:center;background:var(--amber-soft);border-left:3px solid var(--amber);padding:11px 13px;margin-bottom:16px}.notice strong{font-weight:700}.metrics{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;margin-bottom:16px}.metric,.card{background:var(--paper);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow)}.metric{padding:15px}.metric label{display:block;color:var(--muted);font-size:12px}.metric strong{display:block;font-size:24px;margin:7px 0 3px}.metric small{color:var(--muted)}.layout{display:grid;grid-template-columns:minmax(300px,.9fr) minmax(480px,1.6fr);gap:16px}.card-head{padding:15px 17px;border-bottom:1px solid var(--line);display:flex;justify-content:space-between;align-items:center;gap:10px}.card-head h2{margin:0;font-size:16px}.muted{color:var(--muted);font-size:12px}.student-row{width:100%;border:0;border-bottom:1px solid var(--line);background:var(--paper);color:var(--ink);padding:13px 16px;text-align:left;display:grid;grid-template-columns:minmax(0,1fr) auto;gap:10px;cursor:pointer;font:inherit}.student-row:hover,.student-row.selected{background:#f0f8f4}.student-row:last-child{border-bottom:0}.student-row b{display:block;margin-bottom:4px}.student-row small{display:block;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tag{font-size:11px;align-self:center;padding:4px 7px;border-radius:5px;background:var(--green-soft);color:var(--green)}.tag.warn{background:var(--amber-soft);color:var(--amber)}.tag.risk{background:var(--red-soft);color:var(--red)}.profile{padding:17px}.profile-top{display:flex;justify-content:space-between;align-items:flex-start;gap:20px;padding-bottom:16px;border-bottom:1px solid var(--line)}.profile-name{font-size:20px;margin-bottom:5px}.profile-meta{font-size:12px;color:var(--muted)}.progress-wrap{min-width:190px}.progress-label{display:flex;justify-content:space-between;font-size:12px;margin-bottom:6px}.progress{height:8px;border-radius:999px;background:var(--soft);overflow:hidden}.progress span{display:block;height:100%;background:var(--green);border-radius:999px}.task-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:8px;padding:15px 0}.task{border:1px solid var(--line);border-radius:8px;padding:10px;font-size:12px}.task label{display:flex;gap:6px;align-items:center}.task small{display:block;color:var(--muted);margin:6px 0 0 22px}.section{border-top:1px solid var(--line);padding-top:14px;margin-top:14px}.section-title{display:flex;justify-content:space-between;align-items:center;margin-bottom:9px;font-weight:700}.record-grid{display:grid;grid-template-columns:1fr 1fr;gap:10px}.record{background:var(--soft);border-radius:7px;padding:11px}.record b{display:block;margin-bottom:4px}.record p{font-size:12px;color:var(--muted);line-height:1.5;margin:0}.solution{background:var(--green-soft);border-left:3px solid var(--green);padding:11px;margin-top:10px;font-size:12px;line-height:1.55}.actions{display:flex;gap:8px;flex-wrap:wrap;margin-top:15px}.btn{border:1px solid var(--line);border-radius:6px;background:var(--paper);color:var(--ink);padding:8px 10px;cursor:pointer;font:inherit;font-size:12px}.btn:hover{background:var(--soft)}.btn.primary{background:var(--green);border-color:var(--green);color:#fff}.btn.danger{color:var(--red);border-color:#efc9cb}.filter-bar{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-bottom:14px}.filter-bar input,.filter-bar select,.form-grid input,.form-grid select,.form-grid textarea{border:1px solid var(--line);border-radius:6px;padding:8px;background:var(--paper);font:inherit;color:var(--ink)}.filter-bar input{min-width:240px}.filter{border:1px solid var(--line);background:var(--paper);border-radius:999px;padding:6px 9px;cursor:pointer;font-size:12px}.filter.active{background:var(--green);border-color:var(--green);color:#fff}.table-wrap{overflow:auto}.data-table{width:100%;border-collapse:collapse;background:var(--paper)}.data-table th,.data-table td{border-bottom:1px solid var(--line);padding:12px 14px;text-align:left;vertical-align:middle;white-space:nowrap}.data-table th{font-size:12px;color:var(--muted);font-weight:500;background:#fbfcfc}.data-table td{font-size:13px}.data-table tr:last-child td{border-bottom:0}.link-btn{border:0;background:transparent;color:var(--green);padding:0;cursor:pointer;font:inherit}.tabs{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:15px}.tabs button{border:1px solid var(--line);background:var(--paper);color:var(--ink);padding:7px 10px;border-radius:6px;cursor:pointer;font:inherit;font-size:12px}.tabs button.active{background:var(--green);border-color:var(--green);color:#fff}.review-grid{display:grid;grid-template-columns:minmax(0,1.2fr) minmax(280px,.8fr);gap:16px}.teacher-row{display:grid;grid-template-columns:120px minmax(100px,1fr) 55px 60px;gap:10px;align-items:center;padding:13px 16px;border-bottom:1px solid var(--line)}.teacher-row:last-child{border-bottom:0}.teacher-row small{display:block;color:var(--muted);font-size:11px;margin-top:3px}.issue-row{display:grid;grid-template-columns:minmax(0,1fr) 45px;gap:10px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line)}.issue-row:last-child{border-bottom:0}.issue-row b{display:block}.issue-row small{color:var(--muted);font-size:11px}.issue-count{text-align:right;font-size:19px;font-weight:700}.inner{padding:15px 17px}.timeline{padding:3px 17px 14px}.timeline-item{border-left:2px solid var(--line);position:relative;padding:12px 0 12px 17px}.timeline-item:before{content:"";position:absolute;left:-5px;top:17px;width:8px;height:8px;background:var(--green);border-radius:50%}.timeline-item b{display:block;margin-bottom:4px}.timeline-item p{font-size:12px;color:var(--muted);margin:0;line-height:1.5}.pipeline{padding:17px}.pipe{display:grid;grid-template-columns:1fr auto;gap:7px;align-items:center;margin-bottom:16px}.pipe .progress{grid-column:1/3}.form-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:17px}.form-grid label{font-size:12px;color:var(--muted);display:grid;gap:5px}.form-grid label.full{grid-column:1/3}.form-grid textarea{min-height:86px;resize:vertical}.empty{padding:38px 16px;text-align:center;color:var(--muted)}.modal-backdrop{position:fixed;inset:0;background:rgba(15,31,27,.46);display:flex;align-items:center;justify-content:center;padding:16px;z-index:10;overflow-y:auto}.modal{background:var(--paper);width:min(620px,100%);border-radius:10px;box-shadow:0 16px 40px rgba(15,31,27,.25);display:flex;flex-direction:column;max-height:calc(100vh - 32px);overflow:hidden}.modal-head{padding:15px 17px;border-bottom:1px solid var(--line);display:flex;align-items:center;justify-content:space-between}.modal-head h2{font-size:17px;margin:0}.icon-btn{border:0;background:transparent;font-size:20px;cursor:pointer;color:var(--muted)}.modal-footer{padding:13px 17px;border-top:1px solid var(--line);display:flex;justify-content:flex-end;gap:8px}#toast{position:fixed;right:22px;bottom:22px;background:var(--ink);color:#fff;padding:10px 13px;border-radius:7px;opacity:0;transform:translateY(10px);transition:.2s;pointer-events:none;z-index:20}#toast.show{opacity:1;transform:translateY(0)}
@media(max-width:900px){.app-shell{grid-template-columns:1fr}.sidebar{display:none}.topbar{padding:14px 16px}.content{padding:16px}.layout,.review-grid{grid-template-columns:1fr}.metrics{grid-template-columns:1fr}.task-grid{grid-template-columns:1fr 1fr}.profile-top{display:block}.progress-wrap{margin-top:14px}.form-grid{grid-template-columns:1fr}.form-grid label.full{grid-column:auto}.filter-bar input{min-width:0;flex:1}.top-meta{display:none}}
.profile-layout{display:grid;grid-template-columns:minmax(0,1.25fr) minmax(280px,.75fr);gap:16px}.info-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:0;padding:3px 16px 14px}.info-item{padding:12px 10px;border-bottom:1px solid var(--line)}.info-item label{display:block;color:var(--muted);font-size:11px;margin-bottom:5px}.info-item b{font-weight:500}.archive-list{padding:3px 16px 14px}.archive-item{display:grid;grid-template-columns:112px minmax(0,1fr) auto;gap:10px;align-items:center;padding:12px 0;border-bottom:1px solid var(--line)}.archive-item:last-child{border-bottom:0}.archive-item small{color:var(--muted);font-size:11px}.archive-item b{display:block;font-weight:500;margin-bottom:3px}.event-type{font-size:11px;color:var(--green);background:var(--green-soft);padding:4px 6px;border-radius:4px}.event-type.plan{color:var(--amber);background:var(--amber-soft)}.event-type.form{color:var(--blue);background:#edf5ff}.info-summary{margin:14px 16px;padding:12px;background:var(--soft);border-radius:7px;font-size:12px;line-height:1.6}.info-summary b{display:block;margin-bottom:4px}.back-link{border:0;background:transparent;color:var(--green);cursor:pointer;padding:0;font:inherit;font-size:12px}@media(max-width:900px){.profile-layout{grid-template-columns:1fr}.info-grid{grid-template-columns:1fr 1fr}.archive-item{grid-template-columns:1fr auto}.archive-item small{grid-column:1/2}}@media(max-width:520px){.info-grid{grid-template-columns:1fr}.archive-item{grid-template-columns:1fr}.archive-item .event-type{justify-self:start}}

/* modal 内部滚动：head/footer 固定，中间表单区可滚 */
.modal form{display:flex;flex-direction:column;flex:1 1 auto;min-height:0;overflow:hidden}
.modal form > .form-grid{flex:1 1 auto;overflow:auto;min-height:0;padding-bottom:0}
.modal-head,.modal-footer{flex:0 0 auto}
