/* ============================================================
   报数侠·人事年报助手 — 样式系统
   设计令牌与组件规范对齐姊妹产品「报数侠·公务员桌面」(Gwy/static/style.css)
   与官网设计系统(Gwy/public/nianbao)：政务专业蓝 + FA6 图标 + 全交互态。
   ============================================================ */
:root{
  --brand:#2b6ed7; --brand-d:#1a5bc2; --brand-soft:#eaf2fe;
  --ink:#1e2f44; --ink-2:#3d4d66; --muted:#5a6a82;   /* muted 加深至~AA 对比(小字辅助文字可读性) */
  --line:#e2eaf3; --bg:#f0f4f8; --panel:#f8fafd;
  --ok:#18a05a; --ok-d:#0f7b4a; --okbg:#e7f6ee;
  --warn:#b27d20; --warnbg:#fff6e6;
  --warn-text:#8a5a10;   /* 警示文字专用: #b27d20 作前景对白底仅 3.6:1 不达 AA; 本色对白底≥4.5:1(修UI评审P2)。--warn 留给图标/边框 */
  --err:#c7423a; --errbg:#fdeeec;
  --gold:#cb9a32;
  --card:#fff; --radius:16px; --radius-sm:10px;
  --shadow:0 5px 16px -10px rgba(0,30,60,.16);
  --shadow-lg:0 16px 48px -8px rgba(0,30,60,.3);
  --focus-ring:0 0 0 3px rgba(43,110,215,.45);   /* .15→.45(2026-08-26): 15% 蓝在办公低色域屏上几乎看不见, 键盘/放大镜用户找不到光标在哪。只改透明度, 环的粗细/半径不动 */
  /* 双产品【统一命名】(2026-07-05): 对齐 Gwy 的 primary / primary-dark / primary-soft / border / success / danger 家族(取值本就相同)。
     本仓历史用 brand / line / ok / err 家族; 下列别名让共享·复用组件与跨产品代码可用统一名, 历史 var() 无需改。
     新代码优先用统一名。规范见记忆 nianbao-design-token-naming。 */
  --primary:var(--brand); --primary-dark:var(--brand-d); --primary-soft:var(--brand-soft);
  --border:var(--line); --success:var(--ok); --danger:var(--err);
  /* ── 模块主色 accent(2026-08-28): 默认**逐字等于**品牌蓝族 ⇒ 人事侧渲染一像素不变。
     ★为什么单开一族而不是直接改 --brand: --brand 是两个产品共用的身份色(还与姊妹产品 Gwy
       对齐), 全表 60+ 处在用。accent 只圈住"该跟着模块走"的那几处 —— 主按钮、当前模块页签、
       导航悬停、示例按钮; 链接/图标/焦点环仍走品牌蓝。换模块是换一档主色, 不是换品牌。
     ★阴影单开 token 而不写 rgba(var(--accent-rgb),…): 后者在老内核上整条 box-shadow 会被丢掉,
       按钮突然没影 —— 而这类降级只在用户机器上看得见。 */
  --accent:var(--brand); --accent-d:var(--brand-d); --accent-dd:#0f3d8a;
  --accent-soft:var(--brand-soft);
  --accent-shadow:rgba(43,110,215,.5); --accent-shadow-h:rgba(43,110,215,.55);
  /* accent 的配套色阶(2026-08-28 第二轮): 上一轮只把主按钮/页签交出去, 结果工资侧成了"刷了一半"——
     拖拽区、年度条、必需徽章、最省事带、链接、焦点环、以及整套授权/购买弹窗仍是蓝的, 数量上蓝比紫多。
     ★这些值全部**照抄改动前那一处写死的蓝**, 逐条验过"展开成人事侧终值后与旧文本逐字相同"
       ⇒ 人事侧逐像素不变; 换模块时只有 body[data-mod="rw"] 那一族被改写。
     ★命名按**角色**不按色号(wash/tint/line/ink/glow/ring), 免得哪天调色时名字变成谎话。
     ★别把它们当通用调色板: 只给"跟着模块走的交互面"用。品牌标识(.logo)、启动屏(#app-loader)、
       网页版营销层(.hero/.mobile-hint)、人事专有的必填清单表(.reqtbl)有意留在品牌蓝上,
       由 tests/rw_ui.py 的白名单+棘轮看着(要加须写理由)。 */
  --accent-ring:rgba(43,110,215,.45);        /* 焦点环 */
  --accent-ring-soft:rgba(43,110,215,.12);   /* 选中态外圈 */
  --accent-glow:rgba(43,110,215,.3);         /* 按钮/CTA 光晕 */
  --accent-glow-strong:rgba(43,110,215,.6);  /* 授权大图标 */
  --accent-wash:#f7faff; --accent-wash2:#f4f8ff;      /* 最浅底 / 次浅底 */
  --accent-tint:#eaf2ff; --accent-tint2:#eef5ff;      /* 轻着色底 / 卡片着色底 */
  --accent-ghost:#f2f6fc;                             /* 幽灵按钮底 */
  --accent-line:#cfe0fb; --accent-line2:#d6e3f7;      /* 主描边 / 次描边 */
  --accent-line3:#d6e6fb; --accent-line4:#dbe7fb;     /* 卡片描边 / 年度条描边 */
  --accent-ink:#0f57b8;                               /* 深字 */
  --accent-lite:#5b9bf0; --accent-lite2:#3d84ea;      /* 渐变亮端 / 图标渐变端 */
  --accent-glow-faint:rgba(43,110,215,.15); --accent-glow-soft:rgba(43,110,215,.22);  /* 示例药丸浅光晕 */
}
*{box-sizing:border-box} html,body{margin:0}
body{font-family:"Inter",-apple-system,"Segoe UI","Microsoft YaHei","PingFang SC",sans-serif;color:var(--ink);background:var(--bg);line-height:1.6;-webkit-font-smoothing:antialiased}
/* ── 模块底色: 同一个窗口里切换两个产品, 底色差一点 = 一眼看出"我在哪"(2026-08-28) ─────
   ★只改 --bg 一个令牌, **不动 --brand 家族**: 品牌蓝是两个产品共用的身份色, 换了它
     按钮/链接/焦点环/所有 chip 会跟着变 —— 那不是"背景有点区别", 是换了张皮。
   ★工资侧为什么取淡紫灰, 而不是金色(fa-coins 的直觉配色)或绿色: 本仓的语义色已经占掉
     蓝(品牌)/绿(通过)/黄(告警)/红(错误) 四个色相, 而工资工作台上最要紧的信号恰恰是
     黄「⚠N」与绿「✓0」两种格子 —— 底色一偏暖或偏绿, 先被吃掉的就是这两个信号的辨识度。
     紫是这套调色板里唯一没被语义占用的色相, 且饱和度压到接近中性灰, 不抢内容。
   ★实测(对 #f0f4f8): ΔE≈5.0(并排一眼分得开), L* 96.0→94.8(不至于显得"暗掉/失效"),
     --muted 小字对比度 4.98→4.82, 仍过 AA 4.5 —— 适老底线, 同本文件 --warn-text 那条。
     取值改动请连同 tests/rw_ui.py ⑰ 一起看: 那里按同一套算式回查对比度, 调暗了会红。
   ★挂在 body[data-mod] 上: switchModule 早就在写 body.dataset.mod(app.js), 零新增 JS。
     首屏还没切过模块时没有这个属性 → 落回 :root 的人事底色, 与改动前逐像素相同
     (网页版只有人事一个模块, 因此完全不受影响)。 */
body[data-mod="rw"]{--bg:#f3eef9;
  --accent:#7c4dda; --accent-d:#6a3fbf; --accent-dd:#452394;
  --accent-soft:#f1eafe;
  --accent-shadow:rgba(124,77,218,.5); --accent-shadow-h:rgba(124,77,218,.55);
  /* ★这一族必须与 :root 的 accent 族**逐个同名**: 少覆盖一个, 那一处就在紫底上留一块蓝,
     而这种"漏一处"肉眼极难数清 —— 由 rw_ui ㉑ 逐名对账(两边名字集合必须相等)。 */
  --accent-ring:rgba(124,77,218,.45);
  --accent-ring-soft:rgba(124,77,218,.12);
  --accent-glow:rgba(124,77,218,.3);
  --accent-glow-strong:rgba(124,77,218,.6);
  --accent-wash:#fbf8ff; --accent-wash2:#f9f5ff;
  --accent-tint:#f2ebfe; --accent-tint2:#f4eeff;
  --accent-ghost:#f7f3fb;
  --accent-line:#ddcdf7; --accent-line2:#e0d3f5;
  --accent-line3:#e2d5f8; --accent-line4:#e3d7f8;
  --accent-ink:#5a2ba8;
  --accent-lite:#a07af0; --accent-lite2:#8f5ee8;
  --accent-glow-faint:rgba(124,77,218,.15); --accent-glow-soft:rgba(124,77,218,.22);
  /* 焦点环是令牌套令牌: 这里换过 --accent-ring 之后, input:focus / .minidrop:focus-visible 自动跟上 */
  --focus-ring:0 0 0 3px var(--accent-ring)}
a{color:var(--accent);text-decoration:none} a:hover{text-decoration:underline}
.wrap{max-width:1000px;margin:0 auto;padding:0 18px}
.muted{color:var(--muted)} .small{font-size:13px}
.hide{display:none} .hidden{display:none !important}
/* ★[hidden] 必须真的隐藏(2026-08-26 集成期实测的三处静默失效):
   浏览器 UA 里的 `[hidden]{display:none}` 优先级只有 (0,1,0) 且属 UA 源, 任何作者规则
   一旦给同一元素写了 display 就把它压掉 —— 于是
     ① `.modtabs{display:flex}` ⇒ 网页版给 .modtabs 加 hidden 后**页签照样显示**(工资模块本只在桌面版有);
     ② `.lic-state{display:flex}` ⇒ #licState / #gzLicState 首屏空着也占一条灰底边框条(主按钮上移后正在第一屏最显眼处);
     ③ #gzWhyDisabled 的 hidden 同理失效(眼下靠 :empty 兜住, 属巧合而非设计)。
   这是全站一条归一化规则: 只影响"作者已经声明要隐藏"的元素, 不改任何显示态排版。 */
[hidden]{display:none !important}

/* ── 表单控件统一焦点环(Gwy: input-field:focus) ── */
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--accent) !important;box-shadow:var(--focus-ring)}
button:disabled,button[disabled]{opacity:.55;cursor:not-allowed;box-shadow:none;transform:none}

/* ── 首启加载屏(照搬 Gwy #app-loader: 接住原生闪屏之后、页面渲染前的白窗期；仅桌面模式经内联脚本点亮) ── */
#app-loader{position:fixed;inset:0;z-index:99999;display:none;flex-direction:column;align-items:center;justify-content:center;gap:14px;background:var(--bg);transition:opacity .4s ease}
#app-loader.on{display:flex}
#app-loader.fade{opacity:0;pointer-events:none}
#app-loader .al-logo{width:96px;height:96px;border-radius:24px;animation:al-bounce 1.1s ease-in-out infinite;box-shadow:0 12px 30px -12px rgba(43,110,215,.5)}
#app-loader .al-text{color:var(--brand);font-size:15px;font-weight:600;letter-spacing:.5px}
#app-loader .al-bar{width:140px;height:4px;border-radius:2px;background:#dce6f5;overflow:hidden}
#app-loader .al-bar>span{display:block;width:40%;height:100%;border-radius:2px;background:var(--brand);animation:al-slide 1.1s ease-in-out infinite}
@keyframes al-bounce{0%,100%{transform:translateY(0)}50%{transform:translateY(-10px)}}
@keyframes al-slide{0%{transform:translateX(-100%)}100%{transform:translateX(350%)}}

/* ── Toast 浮提示(对齐 Gwy: 右上滑入·FA分类图标·自动消失) ── */
#toastWrap{position:fixed;top:16px;right:16px;z-index:9999;display:flex;flex-direction:column;gap:8px;pointer-events:none}
.toast{display:flex;align-items:flex-start;gap:8px;background:#fff;border:1px solid var(--line);border-radius:10px;padding:11px 14px;min-width:200px;max-width:380px;font-size:14px;color:var(--ink);
  box-shadow:0 10px 26px -12px rgba(0,30,60,.35);border-left:4px solid var(--accent);
  opacity:0;transform:translateX(18px);transition:opacity .28s,transform .28s}
.toast.show{opacity:1;transform:translateX(0)}
.toast i{font-size:15px;margin-top:2px;color:var(--accent);flex:0 0 auto}
/* toast 语义类用 t- 前缀, 避免与 .err/.warnbox 等通用工具类串扰 */
.toast.t-ok{border-left-color:var(--ok)} .toast.t-ok i{color:var(--ok)}
.toast.t-err{border-left-color:var(--err)} .toast.t-err i{color:var(--err)}
.toast.t-warn{border-left-color:var(--warn)} .toast.t-warn i{color:var(--warn)}
.toast b{font-weight:600}

/* ── 顶部进度带(对齐 Gwy progress-band: 轨道+进度+文案; 支持不确定/百分比两态) ── */
#progBand{position:fixed;top:0;left:0;right:0;z-index:9998;display:none;pointer-events:none}
#progBand.on{display:block}
/* ★2026-09-06 加粗 4→6px: 在线版每个动作都要把整份花名册重新脱敏、上传、等服务端算完再回来,
   比桌面版慢一个数量级, 而提示强度一直是照搬桌面版的(站长: "网页版本来就慢, 所以提示很重要")。 */
#progBand .track{height:6px;background:rgba(220,230,245,.9);overflow:hidden}
#progBand .bar{height:100%;width:0;border-radius:0 2px 2px 0;background:linear-gradient(90deg,var(--accent),var(--accent-lite));transition:width .25s ease}
#progBand.indet .bar{width:40%;transition:none;animation:progSlide 1.1s ease-in-out infinite}
/* ★top 8→66→94px。2026-08-28: 标签原本居中在 top:8px, 与放进 .nav 正中的模块页签**正面相撞**
   (实测截图: 自动核对期间把「PS人事年报」整个盖住、还压掉半个「RW工资年报」), 于是挪到 66px。
   ★2026-09-06 再挪到 94px: 那次注释写的是「.nav 高 58px, 66px 正好贴在它下沿」——**这个数已经过期了**。
     本次目视实测 .nav 高 **82px**、模块页签占 Y 38–70, 而标签 top=66 ⇒ 早就压在页签上了(只是标签小、
     重叠少, 没人注意); 这次把标签加大后当场显形。94px 落在 nav 下沿(82)之下, 留 12px 余量。
   ★教训: 注释里记的**布局常数会过期**, 而没有任何断言看得见它 —— 版式数字只有把屏幕量一遍才算数,
     照抄上一版注释里的数字等于把过期的前提当依据(同类见姊妹仓记忆 nianbao-ui-must-look-at-screen)。
   页面滚动后标签仍浮在视口 94px 处, 照样看得见。 */
/* ★2026-09-06 同批加大: 12.5→14.5px 字、padding 4/14→8/20、阴影加重、描边改用品牌色。
   ★top 仍是 66px —— 上面那段说的撞车判据没变(.nav 高 58px), 加大的是标签自身尺寸, 不动落点;
     改完用 ui_preview 复看过一次, 没有重新压住模块页签。 */
#progBand .plabel{position:absolute;top:94px;left:50%;transform:translateX(-50%);background:#fff;border:1px solid var(--accent);border-radius:22px;
  box-shadow:0 8px 24px -8px rgba(0,30,60,.42);color:#1d3f63;font-size:14.5px;font-weight:600;padding:8px 20px;white-space:nowrap;display:none}
#progBand.labeled .plabel{display:block}
#progBand .plabel i{color:var(--accent);margin-right:5px}
@keyframes progSlide{0%{margin-left:-40%}100%{margin-left:100%}}

/* ── 新手提示横幅(白卡+品牌左边框; 首启显示·可收起/不再提示) ── */
.guide-banner{display:flex;align-items:center;flex-wrap:wrap;gap:8px 14px;
  background:#fff;border:1px solid var(--line);border-left:4px solid var(--accent);
  border-radius:var(--radius);box-shadow:var(--shadow);padding:12px 18px;margin:6px 0 0;font-size:14px;color:var(--ink)}
.guide-banner.hide{display:none}
.guide-lead{font-weight:700;color:var(--accent)} .guide-lead i{margin-right:4px}
.guide-banner .gstep{color:var(--ink)} .guide-banner .gstep b{color:var(--accent);font-size:15px;margin-right:2px;font-weight:800}
.guide-banner .garrow{color:#c2cfe0;font-size:13px}
.guide-actions{margin-left:auto;display:flex;gap:8px;align-items:center}
.guide-close{background:var(--accent);color:#fff;border:0;border-radius:8px;padding:5px 13px;font-size:12.5px;cursor:pointer;transition:.15s}
.guide-close:hover{background:var(--accent-d)}
.guide-close:active{transform:translateY(1px)}
.guide-close.ghost{background:#eef2f7;color:var(--muted)} .guide-close.ghost:hover{background:#e2e8f1}
/* 修UI评审P2: "不再提示"原为实心主色=冷启动首屏最醒目按钮(诱导永久关引导), 降为 ghost+边框仍可发现但不抢强调色 */
.guide-close.gc-perm{border:1px solid #d3dcea;color:var(--ink-2)}

/* ── 顶栏 ── */
.nav{background:#fff;border-bottom:1px solid var(--line)}
.nav .wrap{display:flex;align-items:center;justify-content:space-between;height:58px}
.logo{font-weight:800;font-size:18px;color:var(--ink);display:inline-flex;align-items:center;gap:9px} .logo b{color:var(--brand)}
.brand-logo{width:32px;height:32px;border-radius:8px;flex:0 0 auto}
.nav .ver{font-size:12px;color:var(--muted);margin-left:8px;font-weight:500}
/* ── 模块切换 tab(工资年报模块, 2026-08-26) ──
   ★只加容器的排版, 按钮本身复用 .navbtn / .navbtn.on ——
   零新增按钮样式 = 自动继承 hover/active/焦点环/620px 折行/大字号(bigfont)。
   .nav .wrap 是 space-between, 插入第三个子元素后三段自然分布; 窄屏靠既有 .navbtn 折行规则收敛。
   新代码用 canonical 令牌(--primary/--border), 不用历史别名(--brand/--line)。 */
.modtabs{display:flex;gap:4px;align-items:center;flex-wrap:wrap}
.modtabs .modtab{font-weight:600}
.modtabs .modtab:not(.on){border:1px solid var(--border)}
@media (max-width:620px){ .modtabs{order:3;width:100%;justify-content:center;padding-bottom:6px} }
.navactions{display:flex;gap:2px;align-items:center}
.navbtn{display:inline-flex;align-items:center;gap:6px;font-size:13.5px;color:#4a5a70;background:transparent;border:0;border-radius:8px;padding:7px 11px;cursor:pointer;text-decoration:none;transition:.15s;white-space:nowrap}
.navbtn:hover{background:var(--accent-soft);color:var(--accent);text-decoration:none}
.navbtn:active{transform:translateY(1px)}
.navbtn i{font-size:13px}

/* ── 英雄区 ── */
.hero{background:linear-gradient(160deg,#eaf2ff 0%,#f5f7fb 60%);padding:54px 0 36px}
.hero h1{font-size:34px;line-height:1.25;margin:0 0 14px;letter-spacing:.5px}
.hero h1 .hl{color:var(--brand)}
.hero p.lead{font-size:17px;color:#445;max-width:680px;margin:0 0 22px}
.badges{margin-top:20px;display:flex;gap:20px;flex-wrap:wrap;color:#556;font-size:14px}
.badges span:before{content:"✓ ";color:var(--ok);font-weight:700}

/* ── 卡片 ── */
.card{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);box-shadow:var(--shadow);padding:22px;margin:18px 0}
.card h2{font-size:19px;margin:0 0 4px} .card h3{font-size:16px;margin:14px 0 6px}
.card h2 i{color:var(--accent);font-size:17px;margin-right:4px}
.card.acc-ok{border-left:4px solid var(--ok)}
.card.acc-brand{border-left:4px solid var(--accent)}
.row{display:flex;gap:18px;flex-wrap:wrap}.col{flex:1;min-width:300px}

/* ── 结果/提示语义色(规则: 橙=待确认/建议, 红=操作失败) ── */
.big{font-size:30px;font-weight:800;color:var(--ok)}
.recap{color:var(--muted);font-size:14px;margin-top:4px}
.warnbox{background:var(--warnbg);border-left:3px solid var(--warn);color:#7a5200;padding:9px 12px;border-radius:6px;margin:6px 0;font-size:14px}
.errbox{background:var(--errbg);border-left:3px solid var(--err);color:#8c2f28;padding:9px 12px;border-radius:6px;margin:6px 0;font-size:14px}
/* .manualbox —— 「本工具生成不了，请你去官方系统手工补填这几张表」（2026-09-02）。
   刻意与 .warnbox 分开：那是"出错了/有风险"的黄，这是"还有一步在别处"的中性蓝。
   两者语气必须能一眼分开 —— 把待办渲染成告警，用户会以为是我们出了问题；
   把待办渲染成灰色小字（此前折进「为什么不用填」抽屉的做法），用户根本看不见。 */
.manualbox{background:var(--infobg,#eef4fb);border-left:3px solid var(--primary,#2f6fd0);color:var(--ink-2,#3d4d66);
  padding:9px 12px;border-radius:6px;margin:6px 0;font-size:14px}
.manualbox>.k{color:var(--muted)}
.manualbox summary{cursor:pointer;color:var(--primary);min-height:30px;padding:5px 0;list-style:revert}
.err{color:var(--err)}
.wtx{color:var(--warn-text)}

/* ── 工作台 ── */
.minpath{background:var(--accent-soft);border:1px solid var(--accent-line);color:var(--accent-ink);border-radius:10px;padding:10px 13px;font-size:14px;line-height:1.65;margin:2px 0 14px}
.bench{display:flex;gap:18px;flex-wrap:wrap;align-items:flex-start}
.bench-in{flex:1.3;min-width:320px} .bench-st{flex:1;min-width:280px;position:sticky;top:14px}
@media (max-height:720px){ .bench-st{position:static} }   /* clamp小窗(1366x768@125%→内视口约630px)右栏比视口高: sticky让保存钮永沉折叠线下, 短屏改随页滚动(2026-07-10评估#14) */
.slot{border:1px solid var(--line);border-radius:var(--radius-sm);padding:14px;margin-bottom:12px;background:#fff}
.slot .hd{font-weight:600;font-size:15px}
.slot .req{background:var(--accent-soft);color:var(--accent-d);font-size:12px;padding:1px 7px;border-radius:20px;margin-left:6px}
.slot .opt{background:#eef0f4;color:#69748a;font-size:12px;padding:1px 7px;border-radius:20px;margin-left:6px}
.slot .unl{font-size:12.5px;color:var(--ink-2);margin-top:4px}   /* 说明文字用中性色, 不用链接蓝(修UI评审P2: 蓝=可点是最强心智, 静态蓝字诱导误点) */
.opt-details{margin-top:6px;border:1px solid var(--line);border-radius:var(--radius-sm);padding:8px 12px}
.sum-link{cursor:pointer;font-weight:600;color:var(--accent)}
.sum-link.wtx{color:var(--warn-text)}   /* 警示型可折叠标题(N项按默认推算)用警示色, 不被 .sum-link 蓝压掉(修UI评审P3) */
.minidrop{border:1.5px dashed var(--accent);border-radius:8px;padding:14px;text-align:center;background:var(--accent-wash);cursor:pointer;margin-top:8px;font-size:14px;color:#456;transition:background .15s,border-color .15s}
.minidrop:hover{background:var(--accent-soft)}
.minidrop:focus-visible{outline:none;box-shadow:var(--focus-ring);border-color:var(--accent)}
.minidrop.dragover{background:var(--accent-soft);border-style:solid;border-color:var(--accent-d)}
.minidrop.is-busy{pointer-events:none;opacity:.6}
.minidrop i{color:var(--accent);margin-right:5px}
.slot .stat{font-size:14px;margin-top:8px;color:var(--ink-2)}
.slot .stat.ok{color:var(--ok)} .slot .stat.err{color:var(--err)}
/* 「还差这一格」槽位描边: 主按钮灰着的时候, 左栏必须有一处指出"缺的是这一格", 否则用户只会
   反复点那个没反应的灰按钮。用 --warn 家族(不是红) —— 这不是错误, 是还没填。
   ★类名两写是跨施工线的兜底: 挂 class 的 JS 在另一条线上, .need / .warn 哪个名字落地都命中同一条规则。
   用描边+浅底而非整块 opacity/变色, 槽位里的输入框仍保持常态可读(A12)。 */
.slot.need,.slot.warn{border-color:var(--warn);background:#fffdf7;box-shadow:0 0 0 3px rgba(178,125,32,.16)}
.slot.need>.hd,.slot.warn>.hd{color:var(--warn-text)}
.slot-links{font-size:13px;color:var(--muted);margin-top:9px;line-height:1.7}
.slot-links a{font-weight:600} .slot-links i{font-size:12px}
/* ── 命中区 ≥34px(WCAG 2.5.5 + 适老手抖): 实测这几处只有 15/18/19/21/26px 高, 而"下载极简模板"
   "用示例数据体验""N 项按默认推算/待核"恰是卡住时唯一的出路, 点不中=没有出路。
   ★用 inline-block 而不是 block(与原提案有意分叉, 两个理由):
     ① 这些链接都长在句子中间(「没有花名册？可先[用示例数据体验]（顶部也有入口）。」),
        block 会把一句话拆成三行, 读起来像三条独立提示;
     ② block 后链接横占满整栏, 右侧一大片空白也能点出"下载模板/替换数据", 是新造的误点源。
   summary 不写 display —— 原生就是 list-item, 一改成 block 折叠三角就没了(那是"这里能点开"的唯一提示)。 */
.slot-links a,.ls-link{display:inline-block;padding:7px 0;min-height:34px}
.sum-link,.import-guide>summary{padding:7px 0;min-height:34px}
/* ── 上传槽指引退场(2026-08-30 目视工装实测) ─────────────────────────────────
   实测: ①在职花名册格在「✓ 已识别 258 人」之后, 屏上 233 字 / 397px 里有 170 字 / 207px
   ——占该格 52% 的高度——仍是**上传前**才需要的话: 拖放提示、隐私声明、「没有花名册？」、
   下载模板 +「附件3 也可直接传」。工资①格同样, 225px / 389px = 58%。
   其中「没有花名册？可先用示例数据体验」与紧挨着的「✓ 已识别 258 人（示例花名册.xlsx）」
   是**同屏自相矛盾**(铁律7 第④类): 两块各自的断言都绿, 门禁与 node 垫片结构上看不见。
   ★三条施工纪律:
     ① 收的是**显示**不是节点 —— .slot-links 里的「下载极简模板」被 rw_ui ⑩ 的 PARITY
        钉着必须在位, 删节点会当场打红, 而且用户"想换个模板重填"时还得能找回来;
     ② 拖放区**不隐藏**, 只压成一行「换一份…」—— 传完之后用户最可能的下一个动作就是换一份,
        隐藏它等于逼人先点「移除」;
     ③ 隐私那句**不隐藏**, 只由两行缩成一行 —— 它同时是隐私承诺和转化卖点,
        "看着清爽"不该由它买单。
   ★.loaded 由 JS 挂在两侧唯一必经的同步点(_syncGenBtn / gzSyncBtn), 判据是"这一格的文件
     读成了没有", 不是"选没选过文件": 解析失败时指引必须留着, 那正是用户需要模板的时候。 */
.slot .md-b,.slot .pv-b{display:none}
.slot.loaded .pre-only{display:none}
.slot.loaded .md-a,.slot.loaded .pv-a{display:none}
.slot.loaded .md-b,.slot.loaded .pv-b{display:inline}
/* 压成一行: 去掉虚线"这里是个大靶子"的招徕感, 退为常规可点条。
   ★只压 padding、**不动 font-size**: `body.bigfont .minidrop{font-size:15px}` 是 (0,2,1),
     这条是 (0,3,0) 会压过它 —— 那就等于"传完花名册后大字号对这一行失效"(适老底线, 2026-07-10评估#28)。
   ★:not(.dragover) 同理: 不排除的话本条会盖掉 .minidrop.dragover 的实线高亮边(0,2,0),
     拖文件到这一行上时没有任何"松手就收"的反馈。 */
.slot.loaded .minidrop:not(.dragover){padding:7px 12px;margin-top:6px;border-style:solid;border-color:var(--line);background:var(--panel)}
.slot.loaded .minidrop:not(.dragover):hover{background:var(--accent-soft);border-color:var(--accent)}
.fields{display:grid;grid-template-columns:1fr 1fr;gap:8px 12px;margin-top:8px}
.fields label{font-size:12px;color:#556;margin:4px 0 0;display:block} .fields .full{grid-column:1/3}
.fields input,.fields select{width:100%;padding:7px;border:1px solid #ccd7e6;border-radius:6px;transition:border-color .15s,box-shadow .15s}
.lygrid{display:flex;flex-wrap:wrap;gap:6px;margin-top:7px}
.lygrid label{font-size:12px;color:#556;display:flex;align-items:center;gap:3px;margin:0}
.gi{width:46px;padding:5px;border:1px solid #ccd7e6;border-radius:5px;text-align:center}

/* 右侧: 各表状态网格 */
.statbox{background:#fff;border:1px solid var(--line);border-radius:12px;padding:16px;box-shadow:var(--shadow)}
.statbox h3{margin:0 0 4px;font-size:16px}
/* ── 全过之后把逐表网格收成一行(2026-08-30 目视实测) ─────────────────────────────
   实测目标机 984×664: 状态格 481px(人事)/566px(工资) —— 正好一整屏 —— 横在主按钮与
   【保存报表】之间, 把保存钮压到第 2/3 屏。而"已生成 + 全绿"之后, 那 18/20 个绿格的信息量
   就等于标题那一句话。⇒ 只在这一态收起, 标题右侧留「展开逐表 ›」。
   ★有黄/橙格时**绝不收**: 那时"哪张表还差什么"是屏上最要紧的信息(见 _foldStatBox 判据)。
   ★未预览时也不收: 那 13-20 个格子是用户第一次看这屏时**唯一**的信息(2026-08-26 已有定论)。 */
.statbox.folded>.k,.statbox.folded .chips,.statbox.folded .more-note,.statbox.folded .skip-why{display:none}
/* 折叠态标题整行可点(2026-09-21): 展开入口原来只有右侧那个小字按钮，目标太小 */
.statbox h3.fold-h{cursor:pointer}
.statbox h3.fold-h:hover .fold-t{text-decoration:underline}
.statbox h3 .fold-t{float:right;font-size:12.5px;font-weight:400;color:var(--muted);cursor:pointer;
  background:none;border:0;padding:4px 0 4px 12px;line-height:1.4}
.statbox h3 .fold-t:hover{color:var(--accent);text-decoration:underline}
.statbox h3 .fold-t:focus-visible{outline:none;box-shadow:var(--focus-ring);border-radius:4px}
body.bigfont .statbox h3 .fold-t{font-size:14px}   /* 适老白名单: 这是唯一能把逐表看回来的入口 */
.chips{display:grid;grid-template-columns:repeat(auto-fill,minmax(78px,1fr));gap:8px;margin-top:10px}
.chip{border:1px solid var(--line);border-radius:8px;padding:7px 6px;text-align:center;font-size:12px;background:#fafbfd;transition:border-color .15s,box-shadow .15s}
.chip.on{background:var(--okbg);border-color:#bfe6cf}
.chip.warn{background:var(--warnbg);border-color:#f0d9a8}
.chip.warn .ss{color:var(--warn-text);font-weight:700}   /* ⚠N 关键数字: 用达 AA 的文字色(修UI评审P2) */
.chip.dep{background:#fdf0e1;border-color:#e6a765}   /* 橙·根因表(缺输入未生成): 与 .warn(黄·连带待补) 分型 */
.chip.dep .ss{color:#9c4a12;font-weight:700;font-size:12px}   /* 11→12px: 常态字号适老底线(2026-07-10评估#28); #b45817 对 .dep 底色 #fdf0e1 仅 4.31:1 未达 AA → 加深到 #9c4a12(5.5:1) */
/* .auto = 系统按层次自动汇总、**没有对应填写区**的表(工资侧 RW03.11/03.12)。单独一个修饰类,
   是因为 .chip:not(.on) 会给所有非绿格子可点手型+hover 高亮 —— 自动汇总格点了不该有反应,
   带手型就是假可点语义。淡化也写在这里: .chip.off 的淡化只挂在 .desktop 下, 别依赖它。
   ★opacity → 只淡背景(2026-08-26): 整块 opacity 把文字一起冲淡(实测合成后约 3.3:1), 与 A12/
   .yb-opt.soon 已偿还过的那条债同型。且 :not(.warn) 是必须的 —— 自动汇总表自检未过时会渲成
   .warn 黄格(那正是"错在哪"的唯一线索), 绝不能被 auto 的淡化压回灰色。 */
.chip.off.auto:not(.warn){background:#fbfcfe;border-color:#eef2f7}
.chip.off.auto{cursor:default}
.chip.off.auto:hover{border-color:var(--border);box-shadow:none}
.chip:not(.on){cursor:pointer}
.chip:not(.on):hover{border-color:var(--accent);box-shadow:0 2px 8px -4px rgba(0,30,60,.25)}
/* 可点状态格(带 role=button/tabindex 的那些)键盘聚焦要看得见: 与 .minidrop:focus-visible 同一套环。
   .auto 格没有 tabindex, 天然不会命中, 无需再排除(不给它伪可点语义, 见上方 .auto 注释)。 */
.chip:focus-visible{outline:none;box-shadow:var(--focus-ring);border-color:var(--primary)}
.chip .cc{font-weight:700;display:block} .chip .ss{font-size:13px}
.more-note{grid-column:1/-1;font-size:12px;color:var(--muted);margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);line-height:1.5}

/* 生成结果卡(右侧) */
.gen-card{border-left:4px solid var(--ok);padding:14px;margin:0}
.free-export{margin:12px 0 8px}
.free-export .k{margin-top:6px;overflow-wrap:anywhere}
.free-export + .gen{background:transparent;color:var(--accent);border:1px solid var(--border);box-shadow:none}
.gen-sum{font-size:16px;line-height:1.5;font-weight:800;color:var(--ok)}
.gen-gaps{margin-top:6px}
/* 右栏未生成时的空态占位(填住 sticky 右栏, 不留大片白; 生成后被 .gen-card 替换) */
/* 排版(2026-08-31 用户实报"这个框里的文字很乱"): 原来正文是**一整句 40 字**塞进 384px 的居中框,
   必然断成"满满一行 + 半行", 两行左右都不齐 —— 居中排版最忌讳的形状。三件事一起改:
   ① 正文改成一行一句(见 js 的 _phBox), 语义断点 = 换行点;
   ② .k 限宽 19em 并 text-wrap:balance —— 万一还是要折, 也折成上下均分的两行(老内核不认这属性,
      忽略即可, 限宽那一半照样生效);
   ③ 正文 12px → 13px、行距 1.6 → 1.8: 这是右栏第二显眼的框, 12px 对中老年用户偏小。 */
.gen-ph{border:1.5px dashed var(--line);border-radius:12px;padding:18px 16px 20px;text-align:center;background:#fbfcfe;line-height:1.8}
.gen-ph i{font-size:22px;color:#cbd5e2;display:block;margin-bottom:9px}
.gen-ph .ph-t{font-size:15px;color:var(--ink-2);font-weight:700;margin-bottom:5px;line-height:1.45}
.gen-ph .k{font-size:13px;max-width:19em;margin:0 auto;text-wrap:balance}
/* 框里的 <b> 一律是"一个有名字的东西"(要传的文件 / 要点的按钮)。nowrap 是实测补的: 19em 一限宽,
   「预览结果」会被从中间劈成"点「预览 / 结果」" —— 专有名词断行比原来那句长句更难读。 */
.gen-ph .k b{color:var(--ink-2);white-space:nowrap}

/* 必填判断器 */
.reqdone{background:var(--okbg);border-radius:8px;padding:10px 12px;font-size:14px;margin:8px 0 12px;line-height:1.6}
.req-toggle{margin:10px 0;padding:10px 12px;background:#f6f8fc;border-radius:8px;font-size:14px}
.tblwrap{overflow-x:auto}
.reqtbl{font-size:13px;width:100%} .reqtbl th{background:#f3f6fc;text-align:left;padding:8px 10px;white-space:nowrap}
.reqtbl td{text-align:left;padding:8px 10px;vertical-align:top;line-height:1.6}
.reqtbl .ok2{color:var(--ok);white-space:nowrap} .reqtbl .warn2{color:#7a5200}

/* ── 按钮 ── */
.gen{background:linear-gradient(135deg,var(--accent),var(--accent-d));color:#fff;border:0;border-radius:30px;padding:15px 44px;font-size:17px;font-weight:700;cursor:pointer;box-shadow:0 6px 18px -4px var(--accent-shadow);transition:.15s}
.gen:hover{background:linear-gradient(135deg,var(--accent-d),var(--accent-dd));box-shadow:0 8px 22px -4px var(--accent-shadow-h);transform:translateY(-1px)}
.gen:active{transform:translateY(1px)}
/* 禁用态对比度(2026-07-10评估#13): 全局 button:disabled{opacity:.55} 把白字#aab底冲淡到约1.5:1, 首屏主CTA默认即禁用、
   老年用户读不清也分不出"未就绪/已完成"两种灰——.gen 恢复 opacity:1, 未就绪用深字浅底(--ink-2 对 #dde4ee ≥4.5:1) */
.gen:disabled{background:#dde4ee;color:var(--ink-2);opacity:1;cursor:not-allowed;box-shadow:none;transform:none}
/* 完成态(各表已是最新): 肯定式绿描边, 与"未就绪"灰按钮明确区分——不是坏了/点不动, 是已完成; 绿字用 --ok-d(对 #eef9f2 约5:1达标) */
.gen.done:disabled{background:#eef9f2;color:var(--ok-d);border:1.5px solid #bfe6cf;opacity:1;cursor:default;box-shadow:none;transform:none}
.gen.done:disabled i{color:var(--ok-d)}
.gen i{margin-right:6px}
.gen.block{width:100%;padding:12px;font-size:15px;border-radius:12px}
.gen.sm{padding:11px 26px;font-size:15px}
.mainbar{margin-top:16px;text-align:center}
.mainbar .gen{padding:14px 44px;font-size:17px}
/* 主按钮下的"还差什么"常驻旁注: 灰按钮不能只是灰着 —— 这行字本身就是出路(点它=展开并聚焦到缺的那一格),
   所以要有手型和 ≥34px 命中区; JS 清空(ready)时靠 :empty 自动收掉, 不留一条空白占位。 */
#gzWhyDisabled,#psWhy{display:inline-block;cursor:pointer;padding:6px 2px;min-height:34px;font-weight:600}
#gzWhyDisabled:empty,#psWhy:empty{display:none}

/* ── 清空 / 移除 + 花名册预填标记(2026-08-26) ──────────────────────────────
   「传错了想重来」这条路原来是断的: 槽位只能被覆盖、撤不掉, 单位信息只能一格格手删。
   两级入口(对标微信/WPS 的「已选文件 ✕」+ 政务网办厅的「重填」):
     · 槽位级 .rm  = 只撤这一个文件, 其余不动;
     · 全局 .resetbtn = 回到冷启动态, **必须先确认且逐条列出会清掉什么**。
   .resetbtn 复用 .lic-btn.ghost 的配色(浅蓝底+主色字), 不新造强调色 —— 它是次要动作,
   绝不能在视觉上跟主按钮「预览结果」抢。 */
.slot .stat .rm{margin-left:8px;font-size:13px;font-weight:600;color:var(--muted);white-space:nowrap;display:inline-block;padding:5px 0;min-height:30px}
.slot .stat .rm:hover{color:var(--danger)}
.resetbtn{display:block;margin:0 auto 12px;background:var(--accent-ghost);color:var(--primary);border:1px solid var(--accent-line2);border-radius:30px;padding:8px 20px;font-size:13.5px;font-weight:600;cursor:pointer;min-height:34px;transition:.15s}
.resetbtn:hover{background:#e7effb}
.resetbtn:active{transform:translateY(1px)}
.resetbtn:focus-visible{outline:none;box-shadow:var(--focus-ring)}
.resetbtn i{margin-right:5px}
/* 预填来源标记, **三档分开**: read=低调灰(.k 同色), guess=既有警示色 .wtx。
   绝不新造颜色 —— guess 比 read 醒目这件事由 .wtx 与加粗承担。 */
.fr-note{font-size:12px;line-height:1.5;margin-top:3px}
.fr-note i{margin-right:3px}
/* 只读提示区(经费形式/表头年末人数…): 虚线框 = "供你核对, 不是要你填的格" */
.fr-hints{margin-top:10px;padding:8px 10px;border:1px dashed var(--border);border-radius:8px;background:#fbfcfe;line-height:1.6}
.fr-hint-hd{font-weight:600;color:var(--ink-2)}
.fr-hint-hd i{margin-right:4px;color:var(--primary)}
.fr-hint-row{margin-top:3px}

/* ── 模态标准件(对齐 Gwy modal-overlay/modal-card) ── */
.modal-overlay{position:fixed;inset:0;background:rgba(10,25,50,.4);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:1000}
.modal-card{position:relative;background:#fff;border-radius:14px;width:420px;max-width:92%;max-height:90vh;overflow-y:auto;padding:22px;box-shadow:var(--shadow-lg);border:1px solid var(--line);animation:modalFadeIn .2s ease}   /* max-height+滚动与 .lic-card 对齐: 1366x768@125% 小屏展开FAQ/大字号时顶底不再被裁(2026-07-10评估#2) */
.modal-title{font-weight:600;font-size:17px;margin-bottom:10px;color:#1a3a5e}
.modal-title i{color:var(--accent);margin-right:6px}
.modal-message{font-size:13.5px;color:#3f5575;margin-bottom:14px;line-height:1.7;text-align:left}
.modal-buttons{display:flex;gap:10px;justify-content:flex-end}
.modal-btn{padding:9px 22px;border-radius:30px;font-weight:600;font-size:14px;border:0;cursor:pointer;transition:all .15s;box-shadow:0 2px 6px rgba(0,0,0,.05)}
.modal-btn:active{transform:translateY(1px)}
.modal-btn-confirm{background:var(--accent);color:#fff}
.modal-btn-confirm:hover{background:var(--accent-d);box-shadow:0 4px 10px var(--accent-glow)}
.modal-btn-cancel{background:#f1f5f9;color:#2c4c6e}
.modal-btn-cancel:hover{background:#e2eaf3}
.modal-close{position:absolute;top:10px;right:10px;width:36px;height:36px;border-radius:50%;background:#f1f5f9;border:0;color:var(--muted);font-size:18px;line-height:1;cursor:pointer;transition:.15s}   /* 28→36px: 适老点击目标(2026-07-10评估#29; 有意与Gwy基线分叉, 双仓对齐时以此为准) */
.modal-close:hover{background:#e2e8f1;color:var(--ink)}
@keyframes modalFadeIn{from{opacity:0;transform:scale(.94)}to{opacity:1;transform:scale(1)}}

/* ── 授权/购买(自 app.js _injectLicCss 迁入并令牌化; 类名保持不变) ── */
.lic-bar{margin-left:auto;font-size:13px;display:flex;align-items:center;gap:6px}
.lic-ok{color:var(--ok);font-weight:700}
.lic-no{color:var(--warn-text);font-weight:600}
.lic-dot{display:inline-block;width:8px;height:8px;border-radius:50%;background:#f0a020;box-shadow:0 0 0 3px rgba(240,160,32,.18)}
.lic-trybtn{background:var(--accent-soft);color:var(--accent);border:1px solid var(--accent-line);border-radius:8px;padding:4px 11px;font-size:12.5px;cursor:pointer;font-weight:600}
.lic-trybtn:hover{background:#e2ecfb}
.lic-modal{position:fixed;inset:0;background:rgba(10,25,50,.4);backdrop-filter:blur(3px);display:flex;align-items:center;justify-content:center;z-index:1000}
.lic-card{position:relative;background:#fff;border-radius:14px;padding:24px;max-width:440px;width:92%;max-height:90vh;overflow-y:auto;box-shadow:var(--shadow-lg);text-align:center;animation:modalFadeIn .2s ease}
.lic-icon{width:52px;height:52px;margin:2px auto 12px;border-radius:50%;display:flex;align-items:center;justify-content:center;font-size:24px;color:#fff;background:linear-gradient(145deg,var(--accent-lite2),var(--accent));box-shadow:0 6px 14px -6px var(--accent-glow-strong)}
.lic-card h3{margin:0 0 2px;font-size:17px}
.lic-value{background:var(--accent-tint2);border:1px solid var(--accent-line3);border-radius:10px;padding:10px 12px;font-size:13px;color:#2c4c6e;line-height:1.65;margin:12px 0;text-align:left}
.lic-value b{color:var(--accent-d)}
.lic-box{border:1px solid var(--line);border-radius:10px;padding:11px 12px;margin:10px 0;text-align:left}
.lic-box.primary{border-color:var(--accent-line);background:var(--accent-wash)}
.lic-box-t{font-weight:600;font-size:13px;margin-bottom:6px;color:var(--ink)}
.lic-card label{display:block;margin:8px 0 0;font-size:12.5px;font-weight:600;color:#556}
.lic-card input,.lic-card textarea{width:100%;box-sizing:border-box;margin-top:4px;padding:8px;border:1px solid #ccd7e6;border-radius:8px;font-size:13px}
.lic-btn{width:100%;background:linear-gradient(135deg,var(--accent),var(--accent-d));color:#fff;border:0;border-radius:10px;padding:10px 0;font-size:14px;font-weight:600;cursor:pointer;margin-top:8px;transition:.15s}
.lic-btn:hover{background:var(--accent-d)}
.lic-btn:active{transform:translateY(1px)}
.lic-close{position:absolute;top:10px;right:10px;width:36px;height:36px;border-radius:50%;background:#f1f5f9;border:0;color:var(--muted);font-size:18px;line-height:1;cursor:pointer}   /* 28→36px: 适老点击目标, 轮询中X是唯一显式关闭途径(2026-07-10评估#29) */
.lic-close:hover{background:#e2e8f1}
.lic-trust{font-size:12px;color:var(--muted);margin-top:10px}
.lic-trust i{color:var(--ok);margin-right:3px}
.lic-stat{margin-top:8px;font-size:13px;min-height:16px}
.lic-offline{margin-top:8px;font-size:12px}
.lic-mc{font-family:Consolas,monospace;font-size:11px;width:100%;box-sizing:border-box}
#offMc{font-size:12px}   /* 机器码基值(原内联11px钉死, 内联还压掉bigfont放大——内联已删, 基值提12px; 2026-07-10评估#15/#28) */
.lic-btn.ghost{background:var(--accent-ghost);color:var(--accent);border:1px solid var(--accent-line2)}
.lic-btn.ghost:hover{background:#e7effb}
.np-tabs{display:flex;gap:6px;margin:12px 0 8px}
.np-tab{flex:1;padding:8px 0;border:1px solid var(--accent-line2);background:var(--accent-wash);color:#5a6b82;border-radius:9px;font-size:13px;font-weight:600;cursor:pointer}
.np-tab.on{background:linear-gradient(135deg,var(--accent),var(--accent-d));color:#fff;border-color:transparent}
.np-plans{display:flex;flex-direction:column;gap:7px;text-align:left}
.np-plan{display:flex;justify-content:space-between;align-items:center;border:1.5px solid var(--line);border-radius:10px;padding:10px 13px;cursor:pointer;transition:.12s}
.np-plan:hover{border-color:var(--accent-line);background:var(--accent-wash)}
.np-plan.sel{border-color:var(--accent);background:var(--accent-tint2);box-shadow:0 0 0 3px var(--accent-ring-soft)}
.np-plan.rec{border-color:var(--accent-line)}
.np-plan.dis{opacity:.5;cursor:not-allowed;background:#f5f6f8}
.np-name{font-size:13.5px;font-weight:600;color:var(--ink)}
.np-badge{font-size:10.5px;background:var(--accent);color:#fff;padding:1px 6px;border-radius:6px;margin-left:4px;vertical-align:middle}
.np-desc{font-size:11.5px;color:var(--muted);margin-top:2px}
.np-price{font-size:17px;font-weight:800;color:var(--accent-d);white-space:nowrap}
.np-price small{font-size:11px;font-weight:500;color:var(--muted)}
.np-coupon{width:100%;box-sizing:border-box;margin-top:10px;padding:9px;border:1px solid #ccd7e6;border-radius:8px;font-size:13px}
/* 优惠码折叠(默认收起, 不打断"立即解锁"冲动) */
.np-coupon-fold{margin-top:10px}
.np-coupon-fold>summary{cursor:pointer;font-size:12.5px;color:var(--accent);list-style:none;text-align:center}
.np-coupon-fold>summary::-webkit-details-marker{display:none}
.np-coupon-fold .np-coupon{margin-top:6px}
.np-agree{display:flex;align-items:flex-start;gap:7px;font-size:12px;color:#667;margin:9px 2px 2px;text-align:left;line-height:1.5;font-weight:400}
.np-agree a{color:var(--accent)}
.np-agree span{flex:1}
/* 复选框不被 .lic-card input 的 width:100% 撑成整行(修变形/移位到条款上方) */
.lic-card input[type=checkbox]{width:auto;flex:0 0 auto;margin:2px 0 0}
/* 解锁弹窗=订单/收据式(价格进合计行, 按钮干净) */
.order{border:1px solid var(--line,#e2eaf3);border-radius:10px;padding:8px 12px;margin:4px 0;background:#fbfdff}
.order .or{display:flex;justify-content:space-between;align-items:center;gap:10px;padding:5px 0;font-size:13.5px}
.order .or>span:first-child{color:var(--muted,#5a6a82);white-space:nowrap}
.order .or-inp{flex:1;max-width:62%;text-align:right;border:1px solid #ccd7e6;border-radius:6px;padding:5px 8px;font-size:13px;box-sizing:border-box}
.order .or-div{border-top:1px dashed var(--line,#e2eaf3);margin:3px 0}
.order .or-total{margin:4px -12px -8px;padding:9px 12px 10px;background:var(--accent-tint2);border-radius:0 0 9px 9px}
.order .or-total b{color:var(--accent);font-size:20px}
/* 购买弹窗"解锁后获得"权益条(把"花钱买到什么"讲清楚, 提升转化/信任) */
.buy-perks{display:flex;flex-wrap:wrap;justify-content:center;gap:6px 8px;margin:9px 0 6px}
.buy-perks span{font-size:12px;color:var(--accent-d);background:var(--accent-tint2);border:1px solid var(--accent-line3);border-radius:20px;padding:3px 10px;white-space:nowrap}
.buy-perks i{margin-right:4px;color:var(--accent)}
/* 购买视图(催付, 与"授权管理"分离; 弹窗更短、更聚焦) */
.lic-icon.buy{background:linear-gradient(145deg,var(--accent-lite2),var(--accent))}
.buy-hero{font-size:13.5px;line-height:1.6;color:var(--ink-2,#3d4d66);background:var(--accent-wash2);border-radius:10px;padding:10px 12px;margin:6px 0 4px;text-align:left}
.buy-price{text-align:center;font-size:15px;margin:12px 0 6px}
.buy-price .big{color:var(--accent);font-size:22px}
.buy-cta{font-size:16px!important;padding:13px 0!important;box-shadow:0 4px 14px var(--accent-glow)}
.buy-cta:hover{filter:brightness(1.06)}
.np-amount{font-size:15px;margin:8px 0 4px;color:var(--ink)}.np-amount b{color:var(--accent-d);font-size:19px}
.np-qr{width:180px;height:180px;margin:10px auto;border:2px solid var(--accent-line);border-radius:12px;display:flex;align-items:center;justify-content:center;background:var(--accent-wash);color:#8aa;font-size:12px;overflow:hidden}
.np-qr svg,.np-qr img{max-width:100%;max-height:100%}
/* 右上角授权状态芯片(三态, 点击→管理授权; 被动状态不催激活) */
.lic-chip{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border-radius:999px;font-size:13px;font-weight:600;cursor:pointer;border:1px solid var(--line);transition:.15s;white-space:nowrap}
.lic-chip:hover{box-shadow:0 2px 8px rgba(20,45,90,.1)}
.lic-chip.ok{color:#0fa968;background:#f0fbf6;border-color:#cdeeda}
.lic-chip.no{color:var(--muted,#7384a0);background:#f4f7fb}
.lic-chip.no i{font-size:8px}
.lic-chip.exp{color:#cb7a1f;background:#fff7ec;border-color:#f3dcbb}
/* 管理授权面板 */
.ms-status{display:flex;align-items:center;gap:8px;justify-content:center;padding:10px 12px;border-radius:10px;font-size:13.5px;margin:6px 0}
.ms-status.ok{color:#0fa968;background:#f0fbf6;font-weight:600}
.ms-status.no{color:var(--ink-2,#3d4d66);background:#f4f7fb}
.ms-buy{margin-top:8px}
.ms-price{font-size:15px;padding:10px 12px;background:var(--accent-tint2);border-radius:10px;text-align:center;margin-bottom:8px}
.ms-price b{color:var(--accent)}
.ms-contact{margin-top:12px;padding-top:12px;border-top:1px dashed var(--line);display:flex;flex-direction:column;align-items:center;gap:8px}
.ms-contact-t{font-size:13px;font-weight:600;color:var(--ink-2,#3d4d66)}
/* 大字号/适老(中老年/低分屏): 放大主要文字, 不改布局结构 */
.navbtn.on{background:var(--accent);color:#fff}
body.bigfont{font-size:16px}
body.bigfont .k,body.bigfont .sub,body.bigfont .recap{font-size:13.5px}
body.bigfont label,body.bigfont input,body.bigfont select,body.bigfont textarea,body.bigfont .chip,body.bigfont td,body.bigfont th,body.bigfont .navbtn,body.bigfont .minidrop{font-size:15px}
body.bigfont .gen,body.bigfont .lic-btn,body.bigfont .buy-cta{font-size:16px}
body.bigfont h1{font-size:36px} body.bigfont h2{font-size:22px} body.bigfont h3{font-size:18px}   /* h1 只增不减(修UI评审P2: 旧26px反把网页版hero 34→26缩小) */
body.bigfont .lead,body.bigfont .minpath,body.bigfont .buy-hero,body.bigfont .health .k,body.bigfont .ls-txt{font-size:18px}
/* 补齐大字号白名单(修UI评审P2: 弹窗正文/toast/上传反馈/年度选择/引导/示例按钮 此前漏放大——恰是视力最弱用户看付款/抄码的关键文字) */
body.bigfont .modal-message,body.bigfont .toast,body.bigfont .slot .stat,body.bigfont .guide-banner,body.bigfont .samplebtn,body.bigfont .slot-links,body.bigfont .gen-ph .ph-t,body.bigfont .yb-hint{font-size:15px}
body.bigfont .yb-opt{font-size:15px} body.bigfont .yb-opt small{font-size:12.5px}
body.bigfont .order .or,body.bigfont .order .or-inp,body.bigfont .np-agree,body.bigfont .lic-value,body.bigfont .buy-perks{font-size:15px}
body.bigfont .lic-mc,body.bigfont #offMc,body.bigfont .lic-card textarea,body.bigfont .lic-card input{font-size:14px}
/* 右栏占位框(2026-08-31): 它是"这一步该干什么"的唯一说明, 正文此前落在通用 .k 的 13.5px 上,
   比同框标题还小一截; 标题也一并从 15 提到 16.5, 保住层级差。 */
body.bigfont .gen-ph .ph-t{font-size:16.5px} body.bigfont .gen-ph .k{font-size:15px}
/* 白名单补漏(2026-07-10评估#15): 各表✓0/⚠N关键数字·槽位"传了能算什么"说明·支付/激活状态反馈·导入指引/网格注释——恰是老花用户最需要的几处 */
body.bigfont .chip .ss,body.bigfont .chip.dep .ss,body.bigfont .slot .unl,body.bigfont .lic-stat,body.bigfont .import-guide>summary,body.bigfont .cmp-entry,body.bigfont .more-note{font-size:15px}
/* 白名单补漏(2026-08-26 清空/预填批次): 「已从花名册读取 / 推测，请核对」这两个标记与「✕ 移除」
   都是**决定要不要信这一格**的字, 看不清等于没有; 「清空重来」是误操作后唯一的退路。 */
body.bigfont .fr-note,body.bigfont .fr-hints,body.bigfont .resetbtn,body.bigfont .slot .stat .rm{font-size:15px}
/* 白名单补漏(2026-08-26 工资侧上线后复验): 三类**黄红框告警**此前一个字都不放大——用户按"大字号"正是因为看不清,
   而看不清的代价最高的恰恰是"你拿错年度的表在对""这一步失败了"。.health .hd 另修层级倒挂:
   同一块里说明文字 .health .k 已放到 18px, 主结论 .hd 却还是 16px, 大字号下反而比注释小。 */
body.bigfont .cmp-yearwarn,body.bigfont .errbox,body.bigfont .warnbox{font-size:15px}
body.bigfont .health .hd{font-size:20px}
/* 自检"健康度仪表"(信任可视: 大状态 + 进度条 + 通过率) */
.health{border-radius:10px;padding:10px 12px}
.health .hd{font-size:16px;font-weight:700;display:flex;align-items:center;gap:7px}
.health .hb{height:7px;border-radius:5px;background:#e6edf6;overflow:hidden;margin:8px 0 6px}
.health .hb>span{display:block;height:100%;border-radius:5px;transition:width .4s ease}
.health.ok{background:#f0fbf6}
.health.ok .hd{color:#0a6e45}   /* 自检总判决句 = 用户唯一看的结论行; #0a8a56 对 #f0fbf6 仅 4.15:1 → #0a6e45 约 6:1(低色域办公屏也读得出) */
.health.ok .hb>span{background:linear-gradient(90deg,#28c07f,#0a8a56)}
.health.warn{background:#fff7ec}
.health.warn .hd{color:var(--warn-text)}   /* #cb7a1f 对 #fff7ec 仅 3.12:1 —— "还有 N 张表生成不出来"这句告警恰恰最不能看不清; 统一收到 --warn-text(#8a5a10, 5.57:1) */
.health.warn .hb>span{background:linear-gradient(90deg,#f0b429,#cb7a1f)}
/* ── 量级/常识体检带 .hband(2026-08-26 六维审计#3) ──────────────────────────
   定位: **比普通 warning 重, 比错误轻**。官方公式只查表内自洽, 查不出"全表少打一位小数"这类量级错,
   而这恰恰是会被上级打回、也最贵的一类。所以给它一条独立的带(不折叠、不混进 N 条告警的折叠里),
   但**不用红**(它不是"错", 是"请你核对") —— 用比 .health.warn 更强的左侧竖条 + 更实的边框来加重,
   严重档(.hi)才升到危险色。不新造颜色: 全部取既有 --warn/--warn-text/--danger 家族。 */
.hband{margin-top:10px;background:var(--warnbg,#fff6e6);border:1px solid #f0c96b;border-left:5px solid var(--warn,#b27d20);border-radius:10px;padding:11px 13px}
.hband .hb-t{font-size:15px;font-weight:700;color:var(--warn-text,#8a5a10);display:flex;align-items:flex-start;gap:7px;line-height:1.5}
.hband .hb-l{margin:8px 0 0;padding-left:18px;line-height:1.7}
.hband .hb-l>li{margin-bottom:7px;color:var(--ink-2,#3d4d66)}
.hband .hb-l>li:last-child{margin-bottom:0}
.hband .hb-l .k{margin-top:1px}
.hband .hb-f{margin-top:8px;padding-top:7px;border-top:1px dashed #f0c96b}
.hband.hi{background:var(--errbg,#fdeeec);border-color:#f0b5af;border-left-color:var(--danger,#c7423a)}
.hband.hi .hb-t{color:#8c2f28}
.hband.hi .hb-f{border-top-color:#f0b5af}
body.bigfont .hband .hb-t{font-size:18px}   /* 适老白名单(2026-07-10评估#15 同口径): 决定"要不要重算一遍"的结论行必须看得清 */

/* 对比大差异→年度强提醒(用户易把不同年度的旧表拿来对) */
.cmp-yearwarn{background:#fff3d6;border:1px solid #f0c96b;border-left:4px solid #e0a020;border-radius:8px;padding:11px 13px;margin-bottom:10px;font-size:13.5px;color:#8a5a10;line-height:1.6}
.cmp-yearwarn a{color:var(--accent);font-weight:600}
/* 生成后"怎么导入官方系统"收尾引导(最后一公里) */
.import-guide{margin-top:10px;border-top:1px dashed var(--line,#e2eaf3);padding-top:8px}
/* 状态网格下的「为什么不填」: 平时收起(19 条原因拼成一段是 1300+ 字, 用户原话「一大坨文字根本不想看」) */
.skip-why{margin-top:6px}
.skip-why>summary{cursor:pointer;font-weight:600;color:var(--primary);min-height:34px;padding:7px 0;list-style:revert}
.skip-why ul{margin:4px 0 0;padding-left:18px;line-height:1.7}
.skip-why li{margin:2px 0}
.skip-why b{color:var(--ink-2,#3d4d66)}
.import-guide>summary{cursor:pointer;font-weight:600;font-size:13px;color:var(--accent)}
/* 「核对你报过的旧表 ›」入口: 保存之后的**可选旁支**, 层级必须低于主按钮、与紧挨着的
   「怎么导入官方系统？（4 步）」齐平。2026-08-30 修: 原来只挂 .ls-link, 继承 body 的 16px ——
   比上一行那条 13px 的主流程步骤还大, 一个旁支画得比正路还响, 层级是反的。
   ★不能去改 .ls-link 本身: ①格的「用示例数据体验」等多处共用它, 那些地方 16px 是对的。 */
.cmp-entry{font-size:13px;font-weight:600}
.import-guide ol{color:var(--muted,#5a6a82)}
/* 一键"用示例数据体验"按钮 */
.samplebtn{display:block;width:100%;margin-top:8px;padding:8px;border:1px dashed var(--accent);border-radius:9px;background:var(--accent-wash2);color:var(--accent);font-size:13px;font-weight:600;cursor:pointer;transition:.12s}
.samplebtn:hover{background:var(--accent-tint)}
/* 左侧常驻只读授权状态(贴单位名/花名册; 顶栏芯片仅被动摘要, 不再点击弹窗) */
.lic-state{display:flex;align-items:center;flex-wrap:wrap;gap:8px;margin:0 0 10px;padding:9px 12px;border-radius:10px;font-size:13px;border:1px solid var(--line,#e2eaf3);background:var(--accent-wash)}
.lic-state .ls-txt{flex:1;min-width:160px}
.lic-state .ls-link{font-weight:600;white-space:nowrap;color:var(--accent);cursor:pointer}
/* 常驻说明句: **整行独占**(flex-basis:100%)。原来是塞进 .ls-txt 里用 <br> 硬断行 —— .ls-txt 是
   flex:1 的伸缩项, 一变两行就把右侧链接挤到下一行、还与 align-items:center 打架, 用户实报"示例
   授权框内容变形"就是它。独占一行后: 第一行=状态+链接, 第二行=说明, 两种排布都稳。 */
.lic-state .ls-note{flex:1 0 100%;margin:2px 0 0;font-size:12.5px;line-height:1.55;color:var(--muted)}
body.bigfont .lic-state .ls-note{font-size:15px}
.lic-state.ok{background:#f0fbf6;border-color:#cdeeda}
.lic-state.no{background:#f4f7fb;border-color:#dbe4f0}
.lic-state.exp{background:#fff7ec;border-color:#f3dcbb}
.lic-state.demo{background:#fff8ea;border-color:#f0e2b8}
.lic-state.demo .ls-txt b{color:#a9791f}
.hero-cta{margin-top:16px;display:flex;flex-direction:column;align-items:flex-start;gap:5px}
.samplebtn.hero-sample{width:auto;display:inline-flex;align-items:center;gap:8px;margin-top:0;padding:11px 18px;border-style:solid;border-radius:999px;background:#fff;box-shadow:0 2px 10px var(--accent-glow-faint);font-size:14px}
.samplebtn.hero-sample:hover{background:var(--accent-tint);box-shadow:0 4px 14px var(--accent-glow-soft)}
.season-warn{background:#fff3e0;border-bottom:2px solid #f0b429;color:#7a4d05;padding:10px 16px;font-size:14px;text-align:center;font-weight:600}
/* .flash 通用化(原为 .gen-card.flash): 跳转落点必须"动一下"才看得见 —— 984×664 下左栏槽位密集,
   目标常本就在视口内, scrollIntoView 后屏幕纹丝不动, 中老年用户一律解读为"点坏了"会反复点。
   现在结果卡与被跳转的槽位共用同一个高亮, .gen-card.flash 的老用法照旧命中。 */
.flash{animation:genflash 1.5s ease-out 1}
/* 「点开核对 ›」的落点(openRosterNotes)是①里那块核对折叠, 不是整张卡 —— 它平时没有底色也没有
   边框, 光靠 .flash 的脉冲环会紧贴文字、看不出是"一个框"。闪的这 1.5s 给它圆角+浅黄底(与折叠里
   那几条待核项同色系), 结束即恢复。★只在 .flash 上加底色/圆角, 常态一个像素都不动 —— 否则①格
   里会平白多出一块黄区, 与"传完之后收起指引"那一版的克制取向相反。 */
#rosterStat details{border-radius:8px}
#rosterStat details.flash{background:var(--warnbg)}
@keyframes genflash{0%{box-shadow:0 0 0 0 var(--accent-shadow)}100%{box-shadow:0 0 0 12px rgba(43,110,215,0)}}   /* 末帧 alpha=0: 色相不可见, 无需跟模块 */
.lic-chip{cursor:default}
/* 报表年度选择器(对标官方"登录选年度"): 决定统计截止日 */
.yearbar{display:flex;align-items:center;flex-wrap:wrap;gap:10px;margin:0 0 12px;padding:10px 12px;background:var(--accent-wash2);border:1px solid var(--accent-line4);border-radius:10px}
.yb-label{font-weight:700;color:var(--accent);font-size:14px;white-space:nowrap}
.yb-opts{display:flex;gap:8px;flex-wrap:wrap}
.yb-opt{display:flex;flex-direction:column;align-items:center;gap:1px;padding:6px 12px;border:1.5px solid var(--line,var(--accent-line4));border-radius:9px;background:#fff;cursor:pointer;font-size:13.5px;font-weight:600;color:var(--ink-2,#3d4d66);transition:.12s;line-height:1.25}
.yb-opt small{font-size:12px;font-weight:500;color:var(--muted,#7384a0)}   /* 11→12px: 年度口径注释决定统计截止日, 常态字号适老底线(2026-07-10评估#28) */
.yb-opt:hover{border-color:#9fc2f5}
.yb-opt.on{border-color:var(--accent);background:var(--accent-tint);color:var(--accent);box-shadow:0 0 0 3px var(--accent-ring-soft)}
.yb-opt.soon{cursor:not-allowed;background:#f4f5f7}   /* 去整钮 opacity(修UI评审P3: 叠加后对比~2:1读不见), 只淡背景 */
.yb-opt.soon,.yb-opt.soon small{color:#8a5f10}
.yb-hint{flex:1;min-width:180px}
@media(max-width:620px){ .yearbar{flex-direction:column;align-items:flex-start} }
.np-link{display:inline-block;margin-top:10px;font-size:12.5px;color:var(--accent);text-decoration:none}

/* ── 数据表 ── */
table{border-collapse:collapse;width:100%;font-size:14px;margin-top:8px}
th,td{border:1px solid var(--line);padding:7px 9px;text-align:center}
th{background:#f3f6fc;font-weight:600;color:#3a4658} td b{color:var(--accent)}
.k{color:var(--muted);font-size:12px}
.sub{font-size:13px;color:var(--muted);margin-top:6px}

/* ── 联系/加微信 CTA ── */
.wechat{background:linear-gradient(135deg,#16915b,#0f7a4a);color:#fff;border:0}
.wechat h2{color:#fff} .wechat h2 i{color:#fff} .wechat ul{margin:8px 0 0;padding-left:18px;line-height:1.9}
.qr{width:140px;height:140px;background:#fff;border-radius:10px;display:flex;align-items:center;justify-content:center;color:#888;font-size:13px;text-align:center;overflow:hidden}
.qr img{width:100%;height:100%;object-fit:contain}
.contact-chip{background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.3);border-radius:10px;padding:10px 14px;font-size:14px;text-align:center;line-height:1.7}
.contact-chip b{font-size:15px}
.gift{font-size:13px;background:rgba(255,255,255,.15);padding:10px 12px;border-radius:8px;margin-top:12px}

/* ── 页脚 ── */
footer{background:#fff;border-top:1px solid var(--line);padding:26px 0;color:var(--muted);font-size:13px;line-height:1.8;margin-top:20px}

/* ── 桌面 app 化(工作台即主界面; 弱化营销/引导, 放宽版心, 主操作常驻右栏) ── */
/* ① 砍薄 hero: 去营销大标题/宣传语/徽标, 只留一条极薄的示例入口(装好的app不需要落地页式推销) */
.desktop .hero{padding:10px 0;background:#fff;border-bottom:1px solid var(--line)}
.desktop .hero h1, .desktop .hero p.lead, .desktop .hero .badges{display:none}
.desktop .hero-cta{flex-direction:row;align-items:center;gap:14px;margin-top:0;flex-wrap:wrap}
.desktop .hero-cta .k{margin:0;font-size:12px}
.desktop .hero-sample{padding:8px 15px;font-size:13px}
.desktop .card{border-radius:var(--radius)}
/* ③ 版心放宽 1000→1280: 桌面显示器上两栏舒展、各表一行排5个、少滚动 */
.desktop .wrap{max-width:1280px}
/* ② 合并重复"怎么用": 去工作台副标题 + 蓝色"最省事"条(顶部四步引导留作唯一上手提示) */
.desktop .card > h2 .k{display:none}
.desktop .minpath{display:none}
/* ④ 主操作常驻: "预览结果"移入右 sticky 栏, 满宽突出, 滚动长表时始终可点 */
.desktop .bench-st .mainbar{margin:2px 0 14px;text-align:center}
.desktop .bench-st .mainbar .gen{width:100%;padding:14px}
/* 附: 预览前空占位格子淡化(不喧宾夺主; 预览后 .on/.warn 自然恢复为彩色)
   ★2026-08-26: 原为 opacity:.55 —— 但"未预览"正是用户第一次看这屏的状态, 那 13 个格子(表号+
   "待生成")是此刻**唯一**的信息, 被压到 55% 后实测仅约 3.3:1。改为只淡背景/边框, 文字 100% 保留。
   ★:not(.warn/.dep/.on) 不是多余的: 这条选择器有 4 个类(0,4,0), 一旦它带上 background 就会压过
   只有 2 个类的 .chip.warn/.chip.dep —— 万一状态类是叠着写的(如 "off auto warn"), 黄格会被压回灰格。 */
.desktop .bench-st .chip.off:not(.warn):not(.dep):not(.on){background:#fbfcfe;border-color:#eef2f7}
/* ⑤ 宽版心(1280)下收住 ②③ 表单行宽: 1fr 会把数字框/下拉拉满致松散, 给上限、单位名放宽 */
.desktop .fields input, .desktop .fields select{max-width:240px}
.desktop .fields .full input{max-width:560px}

/* ── 手机端(分享链接多在微信群被手机打开: 先了解、引导到电脑) ── */
.mobile-hint{display:none}
@media(max-width:620px){
  .hero h1{font-size:26px}
  .mobile-hint{display:block;background:var(--warnbg);border:1px solid #ffe0a3;color:#7a5200;border-radius:10px;padding:11px 13px;font-size:14px;line-height:1.7;margin-bottom:14px}
  .mobile-hint .mlink{background:none;border:0;color:var(--brand);font-weight:700;font-size:14px;padding:0;cursor:pointer;text-decoration:underline}
  .nav .wrap{height:auto;min-height:58px;flex-wrap:wrap;padding-top:6px;padding-bottom:6px}
  .nav .ver{display:none}
  .logo{font-size:16px}
  .navbtn{font-size:12.5px;padding:6px 8px}
  .fields{grid-template-columns:1fr}
  .fields .full{grid-column:auto}
  .desktop .fields input,.desktop .fields select,.desktop .fields .full input{max-width:none}
  .bench-st{position:static}
}

/* ── 在线版: 槽位下那行「已在本机删除 / 将上传」(2026-09-05) ──
   它是隐私承诺的证据, 不是装饰: 用户能亲眼看到删了哪几列、传了哪几列。只在 mode='online' 下由 app.js 生成。 */
.deid-note{font-size:12px;line-height:1.5;color:var(--ok-d);margin-top:4px}
.deid-note .fa-shield-halved{margin-right:3px}
.deid-note .deid-detail{margin-top:3px;padding:6px 8px;background:var(--bg-2, #f6f8fb);border:1px solid var(--border, #e3e8ef);border-radius:6px;color:var(--text-2, #4a5568);word-break:break-all}
.deid-note .deid-warn{margin-top:3px;color:var(--warn-text);line-height:1.5}   /* 范围异常的表被截断/跳过: 与桌面版解析器同一套话, 放可见区 */
