:root{--bg:#f6f7f9;--card:#ffffff;--text:#24292f;--muted:#6a737d;--primary:#1a6f4b;--primary-dark:#155a3c;--danger:#e5484d;--line:#e4e7eb;--gold:#b8860b;--diamond:#6a5acd}*{box-sizing:border-box;margin:0;padding:0}body{font-family:"Microsoft YaHei","PingFang SC",system-ui,sans-serif;background:var(--bg);color:var(--text);min-height:100vh}/* ---------- 顶部导航 ---------- */ .topnav{display:none;align-items:center;gap:18px;background:#14312a;color:#fff;padding:0 24px;height:56px;position:sticky;top:0;z-index:50}.topnav .logo{font-size:18px;font-weight:700;margin-right:12px}.topnav .logo-img{display:flex;align-items:center;gap:8px}.topnav .logo-img img{height:42px;display:block;background:#fff;padding:3px 10px;border-radius:8px;box-shadow:0 1px 4px rgba(0,0,0,.25)}.topnav .logo-sub{font-size:14px;color:#cfe3dc;font-weight:400}.topnav .logo-school .school-name{font-size:18px;color:#fff;letter-spacing:.5px;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.topnav .logo-school img{height:36px;padding:2px 6px}.topnav a{color:#cfe3dc;text-decoration:none;padding:6px 10px;border-radius:6px;cursor:pointer;font-size:14px}.topnav a:hover{background:rgba(255,255,255,.12);color:#fff}.topnav a.active{background:var(--primary);color:#fff}/* 工作台标签栏（v1.29 单页合并：第二行导航，sticky 堆叠在主导航下方） */ .wb-nav{top:56px;height:46px;background:#0f2621;z-index:49;box-shadow:0 2px 8px rgba(0,0,0,.25)}.nav-user{margin-left:auto;display:flex;align-items:center;gap:10px;font-size:13px}.nav-username{font-weight:600;color:#fff !important}.member-badge{padding:2px 8px;border-radius:10px;font-size:12px;background:rgba(255,255,255,.15)}.member-school{background:rgba(255,255,255,.06);color:#cfe3dc;border:1px solid rgba(255,255,255,.28)}/* 教职工（管理员/校长/老师）徽章：与个人会员/学员区分，突出「身份自带、永久有效」 */ .member-staff{background:rgba(255,215,120,.14);color:#ffe6a8;border:1px solid rgba(255,215,120,.5)}.level-badge{padding:2px 8px;border-radius:10px;font-size:12px;background:rgba(255,255,255,.15)}.btn-link{background:none;border:none;color:inherit;cursor:pointer;font-size:13px;text-decoration:underline}/* ---------- 布局 ---------- */ #app{max-width:1120px;margin:0 auto;padding:24px 16px 60px}.page h2{margin-bottom:12px}.page h3{margin:20px 0 10px}.grid2{display:grid;grid-template-columns:1fr 1fr;gap:16px}.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:16px}.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}/* v1.99h 到期预警：项数不固定（5 项），用自适应列数，避免出现「4 + 1」的残缺行 */ .grid-auto{display:grid;grid-template-columns:repeat(auto-fit,minmax(190px,1fr));gap:16px}@media (max-width:900px){.grid3,.grid4{grid-template-columns:1fr 1fr}}@media (max-width:600px){.grid2,.grid3,.grid4{grid-template-columns:1fr}}.card{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:16px;display:flex;flex-direction:column;gap:8px}.card.stat{align-items:center;justify-content:center;padding:22px}.card.stat b{font-size:28px;color:var(--primary)}.card.stat span{color:var(--muted);font-size:13px}/* v1.99h 到期预警：可点击的统计卡（点了带筛选跳到用户管理页） */ .card.stat.stat-link{cursor:pointer;transition:border-color .15s,transform .15s,box-shadow .15s}.card.stat.stat-link:hover{border-color:#b45309;transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.10)}.card.stat.stat-link:active{transform:translateY(0)}.hero{background:linear-gradient(135deg,#1a6f4b,#14312a);color:#fff;padding:24px;gap:10px}.hero h2{margin-bottom:4px}.hero .btn{align-self:flex-start;margin-top:6px}.announcement{background:#fff8e6;border:1px solid #f0d48a;color:#7a5b00;padding:10px 16px;font-size:14px;border-radius:12px}/* 普通会员级别限制醒目提示 */ .free-limit-tip{background:#fff3cd;border:1px solid #f0c36d;color:#8a5a00;padding:12px 16px;font-size:14px;line-height:1.6;border-radius:12px;margin:10px 0 4px;font-weight:500}.free-limit-tip b{color:#b45309}.free-limit-tip a{color:#b45309;font-weight:bold;text-decoration:underline}/* v1.35 课程到期提醒（学员端首页横幅） */ .course-expire-tip{margin:10px 0;padding:10px 14px;border-radius:8px;background:#fff7ed;border:1px solid #fed7aa;color:#9a3412;font-size:14px}.course-expire-tip b{color:#b45309}.c-warn{color:#b45309}/* 后台趋势图 */ .trend-chart{display:flex;align-items:flex-end;gap:18px;padding:8px 4px;min-height:170px}.trend-col{display:flex;flex-direction:column;align-items:center;gap:6px;flex:1}.trend-bar{width:34px;background:linear-gradient(180deg,#2f9e6e,#1a6f4b);border-radius:6px 6px 2px 2px;min-height:2px}.trend-num{font-size:12px;color:var(--text);font-weight:600}.trend-day{font-size:12px;color:var(--muted)}/* 后台题目预览棋盘 */ .preview-board{display:flex;justify-content:center}.preview-board svg{width:240px;height:240px;max-width:100%}.muted{color:var(--muted);font-size:14px}.muted-small{font-size:12px}/* ---------- 按钮 / 表单 ---------- */ .btn{display:inline-block;padding:8px 16px;border-radius:8px;border:1px solid var(--line);background:#fff;color:var(--text);cursor:pointer;font-size:14px;transition:.15s}.btn:hover{border-color:var(--primary);color:var(--primary)}.btn.primary{background:var(--primary);border-color:var(--primary);color:#fff}.btn.primary:hover{background:var(--primary-dark)}.btn.danger{color:var(--danger)}.btn.active{background:var(--primary);border-color:var(--primary);color:#fff}.btn.active:hover{background:var(--primary-dark);color:#fff}.btn.block{display:block;width:100%;text-align:center}.btn.sm{padding:5px 12px;font-size:13px}.input,select.input{width:100%;padding:9px 12px;border:1px solid var(--line);border-radius:8px;font-size:14px;margin-bottom:10px;background:#fff}.input.sm{width:auto;margin-bottom:0}/* ---------- 带模糊查询的输入框 + 下拉（组合选择器） ---------- 为什么不能用 <select>代替：机构里有上千个用户时没法在下拉里一屏挑人， 必须是「输入 → 服务端模糊查 → 下拉给结果」这一种形态，原生 select 做不到。 用法：js 里 principalCombo(id) 生成结构 + bindPrincipalCombo(id) 挂行为。 ★ .wq-combo-list 是绝对定位，会溢出 .filter-row 但**不会**溢出已经允许滚动的 .modal （max-height 88vh），所以这里再压一道上限避免小屏上被裁掉一半。 */ .wq-combo{position:relative;flex:1;min-width:180px}.wq-combo>.input{margin-bottom:0;padding-right:34px}.wq-combo-arrow{position:absolute;right:4px;top:4px;bottom:4px;width:26px;padding:0;border:none;background:none;cursor:pointer;color:var(--muted);display:flex;align-items:center;justify-content:center;font-size:12px;line-height:1;border-radius:6px}.wq-combo-arrow:hover{background:var(--soft-bg,#eef3f0);color:var(--primary)}.wq-combo-list{position:absolute;left:0;right:0;top:calc(100% + 4px);z-index:5;max-height:min(240px,42vh);overflow-y:auto;background:var(--card);border:1px solid var(--line);border-radius:var(--r-btn,8px);box-shadow:var(--sh-pop,0 10px 30px rgba(16,24,20,.13))}.wq-combo-list[hidden]{display:none}.wq-combo-item{display:flex;flex-direction:column;gap:2px;cursor:pointer;padding:8px 12px;font-size:13.5px;line-height:1.4}.wq-combo-item:hover,.wq-combo-item.on{background:var(--soft-bg,#eef3f0)}.wq-combo-item b{font-weight:600}.wq-combo-item.on b,.wq-combo-item:hover b{color:var(--primary)}.wq-combo-item .wq-combo-sub{color:var(--muted);font-size:12px}.wq-combo-item-none b{color:var(--muted);font-weight:400}.wq-combo-empty,.wq-combo-loading{padding:10px 12px;color:var(--muted);font-size:12.5px}/* ---------- 登录页 ---------- */ .auth-wrap{min-height:82vh;display:flex;align-items:center;justify-content:center}.auth-card{width:400px;max-width:94vw;background:var(--card);border:1px solid var(--line);border-radius:16px;padding:32px;display:flex;flex-direction:column;gap:14px;box-shadow:0 8px 30px rgba(0,0,0,.06)}.auth-card h1{text-align:center;font-size:26px}.auth-card h1.login-title img{height:44px;vertical-align:-12px;margin-right:8px}.auth-brand{display:flex;justify-content:center}.auth-brand img{height:64px;display:block}.auth-sub{text-align:center;color:var(--muted);font-size:13px}.tabs{display:flex;border-bottom:1px solid var(--line)}.tab{flex:1;padding:10px;background:none;border:none;cursor:pointer;font-size:15px;color:var(--muted);border-bottom:2px solid transparent}.tab.active{color:var(--primary);border-bottom-color:var(--primary);font-weight:600}.auth-note{text-align:center;color:var(--muted);font-size:12px}/* v1.87c：账号到期页（.auth-card 内的续费表单）的错误行。 高度常驻（min-height）→ 提示出现 / 消失都不会把下面的按钮顶动；空值也走这里，不弹系统气泡 */ .exp-err{min-height:18px;margin:-4px 0 4px;font-size:13px;line-height:1.35;color:#B4232A;text-align:left}.auth-remember{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:13px;color:var(--muted);margin:0 0 8px}.auth-remember label{display:flex;align-items:center;gap:6px;cursor:pointer;user-select:none}.auth-remember input[type=checkbox]{width:15px;height:15px;margin:0;cursor:pointer;accent-color:var(--primary)}/* ---------- 标签 ---------- */ .tag{display:inline-block;font-size:12px;padding:2px 8px;border-radius:6px;background:#eef3f0;color:var(--primary);margin-right:6px;margin-bottom:4px}.tag.lv{background:#eef1f6;color:#456}.tag.pid{background:#f0f2f4;color:#5a6673;font-family:ui-monospace,Menlo,Consolas,monospace;letter-spacing:.3px}.tag.bad{background:#fdecec;color:#c0392b}.tag.above{background:#fff3e0;color:#b26a00}.tag.ok{background:#e6f4ea;color:#1a7f37}.tag.bad{background:#fdecec;color:var(--danger)}/* v1.35 即将到期（课程包：剩余课时不足或临近有效期） */ .tag.warn{background:#fff7ed;color:#b45309}.tag.star{background:#efeafb;color:var(--diamond)}/* ---------- 题库卡片 ---------- */ .grid-probs{display:grid;grid-template-columns:repeat(auto-fill,minmax(118px,1fr));gap:12px}.problem-card{cursor:pointer;transition:.15s;position:relative;display:flex;flex-direction:column;gap:5px;padding:8px !important}.problem-card:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:0 6px 18px rgba(0,0,0,.07)}/* v1.99n：棋盘一律方角 —— 缩略图 SVG 本身是方的，这里再给圆角会被 overflow:hidden 裁回去 */ .problem-card .thumb{background:var(--board-bg,#dcb35c);border-radius:0;overflow:hidden;border:1px solid #c9a24f;flex:1;display:flex;align-items:center;justify-content:center;min-height:0}.problem-card .thumb svg{display:block;width:100%;height:auto}.problem-card .tags{display:flex;flex-wrap:wrap;align-items:center;align-content:flex-start;gap:3px;margin-top:auto;min-height:34px}.problem-card .tags .tag{font-size:11px;padding:1px 5px;margin:0;border-radius:5px}.problem-card .fav{position:static;margin-left:auto;font-size:12px;text-decoration:none;color:var(--muted);white-space:nowrap}.problem-card .fav.faved{color:#d8a017}/* 做题对战 PK 面板 */ .pk-card{border-left:4px solid #d8a017}.pk-card .pk-me{font-size:20px;font-weight:700;margin:4px 0 8px;color:var(--primary)}.pk-card .pk-penalty{font-size:12px;font-weight:400;color:#b26a00}.pk-card .pk-op{font-size:13px;color:var(--muted);margin:2px 0}/* v1.128 定式学习文件夹导航（学员端/专项题库共用）：一级/子级文件夹按钮 + 面包屑 */ .jk-folder{border:1px solid #e5e7eb;background:#fff;border-radius:8px;padding:9px 14px;font-size:14px;cursor:pointer;display:inline-flex;align-items:center;gap:6px;transition:.15s}.jk-folder:hover{border-color:var(--primary);box-shadow:0 4px 12px rgba(0,0,0,.06)}.jk-folder .muted{font-size:12px}.jk-crumb{color:var(--primary);font-weight:600;cursor:pointer;text-decoration:none}.jk-crumb:hover{text-decoration:underline}.jk-card{max-width:158px;width:100%}/* v1.130 定式学习页（学习 / 摆一遍） */ .jk-modes{display:flex;gap:8px}.jk-mode{flex:1;border:1px solid #e5e7eb;background:#fff;border-radius:8px;padding:9px 0;font-size:14px;cursor:pointer;transition:.15s}.jk-mode:hover{border-color:var(--primary)}.jk-mode.on{background:var(--primary);border-color:var(--primary);color:#fff;font-weight:600}.jk-nav{display:flex;align-items:center;justify-content:space-between;gap:10px}.jk-prog{font-weight:600;font-size:14px;white-space:nowrap}.jk-auto-row{display:flex;gap:8px;flex-wrap:wrap}.jk-move-info{margin-top:4px}.jk-move-info p{margin:4px 0}.jk-done-txt{color:var(--primary);font-weight:600;margin:4px 0}.jk-hint{color:#b26a00;background:#fff7e6;border:1px solid #f5d9a8;border-radius:6px;padding:6px 10px;margin:6px 0}@keyframes jk-shake-k{0%,100%{transform:translateX(0)}20%,60%{transform:translateX(-6px)}40%,80%{transform:translateX(6px)}}.jk-shake{animation:jk-shake-k .3s}/* v1.130 定式学习页分支选项（有分支处棋盘以 a/b/c/d 标出，点上方按钮切换分支） */ .jk-branch{border:1px dashed var(--primary);background:#f3faf3;border-radius:8px;padding:10px 12px;margin:8px 0}.jk-branch-h{font-size:13px;color:#2f7a3a;font-weight:600;margin-bottom:8px}.jk-opt{display:inline-flex;align-items:center;gap:6px;border:1px solid var(--primary);background:#fff;color:var(--primary);border-radius:8px;padding:8px 12px;font-size:14px;cursor:pointer;transition:.15s;margin:0 6px 6px 0}.jk-opt:hover{background:var(--primary);color:#fff}.jk-opt-tn{border-color:#b9842a;color:#b9842a}.jk-opt-tn:hover{background:#b9842a;color:#fff}.chip{display:inline-flex;align-items:center;gap:4px;font-size:13px;margin-right:8px;cursor:pointer}/* 题目类型多选 chips（后台题库筛选 / 编辑弹窗 / SGF 导入共用，可控多选并自动换行） */ .ty-chips{display:inline-flex;flex-wrap:wrap;align-items:center;gap:2px 0}/* 复选框自绘样式：选中为主题绿，不依赖 accent-color（老内核也生效） */ input[type=checkbox]{appearance:none;-webkit-appearance:none;-moz-appearance:none;width:16px;height:16px;margin:0;vertical-align:-3px;border:1.5px solid #b9c2bd;border-radius:4px;background:#fff;cursor:pointer;position:relative;flex:0 0 auto}input[type=checkbox]:hover{border-color:var(--primary)}input[type=checkbox]:checked{background:var(--primary);border-color:var(--primary)}input[type=checkbox]:checked::after{content:'';position:absolute;left:4px;top:1px;width:5px;height:9px;border:solid #fff;border-width:0 2px 2px 0;transform:rotate(45deg)}input[type=checkbox]:disabled{background:#eee;border-color:#ccc;cursor:not-allowed}input[type=checkbox]:disabled:checked{background:#9db8aa;border-color:#9db8aa}input[type=radio]{accent-color:var(--primary);cursor:pointer}/* ---------- 班级 / 作业 ---------- */ .code-txt{font-family:ui-monospace,Menlo,Consolas,monospace;letter-spacing:2px;color:var(--primary)}.pk-item{position:relative}.pk-item .pk-check{position:absolute;top:6px;left:6px;width:20px;height:20px;border-radius:50%;background:rgba(255,255,255,.9);border:1px solid var(--line);color:transparent;font-style:normal;font-size:12px;line-height:19px;text-align:center}.pk-item.on{border-color:var(--primary);box-shadow:0 0 0 2px rgba(26,111,75,.25)}.pk-item.on .pk-check{background:var(--primary);border-color:var(--primary);color:#fff}.pk-item:hover{transform:none}/* 添加学生：候选学生点选列表 */ .sc-box{max-height:380px;overflow-y:auto;border:1px solid var(--line);border-radius:10px}.sc-row{display:flex;align-items:center;gap:8px;padding:8px 12px;cursor:pointer;border-bottom:1px solid var(--line);font-size:14px}.sc-row:last-child{border-bottom:none}.sc-row:hover{background:#f6f8f7}.sc-row.on{background:rgba(26,111,75,.07)}.sc-row.in{cursor:not-allowed;opacity:.6}.sc-row input[type=checkbox]{flex:0 0 auto}.sc-row b{min-width:110px}.class-card{gap:8px}/* 首页班级提醒 */ .remind-card{border-color:#e8b93e;background:#fffdf6;gap:0}.remind-line{display:flex;align-items:center;flex-wrap:wrap;gap:8px;padding:8px 0;border-top:1px dashed var(--line);font-size:14px}.remind-line:first-of-type{border-top:none}.remind-text{flex:1 1 240px;min-width:0;color:#3c4043}/* 班级通知列表 */ .notice-item{padding:10px 12px;border-radius:8px;border:1px solid var(--line);margin-bottom:8px}.notice-item:last-child{margin-bottom:0}.notice-item.new{border-color:#e8b93e;background:#fffdf3}.notice-head{display:flex;align-items:center;gap:6px;margin-bottom:4px}.notice-body{white-space:pre-wrap;line-height:1.6}/* 导航未读红点 */ .nav-dot{display:inline-block;min-width:16px;height:16px;margin-left:5px;padding:0 4px;background:#e5484d;color:#fff;border-radius:8px;font-size:11px;font-style:normal;line-height:16px;text-align:center;vertical-align:1px}/* 对弈：有小圆点=对局进行中（脉冲），带数字=有待回应的邀请 */ .nav-dot.live{min-width:0;width:8px;height:8px;padding:0;border-radius:50%;margin-left:6px;vertical-align:8px;animation:navDotPulse 1.6s ease-in-out infinite}@keyframes navDotPulse{0%,100%{box-shadow:0 0 0 0 rgba(229,72,77,.55);opacity:1}50%{box-shadow:0 0 0 5px rgba(229,72,77,0);opacity:.65}}.class-card .announce-line{background:#fff8e6;border-left:3px solid #e8b93e;padding:6px 10px;border-radius:6px;font-size:13px}.filter-row{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin-bottom:12px}/* 弹窗里的字段标签列宽度恒定，禁止在空间紧张时被压缩导致换行错位 */ .modal .filter-row>span{flex:none}/* ---------- 做题页 ---------- */ .solve-head{display:flex;justify-content:space-between;align-items:center;margin-bottom:8px}.solve-body{display:grid;grid-template-columns:minmax(340px,460px) 1fr;gap:24px;margin-top:12px}@media (max-width:800px){.solve-body{grid-template-columns:1fr}}/* v1.99n：棋盘一律方角（阴影保留，方角照样有投影） */ #boardBox svg{width:100%;height:auto;border-radius:0;box-shadow:0 6px 20px rgba(0,0,0,.12);cursor:pointer}.solve-side{display:flex;flex-direction:column;gap:14px}.side-card .btn{margin-top:8px}/* 做题页：无框状态区（提示 + 错误次数） */ .solve-status{display:flex;flex-direction:column;gap:8px;padding:0 2px}.solve-status .btn{margin-top:8px}/* 无参考答案题的醒目提示 */ .no-answer-tip{margin:4px 0 0;padding:8px 10px;border:1px solid #f0c14b;border-radius:8px;background:#fff8e1;color:#8a6100;font-size:13px;font-weight:bold;line-height:1.5}/* v1.99q 做题页提示条：对方落子冷却倒计时（灰蓝）/ 容错重做提示（琥珀，与 .no-answer-tip 同色系） */ .lock-tip{margin:0 0 8px;padding:8px 10px;border:1px solid var(--line);border-radius:8px;background:var(--bg);color:var(--muted);font-size:13px;line-height:1.5;text-align:center}.lock-tip b{color:var(--primary);font-size:15px}.lock-tip.warn{border-color:#f0c14b;background:#fff8e1;color:#8a6100}/* ---------- 会员表 ---------- */ .member-table{width:100%;border-collapse:collapse;font-size:13px;margin-top:8px}.member-table th,.member-table td{border-bottom:1px solid var(--line);padding:7px 6px;text-align:left}/* v1.99j 不折行列（用户名 / 状态 / 班级名 / 注册时间 / 账号有效期）：列少时这些会被挤成两行， 太窄就靠外层 .card 的 overflow-x:auto 横向滚动，而不是把一个班名拆成「幼儿 / 班」 */ .member-table th.nw,.member-table td.nw{white-space:nowrap}.member-table tr.cur{background:#eef7f2}/* v1.119a：学员/用户管理「操作」列——按钮 flex 换行 + 紧凑间距，去掉默认外边距并略缩内边距 */ .member-table td .ops-cell{display:flex;flex-wrap:wrap;gap:4px;align-items:center}.member-table td .ops-cell .btn{margin:0}.member-table td .ops-cell .btn.sm{padding:4px 9px}/* ---------- 弹窗 / Toast ---------- */ .modal-mask{position:fixed;inset:0;background:rgba(0,0,0,.45);z-index:100;display:flex;align-items:center;justify-content:center;padding:16px}.modal{background:#fff;border-radius:14px;padding:24px;width:420px;max-width:96vw;max-height:88vh;overflow-y:auto}.modal-wide{width:860px}.modal.mid{width:560px;max-width:96vw}.modal.wide{width:640px}.modal.xwide{width:1020px;max-width:96vw}/* 录入/编辑线索弹窗专用宽：640px 一行放完不折行（注意 .modal.wide 已被占用成 880，不能复用） */ .modal.crm-lead{width:640px;max-width:94vw}.modal.wide .preview-board svg{width:300px;height:300px}.modal h3{margin-bottom:10px}.modal p{margin-bottom:8px}/* 操作按钮吸底：弹窗内容过高时（小屏 / 字段较多）也能随时点到"保存" */ .modal-actions{display:flex;gap:10px;justify-content:flex-end;margin-top:16px;position:sticky;bottom:-24px;background:#fff;padding:12px 0 0;flex-wrap:wrap}.modal-actions .btn{white-space:nowrap}/* 按钮文案不折行（段级位引导有三个按钮） */ .toast{position:fixed;top:70px;left:50%;transform:translateX(-50%) translateY(-12px);background:#333;color:#fff;padding:10px 18px;border-radius:8px;font-size:14px;opacity:0;transition:.25s;z-index:200;pointer-events:none}.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}.toast.error{background:var(--danger)}/* 答案建议审核：待审数量角标 + 宽版双栏（左列表 / 右棋盘+手数导航） */ .btn .badge{display:inline-block;min-width:18px;height:18px;line-height:18px;padding:0 5px;border-radius:9px;background:#e5484d;color:#fff;font-size:12px;font-weight:bold;text-align:center;vertical-align:2px;margin-left:2px}.sug-layout{display:flex;gap:18px;align-items:flex-start}.sug-list{flex:1.15;max-height:62vh;overflow-y:auto;min-width:320px;padding-right:4px}.sug-detail{flex:1;min-width:340px;position:sticky;top:0}.sug-item{border:1px solid var(--line,#ddd);border-radius:8px;padding:10px 12px;margin-bottom:10px;cursor:pointer}.sug-item.sel{border-color:#3b82f6;box-shadow:0 0 0 2px rgba(59,130,246,.15)}.sug-detail .goboard{width:min(400px,100%);height:auto}.btn[disabled]{opacity:.45;cursor:not-allowed}@media (max-width:900px){.sug-layout{flex-direction:column}.sug-list,.sug-detail{min-width:0;width:100%}.sug-detail{position:static}}.footer{text-align:center;color:var(--muted);font-size:12px;padding:20px}/* 做题页：内嵌结果提示与题目导航 */ .solve-result{font-weight:bold;margin:6px 0;font-size:14px}.solve-intro{white-space:pre-wrap;word-break:break-word;font-size:13px;line-height:1.6;margin:6px 0 0}.solve-result.ok{color:var(--ok,#1a7f37)}.solve-result.warn{color:#b7791f}.solve-result.fail{color:var(--danger,#e5484d)}.nav-btns{display:flex;gap:10px;margin-top:2px}.nav-btns .btn{flex:none;width:auto;margin-top:0;white-space:nowrap;padding:5px 12px;font-size:16px;background:var(--card);transition:background .15s,color .15s,border-color .15s}.nav-btns .btn:hover{background:var(--primary);border-color:var(--primary);color:#fff}/* 做题页：黑先/题面说明合并后的紧凑信息卡 */ .solve-info{padding:10px 12px;gap:4px}.solve-info>b{font-size:13px}.solve-info .solve-intro{margin:2px 0 0}/* 答案导航与上方题面说明之间用虚线分隔 */ .solve-info #ansNav{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line)}.solve-info #ansNav:empty{display:none}/* v1.118 做完后答案默认折叠：点「查看答案」展开 —— 显式声明 hidden，防止 flex/display 规则盖掉 */ .solve-info .ans-wrap{margin-top:10px}.solve-info .ans-body[hidden]{display:none}/* 做完后的操作按钮行（重做/试下/研究/提交答案） */ .after-actions{display:flex;gap:8px;margin-top:8px}.after-actions .btn{flex:1;margin-top:0;padding:5px 8px;font-size:13px;white-space:nowrap}/* 研究模式：控制条 + 棋盘上的候选圆点 */ .after-actions.research-bar{flex-wrap:wrap;align-items:center}.research-tip{flex:1 1 100%;font-size:12px;line-height:1.4}.research-tip .dot-ok,.research-tip .dot-bad{padding:0 5px;border-radius:3px;color:#fff;font-weight:bold}.research-tip .dot-ok{background:#2f7ed8}.research-tip .dot-bad{background:#e5484d}.research-dot{cursor:pointer;filter:drop-shadow(0 0 3px rgba(0,0,0,.5));pointer-events:none}/* 试下 / 提交答案进行中的面板 */ .after-panel{border-top:1px dashed var(--line);padding-top:8px;margin-top:6px;display:flex;flex-direction:column;gap:6px}.after-panel .panel-title{font-size:13px}.after-panel .input{margin-bottom:0;padding:6px 10px;font-size:13px}.propose-kind{display:flex;gap:4px;font-size:13px}.propose-kind .chip{margin-right:10px}/* 做题页：答案回放的进退导航条（每条答案一个，101 围棋风格） */ #ansNav{margin-top:10px;display:flex;flex-direction:column;gap:6px}.ans-bar{display:flex;align-items:center;gap:8px;padding:6px 10px;border:1px solid #ddd;border-radius:8px;background:#fafafa;font-size:13px}.ans-bar.cur{border-color:#1a7f37;background:#f0f9f1}.ans-tag{font-weight:bold;min-width:74px}.ans-bar button{width:32px;height:28px;border:1px solid #ccc;border-radius:6px;background:#fff;cursor:pointer;font-size:13px;line-height:1}.ans-bar button:disabled{opacity:.4;cursor:default}.ans-bar .muted{min-width:64px;text-align:center}.ans-group{margin:8px 0 4px;font-size:13px;font-weight:bold;color:#555;border-left:3px solid #1a7f37;padding-left:8px}.ans-group:first-child{margin-top:0}/* 后台编辑弹窗：答案分类调整行 */ .pcats{max-height:240px;overflow-y:auto;border:1px solid #e3e3e3;border-radius:8px;padding:6px 10px}.cat-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:4px 0;border-bottom:1px dashed #eee;font-size:13px}.cat-row:last-child{border-bottom:none}.cat-label{min-width:0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ans-note{margin:-2px 0 6px;padding:6px 10px;border:1px solid #d8ecd9;border-top:none;border-radius:0 0 8px 8px;background:#f0f9f1;font-size:13px;line-height:1.5;color:#444;word-break:break-all}/* 对战大厅：工具栏 + 房间列表（表头与行同列宽对齐） */ .b-room-bar{display:flex;align-items:center;gap:10px;margin-bottom:10px;flex-wrap:wrap}.b-room-bar h3{margin:0}.b-room-head,.b-room{display:grid;grid-template-columns:92px 120px 108px 64px 1fr 128px;gap:10px;align-items:center}.b-room-head{padding:4px 4px 7px;border-bottom:2px solid #e3e3e3;font-size:12px;font-weight:bold;color:#8a8a8a;letter-spacing:1px}.b-room{padding:9px 4px;border-bottom:1px dashed #e3e3e3;font-size:14px;border-radius:6px;transition:background .15s}.b-room:hover{background:#f6faf6}.b-room:last-child{border-bottom:none}.b-room-code{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:16px;letter-spacing:2px;color:var(--primary)}.b-room-op{display:flex;justify-content:flex-end;align-items:center;gap:8px}@media (max-width:720px){.b-room-head,.b-room{grid-template-columns:80px 90px 96px 52px 1fr 108px;gap:6px;font-size:13px}}/* ============ 对弈（v1.34）：大厅 + 对局页 ============ */ .match-wrap{display:flex;gap:16px;align-items:flex-start;flex-wrap:wrap}.match-wrap>.card:first-child{flex:1 1 540px;min-width:360px}.match-side{flex:0 0 280px}@media (max-width:900px){.match-side{flex:1 1 100%}}.match-players{display:flex;flex-direction:column;gap:8px;margin-bottom:10px}.mp-row{display:flex;align-items:center;gap:8px;padding:7px 10px;border-radius:8px;background:#f3f5f8;border:1.5px solid transparent;font-size:14px}.mp-row.active{border-color:var(--primary);background:#eaf4ee}.mp-stone{width:16px;height:16px;border-radius:50%;flex:0 0 auto}.mp-stone.b{background:#1a1a1a}.mp-stone.w{background:#f5f5f0;border:1px solid #bbb}.mp-clock{margin-left:auto;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:13px;color:#456;background:#fff;border:1px solid #e3e3e3;border-radius:6px;padding:2px 8px;min-width:64px;text-align:center}.mp-clock.low{color:var(--danger);border-color:var(--danger);font-weight:bold}.match-board{display:flex;justify-content:center}.match-board .goboard{width:100%;max-width:560px;height:auto;cursor:pointer}.match-kv{display:flex;justify-content:space-between;gap:10px;padding:5px 0;border-bottom:1px dashed #ececec;font-size:13px}.match-kv span:first-child{color:var(--muted)}.match-result{font-size:15px;font-weight:bold;color:var(--primary);text-align:center;padding:6px 0}/* v1.44 对局终局：本局触发的下棋段级位升降提示 */ .match-rank-change{text-align:center;font-size:13px;padding:2px 0 6px;color:var(--primary,#1a7f37)}.match-rank-change b{font-size:15px}/* 对战 PK 侧栏：每人每题对错/罚时徽标 */ .pk-line{margin:6px 0 2px}.pk-line-top{display:flex;justify-content:space-between;align-items:center;font-size:13px;gap:8px}.pk-chips{display:flex;flex-wrap:wrap;gap:4px;margin-top:4px}.b-chip{display:inline-block;min-width:34px;text-align:center;padding:2px 5px;border-radius:6px;font-size:11px;font-family:ui-monospace,Menlo,Consolas,monospace}.b-chip.ok{background:#e5f4e6;color:#1a7f37;border:1px solid #bfe3c2}.b-chip.bad{background:#fdeaea;color:#c0392b;border:1px solid #f3c1c1}.b-chip.cur{background:#fff6df;color:#b26a00;border:1px solid #f0dca8}.b-chip.na{background:#f2f2f2;color:#bbb;border:1px solid #e3e3e3}/* 对战结算排名 */ .b-rank{display:flex;flex-direction:column;gap:10px;margin-top:6px}.b-rank-row{border:1px solid #e3e3e3;border-radius:8px;padding:8px 12px;background:#fafafa}.b-rank-top{display:flex;align-items:center;gap:8px;font-size:14px;flex-wrap:wrap}.b-rank-total{margin-left:auto;font-size:13px;color:#555}/* ============ v1.16 段级位 ============ */ .rank-big{font-size:22px;font-weight:600;color:var(--primary,#1a7f37);letter-spacing:1px}.rank-progress{height:10px;background:#eee;border-radius:6px;overflow:hidden;margin:6px 0 10px}.rank-progress>i{display:block;height:100%;background:var(--primary,#1a7f37);border-radius:6px;transition:width .3s}.tbl{width:100%;border-collapse:collapse;font-size:13px;margin:6px 0}.tbl th,.tbl td{border-bottom:1px solid #eee;padding:6px 8px;text-align:left}.tbl th{color:#666;font-weight:500}/* v1.19 棋书 */ .grid-books{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px;margin-top:12px}.book-card{padding:14px}.book-head{font-size:15px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}.book-meta{color:var(--muted);font-size:13px;margin:8px 0}.book-actions{display:flex;gap:8px;flex-wrap:wrap}.book-chapter{margin-top:16px}.book-chapter>h3{margin:8px 0}.book-section{margin:8px 0 8px 14px}.book-section>b{font-size:14px}.book-item-actions{margin-top:6px;display:flex;gap:6px}/* v1.23 我的棋书（学员端） */ .book-card[data-bk]{cursor:pointer;transition:border-color .15s}.book-card[data-bk]:hover{border-color:var(--green,#3B6D11)}.book-name{font-size:15px;font-weight:500;margin-bottom:6px}.bk-sec{margin:12px 0 6px;font-size:14px}.prob-check{position:absolute;left:6px;top:6px;z-index:2}.prob-check input{width:16px;height:16px}.prob-title{font-size:13px;margin-top:4px;color:#333;line-height:1.3}.modal.wide{max-width:880px;width:94vw}/* ============ v1.39 对弈大厅：在线棋友 / 自动匹配 / 邀请对局 ============ */ .m-lobby-bar{display:flex;align-items:center;gap:12px;flex-wrap:wrap}.m-go{font-size:16px;padding:10px 30px;border-radius:10px;letter-spacing:2px}.m-queue{display:flex;align-items:center;gap:16px;margin-top:14px;padding:12px 16px;background:#f1f8f4;border:1px solid #cfe6db;border-radius:10px}.m-ring{width:60px;height:60px;flex:none}.m-ring-bg{fill:none;stroke:#dbe7e1;stroke-width:6}.m-ring-fg{fill:none;stroke:var(--primary);stroke-width:6;stroke-linecap:round;transform:rotate(-90deg);transform-origin:50% 50%}.m-queue-txt{line-height:1.6}.m-queue-num{font-size:20px;font-weight:700;color:var(--primary);margin-right:2px}.m-invite{display:flex;align-items:center;gap:12px;margin-top:12px;padding:12px 16px;background:#fffdf3;border:1px solid #ecd9a3;border-radius:10px}.m-sent{display:flex;align-items:center;gap:10px;margin-top:12px;padding:10px 16px;background:#f6f8fa;border:1px solid var(--line);border-radius:10px;font-size:13px}.m-people{display:flex;flex-direction:column}.m-person{display:flex;align-items:center;gap:12px;padding:9px 6px;border-bottom:1px solid var(--line)}.m-person:last-child{border-bottom:none}.m-person.me{background:#f1f8f4;border-radius:8px;border-bottom-color:transparent;padding:9px 10px}.m-avatar{width:40px;height:40px;border-radius:50%;color:#fff;flex:none;display:flex;align-items:center;justify-content:center;font-size:17px;font-weight:700;user-select:none}.m-avatar.pick{cursor:pointer;box-shadow:0 0 0 0 rgba(26,111,75,.35);transition:box-shadow .15s,transform .15s}.m-avatar.pick:hover{box-shadow:0 0 0 4px rgba(26,111,75,.18);transform:translateY(-1px)}.m-pname{font-size:14px}.m-pinfo{min-width:120px}.m-pstate{flex:none}.m-pact{flex:none;display:flex;gap:8px;min-width:96px;justify-content:flex-end}/* ---------- v1.40 棋谱（我的棋谱 / 复盘） ---------- */ .kifu-wrap{display:flex;gap:20px;flex-wrap:wrap;align-items:flex-start}.kifu-wrap .match-board{flex:1 1 520px}.kifu-side{flex:1 1 280px;min-width:250px}.kifu-stu-list{max-height:46vh;overflow:auto}.kifu-stu-list table{min-width:540px}/* ---------- v1.41 两种段级位（做题 / 下棋）成对下拉 ---------- */ .rk-pair{display:flex;align-items:center;gap:4px;margin:2px 0}.rk-pair>.muted{flex:none}.rk-pair select{width:96px}/* ---------- v1.41 响应式导航：窄屏换行 / 横向滚动，避免段级位徽标被挤出屏幕 ---------- */ @media (max-width:820px){#nav.topnav{flex-wrap:wrap;height:auto;min-height:56px;padding:8px 14px;gap:8px 10px}#nav.topnav .logo-img img{height:34px}#nav.topnav .logo-school .school-name{font-size:16px;max-width:170px}#nav.topnav a{padding:5px 8px;font-size:13px;white-space:nowrap}#nav.topnav .nav-user{margin-left:0;width:100%;flex-wrap:wrap;gap:6px 8px;padding-top:6px;border-top:1px solid rgba(255,255,255,.12)}#nav.topnav .nav-username{max-width:100px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.wb-nav{position:static;top:auto}}@media (max-width:480px){#nav.topnav .logo-school .school-name{max-width:110px}#nav.topnav{gap:6px 8px}}/* 工作台标签栏（12 个页签）：窄屏横向滚动，不换行、不裁切 */ .wb-nav{overflow-x:auto;overflow-y:hidden;flex-wrap:nowrap;scrollbar-width:thin}.wb-nav>a{flex:0 0 auto;white-space:nowrap}.wb-nav>.nav-user{flex:0 0 auto;margin-left:12px}.wb-nav::-webkit-scrollbar{height:4px}.wb-nav::-webkit-scrollbar-thumb{background:rgba(255,255,255,.28);border-radius:2px}/* ---------- v1.91 界面骨架：一级域（.wb-nav 深色）+ 域内页签（.wb-subnav 浅色） ---------- 三行导航靠 sticky 偏移堆叠：主导航 56px → 一级域 46px → 域内页签 42px。 层级靠「深 / 浅」而不是靠缩进：一级是深绿实心块，二级是白底粉笔条，扫一眼就知道自己在哪一层。 */ .wb-subnav{display:flex;align-items:center;gap:4px;height:42px;padding:0 20px;position:sticky;top:102px;z-index:48;background:#fff;border-bottom:1px solid #e2ebe7;box-shadow:0 1px 4px rgba(0,0,0,.06);overflow-x:auto;overflow-y:hidden;flex-wrap:nowrap;scrollbar-width:thin}.wb-subnav>a{flex:0 0 auto;white-space:nowrap;cursor:pointer;text-decoration:none;font-size:13px;color:#4a6b5f;padding:5px 11px;border-radius:6px}.wb-subnav>a:hover{background:#eef5f1;color:#14312a}/* active 用下划线不用实心块：跟一级域区分开，也避免窄屏上一整排高亮 */ .wb-subnav>a.active{background:transparent;color:var(--primary);font-weight:600;border-radius:0;box-shadow:inset 0 -2px 0 var(--primary)}.wb-subnav::-webkit-scrollbar{height:4px}.wb-subnav::-webkit-scrollbar-thumb{background:rgba(0,0,0,.18);border-radius:2px}/* ============ 评级中心 v1.42 ============ */ .stat-grid{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;margin:12px 0 4px}@media (max-width:900px){.stat-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (max-width:520px){.stat-grid{grid-template-columns:1fr}}.stat-card{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:12px 14px;display:flex;flex-direction:column;gap:4px;min-width:0}.stat-card>b{font-size:22px;line-height:1.2;color:var(--text);font-variant-numeric:tabular-nums}.stat-card>span{font-size:12px;color:var(--muted)}.up-txt{color:#c0392b}.down-txt{color:#1a7f37}.tag.up{background:#fdecec;color:#c0392b}.tag.why{background:#eef1f6;color:#37424f}.rt-cfg-grid{display:grid;grid-template-columns:1fr 1fr;gap:0 18px}.rt-cfg{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:7px 0;border-bottom:1px dashed var(--line)}.rt-cfg:last-child{border-bottom:0}.rt-cfg>label{flex:1 1 auto;min-width:0;font-size:13px;display:flex;flex-direction:column;gap:1px}.rt-cfg>label>span{font-weight:400}.rt-cfg>input{flex:0 0 96px;width:96px;text-align:right}.rt-sum{display:flex;flex-wrap:wrap;gap:6px 16px;font-size:13px;color:var(--muted);margin:6px 0 10px}.rt-sum>span>b{color:var(--text);font-variant-numeric:tabular-nums}@media (max-width:720px){.rt-cfg-grid{grid-template-columns:1fr}}/* ---------- v1.56 错题本批量清除 ---------- */ .coll-tools{align-items:center;flex-wrap:wrap;gap:8px}.coll-pick{position:absolute;top:6px;left:6px;z-index:3;display:none;line-height:0}#collList.picking .coll-pick{display:block}.coll-pick input{-webkit-appearance:none;appearance:none;width:22px;height:22px;margin:0;cursor:pointer;position:relative;background:#fff;border:2px solid #aeb8b2;border-radius:7px;box-shadow:0 1px 5px rgba(0,0,0,.3);transition:.15s}.coll-pick input:checked{background:var(--primary);border-color:var(--primary)}.coll-pick input:checked::after{content:'';position:absolute;left:6px;top:2px;width:5px;height:10px;border:solid #fff;border-width:0 2.5px 2.5px 0;transform:rotate(45deg)}#collList.picking .problem-card .fav{display:none}/* 勾选时避免误触收藏 */ #collList.picking .problem-card:hover{transform:none}.problem-card.picked{border-color:var(--primary) !important;box-shadow:0 0 0 2px rgba(26,111,75,.28)}.problem-card.picked .thumb{opacity:.6}.coll-bar{position:sticky;bottom:0;z-index:6;margin-top:12px;padding:10px 12px;display:flex;align-items:center;gap:8px;flex-wrap:wrap;background:var(--card);border:1px solid var(--line);border-radius:10px;box-shadow:0 -4px 16px rgba(0,0,0,.08)}.coll-bar .btn[disabled]{opacity:.45;cursor:not-allowed}@media (max-width:520px){.coll-bar{gap:6px;padding:8px 10px}.coll-bar .btn{flex:1 1 auto}}/* ============ v1.63 讲义（列表 / 阅读 / 棋谱演示 / 放映） ============ */ .lect-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(268px,1fr));gap:12px}.lect-card{display:flex;gap:10px;background:var(--card);border:1px solid var(--line);border-radius:var(--r-card);padding:10px;box-shadow:var(--sh-card)}.lect-cover{width:54px;height:54px;flex:0 0 54px;border-radius:8px;overflow:hidden;background:var(--soft-bg);display:flex;align-items:center;justify-content:center;font-size:22px;color:var(--muted);font-weight:600}.lect-cover img{width:100%;height:100%;object-fit:cover}.lect-card-body{flex:1;min-width:0}.lect-card-title{font-weight:600;margin-bottom:2px;word-break:break-all}.lect-card-tags{display:flex;flex-wrap:wrap;gap:4px;align-items:center;margin-top:4px}.lect-card-ops{display:flex;flex-direction:column;gap:4px;justify-content:center}.lect-h{font-size:17px;margin:14px 0 8px}.lect-p{line-height:1.9;margin:0 0 10px;white-space:pre-wrap}.lect-img{margin:10px 0}.lect-img img{max-width:100%;border-radius:8px}.lect-tip{background:var(--soft-bg);border-radius:8px;padding:8px 10px;color:var(--muted);margin:8px 0}.lect-drop{border:2px dashed var(--line);border-radius:10px;padding:22px;text-align:center;color:var(--muted);cursor:pointer;margin:10px 0}.lect-drop.on{border-color:var(--primary);background:var(--hover-strong)}.lect-prev-list{max-height:34vh;overflow:auto;border:1px solid var(--line);border-radius:8px;margin-top:8px}.lect-prev-row{display:flex;gap:6px;align-items:center;padding:5px 8px;border-bottom:1px solid var(--line2);font-size:13px}.lect-prev-row>span:last-child{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.lect-blk-row{display:flex;gap:8px;align-items:center;padding:5px 0;border-bottom:1px solid var(--line2)}.lect-goban{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:10px;margin:10px 0}.lect-goban-top{display:flex;justify-content:space-between;align-items:center;margin-bottom:6px;gap:8px}.lect-goban-title{font-weight:600}.lect-board{max-width:520px;margin:0 auto}.lect-goban-ctl{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-top:8px}.lect-comment{margin-top:6px;min-height:22px;font-size:14px;line-height:1.6}.lect-prob{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:10px;margin:10px 0}.lect-prob-head{display:flex;gap:8px;align-items:center;margin-bottom:8px;flex-wrap:wrap}.lect-read{padding-bottom:24px}/* 放映：全屏一页页翻（课堂大屏 / 在线课堂共用） */ .lect-show{position:fixed;inset:0;z-index:9999;background:var(--bg);display:flex;flex-direction:column}.lect-show-top{display:flex;align-items:center;gap:12px;padding:10px 16px;border-bottom:1px solid var(--line);background:var(--card)}.lect-show-title{font-weight:600;font-size:16px;flex:1}.lect-show-page{color:var(--muted);font-variant-numeric:tabular-nums}.lect-show-body{flex:1;min-height:0;overflow:hidden;padding:26px 34px}/* 一页内容容器：内容超高时由 JS 整体等比缩小，大屏放映不出现滚动条 */ .ls-page{display:flex;flex-direction:column;gap:16px;transform-origin:top center}.ls-h{font-size:34px;font-weight:700;line-height:1.3}.ls-p{font-size:24px;line-height:1.85;white-space:pre-wrap}.ls-quote{font-size:22px;line-height:1.8;margin:0;padding-left:14px;border-left:4px solid var(--line);color:var(--muted);white-space:pre-wrap}.ls-img{text-align:center}.ls-img img{max-width:72%;max-height:58vh;border-radius:10px}.ls-prob{font-size:22px;background:var(--soft-bg);border-radius:10px;padding:12px 16px}.ls-probcard{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:14px}.ls-probhead{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-bottom:10px;font-size:22px}/* 放映：棋盘放大到屏幕高度以内（大屏演示用） */ .ls-goban{width:100%;max-width:900px;margin:0 auto}.ls-goban .lect-goban{margin:0}.ls-goban .lect-board,.ls-probcard .lect-board{max-width:none;width:min(68vh,100%);margin:0 auto}.lect-board .goboard{width:100%;height:auto;display:block}.lect-table{border-collapse:collapse;width:100%;font-size:15px;margin:8px 0}.lect-table td{border:1px solid var(--line);padding:6px 10px}.ls-table{font-size:20px}.lect-table-plain{white-space:pre-wrap;margin:8px 0}.ls-table.lect-table-plain{font-size:22px}.lect-show-foot{display:flex;justify-content:center;gap:14px;padding:12px;border-top:1px solid var(--line);background:var(--card)}.lect-show-foot .btn{min-width:130px}/* ================= v1.64 讲义画板编辑器（WYSIWYG） ================= */ /* ★ z-index 必须低于 modal(100) 与 toast(200)，否则编辑器里弹不出对话框、看不到提示 */ .lect-studio{position:fixed;inset:0;z-index:90;background:#eef0f4;display:flex;flex-direction:column;color:#222;font-size:13px}/* 棋谱讲解浮层：可从编辑器 / 放映层里打开，必须盖过两者 */ .lect-explain{position:fixed;inset:0;z-index:10001;background:rgba(0,0,0,.55);display:flex;align-items:center;justify-content:center}.lect-explain-box{background:#fff;border-radius:8px;padding:14px;max-width:94vw;max-height:94vh;overflow:auto;box-shadow:0 8px 30px rgba(0,0,0,.35)}.lect-explain-foot{display:flex;gap:10px;justify-content:flex-end;align-items:center;margin-top:10px}/* 讲解器（editor.html?mode=explain）以 iframe 嵌入 */ .lect-explain-frame{display:block;width:min(94vw,1320px);height:min(84vh,880px);border:0;border-radius:6px;background:#fff}/* iframe 内的讲解页：去掉整页留白与标题，尽量把空间让给棋盘 */ .ed-embed .ed-page{padding:8px 10px}.ed-embed .ed-page>h2{display:none}.ed-embed .ed-main{min-height:0}/* v1.67c 放映里双击棋盘 → 讲解全屏置顶（浮层铺满视口、无圆角无留白，iframe 吃满） */ .lect-explain.lect-explain-fs{background:#000;padding:0}.lect-explain.lect-explain-fs .lect-explain-box{width:100vw;height:100vh;max-width:100vw;max-height:100vh;padding:0;border-radius:0;overflow:hidden}.lect-explain.lect-explain-fs .lect-explain-frame{width:100vw;height:100vh;border-radius:0}/* 全屏时底部工具条浮在棋盘右下角：平时半透明少挡棋盘，鼠标移上去才完全显示 */ .lect-explain.lect-explain-fs .lect-explain-foot{position:fixed;right:14px;bottom:12px;margin:0;max-width:54vw;background:rgba(255,255,255,.8);border-radius:8px;padding:6px 12px;font-size:12px;box-shadow:0 2px 10px rgba(0,0,0,.18);opacity:.5;transition:opacity .18s,background .18s}.lect-explain.lect-explain-fs .lect-explain-foot:hover{opacity:1;background:rgba(255,255,255,.97)}.ls-bar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;padding:8px 12px;background:#fff;border-bottom:1px solid #d9dde3}.ls-bar .sep{width:1px;height:22px;background:#d9dde3;margin:0 2px}.ls-bar .btn,.ls-foot .btn,.ls-pg-add{padding:4px 10px;font-size:13px;white-space:nowrap}.ls-bar .btn.on{background:#1f6feb;border-color:#1f6feb;color:#fff}.ls-bar label{display:inline-flex;align-items:center;gap:4px}/* 工具条上的「形状 ▾」下拉 */ .ls-drop{position:relative;display:inline-block}.ls-menu{display:none;position:absolute;left:0;top:100%;z-index:95;min-width:82px;background:#fff;border:1px solid #d9dde3;border-radius:5px;padding:4px;box-shadow:0 6px 18px rgba(0,0,0,.16)}.ls-drop.open .ls-menu{display:block}.ls-mi{display:block;width:100%;text-align:left;padding:5px 10px;font-size:13px;background:none;border:0;border-radius:4px;color:#222;cursor:pointer}.ls-mi:hover{background:#eef3fb;color:#1f6feb}.ls-mid{flex:1;min-height:0;display:flex}.ls-pages{width:116px;background:#f7f8fa;border-right:1px solid #d9dde3;overflow:auto;padding:8px}.ls-pg{border:1px solid #d0d5dd;background:#fff;border-radius:4px;padding:6px;margin-bottom:6px;cursor:pointer;font-size:12px}.ls-pg.on{border-color:#1f6feb;box-shadow:0 0 0 2px rgba(31,111,235,.18)}.ls-pg.sel{border-color:#1f6feb;background:#eaf2fe}.ls-pg .pg-bg{height:8px;border-radius:3px;margin-bottom:5px;border:1px solid #d0d5dd}.ls-pg .pg-no{font-weight:600}.ls-pg .pg-meta{color:#888}.ls-pg-add{width:100%}.ls-stage{flex:1;min-width:0;overflow:hidden;display:flex;align-items:center;justify-content:center;padding:14px;background:#e4e7ec}.ls-canvas{position:relative;background:#fff;box-shadow:0 3px 16px rgba(0,0,0,.2);overflow:hidden}.ls-canvas.drawing{cursor:crosshair}.ls-props{width:196px;background:#fff;border-left:1px solid #d9dde3;padding:10px;overflow:auto}.ls-props h4{margin:0 0 8px;font-size:13px}.ls-props .row{display:flex;align-items:center;gap:6px;margin-bottom:7px}.ls-props .row>span{width:46px;color:#666;flex:none}.ls-foot{display:flex;align-items:center;gap:8px;padding:8px 12px;background:#fff;border-top:1px solid #d9dde3}.ls-foot .grow{flex:1}/* 画布元素 */ .le{position:absolute;box-sizing:border-box}.le.sel{outline:2px solid #1f6feb}.le.sel.multi{outline-style:dashed}/* 框选时的橡皮筋矩形 */ .ls-marquee{border:1px dashed #1f6feb;background:rgba(31,111,235,.08);z-index:999}.le-handle{position:absolute;right:-5px;bottom:-5px;width:11px;height:11px;background:#1f6feb;border:2px solid #fff;border-radius:2px;cursor:nwse-resize}/* 文本框必须撑满外框，否则「尺寸」改了看不出变化、文字还会溢到框外 */ .le-text{width:100%;height:100%;white-space:pre-wrap;word-break:break-word;overflow:hidden}.le-text[contenteditable="true"]{outline:2px dashed #1f6feb;background:rgba(31,111,235,.05)}.le-img{width:100%;height:100%;object-fit:contain;display:block}.le-goban{width:100%;height:100%;display:flex;flex-direction:column}.le-goban-title{font-size:12px;color:#666;text-align:center;flex:none}.le-goban-board{flex:1;min-height:0}.le-goban-board svg{width:100%;height:100%;display:block}.le-svg{width:100%;height:100%;display:block;overflow:visible}.le-hint{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#999;font-size:12px}/* 阅读 / 放映：画板页 */ .ls-slide-page{position:relative;background:#fff;margin:0 auto;overflow:hidden;box-shadow:0 2px 10px rgba(0,0,0,.12)}.lc-goban{cursor:pointer}@media (max-width:640px){.lect-grid{grid-template-columns:1fr}.lect-show-body{padding:16px}.ls-h{font-size:24px}.ls-p{font-size:18px}.ls-props{width:150px}.ls-pages{width:84px}}/* ============ v1.65 在线课堂 ============ */ .cr-grow{flex:1}.cr-live{color:#d03050;font-weight:700}/* 首页横幅 */ /* ★ .card 自带 flex-direction:column，这里必须显式改回 row，否则横幅会竖着堆 */ .cr-banner{display:flex;flex-direction:row;align-items:center;gap:10px;flex-wrap:wrap;border-left:4px solid #d03050;padding:10px 14px}.cr-banner .cr-grow{flex:1;min-width:8px}/* 老师主控台 */ .cr-console{position:fixed;inset:0;z-index:95;background:#eef0f4;color:#222;display:flex;flex-direction:column;font-size:13px}.cr-top{flex:0 0 auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 14px;background:#fff;border-bottom:1px solid #dfe3ea}.cr-title{font-size:15px;font-weight:700}.cr-sub{color:#666;font-size:12px}.cr-body{flex:1;overflow:hidden;display:flex;align-items:center;justify-content:center;padding:8px}.cr-foot{flex:0 0 auto;display:flex;align-items:center;justify-content:center;gap:14px;padding:8px 14px;background:#fff;border-top:1px solid #dfe3ea}.cr-stage{position:relative;background:#fff;box-shadow:0 2px 14px rgba(0,0,0,.14);overflow:hidden}/* 导入型讲义在课堂里按幻灯片版式放大（.cr-slide-in 内部恒为 1600×900 再整体缩放） */ .cr-slide-in{font-size:20px;color:#222}.cr-slide-in .lect-h{font-size:42px;line-height:1.3;margin:0 0 20px}.cr-slide-in .lect-p{font-size:26px;line-height:1.85;margin:0 0 16px}.cr-slide-in .lect-tip{font-size:22px}.cr-slide-in .lect-img img{max-width:62%;border-radius:10px}.cr-slide-in .lect-board{max-width:520px}.cr-slide-in table{font-size:22px}.cr-slide-in blockquote.lect-p{font-size:24px}/* 学员同步视图 */ .cr-student{display:flex;flex-direction:column;height:calc(100vh - 120px);min-height:420px}.cr-st-top{flex:0 0 auto;display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:8px 12px;background:var(--soft-bg,#f5f7fa);border-radius:8px}.cr-st-page{color:#666;font-size:12px}.cr-st-body{flex:1;min-height:0;display:flex;align-items:center;justify-content:center;padding:10px 0;overflow:hidden}.cr-student .cr-stage{box-shadow:0 1px 8px rgba(0,0,0,.10)}#crStTip{flex:0 0 auto;margin:0;text-align:center}/* ============ v1.66 课堂互动 ============ */ /* 老师主控台右侧面板（.cr-body 变定位基准，面板浮在讲义之上） */ .cr-body{position:relative}.cr-panel{position:absolute;right:10px;top:10px;bottom:10px;width:330px;z-index:3;background:#fff;border:1px solid #dfe3ea;border-radius:8px;box-shadow:0 2px 14px rgba(0,0,0,.14);display:flex;flex-direction:column;overflow:hidden}.cr-pnl-head{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:8px 10px;border-bottom:1px solid #eceff3;font-weight:700}.cr-pnl-head .cr-grow{flex:1}.cr-pnl-body{flex:1;min-height:0;overflow:auto;padding:8px 10px}.cr-pnl-sec{padding:8px 0;border-bottom:1px dashed #e6e9ef}.cr-pnl-sec:last-child{border-bottom:0}.cr-pnl-t{font-weight:700;margin-bottom:4px}.cr-pnl-t2{color:#555;font-size:12px;margin-bottom:4px}.cr-pnl-list{max-height:168px;overflow:auto;margin:4px 0 8px}.cr-pnl-row{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:4px 2px;border-bottom:1px solid #f2f4f7;font-size:12px}/* 学员端互动条 */ .cr-st-bar{flex:0 0 auto;display:flex;align-items:center;gap:8px;padding:4px 2px 6px}.cr-st-bar .cr-grow{flex:1;min-width:8px}/* 学员端答题浮层：盖在讲义之上，可收起 */ .cr-quiz{position:absolute;inset:0;z-index:4;display:flex;align-items:center;justify-content:center;background:rgba(20,24,30,.42);padding:10px}.cr-quiz-card{background:#fff;border-radius:10px;box-shadow:0 6px 24px rgba(0,0,0,.28);max-width:760px;width:100%;max-height:100%;overflow:auto}.cr-quiz-head{display:flex;align-items:center;gap:8px;padding:10px 14px;border-bottom:1px solid #eceff3}.cr-quiz-head .cr-grow{flex:1}.cr-quiz-main{display:flex;gap:14px;padding:12px 14px;align-items:flex-start}.cr-quiz-board{flex:1 1 auto;min-width:0}.cr-quiz-board svg.goboard{width:100%;height:auto;max-height:60vh}.cr-quiz-side{flex:0 0 200px;font-size:13px}.cr-quiz-side .btn{margin-right:6px}@media (max-width:640px){.cr-console{font-size:12px}.cr-top{gap:6px;padding:6px 8px}.cr-student{height:calc(100vh - 90px)}.cr-panel{width:260px;right:6px;top:6px;bottom:6px}.cr-quiz-main{flex-direction:column}.cr-quiz-side{flex:1 1 auto;width:100%}}/* ================================================================ v1.86 云端棋局登录页（.zq-sky） 全屏背景 + 左下吉祥物 + 居中玻璃卡 + 右侧「落子」主按钮 表单字段与原 tab 逻辑保持不变，此处只做视觉重排 ================================================================ */ .auth-wrap.zq-sky{position:relative;min-height:calc(100vh - 34px);overflow:hidden;padding:56px 0 26px}/* ★ 34px = #app 的上下 padding（theme.js 的 applyFit() 也用这个值算可用高度）。 高度必须留在「一屏之内」，否则大屏「适应屏幕」逻辑会给整页做等比缩放，字体和卡片都会变小。 桌面客户端顶部还有 36px 自绘标题栏（preload 注入 html.wq-tb-on），要再减掉。 */ html.wq-tb-on .auth-wrap.zq-sky{min-height:calc(100vh - 36px - 34px)}.auth-wrap.zq-sky .zq-bg{position:fixed;inset:0;z-index:0;background:url(../img/login-bg.jpg?v=202610262321) center center / cover no-repeat}.auth-wrap.zq-sky .zq-fox{position:absolute;left:1.5%;bottom:0;height:64%;max-height:540px;width:auto;z-index:1;pointer-events:none;animation:zqFox 6.5s ease-in-out infinite}@keyframes zqFox{0%,100%{transform:translateY(0)}50%{transform:translateY(-16px)}}.auth-wrap.zq-sky .auth-card{position:relative;z-index:2;width:452px;max-width:92vw;padding:50px 40px 28px;border-radius:32px;background:rgba(255,255,255,.93);border:3px solid rgba(255,255,255,.95);box-shadow:0 20px 48px rgba(70,90,150,.30)}/* ---- v1.86c/d 顶部品牌区：描金徽章（图）+ 品牌字标（图，标题/印章/缎带标语都在里面） ---- */ .zq-crest{position:absolute;top:-36px;left:50%;width:82px;height:82px;z-index:3;pointer-events:none;transform:translateX(-50%);filter:drop-shadow(0 8px 15px rgba(150,95,20,.32));animation:zqCrest 5.2s ease-in-out infinite}@keyframes zqCrest{0%,100%{transform:translateX(-50%) translateY(0) rotate(-2deg)}50%{transform:translateX(-50%) translateY(-7px) rotate(2deg)}}/* 品牌字标图（@2x PNG）：标题 + 印章 + 缎带标语都在图里，页面上不再依赖任何字体 */ .zq-lockup{display:block;width:316px;max-width:100%;height:auto;margin:0 auto 14px;filter:drop-shadow(0 8px 14px rgba(150,80,20,.18))}.auth-wrap.zq-sky .auth-sub{margin:0}/* ---- v1.92 登录 / 注册 / 续费：三个选项卡（胶囊分段控件）---- 原来只有底部两颗按钮在切换，看不出是「三选一」。 ① 轨道是半透明胶囊，选中项是一个白色小胶囊（带绿色描边，跟主按钮一个色系） ② 高度固定 40px（紧凑 34px）→ 切页签时卡片上下都不跳 ③ 只有颜色与阴影变化，不做位移/缩放动画，避免跟卡片的呼吸动画打架 */ .auth-wrap.zq-sky .zq-tabs{display:flex;gap:4px;width:100%;margin:0 auto 14px;padding:4px;box-sizing:border-box;border-radius:999px;background:rgba(255,255,255,.58);border:1px solid rgba(120,160,190,.20);box-shadow:inset 0 1px 3px rgba(90,120,150,.10)}.auth-wrap.zq-sky .zq-tab{flex:1;height:32px;padding:0 6px;border:0;border-radius:999px;background:transparent;color:#7C8FA3;font-size:15px;font-weight:600;letter-spacing:2px;cursor:pointer;transition:color .18s ease,background .18s ease,box-shadow .18s ease}.auth-wrap.zq-sky .zq-tab:hover{color:#2F7A2A;background:rgba(255,255,255,.55)}.auth-wrap.zq-sky .zq-tab.active{color:#2F7A2A;font-weight:700;background:linear-gradient(180deg,#FFFFFF,#F4FAF0);box-shadow:0 2px 6px rgba(70,110,60,.16),inset 0 0 0 1px rgba(47,122,42,.22)}.auth-wrap.zq-sky .zq-tab:focus-visible{outline:2px solid rgba(47,122,42,.55);outline-offset:2px}/* v1.87b：登录页容器要铺满宽度 —— #app 的 1120 上限会把右侧「进入」圆钮切掉一块 ★ 选择器写到 `html.wq-fit>body>main#app.auth-page`：theme.css 的 `html.wq-fit>body>#app{max-width:1120px}` 特异性更高，低配写法会被它压住（血泪：只写 `#app.auth-page` 完全不生效） */ html.wq-fit>body>main#app.auth-page,body>main#app.auth-page{max-width:none;padding:0}/* 输入框：圆角 + 左侧小图标 */ .auth-wrap.zq-sky .input{height:48px;border-radius:999px;padding:0 16px 0 44px;font-size:15px;background-repeat:no-repeat;background-position:15px center;background-size:20px 20px}.auth-wrap.zq-sky input[name=username]{border-color:#BFE3F7;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Ccircle cx='12' cy='8' r='4.2' fill='%237FC4EE'/%3E%3Cpath d='M4 21c0-4.4 3.6-7 8-7s8 2.6 8 7z' fill='%237FC4EE'/%3E%3C/svg%3E")}.auth-wrap.zq-sky input[name=password],.auth-wrap.zq-sky input[name=password2]{border-color:#CBE5BC;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='4' y='10' width='16' height='11' rx='3' fill='%238FCB6B'/%3E%3Cpath d='M8 10V7a4 4 0 118 0v3' stroke='%238FCB6B' stroke-width='2.6' fill='none'/%3E%3C/svg%3E")}.auth-wrap.zq-sky input[name=cardNo],.auth-wrap.zq-sky input[name=cardCode]{border-color:#FFD89B;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='6' width='18' height='13' rx='3' fill='%23FFB74D'/%3E%3Cpath d='M3 11h18' stroke='%23fff' stroke-width='2'/%3E%3C/svg%3E")}.auth-wrap.zq-sky input[name=email]{border-color:#D9CFE8;background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Crect x='3' y='6' width='18' height='13' rx='3' fill='%23A98CD8'/%3E%3Cpath d='M3 8l9 6 9-6' stroke='%23fff' stroke-width='2' fill='none'/%3E%3C/svg%3E")}/* v1.87c：错误提示与「记住密码」同一行（.zq-msgrow）。 ★ 这一行常驻 + 高度固定 → 提示出现 / 消失都不改变卡片高度，卡片里的输入框、按钮一律不位移。 （v1.86i 版本是表单顶部一整块横幅，一出现就把下面的字段全顶下去，已废弃） */ .auth-wrap.zq-sky .auth-remember.zq-msgrow{min-height:26px;overflow:hidden}.auth-wrap.zq-sky .zq-msgrow .only-remember{flex:0 0 auto}.auth-wrap.zq-sky .zq-alert{display:flex;align-items:center;gap:6px;flex:0 1 auto;min-width:0;padding:3px 10px;border-radius:999px;background:#FDECEC;border:1px solid #F8CBCB;color:#B4232A;text-align:left;animation:zqAlertIn .24s cubic-bezier(.2,.9,.3,1.1)}.auth-wrap.zq-sky .zq-alert[hidden]{display:none}/* 必须显式声明：flex 会盖掉 hidden 的默认 display:none */ .auth-wrap.zq-sky .zq-alert-ic{flex:0 0 14px;width:14px;height:14px}/* 只占一行：放不下就末尾省略（完整原文挂在 title 上），绝不允许换行把卡片顶高 */ .auth-wrap.zq-sky .zq-alert-t{font-size:13px;font-weight:600;line-height:1.35;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.auth-wrap.zq-sky .auth-card.zq-compact .zq-alert-t{font-size:12px}/* v1.89：错误条尾部的操作按钮（如「强制下线并登录」）。 ★ 高度 20px + 字号 12px：塞进 26px 固定行里，出现与否都不改变卡片高度。 */ .auth-wrap.zq-sky .zq-alert-act{flex:0 0 auto;height:20px;padding:0 9px;margin-left:2px;border:1px solid #E8A0A2;border-radius:999px;background:#fff;color:#B4232A;font-size:12px;font-weight:600;line-height:1;white-space:nowrap;cursor:pointer}.auth-wrap.zq-sky .zq-alert-act:hover{background:#B4232A;border-color:#B4232A;color:#fff}.auth-wrap.zq-sky .zq-alert-act:active{transform:translateY(1px)}/* 带按钮时上下内边距收到 1px：按钮 20px + padding 2 + 边框 2 = 24px，仍塞在 26px 的固定行里 → 卡片高度不变 */ .auth-wrap.zq-sky .zq-alert.has-act{padding:1px 4px 1px 10px}/* v1.87c：只做淡入，不做位移 —— 提示所在的这一行高度是固定的，任何位移都会让它看着在动 */ @keyframes zqAlertIn{from{opacity:0}to{opacity:1}}/* 出错字段描红：只描边 + 极淡红晕，不改底色，避免整块变红显得刺眼 */ .auth-wrap.zq-sky .input.zq-err{border-color:#E5484D;box-shadow:0 0 0 3px rgba(229,72,77,.13)}.auth-wrap.zq-sky .input.zq-err:focus{box-shadow:0 0 0 3px rgba(229,72,77,.20)}/* 卡片轻晃一次：幅度很小（±5px），只做提醒，不做成反复抖动 */ .zq-shake{animation:zqShake .42s cubic-bezier(.36,.07,.19,.97)}@keyframes zqShake{0%,100%{transform:translateX(0)}18%{transform:translateX(-5px)}38%{transform:translateX(4px)}58%{transform:translateX(-3px)}78%{transform:translateX(2px)}}@media (prefers-reduced-motion:reduce){.zq-shake{animation:none}.auth-wrap.zq-sky .zq-alert,.auth-wrap.zq-sky .zq-picks{animation:none}}.auth-wrap.zq-sky .auth-remember{margin:10px 0 2px;font-size:14px}.auth-wrap.zq-sky .auth-remember input[type=checkbox]{width:16px;height:16px;accent-color:#3AA635;cursor:pointer}.auth-wrap.zq-sky .auth-note{margin:8px 0 0;font-size:13px}/* ---- v1.90 账号框下拉：可以直接输入，也可以点选本机保存过的账号 ---- ★ .zq-field 只负责给右侧那颗小箭头做定位，输入框原本的 margin-bottom 挪到了这层上 （见下面 `>.input{margin-bottom:0}`）→ 卡片高度、字段间距与以前分毫不差。 */ .auth-wrap.zq-sky .zq-field{position:relative;margin-bottom:10px}.auth-wrap.zq-sky .auth-card.zq-compact .zq-field{margin-bottom:5px}/* ★ 输入框自己的 margin-bottom 一律作废：字段间距改由外层 .zq-field 统一控制，值与改造前一致； 右侧同时给箭头留出位置（输入框本来就只用到左边 44px 那个图标）。 ★ 这两条必须把紧凑模式（注册 / 续费）一起写进来：`.auth-card.zq-compact .input` 的特异性比自己高，会把 margin / padding 盖回旧值 —— 那样字段间距变成 6+6=12px、 卡片凭空长高 6px、箭头也不再垂直居中（实测差 3px）。 */ .auth-wrap.zq-sky .zq-field>.input,.auth-wrap.zq-sky .auth-card.zq-compact .zq-field>.input{margin-bottom:0;padding-right:44px}/* 小箭头：32px 圆钮 + 垂直居中 → 输入框 48 / 紧凑 42 都跟着居中，不用分别写 v1.99s：给一层极淡的底 —— 原来纯透明，等于「有 12 条记录」这件事完全看不出来 */ .auth-wrap.zq-sky .zq-field-caret{position:absolute;top:50%;right:7px;transform:translateY(-50%);width:32px;height:32px;padding:0;border:0;border-radius:50%;display:flex;align-items:center;justify-content:center;background:#EDF4FA;color:#6D8CA4;cursor:pointer}/* ★ 必须显式声明：上面的 display:flex（作者样式）会盖掉 hidden 自带的 display:none */ .auth-wrap.zq-sky .zq-field-caret[hidden]{display:none}.auth-wrap.zq-sky .zq-field-caret:hover{background:#EAF4FA;color:#2E7DA8}.auth-wrap.zq-sky .zq-field-caret svg{width:16px;height:16px;transition:transform .18s ease}.auth-wrap.zq-sky .zq-field-caret.on svg{transform:rotate(180deg)}/* 展开的面板：绝对定位 → 完全不参与布局，卡片高度不受影响，也不会把「进入」圆钮顶走 v1.99s：高度按「12 条 × 34px + 表头 + 内边距」给足（原来 198px 只看得到 5 条）， 视口不够就滚动；下方放不下时自动改成向上弹（.up）。 */ .auth-wrap.zq-sky .zq-picks{position:absolute;left:0;right:0;top:calc(100% + 6px);z-index:6;padding:5px;max-height:min(58vh,452px);overflow:auto;background:#fff;border:1px solid #D9E8F2;border-radius:14px;box-shadow:0 14px 30px rgba(60,90,130,.20);animation:zqAlertIn .16s ease;/* 只淡入、不位移（同错误条的理由） */}.auth-wrap.zq-sky .zq-picks[hidden]{display:none}/* 下方空间不够 → 贴着输入框向上展开，翻到列表底部也看得见 */ .auth-wrap.zq-sky .zq-picks.up{top:auto;bottom:calc(100% + 6px)}.auth-wrap.zq-sky .zq-picks-h{padding:3px 9px 5px;font-size:11px;letter-spacing:.5px;color:#9BB0C0}.auth-wrap.zq-sky .zq-picks-h b{color:#5E7E97;font-weight:600}.auth-wrap.zq-sky .zq-pick{display:flex;align-items:center;gap:8px;height:34px;padding:0 4px 0 10px;border-radius:9px;cursor:pointer;font-size:14px;color:#2C3E50}.auth-wrap.zq-sky .zq-pick:hover,.auth-wrap.zq-sky .zq-pick.on{background:#EFF7FD}.auth-wrap.zq-sky .zq-pick-n{flex:1 1 auto;min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}/* v1.99s：一行里「姓名 + 账号」——姓名是主、账号是小字（没姓名的老记录只显示账号） */ .auth-wrap.zq-sky .zq-pick-txt{flex:1 1 auto;min-width:0;display:flex;align-items:baseline;gap:8px}.auth-wrap.zq-sky .zq-pick-nm{min-width:0;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.auth-wrap.zq-sky .zq-pick-id{flex:0 0 auto;font-size:12px;color:#9BB0C0}.auth-wrap.zq-sky .zq-pick-x{flex:0 0 auto;width:24px;height:24px;padding:0;border:0;border-radius:50%;display:flex;align-items:center;justify-content:center;background:transparent;color:#C2D0DB;font-size:15px;line-height:1;cursor:pointer}.auth-wrap.zq-sky .zq-pick-x:hover{background:#FBE3E4;color:#C8383E}.auth-wrap.zq-sky .zq-picks-empty{padding:7px 10px;font-size:12px;color:#9BB0C0}/* v1.92：底部「注册账号 / 账号续费」两颗按钮已由顶部选项卡取代，相关样式一并移除 */ .zq-submit-fallback{display:none}.zq-demo{margin-top:12px}/* 主按钮：「落子」圆钮，静态悬浮在卡片右侧的棋盘交叉点上 ★ 位置改为「跟着卡片右边缘走」：卡片半宽 226 + 间隙 24 = 250（原来写死 clamp 中值， 卡片一变窄圆钮就会飘到很远处；右侧 1180px 以下断点会改回卡片下方居中） */ .zq-enter{position:absolute;z-index:3;width:164px;height:164px;border:6px solid #fff;border-radius:50%;cursor:pointer;color:#fff;font-size:40px;font-weight:900;letter-spacing:3px;padding:0;/* 球面感：主渐变给「上亮下暗」，两道 inset 再补一层顶部高光 + 底部暗部， 让它看着像一颗真的棋子，而不是一块扁平色块 */ background:linear-gradient(160deg,#A6EC77 4%,#63CB52 46%,#379E32 100%);box-shadow:0 8px 0 #2F7A2A,0 18px 30px rgba(14,80,26,.32),inset 0 7px 13px rgba(255,255,255,.34),inset 0 -9px 15px rgba(9,60,20,.20);left:calc(50% + 250px);top:calc(50% + 42px);transition:transform .22s cubic-bezier(.22,.9,.32,1.18),box-shadow .22s ease,filter .22s ease,text-shadow .22s ease;animation:zqEnter 3.2s ease-in-out infinite}@keyframes zqEnter{0%,100%{filter:brightness(1)}50%{filter:brightness(1.06)}}/* ★ 悬停：像一颗棋子被「提」起来一点再落回棋盘 —— ① translateY(-5px) + 底边厚度 8px→13px：离盘面更高，立体感立刻出来 ② 投影同步变大变虚：符合「物体越高、影子越散」的真实物理 ③ brightness/saturate 轻抬一档：提亮但不刺眼（不动背景色，避免和呼吸动画打架） ④ 外圈加一圈极淡的绿光晕 + 字加投影：让它在浅色背景上「浮」出来 ⑤ animation:none —— 关键！呼吸动画持续改写 filter，不掐掉它 hover 的亮度变化根本不生效 */ .zq-enter:hover,.zq-enter:focus-visible{animation:none;transform:translateY(-5px) scale(1.045);filter:brightness(1.08) saturate(1.08);text-shadow:0 3px 9px rgba(8,58,18,.40);outline:none;box-shadow:0 13px 0 #2A7226,0 30px 46px rgba(14,80,26,.42),0 0 0 12px rgba(158,232,111,.20),0 0 34px 10px rgba(140,225,110,.30),inset 0 11px 17px rgba(255,255,255,.48),inset 0 -13px 22px rgba(9,60,20,.24)}/* 按下：底边压回 2px、整体下沉，回弹由 transition 的曲线自然给出 */ .zq-enter:active{animation:none;transform:translateY(6px) scale(1.0);filter:brightness(.97) saturate(1.03);box-shadow:0 2px 0 #2F7A2A,0 9px 18px rgba(14,80,26,.30),inset 0 6px 12px rgba(255,255,255,.22),inset 0 -7px 13px rgba(9,60,20,.22)}.zq-enter::before{content:'';position:absolute;left:50%;top:50%;width:224px;height:224px;z-index:-1;transform:translate(-50%,-50%);border-radius:50%;border:3px dashed rgba(255,240,190,.9);transition:transform .28s ease,border-color .28s ease}.zq-enter:hover::before{transform:translate(-50%,-50%) scale(1.05);border-color:#FFF6D8}.zq-enter::after{content:'';position:absolute;left:50%;top:50%;width:238px;height:238px;z-index:-1;transform:translate(-50%,-50%);border-radius:4px;transition:opacity .28s ease;background:linear-gradient(rgba(255,255,255,.75),rgba(255,255,255,.75)) center / 100% 2px no-repeat,linear-gradient(rgba(255,255,255,.75),rgba(255,255,255,.75)) center / 2px 100% no-repeat}.zq-enter:hover::after{opacity:.68}/* v1.87b：注册/续费模式卡片整体压紧（.zq-compact）， 保证卡片底部两颗「返回登录 / 切换」按钮在常见窗口高度内完整可见 */ /* v1.92：注册页签字段最多（6 个），再压 4+4px —— 客户端 1215×679 下卡片底部才能完全落在视口内 */ .auth-wrap.zq-sky .auth-card.zq-compact{padding:40px 34px 18px;border-radius:28px}.auth-wrap.zq-sky .auth-card.zq-compact .zq-crest{width:74px;height:74px;top:-32px}.auth-wrap.zq-sky .auth-card.zq-compact .zq-lockup{width:268px;margin-bottom:10px}.auth-wrap.zq-sky .auth-card.zq-compact .input{height:42px;font-size:14px;padding:0 15px 0 40px;background-position:14px center;background-size:18px 18px;margin-bottom:5px}.auth-wrap.zq-sky .auth-card.zq-compact .auth-remember{margin:4px 0 0;font-size:13px}.auth-wrap.zq-sky .auth-card.zq-compact .auth-note{margin-top:6px;font-size:12px}.auth-wrap.zq-sky .auth-card.zq-compact .zq-tabs{margin-bottom:9px;padding:3px}.auth-wrap.zq-sky .auth-card.zq-compact .zq-tab{height:28px;font-size:14px;letter-spacing:1px}.auth-wrap.zq-sky .auth-card.zq-compact .zq-demo{margin-top:8px}/* 窄屏：主按钮回到卡片下方居中；小屏隐藏吉祥物 */ @media (max-width:1180px){/* v1.86c：顶部内边距要留够徽章悬挑的高度（-36px + 4px 边框），否则窄屏下徽章会被顶部裁掉 */ .auth-wrap.zq-sky{flex-direction:column;padding:56px 16px 40px}.zq-enter{position:relative;left:auto;top:auto;display:block;margin:26px auto 0}}@media (max-width:760px){.auth-wrap.zq-sky{min-height:84vh}/* 手机浏览器 100vh 含地址栏，容易多出一截滚动条，窄屏退回按视口比例 */ .auth-wrap.zq-sky .zq-fox{display:none}.auth-wrap.zq-sky .auth-card{padding:46px 22px 24px;border-radius:26px}.zq-crest{width:72px;height:72px;top:-34px}.zq-lockup{width:100%;max-width:280px;margin-bottom:12px}.zq-enter{width:148px;height:148px;font-size:36px;border-width:5px}.auth-wrap.zq-sky .zq-tab{font-size:14px;letter-spacing:1px}/* ★ 窄屏（≤1180）下圆钮已是「卡片下方的流式排列」，会自动跟着卡片让位， 不需要为错误条做任何位移补偿（写了 top 反而会把它推到视口外）。 */ /* v1.87c：手机宽度下这一行更挤，把「记住密码」与提示之间的间隙、提示自身的内边距收紧一点： 否则 13 字的提示会被省略号截掉尾巴（差的就是那两三个像素） */ .auth-wrap.zq-sky .zq-msgrow{gap:6px}.auth-wrap.zq-sky .zq-alert{padding:3px 8px;gap:5px}}/* ============ v1.88 管理后台 · 平台设置 ============ 按分类分区块，一个分类一张卡片；每项 = 标题 + 说明 + 控件。 入口型（link）用一行横向排布：左边标题说明，右边「去设置 →」。 v1.118：收紧纵向间距 —— 原来 .card 的 gap(8) 与 .ps-item 的 padding(12) 叠加， 再叠加 .input 自带的 margin-bottom(10)，相邻两项被撑到 30~42px，明显松散； 改为 gap:0 + 去掉输入控件多余下边距，间距完全由 .ps-item 的 padding 控制。 */ .ps-card{max-width:760px;padding:14px 18px 12px;gap:0}.ps-card>h3{margin:0 0 8px;font-size:15px}.ps-item{padding:9px 0;border-top:1px dashed var(--line,#E6E6E6)}.ps-item:first-of-type{border-top:0;padding-top:0}.ps-item .ps-t{font-weight:600;font-size:14px;margin-bottom:3px}.ps-item p.muted{margin:0 0 7px;font-size:12px;line-height:1.55}/* ★ 去掉通用 .input 在设置项里的 margin-bottom(10)：间距交给 .ps-item 的 padding 控制， 否则每个输入框下方多 10px 空白，整列看着更松 */ .ps-item .input,.ps-item textarea.input{width:100%;margin-bottom:0}.ps-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}.ps-row .ps-main{flex:1;min-width:220px}.ps-row p.muted{margin:0}.ps-go{flex:0 0 auto;padding:6px 14px;font-size:13px}.ps-actions{margin-top:12px;text-align:right}/* v1.99e 开关型设置项（platform_setting_meta 里 type=switch） */ .ps-item .ps-switch{display:inline-flex;align-items:center;gap:8px;font-size:14px;cursor:pointer;user-select:none}.ps-item .ps-switch input{width:18px;height:18px;margin:0;accent-color:var(--primary);cursor:pointer}.ps-item .ps-switch .ps-sw-txt{color:var(--muted);font-size:13px}/* ============ v1.91 家长端（parent）============ 家长是付费方，页面要「一眼看懂、不费劲」：数字大、层级少、没有操作按钮。 全部颜色走 theme.css 的变量，暗色主题下自动跟随。 */ .p-parent{max-width:760px}.p-head{margin-bottom:4px}.p-head h2{margin:0 0 4px;font-size:21px}.p-head p{margin:0;font-size:13px}.p-h3{font-size:14px;margin:22px 0 8px;color:var(--muted);font-weight:600}/* 多孩子切换 */ .p-kidbar{display:flex;gap:8px;margin-bottom:14px;flex-wrap:wrap}.p-kid{display:flex;flex-direction:column;align-items:flex-start;gap:2px;background:var(--card);border:1px solid var(--line);border-radius:10px;padding:8px 14px;cursor:pointer;font-size:14px;color:var(--text)}.p-kid em{font-style:normal;font-size:11px;color:var(--muted)}.p-kid.on{border-color:var(--primary);box-shadow:0 0 0 2px rgba(26,111,75,.14)}.p-kid.on>b,.p-kid.on{color:var(--primary);font-weight:600}/* 数字卡组 */ .p-stats{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:10px}.p-stat{background:var(--card);border:1px solid var(--line);border-radius:12px;padding:14px 12px;text-align:center}.p-stat b{display:block;font-size:24px;line-height:1.15;color:var(--primary)}.p-stat b em,.p-stat b i{font-style:normal;font-size:12px;font-weight:400;color:var(--muted);margin-left:1px}.p-stat span{display:block;margin-top:4px;font-size:12px;color:var(--muted)}/* 棋力 */ .p-rank{display:flex;flex-wrap:wrap;gap:10px 26px;align-items:center}.p-rank-item{display:flex;flex-direction:column;gap:2px;min-width:110px}.p-rank-k{font-size:12px;color:var(--muted)}.p-rank-item b{font-size:19px}.p-rank-item .muted{font-size:11px}.p-rank-note{flex-basis:100%;padding-top:8px;border-top:1px dashed var(--line);font-size:12px;color:var(--muted)}.p-up{color:#c62828;font-weight:600}/* 中国习惯：升 = 红 */ .p-down{color:#2e7d32;font-weight:600}/* 降 = 绿 */ /* 柱状图 */ .p-chart{padding:4px 0 0}.p-svg{width:100%;height:96px;display:block}.p-chart-foot{display:flex;justify-content:space-between;margin-top:6px;font-size:11px;color:var(--muted)}/* 两栏迷你卡 */ .p-mini{display:grid;grid-template-columns:1fr 1fr;gap:10px}.p-mini-card{display:flex;flex-direction:column;gap:2px}.p-mini-card>span{font-size:12px;color:var(--muted)}.p-mini-card b{font-size:22px;color:var(--primary)}.p-mini-card b i{font-style:normal;font-size:12px;font-weight:400;color:var(--muted);margin-left:3px}.p-mini-card em{font-style:normal;font-size:11px}/* 课时余额 */ .p-balance{text-align:center;padding:22px 16px}.p-balance>span{font-size:13px;color:var(--muted)}.p-balance b{display:block;font-size:40px;line-height:1.1;color:var(--primary);margin:6px 0 4px}.p-balance b i{font-style:normal;font-size:15px;font-weight:400;color:var(--muted);margin-left:4px}.p-balance em{font-style:normal;font-size:12px}/* 表格 */ .p-table{overflow-x:auto;padding:4px 12px}.p-table table{width:100%;border-collapse:collapse;font-size:13px}.p-table th,.p-table td{padding:9px 8px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top}.p-table th{font-weight:600;font-size:12px;color:var(--muted);white-space:nowrap}.p-table tr:last-child td{border-bottom:0}.p-table em{font-style:normal;font-size:11px}.p-off{opacity:.55}/* 通知 */ .p-notes{display:flex;flex-direction:column;gap:10px}.p-note-h{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;font-size:12px;margin-bottom:6px}.p-note-b{font-size:14px;line-height:1.75;white-space:pre-wrap;word-break:break-word}/* 出勤标签 */ .p-tag{display:inline-block;padding:1px 9px;border-radius:999px;font-size:12px}.p-tag-present{background:rgba(26,111,75,.12);color:var(--primary)}.p-tag-late{background:rgba(184,134,11,.14);color:var(--gold)}.p-tag-leave{background:rgba(106,90,205,.14);color:var(--diamond)}.p-tag-absent{background:rgba(229,72,77,.12);color:var(--danger)}/* 我的 */ .p-kv{width:100%;border-collapse:collapse;font-size:13px}.p-kv th{text-align:left;font-weight:400;color:var(--muted);padding:7px 0;width:96px}.p-kv td{padding:7px 0}.p-kidrow{padding:9px 0;border-top:1px dashed var(--line);display:flex;flex-direction:column;gap:3px;font-size:13px}.p-kidrow:first-of-type{border-top:0}@media (max-width:560px){.p-mini{grid-template-columns:1fr}.p-head h2{font-size:19px}.p-balance b{font-size:34px}}/* v1.91 家长绑定弹窗里的一行：账号 + 解除按钮 */ .pm-row{display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 0;border-bottom:1px dashed var(--line);font-size:14px}.pm-row:last-child{border-bottom:0}/* v1.91 弹窗内联错误条：校验失败写在这里，不会自动消失。 toast 只 2~3 秒就散了，像「必须先选一张卡密」这种要照着操作的提示根本看不完。 */ .form-err{display:none;margin:8px 0 0;padding:9px 12px;border-radius:6px;background:#FDECEA;border:1px solid #F5C2C0;color:#B4232A;font-size:13px;line-height:1.55}.form-err.on{display:block}/* ---------- v1.96 意见反馈 ---------- 用户端：弹窗里的一条反馈（fb-item）+ 管理员回复条（fb-reply）； 管理端：反馈列表表格（fb-table）与点行展开的详情行（fb-detail）。 全部跟着 CSS 变量走 —— 深色主题与学校自定义主色自动生效，不额外写死颜色。 */ .fb-item{border:1px solid var(--line);border-radius:10px;padding:10px 12px;margin-bottom:8px}.fb-head{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:4px}.fb-head .muted{margin-left:auto}.fb-body{font-size:14px;line-height:1.6;white-space:pre-wrap;word-break:break-word}.fb-reply{margin-top:8px;padding:8px 10px;border-radius:8px;background:#eef7f2;border:1px solid #cfe8dc;font-size:13px;line-height:1.6}.fb-reply b{color:var(--primary)}.fb-reply .muted{display:block;margin-top:4px}/* 表格单元格里的长正文：最多两行，展开后看全文（点行可展开） */ .fb-clip{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:13px;line-height:1.5}.fb-table{overflow-x:auto}.fb-table table{width:100%;border-collapse:collapse;font-size:13px}.fb-table th,.fb-table td{padding:9px 8px;text-align:left;border-bottom:1px solid var(--line);vertical-align:top}.fb-table th{font-weight:600;font-size:12px;color:var(--muted);white-space:nowrap}.fb-table tbody tr:hover{background:rgba(26,111,75,.05)}.fb-table td .btn.sm{margin:0 4px 4px 0}.fb-table td .tag{white-space:nowrap}/* 状态列窄，「待处理」被折成两行很难读 */ /* width:1% + nowrap = 该列收缩到内容宽（表格 auto 布局下的标准做法）， 把多出来的宽度全部让给「内容」列，避免状态列被顶到屏幕最右边、正文和状态之间空一大片 */ .fb-table th.fb-tight,.fb-table td.fb-tight{width:1%;white-space:nowrap}.fb-table th.fb-replycol,.fb-table td.fb-replycol{width:200px;max-width:200px}.fb-detail>td{background:var(--bg)}.fb-detail:last-child td{border-bottom:0}/* ---------- v1.97 编辑器浮层 ---------- editor.html 以前靠 window.open 打开，客户端里会弹裸窗口。现在把它以 iframe 盖在当前页： 顶上一条 36px 的条（标题 + 关闭），下面 iframe 吃满剩余空间。 客户端的 html.wq-tb-on 下移规则见 electron/preload.js（那里把 .edframe 也列进去了）。 */ .edframe{position:fixed;inset:0;z-index:9998;background:#0e241d;display:flex;flex-direction:column}.edframe-bar{flex:0 0 auto;display:flex;align-items:center;gap:8px;height:36px;padding:0 10px;background:#14312a;color:#e8f1ee;font:13px/1 "Microsoft YaHei",system-ui,sans-serif}.edframe-title{font-weight:600;letter-spacing:.5px;opacity:.95}.edframe-sp{flex:1}.edframe-frame{flex:1 1 auto;width:100%;min-height:0;border:0;background:#fff}/* ---------- v1.98 「我的 → 我的棋谱」折叠块 ---------- 手机上把次要列收起来 —— 否则「对手」列会被挤成"陶/初/超"竖排三行。 */ .kf-sm-only{display:none}@media (max-width:600px){.kf-sm-hide{display:none !important}/* 手机上收起的次要列 / 次要按钮 */ .kf-sm-only{display:block;font-size:11px;opacity:.8}/* 手机上进「对局时间」那一格的对手名 */ #myKifuBlock .member-table{font-size:12.5px}}/* ===== v1.99t AI 形势判断面板（后台 KataGo b15c192）===== */ .m-ai{margin-top:8px;padding:10px 11px;border:1px solid #dfe6ec;border-radius:10px;background:#fbfdff}.m-ai-hd{font-size:13px;font-weight:600;display:flex;justify-content:space-between;align-items:baseline;gap:6px}.m-ai-bar{height:10px;margin-top:8px;border-radius:5px;background:#eceff2;overflow:hidden}.m-ai-bar>i.b{display:block;height:100%;background:#1f1f1f;transition:width .25s ease}.m-ai-wr{display:flex;justify-content:space-between;font-size:12px;margin-top:4px;color:#5b6b7a}.m-ai-lead{margin-top:7px;font-size:13px;line-height:1.5}.m-ai-top{margin-top:8px;border-top:1px dashed #e3e9ef;padding-top:6px}.m-ai-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-radius:6px;cursor:pointer;font-size:12px}.m-ai-row:hover{background:#eef6fd}.m-ai-row.on{background:#e3f0ff}.m-ai-row>b{flex:0 0 16px;width:16px;height:16px;line-height:16px;text-align:center;border-radius:50%;background:#2c6fb5;color:#fff;font-size:11px;font-weight:600}.m-ai-mv{font-weight:600;min-width:36px}.m-ai-row .muted{margin-left:auto;font-size:11px}.m-ai-pv{margin-top:6px;font-size:12px;color:#3f5566;word-break:break-all;line-height:1.5}.m-ai-stale{background:#fff8e6;border-color:#f0d9a8;color:#8a6d1f;font-size:12px}/* v1.99u AI 复盘（离峰批处理）：胜率曲线 + 双方各 5 大失误 */ .m-rv{margin-top:8px;padding:10px 11px;border:1px solid #dfe6ec;border-radius:10px;background:#fbfdff}.m-rv-hd{font-size:13px;font-weight:600;display:flex;justify-content:space-between;align-items:baseline;gap:6px}.m-rv-bar{height:6px;margin-top:8px;border-radius:3px;background:#eceff2;overflow:hidden}.m-rv-bar>i{display:block;height:100%;background:#2e9e5b;transition:width .3s ease}.m-rv-fail{background:#fff6f6;border-color:#f0c9c9}.m-rv-svg{display:block;margin-top:8px;border-radius:4px}.m-rv-fin{margin-top:6px;font-size:12px;color:#3f5566}.m-rv-sec{margin-top:9px;padding-top:6px;border-top:1px dashed #e3e9ef;font-size:12px;font-weight:600}.m-rv-mk{display:flex;align-items:center;gap:7px;padding:4px 6px;border-radius:6px;cursor:pointer;font-size:12px}.m-rv-mk:hover{background:#eef6fd}.m-rv-mk.on{background:#e3f0ff}.m-rv-mk>b{flex:0 0 26px;text-align:center;font-weight:600;color:#5b6b7a}.m-rv-mv{font-weight:600;min-width:34px}.m-rv-loss{color:#c0392b;font-weight:600}.m-rv-lv{margin-left:auto;font-size:11px;padding:1px 6px;border-radius:8px;background:#eef1f4;color:#5b6b7a}.m-rv-lv.lv-blunder{background:#fdecea;color:#b03030}.m-rv-lv.lv-mistake{background:#fff4e5;color:#96601c}.m-rv-detail{margin:4px 0 6px;padding:7px 8px;background:#f4f8fc;border-radius:6px}.m-rv-top{display:flex;align-items:center;gap:7px;font-size:12px}.m-rv-top>b{flex:0 0 16px;width:16px;height:16px;line-height:16px;text-align:center;border-radius:50%;background:#2c6fb5;color:#fff;font-size:11px}.m-rv-top.best>b{background:#2e9e5b}.m-rv-top .muted{margin-left:auto;font-size:11px}.m-rv-pv{font-size:11px;color:#6b7c8c;word-break:break-all;line-height:1.45;margin:1px 0 3px 23px}/* ---------- v1.99w 服务器资源指标卡（管理员 → 工作台 → 概览） ---------- */ .mon-kpis{display:grid;grid-template-columns:repeat(auto-fill,minmax(168px,1fr));gap:8px;margin-top:10px}.mon-kpi{background:var(--card);border:1px solid var(--line);border-radius:8px;padding:8px 10px}.mon-kpi.warn{border-color:#b45309}.mon-kpi.crit{border-color:var(--danger)}.mon-kpi.unknown{opacity:.62}.mk-name{font-size:12px;color:var(--muted)}.mk-val{font-size:17px;font-weight:600;margin:2px 0 3px}.mk-val small{font-size:12px;font-weight:400;color:var(--muted);margin-left:2px}.mk-rng{font-size:12px;color:var(--muted);line-height:1.55}.mk-rng .mk-red{color:#8a6d3b}.mon-dot{width:8px;height:8px;border-radius:50%;display:inline-block;margin-right:5px}.mon-net{display:flex;gap:20px;flex-wrap:wrap;margin-top:10px;font-size:13px;color:var(--muted)}.mon-net b{color:var(--text);font-weight:600}/* ---------- v1.100a 排课与课表（后台 → 教务 → 排课课表） ---------- */ .sch-grid{table-layout:fixed;min-width:760px}.sch-grid th{background:#f6f8fa;font-weight:600;font-size:12.5px}.sch-cell{vertical-align:top;height:58px;padding:4px !important;cursor:default}.sch-cell[data-add]{cursor:pointer}.sch-add{display:block;text-align:center;color:#b6c2cd;font-size:16px;line-height:44px}.sch-cell[data-add]:hover{background:#f0f7f2}.sch-cell[data-add]:hover .sch-add{color:#2e9e5b}.sch-card{border:1px solid var(--line);border-left:3px solid #2c6fb5;border-radius:6px;padding:4px 6px;margin-bottom:4px;background:var(--card);cursor:pointer;font-size:12px;line-height:1.35}.sch-card:hover{box-shadow:0 2px 8px rgba(15,23,42,.12)}.sch-card.off{opacity:.55;border-left-color:#b03030;text-decoration:line-through}/* v1.101c #11：周网格「今天」整列高亮（家长端早就有，机构端一直缺 —— 七列长一样，看不出今天在哪） */ .sch-grid th.sch-today{background:#eaf4ee;color:#1f6b3f}.sch-today-tag{display:inline-block;margin-left:2px;padding:0 5px;border-radius:8px;background:#2e9e5b;color:#fff;font-size:10.5px;font-weight:600;vertical-align:1px}.sch-cell.sch-today{background:#f4faf6}.sch-t{font-size:11px;color:var(--muted)}.sch-n{font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.sch-m{font-size:11.5px;color:var(--muted);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}/* ---------- v1.100f AI 对局报告（老师视角诊断 + 提升建议） ---------- 配色沿用全站变量，不另起一套；报告页要能直接打印给学员带走， 所以 .rp-noprint 之外的东西都保持浅底深字（打印时不吃深色主题）。 */ .rp-info{display:flex;flex-direction:row;flex-wrap:wrap;align-items:center;gap:8px 18px}.rp-info-main{display:flex;align-items:center;gap:8px;font-size:15px}.rp-side{flex:0 0 22px;width:22px;height:22px;line-height:22px;text-align:center;border-radius:50%;font-size:12px;font-weight:600}.rp-side.b{background:#1f1f1f;color:#fff}.rp-side.w{background:#fff;color:#1f1f1f;border:1px solid #c7d0d8}.rp-vs i{font-style:normal;color:var(--muted);margin:0 4px}.rp-kv{display:inline-flex;align-items:baseline;gap:6px;font-size:12px;color:var(--muted)}.rp-kv b{display:inline;font-size:13px;color:var(--text);font-weight:600}.rp-switch{display:flex;gap:6px;margin-left:auto}.rp-sec{font-size:13px;font-weight:600;margin:0 0 8px}.rp-wrap{display:flex;gap:12px;flex-wrap:wrap;align-items:flex-start}.rp-board{flex:1 1 320px;min-width:260px}.rp-board .match-board svg{width:100%;height:auto}.rp-score{flex:1 1 320px;min-width:260px}.rp-ov{display:flex;align-items:baseline;gap:10px;padding:0 0 10px;border-bottom:1px dashed var(--line);margin-bottom:8px}.rp-ov-n{font-size:34px;font-weight:700;line-height:1}.rp-ov.good .rp-ov-n{color:#2e9e5b}.rp-ov.mid .rp-ov-n{color:#d98700}.rp-ov.bad .rp-ov-n{color:#c0392b}.rp-ov-t{font-size:13px;color:var(--muted)}.rp-dim{margin-bottom:9px}.rp-dim-hd{display:flex;align-items:baseline;gap:8px;font-size:13px}.rp-dim-sc{font-weight:700}.rp-dim-sc.good{color:#2e9e5b}.rp-dim-sc.mid{color:#d98700}.rp-dim-sc.bad{color:#c0392b}.rp-dim-sc.na{color:#9aa8b5}.rp-dim-lv{margin-left:auto;font-size:11px;color:var(--muted)}.rp-bar{height:6px;border-radius:3px;background:#eceff2;overflow:hidden;margin:4px 0 3px}.rp-bar>i{display:block;height:100%;background:#2e9e5b;transition:width .3s ease}.rp-bar>i.mid{background:#e8a33d}.rp-bar>i.bad{background:#d9534f}.rp-bar>i.na{background:#cfd8e0}.rp-dim-cm{font-size:12px;color:var(--muted);line-height:1.55}.rp-cmp{display:flex;gap:14px;align-items:center;font-size:12px}.rp-dot{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:4px;vertical-align:middle}.rp-dot.b{background:#1f1f1f}.rp-dot.w{background:#fff;border:1px solid #c7d0d8}.rp-curve{display:block;width:100%;height:190px;border-radius:6px}.rp-pt{cursor:pointer}.rp-pt.sel{stroke:#1f6feb;stroke-width:3.2}.rp-mk-t{font-size:12px;font-weight:600;margin:8px 0 4px}.rp-mk{display:flex;align-items:center;gap:8px;padding:5px 7px;border-radius:6px;cursor:pointer;font-size:13px}.rp-mk:hover{background:#eef6fd}.rp-mk.on{background:#e3f0ff}.rp-mk>b{flex:0 0 64px;color:var(--muted);font-weight:600}.rp-mv{font-weight:600;min-width:38px}.rp-loss{color:#c0392b;font-weight:600}.rp-lv{margin-left:auto;font-size:11px;padding:1px 7px;border-radius:8px;background:#eef1f4;color:var(--muted)}.rp-lv.lv-blunder{background:#fdecea;color:#b03030}.rp-lv.lv-mistake{background:#fff4e5;color:#96601c}.rp-detail{margin:4px 0 8px;padding:8px 9px;background:#f4f8fc;border-radius:6px;font-size:12px}.rp-top{display:flex;align-items:center;gap:7px}.rp-top>b{flex:0 0 17px;width:17px;height:17px;line-height:17px;text-align:center;border-radius:50%;background:#9aa8b5;color:#fff;font-size:11px}.rp-top.best>b{background:#2e9e5b}.rp-pv{font-size:11px;color:#6b7c8c;word-break:break-all;margin:1px 0 3px 24px;line-height:1.45}.rp-headline{font-size:14px;line-height:1.65;padding:8px 10px;background:#f7f9fb;border-left:3px solid #1f6feb;border-radius:4px}.rp-lst{margin-top:8px}.rp-lst-t{font-size:12px;font-weight:600;margin-bottom:3px}.rp-lst-t.good{color:#2e9e5b}.rp-lst-t.bad{color:#c0392b}.rp-lst ul,.rp-teach-l{margin:0;padding-left:18px}.rp-lst li,.rp-teach-l li{font-size:13px;line-height:1.65;color:#3f5566}.rp-goal{margin-top:9px;padding:8px 10px;background:#f2fbf5;border-left:3px solid #2e9e5b;border-radius:4px;font-size:13px}.rp-rx{padding:8px 0;border-top:1px dashed var(--line)}.rp-rx:first-of-type{border-top:0}.rp-rx-t{font-size:13px;font-weight:600}.rp-rx-why{font-size:12px;color:var(--muted);line-height:1.55;margin:2px 0 5px}.rp-rx-acts{display:flex;flex-wrap:wrap;gap:6px}.rp-teach{background:#fffdf5}.rp-note{padding:7px 0;border-top:1px dashed var(--line)}.rp-note-hd{display:flex;align-items:baseline;gap:8px;font-size:12px}.rp-note-hd b{font-size:13px}.rp-note-del{margin-left:auto}.rp-note-c{font-size:13px;line-height:1.65;color:var(--text);white-space:pre-wrap;margin-top:2px}.rp-note-new{margin-top:8px}.rp-note-new textarea{width:100%}.rp-trend{display:block;width:100%;height:130px;border-radius:6px}.rp-mk-bad{color:#e03131}.rp-mk-good{color:#2f9e44}.rp-board-ctl{display:flex;align-items:center;gap:6px;margin-top:6px}@media print{.rp-noprint,.topnav,.tabbar,.footer{display:none !important}.rp{background:#fff}.card{break-inside:avoid;border-color:#dfe6ec}.rp-curve,.rp-trend{height:150px}}/* ==================== v1.100g 招生线索 CRM ==================== */ .crm-kpi{display:flex;flex-wrap:wrap;gap:10px;margin:10px 0 4px}.crm-kpi-c{flex:1 1 130px;min-width:118px;padding:9px 11px;border:1px solid var(--line);border-radius:8px;background:#fbfcfd}.crm-kpi-v{font-size:20px;font-weight:700;line-height:1.35}.crm-kpi-v .muted{font-size:12px;font-weight:400;margin-left:2px}/* 漏斗：左标签 · 中间轨道条 · 右数值；0 时不画条，版式始终稳定 */ .crm-funnel{margin:6px 0 2px}.crm-fn{display:flex;align-items:center;gap:10px;height:26px;margin-bottom:6px}.crm-fn-l{flex:0 0 62px;font-size:13px;color:#3f5566}.crm-fn-track{flex:1;height:16px;background:#f2f4f7;border-radius:4px;overflow:hidden}.crm-fn-bar{height:100%;border-radius:4px;transition:width .25s}.crm-fn-v{flex:0 0 78px;text-align:right;font-size:13px;white-space:nowrap}.crm-fn-v>b{font-size:14px}.crm-fn-v .muted{margin-left:6px}.crm-od{background:#fff7f7}.crm-od>td{border-top-color:#f3d6d6}.crm-detail{display:block;padding:8px 10px;background:#f7f9fb;border-radius:6px;font-size:13px;line-height:1.9}.crm-detail .muted{display:inline-block;width:62px}.crm-note{margin-top:6px;padding-top:6px;border-top:1px dashed var(--line);font-size:13px;color:#3f5566;white-space:pre-wrap}.crm-logs{max-height:260px;overflow:auto}.crm-log{padding:6px 0;border-top:1px dashed var(--line);font-size:13px;line-height:1.6}.crm-log:first-child{border-top:0}/* ==================== v1.101a 教师绩效与工资 ==================== */ .py-kpi{display:flex;flex-wrap:wrap;gap:10px;margin:2px 0 6px}.py-kpi-c{flex:1 1 130px;min-width:118px;padding:9px 11px;border:1px solid var(--line);border-radius:8px;background:#fbfcfd}.py-kpi-v{font-size:20px;font-weight:700;line-height:1.35}.py-kpi-v .muted{font-size:12px;font-weight:400;margin-left:2px}/* 工资表列多，必须能横向滚动；表头吸顶避免滚到下面不知道在看哪一列 */ .py-tb{width:100%;border-collapse:collapse;font-size:13px;white-space:nowrap}.py-tb th,.py-tb td{padding:7px 9px;border-bottom:1px solid var(--line);text-align:left}.py-tb th{background:#f7f9fb;font-weight:600;position:sticky;top:0;z-index:1}.py-tb tbody tr:hover{background:#fafcfd}.py-tb td .input{padding:3px 6px;font-size:13px}.py-off{opacity:.5}.py-minus td{color:#c0392b}.py-total{margin-top:10px;padding-top:8px;border-top:1px solid var(--line);font-size:15px}.py-in{padding:3px 6px;font-size:13px}/* ============ v1.101b 今日（统计条 / 待办卡）============ */ .td-stats{display:flex;gap:10px;flex-wrap:wrap;margin-top:12px}.td-stats .card.stat{flex:1 1 120px;min-width:116px;margin:0;padding:14px}.td-stats .card.stat.warn b{color:#b45309}/* 待点名>0 时提醒，不用红色（不是错误，是没做完的事） */ .td-todo{display:flex;gap:10px;flex-wrap:wrap}.td-card{display:flex;flex-direction:column;align-items:center;justify-content:center;min-width:106px;padding:12px 14px;text-align:center;text-decoration:none;border:1px solid var(--line);border-radius:8px;background:var(--card);cursor:pointer;transition:border-color .15s,transform .15s,box-shadow .15s}.td-card b{font-size:22px;line-height:1.15;color:var(--primary)}.td-card span{font-size:12px;color:var(--muted);margin-top:4px}.td-card:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.10)}.td-card:active{transform:translateY(0)}/* v1.101c #6：批量选包消课（一人一组，一次确认全部扣完） */ .pk-row{padding:8px 0;border-bottom:1px dashed var(--line)}.pk-row:last-of-type{border-bottom:0}.pk-name{font-weight:600;font-size:13.5px;margin-bottom:2px}.pk-opt{display:block;padding:4px 8px;cursor:pointer;font-size:13px}.pk-opt input{margin-right:6px}.pk-opt.pk-skip{color:var(--muted)}/* 排课页同一套行样式（select 版） */ .filter-row.pk-row .pk-name{width:96px;flex:none}/* v1.101c #8：学员首页统计卡可点（已做题数 → 做过的题 / 错题本 → 错题清单） */ .card.stat.home-stat{cursor:pointer;transition:border-color .15s,transform .15s,box-shadow .15s}.card.stat.home-stat:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.10)}.home-stat-hint{margin-top:4px;color:var(--primary);font-size:11.5px}/* v1.101c #7：四率卡可点下钻（到课 / 消课 / 续费 → 名单） */ .card.stat.bm-drill{cursor:pointer;transition:border-color .15s,transform .15s,box-shadow .15s}.card.stat.bm-drill:hover{border-color:var(--primary);transform:translateY(-2px);box-shadow:0 4px 12px rgba(0,0,0,.10)}.bm-drill-hint{margin-top:4px;color:var(--primary);font-size:11.5px}@media print{/* 工资条要能打出来自留：隐藏按钮列与所有操作区 */ .py-tb td:last-child,.py-tb th:last-child{display:none}.no-print,.rp-noprint{display:none !important}}/* ============ v1.102 课堂挂盘（TeachBoard） ============ 老师上课用的整屏演示台。设计取向：**棋盘是主角**。 ★ 棋盘 = 嵌进来的「讲义棋盘编辑器」（editor.html，mode=explain&edit=1）， 摆子 / 标记 / 箭头 / 画笔 / 变着 / 解说 / 旋转与讲义里的编辑器完全一致。 ★ 整屏无滚动：进入挂盘时 body.tb-active 让 #app 占满剩余视口、页面本身不滚动； 点「⛶ 全屏」再切到 body.tb-fs（页面放大成屏幕尺寸，覆盖导航）。 */ /* 进入挂盘：把整页布局切成"导航在上、挂盘占满剩余高度、无页面滚动条" */ body.tb-active{overflow:hidden;display:flex;flex-direction:column;height:100vh}body.tb-active #nav.topnav{flex:none;position:static}body.tb-active .wb-nav,body.tb-active .wb-subnav{flex:none;position:static}body.tb-active #app{flex:1;min-height:0;width:100%;max-width:none;margin:0;padding:0;overflow:hidden}body.tb-active .footer,body.tb-active #tabbar{display:none}.tb-page{display:flex;flex-direction:column;height:100%;width:100%;overflow:hidden;background:var(--bg,#f5f7f5)}/* ---- 顶部工具条 ---- */ .tb-head{flex:none;display:flex;flex-direction:column;gap:6px;padding:8px 12px;background:#fff;border-bottom:1px solid var(--line)}.tb-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}.tb-lb{font-size:12.5px;color:var(--muted);flex:none;display:inline-flex;align-items:center;gap:4px}/* ---- 主体：左棋盘(iframe) + 右侧栏 ---- */ .tb-main{flex:1;min-height:0;display:flex;gap:6px;padding:8px 10px}.tb-boardwrap{flex:1;min-width:0;min-height:0;position:relative}/* iframe 占满棋盘区；editor.html 自带工具栏与棋盘，能力等同讲义编辑器 */ .tb-editor-frame{position:absolute;inset:0;width:100%;height:100%;border:0;display:block;background:#fff}/* ---- 右侧栏 ---- */ .tb-side{width:240px;flex:none;min-height:0;display:flex;flex-direction:column;gap:8px;overflow:hidden}/* v1.123y：点名弹窗——课时预警与课包选择 */ .pk-none{color:#e03131;font-size:12px;font-weight:600}.member-table tr.warn{background:#fff8e6}.member-table tr.warn>td:first-child{box-shadow:inset 3px 0 0 #f59f00}.tb-panel{border:1px solid var(--line);border-radius:8px;padding:8px;background:#fff;flex:none}.tb-side>.tb-panel:last-child{flex:1;min-height:0;display:flex;flex-direction:column}.tb-panel-h{font-size:12.5px;font-weight:600;margin-bottom:6px;display:flex;align-items:baseline;gap:6px}/* 侧栏选项卡：知识要点 / 班级（含积分） */ .tb-tabs{display:flex;gap:4px;flex:none}.tb-tab{flex:1;padding:6px 8px;border:1px solid var(--line);background:#fff;border-radius:8px 8px 0 0;cursor:pointer;font-size:13px;font-weight:600;color:#888}.tb-tab:hover{background:#f6f8f7}.tb-tab.active{background:var(--primary);color:#fff;border-color:var(--primary)}.tb-pane{flex:1;min-height:0;display:flex;flex-direction:column}/* 学生列表：姓名 + 段位 + 当前积分 */ .tb-stu{display:flex;align-items:center;gap:6px;padding:5px 6px;border-radius:6px;cursor:pointer;border:1px solid transparent}.tb-stu:hover{background:#f2f7f4}.tb-stu.on{background:#e8f5ee;border-color:var(--primary)}.tb-stu-n{flex:1;font-size:13.5px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-stu-p{font-size:13px;font-weight:700;color:var(--primary);min-width:40px;text-align:right}.tb-pt{border-top:1px dashed var(--line);margin-top:6px;padding-top:6px}.tb-pt-cur{font-size:13px;margin-bottom:5px}.tb-pt-btns{display:flex;gap:4px;flex-wrap:wrap}.tb-pt-btns .btn{flex:1;min-width:42px}.tb-lect{display:flex;align-items:center;gap:8px;padding:6px 4px;border-bottom:1px dashed var(--line)}.tb-lect:last-child{border-bottom:0}/* ---- 全屏：只放大挂盘页本身（等比例缩放，位置/尺寸由 JS 内联控制） ---- 巨大扩散投影把缩放后四周露出的导航/页面底色涂黑，视觉上只剩挂盘页 */ body.tb-fs .tb-page{position:fixed;z-index:99999;overflow:hidden;box-shadow:0 0 0 200vmax #141614}@media (max-width:900px){.tb-main{flex-direction:column}.tb-side{width:100%;flex:none;max-height:240px}}/* ---- 课堂加载下拉菜单（原「导入本地棋谱」按钮位置） ---- */ .tb-load-wrap{position:relative;display:inline-block}.tb-load-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:60;min-width:172px;background:#fff;border:1px solid #e3e6ea;border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.14);padding:4px;display:none}.tb-load-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:none;padding:8px 10px;border-radius:6px;cursor:pointer;font-size:13px;color:#2b2f33;line-height:1.2}.tb-load-item:hover{background:#f2f5f8}.tb-li-ico{width:18px;text-align:center;flex:none}.tb-caret{font-size:10px;opacity:.7}/* ---- 课堂加载：已加载题目 / 棋谱 下拉列表（最多显示 10 行，超出滚动） ---- */ .tb-probsel{position:relative;display:inline-block}.tb-prob-menu{position:absolute;top:calc(100% + 4px);left:0;z-index:60;min-width:200px;max-width:340px;max-height:290px;overflow-y:auto;background:#fff;border:1px solid #e3e6ea;border-radius:8px;box-shadow:0 6px 20px rgba(0,0,0,.14);padding:4px;display:none}.tb-prob-item{padding:7px 10px;border-radius:6px;cursor:pointer;font-size:13px;color:#2b2f33;line-height:1.2;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.tb-prob-item:hover{background:#f2f5f8}.tb-prob-item.on{background:#e8f5ee;color:#1a7f4f;font-weight:600}/* ---- 课堂加载：来源选择器弹层（支持作业→题目、棋书→题目 两级下钻） ---- */ .tb-picker-mask{position:fixed;inset:0;z-index:100000;background:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center}.tb-picker{width:min(520px,92vw);max-height:76vh;background:#fff;border-radius:10px;display:flex;flex-direction:column;overflow:hidden;box-shadow:0 10px 40px rgba(0,0,0,.25)}.tb-picker-h{display:flex;align-items:center;justify-content:space-between;padding:12px 14px;border-bottom:1px solid #eef0f2;font-weight:600;font-size:14px}.tb-picker-x{background:none;border:none;font-size:16px;cursor:pointer;color:#9aa0a6;line-height:1}.tb-picker-body{overflow:auto;padding:6px}.tb-picker-list{display:flex;flex-direction:column;gap:2px}.tb-picker-item{display:flex;align-items:center;gap:8px;width:100%;text-align:left;background:none;border:none;padding:9px 10px;border-radius:6px;cursor:pointer;font-size:13px;color:#2b2f33}.tb-picker-item:hover{background:#f2f5f8}.tb-pi-title{flex:0 0 auto}.tb-pi-sub{flex:1 1 auto;font-size:12px;color:#9aa0a6;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.tb-pi-arrow{color:#c0c4c8;flex:none}.tb-picker-empty{padding:24px;text-align:center}.tb-picker-foot{padding:8px 14px;border-top:1px solid #eef0f2;font-size:12px}