/* ==========================================================================
   数智化综合实训平台 · B/S 版设计系统
   视觉风格与离线原版（原代码/src/styles.css）保持一致：
   扁平化亮色 · 数智化科技感 · 蓝青渐变主色 · 白底侧栏 · 点阵底纹
   全部为原生 CSS，零外部依赖（信创离线环境可直接运行）
   ========================================================================== */

/* ==========================================================================
   一、设计令牌（Design Tokens）
   ========================================================================== */
:root{
  /* —— 原版调色板 —— */
  --bg:#f4f7fc;
  --bg2:#eef3fa;
  --panel:#ffffff;
  --panel2:#fafcff;
  --line:#e2e9f4;
  --line2:#eef3fa;
  --t1:#0e1b33;
  --t2:#4b5d7c;
  --t3:#8b9ab3;
  --t4:#aebbd0;

  --c-primary:#2563eb;
  --c-primary-d:#1d4ed8;
  --c-cyan:#06b6d4;
  --c-mint:#10b981;
  --c-amber:#f59e0b;
  --c-rose:#f43f5e;
  --c-violet:#7c3aed;
  --c-indigo:#4f46e5;

  --grad:linear-gradient(135deg,#1d4ed8 0%,#2563eb 45%,#06b6d4 100%);
  --grad-soft:linear-gradient(135deg,#eff5ff 0%,#eefaff 100%);
  --grad-mint:linear-gradient(135deg,#0ea371,#10b981);
  --grad-amber:linear-gradient(135deg,#e08c07,#f59e0b);
  --grad-rose:linear-gradient(135deg,#e11d48,#f43f5e);
  --grad-violet:linear-gradient(135deg,#6d28d9,#8b5cf6);

  --sh1:0 1px 2px rgba(16,32,64,.05), 0 1px 3px rgba(16,32,64,.04);
  --sh2:0 4px 14px rgba(16,32,64,.07), 0 1px 3px rgba(16,32,64,.04);
  --sh3:0 14px 40px rgba(16,32,64,.13), 0 3px 10px rgba(16,32,64,.06);

  --r:10px;
  --r2:14px;
  --sb-w:248px;
  --top-h:58px;

  --font:-apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei","Hiragino Sans GB","Source Han Sans SC",sans-serif;
  --mono:ui-monospace,SFMono-Regular,Consolas,"Liberation Mono",Menlo,monospace;

  /* —— 兼容别名 ——
     views/*.js 与少量内联样式仍引用下列旧变量名；
     保留别名可避免「变量未定义 → 整条声明静默作废」。 */
  --brand:var(--c-primary-d);
  --brand-2:#2a63a8;
  --primary:var(--c-primary);
  --primary-600:var(--c-primary-d);
  --primary-50:#eff5ff;
  --cyan:var(--c-cyan);
  --teal:#0d9488;
  --green:var(--c-mint);
  --green-bg:#e9fbf3;
  --amber:#b8730a;
  --amber-bg:#fff7e8;
  --red:var(--c-rose);
  --red-bg:#fff0f3;
  --purple:var(--c-violet);
  --purple-bg:#f4efff;
  --text:var(--t1);
  --text-2:var(--t2);
  --muted:var(--t3);
  --panel-2:var(--panel2);
  --line-2:var(--line2);
  --radius:var(--r);
  --radius-lg:var(--r2);
  --shadow-1:var(--sh1);
  --shadow-2:var(--sh2);
  --shadow-3:var(--sh3);
  --sidebar-w:var(--sb-w);
  --topbar-h:var(--top-h);
}

/* ==========================================================================
   二、基础重置
   ========================================================================== */
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{
  font:13.5px/1.62 var(--font);
  color:var(--t1);background:var(--bg);
  -webkit-font-smoothing:antialiased;
}
svg{flex:none}
a{color:var(--c-primary);text-decoration:none}
a:hover{text-decoration:underline}
h1,h2,h3,h4{font-weight:600}
button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit;outline:none}
::-webkit-scrollbar{width:9px;height:9px}
::-webkit-scrollbar-thumb{background:#c9d6e8;border-radius:6px;border:2px solid transparent;background-clip:padding-box}
::-webkit-scrollbar-thumb:hover{background:#adbfd8;background-clip:padding-box}
::-webkit-scrollbar-track{background:transparent}

/* ==========================================================================
   三、启动遮罩（原版亮色基调）
   ========================================================================== */
.boot{
  position:fixed;inset:0;z-index:9999;
  display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
  background:
    radial-gradient(1100px 620px at 12% 6%, #e6f0ff 0%, rgba(230,240,255,0) 62%),
    radial-gradient(900px 560px at 92% 96%, #e2fbfb 0%, rgba(226,251,251,0) 60%),
    linear-gradient(160deg,#f7fafe 0%,#eef4fc 100%);
  transition:opacity .35s ease;
}
.boot::before{
  content:"";position:absolute;inset:0;
  background-image:radial-gradient(#cfdcee 1px, transparent 1px);
  background-size:26px 26px;opacity:.5;
}
.boot.out{opacity:0;pointer-events:none}
.boot-logo,.boot-name,.boot-sub,.boot-bar{position:relative;z-index:2}
.boot-logo{display:flex;align-items:center;justify-content:center}
.boot-logo img{width:76px;height:76px;object-fit:contain;filter:drop-shadow(0 6px 18px rgba(29,78,216,.22))}
.boot-name{font-size:20px;font-weight:600;letter-spacing:1.4px;color:var(--t1);margin-top:12px}
.boot-sub{font-size:12.5px;color:#2c5686;letter-spacing:.6px}
.boot-bar{width:186px;height:3px;border-radius:3px;background:#dbe7f8;overflow:hidden;margin-top:16px}
.boot-bar i{display:block;height:100%;width:38%;border-radius:3px;background:var(--grad);animation:bootrun 1.1s ease-in-out infinite}
@keyframes bootrun{0%{transform:translateX(-100%)}100%{transform:translateX(360%)}}

/* ==========================================================================
   四、登录页（原版：左插画 + 右表单 的分栏卡片）
   ========================================================================== */
.login-page{
  position:fixed;inset:0;z-index:60;display:flex;align-items:center;justify-content:center;
  background:
    radial-gradient(1100px 620px at 12% 6%, #e6f0ff 0%, rgba(230,240,255,0) 62%),
    radial-gradient(900px 560px at 92% 96%, #e2fbfb 0%, rgba(226,251,251,0) 60%),
    linear-gradient(160deg,#f7fafe 0%,#eef4fc 100%);
  overflow:auto;padding:24px 18px;
}
.login-page::before{
  content:"";position:absolute;inset:0;
  background-image:radial-gradient(#cfdcee 1px, transparent 1px);
  background-size:26px 26px;opacity:.5;
  -webkit-mask-image:radial-gradient(closest-side at 50% 50%, #000 40%, transparent 100%);
  mask-image:radial-gradient(closest-side at 50% 50%, #000 40%, transparent 100%);
}
.login-card{
  position:relative;width:1000px;max-width:100%;min-height:592px;margin:auto;
  display:grid;grid-template-columns:1.06fr .94fr;
  background:var(--panel);border-radius:20px;overflow:hidden;
  box-shadow:0 30px 80px rgba(16,32,64,.16), 0 4px 16px rgba(16,32,64,.06);
  border:1px solid #e8eef8;
}
.login-art{position:relative;overflow:hidden;background:linear-gradient(150deg,#f2f7ff,#eefaff)}
.login-art img.art{width:100%;height:100%;object-fit:cover;object-position:56% 46%;display:block}
.login-art__veil{
  position:absolute;inset:0;
  background:linear-gradient(180deg, rgba(29,78,216,.06) 0%, rgba(6,182,212,.10) 100%);
}
/* 品牌区：横版组合标识是蓝字透明底，直接叠在浅蓝插画上对比度不够，
   必须加一层白色半透明底板，否则中文书法细笔画会被背景吃掉 */
.login-art__brand{
  position:absolute;left:22px;top:20px;right:22px;z-index:2;
  padding:11px 14px 12px;border-radius:14px;
  background:rgba(255,255,255,.88);border:1px solid rgba(255,255,255,.95);
  backdrop-filter:blur(8px);box-shadow:0 8px 24px rgba(16,32,64,.09);
}
.login-art__brand img{display:block;width:100%;max-width:420px;height:auto;object-fit:contain}
.login-art__sub{
  display:block;margin-top:8px;padding-top:8px;border-top:1px solid #e6eefb;
  font-size:11.5px;color:#2c5686;letter-spacing:.7px;font-weight:600;
}
.login-art__foot{
  position:absolute;left:26px;right:26px;bottom:22px;z-index:2;
  display:flex;gap:8px;flex-wrap:wrap;
}
.login-art__foot i{
  font-style:normal;font-size:11px;padding:4px 10px;border-radius:20px;
  background:rgba(255,255,255,.82);border:1px solid #d5e4f7;color:#2c5686;
  backdrop-filter:blur(6px);
}
.login-form{padding:52px 46px;display:flex;flex-direction:column;justify-content:center}
.login-form h1{font-size:22px;letter-spacing:.4px;margin-bottom:6px}
.login-form .sub{font-size:12.5px;color:var(--t3);margin-bottom:28px}
.login-form .field{margin-bottom:15px}
.login-tip{
  margin-top:16px;padding:10px 13px;border-radius:9px;font-size:11.5px;color:#33557f;
  background:var(--grad-soft);border:1px solid #dbe8fb;line-height:1.75;
}
.login-err{color:var(--c-rose);font-size:12px;min-height:17px;margin-top:2px;margin-bottom:8px}
.login-err.on{animation:shake .3s}
@keyframes shake{0%,100%{transform:translateX(0)}25%{transform:translateX(-5px)}75%{transform:translateX(5px)}}

/* 兼容旧登录页类名（若被外部引用） */
.login-wrap{display:grid;grid-template-columns:1.05fr .95fr;min-height:100vh}
.login-brand{position:relative;overflow:hidden;color:#fff;padding:54px 60px;display:flex;flex-direction:column;
  background:linear-gradient(155deg,#0d2140 0%,#1b3a6b 52%,#2b5c9c 100%)}
.login-form-side{display:flex;align-items:center;justify-content:center;padding:40px 30px;background:#fff}
.lc-title{font-size:22px;font-weight:600;letter-spacing:.5px}
.lc-desc{color:var(--t3);font-size:12.5px;margin-top:6px}
.demo-box{margin-top:22px;border:1px dashed var(--line);border-radius:10px;padding:12px 13px;background:var(--panel2)}
.demo-box .db-h{font-size:11.5px;color:var(--t3);letter-spacing:.5px;margin-bottom:9px;display:flex;justify-content:space-between}
.demo-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:7px}
.demo-grid button{border:1px solid var(--line);background:#fff;border-radius:8px;padding:7px 4px;cursor:pointer;
  font-size:11.5px;color:var(--t2);transition:.15s;line-height:1.4}
.demo-grid button b{display:block;color:var(--c-primary-d);font-size:12px}
.demo-grid button:hover{border-color:var(--c-primary);color:var(--c-primary);background:var(--primary-50)}

/* ==========================================================================
   五、应用外壳
   ========================================================================== */
.app{display:none;height:100vh;grid-template-columns:var(--sb-w) 1fr}
.app.on{display:grid}
#app-root:not([hidden]){display:grid;height:100vh;grid-template-columns:var(--sb-w) 1fr}

/* ---------------------------------------------------------------- 侧栏 */
.sidebar{
  background:var(--panel);border-right:1px solid var(--line);
  display:flex;flex-direction:column;min-height:0;height:100vh;position:sticky;top:0;
  background-image:linear-gradient(180deg,#ffffff 0%,#fbfdff 100%);
}
.sb-brand{
  height:var(--top-h);display:flex;align-items:center;gap:9px;padding:0 14px;flex:none;
  border-bottom:1px solid var(--line2);
}
/* 校徽是圆形透明底，加一层浅投影把它从白底上托起来 */
.sb-brand img{width:32px;height:32px;object-fit:contain;flex:none;
  filter:drop-shadow(0 2px 6px rgba(29,78,216,.2))}
.sb-brand b{font-size:12.6px;letter-spacing:.1px;line-height:1.24;display:block;color:var(--t1)}
.sb-brand span{font-size:10px;color:var(--t3);letter-spacing:.4px;line-height:1.3;display:block;margin-top:1px}
/* 旧类名 .sb-logo 别名 */
.sb-logo{height:var(--top-h);display:flex;align-items:center;gap:10px;padding:0 15px;flex:none;border-bottom:1px solid var(--line2)}
.sb-logo img{width:31px;height:31px;object-fit:contain}
.sb-logo .t{display:flex;flex-direction:column;overflow:hidden}
.sb-logo .t b{font-size:12.8px;font-weight:600;color:var(--t1);white-space:nowrap}
.sb-logo .t i{font-style:normal;font-size:10px;color:var(--t3);white-space:nowrap}

.sb-nav{flex:1;overflow-y:auto;padding:10px 9px 22px;min-height:0}
.sb-nav::-webkit-scrollbar{width:6px}
.sb-nav::-webkit-scrollbar-thumb{background:#dbe5f2;border-radius:6px}
.sb-group,
.sb-sec{
  font-size:10.5px;color:var(--t4);letter-spacing:1.4px;font-weight:600;
  padding:14px 10px 5px;text-transform:uppercase;
}
.sb-group:first-child,.sb-sec:first-child{padding-top:4px}
.sb-item{
  display:flex;align-items:center;gap:8px;padding:6.5px 10px 6.5px 12px;border-radius:7px;
  font-size:12.5px;color:var(--t2);cursor:pointer;position:relative;transition:.15s;
  border-left:2px solid transparent;margin-bottom:1px;user-select:none;
}
.sb-item svg{width:15px;height:15px;color:var(--t3);flex:none}
.sb-item:hover{background:#f4f8ff;color:var(--c-primary)}
.sb-item:hover svg{color:var(--c-primary)}
.sb-item.on{
  background:var(--grad);color:#fff;font-weight:600;
  box-shadow:0 3px 10px rgba(37,99,235,.24);border-left-color:transparent;
}
.sb-item.on svg{color:#fff}
.sb-item.on::before{content:"";position:absolute;left:0;top:8px;bottom:8px;width:2px;border-radius:2px;background:#fff;opacity:.9}
.sb-item .cnt{margin-left:auto;background:var(--c-rose);color:#fff;font-size:10px;border-radius:9px;padding:0 6px;line-height:16px;height:16px}

.sb-user{padding:11px 13px;border-bottom:1px solid var(--line2);display:flex;gap:10px;align-items:center}
.sb-user .u{overflow:hidden;flex:1}
.sb-user .u b{display:block;font-size:12.8px;font-weight:600;color:var(--t1);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.sb-user .u span{display:block;font-size:10.8px;color:var(--t3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.avatar{
  width:34px;height:34px;border-radius:10px;display:grid;place-items:center;flex:0 0 34px;
  font-size:13.5px;font-weight:600;color:#fff;background:var(--grad);
}
.avatar.teacher{background:var(--grad-mint)}
.avatar.admin{background:var(--grad-violet)}

.sb-foot{flex:none;padding:10px 12px;border-top:1px solid var(--line2);font-size:10.5px;color:var(--t4);line-height:1.6}
.sb-foot b{display:block;color:#3a5f8f;font-weight:600;font-size:11.5px;margin-bottom:3px}
.sb-foot .motto{letter-spacing:2.4px;display:block}
.sb-foot button{
  margin-top:7px;background:#fff;border:1px solid var(--line);color:var(--t2);
  border-radius:7px;padding:5px 10px;cursor:pointer;font-size:11.5px;transition:.15s;
  display:inline-flex;align-items:center;gap:5px;width:100%;justify-content:center;
}
.sb-foot button:hover{background:#fff5f7;border-color:#f8c2ce;color:#b81641}

/* ---------------------------------------------------------------- 主区 */
.main{display:flex;flex-direction:column;min-width:0;min-height:0;height:100vh}
.topbar{
  height:var(--top-h);flex:none;display:flex;align-items:center;gap:12px;padding:0 18px;
  background:rgba(255,255,255,.9);backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line);position:relative;z-index:20;
}
.crumb{font-size:12.5px;color:var(--t3);display:flex;align-items:center;gap:7px;min-width:0}
.crumb > svg{width:13px;height:13px;color:var(--t4);flex:none}
.crumb b{color:var(--t1);font-weight:600;font-size:14.5px;white-space:nowrap}
.crumb .sep{color:var(--t4)}
.topbar .sp{flex:1}
.top-actions{display:flex;align-items:center;gap:9px;margin-left:auto}
.tb-btn{
  display:flex;align-items:center;gap:6px;padding:6px 11px;border-radius:8px;
  border:1px solid var(--line);background:#fff;cursor:pointer;font-size:12.2px;color:var(--t2);transition:.15s;
  white-space:nowrap;
}
.tb-btn:hover{border-color:#bcd2f4;color:var(--c-primary);background:#f8fbff}
.tb-btn svg{width:14px;height:14px}
.tb-btn[data-logout]:hover{background:#fff5f7;border-color:#f8c2ce;color:#b81641}
.who{
  display:flex;align-items:center;gap:9px;padding:4px 4px 4px 11px;border-radius:22px;
  border:1px solid var(--line);background:#fff;
}
.who .nm{font-size:12.3px;line-height:1.15;text-align:right}
.who .nm b{display:block;font-size:12.4px;color:var(--t1);font-weight:600}
.who .nm i{font-style:normal;display:block;font-size:10.3px;color:var(--t3)}
.who .av{
  width:28px;height:28px;border-radius:50%;background:var(--grad);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;flex:none;
}
.who .av.teacher{background:var(--grad-mint)}
.who .av.admin{background:var(--grad-violet)}

/* 内容区 + 点阵底纹 */
.content{
  flex:1;overflow-y:auto;padding:18px 20px 60px;min-height:0;position:relative;
}
.content::before{
  content:"";position:fixed;inset:var(--top-h) 0 0 var(--sb-w);pointer-events:none;z-index:0;
  background-image:radial-gradient(#d8e3f2 .9px, transparent .9px);background-size:24px 24px;opacity:.42;
}
.content > *{position:relative;z-index:1}
.content.narrow{max-width:1180px;margin:0 auto;width:100%}

/* 环境标识（顶栏操作区） */
.env-chip{
  font-size:11px;padding:3px 9px;border-radius:20px;background:#eef4ff;color:#2c5fd0;
  border:1px solid #d9e5fb;white-space:nowrap;
}
.env-chip.exam{background:#fff7e8;color:#b8730a;border-color:#fce4ba}
.env-chip.done{background:#e9fbf3;color:#0a7c56;border-color:#c8f0de}

/* ==========================================================================
   六、页头
   ========================================================================== */
.page-head{margin-bottom:16px;display:flex;align-items:flex-end;gap:14px;flex-wrap:wrap}
.page-head .ph-t{
  font-size:19px;letter-spacing:.2px;font-weight:600;display:flex;align-items:center;gap:10px;flex-wrap:wrap;
}
.page-head .ph-d{font-size:12.6px;color:var(--t3);line-height:1.7;max-width:1180px;margin-top:5px}
.page-head .ph-r{margin-left:auto;display:flex;gap:8px;flex-wrap:wrap;align-items:center}
.page-head__acts{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:14px;padding:9px 14px;
  border:1px dashed #c7d9f7;border-radius:12px;background:linear-gradient(90deg,#f7faff 0%,#ffffff 70%);
}
.page-head__acts .btn{flex:none}
.page-head__acts .hint{font-size:11.5px;color:var(--t3)}

/* 页头横条插画 */
.page-hero{position:relative;height:104px;border-radius:var(--r2);overflow:hidden;
  border:1px solid var(--line);margin-bottom:14px;background:#fff;box-shadow:var(--sh1)}
.page-hero img{display:block;width:100%;height:100%;object-fit:cover;object-position:center 44%}
.page-hero__cap{
  position:absolute;left:12px;top:50%;transform:translateY(-50%);
  display:flex;align-items:center;gap:8px;padding:7px 13px;border-radius:10px;
  background:rgba(255,255,255,.94);border:1px solid rgba(255,255,255,.9);
  box-shadow:0 6px 18px rgba(16,32,64,.13);backdrop-filter:blur(8px);max-width:calc(100% - 24px);
}
.page-hero__cap svg{width:16px;height:16px;color:var(--c-primary)}
.page-hero__cap b{font-size:12.6px;letter-spacing:.2px}
.page-hero__cap i{font-style:normal;font-size:11px;color:var(--t3)}

/* ==========================================================================
   七、指标卡
   ========================================================================== */
.stat{
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r);padding:13px 15px;
  box-shadow:var(--sh1);position:relative;overflow:hidden;transition:.18s;
}
.stat:hover{box-shadow:var(--sh2);transform:translateY(-1px)}
.stat::after{content:"";position:absolute;left:0;top:12px;bottom:12px;width:3px;border-radius:0 3px 3px 0;background:var(--grad)}
.stat .s-l{font-size:11.4px;color:var(--t3);margin-bottom:5px;letter-spacing:.2px;display:flex;align-items:center;gap:6px}
.stat .s-l svg{width:13px;height:13px;color:var(--t4)}
.stat .s-v{font-size:22px;font-weight:600;letter-spacing:-.3px;line-height:1.15;font-variant-numeric:tabular-nums;color:var(--t1)}
.stat .s-v small{font-size:11.5px;font-weight:500;color:var(--t3);margin-left:3px}
.stat .s-x{font-size:10.8px;color:var(--t4);margin-top:3px}
.stat.c-green::after{background:var(--grad-mint)}
.stat.c-amber::after{background:var(--grad-amber)}
.stat.c-red::after{background:var(--grad-rose)}
.stat.c-purple::after{background:var(--grad-violet)}
.stat.c-teal::after{background:linear-gradient(135deg,#0d9488,#06b6d4)}
.stat.c-green .s-v{color:#0a7c56}
.stat.c-amber .s-v{color:#b8730a}
.stat.c-red .s-v{color:#c81e4a}
.stat.c-purple .s-v{color:#6d3fd1}
.stat.c-teal .s-v{color:#0a7f9c}
.stat.c-primary .s-v{color:var(--c-primary-d)}

/* ==========================================================================
   八、卡片
   ========================================================================== */
.card{
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r2);
  box-shadow:var(--sh1);margin-bottom:15px;overflow:hidden;
}
.card-h{
  display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--line2);
  background:linear-gradient(180deg,#fcfdff,#f9fbff);
}
.card-h .ch-t{font-size:14px;font-weight:600;display:flex;align-items:center;gap:8px}
.card-h .ch-t svg{width:16px;height:16px;color:var(--c-primary)}
.card-h .ch-d{font-size:11.6px;color:var(--t3)}
.card-h .ch-r{margin-left:auto;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.card-b{padding:15px 16px}
.card-b.tight{padding:0}
.card-b.pad-sm{padding:11px 14px}

.sec-title{display:flex;align-items:center;gap:8px;font-size:13.2px;font-weight:600;margin:16px 0 9px;color:var(--t1)}
.sec-title:first-child{margin-top:0}
.sec-title svg{width:15px;height:15px;color:var(--c-primary)}
.sec-title::after{content:"";flex:1;height:1px;background:var(--line2)}

/* ==========================================================================
   九、网格
   ========================================================================== */
.grid{display:grid;gap:14px}
.g2{grid-template-columns:repeat(2,minmax(0,1fr))}
.g3{grid-template-columns:repeat(3,minmax(0,1fr))}
.g4{grid-template-columns:repeat(4,minmax(0,1fr))}
.g5{grid-template-columns:repeat(5,minmax(0,1fr))}
.g6{grid-template-columns:repeat(6,minmax(0,1fr))}
@media(max-width:1400px){.g6{grid-template-columns:repeat(4,minmax(0,1fr))}.g5{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media(max-width:1240px){.g4{grid-template-columns:repeat(2,minmax(0,1fr))}.g3{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:900px){.g2,.g3,.g4,.g5,.g6{grid-template-columns:1fr}}

/* ==========================================================================
   十、按钮
   ========================================================================== */
.btn{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;height:32px;padding:0 13px;
  border-radius:8px;border:1px solid var(--line);background:#fff;color:var(--t2);cursor:pointer;
  font-size:12.4px;transition:.15s;white-space:nowrap;line-height:1.4;
}
/* 默认 hover 必须排除自带底色的变体，否则 .btn:hover 会盖掉变体的渐变底，
   变成「白底 + 白字」——鼠标移上去整块空白（原版踩过的坑）。 */
.btn:hover:not(.primary):not(.brand):not(.green):not(.purple):not(.teal):not(.danger):not(.on){
  border-color:#bcd2f4;color:var(--c-primary);background:#f8fbff;
}
.btn:active{transform:translateY(1px)}
.btn svg{width:14px;height:14px}
.btn.primary{background:var(--grad);border-color:transparent;color:#fff;box-shadow:0 3px 10px rgba(37,99,235,.24)}
.btn.primary:hover{background:var(--grad);color:#fff;filter:brightness(1.06);box-shadow:0 5px 16px rgba(37,99,235,.3)}
.btn.brand{background:linear-gradient(135deg,#1d4ed8,#4f46e5);border-color:transparent;color:#fff;box-shadow:0 3px 10px rgba(79,70,229,.22)}
.btn.brand:hover{filter:brightness(1.06);color:#fff}
.btn.green{background:var(--grad-mint);border-color:transparent;color:#fff;box-shadow:0 3px 10px rgba(16,185,129,.22)}
.btn.green:hover{filter:brightness(1.05);color:#fff}
.btn.purple{background:var(--grad-violet);border-color:transparent;color:#fff;box-shadow:0 3px 10px rgba(124,58,237,.22)}
.btn.purple:hover{filter:brightness(1.05);color:#fff}
.btn.teal{background:linear-gradient(135deg,#0d9488,#06b6d4);border-color:transparent;color:#fff;box-shadow:0 3px 10px rgba(13,148,136,.22)}
.btn.teal:hover{filter:brightness(1.05);color:#fff}
.btn.danger{border-color:#fbd6df;color:#d61f4c;background:#fff}
.btn.danger:hover{background:#fff5f7;border-color:#f8c2ce;color:#b81641}
.btn.ghost{background:transparent;border-color:transparent;color:var(--c-primary)}
.btn.ghost:hover{background:#eef4ff;color:var(--c-primary)}
.btn.sm{height:27px;padding:0 10px;font-size:11.8px;border-radius:7px}
.btn.sm svg{width:12.5px;height:12.5px}
.btn.xs{height:23px;padding:0 8px;font-size:11.2px;border-radius:6px}
.btn.xs svg{width:11.5px;height:11.5px}
.btn.lg{height:40px;padding:0 18px;font-size:13.6px;border-radius:9px}
.btn.lg svg{width:16px;height:16px}
.btn.full{width:100%}
.btn:disabled,.btn.dis{opacity:.5;cursor:not-allowed;filter:none!important;box-shadow:none!important;pointer-events:none}
.btn.on{background:var(--grad);border-color:transparent;color:#fff}
.btn-group{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden}
.btn-group button{border:0;border-right:1px solid var(--line2);background:#fff;padding:6px 12px;cursor:pointer;
  font-size:12.2px;color:var(--t2);white-space:nowrap;transition:.15s}
.btn-group button:last-child{border-right:0}
.btn-group button.on{background:var(--grad);color:#fff;font-weight:600}
.btn-group button:hover:not(.on){background:#f1f6fe;color:var(--c-primary)}
/* 分段控件（原版 .seg） */
.seg{display:inline-flex;border:1px solid var(--line);border-radius:8px;overflow:hidden;background:#fbfdff}
.seg button{border:none;background:none;padding:6px 12px;font-size:12.2px;cursor:pointer;color:var(--t2);
  transition:.15s;border-right:1px solid var(--line2)}
.seg button:last-child{border-right:none}
.seg button:hover{background:#f1f6fe;color:var(--c-primary)}
.seg button.on{background:var(--grad);color:#fff;font-weight:600}

/* ==========================================================================
   十一、表单
   ========================================================================== */
.form-row{margin-bottom:14px}
.form-row label,.lbl{display:block;font-size:12.4px;color:var(--t2);margin-bottom:5px;font-weight:600}
.lbl .req,.form-row label .req{color:var(--c-rose);margin-left:2px}
/* 单字段容器（登录页表单用） */
.field{display:flex;flex-direction:column;gap:5px;min-width:0}
.field > label{font-size:12.4px;color:var(--t2);font-weight:600;display:flex;align-items:center;gap:4px}
.field > label .rq{color:var(--c-rose)}
.inp{
  width:100%;border:1px solid var(--line);border-radius:8px;padding:0 11px;height:34px;background:#fbfdff;
  transition:.15s;outline:none;font-size:12.6px;color:var(--t1);
}
.inp:focus{border-color:#a9c8f5;background:#fff;box-shadow:0 0 0 3px rgba(37,99,235,.09)}
.inp:disabled,.inp[readonly]{background:#f6f8fb;color:var(--t3)}
textarea.inp{height:auto;min-height:76px;padding:9px 11px;line-height:1.68;resize:vertical}
select.inp{cursor:pointer;appearance:none;background-color:#fbfdff;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath d='M2 4l4 4 4-4' stroke='%238b9ab3' stroke-width='1.6' fill='none' stroke-linecap='round'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right 10px center;padding-right:30px}
.inp-icon{position:relative;display:block}
.inp-icon .inp{padding-left:33px}
.inp-icon svg{position:absolute;left:11px;top:50%;transform:translateY(-50%);color:var(--t4);pointer-events:none}
.hint{font-size:11.5px;color:var(--t3);margin-top:4px}
/* 卡片内的小节标签（hub 页「开放接口调试」等） */
.lb1{display:flex;align-items:center;gap:7px;font-size:12.6px;font-weight:600;color:var(--t1);margin-bottom:9px}
.form-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:0 14px}
.form-grid.c3{grid-template-columns:repeat(3,minmax(0,1fr))}
.form-grid.full{grid-template-columns:1fr}
@media(max-width:820px){.form-grid,.form-grid.c3{grid-template-columns:1fr}}
.checkline{display:flex;align-items:center;gap:8px;font-size:12.6px;color:var(--t2);cursor:pointer;user-select:none}
.checkline input{width:15px;height:15px;accent-color:var(--c-primary);cursor:pointer}
.chks{display:flex;flex-wrap:wrap;gap:7px 14px;padding:7px 0}
.chk{display:flex;align-items:center;gap:6px;font-size:12.4px;color:var(--t2);cursor:pointer;user-select:none}
.chk input{width:14px;height:14px;accent-color:var(--c-primary);cursor:pointer}

/* ==========================================================================
   十二、工具条
   ========================================================================== */
.toolbar{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:11px 16px;
  background:#fff;border-bottom:1px solid var(--line2);
}
.toolbar .sp{margin-left:auto}
.search{position:relative;display:flex;align-items:center}
.search svg{position:absolute;left:9px;width:14px;height:14px;color:var(--t4);pointer-events:none}
.search input,.search .inp{
  height:32px;padding:0 12px 0 29px;border:1px solid var(--line);border-radius:8px;background:#fbfdff;
  width:212px;transition:.15s;font-size:12.4px;
}
.search input:focus,.search .inp:focus{border-color:#a9c8f5;background:#fff;box-shadow:0 0 0 3px rgba(37,99,235,.09)}
.filters{display:flex;gap:7px;flex-wrap:wrap}
.filters select,.filters input{
  height:32px;padding:0 9px;border:1px solid var(--line);border-radius:8px;background:#fbfdff;
  font-size:12.3px;color:var(--t2);cursor:pointer;max-width:172px;
}
.sel-info{font-size:11.8px;color:var(--t3)}
.sel-info b{color:var(--c-primary)}

/* ==========================================================================
   十三、表格
   ========================================================================== */
.tbl-wrap{overflow-x:auto}
table.tbl{width:100%;border-collapse:separate;border-spacing:0;font-size:12.5px}
table.tbl thead th{
  background:#f8fafd;color:var(--t2);font-weight:600;font-size:11.9px;text-align:left;
  padding:9px 12px;border-bottom:1px solid var(--line);white-space:nowrap;position:sticky;top:0;z-index:2;
  letter-spacing:.2px;
}
table.tbl thead th.num{text-align:right}
table.tbl thead th.tc{text-align:center}
table.tbl tbody td{padding:9px 12px;border-bottom:1px solid var(--line2);vertical-align:middle;color:var(--t1)}
table.tbl tbody tr:hover td{background:#f8fbff}
table.tbl tbody tr.on td,table.tbl tbody tr.sel td{background:#eff5ff}
table.tbl tbody tr:last-child td{border-bottom:none}
table.tbl td.num{text-align:right;font-variant-numeric:tabular-nums;font-family:var(--mono);font-size:12.1px}
table.tbl td.tc{text-align:center}
table.tbl td.mono{font-family:var(--mono);font-size:12.1px;color:#2b4a7d}
table.tbl td.strong{font-weight:600}
/* 成绩表「学生」列：主行是姓名 + 当前名单状态，次行写登分时的状态。
   次行只在两者不一致时出现，用 10px 灰字，不抢主行的注意力。 */
table.tbl td .rv-name{display:inline-flex;align-items:center;gap:4px;flex-wrap:wrap}
table.tbl td .rv-was{display:block;margin-top:2px;font-style:normal;font-size:10px;color:var(--t3);line-height:1.5}
table.tbl td .rv-was::before{content:'↳ ';opacity:.6}
/* 退回史（流程图页的学生提示里，默认收起） */
.fret{margin-top:8px}
.fret>summary{cursor:pointer;font-size:11.5px;color:var(--t2);list-style:none}
.fret>summary::-webkit-details-marker{display:none}
.fret>summary::before{content:'▸ ';color:var(--t3)}
.fret[open]>summary::before{content:'▾ '}
.fret>summary:hover{color:var(--t1);text-decoration:underline}
.fret-list{margin-top:6px;border-top:1px dashed var(--line);padding-top:6px}
.fret-row{display:grid;grid-template-columns:56px minmax(0,1fr) auto;gap:8px;align-items:baseline;padding:3px 0;font-size:11.5px}
.fret-row .r{color:var(--t3)}
.fret-row .why{color:var(--t1);line-height:1.7}
.fret-row .at{color:var(--t3);font-size:10.5px;white-space:nowrap}

/* 批量退回：逐人原因（默认收起） */
.rb-ov{margin-top:10px;border:1px solid var(--line);border-radius:9px;padding:0 12px;background:#fdfcfe}
.rb-ov>summary{cursor:pointer;padding:9px 0;font-size:12px;color:var(--t2);list-style:none}
.rb-ov>summary::-webkit-details-marker{display:none}
.rb-ov>summary::before{content:'▸ ';color:var(--t3)}
.rb-ov[open]>summary::before{content:'▾ '}
.rb-ov>summary:hover{color:var(--t1)}
.rb-ov-list{padding:4px 0 6px;max-height:230px;overflow:auto}
.rb-ov-row{display:grid;grid-template-columns:120px minmax(0,1fr);gap:10px;align-items:center;margin-bottom:6px}
.rb-ov-row .n{font-size:12px;color:var(--t2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rb-ov-row .inp{height:32px;font-size:12px}
table.tbl td.muted{color:var(--t3)}
table.tbl .row-acts{white-space:nowrap;text-align:right;font-family:var(--font)}
.op-link{
  color:var(--c-primary);cursor:pointer;font-size:12.2px;white-space:nowrap;display:inline-block;
  padding:0 2px;border-radius:4px;transition:.13s;
}
.op-link:hover{background:#eef4ff;text-decoration:underline}
.op-link.dg{color:#d61f4c}
.op-link.dg:hover{background:#fff0f3}
.tbl-empty{padding:44px 20px;text-align:center;color:var(--t3);font-size:12.6px}
.tbl-empty img{width:118px;opacity:.92;margin-bottom:8px;display:block;margin-inline:auto}
.tbl-empty svg{display:block;margin:0 auto 10px;color:#cbd5e1}
.tbl-foot{display:flex;align-items:center;gap:10px;padding:11px 16px;border-top:1px solid var(--line2);
  font-size:12.2px;color:var(--t3);background:#fff;flex-wrap:wrap}
.tbl-foot .pager{margin-left:auto}
.tbl-foot b{color:var(--c-primary);font-weight:600}
.pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:12.2px;color:var(--t3)}
.pager .sp{flex:1}
.tbl-foot .pager button,
.pager button,.pg-btn{
  min-width:29px;height:29px;padding:0 8px;border:1px solid var(--line);background:#fff;border-radius:7px;
  cursor:pointer;color:var(--t2);font-size:12.2px;transition:.15s;
}
.pager button:hover:not(:disabled),.pg-btn:hover:not([disabled]){border-color:#bcd2f4;color:var(--c-primary);background:#f8fbff}
.pager button.on,.pg-btn.on{background:var(--grad);border-color:transparent;color:#fff;font-weight:600}
.pager button:disabled,.pg-btn[disabled]{opacity:.42;cursor:not-allowed}

/* ==========================================================================
   十四、徽章 / 标签
   ========================================================================== */
.badge,.tag{
  display:inline-flex;align-items:center;gap:5px;font-size:11.4px;font-weight:600;letter-spacing:.3px;
  padding:2.5px 8px;border-radius:6px;background:#f3f6fb;color:#6b7f9c;border:1px solid #e5ecf6;
  white-space:nowrap;line-height:1.7;
}
.tag::before{content:"";width:5px;height:5px;border-radius:50%;background:currentColor;opacity:.85}
.tag.n::before{display:none}
.badge.b-blue,.badge--blue,.tag--blue{background:#eef4ff;color:#2c5fd0;border-color:#d9e5fb}
.badge.b-green,.badge--mint,.tag--mint,.badge--demo{background:#e9fbf3;color:#0a7c56;border-color:#c8f0de}
.badge.b-amber,.badge--amber,.badge--warn,.tag--amber{background:#fff7e8;color:#b8730a;border-color:#fce4ba}
.badge.b-red,.badge--rose,.tag--rose{background:#fff0f3;color:#c81e4a;border-color:#fbd6df}
.badge.b-purple,.badge--violet,.tag--violet,.badge--no{background:#f4efff;color:#6d3fd1;border-color:#e6ddfb}
.badge.b-teal,.badge--cyan,.tag--cyan{background:#e8fafe;color:#0a7f9c;border-color:#c9eefa}
.badge.b-gray,.badge--gray,.tag--gray{background:#f3f6fb;color:#6b7f9c;border-color:#e5ecf6}
.badge--path{background:#eef4ff;color:#2c5fd0;border-color:#d9e5fb}
.badge--star{background:#fff6e6;color:#b8730a;border-color:#fce3b6}
.dot{width:6px;height:6px;border-radius:50%;background:currentColor;display:inline-block;flex:none}

/* ==========================================================================
   十五、进度条
   ========================================================================== */
.bar{height:7px;border-radius:5px;background:#eaf0f9;overflow:hidden;position:relative;min-width:44px}
.bar > i,.bar i{display:block;height:100%;border-radius:5px;background:var(--grad);transition:width .5s ease}
.bar.green > i,.bar.green i,.bar.m > i{background:var(--grad-mint)}
.bar.amber > i,.bar.amber i,.bar.a > i{background:var(--grad-amber)}
.bar.red > i,.bar.red i,.bar.r > i{background:var(--grad-rose)}
.bar.purple > i,.bar.purple i,.bar.v > i{background:var(--grad-violet)}
.bar-row{display:flex;align-items:center;gap:10px}
.bar-row .lb{font-size:12.2px;color:var(--t2);min-width:96px;flex:none}
.bar-row .bar{flex:1}
.bar-row .bar-v,.bar-row .vl{font-size:11.6px;color:var(--t3);min-width:52px;text-align:right;
  font-variant-numeric:tabular-nums;flex:none}

/* ==========================================================================
   十六、标签页
   ========================================================================== */
.tabs{display:flex;gap:4px;border-bottom:1px solid var(--line);padding:0 14px;background:#fff;
  margin-bottom:15px;flex-wrap:nowrap;overflow-x:auto}
.tabs button{
  border:none;background:none;padding:11px 15px;cursor:pointer;font-size:12.9px;color:var(--t2);
  border-bottom:2px solid transparent;margin-bottom:-1px;transition:.15s;white-space:nowrap;
  display:flex;align-items:center;gap:7px;
}
.tabs button:hover{color:var(--c-primary)}
.tabs button.on{color:var(--c-primary);font-weight:600;border-bottom-color:var(--c-primary)}
.tabs button .num{
  font-size:10.5px;background:#eef4ff;color:#2c5fd0;border-radius:9px;padding:1px 6px;font-weight:600;
}
.tabs button.on .num{background:var(--grad);color:#fff}
.tabs .muted{font-size:11.4px}

/* ==========================================================================
   十七、步骤条
   ========================================================================== */
.stepper{
  display:flex;align-items:flex-start;gap:0;overflow-x:auto;padding:16px 18px 14px;
  background:linear-gradient(180deg,#fcfdff,#f9fbff);border-bottom:1px solid var(--line2);
}
.stepper .st{display:flex;align-items:center;gap:9px;padding-right:26px;position:relative;flex:0 0 auto}
.stepper .st::after{
  content:"";position:absolute;right:7px;top:50%;width:13px;height:2px;border-radius:2px;
  background:#e3ebf6;transform:translateY(-50%);
}
.stepper .st:last-child::after{display:none}
.stepper .st .n{
  width:30px;height:30px;border-radius:50%;display:grid;place-items:center;background:#fff;
  border:2px solid #dbe5f2;color:var(--t3);font-size:12.4px;font-weight:600;flex:0 0 auto;transition:.2s;
}
.stepper .st .x{font-size:12.2px;color:var(--t2);white-space:nowrap}
.stepper .st .x .muted{color:var(--t4);font-size:11.4px;font-variant-numeric:tabular-nums}
.stepper .st:hover .n{border-color:#a9c8f5;color:var(--c-primary)}
.stepper .st.on .n{background:var(--grad);border-color:transparent;color:#fff;box-shadow:0 4px 14px rgba(37,99,235,.3)}
.stepper .st.on .x{color:var(--c-primary);font-weight:600}
.stepper .st.done .n{background:var(--grad-mint);border-color:transparent;color:#fff}
.stepper .st.done .x{color:#0a7c56;font-weight:600}
.stepper .st.done::after{background:linear-gradient(90deg,#10b981,#06b6d4)}

/* ==========================================================================
   十八、流程阶段卡与步骤
   ========================================================================== */
.flow-stage{
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r2);margin-bottom:14px;
  overflow:hidden;box-shadow:var(--sh1);transition:.18s;
}
.flow-stage:hover{box-shadow:var(--sh2)}
.fs-h{
  display:flex;align-items:center;gap:12px;padding:12px 15px;
  background:linear-gradient(90deg,#f7faff,#fff);border-bottom:1px solid var(--line2);
}
.fs-h .fs-n{
  width:30px;height:30px;border-radius:9px;display:grid;place-items:center;font-weight:600;color:#fff;
  font-size:13px;background:var(--grad);flex:0 0 30px;box-shadow:0 3px 10px rgba(37,99,235,.22);
}
.fs-h .fs-t{font-size:14px;font-weight:600;color:var(--t1)}
.fs-h .fs-d{font-size:11.5px;color:var(--t3)}
.fs-h .fs-r{margin-left:auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
.steps{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:10px;padding:13px 15px}
.step{
  border:1px solid var(--line);border-radius:var(--r);padding:10px 12px;background:#fff;cursor:pointer;
  transition:.15s;position:relative;border-left:3px solid #d8e0ec;
}
.step:hover{border-color:#bcd2f2;box-shadow:var(--sh2);transform:translateY(-1px)}
.step.s-done{border-left-color:var(--c-mint);background:#fbfefc}
.step.s-doing{border-left-color:var(--c-amber);background:#fffdf8}
.step.s-todo{border-left-color:#d8e0ec}
.step.s-sub{border-left-color:var(--c-primary);background:#fbfdff}
.step.s-rev{border-left-color:var(--c-violet);background:#fdfcff}
/* D-5：本场次没有这项内容（如纯练习场次没有考试）—— 灰边 + 淡底，一眼看出「不是没做，是不涉及」 */
.step.s-na{border-left-color:#c9d2e0;background:#f8fafc;opacity:.86}
.step .st-h{display:flex;align-items:center;gap:7px;margin-bottom:5px}
.step .st-code{
  font-family:var(--mono);font-size:10.4px;color:#2b4a7d;background:#eef4ff;padding:0 5px;
  border-radius:4px;line-height:16px;flex:none;
}
.step .st-t{font-size:12.9px;font-weight:600;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.step .st-m{font-size:11.5px;color:var(--t3);line-height:1.6;min-height:34px}
.step .st-f{
  display:flex;align-items:center;gap:8px;margin-top:6px;padding-top:7px;
  border-top:1px dashed var(--line2);font-size:11.5px;color:var(--t3);flex-wrap:wrap;
}
.step .st-f .sp{margin-left:auto}

/* ==========================================================================
   十九、空态（原版插画）
   ========================================================================== */
.empty{display:flex;flex-direction:column;align-items:center;justify-content:center;
  padding:38px 20px;text-align:center;color:var(--t3)}
.empty img{width:150px;opacity:.95;margin-bottom:10px}
.empty svg{color:#cbd5e1;margin-bottom:12px}
.empty .e-t{font-size:13.4px;color:var(--t2);margin-bottom:4px}
.empty .e-d{font-size:12.2px;line-height:1.7;max-width:420px}

/* ==========================================================================
   二十、键值表
   ========================================================================== */
.kv{display:grid;grid-template-columns:132px 1fr;gap:1px;background:var(--line2);
  border:1px solid var(--line2);border-radius:9px;overflow:hidden}
.kv dt{background:#f9fbfe;padding:8px 12px;font-size:12.2px;color:var(--t3);font-weight:500}
.kv dd{background:#fff;padding:8px 12px;font-size:12.6px;color:var(--t1);margin:0;word-break:break-all}
.kv-2{grid-template-columns:132px 1fr 132px 1fr}

/* 键值小行（原版 .li） */
.li{display:flex;align-items:flex-start;gap:9px;padding:8px 0;border-bottom:1px dashed var(--line2);font-size:12.5px}
.li:last-child{border-bottom:none}
.li > svg{width:15px;height:15px;color:var(--c-primary);flex:none;margin-top:2px}
.li .k{color:var(--t3);min-width:98px;flex:none}
.li .v{color:var(--t1);flex:1;min-width:0;line-height:1.66}

/* ==========================================================================
   二十一、时间线
   ========================================================================== */
.timeline{position:relative;padding-left:20px}
.timeline::before{content:"";position:absolute;left:5px;top:6px;bottom:6px;width:2px;background:var(--line);border-radius:2px}
.tl-item{position:relative;padding:0 0 15px 4px}
.tl-item:last-child{padding-bottom:0}
.tl-item::before{
  content:"";position:absolute;left:-19px;top:5px;width:9px;height:9px;border-radius:50%;
  background:#fff;border:2px solid var(--c-primary);box-shadow:0 0 0 3px #eef4ff;
}
.tl-item.ok::before{border-color:var(--c-mint);box-shadow:0 0 0 3px #e9fbf3}
.tl-item.warn::before{border-color:var(--c-amber);box-shadow:0 0 0 3px #fff7e8}
.tl-item.err::before{border-color:var(--c-rose);box-shadow:0 0 0 3px #fff0f3}
.tl-item .tl-t{font-size:12.7px;font-weight:600;margin-bottom:2px}
.tl-item .tl-d{font-size:11.6px;color:var(--t3);line-height:1.65}

/* ==========================================================================
   二十二、通知条
   ========================================================================== */
.notice,.info-bar{
  display:flex;gap:10px;align-items:flex-start;padding:11px 15px;border-radius:11px;font-size:12.5px;
  line-height:1.72;border:1px solid #dbe8fb;background:var(--grad-soft);color:#2b4a79;margin-bottom:10px;
}
.notice > svg,.info-bar > svg{width:16px;height:16px;color:var(--c-primary);flex:none;margin-top:2px}
.notice b,.info-bar b{color:#1c3f77}
.notice.ok,.info-bar--mint{border-color:#c9f0de;background:linear-gradient(135deg,#f2fdf9,#f7fffd);color:#0a6b4c}
.notice.ok > svg,.info-bar--mint > svg{color:var(--c-mint)}
.notice.warn,.info-bar--amber{border-color:#fce4ba;background:linear-gradient(135deg,#fffaf0,#fffdf7);color:#96630a}
.notice.warn > svg,.info-bar--amber > svg{color:var(--c-amber)}
.notice.err,.info-bar--rose{border-color:#fbd6df;background:linear-gradient(135deg,#fff5f7,#fffafb);color:#a81c42}
.notice.err > svg,.info-bar--rose > svg{color:var(--c-rose)}
.info-bar--violet{border-color:#e6ddfb;background:linear-gradient(135deg,#f7f3ff,#fbf9ff);color:#5b32b8}
.info-bar--violet > svg{color:var(--c-violet)}

/* ==========================================================================
   二十三、弹窗
   ========================================================================== */
.modal-mask{
  position:fixed;inset:0;z-index:9000;display:flex;align-items:center;justify-content:center;padding:24px;
  background:rgba(14,27,51,.36);backdrop-filter:blur(2.5px);animation:fadein .18s ease;
}
@keyframes fadein{from{opacity:0}to{opacity:1}}
@keyframes up{from{opacity:0;transform:translateY(12px) scale(.985)}to{opacity:1;transform:none}}
.modal{
  position:relative;background:var(--panel);border-radius:var(--r2);box-shadow:var(--sh3);
  display:flex;flex-direction:column;width:600px;max-width:94vw;max-height:88vh;
  animation:up .2s cubic-bezier(.2,.8,.3,1);
}
.modal.w520{width:520px}
.modal.w800,.modal--wide{width:860px}
.modal.w1000{width:1000px}
.modal.w1200,.modal--xwide{width:1060px}
.modal-h{display:flex;align-items:center;gap:10px;padding:15px 19px;border-bottom:1px solid var(--line2);flex:none}
.modal-h .m-t{font-size:14.6px;font-weight:600;flex:1;display:flex;align-items:center;gap:9px;color:var(--t1)}
.modal-h .m-t svg{width:17px;height:17px;color:var(--c-primary)}
.modal-h .m-x{
  width:28px;height:28px;border-radius:7px;border:1px solid transparent;background:transparent;cursor:pointer;
  display:flex;align-items:center;justify-content:center;color:var(--t3);transition:.15s;flex:none;
}
.modal-h .m-x:hover{background:#f2f6fc;color:var(--t1)}
.modal-h .m-x svg{width:15px;height:15px}
.modal-b{padding:18px 19px;overflow-y:auto;flex:1;min-height:0}
.modal-f{
  display:flex;align-items:center;gap:9px;padding:13px 19px;border-top:1px solid var(--line2);flex:none;
  background:#fcfdff;border-radius:0 0 var(--r2) var(--r2);
}
.modal-f .sp{flex:1}

/* ==========================================================================
   二十四、Toast（原版：右侧堆叠的浅底卡片）
   ========================================================================== */
.toast-root{position:fixed;right:20px;top:70px;z-index:9500;display:flex;flex-direction:column;gap:9px;pointer-events:none}
.toast{
  display:flex;align-items:flex-start;gap:9px;padding:11px 15px;border-radius:10px;background:#fff;
  box-shadow:0 10px 30px rgba(16,32,64,.15), 0 2px 6px rgba(16,32,64,.06);border:1px solid var(--line);
  font-size:12.7px;color:var(--t1);animation:rt .22s cubic-bezier(.2,.8,.3,1);max-width:352px;
  pointer-events:auto;line-height:1.6;
}
@keyframes rt{from{opacity:0;transform:translateX(22px)}to{opacity:1;transform:none}}
.toast svg{width:16px;height:16px;margin-top:1px}
.toast.ok{border-color:#c9f0de;background:linear-gradient(180deg,#fbfffd,#f4fdf9)}
.toast.ok svg{color:var(--c-mint)}
.toast.err{border-color:#fbd6df;background:linear-gradient(180deg,#fffafb,#fff5f7)}
.toast.err svg{color:var(--c-rose)}
.toast.warn{border-color:#fce4ba;background:linear-gradient(180deg,#fffdf8,#fffaf0)}
.toast.warn svg{color:var(--c-amber)}
.toast.info svg{color:var(--c-primary)}
.toast.out{opacity:0;transform:translateX(22px);transition:.25s}

/* ==========================================================================
   二十五、加载
   ========================================================================== */
.spin{display:inline-block;width:15px;height:15px;border:2px solid rgba(255,255,255,.36);
  border-top-color:#fff;border-radius:50%;animation:sp .7s linear infinite}
.spin.dark{border-color:rgba(37,99,235,.22);border-top-color:var(--c-primary)}
@keyframes sp{to{transform:rotate(360deg)}}
.loading{padding:52px;text-align:center;color:var(--t3);font-size:13px}
.loading .spin{margin-right:8px;vertical-align:-2px}

/* ==========================================================================
   二十六、分栏
   ========================================================================== */
.split{display:grid;grid-template-columns:minmax(0,1fr) 348px;gap:16px;align-items:start}
@media(max-width:1240px){.split{grid-template-columns:minmax(0,1fr)}}
.sticky-side{position:sticky;top:16px}

/* ==========================================================================
   二十七、凭证分录编辑表
   ========================================================================== */
.vch-lines{width:100%;border-collapse:collapse;font-size:12.6px}
.vch-lines th{background:#f8fafd;padding:8px;text-align:left;font-weight:600;color:var(--t2);
  border-bottom:1px solid var(--line);font-size:12px;white-space:nowrap}
.vch-lines th.num{text-align:right}
.vch-lines td{padding:3px 4px;border-bottom:1px solid var(--line2)}
.vch-lines .inp{padding:5px 8px;height:auto;font-size:12.5px;border-radius:6px}
.vch-lines td.num .inp{text-align:right;font-family:var(--mono)}
.vch-sum{
  display:flex;gap:16px;align-items:center;padding:9px 12px;background:#f9fbfe;border:1px solid var(--line2);
  border-radius:8px;font-size:12.5px;margin-top:10px;flex-wrap:wrap;
}
.vch-sum b{font-family:var(--mono);font-size:13.5px}
.vch-sum .ok{color:#0a7c56}
.vch-sum .no{color:#c81e4a}
/* 旧类名 .mini-tbl 别名 */
.mini-tbl{width:100%;border-collapse:collapse;font-size:12.5px}
.mini-tbl th{background:#f8fafd;padding:6px 8px;text-align:left;font-weight:600;color:var(--t2);
  border-bottom:1px solid var(--line);font-size:12px;white-space:nowrap}
.mini-tbl td{padding:3px 4px;border-bottom:1px solid var(--line2)}
.mini-tbl .inp{padding:5px 7px;height:auto;font-size:12.5px;border-radius:6px}

/* ==========================================================================
   二十八、图表
   ========================================================================== */
.chart{width:100%}
.chart svg{display:block;width:100%;height:auto;overflow:visible}
.chart-donut{display:flex;flex-wrap:wrap;align-items:center;gap:12px 20px;min-height:220px}
.donut-plot{flex:1 1 150px;min-width:0;max-width:240px;margin:0 auto}
.donut-plot svg{max-height:230px}
.donut-legend{flex:1 1 230px;min-width:0}
.donut-legend-row{display:grid;grid-template-columns:10px minmax(0,1fr) auto 3.5em;align-items:center;gap:8px;margin:10px 0;font-size:12px}
.donut-legend-dot{width:9px;height:9px;border-radius:3px}
.donut-legend-name{min-width:0;line-height:1.6;overflow-wrap:anywhere;color:var(--t1)}
.donut-legend-value,.donut-legend-pct{text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.donut-legend-value{color:var(--t1);font-weight:600}
.donut-legend-pct{color:var(--t3)}
.chart-box{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:13px 14px;box-shadow:var(--sh1)}
.chart-box h4{font-size:12.8px;font-weight:600;margin-bottom:3px;display:flex;align-items:center;gap:7px}
.chart-box h4 svg{width:14px;height:14px;color:var(--c-primary)}
.chart-box .sub{font-size:11.2px;color:var(--t4);margin-bottom:9px}
.legend{display:flex;flex-wrap:wrap;gap:13px;justify-content:center;margin-top:9px;font-size:11.5px;color:var(--t2)}
.legend span,.legend i{display:inline-flex;align-items:center;gap:5px;font-style:normal}
.legend i::before{content:"";width:9px;height:9px;border-radius:3px;background:var(--c-primary);display:inline-block}
.legend i.c2::before{background:var(--c-cyan)}
.legend i.c3::before{background:var(--c-mint)}
.legend i.c4::before{background:var(--c-amber)}
.legend i.c5::before{background:var(--c-violet)}
.legend span i{width:9px;height:9px;border-radius:2.5px;display:inline-block;flex:none}
.legend span i::before{display:none}

/* ==========================================================================
   二十九、代码块
   ========================================================================== */
pre.code{
  background:#f7fafd;border:1px solid var(--line2);color:#26456f;padding:11px 13px;border-radius:8px;
  overflow-x:auto;font-size:11.9px;font-family:var(--mono);line-height:1.85;margin:0;max-height:420px;
  white-space:pre;
}
pre.code .k,pre.code b{color:var(--c-primary);font-weight:600}
pre.code .v,pre.code em{font-style:normal;color:#b8730a;font-weight:600}
code.inline{background:#f1f5fa;padding:1px 6px;border-radius:5px;font-family:var(--mono);
  font-size:12.1px;color:#2b4a7d}

/* ==========================================================================
   三十、矩阵 / 权限表
   ========================================================================== */
.matrix{border:1px solid var(--line);border-radius:var(--r);overflow:auto;background:#fff;font-size:12.2px}
table.mx{border-collapse:separate;border-spacing:0;width:100%;font-size:12.1px}
table.mx th{background:#f8fafd;padding:9px 11px;font-weight:600;font-size:11.6px;color:var(--t2);
  border-bottom:1px solid var(--line);border-right:1px solid var(--line2);white-space:nowrap;text-align:center}
table.mx th:first-child{text-align:left;position:sticky;left:0;z-index:2;background:#f8fafd}
table.mx td{padding:7px 11px;border-bottom:1px solid var(--line2);border-right:1px solid var(--line2);text-align:center}
table.mx td:first-child{text-align:left;font-weight:500;position:sticky;left:0;background:#fff;z-index:1}
table.mx tbody tr:hover td{background:#f8fbff}
.matrix td.yes{color:#0a7c56;font-weight:600}
.matrix td.no{color:#cbd5e1}

/* ==========================================================================
   三十一、卡片小列表 / 迷你卡 / 徽章墙
   ========================================================================== */
.list-mini{display:flex;flex-direction:column}
.list-mini .lm{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px solid var(--line2);font-size:12.7px}
.list-mini .lm:last-child{border-bottom:0}
.list-mini .lm .lm-t{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.list-mini .lm .lm-s{font-size:11.5px;color:var(--t3);flex:0 0 auto}
.mini{background:#fff;border:1px solid var(--line);border-radius:var(--r);padding:12px 13px;box-shadow:var(--sh1);transition:.18s}
.mini:hover{box-shadow:var(--sh2);border-color:#cfdef5}
.mini h5{font-size:12.9px;font-weight:600;margin-bottom:4px;display:flex;align-items:center;gap:7px}
.mini h5 svg{width:14px;height:14px;color:var(--c-primary)}
.mini p{font-size:11.7px;color:var(--t3);line-height:1.66}
.pill-wall{display:flex;flex-wrap:wrap;gap:7px}
.pill{font-size:11.8px;padding:4.5px 11px;border-radius:20px;background:#f7fafe;border:1px solid var(--line);
  color:var(--t2);transition:.15s}
.pill:hover{border-color:#bcd2f4;color:var(--c-primary);background:#f2f7ff}
.pill b{color:var(--c-primary);font-weight:600}

/* ==========================================================================
   三十二、排版与工具类
   ========================================================================== */
.sep,.sep-h{height:1px;background:var(--line2);margin:14px 0}
.mt0{margin-top:0!important}.mt6{margin-top:6px}.mt10{margin-top:10px}.mt14{margin-top:14px}.mt20{margin-top:20px}
.mb0{margin-bottom:0!important}.mb6{margin-bottom:6px}.mb10{margin-bottom:10px}.mb14{margin-bottom:14px}
.tc{text-align:center}.tr{text-align:right}
.muted{color:var(--t3)}.small{font-size:11.8px}.mono{font-family:var(--mono)}
.nowrap{white-space:nowrap}
.row{display:flex;align-items:center;gap:9px}
.row.wrap{flex-wrap:wrap}
.flex1{flex:1;min-width:0}
.sp{flex:1}
.pointer{cursor:pointer}
.hidden,.hide{display:none !important}
.strong{font-weight:600}
.fs11{font-size:11px}.fs12{font-size:12px}
.inline{display:inline-flex;align-items:center;gap:5px}
.num{font-variant-numeric:tabular-nums}

/* ==========================================================================
   三十三、业务域选择器
   ========================================================================== */
.domain-picker{display:grid;grid-template-columns:repeat(auto-fill,minmax(196px,1fr));gap:8px;padding:12px 14px}
.domain-picker .dp{
  border:1px solid var(--line);border-radius:9px;padding:8px 11px;cursor:pointer;transition:.14s;background:#fff;
}
.domain-picker .dp:hover{border-color:#bcd2f2;box-shadow:var(--sh1);transform:translateY(-1px)}
.domain-picker .dp.on{border-color:var(--c-primary);background:var(--primary-50)}
.domain-picker .dp .d-n{font-size:12.8px;font-weight:600;display:flex;align-items:center;gap:6px;color:var(--t1)}
.domain-picker .dp .d-k{font-size:10.5px;color:var(--t3);font-family:var(--mono);margin-top:2px}
.domain-picker .dp .d-c{font-size:11px;color:var(--t2);margin-top:3px}
.domain-picker .dp .d-c b{color:var(--c-primary-d)}

/* ==========================================================================
   三十四、阶段分组标题
   ========================================================================== */
.stage-block{margin-bottom:14px}
.stage-block > .sb-t{
  display:flex;align-items:center;gap:9px;font-size:13px;font-weight:600;color:var(--t2);padding:7px 4px 7px 2px;
}
.stage-block > .sb-t .num{
  width:20px;height:20px;border-radius:6px;background:var(--grad);color:#fff;display:grid;place-items:center;
  font-size:11px;flex:none;
}

/* ==========================================================================
   三十五、在线考试 · 试卷磁贴
   ========================================================================== */
.exam-tile{
  background:var(--panel2);border:1px solid var(--line);border-radius:var(--r);
  padding:0;overflow:hidden;display:flex;flex-direction:column;transition:.18s;
}
.exam-tile:hover{border-color:#cfdef5;box-shadow:var(--sh2);transform:translateY(-1px)}
.exam-tile .et-h{display:flex;align-items:flex-start;gap:10px;padding:12px 14px 10px}
.exam-tile .et-h .t{font-size:13.4px;font-weight:600;line-height:1.4;color:var(--t1)}
.exam-tile .et-h .d{font-size:11.5px;color:var(--t3);margin-top:3px}
.exam-tile .et-h .r{margin-left:auto}
.exam-tile .et-b{padding:0 14px 14px}
.exam-tile .et-score{
  display:flex;align-items:baseline;gap:4px;margin-bottom:10px;
  font-size:22px;font-weight:700;font-variant-numeric:tabular-nums;color:var(--t1);
}
.exam-tile .et-score small{font-size:12px;font-weight:500;color:var(--t3)}

/* ==========================================================================
   三十六、响应式与打印
   ========================================================================== */
@media(max-width:1100px){
  :root{--sb-w:206px}
  .split{grid-template-columns:minmax(0,1fr)}
}
@media(max-width:900px){
  .login-card{grid-template-columns:1fr;min-height:0}
  .login-art{min-height:210px}
  .login-form{padding:30px 26px}
}
@media print{
  .sidebar,.topbar,.toolbar,.sb-foot,#toast-root {display:none!important}
  #app-root:not([hidden]){display:block!important}
  .content{overflow:visible;padding:0}
  .content::before{display:none}
  .card,.flow-stage{break-inside:avoid;box-shadow:none}
  .main::before{
    content:"泉州经贸职业技术学院 · 数智化综合实训平台";
    display:block;font-size:12pt;font-weight:700;color:#10305f;letter-spacing:.5px;
    padding-bottom:7pt;border-bottom:1.5pt solid #10305f;margin-bottom:12pt;
  }
}

/* ==========================================================================
   三十七、使用手册 / 内置帮助中心
   风格与全站一致：白底卡片 + 蓝青渐变强调；左侧目录 sticky，右侧正文。
   ========================================================================== */
.help-wrap{display:grid;grid-template-columns:304px minmax(0,1fr);gap:16px;align-items:start}

/* —— 左侧目录 —— */
.help-side{
  position:sticky;top:0;max-height:calc(100vh - 132px);display:flex;flex-direction:column;gap:10px;
  background:var(--panel);border:1px solid var(--line);border-radius:var(--r2);
  box-shadow:var(--sh1);padding:12px 12px 10px;
}
.help-sbox{position:relative;display:flex;align-items:center}
.help-sbox svg{position:absolute;left:9px;width:14px;height:14px;color:var(--t4);pointer-events:none}
.help-sbox .inp{
  width:100%;height:34px;padding:0 11px 0 29px;border:1px solid var(--line);border-radius:8px;
  background:#fbfdff;font-size:12.4px;transition:.15s;
}
.help-sbox .inp:focus{border-color:#a9c8f5;background:#fff;box-shadow:0 0 0 3px rgba(37,99,235,.09);outline:none}
.help-filters{display:flex;flex-wrap:wrap;gap:5px}
.help-filters button{
  border:1px solid var(--line);background:#fbfdff;color:var(--t2);cursor:pointer;
  font-size:11.4px;padding:3px 9px;border-radius:20px;transition:.14s;white-space:nowrap;
}
.help-filters button:hover{border-color:#bcd2f4;color:var(--c-primary);background:#f6faff}
.help-filters button.on{background:var(--grad);border-color:transparent;color:#fff;font-weight:600}

.help-nav{overflow-y:auto;flex:1;min-height:0;margin:0 -4px;padding:0 4px}
.help-nav::-webkit-scrollbar{width:7px}
.help-nav::-webkit-scrollbar-thumb{background:#dbe5f2;border-radius:4px}
.hg{margin-bottom:9px}
.hg-t{
  display:flex;align-items:center;gap:6px;font-size:11.2px;font-weight:600;color:var(--t3);
  letter-spacing:.4px;padding:5px 6px 4px;
}
.hg-t .hg-n{
  margin-left:auto;font-size:10.2px;font-weight:600;
  color:#5e7699;background:#eef3fa;border-radius:9px;padding:0 6px;line-height:15px;
}
.hg-b{display:flex;flex-direction:column;gap:2px}
.hi{
  display:flex;align-items:center;gap:8px;text-decoration:none;cursor:pointer;
  padding:6px 9px;border-radius:8px;font-size:12.5px;color:var(--t2);transition:.14s;border:1px solid transparent;
}
.hi span{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hi em{font-style:normal;font-size:10.4px;color:var(--t4);flex:none}
.hi:hover{background:#f4f8ff;color:var(--c-primary-d)}
.hi.on{
  background:var(--grad);color:#fff;font-weight:600;border-color:transparent;
  box-shadow:0 3px 10px rgba(37,99,235,.22);
}
.hi.on em{color:rgba(255,255,255,.82)}

.help-hits{overflow-y:auto;flex:1;min-height:0}
/* 当前身份搜不到、退回全量时的说明条：必须显眼，否则用户会把别的角色当成自己的 */
.help-hits-note{
  font-size:11.6px;line-height:1.6;color:#8a5300;background:#fff7e6;border:1px solid #ffe0a8;
  border-radius:8px;padding:7px 10px;margin-bottom:8px;
}
.hit{
  display:block;text-decoration:none;padding:9px 10px;border-radius:9px;border:1px solid var(--line2);
  margin-bottom:7px;background:#fcfdff;transition:.14s;
}
.hit:hover{border-color:#bcd2f4;background:#f7fbff;box-shadow:var(--sh1)}
.hit-t{display:flex;align-items:center;gap:8px;font-size:12.8px;font-weight:600;color:var(--t1)}
.hit-g{
  margin-left:auto;flex:none;font-size:10.4px;font-weight:500;color:#2c5fd0;
  background:#eef4ff;border:1px solid #d9e5fb;border-radius:20px;padding:1px 7px;
}
.hit-d{font-size:11.6px;color:var(--t3);line-height:1.62;margin-top:3px}
/* 命中片段：标题与概述都没含查询词时，说明这条为什么被搜到 */
.hit-w{font-size:11.2px;color:#6b7280;line-height:1.6;margin-top:4px;padding-top:4px;border-top:1px dashed var(--line2)}
mark{background:#fff2c9;color:#a15d00;border-radius:3px;padding:0 2px}

/* —— 右侧正文 —— */
.help-main{min-width:0}
.help-doc-h{
  display:flex;align-items:center;gap:12px;flex-wrap:wrap;
  padding:14px 18px;border:1px solid var(--line);border-bottom:0;
  border-radius:var(--r2) var(--r2) 0 0;
  background:linear-gradient(180deg,#fcfdff,#f7faff);
}
.help-doc-h .hd-t{display:flex;align-items:center;gap:9px;min-width:0}
.help-doc-h .hd-t svg{width:17px;height:17px;color:var(--c-primary);flex:none}
.help-doc-h h2{font-size:16.4px;font-weight:600;color:var(--t1);margin:0;letter-spacing:.2px}
.help-doc-h .hd-r{margin-left:auto;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.help-desc{
  font-size:13.2px;line-height:1.92;color:var(--t2);margin:0;padding:15px 18px;
  background:#fff;border:1px solid var(--line);border-top:0;border-bottom:0;
}
.hq{font-style:normal;color:var(--c-primary-d);font-weight:600}

.help-sec{padding:15px 18px;border:1px solid var(--line);border-top:0;background:#fff}
.help-sec:last-child{border-radius:0 0 var(--r2) var(--r2);border-bottom:1px solid var(--line)}
.help-sec-h{
  display:flex;align-items:center;gap:8px;font-size:13.2px;font-weight:600;color:var(--t1);
  margin:0 0 11px;padding-left:9px;border-left:3px solid var(--c-primary);
}
.help-sec-h svg{width:15px;height:15px;color:var(--c-primary);flex:none}
.help-sec-b{font-size:12.8px;color:var(--t2);line-height:1.85}

/* 操作步骤：用 CSS 计数器画序号圆点 */
.help-steps{list-style:none;counter-reset:hs;margin:0;padding:0;position:relative}
.help-steps::before{content:"";position:absolute;left:11px;top:9px;bottom:12px;width:2px;background:var(--line);border-radius:2px}
.help-steps li{counter-increment:hs;position:relative;padding:0 0 14px 34px}
.help-steps li:last-child{padding-bottom:0}
.help-steps li::before{
  content:counter(hs);position:absolute;left:0;top:1px;width:23px;height:23px;border-radius:50%;
  background:var(--grad);color:#fff;font-size:11.4px;font-weight:600;display:flex;align-items:center;justify-content:center;
  box-shadow:0 2px 6px rgba(37,99,235,.26);font-variant-numeric:tabular-nums;
}
.help-steps .hs-t{font-size:13px;font-weight:600;color:var(--t1);margin-bottom:3px}
.help-steps .hs-d{font-size:12.5px;color:var(--t2);line-height:1.86}

.help-req{margin:0;padding-left:20px}
.help-req li{margin-bottom:5px}
.help-req li:last-child{margin-bottom:0}

.help-note{
  display:flex;gap:10px;align-items:flex-start;padding:12px 14px;border-radius:10px;
  background:#f4f8ff;border:1px solid #dbe7fb;color:#20407a;
}
.help-note.mint{background:#f2fcf8;border-color:#cdeee0;color:#0a6a4c}
.help-note svg{width:15px;height:15px;flex:none;margin-top:2px;opacity:.9}
.help-note div{line-height:1.88}

.help-faq details{border:1px solid var(--line2);border-radius:9px;margin-bottom:7px;background:#fcfdff;overflow:hidden}
.help-faq details[open]{border-color:#dbe7fb;background:#f9fcff}
.help-faq summary{
  cursor:pointer;padding:9px 12px;font-size:12.6px;font-weight:600;color:var(--t1);list-style:none;
  display:flex;align-items:center;gap:8px;
}
.help-faq summary::-webkit-details-marker{display:none}
.help-faq summary::before{
  content:"?";flex:none;width:16px;height:16px;border-radius:50%;background:#eef4ff;color:#2c5fd0;
  font-size:10.6px;font-weight:700;display:flex;align-items:center;justify-content:center;
}
.help-faq .hf-a{padding:0 12px 11px 36px;font-size:12.4px;color:var(--t2);line-height:1.88}

.help-shots{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}
.help-shot{
  margin:0;border:1px solid var(--line);border-radius:10px;overflow:hidden;background:#fff;
  box-shadow:var(--sh1);
}
.help-shot img{display:block;width:100%;height:auto;border-bottom:1px solid var(--line2)}
.help-shot figcaption{
  font-size:11.4px;color:var(--t3);padding:7px 10px;background:linear-gradient(180deg,#fcfdff,#f9fbff);
}
.help-shot.miss{background:
  repeating-linear-gradient(45deg,#fbfdff,#fbfdff 9px,#f5f9ff 9px,#f5f9ff 18px);}
.help-shot.miss img{display:none}
.help-shot.miss::before{
  content:"配图待生成";display:flex;align-items:center;justify-content:center;height:132px;
  font-size:11.6px;color:var(--t4);border-bottom:1px dashed var(--line);
}

.help-tips{margin:0;padding-left:20px}
.help-tips li{margin-bottom:5px}
.help-tips li:last-child{margin-bottom:0}

/* —— 弹窗形态（页面级「使用说明」） —— */
.help-modal{margin:-4px 0}
.help-modal .help-doc-h{
  border-radius:var(--r);border-bottom:1px solid var(--line);margin-bottom:0;
}
.help-modal .help-desc{border:1px solid var(--line);border-top:0;border-radius:0}
.help-modal .help-sec:last-child{border-radius:0 0 var(--r) var(--r)}
.help-modal .help-shots{grid-template-columns:repeat(auto-fill,minmax(268px,1fr))}

/* —— 页面内就地帮助入口 —— */
.help-inline{color:var(--c-primary)!important;flex:none}
.help-inline:hover{background:#eef4ff!important}
.hint-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}

@media(max-width:1180px){
  .help-wrap{grid-template-columns:1fr}
  .help-side{position:static;max-height:none}
  .help-nav{max-height:340px}
}
@media print{
  .help-side,.help-filters,.help-inline{display:none!important}
  .help-wrap{grid-template-columns:1fr}
  .help-sec,.help-desc,.help-doc-h{break-inside:avoid}
  .help-faq details{break-inside:avoid}
  .help-faq details .hf-a{display:block!important}
}

/* ==========================================================================
   三十八、数据上报：富文本编辑器 / 附件上传 / 交付物查阅
   —— 学生上报交付物（图文正文 ＋ 任意附件）、教师批改与退回、管理员核查，
      三类角色共用同一套组件，仅以只读/可写区分。
   ========================================================================== */

/* ------------------------------------------------------------------ 编辑器 */
.rt{
  border:1px solid var(--line);border-radius:var(--r);background:var(--panel);
  overflow:hidden;transition:border-color .16s,box-shadow .16s;
}
.rt:focus-within{border-color:#9fc2ff;box-shadow:0 0 0 3px rgba(37,99,235,.10)}
.rt-bar{
  display:flex;flex-wrap:wrap;gap:0;align-items:center;
  padding:5px 6px;background:linear-gradient(180deg,#fcfdff,#f7faff);
  border-bottom:1px solid var(--line);user-select:none;
}
.rt-bar.is-off{opacity:.45;pointer-events:none}
.rt-g{display:flex;align-items:center;gap:2px;padding:0 5px}
.rt-g+.rt-g{border-left:1px solid var(--line2)}
.rt-b{
  min-width:26px;height:26px;padding:0 6px;border:0;border-radius:6px;background:transparent;
  color:var(--t2);font-size:12.5px;line-height:1;cursor:pointer;
  display:inline-flex;align-items:center;justify-content:center;gap:3px;
}
.rt-b:hover{background:#eaf1ff;color:var(--c-primary-d)}
.rt-b.on{background:var(--c-primary);color:#fff}
.rt-b b,.rt-b i,.rt-b u,.rt-b s{font-size:12.5px;font-style:normal;text-decoration:none;font-weight:700}
.rt-edit i{font-style:italic}.rt-edit u{text-decoration:underline}

.rt-edit{
  /* 占位提示是 absolute 的 ::before，必须让编辑器自身成为定位基准：
     之前 .rt-edit 是 static，::before 只能挂到 .modal（relative）上，
     结果提示既不待在编辑器左上角、也不受编辑器 overflow 裁剪，
     弹窗一滚动它就跟着飘到别处（截图里「提示跑到框中间」就是这个原因）。 */
  position:relative;
  min-height:220px;max-height:56vh;overflow:auto;padding:14px 16px;
  font-size:13.5px;line-height:1.85;color:var(--t1);outline:none;
  word-break:break-word;
}
.rt-edit.dragging{background:#f2f7ff;box-shadow:inset 0 0 0 2px #9fc2ff}
.rt-edit.is-empty::before{
  content:attr(data-ph);color:var(--t4);pointer-events:none;
  /* 左/上取与内边距一致，右边界收住：长提示会在框内换行，不会横向溢出 */
  position:absolute;left:16px;right:16px;top:14px;
}
.rt-edit>p:first-child{margin-top:0}
.rt-edit p{margin:0 0 8px}
.rt-edit h2{font-size:17px;margin:14px 0 8px;font-weight:700;color:var(--t1)}
.rt-edit h3{font-size:14.5px;margin:12px 0 6px;font-weight:700;color:var(--t1)}
.rt-edit ul,.rt-edit ol{margin:6px 0 10px;padding-left:24px}
.rt-edit ul{list-style:disc}.rt-edit ol{list-style:decimal}
.rt-edit li{margin:3px 0}
.rt-edit blockquote{
  margin:8px 0;padding:6px 12px;border-left:3px solid var(--c-cyan);
  background:#f6fbfd;color:var(--t2);border-radius:0 var(--r) var(--r) 0;
}
.rt-edit pre,.rt-edit code{
  font-family:ui-monospace,Consolas,Menlo,monospace;font-size:12.5px;
  background:#f5f8fd;border-radius:6px;
}
.rt-edit pre{padding:10px 12px;overflow:auto;white-space:pre-wrap}
.rt-edit code{padding:1px 5px}
.rt-edit img{max-width:100%;height:auto;border-radius:6px;margin:6px 0;display:block}
.rt-edit a{color:var(--c-primary);text-decoration:underline}
.rt-edit table{width:100%;border-collapse:collapse;margin:8px 0;font-size:12.5px}
.rt-edit table td,.rt-edit table th{border:1px solid var(--line);padding:6px 9px}
.rt-foot{
  display:flex;align-items:center;gap:10px;padding:6px 12px;
  border-top:1px solid var(--line2);background:#fbfdff;
}
.rt-count{font-size:11.5px;color:var(--t3);font-variant-numeric:tabular-nums}
.rt-hint{margin-left:auto;font-size:11.5px;color:var(--t4)}

/* ------------------------------------------------------- 只读富文本渲染 */
.rt-view{
  font-size:13.5px;line-height:1.9;color:var(--t1);word-break:break-word;
  padding:4px 2px;max-height:46vh;overflow:auto;
}
.rt-view p{margin:0 0 9px}
.rt-view h2{font-size:16.5px;margin:16px 0 8px;font-weight:700}
.rt-view h3{font-size:14.5px;margin:12px 0 6px;font-weight:700}
.rt-view ul,.rt-view ol{margin:6px 0 10px;padding-left:24px}
.rt-view ul{list-style:disc}.rt-view ol{list-style:decimal}
.rt-view li{margin:3px 0}
.rt-view blockquote{margin:8px 0;padding:6px 12px;border-left:3px solid var(--c-cyan);background:#f6fbfd;color:var(--t2)}
.rt-view pre{padding:10px 12px;background:#f5f8fd;border-radius:6px;overflow:auto;white-space:pre-wrap;
  font-family:ui-monospace,Consolas,Menlo,monospace;font-size:12.5px}
.rt-view code{font-family:ui-monospace,Consolas,Menlo,monospace;font-size:12.5px;background:#f5f8fd;padding:1px 5px;border-radius:4px}
.rt-view img{max-width:100%;height:auto;border-radius:6px;margin:6px 0;display:block;border:1px solid var(--line2)}
.rt-view a{color:var(--c-primary);text-decoration:underline}
.rt-view table{width:100%;border-collapse:collapse;margin:8px 0;font-size:12.5px}
.rt-view table td,.rt-view table th{border:1px solid var(--line);padding:6px 9px}
.rt-view table th{background:#f7faff;font-weight:600}

/* ------------------------------------------------------------ 附件清单 */
.att-box{margin-top:12px}
.att-h{display:flex;align-items:center;gap:8px;margin-bottom:8px}
.att-h b{font-size:12.5px;color:var(--t2)}
.att-list{display:flex;flex-direction:column;gap:6px}
.att{
  display:flex;align-items:center;gap:10px;padding:7px 10px;
  border:1px solid var(--line);border-radius:var(--r);background:#fbfdff;
}
.att:hover{border-color:#bcd4f8;background:#f7faff}
.att .a-i{
  flex:none;width:28px;height:28px;border-radius:7px;display:flex;align-items:center;justify-content:center;
  background:#eef4ff;color:var(--c-primary);
}
.att .a-n{flex:1;min-width:0;font-size:12.5px;color:var(--t1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.att .a-m{font-size:11px;color:var(--t3);flex:none;font-variant-numeric:tabular-nums}
.att .a-op{flex:none;display:flex;gap:4px}
.att-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(128px,1fr));gap:8px;margin-top:8px}
.att-thumb{
  position:relative;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;
  background:#f7faff;cursor:zoom-in;aspect-ratio:4/3;display:flex;align-items:center;justify-content:center;
}
.att-thumb img{width:100%;height:100%;object-fit:cover;display:block}
.att-thumb .t-n{
  position:absolute;left:0;right:0;bottom:0;padding:3px 6px;font-size:10.5px;color:#fff;
  background:linear-gradient(180deg,rgba(14,27,51,0),rgba(14,27,51,.72));
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.att-empty{
  padding:10px 12px;border:1px dashed var(--line);border-radius:var(--r);
  color:var(--t3);font-size:12.5px;text-align:center;background:#fcfdff;
}
.att-drop{
  margin-top:8px;padding:12px;border:1px dashed #bcd4f8;border-radius:var(--r);
  text-align:center;color:var(--t3);font-size:12.5px;background:#fafdff;cursor:pointer;
}
.att-drop:hover{background:#f4f9ff;border-color:#9fc2ff;color:var(--c-primary)}
.att-drop.dragging{background:#eef5ff;border-color:var(--c-primary);color:var(--c-primary-d)}

/* ------------------------------------------------------ 交付物查看弹窗 */
.dlv-head{display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-bottom:12px}
.dlv-sec{border:1px solid var(--line);border-radius:var(--r);margin-bottom:12px;overflow:hidden}
.dlv-sec>.s-h{
  display:flex;align-items:center;gap:8px;padding:8px 12px;
  background:linear-gradient(180deg,#fcfdff,#f9fbff);border-bottom:1px solid var(--line);
}
.dlv-sec>.s-h b{font-size:12.5px;color:var(--t1)}
.dlv-sec>.s-h .s-r{margin-left:auto;display:flex;gap:6px;align-items:center}
.dlv-sec>.s-b{padding:12px 14px}

/* ------------------------------------------------- 分项打分（第四十轮）
   一行一个维度：名称 / 权重 / 得分 / 折算。四列固定宽度，得分框用等宽数字，
   教师上下扫的时候四个输入框是齐的 —— 用 flex 自适应会让中文维度名长短
   把输入框推得参差不齐。 */
.rv-rub{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:#fff}
.rv-rub-h{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#f9fbff;border-bottom:1px solid var(--line)}
.rv-rub-h b{font-size:12.5px;color:var(--t1)}
.rv-rub-list{padding:4px 0;max-width:580px}
/* 四列固定宽度 + 整块限宽：名字列若用 1fr 撑满 1000px 的卡片，
   权重与得分会被推到最右边，中间留一大片空白 —— 看着像两列断开的表。 */
.rv-rub-th,.rv-rub-row{display:grid;grid-template-columns:minmax(0,1fr) 58px 92px 68px;align-items:center;gap:8px;padding:5px 12px}
.rv-rub-th{font-size:10.5px;color:var(--t3);padding-bottom:0}
.rv-rub-th span:nth-child(n+2),.rv-rub-row .w,.rv-rub-row .c{text-align:right}
.rv-rub-row .n{font-size:12.5px;color:var(--t1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rv-rub-row .w{font-size:12px;color:var(--t3);font-variant-numeric:tabular-nums}
.rv-rub-row .inp{height:30px;padding:0 8px;text-align:right;font-variant-numeric:tabular-nums}
.rv-rub-row .c{font-size:12.5px;color:var(--c-primary-d);font-weight:600;font-variant-numeric:tabular-nums}
/* 合计行通栏：只做到表格宽度会在卡片右侧留一个「L 形」断口，看着像没画完 */
.rv-rub-f{display:flex;align-items:center;gap:8px;padding:8px 12px;border-top:1px dashed var(--line);background:#fcfdff}
.rv-rub-f b{font-size:16px;color:var(--c-primary-d);font-variant-numeric:tabular-nums}
/* 学生端「本场评分标准」（第四十二轮）：一行一个维度，权重用一条渐变条表示 ——
   百分比数字读起来是「30」，条形读起来是「不到三分之一」，后者更容易比较。 */
.rub-lead{font-size:12.5px;color:var(--t2);line-height:1.7;margin-bottom:10px}
.rub-list{border:1px solid var(--line);border-radius:12px 12px 0 0;overflow:hidden}
.rub-row{display:grid;grid-template-columns:minmax(0,170px) minmax(0,1fr) 52px;align-items:center;gap:10px;padding:9px 12px;border-bottom:1px solid var(--line2)}
.rub-row:last-child{border-bottom:0}
.rub-row .n{font-size:12.5px;color:var(--t1);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rub-row .bar{height:8px;border-radius:999px;background:#f1f5fa;overflow:hidden}
.rub-row .bar i{display:block;height:100%;border-radius:999px;background:var(--grad)}
.rub-row .w{font-size:12px;color:var(--t2);text-align:right;font-variant-numeric:tabular-nums}
.rub-f{display:flex;justify-content:space-between;align-items:center;padding:8px 12px;margin-bottom:0;
  border:1px solid var(--line);border-top:0;border-radius:0 0 12px 12px;background:#fbfcfe;font-size:12px;color:var(--t3)}
.rub-f b{font-size:13px;color:var(--t1)}
.rub-inline{display:flex;align-items:center;gap:8px;margin:-2px 0 12px;padding:8px 11px;
  border:1px dashed var(--line);border-radius:10px;background:#fbfcfe;font-size:11.5px;color:var(--t3)}
.rub-inline b{font-weight:500;color:var(--t2);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.rub-inline .btn{margin-left:auto;flex:none}

/* 编辑标准：名称占满，权重窄，删除按钮贴右 */
.rv-edit-row{display:grid;grid-template-columns:minmax(0,1fr) 90px 14px auto;align-items:center;gap:6px;margin-bottom:6px}
.rv-edit-row .inp{height:32px}
.rv-edit-row .u{font-size:12px;color:var(--t3);text-align:center}
.dlv-meta{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:10px 18px}
.dlv-meta .m{display:flex;flex-direction:column;gap:2px}
.dlv-meta .m span{font-size:11px;color:var(--t3)}
.dlv-meta .m b{font-size:12.5px;color:var(--t1);font-weight:600}
.dlv-return{
  border:1px solid #fcd9e0;background:#fff6f8;border-radius:var(--r);padding:10px 12px;
  color:#a8123a;font-size:12.5px;line-height:1.7;margin-bottom:12px;
}
.dlv-return b{color:#8c1030}
.dlv-score{
  display:flex;align-items:baseline;gap:6px;
}
.dlv-score b{font-size:26px;color:var(--c-primary-d);font-variant-numeric:tabular-nums}
.dlv-score i{font-size:12px;color:var(--t3);font-style:normal}
.dim-list{display:flex;flex-wrap:wrap;gap:6px;margin-top:8px}
.dim{
  font-size:11.5px;color:var(--t2);background:#eef4ff;border:1px solid #dbe7fb;
  border-radius:999px;padding:3px 10px;
}
/* 分项里的权重（第四十轮）：同一枚胶囊里，权重比分数次要，压成灰色小字 */
.dim em{font-style:normal;font-size:10.5px;color:var(--t3);margin-left:3px}
.dlv-lock{
  display:flex;align-items:center;gap:8px;padding:9px 12px;border-radius:var(--r);
  background:#f6f8fc;border:1px solid var(--line);color:var(--t2);font-size:12.5px;
}

/* 图片灯箱 */
.imgbox{
  position:fixed;inset:0;z-index:120;background:rgba(9,17,35,.86);
  display:flex;align-items:center;justify-content:center;padding:32px;cursor:zoom-out;
}
.imgbox img{max-width:94vw;max-height:90vh;border-radius:8px;box-shadow:0 20px 60px rgba(0,0,0,.5);background:#fff}
.imgbox .ib-x{
  position:absolute;top:18px;right:22px;color:#fff;opacity:.75;font-size:13px;
  display:flex;align-items:center;gap:6px;
}
.imgbox .ib-x:hover{opacity:1}
.imgbox .ib-n{
  position:absolute;bottom:20px;left:0;right:0;text-align:center;color:#dfe8f7;font-size:12.5px;
}

@media(max-width:900px){
  .rt-edit{max-height:none}
  .att-grid{grid-template-columns:repeat(auto-fill,minmax(104px,1fr))}
}

/* ==========================================================================
   业务域导航中间页（需求#5）+ 台账统计报表（需求#6/#7）
   ========================================================================== */
.guide-card{
  padding:52px 28px;text-align:center;background:var(--panel);
}
.guide-card .gc-i{color:var(--c-primary);margin-bottom:14px;opacity:.9}
.guide-card .gc-i svg{width:40px;height:40px}
.guide-card .gc-t{font-size:17px;font-weight:600;color:var(--t1);margin-bottom:8px}
.guide-card .gc-d{font-size:13px;color:var(--t2);line-height:1.75;max-width:640px;margin:0 auto}
.guide-card .gc-d.muted{font-size:12px;color:var(--t4);margin-top:6px}

.rpt-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.rpt-panel{background:var(--panel-2,#fbfcfe);border:1px solid var(--line2,#eef1f6);border-radius:var(--r,12px);padding:14px 14px 6px}
.rpt-panel .rp-t{display:flex;align-items:center;gap:7px;font-size:12.8px;font-weight:600;color:var(--t1);margin-bottom:4px}
.rpt-panel .rp-t svg{width:14px;height:14px;color:var(--c-primary)}
@media(max-width:1240px){.rpt-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:760px){.rpt-grid{grid-template-columns:1fr}}

/* 统计分析 · 自动数据分析报告 */
.rpt-report{margin:8px 0 4px;padding-left:18px;display:flex;flex-direction:column;gap:7px;font-size:13px;line-height:1.7;color:var(--t1,#253244)}
.rpt-report li::marker{color:var(--c-primary)}

/* ========================================================= 学习分析（第四十一轮）
   结构：一句话结论 → 四个指标 → 五段（画像 / 趋势 / 薄弱 / 明细 / 诊断）。
   每段一个小标题带序号，是为了让长页面有「章节」可循 —— 一屏六张图而没有
   分段时，学生只会看到一片图，不知道该先看哪张。 */
.ana-brief{
  display:flex;align-items:center;gap:14px;padding:14px 16px;margin-bottom:14px;
  border:1px solid #e2ecfb;border-radius:14px;
  background:linear-gradient(120deg,#f2f7ff 0%,#f8fbff 46%,#f2fbff 100%);
}
.ana-brief-ic{
  width:42px;height:42px;flex:none;border-radius:12px;display:flex;align-items:center;justify-content:center;
  color:#fff;background:linear-gradient(135deg,#1d4ed8,#06b6d4);box-shadow:0 6px 16px rgba(29,78,216,.22);
}
.ana-brief-tx{flex:1;min-width:0;font-size:13px;line-height:1.75;color:var(--t2)}
.ana-brief-tx>b{display:block;font-size:11px;font-weight:600;color:var(--t3);letter-spacing:.4px;margin-bottom:1px}
.ana-brief-tx b{color:var(--t1)}
.ana-brief-k{display:flex;flex:none}
.ana-brief-k>div{padding:0 15px;border-left:1px solid #dbe7f7;text-align:center;min-width:72px}
.ana-brief-k>div:first-child{border-left:0;padding-left:0}
.ana-brief-k span{display:block;font-size:10.5px;color:var(--t3)}
.ana-brief-k b{font-size:19px;color:var(--c-primary-d);font-variant-numeric:tabular-nums;line-height:1.2}
.ana-brief-k i{font-style:normal;font-size:11px;color:var(--t3);margin-left:1px}

.ana-sec{margin-bottom:4px}
.ana-sec-h{display:flex;align-items:center;gap:8px;margin:20px 2px 10px}
.ana-sec-h .n{
  width:20px;height:20px;border-radius:6px;background:#eaf1ff;color:#1d4ed8;
  font-size:11.5px;font-weight:700;display:flex;align-items:center;justify-content:center;
}
.ana-sec-h b{font-size:14px;color:var(--t1)}
.ana-sec-h .d{font-size:12px;color:var(--t3)}

.ana-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:14px}
.ana-c{
  background:#fff;border:1px solid var(--line);border-radius:12px;padding:12px 12px 8px;
  display:flex;flex-direction:column;min-width:0;
}
.ana-c.span2{grid-column:span 2}
.ana-c-h{display:flex;align-items:baseline;gap:8px;margin-bottom:6px;flex-wrap:wrap}
.ana-c-h b{font-size:12.8px;color:var(--t1)}
.ana-c-h span{font-size:11px;color:var(--t3)}
.ana-c-b{flex:1;min-width:0}

.ana-mix-wrap{display:flex;flex-direction:column;gap:4px}
.ana-mix{display:flex;flex-direction:column;gap:5px;margin-top:-4px}
.ana-mix-r{display:grid;grid-template-columns:64px minmax(0,1fr);align-items:center;gap:8px;font-size:11.5px;color:var(--t2)}
.ana-note{font-size:10.5px;color:var(--t3);line-height:1.65;margin-top:2px}
.ana-mini{display:flex;gap:16px;flex-wrap:wrap;padding:4px 2px 2px;font-size:11px;color:var(--t3)}
.ana-mini b{font-size:13px;color:var(--t1);font-variant-numeric:tabular-nums;margin:0 1px}
.ana-none{
  display:flex;flex-direction:column;align-items:center;gap:8px;padding:26px 12px;
  color:var(--t3);font-size:12px;text-align:center;line-height:1.7;
}
.ana-none svg{opacity:.45}
.ana-report{padding:2px 2px 4px}
@media(max-width:1240px){
  .ana-grid{grid-template-columns:repeat(2,minmax(0,1fr))}
  .ana-c.span2{grid-column:span 2}
}
/* 打印：三列压成两列（A4 竖版三列会挤成一堆小字），卡片不许跨页断开 */
@media print{
  /* 外壳的紫粉渐变在纸上没有意义：有的浏览器会打印背景，整页会糊成一片淡紫 */
  body.lx-body{background:#fff!important}
  .ana-brief{break-inside:avoid;background:#fff!important;border-color:#d8dde6}
  .ana-brief-k b{color:#111!important}
  .ana-grid{grid-template-columns:repeat(2,minmax(0,1fr));gap:8pt}
  .ana-c{break-inside:avoid;box-shadow:none!important;border-color:#d8dde6}
  .ana-sec-h{margin:10pt 2pt 6pt}
  .ana-note,.ana-mini{color:#555!important}
  .ana-none{padding:14px 8px}
}
@media(max-width:760px){
  .ana-grid{grid-template-columns:1fr}
  .ana-c.span2{grid-column:auto}
  .ana-brief{flex-wrap:wrap}
  .ana-brief-k{width:100%;justify-content:space-between;padding-top:10px;border-top:1px dashed #dbe7f7}
  .ana-brief-k>div{padding:0 8px}
}

/* AI 助手 · 问答界面 */
.ai-msgs{max-height:460px;overflow-y:auto;padding:6px 2px;display:flex;flex-direction:column;gap:12px}
.ai-empty{text-align:center;color:var(--t2,#7c8aa0);font-size:13px;padding:34px 10px;line-height:1.9}
.ai-empty svg{color:var(--c-primary);opacity:.6}
.ai-msg{display:flex;flex-direction:column;gap:3px;max-width:86%}
.ai-msg.me{align-self:flex-end;align-items:flex-end}
.ai-role{font-size:11px;color:var(--t2,#7c8aa0)}
.ai-bubble{background:#f4f7fc;border:1px solid var(--line2,#e8edf5);border-radius:12px 12px 12px 4px;padding:9px 13px;font-size:13.2px;line-height:1.75;word-break:break-word}
.ai-msg.me .ai-bubble{background:var(--c-primary,#2f5bea);color:#fff;border-color:transparent;border-radius:12px 12px 4px 12px}
.ai-bubble.ai-thinking{color:var(--t2,#7c8aa0);font-style:italic}
.ai-bubble .ai-h2{font-weight:700;font-size:13.8px;margin:6px 0 2px}
.ai-bubble .ai-h3{font-weight:600;margin:5px 0 2px}
.ai-bubble .ai-li{padding-left:2px}
.ai-bubble .ai-entry{font-family:var(--mono,ui-monospace,monospace);background:rgba(47,91,234,.06);border-radius:4px;padding:1px 6px;margin:2px 0;display:inline-block}
.ai-msg.me .ai-entry{background:rgba(255,255,255,.16)}
.ai-preset-chips{display:flex;flex-wrap:wrap;gap:6px;margin:10px 0 8px}
.ai-preset-chips .btn{font-size:11.5px}
.ai-input-row{display:flex;gap:8px;align-items:flex-end}
.ai-input-row textarea{flex:1;resize:none;min-height:52px}
.ai-input-row textarea:focus{outline:2px solid var(--c-primary,#2f5bea);outline-offset:-1px}
/* AI 开通指南 */
.ai-g-t{display:flex;align-items:center;gap:7px;font-weight:600;font-size:13px;margin-bottom:10px}
.ai-g-steps{display:flex;flex-direction:column;gap:12px}
.ai-g-step{display:flex;gap:10px;align-items:flex-start;line-height:1.8;font-size:13px}
.ai-g-step .n{flex:none;width:22px;height:22px;border-radius:50%;background:var(--c-primary,#2f5bea);color:#fff;font-size:12px;font-weight:700;display:flex;align-items:center;justify-content:center;margin-top:2px}
.ai-preset-table{border-collapse:collapse;width:100%;margin:8px 0;font-size:12.5px}
.ai-preset-table th,.ai-preset-table td{border:1px solid var(--line2,#e8edf5);padding:6px 9px;text-align:left}
.ai-preset-table th{background:#f6f8fc;font-weight:600}
.ai-preset-table tr:first-child td{background:rgba(47,91,234,.05)}

/* ==========================================================================
   单据富文本 + 附件（需求#4）
   ========================================================================== */
.biz-rt-box,.biz-att-box{margin-top:14px;border:1px solid var(--line);border-radius:var(--r);padding:12px 14px;background:var(--panel-2,#fbfcfe)}
.brt-h{display:flex;align-items:center;gap:7px;font-size:13px;font-weight:600;color:var(--t1);margin-bottom:3px}
.brt-h svg{width:14px;height:14px;color:var(--c-primary)}
.brt-hint{font-size:11.5px;color:var(--t4);margin-bottom:10px}
.biz-att-toolbar{margin-bottom:8px}

.vkv-grid{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:8px 14px;margin-bottom:4px}
.vkv{display:flex;align-items:baseline;gap:8px;padding:8px 10px;background:var(--panel-2,#fbfcfe);border:1px solid var(--line2,#eef1f6);border-radius:8px}
.vkv span{font-size:11.5px;color:var(--t3);flex:none;min-width:76px}
.vkv b{font-size:12.8px;color:var(--t1);font-weight:600;word-break:break-all}
@media(max-width:700px){.vkv-grid{grid-template-columns:1fr}}

/* 数据字典维护（W13） */
.dict-nav{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-radius:8px;cursor:pointer;transition:background .15s}
.dict-nav b{font-size:12.8px;color:var(--t1);font-weight:600;display:block}
.dict-nav span{font-size:11px;color:var(--t3);display:block;margin-top:1px}
.dict-nav:hover{background:var(--panel-2,#fbfcfe)}
.dict-nav.on{background:var(--c-primary,#2f6bff);color:#fff}
.dict-nav.on b{color:#fff}
.dict-nav.on span{color:rgba(255,255,255,.75)}
.dict-nav .dot{width:8px;height:8px;border-radius:50%;display:inline-block;flex:none}

@media print{
  .rt-bar,.rt-foot,.att-drop,.att .a-op{display:none!important}
  .rt-edit,.rt-view{max-height:none;overflow:visible;border:0;padding:0}
  /* 打印时空编辑器的占位提示没有意义，且 padding 归零后位置会走样 */
  .rt-edit.is-empty::before{display:none}
  .dlv-sec{break-inside:avoid}
}

/* ============ 业务操作 · 柠檬云云进销存式「左侧菜单 + 悬停四栏大菜单」（2026-10-18） ============ */
.biz-wrap{position:relative}
.biz-nav{position:relative;display:flex;align-items:stretch;padding:0;
  background:#fff;border:1px solid var(--line);border-radius:12px}
@keyframes bizIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
.biz-left{flex:0 0 196px;border-right:1px solid var(--line);padding:8px 6px;display:flex;flex-direction:column;gap:2px}
.biz-left-item{display:flex;align-items:center;gap:8px;width:100%;padding:10px 12px;border:0;border-radius:8px;
  background:transparent;cursor:pointer;font-size:13px;font-weight:600;color:var(--t1);text-align:left;transition:.12s}
.biz-left-item i{font-style:normal;margin-left:auto;font-size:11px;color:var(--t3);background:var(--bg);border-radius:9px;padding:1px 7px;font-weight:500}
.biz-left-item svg{color:var(--t3)}
.biz-left-item:hover{background:var(--primary-50);color:var(--c-primary-d)}
.biz-left-item.on{background:var(--c-primary);color:#fff}
.biz-left-item.on svg,.biz-left-item.on i{color:#fff}
.biz-left-item.on i{background:rgba(255,255,255,.22)}
.biz-right{flex:1;min-height:340px;padding:6px 0 10px;background:#fff;border-radius:0 12px 12px 0}
.biz-mega{display:flex;align-items:flex-start;gap:0;flex-wrap:wrap}
.biz-mcol{flex:1 1 220px;min-width:190px;padding:10px 10px 8px;border-right:1px dashed var(--line);max-height:360px;overflow:auto}
.biz-mcol:last-child{border-right:0}
.biz-mcol-t{display:flex;align-items:center;gap:6px;font-size:12.5px;font-weight:700;color:var(--t2);padding:2px 4px 8px;letter-spacing:.5px}
.biz-mcol-t i{font-style:normal;font-size:11px;color:var(--t3);font-weight:500}
.biz-mi{display:flex;align-items:center;gap:7px;width:calc(100% - 8px);margin:2px 4px;padding:8px 10px;border:0;border-radius:7px;
  background:transparent;cursor:pointer;font-size:12.8px;color:var(--t1);text-align:left;transition:.12s}
.biz-mi svg{color:var(--c-primary);flex:0 0 auto}
.biz-mi em{font-style:normal;margin-left:auto;font-size:10.5px;color:var(--t3);white-space:nowrap}
.biz-mi:hover{background:var(--primary-50);color:var(--c-primary-d)}
.biz-mi.on{background:var(--primary-50);color:var(--c-primary-d);font-weight:600}
.biz-mi span{flex:0 1 auto}
.biz-mega-empty{padding:30px}

/* ------------------------- 组织结构批量排序（A9） ------------------------- */
.ord-tip { font-size: 12px; color: #6b7280; line-height: 1.7; margin-bottom: 10px; }
.ord-bar { display: flex; align-items: center; gap: 8px; padding: 8px 10px; margin-bottom: 8px;
  background: #faf7ff; border: 1px solid #ece4f6; border-radius: 10px; }
.ord-bar .sp { flex: 1; }
.ord-all { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #4b5563; cursor: pointer; }
.ord-list { max-height: 420px; overflow: auto; border: 1px solid #eef0f4; border-radius: 10px; }
.ord-row { display: flex; align-items: center; gap: 10px; padding: 9px 12px; cursor: pointer;
  border-bottom: 1px solid #f4f5f8; }
.ord-row:last-child { border-bottom: 0; }
.ord-row:hover { background: #fbf9ff; }
.ord-row input[type=checkbox] { flex: none; width: 14px; height: 14px; }
.ord-no { flex: none; width: 22px; height: 22px; border-radius: 7px; background: #f3eefb; color: #7c5cff;
  font-size: 11px; font-weight: 700; display: flex; align-items: center; justify-content: center; }
.ord-nm { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 2px; }
.ord-nm b { font-size: 12.5px; color: #1f2733; font-weight: 600; }
.ord-nm em { font-style: normal; font-size: 11px; color: #8b94a3; }
.ord-form { flex: none; font-size: 11px; color: #6b7280; background: #f6f7f9; padding: 2px 8px; border-radius: 6px; }

/* ---------------------- 业务事项多条件查询（A6） ---------------------- */
.biz-filter { gap: 10px; flex-wrap: wrap; padding: 8px 10px; margin-top: -6px;
  background: #fafbfd; border: 1px solid #eef0f4; border-radius: 10px; }
.biz-filter .bizf { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: #6b7280; }
.biz-filter .bizf span { white-space: nowrap; }
.biz-filter .bizf select, .biz-filter .bizf .inp.sm { height: 28px; min-width: 108px; font-size: 12px; padding: 0 8px; }
.biz-filter .bizf .inp.sm { width: 140px; }

/* ------------- 基础档案共享范围 / 请购带出提示（A2 / A3） ------------- */
.biz-extra { margin-top: 14px; border: 1px solid #ebe6f4; border-radius: 12px; padding: 12px 14px; background: #fcfbff; }
.biz-extra .bx-h { display: flex; align-items: center; gap: 8px; font-size: 12.5px; font-weight: 700; color: #1f2733; }
.biz-extra .bx-n { margin-left: auto; font-size: 11px; font-weight: 400; color: #7c5cff; }
.biz-extra .bx-bar { display: flex; align-items: center; gap: 8px; margin: 8px 0; }
.biz-extra .bx-tip { font-size: 11px; color: #8b94a3; }
.biz-extra .bx-orgs { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 6px 12px;
  max-height: 200px; overflow: auto; }
.biz-extra .bx-org { display: flex; align-items: center; gap: 6px; font-size: 12px; color: #4b5563; cursor: pointer; }
.biz-extra .bx-org em { font-style: normal; font-size: 10.5px; color: #a3aab6; }
.fld-tip { margin-top: 4px; font-size: 11px; color: #7c5cff; background: #f7f3ff; border-radius: 6px; padding: 3px 8px; }

/* ------------------------- 下推生单（A12 / A19） ------------------------- */
.push-list { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
.push-card { display: flex; flex-direction: column; align-items: flex-start; gap: 4px; text-align: left;
  padding: 12px 14px; border: 1px solid #e8ecf3; border-radius: 12px; background: #fff; cursor: pointer; transition: .15s; }
.push-card:hover { border-color: #c9b6f0; background: #fbf8ff; box-shadow: 0 4px 14px rgba(124,92,255,.08); }
.push-card b { font-size: 13px; color: #1f2733; }
.push-card em { font-style: normal; font-size: 11px; color: #8b94a3; line-height: 1.5; }
.push-card .go { margin-top: 4px; font-size: 11px; color: #7c5cff; font-weight: 600; }
.push-card[disabled] { opacity: .55; cursor: default; }

/* ------------------------ 业务角色工作台（需求#17） ------------------------ */
.wb-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 10px; }
.wb-cell { padding: 12px 14px; border: 1px solid #eef0f4; border-radius: 12px; background: #fcfcfd; }
.wb-cell.go { cursor: pointer; transition: .15s; }
.wb-cell.go:hover { border-color: #c9b6f0; background: #fbf8ff; box-shadow: 0 4px 14px rgba(124,92,255,.08); }
.wb-n { font-size: 12px; color: #6b7280; }
.wb-v { margin-top: 6px; font-size: 24px; font-weight: 700; color: #1f2733; line-height: 1.1; }
.wb-u { margin-left: 4px; font-size: 12px; font-weight: 400; color: #8b94a3; }
.wb-s { margin-top: 4px; font-size: 11px; color: #a3aab6; }
.wb-roles { display: grid; grid-template-columns: repeat(auto-fill, minmax(140px, 1fr)); gap: 8px; }
.wb-role { display: flex; flex-direction: column; gap: 2px; text-align: left; padding: 8px 12px;
  border: 1px solid #e8ecf3; border-radius: 10px; background: #fff; cursor: pointer; transition: .15s; }
.wb-role:hover { border-color: #c9b6f0; background: #fbf8ff; }
.wb-role.on { border-color: #7c5cff; background: #f6f1ff; }
.wb-role b { font-size: 12.5px; color: #1f2733; }
.wb-role em { font-style: normal; font-size: 10.5px; color: #8b94a3; }
.wb-pick-g { margin-bottom: 14px; }
.wb-pick-t { font-size: 12px; font-weight: 700; color: #4b5563; margin-bottom: 8px; }

/* --------------------- 参照生单（A12 / A19） --------------------- */
.fs-tabs { display: flex; flex-wrap: wrap; gap: 8px; margin-bottom: 12px; }
.fs-tab { padding: 6px 12px; font-size: 12px; border: 1px solid #e8ecf3; border-radius: 9px; background: #fff; cursor: pointer; color: #4b5563; }
.fs-tab.on { border-color: #7c5cff; background: #f6f1ff; color: #5b3fd6; font-weight: 600; }
.fs-tab b { margin-left: 4px; color: #7c5cff; }
.fs-list { max-height: 330px; overflow: auto; border: 1px solid #eef0f4; border-radius: 10px; }
.fs-row { display: grid; grid-template-columns: 22px 1fr 70px 90px 150px; align-items: center; gap: 10px;
  padding: 8px 12px; border-bottom: 1px solid #f4f5f8; cursor: pointer; font-size: 12px; }
.fs-row:last-child { border-bottom: 0; }
.fs-row:hover { background: #fbf9ff; }
.fs-nm { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.fs-nm b { font-size: 12.5px; color: #1f2733; }
.fs-nm em { font-style: normal; font-size: 11px; color: #8b94a3; }
.fs-q, .fs-p { text-align: right; color: #4b5563; }
.fs-party { color: #6b7280; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.fs-foot { display: flex; justify-content: flex-end; margin-top: 10px; }

/* --------------------- 信创环境自检（需求 B12） --------------------- */
.xc-item { padding: 9px 12px; border: 1px solid #eef0f4; border-radius: 10px; background: #fcfcfd; }
.xc-h { display: flex; align-items: center; gap: 8px; }
.xc-h b { font-size: 12.5px; color: #1f2733; font-weight: 600; }
.xc-a { margin-top: 4px; font-size: 11.5px; color: #4b5563; }
.xc-n { margin-top: 3px; font-size: 11px; color: #9aa2ae; line-height: 1.5; }

/* ------------------ SQL 方言清单（信创 B12） ------------------ */
.dg-box { margin-top: 12px; border: 1px solid #eef0f4; border-radius: 12px; overflow: hidden; }
.dg-h { display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; padding: 9px 12px; background: #fafbfd; }
.dg-h b { font-size: 12.5px; color: #1f2733; }
.dg-h span { font-size: 11px; color: #8b94a3; }
/* 9 类构造、达梦写法一列会折成两三行，300px 只能露出两行 ——
   这张表的用途是「一眼看完要改什么」，所以给足高度，超出再滚。 */
.dg-wrap { max-height: 680px; overflow: auto; }
.dg-t { width: 100%; border-collapse: collapse; font-size: 11.5px; }
.dg-t th { position: sticky; top: 0; background: #f6f7f9; text-align: left; font-weight: 600;
  color: #6b7280; padding: 6px 10px; white-space: nowrap; }
.dg-t td { padding: 6px 10px; border-top: 1px solid #f4f5f8; color: #374151; vertical-align: top; }
.dg-t td.num { text-align: right; font-variant-numeric: tabular-nums; }
.dg-t code { font-size: 11px; color: #5b3fd6; background: #f7f3ff; padding: 1px 5px; border-radius: 4px; }
.dg-t td.dm, .dg-t td.kb { color: #6b7280; }
.dg-tip { padding: 8px 12px; font-size: 11px; color: #6b7280; background: #fcfcfd; border-top: 1px solid #f4f5f8; line-height: 1.6; }

/* ------------------------------ 审批中心（教师端） ------------------------------ */
.ap-stat { display: flex; gap: 10px; flex-wrap: wrap; margin: 4px 0 12px; }
.ap-s { min-width: 132px; padding: 10px 14px; border: 1px solid #eef0f4; border-radius: 12px; background: #fcfcfd; }
.ap-s b { display: block; font-size: 22px; font-weight: 700; color: #1f2733; line-height: 1.15; }
.ap-s span { font-size: 11.5px; color: #8b94a3; }
.ap-filters { display: flex; align-items: center; gap: 8px; flex-wrap: wrap; width: 100%; }
.ap-filters .sp { flex: 1; }
.ap-kchip { padding: 5px 11px; font-size: 12px; border: 1px solid #e8ecf3; border-radius: 9px;
  background: #fff; cursor: pointer; color: #4b5563; }
.ap-kchip b { margin-left: 4px; color: #7c5cff; }
.ap-kchip.on { border-color: #7c5cff; background: #f6f1ff; color: #5b3fd6; font-weight: 600; }
.ap-tbl td { vertical-align: top; }
.ap-tbl .num { text-align: right; font-variant-numeric: tabular-nums; }
.ap-note { margin-top: 3px; color: #b45309; }
.ap-sum { display: grid; grid-template-columns: 1fr 1fr; gap: 8px 14px; margin-bottom: 12px;
  padding: 10px 12px; background: #fafbfd; border: 1px solid #eef0f4; border-radius: 10px; }
.ap-sum div { display: flex; gap: 8px; font-size: 12px; }
.ap-sum span { flex: none; width: 46px; color: #8b94a3; }
.ap-sum b { color: #1f2733; font-weight: 600; }

/* 审批动作按钮：通过用绿色实心 —— 主题的 .btn.primary 是红色（用于危险主操作），
   套在「通过」上会让人以为要点的是驳回。 */
.btn.ap-ok { background: #16a34a; border-color: transparent; color: #fff; }
.btn.ap-ok:hover { background: #15803d; color: #fff; }
.ap-when em { display: block; font-style: normal; color: #a3aab6; }

/* 行内操作按钮组：超过 3 个按钮时 168px 会挤成竖排并互相压住，
   统一用 flex + 换行，行高由内容撑开。 */
.row-ops { display: flex; flex-wrap: wrap; gap: 4px; justify-content: flex-end; }
.row-ops .btn { margin: 0; }
