/* ============================================================
   补课计时器 · 设计系统
   移动端优先（480px 容器）。所有类名与 JS 约定保持一致。
   ============================================================ */

:root{
  /* —— 品牌色：靛蓝（学习场景，冷静专业） —— */
  --primary:#4F46E5;
  --primary-d:#4338CA;
  --primary-l:#6366F1;
  --primary-x:#8B5CF6;
  --primary-soft:#EEF0FF;
  --primary-soft-2:#E0E4FF;

  /* —— 语义色 —— */
  --ok:#10B981;
  --ok-d:#059669;
  --ok-soft:#E6F8F1;
  --danger:#F43F5E;
  --danger-d:#E11D48;
  --danger-soft:#FFECF0;
  --warn:#F59E0B;
  --warn-soft:#FFF5E5;
  --sky:#0EA5E9;
  --sky-soft:#E6F5FE;

  /* —— 中性色 —— */
  --bg:#F3F4F9;
  --card:#FFFFFF;
  --surface-2:#F6F7FB;
  --surface-3:#EDEFF6;
  --text:#0F172A;
  --text-2:#334155;
  --muted:#64748B;
  --faint:#94A3B8;
  --line:#E8EBF2;
  --line-2:#F1F3F9;

  /* —— 形状 —— */
  --radius:20px;
  --radius-sm:14px;
  --radius-xs:11px;

  /* —— 阴影：多层柔和 —— */
  --sh-1:0 1px 2px rgba(15,23,42,.04), 0 1px 3px rgba(15,23,42,.04);
  --sh-2:0 2px 6px rgba(15,23,42,.04), 0 10px 26px -12px rgba(15,23,42,.14);
  --sh-brand:0 14px 34px -14px rgba(79,70,229,.62);
  --sh-fab:0 12px 26px -8px rgba(79,70,229,.58);

  --safe-b:env(safe-area-inset-bottom,0px);
  --safe-t:env(safe-area-inset-top,0px);

  --ease:cubic-bezier(.22,.61,.36,1);
}

*{box-sizing:border-box;-webkit-tap-highlight-color:transparent;}
html,body{margin:0;padding:0;}
html{background:var(--surface-3);
  -webkit-text-size-adjust:100%;}
body{
  font-family:-apple-system,BlinkMacSystemFont,"SF Pro SC","HarmonyOS Sans SC","PingFang SC","Microsoft YaHei",system-ui,sans-serif;
  background:var(--bg);color:var(--text);
  font-size:15px;line-height:1.55;
  max-width:480px;margin:0 auto;
  min-height:100vh;
  -webkit-font-smoothing:antialiased;
  box-shadow:0 0 0 1px rgba(15,23,42,.035), 0 30px 70px -30px rgba(15,23,42,.22);
}
.hidden{display:none !important;}
/* hidden 属性必须能压过下面 .field / .info-row 等自定义 display，否则 el.hidden=true 失效 */
[hidden]{display:none !important;}

/* 数字统一等宽，避免跳动 */
.hg-num,.stat-hero-num,.big-num,.hours-badge,.stu-remain b,.dn-item b,.bar-top .val{
  font-variant-numeric:tabular-nums;font-feature-settings:"tnum" 1;
}

/* ============================================================
   登录页
   ============================================================ */
.login-wrap{
  position:relative;overflow:hidden;
  display:flex;align-items:center;justify-content:center;
  min-height:100vh;padding:28px 22px;padding-top:calc(28px + var(--safe-t));
  background:
    radial-gradient(120% 78% at 12% 0%, #7C6BF0 0%, rgba(124,107,240,0) 58%),
    radial-gradient(100% 62% at 92% 8%, #A78BFA 0%, rgba(167,139,250,0) 52%),
    linear-gradient(168deg,#241E5B 0%,#3B2E9E 46%,#4F46E5 100%);
}
/* 光斑装饰 */
.login-glow{position:absolute;border-radius:50%;pointer-events:none;filter:blur(2px);}
.login-glow.g1{width:280px;height:280px;right:-120px;bottom:-90px;
  background:radial-gradient(circle,rgba(255,255,255,.20),transparent 68%);}
.login-glow.g2{width:220px;height:220px;left:-110px;top:16%;
  background:radial-gradient(circle,rgba(255,255,255,.13),transparent 68%);}

.login-card{
  position:relative;z-index:1;
  width:100%;max-width:372px;
  background:rgba(255,255,255,.97);
  backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);
  border:1px solid rgba(255,255,255,.6);
  border-radius:26px;padding:34px 24px 26px;
  box-shadow:0 28px 60px -18px rgba(12,8,45,.55), 0 2px 0 rgba(255,255,255,.5) inset;
  text-align:center;
  animation:cardIn .45s var(--ease) both;
}
@keyframes cardIn{from{opacity:0;transform:translateY(14px) scale(.985);}to{opacity:1;transform:none;}}

.login-logo{width:66px;height:66px;margin:0 auto 16px;display:block;
  filter:drop-shadow(0 10px 20px rgba(79,70,229,.38));}
.login-logo svg{display:block;width:100%;height:100%;}
.login-title{margin:0 0 4px;font-size:23px;font-weight:800;letter-spacing:-.015em;color:var(--text);}
.login-sub{margin:0 0 26px;color:var(--muted);font-size:13px;letter-spacing:.01em;}
.login-tip{margin:20px 0 0;font-size:11.5px;color:var(--faint);line-height:1.65;}

/* ============================================================
   表单元素
   ============================================================ */
.field{display:block;text-align:left;margin-bottom:14px;}
.field>span{display:block;font-size:12.5px;font-weight:600;color:var(--text-2);margin-bottom:7px;letter-spacing:.01em;}
.field>span::after{content:'';}
.field+ .divider{margin-top:16px;}

input,select{
  width:100%;height:48px;padding:0 15px;
  border:1.5px solid transparent;border-radius:var(--radius-sm);
  font-size:15px;font-family:inherit;color:var(--text);
  background:var(--surface-2);outline:none;
  transition:border-color .16s var(--ease), background .16s var(--ease), box-shadow .16s var(--ease);
  appearance:none;-webkit-appearance:none;
}
select{background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2364748B' stroke-width='2.2' stroke-linecap='round' stroke-linejoin='round'><path d='M6 9.5l6 6 6-6'/></svg>");
  background-repeat:no-repeat;background-position:right 13px center;background-size:17px;padding-right:40px;}
input::placeholder{color:var(--faint);}
input:focus,select:focus{background:#fff;border-color:var(--primary);box-shadow:0 0 0 4px var(--primary-soft);}
input[type=date]{min-height:48px;}
input[type=number]{-moz-appearance:textfield;}
input[type=number]::-webkit-outer-spin-button,
input[type=number]::-webkit-inner-spin-button{-webkit-appearance:none;margin:0;}

/* —— 按钮 —— */
.btn-primary{
  width:100%;height:50px;padding:0 18px;border:none;border-radius:var(--radius-sm);
  background:linear-gradient(135deg,var(--primary) 0%,var(--primary-x) 100%);
  color:#fff;font-size:16px;font-weight:700;font-family:inherit;letter-spacing:.02em;
  cursor:pointer;margin-top:6px;
  box-shadow:var(--sh-brand);
  transition:transform .12s var(--ease), box-shadow .16s var(--ease), opacity .16s;
}
.btn-primary:active{transform:scale(.975);box-shadow:0 8px 18px -10px rgba(79,70,229,.6);}
.btn-primary:disabled{opacity:.6;box-shadow:none;}

.btn-danger{width:100%;height:48px;border:1.5px solid var(--danger);border-radius:var(--radius-sm);
  background:#fff;color:var(--danger);font-size:15px;font-weight:600;font-family:inherit;
  cursor:pointer;margin-top:10px;transition:background .14s;}
.btn-danger:active{background:var(--danger-soft);}

.btn-mini{
  display:inline-flex;align-items:center;justify-content:center;gap:6px;
  height:44px;padding:0 16px;border:none;border-radius:13px;
  background:linear-gradient(135deg,var(--primary),var(--primary-l));
  color:#fff;font-weight:600;font-size:14px;font-family:inherit;cursor:pointer;white-space:nowrap;
  box-shadow:0 8px 18px -10px rgba(79,70,229,.7);
  transition:transform .12s var(--ease);}
.btn-mini svg{width:16px;height:16px;display:block;flex:0 0 16px;}
.btn-mini:active{transform:scale(.97);}
.btn-mini.ghost{background:#fff;color:var(--primary);border:1.5px solid var(--primary-soft-2);box-shadow:none;}
.btn-mini.ghost:active{background:var(--primary-soft);}

.btn-logout{width:100%;height:50px;border:1.5px solid var(--line);border-radius:var(--radius-sm);
  background:#fff;color:var(--danger);font-weight:600;font-size:15px;font-family:inherit;
  margin-top:8px;cursor:pointer;transition:background .14s,border-color .14s;}
.btn-logout:active{background:var(--danger-soft);border-color:#FBD5DD;}

/* ---------- 我的 · 安装到手机桌面 ---------- */
.install-row{display:flex;align-items:center;gap:12px;margin-bottom:14px;}
.install-txt{min-width:0;display:flex;flex-direction:column;gap:3px;}
.install-txt b{font-size:15px;font-weight:700;color:var(--text);letter-spacing:-.01em;}
.install-txt span{font-size:12.5px;font-weight:500;color:var(--muted);line-height:1.5;}

.form-msg{color:var(--danger);font-size:13px;min-height:18px;margin:10px 0 0;text-align:center;font-weight:500;}
.form-msg.ok{color:var(--ok);}

/* ============================================================
   通用确认弹窗
   ============================================================ */
.modal-top{z-index:60;}
.confirm-sheet{border-radius:24px;margin:0 16px calc(18px + var(--safe-b));max-width:448px;padding-top:14px;}
.confirm-sheet::before{display:none;}
.confirm-text{font-size:15px;line-height:1.65;color:var(--text-2);margin:2px 2px 20px;}
.confirm-actions{display:flex;gap:10px;}
.confirm-actions button{flex:1;height:48px;border-radius:13px;font-size:15px;font-weight:700;
  font-family:inherit;cursor:pointer;transition:transform .12s var(--ease),background .14s;}
.confirm-actions button:active{transform:scale(.975);}
.btn-plain{background:var(--surface-2);color:var(--text-2);border:1.5px solid transparent;}
.btn-plain:active{background:var(--surface-3);}
.btn-danger-solid{background:linear-gradient(135deg,var(--danger),#FB7185);color:#fff;border:none;
  box-shadow:0 10px 22px -10px rgba(244,63,94,.7);}
.btn-plain-solid{background:linear-gradient(135deg,var(--primary),var(--primary-l));color:#fff;border:none;
  box-shadow:0 10px 22px -10px rgba(79,70,229,.7);}

/* ============================================================
   选择框（课程 / 课时）
   ============================================================ */
.pick-box{display:flex;flex-wrap:wrap;gap:9px;}
.pick{
  width:auto;max-width:100%;height:42px;padding:0 17px;
  border:1.5px solid var(--line);border-radius:999px;
  background:#fff;color:var(--text-2);font-size:14.5px;font-weight:600;
  font-family:inherit;line-height:1;cursor:pointer;
  transition:all .16s var(--ease);
}
.pick:active{transform:scale(.96);}
.pick.on{
  background:linear-gradient(135deg,var(--primary),var(--primary-x));
  border-color:transparent;color:#fff;
  box-shadow:0 8px 18px -8px rgba(79,70,229,.72);
}
.pick-custom{margin-top:11px;}

/* ============================================================
   顶部栏
   ============================================================ */
.topbar{
  position:sticky;top:0;z-index:10;
  display:grid;grid-template-columns:44px 1fr 44px;align-items:center;
  padding:10px 12px;padding-top:calc(10px + var(--safe-t));
  min-height:56px;
  background:rgba(255,255,255,.82);
  backdrop-filter:blur(18px) saturate(180%);-webkit-backdrop-filter:blur(18px) saturate(180%);
  border-bottom:1px solid rgba(15,23,42,.055);
}
.topbar-title{text-align:center;font-size:17px;font-weight:700;letter-spacing:-.01em;color:var(--text);}
.topbar-back{
  width:36px;height:36px;border:none;border-radius:50%;
  background:var(--surface-2);color:var(--text-2);
  display:grid;place-items:center;padding:0;cursor:pointer;
  transition:background .14s,transform .12s var(--ease);
}
.topbar-back:active{background:var(--surface-3);transform:scale(.94);}
.topbar-back svg{width:20px;height:20px;display:block;}

/* ============================================================
   内容区
   ============================================================ */
.content{padding:16px 16px calc(96px + var(--safe-b));}
.page{animation:fade .26s var(--ease);}
@keyframes fade{from{opacity:0;transform:translateY(7px);}to{opacity:1;transform:none;}}

/* —— 总览 hero —— */
.stat-hero{
  position:relative;overflow:hidden;
  border-radius:24px;
  padding:20px 18px;
  color:#fff;text-align:center;
  background:linear-gradient(135deg,#4F46E5 0%,#6366F1 42%,#8B5CF6 100%);
  box-shadow:0 20px 44px -20px rgba(79,70,229,.75);
}
.stat-hero::before{content:'';position:absolute;width:240px;height:240px;border-radius:50%;
  right:-80px;top:-130px;background:radial-gradient(circle,rgba(255,255,255,.30),transparent 70%);}
.stat-hero::after{content:'';position:absolute;width:200px;height:200px;border-radius:50%;
  left:-90px;bottom:-130px;background:radial-gradient(circle,rgba(255,255,255,.16),transparent 70%);}
.stat-hero>*{position:relative;z-index:1;}

.stat-hero-label{font-size:12.5px;font-weight:600;opacity:.86;letter-spacing:.04em;}
.stat-hero-num{font-size:56px;font-weight:800;line-height:1.05;margin:6px 0 4px;letter-spacing:-.035em;}
.stat-hero-sub{font-size:13px;opacity:.9;}
.stat-hero-sub b{color:#C7F9DC;font-weight:700;}

/* 管理员：三格汇总 */
.hero-grid{display:grid;grid-template-columns:1fr 1fr 1fr;gap:8px;text-align:center;margin-bottom:12px;}
.hg-item{border-radius:16px;padding:11px 6px 9px;
  background:rgba(255,255,255,.15);
  border:1px solid rgba(255,255,255,.20);}
.hg-num{font-size:25px;font-weight:800;line-height:1.12;letter-spacing:-.025em;}
.hg-label{font-size:11px;opacity:.85;margin-top:3px;letter-spacing:.03em;}
.hg-ok{color:#B9F7D2;}
.stat-hero-sub{position:relative;text-align:center;}
.stat-hero .stat-hero-sub{margin-top:2px;}

/* —— 快捷入口 —— */
.quick-grid{display:grid;grid-template-columns:1fr 1fr;gap:11px;margin:14px 0;}
.quick-btn{
  position:relative;overflow:hidden;
  border:1px solid var(--line);background:var(--card);
  border-radius:var(--radius);padding:15px 14px;
  display:flex;align-items:center;gap:11px;text-align:left;
  font-family:inherit;font-size:14.5px;font-weight:600;color:var(--text);
  cursor:pointer;box-shadow:var(--sh-1);
  transition:transform .13s var(--ease), box-shadow .16s var(--ease), border-color .16s;
}
.quick-btn:active{transform:scale(.972);box-shadow:var(--sh-2);border-color:var(--primary-soft-2);}
.qb-ico{flex:0 0 40px;width:40px;height:40px;border-radius:13px;
  display:grid;place-items:center;}
.qb-ico svg{width:21px;height:21px;display:block;}
.qb-txt{font-size:14px;font-weight:600;letter-spacing:-.005em;}
/* 图标底色（按语义区分） */
.qb-indigo{background:var(--primary-soft);color:var(--primary);}
.qb-emerald{background:var(--ok-soft);color:var(--ok-d);}
.qb-amber{background:var(--warn-soft);color:#B45309;}
.qb-sky{background:var(--sky-soft);color:#0284C7;}
.qb-violet{background:#F3EDFF;color:#7C3AED;}
/* 小尺寸图标底座（课程列表等） */
.qb-ico.qb-sm{flex:0 0 34px;width:34px;height:34px;border-radius:11px;}
.qb-ico.qb-sm svg{width:17px;height:17px;}

/* —— 卡片 —— */
.card{
  background:var(--card);border-radius:var(--radius);
  padding:16px;margin-bottom:12px;
  border:1px solid var(--line-2);
  box-shadow:var(--sh-1);
}
.card-title{
  display:flex;align-items:center;gap:8px;
  font-size:14px;font-weight:700;margin-bottom:13px;color:var(--text);
  letter-spacing:-.005em;
}
.card-title::before{content:'';width:3px;height:14px;border-radius:2px;flex:0 0 3px;
  background:linear-gradient(180deg,var(--primary),var(--primary-x));}
.card-hint{font-size:11.5px;font-weight:500;color:var(--faint);}
.card-hint.center{text-align:center;margin-top:10px;min-height:16px;
  padding-top:12px;border-top:1px dashed var(--line);}
.big-num{font-size:42px;font-weight:800;text-align:center;letter-spacing:-.035em;
  background:linear-gradient(135deg,var(--primary),var(--primary-x));
  -webkit-background-clip:text;background-clip:text;color:transparent;line-height:1.15;}

/* —— 条形图 —— */
.bar-list{display:flex;flex-direction:column;gap:14px;}
.bar-row{display:flex;flex-direction:column;gap:7px;}
.bar-top{display:flex;justify-content:space-between;align-items:baseline;font-size:13.5px;gap:10px;}
.bar-top .name{font-weight:600;color:var(--text);}
.bar-top .val{color:var(--muted);font-size:12.5px;flex:0 0 auto;}
.bar-track{height:9px;background:var(--surface-3);border-radius:999px;overflow:hidden;}
.bar-fill{height:100%;border-radius:999px;
  background:linear-gradient(90deg,var(--primary-l),var(--primary-x));
  transition:width .5s var(--ease);box-shadow:0 0 10px rgba(99,102,241,.35);}

/* —— 过滤器 —— */
.filters{display:flex;gap:10px;margin-bottom:13px;}
.f-select{flex:1;}

/* —— 列表 —— */
.list{display:flex;flex-direction:column;gap:9px;}
.item{
  background:var(--card);border-radius:var(--radius-sm);
  padding:13px 14px;border:1px solid var(--line-2);
  box-shadow:var(--sh-1);
  display:flex;align-items:center;gap:11px;
  transition:transform .13s var(--ease), box-shadow .16s var(--ease);
}
.item:active{transform:scale(.985);box-shadow:var(--sh-2);}
.item-main{flex:1;min-width:0;}
.item-title{font-weight:600;font-size:15px;display:flex;gap:7px;align-items:center;flex-wrap:wrap;
  letter-spacing:-.005em;}
.item-sub{font-size:12.5px;color:var(--muted);margin-top:3px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.item-sub b{color:var(--primary);font-weight:700;}

/* 日期块 */
.date-chip{flex:0 0 46px;width:46px;height:48px;border-radius:13px;
  background:var(--primary-soft);color:var(--primary);
  display:flex;flex-direction:column;align-items:center;justify-content:center;line-height:1;}
.date-chip b{font-size:18px;font-weight:800;letter-spacing:-.02em;}
.date-chip span{font-size:10px;font-weight:600;opacity:.7;margin-top:3px;}

.tag{font-size:11px;font-weight:600;background:var(--primary-soft);color:var(--primary);
  padding:2.5px 9px;border-radius:999px;}
.hours-badge{font-size:19px;font-weight:800;color:var(--primary);white-space:nowrap;letter-spacing:-.02em;}
.hours-badge i{font-style:normal;font-size:12px;font-weight:600;opacity:.6;margin-left:1px;}
.item-del{
  flex:0 0 32px;width:32px;height:32px;border:none;border-radius:10px;
  background:transparent;color:var(--faint);
  display:grid;place-items:center;padding:0;cursor:pointer;
  transition:background .14s,color .14s,transform .12s var(--ease);
}
.item-del svg{width:17px;height:17px;display:block;}
.item-del:active{background:var(--danger-soft);color:var(--danger);transform:scale(.92);}
.item-chevron{flex:0 0 18px;color:var(--faint);display:grid;place-items:center;}
.item-chevron svg{width:18px;height:18px;display:block;}

/* 新增行 */
.add-row{display:flex;gap:9px;margin-bottom:13px;}
.add-row input{flex:1;}
.add-row .btn-mini{height:48px;border-radius:var(--radius-sm);}

/* 空态 */
.empty{text-align:center;color:var(--muted);padding:36px 16px 30px;font-size:13.5px;line-height:1.6;}
.empty::before{content:'';display:block;width:58px;height:58px;margin:0 auto 13px;border-radius:50%;
  background:var(--surface-2) url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23A9B4C6' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'><path d='M4 13.2 6.3 6.6A2 2 0 0 1 8.2 5.2h7.6a2 2 0 0 1 1.9 1.4L20 13.2v4.1a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2z'/><path d='M4 13.2h4l1.1 2.1h5.8l1.1-2.1h4'/></svg>") center/28px 28px no-repeat;}
.empty-inline{text-align:center;color:var(--faint);padding:18px 0;font-size:13px;}

/* —— 我的 —— */
.info-card{padding:4px 16px;}
.info-row{display:flex;justify-content:space-between;align-items:center;gap:12px;
  font-size:14.5px;padding:14px 0;}
.info-row+.info-row{border-top:1px solid var(--line-2);}
.info-row>span{color:var(--muted);font-size:13.5px;}
.info-row>b{font-weight:600;color:var(--text);letter-spacing:.01em;}
.about{text-align:center;color:var(--faint);font-size:11.5px;margin-top:20px;line-height:1.7;}

/* ============================================================
   底部导航
   ============================================================ */
.tabbar{
  position:fixed;left:50%;transform:translateX(-50%);bottom:0;
  width:100%;max-width:480px;
  display:flex;align-items:flex-end;
  background:rgba(255,255,255,.88);
  backdrop-filter:blur(18px) saturate(180%);-webkit-backdrop-filter:blur(18px) saturate(180%);
  border-top:1px solid rgba(15,23,42,.055);
  padding:7px 4px calc(7px + var(--safe-b));
  z-index:20;
}
.tab{
  flex:1;min-width:0;background:none;border:none;
  color:var(--faint);font-size:10.5px;font-family:inherit;font-weight:600;
  display:flex;flex-direction:column;align-items:center;gap:3px;
  padding:2px 0 1px;cursor:pointer;letter-spacing:.01em;
  transition:color .18s var(--ease);
}
.tab .tab-ico{
  width:46px;height:27px;border-radius:999px;
  display:grid;place-items:center;
  transition:background .2s var(--ease), color .18s var(--ease);
}
.tab .tab-ico svg{width:21px;height:21px;display:block;}
.tab.active{color:var(--primary);}
.tab.active .tab-ico{background:var(--primary-soft);}
.tab:active .tab-ico{transform:scale(.94);}

/* 中间悬浮按钮 */
.tab.fab{
  flex:0 0 auto;width:56px;height:56px;margin:-22px 8px 2px;
  border-radius:50%;
  background:linear-gradient(135deg,var(--primary),var(--primary-x));
  color:#fff;display:grid;place-items:center;
  box-shadow:var(--sh-fab);
  border:3px solid rgba(255,255,255,.92);
  transition:transform .14s var(--ease), box-shadow .16s var(--ease);
}
.tab.fab svg{width:24px;height:24px;display:block;}
.tab.fab:active{transform:scale(.93);box-shadow:0 8px 18px -8px rgba(79,70,229,.6);}

/* ============================================================
   弹窗
   ============================================================ */
.modal{position:fixed;inset:0;z-index:50;display:flex;align-items:flex-end;justify-content:center;}
.modal-mask{position:absolute;inset:0;background:rgba(15,23,42,.48);
  backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(2px);
  animation:maskIn .2s ease both;}
@keyframes maskIn{from{opacity:0;}to{opacity:1;}}
.modal-sheet{
  position:relative;width:100%;max-width:480px;background:#fff;
  border-radius:26px 26px 0 0;
  padding:22px 18px calc(20px + var(--safe-b));
  animation:slideup .32s var(--ease);
  max-height:92vh;overflow:auto;
  box-shadow:0 -12px 40px -12px rgba(15,23,42,.28);
}
.modal-sheet::before{content:'';position:absolute;left:50%;top:9px;transform:translateX(-50%);
  width:38px;height:4px;border-radius:999px;background:var(--surface-3);}
@keyframes slideup{from{transform:translateY(100%);}to{transform:none;}}
.modal-head{display:flex;justify-content:space-between;align-items:center;
  font-size:17.5px;font-weight:700;margin:2px 0 18px;letter-spacing:-.015em;}
.modal-close{
  width:32px;height:32px;border:none;border-radius:50%;background:var(--surface-2);
  color:var(--muted);display:grid;place-items:center;padding:0;cursor:pointer;
  transition:background .14s,color .14s;flex:0 0 32px;
}
.modal-close svg{width:16px;height:16px;display:block;}
.modal-close:active{background:var(--surface-3);color:var(--text);}

/* —— Toast —— */
.toast{
  position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);
  background:rgba(15,23,42,.90);
  backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
  color:#fff;padding:13px 22px;border-radius:999px;
  font-size:14px;font-weight:500;z-index:99;max-width:80%;text-align:center;
  box-shadow:0 18px 40px -12px rgba(15,23,42,.5);
  animation:toastIn .24s var(--ease) both;
}
@keyframes toastIn{from{opacity:0;transform:translate(-50%,-46%) scale(.94);}to{opacity:1;transform:translate(-50%,-50%) scale(1);}}

/* ============================================================
   多角色专属
   ============================================================ */
/* 学生剩余课时列表 */
.stu-list{display:flex;flex-direction:column;gap:9px;}
.stu-row{
  display:flex;align-items:center;gap:12px;padding:12px;
  border-radius:var(--radius-sm);
  background:var(--surface-2);
  border:1px solid transparent;
  cursor:pointer;
  transition:background .16s var(--ease), border-color .16s, transform .13s var(--ease);
}
.stu-row:active{background:var(--primary-soft);border-color:var(--primary-soft-2);transform:scale(.987);}
.stu-avatar{
  flex:0 0 42px;width:42px;height:42px;border-radius:14px;
  background:linear-gradient(140deg,var(--primary-l),var(--primary-x));
  color:#fff;display:grid;place-items:center;
  font-weight:700;font-size:17px;letter-spacing:0;
  box-shadow:0 8px 16px -8px rgba(79,70,229,.7);
}
.stu-main{flex:1;min-width:0;}
.stu-name{font-weight:600;font-size:14.5px;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
.stu-bar{height:7px;background:var(--surface-3);border-radius:999px;overflow:hidden;margin:8px 0 5px;}
.stu-bar-fill{height:100%;border-radius:999px;
  background:linear-gradient(90deg,var(--primary-l),var(--primary-x));
  transition:width .5s var(--ease);}
.stu-bar-fill.bar-low{background:linear-gradient(90deg,#FB7185,var(--danger));}
.stu-bar-fill.bar-none{background:#CFD6E4;}
.stu-sub{font-size:11.5px;color:var(--muted);}
.stu-remain{text-align:right;flex:0 0 auto;color:var(--primary);min-width:54px;}
.stu-remain b{font-size:21px;font-weight:800;display:block;line-height:1.1;letter-spacing:-.03em;}
.stu-remain span{font-size:10.5px;color:var(--faint);font-weight:500;}
.stu-remain.low b{color:var(--danger);}
.stu-remain.unset b{color:var(--faint);}

/* 状态标签 */
.chip{font-size:10px;padding:2px 8px;border-radius:999px;
  background:var(--surface-3);color:var(--muted);font-weight:600;letter-spacing:.01em;}
.chip-on{background:var(--ok-soft);color:var(--ok-d);}

/* 学生详情头 */
.detail-head{padding:20px 16px 16px;text-align:center;}
.detail-name{font-size:22px;font-weight:800;text-align:center;margin-bottom:16px;letter-spacing:-.02em;}
.detail-nums{display:grid;grid-template-columns:1fr 1fr 1fr;text-align:center;gap:8px;}
.dn-item{padding:11px 4px;border-radius:var(--radius-sm);background:var(--surface-2);}
.dn-item b{display:block;font-size:21px;font-weight:800;color:var(--primary);line-height:1.2;letter-spacing:-.025em;}
.dn-item span{font-size:11.5px;color:var(--muted);font-weight:500;}
.dn-item .dn-remain{color:var(--ok-d);}
.detail-actions{display:flex;gap:9px;margin-top:16px;}
.detail-actions .btn-mini{flex:1;}

/* 弹窗内分隔与提示 */
.divider{font-size:12px;color:var(--faint);margin:16px 0 13px;padding-top:14px;
  border-top:1px dashed var(--line);font-weight:500;}
.hint{font-size:12px;color:var(--faint);margin:0 0 12px;min-height:16px;line-height:1.6;}

/* ============================================================
   动效偏好
   ============================================================ */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation-duration:.001s !important;transition-duration:.001s !important;}
}
