/* ============================================================================
   石维宝小程序 · 全端界面原型  唯一样式表（支付宝风格 / Alipay Style）
   基于统一版结构，令牌与视觉重写为支付宝设计语言：
     · 主色 浅支付宝蓝 #4096FF（消费者端，压白字的填充另取 #1677FF）；商户橙 #EA580C（商户端）；政务蓝 #3A74C4
       （市场监管端五级：市局 / 区县局 / 基层所 / 服务站 / 二级服务站，App 与 PC 共用同一批页面）
     · 白卡大圆角 + 极浅描边/柔和阴影；胶囊大按钮；彩色渐变宫格图标
     · 语义色采用 Ant/支付宝口径：成功 #00B42A / 警告 #FF7D00 / 危险 #F53F3F / 信息 #1677FF
   选择器与类名与统一版完全一致，88 页 + 总览/规范页共用本表，无需改结构即可换肤。
   结构：0 基础 / 1 字号阶梯 / 1b A+ 字号两档 / 2 三端主题令牌 / 3 工具类 / 4 按钮 / 5 徽章标签
         6 卡片单元格 / 7 表单勾选 / 8 步骤时间线 / 9 页签筛选 / 10 弹层提示
         11 移动端壳 / 12 数据展示 / 13 PC 后台 / 14 总览页 / 15 规范页 / 16 其它 / 17 增强组件
         18 消费者首页增强 / 20 网点地图 / 文末三段：17 网点九子类配色、18 静态尺寸工具类、18b 内联 style 第二批收口
   ============================================================================ */

/* ---------- 0 基础 ---------- */
*, *::before, *::after { box-sizing: border-box; }

/* 小程序约束：小程序没有 html / :root，改不了根字号 —— A+ 字号两档不得依赖本行（见 §2 的 --fs-* 阶梯）。
   本行只是桌面基线，供下方 10 处 rem 盒子尺寸（.cell-icon / .opt min-height / .navbar 等）取一个确定值；
   → 落地：删除本行，盒子尺寸改 rpx 或 px；字号一律走 var(--fs-*)，与根字号无关。-webkit-text-size-adjust 为 Web 专有，小程序无此属性 */

html { font-size: 16px; -webkit-text-size-adjust: 100%; }

body { margin: 0; font-family: -apple-system, BlinkMacSystemFont, "PingFang SC", "Microsoft YaHei", "Segoe UI", sans-serif; color: var(--c-ink); background: #EBEEF3; }

button { font-family: inherit; cursor: pointer; }

input, textarea, select { font-family: inherit; }

a { text-decoration: none; color: inherit; }

img { max-width: 100%; }

/* 小程序约束：小程序无 <body> 元素，wxml/axml 对属性选择器支持有限，「按 body class 区分端」的开关不可用
   → 落地：520px 机身宽度只是原型画布；实现时由页面根节点 <view class="app"> 承载，
     端差异（消费者 / 商户 / 服务站 / PC）用条件编译产生的根 class 表达 */
body:not(.gov):not(.ov):not(.ts) { max-width: 520px; margin: 0 auto; min-height: 100vh; background: var(--c-bg); box-shadow: 0 0 40px rgba(9,30,66,.16); }

body.gov { background: var(--c-bg); }

/* ---------- 1 字号阶梯（后缀 = 常规渲染像素） ----------
   小程序约束：小程序无 html / :root 元素、不能改根字号，rem 无法作为「全站放大」的抓手
   → 落地：阶梯全部写成 px 绝对值，A+ 字号大号档覆盖同名变量（见下方 html.lg）；
      数值 = 原 rem × 16px，与改前逐像素相同，不影响现有观感 */
:root {
  --fs-10: 10px;
  --fs-11: 11px;  --fs-12: 12px;  --fs-13: 13px;  --fs-14: 14px;
  --fs-15: 15px;  --fs-16: 16px;  --fs-17: 17px;  --fs-18: 18px;
  --fs-19: 19px;  --fs-20: 20px;  --fs-22: 22px;  --fs-24: 24px;  --fs-28: 28px;
  --fs-ic-18: 18px; --fs-ic-20: 20px; --fs-ic-22: 22px; --fs-ic-24: 24px;
  --fs-ic-28: 28px;  --fs-ic-36: 36px;  --fs-ic-40: 40px;
  --r-sm: 8px; --r-md: 12px; --r-lg: 16px; --r-full: 999px;
  /* 支付宝：卡片以留白与极浅描边分层，阴影更轻 */
  --sh-sm: 0 1px 2px rgba(9,30,66,.04); --sh-md: 0 2px 10px rgba(9,30,66,.07); --sh-lg: 0 8px 24px rgba(9,30,66,.12);
  --c-ink: #191919; --c-ink-2: #646A73; --c-ink-3: #9AA0A6;
  --c-line: #EBEDF0; --c-line-2: #F2F3F5; --c-bg: #F5F6F8; --c-card: #FFFFFF;
  /* 语义色（Ant / 支付宝口径）：base 用于填充/图标/圆点（图形 ≥3:1），deep 用于文字（AA ≥4.5:1） */
  --c-ok: #00B42A; --c-ok-soft: #EAF9EE; --c-ok-deep: #15803D;
  --c-warn: #FF7D00; --c-warn-soft: #FFF4E8; --c-warn-deep: #B45309;
  --c-danger: #F53F3F; --c-danger-soft: #FFECE8; --c-danger-deep: #CB2634;
  --c-info: #1677FF; --c-info-soft: #E8F3FF; --c-info-deep: #0958D9;
}

/* ---------- 1b A+ 字号两档（标准 / 大号）：只覆盖字号变量，不动根字号、不动盒子 ----------
   小程序约束：小程序无 html 根元素、无法修改根字号，「根字号 16→20 让 rem 全站等比放大」整体不成立
   → 落地：变量覆盖写在每个页面的根容器上（<view class="app {{ 't-' + level }}">，webview 渲染层变量可继承），
      档位由 App.onLaunch 从 uni.getStorageSync('cs_lg') 恢复；
      本表 html.lg 与落地等价，数值 = 标准档 ×1.25「5 舍 6 入」取整，观感不变。
      注意：盒子尺寸（rem 表达的 width/height/padding）两档均不放大，故可点区靠 min-height≥44px 保底、文案允许换行。 */
html.lg {
  --fs-10: 13px; --fs-11: 14px; --fs-12: 15px; --fs-13: 16px; --fs-14: 17px; --fs-15: 19px;
  --fs-16: 20px; --fs-17: 21px; --fs-18: 22px; --fs-19: 24px; --fs-20: 25px; --fs-22: 27px;
  --fs-24: 30px; --fs-28: 35px;
  --fs-ic-18: 22px; --fs-ic-20: 25px; --fs-ic-22: 27px; --fs-ic-24: 30px;
  --fs-ic-28: 35px; --fs-ic-36: 45px; --fs-ic-40: 50px;
}

/* ---------- 2 三端主题令牌（默认：消费者端 · 浅支付宝蓝） ---------- */
:root {
  --c-primary: #4096FF; --c-primary-light: #69B1FF; --c-primary-dark: #1677FF; --c-primary-deep: #003EB3;
  --c-primary-ink: #0958D9; --c-primary-soft: #EBF4FF; --c-primary-softer: #F5F9FF;
  --c-primary-border: #CAE5FF; --c-primary-wash: #EDF5FF; --c-primary-tint: #EBF4FF; --c-primary-tint-2: #D6EAFF;
  --c-primary-gradient: linear-gradient(135deg, #69B1FF, #4096FF 52%, #1677FF);
  /* --c-primary-fill = 压白字的填充色（主按钮 / 选中态 / 扫码胶囊）：主色淡一档后白字对比度会掉
     （白字 / #4096FF 实测 2.9:1），故填充单列一档沿用旧主色 #1677FF（实测 4.1:1，与淡色前持平） */
  --c-primary-fill: #1677FF;
}

/* 小程序约束：小程序无 body 元素、属性选择器支持不全，故 body[data-role=…] / body[data-end="gov"] 这类
   「按角色切主题令牌」的挂点不可移植（与 §5 的 body:not(.gov) 同一处理）。
   → 落地：三套令牌分别落成 .theme-consumer / .theme-merchant / .theme-gov 三个 class，
     由页面根 <view :class> 固定挂载——按页面所属的包（主包 / 分包 merchant / 分包 gov）写死，
     同一小程序内也不存在运行时切主题。
     变量本身（--c-primary 等）可原样移植，仅挂点改变 */
body[data-end="gov"], body[data-role="gov"] {
  --c-primary: #3A74C4; --c-primary-light: #5A92D8; --c-primary-dark: #2B5FA5; --c-primary-deep: #1A3E6E;
  --c-primary-ink: #2B5FA5; --c-primary-soft: #EBF2FB; --c-primary-softer: #F5F9FD;
  --c-primary-border: #CFE0F5; --c-primary-wash: #F2F7FD; --c-primary-tint: #EEF4FC; --c-primary-tint-2: #D9E7F8;
  --c-primary-gradient: linear-gradient(135deg, #5A92D8, #3A74C4 55%, #2B5FA5);
  --c-primary-fill: #3A74C4;
}

body[data-role="merchant"] {
  --c-primary: #EA580C; --c-primary-light: #FB7A2F; --c-primary-dark: #C2410C; --c-primary-deep: #7C2D12;
  --c-primary-ink: #C2410C; --c-primary-soft: #FFF1E8; --c-primary-softer: #FFF8F3;
  --c-primary-border: #FFD3B0; --c-primary-wash: #FFF3EA; --c-primary-tint: #FFF1E8; --c-primary-tint-2: #FFE0CC;
  --c-primary-gradient: linear-gradient(135deg, #FB7A2F, #EA580C 52%, #C2410C);
  --c-primary-fill: #EA580C;
}

/* 消费者端底色再淡一档（整体向白收一半）：§1 的中性底三端共用，故本端单独覆盖，商户端与监管端取值不变。
   卡面本就是纯白 #FFFFFF，无可再淡空间，故 card 沿用白；页面底与描边的层次差随之减半，分层主要交给阴影。 */
body[data-role="consumer"] {
  --c-line: #F5F6F8; --c-line-2: #F9F9FA; --c-bg: #FAFBFC;
  --sh-sm: 0 1px 2px rgba(9,30,66,.02); --sh-md: 0 2px 10px rgba(9,30,66,.035); --sh-lg: 0 8px 24px rgba(9,30,66,.06);
}

/* ---------- 3 工具类 ---------- */
.mt-4{margin-top:4px}.mt-8{margin-top:8px}.mt-10{margin-top:10px}.mt-12{margin-top:12px}.mt-16{margin-top:16px}.mt-20{margin-top:20px}

.mb-0{margin-bottom:0}.mb-8{margin-bottom:8px}.mb-10{margin-bottom:10px}.mb-12{margin-bottom:12px}.mb-16{margin-bottom:16px}

.flex{display:flex;align-items:center}.flex-b{display:flex;align-items:center;justify-content:space-between}

.gap-8{gap:8px}.gap-12{gap:12px}.f1{flex:1;min-width:0}

.muted{color:var(--c-ink-2)}.dim{color:var(--c-ink-3)}

.small{font-size:var(--fs-14)}.tiny{font-size:var(--fs-12)}.mini{font-size:var(--fs-11)}

.big{font-size:var(--fs-17)}.strong{font-weight:600}.b{font-weight:700}

.num{font-variant-numeric:tabular-nums}

.t-c{text-align:center}.t-r{text-align:right}

.ink{color:var(--c-primary-ink)}.ok-c{color:var(--c-ok-deep)}.warn-c{color:var(--c-warn-deep)}.danger-c{color:var(--c-danger-deep)}

.line{height:1px;background:var(--c-line);border:0;margin:12px 0}

.grid2{display:grid;grid-template-columns:1fr 1fr;gap:10px}

.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}

.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}

/* 小程序约束：两端 webview 对 CSS Grid 的支持程度随基础库版本浮动，auto-fit / minmax 这类自适应轨在
   支付宝端偶发塌陷 → 落地：小程序页面只用等分列（本区 .grid2/.grid3/.grid4 与 .qgrid/.stat-row/.up-grid/.op-stats
   等，全是 repeat(N,1fr)）；auto-fit + minmax 仅存在于 PC 评审板（.ov-cards / .ts-grid2 / .ts-grid3），不随迁移下发 */

.ellip{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.clamp2{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}

/* ---------- 4 按钮（支付宝：主按钮扁平蓝、大号 CTA 胶囊） ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;border:1px solid transparent;border-radius:var(--r-md);
  font-size:var(--fs-16);font-weight:600;padding:0 18px;min-height:2.875rem;transition:filter .15s, transform .05s, box-shadow .15s;user-select:none}

.btn:active{transform:scale(.98)}

.btn-primary{background:var(--c-primary-fill);color:#fff;box-shadow:0 2px 8px rgba(9,30,66,.16)}

.btn-outline{background:#fff;color:var(--c-primary);border-color:var(--c-primary-border)}

.btn-soft{background:var(--c-primary-soft);color:var(--c-primary-ink)}

.btn-danger{background:var(--c-danger);color:#fff;box-shadow:0 2px 8px rgba(245,63,63,.22)}

.btn-danger-o{background:#fff;color:var(--c-danger-deep);border-color:#FFC7C2}

.btn-block{display:flex;width:100%}

.btn-lg{min-height:3rem;font-size:var(--fs-17);border-radius:var(--r-full)}

.btn-sm{min-height:2.125rem;font-size:var(--fs-14);padding:0 12px;border-radius:var(--r-sm)}

.btn-xs{min-height:1.75rem;font-size:var(--fs-12);padding:0 10px;border-radius:var(--r-sm)}

.btn[disabled],.btn.is-off{background:var(--c-line-2);color:var(--c-ink-3);border-color:transparent;box-shadow:none}

.link{color:var(--c-primary-ink);font-weight:600}

.link.mini{font-weight:500}

/* ---------- 5 徽章 / 标签 / 提示条 ---------- */
.badge-status{display:inline-flex;align-items:center;gap:6px;padding:3px 10px;border-radius:var(--r-full);font-size:var(--fs-11);font-weight:600;line-height:1.4;white-space:nowrap;flex:none}

.badge-status::before{content:'';width:7px;height:7px;border-radius:50%;background:currentColor}

.badge-status.info{background:var(--c-info-soft);color:var(--c-info-deep)}

.badge-status.ok{background:var(--c-ok-soft);color:var(--c-ok-deep)}

.badge-status.warn{background:var(--c-warn-soft);color:var(--c-warn-deep)}

.badge-status.danger{background:var(--c-danger-soft);color:var(--c-danger-deep)}

.badge-status.mute{background:var(--c-line-2);color:var(--c-ink-2)}

.tag{display:inline-flex;align-items:center;padding:2px 10px;border-radius:var(--r-full);font-size:var(--fs-12);font-weight:600;line-height:1.5}

.tag.blue{background:var(--c-primary-soft);color:var(--c-primary-ink);border:1px solid var(--c-primary-border)}

.tag.ok{background:var(--c-ok-soft);color:var(--c-ok-deep)}

.tag.warn{background:var(--c-warn-soft);color:var(--c-warn-deep)}

.tag.danger{background:var(--c-danger-soft);color:var(--c-danger-deep)}

/* 复位 .line 分隔条泄漏的 height/margin，否则 tag 被压成 1px */
.tag.line{background:#fff;color:var(--c-ink-2);border:1px solid var(--c-line);height:auto;margin:0}

.tag.soon{background:repeating-linear-gradient(45deg,#F4F5F7,#F4F5F7 4px,#EDEFF2 4px,#EDEFF2 8px);color:var(--c-ink-3);border:1px dashed var(--c-ink-3);font-weight:500}

.notice{display:flex;gap:8px;align-items:flex-start;padding:10px 12px;border-radius:var(--r-md);font-size:var(--fs-13);line-height:1.6}

.notice .ico{flex-shrink:0;font-size:var(--fs-ic-18);line-height:1.3}

.notice.info{background:var(--c-primary-wash);color:var(--c-primary-ink);border:1px solid var(--c-primary-border)}

.notice.warn{background:var(--c-warn-soft);color:var(--c-warn-deep);border:1px solid #FFD9A8}

.notice.danger{background:var(--c-danger-soft);color:var(--c-danger-deep);border:1px solid #FFC7C2}

.notice.ok{background:var(--c-ok-soft);color:var(--c-ok-deep);border:1px solid #B7EBC3}

/* ---------- 6 卡片 / 单元格 / 区块 ---------- */
.card{background:var(--c-card);border-radius:var(--r-lg);box-shadow:var(--sh-sm);margin-bottom:10px;overflow:hidden}

/* 必读强调卡：改前内联 border:1.5px solid var(--c-danger);border-radius:var(--r-md)（.card 默认 --r-lg，故圆角一并改写） */
.card.alert{border:1.5px solid var(--c-danger);border-radius:var(--r-md)}

.card-p{padding:14px}

/* 带 .card-hd 的卡片正文：.card-hd 只给上边（12px 14px 0），左右与底部内边距由本类给。
   改前 .card-bd 全站 56 处（服务站端 41 处）从未定义 → 字段/图表/说明文字贴卡片边缘，与同页 .cell 行的 14px 内缩打架。
   .cell 自带 13px 14px 内边距，故在正文里向两侧出血，跟直接挂在 .card 下的 .cell 完全对齐。 */
.card-bd{padding:10px 14px 14px}

.card-bd>.cell{margin:0 -14px}

.card-hd{display:flex;align-items:center;justify-content:space-between;padding:12px 14px 0}

.card-title{font-size:var(--fs-16);font-weight:700}

.card-more{font-size:var(--fs-13);color:var(--c-ink-3)}

.cell{display:flex;align-items:center;gap:12px;padding:13px 14px;position:relative}

.cell + .cell::before{content:'';position:absolute;left:14px;right:0;top:0;height:1px;background:var(--c-line-2)}

.cell.tap{cursor:pointer}

.cell:active{background:var(--c-primary-softer)}

.cell-icon{width:2.5rem;height:2.5rem;border-radius:var(--r-md);background:var(--c-primary-soft);color:var(--c-primary-ink);
  display:flex;align-items:center;justify-content:center;font-size:var(--fs-ic-20);flex-shrink:0;font-weight:700}

.cell-icon.round{border-radius:50%}

.cell-icon.ok{background:var(--c-ok-soft);color:var(--c-ok-deep)}

.cell-icon.warn{background:var(--c-warn-soft);color:var(--c-warn-deep)}

.cell-icon.danger{background:var(--c-danger-soft);color:var(--c-danger-deep)}

/* 灰底图标（说明/帮助类入口）：改前写在页面 style="background:var(--c-line-2);color:var(--c-ink-2)"，6 处内联重复 */
.cell-icon.plain{background:var(--c-line-2);color:var(--c-ink-2)}

/* 详情页大号图标（改前 2 处内联 width:3.4rem;height:3.4rem;font-size:var(--fs-ic-28)） */
.cell-icon.xl{width:3.4rem;height:3.4rem;font-size:var(--fs-ic-28)}
/* 实底类型色图标：--mk 由页面 class mk-<type>（§17）带出，改前是内联 style="background:{{t.color}}" */
.cell-icon.solid{background:var(--mk);color:#fff}

/* 商户首字头像：按行业区分底色（柔和底 + 同色系深色字），检索页/工单列表共用 */
/* 行业配色：小程序约束：wxml / axml 对属性选择器支持有限 → 落地：由 DB.indClass(name) 输出 ASCII slug class
   取值与改前 .cell-icon[data-ind="…"] 逐条相同；零售 = 默认主色软底，故不单独覆盖 */
.cell-icon.ind-hotel{background:#E8F1FF;color:#2B5FA5}
.cell-icon.ind-food{background:#FFF0E2;color:#BC5A12}
.cell-icon.ind-beauty{background:#FCE7F1;color:#B02C6B}
.cell-icon.ind-car{background:#DFF0EC;color:#0E6E5F}
.cell-icon.ind-fitness{background:#FDE7E2;color:#BC3C26}
.cell-icon.ind-housekeep{background:var(--c-ok-soft);color:var(--c-ok-deep)}
.cell-icon.ind-edu{background:#E9E8FD;color:#463AB8}
.cell-icon.ind-decor{background:#EFE7FA;color:#6A3FB5}
.cell-icon.ind-other{background:var(--c-primary-soft);color:var(--c-primary-ink)}

/* 图标资产：.if 线性 SVG（icons.js sprite use 引用），颜色/字号继承 currentColor；
   B 类白名单符号（✓ ✕ ★ ①②③④ ├─└ △ ▮ ◉）不资产化，保留原字符 */
.if{width:1em;height:1em;display:inline-block;vertical-align:-0.125em;fill:none;stroke:currentColor;
  stroke-width:2;stroke-linecap:round;stroke-linejoin:round;flex:none}
.cell-icon .if{width:var(--fs-ic-20);height:var(--fs-ic-20)}
.tb-ico .if{width:var(--fs-ic-22);height:var(--fs-ic-22);stroke-width:1.8}
.si .if{width:var(--fs-16);height:var(--fs-16)}
.ntf-ico .if{width:var(--fs-18);height:var(--fs-18)}
.ico .if{width:var(--fs-16);height:var(--fs-16)}

.cell-main{flex:1;min-width:0}

.cell-title{font-size:var(--fs-16);font-weight:600;line-height:1.45}

.cell-sub{font-size:var(--fs-13);color:var(--c-ink-2);margin-top:3px;line-height:1.5}

.cell-arrow{color:var(--c-ink-3);font-size:var(--fs-ic-20);flex-shrink:0}

.sec{padding:16px 12px 4px}

.sec-hd{display:flex;align-items:center;justify-content:space-between;padding:0 2px 8px}

.sec-t{font-size:var(--fs-17);font-weight:700;display:inline-flex;align-items:center;gap:6px}

.sec-t .if{width:var(--fs-ic-20);height:var(--fs-ic-20)}

.sec-more{font-size:var(--fs-13);color:var(--c-ink-3)}

.content{padding:10px 12px 24px}

body.has-tab .content{padding-bottom:5.6rem}

/* ---------- 7 表单 / 勾选卡 / 上传 / 开关 ---------- */
.field{margin-bottom:14px}

.lb{display:flex;align-items:center;gap:6px;font-size:var(--fs-15);font-weight:600;margin-bottom:7px}

.f-label{display:flex;align-items:center;font-size:var(--fs-15);font-weight:600;margin-bottom:7px}

.f-label .req{color:var(--c-danger);margin-left:3px}

.f-label .opt-tag{margin-left:auto;font-size:var(--fs-12);color:var(--c-ink-3);font-weight:400}

/* 小程序约束：<input> 的 type 枚举与 HTML 不完全相同——number / idcard / digit 可用，
   无 email / search / url，也没有独立的 tel 类型
   → 落地：type="tel" 改 type="number" + maxlength="11"；密码用 password 属性（非 type）；
     本条为全站统一说明，各页面 13 处 input 不再逐条批注 */
.input,.textarea,.select{width:100%;border:1.5px solid var(--c-line);border-radius:var(--r-md);background:#fff;
  font-size:var(--fs-16);padding:11px 12px;color:var(--c-ink);outline:none;transition:border .15s, box-shadow .15s}

.input:focus,.textarea:focus,.select:focus{border-color:var(--c-primary);box-shadow:0 0 0 3px var(--c-primary-tint)}

.input::placeholder,.textarea::placeholder{color:#B4B9C0}

.textarea{min-height:6em;resize:vertical;line-height:1.6}

/* 小程序约束：wxml/axml 无 <select>，选择器只能落地为 <picker mode="selector">——点击弹底部滚轮，不可原地展开；
   且 background-image 不支持 data:image/svg+xml。原型保留 <select> 作为数据源与 JS 契约，
   外层 .pk 用 border 画一个文本箭头「›」表达 picker 收合态；
   落地写法：<picker range="{{opts}}" bindchange>，回调取 e.detail.value 为数组下标，需回写 value。 */
.pk{display:block;position:relative}

.pk::after{content:'';position:absolute;right:13px;top:50%;width:6px;height:6px;margin-top:-4px;pointer-events:none;
  border-top:1.6px solid var(--c-ink-3);border-right:1.6px solid var(--c-ink-3);transform:rotate(45deg)}

.pk > .select,.pk > .input{padding-right:32px}

.select{appearance:none;-webkit-appearance:none;background-image:none}

/* PC 端不受小程序约束，<select> 恢复浏览器原生下拉箭头即可：上面那条 appearance:none 只为满足
   「wxml/axml 无 <select>」而设，App 端的箭头由 .pk::after 画（picker 收合态），
   而 PC 页面的筛选下拉多是裸 <select>、没有 .pk 外壳，不加这条就完全没有可点开的视觉提示。
   .wrap 只出现在 PC 页面（App 页面一律 <main class="content">），故用它作 PC 侧作用域。 */
.wrap .select{appearance:auto;-webkit-appearance:auto}

.hint{font-size:var(--fs-12);color:var(--c-ink-3);margin-top:6px;line-height:1.55}

.err{font-size:var(--fs-12);color:var(--c-danger-deep);margin-top:6px}

.input.is-bad{border-color:var(--c-danger)}

.readonly{background:var(--c-line-2);color:var(--c-ink-2)}

.f-plain{display:flex;align-items:center;justify-content:space-between;padding:12px 0;border-bottom:1px solid var(--c-line-2);font-size:var(--fs-15)}

.f-plain:last-child{border-bottom:0}

.f-plain .k{color:var(--c-ink-2)}

/* 大号勾选卡：能用勾选不用键盘 */
.opt{display:flex;align-items:flex-start;gap:10px;border:1.5px solid var(--c-line);border-radius:var(--r-md);
  background:#fff;padding:13px 14px;margin-bottom:9px;cursor:pointer;transition:all .15s;min-height:2.75rem}

.opt input{position:absolute;opacity:0;pointer-events:none}

.opt-dot{width:20px;height:20px;border-radius:50%;border:2px solid #C9CED6;flex-shrink:0;margin-top:2px;position:relative;transition:all .15s}

.opt .opt-t{font-size:var(--fs-16);font-weight:600;line-height:1.5}

.opt .opt-s{font-size:var(--fs-13);color:var(--c-ink-2);margin-top:2px;line-height:1.5}

.opt:active{background:var(--c-primary-softer)}

/* 小程序约束：微信/支付宝均不支持 :has()，选中态不可由 CSS 反查 input:checked → 落地：class 驱动 .opt.on（Vue 端为 :class="{on: 值===选项}"），由 common.js syncOpt() 从 input.checked 同步 */
.opt.on{border-color:var(--c-primary);background:var(--c-primary-wash);box-shadow:0 0 0 3px var(--c-primary-tint)}

.opt.on .opt-dot{border-color:var(--c-primary);background:var(--c-primary)}

.opt.on .opt-dot::after{content:'';position:absolute;inset:0;margin:auto;width:8px;height:5px;
  border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg) translateY(-1px)}

.opt.mini{padding:10px 12px;min-height:2.4rem}

.opt.mini .opt-t{font-size:var(--fs-15)}

/* 横向排布、超出自动换行（用于诉求类型等短选项多选场景） */
.opt-row{display:flex;flex-wrap:wrap;gap:8px}
.opt-row > .opt{flex:0 0 auto;width:auto;margin-bottom:0;min-width:7.5rem}

/* 复选式勾选卡（方框） */
.opt.check .opt-dot{border-radius:5px}

/* 上传 */
.up-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}

/* 小程序约束：aspect-ratio 在两端旧版 webview 上不保证生效，「等宽等高」的正比方块不可依赖它撑出
   → 落地：<view> 写固定宽高（rpx），或用 height:0 + padding-bottom:100% 撑等比盒；本行仅作桌面渐进增强 */
.up{aspect-ratio:1;border:1.5px dashed #C9CED6;border-radius:var(--r-md);background:var(--c-line-2);display:flex;
  flex-direction:column;align-items:center;justify-content:center;gap:4px;color:var(--c-ink-3);font-size:var(--fs-12);cursor:pointer}

.up .ic{font-size:var(--fs-ic-28);line-height:1;color:#B4B9C0}

.up.pic{border-style:solid;position:relative;overflow:hidden}

.up .x{position:absolute;top:4px;right:4px;width:18px;height:18px;border-radius:50%;background:rgba(0,0,0,.55);color:#fff;font-size:var(--fs-11);display:flex;align-items:center;justify-content:center}

/* 开关 */
.switch{display:inline-flex;align-items:center;cursor:pointer;flex-shrink:0}

.switch .sw-track{width:44px;height:26px;border-radius:999px;background:#D6DAE0;position:relative;transition:background .2s}

.switch .sw-track::after{content:'';position:absolute;top:3px;left:3px;width:20px;height:20px;border-radius:50%;background:#fff;box-shadow:var(--sh-sm);transition:left .2s}

.switch.on .sw-track{background:var(--c-primary)}

.switch.on .sw-track::after{left:21px}

/* 星级 */
.stars{display:flex;gap:6px;font-size:var(--fs-ic-28);line-height:1}

.star{color:#D6DAE0;cursor:pointer;transition:transform .1s}

.star:active{transform:scale(1.2)}

.star.on{color:#FFB400}

/* ---------- 8 步骤条 / 时间线 ---------- */
.steps{display:flex;align-items:center;gap:4px;padding:12px 14px;background:#fff;border-radius:var(--r-md);box-shadow:var(--sh-sm);margin-bottom:12px}

.st{flex:1;text-align:center;font-size:var(--fs-12);color:var(--c-ink-3);position:relative;font-weight:600}

.st::before{content:'';display:block;width:22px;height:22px;line-height:22px;border-radius:50%;background:var(--c-line-2);color:var(--c-ink-3);margin:0 auto 5px;font-size:var(--fs-12)}

.st.on{color:var(--c-primary-ink)}

.st.on::before{background:var(--c-primary-fill);color:#fff}

.st.done{color:var(--c-primary-ink)}

.st.done::before{content:'✓';background:var(--c-primary-soft);color:var(--c-primary-ink)}

.st + .st::after{content:'';position:absolute;top:10px;left:calc(-50% + 14px);right:calc(50% + 14px);height:2px;background:var(--c-line);z-index:0}

.st + .st.done::after,.st + .st.on::after{background:var(--c-primary)}

.st::before,.st::after{position:relative}

.st{overflow:visible}

.steps .st::after{top:10px}

.timeline{position:relative;padding:2px 0 2px 6px}

.tl{display:flex;gap:12px;position:relative;padding-bottom:18px}

.tl:last-child{padding-bottom:2px}

.tl::before{content:'';position:absolute;left:7px;top:18px;bottom:0;width:2px;background:var(--c-line)}

.tl:last-child::before{display:none}

.tl-dot{width:16px;height:16px;border-radius:50%;border:2px solid var(--c-line);background:#fff;flex-shrink:0;margin-top:2px;z-index:1}

.tl.done .tl-dot{background:var(--c-primary);border-color:var(--c-primary)}

.tl.done .tl-dot::after{content:'';position:absolute;width:6px;height:3px;border-left:2px solid #fff;border-bottom:2px solid #fff;transform:rotate(-45deg);margin:4px 0 0 3px}

.tl.cur .tl-dot{border-color:var(--c-primary);box-shadow:0 0 0 4px var(--c-primary-tint)}

.tl.cur .tl-dot::after{content:'';width:6px;height:6px;border-radius:50%;background:var(--c-primary);display:block;margin:3px auto}

.tl-main{flex:1;min-width:0}

.tl-t{font-size:var(--fs-15);font-weight:600;line-height:1.5}

.tl.cur .tl-t{color:var(--c-primary-ink)}

.tl-s{font-size:var(--fs-12);color:var(--c-ink-3);margin-top:2px}

.tl-x{font-size:var(--fs-13);color:var(--c-ink-2);margin-top:4px;line-height:1.6;background:var(--c-line-2);border-radius:var(--r-sm);padding:8px 10px}

/* ---------- 沟通气泡（原写在页面的内联 style 上，两端迁移时逐条抄成 class） ---------- */
.cr-in{justify-content:flex-start}.cr-out{justify-content:flex-end}
.cr-col-in{max-width:78%}.cr-col-out{max-width:78%;text-align:right}
/* 我方气泡：实心主色软底 + 右上角收尖；对方气泡：白底左上角收尖 */
.tl-x.bub-in{border-radius:2px 12px 12px 12px;display:inline-block}
.tl-x.bub-out{border-radius:12px 2px 12px 12px;display:inline-block;background:var(--c-primary-soft);color:var(--c-primary-ink)}
/* 气泡旁的小头像（.cell-icon 缩小档）与聊天容器最小高度 */
.chat-ava{width:2.2rem;height:2.2rem;font-size:var(--fs-16)}
.chat-h{min-height:340px}

.tl.cur .tl-x{background:var(--c-primary-wash);color:var(--c-primary-ink)}

/* 变更留痕的前后取值对照：纵向堆叠而非左右两栏——服务时间 / 站点公告这类取值常超一行，375px 宽下两栏会挤成竖排
   旧值中性灰 + 删除线，新值主色底加粗，一眼看出改了什么 */
.diff-lb{font-size:var(--fs-11);color:var(--c-ink-3);margin:8px 0 3px}

.diff-lb:first-child{margin-top:0}

.diff-v{font-size:var(--fs-13);line-height:1.6;border-radius:var(--r-sm);padding:8px 10px;word-break:break-all}

.diff-v.old{background:var(--c-line-2);color:var(--c-ink-3);text-decoration:line-through}

.diff-v.new{background:var(--c-primary-wash);color:var(--c-primary-ink);font-weight:600}

/* 深链定位（?id=）命中的卡片：主色描边 + 外发光，长列表里一眼能找到通知指向的那一条 */
.card.hl{border-color:var(--c-primary);box-shadow:0 0 0 3px var(--c-primary-tint)}

/* ---------- 9 页签 / 筛选 / 搜索 ---------- */
/* 小程序约束：.tabs / .chiprow 的横向溢出靠 overflow-x:auto 滚动，小程序渲染层无该滚动条概念、
   页面级 <view> 横向滚动也不稳 → 落地：<scroll-view scroll-x="true"> 包一层，内部 <view> 排成一行，
   两端 overflow-x:auto 仅作桌面兜底；页签超出宽度改用 swiper + 下标联动 */
.tabs{display:flex;background:#fff;border-radius:var(--r-md) var(--r-md) 0 0;border-bottom:1px solid var(--c-line);overflow-x:auto}

.tab{flex:1;text-align:center;padding:12px 6px;font-size:var(--fs-15);color:var(--c-ink-2);cursor:pointer;white-space:nowrap;position:relative;font-weight:600}

.tab.on{color:var(--c-primary)}

.tab.on::after{content:'';position:absolute;left:50%;transform:translateX(-50%);bottom:0;width:28px;height:3px;border-radius:2px;background:var(--c-primary)}

.tpanel{display:none;background:#fff;border-radius:0 0 var(--r-md) var(--r-md);overflow:hidden}

.tpanel.on{display:block}

.chip{display:inline-flex;align-items:center;padding:5px 14px;border-radius:var(--r-full);border:1px solid var(--c-line);background:#fff;color:var(--c-ink-2);font-size:var(--fs-13);cursor:pointer;white-space:nowrap}

.chip.on{background:var(--c-primary-soft);border-color:var(--c-primary-border);color:var(--c-primary-ink);font-weight:600}

.chiprow{display:flex;gap:8px;overflow-x:auto;padding:2px}

/* .care-lv-row / .care-lv-row .chip（A+ 字号档位选择器）已于 2026-09-28 随各端 profile 页的档位条一并删除；
   A+ 字号入口只剩三端 hero 右上角胶囊与 PC 顶栏勾选框，两档仍为离散值，机制见 common.js syncCare */

.searchbox{display:flex;align-items:center;gap:8px;background:#fff;border:1px solid var(--c-line);border-radius:var(--r-full);padding:9px 14px;box-shadow:var(--sh-sm)}

.searchbox .ic{color:var(--c-ink-3)}

.searchbox input{border:0;outline:0;flex:1;font-size:var(--fs-15);background:transparent;min-width:0}

.filterbar{display:flex;gap:8px;align-items:center;flex-wrap:wrap}

.select.mini{width:auto;min-width:120px;padding:7px 30px 7px 10px;font-size:var(--fs-13)}

/* ---------- 10 弹层 / 提示 / 空态 ---------- */
/* 小程序约束：自绘遮罩弹层可行，但两端系统弹层体验与无障碍更一致
   → 落地：确认框用 uni.showModal、轻提示用 uni.showToast；需自绘时保留 fixed <view>（fixed 相对视口语义一致） */
.mask{position:fixed;inset:0;background:rgba(0,10,26,.45);z-index:90;display:flex;align-items:center;justify-content:center;padding:32px;animation:fadeIn .15s}

.modal{background:#fff;border-radius:var(--r-lg);max-width:320px;width:100%;padding:22px 20px 16px;animation:pop .18s}

.m-title{font-size:var(--fs-17);font-weight:700;text-align:center;margin-bottom:10px}

.m-text{font-size:var(--fs-14);color:var(--c-ink-2);line-height:1.7;text-align:center}

.m-btns{display:flex;gap:10px;margin-top:18px}

.m-btns .btn{flex:1;min-height:2.6rem}

@keyframes fadeIn{from{opacity:0}}

@keyframes pop{from{opacity:0;transform:scale(.92)}}

/* 小程序约束：同上 → 落地：uni.showToast / uni.showLoading（时长与遮罩由平台控制） */
.toast{position:fixed;left:50%;bottom:16%;transform:translateX(-50%) translateY(8px);background:rgba(0,20,46,.86);color:#fff;
  font-size:var(--fs-14);padding:10px 18px;border-radius:var(--r-full);opacity:0;transition:all .25s;z-index:99;pointer-events:none;max-width:80%;text-align:center}

.toast.show{opacity:1;transform:translateX(-50%) translateY(0)}

.empty{text-align:center;padding:44px 20px;color:var(--c-ink-3)}

.empty .e-ico{font-size:var(--fs-ic-40);margin-bottom:10px}

/* 成功态空图标：改前内联 style="color:var(--c-ok-deep)" */
.e-ico.ok{color:var(--c-ok-deep)}

.empty .e-txt{font-size:var(--fs-15);margin-bottom:6px;color:var(--c-ink-2)}

.empty .e-sub{font-size:var(--fs-13);margin-bottom:16px;line-height:1.6}

/* ---------- 11 移动端导航壳（支付宝：蓝色渐变沉浸头 + 白色 TabBar） ---------- */
/* 小程序约束：自定义导航栏用 position:sticky，在支付宝端 scroll-view 内偶发失效
   → 真机核验项；必要时改走原生导航栏 + titleBarColor 着色，渐变头只在支持的端保留 */
.appbar{position:sticky;top:0;z-index:50;background:var(--c-primary-gradient);color:#fff;box-shadow:0 2px 12px rgba(9,30,66,.12)}

/* 小程序约束：状态栏（时间/信号/电量）由手机系统绘制，小程序无权限渲染
   → 落地：.statusbar / .phone-only 仅为原型机身边框装饰，实现时整条删除，真实间距由安全区决定 */
.statusbar{display:flex;justify-content:space-between;align-items:center;padding:6px 16px 0;font-size:var(--fs-12);opacity:.92}

.navbar{display:flex;align-items:center;height:2.9rem;padding:0 10px}

.nav-left{width:64px;display:flex}

.nav-back{background:none;border:0;color:#fff;font-size:var(--fs-ic-28);line-height:1;padding:4px 8px;margin-left:-4px}

.nav-title{flex:1;text-align:center;font-size:var(--fs-17);font-weight:700;letter-spacing:.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

.nav-right{width:118px;display:flex;align-items:center;justify-content:flex-end;gap:8px}

/* 小程序约束：导航栏右侧永远是宿主绘制的系统胶囊区（微信 / 支付宝 均为「··· ⊙」），自定义控件不可放入；
   原 .capsule 仿胶囊与 .care A+ 字号按钮已删除 → 落地：实现时删除本节点，此处仅按等宽保留区标注「这块不是你的」 */
.nav-sys{width:86px;height:26px;border-radius:var(--r-full);pointer-events:none;font-size:0;
  border:1px dashed rgba(255,255,255,.45);
  background:repeating-linear-gradient(135deg,rgba(255,255,255,.20) 0 4px,rgba(255,255,255,.05) 4px 8px)}

/* 小程序约束：原生 tabBar 由系统绘制、不可加装饰；自定义 tabBar 仍是 webview 内普通组件
   → 落地：微信 custom:true / 支付宝 customize:true，list 仍须声明（上限 5，见 README 端形态说明）；
     图标必须本地图片，iconfont 在原生 tabBar 内不可用 */
.tabbar{position:fixed;left:50%;transform:translateX(-50%);bottom:0;width:100%;max-width:520px;background:#fff;
  border-top:1px solid var(--c-line);display:flex;z-index:60;box-shadow:0 -2px 12px rgba(9,30,66,.05);padding-bottom:env(safe-area-inset-bottom)}

.tb{flex:1;display:flex;flex-direction:column;align-items:center;gap:2px;padding:7px 0 8px;color:var(--c-ink-3);font-size:var(--fs-11);cursor:pointer}

.tb-ico{font-size:var(--fs-ic-22);line-height:1.15}

.tb.on{color:var(--c-primary);font-weight:700}

.tb.on .tb-ico{color:var(--c-primary)}

/* ---------- 12 数据展示 ---------- */
.hero{background:var(--c-primary-gradient);border-radius:var(--r-lg);color:#fff;padding:18px 16px;margin-bottom:12px;position:relative;overflow:hidden;box-shadow:0 4px 16px rgba(22,119,255,.20)}

.hero .h1{font-size:var(--fs-20);font-weight:700;margin-bottom:4px}

.hero .h2{font-size:var(--fs-13);opacity:.92}

.hero .tag{background:rgba(255,255,255,.20);color:#fff;border:1px solid rgba(255,255,255,.38)}

.scan-big{display:flex;align-items:center;gap:14px;background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-md);padding:16px;cursor:pointer}

.scan-big .ic{width:3.4rem;height:3.4rem;border-radius:var(--r-md);background:var(--c-primary-gradient);color:#fff;display:flex;align-items:center;justify-content:center;font-size:var(--fs-ic-28);flex-shrink:0;box-shadow:0 4px 12px rgba(22,119,255,.28)}

.qgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:6px;background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-sm);padding:12px 6px}

.q{display:flex;flex-direction:column;align-items:center;gap:6px;padding:8px 2px;border-radius:var(--r-sm);cursor:pointer;font-size:var(--fs-12);color:var(--c-ink-2);position:relative}

.q:active{background:var(--c-primary-softer)}

/* 支付宝宫格：彩色渐变圆角图标 */
.q .qi{width:2.6rem;height:2.6rem;border-radius:var(--r-md);display:flex;align-items:center;justify-content:center;font-size:var(--fs-ic-22);
  background:var(--c-primary-gradient);color:#fff;box-shadow:0 3px 8px rgba(9,30,66,.18)}

.q .qi.ok{background:linear-gradient(135deg,#4CD97A,#00B42A);box-shadow:0 3px 8px rgba(0,180,42,.22)}

.q .qi.warn{background:linear-gradient(135deg,#FFB25C,#FF7D00);box-shadow:0 3px 8px rgba(255,125,0,.22)}

.q .qi.plain{background:linear-gradient(135deg,#B9C2CE,#8A94A3);box-shadow:0 3px 8px rgba(138,148,163,.20)}

.q .qi.red{background:linear-gradient(135deg,#FF7875,#F5222D);box-shadow:0 3px 8px rgba(245,34,45,.22)}

.q .qi.purple{background:linear-gradient(135deg,#B37FEB,#722ED1);box-shadow:0 3px 8px rgba(114,46,209,.22)}

.q .qi.cyan{background:linear-gradient(135deg,#5CDBD3,#13C2C2);box-shadow:0 3px 8px rgba(19,194,194,.22)}

.q .qi.gold{background:linear-gradient(135deg,#FFD666,#FAAD14);box-shadow:0 3px 8px rgba(250,173,20,.22)}

.q .qi.lime{background:linear-gradient(135deg,#A0D911,#7CB305);box-shadow:0 3px 8px rgba(124,179,5,.22)}

.q .qi.vol{background:linear-gradient(135deg,#FF8C4A,#FA661A);box-shadow:0 3px 8px rgba(250,102,26,.22)}

.q .dot{position:absolute;top:4px;right:14%;min-width:16px;height:16px;border-radius:999px;background:var(--c-danger);color:#fff;font-size:var(--fs-11);display:flex;align-items:center;justify-content:center;padding:0 4px}

.stat-row{display:grid;grid-template-columns:repeat(3,1fr);gap:8px}

.stat{background:#fff;border-radius:var(--r-md);box-shadow:var(--sh-sm);text-align:center;padding:12px 4px}

.stat .n{font-size:var(--fs-22);font-weight:700;color:var(--c-primary)}

.stat .l{font-size:var(--fs-12);color:var(--c-ink-2);margin-top:2px}

.stat.hot .n{color:var(--c-danger)}

/* 台账月度汇总：4 项指标按 2×2 排（375px 下四列并排会把「线上148 · 线下38」挤到换行），
   .u = 数字后的量词（降号灰），.d = 构成 / 对标行；配色按指标语义分流（办结=成功绿 / 时限=警示橙 / 金额=账单墨，
   受理沿用 .stat 基线的主蓝），避免整屏四色。均为新增选择器，不动 .stat 基线，消费者端与商户端台账不受影响 */
.stat-row.two{grid-template-columns:repeat(2,1fr);gap:10px}
.stat-row.two .stat{padding:14px 10px}
.stat-row.two .stat .n{font-size:var(--fs-24)}
.stat .u{font-size:var(--fs-12);font-weight:600;color:var(--c-ink-3);margin-left:3px}
.stat .d{font-size:var(--fs-11);color:var(--c-ink-3);margin-top:4px}
.stat.ok .n{color:var(--c-ok-deep)}
.stat.warn .n{color:var(--c-warn-deep)}
.stat.money .n{color:var(--c-ink)}

.cd{display:inline-flex;align-items:center;gap:4px;background:var(--c-warn-soft);color:var(--c-warn-deep);border-radius:var(--r-sm);
  font-size:var(--fs-12);font-weight:700;padding:2px 8px;font-variant-numeric:tabular-nums}

.cd.hot{background:var(--c-danger-soft);color:var(--c-danger-deep);animation:blink 1.2s infinite}

@keyframes blink{50%{opacity:.55}}

.prog{height:8px;border-radius:999px;background:var(--c-line-2);overflow:hidden}

.prog-in{height:100%;border-radius:999px;background:var(--c-primary-gradient);width:40%}

.kpi{background:#fff;border:1px solid var(--c-line);border-radius:var(--r-md);padding:12px 14px}

.kpi .kpi-l{font-size:var(--fs-13);color:var(--c-ink-2)}

.kpi .kpi-v{font-size:var(--fs-22);font-weight:700;margin-top:4px;font-variant-numeric:tabular-nums}

.kpi .kpi-d{font-size:var(--fs-12);margin-top:2px}

.kpi-grid{display:grid;grid-template-columns:repeat(4,1fr);gap:12px}

.cols{display:grid;grid-template-columns:1fr 1fr;gap:16px;align-items:start}

.cols.aside{grid-template-columns:minmax(0,2fr) minmax(0,1fr)}

@media (max-width:900px){.cols,.cols.aside{grid-template-columns:1fr}}

.bar-chart{display:flex;align-items:flex-end;gap:10px;height:120px;padding:6px 4px 0}

.bar-chart .bc{flex:1;display:flex;flex-direction:column;align-items:center;gap:6px;height:100%;justify-content:flex-end}

/* 柱高由页面内联 style="height:NN%" 带出。
   小程序约束：wxml / axml 的内联 style 不能写 CSS 自定义属性（style="--h:{{item.pct}}" 在两端不生效）
   → 落地：去掉 --h 中转，百分比直接落在 height 上；此处内联 style 属数据驱动量，是允许保留的那一类 */
.bar-chart .b{width:60%;max-width:34px;background:var(--c-primary-tint-2);border-radius:6px 6px 0 0;position:relative}

.bar-chart .b.hot{background:var(--c-warn)}

.bar-chart .bl{font-size:var(--fs-11);color:var(--c-ink-3)}

.bar-chart .bv{font-size:var(--fs-12);color:var(--c-ink);font-weight:700}

/* ---------- 13 PC 政务后台（data-end="gov" · 政务蓝 #3A74C4 + 深蓝 #1A3E6E 侧栏） ---------- */
body.gov{background:var(--c-primary-softer)}

.admin{display:flex;min-height:100vh}

.side{width:220px;flex-shrink:0;background:var(--c-primary-deep);color:#fff;display:flex;flex-direction:column;position:sticky;top:0;height:100vh}

.side-brand{padding:20px 18px 16px;border-bottom:1px solid rgba(255,255,255,.12)}

/* 品牌标识行：图标 + 本级品牌名，放大到将近占满 220px 深蓝侧栏（内容宽 184）
   46 + 12 + 「石维宝」28px ≈ 174；大号档改用 --fs-24（30px ≈ 180），
   仍比标准档大，但不再往上叠，否则 35px 一档会把图标挤没 */
.side-brand .sb-row{display:flex;align-items:center;gap:12px;font-size:var(--fs-28)}

.side-brand .sb-logo{width:46px;height:auto;aspect-ratio:1;border-radius:12px;flex-shrink:0}

.side-brand .t{font-weight:700;letter-spacing:1px;white-space:nowrap}

.side-brand .s{font-size:var(--fs-11);opacity:.72;margin-top:8px}

.side-brand .sb-scope{font-size:var(--fs-10);opacity:.55;margin-top:6px;padding-top:6px;border-top:1px solid rgba(255,255,255,.12);line-height:1.6}

html.lg .side-brand .sb-row{font-size:var(--fs-24)}

.side-menu{flex:1;overflow-y:auto;padding:10px 10px 20px}

.side-item{display:flex;align-items:center;gap:10px;padding:11px 12px;border-radius:var(--r-sm);color:rgba(255,255,255,.78);
  font-size:var(--fs-14);cursor:pointer;margin-bottom:2px}

.side-item .si{font-size:var(--fs-ic-18);width:20px;text-align:center}

.side-item:hover{background:rgba(255,255,255,.08);color:#fff}

.side-item.on{background:var(--c-primary-fill);color:#fff;font-weight:600}

.side-foot{padding:12px 18px;font-size:var(--fs-11);opacity:.55;border-top:1px solid rgba(255,255,255,.12)}

.main{flex:1;min-width:0;display:flex;flex-direction:column}

.topbar{height:56px;background:#fff;border-bottom:1px solid var(--c-line);display:flex;align-items:center;gap:14px;padding:0 22px;position:sticky;top:0;z-index:40}

.crumb{font-size:var(--fs-15);font-weight:600}

.crumb .sub{color:var(--c-ink-3);font-weight:400;font-size:var(--fs-13);margin-left:8px}

.endkey{font-size:var(--fs-12);color:var(--c-primary);background:var(--c-primary-soft);border:1px solid var(--c-primary-border);border-radius:var(--r-full);padding:2px 10px}

.tb-right{margin-left:auto;display:flex;align-items:center;gap:14px;font-size:var(--fs-13);color:var(--c-ink-2)}

.tb-bell{position:relative;width:34px;height:34px;border:0;border-radius:var(--r-sm);background:transparent;font-size:var(--fs-17);cursor:pointer;line-height:1}

.tb-bell:hover{background:var(--c-primary-wash)}

.tb-bell .dot{position:absolute;top:5px;right:6px;width:8px;height:8px;border-radius:50%;background:var(--c-danger);border:2px solid #fff}
.ntf-wrap{position:relative}

.ntf-pop{position:absolute;right:0;top:calc(100% + 10px);width:22rem;max-width:78vw;background:#fff;border:1px solid var(--c-line);border-radius:var(--r-lg);box-shadow:var(--sh-lg);padding:8px;z-index:70}

.ntf-it{display:flex;gap:10px;padding:9px 10px;border-radius:var(--r-sm);text-decoration:none;align-items:flex-start}

.ntf-it:hover{background:var(--c-primary-wash)}

.ntf-ico{font-size:var(--fs-17);line-height:1.4}

.ntf-bd{min-width:0}

.ntf-t{display:block;font-size:var(--fs-13);font-weight:600;color:var(--c-ink)}

.ntf-x{display:block;font-size:var(--fs-11);color:var(--c-ink-3);margin-top:2px;line-height:1.6}

.ntf-empty{padding:22px 12px;text-align:center;font-size:var(--fs-12);color:var(--c-ink-3)}

.ntf-all{display:block;margin-top:6px;padding:9px 10px;border-top:1px solid var(--c-line);border-radius:0 0 var(--r-sm) var(--r-sm);
  text-align:center;font-size:var(--fs-12);font-weight:600;color:var(--c-primary-ink);text-decoration:none}

.ntf-all:hover{background:var(--c-primary-wash)}

.lv-pick{height:30px;padding:0 6px;font-size:var(--fs-12);color:var(--c-primary);background:var(--c-primary-soft);
  border:1px solid var(--c-primary-border);border-radius:var(--r-sm);cursor:pointer;font-family:inherit}

.lv-pick:hover{background:var(--c-primary-wash)}

.care-pc{display:inline-flex;align-items:center;gap:7px;cursor:pointer;font-size:var(--fs-13);color:var(--c-ink-2)}

.care-pc input{accent-color:var(--c-primary);width:15px;height:15px;cursor:pointer}

.tb-user{display:flex;align-items:center;gap:8px}

.avatar{width:30px;height:30px;border-radius:50%;background:var(--c-primary-gradient);color:#fff;display:flex;align-items:center;justify-content:center;font-size:var(--fs-13);font-weight:700}

.wrap{padding:20px 22px 40px;max-width:1280px;width:100%}

.panel{background:#fff;border:1px solid var(--c-line);border-radius:var(--r-lg);box-shadow:var(--sh-sm);margin-bottom:16px}

.panel-hd{display:flex;align-items:center;justify-content:space-between;padding:14px 18px;border-bottom:1px solid var(--c-line-2);flex-wrap:wrap;gap:10px}

.panel-t{font-size:var(--fs-16);font-weight:700}

.panel-bd{padding:16px 18px}

/* 表格容器：th 一律 nowrap、操作列可能并排三个按钮，表格最小内容宽度会超出面板；
   横向滚动条落在面板内部，避免把整个页面撑宽（.wrap max-width 之外出现文档级滚动） */
.panel-bd.flush{padding:0;overflow-x:auto}

.tbl{width:100%;border-collapse:collapse;font-size:var(--fs-13)}

.tbl th{background:var(--c-primary-softer);color:var(--c-primary-ink);text-align:left;font-weight:600;padding:11px 12px;white-space:nowrap;border-bottom:1px solid var(--c-primary-border)}

.tbl td{padding:11px 12px;border-bottom:1px solid var(--c-line-2);color:var(--c-ink);vertical-align:middle}

.tbl tr:last-child td{border-bottom:0}

.tbl tr:hover td{background:var(--c-primary-wash)}

.tbl .t-sub{display:block;font-size:var(--fs-11);color:var(--c-ink-3);margin-top:2px}

.tr-hot td{background:var(--c-danger-soft)!important}

/* 小程序约束：wxml / axml 无 <table>，横向滚动必须交给 <scroll-view scroll-x>
   → 落地：<scroll-view scroll-x> 包一行行 <view>（.gt-row），首列 position:sticky 固定。
     原型用下列纯 <view> 盒模型表达同一结构，开发可 1:1 还原；
     真机核验项：支付宝端 scroll-view 内 sticky 偶发失效，必要时改「固定首列 + 右侧独立滚动区」两块布局 */
.gtable{overflow-x:auto;border:1px solid var(--c-line);border-radius:var(--r-md)}

.gt-row{display:flex;min-width:660px;border-bottom:1px solid var(--c-line-2)}

.gt-row:last-child{border-bottom:0}

.gt-head{background:var(--c-primary-softer)}

.gt-c{flex:1 0 auto;min-width:92px;padding:9px 10px;font-size:var(--fs-12);color:var(--c-ink);white-space:nowrap;display:flex;align-items:center}

.gt-head .gt-c{font-size:var(--fs-11);color:var(--c-primary-ink);font-weight:600}

.gt-c.gt-key{flex:0 0 auto;min-width:128px;font-weight:600;position:sticky;left:0;z-index:2;background:var(--c-card);box-shadow:1px 0 0 var(--c-line)}

.gt-head .gt-c.gt-key{background:var(--c-primary-softer)}

.pager{display:flex;align-items:center;justify-content:flex-end;gap:6px;padding:12px 14px;font-size:var(--fs-13);color:var(--c-ink-2)}

.pager span{min-width:28px;height:28px;display:inline-flex;align-items:center;justify-content:center;border:1px solid var(--c-line);border-radius:6px;background:#fff;cursor:pointer}

.pager span.on{background:var(--c-primary-fill);border-color:var(--c-primary-fill);color:#fff}

.pager span:hover:not(.on):not(.dot){border-color:var(--c-primary-border)}

.login-wrap{min-height:100vh;display:flex;align-items:center;justify-content:center;padding:20px 16px;background:var(--c-primary-gradient)}

/* margin:auto 而非靠 align-items:center 居中：卡片高于视口时自动外边距两端都能滚到，不会被裁掉滚不回来 */
.login-card{background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-lg);width:400px;max-width:100%;margin:auto;padding:26px 22px 22px}

.login-card .lc-t{font-size:var(--fs-22);font-weight:700;text-align:center;margin-bottom:4px}

.login-card .lc-s{font-size:var(--fs-13);color:var(--c-ink-3);text-align:center;margin-bottom:20px}

.login-card .input{margin-bottom:14px}

/* 登录卡品牌方图：圆角是定值，收进 class（原先各登录页各写一份内联 style） */
.login-logo{display:block;margin:0 auto;border-radius:18px}

.warnline{display:flex;gap:10px;align-items:flex-start;background:var(--c-danger-soft);border:1px solid #FFC7C2;border-radius:var(--r-md);padding:10px 12px;font-size:var(--fs-13);color:var(--c-danger-deep)}

.optline{display:flex;align-items:center;gap:14px;flex-wrap:wrap;font-size:var(--fs-14)}

.optline label{display:inline-flex;align-items:center;gap:6px;cursor:pointer}

.optline input{accent-color:var(--c-primary);width:15px;height:15px}

/* ---------- 14 原型总览页 index.html ---------- */
body.ov{background:linear-gradient(135deg,#F0F5FF,#E6EEFB);max-width:none;box-shadow:none;min-height:100vh}

.ov-head{background:var(--c-primary-gradient);color:#fff;padding:34px 24px;text-align:center}

.ov-head h1{margin:0 0 8px;font-size:var(--fs-24);letter-spacing:2px}

.ov-head p{margin:0;opacity:.92;font-size:var(--fs-14)}

.ov-bar{max-width:1180px;margin:18px auto 0;display:flex;align-items:center;justify-content:center;gap:14px;flex-wrap:wrap}

.ov-tabs{display:inline-flex;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.38);border-radius:var(--r-full);padding:4px;gap:4px}

.ov-tab{border:0;background:transparent;color:#fff;font-size:var(--fs-14);padding:7px 20px;border-radius:var(--r-full);font-weight:600}

.ov-tab.on{background:#fff;color:var(--c-primary)}

/* 并列预览舞台：消费者/商户/服务站三端手机一行，基层所 PC 端独占下一行 */
.ov-board{padding:26px 20px 6px;display:flex;flex-direction:column;gap:30px;overflow-x:auto}

.ov-row{display:flex;gap:26px;align-items:flex-start;width:max-content;margin:0 auto}

.ov-unit{width:399px;flex-shrink:0;display:flex;flex-direction:column}

.ov-unit-pc{width:1220px}

.ov-unit-hd{background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-sm);padding:11px 16px;margin-bottom:12px;display:flex;align-items:baseline;gap:10px}

.ov-unit-hd h2{margin:0;font-size:var(--fs-16);font-weight:700;color:var(--c-primary)}

.ov-unit-hd span{font-size:var(--fs-12);color:var(--c-ink-3)}

.ov-phone{background:#0B1B33;border-radius:34px;padding:12px;box-shadow:var(--sh-lg);flex-shrink:0}

.ov-screen{width:375px;height:812px;border:0;border-radius:24px;background:#fff;display:block}

/* PC 外壳：基层所端 1180×760 桌面预览 */
.ov-shell-pc{background:#0B1B33;border-radius:20px;padding:10px;box-shadow:var(--sh-lg);flex-shrink:0}

.ov-shell-pc .ov-screen{width:1180px;height:760px;border-radius:14px}

/* 每端独立的页面切换导航（分组 + 换行小块） */
.ov-nav{margin-top:14px;background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-sm);padding:12px 14px}

.ov-nav-grp + .ov-nav-grp{margin-top:10px;padding-top:10px;border-top:1px dashed var(--c-line)}

.ov-nav-t{font-size:var(--fs-12);font-weight:700;color:var(--c-ink-2);margin-bottom:8px}

.ov-nav-items{display:flex;flex-wrap:wrap;gap:6px}

.ov-sec{max-width:1180px;margin:0 auto 30px;padding:0 20px}

.ov-card{background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-sm);padding:22px 24px}

.ov-card h3{margin:0 0 12px;font-size:var(--fs-17)}

.ov-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:14px}

.ov-sw{display:inline-block;width:26px;height:26px;border-radius:8px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.06);vertical-align:middle;margin-right:6px}

.ov-foot{text-align:center;color:var(--c-ink-3);font-size:var(--fs-13);padding:26px 0 40px}

/* ---------- 总览单预览：页面导航 + 居中外壳（手机/PC） ---------- */
.ov-pagenav{margin:20px auto 0;background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-sm);padding:14px 18px}
.ov-wrap{display:flex;justify-content:center;padding:22px 16px 6px;overflow-x:auto}

/* ---------- 15 设计规范页 theme-system.html ---------- */
body.ts{background:#F2F5F9;max-width:none;box-shadow:none}

.ts-head{background:var(--c-primary-gradient);color:#fff;padding:30px 20px}

.ts-head .in{max-width:1180px;margin:0 auto}

.ts-head h1{margin:0 0 10px;font-size:var(--fs-22)}

.ts-sub{font-size:var(--fs-14);line-height:1.8;opacity:.94;max-width:900px}

.ts-bar{display:flex;align-items:center;gap:14px;margin-top:16px;flex-wrap:wrap}

.ts-lgtoggle{display:inline-flex;align-items:center;gap:7px;background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.42);
  border-radius:var(--r-full);padding:6px 14px;font-size:var(--fs-13);cursor:pointer}

.ts-lgtoggle input{accent-color:#fff;width:15px;height:15px}

.ts-state{font-size:var(--fs-13);opacity:.92}

/* 规范页 A+ 字号两档演示条：对应落地形态 =「我的」页内档位选择 + 首页 hero 胶囊（不进导航栏） */
.ts-lvrow{display:inline-flex;align-items:center;gap:6px;flex-wrap:wrap}

.ts-lvrow>b{font-size:var(--fs-13);font-weight:500;opacity:.94;margin-right:2px}

.ts-lvrow .lv{display:inline-flex;align-items:center;justify-content:center;min-height:2rem;padding:6px 14px;border-radius:var(--r-full);
  background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.42);font-size:var(--fs-13);cursor:pointer;white-space:nowrap}

.ts-lvrow .lv.on{background:#fff;border-color:#fff;color:var(--c-primary-ink);font-weight:700}

.ts-wrap{max-width:1180px;margin:0 auto;padding:26px 20px 50px}

.ts-sec{margin-bottom:34px}

.ts-h2{font-size:var(--fs-18);font-weight:700;margin-bottom:10px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}

.ts-h2 .sm{font-size:var(--fs-12);color:var(--c-ink-3);font-weight:500}

.ts-desc{font-size:var(--fs-13);color:var(--c-ink-2);line-height:1.8;margin-bottom:14px}

.ts-grid3{display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:16px}

.ts-grid2{display:grid;grid-template-columns:repeat(auto-fit,minmax(380px,1fr));gap:16px}

.ts-pane{background:#fff;border:1px solid var(--c-line);border-radius:var(--r-lg);overflow:hidden;box-shadow:var(--sh-sm)}

.ts-pane-hd{display:flex;align-items:center;gap:10px;padding:12px 16px;border-bottom:1px solid var(--c-line-2);flex-wrap:wrap}

.ts-pane-hd .nm{font-weight:700;font-size:var(--fs-15)}

.ts-pane-hd .key{margin-left:auto;font-size:var(--fs-12);color:var(--c-ink-3)}

.ts-pane-hd .ver{font-size:var(--fs-12);color:var(--c-primary);background:var(--c-primary-soft);padding:2px 8px;border-radius:var(--r-full)}

.ts-pane-bd{padding:14px 16px;display:flex;flex-direction:column;gap:10px}

.ts-swatches{display:flex;gap:6px;flex-wrap:wrap}

.ts-sw{width:34px;height:34px;border-radius:8px;box-shadow:inset 0 0 0 1px rgba(0,0,0,.05)}

.ts-demo{border:1px solid var(--c-line-2);border-radius:var(--r-md);padding:12px;display:flex;flex-direction:column;gap:8px}

.ts-cc{font-size:var(--fs-12);color:var(--c-ink-3);line-height:1.8}

.ts-cc .pass{color:var(--c-ok-deep);background:var(--c-ok-soft);border-radius:4px;padding:0 6px;margin:0 2px;font-weight:600}

.ts-cc .fail{color:var(--c-danger-deep);background:var(--c-danger-soft);border-radius:4px;padding:0 6px;margin:0 2px;font-weight:600}

.ts-type{width:100%;border-collapse:collapse;font-size:var(--fs-13)}

.ts-type th{background:var(--c-primary-softer);color:var(--c-primary-ink);text-align:left;padding:9px 10px;border-bottom:1px solid var(--c-primary-border);white-space:nowrap}

.ts-type td{padding:9px 10px;border-bottom:1px solid var(--c-line-2);vertical-align:middle}

.ts-type .tk{font-weight:600;color:var(--c-primary-ink);font-family:Consolas,monospace;font-size:var(--fs-12)}

.ts-type .px{font-variant-numeric:tabular-nums;white-space:nowrap}

.ts-type tr.is-base td{background:var(--c-primary-wash)}

.ts-type .sample{white-space:nowrap}

.ts-note{border:1px solid var(--c-primary-border);background:var(--c-primary-wash);border-radius:var(--r-md);padding:14px 16px;font-size:var(--fs-13);line-height:1.8}

.ts-note.plain{background:var(--c-line-2);border-color:var(--c-line)}

.ts-note .hd{font-weight:700;margin-bottom:6px;color:var(--c-primary-ink)}

.ts-note.plain .hd{color:var(--c-ink)}

.ts-code{background:#0B1B33;color:#D7E3F4;border-radius:var(--r-md);padding:14px 16px;font-size:var(--fs-12);
  font-family:Consolas,monospace;line-height:1.9;overflow-x:auto}

.ts-code b{color:#69B1FF;font-weight:600}

.ts-wire{border:1.5px dashed var(--c-primary-border);border-radius:var(--r-md);padding:12px;background:var(--c-primary-softer)}

/* 协议书纸面：改前内联 background:var(--c-bg,#f7f8fa);line-height:2（fallback 一并保留，取值与改前逐字一致） */
.ts-wire.paper{background:var(--c-bg, #f7f8fa);line-height:2}
/* 线框纸面只换底色、不动行高（改前内联 background:var(--c-bg,#f7f8fa)） */
.ts-wire.plain{background:var(--c-bg, #f7f8fa)}

.ts-wf{background:#fff;border:1px solid var(--c-line);border-radius:6px;text-align:center;font-size:var(--fs-12);color:var(--c-ink-2);padding:10px 6px;margin-bottom:8px}

.ts-wf.top{background:var(--c-primary-soft);color:var(--c-primary-ink);font-weight:600}

.ts-wf.tab{background:var(--c-line-2)}

.ts-wf.side{position:absolute;left:12px;top:56px;bottom:56px;width:54px;display:flex;align-items:center;justify-content:center;writing-mode:vertical-lr;letter-spacing:4px}

.ts-col{margin-left:0}

/* ---------- 16 其它 ---------- */
/* 小程序约束：渲染层无滚动条概念，<scroll-view> 用 hide-scrollbar 控制 → 落地：实现时整段删除 */
::-webkit-scrollbar{width:6px;height:6px}

::-webkit-scrollbar-thumb{background:#C9D2DD;border-radius:3px}

[hidden]{display:none!important}

/* ---------- 17 统一版增强组件（吸收 trae / codebuddy） ---------- */
/* 状态头卡：工单详情顶部四色语义（源自 trae status-hero） */
.status-hero{display:flex;align-items:center;gap:12px;border-radius:var(--r-lg);padding:14px 16px;color:#fff}

.status-hero .sh-ico{width:42px;height:42px;border-radius:12px;background:rgba(255,255,255,.22);display:flex;align-items:center;justify-content:center;font-size:var(--fs-ic-24);flex:none}

.status-hero .sh-t{font-size:var(--fs-17);font-weight:700}

.status-hero .sh-s{font-size:var(--fs-12);opacity:.94;margin-top:2px;line-height:1.6}

.status-hero.info{background:var(--c-primary-gradient)}

.status-hero.warn{background:linear-gradient(135deg,#D25F00,#FF9A2E)}

.status-hero.danger{background:linear-gradient(135deg,#CB2634,#FF6B6B)}

.status-hero.ok{background:linear-gradient(135deg,#009A29,#3BD166)}

/* 大勾选卡：初审结论 / 处置制式勾选（源自 trae big-check） */
.big-check{display:flex;align-items:flex-start;gap:12px;border:1.5px solid var(--c-line);border-radius:var(--r-md);padding:13px 14px;cursor:pointer;transition:border-color .15s,background .15s}

.big-check+.big-check{margin-top:10px}

.big-check input{width:24px;height:24px;accent-color:var(--c-primary);flex:none;margin-top:1px}

.big-check .bc-t{font-size:var(--fs-16);font-weight:600;line-height:1.5}
/* 重复工单行：标题降一档字号（改前内联 font-size:var(--fs-14)，须压过 .big-check .bc-t） */
.big-check .bc-t.sm{font-size:var(--fs-14)}

.big-check .bc-s{font-size:var(--fs-12);color:var(--c-ink-3);margin-top:3px;line-height:1.7}

.big-check.on{border-color:var(--c-primary);background:var(--c-primary-wash)}

.big-check.on .bc-t{color:var(--c-primary-ink)}

/* 会话气泡：消费者 / 商户沟通（源自 codebuddy chat；原「调解记录」会话随组织调解下线撤销） */
.chat-flow{display:flex;flex-direction:column;gap:10px}

.cf{display:flex;gap:8px;align-items:flex-end}

.cf.r{flex-direction:row-reverse}

.cf-av{width:30px;height:30px;border-radius:50%;background:var(--c-line-2);display:flex;align-items:center;justify-content:center;font-size:var(--fs-14);flex:none}

.cf-b{max-width:76%;background:#fff;border:1px solid var(--c-line);border-radius:12px 12px 12px 4px;padding:9px 12px;font-size:var(--fs-14);line-height:1.7}

.cf.r .cf-b{background:var(--c-primary-soft);border-color:var(--c-primary-border);color:var(--c-primary-ink);border-radius:12px 12px 4px 12px}

.cf-meta{font-size:var(--fs-11);color:var(--c-ink-3);margin-top:3px}

.cf-card{max-width:88%;background:#fff;border:1.5px solid var(--c-primary-border);border-radius:var(--r-md);padding:12px}

/* 引用卡占满整行（改前内联 max-width:100%） */
.cf-card.wide{max-width:100%}
/* 商户侧头像：区别于默认灰底（改前内联 background:var(--c-primary-soft)） */
.cf-av.brand{background:var(--c-primary-soft)}

.cf-card .cc-t{font-weight:700;font-size:var(--fs-14);color:var(--c-primary-ink)}

.cf-card .cc-law{font-size:var(--fs-12);color:var(--c-ink-2);background:var(--c-primary-wash);border-radius:6px;padding:6px 8px;margin-top:8px;line-height:1.7}

/* PC 表格深蓝表头 + 斑马纹（源自 trae gov 表格） */
.tbl-deep th{background:var(--c-primary-dark);color:#fff;border-bottom:0}

.tbl-deep td{font-variant-numeric:tabular-nums}

.tbl-deep tbody tr:nth-child(even) td{background:#F5F9FF}

.tbl-deep tbody tr:hover td{background:var(--c-primary-wash)}

/* ---------- 18 消费者首页增强（沉浸式渐变头 + 悬浮操作卡 + 彩色功能位） ---------- */
/* 沉浸头：appbar 改纯色主色，hm-head 顶端同色向下渐变，二者无缝连成一体 */
/* 小程序约束：沉浸式渐变头不是默认导航栏 → 落地：微信 navigationStyle:"custom"、
   支付宝 transparentTitle:"always" + titleBarColor，两端在 pages.json 走条件编译 */
body[data-immersive] .appbar{background:var(--c-primary);box-shadow:none}

.hm-head{background:
    radial-gradient(120% 80% at 85% -10%, rgba(124,192,255,.38) 0%, rgba(124,192,255,0) 60%),
    linear-gradient(165deg,var(--c-primary) 0%,#2E86FF 52%,#1677FF 100%);
  color:#fff;padding:6px 16px 76px;position:relative;overflow:hidden}

/* 装饰层为 PNG 位图（原手绘内联 SVG 已出图）：cover + center bottom ≡ preserveAspectRatio="xMidYMax slice" */
.hm-deco{position:absolute;inset:0;z-index:0;pointer-events:none;
  background:url(../img/hm-deco.png?v=20260928d8) center bottom / cover no-repeat}

.hm-loc{display:inline-flex;align-items:center;gap:5px;font-size:var(--fs-13);font-weight:600;opacity:.96;position:relative;z-index:1}

.hm-loc .if{width:var(--fs-ic-18);height:var(--fs-ic-18)}

.hm-greet{display:flex;align-items:center;font-size:var(--fs-24);font-weight:800;letter-spacing:.5px;margin:0;position:relative;z-index:1}

.hm-greet .wave{font-size:var(--fs-20);margin-left:6px;flex:none}

/* 小程序约束：backdrop-filter 在支付宝部分机型失效 → 落地：毛玻璃仅作渐进增强，
   同时把半透明底提到不低于 .35 的实色，保证失效时对比度仍达标 */
.hm-switch{display:inline-flex;align-items:center;gap:3px;padding:3px 10px;border-radius:var(--r-full);
  background:rgba(255,255,255,.20);border:1px solid rgba(255,255,255,.40);color:#fff;font-size:var(--fs-12);font-weight:600;
  letter-spacing:0;line-height:1.5;white-space:nowrap;flex:none;cursor:pointer;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px)}

.hm-switch .if{font-size:var(--fs-14)}

.hm-switch:active{background:rgba(255,255,255,.34)}

/* 第十一轮 · 切端与登录态（首页 hero 第二行右侧一组，按 DB.crossEnds() 数据驱动渲染，最多一枚）
   第十二轮：整组统一留在蓝色调内，靠明度拉开层级——去商户端为浅底深字、去监管端为深蓝底白字、
   登录为白底反色（未登录态的第一 CTA）；商户橙只出现在商户端自身，不再用作跨端入口色 */
.hm-sw{display:inline-flex;align-items:center;gap:8px;flex:none;flex-wrap:wrap;justify-content:flex-end;
  margin-left:auto;position:relative;z-index:1}
.hm-switch.m{background:rgba(207,232,255,.95);border-color:rgba(255,255,255,.62);color:#0B4C9E}
.hm-switch.m:active{background:rgba(207,232,255,1)}
.hm-switch.g{background:rgba(26,62,110,.92);border-color:rgba(255,255,255,.52)}
.hm-switch.g:active{background:rgba(26,62,110,1)}
.hm-switch.l{background:#fff;border-color:#fff;color:var(--c-primary-ink);font-weight:700}
.hm-switch.l:active{background:rgba(255,255,255,.86)}
/* 未登录时登录页顶部的身份判定说明条复用 .notice */

/* 小程序约束：导航栏右侧被系统胶囊占据，A+ 字号入口不可再常驻顶栏 → 落地：入口下沉到页面内容
   （三端的首页 / 工作台右上角胶囊 = 两档互切的快捷开关；登录页大按钮与各端 profile 页的 .care-lv-row
     档位条均已撤除，2026-09-28 起不再保留其它字号入口） */
.hm-care{display:inline-flex;align-items:center;gap:4px;padding:3px 10px;border-radius:var(--r-full);position:relative;z-index:1;
  background:rgba(255,255,255,.18);border:1px solid rgba(255,255,255,.30);color:#fff;white-space:nowrap;
  font-size:var(--fs-12);font-weight:600;cursor:pointer;margin-left:auto}

.hm-care .if{width:var(--fs-ic-18);height:var(--fs-ic-18)}

/* 当前档位名（标准 / 大号，两档制）：由 common.js syncCare() 写入（三端 hero 胶囊 / 登录页大按钮共用） */
.care-lv{font-weight:700}

/* hero 右侧两胶囊（A+ 字号 + 切端）：375px 下长标题会把胶囊挤成第二行，故允许换行且右对齐保底 */
.hero-hd{flex-wrap:wrap;row-gap:8px}

.hm-acts{display:inline-flex;flex-direction:column;align-items:flex-end;gap:8px;flex:none;margin-left:auto}

/* A+ 字号关怀胶囊：不用图标、不显示档位名，改为文字 A+（大号 html.lg 变为 A-）。
   消费者端首页 hero 与三端工作台 hero 共用此样式；消费端首页 hm-row 内的切换按钮不受影响 */
.hm-care .care-if{font-style:normal;font-weight:800;font-size:var(--fs-14);line-height:1;letter-spacing:0}
.hm-care .care-if em{font-style:normal}
.hm-care .care-if .a-neg{display:none}
html.lg .hm-care .care-if .a-pos{display:none}
html.lg .hm-care .care-if .a-neg{display:inline}
.hm-acts .hm-switch .sw-txt{white-space:nowrap}


.hm-top{position:relative;z-index:1}

.hm-row{display:flex;align-items:center;justify-content:space-between;gap:12px}

.hm-r2{align-items:flex-start;margin-top:10px}

.hm-s11{display:block;margin-top:9px;font-size:var(--fs-14);font-weight:500;letter-spacing:1.5px;line-height:1.4;opacity:.9;white-space:nowrap;position:relative;z-index:1}

.hm-body{padding-top:8px}

.hm-panel{margin:-56px 0 12px;background:#fff;border-radius:var(--r-lg);box-shadow:0 10px 30px rgba(9,30,66,.14);position:relative;z-index:2;overflow:hidden}

.hm-scan{display:flex;align-items:center;gap:14px;padding:16px 16px 15px;cursor:pointer}

.hm-scan .ic{width:3rem;height:3rem;border-radius:var(--r-md);background:var(--c-primary-gradient);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:var(--fs-ic-24);flex-shrink:0;position:relative;box-shadow:0 6px 16px rgba(22,119,255,.30)}

.hm-scan .ic::after{content:'';position:absolute;inset:0;border-radius:inherit;border:2px solid rgba(22,119,255,.5);animation:hmpulse 2s ease-out infinite}

@keyframes hmpulse{0%{transform:scale(1);opacity:.55}70%{transform:scale(1.24);opacity:0}100%{opacity:0}}

.hm-scan .st-t{font-size:var(--fs-17);font-weight:700}

.hm-scan .st-s{font-size:var(--fs-12);color:var(--c-ink-2);margin-top:3px;line-height:1.45}

.hm-scan-go{flex:none;display:inline-flex;align-items:center;font-size:var(--fs-13);font-weight:600;color:#fff;background:var(--c-primary-fill);border-radius:var(--r-full);padding:7px 13px;white-space:nowrap}

.hm-quick{display:grid;grid-template-columns:repeat(4,1fr);gap:10px 4px;padding:8px 6px 14px;border-top:1px solid var(--c-line-2)}

.hm-notice{display:flex;align-items:center;gap:8px;padding:9px 12px;border-top:1px solid var(--c-line-2);background:#fff;font-size:var(--fs-13)}
/* .solo：本端（商户 / 监管 App 工作台）没有首页那张悬浮操作卡，公告条需自带卡片外壳独立成块 */
.hm-notice.solo{border-top:0;border-radius:var(--r-lg);box-shadow:var(--sh-sm)}

.hm-notice .nl{display:inline-flex;align-items:center;gap:4px;flex:none;font-weight:700;color:var(--c-primary)}

.hm-notice .nl .if{font-size:var(--fs-ic-18)}

/* 小程序约束：-webkit-mask-image 在支付宝端偶发失效，公告跑马灯两侧会露出硬边
   → 落地：改由左右两个绝对定位的渐变 <view> 遮罩覆盖（纯背景色渐变，两端均稳定） */
.nm-view{flex:1;min-width:0;overflow:hidden;-webkit-mask-image:linear-gradient(90deg,transparent 0,#000 14px,#000 calc(100% - 14px),transparent 100%);mask-image:linear-gradient(90deg,transparent 0,#000 14px,#000 calc(100% - 14px),transparent 100%)}

.nm-track{display:inline-flex;align-items:center;white-space:nowrap;animation:nmroll 3s linear infinite;will-change:transform}

.nm-item{display:inline-flex;align-items:center;padding-right:2.75rem;color:var(--c-ink-2)}

.nm-item b{flex:none;margin-right:6px;padding:1px 7px;border-radius:var(--r-full);background:var(--c-primary-wash);color:var(--c-primary-ink);font-size:var(--fs-11);font-weight:700}

@keyframes nmroll{from{transform:translateX(0)}to{transform:translateX(-50%)}}

.hm-notice:hover .nm-track{animation-play-state:paused}

/* 小程序约束：小程序无 prefers-reduced-motion 媒体查询
   → 落地：读系统减弱动效设置（微信无稳定开放项），拿不到则删除本条，动效开关改由 A+ 字号档位承担 */
@media (prefers-reduced-motion:reduce){.nm-track{animation:none}}

.hm-sect{display:flex;align-items:center;justify-content:space-between;margin:2px 2px 10px}

.hm-sect .t{font-size:var(--fs-17);font-weight:700;display:inline-flex;align-items:center;gap:6px}

.hm-sect .t .if{width:var(--fs-ic-20);height:var(--fs-ic-20);color:var(--c-primary)}

.hm-sect .more{font-size:var(--fs-13);color:var(--c-ink-3)}

/* ---------- 20 网点分布地图（首页 · 全量网点一张图 · 与网点页同源 · 标题行切换区县） ---------- */
.om-legend{display:grid;grid-template-columns:repeat(5,1fr);gap:9px 2px;background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-sm);padding:11px 4px 10px;margin:0 0 10px}

.om-lg{display:flex;flex-direction:column;align-items:center;gap:4px}

.om-lg .ct{display:flex;align-items:baseline;gap:1px}

.om-lg .ct b{font-size:var(--fs-19);font-weight:800;line-height:1;color:var(--mk);font-variant-numeric:tabular-nums}

.om-lg .ct i{font-style:normal;font-size:var(--fs-10);color:var(--c-ink-3)}

.om-lg .nm{display:inline-flex;align-items:center;gap:2px;font-size:var(--fs-10);color:var(--c-ink-2);white-space:nowrap}

.om-lg .nm .if{width:12px;height:12px;color:var(--mk);stroke-width:2.1;flex:none}

.om-card{border-radius:var(--r-lg);overflow:hidden;background:#fff;box-shadow:var(--sh-sm);margin-bottom:14px}

/* 真实地图组件规格区（产品化口径：换小程序 <map>，原型不再自绘底图）
   小程序约束：<map> 是原生组件，其上浮层只能 cover-view / cover-image（不支持 box-shadow、渐变、CSS 动画）；
   marker 只能是本地图片（iconPath，不支持 HTML/CSS 绘制）；气泡只能用原生 callout
   （仅 content 可含 \n 换行 + bgColor / color / fontSize / borderRadius，无富文本、无图标、无动画）；
   缩放控件、定位按钮、比例尺、版权标识由地图 SDK 自带且不可仿造 → 全部删除。 */
.om-map{position:relative;height:240px;overflow:hidden;background:#E9EEF2}

/* 网格底 = 通用「地图组件占位」约定，明确这不是地理内容 */
.om-map::before{content:'';position:absolute;inset:0;background-image:linear-gradient(#DCE3E9 1px,transparent 1px),linear-gradient(90deg,#DCE3E9 1px,transparent 1px);background-size:34px 34px}


.om-dist{position:relative;z-index:6;display:inline-flex;align-items:center;gap:4px;background:#fff;border-radius:var(--r-full);box-shadow:var(--sh-md);padding:5px 12px;font-size:var(--fs-12);font-weight:700;color:var(--c-ink);cursor:pointer}

.om-dist .if{width:13px;height:13px;color:var(--c-primary);stroke-width:2.2}

.om-dist .caret{font-size:var(--fs-10);color:var(--c-ink-3)}

.om-dist-panel{position:absolute;top:calc(100% + 6px);right:0;display:none;flex-direction:column;width:150px;max-height:236px;overflow-y:auto;background:#fff;border-radius:var(--r-md);box-shadow:var(--sh-lg);padding:5px}

.om-dist.open .om-dist-panel{display:flex}

.om-dt{font-size:var(--fs-13);font-weight:500;color:var(--c-ink-2);border-radius:8px;padding:7px 12px;white-space:nowrap}

.om-dt.on{background:var(--c-primary-soft);color:var(--c-primary-ink);font-weight:700}

/* marker：落地为 <map> markers[].iconPath 的本地 PNG（**透明底，只画图形本体，不再烘色块底**）
   去底后图形直接压在 #E9EEF2 底图上，而九子类色跨度大（#2F54EB 深靛 ~ #FAAD14 琥珀 / #13C2C2 青），
   浅色系单色图形对底图只有约 1.6:1，不足 WCAG 1.4.11 非文本对比 3:1 → 加白色光晕描边补齐，
   原型用 drop-shadow 等价模拟，落地直接烘进 PNG 的 alpha 通道
   .mk-img 的 28 / 36 方框保持不变：它现在是纯点击热区，也是气泡 bottom:calc(100% + 7px)
   与最近站居中偏移 dx/dy 的基准，动尺寸会连带挪气泡和点位 */
.om-mk{position:absolute;z-index:2;transform:translate(-50%,-100%);cursor:pointer}

.om-mk .mk-img{width:28px;height:28px;display:flex;align-items:center;justify-content:center;color:var(--mk)}

.om-mk .mk-img .if{width:22px;height:22px;stroke-width:2.1;filter:drop-shadow(0 0 1.2px #fff) drop-shadow(0 0 1.2px #fff)}

.om-mk.on{z-index:4}

.om-mk.on .mk-img{width:36px;height:36px}

.om-mk.on .mk-img .if{width:28px;height:28px;filter:drop-shadow(0 0 1.5px #fff) drop-shadow(0 0 1.5px #fff)}

/* 原生 callout 形态：白底 + 细描边 + 单一字号，内容只有网点名称一行
   width:max-content 必需：绝对定位的可用宽度取自包含块（.om-mk 只有 28/36px），不写就会被压成 31px 宽逐字换行 */
.om-mk .call{position:absolute;left:50%;bottom:calc(100% + 7px);transform:translateX(-50%);width:max-content;max-width:200px;background:#fff;border:1px solid var(--c-line);border-radius:8px;padding:5px 9px;word-break:break-all;text-align:center;font-size:var(--fs-11);color:var(--c-ink);line-height:1.45}

.om-mk .call::after{content:'';position:absolute;left:50%;bottom:-5px;width:7px;height:7px;margin-left:-4px;background:#fff;border-right:1px solid var(--c-line);border-bottom:1px solid var(--c-line);transform:rotate(45deg)}


/* 图下操作条：选中网点的类别图标 + 名称/电话 + 地址/导航 */
.om-bar{display:flex;align-items:center;gap:10px;background:#fff;border-top:1px solid var(--c-line);padding:10px 12px}

.om-bi{flex:none;width:36px;height:36px;border-radius:10px;background:var(--mk);color:#fff;display:flex;align-items:center;justify-content:center}

.om-bi .if{width:20px;height:20px;stroke-width:2}

.om-bm{flex:1;min-width:0}

.om-bn{display:flex;align-items:center;gap:8px;font-size:var(--fs-13);font-weight:700;color:var(--c-ink)}

.om-bn .ellip{flex:1;min-width:0}

.om-tel{flex:none;display:inline-flex;align-items:center;gap:3px;font-size:var(--fs-12);font-weight:600;color:var(--c-primary);font-variant-numeric:tabular-nums;cursor:pointer}

.om-tel .if{width:12px;height:12px;stroke-width:2.1}

.om-ba{display:flex;align-items:center;gap:8px;font-size:var(--fs-11);color:var(--c-ink-3);margin-top:4px}

.om-ba .ellip{flex:1;min-width:0}

.om-go{flex:none;display:inline-flex;align-items:center;gap:3px;font-size:var(--fs-11);font-weight:600;color:#fff;background:var(--mk);border-radius:var(--r-full);padding:4px 10px;cursor:pointer}

.om-go .if{width:12px;height:12px;stroke-width:2.2}

.om-tel:active,.om-go:active{opacity:.75}

/* ---------- 独立「网点」页 outlets.html：①区县(右上) ②网点统计(标题+九子类，数字在上/图标+名称一行，参照首页图例) ③搜索框 ④类目过滤 ⑤地图 ⑥选中网点信息卡 ---------- */
.op-top{display:flex;justify-content:flex-end;margin-bottom:10px}

.op-hd{display:flex;align-items:center;justify-content:space-between;padding:2px 2px 8px}

.op-hd .t{font-size:var(--fs-16);font-weight:700;color:var(--c-ink);display:inline-flex;align-items:center;gap:6px}

.op-hd .t .if{width:18px;height:18px;color:var(--c-primary);stroke-width:2}

.op-hd .sum{font-size:var(--fs-12);color:var(--c-ink-3)}

/* 轨道必须写 minmax(0,1fr)：1fr 的自动最小值 = min-content，而 .nm 是 nowrap 的四字标签，
   写 repeat(5,1fr) 会被标签顶宽到 5×72+间隙，整块超出 375 视口（原型手机壳内出现横向滚动） */
.op-stats{display:grid;grid-template-columns:repeat(5,minmax(0,1fr));gap:4px;background:#fff;border-radius:var(--r-lg);box-shadow:var(--sh-sm);padding:12px 2px;margin-bottom:10px}

.op-st.ph{pointer-events:none}

.op-st{display:flex;flex-direction:column;align-items:center;gap:4px;padding:6px 2px;border-radius:var(--r-md);cursor:pointer;transition:background .15s}

.op-st .ct{display:flex;align-items:baseline;gap:1px;font-size:var(--fs-19);font-weight:800;line-height:1;color:var(--mk);font-variant-numeric:tabular-nums}

.op-st .ct i{font-style:normal;font-size:var(--fs-10);font-weight:600;color:var(--c-ink-3)}

/* 不写 nowrap：A+ 大号档 --fs-10 变 13px，四字标签会比 65px 轨道宽，nowrap 会让相邻标签贴死；
   允许换行后标准档仍单行、大号档折两行，任何字号档都不溢出轨道 */
.op-st .nm{display:inline-flex;align-items:center;gap:2px;font-size:var(--fs-10);color:var(--c-ink-2);text-align:center;line-height:1.25}

.op-st .nm .if{width:12px;height:12px;color:var(--mk);stroke-width:2.1;flex:none}

.op-st.on{background:#F2F6FF}

.op-st.on .nm{color:var(--mk);font-weight:700}

.op-st.dim{opacity:.4}

.op-search{margin-bottom:10px}

.op-seg{display:flex;gap:2px;background:#fff;border-radius:var(--r-full);padding:3px;box-shadow:var(--sh-sm);margin-bottom:10px}

.op-s{flex:1;text-align:center;padding:8px 0;border-radius:var(--r-full);font-size:var(--fs-14);font-weight:600;color:var(--c-ink-2);cursor:pointer;transition:background .15s,color .15s}

.op-s.on{background:var(--c-primary-fill);color:#fff;box-shadow:0 2px 8px rgba(22,119,255,.28)}

.op-map{margin-bottom:10px}

/* 小程序约束：<map> 是原生组件，vh 在含原生组件的页面里含义不同（不含系统区、易被顶开）
   → 落地：地图高度写成固定 rpx（如 420rpx），不用 vh / min() */
.op-map .om-map{height:min(52vh,420px)}

.op-empty{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:4;background:rgba(255,255,255,.95);border-radius:var(--r-md);box-shadow:var(--sh-md);padding:14px 18px;font-size:var(--fs-13);font-weight:600;color:var(--c-ink);text-align:center;line-height:1.7;max-width:82%}

.op-empty .dim{font-weight:400;font-size:var(--fs-12)}

/* ⑤ 选中网点信息卡 */
.op-info{--mk:var(--c-primary)}

.op-info.op-none{text-align:center;color:var(--c-ink-3);font-size:var(--fs-13);padding:24px 16px}

.op-in-hd{display:flex;gap:10px;align-items:flex-start}

.op-in-ic{flex:none;width:40px;height:40px;border-radius:11px;background:var(--mk);color:#fff;display:flex;align-items:center;justify-content:center}

.op-in-ic .if{width:22px;height:22px;stroke-width:2}

.op-in-nm{display:flex;align-items:center;gap:8px;font-size:var(--fs-16);font-weight:700;color:var(--c-ink)}

.op-in-nm .ellip{flex:1;min-width:0}

.op-in-more{margin-left:auto;flex:none;font-size:var(--fs-12);font-weight:600;color:var(--c-primary);cursor:pointer}

.op-in-cat{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin-top:6px;font-size:var(--fs-12)}

.op-in-cat .dim{color:var(--c-ink-3)}

.op-in-rate{display:flex;align-items:center;gap:6px;margin-top:12px}

.op-in-rate b{font-size:var(--fs-18);font-weight:800;color:#FF9500;font-variant-numeric:tabular-nums}

.op-in-rate .dim{font-size:var(--fs-12);color:var(--c-ink-3)}

.stars.sm{gap:2px;font-size:var(--fs-15);cursor:default}

.stars.sm .star{cursor:default}

.op-in-mx{display:flex;gap:8px;margin-top:10px}

.op-in-m{flex:1;background:var(--c-bg);border-radius:var(--r-md);padding:9px 6px;text-align:center}

.op-in-m b{display:block;font-size:var(--fs-18);font-weight:800;color:var(--c-ink);font-variant-numeric:tabular-nums}

.op-in-m span{display:block;font-size:var(--fs-11);color:var(--c-ink-3);margin-top:2px}

.op-info hr.line{margin:12px 0}

.op-info .flex-b{font-size:var(--fs-13);padding:4px 0}

.op-in-tagrow{display:flex;gap:8px;align-items:flex-start;font-size:var(--fs-13);padding:6px 0}

.op-in-tagrow>.dim{flex:none;color:var(--c-ink-3);padding-top:4px}

.op-in-tags{display:flex;flex-wrap:wrap;gap:6px;flex:1;min-width:0}

.op-in-row{display:flex;align-items:center;gap:8px;padding:8px 0;font-size:var(--fs-13)}

.op-in-row>.if{flex:none;width:16px;height:16px;color:var(--mk);stroke-width:2}

.op-in-row .ellip{flex:1;min-width:0;color:var(--c-ink-2)}

/* ---------- 17 网点九子类配色（放在文件末，确保压过 .op-info 等组件自带的 --mk 默认值） ----------
   取值与 DB.outletTypes[].color 逐条对应，改数据须同步本块。
   小程序约束：wxml / axml 的内联 style 不能写 CSS 自定义属性（style="--mk:…" 在两端不生效）
   → 落地：类型色由 class 带出（class="om-mk mk-food"），模板里 {{o.cls}} 整串预计算；--mk 仍是各子元素取色的唯一入口 */
.mk-station{--mk:#1677FF}.mk-msite{--mk:#13C2C2}.mk-odr{--mk:#2F54EB}.mk-vol{--mk:#FA661A}
.mk-market{--mk:#00B42A}.mk-store{--mk:#FF7D00}.mk-food{--mk:#F53F3F}.mk-repair{--mk:#722ED1}.mk-advance{--mk:#FAAD14}
/* 类目名沿用类型色：改前是内联 style="color:{{t.color}};font-weight:700"，两端内联写不出数据驱动的色值 → 由 mk-* 供色 */
.type-name{color:var(--mk);font-weight:700}

/* ---------- 18 静态尺寸工具类（页面内联 style 收进 class） ----------
   小程序约束：wxml / axml 的 style 只接受字符串，页面里成片的 style="padding-top:10px"「style="font-size:var(--fs-18)"」
   迁到两端要么逐页手抄进 <view>、要么当成数据字段拼出来，既不可复用又易漏，且 var() 自定义属性在两端内联 style 里不保证生效
   → 落地：定值一律走 class（本页 style 属性删除），style 只保留真正随数据变化的量（如地图标记的 left/top 百分比）
   放在文件末：与组件自带规则同特异度时靠后压前，逐条与改前内联值一致，改样式表须同步核对 */
.pt-10{padding-top:10px}.pt-14{padding-top:14px}.pt-22{padding-top:22px}.pt-24{padding-top:24px}

.fs-18{font-size:var(--fs-18)}.fs-22{font-size:var(--fs-22)}

.ls-1{letter-spacing:1px}

.fs-20{font-size:var(--fs-20)}

.mt-6{margin-top:6px}

.lh-18{line-height:1.8}.lh-19{line-height:1.9}.lh-2{line-height:2}

/* 登录页盾标 / 提交成功圆勾：改前各是一整串内联（含 var() 与 box-shadow） */
.login-mark{width:86px;height:86px;margin:0 auto 14px;border-radius:22px;background:var(--c-primary-gradient);color:#fff;display:flex;align-items:center;justify-content:center;font-size:var(--fs-ic-40);box-shadow:var(--sh-md)}
.ok-mark{width:74px;height:74px;margin:0 auto 12px;border-radius:50%;background:var(--c-ok-soft);color:var(--c-ok-deep);display:flex;align-items:center;justify-content:center;font-size:var(--fs-ic-36)}

/* 标签行 / 纵向单选行 / 右对齐纵列：改前是页面里的三段内联 flex */
.tagrow{display:flex;flex-wrap:wrap;gap:8px}
.optline.col{flex-direction:column;align-items:flex-start;gap:10px}
.col-end{display:flex;flex-direction:column;align-items:flex-end;gap:6px;flex-shrink:0}

/* 行内红点（消息标题后紧跟的未读点）：原页面内联 style 收进 class。
   bare .dot 在本表中只有 .q .dot / .tb-bell .dot 两条命中式，消息页原先两条都不命中，
   红点因此是 0×0 透明（既有缺陷）→ 本轮补上自身尺寸与告警底色，未读标记才真正可见。
   小程序落地：等价 <view class="dot inl" wx:if="{{m.unread}}"/>，无伪元素依赖 */
.dot.inl{position:static;display:inline-block;width:8px;height:8px;border-radius:50%;background:var(--c-danger);vertical-align:2px;margin-left:4px}

/* 段落留白：主办落款行 / 卡片内说明段 */
.credit{padding:6px 0 2px}
.cell-sub.inset{padding:0 14px 12px}
/* cell-sub 自带 margin-top:3px（表内位置晚于 .mt-8）→ 需要 8px 留白的两处用本类，勿用 .mt-8 */
.cell-sub.gap8{margin-top:8px}

/* 行内小输入框（其他选项）：margin:0 抵掉 .input 的外边距；
   必须用 input.in-xxx 抬一级权重，否则被 .optline input{width:15px} 压掉（内联 style 改前不会有这个问题） */
input.in-150{width:150px;margin:0}
input.in-140{width:140px;margin:0}

/* 小程序约束：两端没有 cursor/hover 语义，桌面可点提示不迁移 → 落地：<view hover-class="pressed">，本类只服务桌面评审态 */
.tap{cursor:pointer}

/* ---------- 18b 第二批收口（残留静态内联 style -> class，取值与改前逐字一致） ----------
   同 18 节：定值走 class，style 只留随数据变化的量；命名沿用既有 lh-、pt-、t- 系列
   踩坑记录：注释正文里不能出现「星号紧跟斜杠」这两个字符，否则会提前闭合注释、连带丢掉紧随其后的整条规则（.lh-21 曾被这样吃掉） */
.lh-21{line-height:2.1}
.shrink0{flex-shrink:0}
.fx-none{flex:none}
.m-0{margin:0}
.mr-10{margin-right:10px}
.mw-0{min-width:0}
.fww{flex-wrap:wrap}
.ac{align-items:center}
.as-c{align-self:center}
.pt-2{padding-top:2px}
.pt-16{padding-top:16px}
.pt-26{padding-top:26px}
.py-8{padding:8px 0}
.py-16{padding:16px 0}
.py-26{padding:26px 0}

/* 头像大号档：改前 5 个「我的」页各写一份 56px 圆底渐变内联串 */
.ava-56{width:56px;height:56px;border-radius:50%;background:var(--c-primary-gradient);color:#fff;display:flex;
  align-items:center;justify-content:center;font-size:var(--fs-ic-24)}

/* 只读输入框底色：改前 8 处内联 style="background:var(--c-primary-softer)"；与 .input 同特异度、靠后生效 */
.ro{background:var(--c-primary-softer)}

/* 角色切换大图标按钮：改前 4 处内联 width:3rem;height:3rem;font-size:var(--fs-ic-24) */
.ic-3r{width:3rem;height:3rem;font-size:var(--fs-ic-24)}
