/* 阿土仔的种地手册 · 网页版 —— 组件补全（§41.2 面 6 十五族的补全件 + 面 10 图表族 + 面 11 补强）
   · 与 `app.css` 同批加载（全站同一套；类名归口 = 面 6 —— 零新前缀：逐族登记）；
   · 分工：`app.css` = 令牌 / 元素级 / 壳 / 按钮族 / 段控 / 表单 / 卡与行 / 页级过渡；
     本件 = 页内选项卡 / 表格 / 徽标族 / 提示族 / 三态族 / 折叠 / 时间轴 / 进度 / 图表 SVG / 弹层二制补全。
   本件 ≤500 行（帽纪律 —— 页级样式随各页轮次归口）。 */

/* ── 页头片（面 7 页头制 —— 全站共享版式片：壳页页头 = 页题 + 行内操作位；h1 20 档〔面 3〕）────── */
.page-head { margin: 0 0 12px; }
.page-head h1 { margin: 0; } /* 内嵌 `.muted` 标注随行 */

/* ── 面 6#3 页内选项卡 `.tabs`：桌面 = 行 48 + 下划线 2px（--brand-ink）；手机 = 横向滚动胶囊 ── */
.tabs {
  display: flex;
  gap: 8px;
  margin: 0 0 12px;
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;
}
.tabs a, .tabs button {
  display: inline-flex;
  align-items: center;
  min-height: 44px;
  padding: 0 12px;
  border: 1px solid var(--line);
  border-radius: 999px;
  background: var(--surface);
  color: var(--text-2);
  font-size: var(--fs-s);
  font-family: inherit;
  white-space: nowrap;
  cursor: pointer;
}
.tabs a.on, .tabs button.on, .tabs [aria-current="true"] { background: var(--brand-soft); color: var(--brand-ink); font-weight: 600; }
/* ≥600 = 行 48 + 下划线 2px（--brand-ink；inset 阴影 —— 零布局位移）*/
@media (min-width: 600px) {
  .tabs { gap: 0; border-bottom: 1px solid var(--line); overflow: visible; }
  .tabs a, .tabs button {
    min-height: 48px;
    padding: 0 16px;
    border: none;
    border-radius: 0;
    background: transparent;
  }
  .tabs a.on, .tabs button.on, .tabs [aria-current="true"] {
    background: transparent;
    box-shadow: inset 0 -2px 0 0 var(--brand-ink);
  }
}

/* ── 面 6#8 表 `.table`：表头 12 `--text-2`（底 `--surface-2`）sticky；行 44（≥600 可 36 密档）──
   窄屏 = 横向滚动容器；列优先级用语义类（P0 必显 / P1 滚动 / P2 裁剪 —— 禁 `nth-child`） */
.table-wrap { width: 100%; overflow-x: auto; -webkit-overflow-scrolling: touch; }
.table { width: 100%; border-collapse: collapse; font-size: var(--fs-s); }
.table thead th {
  position: sticky;
  top: 0;
  z-index: 1;
  height: 40px; /* 表头行（面 4） */
  padding: 0 12px;
  background: var(--surface-2);
  color: var(--text-2); /* 规则⑦：--text-3 禁落 --surface-2 */
  font-size: var(--fs-xs);
  font-weight: 500;
  text-align: left;
  white-space: nowrap;
}
.table td { height: 44px; padding: 0 12px; border-bottom: 1px solid var(--line); }
.table tbody tr:last-child td { border-bottom: none; }
.table .num { text-align: right; }
/* 列优先级（面 6#8）：P0 必显 / P1 滚动（容器横滚承接 —— 零规则）/ P2 窄屏裁剪（≥600 复现）——
   页表用语义类承载（禁 `nth-child`）；各页表格随自身轮次上类名。 */
.col-p2 { display: none; }

/* ── 面 6#9 徽标族 `.chip` / `.tag` / `.badge` ───────────────────────────────── */
.chip {
  display: inline-block;
  min-width: 64px;
  padding: 2px 8px;
  border-radius: 999px;
  font-size: var(--fs-s);
  text-align: center;
  color: var(--text-2);
  background: var(--surface-2);
}
.chip.up { color: var(--up-ink); background: rgba(229, 72, 77, 0.12); }
.chip.down { color: var(--down-ink); background: rgba(48, 164, 108, 0.12); }

/* 涨跌胶囊存量类名（`.chip` 同族同几何 —— 行情板 / 持仓两页消费；
   类名全站改写 = 全局重命名轮，不在本件）。〔41.23.4：宽 64 → 72 · 字 `--fs-s` → `--fs-m`〕 */
.change-chip {
  display: inline-block;
  width: 72px;
  padding: 2px 0;
  border-radius: 999px;
  font-size: var(--fs-m);
  text-align: center;
  color: var(--text-2);
}
.change-chip.up { color: var(--up-ink); background: rgba(229, 72, 77, 0.12); }
.change-chip.down { color: var(--down-ink); background: rgba(48, 164, 108, 0.12); }

.tag {
  display: inline-block;
  margin-left: 8px;
  padding: 1px 8px;
  border-radius: 999px;
  background: var(--brand-soft);
  color: var(--brand-ink);
  font-size: var(--fs-xs);
}
.tag.up { color: var(--up-ink); background: rgba(229, 72, 77, 0.12); }
.tag.down { color: var(--down-ink); background: rgba(48, 164, 108, 0.12); }
.tag.warn { color: var(--warn); background: var(--surface-2); }

.badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  min-width: 18px;
  height: 18px;
  padding: 0 5px;
  border-radius: 999px;
  background: var(--up-ink);
  color: var(--on-fill);
  font-size: var(--fs-xs);
  line-height: 1;
}

/* ── 面 6#10 提示族 `.toast` / `.banner` / `.note` ─────────────────────────────── */
.toast {
  position: fixed;
  left: 50%;
  bottom: calc(68px + env(safe-area-inset-bottom)); /* <600 抬至 68+（面 6#10） */
  transform: translateX(-50%);
  background: var(--text);
  color: var(--bg);
  font-size: var(--fs-s);
  padding: 8px 16px;
  border-radius: 999px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 200ms ease-out; /* 面 8：200ms 面出现 */
  z-index: 20;
  max-width: calc(100vw - 48px);
}
.toast.show { opacity: 0.94; }

/* toast 文字钮用法（41.2.6 —— 钉值轮写入）：逆位面（底 = `--text`）字色 = `--bg` ——
   字对 15.62 / 16.02 ✓；`--brand-ink` 落该底 2.79 / 1.61 不达标（面 5 规则⑧ —— 明暗同禁）；
   悬停 / 按压洗底 `--brand-soft` 由 `.btn.ghost` 承担（洗底字对 12.80 / 14.16 ✓ —— 字色不变）；
   `.94` 整树合成：sRGB 口径复算 ≈ **11.6 / 12.5**（设计记 ≈ 9.87 / 11.39 —— 口径归设计档归一；两口径均 ≥ 4.5 ✓）。 */
.toast .toast-action { color: var(--bg); }

.banner {
  margin: 0 0 12px;
  padding: 8px 12px;
  background: var(--brand-soft);
  border-radius: var(--radius-ctl);
  color: var(--text);
  font-size: var(--fs-s);
}
.banner.warn { background: rgba(180, 83, 9, 0.12); color: var(--warn); }
/* 横幅「知道了」（nav-drag §80.8 —— 字色 = 横幅同色 · 零新色对；保护机制族零改） */
.banner.warn .banner-ack { color: var(--warn); }
.banner.danger { background: rgba(229, 72, 77, 0.12); color: var(--up-ink); }

.note { font-size: var(--fs-xs); color: var(--text-2); }

/* ── 51.5⑤ 类归口（写死 —— 共性⑤「未样式化类 / 定义缺作用域」）：`.group-*` 族（自选分组：
     分组管理弹层〔`shell.html`〕+ `/me` 设置组两处消费 —— 现全站零定义，只 `.group-bar` 在 `board.css`）── */
.group-list { list-style: none; margin: 8px 0; padding: 0; }
.group-row { display: grid; grid-template-columns: minmax(96px, auto) auto 1fr auto; align-items: center; column-gap: 12px; min-height: 44px; }
.group-row .btn { justify-self: end; }
.group-name { font-size: var(--fs-m); font-weight: 600; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.group-count { font-size: var(--fs-xs); color: var(--text-2); }
.group-add { display: flex; flex-wrap: wrap; align-items: center; gap: 8px; margin: 8px 0; }
.group-edit-input {
  min-height: 44px; padding: 0 12px; min-width: 0; flex: 1 1 160px;
  font-size: var(--fs-input-m); font-family: inherit; color: var(--text);
  background: var(--surface-2); border: 1px solid var(--line); border-radius: var(--radius-ctl);
}

/* ── 51.5⑤ `.card-head-row` 提为全局组件类（写死）：自通知页卡限定作用域提级 ——
     卡头行 = 标题左 + 动作右（flex · gap 8 · 允许换行）；三处消费点同制（`/notify` · `/import` · `/park` 就近卡）。── */
.card-head-row { display: flex; align-items: center; justify-content: space-between; gap: 8px; flex-wrap: wrap; margin: 0 0 8px; }
.card-head-row .card-title { margin: 0; }

/* ── 51.5⑧ 三态互斥（写死）：占位 min-height 仅在加载态生效；空态 = 内容高（≥120 不塌破版）── */
.list-domain.is-loading { min-height: 224px; }
.list-domain-48.is-loading { min-height: 192px; }
.list-domain-44.is-loading { min-height: 176px; }
.list-domain.is-empty { min-height: 120px; }

/* ── 51.6② 图域档（写死 —— 高度单源 240/280/300）：容器 min-height 与图高同值 ── */
.chart-box, .pnl-chart { min-height: 240px; }
@media (min-width: 600px) { .chart-box, .pnl-chart { min-height: 280px; } }
@media (min-width: 1024px) { .chart-box, .pnl-chart { min-height: 300px; } }
/* 图空态（写死 —— 51.6⑤）：图域居中句 13 `--text-2` + 容器不塌高（= 图高档位）*/
.chart-empty { display: flex; align-items: center; justify-content: center; min-height: inherit; margin: 0; font-size: var(--fs-s); color: var(--text-2); }

/* ── 面 6#11 三态族 `.empty-state` / `.skeleton` / `.error-note` ──────────────── */
.empty-state .muted, .empty-state p { font-size: var(--fs-s); }
.empty-state .btn { margin-top: 12px; }

.skeleton { border-radius: var(--radius-ctl); background: var(--surface-2); overflow: hidden; position: relative; }
.skeleton.line { height: 16px; margin: 6px 0; }
.skeleton.block { height: 240px; }
.skeleton-shimmer {
  position: absolute;
  inset: 0;
  background: linear-gradient(90deg, transparent, var(--brand-soft), transparent);
  animation: skeletonSweep 1.2s ease-out infinite;
}
@keyframes skeletonSweep {
  from { transform: translateX(-100%); }
  to { transform: translateX(100%); }
}

.error-note { font-size: var(--fs-s); color: var(--up-ink); margin: 0; }

/* ── 面 6#12 折叠 `.details`：摘要行 44（标题 15/600 + 摘要 12 muted）；展开面内距 0/16 ── */
.details { border-bottom: 1px solid var(--line); }
.details:last-child { border-bottom: none; }
.details summary {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 8px;
  min-height: 44px;
  font-size: var(--fs-m);
  font-weight: 600;
  cursor: pointer;
  list-style: none;
}
/* 组题 = h2（元素级层级：h1 = 页题，组 = h2 —— 41.4-P10 差异处置）；标题档 15/600 与摘要行同规 */
.details summary h2, .details summary h3 { margin: 0; font-size: var(--fs-m); }
.details summary::-webkit-details-marker { display: none; }
.details summary .muted { font-size: var(--fs-xs); font-weight: 400; }
.details-body { padding: 0 0 12px; }
.details-body > h3 { margin: 12px 0 8px; } /* 组内分区题（元素级 h3 15/600 —— 面 3） */

/* ── 面 6#4 stat 网格（合计卡 —— P07 / P13 两制归并单源：标签 `--fs-xs` + 值 `--fs-2xl` 600；
     内嵌面底 = `--surface-2`〔面 5 用途行〕）；断点（41.4-P07）：<600 = 2 列 / ≥600 = 3 列 ───── */
.totals-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 12px; margin: 8px 0 4px; }
.totals-grid .stat { display: flex; flex-direction: column; gap: 4px; padding: 12px; background: var(--surface-2); border-radius: var(--radius-ctl); }
.totals-grid .stat-label { font-size: var(--fs-xs); color: var(--text-2); }
.totals-grid .stat-value { font-size: var(--fs-2xl); font-weight: 600; }
.totals-grid .stat-note { font-size: var(--fs-xs); color: var(--text-3); } /* 口径注（52.3.6 —— 三注恒在） */
@media (min-width: 600px) {
  .totals-grid { grid-template-columns: repeat(3, minmax(0, 1fr)); }
}

/* ── 占比条区（51.3-P13 I-35 —— Mac 式行板块 · 类与规则单源：P07 `/portfolio` 与 P13 `/panorama` 两页共装；
     值（写死）：名称 96 · 条区 1fr · 占比 56 右对齐 · 条高 8 零圆角；条色 = 该股浮盈亏涨跌色（中性 = `--brand`）── */
.share-list { list-style: none; margin: 8px 0 0; padding: 0; }
.share-row { display: grid; grid-template-columns: 96px minmax(0, 1fr) 56px; gap: 8px;
  align-items: center; min-height: 32px; }
.share-row.merged { color: var(--text-2); }
.share-bar { height: 8px; border-radius: 0; background: var(--surface-2); overflow: hidden; }
.share-bar i { display: block; height: 100%; background: var(--brand); }
.share-bar i.up { background: var(--up); }
.share-bar i.down { background: var(--down); }
.share-pct { text-align: right; font-size: var(--fs-s); color: var(--text-2); }

/* ── 面 6#14 进度 `.pos-bar`：高 10 + 圆角 4 + 底 `--line` + 填充 `--brand`（高 8 → 10 —— 41.23.4）── */
.pos-bar { height: 10px; border-radius: 4px; background: var(--line); overflow: hidden; margin: 8px 0 4px; }
.pos-bar i { display: block; height: 100%; background: var(--brand); }
.pos-bar.off { opacity: 0.35; } /* 无数据变体（35% 透明） */

/* ── 面 6#15 时间轴 `.timeline`：左纵线 1px + 节点 6px（`--brand`）─────────────── */
.timeline { list-style: none; margin: 0; padding: 0 0 0 16px; border-left: 1px solid var(--line); }
.timeline li { position: relative; padding: 8px 0; }
.timeline li::before {
  content: "";
  position: absolute;
  left: -20px;
  top: 14px;
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--brand);
}
.timeline .timeline-title { font-size: var(--fs-m); font-weight: 600; }
.timeline .timeline-body { font-size: var(--fs-s); line-height: 1.6; color: var(--text-2); }

/* ── 面 6#7 弹层二制补全：≥600 = 居中 dialog（440 表单 / 480 详情 / 560 双列表单）──────── */
.dialog {
  width: 100%;
  max-width: 480px;
  margin: auto;
  border-radius: 16px;
  padding: 16px;
  background: var(--surface);
  box-shadow: var(--shadow);
}
.dialog.dialog-form, .sheet-inner.dialog-form { max-width: 440px; } /* 表单档 440（弹层两家族同规）*/
.dialog.dialog-wide, .sheet-inner.dialog-wide { max-width: 560px; } /* 双列表单档 560（记录交易 —— 41.24.2 弹层第三值）*/
.sheet-grip { display: block; width: 36px; height: 4px; border-radius: 999px; background: var(--line); margin: 8px auto 0; }

/* ── 面 10 数据可视化：图表 SVG 元素规格 —— **已外提 `chart.css`（51.6① 单源 / §51.11 拆分）**；
     本件不再重述（D2 单源 —— 图表元素规则恰一处：`chart.css`；装配 = 全部图表宿主页）。── */

.range-bar {
  margin-top: 8px;
  font-size: var(--fs-xs);
  color: var(--text-2);
  min-height: 36px; /* 控件档（面 4）—— 三态零高度跳变 */
  display: flex;
  align-items: center;
  transition: transform 200ms ease-out; /* 面 11 白名单（120 / 200）*/
}

/* 日K 缩放钮（面 10：24×24 —— 可点域按面 11 ≥44 以 ::after 撑，不改视觉尺寸） */
.zoom-seg button { width: 24px; min-width: 24px; height: 24px; min-height: 24px; padding: 0; font-size: var(--fs-m); position: relative; }
.zoom-seg button::after { content: ""; position: absolute; inset: -10px; }
.zoom-seg[hidden] { display: none; }

/* ── 面 11 补强（触控门）：上行各可点元素基本档即 <600 的 44 档（padding 撑，不改视觉尺寸）；
      ≥600 的密行 / 密表 / 弹层二制 / toast 落位 = 下行 ─────────────────────────── */
@media (min-width: 600px) {
  .table.dense td { height: 36px; } /* ≥600 表格密行（面 4 白名单语境） */
  .col-p2 { display: table-cell; } /* 列优先级 P2 —— ≥600 复现 */
  .toast { bottom: 24px; }
  .sheet { align-items: center; justify-content: center; padding: 24px; }
  .sheet-inner { width: auto; border-radius: 16px; margin: auto; max-width: 480px; }
  .sheet-grip { display: none; }
}

/* ── 入口族版式（P01~P05 —— 41.4-P01/P02/P03/P05；两栏态见 `layout.css`）─────────────────────
   单栏：品牌带（字标 24 —— 零版本脚注，41.27.13）→ 表单卡（内距 16 · 表单列 420）→ 页脚 = 备案行（41.27.14）—— 零格言（§17.8）。 */
.entry {
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  align-items: center;
  padding: 24px 12px calc(8px + env(safe-area-inset-bottom));
  padding-left: calc(12px + env(safe-area-inset-left));
  padding-right: calc(12px + env(safe-area-inset-right));
}
.entry-main {
  width: 100%;
  max-width: 720px; /* 阅读档（41.2.2 —— /login /register /admin；两栏态容器 1120（1024–1439）/ 1440（≥1440 —— 档内例外））*/
  flex: 1;
  display: flex;
  flex-direction: column;
  justify-content: center;
  gap: 16px;
}
.entry-card { width: 100%; max-width: 420px; margin: 0 auto; } /* 表单列 420（P01 宽度口径）*/
.entry-brand { text-align: center; }
.entry-wordmark { font-size: var(--fs-2xl); font-weight: 600; color: var(--brand-ink); } /* 品牌带字标 24（两栏 32）*/
/* 字标右下小字版本号（41.30.2 ⑤ —— 值 = `v` + `atuzaiVersion`；色随字标继承；空值 ⇒ 节点不渲染）。 */
.entry-version { font-size: var(--fs-xs); font-weight: 400; margin-left: 8px; }
.entry-signup {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 12px;
  margin: 0 0 12px;
  padding: 12px 16px;
  background: var(--surface-2);
  border-radius: var(--radius-ctl);
  font-size: var(--fs-m);
  color: var(--text);
}
.entry-signup > .btn { flex: none; } /* 链钩恒整枚（不随句长压缩折字 —— 41.30.11 ⑥）*/
@media (min-width: 600px) { .entry-signup > span { white-space: nowrap; } } /* 单行硬目标（≥600 —— 41.30.11 ⑥；<600 摘 nowrap = 折行降级）*/
.entry-error { margin-bottom: 12px; }
.entry-note { font-size: var(--fs-xs); color: var(--text-2); margin: 8px 0 0; }
/* 「忘了密码」行（41.4-P01②⑨ —— 主钮正下方 8px · 右对齐于表单列 · `.btn.ghost.small` 体例：
   <600 = 44 触控门 / ≥600 = 28 档；卡内顺位 = 主钮 → 忘密行 → 面容段 → 扫码入口 —— 模板随段序调整轮） */
.entry-details { margin-top: 8px; font-size: var(--fs-s); }
.entry-details summary {
  display: flex;
  align-items: center;
  justify-content: flex-end;
  min-height: 44px;
  padding: 0 12px;
  cursor: pointer;
  color: var(--brand-ink);
}
@media (min-width: 600px) { .entry-details summary { min-height: 28px; } }
.entry-alt { font-size: var(--fs-s); color: var(--text-2); text-align: center; margin: 12px 0 0; }
.entry-admin-link { color: var(--text-2); text-decoration: none; border-bottom: 1px dotted var(--text-2); }
/* 回程行（41.27.7 —— P03「回普通用户登录」：主钮正下方 8px · 右对齐于表单列；弱化文字钮 = `.btn.ghost.small` 链接）*/
.entry-back { display: flex; justify-content: flex-end; margin: 8px 0 0; }
.entry-actions { display: flex; align-items: center; justify-content: center; gap: 12px; margin: 0; }
/* 入口族表单：主钮全宽 44 ∧ 切换钮位（41.2.6 用法行 —— 字段框正下方 8px、右对齐）*/
.entry .form > .btn.primary { width: 100%; }
.entry .form > a.btn { align-self: flex-end; } /* 负 margin 退场（51.5⑩ —— 间距由 `.form` gap 12 承担；切换钮位语义不变）*/
.error-card { text-align: center; }
.error-card h1 { font-size: var(--fs-3xl); color: var(--text-3); } /* P05 状态码（面 3 大字门）*/
.error-msg { font-size: var(--fs-m); margin: 8px 0 16px; }

/* ── 41.30.3 生物识别登录段（P01：面容 / 扫码**合一** —— 「忘了密码」行之下 12px、管理员入口之上；
   全宽次级钮（两态）+ 说明行 + 面板；`hidden` 初态由 `passkey.js` 解禁（无 JS ⇒ 不出现 —— 零死件）。── */
.bio-slot { display: flex; flex-direction: column; gap: 4px; margin-top: 12px; }
.bio-slot[hidden], .bio-slot [hidden] { display: none; } /* 隐藏态兜底 descendant 形（`.btn` 的 display 压过 UA `[hidden]` —— 覆盖槽内全部钮含 `#qr-login-refresh`；沿 `.sheet[hidden]` 先例）*/
.bio-slot .btn.secondary { width: 100%; } /* 与主钮同宽（表单列 420 内全宽 —— 41.30.3）*/
.bio-slot .entry-note { margin: 0; }

/* ── 41.30.3 面板（并入同槽 —— 卡内嵌段：底 `--surface-2` + 圆角 8 = 二维码 180 + 核对码（24 档）
   + 状态行 + 刷新钮）────────────────────────────────────────────────────── */
.qr-login-panel {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 6px;
  padding: 12px 16px;
  background: var(--surface-2);
  border-radius: var(--radius-ctl);
} /* 展开面 = 卡内嵌段（底 `--surface-2` + 圆角 8 —— 41.2.6 扫码入口用法行；内距沿 `entry-signup` 同式）*/
.qr-login-panel[hidden] { display: none; } /* 隐藏态兜底（flex 压过 UA `[hidden]` —— 沿 `.sheet[hidden]` 先例）*/
.qr-login-panel .qr-code { width: 180px; height: 180px; background: #fff; } /* 二维码 180×180 居中（白底 = 承载面 —— SVG 正文仅 `<path>`）*/
.qr-login-panel .qr-code[hidden] { display: none; }
.qr-login-panel .entry-note { margin: 0; text-align: center; } /* 小字 = `--text-2` × `--surface-2`（面 5 规则⑦ —— 5.57/6.56 ✓）*/
.qr-login-panel b { font-family: var(--font-mono); font-size: var(--fs-2xl); letter-spacing: 4px; color: var(--text); } /* 核对码六位（24 档 —— 49.5④；登录面板 ∧ 录入弹层共用品）*/
.qr-login-panel .btn.secondary { width: 100%; }
/* 隐藏态兜底（零死钮 —— 作者级 `display` 压过 UA `[hidden]` ⇒ 初态显式置隐；沿 `.sheet[hidden]` / `pdfpage.css:43-46` 先例）；新增动作钮须同步入列（腿面 = W-400）。 */
#enroll-refresh[hidden] { display: none; }

/* ── 49.2④ / 49.3④ 手机页（`/k/<id>` ∧ `/e/<id>` —— `.mwrap` 560 单列；主钮 <600 = 56 档、≥600 回 44 档）── */
.qr-auth h1 { margin: 0 0 12px; }
.qr-auth .qr-auth-line { margin: 0 0 8px; font-size: var(--fs-m); font-weight: 600; }
.qr-auth .mmuted { margin: 0 0 6px; }
.qr-auth .qr-auth-code { font-family: var(--font-mono); font-size: var(--fs-2xl); letter-spacing: 4px; color: var(--text); }
.qr-auth .qr-auth-result { margin: 10px 0 0; font-size: var(--fs-m); }
.qr-auth .mrow-actions { flex-direction: column; }
.qr-auth .mrow-actions .btn { width: 100%; }
.qr-auth .btn.primary { min-height: 56px; }
@media (min-width: 600px) {
  .qr-auth .mrow-actions { flex-direction: row; }
  .qr-auth .mrow-actions .btn { width: auto; }
  .qr-auth .btn.primary { min-height: 44px; }
}

/* ── 41.22.1 手写验证码行（P01 密码形 —— 密码与主钮之间）：输入框弹性 + 图 150×44 固定（gap 8）；
   图 = 链接承载（点图换一张 —— 可键盘到达 / 读屏可读）；边框 1px `--line` + 圆角 8（面 4 控件族）。
   行内对齐（41.27.4 写死 —— 逐因 → 修法）：行 = **底对齐**（图对输入框而非整行内容盒）；**行级档 44**
   （两档同值 —— 消 ≥600 档「图 44 / 框 36」的 8px 差；零新档值）；图保持 `flex: 0 0 150px` + `height: 44px`
   （外沿同 44 —— 全站 border-box ⇒ 两框顶底齐）。取舍（登记）：行级 44 ⇒ 本行比相邻同形字段（手机号 /
   密码框 —— 36 档）高 8px —— 行内齐平优先于与邻字段同高；反案 = 图缩 36（41.27.4 否决备选①）。── */
.captcha-row { display: flex; align-items: flex-end; gap: 8px; }
.captcha-row label { flex: 1 1 auto; min-width: 0; } /* 输入框弹性（窄屏不被图挤破）*/
.captcha-row input { min-height: 44px; } /* 行级档 · 两档同值（ui.css 后载于 app.css ⇒ 同特异性下压过控件档 44/36 分档）*/
.captcha-img {
  flex: 0 0 150px;
  height: 44px;
  display: block;
  border: 1px solid var(--line);
  border-radius: 8px;
  overflow: hidden;
  background: #fff; /* 图自含白底（明暗主题同值 —— 41.22.2）*/
}
.captcha-img img { display: block; width: 100%; height: 100%; }

/* ── 41.22.1 说明行槽位（「看不清？点图换一张」—— 修：落四字验证码**正下方**）────────────────
   机制 = 列向落值（父 = `.form`：`display:flex; flex-direction:column` —— app.css；**说明行在
   `.captcha-row` 之外**，行元素树零迁）：交叉轴 = 宽度轴 ⇒ `align-self: flex-end` = 右缘对齐 ∧
   `width: 150px` = 与图（`.captcha-img` `flex: 0 0 150px`）同宽 ⇒ 文字居中于图正下方；`margin: 0`
   覆写 `.entry-note` 的 `margin: 8px 0 0`（图文间距 = `.form` gap 12 —— 原 8+4 同值档）。
   `.captcha-row` / `.captcha-img` / 行级 44 **逐字零改**（只增规则 —— 41.27.4 保持）。 */
.captcha-note { width: 150px; align-self: flex-end; text-align: center; margin: 0; }

/* ── 41.27.15 密码框「显示」切换（P01 登录 ∥ P02 注册 —— 框内右端文字钮；默认关 = 初始 `hidden` +
   `type="password"`；无 JS ⇒ 钮不出现（`hidden` 初态保持 —— 沿 41.19.1 先例）；零新依赖（零图标库）。── */
.pw-wrap { position: relative; display: block; } /* 包层（钮定位宿主 —— 输入框与钮同段）*/
.pw-wrap input { width: 100%; padding-right: 52px; } /* 满宽（包层内不再随弹性项拉满 —— 沿 `calc.css` / `data.css` 包裹输入先例）+ 右内距预留（防明文与钮重叠）*/
.pw-toggle {
  position: absolute; right: 4px; top: 50%; transform: translateY(-50%); /* 框内右端（41.27.15 逐值）*/
  min-width: 44px; min-height: 44px; /* 触控块（<600 门同值 —— 41.2.6-1 保持）*/
  padding: 0 8px; border: none; background: transparent;
  color: var(--text-2); font-size: var(--fs-s); font-family: inherit; cursor: pointer; /* 字对 `--text-2` × `--surface-2`（面 5 规则⑦ —— 5.57/6.56 ✓）*/
}
.pw-toggle[hidden] { display: none; } /* 无 JS 兜底：初态保持不出现（CSP 脚本位缺席 ⇒ 钮恒隐）*/
