
/* ==========================================================================
   设计令牌 —— 全部取自 /mnt/1t/systems/设备申报系统/DESIGN.md（不许自创数值）
   字号 10/12/14/16/20/24 · 间距 4/8/16/24 · 圆角 2/4/8/999 · 点击区 44
   ========================================================================== */
:root{
  /* colors */
  --c-primary:#0F766E; --c-primary-light:#CCFBF1;
  --c-success:#047857; --c-warning:#B45309; --c-danger:#DC2626;
 /* 「修改」蓝色 —— Vant 4 官方主题变量 blue（--van-blue），与 DESIGN.md「来源」表同源 */
 --c-blue:#1989FA;
  --c-text-1:#323233; --c-text-2:#707070; --c-text-3:#969799;
  --c-border:#EBEDF0;
  --c-divider:#969799;   /* 列表行分割线：Vant 灰阶 gray-6（老板 2026-10-20：要更深更粗、要一眼看到） */ --c-bg:#F7F8FA; --c-surface:#FFFFFF;

  /* typography */
  --fs-hero:24px; --fs-page:20px; --fs-section:16px; --fs-body:14px; --fs-caption:12px; --fs-micro:10px;
  --lh-hero:1.2; --lh-page:1.3; --lh-section:1.4; --lh-body:1.5;

  /* spacing */
  --sp-xs:4px; --sp-sm:8px; --sp-md:16px; --sp-lg:24px;

  /* rounded */
  --r-xs:2px; --r-sm:4px; --r-md:8px; --r-full:999px;

  /* size */
  --tap:44px; --navbar-h:46px; --tabbar-h:50px; --content-max:960px;

  /* Vant 4 主题变量映射（覆盖组件默认，保证全站同一套 token） */
  --van-primary-color:var(--c-primary);
  --van-success-color:var(--c-success);
  --van-warning-color:var(--c-warning);
  --van-danger-color:var(--c-danger);
  --van-text-color:var(--c-text-1);
  --van-text-color-2:var(--c-text-2);
  --van-text-color-3:var(--c-text-3);
  --van-border-color:var(--c-border);
  --van-background:var(--c-bg);
  --van-background-2:var(--c-surface);
  --van-font-size-sm:var(--fs-caption);
  --van-font-size-md:var(--fs-body);
  --van-font-size-lg:var(--fs-section);
  --van-radius-sm:var(--r-sm);
  --van-radius-md:var(--r-sm);
  --van-radius-lg:var(--r-md);
  --van-cell-font-size:var(--fs-body);
  --van-cell-vertical-padding:10px;
  --van-cell-line-height:24px;
  --van-button-default-height:var(--tap);
  --van-button-normal-font-size:var(--fs-section);
  --van-nav-bar-height:var(--navbar-h);
  --van-nav-bar-background:var(--c-surface);
  --van-nav-bar-title-text-color:var(--c-text-1);
  --van-nav-bar-icon-color:var(--c-primary);
  --van-nav-bar-text-color:var(--c-primary);
  --van-tabbar-height:var(--tabbar-h);
  --van-tabbar-item-font-size:var(--fs-caption);
  --van-tag-font-size:var(--fs-micro);
  --van-tag-radius:var(--r-xs);
  --van-toast-background:rgba(0,0,0,.8);
}
*{ box-sizing:border-box; -webkit-tap-highlight-color:transparent; }
html,body{ margin:0; padding:0; }
body{
  background:var(--c-bg); color:var(--c-text-1);
  font:var(--fs-body)/var(--lh-body) -apple-system,BlinkMacSystemFont,"PingFang SC","Microsoft YaHei",sans-serif;
  -webkit-font-smoothing:antialiased; font-variant-numeric:tabular-nums;
}
a{ color:var(--c-primary); }

/* ---------- 骨架：三档 ---------- */
.shell{ min-height:100vh; display:flex; flex-direction:column; }
.wrap{ flex:1 1 auto; display:flex; width:100%; }
.content{ flex:1 1 auto; min-width:0; padding:var(--sp-sm); }
/* ★ 固定底部导航让位：内容区底部留 60px（DESIGN.md Layout） */
.layout-mobile .content{ padding-bottom:60px; }
.layout-tablet .content{ padding:var(--sp-md); }
.layout-desktop .content{ padding:var(--sp-lg); }
.cards{ display:grid; gap:var(--sp-sm); grid-template-columns:1fr; max-width:var(--content-max); margin:0 auto; }
.layout-tablet .cards{ grid-template-columns:1fr 1fr; }
.layout-desktop .cards{ grid-template-columns:1fr 1fr; }
.card{
  background:var(--c-surface); border-radius:var(--r-md); padding:var(--sp-md);
  box-shadow:0 1px 2px rgba(0,0,0,.04);   /* 只有一层轻阴影 */
}
.card-h{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-sm); margin-bottom:var(--sp-sm); }
.card-t{ font-size:var(--fs-section); font-weight:600; line-height:var(--lh-section); }
.card-s{ font-size:var(--fs-caption); color:var(--c-text-2); }
.span-2{ grid-column:1 / -1; }

/* 字号六档（只用这六档） */
.t24{ font-size:var(--fs-hero); font-weight:600; line-height:var(--lh-hero); }
.t20{ font-size:var(--fs-page); font-weight:600; line-height:var(--lh-page); }
.t16{ font-size:var(--fs-section); font-weight:600; line-height:var(--lh-section); }
.t14{ font-size:var(--fs-body); }
.t12{ font-size:var(--fs-caption); color:var(--c-text-2); }
.mb8{ margin-bottom:var(--sp-sm); } .mb16{ margin-bottom:var(--sp-md); }
.mt8{ margin-top:var(--sp-sm); } .mt16{ margin-top:var(--sp-md); }
/* 待办详情 · 已用时（用户 2026-10-21）：出发 → 现在 / 点击完成·结束 */
.elapsed{ display:flex; align-items:baseline; gap:var(--sp-sm); margin-top:var(--sp-sm);
  padding-top:var(--sp-sm); border-top:1px solid var(--c-border); }
.elapsed > b{ font-size:var(--fs-section); font-weight:600; color:var(--c-text-1); font-variant-numeric:tabular-nums; }
.row8{ display:flex; gap:var(--sp-sm); flex-wrap:wrap; align-items:center; }
.grow{ flex:1 1 auto; min-width:0; }

/* 桌面左侧边栏 */
.sidebar{
  flex:0 0 208px; background:var(--c-surface); border-right:1px solid var(--c-border);
  padding:var(--sp-md) var(--sp-sm); position:sticky; top:0; height:100vh; overflow-y:auto;
}
.sidebar .brand{ display:flex; align-items:center; gap:var(--sp-sm); padding:0 var(--sp-sm) var(--sp-md); font-size:var(--fs-section); font-weight:600; color:var(--c-primary); }
.sidebar .brand i{ width:24px; height:24px; border-radius:var(--r-sm); background:var(--c-primary); display:inline-block; }
.sidebar .van-sidebar{ width:100%; }
.sidebar .van-sidebar-item{ border-radius:var(--r-sm); margin-bottom:var(--sp-xs); padding:12px; color:var(--c-text-1); }
.sidebar .van-sidebar-item--select{ background:var(--c-primary-light); color:var(--c-primary); font-weight:600; }
.sidebar .van-sidebar-item--select::before{ background:var(--c-primary); border-radius:0 var(--r-xs) var(--r-xs) 0; }
.tablet-nav{ display:flex; gap:var(--sp-sm); overflow-x:auto; padding:var(--sp-sm) var(--sp-md); background:var(--c-surface); border-bottom:1px solid var(--c-border); }
.tablet-nav::-webkit-scrollbar{ display:none; }

/* 首页 */

/* 分组待办 */
.todo-group{ background:var(--c-surface); border-radius:var(--r-md); margin-bottom:var(--sp-sm); overflow:hidden; border:1px solid var(--c-border); }
.todo-group-h{ display:flex; align-items:center; justify-content:space-between; padding:var(--sp-sm) var(--sp-md); background:var(--c-bg); }
.todo-item{ border-bottom:1px solid var(--c-border); padding:12px var(--sp-md); }
.todo-item:last-child{ border-bottom:0; }
.todo-title{ font-size:var(--fs-body); font-weight:500; }
.todo-meta{ font-size:var(--fs-caption); color:var(--c-text-2); margin-top:var(--sp-xs); }

/* 塔号网格 */
.tower-grid{ display:grid; grid-template-columns:repeat(auto-fill,minmax(72px,1fr)); gap:var(--sp-sm); max-height:46vh; overflow:auto; padding:var(--sp-sm) 0; }
.tower-grid .van-checkbox{ background:var(--c-bg); border-radius:var(--r-sm); padding:var(--sp-sm); }

/* 指标 / 进度 */
.metric{ display:flex; align-items:center; justify-content:space-between; font-size:var(--fs-caption); margin-top:var(--sp-sm); }

/* 项目主页 */
.entry-grid{ display:grid; gap:var(--sp-sm); grid-template-columns:1fr 1fr; }
@media (max-width:430px){ .entry-grid{ grid-template-columns:1fr; } }
.entry{
  display:flex; flex-direction:column; align-items:flex-start; gap:var(--sp-xs); text-align:left;
  padding:var(--sp-md); border-radius:var(--r-sm); border:1px solid var(--c-border);
  background:var(--c-surface); color:var(--c-text-1); min-height:92px;
}
.entry:active{ background:var(--c-primary-light); border-color:var(--c-primary); }
.entry-ico{ width:28px; height:28px; border-radius:var(--r-sm); background:var(--c-primary); color:#fff; display:grid; place-items:center; font-size:var(--fs-section); }
.entry-t{ font-size:var(--fs-section); font-weight:600; margin-top:var(--sp-xs); }
.entry-s{ font-size:var(--fs-caption); color:var(--c-text-2); line-height:var(--lh-body); }
/* ================= 项目列表卡片（参照 Ant Design Pro「标准列表 + 状态色」/ Linear 列表行）
   设计要点：① 一项目一卡 ② 左侧 4px 状态色条 ③ 右上状态胶囊（点+字，颜色+文字双表达）
            ④ 完成率 20px 大数字 + 同色进度条 ⑤ 图标 + 文字的元信息行 ⑥ 待分配单独一行橙色提示
   所有数值取自 DESIGN.md token（字号 10/12/14/16/20、间距 4/8/16、圆角 2/4/8/999、色值 primary/success/warning/text-*） */
.proj-list{ display:grid; gap:var(--sp-sm); }
.proj-item{ position:relative; overflow:hidden; background:var(--c-surface); border:1px solid var(--c-border);
  border-radius:var(--r-md); padding:var(--sp-md) var(--sp-md) var(--sp-md) calc(var(--sp-md) + 4px);
  cursor:pointer; box-shadow:0 1px 2px rgba(0,0,0,.04); transition:box-shadow .15s ease, border-color .15s ease; }
.proj-item::before{ content:''; position:absolute; left:0; top:0; bottom:0; width:4px; background:var(--c-text-3); }
.proj-item.st-run::before{ background:var(--c-primary); }
.proj-item.st-pause::before{ background:var(--c-warning); }
.proj-item.st-done::before{ background:var(--c-success); }
@media (hover:hover){ .proj-item:hover{ border-color:var(--c-primary); box-shadow:0 4px 12px rgba(0,0,0,.08); } }
.proj-item:active{ background:var(--c-bg); }

/* 卡头：名称 + 编号 + 状态胶囊 */
.proj-head{ display:flex; align-items:flex-start; gap:var(--sp-sm); }
.proj-name{ font-size:var(--fs-section); font-weight:600; line-height:var(--lh-section); color:var(--c-text-1);
  overflow:hidden; display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; }
.proj-code{ font-size:var(--fs-caption); color:var(--c-text-2); margin-top:var(--sp-xs); }
.pill{ flex:0 0 auto; display:inline-flex; align-items:center; gap:var(--sp-xs);
  font-size:var(--fs-micro); line-height:1.6; padding:2px var(--sp-sm); border-radius:var(--r-full);
  background:var(--c-bg); color:var(--c-text-2); white-space:nowrap; }
.pill i{ width:6px; height:6px; border-radius:var(--r-full); background:currentColor; display:inline-block; }
.pill.st-run{ background:var(--c-primary-light); color:var(--c-primary); }
.pill.st-pause{ background:#FFFBEB; color:var(--c-warning); }
.pill.st-done{ background:#ECFDF5; color:var(--c-success); }
.pill.st-danger{ background:#FEF2F2; color:var(--c-danger); }

/* 项目详情 · 详细信息里的四个关键数字（用户 2026-10-21：字号放大） */
.proj-kpis{ margin-top:var(--sp-md); padding-top:var(--sp-sm); border-top:1px solid var(--c-border); }
.proj-kpis .kpi{ padding:var(--sp-xs) 0; font-size:var(--fs-caption); color:var(--c-text-2); }
.proj-kpis .kpi span{ font-size:var(--fs-caption); color:var(--c-text-2); }
.proj-kpis .kpi b{ margin-left:var(--sp-sm); }
.proj-kpis .kpi b{ font-size:var(--fs-page); font-weight:600; line-height:var(--lh-page); color:var(--c-text-1);
  font-variant-numeric:tabular-nums; }

/* 形象进度 · 工序 table（用户 2026-10-21）：横向可滚，选中 = 主色底白字 */
.stage-bar{ display:flex; flex-wrap:wrap; gap:var(--sp-sm); padding:var(--sp-xs) 0 var(--sp-sm); margin-top:var(--sp-sm); }
.stage-chip{ flex:1 1 calc(50% - var(--sp-sm)); height:var(--tap); padding:0 var(--sp-sm); border:1px solid var(--c-border);
  border-radius:var(--r-sm); background:var(--c-surface); color:var(--c-text-1); font-size:var(--fs-body); cursor:pointer;
  white-space:nowrap; }
@media (min-width:600px){ .stage-chip{ flex:0 0 auto; padding:0 var(--sp-md); } }
.stage-chip.active{ background:var(--c-primary); border-color:var(--c-primary); color:#FFFFFF; }
.stage-counts{ display:flex; gap:var(--sp-lg); flex-wrap:wrap; padding:var(--sp-sm) 0 var(--sp-xs); }
.stage-counts .sc{ display:flex; align-items:center; gap:var(--sp-xs); font-size:var(--fs-caption); color:var(--c-text-2); }
.stage-counts .sc i{ width:8px; height:8px; border-radius:var(--r-full); display:inline-block; }
.stage-counts .sc b{ font-size:var(--fs-section); font-weight:600; color:var(--c-text-1); font-variant-numeric:tabular-nums; }
.stage-towers{ margin-top:var(--sp-sm); }
/* 基点平铺：只用颜色区分状态（用户 2026-10-21），不分组 */
.stage-towers .stage-tw{ gap:var(--sp-xs) var(--sp-sm); }
/* 状态靠**填充色**表达（用户 2026-10-21），文字统一白色保证可读 */
.stage-towers .stage-tw span{ border:0; border-radius:var(--r-xs); padding:1px 6px; color:#FFFFFF; font-weight:400; }
/* 报备详情可点基点：加按下态提示可交互 */
.stage-tw span.lockable{ cursor:pointer; }
.stage-tw span.lockable:active{ opacity:.7; }

/* 任务卡 · 统计行（用户 2026-10-21：不再列基点） */
.task-stats{ display:grid; grid-template-columns:repeat(3,auto) 1fr; gap:var(--sp-sm) var(--sp-md); margin-top:var(--sp-sm); }
.task-stats > div{ display:flex; flex-direction:column; min-width:0; }
.task-stats b{ font-size:var(--fs-section); font-weight:600; color:var(--c-text-1); font-variant-numeric:tabular-nums; }
.task-stats span{ font-size:var(--fs-micro); color:var(--c-text-2); }
.task-stats .wide b{ font-size:var(--fs-caption); }

/* 完成率：大数字 + 进度条同一行，颜色跟状态走 */
.proj-mid{ display:flex; align-items:center; gap:var(--sp-md); margin-top:var(--sp-md); }
/* 项目列表 · 当前工序下的基点进度（用户 2026-10-21）：等待 / 进行中 / 已完成 */
.proj-stage{ display:flex; align-items:center; gap:var(--sp-md); margin-top:var(--sp-md); flex-wrap:wrap; }
/* 列表 · 日志填报状态胶囊（用户 2026-10-27）：今日已填 = 绿、今日未填 / 未填报 = 琥珀 */
.proj-stage .fill-chip{ flex:0 0 auto; font-size:var(--fs-micro); line-height:1.4; padding:1px var(--sp-xs);
  border-radius:var(--r-xs); }
.proj-stage .fill-chip.fc-ok{ background:#ECFDF5; color:var(--c-success); }
.proj-stage .fill-chip.fc-warn{ background:#FEF3C7; color:var(--c-warning); }
.proj-stage .fill-chip.fc-idle{ background:#F2F3F5; color:var(--c-text-3); }
.proj-stage .fill-chip.fc-stage{ background:var(--c-primary-light); color:var(--c-primary); }
.fill-time{ font-size:var(--fs-micro); color:var(--c-text-2); font-variant-numeric:tabular-nums; }
.fill-wrap{ display:flex; align-items:center; gap:var(--sp-xs); }
.fill-wrap .fill-chip{ font-size:var(--fs-micro); line-height:1.4; padding:1px var(--sp-xs); border-radius:var(--r-xs); }
.fill-wrap .fill-chip.fc-ok{ background:#ECFDF5; color:var(--c-success); }
.fill-wrap .fill-chip.fc-warn{ background:#FEF3C7; color:var(--c-warning); }
.fill-wrap .fill-chip.fc-idle{ background:#F2F3F5; color:var(--c-text-3); }
.fill-wrap .fill-chip.fc-stage{ background:var(--c-primary-light); color:var(--c-primary); }
.proj-stage .stg{ font-size:var(--fs-caption); color:var(--c-text-2); }
.proj-stage .stg b{ font-size:var(--fs-section); font-weight:600; color:var(--c-text-1); margin-left:var(--sp-xs);
  font-variant-numeric:tabular-nums; }
.proj-stage .stg.doing b{ color:var(--c-warning); }
.proj-stage .stg.done b{ color:var(--c-success); }
.proj-pct{ flex:0 0 auto; font-size:var(--fs-page); font-weight:600; line-height:var(--lh-hero); color:var(--c-text-1);
  font-variant-numeric:tabular-nums; }
.proj-pct em{ font-size:var(--fs-caption); font-style:normal; font-weight:400; color:var(--c-text-2); margin-left:2px; }
.st-run .proj-pct{ color:var(--c-primary); }
.st-pause .proj-pct{ color:var(--c-warning); }
.st-done .proj-pct{ color:var(--c-success); }
.proj-bar{ flex:1 1 auto; min-width:0; }
.proj-item .van-progress{ border-radius:var(--r-full); }

/* 元信息：图标 + 文字，两列自动换行 */
.proj-meta{ display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-sm) var(--sp-md);
  margin-top:var(--sp-md); padding-top:var(--sp-md); border-top:1px solid var(--c-border); }
.proj-meta span{ display:flex; align-items:center; gap:var(--sp-xs); font-size:var(--fs-caption);
  color:var(--c-text-2); min-width:0; }
.proj-meta span b{ font-weight:400; color:var(--c-text-1); overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.proj-meta .van-icon{ color:var(--c-text-3); font-size:var(--fs-body); flex:0 0 auto; }

/* 底部动作提示：待分配（warning）/ 已全部分配（success），带底色小条 */
.proj-note{ display:flex; align-items:center; gap:var(--sp-xs); margin-top:var(--sp-sm);
  font-size:var(--fs-caption); padding:var(--sp-xs) var(--sp-sm); border-radius:var(--r-sm); }
.proj-note.warn{ color:var(--c-warning); background:#FFFBEB; }
.proj-note.ok{ color:var(--c-success); background:#ECFDF5; }
.proj-note.idle{ color:var(--c-text-2); background:var(--c-bg); }

@media (max-width:767px){ .cards{ padding-bottom:calc(var(--tap) + var(--sp-md)); } }
@media (min-width:768px){ .proj-list{ grid-template-columns:1fr 1fr; } }

/* 悬浮「新增项目」按钮（右下角）—— 尺寸/圆角/颜色全部 DESIGN.md token
   手机档上移 50px(底栏) + 16px，避免被底部导航或列表压住 */
.fab{ position:fixed; right:var(--sp-md); bottom:calc(var(--tabbar-h) + var(--sp-md)); z-index:60;
  width:var(--tap); height:var(--tap); border:0; border-radius:var(--r-full); background:var(--c-primary); color:#FFFFFF;
  font-size:var(--fs-page); line-height:1; cursor:pointer; padding:0;
  box-shadow:0 2px 8px rgba(15,118,110,.28);
  display:flex; align-items:center; justify-content:center; }
.fab:active{ background:var(--c-success); }
@media (min-width:768px){ .fab{ right:var(--sp-lg); bottom:var(--sp-lg); } }
@media (min-width:1201px){ .fab{ right:calc((100vw - 208px - var(--content-max)) / 2 + var(--sp-md)); } }

/* 申报详情 · 操作按钮一排居中（用户 2026-10-21）：修改=蓝底、删除=红底，44px 点击区、圆角 4、间距 24 */
.act-row{ display:flex; justify-content:center; align-items:center; gap:var(--sp-lg); flex-wrap:wrap; }
.btn-act{ height:var(--tap); padding:0 var(--sp-lg); border:0; border-radius:var(--r-sm);
  font-size:var(--fs-body); font-weight:400; color:#FFFFFF; cursor:pointer; min-width:96px; }
.btn-act:disabled{ opacity:.6; }
.btn-blue{ background:var(--c-blue); }
.btn-red{ background:var(--c-danger); }
.btn-ok{ background:var(--c-success); }
/* 审批页 · 通过 / 驳回：等宽一行、间距 24（用户 2026-10-21） */
.btn-pair{ display:flex; gap:var(--sp-lg); }
.btn-pair > .btn-act{ flex:1 1 0; min-width:0; }

/* 子页面左上角返回（桌面档没有导航栏，用户 2026-10-21） */
.back-bar{ display:flex; align-items:center; gap:var(--sp-xs); height:var(--tap); padding:0 var(--sp-xs);
  margin-bottom:var(--sp-sm); font-size:var(--fs-body); color:var(--c-text-2); cursor:pointer; }

/* 申报详情 · 「审批 / 取消审批」圆形悬浮按钮（右下角，64px，icon + 10px 文字） */
.fab-act{ position:fixed; right:var(--sp-md); bottom:calc(var(--tabbar-h) + var(--sp-md)); z-index:60;
  width:64px; height:64px; border-radius:var(--r-full);
  background:var(--c-primary); color:#FFFFFF;
  display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px;
  font-size:var(--fs-micro); line-height:1.2; cursor:pointer;
  box-shadow:0 2px 8px rgba(15,118,110,.28); }
.fab-act:active{ background:var(--c-success); }
.fab-act .van-icon{ font-size:var(--fs-page); line-height:1; }
.fab-act.fab-warn{ background:var(--c-warning); box-shadow:0 2px 8px rgba(180,83,9,.28); }
.fab-act.fab-warn:active{ opacity:.85; }
.fab-act.disabled{ opacity:.6; pointer-events:none; }
@media (min-width:768px){ .fab-act{ right:var(--sp-lg); bottom:var(--sp-lg); } }
@media (min-width:1201px){ .fab-act{ right:calc((100vw - 208px - var(--content-max)) / 2 + var(--sp-md)); } }

/* 年份筛选条（当前年 ±3 年，默认当前年）：横向可滚，选中 = 主色底白字
   点击区 44px、圆角 999、间距 8、字号 14/10 —— 全部 DESIGN.md token */
.year-bar{ position:relative; scroll-snap-type:x proximity; display:flex; gap:var(--sp-sm); overflow-x:auto; padding:var(--sp-xs) 0 var(--sp-sm);
  -webkit-overflow-scrolling:touch; scrollbar-width:none; }
.year-bar::-webkit-scrollbar{ display:none; }
.year-chip{ scroll-snap-align:center; flex:0 0 auto; min-height:36px; min-width:64px; padding:0 var(--sp-md); border:1px solid var(--c-border);
  border-radius:var(--r-full); background:var(--c-surface); color:var(--c-text-1);
  font-size:var(--fs-body); line-height:1; cursor:pointer; display:inline-flex; align-items:center; gap:var(--sp-xs); }
.year-chip em{ font-style:normal; font-size:var(--fs-micro); color:var(--c-text-2); margin-left:2px;
  background:var(--c-bg); border-radius:var(--r-full); padding:1px var(--fs-micro); }
.year-chip.active{ background:var(--c-primary); border-color:var(--c-primary); color:#FFFFFF; font-weight:600; }
.year-chip.active em{ color:#FFFFFF; background:rgba(255,255,255,.22); }

/* ================= 项目详情页（层次：概览 → 进度 → 地图 → 任务 → 未分配）
   数值全部取自 DESIGN.md token：字号 12/14/16/20/24、间距 4/8/16、圆角 4/8/999、状态色 primary/success/warning/text-3 */
.hero{ position:relative; overflow:hidden; background:var(--c-surface); color:var(--c-text-1);
  padding-left:calc(var(--sp-md) + 4px); }
.hero::before{ content:''; position:absolute; left:0; top:0; bottom:0; width:4px; background:var(--c-text-3); }
.hero.st-run::before{ background:var(--c-primary); }
.hero.st-pause::before{ background:var(--c-warning); }
.hero.st-done::before{ background:var(--c-success); }
.hero-head{ display:flex; align-items:flex-start; gap:var(--sp-sm); }
.hero-name{ font-size:var(--fs-page); font-weight:600; line-height:var(--lh-page); color:var(--c-text-1); }
.hero-sub{ display:flex; align-items:center; gap:var(--sp-sm); margin-top:var(--sp-xs);
  font-size:var(--fs-caption); color:var(--c-text-2); flex-wrap:wrap; }
.hero-sub .sep{ width:1px; height:10px; background:var(--c-border); display:inline-block; }
.hero-meta{ display:grid; gap:var(--sp-sm); margin-top:var(--sp-md); padding-top:var(--sp-md); border-top:1px solid var(--c-border); }
.hero-meta span{ display:flex; align-items:center; gap:var(--sp-sm); font-size:var(--fs-body); color:var(--c-text-1); min-width:0; }
.hero-meta .van-icon{ color:var(--c-text-3); flex:0 0 auto; font-size:16px; }
.hero-meta b{ font-weight:400; overflow:hidden; text-overflow:ellipsis; white-space:nowrap; }
.hero-actions{ display:flex; gap:var(--sp-sm); margin-top:var(--sp-md); flex-wrap:wrap; }

/* 进度块：大数字 + 进度条 + 分布条 + 迷你统计 */
.prog-row{ display:flex; align-items:center; gap:var(--sp-md); }
.prog-num{ flex:0 0 auto; font-size:var(--fs-hero); font-weight:600; line-height:var(--lh-hero); font-variant-numeric:tabular-nums; }
.prog-num em{ font-size:var(--fs-caption); font-style:normal; font-weight:400; color:var(--c-text-2); margin-left:2px; }
.prog-bar{ flex:1 1 auto; min-width:0; }
.stack-bar{ display:flex; height:8px; border-radius:var(--r-full); overflow:hidden; margin-top:var(--sp-md); background:var(--c-bg); }
.stack-bar .seg{ display:block; height:100%; }
.stack-bar .s-idle{ background:var(--c-text-3); }
.stack-bar .s-run{ background:var(--c-warning); }
.stack-bar .s-done{ background:var(--c-success); }
.stack-legend{ display:flex; flex-wrap:wrap; gap:var(--sp-md); margin-top:var(--sp-sm);
  font-size:var(--fs-caption); color:var(--c-text-2); }
.stack-legend span{ display:inline-flex; align-items:center; gap:var(--sp-xs); }
.stack-legend b{ color:var(--c-text-1); font-weight:600; }
.stack-legend .dot{ width:8px; height:8px; border-radius:var(--r-full); display:inline-block; }
.stack-legend .s-idle{ background:var(--c-text-3); }
.stack-legend .s-run{ background:var(--c-warning); }
.stack-legend .s-done{ background:var(--c-success); }
.mini-stats{ display:grid; grid-template-columns:repeat(4,1fr); gap:var(--sp-sm); margin-top:var(--sp-md);
  padding-top:var(--sp-md); border-top:1px solid var(--c-border); }
.mini-stats > div{ text-align:center; }
.mini-stats b{ display:block; font-size:var(--fs-section); font-weight:600; color:var(--c-text-1); line-height:var(--lh-section); }
.mini-stats span{ font-size:var(--fs-micro); color:var(--c-text-2); }

/* 任务：一行一卡，点开才展开基点清单 */
.task-list{ display:block; }
/* 任务行不套框：整块用分隔线分区（老板 2026-10-19「每条都框起来没审美」） */
.task-card{ border:0; border-bottom:1px solid var(--c-divider); border-radius:0; background:transparent; }
.task-card:last-child{ border-bottom:0; }
.task-main{ padding:var(--sp-md) 0; }
.task-head{ display:flex; align-items:flex-start; gap:var(--sp-sm); }
.task-name{ font-size:var(--fs-body); font-weight:600; line-height:var(--lh-section); color:var(--c-text-1); word-break:break-word; }
.task-sub{ display:flex; flex-wrap:wrap; gap:var(--sp-xs) var(--sp-md); margin-top:var(--sp-xs);
  font-size:var(--fs-caption); color:var(--c-text-2); }
.task-sub span{ display:inline-flex; align-items:center; gap:var(--sp-xs); }
.task-sub .van-icon{ color:var(--c-text-3); }
.task-prog{ display:flex; align-items:center; gap:var(--sp-sm); margin-top:var(--sp-sm); }
.task-prog .bar{ flex:1 1 auto; min-width:0; }
.task-prog .num{ flex:0 0 auto; font-size:var(--fs-caption); font-weight:600; color:var(--c-primary); }
.task-body{ padding:0 var(--sp-md) var(--sp-md); border-top:1px solid var(--c-border); padding-top:var(--sp-sm); }

/* 地图图例（三点：未开工灰 / 施工中橙 / 已完成绿） */
.map-legend{ display:flex; align-items:center; gap:var(--sp-md); flex-wrap:wrap; margin-bottom:var(--sp-sm); }
.map-legend .lg{ display:inline-flex; align-items:center; gap:var(--sp-xs); font-size:var(--fs-caption); color:var(--c-text-2); }
.map-legend .lg i{ width:8px; height:8px; border-radius:var(--r-full); display:inline-block; }

/* 地图容器 + 基点标签（之前被整块替换时误删，补回；尺寸/圆角取 token） */
.proj-map{ height:280px; border:1px solid var(--c-border); border-radius:var(--r-md); overflow:hidden; background:var(--c-bg); }
@media (min-width:768px){ .proj-map{ height:360px; } }
.leaflet-container{ font:var(--fs-caption)/var(--lh-body) -apple-system,BlinkMacSystemFont,"PingFang SC",sans-serif; }
.tower-chips{ display:flex; flex-wrap:wrap; gap:var(--sp-xs); margin-top:var(--sp-xs); }
.tower-chips .van-tag{ font-variant-numeric:tabular-nums; }
/* 任务卡里的状态标签与列表页口径一致：白底 + 彩字 + 描边 */
.task-card .van-tag{ background:var(--c-bg); border:0; }
.task-card .van-tag.van-tag--warning{ color:var(--c-warning); }
.task-card .van-tag.van-tag--success{ color:var(--c-success); }
.task-card .van-tag.van-tag--default{ color:var(--c-text-2); }
/* 概览字段在宽屏三列，手机单列 */
@media (min-width:768px){
  .hero-meta{ grid-template-columns:repeat(3,1fr); gap:var(--sp-md); align-items:start; }
  .hero-meta span{ align-items:flex-start; }
}

/* 任务卡：右上角编辑图标（44px 点击区）+ 地图定位按钮 + 基点清单常显（不再点击展开） */
.task-edit{ flex:0 0 auto; width:var(--tap); height:var(--tap); margin:-8px -8px 0 0; border:0; background:transparent;
  color:var(--c-text-2); font-size:var(--fs-section); cursor:pointer; display:flex; align-items:center; justify-content:center; }
.task-edit:active{ color:var(--c-primary); }
.task-locate{ flex:0 0 auto; border:0; background:transparent; color:var(--c-primary);
  font-size:var(--fs-caption); padding:var(--sp-xs) var(--sp-sm); cursor:pointer; }
.task-towers{ margin-top:var(--sp-sm); }
.task-st + .task-st{ margin-top:var(--sp-sm); }
.task-card .tower-chips{ margin-top:var(--sp-xs); }

/* 多选 chips（项目负责人 / 任务负责人）：点击区 44px、圆角 4、间距 8、字号 14 —— 全部 token */
.ochips{ display:flex; flex-wrap:wrap; gap:var(--sp-sm); }
.ochip{ min-height:var(--tap); padding:0 var(--sp-md); border:1px solid var(--c-border); border-radius:var(--r-sm);
  background:var(--c-surface); color:var(--c-text-1); font-size:var(--fs-body); line-height:var(--lh-body); cursor:pointer; }
.ochip.active{ border-color:var(--c-primary); background:var(--c-primary-light); color:var(--c-primary); font-weight:600; }

/* 值可能很长的选择行（任务名称等）：整段换行显示，不省略 */
.cell-pick{ display:flex; align-items:center; gap:var(--sp-sm); min-height:var(--tap);
  padding:var(--sp-sm) var(--sp-md); background:var(--c-surface); }
.cell-pick .k{ flex:0 0 56px; font-size:var(--fs-body); color:var(--c-text-1); }
.cell-pick .v{ flex:1 1 auto; min-width:0; font-size:var(--fs-body); color:var(--c-text-1); line-height:var(--lh-body); word-break:break-word; }
.cell-pick .v.empty{ color:var(--c-text-3); }
.cell-pick .who{ flex:0 1 auto; max-width:42%; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;
  font-size:var(--fs-caption); color:var(--c-text-2); }

/* 详情页：电压等级空缺时的灰字提示 + 任务卡删除按钮（危险色，44px 点击区） */
.hero-sub .empty{ color:var(--c-text-3); }
.task-edit.danger{ color:var(--c-danger); margin-right:-8px; }
.task-edit.danger:active{ color:var(--c-danger); opacity:.7; }

/* 任务状态胶囊放进副行，不占标题宽度（避免窄屏被挤成两行） */
.task-sub .st-pill{ flex:0 0 auto; white-space:nowrap; font-size:var(--fs-micro); line-height:1.6;
  padding:2px var(--sp-sm); border-radius:var(--r-full); background:var(--c-bg); color:var(--c-text-2); }
.task-sub .st-pill.st-run{ background:var(--c-primary-light); color:var(--c-primary); }
.task-sub .st-pill.st-done{ background:#ECFDF5; color:var(--c-success); }
.task-sub .st-pill.st-idle{ background:var(--c-bg); color:var(--c-text-2); }

/* 任务编辑页：基点 chips（可点选/可移出）与搜索行间距 */
#app .tower-chips .van-tag{ cursor:pointer; }
.task-edit-page .van-search{ padding:0; }

/* 区间选择模式：基点 chips 更像按钮，选中态更明显 */
.tower-chips .van-tag{ margin:2px; }
.tower-chips .van-tag--warning{ border:1px solid var(--c-warning); }

/* 基点清单：纯文字行（不套框，老板 2026-10-19），按状态着色 */
.task-st-h{ display:flex; align-items:center; gap:var(--sp-xs); font-size:var(--fs-caption); color:var(--c-text-2); margin-top:var(--sp-sm); }
.task-st-h .dot{ width:6px; height:6px; border-radius:var(--r-full); display:inline-block; }
.task-st-h .dot.s-idle{ background:var(--c-text-3); }
.task-st-h .dot.s-run{ background:var(--c-warning); }
.task-st-h .dot.s-done{ background:var(--c-success); }
.tw-line{ display:flex; flex-wrap:wrap; gap:var(--sp-xs) var(--sp-sm); margin-top:var(--sp-xs);
  font-size:var(--fs-caption); line-height:var(--lh-body); word-break:break-word; }
.tw-line span{ white-space:nowrap; }
.tw-line.c-idle{ color:var(--c-text-2); }
.tw-line.c-run{ color:var(--c-warning); }
.tw-line.c-done{ color:var(--c-success); }

/* ===== 日志卡片（用户 2026-10-30 二次重设计：独立卡片 + 日期徽标 + 内部分区分割） ===== */
.lg-list{ display:grid; gap:var(--sp-sm); align-items:start; }
/* 桌面档两列：单列铺满 960px 会让正文行长过长，两列更像正经列表 */
@media (min-width:1000px){ .lg-list{ grid-template-columns:1fr 1fr; gap:var(--sp-md); } }
.lg-card{ background:var(--c-surface); border:1px solid var(--c-border); border-radius:var(--r-md);
  padding:var(--sp-md); cursor:pointer; transition:border-color .12s; }
.lg-card:active{ border-color:var(--c-primary); background:var(--c-surface); }

/* 头部：日期徽标 + 工程名（主标题）+ 任务名（副标题）+ 箭头 */
.lg-head{ display:flex; align-items:flex-start; gap:var(--sp-md); }
.lg-date{ flex:0 0 44px; height:44px; border-radius:var(--r-sm); background:var(--c-bg);
  display:flex; flex-direction:column; align-items:center; justify-content:center; }
.lg-date b{ font-size:var(--fs-section); font-weight:600; line-height:1.1; color:var(--c-text-1);
  font-variant-numeric:tabular-nums; }
.lg-date span{ font-size:var(--fs-micro); color:var(--c-text-2); line-height:1.3; }
.lg-proj{ margin:0; font-size:var(--fs-section); font-weight:600; line-height:var(--lh-section);
  color:var(--c-text-1); word-break:break-word; }
.lg-task{ margin-top:2px; font-size:var(--fs-caption); color:var(--c-text-2);
  display:flex; align-items:center; gap:var(--sp-xs); flex-wrap:wrap; }
.lg-mine{ font-size:var(--fs-micro); color:var(--c-primary); background:var(--c-primary-light);
  border-radius:var(--r-full); padding:0 var(--sp-xs); }
.lg-arrow{ margin-top:var(--sp-xs); color:var(--c-text-3); flex:0 0 auto; }

/* 施工内容：与头部之间一条细线，正文 14px，最多 3 行 */
.lg-body{ margin:var(--sp-md) 0 0; padding-top:var(--sp-md); border-top:1px solid var(--c-border);
  font-size:var(--fs-body); line-height:var(--lh-body); color:var(--c-text-1);
  display:-webkit-box; -webkit-line-clamp:3; -webkit-box-orient:vertical; overflow:hidden; }

/* 工序状态：一行一个胶囊，浅底 + 状态色文字 */
.lg-stages{ display:flex; flex-wrap:wrap; gap:var(--sp-xs); margin-top:var(--sp-md); }
.lg-head + .lg-stages{ margin-top:var(--sp-md); }
.lg-st{ display:inline-flex; align-items:center; gap:var(--sp-sm); background:var(--c-bg);
  border-radius:var(--r-full); padding:2px var(--sp-sm); }
.lg-st b{ font-size:var(--fs-caption); font-weight:400; color:var(--c-text-1); }
.lg-st em{ font-style:normal; font-size:var(--fs-micro); }
.lg-st em::before{ content:''; display:inline-block; width:4px; height:4px; border-radius:var(--r-full);
  background:currentColor; margin-right:var(--sp-xs); vertical-align:middle; }
.lg-st .s-doing{ color:var(--c-warning); }
.lg-st .s-done{ color:var(--c-success); }
.lg-st-btn{ cursor:pointer; border:1px solid transparent; }
.lg-st-btn.on{ background:var(--c-primary-light); border-color:var(--c-primary); }
.lg-st-btn.on b{ color:var(--c-primary); }

/* 本次进度表格（用户 2026-11-01）：工序 / 状态 / 基点，纯展示不做联动 */
.tw-table-wrap{ overflow-x:auto; margin-top:var(--sp-sm); border:1px solid var(--c-border); border-radius:var(--r-md); }
.tw-table{ width:100%; border-collapse:collapse; font-size:var(--fs-caption); }
.tw-table th{ text-align:left; font-weight:400; color:var(--c-text-2); background:var(--c-bg);
  padding:var(--sp-sm); border-bottom:1px solid var(--c-border); white-space:nowrap; }
.tw-table td{ padding:var(--sp-sm); border-bottom:1px solid var(--c-border); vertical-align:top; }
.tw-table tr:last-child td{ border-bottom:0; }
.tw-table .td-name{ color:var(--c-text-1); white-space:nowrap; font-size:var(--fs-body); }
.tw-table .td-state{ color:var(--c-text-1); white-space:nowrap; }
.tw-table .td-state i{ width:6px; height:6px; border-radius:var(--r-full); display:inline-block;
  margin-right:var(--sp-xs); vertical-align:middle; }
.tw-table .td-codes{ color:var(--c-text-2); line-height:var(--lh-body); word-break:break-word; }

/* 底部：头像 + 填报人 + 时间 ｜ 右端锁定标记 */
.lg-foot{ display:flex; align-items:center; gap:var(--sp-xs); margin-top:var(--sp-md); }
.lg-right{ margin-left:auto; display:inline-flex; align-items:center; gap:var(--sp-xs); }
.lg-av{ width:20px; height:20px; border-radius:var(--r-full); background:var(--c-primary-light);
  color:var(--c-primary); font-size:var(--fs-micro); display:flex; align-items:center; justify-content:center; }
.lg-by{ font-size:var(--fs-caption); color:var(--c-text-2); }
.lg-time{ font-size:var(--fs-caption); color:var(--c-text-3); margin-left:var(--sp-sm);
  font-variant-numeric:tabular-nums; }
.lg-lock{ font-size:var(--fs-micro); color:var(--c-text-3); }
.lg-more{ color:var(--c-text-2); }
.lg-more::before{ display:none; }

/* ===== 旧日志列表样式（任务详情的日志列表仍在使用） ===== */
.log-title{ display:flex; align-items:baseline; gap:var(--sp-xs); flex-wrap:wrap; }
.log-title .lt-proj{ font-size:var(--fs-section); font-weight:600; color:var(--c-text-1);
  line-height:var(--lh-section); }
.log-title .lt-sep{ display:none; }
/* 任务名做成小标签：与工程名区分层级，换行也不会串到一行里 */
.log-title .lt-task{ font-size:var(--fs-caption); color:var(--c-text-2); line-height:1.4;
  background:var(--c-bg); border-radius:var(--r-xs); padding:1px var(--sp-xs); }
.log-title .log-badge{ align-self:center; margin-left:var(--sp-xs); }

/* 工序标签：底纹 + 圆角 2，颜色只有「进行中/完成」两种状态色 */
.log-items{ display:flex; flex-wrap:wrap; gap:var(--sp-xs) var(--sp-sm); margin-top:var(--sp-sm); }
.log-items .li{ display:inline-flex; align-items:center; gap:var(--sp-xs); white-space:nowrap;
  background:var(--c-bg); border-radius:var(--r-xs); padding:1px var(--sp-xs); }
.log-items .li b{ font-size:var(--fs-caption); font-weight:400; color:var(--c-text-1); }
.log-items .li em{ font-style:normal; font-size:var(--fs-micro); }
.log-items .li-doing{ color:var(--c-warning); }
.log-items .li-done{ color:var(--c-success); }

/* 元信息行：填报人 ｜ 填报时间，12px 灰，与内容之间用细分割线分开 */
.log-foot{ display:flex; align-items:center; gap:var(--sp-sm); margin-top:var(--sp-sm);
  padding-top:var(--sp-sm); border-top:1px solid var(--c-border); }
.log-foot .lf-by{ font-size:var(--fs-caption); color:var(--c-text-2); }
.log-foot .lf-sep{ width:1px; height:10px; background:var(--c-border); }
.log-foot .lf-time{ font-size:var(--fs-caption); color:var(--c-text-3); font-variant-numeric:tabular-nums; }
.log-foot .lf-mine{ margin-left:auto; }
.log-foot .log-badge{ font-size:var(--fs-micro); }

/* 任务详情：日志列表（分隔线，不套框）与日志详情键值表 */
.log-list{ display:block; background:var(--c-surface); border:1px solid var(--c-border);
  border-radius:var(--r-md); overflow:hidden; padding-bottom:var(--sp-lg); }
.log-row{ display:flex; align-items:flex-start; gap:var(--sp-sm); padding:var(--sp-md);
  border-bottom:1px solid var(--c-border); cursor:pointer; transition:background .12s; }
.log-row:active{ background:var(--c-bg); }
.log-row:last-child{ border-bottom:0; }
.log-row > .van-icon{ margin-top:var(--sp-xs); flex:0 0 auto; color:var(--c-text-3); }
.log-date{ font-size:var(--fs-body); font-weight:600; color:var(--c-text-1); }
/* 施工内容：正文级 14px，最多两行，收敛在标题与标签之间 */
.log-text{ font-size:var(--fs-body); color:var(--c-text-1); margin-top:var(--sp-sm); line-height:var(--lh-body);
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.log-sub{ font-size:var(--fs-micro); color:var(--c-text-3); margin-top:var(--sp-xs); }
.kv-list{ display:grid; gap:var(--sp-md); }
.kv-list .k{ font-size:var(--fs-caption); color:var(--c-text-2); }
.kv-list .v{ font-size:var(--fs-body); color:var(--c-text-1); line-height:var(--lh-body); margin-top:2px; word-break:break-word; }
/* 详情页 kv 行（label 左 / 值右） */
.kv{ display:flex; align-items:baseline; gap:var(--sp-sm); padding:var(--sp-xs) 0; }
.kv > .k{ flex:0 0 auto; white-space:nowrap; font-size:var(--fs-caption); color:var(--c-text-2); }
.kv > .v{ flex:1 1 auto; font-size:var(--fs-body); color:var(--c-text-1); line-height:var(--lh-body); word-break:break-word; }
.kv > span{ flex:0 0 auto; min-width:72px; font-size:var(--fs-caption); color:var(--c-text-2); }
.kv > b{ font-size:var(--fs-body); font-weight:400; color:var(--c-text-1); word-break:break-word; }

/* 日志页：全部/我的 分段切换 + 筛选行 + 分页（token：44px 点击区、4/8 圆角、8/16 间距） */
.seg-tabs{ display:flex; gap:var(--sp-sm); background:var(--c-surface); border:1px solid var(--c-border);
  border-radius:var(--r-md); padding:var(--sp-xs); }
.seg{ flex:1 1 0; min-height:36px; border:0; border-radius:var(--r-sm); background:transparent;
  color:var(--c-text-2); font-size:var(--fs-body); cursor:pointer; }
.seg.active{ background:var(--c-primary-light); color:var(--c-primary); font-weight:600; }
.seg-fresh{ flex:none; width:var(--tap); min-height:36px; border:0; border-radius:var(--r-sm);
  background:transparent; color:var(--c-text-2); font-size:var(--fs-section); cursor:pointer;
  display:flex; align-items:center; justify-content:center; }
.seg-fresh.spin{ animation:spin 0.9s linear infinite; color:var(--c-primary); }
@keyframes spin{ from{ transform:rotate(0) } to{ transform:rotate(360deg) } }
.filter-row{ display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-sm); }
.filter-cell{ display:flex; align-items:center; gap:var(--sp-xs); min-height:44px; padding:0 var(--sp-md);
  border:1px solid var(--c-border); border-radius:var(--r-sm); background:var(--c-surface); cursor:pointer; min-width:0; }
.filter-cell .k{ font-size:var(--fs-caption); color:var(--c-text-2); flex:0 0 auto; }
.filter-cell .v{ flex:1 1 auto; font-size:var(--fs-caption); color:var(--c-text-1); overflow:hidden;
  text-overflow:ellipsis; white-space:nowrap; }
.filter-cell .van-icon{ color:var(--c-text-3); font-size:var(--fs-caption); flex:0 0 auto; }
.log-top{ display:flex; align-items:center; gap:var(--sp-sm); }
.log-badge{ font-size:var(--fs-micro); color:var(--c-primary); background:var(--c-primary-light);
  border-radius:var(--r-full); padding:1px var(--sp-sm); }
.log-badge.off{ color:var(--c-text-2); background:var(--c-bg); }
.pager{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-sm); margin-top:var(--sp-md); }
.pg-btn{ min-height:36px; padding:0 var(--sp-md); border:1px solid var(--c-border); border-radius:var(--r-sm);
  background:var(--c-surface); color:var(--c-text-1); font-size:var(--fs-caption); cursor:pointer; }
.pg-btn:disabled{ color:var(--c-text-3); background:var(--c-bg); cursor:default; }
.pg-info{ font-size:var(--fs-caption); color:var(--c-text-2); }

/* ===== 申报列表卡片（项目 + 任务 + 设备 + 申报人 + 起止 + 状态）
   token：字号 16/14/12/10、间距 4/8/16、圆角 2/4/8/999、色 primary/success/warning/text-* ===== */
.req-list{ display:block; background:var(--c-surface); border:1px solid var(--c-divider);
  border-radius:var(--r-md); overflow:hidden; }
.req-item{ padding:var(--sp-md); border-bottom:2px solid var(--c-divider); }
.req-item:last-child{ border-bottom:0; }
.req-item:active{ background:var(--c-bg); }
.req-head{ display:flex; align-items:flex-start; gap:var(--sp-sm); }
.req-title{ font-size:var(--fs-section); font-weight:600; line-height:var(--lh-section); color:var(--c-text-1);
  word-break:break-word; }
.req-task{ margin-top:var(--sp-xs); font-size:var(--fs-caption); color:var(--c-text-2); }
.req-dev{ display:flex; flex-wrap:wrap; gap:var(--sp-xs) var(--sp-sm); margin-top:var(--sp-sm); }
.dev-chip{ font-size:var(--fs-caption); color:var(--c-text-1); background:var(--c-bg);
  border-radius:var(--r-xs); padding:var(--sp-xs) var(--sp-sm); }
.dev-chip b{ font-weight:600; color:var(--c-primary); margin-left:var(--sp-xs); }
.req-foot{ display:flex; align-items:center; gap:var(--sp-sm); margin-top:var(--sp-sm);
  padding-top:var(--sp-sm); border-top:1px solid var(--c-border);
  font-size:var(--fs-caption); color:var(--c-text-2); }
.req-foot .sep{ width:1px; height:10px; background:var(--c-divider); display:inline-block; }

/* 平板/桌面：申报卡片两列（与项目列表一致） */

/* ===== 申报：放线 / 吊运 类型标 + 基点选择 + 自动算档 =====
   token：字号 16/14/12/10、间距 4/8/16、圆角 2/4/8、色 primary/success/warning/text-* ===== */
.kind-tag{ flex:none; font-size:var(--fs-micro); line-height:1.5; padding:2px var(--sp-xs);
  border-radius:var(--r-xs); border:1px solid currentColor; }
.kind-tag.line{ color:var(--c-primary); background:var(--c-primary-light); border-color:transparent; }
.kind-tag.lift{ color:var(--c-warning); background:var(--c-surface); }
.flag-row{ display:flex; align-items:center; gap:var(--sp-sm); }
.req-time{ margin-top:var(--sp-xs); font-size:var(--fs-caption); color:var(--c-text-2); }
.req-time .dash{ color:var(--c-text-3); margin:0 2px; }
.pick-grid{ display:grid; grid-template-columns:repeat(auto-fill, minmax(64px, 1fr)); gap:var(--sp-xs); }
.pick-chip{ position:relative; min-height:var(--tap); padding:0 var(--sp-xs);
  display:flex; align-items:center; justify-content:center;
  border:1px solid var(--c-border); border-radius:var(--r-sm); background:var(--c-surface);
  font-size:var(--fs-body); color:var(--c-text-1); }
.pick-chip.on{ border-color:var(--c-primary); background:var(--c-primary-light); color:var(--c-primary); font-weight:600; }
.pick-chip i{ position:absolute; top:-1px; right:-1px; width:14px; height:14px; border-radius:0 var(--r-sm) 0 var(--r-sm);
  background:var(--c-primary); color:#fff; font-size:var(--fs-micro); font-style:normal;
  display:flex; align-items:center; justify-content:center; }
.calc{ margin-top:var(--sp-sm); padding:var(--sp-sm); background:var(--c-bg); border-radius:var(--r-sm); }
.calc-row{ display:flex; align-items:baseline; justify-content:space-between; font-size:var(--fs-caption); color:var(--c-text-2); }
.calc-row b{ font-size:var(--fs-section); font-weight:600; color:var(--c-primary); }
.calc-span{ margin-top:2px; font-size:var(--fs-micro); color:var(--c-text-3); }
.calc-src{ margin-top:var(--sp-xs); font-size:var(--fs-micro); color:var(--c-text-3); }
.calc-skip{ margin-top:var(--sp-xs); font-size:var(--fs-micro); color:var(--c-warning); }
.t12.err{ color:var(--c-danger); margin-top:var(--sp-xs); }
.ml4{ margin-left:var(--sp-xs); }

/* 申报列表：状态筛选 chip 条 + 单号（token：字号 12/10、间距 4/8、圆角 999、色 primary/border/text-3） */
.chip-bar{ display:flex; gap:var(--sp-sm); overflow-x:auto; -webkit-overflow-scrolling:touch; }
.chip{ flex:none; min-height:36px; padding:0 var(--sp-md); border:1px solid var(--c-border);
  border-radius:var(--r-full); background:var(--c-surface); color:var(--c-text-2);
  font-size:var(--fs-caption); cursor:pointer; }
.chip.on{ border-color:var(--c-primary); background:var(--c-primary-light); color:var(--c-primary); font-weight:600; }
.req-no{ font-size:var(--fs-micro); color:var(--c-text-3); }

/* 审批页：设备行（类型 + 具体设备 + 操作员多选 + 备注）
   token：字号 16/14/12/10、间距 4/8/16、圆角 2/4/8/999、点击区 44px */
.dev-row{ border:1px solid var(--c-divider); border-radius:var(--r-md); padding:var(--sp-md);
  margin-top:var(--sp-sm); background:var(--c-surface); }
.dev-row-h{ display:flex; align-items:center; justify-content:space-between; margin-bottom:var(--sp-xs); }
.op-chips{ display:flex; flex-wrap:wrap; gap:var(--sp-sm); padding:var(--sp-sm) 0; }
.alloc-row{ display:flex; align-items:center; gap:var(--sp-sm); padding:var(--sp-md) 0;
  border-bottom:2px solid var(--c-divider); }
.alloc-right{ flex:none; display:flex; flex-direction:column; align-items:flex-end; gap:var(--sp-xs); }
.alloc-row:last-child{ border-bottom:0; }

/* 操作台：施工流程时间线（出发/到场/施工/回驻地）
   token：字号 10/12、间距 4/8、圆角 999、色 primary/text-3 */
.flow-line{ display:flex; flex-wrap:wrap; gap:var(--sp-xs) var(--sp-md); margin-top:var(--sp-sm);
  padding-top:var(--sp-sm); border-top:1px solid var(--c-border);
  font-size:var(--fs-micro); color:var(--c-text-3); }
.flow-line span.on{ color:var(--c-primary); font-weight:600; }
.todo-item{ cursor:pointer; }
.todo-item:active{ background:var(--c-bg); }

/* 首页问候卡（hero 卡曾被项目详情页复用导致样式冲突，这里单列一套）
   token：字号 24/20/10、间距 4/8/16、圆角 8、色 primary + 白字 */
.home-hero{ background:var(--c-primary); border-radius:var(--r-md); padding:var(--sp-md);
  color:#FFFFFF; box-shadow:0 1px 2px rgba(0,0,0,.04); }
.home-hero .t24{ color:#FFFFFF; }
.home-sub{ margin-top:var(--sp-xs); font-size:var(--fs-caption); color:rgba(255,255,255,.82); }
.stats{ display:flex; gap:var(--sp-md); margin-top:var(--sp-md); }
/* 首页入口（用户 2026-11-01）：四个大字块，无小图标 —— 2×2，点击区远超 44px */
.quick-grid{ display:grid; grid-template-columns:1fr 1fr; gap:var(--sp-md); }
.quick-item{ min-height:88px; border:1px solid var(--c-border); border-radius:var(--r-md); background:var(--c-surface);
  color:var(--c-text-1); font-size:var(--fs-section); font-weight:600; cursor:pointer; letter-spacing:1px; }
.quick-item:active{ background:var(--c-primary-light); border-color:var(--c-primary); color:var(--c-primary); }
@media (min-width:600px){ .quick-grid{ grid-template-columns:repeat(4,1fr); } }
.stat{ flex:1 1 0; min-width:0; }
.stat b{ display:block; font-size:var(--fs-page); font-weight:600; line-height:var(--lh-page); color:#FFFFFF; }
.stat span{ font-size:var(--fs-micro); color:rgba(255,255,255,.82); }

/* ===== 待办详情：大圆悬浮主按钮 + 底部 80% 红色完成 + 操作时间轴
   token：字号 16/14/12/10、间距 4/8/16、圆角 4/8/999、点击区 44px、色 primary/danger/border ===== */
.detail-page{ padding-bottom:calc(var(--tap) * 2); }   /* 给右下悬浮主按钮让位 */
.detail-gap{ height:var(--sp-lg); }

/* 大圆悬浮主按钮（直径 72px = 44 点击区 + 留白；右下角，避开底部 tabbar 与完成按钮） */
.fab-lg{ position:fixed; right:var(--sp-md); bottom:calc(var(--tabbar-h) + var(--sp-md));
  z-index:60; width:72px; height:72px; border:0; border-radius:var(--r-full);
  background:var(--c-primary); color:#FFFFFF; display:flex; flex-direction:column;
  align-items:center; justify-content:center; gap:2px; font-size:var(--fs-caption); font-weight:600;
  box-shadow:0 4px 12px rgba(15,118,110,.28); cursor:pointer; }
.fab-lg:active{ transform:scale(.97); }
@media (min-width:768px){ .fab-lg{ right:calc((100vw - var(--content-max)) / 2 + var(--sp-md)); bottom:var(--sp-md); } }
@media (min-width:1201px){ .fab-lg{ right:calc((100vw - 208px - var(--content-max)) / 2 + var(--sp-md)); } }

/* 结束按钮：页面最下方、宽 80%、红色居中（★ 不悬浮 —— 跟随内容流） */
.finish-wrap{ grid-column:1 / -1; display:flex; justify-content:center; margin-top:var(--sp-lg); }
.finish-btn{ width:80%; height:var(--tap); border:0; border-radius:var(--r-sm);
  background:var(--c-danger); color:#FFFFFF; font-size:var(--fs-section); font-weight:600; cursor:pointer; }
.finish-btn:disabled{ opacity:.6; }
.done-btn{ width:80%; height:var(--tap); border:0; border-radius:var(--r-sm);
  background:var(--c-primary); color:#FFFFFF; font-size:var(--fs-section); font-weight:600; cursor:pointer; }
.done-btn:disabled{ opacity:.6; }

/* 时间轴 */
.tl{ position:relative; margin-top:var(--sp-sm); padding-left:var(--sp-md); }
.tl::before{ content:''; position:absolute; left:5px; top:6px; bottom:6px; width:1px; background:var(--c-divider); }
.tl-item{ position:relative; padding:0 0 var(--sp-md) 0; }
.tl-item:last-child{ padding-bottom:0; }
.tl-dot{ position:absolute; left:calc(-1 * var(--sp-md) + 1px); top:5px; width:9px; height:9px;
  border-radius:var(--r-full); background:var(--c-divider); border:2px solid var(--c-surface); }
.tl-depart .tl-dot, .tl-start .tl-dot{ background:var(--c-primary); }
.tl-arrive .tl-dot{ background:var(--c-warning); }
.tl-pause .tl-dot{ background:var(--c-warning); }
.tl-end .tl-dot, .tl-return .tl-dot{ background:var(--c-success); }
.tl-back .tl-dot{ background:var(--c-text-3); }
.tl-head{ display:flex; align-items:baseline; justify-content:space-between; gap:var(--sp-sm); }
.tl-label{ font-size:var(--fs-body); color:var(--c-text-1); font-weight:600; }
.tl-ts{ font-size:var(--fs-micro); color:var(--c-text-3); font-variant-numeric:tabular-nums; }
.tl-sub{ margin-top:2px; font-size:var(--fs-caption); color:var(--c-text-2); word-break:break-word; }
.tl-by{ margin-top:2px; text-align:right; font-size:var(--fs-micro); color:var(--c-text-3); }

/* 弹层里的原生文本域（避免 Vant autosize textarea 的输入绑定问题）
   token：字号 14、圆角 4、间距 8/16、边框 border */
.fld-label{ font-size:var(--fs-body); color:var(--c-text-1); padding:var(--sp-sm) 0 var(--sp-xs); }
.ta{ width:100%; box-sizing:border-box; padding:var(--sp-sm); font-size:var(--fs-body); line-height:var(--lh-body);
  color:var(--c-text-1); background:var(--c-surface); border:1px solid var(--c-border); border-radius:var(--r-sm);
  resize:vertical; font-family:inherit; }

/* ==========================================================================
   2026-11-11 视觉优化（只动样式/层级，不动业务字段与流程）
   目标：① 手机档左右留 16px、底部不被 Tabbar / 悬浮按钮压住
        ② 一条记录 = 一张卡，卡片只用「白面 + 细边」，不叠阴影
        ③ 首页从「大色块 + 空方框」收敛为「白卡 + 数字栅格 + 紧凑入口」
        ④ 强调色只保留主色一处，状态仍用文字+颜色双编码
   ========================================================================== */

/* —— 页面骨架：左右 16px、底部给 Tabbar + 悬浮按钮让位 —— */
.layout-mobile .content{
  padding:var(--sp-md);
  padding-bottom:calc(var(--tabbar-h) + 88px + env(safe-area-inset-bottom, 0px));
}
.layout-mobile .cards{ padding-bottom:0; }
.cards{ gap:var(--sp-md); }

/* —— 卡片统一：白面 + 1px 边，不再加阴影（DESIGN.md Elevation） —— */
.card{ border:1px solid var(--c-border); box-shadow:none; }

/* —— 首页问候卡：从整块主色改为白卡 + 数字栅格，主色只落在「当前待办」 —— */
.home-hero{
  background:var(--c-surface); color:var(--c-text-1);
  border:1px solid var(--c-border); box-shadow:none;
}
.home-hero .t24{ font-size:var(--fs-page); line-height:var(--lh-page); color:var(--c-text-1); }
.home-sub{ margin-top:2px; color:var(--c-text-2); }

.stats{
  display:grid; grid-template-columns:repeat(4,1fr); gap:0;
  margin-top:var(--sp-md); padding-top:var(--sp-md);
  border-top:1px solid var(--c-border);
}
.stat{ min-width:0; padding-left:var(--sp-md); }
.stat:first-child{ padding-left:0; }
.stat + .stat{ border-left:1px solid var(--c-border); }
.stat b{ color:var(--c-text-1); font-size:var(--fs-hero); }
.stat:first-child b{ color:var(--c-primary); }
.stat span{ color:var(--c-text-2); font-size:var(--fs-caption); }
@media (max-width:359px){
  .stats{ grid-template-columns:1fr 1fr; row-gap:var(--sp-md); }
  .stat:nth-child(3){ border-left:0; padding-left:0; }
}

/* —— 首页入口：去掉大空框感，改成 64px 的浅底块 —— */
.quick-grid{ gap:var(--sp-sm); }
.quick-item{
  min-height:64px; border:0; border-radius:var(--r-md);
  background:var(--c-bg); font-size:var(--fs-section); letter-spacing:0;
}
.quick-item:active{ background:var(--c-primary-light); color:var(--c-primary); }

/* —— 项目卡：去掉与状态胶囊重复的左侧色条，靠「状态胶囊 + 文字」表达 —— */
.proj-item{ border:1px solid var(--c-border); box-shadow:none; padding:var(--sp-md); }
.proj-item::before{ display:none; }
.proj-name{ font-size:var(--fs-section); }
.proj-meta{ margin-top:var(--sp-md); padding-top:var(--sp-sm); }

/* —— 待办分组：轻边框，主标题回到 14/600 —— */
.todo-group{ border:1px solid var(--c-border); box-shadow:none; border-radius:var(--r-md); }
.todo-item{ padding:var(--sp-md); }
.todo-title{ font-size:var(--fs-body); font-weight:600; }

/* —— 申报列表：由「一张大表切行」改成「一条一张卡」（DESIGN.md：一记录一卡） —— */
.req-list{ display:grid; gap:var(--sp-md); background:transparent; border:0; border-radius:0; overflow:visible; }
.req-item{ background:var(--c-surface); border:1px solid var(--c-border); border-radius:var(--r-md);
  padding:var(--sp-md); border-bottom:1px solid var(--c-border); }
.req-item:last-child{ border-bottom:1px solid var(--c-border); }
.req-head{ align-items:flex-start; }
.req-head .req-title{ flex:1 1 auto; min-width:0; }
.req-item:active{ background:var(--c-surface); }

/* —— 操作台流程行：10px 太小，提到 12px 并拉开间距 —— */
.flow-line{ font-size:var(--fs-caption); color:var(--c-text-2); gap:var(--sp-sm) var(--sp-md); }
.flow-line span.on{ color:var(--c-primary); }

/* —— 分段切换：从「套在容器里的条」改成两个独立可选块，选中态用浅底 —— */
.seg-tabs{ background:transparent; border:0; padding:0; gap:var(--sp-sm); }
.seg{ min-height:var(--tap); background:var(--c-surface); border:1px solid var(--c-border); }
.seg.active{ background:var(--c-primary-light); border-color:transparent; }
.seg-fresh{ min-height:var(--tap); }

/* —— 日志卡：去掉多余描边叠加，保持一卡一条 —— */
.lg-card{ border:1px solid var(--c-border); box-shadow:none; }

/* —— 项目卡：状态行 + 三项统计分两行，数字不再被挤换行 —— */
.proj-stage{ display:flex; flex-wrap:wrap; align-items:center; gap:var(--sp-sm) var(--sp-md); }
.proj-stage .stg-row{
  flex:1 1 100%; display:grid; grid-template-columns:repeat(3,1fr);
  gap:var(--sp-sm); padding-top:var(--sp-sm); border-top:1px solid var(--c-border);
}
.proj-stage .stg{ display:flex; align-items:baseline; gap:var(--sp-xs); min-width:0; white-space:nowrap; }
.proj-stage .stg b{ margin-left:0; }
.proj-stage .stg.idle b{ color:var(--c-text-3); }
.proj-stage .stg.doing b{ color:var(--c-danger); }
.proj-stage .stg.done b{ color:var(--c-success); }
.proj-meta{ grid-template-columns:repeat(3,minmax(0,1fr)); }

/* 状态胶囊：等待灰 / 进行中红 / 已完成绿（填充色 + 白字，文字仍保留） */
.pill.st-run{ background:var(--c-danger); color:#FFFFFF; }
.pill.st-pause{ background:var(--c-text-3); color:#FFFFFF; }
.pill.st-done{ background:var(--c-success); color:#FFFFFF; }
.pill.st-danger{ background:var(--c-danger); color:#FFFFFF; }
.task-sub .st-pill.st-run{ background:var(--c-danger); color:#FFFFFF; }
.task-sub .st-pill.st-done{ background:var(--c-success); color:#FFFFFF; }
.task-sub .st-pill.st-idle{ background:var(--c-text-3); color:#FFFFFF; }

/* —— 日志卡：日期徽标收小（主标题才是第一眼），筛选块降为工具条 —— */
.lg-date{ flex:0 0 36px; height:36px; background:transparent; }
.lg-date b{ font-size:var(--fs-body); color:var(--c-text-2); }
.lg-date span{ font-size:var(--fs-micro); color:var(--c-text-3); }
.lg-head{ gap:var(--sp-sm); }
.filter-row .filter-cell{ background:var(--c-bg); border-color:transparent; }
.seg-tabs + .filter-row{ margin-top:var(--sp-sm); }

/* —— 看板：百分比是核心数字，提到正文色加粗；工程名最多两行 —— */
.van-collapse-item__value{ color:var(--c-text-1); font-weight:600; font-variant-numeric:tabular-nums; }
.van-collapse-item__title{ font-size:var(--fs-body); line-height:var(--lh-body); }
.van-collapse-item__title .van-cell__title span{ display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }

/* —— 申报卡：长标题两行截断、底部元信息不换行（长名字/长单号用省略号） —— */
.req-title{ display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.req-foot{ flex-wrap:nowrap; overflow:hidden; }
.req-foot > span{ white-space:nowrap; }
.req-foot > span:first-child{ min-width:0; overflow:hidden; text-overflow:ellipsis; }
.req-foot .req-no{ max-width:46%; overflow:hidden; text-overflow:ellipsis; }
@media (min-width:768px){ .req-list{ grid-template-columns:1fr 1fr; } }

/* ===== 首页看板 · 无人机出勤（历史 5 / 今天 / 未来 5，三行） ===== */
.cal-card{ overflow:hidden; }
.cal-row{ display:grid; grid-template-columns:repeat(5,minmax(0,1fr)); gap:var(--sp-sm); }
.cal-day{ display:flex; flex-direction:column; align-items:center; gap:2px; min-height:76px;
  padding:var(--sp-sm) 2px; background:var(--c-surface);
  border:1px solid var(--c-border); border-radius:var(--r-md); }
.cal-day.past{ background:var(--c-bg); }
.cal-day .cal-w{ font-size:var(--fs-caption); color:var(--c-text-2); }
.cal-day .cal-d{ font-size:var(--fs-micro); color:var(--c-text-3); font-variant-numeric:tabular-nums; }
.cal-n{ display:inline-flex; align-items:baseline; gap:2px; font-size:var(--fs-micro); color:var(--c-success); white-space:nowrap; }
.cal-n em{ font-style:normal; }
.cal-n b{ font-size:var(--fs-body); font-weight:600; color:inherit; font-variant-numeric:tabular-nums; }
.cal-n.idle{ color:var(--c-text-3); }
.cal-today{ display:flex; align-items:center; justify-content:space-between; gap:var(--sp-sm);
  margin:var(--sp-sm) 0; padding:var(--sp-sm) var(--sp-md);
  background:var(--c-primary-light); border:1px solid var(--c-primary); border-radius:var(--r-md); }
.cal-today-l{ display:flex; align-items:baseline; gap:var(--sp-sm); }
.cal-today-t{ font-size:var(--fs-section); font-weight:600; color:var(--c-primary); }
.cal-today-l .cal-d{ font-size:var(--fs-caption); color:var(--c-text-2); }
.cal-today-n{ display:flex; align-items:baseline; gap:var(--sp-md); font-size:var(--fs-caption); color:var(--c-text-2); }
.cal-today-n > span{ color:var(--c-success); }
.cal-today-n > span.idle{ color:var(--c-text-3); }
.cal-today-n em{ font-style:normal; }
.cal-today-n b{ font-size:var(--fs-page); font-weight:600; color:inherit; margin-left:2px; font-variant-numeric:tabular-nums; }
.cal-day, .cal-today{ cursor:pointer; }
.cal-day:active, .cal-day.past:active, .cal-today:active{ background:var(--c-primary-light); }
/* 当日任务页 */
.day-bar{ display:flex; align-items:baseline; justify-content:space-between; gap:var(--sp-sm); cursor:pointer; }
.day-bar .t12{ white-space:nowrap; }
.day-bar-ico{ font-size:var(--fs-caption); color:var(--c-text-3); margin-left:2px; }
/* 日期选择弹层：去掉 Vant 自带的大号月份水印（截图上像脏数字） */
.van-calendar__month-mark{ display:none; }

/* 首页 · 工程进度（按任务，两列卡片；字段分色，卡片拉高不拥挤） */
.prog-grid{ display:grid; grid-template-columns:repeat(2,minmax(0,1fr)); gap:var(--sp-md); }
.prog-card{ display:flex; flex-direction:column; gap:4px; min-height:140px; cursor:pointer;
  padding:12px var(--sp-md); border:1px solid var(--c-border); border-radius:var(--r-md); background:var(--c-surface); }
.prog-card:active{ background:var(--c-bg); }
.prog-proj{ font-size:var(--fs-caption); font-weight:600; line-height:1.4; color:#0F766E; word-break:break-word; }
.prog-task{ font-size:var(--fs-body); font-weight:600; line-height:1.45; color:#1D4ED8;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.prog-foot{ margin-top:auto; padding-top:var(--sp-sm); display:flex; align-items:flex-end; justify-content:space-between; gap:var(--sp-sm); }
.prog-stage{ display:flex; flex-direction:column; gap:3px; min-width:0; }
.prog-stage-name{ font-size:var(--fs-caption); font-weight:600; color:#B45309; word-break:break-word; }
.prog-counts{ display:flex; flex-wrap:wrap; gap:2px 8px; font-size:var(--fs-micro); line-height:1.5; }
.prog-counts .pc.wait{ color:#969799; }
.prog-counts .pc.doing{ color:#DC2626; }
.prog-counts .pc.done{ color:#047857; }
.prog-right{ display:flex; flex-direction:column; align-items:flex-end; gap:2px; text-align:right; max-width:46%; }
.prog-owner{ max-width:100%; font-size:var(--fs-micro); color:#707070; line-height:1.5; text-align:right;
  display:-webkit-box; -webkit-line-clamp:2; -webkit-box-orient:vertical; overflow:hidden; }
.prog-time{ font-size:var(--fs-micro); color:#969799; font-variant-numeric:tabular-nums; white-space:nowrap; }

/* 首页「无人机出勤」右上角「全部」按钮 */
.cal-all{ min-height:44px; padding:0 var(--sp-md); border:1px solid var(--c-border); border-radius:var(--r-sm);
  background:var(--c-surface); color:var(--c-primary); font-size:var(--fs-caption); cursor:pointer; }
.cal-all:active{ background:var(--c-primary-light); border-color:var(--c-primary); }

/* 出勤日历页（月份在上、星期在下；格子按屏高拉伸铺满一个月） */
.cal-page{ padding:var(--sp-sm); min-width:0; overflow:hidden; }
.cal-page .van-tabs, .cal-page .van-tabs__content{ min-width:0; }
.cal-page .van-tabs__nav{ padding-left:0; padding-right:0; }
.cal-week{ display:grid; grid-template-columns:repeat(7,1fr); margin:var(--sp-sm) 0 var(--sp-xs); }
.cal-week span{ text-align:center; font-size:var(--fs-micro); color:var(--c-text-2); }
.cal-grid{ display:grid; grid-template-columns:repeat(7,1fr); grid-auto-rows:1fr;
  gap:2px; height:calc(100dvh - 290px); }
.cal-cell{ display:flex; flex-direction:column; align-items:center; justify-content:center; gap:2px;
  padding:var(--sp-xs) 0; border-radius:var(--r-sm); background:var(--c-bg); cursor:pointer; }
.cal-cell.blank{ background:transparent; cursor:default; }
.cal-cell.past{ background:var(--c-bg); }
.cal-cell.today{ background:var(--c-primary-light); box-shadow:0 0 0 1px var(--c-primary) inset; }
.cal-cell:not(.blank):active{ background:var(--c-primary-light); }
.cal-day-n{ font-size:var(--fs-body); font-weight:600; color:var(--c-text-1); font-variant-numeric:tabular-nums; }
.cal-cell-n{ font-size:var(--fs-micro); color:var(--c-success); white-space:nowrap; }
.cal-cell-n.idle{ color:var(--c-text-3); }

/* 微信官方样式登录组件（老板 2026-11-11：用微信官方组件样式，不要自造） */
.wx-auth { padding: 0 0 12px; }
.wx-auth-h { text-align: center; padding: 24px 16px 14px; }
.wx-auth-app { font-size: 17px; font-weight: 600; color: #111; }
.wx-auth-t { font-size: 13px; color: #888; margin-top: 6px; }
.wx-auth .van-cell-group { margin: 0 16px; border-radius: 6px; overflow: hidden; }
.wx-auth .van-field { background: #f7f7f7; }
.wx-auth-btns { padding: 16px; }
.wx-btn { width: 100%; height: 48px; border: 0; border-radius: 6px; background: #07C160; color: #fff; font-size: 16px; display: flex; align-items: center; justify-content: center; gap: 8px; }
.wx-btn:disabled { opacity: .6; }
.wx-btn-plain { width: 100%; height: 44px; border: 0; background: transparent; color: #576B95; font-size: 15px; }
.wx-auth-switch { text-align: center; font-size: 13px; color: #576B95; padding: 2px 0 10px; }

/* 无角色用户：首页只读，任何点击都不响应（老板 2026-11-11） */
.cal-card.readonly .cal-row, .cal-card.readonly .cal-today { pointer-events: none; }

/* 首页问候（老板 2026-11-11） */
.card.greet { display: flex; align-items: center; gap: 12px; padding: 16px; border: 0; position: relative;
  background: linear-gradient(135deg, #1989FA 0%, #2F6FED 100%); color: #fff; border-radius: 12px; }
.greet-ava { width: 44px; height: 44px; flex: 0 0 44px; border-radius: 50%; background: rgba(255,255,255,.22);
  display: flex; align-items: center; justify-content: center; font-size: 18px; font-weight: 600; color: #fff; }
.greet-hi { font-size: 17px; font-weight: 600; color: #fff; line-height: 1.35; }
.greet-role { position: absolute; right: 16px; bottom: 12px; font-size: 12px; color: #fff;
  background: rgba(255,255,255,.18); padding: 2px 10px; border-radius: 10px; }
.greet-ava { border: 1px solid rgba(255,255,255,.35); }
.greet-hi b { font-weight: 700; }

/* 蓝绿填充主题（老板 2026-11-11：其他模块也加填充色，以蓝绿渐变为主） */
.card.greet { background: linear-gradient(135deg, #0EA5E9 0%, #10B981 100%); }
.card.cal-card { background: linear-gradient(160deg, #F0F9FF 0%, #ECFDF5 100%); border: 1px solid #D7EEF9; }
.cal-day { background: linear-gradient(160deg, #FFFFFF 0%, #F0FBF7 100%); border-color: #DCEFE9; }
.cal-day.past { background: linear-gradient(160deg, #F8FAFC 0%, #F1F5F9 100%); }
.cal-today { background: linear-gradient(120deg, #DBEAFE 0%, #D1FAE5 100%); border-color: #34D399; }
.prog-card { background: linear-gradient(160deg, #F0F9FF 0%, #ECFDF5 100%); border-color: #D7EEF9; }
.prog-card:active { background: linear-gradient(160deg, #E0F2FE 0%, #D1FAE5 100%); }
.card.cal-card { background: linear-gradient(160deg, #E8F4FF 0%, #E9FBF2 100%); border-color: #CBE7F5; }
.greet-role { background: rgba(255,255,255,.28); }

/* ===== 模块填充主题：无人机/申报=蓝渐变，工程/日志=绿渐变（老板 2026-11-11） ===== */
/* 首页 · 无人机出勤（蓝） */
.card.cal-card { background: linear-gradient(160deg, #EAF4FF 0%, #DCEEFF 100%); border-color: #C7E0F8; }
.cal-day { background: linear-gradient(160deg, #F7FBFF 0%, #EAF4FF 100%); border-color: #D6E8FA; }
.cal-day.past { background: linear-gradient(160deg, #F8FAFC 0%, #EEF2F7 100%); }
.cal-today { background: linear-gradient(120deg, #DBEAFE 0%, #BFDBFE 100%); border-color: #60A5FA; }
.cal-today-t { color: #1D4ED8; }
.cal-today-n > span { color: #1D4ED8; }
/* 首页 · 工程进度（绿） */
.prog-card { background: linear-gradient(160deg, #F1FBF5 0%, #E6F7EE 100%); border-color: #CDEBD8; }
.prog-card:active { background: linear-gradient(160deg, #E0F5E8 0%, #D1F0DF 100%); }
/* 无人机 / 待办 / 申报 / 审批 = 蓝 */
.page-drone .card, .page-request .card { background: linear-gradient(160deg, #F2F8FF 0%, #EAF3FF 100%); border-color: #D8E8FA; }
.page-drone .todo-item, .page-request .req-item, .page-drone .alloc-row, .page-drone .act-row { background: linear-gradient(160deg, #FFFFFF 0%, #EFF6FF 100%); border-color: #D8E8FA; }
/* 工程 / 任务 / 日志 / 进度 = 绿 */
.page-project .card { background: linear-gradient(160deg, #F3FBF6 0%, #EAF8F0 100%); border-color: #D5EEDF; }
.page-project .proj-item, .page-project .task-row, .page-project .log-row, .page-project .lg-card, .page-project .dev-row { background: linear-gradient(160deg, #FFFFFF 0%, #EFFAF4 100%); border-color: #D5EEDF; }
/* 管理类页面 · 中性蓝灰 */
.page-admin .card { background: linear-gradient(160deg, #F8FAFC 0%, #F1F5F9 100%); border-color: #E2E8F0; }
/* 加深一档：让填充更明显 */
.prog-card { background: linear-gradient(160deg, #EAF8F0 0%, #DDF2E6 100%); border-color: #C6E8D3; }
.page-project .proj-item, .page-project .task-row, .page-project .log-row, .page-project .lg-card { background: linear-gradient(160deg, #FFFFFF 0%, #E3F6EB 100%); border-color: #C9E9D6; }
.page-request .req-item, .page-drone .todo-item { background: linear-gradient(160deg, #FFFFFF 0%, #E6F0FF 100%); border-color: #CFE2FA; }
.cal-cell { background: linear-gradient(160deg, #FFFFFF 0%, #EFF7FF 100%); border-radius: 10px; }
.cal-cell.past { background: linear-gradient(160deg, #F8FAFC 0%, #EEF2F7 100%); }
.cal-cell.today { background: linear-gradient(135deg, #DBEAFE 0%, #BFDBFE 100%); box-shadow: 0 0 0 1px #60A5FA inset; }
.cal-cell-n { color: #1D4ED8; }
/* 再加深一档，保证肉眼可见（仍然低饱和） */
.page-project .card { background: linear-gradient(155deg, #EDFAF3 0%, #DFF5E9 100%); border-color: #CDEBD8; }
.page-project .proj-item, .page-project .task-row, .page-project .log-row, .page-project .lg-card { background: linear-gradient(150deg, #E9FAF1 0%, #D8F3E4 100%); border-color: #BEE7CF; }
.page-request .card { background: linear-gradient(155deg, #EDF6FF 0%, #DCEBFF 100%); border-color: #CBE0FB; }
.page-request .req-item, .page-drone .todo-item { background: linear-gradient(150deg, #F5FAFF 0%, #DCEEFF 100%); border-color: #C6DDFA; }
.prog-card { background: linear-gradient(150deg, #E3F7EC 0%, #D2F0E1 100%); border-color: #BFE6D0; }
/* 填充再明显一点（蓝/绿各自成体系） */
.page-project .card { background: linear-gradient(155deg, #E8F9F0 0%, #D6F2E3 100%); border-color: #C2E8D2; }
.page-project .proj-item, .page-project .task-row, .page-project .log-row, .page-project .lg-card { background: linear-gradient(150deg, #DCF5E8 0%, #C6EDD8 100%); border-color: #B3E2C7; }
.page-request .card { background: linear-gradient(155deg, #E8F3FF 0%, #D6E9FF 100%); border-color: #C2DCFB; }
.page-request .req-item, .page-drone .todo-item, .page-drone .alloc-row, .page-drone .act-row { background: linear-gradient(150deg, #EAF4FF 0%, #D2E7FF 100%); border-color: #B9D7FA; }
.page-admin .card { background: linear-gradient(155deg, #F5F8FC 0%, #E9EFF6 100%); border-color: #DCE4EE; }
.page-drone .req-item { background: linear-gradient(150deg, #EAF4FF 0%, #D2E7FF 100%); border-color: #B9D7FA; }

/* 小程序 web-view 自定义导航：状态栏让位 + 品牌色状态条 */
html.wx-mini { --sbh: env(safe-area-inset-top, 0px); --van-nav-bar-height: 40px; }
html.wx-mini body::before {
  content: ''; position: fixed; top: 0; left: 0; right: 0; height: var(--sbh, 0px);
  background: linear-gradient(135deg, #0EA5E9 0%, #10B981 100%); z-index: 9999;
}
html.wx-mini .van-nav-bar--fixed { top: var(--sbh, 0px); }
html.wx-mini .van-nav-bar__placeholder { height: calc(40px + var(--sbh, 0px)) !important; }
html.wx-mini .van-nav-bar__right { padding-right: 84px; }

/* 小程序首页隐藏 H5 导航后：状态栏高度 + 8px 缝隙 */
html.wx-mini .shell.no-nav .content { padding-top: calc(var(--sbh, 0px) + 14px); }

/* 右上角悬浮「更多」（每个页面都有；小程序里让开微信胶囊） */
.fab-more {
  position: fixed; top: 8px; right: 8px; z-index: 40;
  width: 32px; height: 32px; border-radius: 50%;
  background: rgba(255, 255, 255, .95);
  box-shadow: 0 2px 10px rgba(0, 0, 0, .15);
  display: flex; align-items: center; justify-content: center;
  color: #333;
}
html.wx-mini .fab-more { top: calc(var(--sbh, 0px) + 4px); right: 8px; background: rgba(255, 255, 255, .9); }
/* 首页（无 H5 导航）时：贴最右侧，落在微信胶囊下方一行 */
html.wx-mini .fab-more.fab-home { top: calc(var(--sbh, 0px) + 4px); right: 8px; }

/* 小程序内子页面：左上角悬浮返回 */
.fab-back {
  position: fixed; top: 8px; left: 8px; z-index: 40;
  width: 32px; height: 32px; border-radius: 50%;
  background: rgba(255, 255, 255, .95);
  box-shadow: 0 2px 10px rgba(0, 0, 0, .15);
  display: flex; align-items: center; justify-content: center; color: #333;
}
html.wx-mini .fab-back { top: calc(var(--sbh, 0px) + 4px); left: 8px; background: rgba(255, 255, 255, .9); }
