/* 智能英语伴学系统 · 四角色控制台样式 */
*{box-sizing:border-box;margin:0;padding:0}
:root{--teal:#2E8B72;--teal-dark:#256E5B;--orange:#F5821F;--orange2:#F5921F;--green:#34A853;--red:#F05A2E;--text:#2B3A36;--text-2:#7C8B86;--card-border:#E5EDE9;--radius:18px}
html,body{max-width:440px;margin:0 auto;background:#F2F6F4;font-family:"PingFang SC","Microsoft YaHei",sans-serif;color:var(--text)}
.view{min-height:100vh;background:#F2F6F4}

/* 滚动容器：控制台内有滚动 */
.console{min-height:100vh;background:#F2F6F4;padding-bottom:80px}

/* ===== 登录 ===== */
/* 登录页脱离 body 的 440px 宽限制：全屏背景 + 内容水平/垂直居中（显示交给 show() 设为 flex） */
.login-wrap{position:fixed;inset:0;width:100vw;height:100vh;overflow-y:auto;background:linear-gradient(170deg,#2E8B72 0%,#1F6B57 55%,#174F41 100%);display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:20px}
.login-wrap .login-head{width:100%;max-width:400px;display:flex;align-items:center;justify-content:space-between;padding:16px}
.login-wrap .login-head .back{width:34px;height:34px;border-radius:50%;background:rgba(255,255,255,.15);display:flex;align-items:center;justify-content:center;cursor:pointer;color:#fff}
.login-logo{font-size:26px;color:#fff}
.login-av{width:92px;height:92px;border-radius:50%;background:#F4C430;display:flex;align-items:center;justify-content:center;font-size:52px;margin-top:16px;border:5px solid #fff;box-shadow:0 6px 18px rgba(0,0,0,.18)}
.login-sub{color:rgba(255,255,255,.9);font-size:15px;letter-spacing:3px;margin-top:6px;text-align:center}
.role-tabs{display:flex;gap:12px;justify-content:center;margin:20px 0 18px;flex-wrap:wrap}
.role{padding:7px 12px;border-radius:18px;background:rgba(255,255,255,.16);color:#EAF3EF;font-size:14px;cursor:pointer;text-align:center}
.role.on{background:#F4C430;color:#174F41;font-weight:700}
.login-inputs{width:100%;max-width:360px;display:flex;flex-direction:column;gap:12px}
.li{display:flex;align-items:center;gap:10px;background:#F3F6F5;border-radius:14px;padding:12px 14px;border:1px solid #E5EDE9}
.li .ic{font-size:18px;width:22px;text-align:center}
.li input{border:none;background:transparent;flex:1;font-size:15px;outline:none;color:var(--text)}
.login-btn{width:100%;max-width:360px;background:linear-gradient(135deg,var(--orange) 0%,var(--orange2) 100%);color:#fff;border:none;border-radius:18px;padding:14px;font-size:17px;font-weight:700;margin-top:18px;cursor:pointer;box-shadow:0 4px 12px rgba(245,130,31,.3)}
.login-tip{color:rgba(255,255,255,.75);font-size:12px;margin-top:14px;text-align:center}
.login-accounts{width:100%;max-width:360px;margin-top:18px;display:flex;flex-direction:column;gap:8px}
.login-accounts div{background:rgba(255,255,255,.1);color:#EAF3EF;font-size:12px;padding:9px 12px;border-radius:12px;cursor:pointer;text-align:center}

/* ===== 控制台通用 ===== */
.con-top{background:var(--teal);color:#fff;padding:20px 16px;border-radius:0 0 22px 22px;display:flex;align-items:center;gap:12px;box-shadow:0 2px 8px rgba(0,0,0,.08)}
.con-top .av{width:46px;height:46px;border-radius:50%;background:#F4C430;display:flex;align-items:center;justify-content:center;font-size:24px}
.con-top .who b{font-size:18px;display:block}
.con-top .who span{font-size:12px;opacity:.85}
.con-top .logout{margin-left:auto;background:rgba(255,255,255,.9);color:var(--teal-dark);border:none;border-radius:16px;padding:8px 14px;font-size:13px;cursor:pointer}
.con-stats{display:grid;grid-template-columns:repeat(2,1fr);gap:12px;padding:16px}
.stat{background:#fff;border-radius:16px;padding:14px;border:1px solid var(--card-border);box-shadow:0 1px 4px rgba(0,0,0,.04)}
.stat .k{font-size:12px;color:var(--text-2)}
.stat .v{font-size:26px;font-weight:800;color:var(--teal-dark);margin-top:4px}
.con-sec{padding:0 16px;margin-bottom:16px}
.con-sec .sec-t{font-size:14px;font-weight:700;margin-bottom:10px;display:flex;align-items:center;justify-content:space-between}
.con-sec .sec-t small{font-size:12px;color:var(--text-2);font-weight:400}
.con-list{background:#fff;border-radius:16px;overflow:hidden;border:1px solid var(--card-border)}
.con-list .row{display:flex;align-items:center;gap:12px;padding:13px 16px;border-bottom:1px solid #F0F4F2;font-size:14px}
.con-list .row:last-child{border-bottom:none}
.con-list .row .nm{flex:1}
.con-list .row .tag{font-size:11px;background:#EAF3EF;color:var(--teal-dark);padding:3px 9px;border-radius:10px}
.con-list .row .go{color:var(--orange);font-size:16px;cursor:pointer}
.con-menu{display:grid;grid-template-columns:1fr 1fr;gap:12px;padding:0 16px}
.con-menu .m{background:#fff;border-radius:18px;padding:16px;border:1px solid var(--card-border);cursor:pointer;box-shadow:0 1px 4px rgba(0,0,0,.04)}
.con-menu .m .ico{font-size:26px;margin-bottom:8px}
.con-menu .m .lb{font-size:15px;font-weight:700}
.con-menu .m .sub{font-size:12px;color:var(--text-2);margin-top:3px}
.m-orange{background:linear-gradient(135deg,#F5734E,#F5921F)!important;color:#fff}
.m-mint{background:linear-gradient(135deg,#5BC8AC,#2E8B72)!important;color:#fff}
.m-yellow{background:linear-gradient(135deg,#FBBE47,#F59E0B)!important;color:#fff}
.m-blue{background:linear-gradient(135deg,#5AA9E6,#3B82F6)!important;color:#fff}
.m-orange .sub,.m-mint .sub,.m-yellow .sub,.m-blue .sub{color:rgba(255,255,255,.85)}
.con-foot{padding:16px;text-align:center;color:var(--text-2);font-size:12px}

/* ===== 弹窗表单 ===== */
.overlay{position:fixed;inset:0;background:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center;z-index:50;padding:20px}
.sheet{background:#fff;border-radius:20px;width:100%;max-width:380px;padding:20px;box-shadow:0 10px 30px rgba(0,0,0,.2)}
.sheet h3{font-size:17px;margin-bottom:14px;color:var(--text)}
.sheet .field{margin-bottom:12px}
.sheet .field label{display:block;font-size:12px;color:var(--text-2);margin-bottom:5px}
.sheet .field input,.sheet .field select,.sheet .field textarea{width:100%;padding:11px 12px;border:1px solid var(--card-border);border-radius:12px;font-size:14px;background:#F8FBFA;outline:none}
.sheet .sactions{display:flex;gap:10px;margin-top:16px}
.btn-pill{flex:1;border:none;border-radius:18px;padding:12px;font-size:15px;font-weight:700;cursor:pointer}
.btn-pill.prev{background:#DFF0EA;color:var(--teal-dark)}
.btn-pill.next{background:linear-gradient(135deg,var(--orange),var(--orange2));color:#fff}
/* 【第四轮整改 · M4】补 :disabled 视觉：原 .btn-pill 没有禁用态样式，
   「彻底删除机构」这类 `disabled` 按钮实测 opacity:1 / cursor:pointer，看起来完全可点。
   口径与 memory.css 的 .btn-pill:disabled 保持一致（降透明度 + not-allowed，去掉阴影）；
   放在 .prev/.next 之后，保证禁用态能盖过主题色。 */
.btn-pill:disabled,.btn-pill:disabled:hover{opacity:.45;background:#E7EEEA;color:#93A8A0;cursor:not-allowed;box-shadow:none}
.addbtn{background:var(--orange);color:#fff;border:none;border-radius:12px;padding:6px 12px;font-size:13px;cursor:pointer}
.act{font-size:13px;color:var(--red);cursor:pointer;margin-left:8px}

/* ===== PC 侧边栏布局（超管/机构管理） ===== */
@media (min-width:700px){
  html,body{max-width:1200px}
  .pc-layout{display:flex;min-height:calc(100vh - 66px);background:var(--teal);border-radius:18px;overflow:hidden;box-shadow:0 6px 20px rgba(0,0,0,.12)}
  .pc-side{width:220px;background:#1F6B57;color:#fff;flex-shrink:0;padding:18px 0}
  .pc-side-title{font-size:15px;font-weight:700;padding:0 18px 16px;opacity:.9;border-bottom:1px solid rgba(255,255,255,.15)}
  .pc-menu{padding:10px 0}
  .pc-menu .pm{padding:14px 18px;font-size:15px;cursor:pointer;color:#DCEBE5;display:flex;align-items:center;gap:8px;transition:background .15s}
  .pc-menu .pm:hover{background:rgba(255,255,255,.08)}
  .pc-menu .pm.on{background:#2E8B72;color:#fff;font-weight:700;border-left:3px solid #F4C430}
  .pc-main{flex:1;background:#F2F6F4;padding:22px;overflow-y:auto}
  .pc-main-title{font-size:19px;font-weight:800;color:var(--text);margin-bottom:16px}
}

/* 管理端内容区列表样式（PC 更宽） */
.pc-main .con-sec{background:#fff;border-radius:14px;padding:16px;border:1px solid var(--card-border);margin-bottom:12px}
.pc-main .con-list{display:flex;flex-direction:column;gap:8px}
.pc-main .row{display:flex;align-items:center;justify-content:space-between;background:#F8FBFA;border-radius:12px;padding:12px 14px}
.pc-main .row .nm{font-size:15px;font-weight:600;color:var(--text)}
.pc-main .row select,.pc-main .row input,.con-sec select,.con-sec input{border:1px solid var(--card-border);border-radius:10px;padding:9px;font-size:14px;background:#F8FBFA}

/* 复盘时间线卡片 */
.rev-card{background:#fff;border:1px solid var(--card-border);border-radius:14px;padding:14px 16px;margin-bottom:10px}
.rev-head{display:flex;align-items:center;justify-content:space-between;font-size:14px;font-weight:700;color:var(--teal-dark);margin-bottom:6px}
.rev-head span{font-size:12px;color:var(--text-2);font-weight:400}
.rev-body{font-size:13px;color:var(--text-2);margin-bottom:6px}
.rev-words{display:flex;flex-wrap:wrap;gap:6px;margin:6px 0}
.rev-w{font-size:12px;padding:3px 8px;border-radius:8px;background:#EDF2F0;color:var(--text-2)}
.rev-w.ok{background:#DFF0EA;color:#2E9E52}
.rev-w.bad{background:#FEE5E0;color:#E04E33}
.rev-sum{font-size:13px;color:var(--text);line-height:1.6;margin-top:6px}
/* 排课状态色（未上课橙/进行中蓝/完成绿） */
.sched-st{display:inline-block;padding:1px 8px;border-radius:10px;font-size:12px;font-weight:600;color:#fff}
.st-orange{background:#f59e0b}
.st-green{background:#16a34a}
.st-blue{background:#2563eb}
.st-gray{background:#94a3b8}

/* 专项突破分类卡片 */
.m-card-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-bottom:6px}
.menu-card{border:1px solid var(--card-border);border-radius:14px;padding:12px;text-align:center;cursor:pointer;background:#fff}
.menu-card:hover{box-shadow:0 2px 8px rgba(0,0,0,.08)}
.menu-card .mc-ico{font-size:26px}
.menu-card .mc-t{font-weight:600;margin-top:6px;font-size:14px}
.menu-card .mc-s{color:var(--text-2);font-size:12px;margin-top:2px}

/* 财务汇总看板 */
.m-card-grid-4{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.m-card{border:1px solid var(--card-border);border-radius:12px;padding:10px;background:#fff;text-align:center}
.m-card .mc-t{font-size:12px;color:var(--text-2)}
.m-card .mc-val{font-size:16px;font-weight:700;margin-top:4px;color:var(--text)}
.m-card.ok .mc-val{color:var(--green)}
.m-card.warn .mc-val{color:var(--orange)}

/* ============================================================
   v2.6 管理端整改新增样式（沿用既有色板 var(--teal)/var(--orange) 等）
   ============================================================ */
/* ---- 区块小标题/说明 ---- */
.sec-sub{font-size:12px;color:var(--text-2);margin:-4px 0 10px;line-height:1.5}
.sub-t{font-size:13px;font-weight:700;color:var(--teal-dark);margin:14px 0 8px}
.con-list .row .nm .sub{font-size:12px;color:var(--text-2);font-weight:400;margin-top:3px;line-height:1.5}
.sub-inline{font-size:12px;color:var(--text-2);font-weight:400}
.hint{font-size:13px;color:var(--text-2);background:#F8FBFA;border:1px dashed var(--card-border);border-radius:12px;padding:12px;line-height:1.6}
.ftip{font-size:11px;color:var(--text-2);margin-top:5px;line-height:1.5}
.td-empty{color:var(--text-2);font-size:13px;text-align:center;padding:14px 0!important}

/* ---- 行内操作按钮 ---- */
.rowacts{display:flex;flex-wrap:wrap;gap:6px;justify-content:flex-end;align-items:center;flex-shrink:0}
.mini{border:1px solid var(--card-border);background:#fff;color:var(--teal-dark);border-radius:10px;padding:6px 10px;font-size:12px;cursor:pointer;white-space:nowrap;line-height:1.2}
.mini:hover{background:#F0F7F4}
.mini.primary{background:var(--teal);border-color:var(--teal);color:#fff}
.mini.ok{background:var(--green);border-color:var(--green);color:#fff}
.mini.danger{background:#FDECE7;border-color:#F7D3C8;color:var(--red)}
.mini.on{background:var(--teal);color:#fff}

/* ---- 状态标签 ---- */
.chip{display:inline-block;font-size:11px;padding:2px 8px;border-radius:10px;background:#EDF2F0;color:var(--text-2);margin-left:4px;vertical-align:middle}
.chip-ok{background:#DFF0EA;color:#2E9E52}
.chip-warn{background:#FDF0DA;color:#B5730F}
.chip-off{background:#F1F3F2;color:#8A9994}
.ck{display:inline-flex;align-items:center;margin-right:6px}
.ck input{width:16px;height:16px}

/* ---- 表格 ---- */
.tbl-wrap{width:100%;overflow-x:auto;border:1px solid var(--card-border);border-radius:14px;background:#fff}
.tbl{width:100%;border-collapse:collapse;font-size:13px;min-width:560px}
.tbl th{background:#F3F8F6;color:var(--teal-dark);font-weight:700;text-align:left;padding:10px 12px;white-space:nowrap;border-bottom:1px solid var(--card-border)}
.tbl td{padding:10px 12px;border-bottom:1px solid #F0F4F2;color:var(--text);vertical-align:middle}
.tbl tr:last-child td{border-bottom:none}
.tbl tbody tr:hover{background:#FAFDFC}

/* ---- 类目 Tab / 筛选器 / 表单栅格 ---- */
.tabs{display:flex;flex-wrap:wrap;gap:8px;margin:10px 0 12px}
.tab{padding:8px 14px;border-radius:14px;background:#fff;border:1px solid var(--card-border);cursor:pointer;font-size:13px;color:var(--text-2)}
.tab.on{background:var(--teal);color:#fff;border-color:var(--teal);font-weight:700}
.filters{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;margin-bottom:6px}
.fl{display:flex;flex-direction:column;gap:4px;font-size:12px;color:var(--text-2)}
.fl select,.fl input{border:1px solid var(--card-border);border-radius:10px;padding:8px 10px;font-size:13px;background:#F8FBFA;color:var(--text)}
.form-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
.form-grid>div{display:flex;flex-direction:column;gap:4px}
.form-grid select,.form-grid input{border:1px solid var(--card-border);border-radius:10px;padding:9px;font-size:13px;background:#F8FBFA;width:100%}
@media (max-width:900px){.form-grid{grid-template-columns:repeat(2,1fr)}}
.fin-total{font-size:13px;color:var(--text);background:#F3F8F6;border-radius:10px;padding:10px 12px;margin-top:10px}
.fin-total b{color:var(--teal-dark)}
.fin-note{color:var(--text-2);font-size:12px;margin-left:6px}

/* ---- 可折叠分组块（财务流水按学员/按老师分组；审计日志分标签折叠复用同一套）---- */
.fold-bar{display:flex;align-items:center;gap:8px;margin:10px 0 6px}
.fold-sum{font-size:12px;color:var(--text-2);margin-right:auto}
.fold-sum b{color:var(--teal-dark)}
details.fold{border:1px solid var(--card-border);border-radius:14px;background:#fff;margin:8px 0;overflow:hidden}
details.fold>summary.fold-h{display:flex;align-items:center;gap:10px;padding:11px 14px;cursor:pointer;
  list-style:none;background:#FAFCFB;font-size:13px;color:var(--text)}
details.fold>summary.fold-h::-webkit-details-marker{display:none}
details.fold>summary.fold-h:hover{background:#F0F7F4}
details.fold[open]>summary.fold-h{border-bottom:1px solid var(--card-border)}
.fold-t{font-weight:700;color:var(--teal-dark)}
.fold-m{color:var(--text-2);font-size:12px;margin-left:auto}
.fold-m b{color:var(--text)}
.fold-x{color:var(--text-2);font-size:12px;transition:transform .15s}
details.fold[open] .fold-x{transform:rotate(180deg)}
.fold-b{padding:4px 10px 10px}

/* ---- 分成比例条 ---- */
.bars{margin:12px 0}
.bar-row{margin-bottom:10px}
.bar-lb{display:flex;justify-content:space-between;font-size:12px;color:var(--text-2);margin-bottom:4px}
.bar-lb b{color:var(--text)}
.bar{height:8px;border-radius:6px;background:#EDF2F0;overflow:hidden}
.bar-fill{height:100%;border-radius:6px;transition:width .3s}

/* ---- 复盘时间线 ---- */
.timeline{display:flex;flex-direction:column;gap:8px}
.tl-node{display:flex;gap:12px;background:#F8FBFA;border:1px solid var(--card-border);border-left:4px solid var(--teal);border-radius:12px;padding:10px 12px}
.tl-node.tl-due{border-left-color:var(--orange);background:#FFFBF5}
.tl-node.tl-ok{border-left-color:var(--green)}
.tl-date{font-size:13px;font-weight:700;color:var(--teal-dark);min-width:96px}
.tl-body{flex:1;font-size:13px;color:var(--text-2);line-height:1.7}
.tl-body b{color:var(--text)}

/* ---- 内嵌上课区（开课保留侧边栏） ---- */
.embed-sec{display:flex;flex-direction:column}
.embed-frame{width:100%;height:calc(100vh - 250px);min-height:620px;border:1px solid var(--card-border);border-radius:14px;background:#fff;margin-top:8px}
/* 【第三轮整改 · 教师端5】上课区工具条（全屏切换 / 返回列表） */
.embed-tools{float:right;display:flex;gap:8px}
/* 【第三轮整改 · 教师端5-2】全屏切换：只切 CSS 类、不重建 iframe，
   所以 iframe 内的学习进度（当前批次 / 已选词 / 剪纸盒组次）完全不受影响。
   侧边栏与主标题一并让位，把整屏交给上课内容。 */
body.embed-full{overflow:hidden}
body.embed-full .pc-side{display:none}
body.embed-full .pc-layout{display:block}
body.embed-full .pc-main-title{display:none}
/* 【第四轮整改 · S2-①】层级修正：原为 z-index:9998，比 #toast(z-index:99) 与
   .overlay(z-index:50) 都高，于是进入全屏后：
     · 唯一告知"怎么退出"的 toast 被白色不透明面板整块盖住，用户看不到任何提示；
     · 任何 console 弹层都压在 iframe 之下、点不到，且那次 Esc 会被"关掉看不见的弹层"吃掉。
   现在降为 40 —— 仍然盖住页面正文（正文无 z-index），但**低于弹层(50)与 toast(99)**，
   两者在全屏时依然可见可点；Esc 也能正常退全屏。 */
/* 【第五轮 · 三.1】全屏逻辑修正：**学习内容宽度保持不变**，只隐藏侧边栏等干扰元素。
   原实现是 left:0;right:0 —— 面板直接撑满视口，iframe 随之被拉宽
   （内嵌 ~1240px → 全屏 1500px+），正是老师说的"全屏把内容放大了"。
   现在宽度取**进入全屏前实测**出来的内嵌宽度（--embed-w，由 toggleEmbedFull/embedPinWidth 写入），
   居中摆放；只隐藏侧边栏与主标题，纵向仍占满视口（全屏的收益是纵向空间）。
   max-width:100vw 兜住"全屏中途把窗口拖窄"，避免横向溢出。 */
body.embed-full .embed-sec{
  position:fixed;top:0;bottom:0;left:50%;transform:translateX(-50%);
  width:var(--embed-w,calc(100vw - 320px));max-width:100vw;
  z-index:40;   /* 【第四轮 · S2-①】必须低于弹层(50)与 toast(99)、高于正文，别删 */
  background:#fff;margin:0;padding:10px 12px;border-radius:0;overflow:auto;
}
/* ============================================================
   【R15 · 2026-09-15 用户实测①】全屏必须真正"一屏内"（页面不许还能往下滚）
   ------------------------------------------------------------
   实测（隔离实例 8096，只读快照库；1920×1080 与 1440×900 两次都一样）：
     document.scrollingElement.scrollHeight = 1180 / 1000   vs   innerHeight = 1080 / 900
     → 溢出 100px；而且 window.scrollTo(0,99999) 之后 scrollTop=100 ⇒ **确实能滚动**。
   两个根因（都在父页 console）：
     ① 滚动元素是 html（html{overflow:visible}），body.embed-full{overflow:hidden} 锁不住视口；
     ② 溢出源实测：.console{padding-bottom:80px} + .pc-layout{min-height:calc(100vh - 66px)}
        （=1080-66=1014px，从 y=86 起算 → bottom=1100）⇒ #cb.con-main / .pc-layout bottom=1100，
        再加 80px 内边距 = 1180 = 1080+100。
   现在：全屏态把 html/body 一起锁成一屏，并让 .console/.pc-layout 不再撑高（内嵌区本身是
   position:fixed，与文档流无关，不受影响）；同时全屏时收起说明文字 .ftip（实测占 33px），
   iframe 高度改为「视口高 − 54px」＝ 上内边距10 + 标题栏28 + 上外边距6 + 下内边距10，
   使内嵌区总高恰好等于 100vh（实测 iframe 内视口高 958→1024 @1920 / 778→844 @1440）。 */
html.embed-full{overflow:hidden;height:100vh}
html.embed-full body{overflow:hidden;height:100vh}
body.embed-full .console{min-height:0;height:100vh;padding-bottom:0;overflow:hidden}
body.embed-full .pc-layout{min-height:0;height:auto;background:transparent;box-shadow:none;border-radius:0}
body.embed-full .pc-main{overflow:visible}
body.embed-full .con-main{min-height:0}
body.embed-full .ftip{display:none}
body.embed-full .embed-frame{height:calc(100vh - 54px);min-height:0;margin-top:6px;border-radius:10px}

/* ---- 打款凭证 ---- */
.proof-prev{display:flex;flex-wrap:wrap;gap:8px;margin:6px 0}
.proof-grid{display:flex;flex-wrap:wrap;gap:10px}
.proof-thumb{width:72px;height:72px;object-fit:cover;border-radius:10px;border:1px solid var(--card-border);cursor:pointer;background:#F3F8F6}
.proof-thumb.big{width:180px;height:180px}

/* ---- 弹层加宽 / 内容区 ---- */
.sheet-wide{max-width:640px;max-height:86vh;overflow-y:auto}
.modal-body{max-height:64vh;overflow-y:auto}
.sheet .field textarea{resize:vertical;font-family:inherit}
.sheet .field input[type=checkbox]{width:auto}

/* ============================================================
   【第七批 · 7】点选式时间控件（替代原生 <input type="time"> 滚轮）
   用户原话（图5）：「滚轮滑太快、必须正好停在中间才能选」。
   控件结构：快捷档 chips + 30 分钟一档的完整下拉 + 自定义文本框 + 隐藏域存值。
   三种入口都点得中：鼠标点击、手指点按（触屏下拉是列表选择，不是滚轮）。
   ============================================================ */
.tpk{display:flex;flex-direction:column;gap:6px;width:100%}
.tpk-quick{display:flex;flex-wrap:wrap;gap:6px}
.tpk-q{border:1px solid var(--card-border);background:#F8FBFA;color:var(--text-2);
  border-radius:999px;padding:5px 11px;font-size:12px;cursor:pointer;line-height:1.5}
.tpk-q:hover{border-color:var(--teal);color:var(--teal-dark)}
.tpk-q.on{background:var(--teal);border-color:var(--teal);color:#fff;font-weight:700}
.tpk-row{display:flex;gap:6px;align-items:center;flex-wrap:wrap}
.tpk-sel{flex:1 1 130px;min-width:120px}
.tpk-custom{flex:1 1 110px;min-width:104px}
.tpk-tip{font-size:11px;color:var(--muted);line-height:1.5}
.tpk-sel,.tpk-custom{border:1px solid var(--card-border);border-radius:10px;padding:8px 10px;
  font-size:13px;background:#F8FBFA;color:var(--text)}

/* ---- 窄屏下让行内操作按钮换行 ---- */
@media (max-width:700px){
  .con-list .row,.pc-main .row{flex-wrap:wrap}
  .rowacts{width:100%;justify-content:flex-start;margin-top:6px}
  .tbl{min-width:480px}
}

/* ---- 【第四轮整改 · 老师端5】我的学员「查看九宫格」：3×3 九宫格 + 点格单词列表 ---- */
.ng-head{display:flex;align-items:center;gap:6px;margin-bottom:10px;font-size:14px}
.ng-loading{padding:18px;text-align:center;color:var(--text-2);font-size:13px}
.ng-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}
.ng-cell{border:1px solid var(--card-border);border-radius:14px;padding:10px 6px;text-align:center;cursor:pointer;
  background:#F8FBFA;transition:transform .08s,box-shadow .12s;user-select:none}
.ng-cell:hover{transform:translateY(-2px);box-shadow:0 6px 14px rgba(0,0,0,.10)}
.ng-cell .ng-name{font-size:12px;color:var(--text-2);line-height:1.25;min-height:30px;
  display:flex;align-items:center;justify-content:center}
.ng-cell .ng-num{font-size:20px;font-weight:700;line-height:1.1;margin-top:2px}
.ng-cell .ng-unit{font-size:11px;color:var(--text-2)}
.ng-red{background:#FDECEC;border-color:#F3C9C9}
.ng-red .ng-num{color:#C0392B}
.ng-orange{background:#FDF3E2;border-color:#F0DCB6}
.ng-orange .ng-num{color:#B5730F}
.ng-green{background:#E7F5EE;border-color:#BFE3D0}
.ng-green .ng-num{color:#2E9E52}

/* 【2026-09-14 用户反馈】「查看九宫格」弹窗原来用默认窄宽度：3×3 格子里长标签（如「未掌握/半掌握」）
   被迫换行，整块显得又细又长、看着别扭。这里给该弹窗单独加宽，并让格名不换行、格子更接近正方形。
   类名由 console.js 的 `openModal(..., {id:'ngOv', cls:'sheet-ng'})` 挂上。 */
.sheet-ng{max-width:880px}
.sheet-ng .ng-grid{grid-template-columns:repeat(3,minmax(0,1fr));gap:12px}
.sheet-ng .ng-cell{padding:14px 12px;border-radius:16px;min-height:92px;
  display:flex;flex-direction:column;justify-content:center}
.sheet-ng .ng-cell .ng-name{min-height:auto;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  font-size:13px}
.sheet-ng .ng-cell .ng-num{font-size:26px;margin-top:4px}
.sheet-ng .ng-cell .ng-unit{font-size:11.5px}
.ng-tip{margin-top:10px;font-size:12px;color:var(--text-2);line-height:1.5}
.ngw-head{font-size:13px;margin-bottom:8px}
.ngw-note{font-size:12px;color:var(--text-2);margin-top:4px}
.ngw-list{display:flex;flex-wrap:wrap;gap:6px;margin:8px 0}
.ngw-w{display:inline-flex;flex-direction:column;border:1px solid var(--card-border);border-radius:10px;
  padding:5px 9px;font-size:13px;background:#F8FBFA}
.ngw-w small{font-size:10px;color:var(--text-2);margin-top:2px}
.ngw-foot{font-size:12px;color:var(--text-2);line-height:1.6;border-top:1px dashed var(--card-border);padding-top:8px;word-break:break-word}

/* ============================================================
   【2026-09-14 用户裁定 ⑨】老师端「课程表」（日/周/月）
   横轴 = 日期 + 星期（表头），纵轴 = 整点时间刻度（不固定起止），
   格子内容 = 学生名字 + HH:MM + 课型（正课/复盘课/游戏课）。
   只新增 .ct-* 一组类，既有 .tbl / .tbl-wrap 一行未改。
   ============================================================ */
.ct-bar{display:flex;flex-wrap:wrap;gap:10px;align-items:flex-end;margin-bottom:10px}
.ct-bar .ct-grp{display:flex;gap:6px;align-items:center}
.ct-sum{font-size:12px;color:var(--text-2);line-height:1.7;margin-bottom:8px}
.ct-scroll{width:100%;overflow:auto;max-height:70vh;border:1px solid var(--card-border);
  border-radius:14px;background:#fff}
.ct-tbl{border-collapse:separate;border-spacing:0;font-size:12px;width:100%}
.ct-tbl th,.ct-tbl td{border-right:1px solid #EEF3F1;border-bottom:1px solid #EEF3F1;padding:0}
/* 表头（横轴）：日期 + 星期 */
.ct-tbl thead th{background:#F3F8F6;color:var(--teal-dark);font-weight:700;text-align:center;
  padding:8px 6px;white-space:nowrap;position:sticky;top:0;z-index:2;min-width:104px;width:104px}
.ct-tbl thead th.ct-h-time{left:0;z-index:3;min-width:64px;width:64px}
.ct-tbl thead th .ct-d{display:block;font-size:12.5px;line-height:1.35}
.ct-tbl thead th .ct-w{display:block;font-size:11px;font-weight:400;color:var(--text-2);line-height:1.35}
.ct-tbl thead th .ct-today{color:#C0392B}
/* 纵轴：整点刻度（首列粘住，横向滚动时时间不丢） */
.ct-tbl tbody th.ct-h{position:sticky;left:0;z-index:1;background:#F8FBFA;color:var(--text-2);
  font-weight:700;text-align:center;padding:8px 4px;white-space:nowrap;width:64px;min-width:64px}
.ct-tbl tbody tr:nth-child(even) td{background:#FCFEFD}
.ct-cell{padding:5px 6px;vertical-align:top;height:100%}
.ct-cell.ct-empty{cursor:default}
.ct-cell.ct-has{cursor:pointer}
.ct-cell.ct-has:hover{background:#F0F7F4}
.ct-e{display:flex;flex-wrap:wrap;gap:3px 1px;align-items:baseline;line-height:1.45;
  font-size:11.5px;min-width:0}
.ct-e .ct-nm{font-weight:700;color:var(--text);word-break:break-all}
.ct-e .ct-tm{color:var(--text-2);font-variant-numeric:tabular-nums}
.ct-tp{display:inline-block;font-size:10px;padding:1px 6px;border-radius:8px;margin-left:2px;
  white-space:nowrap;font-weight:700}
.ct-tp-lesson{background:#DFF0EA;color:#2E9E52}
.ct-tp-review{background:#FDF0DA;color:#B5730F}
.ct-tp-game{background:#E8E4FA;color:#5B4BC4}
.ct-multi-t{font-size:11.5px;font-weight:700;color:var(--teal-dark)}
.ct-more{font-size:10px;color:var(--text-2);margin-top:2px}
.ct-e.ct-sub{margin-top:3px;padding-top:3px;border-top:1px dashed var(--card-border)}
/* ------------------------------------------------------------
   【2026-09-15 用户裁定 ③/④】格内明细：状态 + 次数/合并说明
   · .ct-st  行内状态（未开始/已完成/已合并/…）——「已合并」是后端让位语义
   · .ct-cnt 次数与合并含义，例「（本节含 7 次复盘 · 合并显示）」
     刻意用「合并显示」而非「已合并」，与 status='merged' 的「已合并」区分
   ------------------------------------------------------------ */
.ct-e .ct-st{color:var(--text-2);font-size:10px;border:1px solid var(--card-border);
  border-radius:7px;padding:0 5px;margin-left:2px;white-space:nowrap;background:#F8FBFA}
.ct-e .ct-cnt{color:#B5730F;font-size:10px;white-space:nowrap;margin-left:2px}
/* 单元格明细弹窗（标题「合并前 M 条 / 合并后 K 行」） */
.sheet-ct{max-width:980px}
.ctw-head{font-size:13px;margin-bottom:8px;line-height:1.7;color:var(--text-2)}
.ctw-head b{color:var(--teal-dark)}

/* ------------------------------------------------------------
   【R30 · 2026-09-16】「🔑 修改密码」：顶栏入口按钮 + 弹层提示
   · 入口按需求放在**用户菜单条**（.con-top）右侧，与「退出」并排；
     .topacts 只做"两颗按钮靠右 + 8px 间距"这一件事，**.con-top 自身的既有样式一字未改**。
   · 配色**沿用既有色板**：按钮底 rgba(255,255,255,.9) 与「退出」同款，
     文字用 --teal-dark，与顶栏其它元素同源，不引入任何新颜色。
   ------------------------------------------------------------ */
.con-top .topacts{margin-left:auto;display:flex;align-items:center;gap:8px}
.con-top .topacts .logout{margin-left:0}
.con-top .pwbtn{background:rgba(255,255,255,.9);color:var(--teal-dark);border:none;
  border-radius:16px;padding:8px 14px;font-size:13px;cursor:pointer;white-space:nowrap}
.con-top .pwbtn:hover{background:#fff}

/* 修改密码弹层：沿用 .sheet 既有卡片样式，只补"提示行"与"成功页"两小块 */
.pw-sheet{max-width:380px}
.pw-who{font-size:12px;color:var(--text-2);margin:-6px 0 12px;line-height:1.6}
.pw-who b{color:var(--teal-dark)}
.pw-tip{font-size:11.5px;color:var(--text-2);line-height:1.65;margin-top:10px;
  background:#F8FBFA;border:1px solid var(--card-border);border-radius:10px;padding:8px 10px}
.pw-tip b{color:var(--teal-dark)}
/* 失败态：**不引入任何新色值** —— 底色沿用 .pw-tip 已有的 #F8FBFA，
   只把文字与描边换成既有的 --red（红字 + 红框，成功/失败照样一眼可分）。
   （自证脚本 tests/_r30_password_probe.py 会断言本轮新增段里的十六进制色值
     全部在旧文件里已存在，即"没换色"。） */
.pw-tip.bad{color:var(--red);border-color:var(--red)}
.pw-done p{font-size:13px;line-height:1.85;margin-bottom:6px;color:var(--text)}
.pw-done b{color:var(--teal-dark)}
.pw-done .pw-warn{font-size:11.5px;color:var(--text-2);background:#F8FBFA;
  border:1px solid var(--card-border);border-radius:10px;padding:8px 10px;margin-top:10px;margin-bottom:0}

