:root{
  --primary:#1677ff; --primary-dark:#0958d9; --primary-bg:#e6f4ff;
  --success:#52c41a; --success-bg:#f6ffed; --warning:#faad14; --warning-bg:#fffbe6;
  --error:#ff4d4f; --error-bg:#fff2f0; --idle:#bfbfbf;
  --text:#1f1f1f; --text-2:#595959; --text-3:#8c8c8c;
  --border:#e8e8e8; --bg:#f0f2f5; --card:#fff; --rail:#001529;
  --radius:8px; --shadow:0 1px 4px rgba(0,0,0,.06),0 4px 16px rgba(0,0,0,.04);
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:-apple-system,"PingFang SC","Microsoft YaHei",sans-serif;color:var(--text);background:var(--bg);font-size:14px;line-height:1.5}
.app{display:flex;flex-direction:column;height:100vh;overflow:hidden}

/* Top bar */
.topbar{height:56px;background:var(--rail);color:#fff;display:flex;align-items:center;padding:0 20px;gap:24px;flex-shrink:0;z-index:10}
.topbar .logo{display:flex;align-items:center;gap:10px;font-size:16px;font-weight:600}
.topbar .logo .dot{width:10px;height:10px;border-radius:3px;background:var(--primary)}
.topbar .modswitch{display:flex;gap:4px;margin-left:8px}
.topbar .modswitch button{background:transparent;border:none;color:rgba(255,255,255,.65);padding:8px 16px;border-radius:6px;cursor:pointer;font-size:14px;transition:.2s}
.topbar .modswitch button:hover{color:#fff;background:rgba(255,255,255,.08)}
.topbar .modswitch button.active{color:#fff;background:var(--primary)}
.topbar .spacer{flex:1}
.topbar .tag{font-size:12px;color:rgba(255,255,255,.5);border:1px solid rgba(255,255,255,.2);padding:3px 10px;border-radius:20px}
.topbar .clock{font-variant-numeric:tabular-nums;color:rgba(255,255,255,.8)}

/* Body layout */
.body{display:flex;flex:1;overflow:hidden}
.sidenav{width:220px;background:var(--card);border-right:1px solid var(--border);padding:12px 0;overflow-y:auto;flex-shrink:0}
.sidenav .group{padding:8px 20px 4px;font-size:12px;color:var(--text-3);letter-spacing:.5px}
.sidenav a{display:flex;align-items:center;gap:10px;padding:11px 20px;color:var(--text-2);cursor:pointer;border-left:3px solid transparent;font-size:14px}
.sidenav a:hover{background:var(--primary-bg)}
.sidenav a.active{background:var(--primary-bg);color:var(--primary);border-left-color:var(--primary);font-weight:500}
.sidenav a .ic{width:18px;text-align:center;opacity:.8}

.main{flex:1;overflow-y:auto;padding:20px 24px}
.view{display:none;animation:fade .25s}
.view.active{display:block}
@keyframes fade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}

/* Page header */
.page-head{margin-bottom:16px}
.page-head h1{font-size:20px;font-weight:600}
.page-head .crumb{font-size:13px;color:var(--text-3);margin-bottom:6px}
.page-head .desc{color:var(--text-2);margin-top:4px;font-size:13px}
.page-head .tagline{display:inline-block;margin-top:8px;font-size:12px;color:var(--primary);background:var(--primary-bg);padding:3px 10px;border-radius:4px}

/* Cards */
.card{background:var(--card);border-radius:var(--radius);box-shadow:var(--shadow);padding:18px 20px;margin-bottom:16px}
.card>h2{font-size:15px;font-weight:600;margin-bottom:14px;display:flex;align-items:center;gap:8px}
.card>h2 .sub{font-size:12px;color:var(--text-3);font-weight:400}
.grid{display:grid;gap:16px}
.row{display:flex;gap:16px;flex-wrap:wrap}

/* Buttons */
.btn{display:inline-flex;align-items:center;gap:6px;padding:7px 16px;border-radius:6px;border:1px solid var(--border);background:#fff;color:var(--text);cursor:pointer;font-size:14px;transition:.2s}
.btn:hover{border-color:var(--primary);color:var(--primary)}
.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}
.btn.primary:hover{background:var(--primary-dark)}
.btn.lg{padding:10px 22px;font-size:15px}
.btn.sm{padding:4px 10px;font-size:12px}
.btn:disabled{opacity:.4;cursor:not-allowed}

/* Entry cards (4.5 home) */
.entry-row{display:grid;grid-template-columns:1fr 1fr;gap:20px}
.entry{position:relative;border-radius:14px;padding:28px;color:#fff;cursor:pointer;overflow:hidden;min-height:150px;transition:.25s}
.entry:hover{transform:translateY(-3px);box-shadow:0 10px 30px rgba(0,0,0,.15)}
.entry.train{background:linear-gradient(135deg,#1677ff,#0958d9)}
.entry.classroom{background:linear-gradient(135deg,#13c2c2,#08979c)}
.entry h3{font-size:22px;margin-bottom:8px}
.entry .en{font-size:12px;opacity:.7;letter-spacing:1px;text-transform:uppercase}
.entry .stat{display:flex;gap:24px;margin-top:18px}
.entry .stat div span{display:block;font-size:12px;opacity:.8}
.entry .stat div strong{font-size:26px;font-weight:600}
.entry .ico{position:absolute;right:18px;bottom:10px;font-size:64px;opacity:.18}

/* Tree */
.tree{font-size:14px}
.tree .node{padding:6px 0}
.tree .label{display:inline-flex;align-items:center;gap:8px;padding:5px 10px;border-radius:6px;cursor:pointer}
.tree .label:hover{background:var(--primary-bg)}
.tree .label.on{background:var(--primary-bg);color:var(--primary);font-weight:500}
.tree .children{margin-left:20px;border-left:1px dashed var(--border);padding-left:10px}
.tree .cnt{font-size:11px;color:var(--text-3);background:#f5f5f5;padding:1px 7px;border-radius:10px}
.lvl-badge{font-size:11px;padding:1px 6px;border-radius:3px;background:var(--primary-bg);color:var(--primary)}

/* Device grid (4.5) */
.room-head{display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:10px;margin-bottom:14px}
.legend{display:flex;gap:16px;font-size:12px;color:var(--text-2)}
.legend i{display:inline-block;width:10px;height:10px;border-radius:50%;margin-right:5px;vertical-align:middle}
.dev-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px}
.dev{border:1px solid var(--border);border-radius:10px;padding:14px;cursor:pointer;position:relative;transition:.2s;background:#fff}
.dev:hover{border-color:var(--primary);box-shadow:var(--shadow)}
.dev .led{position:absolute;top:12px;right:12px;width:11px;height:11px;border-radius:50%;box-shadow:0 0 0 3px rgba(0,0,0,.04)}
.dev.using .led{background:var(--success);animation:pulse 1.6s infinite}
.dev.idle .led{background:var(--idle)}
.dev.fault .led{background:var(--error)}
.dev.reserved .led{background:var(--warning)}
@keyframes pulse{0%,100%{box-shadow:0 0 0 0 rgba(82,196,26,.5)}50%{box-shadow:0 0 0 6px rgba(82,196,26,0)}}
.dev .nm{font-weight:600;margin-bottom:4px}
.dev .meta{font-size:12px;color:var(--text-3);line-height:1.7}
.dev .st{font-size:12px;margin-top:6px;display:inline-block;padding:1px 8px;border-radius:4px}
.dev.using .st{background:var(--success-bg);color:var(--success)}
.dev.idle .st{background:#f5f5f5;color:var(--text-3)}
.dev.fault .st{background:var(--error-bg);color:var(--error)}
.dev.reserved .st{background:var(--warning-bg);color:#d48806}

/* video */
.video-wrap{display:grid;grid-template-columns:2fr 1fr;gap:14px}
.video-main{background:#000;border-radius:10px;aspect-ratio:16/9;display:flex;align-items:center;justify-content:center;color:#666;position:relative;overflow:hidden}
.video-main .live{position:absolute;top:10px;left:10px;background:var(--error);color:#fff;font-size:11px;padding:2px 8px;border-radius:3px}
.video-main .cap{position:absolute;bottom:10px;left:10px;color:#fff;font-size:13px;text-shadow:0 1px 2px #000}
.cam-list{display:flex;flex-direction:column;gap:8px}
.cam{background:#1a1a1a;border-radius:8px;aspect-ratio:16/9;display:flex;align-items:center;justify-content:center;color:#888;font-size:12px;cursor:pointer;border:2px solid transparent;position:relative}
.cam.on{border-color:var(--primary)}
.cam:hover{border-color:rgba(22,119,255,.5)}

/* detail drawer */
.drawer-mask{position:fixed;inset:0;background:rgba(0,0,0,.45);display:none;z-index:50}
.drawer-mask.open{display:block}
.drawer{position:fixed;top:0;right:0;width:440px;max-width:92vw;height:100vh;background:#fff;box-shadow:-4px 0 24px rgba(0,0,0,.12);transform:translateX(100%);transition:.3s;z-index:51;display:flex;flex-direction:column}
.drawer.open{transform:none}
.drawer .dh{padding:16px 20px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}
.drawer .dh h3{font-size:16px}
.drawer .dh .x{cursor:pointer;color:var(--text-3);font-size:20px}
.drawer .dc{padding:18px 20px;overflow-y:auto;flex:1}
.kv{display:flex;justify-content:space-between;padding:9px 0;border-bottom:1px dashed var(--border);font-size:13px}
.kv span{color:var(--text-3)}
.kv b{font-weight:500}

/* classroom monitor */
.cls-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(190px,1fr));gap:14px}
.cls{border:1px solid var(--border);border-radius:10px;padding:15px;position:relative}
.cls.active{border-color:var(--success);background:var(--success-bg)}
.cls.empty{opacity:.7}
.cls .nm{font-weight:600}
.cls .who{font-size:13px;color:var(--text-2);margin-top:8px;line-height:1.7}
.cls .live-badge{position:absolute;top:12px;right:12px;font-size:11px;padding:2px 8px;border-radius:10px}
.cls.active .live-badge{background:var(--success);color:#fff}
.cls.empty .live-badge{background:#f5f5f5;color:var(--text-3)}

/* Scheduling (4.8) */
.mode-tabs{display:flex;gap:8px;margin-bottom:16px;flex-wrap:wrap}
.mode-tab{padding:9px 18px;border-radius:8px;border:1px solid var(--border);background:#fff;cursor:pointer;transition:.2s}
.mode-tab .t{font-weight:600}
.mode-tab .d{font-size:12px;color:var(--text-3)}
.mode-tab.active{border-color:var(--primary);background:var(--primary-bg)}
.mode-tab.active .t{color:var(--primary)}

.field{margin-bottom:14px}
.field label{display:block;font-size:13px;color:var(--text-2);margin-bottom:6px}
.field label .req{color:var(--error)}
.input,select.input{width:100%;padding:8px 11px;border:1px solid var(--border);border-radius:6px;font-size:14px;background:#fff}
.input:focus{outline:none;border-color:var(--primary)}
.seg{display:inline-flex;border:1px solid var(--border);border-radius:6px;overflow:hidden}
.seg button{padding:7px 16px;border:none;background:#fff;cursor:pointer;font-size:13px;border-right:1px solid var(--border)}
.seg button:last-child{border-right:none}
.seg button.on{background:var(--primary);color:#fff}

.chips{display:flex;flex-wrap:wrap;gap:8px}
.chip{display:inline-flex;align-items:center;gap:6px;padding:5px 11px;border:1px solid var(--border);border-radius:16px;font-size:13px;cursor:pointer;background:#fff}
.chip:hover{border-color:var(--primary)}
.chip.on{background:var(--primary-bg);border-color:var(--primary);color:var(--primary)}
.chip .rm{opacity:.5}

.picked-list .pk{display:flex;align-items:center;gap:10px;padding:9px 12px;border:1px solid var(--border);border-radius:8px;margin-bottom:8px;background:#fafafa}
.picked-list .pk .tag{font-size:11px;background:var(--primary-bg);color:var(--primary);padding:1px 7px;border-radius:4px}
.picked-list .pk .nm{font-weight:500}
.picked-list .pk .du{margin-left:auto;font-size:13px;color:var(--text-3)}

/* Timetable */
.filters{display:flex;gap:10px;flex-wrap:wrap;margin-bottom:14px;align-items:center}
.filters select{min-width:130px}
.tt-wrap{overflow-x:auto}
.tt{border-collapse:collapse;width:100%;min-width:760px;table-layout:fixed}
.tt th,.tt td{border:1px solid var(--border);padding:0;vertical-align:top}
.tt th{background:#fafafa;padding:9px;font-size:13px;font-weight:600}
.tt .time-col{width:90px;background:#fafafa;text-align:center;font-size:12px;color:var(--text-2);padding:9px 6px}
.tt td.cell{height:78px;padding:5px;position:relative}
.tt .slot{font-size:12px;border-radius:5px;padding:4px 6px;margin-bottom:4px;cursor:grab;line-height:1.4}
.tt .slot.dev{background:var(--primary-bg);border-left:3px solid var(--primary);color:var(--primary-dark)}
.tt .slot.room{background:var(--success-bg);border-left:3px solid var(--success);color:#389e0d}
.tt .slot.conflict{background:var(--error-bg);border-left:3px solid var(--error);color:var(--error)}
.tt .slot .nm{font-weight:600}
.tt .slot .sub{opacity:.8;font-size:11px}
.tt .slot.dragging{opacity:.4}
.tt td.drop-ok{background:var(--primary-bg);outline:2px dashed var(--primary);outline-offset:-3px}

/* result toast */
.toast{position:fixed;top:70px;left:50%;transform:translateX(-50%) translateY(-20px);background:#fff;box-shadow:var(--shadow);border-radius:8px;padding:12px 20px;display:flex;align-items:center;gap:10px;opacity:0;transition:.3s;z-index:80;border-left:4px solid var(--success)}
.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

/* booking grid (个人预约) */
.book-day{display:grid;grid-template-columns:repeat(16,1fr);gap:3px;margin-top:6px}
.book-cell{height:34px;border-radius:4px;background:var(--success-bg);cursor:pointer;border:1px solid transparent;position:relative}
.book-cell.busy{background:var(--error-bg);cursor:not-allowed}
.book-cell.sel{background:var(--primary);border-color:var(--primary-dark)}
.book-cell:not(.busy):hover{border-color:var(--primary)}
.book-axis{display:grid;grid-template-columns:repeat(16,1fr);gap:3px;font-size:10px;color:var(--text-3);margin-top:4px;text-align:center}

.note{background:var(--warning-bg);border:1px solid #ffe58f;border-radius:8px;padding:10px 14px;font-size:13px;color:#874d00;margin-bottom:14px}
.note b{color:#613400}
.flow{display:flex;align-items:center;gap:8px;flex-wrap:wrap;font-size:13px;margin:10px 0}
.flow .step{background:var(--primary-bg);color:var(--primary);padding:5px 12px;border-radius:6px}
.flow .arr{color:var(--text-3)}
.people-pick{display:flex;flex-wrap:wrap;gap:8px;margin-top:8px}
.pp{padding:6px 12px;border:1px solid var(--border);border-radius:20px;cursor:pointer;font-size:13px}
.pp.on{background:var(--primary);color:#fff;border-color:var(--primary)}
.muted{color:var(--text-3);font-size:12px}
.hint{font-size:12px;color:var(--text-3);margin-top:6px}
.empty-state{text-align:center;color:var(--text-3);padding:40px}

/* ===== 补充组件 ===== */
/* 流程步骤条 */
.steps{display:flex;gap:6px;margin-bottom:14px;flex-wrap:wrap}
.steps .stp{display:flex;align-items:center;gap:8px;padding:8px 14px;border-radius:8px;background:#fff;border:1px solid var(--border);font-size:13px}
.steps .stp .n{width:20px;height:20px;border-radius:50%;background:var(--idle);color:#fff;display:flex;align-items:center;justify-content:center;font-size:12px}
.steps .stp.done{border-color:var(--success);background:var(--success-bg)}
.steps .stp.done .n{background:var(--success)}
.steps .stp.cur{border-color:var(--primary);background:var(--primary-bg)}
.steps .stp.cur .n{background:var(--primary)}

/* Modal */
.modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.45);display:none;z-index:60;align-items:center;justify-content:center}
.modal-mask.open{display:flex}
.modal{background:#fff;border-radius:12px;width:560px;max-width:92vw;max-height:86vh;display:flex;flex-direction:column;box-shadow:0 12px 48px rgba(0,0,0,.2)}
.modal .mh{padding:16px 20px;border-bottom:1px solid var(--border);display:flex;justify-content:space-between;align-items:center}
.modal .mh h3{font-size:16px}
.modal .mh .x{cursor:pointer;color:var(--text-3);font-size:20px}
.modal .mc{padding:18px 20px;overflow-y:auto}

/* 点名网格 */
.checkin-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(92px,1fr));gap:8px;margin:10px 0}
.ck{padding:8px 6px;border:1px solid var(--border);border-radius:8px;text-align:center;cursor:pointer;font-size:13px;transition:.15s}
.ck:hover{border-color:var(--primary)}
.ck.on{background:var(--success-bg);border-color:var(--success);color:#389e0d}
.ck.on::after{content:" ✓";color:var(--success)}

/* 老师选择表 */
.tch-table{width:100%;border-collapse:collapse;font-size:13px}
.tch-table th,.tch-table td{border-bottom:1px solid var(--border);padding:9px 8px;text-align:left}
.tch-table th{color:var(--text-3);font-weight:500;cursor:pointer;user-select:none}
.tch-table tr:hover{background:var(--primary-bg)}
.tch-table .low{background:#fffbe6}
.grade{font-size:11px;padding:1px 7px;border-radius:10px}
.grade.g3{background:var(--success-bg);color:#389e0d}
.grade.g2{background:#e6f4ff;color:var(--primary)}
.grade.g1{background:var(--warning-bg);color:#d48806}
.grade.g0{background:var(--error-bg);color:var(--error)}
.pick-t{cursor:pointer}

/* 层级筛选 step-pick */
.step-pick{margin-bottom:14px}
.step-pick .sp-label{font-size:13px;color:var(--text-2);margin-bottom:7px}
.step-pick .sp-opts{display:flex;flex-wrap:wrap;gap:8px}
.sp-opt{padding:6px 14px;border:1px solid var(--border);border-radius:7px;cursor:pointer;font-size:13px;background:#fff}
.sp-opt:hover{border-color:var(--primary)}
.sp-opt.on{background:var(--primary);color:#fff;border-color:var(--primary)}
.sp-opt.busy{background:var(--error-bg);border-color:#ffccc7;color:var(--error);cursor:not-allowed;text-decoration:line-through}
.sp-opt.disabled{opacity:.4;cursor:not-allowed}

/* KPI + bars */
.kpi-row{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:14px;margin-bottom:16px}
.kpi{background:var(--card);border-radius:10px;box-shadow:var(--shadow);padding:16px}
.kpi .v{font-size:26px;font-weight:700}
.kpi .l{font-size:12px;color:var(--text-3);margin-top:2px}
.kpi .v.up{color:var(--success)} .kpi .v.warn{color:var(--warning)}
.bar{display:flex;align-items:center;gap:10px;margin:9px 0;font-size:13px}
.bar .bn{width:88px;flex-shrink:0;color:var(--text-2)}
.bar .bt{flex:1;height:18px;background:#f0f2f5;border-radius:4px;overflow:hidden}
.bar .bf{height:100%;background:linear-gradient(90deg,var(--primary),#69b1ff);border-radius:4px}
.bar .bf.hot{background:linear-gradient(90deg,#fa8c16,#ffc069)}
.bar .bv{width:52px;text-align:right;color:var(--text-3);font-variant-numeric:tabular-nums}

/* ring */
.ring{width:120px;height:120px;border-radius:50%;margin:10px auto;display:flex;align-items:center;justify-content:center;font-size:22px;font-weight:700;color:var(--primary)}

/* 设备隶属树 in drawer */
.dev-tree{font-size:13px;line-height:2}
.dev-tree .lv1{font-weight:600}
.dev-tree .lv2{margin-left:16px;color:var(--text-2)}
.dev-tree .lv3{margin-left:32px;color:var(--text-3)}
.dev-tree .hit{background:var(--primary-bg);color:var(--primary);border-radius:4px;padding:0 6px}
.week-item{display:flex;align-items:center;gap:10px;padding:10px 12px;border:1px solid var(--border);border-radius:8px;margin-bottom:8px}
.week-item .wt{flex:1}
.week-item .wp{font-size:12px;color:var(--text-3)}
.dev.hl{outline:3px solid var(--primary);outline-offset:1px}
.dev.dim{opacity:.35}

/* 权限徽标 */
.perm-badge{font-size:11px;background:var(--warning-bg);color:#d48806;border:1px solid #ffe58f;border-radius:10px;padding:1px 8px;margin-left:4px}
/* 座位级 */
.seat-room{display:grid;grid-template-columns:repeat(8,1fr);gap:8px;max-width:520px}
.seat{aspect-ratio:1;border-radius:6px;background:#f5f5f5;border:1px solid var(--border);display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--text-3);position:relative;cursor:default}
.seat.occ{background:var(--success-bg);border-color:var(--success);color:#389e0d}
.seat.pc{background:var(--primary-bg);border-color:var(--primary);color:var(--primary)}
.seat .pcdot{position:absolute;top:2px;right:3px;font-size:9px}
/* 进度条 */
.prog{margin:12px 0}
.prog .ph{display:flex;justify-content:space-between;font-size:13px;margin-bottom:5px}
.prog .ph .pt{font-weight:500}
.prog .ph .pt .ty{font-size:11px;padding:1px 7px;border-radius:10px;margin-left:6px}
.prog .ph .pt .ty.plan{background:var(--primary-bg);color:var(--primary)}
.prog .ph .pt .ty.daily{background:var(--success-bg);color:#389e0d}
.prog .pbar{height:14px;background:#f0f2f5;border-radius:7px;overflow:hidden}
.prog .pf{height:100%;border-radius:7px}
.prog .pf.plan{background:var(--primary)} .prog .pf.daily{background:var(--success)}

/* 师资抢单 */
.grab-card{display:flex;align-items:center;gap:14px;padding:14px 16px;border:1px solid var(--border);border-radius:10px;margin-bottom:10px}
.grab-card.taken{background:#fafafa;opacity:.85}
.grab-card .gc-main{flex:1}
.grab-card .gc-course{font-weight:600;margin-bottom:3px}
.grab-card .gc-meta{font-size:12px;color:var(--text-3)}
.grab-card .gc-done{font-size:13px;color:var(--success);font-weight:500}
/* 整天汇总 */
.sum-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px}
.sum-card{border:1px solid var(--border);border-radius:10px;padding:14px}
.sum-card .sum-h{display:flex;gap:8px;align-items:center;margin-bottom:8px}
.sum-card .sum-h .ty{font-size:11px;padding:1px 8px;border-radius:10px}
.sum-card .sum-h .ty.plan{background:var(--primary-bg);color:var(--primary)}
.sum-card .sum-h .ty.daily{background:var(--success-bg);color:#389e0d}
.sum-card .sum-h .xz{font-size:11px;color:var(--text-3);border:1px solid var(--border);border-radius:4px;padding:1px 7px}
.sum-card .sum-ban{font-weight:600;font-size:14px;margin-bottom:10px;line-height:1.4}
.sum-card .sum-row{display:flex;gap:8px;font-size:12px;color:var(--text-2);margin:5px 0;align-items:center}
.sum-card .sum-row b{color:var(--text)}
.sum-card .sum-prog{font-size:12px;color:var(--text-3);margin:6px 0}
.sum-card .sum-prog .pbar{height:8px;background:#f0f2f5;border-radius:5px;overflow:hidden;margin-top:3px}
.sum-card .sum-prog .pf{height:100%;border-radius:5px}
.off-tag{font-size:10px;background:#f9f0ff;color:#722ed1;border:1px solid #d3adf7;border-radius:4px;padding:0 5px;margin-left:4px}

/* 计划层逐日扫描 */
.dayscan{display:flex;gap:6px;margin-top:6px}
.dayscan .ds{flex:1;text-align:center;padding:8px 4px;border-radius:6px;font-size:12px;line-height:1.3}
.dayscan .ds.ok{background:var(--success-bg);color:#389e0d;border:1px solid #b7eb8f}
.dayscan .ds.full{background:var(--error-bg);color:var(--error);border:1px solid #ffccc7;font-weight:600}

/* 培训计划管理 */
.plan-chain{display:flex;align-items:center;gap:4px;flex-wrap:wrap}
.plan-chain .chain-node{padding:7px 14px;border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:13px;background:#fff;position:relative}
.plan-chain .chain-node:hover{border-color:var(--primary)}
.plan-chain .chain-node.on{background:var(--primary);color:#fff;border-color:var(--primary);font-weight:600}
.plan-chain .chain-node.ph{border-style:dashed;color:var(--text-3)}
.plan-chain .chain-node i{font-size:10px;font-style:normal;opacity:.7;margin-left:4px}
.plan-chain .chain-arr{color:var(--text-3);font-size:11px}
.plan-table{width:100%;border-collapse:collapse;font-size:13px;min-width:900px}
.plan-table th,.plan-table td{border-bottom:1px solid var(--border);padding:9px 8px;text-align:left;vertical-align:top}
.plan-table th{background:#fafafa;color:var(--text-3);font-weight:500;white-space:nowrap}
.plan-table tr:hover td{background:var(--primary-bg)}
.plan-st{font-size:11px;padding:2px 9px;border-radius:10px;white-space:nowrap}
.link-a{color:var(--primary);cursor:pointer;font-size:12px}
.link-a:hover{text-decoration:underline}

/* 金字塔 */
.pyramid{display:flex;flex-direction:column;gap:8px}
.pyr-row{display:flex}
.pyr-bar{padding:11px 18px;border-radius:8px;background:#e6f0ff;border:1px solid #bcd6ff;cursor:pointer;transition:.2s;min-width:280px;max-width:100%}
.pyr-bar:hover{border-color:var(--primary)}
.pyr-bar.on{background:var(--primary);border-color:var(--primary)}
.pyr-bar.on .pyr-lv,.pyr-bar.on .pyr-desc,.pyr-bar.on .pyr-desc b{color:#fff}
.pyr-bar.ph{background:#fafafa;border-style:dashed}
.pyr-lv{font-weight:600;font-size:14px;color:var(--primary-dark);margin-bottom:3px}
.pyr-lv i{font-size:10px;font-style:normal;font-weight:400;opacity:.7}
.pyr-desc{font-size:12px;color:var(--text-2);line-height:1.5}
.pyr-desc b{color:var(--text)}
/* 下达拆解链 */
.relay{display:flex;flex-direction:column;align-items:stretch;gap:0}
.relay-card{border:1px solid var(--border);border-left-width:5px;border-radius:8px;padding:14px 16px;background:#fff;transition:.2s}
.relay-card.cur{box-shadow:0 0 0 2px var(--primary-bg);background:#fcfdff}
.rc-head{display:flex;align-items:center;gap:10px;margin-bottom:6px}
.rc-lv{font-size:11px;color:#fff;padding:2px 10px;border-radius:10px;font-weight:600}
.rc-who{font-size:12px;color:var(--text-3)}
.rc-plan{font-weight:600;font-size:15px;margin-bottom:3px}
.rc-meta{font-size:12px;color:var(--text-3);margin-bottom:7px}
.rc-detail{font-size:13px;color:var(--text-2);line-height:1.6}
.rc-items{margin:8px 0 0;padding-left:18px;font-size:12.5px;color:var(--text-2);line-height:1.9}
.relay-arr{text-align:center;color:var(--primary);font-size:13px;padding:7px 0;font-weight:500}
.relay-arr span{color:var(--text-3);font-size:12px;font-weight:400}

/* 两大类对比 */
.cat2{display:grid;grid-template-columns:1fr 1fr;gap:14px}
.cat2-card{border:1px solid var(--border);border-radius:10px;padding:14px 16px;border-top:4px solid}
.cat2-card.zx{border-top-color:var(--primary)}
.cat2-card.rc{border-top-color:var(--success)}
.cat2-card .c2-h{font-weight:600;font-size:15px;margin-bottom:8px}
.cat2-card.zx .c2-h{color:var(--primary)}
.cat2-card.rc .c2-h{color:#389e0d}
.cat2-card .c2-b{font-size:13px;color:var(--text-2);line-height:1.8}
/* 类型筛选 tab + 角标 */
.cat-tabs{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.cat-tab{padding:6px 14px;border:1px solid var(--border);border-radius:16px;cursor:pointer;font-size:13px}
.cat-tab:hover{border-color:var(--primary)}
.cat-tab.on{background:var(--primary);color:#fff;border-color:var(--primary)}
.cat-badge{font-size:10px;padding:1px 7px;border-radius:4px}
.cat-badge.zx{background:var(--primary-bg);color:var(--primary)}
.cat-badge.rc{background:var(--success-bg);color:#389e0d}
.form-tag{font-size:12px;padding:6px 12px;border-radius:6px;margin-bottom:12px}
.form-tag.zx{background:var(--primary-bg);color:var(--primary-dark)}
.form-tag.rc{background:var(--success-bg);color:#389e0d}

/* 视图范围切换 */
.scope-tabs{display:flex;gap:8px}
.scope-tab{padding:7px 16px;border:1px solid var(--border);border-radius:8px;cursor:pointer;font-size:13px;background:#fff}
.scope-tab:hover{border-color:var(--primary)}
.scope-tab.on{background:var(--primary-bg);border-color:var(--primary);color:var(--primary);font-weight:600}
.lv-badge{font-size:11px;color:#fff;padding:2px 8px;border-radius:10px;white-space:nowrap}
/* 字段对照表 */
.field-cmp{width:100%;border-collapse:collapse;font-size:12.5px;min-width:680px}
.field-cmp th,.field-cmp td{border:1px solid var(--border);padding:8px 10px;text-align:left;vertical-align:top}
.field-cmp th{background:#fafafa;font-weight:600}
.field-cmp .fc-k{background:#fafafa;font-weight:600;white-space:nowrap}
.field-cmp .fc-y{background:var(--success-bg);color:#389e0d}
.field-cmp .fc-h{background:var(--warning-bg);color:#874d00}
.field-cmp .fc-n{background:#fafafa;color:var(--text-3)}

/* 计划→排课 上下文 */
.plan-ctx{display:flex;align-items:center;gap:10px;flex-wrap:wrap;background:var(--primary-bg);border:1px solid #91caff;border-radius:8px;padding:11px 16px;margin-bottom:14px;font-size:14px}
.plan-ctx.none{background:var(--warning-bg);border-color:#ffe58f;color:#874d00}
.plan-ctx .pc-tag{font-size:11px;background:var(--primary);color:#fff;padding:2px 9px;border-radius:10px}
.plan-ctx .pc-tag.warn{background:var(--warning)}
.plan-ctx .pc-meta{font-size:12px;color:var(--text-3)}
.src-plan{border:1px solid var(--border);border-radius:8px;padding:12px 14px;background:#fafdff}
.src-plan .sp-row{display:flex;gap:10px;font-size:13px;padding:4px 0}
.src-plan .sp-row span:first-child{color:var(--text-3);width:70px;flex-shrink:0}

/* 计划字段折叠 */
.plan-fields{margin:8px 0;border:1px dashed var(--border);border-radius:8px;padding:0 12px}
.plan-fields summary{cursor:pointer;color:var(--text-3);font-size:12px;padding:10px 0}
.plan-fields[open]{padding-bottom:8px}
