/* 登录页自包含子集（index.html 唯一 style.css 面；R402/R404） · 由 tmp/patch-r1466-css-split.js 生成（R404），改规则请改生成器输入侧后重生成 */
/* ═══ ★r1438 R267 全站间距刻度 token（6 档；此后编辑间距一律 var(--gap-*)；同值定义同步落各拆分件）═══ */
:root { --gap-1: 4px; --gap-2: 6px; --gap-3: 8px; --gap-4: 10px; --gap-5: 12px; --gap-6: 16px; }
/* ═══ ★r1439 R280/R283 设计令牌地基：圆角 / 层级 / 字阶 / 动效（此后新增样式一律 var()，禁写同值字面量）═══
   收编口径：只收「数值与令牌完全相等」的档；10px 圆角与 .2s(200ms) 等无等值档字面量保留，避免视觉漂移。
   z 层梯队只落地已有真实消费者的档（base/sticky/toast）；dropdown(100)/mask(1000)/modal(1200) 档暂缓——
   全站无同值字面量，空定义会触发 scan-css-var-integrity 判据 B（死 token），待首个真实消费者出现时补。 */
:root {
  --r-sm: 8px; --r-md: 12px; --r-lg: 16px; --r-xl: 20px; --r-pill: 999px;
  --z-base: 0; --z-sticky: 500; --z-toast: 10000;
  /* ★r1442 R3 z 轴令牌化：导航/遮罩/弹窗/工作台四层（值=全站现状等价只令牌化；
     --z-modal/--z-workbench 的消费点在 style-admin.css/workbench.css 拆分件，本文件定义即全站权威） */
  --z-nav: 40; --z-mask: 400; --z-modal: 460; --z-workbench: 420;
  /* 字阶定稿（★r1439 W2 收口）：canonical 为数值名（400+ 处引用全按值名），语义档为别名。 */
  --fs-11: 11px; --fs-12: 12px; --fs-13: 13px; --fs-14: 14px; --fs-16: 16px; --fs-20: 20px; --fs-28: 28px;
  --fs-xs: var(--fs-11); --fs-sm: var(--fs-12); --fs-md: var(--fs-13); --fs-lg: var(--fs-14); --fs-xl: var(--fs-16); --fs-2xl: var(--fs-20); --fs-3xl: var(--fs-28);
  /* ★r1439 W2 R284 字体族令牌唯一出处：正文最全栈（雅黑首族+PingFang SC 兜底）/ 功能等宽栈。
     body 基座仍留字面量（字体闸 B 面锚定 PingFang 兜底）；令牌引用由字体闸白名单放行。 */
  --font-sans: 'Microsoft YaHei', '微软雅黑', 'PingFang SC', sans-serif;
  --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
  --dur-fast: 120ms; --dur: 180ms; --dur-slow: 280ms; --ease-out: cubic-bezier(.16,1,.3,1);
  /* ★r1443 R334 行高三档刻度：紧凑 32 / 标准 40 / 触控 48（表格行与列表行引用，此后行高禁写同值字面量） */
  --row-h-compact: 32px; --row-h: 40px; --row-h-touch: 48px;
}
/* 核心样式（全页共用/动态状态/字体/动画） · 由 scripts/gen/gen-css-split.js 生成（★r1310），改规则请改生成器输入侧后重生成 */
:root {
  /* ★R516 光影加重（在 R515 基础上全面提档，色相零变化）：
     用户口径「光影全部加重」——R515 的「轻散淡」影调反转方向：
     ① 背景光斑对比拉强：光斑更亮（更接近白）+ 底色压深——光的「方向感」更明确；
     ② 玻璃影三段全加深：外影 8%→14%、近影 4%→8%、内顶光 50%→75%——立体浮凸感；
     ③ 描边高光回亮：55%→80%——玻璃边缘「切面」感回来；
     ④ 阴影 token 同步加深：--shadow 9%→16%、--shadow-sm 6%→10%。 */
  --bg: #e8ecf4;
  --bg-grad-1: #dfe8f8;
  --bg-grad-2: #f3e2ea;
  /* 玻璃面基础（R514）：58% 半透白（保持） */
  --surface: rgba(255, 255, 255, 0.58);
  --surface-solid: rgba(255, 255, 255, 0.82);
  /* R516 描边高光回亮：0.55→0.80——玻璃切面感 */
  --glass-border: rgba(255, 255, 255, 0.8);
  --glass-blur: 24px;
  --glass-saturate: 175%;
  /* ★r1443 R333 颗粒噪点层：SVG feTurbulence 灰噪 3.5% 不透明度（data-URI 平铺，叠玻璃面 background 第二层；
     消费点 .login-card / .topbar；火箭视频区 .login-media 刻意不叠） */
  --grain-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='140' height='140'%3E%3Cfilter id='g'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.86' numOctaves='2' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='140' height='140' filter='url(%23g)' opacity='0.035'/%3E%3C/svg%3E");
  /* R516 三段影全加深：外影 16% 浮雕感 + 近影 8% 贴地 + 内顶光 75% 强折射 */
  --glass-shadow: 0 18px 60px rgba(15, 23, 42, 0.14), 0 4px 14px rgba(15, 23, 42, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.75);
  --border: rgba(15, 23, 42, 0.09);
  --text: #0f172a;
  --text-soft: #475569;
  --text-faint: #94a3b8;          /* 装饰档：圆点 / 虚线边框 / 左侧条（不承载文字） */
  --text-faint-strong: #556070;   /* ★R471 承字档：次级文字（时间戳 / 表头 / 清除按钮 / 身份码） */
  /* ★R478 品牌亮档回浅：用户反馈 R476 的 #e11d48(rose-600) 偏深，恢复「浅浅的玫红」观感。
     范围边界：只动品牌面（--primary/-2/-soft + 同值 rgba 族）。语义玫红族刻意**不跟浅**——
     data-tone=rose（六色环警示 tone）/ mir-marker-pin（比对地图标记）/ --bar-low-grad（低分档）/
     visited·sales 边框（状态色）仍是 #e11d48：玫红在这些位置是「告警/驳回」语义锚点，
     跟品牌走浅会与 amber/violet 失去区分度（同族不对称反例：R476 前 amber 被品牌耦合的教训）。
     取 #f43f5e(rose-400) —— 比旧橙时代的视觉重量更接近原 #fb7185 端的柔和，双锚 3.396:1 仍属亮档(装饰)，
     承字档 --primary-strong #be123c(6.285:1) 不动，「亮档=装饰/深档=承字」铁律不变（exit 74 现场解析自动跟随）。
     --primary-2 同步上移一档到 #fb7185→#fda4af(rose-300)，保持两端 1 档层差（原 #e11d48→#fb7185 也是 1 档）。 */
  --primary: #e11d48;
  --primary-2: #fb7185;
  --primary-soft: rgba(225, 29, 72, 0.12);
  /* ★R470 品牌「承字档」（--primary-strong / --primary2-strong）：
     浅色主题下品牌亮色只能承担**装饰面**（柔底 / 发光 / 渐变色块 / 渐变文字）。
     一旦作为**实心底承载近白文字**，#e11d48 = **4.697:1**（余量仅 4.4%）、
     #fb7185 = **2.691:1**，后者连非文本图形 3:1 都不够（图标块同样不合格）；
     前者虽压线过 AA，但 4.4% 余量经不起任何后续微调（R467 立的口径是「不取刚好压线的值」）。
     深档取值（本机 lin/lum 复算，非观感）：
       #be123c = **6.285:1**（余量 39.7%）、#9f1239 = **8.016:1**（余量 78.1%）。
     两点刻意的取值：
       ① 全族**同一玫红色相**（--primary 色相 347° → #be123c 347° → #9f1239 347°），
          只压明度不换色相——R476 把品牌从「橙」整体切到「玫红」后，这里不再需要
          『同色相下压、不换成红相』那条防合流的说明（当时 --primary 是橙 #f97316，
          下压到 #c2410c 会与 --danger-grad 的危险红合流）。
       ② 余量口径与 R467 绿族（#15803d = 5.016:1，余量 11.5%）对齐——不取刚好压线的值。
     规则：**实心品牌底 + 近白文字 = 必须走深档**；亮档只留给不承载文字的装饰面。
     机器判据：scripts/audit-brand-solid-contrast.js（exit 74），每次部署前置必跑。
     ★R476 该闸的「亮档表」原为硬编码 ['#f97316','#fb7185']，与 CSS 不同步时判据③
     （亮档作前景字）会拿一个根本没被使用的色值比对 —— 「0 处违规」看起来正常而整条失效。
     已改为**现场解析本文件的 --primary / --primary-2**（与 R475 探针族同一条铁律）。 */
  /* ★R479 承字档**不动**（保持 R470 深档 #be123c）：实测把 --primary-strong 浅一档到 #e11d48 后，
     119 处 var(--primary-strong) 前景字全掉到 4.344:1（页面底）/4.424:1（暖底），大面积破 AA
     ——「浅」只落在 --brand-grad 实心底（白字 4.697 ✓），深红文字档不动。分层铁律回归本意：
     亮档=装饰、深档=承字、渐变底=白字单独校验。 */
  --primary-strong: #be123c;
  --primary2-strong: #9f1239;
  --accent: #6366f1;
  /* ★R472 accent（靛蓝）承字档：#6366f1 压页面底 #f4f6fb = **4.131:1**，压白底 4.509:1
     —— 白底刚过线、页面底不合格，是典型的「双锚只过一端」。深档 #4338ca = 7.903:1 / 7.309:1。
     同族：--accent 仍作装饰（时间码 / 选中描边 / 进度点）。 */
  --accent-strong: #4338ca;
  --danger: #ef4444;
  --danger-soft: rgba(239, 68, 68, 0.12);
  --ok: #10b981;
  --shadow: 0 16px 48px rgba(15, 23, 42, 0.16);  /* R516 光影加重 */
  --radius: var(--r-xl);  /* R515 圆角升级：18→20px 呼吸感（★r1439 起指向 --r-xl 令牌） */
  /* 历史别名：27 处组件引用了这些变量但 :root 从未定义，浏览器丢弃声明导致样式回退。
     统一映射到既有变量，一次定义全局生效（系统为浅色单主题，无 dark 变量覆盖）。
     ★r1439 R311：本组为兼容别名，定义保持不动，但新代码禁引（直接用 --text-soft / --surface-solid / --surface）。 */
  --muted: var(--text-soft);
  --text-muted: var(--text-soft);
  --card: var(--surface-solid);
  --surface-soft: var(--surface);
  --shadow-sm: 0 5px 20px rgba(15, 23, 42, 0.10);  /* R516 */
  /* ★r1442 R3 中档浮起影（cost-audit-cat / settlement-rider-card 悬停同值收编）、
     统一焦点环（surface 内环隔色 + 品牌深档外环）、全站弹窗遮罩色（.modal-mask 消费） */
  --shadow-md: 0 8px 24px rgba(15, 23, 42, 0.10);
  --focus-ring: 0 0 0 2px var(--surface-solid), 0 0 0 4px var(--primary-strong);
  --mask-bg: rgba(15, 23, 42, .55); /* ★r1444 A2② 遮罩加深 .45→.55（弹窗阅读区与页面剥离，评委扣分项） */
  /* 浅灰底（小组件底色）：sales 分派列表 / 附近任务卡 / 精度指示条 / 次级标签容器此前各写
     #f8fafc / #f9fafb / #f5f7fa 三个肉眼难分的灰，收敛为一个 token。 */
  --bg-soft: #f8fafc;
  /* 状态徽章调色板：四端（管理 / 骑手 / 打包 / 销售）的「已完成 / 配送中 / 待配送 / 驳回」徽章
     此前各自定义色系（.badge.done = --ok 绿；.status-badge.done = #16a34a；.weigh-status-badge.done
     = #d1fae5/#065f46；.proof-status-badge 又一套），同一视觉概念有 3~4 套色。新增徽章只能再添第 5 套。
     收敛后：等待 → 琥珀（待办类视觉锚点沿用 --primary），进行中 → 紫色（六色环第 3 位，与 hero violet 同源），
     已完成 → 青绿（六色环第 6 位 teal），告警/驳回 → 玫红（与 hero rose 同源）。
     颜色名只描述颜色族，不绑定语义：等待可用 amber 也可用 rose（看是普通待办还是必须立刻处理）。
     任何新徽章请优先用这四个 token，禁止再新增散落的 hex。 */
  --badge-amber-bg: var(--tint-amber-bg);
  /* ★R476 与品牌色**解耦**：原实现是 --badge-amber-bg/fg 直接 `var(--primary-soft)` /
     `var(--primary-strong)`。品牌色从橙切到玫红后，这一格跟着变成玫红 —— 与同族的
     --badge-rose-* 变成**完全同值**，「等待（琥珀）」与「告警/驳回（玫红）」在观感上合流，
     徽章的色相语义就此丢失，而且**没有任何报错**（CSS 变量解析照常成功）。
     症状与 GLYPHS 死键同族：同值两份定义必然漂移，改一侧另一侧不会响。
     琥珀档一律引用真琥珀 token（--tint-amber-*），品牌色怎么改都与它无关。
     （R470 曾把这一格「收敛」到 --primary-strong 以对齐同族四格深档口径——
     那次收口的**代价**正是把语义族耦合到了品牌族；本轮改回，并保持深档取值
     #b45309 = 5.022:1，与 R470 的对比度结论一致。） */
  --badge-amber-fg: var(--tint-amber-fg);
  --badge-violet-bg: rgba(139, 92, 246, 0.14);
  --badge-violet-fg: #6d28d9;
  --badge-teal-bg: rgba(15, 118, 110, 0.14);
  --badge-teal-fg: #115e59;
  --badge-rose-bg: rgba(244, 63, 94, 0.12);
  --badge-rose-fg: #be123c;  /* 语义徽章档保持深值（非品牌面） */

  /* ── 全站视觉统一令牌（R95）：一处定义，四端（管理/骑手/打包/销售 + 密钥池）共用 ──
     此前「同一个视觉概念有 N 套实现」是静默漂移的主要来源：
       品牌渐变      —— admin-tab 写 135deg(#f97316,#fb7185)、sales-tab 写 90deg(#f97316,#e11d48)
       页面容器宽度  —— .app / .sales-app / .mkp-page-body 统一走 --panel-max（R390 起 = none 全站铺满）
       次级选中态    —— .ops-module-tab 纯描边，跟主 tab 的实心渐变完全不同语系
     收敛后新增页面只需引用变量，改一处全站跟。禁止再写散落的 hex。
     ★R470：本 token 自此**只指「承字档」品牌实心渐变**（深档，见 --primary-strong 注释）。
     需要亮品牌色做装饰（柔底 / 发光 / 渐变色块）时用 --primary / --primary-2 / --primary-soft，
     绝不再拿 --brand-grad 铺在无文字的装饰面上——那条会让「深档」语义被稀释，
     下一个人又会写出亮底白字的按钮。 */
  /* ★R479 品牌实心渐变回浅（R478 只回了装饰档，按钮/主 tab 这 28 处实心底仍是深玫红——
     那才是「丑」的主视觉面）。两端上移一档：#be123c→#e11d48(4.697:1)、#9f1239→#be123c(6.285:1)，
     白字正文 AA 保持（浅端为渐变最差角，占面小且实测过线）。承字单色档 --primary-strong 不动（见其注释）。 */
  /* ★R480 再浅一档（用户第三次要求「浅的玫红」）：两端上移到 rose-300/rose-400。白字在最浅端
     #fda4af 只有 2.55:1——亮底必须配深字，新增 --on-brand-grad（深酒红 #4a0a1a：压 #fb7185=5.782、
     压 #fda4af=更高，双停全过正文 AA）。所有品牌渐变面上的文字一律走该令牌，禁止再写 #fff。 */
  /* ★R514 玫红「加深一点点」（用户第四次配色调整）：两端各深两档到 rose-500/rose-600
     （#fda4af→#fb7185 升为 #e11d48→#be123c）。白字双停 4.697/6.285 全过正文 AA——
     渐变面文字回归白字档，--on-brand-grad 随之改白（32 处消费点自动跟随，
     common.js 兜底色同步）。深字档 #4a0a1a 退役（压 #e11d48 仅 3.313 不再达标）。 */
  --brand-grad: linear-gradient(135deg, #e11d48, #be123c);
  --on-brand-grad: #ffffff;
  --brand-grad-shadow: 0 8px 22px rgba(225, 29, 72, 0.28);
  /* R390 全站铺满：面板不再锁 1180px，铺满视口宽（左右仍留 --panel-pad-x 呼吸边距）。
     宽屏可读性由各板块内部的合理栅格承担（表格/卡片网格自适应列数），不再靠全局收窄。 */
  --panel-max: none;
  --panel-pad-x: 0px; /* R905-FULLBLEED 全站左右铺满：内容条带贴边与顶栏同宽 */

  /* 语义色族：pill / 卡片 / 提示块统一的「底 + 字」配对，改色必须两边一起改。
     只保留 badge/text token 覆盖不到的四个族 —— rose/violet 与 --badge-{rose,violet}-*
     完全同值、slate-fg 与 --text-soft 同值，同值两份定义必然漂移（GLYPHS 死键同款教训），已删。 */
  --tint-amber-bg: rgba(245, 158, 11, 0.14);
  --tint-amber-fg: #b45309;
  --tint-blue-bg: rgba(59, 130, 246, 0.12);
  --tint-blue-fg: #1d4ed8;
  --tint-green-bg: rgba(22, 163, 74, 0.12);
  --tint-green-fg: #15803d;
  --tint-cyan-bg: rgba(14, 116, 144, 0.1);
  --tint-cyan-fg: #0e7490;

  /* ★R472 语义色「承字档」族 —— 品牌色分层规则（亮档=装饰 / 深档=承字）向语义色的同族推广。
     亮档（--danger / --ok / #ea580c / #dc2626 / #f59e0b / #10b981 …）只承担**装饰面**：
     柔底 / 描边 / 圆点 / 进度条 / 图标底色 / 高亮行底（不承载可读文字）。
     一旦作为**前景文字**（color）压在浅色底上，必须走本族深档 —— 全部 ≥4.5:1（本机 lin/lum 复算）。
     全站普查口径与工具：scripts/probes/probe-solid-fill-contrast.js --axis=fgall
     （收敛前 25 条未达标 → 收敛后 0 条，逐条明细见 AUDIT_REPORT_2026-09-13-r472-semantic-fg-strong.md）。
     取值一律与既有族同值/同色相，不引入第六种橙、第三种红或第二种绿：
       --danger-strong #b91c1c  6.470:1(#fff) / 5.296:1(#fee2e2) / 5.984:1(#f4f6fb) / 5.915:1(#fef2f2)
                                    —— 与 --danger-grad 浅端同值（不新增红）
       --warn-strong   #9a3412  6.377:1(#ffedd5) / 5.398:1(#fed7aa) / 6.564:1(#fef3c7)
                                    —— 与 --amber-grad 深端 / .ri-label 同值（一次收口 3 处散落字面量）
       --ok-strong     #166534  6.771:1(#ecfdf5) / 6.279:1(#e6f4ea) / 6.492:1(#dcfce7)
                                    —— 与 .health-section-badge.ok 同值（不新增绿；刻意不用余量仅 7% 的 #047857）
       --teal-strong   #115e59  7.271:1(#f0fdfa) —— 与 --badge-teal-fg 同值
       --info-strong   #1d4ed8  5.848:1(#e8f0fe) / 5.048:1(#bae6fd) / 5.839:1(#e0f2fe)
                                    —— 与 --tint-blue-fg 同值
     机器判据：scripts/audit-semantic-fg-contrast.js（**exit 76**，pre 档）——
     ① 全站可定性前景色 <4.5 **必须为 0 条**；② 活性断言（可定性条数下限，防解析器失明后假绿）；
     ③ 本族五个 token 仍在定义处且各有消费点。 */
  --danger-strong: #b91c1c;
  --warn-strong: #9a3412;
  --ok-strong: #166534;
  --info-strong: #1d4ed8;

  /* ★r1383 R83 首批裸色收编（scan-css-raw-hex 闸前置轮）：amber 原语/承字深档两枚——
     此前 style.css 内 #f59e0b 散写 28 处、#92400e 散写 30 处（stat/hero tone 定义与各强调位），
     全量改 var() 引用；命名随 --danger/--danger-strong 先例（500 档原语 + 承字深档）。
     同轮另有 #b91c1c 24 处收编进既有 --danger-strong、color:#0f172a 承字位收编进 --text。 */ 
  --amber: #f59e0b;
  --amber-strong: #92400e;

  /* ★R97 危险色族渐变 token：此前「危险操作」的红橙渐变在 8 处各写一份字面量
     （#ef4444→#f97316 与 #e11d48→#be123c 两个方向混用），同概念两套实现必漂移。
     ★R470 深端收口：浅端 #ef4444 对 #fff 只有 3.763:1、深端 #f97316 只有 2.803:1，
     两端都不过 AA 正文（.btn.nav-all 18px/900 属大字档可 3:1，但 .route-nav-btn 13px/800
     与 .ms-action-del 正文档都必须 4.5:1）。收口为 #b91c1c(6.470:1) → --primary-strong(5.022:1)。 */
  /* ★R479 与品牌承字档**解耦**：原深端 var(--primary-strong) 在 R479 变浅后会把危险红
     拖向浅玫红（语义漂移，同 R476 badge-amber 被品牌耦合的教训）。写死品牌浅一档前的值。 */
  --danger-grad: linear-gradient(135deg, #b91c1c, #be123c);
  --danger-grad-shadow: 0 8px 20px rgba(239, 68, 68, 0.3);
  /* ★R470 玫红实心档：浅端 #e11d48 对 #fff = 4.697:1（余量仅 4.4%，低于绿族的 11% 口径），
     深端 #be123c = 6.285:1。收口为 #be123c(6.285:1) → #9f1239(8.016:1)，
     两端余量都在 39% 以上。消费端：.rstat-tag / .goods-cell.locked .gc-price /
     .nav-point.nav-blocked / .mc-name .name-label / .rm-dot —— 「红底白字」这一族
     此前五份实现五种红（#fb7185 / #f87171 / #ef4444 / #ff4d6d / #ff3355），全在此收口。
     ★R476：品牌色整体切到玫红后，本族与 --brand-grad **同值同源**（品牌即玫红），
     故不再各写一份字面量 —— 同值两份定义必然漂移（GLYPHS 死键同款教训），改为单向引用。
     取值仍必须显式写死两端（原实现第二端引用 var(--primary2-strong)，
     而 --primary2-strong 本轮已改为 #9f1239，会变成**首尾同色的退化渐变**：
     linear-gradient 两端同值时虽不报错，但视觉上的层次与阴影方向感全部消失）。 */
  --rose-grad: var(--brand-grad);
  /* ★R467 绿实心按钮成族 token（R97/R98「重复≥2 的同值渐变必须收口」同族）。
     R466 把 `.btn.complaint-handle` 从「只改字色」改正为「实心绿底 + #fff」后，
     全站绿实心按钮变成两处（`.status-action.finish` + 它），但两处各写一份
     `linear-gradient(135deg, #16a34a, #15803d)`——浅端 #16a34a 对 #fff 只有 **3.296:1**
     （WCAG AA 正文需 4.5:1；该按钮 13~14px/600~800 属正文档，不是大字豁免档）。
     取值依据（本机 lin/lum 复算，非观感）：浅端 #15803d = **5.016:1**、深端 #116b34 = **6.611:1**，
     两端均过 AA，且浅端刻意留 11% 余量——没有取刚好压线的 #17883f（4.536:1，余量仅 0.8%），
     那点余量经不起任何后续微调，迟早静默跌回不合格。浅端取值 = --tint-green-fg，
     让「绿字 / 绿底」同色系，不引入第三种绿。
     注意：品牌橙粉渐变（--brand-grad）与本族同病且覆盖面大 10 倍以上，
     但属设计决策，R467 刻意未收敛（全站 46 条未达标清单见 R467 审计报告对比度普查表）。
     ★R470 已按「亮档=装饰 / 深档=承字」的分层规则完成收敛，见 --primary-strong 注释。 */
  --green-grad: linear-gradient(135deg, #15803d, #116b34);
  /* ★R470 深琥珀实心档：.goods-cell.has-qty .gc-price（#f59e0b 2.071:1）与
     .tbr-loading .tbr-empty-icon（#f59e0b 2.148:1）两处「琥珀实心 + 近白字」，
     与 --tint-amber-fg(#b45309) 同色系，搭配既有 #9a3412（橙-800，文件内已用于提示文案）。 */
  --amber-grad: linear-gradient(135deg, #b45309, #9a3412);

  /* ★R98 语义渐变 token 二批：把「重复≥2 的同值渐变散写」收口（单一出现不 token 化）。
     橙粉柔底(4处,var/字面量两种写法同值漂移) / 玫瑰淡底(2) / 琥珀暖底(2) /
     亏损负值淡底(2) / 进度条三档(绿/琥珀/玫红 各2,速度条与效率条跨组件同档)。 */
  --brand-soft-grad: linear-gradient(135deg, var(--primary-soft), rgba(251, 113, 133, 0.08));
  --rose-soft-grad: linear-gradient(135deg, #fdf2f8, #fce7f3);
  --amber-soft-grad: linear-gradient(135deg, #fef3c7, #fde68a);
  --loss-soft-grad: linear-gradient(180deg, rgba(244, 63, 94, 0.11), rgba(244, 63, 94, 0.035));
  --bar-high-grad: linear-gradient(90deg, #34d399, #16a34a);
  --bar-mid-grad: linear-gradient(90deg, #fbbf24, #f59e0b);
  --bar-low-grad: linear-gradient(90deg, #fb7185, #e11d48);

  /* ★R97 补充语义渐变 token：米白暖底（信息条/空态）8 处、灰禁用态 3 处、视频占位深底 3 处，
     此前全部各写字面量（含 0%/100% 冗余写法变体），同概念多份实现必漂移。
     ★R470 禁用灰深一档：浅端 #94a3b8 对 #fff 仅 2.564:1。三个消费端里
     .btn.nav-all.nav-disabled 是 WCAG 1.4.3 的 inactive 豁免档，
     但 .status-action.weigh-blocked 是**可点击**的（点击后给出被拦截原因），必须可读；
     同一 token 两种语义，按可读的一侧取值（#64748b = 4.729:1 / #475569 = 7.484:1）。
     「禁用」语义由去饱和的灰传达，不靠低对比——低对比传达禁用是通行但不可访问的做法。 */
  --cream-grad: linear-gradient(135deg, #fff7ed, #ffedd5);
  --disabled-grad: linear-gradient(135deg, #64748b, #475569);
  --video-grad: linear-gradient(135deg, #263241, #111827);

  /* ★r1383 R83 升格（r1381e【R65】前身）：--st-* 是语义层【第一族 status】——
     processing/success/default 三态（default=裸 .badge 中性态，processing=R63 时间线事件点，
     success=R63 已完成态），Ant Design v5 状态令牌口径。
     【badge/chart 族随消费者扩展】：warning/error 两组在 r1381e 已按「先消费后注册」删除
     （零消费者=死 token，css-var 闸裁决）——badge/chart 两个后续族同样只在出现真实消费场景时
     随消费一起注册，不空挂占位定义（css-var 闸纪律：零引用=死 token 禁止）。 */
  --st-processing: #1677FF;
  --st-processing-bg: #E6F4FF;
  --st-processing-bd: #91CAFF;
  --st-success: #52C41A;
  --st-success-bg: #F6FFED;
  --st-success-bd: #B7EB8F;
  --st-default: #8C8C8C;
  --st-default-bg: #FAFAFA;
  --st-default-bd: #D9D9D9;
}
* { box-sizing: border-box; }
/* ★r1442 R3 全局选区：品牌玫红 22% 柔底（替代浏览器默认蓝，文字色不动保住既有对比度） */
::selection { background: color-mix(in srgb, var(--primary) 22%, transparent); }
@media (min-width: 761px) {
/* ★r1443 ⑮ 桌面细滚动条通用档：仅桌面（>760px）给 Firefox 系 scrollbar-width/color 兜底；
   webkit 系走各组件 ::-webkit-scrollbar 专属规则；组件级 scrollbar-* 声明权重均高于通配 *，互不惊扰 */

* { scrollbar-width: thin; scrollbar-color: color-mix(in srgb, var(--text) 22%, transparent) transparent; }
}
html, body { margin: 0; padding: 0; }
body {
  /* ★R524 全站字体统一微软雅黑：雅黑在前、PingFang 兜底（无雅黑设备），禁 system-ui 抢跑 */
  font-family: 'Microsoft YaHei', '微软雅黑', 'PingFang SC', sans-serif;
  color: var(--text);
  /* ★R515 高级感：双柔光斑 + 中央极淡聚光——三层光环境让玻璃面有「被照亮」的层次，
     光斑更大更淡（1600/1300px），透明终止点更远（70/65%），避免边界「塑料圆饼」感 */
  background:
    radial-gradient(1600px 800px at 8% -12%, var(--bg-grad-1), transparent 70%),
    radial-gradient(1300px 650px at 108% 8%, var(--bg-grad-2), transparent 65%),
    radial-gradient(900px 520px at 50% 108%, rgba(255, 255, 255, 0.42), transparent 62%),
    var(--bg);
  background-attachment: fixed;
  min-height: 100vh;
  -webkit-font-smoothing: antialiased;
}
/* ★r1443 结账台空态数字钩（admin-cw.js 产物；等宽数字防串位） *//* ---------- 登录页：独立作用域，不影响管理/骑手/打包端 ---------- */
.login-page {
  --login-bg: #f8f4ef;
  --login-panel: transparent;
  --login-text: #101010;
  /* ★r1442 R3 登录段作用域令牌：暖墨承字 / 暖灰描边 / 火焰橙（收编本段散写裸值） */
  --login-ink: #21130f;
  --login-line: rgba(61, 48, 43, .62);
  --login-flame: #a92a0a;
  min-height: 100vh; /* ★r1381e R74 dvh 兜底：不识 dvh 的旧引擎保住满屏 */
  min-height: 100dvh;
  color: var(--login-text);
  background: var(--login-bg);
  overflow-x: hidden;
}
.login-media {
  position: absolute;
  z-index: -4;
  inset: 0;
  overflow: hidden;
  pointer-events: none;
  background: #f8f4ef;
}
.login-video, .login-video-fallback, .login-video-shade {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
}
.login-video {
  z-index: 2; /* ★r1443 R327 组件内微层·刻意 */
  object-fit: cover;
  object-position: 68% center;
  opacity: 0;
  filter: saturate(.98) contrast(1.08) brightness(.96);
  transform: scale(1.015);
  /* 淡出侧带 .6s 延迟：等接棒的那条完全盖住后才降透明度，中途不会露出底层 poster */
  transition: opacity .6s var(--ease-out) .6s;
}
/* 当前在播的那条：立即淡入并置于上层，实现 fc↔fc3 无缝交叉过渡 */
.login-media.is-ready .login-video.is-current {
  opacity: 1;
  z-index: 3; /* ★r1443 R327 组件内微层·刻意 */
  transition-delay: 0s;
}
.login-media.is-static .login-video.is-current { opacity: .92; }
.login-media.has-error .login-video { display: none; }
.login-video-fallback {
  background:
    url('../assets/videos/fc-20260731-poster.jpg') 68% center / cover no-repeat,
    linear-gradient(135deg, #f8f4ef 0%, #f1ded7 48%, #f8f4ef 100%);
  z-index: 1; /* ★r1443 R327 组件内微层·刻意 */
  filter: saturate(.98) contrast(1.08) brightness(.96);
}
.login-video-shade {
  z-index: 3; /* ★r1443 R327 组件内微层·刻意 */
  background:
    linear-gradient(90deg, rgba(248, 244, 239, .03) 0%, rgba(248, 244, 239, .06) 42%, rgba(248, 244, 239, .58) 70%, rgba(248, 244, 239, .88) 100%),
    linear-gradient(180deg, rgba(255, 250, 245, .03), rgba(74, 36, 27, .16));
}
.login-card {
  position: relative;
  /* R136：显式抬高层级——正常流程 .login-media(z-index:-4) 已在卡之下，但 360/迅雷等
     壳浏览器注入的视频浮层依赖页面自身层叠上下文，显式 z-index 保证登录卡永远压住背景层。 */
  z-index: 999;
  grid-column: 2;
  width: min(100%, 440px);
  padding: clamp(24px, 4vw, 36px);
  border: 1px solid rgba(17, 17, 17, .20);
  border-radius: var(--r-xl); /* ★r1442 R3 22px→r-xl 令牌 */
  background: rgba(249, 248, 245, .42);
  background-image: var(--grain-image); /* ★r1443 R333 颗粒第二层（3.5% 灰噪平铺；火箭视频区不动） */
  box-shadow:
    0 30px 72px rgba(35, 22, 18, .14),
    0 8px 24px rgba(35, 22, 18, .08);
  /* ★r1451 R428① 登录卡可读性提档：近全透 .01→.42 暖米白 + 玻璃模糊（颗粒层/描边保留；移动档仍走 --login-panel 透底） */
  backdrop-filter: blur(var(--blur-sm, 10px)) saturate(1.1);
  -webkit-backdrop-filter: blur(var(--blur-sm, 10px)) saturate(1.1);
  animation: login-card-in .7s var(--ease-out) both;
}
.login-brand { margin-bottom: 24px; }
/* ★r1753 品牌字改「网格丝绸」（MeshLettering）：canvas 层铺满标题盒，字形层退化为无 WebGL 时的兜底。
   min-height 按 63px 字号 × 1.2 行高（≈76）预留，挂载与重排都不产生跳动。 */
.login-brand h1 {
  position: relative;
  margin: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  min-height: 76px;
  color: var(--login-text);
  font-size: clamp(30px, calc(4vw + 6px), 36px);
  line-height: 1.1;
  font-weight: 800;
  cursor: default;
  outline: none;
}
.login-brand-canvas { position: absolute; inset: 0; display: block; cursor: default; /* 只接指针鼓包，不可点击 */ }
.login-brand-canvas canvas { display: block; width: 100%; height: 100%; }
.login-brand-fallback {
  display: grid;
  width: 100%;
  grid-template-columns: repeat(5, minmax(0, 1fr));
  align-items: center;
  color: var(--login-text);
  font-size: clamp(34px, 15vw, 60px);
  font-weight: 900;
  line-height: 1.2;
  transition: opacity .22s ease;
}
.login-brand h1.is-mesh .login-brand-fallback { opacity: 0; }
.login-brand-fallback span {
  display: block;
  min-width: 0;
  text-align: center;
  -webkit-text-stroke: 0 transparent;
  paint-order: stroke fill;
  transition: color .22s ease, -webkit-text-stroke-color .22s ease;
}
.login-brand h1:not(.is-mesh):is(:hover, :focus-visible) .login-brand-fallback span {
  color: #f05a24;
  -webkit-text-stroke: 2px #b72c08;
}
.login-brand h1:focus-visible { outline: none; box-shadow: var(--focus-ring); /* ★r1443 R329 焦点环统一 */ border-radius: 2px; }
.login-form { display: grid; gap: 14px; grid-auto-rows: min-content; align-content: start; }
.login-input-wrap {
  position: relative;
  height: 48px;
  align-self: start;
  border-radius: var(--r-md); /* ★r1442 R3 6px→r-md */
}
.login-input-wrap input {
  position: relative;
  z-index: 1; /* ★r1443 R327 组件内微层·刻意 */
  height: 48px;
  padding: 0 14px;
  border: 1px solid var(--login-line); /* ★r1442 R3 裸值收编 */
  border-radius: var(--r-md); /* ★r1442 R3 6px→r-md */
  background: transparent !important;
  color: #000 !important;
  font-family: var(--font-sans);
  font-size: var(--fs-16);
  font-weight: 400;
  -webkit-text-fill-color: #000;
  box-shadow: none;
  transition: border-color .2s ease, box-shadow .3s var(--ease-out);
}
.login-input-wrap input::placeholder {
  color: rgba(0, 0, 0, .46);
  font-family: var(--font-sans);
  font-weight: 400;
  -webkit-text-fill-color: rgba(0, 0, 0, .46);
}
.login-input-wrap input:hover { border-color: rgba(61, 48, 43, .82); background: transparent !important; }
/* ★r1442 死 hover 修复：悬停描边加深一档（与聚焦同色，聚焦另有焦点环） */
.login-input-wrap input:focus {
  border-color: rgba(61, 48, 43, .82);
  outline: none;
  background: transparent !important;
  color: #000 !important;
  -webkit-text-fill-color: #000;
  -webkit-text-stroke: 0 transparent;
  text-shadow: none;
  box-shadow: none; /* ★r1474 用户令：账号/密码输入框红线焦点环彻底删除 */
  transform: none;
}
.login-input-wrap input:focus::placeholder {
  color: rgba(0, 0, 0, .46);
  -webkit-text-fill-color: rgba(0, 0, 0, .46);
  -webkit-text-stroke: 0 transparent;
  text-shadow: none;
}
/* 密码可见性切换按钮：绝对定位于密码输入框右侧，不占布局、不干扰自动填充 */
.login-password-toggle {
  position: absolute;
  right: 1px;  /* ★r1439 R304 点击域 30→44：right 内收 7px 补偿，图标视觉位置不动 */
  top: 50%;
  transform: translateY(-50%);
  z-index: 2; /* ★r1443 R327 组件内微层·刻意 */
  width: 44px;
  height: 44px;
  padding: 13px;  /* 44 - 2×13 = 18px 图标盒不变 */
  border: none;
  border-radius: 5px;
  background: transparent;
  cursor: pointer;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: rgba(61, 48, 43, .55);
  transition: color .2s ease, opacity .2s ease;
}
.login-password-toggle:hover, .login-password-toggle:focus-visible { color: var(--login-flame); }
.login-password-toggle:focus-visible { outline: none; box-shadow: var(--focus-ring); }
/* ★r1442 R3 焦点环统一 */
.login-password-toggle svg { width: 18px; height: 18px; display: block; }
.login-password-toggle .icon-eye-off { display: none; }
.login-password-toggle.is-visible .icon-eye-off { display: block; }
.login-password-toggle.is-visible .icon-eye { display: none; }
.sr-only { position: absolute !important; width: 1px !important; height: 1px !important; padding: 0 !important; margin: -1px !important; overflow: hidden !important; clip: rect(0, 0, 0, 0) !important; white-space: nowrap !important; border: 0 !important; }
.login-captcha { display: grid; gap: 10px; padding: 12px; border: 1px solid rgba(61, 48, 43, .34); border-radius: var(--r-sm); background: rgba(255, 255, 255, .34); }
.login-captcha[hidden] { display: none; }
.login-captcha-refresh { flex: 0 0 auto; min-width: 48px; min-height: 44px; padding: 0 9px; border: 1px solid rgba(61, 48, 43, .5); border-radius: 6px; color: var(--login-ink); background: transparent; cursor: pointer; font-size: var(--fs-sm); font-weight: 700; } /* ★r1451 R428④ 点击域 36→44 */
.login-captcha-refresh:is(:hover, :focus-visible):not(:disabled) { border-color: var(--login-flame); color: var(--login-flame); }
.login-captcha-refresh:disabled { cursor: wait; opacity: .55; }
.login-captcha-stage { display: grid; grid-template-columns: minmax(160px, 1.25fr) minmax(130px, 1fr); gap: 10px; align-items: stretch; }
.login-captcha-stage input { min-width: 0; height: 56px; padding: 0 11px; border: 1px solid var(--login-line); border-radius: 7px; color: #000; background: rgba(255, 255, 255, .24); font: 700 15px var(--font-sans); letter-spacing: 0; text-align: center; }
.login-captcha-stage input:focus { outline: none; box-shadow: var(--focus-ring); }
/* ★r1442 R3 焦点环统一 */
.login-captcha-status { min-height: 16px; margin: 0; color: color-mix(in srgb, var(--login-ink) 72%, transparent); font-size: var(--fs-xs); line-height: 1.45; }
.login-captcha.is-banned { border-color: rgba(185, 28, 28, .44); background: rgba(254, 226, 226, .48); }
.login-captcha.is-banned .login-captcha-stage input, .login-captcha.is-banned .login-captcha-refresh { display: none; }
.login-captcha.is-banned .login-captcha-stage { grid-template-columns: 1fr; }
.login-form.has-error { animation: login-shake .34s ease; }
.login-submit {
  position: relative; height: 48px; margin-top: 2px; padding: 0 20px; border: none; border-radius: var(--r-md); overflow: hidden; /* ★r1442 R3 去近黑描边、3px 直角→r-md */
  display: flex; align-items: center; justify-content: center; cursor: pointer;
  color: var(--on-brand-grad); background: var(--brand-grad); box-shadow: var(--brand-grad-shadow);  /* ★r1439 R304 默认态接品牌渐变+白字（hover 视频层行为保留）；★r1442 R3 接品牌投影 */
  font-size: var(--fs-md); font-weight: 800; letter-spacing: .28em; text-indent: .28em;
  transition: color .2s, background .2s, box-shadow .2s, transform .2s var(--ease-out);
}
.login-submit::before { content: ""; position: absolute; inset: 0; z-index: 1; /* ★r1443 R327 组件内微层·刻意 */ background: rgba(0, 0, 0, .18); opacity: 0; transition: opacity .2s ease; pointer-events: none; }
.login-submit-video { position: absolute; inset: 0; z-index: var(--z-base); width: 100%; height: 100%; object-fit: cover; opacity: 0; transition: opacity .2s ease; pointer-events: none; }
.login-submit > span { position: relative; z-index: 2; /* ★r1443 R327 组件内微层·刻意 */ }
.login-submit-label { display: inline-block; min-width: 3em; font-size: 26px; font-weight: 900; letter-spacing: .28em; text-indent: .28em; line-height: 1; white-space: nowrap; }
/* ★r1444 A2⑤ 字距 .32→.28em：与 .login-submit 基距同档，26px 大字视觉不再右偏（字号保持） */
.login-submit:hover:not(:disabled), .login-submit:focus-visible:not(:disabled) { color: #fff; box-shadow: 0 10px 24px rgba(17, 17, 17, .22); transform: translateY(-1px); }
.login-submit:hover:not(:disabled)::before, .login-submit:focus-visible:not(:disabled)::before { opacity: 1; }
.login-submit.is-video-active:not(:disabled) { color: #fff; box-shadow: 0 10px 24px rgba(17, 17, 17, .22); transform: translateY(-1px); }
.login-submit.is-video-active:not(:disabled)::before { opacity: 1; }
.login-submit.is-video-active:not(:disabled) .login-submit-video { opacity: 1; }
.login-submit:active:not(:disabled) { color: #fff; transform: translateY(0) scale(.99); }
.login-submit:focus-visible { outline: none; box-shadow: var(--brand-grad-shadow), var(--focus-ring); }
/* ★r1442 R3 焦点环统一 */
.login-submit:disabled { cursor: wait; }
.login-submit-loading { display: none; align-items: center; gap: 9px; font-size: var(--fs-16); }
/* ★r1442 R3 is-loading 文案档（「身份验证中」） */
.login-submit-loading i { width: 17px; height: 17px; border: 2px solid rgba(255,255,255,.38); border-top-color: #fff; border-radius: 50%; animation: login-spin .7s linear infinite; }
.login-submit.is-loading .login-submit-label { display: none; }
.login-submit.is-loading .login-submit-loading { display: inline-flex; }
/* ★r1439 R304：is-loading 同压深档——白转圈（rgba(255,255,255,.38) 边）压在渐变亮底上不可见。
   ★r1442 R3：压深档由橙（#c83710/#a92a0a）改品牌玫红深档 var(--primary2-strong)，hover/active 无橙残留（disabled 期 :not 门天然屏蔽） */
.login-submit.is-success, .login-submit.is-loading { background: var(--primary2-strong); }
@keyframes login-card-in { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: none; } }
@keyframes login-spin { to { transform: rotate(360deg); } }
@keyframes login-shake { 25% { transform: translateX(-5px); } 50% { transform: translateX(5px); } 75% { transform: translateX(-3px); } }
@keyframes login-flame-stroke {
  0% { -webkit-text-stroke-color: #9f2207; text-shadow: 0 -1px 2px rgba(255, 210, 72, .86), 0 -4px 7px rgba(255, 93, 20, .58), 0 3px 8px rgba(146, 27, 4, .32); }
  45% { -webkit-text-stroke-color: #e13a0b; text-shadow: 0 -2px 3px rgba(255, 229, 122, .92), 1px -6px 9px rgba(255, 87, 12, .68), -1px 3px 9px rgba(160, 31, 5, .34); }
  100% { -webkit-text-stroke-color: #b72c08; text-shadow: 0 -1px 2px rgba(255, 199, 58, .88), -1px -5px 8px rgba(255, 119, 18, .62), 1px 3px 8px rgba(139, 24, 3, .3); }
}
/* ★r1451 R428⑤ 品牌字一次性入场逐字动画（no-preference 正向挂载，reduce 天然无动画；
   权重低于 :hover 火焰描边，悬停仍即时接管动画位） */
/* ★r1451 R428⑤ 品牌字一次性入场逐字动画（no-preference 正向挂载，reduce 天然无动画；
   权重低于 :hover 火焰描边，悬停仍即时接管动画位）
   ★r1753 改为只作用于退化字形层：WebGL 丝绸层自带 introDuration 入场 */
@media (prefers-reduced-motion: no-preference) {
.login-brand-fallback span { animation: loginCharIn .45s var(--ease-out) both; }
.login-brand-fallback span:nth-child(1) { animation-delay: 0ms; }
.login-brand-fallback span:nth-child(2) { animation-delay: 40ms; }
.login-brand-fallback span:nth-child(3) { animation-delay: 80ms; }
.login-brand-fallback span:nth-child(4) { animation-delay: 120ms; }
.login-brand-fallback span:nth-child(5) { animation-delay: 160ms; }
/* ★r1753 R80 正向挂载：退化字形的悬停火焰描边（无限动画）只在 no-preference 下挂载 */
.login-brand h1:not(.is-mesh):is(:hover, :focus-visible) .login-brand-fallback span { animation: login-flame-stroke .72s steps(2, end) infinite alternate; }
}
@keyframes loginCharIn { from { opacity: 0; transform: translateY(6px); } to { opacity: 1; transform: none; } }
@media (max-width: 900px) {
.login-card { grid-column: 1; width: min(100%, 480px); }
.login-video { object-position: 72% center; }
.login-video-fallback { background-position: 72% center, center; }
.login-video-shade {
    background:
      linear-gradient(90deg, rgba(248, 244, 239, .02) 0%, rgba(248, 244, 239, .12) 32%, rgba(248, 244, 239, .74) 76%, rgba(248, 244, 239, .9) 100%),
      linear-gradient(180deg, rgba(255, 250, 245, .04), rgba(74, 36, 27, .18));
  }
}
@media (max-width: 560px) {
.login-captcha-stage { grid-template-columns: 1fr; }
.login-captcha-stage input { height: 48px; }
.login-card { padding: 22px 20px 20px; border-radius: var(--r-lg); background: var(--login-panel); }
.login-brand { margin-bottom: 20px; }
/* ★r1753 窄屏档：标题盒高度随字号收缩（36px 上限档仍留足丝绸字行高） */
.login-brand h1 { font-size: 31px; min-height: 68px; }
.login-brand-fallback { font-size: clamp(32px, 15vw, 52px); }
.login-input-wrap, .login-input-wrap input { height: 46px; }
.login-submit { height: 46px; }
.login-video { object-position: 50% center; }
.login-video-fallback { background-position: 50% center, center; }
.login-video-shade {
    background:
      /* ★r1451 R428① 移动档 shade 第 2/3 停点各 +.12（配合登录卡 .42 底罩，窄屏表单区可读性） */
      linear-gradient(180deg, rgba(248, 244, 239, .08) 0%, rgba(248, 244, 239, .42) 28%, rgba(248, 244, 239, .78) 58%, rgba(248, 244, 239, .82) 100%);
  }
}
@media (prefers-reduced-motion: reduce) {
.login-card, .login-submit-loading i, .login-form.has-error, .login-brand-fallback span { animation: none !important; }
.login-video, .login-submit-video, .login-submit, .login-input-wrap input, .login-submit::before, .login-brand-fallback span { transition: none; }
.login-video { transform: none; }
}
label { display: block; font-size: var(--fs-md); color: var(--text-soft); margin: 16px 0 6px; }
button, input, select, textarea {
  font-family: inherit;
}
input, select, textarea {
  width: 100%; padding: 12px 14px; font-size: var(--fs-lg);
  border: 1px solid var(--border); border-radius: var(--r-md);
  background: var(--surface-solid); color: var(--text); outline: none;
  transition: border-color 0.2s, box-shadow 0.2s;
}
@media (pointer: coarse) {
/* ★r1396 iOS 聚焦自动放大根治：iOS Safari 对 font-size<16px 的聚焦控件自动整页放大且失焦不还原，
   骑手/打包每次称重录数必触发。触屏粗指针设备聚焦字号提到 16px（不动 viewport，保无障碍缩放）；
   小尺寸视觉控件（称重框 12px / quick-note 12px / 附近搜索 14px）同窗覆盖。 */

input, select, textarea, .weigh-input, .quick-note-input, .nearby-cand-search input { font-size: var(--fs-xl); }
/* ★r1442 R3 登录页同档：登录输入/验证码框 15px 在 iOS 聚焦同样触发整页放大 */
.login-input-wrap input, .login-captcha-stage input { font-size: var(--fs-xl); }
}
input:focus, select:focus, textarea:focus {
  border-color: var(--primary);
  box-shadow: 0 0 0 4px var(--primary-soft);
}
/* ===== 备案页脚（工信部 ICP 备案号，合规要求展示于页面底部） =====
   设计取向：不做独立色块，融入所在页面的底色/画面，靠低对比度存在而非分区存在。 *//* 两项备案改 flex 横排：去掉「|」分隔符后靠 column-gap 分隔，窄屏优先保住「同一排」。
   flex-wrap 只作极窄屏兜底（真放不下才换行，不会挤成半截折行）。 */
.beian-footer {
  padding: 26px 12px calc(18px + env(safe-area-inset-bottom, 0px)); /* ★r1442 R3 底部安全区 */
  background: transparent;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  column-gap: 18px;
  row-gap: 6px;
  text-align: center;
}
.beian-footer a {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  color: var(--text-soft, var(--text-soft));
  font-size: var(--fs-12);
  letter-spacing: .02em;
  line-height: 1.5;
  text-decoration: none;
  white-space: nowrap;
  opacity: .55;
  transition: opacity var(--dur-slow) ease, color var(--dur-slow) ease;
}
.beian-footer a:hover { color: var(--accent-strong); opacity: .95; }
/* ★R190c 删 .beian-sep 兜底：HTML 由 meta no-store + 服务端 no-cache/no-store 双重禁缓存，
   「旧缓存页面残留分隔符节点」的作用对象不存在——18 个版本戳后兜底使命早已完成。 */
.beian-footer .beian-icp img,
.beian-footer .beian-gongan img { width: 13px; height: 13px; flex: none; }
.beian-footer .beian-icp img { opacity: .9; }
.beian-footer .beian-gongan img { opacity: .95; }
@media (max-width: 380px) {
.beian-footer { padding: 22px 8px calc(16px + env(safe-area-inset-bottom, 0px)); column-gap: 10px; row-gap: 4px; }
/* ★r1442 R3 底部安全区（380 档同补，防窄档丢 inset） */
.beian-footer a { font-size: var(--fs-12); letter-spacing: 0; gap: 3px; }
.beian-footer .beian-icp img,
  .beian-footer .beian-gongan img { width: 12px; height: 12px; }
}
/* ---- 登录页：备案号叠进视频画面，与背景同层呼吸 ----
   页脚已移入 .login-shell 内部；.login-media 为 z-index:-4，故此处绝对定位即可浮于视频之上。 */
.login-page .beian-footer {
  position: absolute;
  z-index: 1; /* ★r1443 R327 组件内微层·刻意 */
  left: clamp(28px, 7vw, 110px);
  bottom: clamp(16px, 2.4vw, 30px);
  padding: 0;
  justify-content: flex-start;
  pointer-events: auto;
}
.login-page .beian-footer a {
  color: rgba(255, 252, 249, .58);
  font-size: var(--fs-12);
  letter-spacing: .06em;
  opacity: 1;
  /* 极淡投影：只为在浅色画面帧上保住可读性，不形成描边感 */
  text-shadow: 0 1px 3px rgba(48, 24, 16, .38), 0 0 12px rgba(48, 24, 16, .22);
  transition: color var(--dur-slow) ease, text-shadow var(--dur-slow) ease;
}
.login-page .beian-footer a:hover {
  color: rgba(255, 255, 255, .92);
  text-shadow: 0 1px 3px rgba(48, 24, 16, .46), 0 0 14px rgba(48, 24, 16, .3);
}
@media (max-width: 900px) {
.login-page .beian-footer { left: clamp(22px, 6vw, 54px); }
}
@media (max-width: 560px) {
.login-page .beian-footer { left: 0; right: 0; bottom: 14px; justify-content: center; }
.login-page .beian-footer a { color: rgba(16, 16, 16, .44); text-shadow: none; }
.login-page .beian-footer a:hover { color: rgba(16, 16, 16, .8); text-shadow: none; }
}
/* mobile-r1-touch-contract */
@media (max-width: 900px), (pointer: coarse) {
  .login-page button, .login-page input, .login-page a[href] {
    min-width: 44px !important;
    min-height: 44px !important;
    box-sizing: border-box;
  }
  .login-page a[href] { display: inline-flex; align-items: center; }
  .login-page button, .login-page a[href] { touch-action: manipulation; }
}
button:disabled, .btn:disabled, input:disabled, select:disabled, textarea:disabled { opacity: .48; cursor: not-allowed; }
@media print {
/* ★r1442-R3-DONE sentinel（幂等锚，勿删） */

/* ═══ ★r1439 R310 打印最小块（服务对账 / 结算导出场景）═══
   打印引擎不渲染 backdrop-filter（玻璃面糊成灰团），阴影/背景光斑/渐变装饰纯耗墨。
   口径：全元素去滤镜去阴影；body 白底；弹窗白底黑字；toast / 顶栏 / 页签导航 / 按钮栏不打印。 */

*, *::before, *::after { backdrop-filter: none !important; -webkit-backdrop-filter: none !important; box-shadow: none !important; text-shadow: none !important; }
html, body { background: white !important; }
}
