/* ═══════════════════════════════════════════════════════════════════════
   beta-skin.css — 测试版对「最新 UI」的本地适配层
   ───────────────────────────────────────────────────────────────────────
   poju-skin.css 是从设计稿原样搬过来的，里面没有、也不该有测试版独有的东西。
   这个文件只放三件事，加载顺序在 poju-skin.css 之后：

     1. 管家卡（beta 有、设计稿没有）占掉环绕区左下那一格；
     2. 数字带里的「环形格」——有分母的指标走环，纯计数走衬线数字；
     3. 手机端这些小尺寸下的兜底。

   回滚：删掉 index.html 里 beta-skin.css 那一行，再把 app.js 的 vToday 换回去。
   ═══════════════════════════════════════════════════════════════════════ */

/* ─────────── 1. 管家卡：替掉设计稿左下角的「问一句」 ───────────
   设计稿那一格是琥珀 CTA 卡，测试版把它换成常驻的管家对话。
   位置、外框、圆角沿用 .quad 的通用规则，只重写内距和对话区的密度 ——
   同一张卡在「收起（小配角）」和「展开（主角）」两种尺寸下都得能读。 */
@media (min-width:700px){
  .quad .q-butler{grid-area:ask}
}
.quad .q-butler{
  padding:10px 14px 9px;
  justify-content:flex-start;
  /* 一层很淡的钢靛雾，跟琥珀卡区分开：它是「能干活的地方」，不是「要你点的地方」 */
  background:linear-gradient(155deg,rgba(47,102,144,.10),rgba(47,102,144,.045) 58%,rgba(47,102,144,.02));
  box-shadow:inset 0 0 0 1px rgba(47,102,144,.16);
}
/* 标题行现在挂三颗：派这活 / 进 Copilot / 展开。
   卡宽只有 145–230px，三颗按默认尺寸排下来要 262px，多出来的部分会被
   .quad > .card 的 overflow:hidden 直接裁掉 —— 看到的就是「展开」被切半颗。
   所以：按钮统一收成 20px 迷你尺寸，标题让位（超长省略），
   再按**卡片自身宽度**（容器查询，不是视口宽度）分档让出控件，
   任何一档都不靠裁切收场。 */
.quad .q-butler{container-type:inline-size;container-name:butler}
.quad .q-butler .card-h{margin-bottom:2px;padding-bottom:0;min-width:0;gap:5px}
.quad .q-butler .card-h h2{
  flex:0 1 auto;min-width:0;font-size:13px;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
}
.quad .q-butler .card-h .btn{
  flex:0 0 auto;height:20px;padding:0 6px;border-radius:6px;
  font-size:12px;letter-spacing:.02em;white-space:nowrap;
}
.quad .q-butler .card-h #btHomeDispatch{margin-left:auto}
.quad .q-butler .card-h .cal-toggle{flex:none;margin-left:0}
/* 卡 ≤239px：「派这活」先退场（展开后它还在）。它是「带附件派活」的高级动作，
   小卡里既没地方也没上下文，留着只会把标题挤没。 */
@container butler (max-width:239px){
  .quad .q-butler .card-h #btHomeDispatch{display:none}
  .quad .q-butler .card-h #btHomeOpen{margin-left:auto}
}
/* 卡 ≤179px：「展开」收成一枚箭头。点开就是大卡，控件全在 ——
   宁可少一颗可见的快捷键，也不要留半颗被切掉的按钮。 */
@container butler (max-width:179px){
  .quad .q-butler .card-h .cal-toggle{
    width:20px;padding:0;font-size:0;line-height:1;
    display:inline-flex;align-items:center;justify-content:center;
  }
  .quad .q-butler .card-h .cal-toggle::before{content:'▾';font-size:12px}
  .quad .q-butler.is-open .card-h .cal-toggle::before{content:'▴'}
}
/* 展开成主角之后卡宽了，按钮恢复成正常大小 */
.quad.card-open > .q-butler.is-open .card-h .btn{height:26px;padding:0 10px;font-size:12px}

/* 对话区：卡片自己管高度，里面滚动。app.css 给 #btHome 钉了 max-height:320px，
   那是「通栏条」的尺寸，塞进 138px 高的卡里会溢出，这里必须放开 */
.quad .q-butler #btHome{margin-top:4px;max-height:none;flex:1;min-height:0}
.quad .q-butler .bt-list{padding:1px 0;gap:5px;overscroll-behavior:contain}
.quad .q-butler .bt-msg{max-width:97%}
.quad .q-butler .bt-bub{font-size:12px;line-height:1.55;padding:5px 8px;border-radius:8px}
.quad .q-butler .bt-hint{font-size:12px;padding:1px 0;gap:6px}
.quad .q-butler .bt-inrow{margin-top:5px;gap:5px}
/* 收起态把底部那行「能答、能替你记…」收掉：179px 的格子要装标题 + 几条
   消息 + 输入框，这行提示一直把输入框往下挤 */
.quad .q-butler:not(.is-open) .bt-hint{display:none}
/* 收起态不是聊天窗口，是「几个能点的动作 + 输入框」：
   管家的整段播报在 240×170 里只能露出半句（clamp 又被 butler.js 的
   display:flow-root 顶掉了），不如直接不要 —— 播报里真正有用的是
   底下那两行「打开「材料」· 筛「草稿」→ 去」。要读全文点「展开」。 */
.quad .q-butler:not(.is-open) .bt-bub{display:none}
.quad .q-butler:not(.is-open) .bt-acts{display:flex;flex-direction:column;gap:5px;margin-top:0}
.quad .q-butler:not(.is-open) .bt-list{overflow:hidden;justify-content:flex-end}
.quad .q-butler:not(.is-open) .bt-act{height:26px;font-size:12px;border-radius:7px}
.quad .q-butler:not(.is-open) .bt-act span{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.quad .q-butler:not(.is-open) .bt-do{height:20px;font-size:12px;padding:0 8px}
.quad .q-butler:not(.is-open) .card-ft{font-size:12px;padding-top:6px}
.quad .q-butler .bt-inp{height:30px;padding:0 9px;font-size:12px;border-radius:8px}
.quad .q-butler .bt-go{width:30px;height:30px;border-radius:8px}
/* 卡脚那句「能答、能记、能派活 · 已并入 Copilot」：单行省略，别折成两行被卡底裁掉。
   极窄时整句收掉，只留「本地」——它是介绍，不是功能。 */
.quad .q-butler .card-ft{min-width:0}
.quad .q-butler .card-ft .cf-note{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.quad .q-butler .card-ft > em{flex:none;white-space:nowrap}
@container butler (max-width:179px){
  .quad .q-butler:not(.is-open) .card-ft .cf-note{display:none}
  .quad .q-butler:not(.is-open) .card-ft{justify-content:flex-end}
}

/* 展开成主角：同一套结构按大卡尺度重排，字和输入框一起放大 */
.quad.card-open > .q-butler.is-open{padding:16px 20px 13px}
.quad.card-open > .q-butler.is-open .card-h h2{font-size:20px}
.quad.card-open > .q-butler.is-open .bt-bub{font-size:13px;line-height:1.62;padding:8px 11px}
.quad.card-open > .q-butler.is-open .bt-inp{height:38px;padding:0 12px;font-size:13px}
.quad.card-open > .q-butler.is-open .bt-go{width:38px;height:38px}
.quad.card-open > .q-butler.is-open .bt-hint{font-size:12px}
/* 当配角时跟月历一样垂直居中，别把半行字顶在上沿 */
.quad.card-open > .card:not(.is-open).q-butler{justify-content:center}
.quad.card-open > .card:not(.is-open).q-butler .bt-bub{font-size:12px;padding:4px 7px}
.quad.card-open > .card:not(.is-open).q-butler .bt-hint{display:none}
.quad.card-open > .card:not(.is-open).q-butler .bt-inp{height:26px;font-size:12px}
.quad.card-open > .card:not(.is-open).q-butler .bt-go{width:26px;height:26px}

/* 手机单列：卡片不再受环绕区高度约束，给对话一个够用又不过分的高度 */
@media (max-width:699.98px){
  .quad .q-butler{padding:14px 16px 14px}
  .quad .q-butler #btHome{max-height:320px}
  .quad .q-butler .bt-bub{font-size:12px;padding:7px 10px}
  .quad .q-butler .bt-inp{height:38px;font-size:13px}
  .quad .q-butler .bt-go{width:38px;height:38px}
}

/* ─────────── 2. 环绕区比例：今日待办收窄，其余四张等比放大 ───────────
   原来的 34:28:38 三列 + 111:145:138 三行里，「今日待办」独占 62% 宽 ×
   65% 高 —— 735×512 的板子上是 452×329，占掉整块面积的四成，
   另外四张挤在一起，月历只剩 269×136，连图例都塞不进去。

   现在把大卡收到 53% 宽 × 56% 高，省出来的全部给另外四张：
     · 右列 38% → 47%，月历 / 最近记录从 269 宽变成 332 宽；
     · 底行 35% → 37%，学生覆盖和管家各高出 10px；
     · 待办自己从 452×329 缩到 388×318（面积 -17%），行距同时压一档，
       四件待办照样一屏全露，不用滚。
   回滚就删这一段，卡片回到 poju-skin 的原始比例。 */
@media (min-width:700px){
  .quad{
    grid-template-columns:minmax(0,32fr) minmax(0,21fr) minmax(0,47fr);
    /* 行高回归内容驱动（2026-11-04 日历改整月后定稿）：
       原来的 minmax(0,156fr/148fr/180fr) 把日历行锁死在 ~152px，
       整月卡内容要 ~221px，底部两行整月必被裁。min=0 的 fr 连条目的
       显式 min-height 都不认（实测：卡 224、行仍 152.8）。改 auto 后
       每行按各自卡的内容高撑，quad 整体高度交给 flex 布局
       （配合 poju 38.2 的 flex:1 0 auto，不够高时页面滚动兜底）。 */
    grid-template-rows:auto auto auto;
  }
  /* 大卡变小了，标题退半档 —— 20px 的标题压在 381px 的卡里，
     视觉重量会压过右边三列，就不再是「主次分明」而是「头重脚轻」 */
  .quad .q-todo .card-h h2{font-size:17px}
  .quad .q-todo .card-h .cnt{font-size:12px}
  /* 行距：poju 在 ≥1500 给 11px、≥2100 给 13px，那是按 452 宽的卡调的量。
     缩到 389×318 后照原值一件 64px、四件 256px 就顶穿了。
     这里按「todos 可视高 192 装下四件 + 底部新增键」反推：
       .todo 40px（上下内距 4 + 两行字 32）= 160
       .todo-add 30 + 上距 6                = 36
     合计 196 → 留 4px 余量，刚好不滚。
     两行字的行高必须显式给（poju 继承下来的 20.15/16.27 是按 15px 正文配的），
     否则字缩了行距不缩，一件还是 54px。 */
  .quad .q-todo .todos .todo{padding:4px 0}
  .quad .q-todo .todos .todo .t-body{gap:1px}
  .quad .q-todo .todos .todo .t-body b{font-size:13px;line-height:1.34}
  .quad .q-todo .todos .todo .t-body span{font-size:12px;line-height:1.3}
  .quad .q-todo .todos .todo .tag{height:18px;padding:0 6px;font-size:11px}
  .quad .q-todo .todo-add{height:30px;margin-top:5px;font-size:12px}
}

/* ─────────── 2. 数字带里的环形格 ───────────
   老板定的规则：只有数字的走衬线大数字，有分母的（完成率 / 覆盖率）走环形。
   2026-11-03 定稿（老板选 A 组）：环走「弧头圆点」+ 动效走「逐段点亮」，两条都照字面——
     ① 环切成 36 根刻度：未完成是灰刻度（.rail），完成是蓝刻度（.dial 再切一次）；
     ② 弧头挂一颗球，跟着 --deg 转到进度末端；
     ③ 节奏由 app.js 的 sweepRing 量化成 10° 一跳，正好一格一根刻度。
   描边从 2.6px 抬到 4px：36 格里每格只有 4° 实线，2.6px 太细会糊成脏点。
   两个 mask 用 mask-composite:intersect 求交（刻度 pattern ∩ 环带），
   这是让「完成段也是一根根刻度、而不是一段实心弧」的关键；
   只写一个 mask 的话，实心弧和刻度轨道风格会打架。 */
/* 测试版这里是 5 格（设计稿 4 格），poju-skin 写死了 repeat(4)，
   不覆盖就会把「材料」挤到第二行，整条数字带从 100px 涨到 230px */
@media (min-width:700px){
  .kpi-grid{grid-template-columns:repeat(5,1fr)}
}
/* 格内距收一档：环形格比纯数字格高，两档拉平后整条才够薄 */
.kpi-grid .kg{padding:11px 16px}
/* 环回到标签正下方。margin-top:7px 跟旁边四格的大数字同一条起跑线
   （poju 1879 给 .kpi-grid .kg b 的就是 7px）。
   环不再有兄弟数字，所以整格是竖排：标签 / 环 / 注脚。
   --bw 是环带宽度，刻度切分和球心定位都从它推，改一处整环跟着走。 */
.kpi-grid .kg .mini-ring{
  --bw:4px;
  display:block;position:relative;flex:none;
  width:48px;height:48px;margin-top:7px;line-height:0;
}
/* 未完成：灰刻度。实 4° / 空 6° = 一圈 36 格，正好对上 sweepRing 的 10° 步长，
   每跳一格点亮一根，节奏和结构同源。 */
.kpi-grid .kg .mini-ring .rail{
  position:absolute;inset:0;border-radius:50%;
  background:repeating-conic-gradient(rgba(35,38,52,.24) 0deg 4deg,transparent 4deg 10deg);
  -webkit-mask:radial-gradient(farthest-side,transparent calc(100% - var(--bw)),#000 calc(100% - var(--bw)));
  mask:radial-gradient(farthest-side,transparent calc(100% - var(--bw)),#000 calc(100% - var(--bw)));
}
/* 完成：蓝刻度。宽度交给背景的 repeating-conic-gradient（和 .rail 一字不差的
   pattern，两套网格必然逐格对齐），进度交给 mask 的 conic 扇形（硬边，
   末端会切出半格，那颗球正好压在上面）。
   ⚠ 这里别用「蓝 conic 当底 + 刻度 pattern 当 mask」，虽然几何上等价，
   但两层 mask 求交后蓝格的抗锯齿边缘会和底色糊在一起，
   看着比灰格胖一圈（实测像素扫描是 4.0°/6.0°，一分不差，纯光学错觉）。
   拆开写省一层 mask，也省得以后有人对着那张图怀疑网格错位。 */
.kpi-grid .kg .mini-ring .dial{
  position:absolute;inset:0;border-radius:50%;
  background:repeating-conic-gradient(var(--blue) 0deg 4deg,transparent 4deg 10deg);
  -webkit-mask:conic-gradient(#000 0deg,#000 var(--deg,0deg),
      transparent var(--deg,0deg),transparent 360deg),
    radial-gradient(farthest-side,transparent calc(100% - var(--bw)),#000 calc(100% - var(--bw)));
  -webkit-mask-composite:source-in;
  mask:conic-gradient(#000 0deg,#000 var(--deg,0deg),
      transparent var(--deg,0deg),transparent 360deg),
    radial-gradient(farthest-side,transparent calc(100% - var(--bw)),#000 calc(100% - var(--bw)));
  mask-composite:intersect;
}
/* 弧头那颗球：整层跟着 --deg 转；球心要压在环带中线上（距顶 --bw/2），
   半径 2.5px，所以 top = --bw/2 - 2.5px。环带从 2.6px 加到 4px 后
   中线从 1.3px 移到 2px，top 必须跟着改，否则球会浮在环内侧。
   白圈 1.2px 把球和刻度切开。 */
.kpi-grid .kg .mini-ring .spin{position:absolute;inset:0;transform:rotate(var(--deg,0deg))}
.kpi-grid .kg .mini-ring .dot{
  position:absolute;left:50%;top:calc(var(--bw) / 2 - 2.5px);
  width:5px;height:5px;margin-left:-2.5px;
  border-radius:50%;background:var(--blue);box-shadow:0 0 0 1.2px var(--card);
}
/* 数字在环心：48px 环内圈 40px，16px 的「29」宽约 17px，左右各留 11px；
   poju 给 .kg b 的 margin-top:7px 不作用在 em 上，不会再把数字往下顶。 */
.kpi-grid .kg .mini-ring .kgr-n{
  position:absolute;inset:0;display:flex;align-items:center;justify-content:center;
  font-style:normal;font-family:var(--v2-serif);font-size:16px;font-weight:700;
  line-height:1;letter-spacing:-.035em;color:var(--ink);font-variant-numeric:tabular-nums;
}
/* 环里的旧结构（.rt）已经不再生成，留着兜底防止别处还在用 */
.kpi-grid .kg .mini-ring .rt{display:none}
/* 环格点得动：点一下直接去对应页面，比原来那张只能点亮的卡有用 */
.kpi-grid .kg.kg-ring{cursor:pointer;border-radius:4px}
.kpi-grid .kg.kg-ring:focus-visible{outline:2px solid var(--blue-ring);outline-offset:2px}
@media (max-width:640px){
  /* 42px 环周长 132px，36 格一格 3.7px，环带收到 3.6px 才留得住空隙 */
  .kpi-grid .kg .mini-ring{--bw:3.6px;width:42px;height:42px;margin-top:5px}
  .kpi-grid .kg .mini-ring .dot{
    width:4.4px;height:4.4px;margin-left:-2.2px;top:calc(var(--bw) / 2 - 2.2px);
  }
  .kpi-grid .kg .mini-ring .kgr-n{font-size:14.5px}
  /* 五格在 2 列里会剩一个孤儿：让最后一格「材料」独占一行 */
  .kpi-grid .kg:nth-child(5){grid-column:1 / -1;border-left:0;padding-left:2px;
    border-top:1px solid var(--line-soft)}
}

/* ─────────── 3. 最近记录：让 165px 的格子多露一条 ───────────
   poju-skin 的 .rec 是 7px 上下内距 + 14px 标题，一条 50px 高，
   165px 里只塞得下 2 条，可标题写着「20 条」。收到 3px 内距、
   标题 12.5px 后一条 37px，能露 3 条（宽屏 ≥1500 仍按 poju 的规则露 4 条）。 */
.quad .q-recent:not(.is-open) .rec{padding:4px 0;gap:1px}
.quad .q-recent:not(.is-open) .rec b{font-size:13px}
.quad .q-recent:not(.is-open) .rec em{font-size:12px}
@media (max-width:1499.98px){
  .quad .q-recent:not(.is-open) .rec:nth-child(n+4){display:none}
}

/* ─────────── 4. 测试版顶部橙条 / 旧 KPI 区 ───────────
   新版今日页不再输出 .kpis / .board，这两条只是防止缓存里的旧 DOM 残留。 */
#view > .kpis:empty{display:none}

/* ─────────── 5. 宽屏整体放大（2026-11-03 老板要求） ───────────
   背景：这套皮肤是照 1160 版心的 1:1 像素做的，到 2100 宽的屏上
   卡片被拉到 1300 宽、字号还是 12.5px，一屏看过去就是「大框小字」。
   逐条改字号要动 1500 个 px 值，改成 zoom 一档把字号、内距、行高、
   圆角一起等比抬起来，改一档就是一档，回滚也只删这一节。

   为什么选 zoom 而不是 transform:scale：zoom 会参与布局，
   内容按放大后的尺寸重新折行、文字不会糊，transform 只是位图拉伸。
   Chrome / Edge / Safari 原生支持，Firefox 126+ 也跟上了。

   body 而不是 #view：左侧栏 .side 也得跟着长，只放大正文会一大一小。
   1400 以下不放大 —— 那里卡片本来就窄，再放大就要横向溢出。 */
@media (min-width:1500px){ body{zoom:1.05} }
@media (min-width:1800px){ body{zoom:1.10} }
@media (min-width:2200px){ body{zoom:1.16} }
/* 放大后上下留白也跟着变厚，收回一点，换回 30px 左右的高度 */
@media (min-width:1500px){
  #view{padding-top:20px;padding-bottom:42px}
  .desk{margin-bottom:14px}
}

/* ─────────── 6. 月历：五种状态 + 常驻图例 ───────────
   两个问题一起收：
   ① poju-skin 在收起态把 .cal-ft（图例）整块 display:none 掉了 ——
      于是那几个圆点成了纯装饰，没人知道红的什么、空心的什么。
      老板要求把颜色讲清楚，那就让它常驻，卡再小也留这二十来像素。
   ② 原来图例只有「硬截止 / 待办 / 有记录」三条，缺周末和节假日。
      补上之后格子本身也得真区分，否则图例是空口白话。

   颜色口径（2026-11-03 老板明确）：**只有日历里「周末 / 节假日」的日期
   数字转红**，全站其它配色一律不动。所以这里不碰 --ink / --blue 那些
   token，只给 .cd.wk / .cd.hol 两个状态上红色。
     · 周末   → 数字红、不铺底（铺底整片日历会发红，反而看不出重点）；
     · 节假日 → 数字红加粗 + 一层更淡的红底，比周末再重一档；
     · 补班   → 中性灰底 + 一道细框，数字保持常色（它是要上班的日子）。
   节假日表在 app.js 顶部的 HOLIDAYS / MAKEUP，每年换一次就行。 */

/* 图例常驻（收起态也不藏） */
.quad .card.q-cal:not(.is-open) .cal-ft{display:flex}
/* 2026-11-09 返工：字号抬到 12px 后这条 6 项图例在 302px 里差 2px 折了行，
   第二行只剩「班 补班」，还把 .q-cal 顶出 8px 被裁。
   不缩字号，改收间距：column-gap 8→6、项内 gap 3→2，腾出 16px，1440 回到 1 行；
   万一更窄的宽度上仍折行，row-gap 3→2 + padding-top 6→5 让两行也塞得下。 */
.cal-ft{margin-top:auto;padding-top:5px}
.cal-lg{flex-wrap:wrap;row-gap:2px;column-gap:6px;font-size:12px;letter-spacing:0;
  color:var(--ink3)}
.cal-lg span{gap:2px;white-space:nowrap;align-items:center}
.cal-lg .lg{flex:none;display:inline-block;width:6px;height:6px;font-style:normal}
/* 三种「这天有事」的标记：靠形状分，不靠颜色 */
.cal-lg .lg-hard{background:var(--red);border-radius:1px}
.cal-lg .lg-todo{background:var(--blue);border-radius:50%}
.cal-lg .lg-ev{background:transparent;border-radius:50%;box-shadow:inset 0 0 0 1px rgba(35,38,52,.42)}
/* 两种「这天什么性质」：图例直接复用日历里的样子 ——
   周末是一个红「六」字，节假日是一小块淡红底上的红「休」。 */
.cal-lg .lg-wk{width:auto;height:auto;padding:0 1px;line-height:1;font-size:12px;
  font-family:var(--v2-serif);font-weight:700;color:var(--red)}
.cal-lg .lg-hol{width:auto;height:11px;padding:0 2.5px;line-height:11px;border-radius:2.5px;
  text-align:center;font-size:12px;font-weight:700;color:var(--red);
  background:rgba(168,57,43,.12)}
.cal-lg .lg-mk{width:auto;height:11px;padding:0 2.5px;border-radius:2.5px;line-height:11px;
  text-align:center;font-size:12px;color:#fff;background:var(--ink4)}

/* ── 卡头中间那颗「下个假期」 ─────────────────────────────────────
   为什么要有：收起态只给两周窗口，碰上整月没有法定节假日的月份（11 月
   就是），她翻半天也看不出「最近什么时候能歇、下次放假还有几天」。
   格子只能表达「已经过去的假期」，这颗徽标表达「还没来的假期」。

   左边小圆点是数据状态，跟图例的语义保持一致：
     实心 = 数据已联网校正过；空心 = 还在用内置表（点一下重拉）。
   点整颗徽标 = 立刻重新联网校正，不吃 7 天缓存。 */
.quad .card.q-cal .cal-h .cal-next{
  flex:0 1 auto;min-width:0;margin-left:6px;margin-right:auto;
  display:inline-flex;align-items:center;gap:5px;
  height:18px;padding:0 7px;border:0;border-radius:9px;
  background:rgba(168,57,43,.075);color:var(--ink3);
  font-size:12px;line-height:1;white-space:nowrap;letter-spacing:0;
  cursor:pointer;overflow:hidden;
  transition:background .16s ease}
.quad .card.q-cal .cal-h .cal-next:hover{background:rgba(168,57,43,.13)}
.quad .card.q-cal .cal-h .cal-next:focus-visible{
  outline:2px solid rgba(168,57,43,.42);outline-offset:1px}
.quad .card.q-cal .cal-h .cal-next .cn-dot{
  flex:none;width:5px;height:5px;border-radius:50%;
  background:transparent;box-shadow:inset 0 0 0 1px rgba(168,57,43,.45)}
.quad .card.q-cal .cal-h .cal-next.is-live .cn-dot{
  background:var(--red);box-shadow:none}
/* 补班：这颗徽标整个换成中性灰 —— 它不是"好事"，别用喜庆的红。
   点仍然是实心（灰）表示数据已联网确认；没联网就回到空心环。 */
.quad .card.q-cal .cal-h .cal-next.is-mk{background:rgba(35,38,52,.055)}
.quad .card.q-cal .cal-h .cal-next.is-mk:hover{background:rgba(35,38,52,.1)}
.quad .card.q-cal .cal-h .cal-next.is-mk b{color:var(--ink2)}
.quad .card.q-cal .cal-h .cal-next.is-mk .cn-dot{
  background:transparent;box-shadow:inset 0 0 0 1px rgba(35,38,52,.42)}
.quad .card.q-cal .cal-h .cal-next.is-mk.is-live .cn-dot{
  background:var(--ink3);box-shadow:none}
.quad .card.q-cal .cal-h .cal-next b{
  font-weight:700;font-size:12px;color:var(--red);letter-spacing:0}
.quad .card.q-cal .cal-h .cal-next em{
  font-style:normal;font-size:12px;color:var(--ink3);
  font-variant-numeric:tabular-nums}
/* 手机上卡头更窄（349px 里要装下 月份 + 徽标 + 三颗键），
   徽标只留「名 + 天数」，天数小一号，压掉 6px */
@media (max-width:699px){
  .quad .card.q-cal .cal-h .cal-next{gap:3px;margin-left:4px;padding:0 5px;height:17px}
  .quad .card.q-cal .cal-h .cal-next b{font-size:12px}
  .quad .card.q-cal .cal-h .cal-next em{font-size:12px}
}
/* 展开态卡头宽裕，徽标可以稍微挺一点 */
.quad .card.q-cal.is-open .cal-h .cal-next{height:20px;padding:0 9px;font-size:12px}
.quad .card.q-cal.is-open .cal-h .cal-next b{font-size:12px}
.quad .card.q-cal.is-open .cal-h .cal-next em{font-size:12px}

/* 头部：翻到别的月份会多出一颗「今天」回跳键，宽度不够时它被压成竖排
   （截图里就是「今/天」两行挤在 ‹ › 中间）。键和标题都不许收缩。 */
.quad .card.q-cal:not(.is-open) .cal-h b{flex:none}
.quad .card.q-cal:not(.is-open) .cal-h .cn{flex:none;align-items:center}
/* 四颗键（‹ 今天 › 展开）挤在 302px 的头里，谁都不许收缩 ——
   默认 flex-shrink:1 会把 › 压成 0 宽，看起来像「下个月」按钮凭空消失 */
.quad .card.q-cal:not(.is-open) .cal-h .cn button{flex:none}
/* 2819 行（poju）`.quad .card.q-cal:not(.is-open) .cal-h .cn button` 带 element，
   specificity (0,6,1)，比纯 class 的 (0,6,0) 高 —— 上次修复就是被它压回去的，
   「今天」仍被钉死 19px，字溢出盖住 › ，看起来「下个月」按钮凭空消失。
   这里也带 element 抬到 (0,6,1)，同分靠后加载赢过 poju。收起/展开两态通吃。 */
.quad .card.q-cal .cal-h .cn button.cal-nowbtn{
  flex:none;width:auto;white-space:nowrap;
  font-size:12px;height:18px;padding:0 5px;line-height:18px}
.quad .card.q-cal.is-open .cal-h .cn button.cal-nowbtn{font-size:12px;height:20px}

/* 格子状态（收起态）：底色说话，不加角标。
   底子从「贴卡底」换成一张真正的表：网格线 1px 用容器底色露出来，
   格子是白纸 —— 之前格子和卡片同色，整片数字像浮在空里。 */
.quad .card.q-cal:not(.is-open) .cal-wk{column-gap:1px}
/* 周末：只把数字转红，格子留白 */
.quad .card.q-cal .cd.wk i{color:var(--red);font-weight:600}
/* 节假日：数字红加粗，比周末重一档 */
.quad .card.q-cal .cd.hol i{color:var(--red);font-weight:700}

/* 展开态：格子大、留白多，底色按比例给淡一点，圆角跟上 */
.quad .card.q-cal.is-open .cd.hol{background:rgba(168,57,43,.10);border-radius:4px}
.quad .card.q-cal.is-open .cd.mk{background:transparent;border-radius:4px;
  box-shadow:inset 0 0 0 1px rgba(35,38,52,.13)}

/* 「+2」是个 <u>，浏览器自带下划线；展开态也一样，统一去掉 */
.cd .dots .d-more{text-decoration:none}

/* 「休 / 班」角标：2026-11-04 起收起态也显示 —— 日历固定整月后，
   节假日 / 补班日的可辨识度靠「红底 + 红字 + 角标」三件套说话，
   只留前两样在整月视图里不够打眼（老板反馈标注像没生效）。
   角标缩到 6.5px 挂右上角，24px 的格子压得住。 */
.cd-tag{position:absolute;top:0;right:0;font-style:normal;
  font-size:12px;line-height:1;padding:1.5px 2px;border-radius:2px;
  color:#fff;background:var(--red);letter-spacing:0;pointer-events:none}
.cd-tag-mk{background:var(--ink4)}

/* 节日名 / 补班字样（老板 2026-11-04 定稿）：直接写在日期数字下面，
   不再让人猜角标。节日名跟假期红字同色（红），「补班」用灰 —— 它是
   要上班的日子，不是喜事。名字行只在有标注的格子出现，网格行高会被
   那一行撑高一点，日历卡本来就是内容定高，随它撑。 */
.quad .card.q-cal .cd-name{font-size:12px;line-height:1;color:var(--red);
  letter-spacing:.03em;white-space:nowrap;font-weight:600}
.quad .card.q-cal .cd.mk .cd-name{color:var(--ink3);font-weight:500}
.quad .card.q-cal.is-open .cd-name{font-size:12px}
/* 有名字行的格子：圆点行让位（gap 收紧），别把格子撑出两行空 */
.quad .card.q-cal:not(.is-open) .cd:has(.cd-name){gap:1.5px}
.quad .card.q-cal:not(.is-open) .cd:has(.cd-name) .dots{height:4px}
.quad .card.q-cal:not(.is-open) .cd:has(.cd-name) .dots b{width:3.5px;height:3.5px}

/* 收起态的表格底子：网格线用容器底色透 1px 缝隙画出来，格子是白纸。
   注意 grid-auto-rows 的 1fr 只在 ≥700 生效 —— 手机上日历卡是按内容
   定高的，没有「剩余高度」可分，硬给 1fr 会把六行格子压成一行 35px
   （实测 390 宽下 grid 只剩 35px）。 */
.quad .card.q-cal:not(.is-open) .cal-grid{
  row-gap:1px;column-gap:1px;
  background:rgba(35,38,52,.09);border-radius:5px;overflow:hidden}
.quad .card.q-cal:not(.is-open) .cd{border-radius:0;background:#fffdfa}
/* 状态底色必须写在「格子是白纸」这条之后 —— 两条特异性相同（都是 5 个类），
   谁后写谁生效。写在前面的那次实测被白纸盖掉了，国庆那七格一点底色都没有。 */
.quad .card.q-cal:not(.is-open) .cd.hol{background:rgba(168,57,43,.13)}
.quad .card.q-cal:not(.is-open) .cd.mk{background:rgba(35,38,52,.035);
  box-shadow:inset 0 0 0 1px rgba(35,38,52,.13)}
@media (min-width:700px){
  /* 收起态让网格吃满剩余高度，但必须带整月下限（2026-11-04）：
     本条在加载顺序上排最后、特异性与 poju §38.1/§39 相同，是最终赢家——
     之前写 min-height:0 会把 poju 里的 159px 下限一起清零，整月 6 行
     被右栏「今日调度」的高度上限压成 8px 一格（实测踩过）。
     159 = 6 行 × 24px + 5 道 3px 缝；flex-shrink 归零保证下限刚性。 */
  .quad .card.q-cal:not(.is-open) .cal-grid{flex:1 1 auto;flex-shrink:0;
    min-height:159px;grid-auto-rows:minmax(24px,1fr)}
  .quad .card.q-cal:not(.is-open) .cd{height:100%;min-height:0}
  /* 卡片本体的刚性下限：上面 100 行的 fr 行高（156/148/180）把日历行
     锁死在 ~152px，而整月卡内容要 ~221px，底部两行整月会被裁掉。
     fr 轨道的最小值会尊重条目的显式 min-height（卡自己的 min-height:0
     只清掉「自动最小值」，管不到显式声明），行 1 会自动撑到 224。
     224 = 内距 19 + 标题 23 + 周标 20 + 网格 159 + 3px 余量。 */
  .quad .card.q-cal:not(.is-open){min-height:224px}
}

/* ── 6.1 格子：退回「日期在上、圆点在下」两层 ────────────────────
   poju 39.3 把格子改成 flex-direction:row（日期和圆点同一排），
   那是给 23px 高的格子配的。现在格子 40×29，一排里塞「13px 数字 +
   3 个 4.5px 圆点 + 一个 +2」要 44px，直接把 +2 顶出格子边界（截图可见）。
   两层反而宽裕：日期 13.6 一行、圆点 4.5 一行，加起来 20px，29px 里还余 9。
   手机上格子只有 26px 高、五六个字宽，同排布局里圆点会贴到数字上
   （截图里「3●●○+2」糊成一团），所以两层全档通用，手机另给一档小尺寸。 */
.quad .card.q-cal:not(.is-open) .cd{
  flex-direction:column;justify-content:center;gap:2px;padding:1px 0}
.quad .card.q-cal:not(.is-open) .cd i{font-size:13px;line-height:1.05}
.quad .card.q-cal:not(.is-open) .cd .dots{height:5px;gap:2.5px}
.quad .card.q-cal:not(.is-open) .cd .dots b{width:4px;height:4px}
.quad .card.q-cal:not(.is-open) .cd .dots .d-more{font-size:12px;margin-left:0;
  text-decoration:none;line-height:1}
@media (max-width:699px){
  .quad .card.q-cal:not(.is-open) .cd{gap:1px;padding:0}
  .quad .card.q-cal:not(.is-open) .cd i{font-size:12px}
  .quad .card.q-cal:not(.is-open) .cd .dots{height:4px;gap:2px}
  .quad .card.q-cal:not(.is-open) .cd .dots b{width:3.5px;height:3.5px}
  .quad .card.q-cal:not(.is-open) .cd .dots .d-more{font-size:12px}
}

/* 「今天」那格 poju 在上方画了个 3px 小圆点（.cd.today::before），
   那是给「日期和圆点同排」的旧布局配的；改成两层后它浮在数字头顶像重影。
   其余「今天 / 选中」的配色一律沿用 poju，不再覆盖。 */
.quad .card.q-cal:not(.is-open) .cd.today::before{content:none}
/* 出月那几格（28/29/30）走 poju 的压淡色，这里只统一圆点的淡出程度 */
.quad .card.q-cal:not(.is-open) .cd.out .dots{opacity:.45}

/* ─────────── 7. 展开键的默认边框（2026-11-03 截「个人管家」时发现的） ───────────
   poju 2101 行那条 `.quad .card-h .cal-toggle` 只给了宽高/底色/圆角，没给
   border —— 别处的展开键都在 .cal-h .cn 里，被 `.cn button{border:0}` 顺带
   收拾了；管家卡的展开键直接挂在 .card-h 下，于是留了浏览器默认的
   `2px outset` 黑框，在浅底色上是一条很扎眼的深灰粗边。 */
.quad .card-h .cal-toggle{border:0}

/* ─────────── 8. 「近 7 天记录」的柱状图（2026-11-03 截右栏时发现的） ───────────
   poju 37.12 想让柱子跟着容器长（「柱子改成按百分比，跟着容器长」），
   于是把 .brf-bars 撑到 120px 高；但容器是 row + align-items:flex-end，
   交叉轴对齐只把柱子贴到底，柱子自己仍是内容高（8+3+9=20px）。
   结果 120px 里只有一条 8px 高的细线，看上去像压扁的碎片。
   改成 align-items:stretch，柱子吃满高度，i{height:44%} 才真的有效。 */
@media (min-width:1280px){
  .brief .brf-bars{align-items:stretch}
  .brief .brf-bar{justify-content:flex-end}
}

/* ─────────── 9. 「近 7 天记录」不许再吃剩余高度（2026-11-03 老板截图） ───────────
   上一节把它从「一条 8px 细线」救成了正常柱状图，但它仍然挂着
   `flex:1 1 auto; min-height:120px`（poju 37.13）—— 意思是「右栏剩多少它吃多少」。
   1440 下还行（124px），屏幕再高一点、或缩放档再大一点，这一块就长成
   两百多像素的巨幅柱状图，把上面「今日时间轴」的几条计划挤成一行行窄条。
   她真正会变多的东西是上面那些计划，不是下面这七个历史数字。
   所以：柱状图回到固定高度（58px，够看高低差），7d 那块退出 flex 分配，
   省下来的空间全给时间轴（.brf-tlwrap 接管 flex:1，太多时自己滚）。 */
.brief .brf-7d{flex:0 1 auto;min-height:0;margin-top:0}
.brief .brf-bars{height:58px;flex:none;min-height:0}
/* 省下来的高度不能全塞给时间轴 —— 那样「下午 2 件」和「这周内」中间会
   挖出一块 150px 的空白，看起来像排版塌了。改成由容器把余量平摊到
   七段之间：计划多了，这几段间距先被压回原值，再不够才滚。 */
.brief{justify-content:space-between}
.brief .brf-tlwrap{flex:0 1 auto;min-height:0;overflow:auto}
/* 计划多到把整张卡撑长时，让时间轴自己在原地滚，不要把右栏拖到比左栏高
   一大截（19 条时实测面板长到 1120，左栏还停在 512，整页比例就散了）。
   calc(100vh - 430px)：1440×900 下约 470，十条计划都还装得下。 */
@media (min-width:1280px){
  .brief .brf-tlwrap{max-height:calc(100vh - 430px);min-height:120px}
}

/* ─────────── 12. 解惑页叠层：输入 → 判断 → 深读 ───────────
   2026-11-03 老板逐项定的六个角度（问一轮定一轮，别自己改）：
     ① 落点：只落在解惑页 —— 全站唯一一处真递进（后一层吃前一层的结论）；
     ② 第一眼：先叠一层空边。判断卡一开始就在，只是压在底下露出 24px，
        让人填之前就知道后面还有一步；
     ③ 层边：层名 + 一颗 5px 状态点（空心灰=没开始 / 空心蓝=进行中 / 实心蓝=已出结论）；
     ④ 回看：只靠层边，点哪层去哪层，不加步骤条、不加回看链接；
     ⑤ 手机：真叠层，与桌面同一套机制（老板 2026-11-03 晚拍板，推翻先前按 B
        落地的叠瓦）。只调参数：层边加高到 28px（手指好点），三层时顶上空 56px
        （JS 按 24×(n-1)+8 算 pad，28×2 恰好被容住）；第一屏以输入卡为主、
        判断卡退到折叠线以下 —— 这是 A 形态的已知代价，老板看过对比页后选的；
     ⑥ 「最近判断」撤出这页，挪进「记录」tab —— 它是并列的过去，不是这一次的一步。
   两条硬规则在 deckApply 的注释里（底层盖纸 + 锁高），少一条就"看起来没叠上"。 */

/* ★ 2026-11-04 老板第五次反馈后定案：机制整套照搬 poju.html（破局 Demo，
   线上 /beta-overlay/poju.html 一直正常）。他原话：「叠层方案请直接改用
   poju.demo 的实现形式，因为该版本运行正常」——不再修 beta 这套自研版。
   demo 与旧实现的三处本质差异，也正是历次毛病的来源：
     ① 层边不是独立 <button>。它是 .deck-under::before{content:attr(data-label)}，
        不存在"24px 细条点不中/坐标漂移/hover 传染"这一类问题；
     ② 整层可点（子元素 pointer-events:none，点击落在层本身），
        所以永远不会"点了没反应"；
     ③ 层序只存在 JS 数组里，CSS 只认 .deck-top / .deck-under 两个类，
        类名与状态彻底解耦。
   接进 beta 时只保留三样本地东西：状态点（并进 data-dot）、动态 --pad、
   以及"位移零过渡"（老板 2026-11-04 明确认可"不抖了"，不能把 demo 的
   .55s 动画带回来）。 */
.deck{position:relative;--peek:24px;--pad:0px}
.deck.decked{padding-top:var(--pad)}
.deck-layer{position:relative}
/* 结构件不许有过渡：beta/ui.css 的 .glass.card 带 transform/.28s 抬升，
   删掉自己的声明只会让通用规则漏进来（实测 computed 仍剩 0.28s 两条）。
   .card.deck-layer (0,2,0) 靠加载顺序赢 .glass.card 同特异性。 */
.card.deck-layer{transition:none}
.deck-layer.is-hidden{display:none}

.deck-layer.deck-top{position:relative;z-index:3;transform:none!important}
/* 位移写在 --deck-tf 里再由 !important 钉死：inline style 能压普通 :hover 规则，
   但压不过 ui.css:887 那条 reduced-motion 的 transform:none!important ——
   上一轮"悬停缩到看不见"就是它俩联手干的。变量 + !important 一次封死两条路。 */
.deck-layer.deck-under{
  position:absolute;left:0;right:0;top:var(--pad);z-index:1;margin-bottom:0;
  transform-origin:50% 0;overflow:hidden;cursor:pointer;
  transform:var(--deck-tf,none)!important;
  filter:saturate(.72) brightness(.985);
  padding-top:calc(var(--peek) + 16px);
  /* 每层顶上一条极细的实线：两条边挨着时全靠它分出「这是另一张纸」 */
  box-shadow:inset 0 1px 0 rgba(35,38,52,.07)}
/* 全站卡片 hover 上浮（ui.css:606）也一并挡掉：层是结构件，不是悬浮卡 */
.deck .card.deck-layer.deck-under:hover{transform:var(--deck-tf,none)!important;
  box-shadow:inset 0 1px 0 rgba(35,38,52,.07)}
/* poju 给相邻 .card 加了上边距，叠层里会把露出的边顶开 */
.deck .card.deck-layer + .card.deck-layer{margin-top:0}
/* 底层必须盖一层实色纸（demo 同款，z-index:2 压在正文上）：卡片本身是 42%
   白玻璃，不盖纸的话下面那层的正文会从上面这层玻璃里透出重影，
   立刻不像「压在最前」。 */
.deck-layer.deck-under::after{content:'';position:absolute;inset:0;z-index:2;
  border-radius:inherit;pointer-events:none;opacity:1!important;
  background:linear-gradient(180deg,#f7f8fb 0%,#eef0f6 100%);
  box-shadow:inset 0 1px 0 rgba(255,255,255,.9),inset 0 -1px 0 rgba(35,38,52,.06)}
.deck-layer.deck-under > *{pointer-events:none}

/* 层边：文字由 data-label 生成，状态点由 data-dot 拼在后面（●/○ 两字符，
   颜色跟 data-state 走）—— 一个伪元素解决"层名 + 状态点"，不用再塞 DOM。 */
.deck-layer.deck-under::before{
  content:attr(data-label) "\2009\2009" attr(data-dot);
  position:absolute;top:calc(var(--peek) / 2 - 9px);left:16px;z-index:3;
  font-family:var(--v2-serif);font-size:12px;font-weight:700;letter-spacing:.02em;
  color:var(--ink3);pointer-events:none;white-space:nowrap}
.deck-layer.deck-under[data-state="done"]::before{color:var(--blue)}
.deck-layer.deck-under[data-state="half"]::before{color:var(--blue);opacity:.6}
.deck-layer.deck-under[data-state="todo"]::before{color:var(--ink4)}

/* 卡头：章节号 + 名称 + 状态点，只在当顶层时看得见 */
.deck-chap{display:flex;align-items:center;gap:7px;margin-bottom:10px}
.deck-chap em{font-family:var(--v2-serif);font-style:normal;font-size:12px;font-weight:700;
  letter-spacing:.14em;color:var(--blue-d,#255070)}
.deck-chap b{font-family:var(--v2-serif);font-size:13px;font-weight:700;letter-spacing:-.01em}
/* ⚠ 必须挂 .deck 前缀：poju 有 .card i 的图标规则（0,1,1），裸 .de-dot (0,1,0)
   压不过，5px 状态点会被撑成 18×24 的空圆圈（deckg-3 截图里「往深里读」
   后面那个圈就是它）。.deck .de-dot (0,2,0) 稳赢。 */
.deck .de-dot{width:5px;height:5px;border-radius:50%;flex:none;box-sizing:border-box;
  transition:background .25s,border-color .25s,opacity .25s}
.deck .de-dot.done{background:var(--blue);border:0;opacity:1}
.deck .de-dot.half{border:1.2px solid var(--blue);opacity:.55;background:transparent}
.deck .de-dot.is-todo{border:1.2px solid var(--ink4);opacity:.5;background:transparent}

/* 判断卡还没跑时的那句话 */
.pj-empty{font-size:12px;line-height:1.72;color:var(--ink4);padding:2px 0 4px}

/* ── 手机：真叠层（老板 2026-11-03 晚：手机也要叠层，不要叠瓦） ──
   机制完全继承桌面（绝对定位 + translateY(-peek×depth) + 整层点击切层），
   这里只做三件手机化的事：
   ① 层边 24→28px：手指命中比鼠标宽一点；JS 的 pad=24×(n-1)+8 在三层时
      正好等于 28×2=56，两条边严丝合缝，不用动 JS；
   ② 层边字号 +0.5px，手机上 11.5 太细；
   ③ 层边文字随 --peek 自动下移（top 用 calc(var(--peek)/2 - 9px) 算的）。
   注意：不要在这里恢复 column-reverse / position:relative 之类的「摊开」规则，
   那是叠瓦时代的老路 —— 恢复任何一条都会把 deck-under 的定位链打断。 */
@media (max-width:640px){
  .deck{--peek:28px}
  .deck-layer.deck-under::before{font-size:12px}
}

/* ── 记录页：接住从解惑页撤下来的「最近判断」 ──
   用原生 details 折叠：默认只露一行，不抢沟通记录的主视线，
   也不用额外写展开/收起的状态机。 */
.pj-fold{margin:0 0 12px;border:1px solid var(--line-soft);border-radius:10px;
  background:rgba(255,255,255,.3)}
.pj-fold > summary{list-style:none;cursor:pointer;padding:9px 12px;
  display:flex;align-items:center;gap:8px;font-size:12px;color:var(--ink3)}
.pj-fold > summary::-webkit-details-marker{display:none}
.pj-fold > summary b{font-family:var(--v2-serif);font-size:12px;font-weight:700;color:var(--ink)}
.pj-fold > summary::after{content:'▾';margin-left:auto;font-size:12px;color:var(--ink4);
  transition:transform .25s var(--ease-x,cubic-bezier(.22,1,.36,1))}
.pj-fold[open] > summary::after{transform:rotate(180deg)}
.pj-fold .pj-hist{padding:2px 12px 10px}

/* 历史行可点 + 选中态（app.css 里有基础排版，这里补交互层） */
.pj-hrow{cursor:pointer;border-radius:8px;transition:background .15s;position:relative}
.pj-hrow:hover{background:rgba(35,38,52,.035)}
.pj-hrow.on{background:rgba(0,113,227,.06)}
/* 行尾小删除：平时半透明不抢视线，按下前先看清是谁的 */
.pj-hdel{position:absolute;top:5px;right:4px;width:22px;height:22px;padding:0;
  border:none;border-radius:50%;background:transparent;color:var(--ink4);
  font-size:16px;line-height:1;cursor:pointer;opacity:.45;transition:opacity .15s,color .15s}
.pj-hdel:hover{opacity:1;color:#C0392B;background:rgba(192,57,43,.08)}
.pj-hrow p{padding-right:20px}

/* ── 当时对话重放 ──
   跟解惑页同一套 .deck 结构（deckApply / deck-go 全复用），
   只是默认顶卡是「贰 · 破局判断」——回看的人要看结论。 */
.pj-replay{margin:10px 0 4px}
.pj-replay-head{display:flex;align-items:baseline;gap:8px;margin:0 0 8px}
.pj-replay-head b{font-family:var(--v2-serif);font-size:12px;font-weight:700;color:var(--ink)}
.pj-replay-head span{font-size:12px;color:var(--ink4)}
.rp-scene{margin:0;font-size:14.5px;line-height:1.75;color:var(--ink)}
.rp-quote{margin:0;font-size:13px;line-height:1.7;color:var(--ink2);
  padding:8px 12px;border-left:2px solid var(--blue);background:rgba(0,113,227,.045);border-radius:0 8px 8px 0}
.rp-who{margin:8px 0 0;font-size:12px;color:var(--ink4)}
/* 重放卡是只读的：底层锁高裁掉的正文不影响（内容都在各层内），不用额外规则 */

/* ── 人物档案库 ──
   收进档案库的折成一行，要改点开；待确认的整卡摊着（那是要动手核对的状态）。 */
.pp-arch{border:1px solid var(--line-soft);border-radius:12px;background:rgba(255,255,255,.3);
  margin:0 0 8px;overflow:hidden}
.pp-arch > summary{list-style:none;cursor:pointer;padding:10px 14px;
  display:flex;align-items:center;gap:10px;font-size:13px}
.pp-arch > summary::-webkit-details-marker{display:none}
.pp-arch > summary::after{content:'▾';margin-left:auto;font-size:12px;color:var(--ink4);
  transition:transform .25s var(--ease-x,cubic-bezier(.22,1,.36,1))}
.pp-arch[open] > summary::after{transform:rotate(180deg)}
.pp-arch > summary b{font-family:var(--v2-serif);font-weight:700;color:var(--ink)}
.pp-arch > summary span{font-size:12px;color:var(--ink3)}
.pp-arch > summary em{font-style:normal;font-size:12px;color:var(--ink4);margin-left:auto;margin-right:6px}
.pp-arch-body{padding:0 14px 12px}
.pp-arch-wait{margin-top:10px;padding:7px 12px;border-radius:8px;font-size:12px;color:var(--ink4);
  background:rgba(35,38,52,.03)}
.pp-arch-done{margin-top:10px;padding:7px 12px;border-radius:8px;font-size:12px;color:#1B7A3F;
  background:rgba(52,199,89,.09);display:flex;align-items:center;gap:10px}
.pp-arch-done .btn{margin-left:auto}
/* 档案库折行的快捷删除：× 绝对定位行尾（箭头左边）；summary 里点按钮不会触发开合 */
.pp-arch > summary{position:relative}
.pp-arch > summary .pp-arch-x{position:absolute;right:32px;top:50%;transform:translateY(-50%);
  width:24px;height:24px;padding:0;border:none;border-radius:50%;background:transparent;
  color:var(--ink4);font-size:16px;line-height:1;cursor:pointer;opacity:.45;
  transition:opacity .15s,color .15s}
.pp-arch > summary .pp-arch-x:hover{opacity:1;color:#C0392B;background:rgba(192,57,43,.08)}
/* 待确认卡与档案库卡底部统一的删除行：低调小字，不跟主操作抢 */
.pp-del-row{margin-top:10px;padding-top:9px;border-top:1px solid var(--line-soft);text-align:right}
.pp-del{border:none;background:transparent;padding:2px 4px;font-size:12px;color:var(--ink4);
  cursor:pointer;border-radius:6px;transition:color .15s,background .15s}
.pp-del:hover{color:#C0392B;background:rgba(192,57,43,.08)}

/* ─────────── 5. TiltedCard：今日页五卡 + 今日调度 3D 视差倾斜 ───────────
   源码 _demo/tilted-card.tsx（动效阁演示页，v4）。JS 在 motion.js「五.4」。
   两件事：
   1. 掐掉 .glass.card 自带的 transition:transform 和 hover 抬升 ——
      CSS 追着 RAF 每一帧跑就是演示页踩过的"粘滞感"根源；
      -2px 抬升改由 JS 并进 transform（motion.js liftY）。
   2. rv-done：rvIn 是 animation fill-mode:both，播完仍永久锁 transform:none
      （优先级压过内联样式），tilt 激活前由 JS 挂上 rv-done 撤掉动画规则。
   glare 光斑、sheen 边缘高光 2026-11-04 老板两轮确认全部去掉，
   一点光泽光晕不留，动效只写 transform。 */
.quad > .card.tilt-on,.desk > aside.brief.card.tilt-on{
  transition:box-shadow var(--h-lift) var(--e-out)}
@media (hover:hover){
  .quad > .card.tilt-on:hover,.desk > aside.brief.card.tilt-on:hover{transform:none;
    box-shadow:var(--sh-2),var(--hi),inset 0 -1px 0 rgba(255,255,255,.18)}
}
.quad > .card.tilt-on.rv-done,.desk > aside.brief.card.tilt-on.rv-done{animation:none;opacity:1}

/* ───────── 2026-11-06 上线简化：手机首页数字行 + 学生覆盖摘要行 ─────────
   JS 只在 <700px 渲染这两块（vToday 里 desk 分支不走这里），桌面看不到。
   观感对齐 .glass 卡：同底色、同圆角、同投影，只是没有卡头，一行说完。 */
.kpi-line{
  display:flex;flex-wrap:wrap;align-items:baseline;gap:1px 0;
  padding:11px 16px;margin-bottom:12px;border-radius:var(--r-lg,16px);
  background:var(--card);border:1px solid rgba(255,255,255,.9);
  box-shadow:var(--sh-1);font-size:12px;color:var(--ink3);
}
.kpi-line b{font-weight:600;color:#a8392b}
.kids-line{
  display:block;padding:12px 16px;margin-top:12px;border-radius:var(--r-lg,16px);
  background:var(--card);border:1px solid rgba(255,255,255,.9);
  box-shadow:var(--sh-1);font-size:13px;font-weight:500;
  color:var(--ink2);text-decoration:none;
}
.kids-line:active{transform:scale(.985)}

/* ══ 装到桌面（standalone）时的安全区 ══════════════════════════════════
   viewport-fit=cover 之后，iPhone 的刘海/灵动岛会压住 fixed 顶栏，
   底部 Home 指示条会压住抽屉和悬浮条。env() 在普通浏览器里恒为 0，
   所以下面几条对「浏览器里打开」零影响，只有装到桌面才生效。
   主内容让出的高度走 --nav-h，那是 app.js 按 nav.offsetHeight 实测回写的，
   padding 一变它自动跟上，不用我手动加。 */
.nav{padding-top:max(16px, env(safe-area-inset-top))}
@media (max-width:700px){
  .nav{padding-top:max(11px, env(safe-area-inset-top))}
}
/* 测试版橙条自己也要让开状态栏，同时把高度撑出来，别让白字贴进状态栏 */
html[data-env="beta"] body::before{
  box-sizing:content-box;
  height:calc(30px + env(safe-area-inset-top));
  padding-top:env(safe-area-inset-top);
}
html[data-env="beta"] .nav,
html[data-env="beta"] .side{top:calc(30px + env(safe-area-inset-top))}

/* ═══════════════════════════════════════════════════════════════════════
   触摸热区 ≥32×32（2026-11-09 · 只动热区，不动视觉和布局）
   ───────────────────────────────────────────────────────────────────────
   为什么要写在这一份的最后：它是最后一个加载的皮肤，同权重下能压过前四份，
   又不至于把改动散进 ui/app 里。规矩是三种，按控件长相选：

   ① 日历日期格：整页唯一明确允许真长高的地方（日历本来就密，25 → 32）。
   ② 盒子能长、底色只在 hover 才出现的控件（文字链、删除钮）：
      加大尺寸后再用等量负 margin 抵消占位 —— 盒子 32，位置一分不动。
   ③ 控件本身就是一块有底色的形状（标签 / 勾选框 / 开关 / 小徽标）：
      用透明伪元素向下向上各外扩，撑出 32 高。伪元素不参与布局，
      所以视觉、盒子、行高都不变；这是唯一能做到"看着一样、点着更大"的办法。

   注意：hm-final.js 量的是 getBoundingClientRect()，看不到伪元素撑出来的热区，
   所以③这类控件在它眼里仍是原来的尺寸。要量真实热区请跑 _audit/tap-scan.js。
   ═══════════════════════════════════════════════════════════════════════ */

/* ① 日历日期格 25 → 32。只加在桌面宽屏：手机上的四宫格日历是 20px 的密集
      小格，抬到 32 会让那张小卡凭空高 84px，那反而不是「热区变大」而是「布局塌了」。 */
@media (min-width:1181px){
  /* 选择器要写到 5 个类：同文件里 .quad .card.q-cal:not(.is-open) .cd 有 5 个类，
     写少了（4 个）压不过它，min-height 会被那条的 min-height:0 吃掉 */
  .quad .card.q-cal .cal-grid,
  .quad .card.q-cal:not(.is-open) .cal-grid{grid-auto-rows:minmax(32px,1fr)}
  .quad .card.q-cal .cd,
  .quad .card.q-cal:not(.is-open) .cd{min-height:32px}
}

/* ② 透明盒子：加尺寸 + 等量负 margin，净占位为 0 */
.row .del,.ftile .fdel{width:32px;height:32px;margin:-3px}
a.more,.card-h .more,.sec-h .more,.pg-head .hl .bak,a.brf-wk-more{
  display:inline-flex;align-items:center;min-height:32px;margin-block:-7px}
button.todo-add{min-height:32px}
/* .kid 有 overflow:hidden，伪元素撑出去会被自己剪掉；只能把盒子抬到 32。
   宽度 30 停在原样 —— 16 列网格里再放宽就要和隔壁格子抢点击了。 */
.kid{min-height:32px}
/* 最近记录行：实测 31.5px，差半像素 */
.rec{min-height:32px}
/* ── 差 1~5px 的按钮/输入框：直接把盒子抬到 32。
      它们是实底控件，伪元素撑不出盒子；30→32 这点差别肉眼看不出来，
      但手指能感觉到。.btn.sm 是卡头里那种极小链接钮，抬到 32 会撑歪卡头，
      单独走伪元素。 ── */
.btn:not(.sm),.brf-btn,.fmsw,.bt-go,.bt-inp,.inp,.brf-ti,.brf-wk-i{min-height:32px}
/* 卡头里那种极小链接钮：多数实例本来就 33 高，只有 .q-butler 里那颗是 20 高。
   所以伪元素给固定 32 高并垂直居中，而不是 inset:-7px 0 ——
   前者不会让 33 高的按钮凭空多出 14px 隐形可滚动区。 */
.btn.sm{position:relative}
.btn.sm::after{content:"";position:absolute;left:0;right:0;
  top:50%;transform:translateY(-50%);height:32px}
/* 分段切换那排（今天/本周/全部、未写/3 次以上）实测 31px */
.seg button,.chips button{min-height:32px}
/* 管家输入条的发送钮：高 32 宽 30，差 2px */
.bt-go{min-width:32px}

/* ③ 有底色的控件：透明伪元素外扩。
      竖直方向直接给 32 高；水平方向只各放 2px —— 放多了会和相邻块的热区
      叠在一起（学生格之间只有 3px 间距），点哪个就成了运气。

      ⚠ 铁规矩：绝对定位伪元素的包含块是「最近的定位祖先」。宿主自己是 static 时，
      伪元素会一路上溯找到卡片/行容器，热区直接盖住整块区域。
      2026-11-09 验收抓到的 .cal-next 就是这样把整张日历卡接管了
      （伪元素 346×318，点卡片空白处会真发一次联网校正）。
      所以下面每个宿主都必须在同一批里显式定位 —— 新加一条伪元素热区，
      就要在这里补一个类名，不许省。 */
.tick-btn,.tag,.cal-toggle,.bt-do,.brf-kid,.chip,.ln-tg,
.cal-next,.cal-h .cn button,.brf-ti-mv{position:relative}
.tag::after,.cal-toggle::after,.bt-do::after,.brf-kid::after{
  content:"";position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);
  height:32px;border-radius:inherit}
/* .chip 和 .ln-tg 的 ::after 已被占用（圆点、开关滑块），改用 ::before */
.chip::before,.ln-tg::before{
  content:"";position:absolute;left:0;right:0;top:50%;transform:translateY(-50%);
  height:32px;border-radius:inherit}
/* 日历头的翻页箭头与简报里的上移钮：本身就小于 18px，四个方向都放 8px */
.cal-next::after,.cal-h .cn button::after,.brf-ti-mv::after{
  content:"";position:absolute;inset:-8px;border-radius:6px}
/* .cal-next 自己带 overflow:hidden（截徽标文字用的）。定位后伪元素的包含块缩到它
   自己的 padding box，overflow:hidden 就会把伸出去的热区剪掉、退回 18px 高 ——
   等于白改。所以这两条必须成对出现。 */
.quad .card.q-cal .cal-h .cal-next{position:relative;overflow:visible}
/* 管家发送钮只有 30 宽，左右各 -2 才到 32（-1 时实测 31，差 1px 不达标） */
.bt-do::after{left:-2px;right:-2px}
/* 勾选框：视觉仍是 18/20，热区 36（四周各外扩 9px） */
.tick-btn::before{inset:-9px}

/* ═══════════════════════════════════════════════════════════════
   2026-11-06 二轮返工（QA 验收 5 条 P1 + 层级回补）
   改前版本 20261109d-c4e9f21；回滚删掉本区块即可。
   ═══════════════════════════════════════════════════════════════ */

/* ── P1-3 学生页页头按钮掉行（页头 150 → 210px）──
   根因：.hr 作为 flex 子项默认可收缩，容器 1049 装不下 .hl 481 + .hr 612 时
   .hr 内部按钮先折行，页头整个变高。让 .hr 不许缩，收缩压力全部给 .hl
   （.hl 已有 min-width:0，副标题自动换两行，代价远小于按钮掉行）。 */
.pg-head .hr{flex:none}

/* ── P1-5 管家卡两句话被省略号截断 ──
   「能答、能记、能派活 · 已并入 Copilot」12px 下 205px 装进 162px 的卡，
   尾巴被裁掉语义不完整。改两行截断（line-clamp:2），162×2=324 放得下全文；
   「打开「材料」· 筛「草稿」」同一容器，一并解决。 */
.quad .q-butler .card-ft .cf-note{
  display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;
  white-space:normal;overflow:hidden;text-overflow:clip}

/* ── QA 抓的漏网：学生页「多」头像圈 4.19:1 ──
   .kav 字色 rgb(47,102,144) 压在自身 8.6% 的浅蓝底上不够 4.5。
   加深到 rgb(38,80,115)，按卡片实底验算 5.79:1。 */
.kid .kav{color:rgb(38,80,115)}

/* ── 层级回补：字号全抬到 12 之后，标签和辅助说明分不出来了 ──
   只动具名位置，不再全站扫：
   待办页正文 13→14；四宫格是锁高紧凑设计（.todos 192px 装四件），
   正文保持 13 不动，只把里面的标签 12→11（上方 160 行原地改），
   这样四宫格里 标签11 / 辅助12 / 正文13、待办页正文14，级差回来了。 */
.row .t-body b{font-size:14px}
.tag{font-size:11px}
.chips .chip, .dc-chips .chip, .wacc .chips.grp .chip{font-size:11px}
.side-cap{font-size:11px;letter-spacing:.12em}

/* ── P1-3 补刀：.hr{flex:none} 只保证了按钮不折行，但 .hl 独占一行、
   .hr 还是掉到第二行（wrap 的判定在压缩之前）。桌面档直接禁换行，
   让 .hl 收缩、副标题换行——文字换行的代价远小于按钮掉行。
   640 以下仍有自己的竖排布局（app.css 640 断点 .hr width:100%），不受影响。 */
@media(min-width:641px){.pg-head{flex-wrap:nowrap}}

/* ── .tick 热区被滚动容器裁掉左半边（26×33）──
   .quad .q-todo .todos .todo 的 padding 左右为 0，勾选框贴着行左缘，
   ::before 向左外扩的 9px 落在 .todos(overflow:auto) 之外被剪掉。
   给行补 9px 左 padding、勾选框用负 margin 拉回原位：
   视觉不动，热区的左 9px 落进行自己的 padding 里，不再出容器。 */
.quad .q-todo .todos .todo{padding-left:9px}
.quad .q-todo .todos .todo .tick{margin-left:-9px}

/* ── 参谋：最近产出可点开全文 + 补话续跑（老板 2026-11-07 反馈） ── */
.cp-out-tip{margin-left:8px;font-size:12px;font-weight:400;color:#8a8f9d}
.cp-out-row{position:relative}
.cp-out-row.has-more{cursor:pointer}
.cp-out-row.has-more:active{opacity:.7}
.cp-out-row .cp-out-full{display:none;margin:8px 0 0;padding:10px 12px;
  font:inherit;font-size:13px;line-height:1.7;white-space:pre-wrap;word-break:break-word;
  color:#3a3d49;background:rgba(58,81,153,.05);border:0;border-radius:10px}
.cp-out-row.open p{display:none}
.cp-out-row.open .cp-out-full{display:block}
/* 展开态改块级：app.css 底样式是 auto auto 1fr 三列 grid，pre 会被塞进第三列
   挤成窄条（手机 390 实测全文只有 147px 宽）。展开时 span/em 并排一行，pre 独占整行。 */
.cp-out-row.open{display:block}
.cp-out-row.open span{display:inline-block;margin-right:10px}
.cp-out-row.open em{display:inline-block}
.cp-reply{display:flex;gap:8px;margin-top:12px;padding-top:12px;
  border-top:1px solid rgba(35,38,52,.08)}
.cp-reply input{flex:1;min-width:0;padding:9px 12px;font:inherit;font-size:14px;
  color:#232634;background:rgba(255,255,255,.75);
  border:1px solid rgba(35,38,52,.14);border-radius:10px;outline:none}
.cp-reply input:focus{border-color:#3a5199}
.cp-reply .btn{flex-shrink:0}

/* ── 派活不跳页：管家对话内嵌参谋进度卡（老板 2026-11-10 批） ── */
.bt-cpemb{margin:8px 0 4px 46px;max-width:640px}
.bt-cpemb .cp-task{margin:0}
.bt-cpemb .glass{box-shadow:none}
.cp-emb-empty{padding:10px 14px;font-size:13px;color:#8a8f9d;
  background:rgba(58,81,153,.05);border-radius:12px}

/* 「问」行动块：不是按钮，摆在那儿等她回话 */
.bt-act.ask{cursor:default;background:rgba(58,81,153,.04)}
.bt-act.ask em{flex-shrink:0;font-style:normal;font-size:12px;color:#8a8f9d}

/* 参谋拿不准的问题清单 */
.cp-asks .cp-obs{color:#3a5199}

/* 回执单：干了什么 → 自查发现 → 需你看，通过/重办她说了算 */
.cp-rcpt{margin-top:14px;padding:12px 14px;border:1px solid rgba(35,38,52,.1);
  border-radius:12px;background:rgba(255,255,255,.55)}
.cp-rcpt-h{display:flex;align-items:baseline;gap:8px;margin-bottom:8px}
.cp-rcpt-h b{font-size:13px;color:#232634}
.cp-rcpt-h em{font-style:normal;font-size:12px;color:#8a8f9d}
.cp-rcpt-sec{margin:7px 0}
.cp-rcpt-sec>span{display:inline-block;margin-right:10px;font-size:12px;font-weight:600;color:#3a5199}
.cp-rcpt-sec p{display:inline;margin:0;font-size:13px;line-height:1.7;color:#3a3d49}
.cp-rcpt-sec p.warn{display:block;color:#8a4a1f}
.cp-rcpt-btns{display:flex;align-items:center;gap:10px;margin-top:10px;padding-top:10px;
  border-top:1px solid rgba(35,38,52,.08)}
.cp-rcpt-btns em.ok{font-style:normal;font-size:13px;color:#2e7d4f;font-weight:600}
.cp-rcpt-link{margin-left:auto;font-size:12px;color:#3a5199;text-decoration:none}
