/* 网页版正式视觉（W4+；零框架）。克制的暖色系，正文可读性优先。 */
:root {
  --bg: #f2ede4; --card: #fff; --ink: #2b2a28; --muted: #7a7670; --line: #e6e1d8;
  /* 点缀色（2026-08-27 老师拍板，同日追拍「或者全部用」）：全站用 Claude
   * 的橘红陶色；黄调暖底保留（底色/墨色/线条不动）。深色主题已撤，见下。
   * 2026-08-28 老师拍丙（codex 外审 P2 对比度）：正文链接与导航当前页的
   * 「字」用深一档 --accent-text（**当时**那一版 #c2603a 在暖白底上 4.59 达标；
   * 这个数是 2026-08-28 的历史陈述，**不是现状**——现值见下面第 66 轮那一条，
   * 压白卡 6.45／压页底 5.53／压引用块 5.25。验收 c43 的 P3-5 点名要把这句写准，
   * 免得后人当成现在还是 4.59）；按钮、品牌字标等
   * 大块点缀观感不动，仍用 --accent。
   * 2026-09-21 老师拍（第 66 轮通病 G3，对比图五选一，原话逐字「按建议，方案二」）：
   * --accent 由 **#d97757** 调深一档为 **#b34b28**。缘由是走查附录二那条「最要紧的
   * 一条」——全站所有实心橙按钮（登录、发送验证码、提交、发送、开始排盘、今日签到…）
   * 上的白字，在 #d97757 上对比度只有 **3.12**，够不上无障碍正文档的 4.5；换成
   * #b34b28 之后实算 **5.31**（两个数都是按 WCAG 相对亮度公式算的，见交卷汇报）。
   * **--accent-ink 仍 #fff、--accent-text 仍 #b0592f，两格一个字没动**。
   * 2026-09-21 老师再拍（第 66 轮小修二第 2 条，对「橙色调深以后，链接字反而比按钮
   * 浅了，要不要一起调深」原话逐字：「调深」；「四、等你定的事」第 3 条又答「调深」）：
   * --accent-text 由 **#b0592f** 调深为 **#9e4223**。
   * 原文（改前）那一格的毛病：#b0592f 压页底 #f2ede4 只有 **4.17**、压白卡 **4.87**、
   * 压引用块 #efe7da **3.96**——小字门槛是 4.5，三处里两处够不上；而且它比新主橙
   * #b34b28 还**浅**（明度 .437 对 .429），与当初分这两格的理由「字用深一档」正好反了。
   * 新值实算（同一条 WCAG 相对亮度公式，见交卷汇报）：压白卡 **6.45**、压页底
   * **5.53**、压引用块 **5.25**，三处都过 5。色相与饱和度**对齐主橙**（15.1°／.637，
   * 主橙 15.1°／.635），只把明度压到 .378——同一族橙，只是深一档，不是另起一个颜色。
   * **--accent 与 --accent-ink 这一轮一个字没动。** */
  --accent: #b34b28; --accent-ink: #fff; --accent-text: #9e4223;
  --ok: #2f7a3e; --bad: #b3261e;
  /* 2026-09-13 全站底色改浅一档（老师第 11 轮第 3 条，方案稿 §4.13）之后，这一行
   * 里跟底色**贴得最近的那几个**逐个实看实测过（375／1280 真浏览器截图 ＋ 逐像素
   * 取样，见 HANDOFF 那一条）：
   * · --quote-bg 改了：原 #f7f2ea 比**旧**底色 #faf8f4 暗 (3,6,10)，故看得出是块；
   *   换新底色 #f2ede4 之后它反而比底色**亮** (5,5,6)，引用块整块浮成亮的（条款页
   *   「活动价仅在首发活动期间有效」那一段实测：底色 (242,237,228)、块底
   *   (247,242,234)）。新值 = 新底色 − 原来那个差值 = (242-3,237-6,228-10)
   *   = #efe7da，**明度差与改底色之前一模一样**。
   * · --code-bg 不动：`code` 这个选择器全站只落在三处（真人咨询页、意见反馈页、
   *   邀请好友页的微信号／邀请链接），三处都在白卡 .card 里、**一处都不贴页面底色**；
   *   实测块底 (241,237,230) 压在 .notice 的 (252,244,242) 上，改前改后逐像素相同。
   * · --skeleton 不动：只用在 `.locked .line`，而 `.locked` 自己的底是 --card（白），
   *   骨架条压的是白卡不是页面底色，底色一换对比一点没变（模糊预览页实测）。
   * · --veil-from／--veil-to 改了：这两个把**旧底色的 RGB 写死在里面**
   *   （250,248,244 就是 #faf8f4），底色一换，渐隐的尽头就还是旧底色，等于在
   *   样式表里留一份过期的底色副本。改成新底色的 RGB (242,237,228)。
   *   **实测补一句**：遮罩铺在 `.locked` 的白卡上（不是页面底色上），所以改完
   *   渐隐尽头会比改前更暖一档——这一点单列请老师过目（见 HANDOFF）。
   * 守门在 tests/test_web_theme_bg.py：--bg 钉死 #f2ede4，--veil-* 的 RGB 从 --bg
   * 现算现比，不写死第二份。 */
  --code-bg: #f1ede6; --quote-bg: #efe7da; --skeleton: #e8e2d7;
  --veil-from: rgba(242,237,228,.15); --veil-to: rgba(242,237,228,.9);
  /* 这两格是 --accent **同一个颜色的半透明副本**（聚焦光圈、活动句/价签的浅底），
   * 2026-09-21 随 --accent 一起从 rgb(217,119,87) 换成 rgb(179,75,40)——不换的话
   * 站上会同时存在两种橙，按钮一档、光圈与浅底另一档。透明度两格都没动。 */
  --focus-ring: rgba(179,75,40,.2); --promo-bg: rgba(179,75,40,.08);
}
/* 深色主题已撤（2026-08-27 老师拍板「黑底色效果不好，全部用白底色」）：
 * 原 @media (prefers-color-scheme: dark) 的 token 覆盖块整体删除，系统开
 * 深色的访客也一律见暖白底。安卓壳的日夜垫层归壳工程自管，不受此影响。 */
* { box-sizing: border-box; }
body { margin: 0; background: var(--bg); color: var(--ink);
       font: 16px/1.65 -apple-system, "PingFang SC", "Noto Sans CJK SC", sans-serif; }
/* 上下内边距 `1.05rem` → `.34rem`（第 66 轮第 2 条）。老师 2026-09-21 原话逐字：
 * 「己所不欲 勿施于人---这几个字不需要放大。也就是这一行不要占太大的空间。」
 * 顶栏里现在只剩那一句 11.52px 的小字（见 _fillTopBar），原来那一档内边距是按
 * 「品牌字标 ＋ 一枚繁简按钮」配的，留着就是为一行小字空占一截。
 * 左右 `1.4rem` 没动——与页面 `main` 的左右留白对齐，题词的左边缘要和正文一条线。 */
nav { display: flex; gap: 1.2rem; align-items: center; padding: .34rem 1.4rem;
      background: var(--card); border-bottom: 1px solid var(--line); flex-wrap: wrap;
      position: sticky; top: 0; z-index: 10; }
/* `#nav_lang` ＝繁简键的容器。顶栏里那一枚第 66 轮已撤，这个 id 现在只剩两处：
 * 登录页自开的那一个（web/login.html）与「我的账户」页新落的那一行
 * （web/account.html）。`margin-left: auto` 是当初把它推到顶栏右端用的，
 * 那两处都不需要靠右，故整条删掉，只留下面 `.lang-switch` 那枚按钮自己的样式。 */
.lang-switch { margin-top: 0; padding: .3rem .75rem; font-size: .85rem; }
nav a { color: var(--ink); text-decoration: none; position: relative; }
nav a.active { color: var(--accent-text); font-weight: 600; }
nav .badge { display: inline-block; min-width: 1.2em; padding: 0 .35em; margin-left: .25em;
             border-radius: 999px; background: var(--bad); color: #fff; font-size: .75rem;
             text-align: center; line-height: 1.4; }
/* 顶栏题词（2026-09-13 老师第 1 轮第 1 条＋第 5 轮第 1 条「把逗号改成空格」）：
 * 墨灰小号衬线；`white-space: nowrap` 保证它整句不从中间断开。
 * 字号 `.72rem`（11.52px）**一个字不动**——第 66 轮 G7 把全站小于 12px 的对客
 * 小字都放大到 12px，**只有这一句是例外**，老师 2026-09-21 原话逐字：
 * 「己所不欲 勿施于人---这几个字不需要放大。也就是这一行不要占太大的空间。」
 *
 * **原文（改前）**末尾还有两格：`padding-left: .5rem; border-left: 1px solid var(--line);`
 * ——那道细竖线是用来把题词与左边的品牌字标隔开的。第 66 轮字标撤了之后，
 * 题词就是顶栏最左边那一样，那道竖线会悬在屏幕左沿，故一并撤掉。 */
.nav-motto { font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
             font-size: .72rem; color: var(--muted); letter-spacing: .04em;
             white-space: nowrap; }
/* ── 第 66 轮 G7：全站对客小字放大到不小于 12px ──────────────────────────────
 *
 * 出处：走查 `ux-walk-report.md` 附录二末段「正文小于 12px 的地方（每页都有）」。
 * 主会话建议「G7 跟顶栏改版一起做」，老师 2026-09-20 深夜答「都按建议」。
 * 12px 是手机上正文可读的下限，也是走查用的那把尺。
 *
 * 一律只把 `font-size` 提到 `.75rem`（＝12px；本文件 `rem` 按 `<html>` 的 16px 算，
 * 窄屏那条 `body { font-size: 15px }` 动的是 `body`、不动 `rem` 的基准）。
 * **只改字号这一格**：颜色、行高、内边距、边框一个没动。
 *
 * 改到的十五处（原值 → 现值，各自的规则上不再重复记）：
 *   `.tabbar .tab` 底栏标签字 .7 → .75；`article.report .rpt-k` .7 → .75；
 *   `.site-footer` 页脚三行 .72 → .75；`.zm-pre`「知命之」.7 → .75；
 *   `.zm-sub` 副题 .7 → .75；`.yj .line .t` 宜／忌那枚 .74 → .75；
 *   `.yj .line p` 宜忌两句 .72 → .75；`.gua .self`「自己」小标 .6 → .75；
 *   `.pill` 九个服务小项 .72 → .75；`.rows .row .sub` .7 → .75；
 *   `.rows .row .slot` .62 → .75；`.tagrow .lab2` .7 → .75；`.cap` .74 → .75；
 *   `.ask-ainote` 问AI 那行小字 .72 → .75；`.ask-fine` .7 → .75。
 *
 * **唯一的例外就是上面那条 `.nav-motto`（顶栏题词，仍 .72rem＝11.52px）**——
 * 老师 2026-09-21 原话逐字：「己所不欲 勿施于人---这几个字不需要放大。也就是
 * 这一行不要占太大的空间。」 */
/* ── 底部导航（方案稿 §4.11；老师 2026-09-13 第 2 轮定，第 10 轮批开工）──────
 * 钉在视口底，**所有宽度都出**（主会话 2026-09-13 定：不是只手机）。
 * `env(safe-area-inset-bottom)` 必带：iPhone 底部那道横条否则会压住第五项；
 * `constant()` 是 iOS 11.0–11.2 的老拼法，写在前面作兜底（新浏览器整条丢弃）。
 * 页面内容不被挡住靠 `body.has-tabbar` 那条下内边距（由 renderBottomNav 挂上）。 */
/* 下面四条是**冲掉通用 `nav` 规则**用的，一条都不能省：底栏这一层是 <nav>，
 * 文件开头那条 `nav { position: sticky; top: 0; gap: 1.2rem; flex-wrap: wrap;
 * border-bottom: 1px solid … }` 照样落在它身上。尤其 `top: 0`——`position: fixed`
 * 同时吃到 top:0 与 bottom:0 就会被**拉成整屏高**，整条底栏盖住全页内容
 * （2026-09-13 实测：tests/test_poster_page.py 那条「图正中间点下去点到的是谁」
 * 当场报红，量到底栏 800×1057）。故显式写回 `top: auto`。 */
.tabbar { position: fixed; top: auto; left: 0; right: 0; bottom: 0; z-index: 20;
          display: flex; gap: 0; flex-wrap: nowrap;
          background: var(--card); border-bottom: 0; border-top: 1px solid var(--line);
          padding: .45rem .2rem .5rem;
          padding-bottom: calc(.5rem + constant(safe-area-inset-bottom));
          padding-bottom: calc(.5rem + env(safe-area-inset-bottom)); }
.tabbar .tab { flex: 1; position: relative; display: flex; flex-direction: column;
               align-items: center; gap: .2rem; padding: .25rem 0;
               font-size: .75rem; color: var(--muted); text-decoration: none; }
/* 图标格子。尺寸（24×24、8px 圆角）与两态颜色都**原样沿用**改前那一档——
 * 2026-09-13 第 14 轮把格子里的临时单字换成定稿图标，只换里面画什么，
 * 格子本身与颜色一个数没动（字号与衬线字体那两条是给临时单字用的，
 * 现在里面是 <svg>、用不上了，留着不碍事，也免得顺手改动无关的一行）。 */
.tabbar .tab .ti { width: 24px; height: 24px; border-radius: 8px; display: grid;
                   place-items: center; font-size: .82rem; border: 1px solid var(--line);
                   color: var(--muted);
                   font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif; }
.tabbar .tab.on { color: var(--accent-text); font-weight: 600; }
.tabbar .tab.on .ti { border-color: var(--accent); background: var(--accent); color: var(--accent-ink); }
/* 定稿图标的线条（2026-09-13 第 14 轮）：三条逐字取自图标候选表
 * docs/mockups/底栏图标候选.html:88-90 的 `.ic` 一族，描边 1.75、圆头圆角。
 * **颜色一律 currentColor**——灰态取上面 `.ti` 的 `--muted`、高亮态取
 * `.tab.on .ti` 的 `--accent-ink`（压在 `--accent` 底上），**不新起颜色**。
 * `.dot` 是问AI 那两只眼睛：实心、不描边。 */
.tabbar .ic { width: 24px; height: 24px; display: block; }
.tabbar .ic * { fill: none; stroke: currentColor; stroke-width: 1.75;
                stroke-linecap: round; stroke-linejoin: round; }
.tabbar .ic .dot { fill: currentColor; stroke: none; }
/* 那一份内联 sprite 的容器：只是八个 symbol 的存放处，不占版面、不给读屏读。
 * （`<symbol>` 本身浏览器就不渲染，这条是双保险——容器一旦被别的规则赋了
 * display，空盒子会在页底撑出一道缝。） */
.tabbar-sprite { display: none; }
/* 未读红点（改前是顶栏「消息」上那个带数字的角标；顶栏链接挪走后落到这里）。 */
.tab-dot { position: absolute; top: .15rem; right: 50%; margin-right: -.95rem;
           width: 8px; height: 8px; border-radius: 50%; background: var(--bad); }
/* 底栏是 fixed，页底须垫出它那么高，否则页脚最后几行被压在下面。
 *
 * **2026-09-21 第 66 轮通病 G5**：原文（改前）两行是
 *     body.has-tabbar { padding-bottom: calc(4.2rem + constant(safe-area-inset-bottom)); }
 *     body.has-tabbar { padding-bottom: calc(4.2rem + env(safe-area-inset-bottom)); }
 * 附注写「4.2rem＝图标 24 ＋ 文字一行 ＋ 上下内边距」——这个数**算少了**：
 * 走查在三档屏幕上实测底栏真高 70px，而 4.2rem ＝ 67.2px，**差 2.8px**，于是每一页
 * 最后一块内容（首页标语、账户页「命盘档案」卡、课程页课程卡、日卦卦面卡）都被压住
 * 一截。同一份样式表里另外两处（`.askbar` 与 `body.ask-page.has-tabbar`）早就发现了
 * 这件事，各自写着 4.4rem 并注明「公共表那条 4.2rem 略矮一点」——**三处各写一个数**
 * 正是长歪的根源。
 *
 * 现在改成「按实际高度留白」：`--tabbar-h` 由 api.js 的 renderBottomNav 画完底栏当场
 * `getBoundingClientRect().height` 量出来写进 <html>（窗口改尺寸、语言切换重画时再量
 * 一次），**含 iPhone 底部安全区**——底栏自己的 `padding-bottom` 里已经加了
 * `env(safe-area-inset-bottom)`，量到的高度自然把它算进去了，这里不能再加一遍。
 * 下面第一、二行是量不到时的兜底（老浏览器不认自定义属性、或脚本没跑起来），
 * 数值取 4.4rem＝70.4px，与站上另外两处一致、比实测的 70px 多出 0.4px。 */
body.has-tabbar { padding-bottom: calc(4.4rem + constant(safe-area-inset-bottom)); }
body.has-tabbar { padding-bottom: calc(4.4rem + env(safe-area-inset-bottom)); }
body.has-tabbar { padding-bottom: var(--tabbar-h, calc(4.4rem + env(safe-area-inset-bottom))); }
main { max-width: 680px; margin: 1.5rem auto; padding: 0 1rem; }
main a { color: var(--accent-text); }
/* 消息中心正文里那个可点的词（老师 2026-09-22 答「修，改，……」的「改」）：
 * 原先它是**浏览器默认的蓝色带下划线**，站上别处的链接都是上一行那个
 * `--accent-text`。差别的根子不在链接本身——`web/messages.html` 整页内容直接挂在
 * `<body>` 下、**没有 `<main>` 包裹**（`tasks.html`／`me.html` 都有），所以上一行
 * 那条规则压根管不到它。
 * 这里**只补颜色这一格**，取的就是上一行同一个变量，不新造链接样式、不动版式
 * （没有给 messages.html 加 `<main>`：那会连带改页宽与边距，老师只说了颜色）。
 * 选择器写的是 `#rows`——**站上有五张页用这个 id**（`messages.html`、`tasks.html`、
 * `admin-feedback.html`、`admin-judgments.html`、`admin-orders.html`），所以这条
 * 规则字面上也罩着那四张。**但效果上一处没变**：那四张都有 `<main>` 包着，早已被
 * 上面 `main a` 染成同一个变量色，这条再染一遍还是同一个色。真正起作用的只有
 * `messages.html`（它没有 `<main>`），这条就是专为它补的。**别处链接一个没动。**
 * （原注释写作「只框住消息列表那一格」，措辞比实际窄；2026-09-22 验收 c48 的
 * P3-5 按实际改准，规则本身一个字符没动。） */
#rows a { color: var(--accent-text); }
h1 { font-size: 1.35rem; margin: .5rem 0 1rem; }
h2 { font-size: 1.1rem; margin: 1.6rem 0 .6rem; }
.card { background: var(--card); border: 1px solid var(--line); border-radius: 10px;
        padding: 1.2rem; margin-bottom: 1rem; }
label { display: block; margin: .8rem 0 .3rem; color: var(--muted); font-size: .92rem; }
input, select { width: 100%; font-size: 1rem; padding: .55rem .7rem; border: 1px solid var(--line);
                border-radius: 8px; background: var(--card); color: var(--ink); }
input:focus, select:focus, textarea:focus { outline: none; border-color: var(--accent);
                box-shadow: 0 0 0 3px var(--focus-ring); }
button:focus-visible, a:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
input[type=checkbox] { width: auto; margin-right: .4rem; }
button { font-size: 1rem; padding: .6rem 1rem; border: 0; border-radius: 8px; cursor: pointer;
         background: var(--accent); color: var(--accent-ink); margin-top: 1rem; }
button.secondary { background: transparent; color: var(--accent); border: 1px solid var(--accent); }
/* a.secondary：分享页「保存图片」是个链接（<a download>），不是按钮。站里原先只有
   button.secondary，链接拿不到 button 那条的内边距/圆角，会渲染成默认蓝色下划线
   （外审指出）。这里把按钮那身行头补齐，长相与 button.secondary 一致。 */
a.secondary {
  display: inline-block; font-size: 1rem; padding: .6rem 1rem; border-radius: 8px;
  margin-top: 1rem; cursor: pointer; text-decoration: none;
  background: transparent; color: var(--accent); border: 1px solid var(--accent);
}
button.danger { background: var(--bad); }
button:disabled { opacity: .5; cursor: default; }
.msg { margin-top: 1rem; color: var(--bad); min-height: 1.2em; font-size: .95rem; }
.ok { color: var(--ok); }
.hint { color: var(--muted); font-size: .85rem; }
table { border-collapse: collapse; width: 100%; margin-top: .8rem; background: var(--card); }
td, th { border-bottom: 1px solid var(--line); padding: .55rem .6rem; text-align: left; }
th { color: var(--muted); font-weight: 500; font-size: .9rem; }
pre.report { white-space: pre-wrap; background: var(--card); border: 1px solid var(--line);
             border-radius: 10px; padding: 1.2rem; font: inherit; }
/* 报告正文（第 65 轮「丙-1」＋第 7 条，老师 2026-09-20）。
   客人那一页（web/report.html）的正文已经从 <pre> 换成 <article>，由
   web/js/report.js 按行渲成 h2／ul>li／p；`pre.report` 那一条**原封不动**，
   后台几页（web/admin-feedback.html）仍在用它摆原文。

   **正文外面那只白框去掉**（老师第 7 条原话逐字：「7、另外共性的地方，现在继续
   解决的是，是不是正文的部分就不要加气泡了？在手机上加气泡以后，显示的字会变少，
   需要不停的滑动手机，并且也增加了显示不全的现象。」；同日确认「七、你的理解是
   对的，按建议。」＝指的就是正文外面那只白底圆角框，且**先只去报告页这一只**）。
   原文（改前）这只框与 pre.report 逐字相同：
     `background: var(--card); border: 1px solid var(--line);
      border-radius: 10px; padding: 1.2rem;`
   现在照 2026-09-18 AI 答复那次的落法（见本表下方 `.bub.ai`，老师当时原话
   「另外，回复也不用描白了，正常显示就行。」）：无底色、无边框、无圆角，
   **左右内衬归零**，正文直接落在页面底色上，不新造任何样式。
   实得字宽（375 宽手机）：原先 main 左右各 16px ＋ 框边 1px×2 ＋ 框内 19.2px×2
   ＝ 共吃掉 72.4px、正文剩 302.6px；现在只剩 main 那 32px，正文得 343px，
   **多出 40.4px，约 13%**。上下留一点白，免得正文顶着上一行字。
   **全站 `.card` 一个字没动**——老师这一轮只点了正文那一只。 */
article.report { background: none; border: 0; border-radius: 0; padding: .2rem 0 .4rem; }
/* 小标题比正文大一档并加粗（老师要的就是「一眼看出这是标题」）；上下留白按
   「上大下小」，让它贴住自己下面那一段。首个标题不再多顶一截。 */
article.report h2 { font-size: 1.12em; font-weight: 700; line-height: 1.5;
                    margin: 1.4em 0 .5em; }
article.report h2:first-child { margin-top: 0; }
/* 三级小标题（第 66 轮小修二第 5 条，老师 2026-09-21 对「报告里 `###` 小标题与
   `**粗体**` 星号原样露着、建议单独排一笔小修」答「同意」）。**比 `##` 小一档**：
   1.12em → 1em（＝与正文同字号），靠加粗与上下留白分层；上下留白也各收一档
   （1.4em/.5em → 1em/.35em），免得三级标题看着比二级还占地方。
   原文（改前）这一条规则不存在，`### 某某` 整行当段落渲出去，井号原样露给客人。 */
article.report h3 { font-size: 1em; font-weight: 700; line-height: 1.5;
                    margin: 1em 0 .35em; }
article.report h3:first-child { margin-top: 0; }
article.report p { margin: .5em 0; }
/* 列表带圆点（原文在 <pre> 里是一个光秃秃的 `-`）。缩进只给一层，
   手机窄屏上不再往里吃字宽。 */
article.report ul { margin: .5em 0; padding-left: 1.25em; list-style: disc; }
article.report li { margin: .25em 0; }
/* 正文里的表格渲成一行一张小卡（第 65 轮第二批 D，老师 2026-09-20「按建议，
   加进第二批」）。**卡的外形一条都不新造**——边框、圆角、行间横线全来自上面
   「我的」那套 `.rows` / `.rows .row`（第一批「我的报告」用的也是它）；这里只
   给格子定字号与排法：表头那几个字当小标签、单元格当值，一格一行往下排。
   改前：`| 大运 | 年龄段 | … |` 与 `|---|---|` 整行当段落渲出去，竖线原样露着。 */
/* 紧凑版（第 65 轮第二批 E4，老师 2026-09-20「其他都按建议」认下的第四件；
   建议原文是主会话拟的话，不是老师原话：去白框、标签与内容同一行、两步大运之间
   一条细线）。改前（上一版卡片）：外壳照搬 `.rows` 的白底＋描边＋圆角，正文里
   横着多出一张白卡；一格里 `.rpt-k` / `.rpt-v` 都是 `display: block`，小标签在上、
   值在下，六列就占十二行。现在：外壳的底色、描边、圆角一并抹掉（`.rows .row`
   本来就有的那道行间横线留着——相邻两条记录之间恰好一条，最后一条之后没有），
   一格改成横排两段：小标签在前、值紧接其后，值长了在自己那一栏里折行、不缩回
   标签底下（`min-width: 0` 防撑破容器）。字号与灰度沿用改前那两条的值，
   一个颜色都不新造；对客的字一个没加。 */
article.report .rpt-rows { margin: .6em 0; background: none; border: 0; border-radius: 0; }
/* 一格一行往下排（.rows .row 本身是横排的 flex，这里就地改成块排）。左右那点
   内缩是白卡才需要的，去了白框就贴着正文左边走，上下也收紧一档。 */
article.report .rpt-rows .row { display: block; padding: .5rem 0; }
/* 一格＝「标签　内容」同一行：标签不压缩，值占满余下那一栏、在栏内自己折行。 */
article.report .rpt-cell { display: flex; align-items: baseline; gap: .4em; margin: .3em 0; }
article.report .rpt-cell:first-child { margin-top: 0; }
article.report .rpt-cell:last-child { margin-bottom: 0; }
/* 小标签：与 `.rows .row .sub` 同一档字号与灰度，不另调色。 */
article.report .rpt-k { flex: none; font-size: .75rem; line-height: 1.6; color: var(--muted); }
article.report .rpt-v { flex: 1 1 auto; min-width: 0; font-size: .9rem; line-height: 1.7;
                        color: var(--ink); }
article.report > :last-child { margin-bottom: 0; }
code { background: var(--code-bg); padding: .1em .35em; border-radius: 4px; }
section { margin-bottom: 1.6rem; }
blockquote { margin: .8rem 0; padding: .6rem 1rem; border-left: 3px solid var(--accent);
             background: var(--quote-bg); }
/* ── 出海线 E：品牌与漏斗页（首页/免费排盘/解锁预览） ───────────── */
/* 顶部横幅：预留 APP 入口。**2026-09-13 老师第 5 轮第 9 条「黑空条藏起来吧，
 * APP上线以后，用站内提醒就行」——本类默认不显示**（改前是 `display: flex`，
 * 首页上那条纯黑空条就是它，见方案稿 §5 第 2 条）。
 * 原拍板（2026-08-27 借鉴 fatetell 顶栏；同日追拍「展示、先留白」——index.html
 * 上空条露出占位）**已被 2026-09-13 第 5 轮第 9 条覆盖**，原字留在这里备查。
 * [hidden] 守卫仍须有——日后 APP 上线把 display 改回去时，哪页要临时藏条全靠它。 */
.app-strip { display: none; justify-content: center; align-items: center; gap: .6rem;
             background: var(--ink); color: var(--bg); font-size: .85rem;
             min-height: 2.1rem; padding: .3rem 1rem; }
.app-strip a { color: var(--bg); text-decoration: underline; }
.app-strip[hidden] { display: none; }
/* ── 顶栏里品牌字标那两条规则已删（第 66 轮第 2 条）──────────────────────────
 * **原文（改前）**是：
 *   nav a.brand { display: inline-flex; align-items: center; gap: .55rem;
 *                 font-weight: 600; font-size: 1.02rem; color: var(--accent);
 *                 letter-spacing: .22em; margin-right: .4rem; }
 *   .brand-mark { width: 21px; height: 21px; display: block; color: var(--accent); }
 * 老师 2026-09-20 晚原话逐字：「2、顶框上，闫国国学跟繁体中文都取消掉吧」——
 * 顶栏里再没有 `a.brand` 这个东西（画它的 `_brandLink()` 已从 web/js/api.js 删掉），
 * 这两条挂的选择器全站零命中。
 * 登录页那行品牌字走的是 `.auth-brand`、页脚走 `.foot-brand`，**都不是这两条**，
 * 老师这一句也没点到它们，一个字没动。 */
/* 窄屏（立项四批甲，老师 2026-09-12 拍「都按建议」）。改前 390 宽下这条导航折两行、
 * 高 105px，而它是 sticky 钉住的——那 105px 客户从头到尾都拿不回来。甲案不动结构、
 * 不藏链接、不上横向滚动，只把两行本身压矮。
 *
 * **第 66 轮第 2 条之后这一块只剩两条**：顶栏里现在只有题词一句小字，一行怎么也
 * 摆得下，折行那件事不存在了。
 * **原文（改前）**这一块里另有两条，随品牌字标与繁体键一并撤掉：
 *   nav a.brand { letter-spacing: .06em; font-size: .95rem; margin-right: .2rem; }
 *   .lang-switch { margin-top: 0; padding: .1rem .45rem; font-size: .75rem; }
 * 前者的选择器已零命中（同上）；后者是**为顶栏里那一枚**缩号用的——那一枚撤了，
 * 繁简键现在落在「我的账户」页与登录页的正文里，跟着正文那一档大小就好，
 * 再按顶栏的窄屏规矩缩成 12px 反而是往回走（G7 正要把对客小字提到 12px 以上）。
 * `nav` 自己那条窄屏内边距 `.45rem .8rem` 留着：左右 `.8rem` 与窄屏正文留白对齐。 */
@media (max-width: 480px) {
  body { font-size: 15px; }
  nav { gap: .35rem .9rem; padding: .34rem .8rem; font-size: .95rem; }
}
/* ── 老手机（320 宽）那条「题词掉第二行」的规则已删（第 66 轮第 2 条）──────────
 * **原文（改前）**是：
 *   @media (max-width: 360px) {
 *     nav .nav-motto {
 *       order: 3; flex-basis: 100%; margin-top: .3rem;
 *       padding-left: 0; border-left: 0;
 *       border-top: 1px dashed var(--line); padding-top: .28rem;
 *     }
 *   }
 * 它管的是「字标／题词／繁体三样在 320 宽摆不下时，掉下去的必须是题词」。
 * 现在顶栏里只剩题词一样，没有第二样可挤，整条前提不成立；留着反而会给这一句
 * 无端加一条虚线与一截上边距（`flex-basis: 100%` 让它独占一行），320 宽实拍可见。 */
/* 主视觉（2026-08-27 老师拍板文案：大字「国学之精髓——知命」＋小字＋
 * 点睛图＋「马上体验」单按钮；留白与衬线大标借鉴 fatetell，配色仍走
 * 本站暖色）。响应式（老师追拍「跟他一样」）：窄屏（竖）单列居中，
 * 图在文字下、按钮垫底方便拇指；宽屏（横）文字居左、图放右侧一栏。
 * 首页容器 main.home 放宽出双栏位，下方步骤区仍收回 680 不动。 */
main.home { max-width: 1160px; margin-top: 0; }
main.home .items { max-width: 920px; margin-left: auto; margin-right: auto; }
main.home > .hint { max-width: 680px; margin-left: auto; margin-right: auto; }
/* 首屏只留主视觉（2026-08-27 老师拍板）：hero 撑满首屏（视口高减去
 * 顶栏＋导航约 8rem），项目三卡滑动才见。布局对标 fatetell 的大留白
 * （老师批「拥挤」后二改）：容器放宽、间距放开。 */
/* 留白按方案稿 §4.2（老师第 6 轮第 1 条「游客首页布局可以宽松点」）：
 * 上边距 2.5rem、四块（大标题／标语／折叠机／按钮）之间 1.7rem、
 * 「马上体验」再往下推 0.7rem。这几个数只管窄屏这一档；宽屏（≥860px）
 * 那一档在下面的媒体查询里另有一套，本次一个字没动。 */
.hero { display: flex; flex-direction: column; justify-content: center;
        text-align: center; min-height: calc(100vh - 6.5rem); padding: 2.5rem 0 1.2rem; }
.hero-title { font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
              font-size: clamp(2rem, 6vw, 3.3rem); font-weight: 700; line-height: 1.25;
              letter-spacing: .05em; color: var(--ink); margin: 0 0 1.7rem; }
.hero .tagline { font-size: 1.08rem; color: var(--muted); line-height: 1.8;
                 max-width: 30em; margin: 0 auto 1.7rem; }
/* 主视觉设备壳。**2026-09-13 老师第 3 轮第 2 条：由笔记本电脑改成折叠机**
 * （原话「中间那个圆圈改成新上市的iPhone Duo打开的样子」），造型与尺寸照
 * docs/mockups/底部导航布局稿-v7.html 屏二的 .fold 一族移植；原先那套
 * `.laptop*`／`.screen-inner`／`.hero-chart`／`.phone*`（2026-08-27 拍板的
 * 笔记本电脑＋叠放手机）全仓再无引用，随本次一并删除。
 * 设备壳用固定深色（电子设备都是深壳），屏内容走主题变量。 */
/* 原先这一层是「设备组垫的一块浅色底板」（fatetell 式的展示画布：白底、描边、
 * 26px 圆角、2.6rem 内边距、一道落影）。**布局稿 v7 屏二上没有这块底板**——
 * 折叠机直接坐在页面底色上，自带落影。故底板那五条样式随本次删掉，只留这一层
 * 作定位与宽屏栏位（`grid-area: art` 在下面的媒体查询里）。
 * 顺带把首屏挤出去的那 60 多像素还给「马上体验」按钮。 */
.hero-art { position: relative; margin: 0 auto 1.7rem; width: fit-content; }
.fold { position: relative; width: 242px; height: 160px; border-radius: 15px;
        background: #23201c; padding: 7px;
        box-shadow: 0 8px 18px rgba(20,16,10,.18), 0 0 0 1px rgba(0,0,0,.06); }
.fold-inner { position: relative; width: 100%; height: 100%; border-radius: 9px;
              overflow: hidden; background: var(--card); display: flex; }
.fold-half { flex: 1; min-width: 0; }
.fold-seam { position: absolute; left: 50%; top: 0; bottom: 0; width: 3px;
             transform: translateX(-50%);
             background: linear-gradient(to right, rgba(0,0,0,.02), rgba(0,0,0,.10), rgba(0,0,0,.02)); }
.fold-cam { position: absolute; top: 8px; left: 50%; transform: translateX(-50%);
            width: 5px; height: 5px; border-radius: 50%; background: rgba(0,0,0,.28); z-index: 2; }
.fold-text { position: absolute; inset: 0; z-index: 3; display: flex; flex-direction: column;
             align-items: center; justify-content: center; gap: .55rem;
             text-align: center; padding: 0 .6rem; }
/* 屏上两行字（老师第 3 轮第 2 条）：第一行「性命＝心性决定命运」，「＝」与
 * 「心性决定命运」用全站橘红（第 5 轮第 5 条「用全站橘红」）；第二行
 * 「己所不欲　勿施于人」整句橘红。 */
.fb-l1 { font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
         display: flex; align-items: baseline; gap: .12em; }
.fb-l1 .big { font-size: 1.42rem; letter-spacing: .06em; color: var(--ink); }
.fb-l1 .eq { font-size: 1.14rem; padding: 0 .12em; color: var(--accent); }
.fb-l1 .tail { font-size: .95rem; letter-spacing: .03em; color: var(--accent); }
.fb-rule { width: 46px; height: 1px; background: var(--line); }
/* 第二行「己所不欲　勿施于人」＝**墨灰**（2026-09-13 老师第 21 轮第 2 条那句反问
 * 「在一行上的时候是什么颜色？」核实后订正）：原文（改前）这一行是
 * `color: var(--accent)`（橘红）——那是照方案稿 §4.2 定案表写的，而**那一格是误抄**；
 * 老师第 5 轮选 B 版时定的本来就是墨灰（B 版布局稿
 * docs/mockups/底部导航布局稿-v7.html:623 那行挂的是 `l-mut` ＝ `--s-muted` #7a7670），
 * **与顶栏题词同色**。本次是恢复原定色，不是新口径。
 * **第一行那个「＝」仍是橘红，一个字不动**（见上面 .fb-l1 .eq）。 */
.fb-l2 { font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
         font-size: .76rem; letter-spacing: .3em; color: var(--muted); }
.hero .cta { display: inline-block; margin: .7rem auto 0; text-decoration: none;
             background: var(--accent); color: var(--accent-ink); padding: .85rem 4.8rem;
             border-radius: 999px; font-size: 1.08rem; letter-spacing: .08em; }
             /* 2026-08-28 老师拍：「马上体验」做长一点（横向内距 2.4→4.8rem） */
.hero .cta.secondary { background: transparent; color: var(--accent); border: 1px solid var(--accent); }
@media (min-width: 860px) {
  .hero { display: grid; grid-template-columns: minmax(0, 1fr) auto;
          grid-template-areas: "title art" "tag art" "cta art";
          column-gap: clamp(3rem, 6vw, 5.5rem); align-content: center; align-items: center;
          text-align: left; padding: 2rem 0 3rem; }
  .hero-title { grid-area: title; align-self: end; font-size: clamp(2.4rem, 4vw, 3.6rem);
                margin-bottom: 1.4rem; }
  .hero .tagline { grid-area: tag; margin: 0 0 2.2rem; max-width: 24em; font-size: 1.12rem; }
  .hero .cta { grid-area: cta; justify-self: start; align-self: start; margin: 0; }
  .hero-art { grid-area: art; margin: 0; }
  /* 宽屏把折叠机放大一档（原先这两行放大的是 .laptop 与 .hero-chart）。 */
  .fold { width: clamp(300px, 30vw, 380px); height: clamp(198px, 20vw, 251px); }
  .fb-l1 .big { font-size: 1.62rem; }
  .fb-l1 .eq { font-size: 1.3rem; }
  .fb-l1 .tail { font-size: 1.08rem; }
  .fb-l2 { font-size: .84rem; }
}
/* 项目三卡（2026-08-27 老师定名三项＋每项配图；留白加大、不挤）。
 * 宽屏＝题字居左、配图居右；窄屏＝题字在上、配图在下。 */
/* 项目三段（2026-08-27 老师拍板「直接抄 fatetell 的页面排列」）：细线
 * 分隔的开放版式——上段题左图右，一道横细线，下面双栏并置（图上、
 * 红点题字在栏脚），栏间竖细线；不用卡片框，留白撑气口。 */
.items { border-top: 1px solid var(--line); border-bottom: 1px solid var(--line);
         margin-top: 3rem; font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
         color: var(--ink); }
.feature-lead { display: flex; flex-direction: column; align-items: center; gap: 2rem;
                padding: 3.5rem 1.5rem; border-bottom: 1px solid var(--line); }
.feature-grid { display: grid; }
.feature-cell { display: flex; flex-direction: column; align-items: center; gap: 2rem;
                padding: 3.5rem 1.5rem 2.5rem; }
.feature-cell + .feature-cell { border-top: 1px solid var(--line); }
/* 三段式标题（2026-08-27 老师拍板：知命/之/后词 以字号颜色分层，整体加大）：
 * 「知命」点缀色点题、「之」小字过渡、后词大字主角；红点引题抄 fatetell。 */
.item-title { display: inline-flex; align-items: baseline; letter-spacing: .1em; }
.item-title .t-dot { width: 9px; height: 9px; border-radius: 50%; background: var(--accent);
                     align-self: center; margin-right: .7em; flex-shrink: 0; }
.item-title .t-zhiming { font-size: 1.55rem; font-weight: 600; color: var(--accent); }
.item-title .t-zhi { font-size: 1.05rem; color: var(--muted); margin: 0 .5em;
                     align-self: center; }  /* 2026-08-28 老师拍：「之」上下居中作连接符 */
.item-title .t-topic { font-size: 2.1rem; font-weight: 700; letter-spacing: .12em;
                       text-align: center; line-height: 1.3; }
                       /* 2026-08-28 老师拍：窄处「天地人」折行时「人」居中于
                        * 天与地正下（三才落位），不再贴左。 */
/* 配图（老师提供素材）：眼见为实整图（人见天上阴阳方为眼见为实，
 * 太极与人缺一不可）；圆角＋柔和落影，无边框。 */
.item-art { display: block; border-radius: 14px; border: none;
            box-shadow: 0 22px 44px -26px rgba(43,42,40,.4); }
.art-lead { width: min(84vw, 520px); height: auto; }
.art-tall { width: min(74vw, 300px); height: auto; }
@media (min-width: 820px) {
  .feature-lead { flex-direction: row; justify-content: space-between;
                  gap: clamp(2.5rem, 6vw, 5rem); padding: 4.5rem 3rem; text-align: left; }
  .art-lead { width: clamp(380px, 44vw, 540px); flex-shrink: 0; }
  .feature-grid { grid-template-columns: 1fr 1fr; }
  .feature-cell { padding: 4rem 2.5rem 3rem; justify-content: space-between; }
  .feature-cell + .feature-cell { border-top: none; border-left: 1px solid var(--line); }
  .feature-cell .item-title { align-self: flex-start; }
  .art-tall { width: min(30vw, 320px); }
}
.steps { display: grid; gap: .8rem; margin-top: 1.2rem; }
.steps .card { margin-bottom: 0; }
.steps .card b { color: var(--accent); }
.chips { display: flex; flex-wrap: wrap; gap: .5rem; margin: .3rem 0 .2rem; }
.chip { background: transparent; color: var(--ink); border: 1px solid var(--line);
        border-radius: 999px; padding: .35rem .9rem; margin-top: 0; font-size: .95rem; }
.chip.active { background: var(--accent); color: var(--accent-ink); border-color: var(--accent); }
/* 排盘页那一条档案小卡片（第 65 轮第二批返修一 P1-1）。**卡片本身一条样式都不新造**
   ——仍是上面那枚 `.chip`／`.chip.active`；这里只管「这一条怎么排」。
   为什么不用 `.chips`：那一条是 `flex-wrap: wrap`，档案一多就换行，验收实测 10 张
   档案占 414px、把表单和「开始排盘」整个挤到折下。
   `.pp-pick-label` 是原先那枚 `<label>` 的替身（它没有 `for`、不包控件，是孤儿标签），
   把 `label` 那条块级样式就地照抄一份，**看到的字与间距一个像素没变**。 */
.pp-pick-label { display: block; margin: .8rem 0 .3rem; color: var(--muted); font-size: .92rem; }
.pp-pick { display: flex; align-items: center; gap: .5rem; margin: .3rem 0 .2rem; }
/* 档案那一条：**不换行**，溢出就横着滑；滚动条藏起来（手机上本来就不显示，
   桌面上露一条灰杠会把这一排撑高、又与站上别处不一致）。 */
.pp-pick .pf-cards { flex: 1 1 auto; min-width: 0; display: flex; flex-wrap: nowrap;
                     gap: .5rem; overflow-x: auto; overflow-y: hidden;
                     scrollbar-width: none; -webkit-overflow-scrolling: touch; }
.pp-pick .pf-cards::-webkit-scrollbar { width: 0; height: 0; }
.pp-pick .pf-cards > .chip { flex: 0 0 auto; white-space: nowrap; }
/* 「填新的」在滑动条**之外**：它是「不用任何档案、从头填」的出口，不能被滑到末尾藏起来。 */
.pp-pick .pf-fresh { flex: 0 0 auto; }
.pp-pick .pf-fresh > .chip { white-space: nowrap; }
/* 右边那道渐隐＝「后面还有，能滑」。**只在真滑得动时挂**（paipan.js 按
   scrollWidth／clientWidth／scrollLeft 现算，滑到底就撤），不滑得动时一点不淡，
   免得把最后一张卡无缘无故画糊。 */
.pp-pick.has-more .pf-cards {
  -webkit-mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
  mask-image: linear-gradient(to right, #000 calc(100% - 28px), transparent);
}
/* 反馈管理页裁决表单：喜与忌不许是同一个五行（老师 2026-09-11 答「1 挡」），
   那边勾了这边就 disabled。浏览器只把方框本身变淡、旁边的字照旧全黑，看着不像
   点不动；这一条把整个 <label> 一起调淡。`:has()` 老浏览器不认——不认就只是少一层
   视觉提示，方框仍旧点不动，功能不受影响（真闸门在服务端）。 */
#rl_xi label:has(input:disabled),
#rl_ji label:has(input:disabled) { opacity: .45; cursor: not-allowed; }
.paipan-table { overflow-x: auto; }
.paipan-table table { margin-top: .4rem; }
.rel-group { margin: .5rem 0; }
.rel-group .rel-title { color: var(--muted); font-size: .9rem; }
.locked { position: relative; border: 1px solid var(--line); border-radius: 10px;
          background: var(--card); padding: 1.2rem; overflow: hidden; }
.locked .line { height: .8em; border-radius: 4px; background: var(--skeleton); margin: .7em 0; }
.locked .line.w60 { width: 60%; }
.locked .line.w85 { width: 85%; }
.locked .veil { position: absolute; inset: 0; display: flex; align-items: center;
                justify-content: center; background: linear-gradient(180deg,
                var(--veil-from), var(--veil-to)); color: var(--muted); }
.price-line { font-size: 1.05rem; margin: .8rem 0 0; }
.price-line b { color: var(--accent); font-size: 1.25rem; }

/* 报告追问（F-c）。.notice＝老师明拍的「醒目常驻提醒」：正文色加粗、
 * 描边加底色、不折叠——刻意不用 .hint 的弱化灰。 */
/* 底色这一格与 --promo-bg 是同一个值，2026-09-21 随 --accent 一并换成新橙的
 * 半透明档（原文（改前）：`background: rgba(217, 119, 87, .08);`）。 */
.notice { border: 2px solid var(--accent); background: rgba(179, 75, 40, .08);
          color: var(--ink); font-weight: 600; padding: .6rem .8rem;
          border-radius: 6px; margin: .8rem 0 .4rem; }

/* 反馈页微信那一行（老师 2026-09-12：「占的空间又太大，第一眼看不到下面输入框，能把它再窄一点吗？」）：
 * 一行排开、按钮不换行不占上边距，盒子内距减半，让输入框进首屏。 */
#fbk_wechat { display: flex; flex-wrap: wrap; align-items: center; gap: .3rem .5rem;
              padding: .35rem .6rem; margin: .3rem 0 .2rem; font-size: .95rem; line-height: 1.4; }
#fbk_wechat button { margin: 0; padding: .2rem .7rem; font-size: .85rem; width: auto; }
#fbk_wechat_msg:empty { display: none; }
.qa { border-left: 3px solid var(--accent); padding: .2rem .8rem; margin: .8rem 0; }
.qa p { margin: .3rem 0; white-space: pre-wrap; }
#fu_q { width: 100%; box-sizing: border-box; margin-top: .4rem; }

/* ── 登录页（版式优化批，2026-08-26）────────────────────────── */
main.auth { max-width: 420px; }
.auth-brand { text-align: center; margin: 1.2rem 0 .2rem; }
.auth-brand a { color: var(--accent); font-weight: 700; font-size: 1.4rem;
                text-decoration: none; letter-spacing: .02em; }
.auth h1 { text-align: center; font-size: 1.15rem; color: var(--muted);
           font-weight: 500; margin-bottom: 1.2rem; }
.send-row { display: flex; gap: .6rem; align-items: flex-end; }
.send-row > div { flex: 1; }
.send-row button { margin-top: 0; white-space: nowrap; }
/* 通栏主按钮：验证码那枚「登录」与一键登录主按钮共用这一条（老师 2026-09-12
 * 拍「应该把本机号码一键登录作为主要按钮出现」）。原先只按 id 写死
 * `.auth #login { width: 100%; }`，第二枚按钮照抄一份样式两边就会分叉，
 * 故抽成可复用的 class，两枚按钮都挂 class="btn-wide"。 */
.auth .btn-wide { width: 100%; }
/* 「其他号码登录」：老师发的参考截屏里这是底下一条文字链接、不是第二枚按钮，
 * 所以不给按钮那身行头（不挂 .secondary），只居中排一行小字。 */
.auth .onetap-other { display: block; text-align: center; margin-top: 1.1rem;
                      font-size: .92rem; }
.auth .hint { text-align: center; }

/* 课程目录两栏（60 讲长列表不再一柱到底） */
#c_list { columns: 2; column-gap: 2rem; padding-left: 1.4rem; }
#c_list li { break-inside: avoid; margin-bottom: .25rem; }
@media (max-width: 560px) { #c_list { columns: 1; } }

/* 活动句轻强调（措辞不动，只给底色） */
.promo { background: var(--promo-bg); border-radius: 6px; padding: .5rem .8rem;
         font-size: .9rem; color: var(--ink); }

/* 表格空态：跨列居中弱化 */
td.empty { color: var(--muted); text-align: center; padding: 1.4rem .6rem; }

/* 全站页脚（上线前置） */
/* 字号 2026-09-18 老师追加「同时变小」：原文（改前）`font-size: .82rem`，
 * 现缩到 `.72rem`——站上现成的小字档（顶栏题词 `.nav-motto` 用的就是这一档），
 * 不另起一个新尺寸。 */
.site-footer { max-width: 680px; margin: 2.5rem auto 1.5rem; padding: 1rem;
  border-top: 1px solid var(--line); display: flex; flex-wrap: wrap; gap: .3rem 1rem;
  justify-content: center; align-items: center; color: var(--muted); font-size: .75rem; }
.site-footer .foot-brand { color: var(--accent); font-weight: 600; }
.site-footer .foot-beian { color: var(--muted); text-decoration: none; }
.site-footer .foot-beian:hover { text-decoration: underline; }
/* 「内容由人工智能生成，仅供个人参考」再淡一档（老师 2026-09-18 返修六第 3 条
 * 「这个颜色变浅，做成跟正文有区分…其他所有的页面，这一句话都变浅」）。
 * 这一行本来就继承页脚的 `--muted`（对底色 3.87，正文 `--ink` 是 12.3，本已比正文
 * 淡很多）；再淡只能靠透明度——站上没有比 `--muted` 更浅的**文字**变量，按吩咐
 * 「别新起色值」，故用 `opacity`。取 .85：折算下来对底色 3.02；再低肉眼就吃力了
 * （.72 只有 2.49）。这几个数是实算的，见交卷汇报。
 * **如实记一笔**（2026-09-18 外审第 24 条）：这一行是 `.72rem`≈11.5px 的正文类小字，
 * 无障碍门槛是 4.5:1（3:1 那一档是 ≥18pt、或 14pt 加粗的大字），3.02 **够不上**，
 * 改前的 3.87 同样够不上。原文（改前）这里写的是「还在 3:1 以上」，拿错门槛给自己
 * 背书，按本仓「不虚构事实」的规矩改掉。老师这一轮明确要的就是「变浅、跟正文有
 * 区分」，字色与透明度按老师定的走；真要补到 4.5:1 得另换色值，属新口径，须老师拍。 */
.site-footer .foot-note { opacity: .85; }
/* 意见反馈链接是字，不是按钮：按 8-28 拍板丙的分工（本文件 7-9 行）取
 * --accent-text 这一档，不用大块点缀的 --accent。
 * 2026-09-18 老师要这一行整体变浅：**字色这一格没动**（仍 `--accent-text`，当时对
 * 底色 4.17；2026-09-21 老师拍「调深」之后这同一格实算 **5.53**，见本文件开头那段）
 * ——它是 2026-09-11 老师拍「描红」定下来的，且有守门钉着
 * （tests/test_web_feedback_static.py::test_footer_feedback_link_uses_the_accent_text_color
 * 明文不许拖回 `--muted`）。改「浅」用的是**去掉加粗＋加下划线**：原文（改前）是
 * `font-weight: 600; text-decoration: none;`，加粗一去观感就轻了一档，下划线补回
 * 「看得出可点」。两条老师口径相撞这件事已单列报主会话。 */
.site-footer .foot-feedback { color: var(--accent-text); font-weight: 400;
  text-decoration: underline; text-underline-offset: 2px; }
/* 「我的」那一页「每日提醒设置」锚到账户页 `#notify_card`（账户页那块内容一个字
 * 没动，连 id 都是它本来就有的）。顶栏是 sticky 的，会压住被锚到的那块的头，
 * 故给锚点预留一截——做法与下面那条已删的 `#feedback` 规则同一个道理。 */
#notify_card { scroll-margin-top: 5rem; }
/* 原先这儿有一条 `#feedback { scroll-margin-top: 7rem; }`：页脚那条「意见反馈」
 * 跳的是账户页 #feedback 卡片的锚点，导航吸顶会压住卡片的头，故给锚点预留一截。
 * 2026-09-12 意见反馈整张卡片搬去 web/feedback.html 单独一页（老师拍板原话见
 * 那一页顶部注释），页脚链接不再跳锚点、也就不必再预留，规则随之删掉。 */

/* ── 免费排盘页第二页式改版（2026-08-29 老师拍板照 fatetell 第二页格式：
 * 上引导文案、下直填表单；年月日时一行、出生地官方时间提醒、性别单行）。 */
.pp-title { font-size: clamp(1.5rem, 4.2vw, 2rem); line-height: 1.85; font-weight: 600;
            margin: 1.4rem 0 1.2rem; letter-spacing: .02em; text-wrap: balance; }
            /* 行高 1.55→1.85：2026-08-30 老师拍「这两行的行间距加大一点」 */
/* 第二行「知命，从您来到世间的那一刻说起。」用点缀色（2026-08-30 老师拍
 * 「把这一行字改成橘红色」）；取深一档 --accent-text，同 8-28 拍板丙「字用
 * --accent-text、按钮等大块用 --accent」的分工。 */
.pp-title-accent { color: var(--accent-text); }
.pp-intro p { margin: .9rem 0; }
.pp-form { margin-top: 1.8rem; max-width: 520px; }
/* 历法＋性别并一行（2026-08-30 老师追拍）。 */
.pair-row { display: grid; grid-template-columns: 1fr 1fr; gap: .6rem; }
/* ── 排盘结果页知易式大表与条带（2026-08-30 老师拍板；五行着色）── */
.zy-birth { font-weight: 600; margin: .6rem 0 0; }
.zy-table td, .zy-table th { text-align: center; padding: .45rem .3rem; }
.zy-table td:first-child, .zy-table th:first-child { color: var(--muted);
  font-size: .85rem; white-space: nowrap; }
.zy-gz { font-size: 1.5rem; font-weight: 700; line-height: 1.25; }
.zy-hidden { font-size: .78rem; line-height: 1.55; white-space: nowrap; }
.el-wood { color: #2f7a3e; } .el-fire { color: #b3261e; } .el-earth { color: #8a6136; }
.el-metal { color: #a17a00; } .el-water { color: #2b6cb0; }
.zy-strip table { font-size: .82rem; }
.zy-strip td { text-align: center; white-space: nowrap; padding: .4rem .5rem;
  vertical-align: top; }
/* 选中/当前标记＝年份变橘红，不上整块底色（2026-08-30 老师拍「中间
 * 不要截断，它是一个整体」——原 promo-bg 底色把条带劈成三段的观感）。 */
.zy-strip .cur { background: transparent; }
.zy-strip .cur .zy-strip-year { color: var(--accent-text); }
.zy-strip td.zy-click { cursor: pointer; }
/* 运岁区一体化面板（2026-08-30 老师再拍「视觉上还是割裂的」——交运/
 * 大运/流年/流月四段并进一块连续底板：统一卡底、条带间细线分隔、
 * 条带小标转弱化行内标签、撤各条带自带的表底与格线）。 */
.zy-luck { border: 1px solid var(--line); border-radius: 14px; background: var(--card);
           padding: .2rem 1.1rem .6rem; margin: 1.2rem 0; }
/* 2026-08-30 追拍「中间那个缝隙也不要留了」：主表并入面板（六神行到
 * 流月一块到底），主表行线保留、条带内格线仍撤。 */
.zy-luck .zy-table table { margin-top: .3rem; }
.zy-luck .zy-jiaoyun { margin: 0; padding: .8rem 0 .65rem; }
.zy-luck .zy-strip { border-top: 1px solid var(--line); margin: 0; padding-bottom: .35rem; }
.zy-luck .zy-strip h2 { font-size: .92rem; color: var(--muted); font-weight: 500;
                        margin: .75rem 0 0; }
.zy-luck .paipan-table table { background: transparent; }
.zy-luck .zy-strip td { border-bottom: none; }
/* 解锁按钮（2026-08-30 老师拍：句子直接当按钮字、外框撤）——居中长圆钮 */
.zy-unlock { text-align: center; margin: 1.6rem 0 1rem; }
.zy-unlock button { padding: .7rem 3.2rem .75rem; border-radius: 999px;
                    letter-spacing: .08em; }
/* 双行按钮（8-30 追拍「解锁深入解读还是要留着」；同日再拍开始排盘按钮
 * 同构上句）：上句下功能词 */
/* 上句加粗＋换宋体系更显眼（2026-08-30 老师追拍；字体与首页大字同款） */
.zy-unlock-l1 { display: block; font-size: .98rem; font-weight: 700; opacity: 1;
                font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
                letter-spacing: .14em; }
/* 8-30 再拍：两行间距加大、下行字缩小（上句为主、功能词为辅） */
.zy-unlock-l2 { display: block; font-size: .92rem; font-weight: 600; margin-top: .5rem; }
/* 报告生成中的动画提示（2026-08-30 老师拍板：「天垂象示，須臾即至。」
 * 挪入生成过程，呼吸式明暗）。 */
.zy-waiting { color: var(--accent-text); font-size: 1.15rem; letter-spacing: .12em;
              animation: zy-breathe 2.6s ease-in-out infinite; }
@keyframes zy-breathe { 0%, 100% { opacity: .45; } 50% { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .zy-waiting { animation: none; } }
.zy-strip-year { font-weight: 600; }
.zy-gz-line { line-height: 1.5; }
.zy-gz-s { font-weight: 700; }
.zy-ls { font-size: .78rem; color: var(--muted); margin-left: .15em; }
.el-bar { display: flex; gap: .5rem; flex-wrap: wrap; margin: 1.2rem 0; }
.el-bar span { padding: .25rem .7rem; border-radius: 6px; border: 1px solid var(--line);
  background: var(--card); font-weight: 600; }
/* ── 权益页（2026-08-30 老师拍板照 fatetell 第一张：四项权益不见价，
 * 点继续再逐步见价；同日追拍＝大字换「天垂象示，須臾即至」上橘红、
 * 行前加图案、空间比例照它放开）。 */
.uk-title { font-size: clamp(1.5rem, 4.4vw, 2.1rem); line-height: 1.6; font-weight: 600;
            text-align: center; margin: 2.6rem 0 2.2rem; letter-spacing: .06em;
            text-wrap: balance; }
.uk-title-accent { color: var(--accent-text); }
.uk-rows { border: 1px solid var(--line); border-radius: 18px; background: var(--card);
           padding: .6rem 1.5rem; }
.uk-row { display: flex; align-items: center; gap: 1.1rem; padding: 1.35rem 0; }
.uk-row + .uk-row { border-top: 1px solid var(--line); }
/* 栏目即入口（2026-08-30 追拍「点哪个哪个进」）：链接行不走正文链接色，
 * 右缀箭头；全天候问为就地展开行。 */
.uk-rows a.uk-row { color: var(--ink); text-decoration: none; }
.uk-row-btn { cursor: pointer; }
.uk-chev { margin-left: auto; color: var(--muted); font-size: 1.3rem; line-height: 1; }
.uk-ask-links { margin: .4rem 0 0; font-size: .9rem; }
.uk-mark { flex: 0 0 auto; width: 44px; height: 44px; color: var(--accent); }
.uk-mark svg { display: block; width: 100%; height: 100%; }
.uk-row-title { font-size: 1.14rem; font-weight: 600; }
.uk-row .hint { margin: .3rem 0 0; }
.uk-cta-wrap { text-align: center; margin: 2.4rem 0 1rem; }
.uk-cta { display: inline-block; text-decoration: none; background: var(--accent);
          color: var(--accent-ink); padding: .85rem 4.8rem; border-radius: 999px;
          font-size: 1.08rem; letter-spacing: .08em; }
.uk-terms { text-align: center; }
/* 价格页服务全列（2026-08-30 老师拍板）。 */
.svc-lead { margin: .2rem 0 .5rem; }
.svc-list { border: 1px solid var(--line); border-radius: 12px; overflow: hidden; }
.svc-row { display: flex; align-items: baseline; gap: .6rem; padding: .85rem 1rem;
           cursor: pointer; background: var(--card); }
/* 跳到某一个报告项目时，给吸顶的顶栏让出一截（验收 c47 的 P2-1）。
 * 病根：顶栏 `position: sticky; top: 0`，而浏览器跳 `#svc_…` 锚点是把目标顶到视口
 * 最上沿、不避它——验收实测搜「事业」点进「事业财运」，那四个字高 24.75px、
 * **被盖掉 16.1px，只剩 8.6px 露着**。
 * 三条路都吃这一条：客人在首页再搜（同页锚点）、从别页带 `#` 进来、自己贴网址进来。
 * 取值＝**顶栏现在的真高**（`--nav-h` 由 web/js/api.js 的 `_publishNavHeight()`
 * 在画完顶栏那一刻现量写进来）＋ .75rem 余量，这样顶栏日后改高改矮都跟着走，
 * 不是一个会悄悄过期的死数。兜底 `3rem`(48px) 只在 JS 还没跑到那一瞬用，
 * 比现在的 30.88px 宽裕。做法与上面 `#notify_card` 那条同一个道理。 */
.svc-list .svc-row { scroll-margin-top: calc(var(--nav-h, 3rem) + .75rem); }
.svc-row + .svc-row { border-top: 1px solid var(--line); }
.svc-row.active { background: var(--promo-bg); }
.svc-row.active .svc-name { color: var(--accent-text); font-weight: 600; }
.svc-name { flex: 1 1 auto; }
.svc-price { font-weight: 600; }
.svc-sub { flex-basis: 100%; margin: 0; }
.svc-row { flex-wrap: wrap; }
/* 用券页把券清单收成一行之后（第 66 轮小修三第 2 条）：没展开时那几行券要**真的
   不占地方**。`.svc-row` 自己写着 `display: flex`，它盖过浏览器给 `[hidden]` 的
   `display: none`——只写 `hidden` 那几行照样露着。
   **紧跟在 `.svc-row + .svc-row` 后面**，不然那条描边的优先级比这条高、又会把
   藏起来的行画出一道线。 */
.svc-list .svc-row[hidden] { display: none; }
/* 那枚 `›`（站上现成的记号，与权益页每一行、「我的报告」卡片同一个字符、同一个
   类名）。`.rows .row .chev` 那条只管 `.rows` 那一族，这里补一条同样的着色与字号，
   **一个新颜色、新尺寸都没造**。`margin-left` 不用 `auto`：`.svc-name` 本来就
   `flex: 1 1 auto` 把多余的宽吃光了，`›` 自然贴在最右。 */
.svc-row > .chev { color: var(--muted); font-size: .9rem; }
/* 购买页行内价签（2026-08-30 老师拍板点价即买）。 */
/* 间距 2026-09-21 第 66 轮通病 G2 由 .4rem（6.4px）加到 .5rem（8px）：相邻两枚价签
   之间不小于 8px，免得手指点错一枚。 */
.svc-buy { display: flex; gap: .5rem; flex-wrap: wrap; }
/* 2026-08-31 老师拍板：每项价格下面提醒随报告赠 2 次免费追问；
   同日追拍位置——价签居右侧中间、追问小字沉到行底（只调下单页列表，
   使用页券行仍走上面的通用横排） */
.svc-fu { margin: 0; text-align: right; font-size: .78rem; }
/* 行内小字里再另起一行的解释句（2026-09-09 老师批注甲-12：本命总评已解锁时
   在那一行下面加一句解释）。挂在既有 .svc-sub 里面，不占网格新行，故
   #svc_list 的行布局一字未动。`:not([hidden])` 是必需的——只写
   `display: block` 会盖掉 hidden 属性自带的 display: none，藏不住。 */
.svc-note:not([hidden]) { display: block; }
#svc_list .svc-row { display: grid; grid-template-columns: 1fr auto;
  align-items: center; column-gap: .6rem; row-gap: .3rem; }
#svc_list .svc-name { grid-row: 1; grid-column: 1; }
#svc_list .svc-buy { grid-row: 1 / 3; grid-column: 2; }
#svc_list .svc-sub { grid-row: 2; grid-column: 1; }
#svc_list .svc-fu { grid-row: 3; grid-column: 1 / 3; }
/* 窄屏（手机）改上下堆叠：两枚价签在窄栏里会把左侧说明挤成一字一行
   （2026-08-31 手机尺寸实测所见），故 560px 以下单列排——名称、价签、
   说明、追问小字各占一行，价签左对齐跟在名称下方。 */
@media (max-width: 560px) {
  #svc_list .svc-row { grid-template-columns: 1fr; }
  /* 行内四件顺序显式钉住（.svc-fu 在 HTML 里排在 .svc-sub 之前，靠自动
     排列会把追问小字插到说明上面，与宽屏读序不一致）。 */
  #svc_list .svc-name { grid-row: 1; grid-column: 1; }
  #svc_list .svc-buy { grid-row: 2; grid-column: 1; }
  #svc_list .svc-sub { grid-row: 3; grid-column: 1; }
  #svc_list .svc-fu { grid-row: 4; grid-column: 1; text-align: left; }
}
/* 账户页「申请退款」那一栏里的可退项目（2026-09-10 老师批注：「申请退款是单起
   一栏，点申请退款，再出现不同项目可以申请的退款。」）。
   **刻意不复用上面 .svc-list／.svc-row 那只描边方框**：上一版这几条与订单行长得
   一模一样、又紧贴在订单区块底部，老师看走查截图时读成了「项目下面还在显示申请
   退款」。这里改成一条条浅底小卡（有间隙、无外框、字号压一档），一眼看得出是
   另一栏的东西，不是订单行。 */
.refund-list { display: flex; flex-direction: column; gap: .5rem; }
.refund-row { display: flex; flex-wrap: wrap; align-items: baseline; gap: .6rem;
              background: var(--promo-bg); border-radius: 10px;
              padding: .7rem .9rem; font-size: .94rem; }
.rf-name { flex: 1 1 auto; }
.rf-price { font-weight: 600; }
.rf-sub { flex-basis: 100%; margin: 0; color: var(--muted); font-size: .85rem; }
/* 拉到眼前的闪烁提示（未勾同意 / 未解锁本命总评时点价签） */
.flash-attn { animation: flashAttn 1s ease-in-out 2; border-radius: 8px; }
@keyframes flashAttn {
  0%, 100% { background: transparent; box-shadow: none; }
  40% { background: var(--promo-bg); box-shadow: 0 0 0 2px var(--accent); }
}
.chip-buy { margin-top: 0; padding: .28rem .7rem; font-size: .85rem; border-radius: 999px;
            background: transparent; color: var(--accent-text); border: 1px solid var(--accent);
            cursor: pointer; }
/* 活动期价签：现价在前、原价划线在后（2026-08-31 老师拍板「改」——
   客户一眼见实付，且合条款第八节「确切金额与常态原价」并排展示）。 */
/* 全站提示浮层（2026-08-31 老师拍板：提醒不许再留在页底看不见）：自动收、
   点一下也收；窄屏左右留边自动折行。
   沿革（都留档）：原先贴顶（top: 4.6rem）→ 2026-09-12 老师拍「浮层挪正中」改成
   垂直水平都居中 → **2026-09-21 第 66 轮通病 G6 改回贴顶**。G6 的依据是走查条目 E6：
   这条提示停在屏幕正中**挡住正文整整 5 秒**，而「点一下就能提前收起」页面上没有任何
   记号告诉客人。老师看了共性通病清单（含 G6「挪到顶部或底部做成一条短提示，缩短到
   2–3 秒」）之后答**「都按建议」**。
   ⚠️ 这一条**推翻的是老师自己 2026-09-12 那句「浮层挪正中」**，已在交卷汇报里单列
   请老师过目——两句话是同一位老师在不同时间说的，不是我自作主张挪回来的。
   落点不写死：`--topnav-h` 由 api.js 的 syncTopNavHeight 现量顶栏真高度写进 <html>
   （顶栏在 320／360 宽会折成两行、由 40px 变 75px，写死一个数必压住它）；
   量不到时吃兜底 4.4rem＝70.4px。再加半档空隙，让浮层与顶栏之间看得出是两层。

   2026-09-21 老师再拍（第 66 轮小修二第 3 条，原话逐字：「往下挪半档。」）：
   **原文（改前）**是 `top: calc(var(--topnav-h, 4.4rem) + .5rem)`，
   **现版（改后）**是 `top: calc(var(--topnav-h, 4.4rem) + 5.6rem)`。
   改前那 .5rem＝8px，浮层落在顶栏底下 8px 处，**整条压住首页那条签到条**
   （375×812 实测：签到条 64.5–127.1，浮层 48.5–116.4，压掉 51.9px；320／360 同形）。
   新的空隙 5.6rem＝89.6px 是**量出来的**，不是拍脑袋：首页 `<main>` 顶上那段留白
   实测 24px ＋ 签到条实高 62.6px ＝ 86.6px，取 5.6rem 留 3px 余量。签到条一旦改高，
   守门 tests/test_web_common_fixes_browser.py 那条会当场报红（它量的是两样东西的
   真坐标，不是钉死一个数）。 */
.toast { position: fixed; top: calc(var(--topnav-h, 4.4rem) + 5.6rem); left: 50%;
         transform: translateX(-50%);
         z-index: 120; max-width: min(92vw, 30rem); padding: .7rem 1rem;
         border-radius: 10px; background: var(--bad); color: #fff; font-size: .95rem;
         line-height: 1.5; box-shadow: 0 12px 30px -12px rgba(0,0,0,.45); cursor: pointer; }
.toast-ok { background: var(--ok); }
.toast[hidden] { display: none; }
/* 购买前确认弹窗（2026-08-31 老师拍板：未勾同意时就地弹起、勾完直接续买，
   不再把人甩到页底自己滚回来找项目）。定位 fixed 覆盖全屏，卡片限宽居中，
   窄屏留边距；页面滚动位置一步不动。 */
.modal { position: fixed; inset: 0; z-index: 100; display: flex; align-items: center;
         justify-content: center; padding: 1.2rem; background: rgba(43,42,40,.45); }
.modal[hidden] { display: none; }
.modal-card { background: var(--card); border: 1px solid var(--line); border-radius: 12px;
              padding: 1.3rem 1.2rem 1.1rem; max-width: 420px; width: 100%;
              box-shadow: 0 18px 44px -18px rgba(0,0,0,.35); }
.modal-card h2 { margin: 0 0 .2rem; font-size: 1.08rem; }
/* 用券页页底那一行「申请退款」（第 66 轮小修三返修一）。
   **原文（改前）用的是 `.chip`**——一枚带描边的药丸按钮，摆在「生成报告」底下比
   老师要的「后面再跟上申请退款」显眼得多；老师 2026-09-10 明说过「不要到处显示申请
   退款，好像提醒用户申请退款似的」。现在改成**一行普通灰色小字**：字号与颜色同站上
   次要说明文字（`.hint` 那一档，`.85rem` ＋ `--muted`），无边框、无底色、左对齐。
   **点击区照旧不小于 44px 高**（上下内边距撑出来，字本身一个像素没变大）。
   展开之后那份可退单清单（`.refund-list`）样式一个字没动。 */
.link-quiet { display: inline-block; background: transparent; border: 0; border-radius: 0;
              margin: 0; padding: .72rem 0; min-height: 44px; color: var(--muted);
              font-size: .85rem; line-height: 1.6; text-align: left; font-family: inherit; }
.link-quiet:hover { color: var(--ink); }
/* 收银台那枚浮层右上角的关闭叉（第 66 轮小修三第 1 条，老师认的排法里写明
   「右上角 × 关闭（不写字）」）。**只此一枚**，贴在卡片右上角，故卡片要
   `position: relative`。点击区 44×44（第 66 轮通病 G2 那条口径），字不写、
   读屏那边靠 `aria-label`（由 web/js/pay.js 按当下语种填「关闭」这条现成词条）。
   `margin-top` 要显式归零：站上 `button` 那条通则给了 1rem，绝对定位下会把它推下来。 */
.modal-card { position: relative; }
.modal-x { position: absolute; top: 0; right: 0; width: 44px; height: 44px; min-height: 44px;
           padding: 0; margin: 0; border: 0; border-radius: 8px; background: transparent;
           color: var(--muted); font-size: 1.3rem; line-height: 1; }
.modal-x:hover { color: var(--ink); }
/* 开框那一下不要在叉上画焦点圈（第 66 轮第 3 条，主会话看第一段实拍后点名）。
 *
 * ⚠️ **照实记一笔，别把这条读成「修好了一个线上毛病」**：主会话是看第一段那张
 * 实拍图 06 点名的（叉外面套着一圈橙框）。本轮回头用**真鼠标**在真 Chrome 上复量，
 * **改前就没有那圈**——量到 `outlineWidth: 3px` 但 `outlineStyle: none`，
 * 一个像素都不画。图上那圈是**出图那套家什自己招来的**：出图脚本当时用 `el.click()`
 * （合成事件）点的「签到」，Chrome 对合成事件走「当键盘算」那一路，`:focus-visible`
 * 被逼成真，于是下面第 193 行那条 `button:focus-visible` 把橙框画了出来。
 *
 * 这条规则因此是**一道保险，不是在修现有毛病**：`:focus:not(:focus-visible)`
 * ＝「聚上了，但浏览器判定这一下不该给人看圈」（鼠标点、手指戳属于这一档；
 * 键盘 Tab 过来不属于），这一档把圈关掉。Chrome 眼下本来就不画，别的内核／将来
 * 版本对「程序聚焦」画不画不保证（Safari 历来就画），写上它两边都稳。
 * 键盘客人按 Tab 走到叉上时 `:focus-visible` 为真，第 193 行那条照旧给圈，**一点没减**。
 *
 * **只管 `.modal-x` 这一类**（浮层右上角那枚叉，签到浮层与收银台浮层共用它）。
 * 全站别的按钮一个都不碰：那是「所有按钮鼠标点完要不要留圈」的通盘口径，
 * 老师没点到，不顺手改。
 *
 * ⚠️ **这一条没有守门，靠真机目视**（验收 c47 的 P3-6，实跑复核过）：把这一行整条
 * 删掉，`tests/test_web_checkin_modal_browser.py` **照样 7 passed**。原因是无头
 * Chrome 本来就不给程序聚焦画圈（上面量到的 `outlineStyle: none` 就是它），
 * 差别在无头环境里压根渲不出来，**造不出会报红的样本**。
 * 按仓规「测试必须挑会出错的样本」——挑不出来就**不硬造一条假守门**（拿正则去
 * 源码里找这一行属于抠源码式假绿，本仓明令禁止）。故这一条如实记在这里：
 * 它日后被谁删掉不会有人报红，**要在真机上用鼠标点开浮层目视那枚叉有没有橙圈**。 */
.modal-x:focus:not(:focus-visible) { outline: none; }
/* 浮层底下那一排去处按钮（第 66 轮第 3 条，主会话看第一段实拍后点名）。
 * **原文（改前）**签到浮层那两枚写的是 `class="chip"`——`.chip` 是描边药丸
 * （`border-radius: 999px`、透明底），且它**没写 `text-decoration`**，而这两枚是
 * `<a>`，于是带着浏览器给链接的下划线，看着像两条链接不像两枚按钮。
 * 现改用站上现成的 `.btn-s`（`<a>` 用的小号实心按钮，本来就 `text-decoration: none`，
 * 且已在本文件末尾那条 44px 名单里），**不新造样式**；这里只补「等宽、占满」：
 * `flex: 1 1 0` 让两枚从同一个起点分宽度（`1 1 auto` 是按各自内容宽分，
 * 「抽日卦」三字与「抽事卦」三字虽同宽，日后改字就会一宽一窄）。 */
/* `display:flex` ＋ 两条居中是**验收 c47 的 P2-4**补的：`.btn-s` 本体是
 * `display:inline-block`、靠 `padding:.34rem` 加全站那条 `min-height:44px` 撑到 44 高，
 * 而**撑出来的高度不会把字推到正中**——实测这两枚字盒上留 6.94px、下留 20.06px
 * （居中该是各 13.5），字贴着上沿。同一枚 `.btn-s` 在 `.today-acts` 里反而是正的
 * （13.5／13.5），所以这是 `.modal-ops` 这个上下文特有的表现，不是全站通病：
 * **这条规则本来就只管浮层底下这一排，别页的 `.btn-s` 一个都不碰。** */
.modal-ops .btn-s { flex: 1 1 0; text-align: center;
  display: flex; align-items: center; justify-content: center; }
/* 收银台那枚浮层里的三行说明：只把行距收一点，三行不至于占掉半屏；字号、颜色
   一律走站上 `p` 的通则，不另调。**只钉这一枚浮层**——下单页那只「购买前请确认」
   一个像素都不动。 */
#p_wx_modal .modal-card p { margin: .45rem 0; }
.modal-card label { margin: .7rem 0 0; color: var(--ink); font-size: .92rem; }
.modal-ops { display: flex; gap: .6rem; }
.modal-ops button { flex: 1 1 auto; }
/* 追问建议按钮组（2026-09-01 老师拍板：每批 3 条、点一下填入输入框） */
/* 间距同 G2：.45rem（7.2px）→ .5rem（8px）。 */
.fu-chips { display: flex; flex-wrap: wrap; gap: .5rem; margin: .2rem 0 .6rem; }
.fu-chips .chip-buy { margin-top: 0; text-align: left; }
/* 「半价」标（2026-08-31 老师追拍：活动期在价格前标出力度）：小号反白牌 */
.chip-tag { margin-right: .3rem; padding: .04rem .3rem; border-radius: 4px;
            background: var(--accent); color: var(--accent-ink); font-size: .78em; }
.chip-was { margin-left: .35rem; font-size: .82em; opacity: .65; text-decoration: line-through; }
.chip-buy:hover { background: var(--promo-bg); }
/* 积分按钮（老师 2026-09-06「纯积分买报告直接生成」）：与现金价签并排，用实心
   底色区分「这一枚花的是积分」。积分不够时置灰不可点，按钮上就写明原因。 */
.chip-credits { background: var(--promo-bg); }
.chip-buy:disabled { opacity: .55; cursor: not-allowed; }
.chip-buy:disabled:hover { background: var(--promo-bg); }
.birth-row { display: grid; grid-template-columns: 1.2fr 1fr 1fr 1.35fr; gap: .6rem; }
.birth-row label { margin: .8rem 0 .3rem; white-space: nowrap; }
.birth-row input { text-align: center; padding: .55rem .4rem; }
.birth-tz { margin: .55rem 0 0; }

/* ── 用户反馈闭环 P0（报告页评价块 · 账户页意见反馈 · 退款原因那一格）────
 * 站里此前没有 textarea 的通用尺寸规则（追问框 #fu_q 一直吃浏览器默认），
 * 这里只给新加的这几个框定样子，**不动 #fu_q**——它长什么样是既有页面的
 * 事，顺手一并改就是没人点到的改动。 */
#fb_text, #fbk_text, #r_note { width: 100%; box-sizing: border-box; font: inherit;
  padding: .55rem .7rem; border: 1px solid var(--line); border-radius: 8px;
  background: var(--card); color: var(--ink); }
/* 退款原因（可选）那一格：与「预计退回」「确认退款」「取消」同一行摆得下，
 * 窄屏自动折行；不撑满宽度，免得把两枚按钮挤到下一行去。 */
.rf-reason { display: flex; width: 100%; flex-wrap: wrap; align-items: center;
             gap: .4rem; margin: .35rem 0; }
.rf-reason select, .rf-reason input { width: auto; font-size: .85rem; padding: .25rem .4rem; }
.rf-reason input { min-width: 10rem; }

/* ── 登录后首页六行「知命之」与「我的」清单 ──────────────────────────────
 * 方案稿 docs/PLAN-底部导航与首页改版-方案稿.md §4.3／§4.5／§4.10，版式逐条
 * 移植自 docs/mockups/底部导航布局稿-v7.html 屏三与屏九（.zm 一族、.pills、
 * .rows）。老师 2026-09-13 第 3 轮第 3 条定六行、第 8 轮第 1 条定「宜忌在左、
 * 卦象在右」、第 9 轮定第二行副题「命理八字」。 */
/* ⚠️ `[hidden]` 守卫：下面这几个类都显式写了 `display`，而**显式 display 会盖过
 * 浏览器对 hidden 属性的默认隐藏**——首页那张今日宜忌卡的两态、大陆专属那两行
 * 全靠 hidden 切换，少了这一条它们会一起露出来（2026-09-13 浏览器实看撞到：
 * 未抽那一态里「宜」「忌」两枚标签与右边「自己」的卦象栏照样在）。
 * 做法与本文件里 `.app-strip[hidden]`、`.svc-note:not([hidden])` 同一个道理。 */
.zm-list [hidden], .rows [hidden] { display: none; }
.zm[hidden], .yj[hidden], .gua[hidden], .none-yet[hidden] { display: none; }
.zm-list { display: flex; flex-direction: column; gap: .72rem; margin-bottom: 1.4rem; }
.zm { display: block; background: var(--card); border: 1px solid var(--line);
      border-radius: 12px; padding: .72rem .8rem; position: relative;
      color: var(--ink); text-decoration: none; }
.zm-head { display: flex; align-items: baseline; gap: .45rem; }
.zm-pre { font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
          font-size: .75rem; color: var(--muted); letter-spacing: .12em; flex: none; }
.zm-name { font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
           font-size: 1.08rem; letter-spacing: .06em; }
.zm-sub { font-size: .75rem; color: var(--muted); }
.zm-chev { margin-left: auto; color: var(--muted); font-size: .9rem; }
/* 今日宜忌卡：宜忌在左、卦象在右（第 8 轮第 1 条）。卡片上**不出任何时段字样**
 * （「辰初」「午正」只从浮动提醒里出，同轮拍板）。 */
.today-main { display: flex; gap: .7rem; align-items: stretch; margin-top: .55rem; }
.yj { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: .3rem;
      justify-content: center; }
.yj .line { display: flex; gap: .4rem; align-items: flex-start; }
.yj .line .t { flex: none;
               font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
               font-size: .75rem; line-height: 1.5; width: 1.5em; height: 1.5em;
               display: grid; place-items: center; border-radius: 4px;
               background: var(--quote-bg); color: var(--accent-text); margin-top: .1rem; }
.yj .line p { margin: 0; font-size: .75rem; line-height: 1.62; color: var(--ink); }
/* 这一格第 66 轮第 5 条起是一枚 `<a>`（点进日卦详细页），故要把浏览器给链接的
 * 默认蓝字与下划线按回来——里面的卦名是宋体的卦名，不是一条看起来像链接的字。 */
.gua { position: relative; flex: none; width: 112px; border-left: 1px solid var(--line);
       padding-left: .7rem; display: flex; flex-direction: column; align-items: center; gap: .3rem;
       color: inherit; text-decoration: none; }
.gua .self { position: absolute; top: -3px; right: -2px; font-size: .75rem; line-height: 1;
             padding: .28em .45em; border-radius: 999px; background: var(--quote-bg);
             color: var(--accent-text); border: 1px solid var(--accent); }
/* 卦象用签文数据里那个卦符字（`symbol`，如「䷊」）——与两张签页 `.hsym` 同一个
 * 字段、同一种画法。布局稿上画的是六条爻线，那是示意稿里手摆的；这里改用
 * 数据自带的卦符，卦画一律出自 data/yijing/hexagrams.json，前端不自己拼爻。 */
.gua .gsym { font-size: 34px; line-height: 1.1; color: var(--ink); margin-top: .5rem; }
.gua .gname { font-family: "Songti SC", "STSong", "Noto Serif SC", "Source Han Serif SC", serif;
              font-size: .84rem; letter-spacing: .08em; }
/* 卦名与那枚「›」同一行（第 66 轮小修二第 1 条，老师 2026-09-21 原话逐字「加」）。
 * 原文（改前）：`.gua .gname` 自己带 `margin-top: .18rem`，是这一格里最后一样东西；
 * 现在那段上留白挪给这只包着两样的行，卦名那条规则只剩字体与字距，**位置一格没动**。
 * `.zm-chev` 本身带 `margin-left: auto`（在那四行里靠它把记号推到卡片最右），这里
 * 这一行是**贴着内容宽**的，没有多余空间可推，为免日后看着费解就地归零。 */
.gua .gname-line { display: flex; align-items: center; gap: .15rem; max-width: 100%;
                   margin-top: .18rem; }
.gua .gname-line .zm-chev { margin-left: 0; flex: none; }
/* 未抽那一态：左边一句提示＋一个按钮，卦象不出现（方案稿 §4.5）。 */
.none-yet { flex: 1; min-width: 0; display: flex; flex-direction: column;
            align-items: flex-start; justify-content: center; gap: .45rem; }
.none-yet p { margin: 0; font-size: .78rem; line-height: 1.6; color: var(--muted); }
/* 间距同 G2：.45rem（7.2px）→ .5rem（8px）。 */
.today-acts { display: flex; gap: .5rem; margin-top: .5rem; }
.btn-s { display: inline-block; flex: none; font-size: .78rem; padding: .34rem .7rem;
         border-radius: 8px; background: var(--accent); color: var(--accent-ink);
         text-decoration: none; margin-top: 0; }
/* ── 首页签到条（2026-09-18 批乙；方案稿 §4.4，版式移植自布局稿 v7 屏三
 * `.checkin-row`／屏四 `.btn-gray`／`.ci-have`）。布局稿自带一套 `--s-*` 变量，
 * 那是稿子自己的，这里一律换成站上真变量（--card／--line／--muted／
 * --accent-text）；只有那枚灰按钮的底色照抄稿子里的字面值。 */
/* **原文（改前）**这一条是：
 *     .checkin-row { display: flex; align-items: center; gap: .6rem;
 *                    background: var(--card); border: 1px solid var(--line);
 *                    border-radius: 12px; padding: .52rem .7rem; position: relative;
 *                    margin-bottom: .72rem; }
 * 那时条里装的是一枚实心按钮 ＋ 一句小字，外面这个白框是用来把它们圈成一条的。
 * 第 66 轮起条里换成「一枚描边小标签 ＋ 一个描边输入框」，**两样各自已经有框**，
 * 外面再套一层就是框里套框（第 66 轮小修四老师刚点过用券页的双层白框：「中间都
 * 不留这种明显的分割开的样式……会有点蒙圈」）。故外层的底色、边框、圆角、内边距
 * 一并去掉，只留「排成一行、两样之间留 .6rem、整条底下留 .72rem」这三件事。 */
.checkin-row { display: flex; align-items: center; gap: .6rem;
               position: relative; margin-bottom: .72rem; }
/* ⚠️ `[hidden]` 守卫，与上面 `.zm[hidden]` 那一条同一个道理：显式写了 `display`
 * 的类会盖过浏览器对 hidden 属性的默认隐藏。签到条整条在出海线要藏起来，
 * 少了这一行它会照样露出来。 */
.checkin-row[hidden] { display: none; }
/* 签到那枚是 `<button>`（与两张签页的签到按钮同），而 `.btn-s` 原是给 `<a>` 写的：
 * 按钮元素的字体不随正文，不写 `font-family: inherit` 就与旁边的字不是一套。 */
button.btn-s { font-family: inherit; }
/* 已签那一态的灰按钮（布局稿屏四）。全站 `button:disabled { opacity: .5 }` 会把它
 * 再压淡一半、淡到看不清，故这里把透明度写回 1——它本来就是「灰着」那一态。 */
.btn-gray { display: inline-block; flex: none; font-family: inherit; font-size: .78rem;
            padding: .34rem .7rem; border-radius: 8px; background: #eceae4;
            color: var(--muted); border: 1px solid var(--line); margin-top: 0; }
.btn-gray:disabled { opacity: 1; cursor: not-allowed; }
/* ── 第 66 轮第 3 条：这一条改成「左边小签到标签 ＋ 右边搜索框」───────────────
 * **原文（改前）**这里是券数那一格的两条：
 *     .ci-have { margin-left: auto; font-size: .8rem; color: var(--accent-text); }
 *     .ci-have b { font-weight: 600; font-size: .92rem; }
 * 「拥有卦券：N 张」整格已撤（卦券数只在「我的权益」页看），故两条一并删掉。 */
/* 签到那一枚小标签。老师「把签到标签做小。放在左边，只显示签到」——比改前那枚
 * 主色按钮（`.btn-s`）小一圈：描边、不填色，只占两个字的宽。
 * **点击区仍不小于 44×44**（通病 G2 那条口径）：`min-height` 与左右内边距撑出来，
 * 看上去还是小小一枚。`flex: none` 免得被右边的搜索框挤扁。
 * `position: relative` 是给下面那个对号定位用的。 */
.ci-tag { flex: none; position: relative; display: inline-flex; align-items: center;
          justify-content: center; margin: 0; min-height: 44px; padding: .3rem .62rem;
          border: 1px solid var(--line); border-radius: 8px; background: var(--card);
          color: var(--accent-text); font-family: inherit; font-size: .82rem;
          line-height: 1.4; cursor: pointer; }
.ci-tag:disabled { opacity: 1; cursor: default; }
/* ⚠️ `[hidden]` 守卫，与本文件里 `.zm[hidden]`、`.checkin-row[hidden]` 同一个道理：
 * 显式写了 `display` 的类会盖过浏览器对 hidden 属性的默认隐藏。这一枚在出海线
 * （`checkin_enabled=false`）与「签到状态还没读到」两档都要藏着，少了这一行它会
 * 照样露出来。 */
.ci-tag[hidden] { display: none; }
/* 已签到那一态：对号**就打在「签到」两个字上**（老师原话逐字「当天已签到，
 * 在签到两个字上打个对号」），故是盖在字上的一层，不是排在字旁边的一枚。
 * 两个字同时压淡一档，好让对号读得出来——字面仍是「签到」两个字，没换成别的词。
 * 线条走 `currentColor`、`fill: none` ＋ 圆头圆角，与底栏那八个图标同一路画法。 */
.ci-ok { position: absolute; left: 50%; top: 50%; transform: translate(-50%, -50%);
         width: 30px; height: 30px; color: var(--accent); fill: none;
         stroke: currentColor; stroke-width: 2.6; stroke-linecap: round;
         stroke-linejoin: round; pointer-events: none; }
.ci-ok[hidden] { display: none; }
.ci-tag[aria-pressed="true"] .ci-tag-t { opacity: .45; }
/* 搜索框那一格：占满整条剩下的宽度。`position: relative` 是给下面那张下拉
 * 定位用的——下拉要浮在页面内容之上，不能把下面六行往下推。
 * `min-width: 0` 不能省：flex 子项默认最小宽是内容宽，不写这一条时输入框在
 * 320 宽那一档会把整条撑出横向滚动条。 */
.ci-search { flex: 1 1 auto; min-width: 0; position: relative; }
.ci-input { width: 100%; margin: 0; min-height: 44px; padding: .3rem .7rem;
            border: 1px solid var(--line); border-radius: 8px; background: var(--bg);
            color: var(--ink); font-family: inherit; font-size: .88rem; }
/* 敲字之后底下那张下拉。**搜不到时整张不显示**（老师 2026-09-21 对「搜不到时
 * 什么都不显示」答「都按建议」），故没有「没找到」那种空态样式。
 * 浮在内容之上：`position: absolute` ＋ 比签到条高的 z-index（签到条本身不压
 * 任何东西，取 30 比底栏的 20 高一档就够，比浮层的 100 低——浮层开着时下拉
 * 不该盖到它上面）。 */
.ci-sug { position: absolute; left: 0; right: 0; top: calc(100% + .3rem); z-index: 30;
          margin: 0; padding: .2rem 0; list-style: none; max-height: 60vh; overflow-y: auto;
          background: var(--card); border: 1px solid var(--line); border-radius: 10px;
          box-shadow: 0 14px 30px -14px rgba(0,0,0,.3); }
.ci-sug[hidden] { display: none; }
/* 一行一个功能页面名称，点一行直接跳（老师逐字确认的那三步）。
 * 整行都可点、行高不小于 44（通病 G2）；键盘上下键选中的那一行与鼠标划过同一个底色。 */
.ci-sug li { margin: 0; }
.ci-sug a { display: flex; align-items: center; min-height: 44px; padding: .2rem .8rem;
            color: var(--ink); text-decoration: none; font-size: .9rem; }
.ci-sug a:hover, .ci-sug a.on { background: var(--line); }
/* 第二行「天地人」摊开的九个小项 */
/* 间距同 G2：.38rem（6.08px）→ .5rem（8px）——走查点名「首页九个服务按钮之间 6px」。 */
.pills { display: grid; grid-template-columns: repeat(3, 1fr); gap: .5rem; margin-top: .6rem; }
.pill { text-align: center; font-size: .75rem; line-height: 1.5; padding: .38rem .2rem;
        border: 1px solid var(--line); border-radius: 8px; background: var(--bg);
        color: var(--ink); text-decoration: none; }
.pill.free { border-color: var(--accent); color: var(--accent-text); }
/* 「我的」七行清单（布局稿屏九） */
.rows { display: flex; flex-direction: column; background: var(--card);
        border: 1px solid var(--line); border-radius: 10px; }
/* ⚠️ `[hidden]` 守卫，与本文件里 `.zm[hidden]`、`.checkin-row[hidden]` 同一个道理：
 * 显式写了 `display` 的类会盖过浏览器对 hidden 属性的默认隐藏。权益页那张合起来的
 * 清单一行都没有时要整只收起来（第 66 轮），少了这一行它会露出一根空白条。 */
.rows[hidden] { display: none; }
.rows .row { display: flex; align-items: center; gap: .5rem; padding: .82rem .8rem;
             border-bottom: 1px solid var(--line); font-size: .94rem;
             color: var(--ink); text-decoration: none; flex-wrap: wrap; }
.rows .row:last-child { border-bottom: 0; }
.rows .row .sub { flex-basis: 100%; font-size: .75rem; line-height: 1.6;
                  color: var(--muted); margin-top: .18rem; }
.rows .row .slot { font-size: .75rem; padding: .3em .45em; border-radius: 3px;
                   background: var(--quote-bg); color: var(--accent-text);
                   border: 1px solid var(--accent); }
/* `#qc_line .chev` 跟着吃同一条（第 66 轮小修四·追加）：卦券那一行行尾那枚记号要
   **与同页券行一模一样**的颜色与字号。`margin-left: auto` 在那一行里落在行内元素上、
   不生效（那只 `<p>` 不是 flex 容器），故不必另写一条，**一个新值都没加**。 */
.rows .row .chev, #qc_line .chev { margin-left: auto; color: var(--muted); font-size: .9rem; }
.rows .row[aria-disabled="true"] { cursor: default; }
/* ── 第 66 轮返修一 P2-1／P2-2：清单里那一行的**上半条** ─────────────────────
 * 能用的那一行改成「上半是去用券页的链接、下半另起一行摆『查看报告 →』」
 * （验收 c37：整行做成 `<a>` 之后里面塞不下第二个可点的东西，3 份包用了 1 份的
 * 客人在这一行上再也找不到已出的那份报告）。上半这一条占满一整行，
 * 名字仍然吃掉多余的宽（`.svc-name` 的 flex:1），`›` 仍贴右。
 * 它是链接，故要把浏览器给链接的默认蓝字与下划线按回来；
 * 点击区照通病 G2 的尺子撑到 44 高。 */
.rows .row .row-main { display: flex; align-items: center; gap: .5rem;
                       flex: 1 1 100%; min-width: 0; min-height: 44px;
                       color: inherit; text-decoration: none; }
.rows .row .row-main .chev { margin-left: auto; }
/* 一行里那几枚按钮（「继续付款」「取消」「查看报告 →」）**中间留 8px**
 * （第 66 轮返修一 P3-1）：验收 c37 实测「继续付款」右边缘与「取消」左边缘
 * 都是 121.4px、**间距 0.00px**，而右边那一枚是取消订单。通病小修 G2 那一批
 * 只给账户页那两枚（`.pf-ops`）加了间距，清单这一处没被覆盖，这里按同一个数补。 */
.rows .row .ops { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center; }
.dot-red { width: 8px; height: 8px; border-radius: 50%; background: var(--bad); flex: none; }
/* 问老师两块的标题行（第 8 轮第二个「3、」：加「知命之 老师面对面」「知命之
 * 眼见为实」），字样风格与首页六行完全一致，故直接复用上面的 .zm-head 一族。 */
.panel-title { margin: 0 0 .5rem; font-weight: 400; }

/* ── 问AI 页（方案稿 §4.8 ＋ 节末「第 58 轮追注」）────────────────────────
 * 版式逐条移植自 docs/mockups/底部导航布局稿-v7.html 屏六（`.q-kuan.kuan-ai`、
 * `.lead-note`、`.tagrow/.lab2/.cap`、`.chat/.bub`、`.inputbar`），**颜色一律
 * 换成本表这套变量**——布局稿那份 `--s-*` 是稿子自己的一套，不搬进来。 */
/* 题款两句。排法与一事一占页那两句一样（上下两行、中间一道短横），**本页整页
 * 靠左**故这里 align-items 取 flex-start（布局稿屏六 plate-note 点名的两处不同
 * 之一；另一处是本页用站点墨色，不是签页那身深红）。
 * 另起 `.ai-kuan` 而不复用签页的 `.kuan`：那一份写在 web/qian-ask.html 与
 * web/qian-daily.html 的页内 <style> 里、两页各自居中，把同名规则搬进公共表会
 * 落到那两页身上。 */
/* 题款＝**进来那一页中间那块空白里的一句题词**（老师 2026-09-18 返修四：
 * 「改成刚进入那一页，放到中间空白的地方…问问题以后，它就自动消失。」；同日
 * 追加「每次进来都是新空白页的状态，想着看以前的，下拉找以前的。」）。
 * 改法：整块自己撑出**一屏的空白**（高度由 ask.js 的 syncKuanGap 现量现写进
 * `--ask-gap`：可视高度减顶栏、**钉住的说明句**、钉底那一层 `.askbar`（提示题行
 * 与计费小字都在里头）、底栏；原文（改前）这一句写的是「减顶栏、提示题块、输入栏、
 * 底栏」——提示题块返修六已并进 `.askbar`、不再单减，说明句那一项漏写了，
 * 式子一直是对的、是这句话没跟上，2026-09-18 外审第 20 条），两句在这块空白里
 * **水平垂直都居中**；上下两行、中间那道短横照旧居中。
 * 沿革（都留档）：原文（改前一版）是 `flex-direction: row; … gap: .5rem;`＋14px
 * 一行排（返修三第 4 条「改成一行」）；再前一版是页顶靠左的上下两行。
 * 本轮回到上下两行，但位置与角色变了——是题词、不是正文，故色淡一档（`--muted`）。
 * `40vh` 只是量不到时的兜底（老浏览器、替身 DOM）。 */
/* 这块空白由 `#ask_blank` 撑（`is-open` 才撑，问过之后就只剩两行标签那么高）；
 * 两行小标签在它的**最上部**、在流里；题款**绝对定位铺满整块**再居中——于是题款是
 * 以**整块空白的正中**为准，两行标签不参与居中计算（老师 2026-09-18 返修七第 1 条
 * 「在空白区居中一下…也就是再向上一点」；原文（改前）是 `.ai-kuan` 自己撑
 * `min-height: var(--ask-gap)`、标签与题款分占上下两段，题款只在「标签之下」那一段
 * 里居中，故偏低）。 */
#ask_blank { position: relative; }
#ask_blank.is-open { min-height: var(--ask-gap, 40vh); }
.ask-kuan-tags { position: relative; z-index: 1; }
/* 题款在**标签以下那段空白**里居中（老师 2026-09-18 返修九原话逐字：「题款按你说的
 * 往下」——这一条**覆盖**返修七第 1 条那句「在空白区居中一下…也就是再向上一点」）。
 * 原文（改前）是 `inset: 0`：铺满整块空白（含最上面那两行标签）再居中，于是题款以
 * **整块**的正中为准。实测（375×812 真页面）空白区 123→567、标签占 123→218（高 95），
 * 题款中心落在 y=345，比「标签底边到钉底层顶边」那段真空白的正中 (218+567)/2＝392.5
 * **高了约 47px**，看着贴着标签、压不住下面那片空。
 * 现在上边距让出标签那一块的实高（`--asktags-h`，由 ask.js 的 syncKuanGap 现量现写），
 * 居中点正好落在 392.5。**不写死 95px**：标签一行还是两行，这个数都不一样；
 * 零标签的新客量到 0，题款回到整块空白的正中。 */
.ai-kuan:not([hidden]) { position: absolute; inset: var(--asktags-h, 0px) 0 0 0;
                         display: flex; flex-direction: column;
                         align-items: center; justify-content: center; gap: .5rem;
                         margin: 0; text-align: center; }
/* 当题词看：`.k1` 字号大一档、字距拉开；两行都用淡一档的墨色。
 * 字号用 rem 不用 px（2026-09-18 外审第 39 条）：原文（改前）是 `17px`／`14px`
 * 写死，客人在系统里把字调大，整页都跟着放大、只有这两行题词纹丝不动。
 * 换算照根号 16px：17px＝1.06rem、14px＝.875rem，默认设置下落到屏幕上的像素
 * 与改前一样（1.06×16＝16.96px，四舍五入仍是 17px）。 */
.ai-kuan .k1 { font-size: 1.06rem; letter-spacing: .38em; color: var(--muted);
               text-indent: .38em; }
.ai-kuan .k2 { font-size: .875rem; letter-spacing: .02em; display: flex;
               align-items: baseline; color: var(--muted); }
.ai-kuan .k2 .a { color: var(--muted); }
.ai-kuan .k2 .b { color: var(--accent); }   /* 全站橘红（老师第 8 轮第 2 条） */
.ai-kuan .rule { width: 42px; height: 1px; background: var(--line); }
/* 说明句与两行标签**钉在顶栏下方**（老师 2026-09-18 返修五第 2 条）。
 * 顶栏自己是 `position: sticky; top: 0; z-index: 10`（见本表开头那条 `nav`），
 * 所以这一块也用 sticky、`top` 取顶栏实高——那个数由 ask.js 现量写进
 * `--asknav-h`（顶栏会因窄屏折行而变高，写死必漂）；`3.6rem` 只是量不到时的兜底。
 * **钉在哪个祖先上**：本页没有任何祖先设过 `overflow`（body 只是列 flex、main 也没设），
 * 故滚动容器就是整页（文档），这一块钉的是**视口**——与顶栏同一个参照，两者才贴得严。
 * 背景铺 `--bg`（页面底色）把滚过去的历史盖住；左右用负外边距顶掉 `main` 的 1rem
 * 内边距，好铺满整幅宽度，不然两侧各 16px 会漏出底下滚动的内容。
 * `z-index: 5`：压得住正文，又低于顶栏那层 10（滚上去时顶栏在上）。 */
#ask_stick { position: sticky; top: var(--asknav-h, 3.6rem); z-index: 5;
             background: var(--bg); margin: 0 -1rem; padding: .55rem 1rem .15rem; }
/* 说明句（老师第 10 轮第 3 条确认那一句）：引用块样式，左边一道橘红竖线。 */
.lead-note { margin: 0 0 .7rem; font-size: .82rem; line-height: 1.7; color: var(--accent-text);
             background: var(--quote-bg); border-left: 3px solid var(--accent);
             border-radius: 0 6px 6px 0; padding: .5rem .6rem; }
/* 两行小标签：行首两个字＋一排可点的标签。已解锁实心、未解锁描边。
 * `:not([hidden])` 必带，缘由与题款、AI 告知行那两处一模一样：`[hidden]` 的
 * 「不显示」来自浏览器自带样式表，作者自己写的 `display: flex` 权重更高、会把它
 * 顶掉。原文（改前）这一条是光秃秃的 `.tagrow { display: flex; … }`——于是一份
 * 报告都没解锁时 `ask.js` 把这一行 `hidden` 上了，页面上却照露，客人看到的是
 * 光秃秃三个字「已解锁」后面什么都没有（2026-09-18 外审第 1 条／验收窗口逮到；
 * node 那边只看 `hidden` 这一格，量不出来，报绿）。 */
/* 间距同 G2：.35rem（5.6px）→ .5rem（8px）——走查点名「问AI 八个标签之间 6px」。 */
.tagrow:not([hidden]) { display: flex; flex-wrap: wrap; gap: .5rem; align-items: center;
                        margin-bottom: .4rem; }
.tagrow .lab2 { flex: none; font-size: .75rem; color: var(--muted); padding-right: .1rem;
                letter-spacing: .04em; }
.cap { font-size: .75rem; line-height: 1.35; padding: .3rem .62rem; border-radius: 999px;
       border: 1px solid var(--line); background: var(--card); color: var(--ink);
       text-decoration: none; }
.cap.on { background: var(--accent); border-color: var(--accent); color: var(--accent-ink); }
.cap.off { background: var(--bg); border-color: var(--accent); color: var(--accent-text); }
/* 对话区：自己的问题在右、AI 答复在左（布局稿屏六）。答复里有换行，照原样留。 */
.chat { display: flex; flex-direction: column; gap: .5rem; padding: .5rem 0 .6rem; }
.bub { max-width: 82%; border-radius: 12px; padding: .5rem .65rem; font-size: .88rem;
       line-height: 1.7; white-space: pre-wrap; }
.bub.me { align-self: flex-end; background: var(--accent); color: var(--accent-ink);
          border-bottom-right-radius: 4px; }
/* AI 答复**不画气泡**（老师 2026-09-18 追加逐字：「另外，回复也不用描白了，正常
 * 显示就行。」）。原文（改前）是
 *   `background: var(--card); border: 1px solid var(--line);
 *    color: var(--ink); border-bottom-left-radius: 4px;`
 * ——白底、描边、圆角。现在就按正文样子落在页面底色上：无底色无边框无圆角、
 * 左对齐、可占整行（不再压成 82% 宽的气泡）、上下留正常段距。
 * 客人自己问的那条（`.bub.me` 橘色右侧气泡）**一个字没动**——老师只说了回复。 */
.bub.ai { align-self: stretch; max-width: 100%; background: none; border: 0;
          border-radius: 0; padding: .15rem 0 .35rem; color: var(--ink); }
/* 被拦时气泡下面那排标签（老师第 58 轮二）：样式同「未解锁」标签，靠左跟着气泡。 */
.chat .bub-tags { align-self: flex-start; max-width: 100%; margin-bottom: .1rem; }
/* 输入栏钉在底部导航上方（老师第 7 轮第 2 条）。底栏自己是 fixed、实测高 70px
 * （含安全区，见本表上方 .tabbar 与 body.has-tabbar），这里就贴着它的上沿。
 * 原文（改前）这句写的是「高 4.2rem 外加安全区」——4.2rem＝67.2px 是改前公共表那条
 * 垫高写少了的那个数（第 66 轮通病 G5 已改成现量的 `--tabbar-h`），而本页这两处
 * **本来就是按 4.4rem 垫的**、没有被压住的毛病，故本轮只订正这句话、一个值没动。 */
/* 三条 `bottom` 是**层层加码的兜底**，从老到新叠着写，后面认得的浏览器用后面那条：
 * ① `constant()`＝ iOS 11.0–11.2 那一版安全区写法；
 * ② `env()`＝现行安全区写法；以上两条都是「贴在底栏上方」。
 * ③ 键盘那一条（老师 2026-09-18 手机实测「输入框不在键盘正上方」）：取
 *    `--ask-kbd`（被键盘吃掉的高度，由 ask.js 的 syncKeyboardInset 按
 *    `window.visualViewport` 现量现写）与「底栏＋安全区」两者的**较大者**——
 *    键盘收起时那一格是 0，`max()` 选中后者，位置与改前**一模一样**；键盘拉起时
 *    那个数远大于底栏高度，`max()` 选中它，输入栏就贴在键盘上沿。
 *    不认 `max()` 的老浏览器整条规则被丢弃、落回上面第 ② 条，也就是改前的行为。
 *    为什么不能照旧再加 4.4rem：键盘在时底栏本来就被键盘盖住了，再垫一层底栏高度
 *    会在输入栏与键盘之间留一条空带。
 *    ⚠️ 没有 iPhone 真机，这一条只在替身上量过「那个数算得对不对」，真机观感待验。 */
.askbar { position: fixed; left: 0; right: 0; z-index: 19;
          bottom: calc(4.4rem + constant(safe-area-inset-bottom));
          bottom: calc(4.4rem + env(safe-area-inset-bottom));
          bottom: max(var(--ask-kbd, 0px), calc(4.4rem + env(safe-area-inset-bottom)));
          background: var(--card); border-top: 1px solid var(--line);
          padding: .5rem .7rem .6rem; display: flex; flex-direction: column; gap: .4rem; }
/* 原先这儿有两条 `.askbar .fine` 与 `.askbar .fine button`：计费小字那一行早先
 * 就摆在输入栏里、类名叫 `fine`，那两枚引导还是描边小按钮。2026-09-18 第 3 条把
 * 这一行搬进提示题块、返修三第 6 条又把它改成居中小字加两枚小字链接，类名随之
 * 变成 `ask-fine`（规则见本节末尾 `.ask-fine` 与 `.ask-mini-link`），本页再没有
 * 一个 `class="fine"` 的节点——两条规则从此谁也管不着，2026-09-18 外审清出，删。 */
.askbar-row { display: flex; gap: .5rem; align-items: flex-end; }
.askbar-row textarea { flex: 1; min-width: 0; font: inherit; font-size: .9rem;
                       padding: .45rem .7rem; border: 1px solid var(--line);
                       border-radius: 18px; background: var(--bg); color: var(--ink);
                       resize: none; }
.askbar-row button { flex: none; margin-top: 0; font-size: .85rem; padding: .45rem .9rem;
                     border-radius: 18px; }
/* 页底要同时垫出底栏与输入栏两层，否则对话区最后几行被输入栏压住。
 * 多挂一个 .ask-page 就比上面那条 body.has-tabbar 多一层权重，只落在本页身上。
 * 4.4rem＝底栏实测高度 69.9px（375 宽真浏览器量的；公共表那条 body.has-tabbar 写的
 * 4.2rem 略矮一点，照抄会让输入栏压住底栏上沿两三个像素）。
 * 输入栏那一层**不写死**，用 --askbar-h：计费小字是服务端现拼的，一行两行三行都
 * 可能，写死一个数就会漂——垫少了输入栏压住提示问题，垫多了提示问题贴不上输入栏。
 * ask.js 进页面与每次重渲染都现量一次输入栏真高度写进这一格；量不到（老浏览器、
 * 测试里的替身 DOM）就吃下面这个兜底值 8.8rem＝输入栏实测高度 123px 再留一档。 */
body.ask-page.has-tabbar { padding-bottom: calc(4.4rem + var(--askbar-h, 8.8rem) + constant(safe-area-inset-bottom)); }
body.ask-page.has-tabbar { padding-bottom: calc(4.4rem + var(--askbar-h, 8.8rem) + env(safe-area-inset-bottom)); }
/* 提示问题沉到底、紧贴输入栏（老师 2026-09-17 走查截图后定：「未提问和提问回答
 * 完以后时，问题提示从下往上排，也就是下边不要留空，上边可以留空，方便点击和
 * 进一步提问。其他的都维持。」）。
 * 做法：本页把 <body> 排成一列、至少铺满一屏，正文那一段（<main>）吃掉多余的
 * 高度，于是排在它后面的东西被一起顶到底；空处因此全留在上边、下边不留空。
 * **一条 order 都不写**：flex 里 order 相同就按 DOM 先后排，提示问题块本来就排在
 * <main> 之后、是流里最后一件，顶栏、每日提醒横幅、提醒卡这些后挂进来的也照旧
 * 待在原位。原文（改前）这里给提示问题块写过 `order: 1`，是为了把它挪到**站点
 * 页脚之后**（页脚由 api.js 的 renderFooter 挂在 body 末尾，会夹在提示问题与输入栏
 * 中间）；2026-09-18 老师第 5 条之后本页整条站点页脚已由 <body data-no-site-footer>
 * 关掉、改由本页自己画一行 AI 告知，没有东西可绕了，那一条随之删除。
 * 100dvh＝刨掉手机浏览器地址栏之后真正看得见的那一截；老浏览器不认 dvh，
 * 前面那条 100vh 兜底。 */
body.ask-page { display: flex; flex-direction: column; min-height: 100vh; min-height: 100dvh; }
/* 不许收缩（flex-shrink 写 0）：历史满十条时正文本来就比一屏高，能收缩就会被压扁。
 * 下外边距归零：公共 `main` 那条给的是 `margin: 1.5rem auto`，本页正文的**最后一件**
 * 是那块撑满一屏的空白，底下再垫 1.5rem 就会把空白连同两行标签整体往上顶，顶进
 * 钉住的说明句底下（2026-09-18 返修六实测）。上外边距照旧留着。 */
body.ask-page > main { flex: 1 0 auto; margin-bottom: 0; }
/* 报错那一行现在挂在钉底层里，给它收一收外边距（公共 `.msg` 是 `margin-top: 1rem`）。 */
.askbar > .msg { margin: 0; min-height: 0; font-size: .8rem; }
.askbar > .msg:empty { display: none; }
/* 提示题块**并进钉底那一层**（老师 2026-09-18 返修六第 1 条「钉」）：它现在是
 * `.askbar` 的头一个孩子，跟输入框一起钉在底栏上方，往上拉时不动。
 * 原文（改前）它是 body 的直接孩子、排在流里最后一件（`body.ask-page > #ask_suggest`
 * 那两条规则，带 `max-width: 680px; margin: 0 auto .35rem; padding: 0 1rem;`），
 * 靠 `main` 撑高把它顶到底。现在钉住了，宽度与内边距都交给 `.askbar` 那一层管。
 * `--askbar-h` 是现量 `.askbar` 的高度，故它一并算进页底垫高与空白公式，不必另算。 */
.askbar > #ask_suggest { width: 100%; margin: 0 0 .35rem; }
.askbar > #ask_suggest p { margin: 0; }

/* AI 告知那一行（老师 2026-09-18 第 5 条）：只留「内容由人工智能生成，仅供个人参考」
 * 与同一行里的「意见反馈」，**没有**「协纪辨方国学」、没有备案号；与上面内容之间只留
 * 一档小空（老师原话「它跟内容之间也没必要留这么大的空」）。
 * 字号与灰度照站点页脚那两格（.foot-note／.foot-feedback 的值就在下面公共页脚一节，
 * 这里不重定它们的颜色字号，只管这一行怎么排）。 */
/* `:not([hidden])` 必带：`[hidden]` 的「不显示」是浏览器自带样式表给的，作者写的
 * `display: flex` 权重更高，会把它顶掉——那样「对话区空着就不显示」这条当场失效
 * （2026-09-18 首版截图实测：题款在没问过时照样露着）。题款那一族同理。 */
/* ask 页自画那一行：**此前它没设字色字号**，于是整行按正文走（`--ink`、1rem），
 * 看着跟答复一模一样——老师 2026-09-18 返修六第 3 条说的「做成跟正文有区分」正是
 * 这一处。现在与站点页脚同一副长相：`--muted`、`.72rem`，那半句再 `opacity: .85`。
 * 「意见反馈」那条链接（`.foot-feedback`）的字色规则挂在 `.site-footer` 底下、
 * 落不到这一行，故在这里同写一份（同一套值）。 */
/* 下外边距 2026-09-18 老师追加「内容有人工智能生成和已解锁，这两行中间加大一下
 * 行间距吧，显得有点拥挤。」：原文（改前）是 `margin: 0 0 .2rem`（两行之间只有
 * 3.2px），现改成 `1.1rem`（17.6px）——与对话区里一问一答之间那一档（`.chat` 的
 * `gap: .5rem` 加上气泡自身的上下内边距，观感约一行半）协调，不另起新尺寸档。 */
.ask-ainote:not([hidden]) { display: flex; flex-wrap: wrap; align-items: baseline;
                            gap: .6rem; margin: 0 0 1.1rem;
                            color: var(--muted); font-size: .75rem; }
.ask-ainote .foot-note { opacity: .85; }
.ask-ainote .foot-feedback { color: var(--accent-text); font-weight: 400;
                             text-decoration: underline; text-underline-offset: 2px; }
/* 提示题那一行（2026-09-18 返修三，照老师补来的那张别家 App 截图）：**横着排一行、
 * 超出屏宽左右滑**，不换行；滚动条藏起来（手机上本来就不显，桌面上显出来会把那一行
 * 顶高）。每块**不收缩**（`flex: 0 0 auto`），宽度按文字走。
 * 原文（改前）这一块是一列 `.fu-chips` 描边小按钮、一道一行。 */
/* 间距同 G2：.45rem（7.2px）→ .5rem（8px）。 */
.ask-tips { display: flex; flex-wrap: nowrap; gap: .5rem; overflow-x: auto;
            -webkit-overflow-scrolling: touch; scrollbar-width: none;
            margin: 0 0 .4rem; padding-bottom: .1rem; }
.ask-tips::-webkit-scrollbar { display: none; }
/* 实心浅灰圆角小块：老师 2026-09-18 返修四「题块换浅灰」。
 * 沿革两步，都留档：原文（最早）底色是 `var(--card)`（白），在 #f2ede4 的暖白底上
 * 分不太开；改过一版 `var(--skeleton)`（#e8e2d7），被守门
 * tests/test_web_theme_bg.py::test_the_skeleton_bars_never_sit_on_the_page_background
 * 拦下——那一格是**留给白卡上的骨架条**的（`.locked .line`），明文不许用在别处，
 * 而这里压的是页面底色，不是白卡。现改用 `--line`（#e6e1d8）：与 `--skeleton`
 * 差不到一档的暖灰，本就是站上现成的变量，**不描边、不新起颜色**，深字仍用 `--ink`。 */
.ask-tip { flex: 0 0 auto; margin-top: 0; border: 0; border-radius: 8px;
           padding: .5rem .9rem; font-size: .82rem; line-height: 1.4;
           background: var(--line); color: var(--ink); white-space: nowrap; }
/* 题行下面那一行**居中小字**（老师第 7 条要「跟上面隔离」；补图之后的做法就是
 * 横排题行＋居中小字，天然分开，不再另做窄带）。 */
.ask-fine { margin: 0; text-align: center; font-size: .75rem; line-height: 1.7; }
/* 同一行里的两枚小字链接（老师第 6 条去掉箭头、尽量减字）：不是按钮长相，
 * 用站上的链接色加下划线。原文（改前）是 `.ask-guide-btn` 那种描边小按钮。 */
.ask-mini-link { display: inline; margin: 0 0 0 .3rem; padding: 0; border: 0;
                 background: none; font: inherit; color: var(--accent-text);
                 text-decoration: underline; text-underline-offset: 2px; cursor: pointer; }

/* ── 第 66 轮通病 G2：能点的地方不小于 44×44，相邻两枚之间不小于 8px ──────────
 *
 * 出处：走查 3.3 节第 2 条与附录一（条目 G2／L5／M4／P1／P14）。实测 375×812 的
 * 登录后首页：**45 个能点的东西里 36 个不到 44×44**——「今日签到」72×28、「抽日卦」
 * 60×31、九个服务小项各 101×31、16 枚价签各 97×30、账户页「改称呼」76×34 与「删除」
 * 61×34（两枚中间还是 **0px**，而删除不可逆）。老师对共性通病清单答「都按建议」。
 *
 * **视觉尽量不动**：一律只加 `min-height`（外形、字号、内边距、颜色一个没改），
 * 撑的是**点击区**不是观感；相邻间距那几处在各自的规则上把 gap 加到 8px（见上面
 * 逐条注释）。44 这个数是手机端通行的最小可点尺寸，也是走查用的那把尺。
 *
 * 排在文件末尾：这几条是**故意要盖过**前面各自规则里的高度的，同权重后写的赢。
 *
 * ⚠️ 下面的「不许波及」清单，每一条都有来头，删任何一条都会踩回老师提过的毛病：
 *   · ~~繁简键（`.lang-switch`）~~ **第 66 轮第 2 条起不再豁免，已从下面那行名单里
 *     去掉**（主会话看第一段实拍后点名「账户页繁体键点击区撑到不小于 44×44」）：
 *     那一枚已从顶栏搬去「我的账户」页（另一枚一直在登录页），两处都长在正文里、
 *     不吸顶，当初立这条豁免的理由对新落点整个不成立。现在它跟着上面 `button`
 *     那条走，高 44；顶栏里已经没有它了，撑不高任何吸顶的东西。
 *     下面那段原委留着备查（它解释的是这条豁免当初为什么立）：
 *     顶栏是 sticky 钉住的，撑到 44 会把整条
 *     顶栏拉高——2026-09-12 立项四批的甲案做的就是「把那两行压矮」这件事
 *     （105px→71px，见 docs/PLAN-手机导航栏自适应-方案稿.md §9.2 对照表第②行）。
 *     ⚠️ 原文（改前）这一句写的是「老师 2026-09-12 拍过甲案专门『把两行压矮』」——
 *     **「把两行压矮」不是老师原话**，那是主会话写进方案稿的建议原文；老师那天的
 *     逐字原话只有两段（同文件 §九照录）：「一，你的建议是什么？……」与「都按建议」。
 *     第 66 轮返修一按验收 c38 P3-2 改准（仓里为这件事专门立过记忆：派活写「老师拍板
 *     原话」不贴原文，代理就会编一句像样的引语）。
 *     且 tests/test_web_nav_narrow.py 钉着 1280 那头「导航高与九项坐标与改前逐项相同」。
 *   · 意见反馈页微信那一行（`#fbk_wechat button`）：老师 2026-09-12 原话「占的空间又
 *     太大，第一眼看不到下面输入框，能把它再窄一点吗？」。
 *   · 问AI 题行下面那两枚小字链接（`.ask-mini-link`）：它们是**行内的字**、不是按钮
 *     （老师第 6 条「去掉箭头、尽量减字」），撑高会把那一行撕成三段。
 *   · 复选框（`input[type=checkbox]`）：撑高会把方框本身拉成一条 44px 的竖条。
 *     这几枚改前是 13×13，**本轮没动**——单列在交卷汇报里请老师定。
 *   · 底栏五格（`.tabbar .tab`）是 <a>，本来就 75×53.7，够。 */
button, a.secondary { min-height: 44px; }
.chip, .chip-buy, .btn-s, .btn-gray, .cap, .pill, .ask-tip { min-height: 44px; }
input, select, textarea { min-height: 44px; }
/* 不许波及（缘由见上）：一律把那几处按回它们原来的高度。 */
#fbk_wechat button, .ask-mini-link,
input[type=checkbox], input[type=radio] { min-height: 0; }
/* 首页那一行「N 次可兑换」（`#voucher_link`）：整行就是一条去用券页的链接，
   改前实测 67.1×19 —— 是**入口**，故也撑到 44 高。只加上下内边距，字号、颜色、
   位置一个没动（`display: inline-block` 是让内边距真的撑得起高度，行内元素撑不起）。 */
/* 权益页卦券那一行（`#qc_link`，第 66 轮小修四·追加）跟着吃同一条：它也是一个
   **入口**（点进去就是「一事一占」），点击区同样要 44 高。**一个新值都没加**。 */
#voucher_link, #qc_link { display: inline-block; padding: .75rem 0; min-height: 44px; }
/* 条款页顶上那两枚（「返回」「繁體中文」，第 66 轮返修一 P2-3）。
   走查附录一**加粗点名**过「返回 30×25」，而上一笔那三条 `min-height` 只管
   `<button>`／`a.secondary`／`.chip` 一族与表单控件——这一页四个入口全是光秃秃的
   `<a>`，一条都没吃到，整页 5/5 不达标一个数没变（验收 c38 P2-3 实测）。
   这里只撑点击区：`inline-flex` 是让高度撑得起来（行内元素撑不起），左右各半档
   内边距把「返回」两个字从 30.4px 宽撑过 44；字号、字色、位置一个没动。
   顺手把这条 `<nav>` 自己的上下内边距收一档（公共 `nav` 是 `1.05rem`）——
   不收的话这条**吸顶**的栏会从 58.7px 长到 77.6px，在一张一万两千像素长的页上
   白吃一截；收完实测 55.2px，**比改前还矮一点**。
   这个类由 `scripts/build_terms_page.py` 生成时挂上，产物不手改。 */
.terms-nav { padding-top: .35rem; padding-bottom: .35rem; }
.terms-nav a { display: inline-flex; align-items: center; justify-content: center;
               min-height: 44px; min-width: 44px; padding: 0 .5rem; }
/* 账户页每张档案后面那两枚（「改称呼」「删除」）：改前两枚**紧挨着、0px 间距**，
   而「删除」是不可逆的。这里给它们一条自己的排法——横排、可折行、中间 8px。
   `.pf-ops` 这个类由 web/js/account.js 挂在原来那只 `svc-sub` 上（多挂一个类，
   `.svc-sub` 那条「占满一整行」的规则照旧管着它，位置一点没变）。 */
.pf-ops { display: flex; flex-wrap: wrap; gap: .5rem; }
/* ── 用券页收成紧凑的一块（第 66 轮小修四第 1 条）────────────────────────────
   老师 2026-09-21 原话逐字：「在使用兑换券的时候，是否可以合成一栏？也就是，比如
   第二张，事业财运跟请选择或添加八字，包括生成报告，申请退款之间，中间都不留这种
   明显的分割开的样式。因为现在这样进去以后，在事业财运这一栏跟自己和添加他人这一栏，
   它们两者之间空间比较大，会有点蒙圈，看不懂怎么操作。」
   改前那一页上两只 `.svc-list`（上面券那一行、下面选八字那几行）**各自带一圈描边**，
   两圈之间又隔着一段空档，看上去是两块互不相干的东西。
   这里只管**这一页**（按 `#uv_card` 收着，别页的 `.svc-list` 一个像素没动）：
     · 两只框自己的描边与圆角去掉，只留外面那张 `.card` 一层；
     · 行的左右内边距归零，让券名、老师那句话、选八字那几行、「生成报告」
       **落在同一条左边线上**；
     · 框与框之间的空档改由上面那条 `label` 的既有上下边距（`.8rem`／`.3rem`）管，
       与同页别的表单项一档。
   行与行之间那条细横线**留着**：那是同一块里几个选项的分界，不是块与块的分界
   （去掉的话「自己」「添加其他人」会糊成一片）。 */
#uv_card .svc-list { border: 0; border-radius: 0; overflow: visible; }
#uv_card .svc-row { padding-left: 0; padding-right: 0; }
/* 券那一行（`#uv_picked`）：它上面就是卡片的内边距，再留一档上边距就空了一大截。 */
#uv_card #uv_list .svc-row { padding-top: 0; }
