/* ============================================================
   健管师工作台 · 视觉层 v2
   方向：清爽高密度的现代工作台。无衬线、白底、小圆角、极轻阴影、
        单一主色（青绿）。刻意去掉纸感、字距、宋体与赭金——
        这是干活的平台，不是交付给用户的报告。
   ============================================================ */

:root{
  /* 面 */
  --bg:#f5f7fa;
  --surface:#ffffff;
  --surface-2:#fafbfc;
  --surface-3:#f2f5f8;

  /* 线 */
  --line:#e4e8ee;
  --line-2:#eef1f5;

  /* 字 */
  --ink:#171a20;
  --ink-2:#525a67;
  --ink-3:#89909c;
  --ink-4:#b4bac4;

  /* 主色：青绿 */
  --brand:#0d9488;
  --brand-2:#0b7a70;
  --brand-bg:#e7f5f3;
  --brand-line:rgba(13,148,136,.32);

  /* 语义色 */
  --red:#e0483f;    --red-bg:#fdecea;
  --orange:#dd7a35; --orange-bg:#fdf2e8;
  --amber:#c9941a;  --amber-bg:#fdf7e6;
  --green:#18a05c;  --green-bg:#e9f7ef;
  --blue:#2f6fed;   --blue-bg:#eaf1fe;

  /* 兼容别名：app.js 内联样式里引用的旧变量 */
  --gold:var(--brand);
  --gold-m:var(--brand-line);
  --gold-l:rgba(13,148,136,.18);
  --gold-bg:var(--brand-bg);
  --card:var(--surface);
  --card2:var(--surface-2);
  --red-m:rgba(224,72,63,.30);

  --sans:-apple-system,BlinkMacSystemFont,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","Segoe UI",Roboto,"Helvetica Neue",Arial,sans-serif;
  --mono:"SF Mono",ui-monospace,Consolas,"Cascadia Mono","Roboto Mono",monospace;

  --r:8px;
  --r-sm:6px;
  --sh:0 1px 2px rgba(23,26,32,.05);
}

*{box-sizing:border-box}
html,body{height:100%}
body{
  margin:0;background:var(--bg);color:var(--ink);
  font-family:var(--sans);font-size:13.5px;line-height:1.55;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
}
button{font-family:inherit;cursor:pointer}
a{color:inherit;text-decoration:none}
table{border-collapse:collapse}

.app{min-height:100vh;display:grid;grid-template-rows:auto 1fr}

/* ================= 顶栏 ================= */
.topbar{
  display:flex;align-items:center;gap:16px;
  padding:0 20px;height:54px;
  background:var(--surface);border-bottom:1px solid var(--line);
  position:sticky;top:0;z-index:60;
}
.brand{display:flex;align-items:center;gap:9px}
.brand .mark{
  width:22px;height:22px;border-radius:6px;background:var(--brand);
  display:flex;align-items:center;justify-content:center;
  color:#fff;font-size:12px;font-weight:700;
}
.brand .b2{font-size:14.5px;font-weight:600;letter-spacing:.01em}
.topbar .sep{width:1px;height:18px;background:var(--line)}
.topbar .tdate{font-size:12.5px;color:var(--ink-3)}
.topbar .tdate b{color:var(--ink-2);font-weight:600}
/* 隐私标识常驻在顶栏 —— 这里放着真实用户姓名与健康数据，打开就该看见；
   但只占一行小字，不遮挡任何内容（早先的右下角浮层挡事，已去掉）。 */
.topbar .privacy{
  font-size:11.5px;color:#9a3b3b;border:1px solid #e3c9c9;background:#fbf3f3;
  padding:2px 9px;border-radius:999px;letter-spacing:.01em;white-space:nowrap;
}
.topbar .grow{flex:1}
.me{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--ink-3)}
.me .av{
  width:26px;height:26px;border-radius:50%;background:var(--brand-bg);color:var(--brand-2);
  display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:600;
}

/* ================= 侧栏 ================= */
.shell{display:grid;grid-template-columns:198px 1fr;align-items:start}
.side{
  background:var(--surface);border-right:1px solid var(--line);
  min-height:calc(100vh - 54px);padding:12px 10px 40px;
  position:sticky;top:54px;
}
.side .grp{
  font-size:11px;font-weight:600;color:var(--ink-4);
  padding:0 10px;margin:16px 0 6px;letter-spacing:.04em;
}
.side .grp:first-child{margin-top:4px}
.nav{
  display:flex;align-items:center;justify-content:space-between;gap:8px;
  padding:8px 10px;border-radius:var(--r-sm);font-size:13.5px;color:var(--ink-2);
  margin-bottom:2px;
}
.nav:hover{background:var(--surface-3);color:var(--ink)}
.nav.on{background:var(--brand-bg);color:var(--brand-2);font-weight:600}
.nav.on:hover{background:var(--brand-bg)}
.nav .cnt{
  font-size:11px;font-weight:600;color:#fff;background:var(--red);
  min-width:18px;height:18px;padding:0 5px;border-radius:999px;
  display:flex;align-items:center;justify-content:center;
}
.nav .cnt.n{background:var(--ink-4)}
.nav.on .cnt.n{background:var(--brand);opacity:.75}

/* ================= 主区 ================= */
.main{padding:20px 24px 64px;min-width:0}
.head{display:flex;align-items:center;gap:12px;margin-bottom:16px;flex-wrap:wrap}
.head h1{font-size:19px;margin:0;font-weight:600;letter-spacing:.01em}
.head .sub{
  font-size:11.5px;font-weight:600;color:var(--brand-2);background:var(--brand-bg);
  padding:3px 8px;border-radius:999px;
}
.head .grow{flex:1}
.head .hint{font-size:12.5px;color:var(--ink-3)}

/* 分栏：左弹性 + 右栏贴右 */
.cols{display:grid;grid-template-columns:minmax(0,1fr) 336px;gap:18px;align-items:start}
.rail{display:grid;gap:18px;align-content:start;position:sticky;top:72px}
@media (max-width:1220px){
  .cols{grid-template-columns:minmax(0,1fr)}
  .rail{position:static}
}

/* ================= 卡片 ================= */
.card{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  box-shadow:var(--sh);overflow:hidden;
}
.card > .ch{
  display:flex;align-items:center;gap:10px;
  padding:12px 16px;border-bottom:1px solid var(--line-2);
}
.card > .ch .t{font-size:13.5px;font-weight:600}
.card > .ch .s{
  font-size:11px;font-weight:600;color:var(--ink-3);
  background:var(--surface-3);padding:2px 7px;border-radius:999px;
}
.card > .ch .grow{flex:1}
.card > .ch .n{font-size:12.5px;color:var(--ink-3)}
.card .cb{padding:16px}
.card .cb.tight{padding:0}

/* ================= 任务清单 ================= */
.queue{border-top:0}
.task{
  display:grid;grid-template-columns:54px minmax(0,1fr) 118px 148px;
  gap:16px;align-items:center;cursor:pointer;
  padding:14px 18px;border-bottom:1px solid var(--line-2);
  transition:background .12s;
}
.task:last-child{border-bottom:0}
.task:hover{background:var(--surface-2)}
.task.done{opacity:.45}
.task.done .what{text-decoration:line-through;text-decoration-color:var(--ink-4)}

.lv{
  display:inline-flex;align-items:center;justify-content:center;
  font-size:11.5px;font-weight:600;padding:3px 0;border-radius:999px;
}
.task.lv1 .lv{background:var(--red);color:#fff}
.task.lv2 .lv{background:var(--orange-bg);color:var(--orange)}
.task.lv3 .lv{background:var(--red-bg);color:var(--red)}
.task.lv4 .lv{background:var(--brand-bg);color:var(--brand-2)}
.task.lv5 .lv{background:var(--surface-3);color:var(--ink-3)}

.who{min-width:0}
.who .nm{font-size:13.5px;font-weight:600;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.who .nm .tag{font-weight:500}
.what{font-size:13.5px;color:var(--ink);margin:3px 0 2px}
.why{font-size:12.5px;color:var(--ink-3);line-height:1.6;max-width:820px}

.due{text-align:right}
.due .d1{font-size:12.5px;font-weight:600;color:var(--ink-2)}
.due .d1.hot{color:var(--red)}
.due .d2{font-size:11.5px;color:var(--ink-4);margin-top:1px;font-variant-numeric:tabular-nums}

.act{display:flex;gap:6px;justify-content:flex-end}

/* ================= 按钮 ================= */
.btn{
  font-size:12.5px;font-weight:500;padding:6px 12px;
  border-radius:var(--r-sm);border:1px solid var(--line);
  background:var(--surface);color:var(--ink-2);
  white-space:nowrap;transition:background .12s,border-color .12s,color .12s;
}
.btn:hover{border-color:var(--brand-line);color:var(--brand-2);background:var(--brand-bg)}
.btn.solid{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.solid:hover{background:var(--brand-2);border-color:var(--brand-2);color:#fff}
.btn.ghost{border-color:transparent;color:var(--ink-3)}
.btn.ghost:hover{border-color:var(--line);background:var(--surface-3);color:var(--ink-2)}
.btn.tiny{font-size:11.5px;padding:4px 9px}

/* ================= 概况格 ================= */
.stat{display:grid;grid-template-columns:1fr 1fr;gap:1px;background:var(--line-2)}
.stat > div{background:var(--surface);padding:15px 16px}
.stat .k{font-size:11.5px;color:var(--ink-3);margin-bottom:7px}
.stat .v{font-size:24px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.stat .v small{font-size:11.5px;font-weight:400;color:var(--ink-4);margin-left:3px;letter-spacing:0}
.stat .v.red{color:var(--red)}
.stat .v.amber{color:var(--orange)}

/* ================= 待认领 ================= */
.pool .row{
  display:flex;align-items:center;gap:10px;padding:13px 16px;
  border-bottom:1px solid var(--line-2);font-size:13px;
}
.pool .row:last-child{border-bottom:0}
.pool .row .nm{font-weight:600}
.pool .row .mt{font-size:11.5px;color:var(--ink-3)}
.pool .row .grow{flex:1}

/* ================= 表格 ================= */
.ledger{width:100%;border-collapse:collapse}
.ledger th{
  font-size:11.5px;font-weight:600;color:var(--ink-2);text-align:left;
  padding:10px 12px;background:var(--surface-3);
  border-bottom:1px solid var(--line);white-space:nowrap;
}
.ledger td{
  padding:12px;border-bottom:1px solid var(--line-2);font-size:13px;
  vertical-align:middle;
}
.ledger tbody tr:hover td{background:#f7fbfa}
.ledger tbody tr{cursor:pointer}
.ledger td.num{font-variant-numeric:tabular-nums;white-space:nowrap}
.ledger .nm{font-weight:600;font-size:13.5px}
.ledger .sub{font-size:11.5px;color:var(--ink-3);margin-top:2px;font-weight:400}
.ledger th:first-child,.ledger td:first-child{padding-left:18px}
.ledger th:last-child,.ledger td:last-child{padding-right:18px}

/* ================= 标签 ================= */
.tag{
  display:inline-flex;align-items:center;
  font-size:11.5px;font-weight:500;padding:2px 8px;border-radius:999px;
  background:var(--surface-3);color:var(--ink-2);white-space:nowrap;
}
.tag.gold,.tag.brand{background:var(--brand-bg);color:var(--brand-2)}
.tag.red{background:var(--red-bg);color:var(--red)}
.tag.amber{background:var(--amber-bg);color:var(--amber)}
.tag.green{background:var(--green-bg);color:var(--green)}
.tag.blue{background:var(--blue-bg);color:var(--blue)}
.tag.gray{background:var(--surface-3);color:var(--ink-3)}

.dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:.5px}
.dot.r{background:var(--red)}
.dot.y{background:var(--amber)}
.dot.g{background:var(--green)}
.dot.n{background:var(--ink-4)}

/* ================= 视图切换 ================= */
.seg{display:flex;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;background:var(--surface)}
.seg button{
  font-size:12.5px;font-weight:500;padding:6px 14px;border:0;
  background:transparent;color:var(--ink-3);border-right:1px solid var(--line);
}
.seg button:last-child{border-right:0}
.seg button.on{background:var(--brand);color:#fff}
.seg button:not(.on):hover{background:var(--surface-3);color:var(--ink-2)}

.filters{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:14px}
/* 承接人姓名待登记提示条（台账页）——用琥珀色：它是一件"该做但没做"的事，
   不是错误，也不该抢过今日必做的红警。 */
.ofix{
  display:flex;align-items:center;gap:12px;
  margin:0 0 12px;padding:11px 14px;border-radius:var(--r);
  background:var(--amber-bg);border:1px solid rgba(201,148,26,.34);
  font-size:12.5px;line-height:1.6;color:var(--ink-2);
}
.ofix .of-t{flex:0 0 auto;color:var(--ink);font-weight:500}
.ofix .of-t b{color:var(--amber);font-size:14px;margin:0 2px}
.ofix .of-n{color:var(--ink-3);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:46%}
.ofix .grow{flex:1}
.chip{
  font-size:12.5px;font-weight:500;padding:6px 12px;border-radius:999px;
  border:1px solid var(--line);background:var(--surface);color:var(--ink-2);
}
.chip:hover{border-color:var(--brand-line);color:var(--brand-2)}
.chip.on{background:var(--ink);color:#fff;border-color:var(--ink)}
.chip .c{opacity:.55;margin-left:5px;font-variant-numeric:tabular-nums}
.lq{
  font-family:inherit;font-size:12.5px;padding:6px 11px;width:156px;
  border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);color:var(--ink);
}
.lq::placeholder{color:var(--ink-4)}
.lq:focus{outline:none;border-color:var(--brand-line)}

/* 报告正文：iframe 渲染 report.js 生成的成品，样式与工作台天然隔离 */
.rpt-frame-wrap{height:72vh;min-height:460px;border:1px solid var(--line);border-radius:var(--r);overflow:hidden;background:#fff}
.rpt-frame{width:100%;height:100%;border:0;display:block}

/* ================= 泳道 ================= */
/* 体验期与订阅期是两条不同的轴，分组呈现，不接成一条 */
.lanegroup{padding:16px 16px 6px}
.lanegroup + .lanegroup{border-top:1px solid var(--line);padding-top:18px}
.lanegroup:last-child{padding-bottom:16px}
.lgh{display:flex;align-items:center;gap:10px;margin-bottom:12px}
.lgh .t{font-size:13.5px;font-weight:600}
.lgh .c{
  font-size:11.5px;font-weight:600;color:var(--brand-2);background:var(--brand-bg);
  padding:2px 8px;border-radius:999px;
}
.lgh .hint{font-size:11.5px;color:var(--ink-4);margin-left:auto}

.lanes{display:grid;gap:10px}
.lanegroup.trial .lanes{grid-template-columns:repeat(7,minmax(0,1fr))}
.lanegroup.sub .lanes{grid-template-columns:repeat(6,minmax(0,1fr))}
.lane{background:var(--surface-3);border-radius:var(--r-sm);padding:10px;min-height:148px}
.lane .lh{
  display:flex;justify-content:space-between;align-items:baseline;gap:6px;
  font-size:12px;font-weight:600;color:var(--ink-2);
  padding-bottom:8px;margin-bottom:9px;border-bottom:1px solid var(--line);
}
.lane .lh .c{font-size:10.5px;color:var(--ink-4);font-weight:500;white-space:nowrap}
@media (max-width:1240px){
  .lanegroup.trial .lanes{grid-template-columns:repeat(4,minmax(0,1fr))}
  .lanegroup.sub .lanes{grid-template-columns:repeat(3,minmax(0,1fr))}
}
@media (max-width:900px){
  .lanegroup.trial .lanes,.lanegroup.sub .lanes{grid-template-columns:repeat(2,minmax(0,1fr))}
}
.ucard{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:8px 10px;margin-bottom:6px;cursor:pointer;
  border-left:3px solid var(--ink-4);
}
.ucard:hover{border-color:var(--brand-line);border-left-color:var(--brand);box-shadow:var(--sh)}
.ucard .n{font-weight:600;font-size:12.5px}
.ucard .m{font-size:11px;color:var(--ink-3);margin-top:2px}
.ucard.overdue{border-left-color:var(--red)}
.ucard.due{border-left-color:var(--orange)}
.scrollx{overflow-x:auto}

/* ================= 抽屉 ================= */
.mask{
  position:fixed;inset:0;background:rgba(23,26,32,.34);z-index:90;
  opacity:0;pointer-events:none;transition:opacity .18s;
}
.mask.on{opacity:1;pointer-events:auto}
.drawer{
  position:fixed;top:0;right:0;bottom:0;width:min(940px,94vw);z-index:100;
  background:var(--surface);border-left:1px solid var(--line);
  transform:translateX(100%);transition:transform .22s cubic-bezier(.32,.72,0,1);
  display:flex;flex-direction:column;
}
.drawer.on{transform:none}
.drawer .dh{
  padding:16px 24px;border-bottom:1px solid var(--line);
  display:flex;align-items:flex-start;gap:12px;
}
.drawer .dh .grow{flex:1}
.drawer .dh h2{margin:0;font-size:18px;font-weight:600;letter-spacing:.01em}
.drawer .dh .meta{font-size:12.5px;color:var(--ink-3);margin-top:6px;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.drawer .close{
  width:30px;height:30px;border-radius:var(--r-sm);border:1px solid var(--line);
  background:var(--surface);color:var(--ink-3);font-size:15px;line-height:1;
  display:flex;align-items:center;justify-content:center;
}
.drawer .close:hover{border-color:var(--ink-4);color:var(--ink)}

/* 标签条 —— 分组后必须让"待处理量"在标签上可见，
   否则藏起来的待办就没人知道 */
.drawer .dtabs{
  display:flex;gap:2px;padding:0 24px;flex:0 0 auto;
  background:var(--surface);border-bottom:1px solid var(--line);
}
.dtab{
  position:relative;border:0;background:transparent;font-family:inherit;
  font-size:13px;color:var(--ink-3);cursor:pointer;
  padding:10px 11px 11px;margin-bottom:-1px;
  border-bottom:2px solid transparent;
  display:flex;align-items:center;gap:6px;transition:color .12s;
}
.dtab:hover{color:var(--ink-2)}
.dtab.on{color:var(--ink);font-weight:600;border-bottom-color:var(--brand)}
.dtab .bdg{
  font-size:10.5px;font-weight:600;line-height:1;
  min-width:16px;height:16px;padding:0 5px;border-radius:999px;
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--red);color:#fff;
}
.dtab .bdg.amber{background:var(--amber)}

.drawer .db{overflow-y:auto;padding:20px 24px 48px;flex:1}
.drawer .df{
  border-top:1px solid var(--line);padding:12px 24px;background:var(--surface-2);
  display:flex;gap:8px;align-items:center;flex-wrap:wrap;
}

.block{margin-bottom:26px}
.block:last-child{margin-bottom:6px}
.block > .bt{
  display:flex;justify-content:space-between;align-items:center;
  font-size:12px;font-weight:600;color:var(--ink-2);
  padding-bottom:8px;margin-bottom:14px;border-bottom:1px solid var(--line);
}
.block > .bt .r{font-size:11.5px;font-weight:500;color:var(--ink-4)}
/* 块头左侧组：标题与位置口径紧挨着放，不被 space-between 拉开 */
.block > .bt .bt-l{display:flex;align-items:center;gap:9px;min-width:0}
.block > .bt .r.pill{
  font-weight:600;color:var(--brand-2);background:var(--brand-bg);
  padding:3px 10px;border-radius:999px;letter-spacing:.01em;
}

.kv{display:grid;grid-template-columns:92px minmax(0,1fr);gap:10px 16px;font-size:13px}
.kv .k{font-size:12.5px;color:var(--ink-3);padding-top:1px}
.kv .v{color:var(--ink);line-height:1.6}
.kv .v.num{font-variant-numeric:tabular-nums}

/* 数据格 */
.dgrid{display:grid;grid-template-columns:repeat(4,1fr);gap:1px;background:var(--line-2);border-radius:var(--r-sm);overflow:hidden}
.dgrid > div{background:var(--surface);padding:13px 12px}
.dgrid .k{font-size:11.5px;color:var(--ink-3);margin-bottom:7px}
.dgrid .v{font-size:21px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.dgrid .v small{font-size:11px;font-weight:400;color:var(--ink-4);margin-left:2px;letter-spacing:0}

/* ============ 服务任务：横向步骤条 ============
   抽屉加宽后改用横向罗列 —— 全流程一眼看完走了多少、卡在哪。
   状态色只用在"已完成 / 当前 / 逾期"三种，未开始保持中性。 */
.steps{
  display:grid;gap:6px;margin-bottom:14px;
  grid-template-columns:repeat(auto-fit,minmax(92px,1fr));
}
.step{
  border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);padding:9px 8px 8px;text-align:center;
  min-width:0;
}
.step .sn{
  width:19px;height:19px;border-radius:50%;margin:0 auto 6px;
  display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:600;line-height:1;
  background:var(--surface-3);color:var(--ink-4);
}
.step .s2{font-size:12px;font-weight:600;color:var(--ink-3);line-height:1.35}
.step .s3{font-size:10.5px;color:var(--ink-4);margin-top:3px}

/* 已完成 —— 过去时：中性灰卡，只留一个绿勾，不与"当前"抢注意力 */
.step.ok{background:var(--surface-2);border-color:var(--line)}
.step.ok .sn{background:var(--green);color:#fff}
.step.ok .s2{color:var(--ink-2)}

/* 当前 —— 全组唯一的实心块：深青底白字，与灰色已完成拉开 */
.step.cur{background:var(--brand-2);border-color:var(--brand-2)}
.step.cur .sn{background:#fff;color:var(--brand-2)}
.step.cur .s2{color:#fff}
.step.cur .s3{color:rgba(255,255,255,.72)}

/* 逾期 —— 与"当前"互斥（逾期即当前节点逾期），同样用实心 */
.step.od{background:var(--red);border-color:var(--red)}
.step.od .sn{background:#fff;color:var(--red)}
.step.od .s2{color:#fff}
.step.od .s3{color:rgba(255,255,255,.75)}

/* 已完成可点击回顾 */
.step.clickable{cursor:pointer}
.step.clickable:hover{border-color:var(--green);box-shadow:0 1px 4px rgba(24,160,92,.16)}
.step.viewing{outline:2px solid var(--green);outline-offset:1px}
/* 回顾态下点当前阶段即可返回：主色聚焦环标出可点（白框在白底上不可见）*/
.step.back{cursor:pointer;outline:2px solid var(--brand-2);outline-offset:2px}
.step.back:hover{background:var(--brand);border-color:var(--brand);outline-color:var(--brand)}

/* 已停用 —— 终止状态，中性灰，不标红 */
.step.stop{background:var(--surface-3);border-color:var(--line)}
.step.stop .sn{background:var(--ink-4);color:#fff}
.step.stop .s2{color:var(--ink-2)}

/* ============ 当前阶段要求 ============ */
.stage-req{
  border:1px solid var(--brand-line);border-radius:var(--r-sm);
  background:var(--surface);padding:12px 14px;
}
.stage-req.od{border-color:rgba(224,72,63,.28)}
.sr-h{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap;margin-bottom:7px}
.sr-t{font-size:13.5px;font-weight:600}
.stage-req.od .sr-t{color:var(--red)}
.sr-flag{
  font-size:10.5px;font-weight:600;padding:1px 7px;border-radius:999px;
  background:var(--red);color:#fff;
}
.sr-w{font-size:11.5px;color:var(--ink-4)}
.sr-c{margin-left:auto;font-size:11.5px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.sr-note{font-size:12.5px;line-height:1.65;color:var(--ink-2);margin-bottom:10px}
.sr-flag.ok{background:var(--green)}
.stage-req.done{border-color:rgba(24,160,92,.28)}
.sr-out{
  margin-top:11px;padding-top:10px;border-top:1px solid var(--line-2);
  font-size:12.5px;line-height:1.7;color:var(--ink-2);
}
.sr-out::before{
  content:"该阶段产出";display:block;
  font-size:10.5px;font-weight:600;letter-spacing:.12em;color:var(--ink-4);margin-bottom:3px;
}

.sop-list{list-style:none;margin:0;padding:0}
.sop-list li{padding:6px 0;border-top:1px solid var(--line-2)}
.sop-list li:first-child{border-top:0}

/* ============ 工具面板 ============
   12 张工具卡共用同一套外壳：对象条 + 分步/列表 + 底部动作区。
   这些类只出现在 .sheet 里，不污染工作台主界面。 */
.ubar{
  display:flex;align-items:center;gap:10px;flex-wrap:wrap;
  padding:10px 14px;margin-bottom:18px;
  background:var(--surface-2);border:1px solid var(--line);border-radius:var(--r-sm);
}
.ubar .uk{font-size:11.5px;color:var(--ink-4)}
.ubar select{
  font-family:var(--sans);font-size:12.5px;color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-sm);
  padding:4px 8px;background:var(--surface);min-width:156px;
}
.ubar .um{font-size:12px;color:var(--ink-3)}

/* 分步指导 */
.tstep{display:flex;flex-direction:column;gap:8px}
.tstep .ts{
  display:flex;align-items:flex-start;gap:11px;
  padding:11px 13px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);
}
.tstep .ts.ok{background:var(--green-bg);border-color:rgba(24,160,92,.24)}
.tstep .ts.cur{border-color:var(--brand-line);background:var(--brand-bg)}
.tstep .ts.cur .tn{background:var(--brand);color:#fff}
.tstep .ts .tn{
  flex:0 0 auto;width:20px;height:20px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:600;background:var(--surface-3);color:var(--ink-4);
}
.tstep .ts.ok .tn{background:var(--green);color:#fff}
.tstep .ts .tt{font-size:13px;font-weight:600}
.tstep .ts .td{font-size:12px;color:var(--ink-3);margin-top:3px;line-height:1.6}
.tstep .ts button{margin-left:auto;flex:0 0 auto;align-self:center}

/* 可选项（改善计划器）：整行可点，选中即高亮 */
.pick{display:grid;gap:8px}
.pick .pi{
  display:flex;align-items:flex-start;gap:11px;cursor:pointer;
  padding:11px 13px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);transition:border-color .12s,background .12s;
}
.pick .pi:hover{border-color:var(--brand-line)}
.pick .pi.on{background:var(--brand-bg);border-color:var(--brand-line)}
.pick .pi .pm{
  flex:0 0 auto;width:18px;height:18px;border-radius:var(--r-sm);
  border:1px solid var(--line);background:var(--surface);
  display:flex;align-items:center;justify-content:center;
  font-size:11px;color:#fff;margin-top:1px;
}
.pick .pi.on .pm{background:var(--brand);border-color:var(--brand)}
.pick .pi .pt{font-size:13px;font-weight:600;display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.pick .pi .pe{
  font-size:11px;font-weight:400;color:var(--brand-2);
  background:var(--brand-bg);padding:1px 6px;border-radius:999px;
}
.pick .pi.on .pe{background:var(--surface)}
.pick .pi .pe.live{color:var(--ink-3);background:var(--surface-3)}
.pick .pi .pd{font-size:12.5px;color:var(--ink-2);margin-top:4px;line-height:1.6}
.pick .pi .ps{font-size:11px;color:var(--ink-4);margin-top:4px}
.pdl-btn{
  margin-left:9px;color:var(--brand-2);cursor:pointer;
  border-bottom:1px dashed var(--brand-line);white-space:nowrap;
}
.pdl-btn:hover{color:var(--brand);border-bottom-color:var(--brand)}

/* ============ 明细清单（改善计划器 · 附录 A–D） ============
   接在选中的改善项下面，跨满整行；内容是给用户看的那一份，所以不做折叠嵌套。 */
.pdl{
  grid-column:1/-1;padding:14px 16px 4px;margin-bottom:8px;
  border:1px solid var(--brand-line);border-radius:var(--r-sm);
  background:var(--surface-3);
}
.pdl-top{display:flex;align-items:center;gap:10px;margin-bottom:11px}
.pdl-top b{font-size:13px}
.pdl-md{
  font-size:11px;color:var(--brand-2);background:var(--brand-bg);
  padding:1px 7px;border-radius:999px;
}
.pdl-g{margin-bottom:13px}
.pdl-t{font-size:12px;font-weight:600;color:var(--ink-2);margin-bottom:6px}
.pdl-r{display:flex;gap:10px;align-items:baseline;font-size:12.5px;line-height:1.75;padding:2px 0}
.pdl-k{flex:0 0 128px;color:var(--ink-4);font-size:12px}
.pdl-v{flex:1;min-width:0;color:var(--ink)}
.pdl-r.pdl-th{border-bottom:1px solid var(--line);padding-bottom:5px;margin-bottom:3px}
.pdl-r.pdl-th .pdl-k,.pdl-r.pdl-th .pdl-v{color:var(--ink-3);font-size:11.5px}
.pdl-i{
  flex:0 0 18px;align-self:flex-start;margin-top:3px;height:18px;border-radius:50%;
  background:var(--brand-bg);color:var(--brand-2);font-size:10.5px;
  display:flex;align-items:center;justify-content:center;
}
.pdl-n{
  font-size:12px;color:var(--ink-2);line-height:1.75;
  background:var(--surface);border-left:3px solid var(--brand-line);
  border-radius:0 var(--r-sm) var(--r-sm) 0;padding:8px 11px;
}
.pdecl{
  margin-top:11px;padding:11px 14px;border:1px solid var(--brand-line);
  border-radius:var(--r-sm);background:var(--brand-bg);
}
.pdecl-t{font-size:11.5px;font-weight:600;color:var(--brand-2);margin-bottom:6px}
.pdecl ol{margin:0;padding-left:18px;font-size:12.5px;line-height:1.8;color:var(--ink-2)}
.pl-note{font-size:11.5px;color:var(--ink-4)}

/* ============ 计划器 · 小类切换 ============
   小类只负责分组与切换查看 —— 点一个，下面只看它，改起来不用在长页面里找。 */
.pm-tabs{display:flex;gap:8px;flex-wrap:wrap}
.pm-tab{
  display:inline-flex;align-items:baseline;gap:8px;cursor:pointer;
  padding:7px 12px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);
}
.pm-tab:hover{border-color:var(--brand-line)}
.pm-tab.on{background:var(--brand-bg);border-color:var(--brand);box-shadow:inset 0 -2px 0 var(--brand)}
.pm-tab b{font-size:13px;font-weight:500;color:var(--ink)}
.pm-tab.on b{font-weight:600;color:var(--brand-2)}
.pm-tab i{font-style:normal;font-size:11.5px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.pm-tab.has i{color:var(--brand-2)}

/* ============ 计划器 · 要求卡片 ============
   定量要求与行为要求都做成卡片，一行三张 —— 整行通栏太宽，看不出来有几条。 */
.rqs{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:10px;align-items:start}
@media (max-width:1180px){.rqs{grid-template-columns:repeat(2,minmax(0,1fr))}}
.rq{
  display:flex;flex-direction:column;gap:6px;min-width:0;
  padding:10px 12px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);
}
.rq.on{background:var(--brand-bg);border-color:var(--brand-line)}
.rq-h{display:flex;align-items:center;gap:7px;min-width:0;cursor:pointer}
.rq-m{
  width:15px;height:15px;flex:0 0 auto;border-radius:3px;border:1px solid var(--line);
  background:var(--surface);color:#fff;font-size:10px;
  display:flex;align-items:center;justify-content:center;
}
.rq.on .rq-m{background:var(--brand);border-color:var(--brand)}
.rq-t{font-size:12.5px;font-weight:600;color:var(--ink);line-height:1.45}
.rq.on .rq-t{color:var(--brand-2)}
.rq-line{display:flex;gap:7px;align-items:flex-start;cursor:pointer}
.rq-line .rq-m{margin-top:7px}
.rq-line .rq-v{flex:1;min-width:0}
.rq .tier{transform:none;margin:0;flex:0 0 auto}
.rq-v{
  width:100%;font-family:var(--sans);font-size:12.5px;line-height:1.6;color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 8px;
  background:var(--surface);resize:none;overflow:hidden;
}
.rq-v:focus{outline:none;border-color:var(--brand)}
.rq-say{font-size:11.5px;color:var(--ink-3);line-height:1.6}
.rq-d{font-size:11.5px;color:var(--ink-4);line-height:1.6}
.rq-warn{font-size:11.5px;color:var(--amber);background:var(--amber-bg);padding:5px 8px;border-radius:3px;line-height:1.55}
.rq-f{display:flex;align-items:center;gap:8px;font-size:11px}
/* 强度是二选一，不是可勾可不勾：整张卡可点 */
.rq-one{cursor:pointer}
.rq-by{flex:0 0 auto;font-size:10.5px;padding:1px 6px;border-radius:3px;background:var(--surface-3);color:var(--ink-3)}
.rq.on .rq-by{background:var(--surface);color:var(--brand-2)}
.rq-rec{font-size:10.5px;padding:1px 5px;border-radius:3px;background:var(--brand-bg);color:var(--brand-2);margin-left:6px}
/* 强度区块里的小标题（比区块标题低一级）与「各运动到什么程度」表 */
.pm-sub{display:flex;align-items:baseline;gap:8px;margin:15px 0 7px;font-size:12.5px;color:var(--ink-2)}
.pm-subr{margin-left:auto;font-size:11.5px;color:var(--ink-4)}
.rq-tag{color:var(--amber);background:var(--amber-bg);padding:1px 6px;border-radius:3px}
.rq-rst{color:var(--ink-3);cursor:pointer;text-decoration:underline}
.rq-rst:hover{color:var(--ink)}

/* ============ 计划器 · 依据与安全边界（弹窗） ============ */
.pmodal{
  position:absolute;inset:0;z-index:5;padding:40px;
  background:rgba(23,26,32,.34);display:flex;align-items:center;justify-content:center;
}
.pmodal-b{
  width:min(760px,100%);max-height:100%;display:flex;flex-direction:column;
  background:var(--surface);border-radius:var(--r);box-shadow:0 16px 44px rgba(23,26,32,.26);overflow:hidden;
}
.pmodal-h{display:flex;align-items:center;gap:10px;padding:14px 20px;border-bottom:1px solid var(--line)}
.pmodal-h b{font-size:15px;font-weight:600}
.pmodal-h .grow{flex:1}
.pmodal-x{
  width:26px;height:26px;border-radius:var(--r-sm);border:1px solid var(--line);cursor:pointer;
  display:flex;align-items:center;justify-content:center;font-size:13px;color:var(--ink-3);
}
.pmodal-x:hover{border-color:var(--ink-4);color:var(--ink)}
.pmodal-body{flex:1;overflow-y:auto;padding:18px 20px}
.pmodal-f{
  display:flex;align-items:center;gap:10px;padding:12px 20px;font-size:12.5px;color:var(--ink-3);
  border-top:1px solid var(--line);background:var(--surface-2);
}
.pmodal-f .grow{flex:1}

/* ============ 改善计划器 · 左右式 ============
   左栏管「选哪几类、现在到几分」，右栏只管「这一类怎么配」。
   一屏只渲染一个类的方法清单，长度不再随选中类数增长。 */
.sheet-body > .planwrap{margin:-22px -24px -30px;height:calc(100% + 52px);display:flex;flex-direction:column;min-height:0}
.sheet-body > .planwrap .plan2{flex:1;display:flex;min-height:0}
.plan2 .pnav{
  width:278px;flex:0 0 auto;border-right:1px solid var(--line);
  background:var(--surface-2);overflow-y:auto;padding-bottom:14px;
}
.plan2 .pm{flex:1;min-width:0;overflow-y:auto;padding:18px 22px 28px}
.pnav-cap{
  display:flex;align-items:baseline;gap:8px;padding:13px 15px 8px;
  font-size:12px;font-weight:600;color:var(--ink-2);
}
.pnav-capr{margin-left:auto;font-size:11px;font-weight:400;color:var(--ink-4)}
.pnav-i{padding:10px 15px;border-top:1px solid var(--line);cursor:pointer}
.pnav-i:hover{background:var(--surface)}
.pnav-i.on{background:var(--brand-bg)}
.pnav-i.cur{box-shadow:inset 3px 0 0 var(--brand)}
.pnav-h{display:flex;align-items:center;gap:7px}
.pnav-m{
  width:15px;height:15px;flex:0 0 auto;border-radius:3px;border:1px solid var(--line);
  background:var(--surface);color:#fff;font-size:10px;
  display:flex;align-items:center;justify-content:center;
}
.pnav-i.on .pnav-m{background:var(--brand);border-color:var(--brand)}
.pnav-n{font-size:13px;font-weight:600}
.pnav-x{
  font-size:11px;line-height:1.5;padding:0 4px;border-radius:3px;
  color:var(--ink-4);flex:0 0 auto;
}
.pnav-x:hover{color:var(--red);background:var(--red-bg)}
.pnav-i:hover .pnav-m{border-color:var(--brand)}
.pnav-rec{font-size:10.5px;padding:1px 5px;border-radius:3px;background:var(--brand-bg);color:var(--brand-2)}
/* 「专项」标：这两类有数量上限（同时最多 1 个），底盘类不限 —— 让人一眼看出哪个受约束 */
.pnav-k{font-size:10.5px;padding:1px 5px;border-radius:3px;margin-left:5px;
  background:var(--amber-bg);color:var(--amber)}
/* 计划器里的「上一周期回顾」 */
.rev{margin:0 0 12px;padding:11px 13px;border:1px solid var(--line);border-radius:8px;background:var(--surface-2)}
.rev-t{font-size:12.5px;font-weight:600;color:var(--ink);margin-bottom:7px}
.rev-r{display:flex;align-items:baseline;gap:8px;font-size:12px;color:var(--ink-2);padding:3px 0}
.rev-r .rev-n{min-width:64px;color:var(--ink)}
.rev-r .rev-v{font-size:11px;padding:1px 6px;border-radius:3px;margin-left:auto;white-space:nowrap}
.rev-r .rev-v.ok{background:var(--green-bg);color:var(--green)}
.rev-r .rev-v.mid{background:var(--amber-bg);color:var(--amber)}
.rev-r .rev-v.bad{background:var(--red-bg);color:var(--red)}
.rev-r .rev-v.dim{background:var(--surface-3);color:var(--ink-3)}
.rev-a{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);
  font-size:11.5px;color:var(--ink-3);line-height:1.65}
.pnav-b{
  font-size:11.5px;color:var(--ink-3);margin-top:5px;line-height:1.6;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;
}
.pnav-f{display:flex;align-items:baseline;gap:8px;margin-top:6px}
.pnav-t{font-size:12px;font-weight:600;color:var(--brand-2)}
.pnav-c{font-size:11.5px;color:var(--ink-4)}
.pnav-c.miss{color:var(--amber)}
.pnav-tot{
  margin:6px 14px 0;padding:11px 12px;border:1px solid var(--line);
  border-radius:var(--r-sm);background:var(--surface);
}
.pnav-tot.over{border-color:var(--amber)}
.pnav-th{display:flex;align-items:baseline;gap:8px;font-size:13px}
.pnav-tb{font-size:11.5px;color:var(--ink-3);margin-top:6px;line-height:1.65}
.pnav-tw{font-size:11.5px;color:var(--amber);margin-top:6px;line-height:1.6}
.pnav-tot .btn{margin-top:9px}

.sheet-head .phead{display:flex;gap:20px;text-align:right}
.sheet-head .phead div{display:flex;flex-direction:column;gap:2px}
.sheet-head .phead span{font-size:11.5px;color:var(--ink-3)}
.sheet-head .phead b{font-size:16px;font-weight:600;font-variant-numeric:tabular-nums}
.sheet-head .phead b.ok{color:var(--brand-2)}
.sheet-head .phead b.mid{color:var(--amber)}

.pm-h{padding-bottom:13px;border-bottom:1px solid var(--line);margin-bottom:4px}
.pm-ht{display:flex;align-items:center;gap:8px}
.pm-ht h3{margin:0;font-size:16px;font-weight:600}
.pm-ht .grow{flex:1}
.pm-meta{font-size:12.5px;color:var(--ink-3);margin-top:7px;line-height:1.65}
.pm-meta b{color:var(--ink);font-weight:600}
.pm-off{
  font-size:12px;color:var(--amber);background:var(--amber-bg);
  padding:7px 10px;border-radius:var(--r-sm);margin-top:9px;
}
.pm-idle{
  margin-top:16px;padding:18px;border:1px dashed var(--line);
  border-radius:var(--r-sm);background:var(--surface-2);
}
.pm-idle-t{font-size:13px;color:var(--ink-2);line-height:1.7}
.pm-idle-b{font-size:12.5px;color:var(--ink-3);margin-top:7px;line-height:1.7}
.pm-sec{
  display:flex;align-items:baseline;gap:8px;margin:16px 0 8px;
  font-size:12.5px;font-weight:600;color:var(--ink);
}
.pm-secr{margin-left:auto;font-size:11.5px;font-weight:400;color:var(--ink-4)}
.pm-note{font-size:11.5px;color:var(--ink-4);margin-top:9px;line-height:1.65}

/* ============ 计划器 · 本清单的强度 ============
   材料只有一份「中等强度有氧运动清单」，没有分档清单。
   所以强度不改变清单内容，而是把「这份清单要在什么强度下做」写成一栏 —— 与上面的强度选择联动。 */
.pm-spec{
  margin-top:12px;padding:11px 14px;border-radius:var(--r-sm);
  background:var(--brand-bg);border:1px solid var(--brand-line);
}
.pm-spec-h{font-size:11.5px;color:var(--ink-3)}
.pm-spec-v{font-size:13px;color:var(--ink);margin-top:5px;line-height:1.65}
.pm-spec-v b{color:var(--brand-2)}
.pm-spec-f{font-size:11.5px;color:var(--ink-3);margin-top:5px}
.pm-spec-f b{color:var(--ink-2)}

.pm-scale{display:flex;gap:8px;flex-wrap:wrap}
.pm-sc{
  display:flex;flex-direction:column;gap:2px;min-width:110px;cursor:pointer;
  padding:8px 12px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);
}
.pm-sc:hover{border-color:var(--brand-line)}
.pm-sc.on{background:var(--brand-bg);border-color:var(--brand);box-shadow:inset 0 0 0 1px var(--brand)}
.pm-sc b{font-size:13.5px;font-weight:600}
.pm-sc.on b{color:var(--brand-2)}
.pm-sc i{font-style:normal;font-size:11.5px;color:var(--ink-3)}
.pm-sc u{text-decoration:none;font-size:11px;color:var(--ink-4);margin-top:2px}
.pm-sc.on u{color:var(--brand-2)}

.psum{
  border:1px solid var(--line);border-radius:var(--r-sm);
  padding:11px 13px;margin-bottom:10px;background:var(--surface);
}
.psum-h{display:flex;align-items:center;gap:9px}
.psum-n{
  width:20px;height:20px;flex:0 0 auto;border-radius:50%;background:var(--brand);
  color:#fff;font-size:11.5px;display:flex;align-items:center;justify-content:center;
}
.psum-h b{font-size:13.5px;font-weight:600}
.psum-t{font-size:12.5px;font-weight:600;color:var(--brand-2)}
.psum-h .grow{flex:1}
.psum-g{font-size:11.5px;font-weight:600;color:var(--amber)}
.psum-g.ok{color:var(--brand-2)}
.psum-b{font-size:12.5px;color:var(--ink-2);line-height:1.75;margin-top:8px}
.psum-w{font-size:12px;color:var(--amber);margin-top:7px;line-height:1.6}

.pdecl-do{display:flex;align-items:center;gap:12px;margin-top:9px}
/* 获取成本分层：家常易得 / 进阶 / 额外购买 */
.tier{
  flex:0 0 auto;font-size:10.5px;font-weight:600;padding:1px 7px;border-radius:999px;
  background:var(--surface-3);color:var(--ink-3);margin-right:7px;vertical-align:1px;
}
.tier-plus{background:var(--amber-bg);color:#8a6412}
.tier-buy{background:#f3ecfb;color:#6b46a8}
.pv-say{font-style:normal;color:var(--ink-2);margin-left:8px}
.pv-q{font-style:normal;color:var(--brand-2);margin-left:8px}
.pv-v.warn{color:var(--amber)}
/* 用户版正文：做法按分组列，一组一个标题 */
.pv-g{margin-top:9px}
.pv-gt{font-size:11.5px;color:var(--ink-4);margin-bottom:4px}
.pv-ul{margin:0;padding-left:15px;list-style:none}
.pv-ul li{position:relative;font-size:12.5px;line-height:1.85;color:var(--ink-2)}
.pv-ul li::before{content:'·';position:absolute;left:-11px;color:var(--ink-4)}

/* 用户版：去掉工具性标记之后的那一份 */
.pdoc{border:1px solid var(--line);border-radius:var(--r);background:var(--surface);padding:22px 26px}
.pdoc-h{font-size:17px;font-weight:600}
.pdoc-m{font-size:12px;color:var(--ink-3);margin-top:5px}
.pdoc-s{
  font-size:12.5px;color:var(--ink-2);line-height:1.8;margin-top:10px;
  padding-bottom:14px;border-bottom:1px solid var(--line-2);
}
.pv-item{padding:14px 0;border-bottom:1px solid var(--line-2)}
.pv-h{display:flex;align-items:center;gap:9px;font-size:14px;font-weight:600;margin-bottom:9px}
.pv-n{
  flex:0 0 20px;height:20px;border-radius:50%;background:var(--brand);color:#fff;
  font-size:11px;display:flex;align-items:center;justify-content:center;
}
.pv-r{display:flex;gap:10px;align-items:baseline;font-size:12.5px;line-height:1.8}
.pv-k{flex:0 0 66px;font-size:11.5px;color:var(--ink-4)}
.pv-v{flex:1;min-width:0;color:var(--ink-2)}
.pdoc-t{font-size:12.5px;font-weight:600;margin:16px 0 7px}
.pdot{margin:0;padding-left:19px;font-size:12.5px;line-height:1.85;color:var(--ink-2)}

/* 批量表（数据核对 / 周期 / 续费） */
.rt{width:100%;border-collapse:collapse;font-size:12.5px}
.rt th{
  text-align:left;font-weight:600;color:var(--ink-3);font-size:11.5px;
  padding:8px 10px;border-bottom:1px solid var(--line);white-space:nowrap;
}
.rt td{padding:10px;border-bottom:1px solid var(--line-2);vertical-align:middle}
.rt tr.warn td{background:var(--amber-bg)}
.rt tr.bad td{background:var(--red-bg)}
.rt .num{font-variant-numeric:tabular-nums}

/* 记一笔表单（人时计时器） */
.tform{display:flex;gap:10px;align-items:flex-end;flex-wrap:wrap}
.tform label{display:flex;flex-direction:column;gap:5px;font-size:11.5px;color:var(--ink-4)}
.tform label.grow{flex:1;min-width:180px}
.tform input,.tform select{
  font-family:var(--sans);font-size:12.5px;color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-sm);
  padding:6px 9px;background:var(--surface);
}
.tform input[type=number]{width:104px}

/* 工具表里的姓名与副标题 */
.rt .nm{font-weight:600}
.rt .sub{font-size:11px;color:var(--ink-4);margin-top:2px}

/* 话术卡 */
.qcard{
  border:1px solid var(--line);border-radius:var(--r-sm);
  padding:12px 14px;background:var(--surface);margin-bottom:10px;
}
.qcard .qh{font-size:13px;font-weight:600;margin-bottom:9px;display:flex;align-items:center;gap:9px}
.qrow{display:flex;gap:10px;align-items:baseline;font-size:12.5px;line-height:1.75}
.qrow .qk{flex:0 0 84px;font-size:11.5px;color:var(--ink-4)}
.qrow .qv{flex:1;min-width:0;color:var(--ink-2)}
.qrow .qv b{color:var(--ink)}
.qno{color:var(--red);text-decoration:line-through}
.qyes{color:var(--green)}

/* ============ 本周期改善目标 ============
   宽屏横向罗列：目标之间是并列关系，不是先后关系。
   未确认的用虚线框与执行中的区分开 —— 它还不是目标，只是推荐。 */
.goals{display:grid;gap:10px;grid-template-columns:repeat(auto-fit,minmax(290px,1fr))}
.goals.gap{margin-top:10px}
.goal{
  border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);padding:12px 14px;min-width:0;
}
.goal .gh{display:flex;align-items:center;gap:8px;margin-bottom:9px}
.goal .gn{font-size:14px;font-weight:600}
.goal .gt{
  font-size:10.5px;font-weight:600;padding:1px 7px;border-radius:999px;
  background:var(--brand-bg);color:var(--brand-2);
}
.goal .gt.stopped{background:var(--surface-3);color:var(--ink-3)}
.goal .gt.done{background:var(--green-bg);color:#0f6b3e}
.goal .grow{display:flex;gap:9px;align-items:baseline;font-size:12.5px;line-height:1.7}
.goal .gk{flex:0 0 42px;font-size:11.5px;color:var(--ink-4)}
.goal .gv{flex:1;min-width:0;color:var(--ink-2)}
.goal .gv.warn{color:var(--orange)}
.goal .gsep{height:1px;background:var(--line-2);margin:7px 0}
.goal .gbar{height:4px;border-radius:2px;background:var(--surface-3);margin:3px 0 7px 51px;overflow:hidden}
.goal .gbar i{display:block;height:100%;background:var(--brand);border-radius:2px}
.goal.pend{border-style:dashed;background:var(--surface-2)}
.goal .gfoot{
  display:flex;align-items:center;gap:10px;margin-top:10px;padding-top:10px;
  border-top:1px solid var(--line-2);font-size:11.5px;color:var(--ink-3);
}
.goal .gfoot button{margin-left:auto;flex:0 0 auto}

/* 清单一律是提示，不做勾选、不挂按钮 —— 右侧状态由系统记录算出来 */
.sop-list li.sop{display:flex;align-items:center;gap:9px}
.sop-list li.sop .sm{flex:0 0 auto;width:13px;text-align:center;color:var(--ink-4);line-height:1.6}
.sop-list .sop-t{flex:1;min-width:0;font-size:12.5px;line-height:1.6;color:var(--ink)}
/* 没有可查记录的：只说明口径，弱化一档 */
.sop-list li.sop.note-only .sop-t{color:var(--ink-3)}
/* 关联记录算出的状态 */
.sop-list .st{flex:0 0 auto;font-size:11.5px;white-space:nowrap;font-variant-numeric:tabular-nums}
.sop-list .st.ok{color:var(--green)}
.sop-list .st.todo{color:var(--amber)}
.sop-list .st.warn{color:var(--red)}
/* 回顾：当时的要求，纯陈述 */
.sop-list li.sop.rev .sm{color:var(--green)}
.sop-f{margin-top:10px;padding-top:10px;border-top:1px solid var(--line-2)}

/* 触达记录的内联补记表单 */
.touch-form{padding:2px 0 14px;border-bottom:1px solid var(--line-2)}
.touch-form .fr{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
.touch-form .mini{display:flex;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.touch-form .mini button{
  font-family:inherit;font-size:12px;padding:6px 11px;border:0;border-right:1px solid var(--line);
  background:var(--surface);color:var(--ink-3);
}
.touch-form .mini button:last-child{border-right:0}
.touch-form .mini button.on{background:var(--brand);color:#fff}
.touch-form select,.touch-form input{
  font-family:inherit;font-size:13px;padding:6px 10px;border:1px solid var(--line);
  border-radius:var(--r-sm);outline:none;background:var(--surface);color:var(--ink);
}
.touch-form input{flex:1;min-width:180px}
.touch-form input:focus,.touch-form select:focus{
  border-color:var(--brand);box-shadow:0 0 0 3px rgba(13,148,136,.12);
}

/* 记录列表 —— 标题栏已有下边框，这里不再加线，否则两条线会紧挨着 */
.log{border-top:0}
.log .li{display:flex;gap:12px;padding:11px 0;border-bottom:1px solid var(--line-2);font-size:12.5px}
.log .li:last-child{border-bottom:0}
.log .li .t{font-size:11.5px;color:var(--ink-4);white-space:nowrap;padding-top:2px;font-variant-numeric:tabular-nums;width:82px;flex:0 0 82px}
.log .li .c{flex:1;line-height:1.65;min-width:0}
.log .li .c b{font-weight:600}

/* 打卡日历 */
.cal-wrap{margin-top:18px}
.cal-label{font-size:11.5px;color:var(--ink-3);margin-bottom:9px}
.cal{display:grid;grid-template-columns:repeat(15,1fr);gap:4px}
.cal .d{
  aspect-ratio:1;border-radius:4px;background:var(--surface-3);color:var(--ink-4);
  display:flex;align-items:center;justify-content:center;font-size:10px;font-weight:500;
}
.cal .d.full{background:var(--green-bg);color:var(--green)}
.cal .d.part{background:var(--amber-bg);color:var(--amber)}
.cal .d.miss{background:var(--red-bg);color:var(--red)}
/* 受限期（居民自己点的应酬/出差…）：用中性的灰蓝，不用红 ——
   这天不是失败，是那天他不在自己手里。红色会把它读成"又漏了"。 */
.cal .d.off{background:#eef1f5;color:var(--ink-2);box-shadow:inset 0 0 0 1.5px #d8dee7}
/* 计划器"上一周期做得怎么样"里那一段受限期说明 —— 它解释的是
   "为什么这个天数是这样的"，所以比建议弱一档，但仍然要看得见。 */
.rev-off{margin-top:8px;padding-top:8px;border-top:1px dashed var(--line);
  font-size:12.5px;line-height:1.7;color:var(--ink-2)}
.cal .d.today{outline:2px solid var(--brand);outline-offset:1px}

/* 空态 */
.empty{padding:36px 16px;text-align:center;color:var(--ink-4);font-size:12.5px}

/* 提示块 */
.note{
  border-radius:var(--r-sm);background:var(--surface-3);
  padding:11px 14px;font-size:12.5px;color:var(--ink-2);line-height:1.7;
  border-left:3px solid var(--ink-4);
}
.note.warn{background:var(--red-bg);border-left-color:var(--red);color:#8f2f28}
.note.ok{background:var(--brand-bg);border-left-color:var(--brand);color:#0a6b62}
.note b{color:var(--ink);font-weight:600}

/* 工具卡 */
.tools{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:14px}
.tool{
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:15px 16px;box-shadow:var(--sh);transition:border-color .12s,box-shadow .12s;
}
.tool:hover{border-color:var(--brand-line);box-shadow:0 2px 10px rgba(23,26,32,.07)}
.tool .th{display:flex;align-items:center;gap:9px;margin-bottom:8px}
.tool .n{
  font-size:11px;font-weight:600;color:var(--brand-2);background:var(--brand-bg);
  padding:2px 7px;border-radius:5px;font-variant-numeric:tabular-nums;
}
.tool .nm{font-size:13.5px;font-weight:600}
.tool .wh{font-size:11.5px;color:var(--ink-4);margin-left:auto}
.tool p{margin:0;font-size:12.5px;color:var(--ink-3);line-height:1.65}

/* KPI 行 */
.kpirow{
  display:flex;align-items:center;gap:14px;padding:13px 16px;
  border-bottom:1px solid var(--line-2);
}
.kpirow:last-child{border-bottom:0}
.kpirow .k{flex:1;font-size:13px;min-width:0}
.kpirow .v{font-size:19px;font-weight:600;font-variant-numeric:tabular-nums;letter-spacing:-.01em}
.kpirow .v small{font-size:11.5px;font-weight:400;color:var(--ink-4);margin-left:2px}
.kpirow .note-x{width:190px;font-size:11.5px;color:var(--ink-3);text-align:right}

/* ================= 提示条 ================= */
.toast{
  position:fixed;left:50%;bottom:32px;transform:translate(-50%,12px);
  background:var(--ink);color:#f5f7fa;font-size:13px;line-height:1.6;
  padding:11px 18px;border-radius:var(--r);box-shadow:0 8px 28px rgba(23,26,32,.26);
  opacity:0;pointer-events:none;transition:opacity .18s,transform .18s;
  z-index:200;max-width:620px;
}
.toast.on{opacity:1;transform:translate(-50%,0)}
.toast b{color:#7ee0d3;font-weight:600}
/* 需要人真的去做点什么的提示（"请刷新页面后重做这一步"）——
   深红底，和普通回执区分开。它比普通提示多停几秒（见 app.js 的 toast()），
   一行字里带着一个动作，得给人读完的时间。 */
.toast.warn{background:#8a2f27}
.toast.warn b{color:#ffd9a8}

/* ================= 响应式 ================= */
@media (max-width:1080px){
  .shell{grid-template-columns:1fr}
  .side{
    position:static;min-height:0;border-right:0;border-bottom:1px solid var(--line);
    display:flex;gap:6px;overflow-x:auto;padding:8px 12px;
  }
  .side .grp{display:none}
  .nav{white-space:nowrap;margin-bottom:0}
  .task{grid-template-columns:54px minmax(0,1fr);gap:10px 14px}
  .task .due,.task .act{grid-column:2;text-align:left;justify-content:flex-start}
}

/* ================= 全屏面板（访谈录入 / 报告生成） ================= */
/* 工具面板的遮罩：点外面能关。找不到出口会让人觉得卡死 */
.smask{
  position:fixed;inset:0;background:rgba(23,26,32,.34);z-index:105;
  opacity:0;pointer-events:none;transition:opacity .18s;
}
.smask.on{opacity:1;pointer-events:auto}
.sheet{
  position:fixed;inset:22px;z-index:110;background:var(--surface);
  border-radius:var(--r);box-shadow:0 18px 60px rgba(23,26,32,.28);
  display:flex;flex-direction:column;overflow:hidden;
  opacity:0;transform:translateY(10px) scale(.995);pointer-events:none;
  transition:opacity .18s,transform .18s;
}
.sheet.on{opacity:1;transform:none;pointer-events:auto}
.sheet-head{
  display:flex;align-items:center;gap:16px;padding:15px 22px;
  border-bottom:1px solid var(--line);flex:0 0 auto;
}
.sheet-head h2{margin:0 0 3px;font-size:17px;font-weight:600}
.sheet-head .meta{font-size:12.5px;color:var(--ink-3)}
.sheet-head .grow{flex:1}
.sheet-head .pct{font-size:20px;font-weight:600;font-variant-numeric:tabular-nums}
.sheet-head .close{
  width:30px;height:30px;border-radius:var(--r-sm);border:1px solid var(--line);
  background:var(--surface);color:var(--ink-3);font-size:15px;line-height:1;
  display:flex;align-items:center;justify-content:center;
}
.sheet-head .close:hover{border-color:var(--ink-4);color:var(--ink)}
/* 工具面板的内容要留边距；访谈录入是自带的两栏贴边布局，用负边距抵消 */
.sheet-body{flex:1;overflow-y:auto;min-height:0;padding:22px 24px 30px}
.sheet-body > .iv{margin:-22px -24px -30px;height:calc(100% + 52px)}
.sheet-foot{
  display:flex;align-items:center;gap:10px;padding:13px 22px;
  border-top:1px solid var(--line);background:var(--surface-2);flex:0 0 auto;
  font-size:12.5px;color:var(--ink-3);
}
.sheet-foot .grow{flex:1}
.btn[disabled]{opacity:.45;cursor:not-allowed}

/* ---------- 访谈录入 ---------- */
.iv{display:grid;grid-template-columns:218px minmax(0,1fr);height:100%}
.iv-nav{border-right:1px solid var(--line);background:var(--surface-2);padding:14px 10px;overflow-y:auto}
.iv-nav .it{
  display:flex;align-items:center;gap:9px;padding:9px 10px;border-radius:var(--r-sm);
  font-size:13px;color:var(--ink-2);cursor:pointer;margin-bottom:2px;
}
.iv-nav .it:hover{background:var(--surface-3)}
.iv-nav .it.on{background:var(--brand-bg);color:var(--brand-2);font-weight:600}
.iv-nav .it .no{
  width:20px;height:20px;border-radius:5px;background:var(--surface-3);color:var(--ink-4);
  display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;flex:0 0 20px;
}
.iv-nav .it.done .no{background:#e9efec;color:#5c8371}
.iv-nav .it.on .no{background:var(--brand);color:#fff}
.iv-nav .it .dotm{margin-left:auto;font-size:11px;color:var(--red);white-space:nowrap}

.iv-main{padding:20px 26px 40px;overflow-y:auto}
.iv-main h3{margin:0 0 4px;font-size:15px;font-weight:600}
.iv-main .ihint{font-size:12.5px;color:var(--ink-3);margin-bottom:22px}

.fld{margin-bottom:19px;max-width:580px}
.fld > label{display:block;font-size:12.5px;color:var(--ink-2);margin-bottom:7px}
.fld > label .req{color:var(--red);margin-left:4px}
.fld input[type=text],.fld select{
  width:100%;font-family:inherit;font-size:13.5px;color:var(--ink);
  padding:8px 11px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);outline:none;
}
.fld input[type=text]:focus,.fld select:focus{
  border-color:var(--brand);box-shadow:0 0 0 3px rgba(13,148,136,.12);
}
.fld .unit{font-size:12px;color:var(--ink-4);margin-left:8px;white-space:nowrap}
/* 日期与数字输入框以前没被 .fld 的样式覆盖 —— 认领 / 激活面板里的
   开始日期、服务天数渲染成裸的原生控件，和旁边的文本输入框不是一个样子。 */
.fld input[type=date],.fld input[type=number]{
  font-family:inherit;font-size:13.5px;color:var(--ink);
  padding:8px 11px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);outline:none;
}
.fld input[type=date]{width:100%;max-width:220px}
.fld input[type=date]:focus,.fld input[type=number]:focus{border-color:var(--brand-line);box-shadow:0 0 0 3px var(--brand-bg)}
/* 服务周期：天数 + 快捷预设（14 / 21 / 30 天）一行放完 */
.dayrow{display:flex;align-items:center;gap:8px;max-width:420px}
.dayrow input[type=number]{width:84px}
.dayrow .dayu{font-size:12px;color:var(--ink-4)}
.fld .row{display:flex;align-items:center}
.multi{display:flex;flex-wrap:wrap;gap:7px}
.multi .m{
  font-size:12.5px;padding:6px 12px;border-radius:999px;border:1px solid var(--line);
  background:var(--surface);color:var(--ink-2);cursor:pointer;user-select:none;
}
.multi .m:hover{border-color:var(--brand-line)}
.multi .m.on{background:var(--brand);border-color:var(--brand);color:#fff}
/* 自填项：虚线边 + 后面挂两个小操作（改名 / 删掉）。
   为什么要显式标出来：这些词是**全局词表**（一个人加了，别人也能选），
   所以"删掉"改的是大家的选项，不是只改自己这一份 —— 得让人看出来它不是系统预置的。 */
.multi .m.cu{border-style:dashed;padding-right:6px;display:inline-flex;align-items:center;gap:2px}
.multi .m.cu i{
  font-style:normal;font-size:10.5px;line-height:1;padding:2px 3px;border-radius:5px;
  color:var(--ink-4);opacity:.75;
}
.multi .m.cu i:hover{background:rgba(0,0,0,.06);opacity:1}
.multi .m.cu.on i{color:rgba(255,255,255,.78)}
.multi .m.cu.on i:hover{background:rgba(255,255,255,.18);color:#fff}
/* 已选、但已不在选项表里的值（自填项被删掉、或选项文字改过）——
   必须显示出来，否则健管师看不到自己选过什么，也没法取消。 */
.multi .m.old{border-style:dotted;color:var(--ink-3)}
.multi .m.old.on{color:#fff}

/* ---------- 报告生成 ---------- */
.rpt{padding:22px 26px 44px}
.steps{display:flex;align-items:center;margin-bottom:26px}
.steps .s{display:flex;align-items:center;gap:8px;font-size:12.5px;color:var(--ink-4);white-space:nowrap}
.steps .s .n{
  width:22px;height:22px;border-radius:50%;border:1.5px solid var(--line);
  display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:600;
}
.steps .s.cur{color:var(--brand-2);font-weight:600}
.steps .s.cur .n{border-color:var(--brand);background:var(--brand);color:#fff}
.steps .s.done{color:var(--ink-2)}
.steps .s.done .n{border-color:var(--green);background:var(--green);color:#fff}
.steps .bar{flex:1;height:1px;background:var(--line);margin:0 14px}

.typegrid{display:grid;grid-template-columns:repeat(3,1fr);gap:12px;max-width:880px}
.typegrid .t{border:1px solid var(--line);border-radius:var(--r);padding:14px 15px;cursor:pointer}
.typegrid .t:hover{border-color:var(--brand-line)}
.typegrid .t.on{border-color:var(--brand);background:var(--brand-bg)}
.typegrid .t.off{opacity:.42;cursor:not-allowed}
.typegrid .t .tn{font-size:13.5px;font-weight:600;margin-bottom:5px}
.typegrid .t .tw{font-size:11.5px;color:var(--ink-4)}
.typegrid .t .tl{font-size:12px;color:var(--ink-3);margin-top:8px;line-height:1.6}

.chk{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;max-width:720px}
.chk .r{
  display:flex;align-items:center;gap:12px;padding:11px 15px;
  border-bottom:1px solid var(--line-2);font-size:13px;
}
.chk .r:last-child{border-bottom:0}
.chk .r .k{width:104px;color:var(--ink-2)}
.chk .r .need{width:132px;color:var(--ink-4);font-size:12px}
.chk .r .got{flex:1;font-variant-numeric:tabular-nums}
.chk .r.ok .got{color:var(--green);font-weight:600}
.chk .r.bad{background:var(--red-bg)}
.chk .r.bad .got{color:var(--red);font-weight:600}
/* 「提醒」这一类：照常摆出来（该说的要说），但不计入"能不能生成"的结论 */
.chk .r .k .soft{
  margin-left:6px;font-style:normal;font-size:10px;color:var(--ink-3);
  background:var(--surface-3);border-radius:999px;padding:1px 6px;
}

.paperwrap{display:grid;grid-template-columns:minmax(0,440px) minmax(0,1fr);gap:24px;align-items:start}
.paper{
  width:100%;background:#fff;border:1px solid var(--line);
  border-radius:2px;box-shadow:0 6px 20px rgba(23,26,32,.09);padding:22px 24px;
}
.paper .pt{font-size:15px;font-weight:600;margin-bottom:3px}
.paper .ps{
  font-size:11.5px;color:var(--ink-4);padding-bottom:10px;
  border-bottom:1px solid var(--line);margin-bottom:6px;
}
.paper .pseg{padding:9px 0;border-bottom:1px dashed var(--line-2)}
.paper .pseg:last-child{border-bottom:0}
.paper .pseg .h{display:flex;gap:8px;align-items:baseline;margin-bottom:4px}
.paper .pseg .h .no{
  font-size:10.5px;color:var(--brand-2);background:var(--brand-bg);
  padding:1px 6px;border-radius:4px;font-weight:600;
}
.paper .pseg .h .t{font-size:12.5px;font-weight:600}
.paper .pseg .d{font-size:11.5px;color:var(--ink-3);line-height:1.65}
.papertip{font-size:12.5px;color:var(--ink-3);line-height:1.8}
.papertip b{color:var(--ink-2)}

@media print{.side,.topbar{display:none}}

/* ============================================================
   下一步动作卡 —— 详情页第一屏最醒目的一块
   直接取任务引擎输出，与首页待办是同一个任务，不重复定义
   ============================================================ */
.nextact{
  border:1px solid var(--line);border-radius:var(--r);
  background:var(--surface);padding:15px 18px 13px;margin-bottom:20px;
}
.nextact.red{background:var(--red-bg);border-color:rgba(224,72,63,.34)}
.nextact.amber{background:var(--amber-bg);border-color:rgba(201,148,26,.34)}
.nextact.calm{background:var(--brand-bg);border-color:var(--brand-line)}
.nextact.none{background:var(--surface-2);border-style:dashed}
.na-h{display:flex;align-items:center;gap:9px;margin-bottom:9px}
.na-k{font-size:10.5px;font-weight:600;letter-spacing:.16em;color:var(--ink-4)}
.nextact.red .na-k{color:var(--red)}
.nextact.amber .na-k{color:#9a6f0f}
.nextact.calm .na-k{color:var(--brand-2)}
.na-lv{
  font-size:11px;font-weight:600;padding:1px 8px;border-radius:999px;
  background:var(--surface);color:var(--ink-2);border:1px solid var(--line);
}
.nextact.red .na-lv{color:var(--red);border-color:rgba(224,72,63,.30)}
.nextact.amber .na-lv{color:#9a6f0f;border-color:rgba(201,148,26,.34)}
.na-due{font-size:11.5px;font-weight:600;color:var(--ink-3)}
.nextact.red .na-due{color:var(--red)}
.na-t{font-size:15.5px;font-weight:600;color:var(--ink);line-height:1.5}
.na-d{font-size:12.5px;color:var(--ink-2);line-height:1.7;margin-top:5px}
.na-f{display:flex;align-items:center;gap:8px;margin-top:13px;padding-top:12px;border-top:1px solid rgba(23,26,32,.07)}
.na-src{font-size:11.5px;color:var(--ink-4)}

/* ============================================================
   异常与预警 —— 横向罗列，宽屏并排
   有未处置的，才配红色；编辑中的卡片跨满整行，避免表单被挤
   ============================================================ */
.alrt-list{
  display:grid;gap:8px;align-items:stretch;
  grid-template-columns:repeat(auto-fill,minmax(330px,1fr));
}
.alrt-list .alrt-sum{grid-column:1/-1;margin-bottom:5px}
.alrt.editing{grid-column:1/-1}
.alrt-sum{display:flex;gap:16px;font-size:11.5px;color:var(--ink-3);margin-bottom:13px}
.alrt-sum b{color:var(--ink);font-weight:600}
.alrt{
  display:flex;gap:12px;align-items:flex-start;
  padding:12px 14px;border-radius:var(--r-sm);
  border:1px solid var(--line);background:var(--surface-2);
}
.alrt.red{background:var(--red-bg);border-color:rgba(224,72,63,.30)}
.alrt.amber{background:var(--amber-bg);border-color:rgba(201,148,26,.30)}
.alrt.closed{background:transparent;border-color:var(--line-2)}
.alrt .lv{flex:0 0 auto}
.alrt .bd{flex:1;min-width:0}
.alrt .v1{font-size:13px;font-weight:600}
.alrt .v1 span{font-weight:400;color:var(--ink-3);font-size:11.5px;margin-left:7px}
.alrt .v2{font-size:12px;color:var(--ink-2);line-height:1.65;margin-top:4px}
.alrt .v3{font-size:11.5px;color:var(--ink-4);margin-top:5px;font-variant-numeric:tabular-nums}
.alrt .op{flex:0 0 auto;align-self:flex-end}

/* ============================================================
   处置登记表单 —— 留痕填完才允许闭环
   ============================================================ */
.af{
  margin-top:12px;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:13px 14px;
}
.af-h{font-size:11px;font-weight:600;letter-spacing:.12em;color:var(--ink-4);margin-bottom:11px}
.af-r{display:grid;grid-template-columns:88px minmax(0,1fr);gap:10px;align-items:start;margin-bottom:9px}
.af-r label{font-size:12.5px;color:var(--ink-2);padding-top:6px}
.af-r label i{font-style:normal;font-size:10.5px;color:var(--red);margin-left:4px}
.af-r input,.af-r select,.af-r textarea{
  width:100%;font-family:inherit;font-size:12.5px;color:var(--ink);
  border:1px solid var(--line);border-radius:var(--r-sm);
  padding:6px 9px;background:var(--surface);
}
.af-r textarea{min-height:54px;line-height:1.65;resize:vertical}
.af-r input:focus,.af-r select:focus,.af-r textarea:focus{
  outline:none;border-color:var(--brand-line);box-shadow:0 0 0 2px var(--brand-bg);
}
.af-f{display:flex;align-items:center;gap:8px;margin-top:11px;padding-top:11px;border-top:1px solid var(--line-2)}
.af-warn{font-size:11.5px;color:var(--ink-4)}

/* 已闭环：按留痕字段逐条列出 */
.rf{display:grid;grid-template-columns:76px minmax(0,1fr);gap:8px;font-size:12px;line-height:1.65;margin-top:6px}
.rf label{color:var(--ink-4)}
.rf span{color:var(--ink-2)}

/* ============================================================
   测量明细
   ============================================================ */
.vt-bar{
  display:flex;align-items:center;gap:10px;
  margin-top:18px;padding-top:14px;border-top:1px solid var(--line-2);
}
.vt-t{font-size:12.5px;font-weight:600;flex:none}
/* ⚠️ 标题栏是**一行不换行**的 flex，中间那段说明最长，必须允许它被压缩
   （min-width:0 + 省略号）—— 否则它会把左边文字和右边按钮一起挤成两行。
   2026-09-21 业务方截图里"时间范围"竖排成"时间范 / 围"就是这个成因：
   没有 min-width:0 时 flex 子项按内容宽度撑，谁都不肯让，最后只能换行。 */
.vt-m{font-size:11.5px;color:var(--ink-4);min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.vt-wrap{margin-top:11px;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
table.vt{width:100%;border-collapse:collapse;font-size:12px}
table.vt th{
  text-align:left;font-weight:600;font-size:11.5px;color:var(--ink-3);
  background:var(--surface-3);padding:7px 11px;border-bottom:1px solid var(--line);
}
table.vt td{padding:7px 11px;border-bottom:1px solid var(--line-2)}
table.vt tbody tr:last-child td{border-bottom:0}
table.vt tr.red td{background:var(--red-bg)}
table.vt tr.yellow td{background:var(--amber-bg)}
table.vt td.num{font-variant-numeric:tabular-nums}

.muted{color:var(--ink-4)}

/* 窄屏：抽屉占满，标签条可横向滚 */
@media (max-width:760px){
  .sheet{inset:0;border-radius:0}
  .sheet-body{padding:18px 16px 24px}
  .sheet-body > .iv{margin:-18px -16px -24px;height:calc(100% + 42px)}
  .drawer{width:100vw}
  .drawer .dh,.drawer .dtabs,.drawer .db,.drawer .df{padding-left:16px;padding-right:16px}
  .drawer .dtabs{overflow-x:auto;scrollbar-width:none}
  .drawer .dtabs::-webkit-scrollbar{display:none}
}

/* ============================================================
   认领反馈
   ============================================================ */
/* 待办已完成：不给按钮，直接写清凭什么算完成 */
.task .act .tres{
  font-size:11.5px;color:var(--ink-3);text-align:right;line-height:1.5;
  max-width:150px;margin-left:auto;
}
.task.done{background:var(--surface-2)}
.task.done .nm,.task.done .what{color:var(--ink-3)}

.pool .row.mine{cursor:pointer}
.pool .row.mine:hover{background:var(--surface-3)}
.pool-sub{
  font-size:11px;font-weight:600;color:var(--ink-4);letter-spacing:.06em;
  padding:10px 16px 4px;border-top:1px solid var(--line-2);
}

/* 抽屉头部：承接人 */
.drawer .dh .meta.owner{margin-top:8px}
.drawer .dh .own-on{color:var(--ink-2)}
.drawer .dh .own-off{color:var(--amber)}
.drawer .dh .meta.owner .btn{margin-left:4px}

/* ============================================================
   目标编辑
   ============================================================ */
.gf{display:grid;gap:14px;max-width:640px}
.gf .fld label{display:block;font-size:11.5px;color:var(--ink-3);margin-bottom:6px}
.gf .fld input,.gf .fld select{
  width:100%;padding:8px 11px;font-size:13px;
  border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);color:var(--ink);
}
.gf .fld input:focus,.gf .fld select:focus{outline:none;border-color:var(--brand-line);background:var(--surface)}

.goal .gh .rev{font-size:11px;color:var(--ink-4)}
.goal .gh .btn{margin-left:2px}
.log .li .c .from{color:var(--ink-3);text-decoration:line-through}

/* ============================================================
   打卡看板：按用户聚类
   ============================================================ */
.cbstats{
  display:grid;grid-template-columns:auto auto auto minmax(0,1fr);
  gap:0;align-items:center;
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r);
  padding:14px 18px;margin-bottom:14px;
}
.cbstats > div{display:flex;align-items:baseline;gap:6px;padding-right:26px;margin-right:26px;border-right:1px solid var(--line-2)}
.cbstats > div:last-child{border-right:0;margin-right:0;padding-right:0}
.cbstats .k{font-size:12px;color:var(--ink-3)}
.cbstats b{font-size:19px;font-variant-numeric:tabular-nums}
.cbstats b.ok{color:var(--green)}
.cbstats b.bad{color:var(--red)}
.cbstats small{font-size:11px;color:var(--ink-4)}
.cbstats .cbs-note{display:block;font-size:11.5px;color:var(--ink-4);line-height:1.7;text-align:right}
.cbstats .cbs-note b{font-size:11.5px;color:var(--ink-2)}

.cbgrid{display:grid;gap:14px;grid-template-columns:repeat(auto-fill,minmax(380px,1fr));margin-bottom:6px}
.cbx{background:var(--surface);border:1px solid var(--line);border-radius:var(--r);overflow:hidden}
.cbh{
  display:flex;align-items:center;gap:12px;cursor:pointer;
  padding:12px 16px;background:var(--surface-2);border-bottom:1px solid var(--line-2);
}
.cbh:hover{background:var(--surface-3)}
.cbn{font-size:14px;font-weight:600}
.cbm{font-size:11.5px;color:var(--ink-4);margin-top:3px}
.cbc{
  font-size:12px;font-weight:600;color:var(--amber);
  background:var(--amber-bg);padding:3px 9px;border-radius:999px;white-space:nowrap;
}
.cbc.ok{color:var(--green);background:var(--green-bg)}
.cbc.none{color:var(--red);background:var(--red-bg)}

.cbrows{padding:4px 0}
.cbr{
  display:grid;grid-template-columns:minmax(0,1fr) auto;align-items:center;
  gap:4px 12px;padding:10px 16px;border-bottom:1px solid var(--line-2);
}
.cbr:last-child{border-bottom:0}
.cbr-t{display:flex;align-items:baseline;gap:8px;min-width:0}
.cbr-n{font-size:13px;font-weight:600;white-space:nowrap}
.cbr-g{font-size:11px;color:var(--ink-4)}
.cbr-cap{
  font-size:10.5px;padding:1px 6px;border-radius:3px;white-space:nowrap;
  background:var(--surface-3);color:var(--ink-3);
}
.cbr-cap.auto{background:var(--brand-bg);color:var(--brand-2)}
.cbr-cap.mix{background:var(--amber-bg);color:var(--amber)}
.cbr-7{display:flex;align-items:center;gap:3px;grid-row:2}
.cbr-7 i{
  width:12px;height:12px;border-radius:3px;background:var(--surface-3);
  border:1px solid var(--line);
}
.cbr-7 i.on{background:var(--green);border-color:var(--green)}
.cbr-7 i.miss{background:var(--red-bg);border-color:rgba(224,72,63,.42)}
.cbr-7n{font-size:11px;color:var(--ink-4);margin-left:6px;white-space:nowrap}
.cbr-s{display:flex;align-items:center;gap:7px;grid-row:2;justify-content:flex-end}
.cbr-at{font-size:11px;color:var(--ink-4)}
.cbr-a{grid-row:2;grid-column:2}
.cbr-a:empty{display:none}
/* 「具体做了」：用户端勾了哪几个动作（v064 起记录里带 did） */
.cbr-did{
  font-size:10.5px;color:var(--brand-2);background:var(--brand-bg);
  border-radius:999px;padding:1px 7px;white-space:nowrap;overflow:hidden;
  text-overflow:ellipsis;max-width:220px;
}
/* 记录表的时间范围切换（近 7 天 / 全部） */
.cbs-scope{display:flex;gap:0;margin-left:10px}
.mini{
  font-family:inherit;font-size:11.5px;padding:3px 9px;border:1px solid var(--line);
  background:var(--surface);color:var(--ink-3);cursor:pointer;margin-right:-1px;
}
.mini:first-child{border-radius:var(--r-sm) 0 0 var(--r-sm)}
.mini:last-child{border-radius:0 var(--r-sm) var(--r-sm) 0}
.mini.on{background:var(--brand-bg);border-color:var(--brand-line);color:var(--brand-2);font-weight:600;z-index:1}

/* ============================================================
   任务日历（详情页「任务日历」页签）
   ============================================================ */
.cstats{display:flex;flex-wrap:wrap;gap:18px;font-size:12.5px;color:var(--ink-2)}
.cstats b{font-size:15px;font-variant-numeric:tabular-nums}
.cstats b.ok{color:var(--green)}
.cstats b.wa{color:var(--amber)}
.cstats b.bad{color:var(--red)}
.cstats .muted{color:var(--ink-4);font-size:11.5px}
.calhead{display:flex;align-items:center;gap:12px;margin-bottom:12px}
.calhead b{font-size:14px;font-variant-numeric:tabular-nums}
.cal-leg{display:flex;align-items:center;gap:5px;font-size:11px;color:var(--ink-4)}
.cal-leg i{display:inline-block;width:11px;height:11px;border-radius:3px;margin-left:9px;border:1px solid var(--line)}
.cal-leg i.full{background:var(--green-bg);border-color:var(--green)}
.cal-leg i.part{background:var(--amber-bg);border-color:var(--amber)}
.cal-leg i.miss{background:var(--red-bg);border-color:var(--red)}
.cal-leg i.rest{background:repeating-linear-gradient(45deg,var(--surface-3),var(--surface-3) 2px,transparent 2px,transparent 4px)}
.cal-leg i.future{background:var(--surface-2)}
.cal-leg i.pre{background:var(--surface-2);border-style:dashed}
.calgrid{display:grid;grid-template-columns:repeat(7,minmax(0,1fr));gap:5px;max-width:560px}
.calgrid .cw{font-size:11px;color:var(--ink-4);text-align:center;padding-bottom:4px}
.calgrid .cc{
  position:relative;min-height:46px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);padding:5px 6px;cursor:pointer;font-size:11.5px;color:var(--ink-2);
}
.calgrid .cc:hover{border-color:var(--brand-line);background:var(--brand-bg)}
.calgrid .cc.off-empty{border:0;background:transparent;cursor:default}
.calgrid .cc .cn{font-variant-numeric:tabular-nums;color:var(--ink-3)}
.calgrid .cc .cq{position:absolute;right:6px;top:5px;font-size:10.5px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.calgrid .cc .cd{position:absolute;left:6px;bottom:5px;width:6px;height:6px;border-radius:50%;background:var(--brand-line)}
.calgrid .cc.full{background:var(--green-bg);border-color:var(--green)}
.calgrid .cc.full .cq{color:var(--green);font-weight:600}
.calgrid .cc.part{background:var(--amber-bg);border-color:var(--amber)}
.calgrid .cc.part .cq{color:var(--amber);font-weight:600}
.calgrid .cc.miss{background:var(--red-bg);border-color:var(--red)}
.calgrid .cc.miss .cq{color:var(--red);font-weight:600}
.calgrid .cc.rest{background:repeating-linear-gradient(45deg,var(--surface-3),var(--surface-3) 3px,transparent 3px,transparent 6px)}
.calgrid .cc.future{background:var(--surface-2);color:var(--ink-4)}
/* 周期还没开始的日子：虚线边 + 淡底，与「未到」区分开（未到是有任务的将来，
   未开始是那时候还没有任务）—— 两者都不该被读成"漏" */
.calgrid .cc.pre{background:var(--surface-2);border-style:dashed;color:var(--ink-4)}
.calgrid .cc.out{opacity:.42}
.calgrid .cc.today{outline:2px solid var(--brand);outline-offset:1px}
.calgrid .cc.sel{box-shadow:0 0 0 2px var(--brand-2) inset}
/* 当天排的内容（来自逐日排期） */
.daypicks{margin:0 0 12px}
.dph{font-size:11.5px;color:var(--ink-4);margin-bottom:6px}
.dpi{
  display:flex;align-items:baseline;gap:9px;padding:7px 10px;background:var(--surface-2);
  border:1px solid var(--line);border-radius:var(--r-sm);font-size:12.5px;margin-bottom:5px;max-width:720px;
}
.dpi.main{border-color:var(--brand-line);background:var(--brand-bg)}
.dpg{flex:0 0 auto;font-size:11px;color:var(--ink-3)}
.dpt{flex:1;min-width:0;color:var(--ink)}
.dpr{flex:0 0 auto;font-size:11.5px;color:var(--ink-3)}
table.vt.daytk{margin-top:4px;max-width:820px}
table.vt.daytk .sub{display:block;font-size:11px;color:var(--ink-4);margin-top:2px}

/* ============================================================
   报告查看
   ============================================================ */
.rv-meta{
  display:grid;grid-template-columns:repeat(auto-fit,minmax(120px,1fr));
  gap:1px;background:var(--line-2);border:1px solid var(--line);
  border-radius:var(--r-sm);overflow:hidden;margin-bottom:18px;
}
.rv-meta > div{background:var(--surface);padding:11px 14px}
.rv-meta .k{display:block;font-size:11px;color:var(--ink-4);margin-bottom:4px}
.rv-meta b{font-size:13px;font-weight:600;font-variant-numeric:tabular-nums}

@media (max-width:1500px){
  .cbgrid{grid-template-columns:repeat(auto-fill,minmax(330px,1fr))}
}
@media (max-width:1180px){
  .cbstats{grid-template-columns:1fr 1fr;gap:14px}
  .cbstats > div{border-right:0;margin-right:0;padding-right:0}
  .cbstats .cbs-note{text-align:left;grid-column:1 / -1}
  .cbgrid{grid-template-columns:1fr}
}

/* ================= 登录页 ================= */
.loginwrap{display:none;min-height:100vh;align-items:center;justify-content:center;background:var(--bg)}
.lcard{width:354px;background:var(--surface);border:1px solid var(--line);border-radius:12px;
  padding:30px 30px 24px;box-shadow:0 12px 40px rgba(23,26,32,.07)}
.lbrand{display:flex;align-items:center;gap:9px}
.lbrand .mark{width:26px;height:26px;border-radius:7px;background:var(--brand);color:#fff;
  display:flex;align-items:center;justify-content:center;font-size:13.5px;font-weight:600}
.lname{font-size:16px;font-weight:600;letter-spacing:.01em}
.lsub{font-size:12px;color:var(--ink-3);margin:6px 0 24px 35px}
.lfld{display:block;margin-bottom:14px}
.lfld span{display:block;font-size:12px;color:var(--ink-3);margin-bottom:5px}
.lfld input{width:100%;padding:9px 11px;border:1px solid var(--line);border-radius:var(--r-sm);
  font-size:13.5px;font-family:inherit;background:var(--surface);color:var(--ink)}
.lfld input:focus{outline:none;border-color:var(--brand-line)}
.lbtn{width:100%;margin-top:8px;padding:10px;font-size:14px}
.lmsg{margin:0 0 10px;font-size:12.5px;color:var(--red);line-height:1.6}
.lnote{margin-top:16px;font-size:11.5px;color:var(--ink-4);text-align:center;line-height:1.6}

/* 顶栏里的登录账号与退出（与「当前承接人」并列，别混为一谈） */
/* 右上角身份（v084）：名字 + "我是谁、管多少人"。
   以前这里是「当前承接人 <名字>」—— 那是把**登录身份**当成了**归属**，
   多健管师之后必须分开说：管理员登录进来不承接任何用户，
   顶着"当前承接人"就是假话。改成两行之后，身份和管辖范围一眼可辨。 */
.topbar .me-who{display:flex;flex-direction:column;align-items:flex-end;line-height:1.28}
.topbar .me-who b{font-size:13px;font-weight:600;color:var(--ink)}
.topbar .me-who i{font-style:normal;font-size:11px;color:var(--ink-3);margin-top:1px}
.topbar .acct{color:var(--ink-3)}
.topbar .acct a{color:var(--ink-2)}
.topbar .acct a:hover{color:var(--brand)}
.topbar .lout{font-size:12px;color:var(--ink-4);margin-left:10px}
.topbar .lout:hover{color:var(--red)}

/* ================= 断联横幅 ================= */
#banner{display:none}
#banner.on{display:flex;align-items:center;gap:18px;flex-wrap:wrap;
  background:var(--red-bg);border-bottom:1px solid rgba(224,72,63,.28);
  color:#8c2f28;font-size:12.5px;padding:9px 20px;position:sticky;top:0;z-index:150}
#banner .bd b{font-weight:600}
#banner a{margin-left:auto;color:#8c2f28;text-decoration:underline;white-space:nowrap}

/* ================= 系统管理 ================= */
#main > .card + .card{margin-top:16px}
.connrow{display:grid;grid-template-columns:104px 1fr;gap:9px 16px;font-size:13px;margin-bottom:15px}
.connrow .ck{color:var(--ink-3);font-size:12px}
.dim{color:var(--ink-4);font-size:11.5px}
.err{margin:0 0 12px;padding:8px 11px;background:var(--red-bg);color:#8c2f28;
  border-radius:var(--r-sm);font-size:12.5px}
.opsline{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin-bottom:11px}
.opsline .code{width:134px;padding:8px 11px;border:1px solid var(--line);border-radius:var(--r-sm);
  font-size:13.5px;font-family:inherit;letter-spacing:.18em;background:var(--surface);color:var(--ink)}
.opsline .code:focus{outline:none;border-color:var(--brand-line)}
.hrow{display:flex;align-items:center;gap:10px;padding:13px 16px;border-bottom:1px solid var(--line-2);font-size:13px}
.hrow .nm{font-weight:600}
.hrow .mt{font-size:11.5px;color:var(--ink-3)}
.hrow .grow{flex:1}
.hmsg{padding:0 16px 13px;font-size:11.5px;color:#8c2f28}
.frm{display:flex;gap:12px;align-items:flex-end;flex-wrap:wrap}
.frm label{display:flex;flex-direction:column;gap:5px}
.frm label span{font-size:11.5px;color:var(--ink-3)}
.frm input{padding:8px 11px;border:1px solid var(--line);border-radius:var(--r-sm);
  font-size:13px;font-family:inherit;min-width:134px;background:var(--surface);color:var(--ink)}
.frm input:focus{outline:none;border-color:var(--brand-line)}

/* ================= 数据层加载遮罩 ================= */
.loadwrap{display:none;position:fixed;inset:0;z-index:400;background:var(--bg);
  flex-direction:column;align-items:center;justify-content:center;gap:16px}
.loadwrap.on{display:flex}
.loadwrap .lspin{width:26px;height:26px;border:2px solid var(--line);border-top-color:var(--brand);
  border-radius:50%;animation:lspin .8s linear infinite}
@keyframes lspin{to{transform:rotate(360deg)}}
.loadwrap .ltxt{font-size:12.5px;color:var(--ink-3);letter-spacing:.02em}

/* 数据来源标记：顶栏一行小字。演示数据必须一眼看得出来，不能像真台账 */
.topbar .dm{font-size:11.5px;margin-left:9px;padding:2px 7px;border-radius:20px;
  border:1px solid var(--line);color:var(--ink-3)}
.topbar .dm.ok{color:#3f6b52;border-color:rgba(63,107,82,.3);background:rgba(63,107,82,.06)}
.topbar .dm.warn{color:#8c5a1f;border-color:rgba(176,124,45,.35);background:rgba(176,124,45,.08)}

/* ================= 档案：用药多行 / 自填项 / 生活化剂量 ================= */
.fld .fhint{font-size:11.5px;color:var(--ink-4);margin-top:6px;line-height:1.65}
.drugs{display:grid;gap:8px;max-width:760px}
.drugrow{display:grid;grid-template-columns:1.1fr .85fr 1.5fr auto;gap:8px;align-items:center}
.drugrow input,.drugrow select{
  font-family:inherit;font-size:13px;color:var(--ink);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;width:100%}
.drugrow input:focus,.drugrow select:focus{outline:none;border-color:var(--brand-line)}
.drugrow select.miss{border-color:var(--amber);color:var(--amber)}
/* 药名与剂量在左、时间与频次占主位 —— 提醒排程读的就是最后那一列 */
.druglist{display:grid;gap:8px}
.druglist .dg{display:flex;align-items:baseline;gap:12px;padding:9px 12px;
  background:var(--surface-2);border-radius:var(--r-sm);border-left:3px solid var(--brand-line)}
.druglist .dg .dn{font-size:13px;font-weight:600}
.druglist .dg .dw{margin-left:auto;font-size:12.5px;color:var(--ink-2)}
.druglist .dg .dw.miss{color:var(--amber)}

/* 打卡日历：休息日（斜纹底，一眼可分 —— 休息日不是漏打卡） */
.cal .d.rest{background:repeating-linear-gradient(45deg,var(--surface-3),var(--surface-3) 3px,transparent 3px,transparent 6px);
  color:var(--ink-4);font-weight:400}

/* 计划器：打卡周期 */
.cyc{display:flex;gap:16px;flex-wrap:wrap;align-items:flex-end;margin-top:12px}
.cyc-f{display:flex;flex-direction:column;gap:6px}
.cyc-f > label{font-size:11.5px;color:var(--ink-3)}
.cyc-f input{font-family:inherit;font-size:13px;color:var(--ink);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:7px 9px}
.cyc-f input:focus{outline:none;border-color:var(--brand-line)}
.cyc-u{font-size:12px;color:var(--ink-4)}

/* ================= 设备数据：分类图表 + 图/表切换 ================= */
.dev{display:grid;gap:14px}
.devcard{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);overflow:hidden}
.devh{display:flex;align-items:center;gap:12px;padding:11px 14px;border-bottom:1px solid var(--line-2)}
.devh .dt{font-size:13px;font-weight:600}
.devh .du{font-size:11.5px;color:var(--ink-4)}
.devh .dm2{font-size:11.5px;color:var(--ink-3);margin-left:6px}
.devtabs{margin-left:auto;display:flex;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.devtabs button{font-family:inherit;font-size:12px;padding:4px 11px;border:0;background:transparent;
  color:var(--ink-3);cursor:pointer;border-right:1px solid var(--line)}
.devtabs button:last-child{border-right:0}
.devtabs button.on{background:var(--brand);color:#fff}
.devbody{padding:12px 14px 14px}
.devchart{width:100%;display:block}
.devlegend{display:flex;gap:16px;flex-wrap:wrap;font-size:11.5px;color:var(--ink-3);margin-top:8px}
.devlegend i{display:inline-block;width:9px;height:9px;border-radius:2px;margin-right:5px;vertical-align:-1px}
.devtable{max-height:260px;overflow:auto}
/* 数据表的时段口径说明：全天 / 晨测 / 晚测 是三套口径，不写清就会"数字对不上" */
.devtable-n{font-size:11.5px;color:var(--ink-3);line-height:1.7;margin-bottom:7px;
  padding:7px 9px;background:var(--surface-2);border-radius:var(--r-sm)}
/* 预警触发日：从预警详情跳过来的人就是来核对这一天的，必须一眼看到 */
.devtable tr.devmark td{background:var(--red-bg,#fdf1f0);font-weight:600}
/* 设备数据：单元格内部禁折行（v084c）
   ------------------------------------------------------------
   业务方报"有文字换行的情况"。设备表上最明显：
     · 表头「全天 mmHg」在窄列里折成两行；
     · 数值「145 / 102」从斜杠处断开；
     · 页签「汇总数据表 3」也被折过。
   一格数据被拆成两行之后纵向对齐就乱了，而这张表本来就是拿来**逐行对账**的。
   ⚠️ 只禁"单元格内部"折行，不禁整表横滚 —— 真放不下时应该横向滚动，
      而不是把一格拆成两行。
   ⚠️ 说明文字（.devtable-n）**保持可折行**：那是一段话，不是数据。
   ⚠️ 规则放这里而不是改上面那条：同权重下后定义的赢，改原条容易漏掉别处的引用。 */
table.vt th{white-space:nowrap}
table.vt td.num{white-space:nowrap}
.devtabs button{white-space:nowrap}
.devlegend span{white-space:nowrap}

/* 原始记录表（v084c）
   与「汇总数据表」共用 table.vt，但要在视觉上能分开 ——
   字号小半号、表头浅一点，读的人一眼知道这是"原始明细"而不是"算出来的结果"。 */
table.vt.rw td{font-size:11.5px;padding:5px 11px}
table.vt.rw th{font-size:11px}
/* 预警触发日的行标（原来就在这一块，别丢） */
.devtable tr.devmark td:first-child{position:relative}
.devtable-n a{color:var(--brand-2);text-decoration:underline}
/* 图例里的「推荐区间」用浅色带（不是圆点也不是实心块）—— 它表示一个范围，不是一个值 */
.devlegend .lg-band i{background:rgba(13,148,136,.18);border:1px solid rgba(13,148,136,.45)}
/* 原始记录表里的「零星小睡」行淡显：它不参与趋势图，别和主睡眠读成一回事 */
table.vt.rw tr.nap td{color:var(--ink-4)}
.devmark-t{display:inline-block;margin-left:6px;font-size:10.5px;font-weight:400;
  color:var(--red,#c0392b);background:#fff;border:1px solid var(--red,#c0392b);
  border-radius:999px;padding:0 6px;vertical-align:1px}
.devfoot{display:flex;align-items:center;gap:14px;flex-wrap:wrap;font-size:11.5px;color:var(--ink-3);
  padding:9px 14px;border-top:1px solid var(--line-2);background:var(--surface-2)}

/* 结论型 / 事件型卡片（2026-09-21）：ECG / 心律检出 / 呼吸暂停分级 / 情绪 / 单次运动。
   它们没有图，只有一张**按天归纳**的表 —— 所以不套三页签，用虚线把两类分开，
   免得读的人以为下面这几张"少了趋势图"。 */
/* 「这位用户没有数据的项」—— 底部说明的补充块（2026-09-21 业务方要求）。
   单独一块浅底：上面那段 note 讲的是"怎么看这个页面"，这一块讲的是**这个人的数据情况**，
   看的人常常就是冲它来的（"我的血糖数据呢"）。混在一段灰字里会被跳过。 */
.devlack{margin-top:11px;padding:10px 12px;border-radius:var(--r-sm);
  background:var(--surface-2);border:1px solid var(--line-2);
  font-size:11.5px;color:var(--ink-2);line-height:1.8}
.devsec{font-size:11.5px;color:var(--ink-3);line-height:1.7;margin:16px 0 8px;
  padding-top:13px;border-top:1px dashed var(--line)}
.devh .evflag{font-size:11px;color:var(--amber,#c9941a);background:var(--amber-bg,#fdf7e8);
  border-radius:4px;padding:1px 7px;margin-left:6px}
/* 「看着不像正常」的那一天：底色标出来，但不加粗整行 —— 加粗会把一个
   "可能是正常说法"的提示读成结论。 */
.devtable tr.evbad td{background:var(--amber-bg,#fdf7e8)}
.evn{color:var(--ink-4);font-size:10.5px}
.dvu{color:var(--ink-4);font-weight:400}

/* ============================================================
   取数过渡态
   ------------------------------------------------------------
   已登录刷新时，后端把 200+ 人的台账 + 测量明细取回来要几秒。
   这期间铺一层底：既不是白屏，也绝不能先画 data.js 里的演示台账
   （那会让人以为"系统里就这些人"，也是"前端缓存了静态数据"这个疑问的来源）。
   文案由 app.js 的 setLoading(msg) 控制，取完自动关。
   ============================================================ */
.loading{display:none;position:fixed;inset:0;z-index:9000;background:var(--bg);
  align-items:center;justify-content:center}
.loading.on{display:flex}
.loading .lbox{display:flex;align-items:center;gap:10px;font-size:13px;color:var(--ink-3);
  background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);
  padding:13px 20px;box-shadow:0 2px 10px rgba(23,26,32,.05)}
.loading .spin{width:13px;height:13px;border:2px solid var(--brand-line);
  border-top-color:var(--brand);border-radius:50%;display:inline-block;
  animation:lspin .8s linear infinite}
@keyframes lspin{to{transform:rotate(360deg)}}

/* ============================================================
   N1 完成条件清单（绑定指导）
   ------------------------------------------------------------
   N1 的完成要两条：发过授权二维码（人工动作）+ 收到数据回传（设备自动）。
   以前只在页脚写了一句话、还只说对了一半，健管师看到"数据回传中"
   就以为绑好了 —— 于是"有数据了怎么还在绑定指导"成了必然的困惑。
   把两条并列摆出来，哪条没完成一眼就看得见。
   ============================================================ */
.conds{display:grid;gap:8px}
.cond{
  display:flex;align-items:flex-start;gap:11px;
  padding:11px 13px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);
}
.cond.ok{background:var(--green-bg);border-color:rgba(24,160,92,.24)}
.cond.no{border-color:rgba(214,158,46,.32);background:#fdf9ee}
.cond .ck{
  flex:0 0 auto;width:20px;height:20px;border-radius:50%;
  display:flex;align-items:center;justify-content:center;
  font-size:11px;font-weight:600;background:var(--surface-3);color:var(--ink-4);
}
.cond.ok .ck{background:var(--green);color:#fff}
.cond.no .ck{background:#d69e2e;color:#fff}
.cond .ct{font-size:13px;font-weight:600}
.cond .cd{font-size:12px;color:var(--ink-3);margin-top:3px;line-height:1.6}

/* ============================================================
   健康档案 · 用药记录 / 疾病史 / 平台档案
   ------------------------------------------------------------
   用药行从"一行四格"改成"两行六格"（多出状态与起止时间），
   所以这里覆盖掉上面那条 .drugrow 的 grid 定义；行与行之间给卡片边界，
   一眼分清哪几格属于同一种药 —— 七列铺在一行里，改错药的风险很高。
   ============================================================ */
.drugs{display:grid;gap:10px;max-width:760px}
.drugrow{display:block;grid-template-columns:none;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);padding:10px 11px}
.drugrow.off{background:#fdf9ee;border-color:rgba(214,158,46,.32)}
.drugrow .dr1{display:grid;grid-template-columns:1.1fr .85fr 1.5fr;gap:8px;align-items:center}
.drugrow .dr2{display:flex;flex-wrap:wrap;gap:8px;align-items:center;margin-top:8px}
.drugrow input,.drugrow select{
  font-family:inherit;font-size:13px;color:var(--ink);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;width:100%}
.drugrow input:focus,.drugrow select:focus{outline:none;border-color:var(--brand-line)}
.drugrow select.miss{border-color:var(--amber);color:var(--amber)}
.drugrow .dr2 select.st{flex:0 0 104px;width:auto;color:var(--brand-2);border-color:var(--brand-line)}
.drugrow .dr2 select.st.off{color:#8a6a1f;border-color:rgba(214,158,46,.5);background:#fffdf7}
.drugrow .dr2 input[type=date]{flex:0 0 152px;width:auto;font-size:12.5px;color:var(--ink-2)}
.drugrow .dr2 input[placeholder^="为什么"]{flex:1 1 170px;width:auto}
.drugrow .dr2 .btn{margin-left:auto}

/* 疾病史：一行三格（病名 / 确诊时间 / 备注），后两格允许留空 */
.rows{display:grid;gap:8px;max-width:760px}
.disrow{display:grid;grid-template-columns:1.05fr 1.15fr 1.3fr auto;gap:8px;align-items:center}
.disrow input{
  font-family:inherit;font-size:13px;color:var(--ink);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:8px 10px;width:100%}
.disrow input:focus{outline:none;border-color:var(--brand-line)}

/* 字段下面那条「平台已有：xxx」—— 讲的是"平台已经问过了"，比普通提示要显眼一点 */
.fld .fplat{font-size:11.5px;color:var(--brand-2);margin-top:6px;line-height:1.6}
.fld .fnote{font-size:11.5px;color:var(--ink-2);margin-top:6px;line-height:1.6}

/* 平台档案只读块（基本情况板块末尾） */
.platform{margin-top:26px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);max-width:580px;overflow:hidden}
.platform .pt-t{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding:11px 13px 9px;border-bottom:1px solid var(--line);
  font-size:12.5px;font-weight:600;color:var(--ink-2)}
.platform .pt-t span{font-size:11.5px;font-weight:400;color:var(--ink-4)}
.platform table{width:100%;border-collapse:collapse;font-size:12.5px}
.platform td{padding:7px 13px;border-bottom:1px solid var(--line-2);vertical-align:top}
.platform tr:last-child td{border-bottom:0}
.platform td:first-child{width:106px;color:var(--ink-3);white-space:nowrap}
.platform td:last-child{color:var(--ink);word-break:break-word}

/* ============================================================
   健康档案 · 病历 / 就医 / 饮食方式 / 设备数据
   ------------------------------------------------------------
   通用行表（.vrows）给病历的手术史、住院史与就医的就诊记录共用：
   列由字段定义里的 cols 给，换行由 lines 给 —— 一种"事实"一行，
   不同事实的字段不一样，但不该为每一种再写一个渲染器。
   每行有独立的卡片边界：一次就诊有七八格，挤成一片一定会填错格。
   ============================================================ */
.vrows{display:grid;gap:10px;max-width:820px}
.vrow{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-2);padding:11px 12px}
.vr-line{display:grid;gap:8px;margin-bottom:8px}
.vr-line:last-of-type{margin-bottom:0}
.vr-c{display:flex;flex-direction:column;gap:4px;min-width:0}
.vr-l{font-size:11px;color:var(--ink-4);letter-spacing:.02em}
.vrow input,.vrow select{
  font-family:inherit;font-size:13px;color:var(--ink);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:7px 9px;width:100%}
.vrow input:focus,.vrow select:focus{outline:none;border-color:var(--brand-line)}
.vrow input[type=date]{font-size:12.5px;color:var(--ink-2)}
.vr-act{display:flex;justify-content:flex-end;margin-top:8px}
.vdrug{display:flex;gap:6px;align-items:center}
.vdrug input{flex:1}
.vdrug .btn{flex:0 0 auto;white-space:nowrap}
.vnone{display:block;padding:7px 0;color:var(--ink-4);font-size:12.5px}

/* 板块内的分组小标题（饮食方式按行动库小类分组） */
.fgroup{
  margin:26px 0 14px;padding-bottom:7px;border-bottom:1px solid var(--line-2);
  font-size:12px;font-weight:600;color:var(--brand-2);letter-spacing:.03em;
  max-width:580px;
}
.fgroup:first-child{margin-top:4px}

/* ============================================================
   「高血压管理用不到」的调研项（`hyOff`）—— 置灰 + 沉到板块最后
   ------------------------------------------------------------
   判断标准是"会不会改变风险分层 / 干预建议 / 安全处置"，三问全否才算。
   不是删除：真有特殊情况仍可填，只是不再占注意力、也不再卡完成度。
   置灰的分隔标题写在 app.js 的 fieldsHTML 里（数量从 DB.hyOffOf 取）。
   ============================================================ */
.fld.hyoff{opacity:.5}
.fld.hyoff:hover,.fld.hyoff:focus-within{opacity:.88}
.fld.hyoff > label{color:var(--ink-3);font-weight:400}
.fgroup.hyoff{
  margin-top:30px;padding-bottom:7px;border-bottom:1px dashed var(--line);
  font-weight:400;color:var(--ink-4);letter-spacing:0;
}
/* 侧栏上标出"这个板块有几项可以跳过"。
   `.dotm`（要留意，如必问清单还差 N 条）在前、`.dotn`（中性备注）在后：
   只有前者时它占 auto 推到最右，两者都在时前者推到最右、后者跟在后面 6px
   —— 所以 `.dotn` 不能也写 auto。
   ⚠️ 2026-09-18 起必填已取消：`.dotm` 不再用于"必填未填"，只剩必问清单的"还差 N 条"。 */
.iv-nav .it .dotn{margin-left:auto;font-size:10.5px;color:var(--ink-4);white-space:nowrap}
.iv-nav .it .dotm + .dotn{margin-left:6px}

/* 就医板块顶部的只读小结 */
.vsum{
  display:flex;flex-wrap:wrap;gap:26px;align-items:flex-start;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-2);
  padding:13px 16px;margin-bottom:22px;max-width:820px;
}
.vsum .vs-k{font-size:11.5px;color:var(--ink-3);margin-bottom:4px}
.vsum .vs-v{font-size:13px;color:var(--ink);line-height:1.55}
.vsum .vs-warn{
  flex:1 1 100%;margin-top:4px;padding-top:10px;border-top:1px solid var(--line-2);
  font-size:12.5px;color:var(--amber);line-height:1.6;
}

/* 设备数据（只读块） */
.devboard{display:grid;gap:16px;max-width:680px}
.devboard .db-sect{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-2);overflow:hidden}
.devboard .db-t{
  display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;
  padding:11px 14px 9px;border-bottom:1px solid var(--line-2);
  font-size:12.5px;font-weight:600;color:var(--ink-2)}
.devboard .db-t span{font-size:11.5px;font-weight:400;color:var(--ink-4)}
.devboard .db-t .btn{margin-left:auto}
.devboard table{width:100%;border-collapse:collapse;font-size:12.5px}
.devboard td{padding:7px 14px;border-bottom:1px solid var(--line-2);vertical-align:top;color:var(--ink)}
.devboard tr:last-child td{border-bottom:0}
.devboard table:not(.dev-t) td:first-child{width:112px;color:var(--ink-3);white-space:nowrap}
.devboard .dev-t th{
  padding:7px 14px;text-align:left;font-size:11.5px;font-weight:600;color:var(--ink-3);
  background:var(--surface-3);border-bottom:1px solid var(--line-2)}
.devboard .dev-t td{color:var(--ink-2)}
.devboard .dev-t td:first-child{color:var(--ink);white-space:nowrap}
.devboard .db-u{font-size:11px;color:var(--ink-4);margin-left:5px}
.devboard .db-empty{padding:13px 14px;font-size:12.5px;color:var(--ink-3);line-height:1.7}
.devboard .db-empty.warn{color:#8f2f28;background:var(--red-bg)}
.devboard .db-note{padding:10px 14px;font-size:11.5px;color:var(--ink-3);line-height:1.7;border-top:1px solid var(--line-2)}
.devboard .db-off{display:flex;flex-wrap:wrap;gap:6px;padding:12px 14px 4px}
.devboard .db-off span{
  font-size:11.5px;color:var(--ink-3);background:var(--surface);
  border:1px solid var(--line);border-radius:999px;padding:3px 10px}

/* 平台病史记录原始清单 */
.platform .pt-rec{padding:4px 13px 12px}
.platform .pr{display:flex;gap:10px;align-items:baseline;padding:6px 0;border-bottom:1px solid var(--line-2)}
.platform .pr:last-child{border-bottom:0}
.platform .pr-l{flex:0 0 78px;font-size:11.5px;color:var(--brand-2)}
.platform .pr-t{flex:1;font-size:12.5px;color:var(--ink);word-break:break-word;line-height:1.6}
.platform .pr-d{flex:0 0 auto;font-size:11.5px;color:var(--ink-4)}

/* 开始用药日期来自平台记录时用虚线标出来 —— 它是"记录上填的日期"，
   不保证就是开始服药那天。核对过（人手改过）标记就消失。 */
.drugrow .dr2 input.fromplat{border-style:dashed;border-color:var(--brand-line);color:var(--brand-2)}

/* ============================================================
   档案 · 填写引导 / 管理方向 / 字段的"为什么问"
   ------------------------------------------------------------
   引导默认收起：熟手不需要每次看，新人（或换个方向管病）不至于无从下手。
   ============================================================ */
.ivg{margin:0 0 20px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface-2);max-width:820px;overflow:hidden}
.ivg-h{display:flex;align-items:baseline;gap:10px;padding:9px 13px;cursor:pointer}
.ivg-h:hover{background:var(--surface-3)}
.ivg-t{font-size:12.5px;font-weight:600;color:var(--ink-2)}
.ivg-n{font-size:11.5px;color:var(--brand-2);margin-left:auto}
.ivg-b{padding:2px 13px 12px;border-top:1px solid var(--line-2)}
.ivg-l{margin:10px 0 0 18px;padding:0}
.ivg-l li{font-size:12.5px;color:var(--ink-2);line-height:1.75;margin-bottom:5px}
.ivg-tip{margin-top:10px;padding:8px 11px;border-left:2px solid var(--brand-line);
  background:var(--brand-bg);border-radius:0 var(--r-sm) var(--r-sm) 0;
  font-size:12.5px;color:#0a6b62;line-height:1.7}

.fld .fwhy{font-size:11.5px;color:var(--brand-2);margin-top:6px;line-height:1.6}

/* 导航最下面的管理方向 */
.iv-focus{margin-top:auto;padding:14px 12px 4px;border-top:1px solid var(--line-2)}
.iv-focus .if-t{font-size:11px;color:var(--ink-4);letter-spacing:.04em;margin-bottom:7px}
.iv-focus .if-l{display:flex;flex-wrap:wrap;gap:5px}
.iv-focus .if-on{font-size:11.5px;color:#fff;background:var(--brand);
  border-radius:999px;padding:2px 9px}
.iv-focus .if-off{font-size:11.5px;color:var(--ink-4);border:1px dashed var(--line);
  border-radius:999px;padding:2px 9px}

/* 医嘱里的目标范围：两个输入 + 短横线 */
.vrange{display:flex;align-items:center;gap:5px}
.vrange input{width:100%;min-width:0;text-align:center}
.vrange .vr-dash{color:var(--ink-4);flex:0 0 auto}
.vrange .vr-u{font-size:11px;color:var(--ink-4);flex:0 0 auto}
.vlinked{display:block;padding:7px 0;font-size:12.5px;color:var(--brand-2)}

/* ============================================================
   手动录入测量（血压 / 血脂）
   ------------------------------------------------------------
   与「设备数据」并排同权：这一块不是补充说明，是另一条数据来路。
   所以它有独立卡片边界，不塞在设备卡片里面当脚注。
   ============================================================ */
.mblock{border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-2);overflow:hidden}
.mblock .mb-h{display:flex;align-items:center;gap:9px;flex-wrap:wrap;padding:11px 14px 9px}
.mblock .mb-t{font-size:12.5px;font-weight:600;color:var(--ink-2)}
.mblock .mb-n{font-size:11.5px;color:var(--ink-4)}
.mblock .mb-foot{padding:10px 14px;border-top:1px solid var(--line-2);
  font-size:11.5px;color:var(--ink-3);line-height:1.7}
.mblock .mb-foot b{color:var(--ink-2);font-weight:600}

.mform{border-top:1px solid var(--line-2);background:var(--surface);padding:12px 14px}
.mform .mf-h{font-size:12.5px;font-weight:600;color:var(--ink-2);margin-bottom:10px}
.mform .mf-h span{font-weight:400;font-size:11.5px;color:var(--ink-4);margin-left:8px}
.mform .mf-l{display:grid;grid-template-columns:repeat(auto-fit,minmax(112px,1fr));gap:8px}
.mform .vr-c{display:flex;flex-direction:column;gap:4px;min-width:0}
.mform .vr-l{font-size:11px;color:var(--ink-4)}
.mform input{font-family:inherit;font-size:13px;color:var(--ink);background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);padding:7px 9px;width:100%}
.mform input:focus{outline:none;border-color:var(--brand-line)}
.mform .mf-e{margin-top:9px;font-size:12px;color:var(--red)}
.mform .mf-a{display:flex;align-items:center;gap:8px;margin-top:11px}
.mform .mf-n{font-size:11.5px;color:var(--ink-4)}

.mlist{border-top:1px solid var(--line-2);padding:4px 14px 8px}
.mlist .ml-k{display:flex;align-items:baseline;gap:8px;font-size:11.5px;color:var(--ink-3);
  padding:9px 0 5px}
.mlist .ml-k span{font-size:11px;color:var(--ink-4)}
.mlist .mrow{display:flex;align-items:center;gap:10px;padding:5px 0;
  border-bottom:1px solid var(--line-2)}
.mlist .mrow:last-child{border-bottom:0}
.mlist .mr-d{flex:0 0 78px;font-size:12px;color:var(--ink-3);
  font-variant-numeric:tabular-nums}
.mlist .mr-v{flex:1;font-size:12.5px;color:var(--ink);word-break:break-word}
.mlist .mr-b{flex:0 0 auto;display:flex;gap:5px}

/* ============================================================
   预警台 · 弹窗 · 设备数据增强（v041）
   ------------------------------------------------------------
   新增三类东西：
     ① 预警台的"按人聚合"清单（一行一人，而不是一行一条预警）；
     ② 预警详情弹窗（依据 / 建议 / 动作三块，一眼到底）；
     ③ 设备数据的两个增强：时间窗筛选、图表悬停明细、睡眠分期图。
   颜色一律取 --red / --amber / --green / --brand 那几个语义变量，
   不新造色值 —— 同一个"黄警"在两处必须是同一个黄。
   ============================================================ */

/* ---------- 标签：疾病（紫） / 行为（青） ----------
   为什么不用红黄绿：这两层**不参与红黄绿分级**。给它们一个红黄绿色，
   界面就在说谎 —— 紫与青是"另一类信息"，不是"另一个严重度"。 */
.tag.violet{background:#f3eefd;color:#6b3fc4}
.tag.teal{background:#e6f4f4;color:#0b7a70}

/* ---------- 预警台：筛选条 ---------- */
.albar{display:flex;flex-wrap:wrap;gap:0;padding:9px 14px;border-bottom:1px solid var(--line-2);
  background:var(--surface-2)}
.albar button{font-family:inherit;font-size:12.5px;padding:5px 12px;border:1px solid var(--line);
  background:var(--surface);color:var(--ink-2);cursor:pointer;margin-right:-1px;border-radius:0}
.albar button:first-child{border-radius:var(--r-sm) 0 0 var(--r-sm)}
.albar button:last-child{border-radius:0 var(--r-sm) var(--r-sm) 0;margin-right:0}
.albar button:hover{color:var(--ink)}
.albar button.on{background:var(--brand);border-color:var(--brand);color:#fff;position:relative;z-index:1}
.albar button b{font-weight:600;font-variant-numeric:tabular-nums;opacity:.85}

/* ---------- 手动录入：症状勾选 ----------
   血压域判级要读它（超目标 + 伴症状 → 紧急回溯；低血压伴头晕 → 升一级），
   所以它不是一个"备注"，是判级输入：视觉上要跟数值字段区分开，且不能是可留空的输入框。 */
.mf-sym{margin:0 0 12px;padding:11px 13px;background:var(--surface-2);border-radius:var(--r-sm)}
.mf-sym .vr-l{display:block;font-size:12px;color:var(--ink-2);margin-bottom:8px}
.mf-sym .sym-c{display:flex;flex-wrap:wrap;gap:6px}
.mf-sym .sym{font-family:inherit;font-size:12px;padding:4px 11px;border:1px solid var(--line);
  background:var(--surface);color:var(--ink-2);border-radius:999px;cursor:pointer}
.mf-sym .sym:hover{border-color:var(--brand-line);color:var(--ink)}
.mf-sym .sym.on{background:var(--red-bg);border-color:var(--red);color:var(--red);font-weight:600}
.mf-sym .sym:last-child.on{background:var(--surface-3);border-color:var(--line);color:var(--ink-2);font-weight:400}
.mf-sym .sym-n{font-size:11.5px;color:var(--ink-3);line-height:1.6;margin-top:8px}
.mf-sym .sym-n b{color:var(--red)}

/* ---------- 预警台：一行一人 ---------- */
.alhead{display:grid;grid-template-columns:minmax(180px,1.1fr) 210px minmax(0,2.2fr) 96px;
  gap:12px;padding:8px 14px;font-size:11.5px;color:var(--ink-4);
  border-bottom:1px solid var(--line-2);background:var(--surface-2)}
.alist{max-height:none}
/* 预警台的清单可能有两百多行（全部筛选下）：给它自己一个滚动区，
   别把整页拉成几屏高 —— 表头（.alhead）留在滚动区外，滚的时候不跟着跑。 */
.alist.alscroll{max-height:min(72vh,820px);overflow:auto}
.alrow{display:grid;grid-template-columns:minmax(180px,1.1fr) 210px minmax(0,2.2fr) 96px;
  gap:12px;align-items:center;padding:10px 14px;border-bottom:1px solid var(--line-2);
  cursor:pointer;transition:background .12s}
.alrow:last-child{border-bottom:0}
.alrow:hover{background:var(--surface-2)}
.alrow.closed{cursor:default;opacity:.9}
.alrow .alwho{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}
.alrow .alwho .nm{font-size:13.5px;font-weight:600;white-space:nowrap}
.alrow .alcounts{display:flex;gap:6px;flex-wrap:wrap}
.alrow .alwhy{font-size:12.5px;color:var(--ink-2);line-height:1.55;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
.alrow .algo{display:flex;justify-content:flex-end}
.alrow .al-d{font-size:11.5px;color:var(--ink-3);font-variant-numeric:tabular-nums}
.alrow .al-v{font-size:12.5px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--ink)}
.alrow .al-at{font-size:11.5px;color:var(--ink-4);font-variant-numeric:tabular-nums}
/* 弹窗里的预警条目：左侧三栏收成两栏（标签 + 内容） */
.detail-list .alrow,.mbox .alist .alrow{grid-template-columns:auto 1fr auto;
  padding:8px 12px;background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-sm);margin-bottom:6px}
.mbox .alist .alrow:hover{border-color:var(--brand-line)}

/* ---------- 弹窗 ---------- */
.modal{position:fixed;inset:0;background:rgba(23,26,32,.38);opacity:0;pointer-events:none;
  transition:opacity .16s;z-index:120;display:flex;align-items:flex-start;justify-content:center;
  padding:48px 24px;overflow:auto}
.modal.on{opacity:1;pointer-events:auto}
.mbox{position:relative;width:100%;max-width:720px;background:var(--surface);border-radius:var(--r-lg);
  box-shadow:0 18px 48px rgba(23,26,32,.22);padding:22px 24px 24px}
.modal.wide .mbox{max-width:960px}
.mclose{position:absolute;top:12px;right:12px;width:30px;height:30px;border:0;border-radius:50%;
  background:var(--surface-3);color:var(--ink-3);font-size:18px;line-height:1;cursor:pointer;
  font-family:inherit}
.mclose:hover{background:var(--line);color:var(--ink)}
.mh{border-bottom:1px solid var(--line-2);padding-bottom:12px;margin-bottom:14px}
.mh h2{margin:0 0 4px;font-size:17px;font-weight:600}
.mh .ms{font-size:12.5px;color:var(--ink-3)}
.mh-s{display:flex;gap:6px;flex-wrap:wrap;margin-top:9px}

/* ---------- 预警详情 ---------- */
.al-detail .ad-h{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px}
.al-detail .ad-h h3{margin:0;font-size:16px;font-weight:600;width:100%}
.al-detail .ad-v{font-size:22px;font-weight:600;font-variant-numeric:tabular-nums;color:var(--ink);
  width:100%;margin-top:2px}
.al-detail .ad-v small{font-size:12px;font-weight:400;color:var(--ink-3);margin-left:5px}
.al-detail .ad-q{font-size:13.5px;color:var(--ink-2);line-height:1.7;padding:11px 13px;
  background:var(--surface-2);border-radius:var(--r-sm);border-left:3px solid var(--brand)}
.ad-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:10px 16px;margin-top:14px}
.ad-grid > div{display:flex;flex-direction:column;gap:2px;min-width:0}
.ad-grid .k{font-size:11.5px;color:var(--ink-4)}
.ad-grid .v{font-size:12.5px;color:var(--ink);word-break:break-word}
.ad-b{margin-top:16px}
.ad-b .bt{display:flex;align-items:baseline;gap:10px;margin-bottom:8px;font-size:12.5px;
  font-weight:600;color:var(--ink)}
.ad-b .bt .r{font-weight:400;font-size:11.5px;color:var(--ink-4)}
.ad-adv{font-size:13px;color:var(--ink-2);line-height:1.8;padding:11px 13px;
  background:var(--brand-bg);border-radius:var(--r-sm)}
.ad-act{display:flex;align-items:center;gap:12px;margin-top:18px;flex-wrap:wrap;
  padding-top:14px;border-top:1px solid var(--line-2)}
.ad-act .hint{font-size:11.5px;color:var(--ink-3);line-height:1.5}
/* 判读依据下面那条"去设备数据核对"：把两处口径的差别写在按钮旁边 ——
   不写的话，人跳过去看到"全天"那一列还是会觉得"还是对不上"。 */
.ad-goto{display:flex;align-items:flex-start;gap:10px;margin-top:10px;flex-wrap:wrap}
.ad-goto span{flex:1;min-width:200px;font-size:11.5px;color:var(--ink-3);line-height:1.7}

/* ---------- 预警框架说明 ---------- */
.alframe .af-sec{margin-bottom:22px}
.alframe .af-sec:last-child{margin-bottom:0}
.alframe .af-sec .bt{display:flex;align-items:baseline;gap:10px;margin-bottom:9px;
  font-size:12.5px;font-weight:600;color:var(--ink)}
.alframe .af-sec .bt .r{font-weight:400;font-size:11.5px;color:var(--ink-4)}
table.vt.al-t{table-layout:auto}
table.vt.al-t th{font-weight:500}
table.vt.al-t td{vertical-align:top;line-height:1.65}
table.vt.al-t td.wrap{white-space:normal}
table.vt.al-t td.redtxt{color:var(--red)}
table.vt.al-t td.num{font-variant-numeric:tabular-nums}

/* ---------- 抽屉里的异常与预警：分区 ---------- */
/* 一行一条的迷你条目：绿警 / 疾病 / 行为这三类不进处置队列，
   只占一行，点开才是详情 —— 铺成卡片会让「当前」这一屏从"今天做什么"变成一页资料。 */
.almini{display:flex;align-items:center;gap:7px;padding:6px 9px;border-radius:var(--r-sm);
  cursor:pointer;font-size:12px;color:var(--ink-2)}
.almini:hover{background:var(--surface-2)}
.almini .an{font-weight:600;color:var(--ink);white-space:nowrap}
.almini .av{font-variant-numeric:tabular-nums;color:var(--ink-2);white-space:nowrap}
.almini .ax{flex:1;min-width:0;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap}

.al-sec{margin-top:12px}
.al-sh{display:flex;align-items:baseline;gap:10px;font-size:12px;font-weight:600;
  color:var(--ink-2);margin:0 2px 7px}
.al-sh .r{font-weight:400;font-size:11.5px;color:var(--ink-4)}
.al-sec.closedsec{opacity:.92}
.al-by{margin-top:7px}
.al-by summary{font-size:11.5px;color:var(--brand-2);cursor:pointer;list-style:none}
.al-by summary::-webkit-details-marker{display:none}
.al-by summary::before{content:'▸ ';font-size:10px}
.al-by[open] summary::before{content:'▾ '}
.al-by table.vt{margin-top:7px;background:var(--surface-2)}
.al-by table.vt td{padding:4px 8px;font-size:11.5px}
.al-adv{margin-top:7px;font-size:12px;color:var(--ink-2);line-height:1.7;
  padding:9px 11px;background:var(--surface-2);border-radius:var(--r-sm)}
.al-adv b{color:var(--ink)}
.al-tip{font-size:11.5px;color:var(--ink-3);margin-top:12px;line-height:1.6}
.al-plat{margin-top:12px;padding:11px 13px;background:#f3eefd;border-radius:var(--r-sm);
  font-size:12.5px;color:var(--ink-2);line-height:1.7}
.al-plat b{color:#6b3fc4}
.alrt.flat{background:var(--surface-2)}
.alrt.flat .v1{color:var(--ink-2)}

/* ---------- 设备数据：时间窗筛选 ---------- */
.devwin{display:flex;align-items:center;gap:0;margin-right:12px;flex:none}
.devwin button{font-family:inherit;font-size:12px;padding:4px 10px;border:1px solid var(--line);
  background:var(--surface);color:var(--ink-2);cursor:pointer;margin-right:-1px}
.devwin button:first-child{border-radius:var(--r-sm) 0 0 var(--r-sm)}
.devwin button:last-child{border-radius:0 var(--r-sm) var(--r-sm) 0;margin-right:0}
.devwin button.on{background:var(--brand);border-color:var(--brand);color:#fff;position:relative;z-index:1}
.devwin .dwl{font-size:11.5px;color:var(--ink-4);margin-right:8px}

/* 图表悬停明细：跟着鼠标走的一小块，不遮挡图本身 */
.devchart .hit{fill:transparent;cursor:crosshair}
.devchart .hit:hover + .mk{opacity:1}
/* 时间序列图的悬停竖线（v084d）：由 devSeriesMove 直接改属性，不重渲染整张图 */
.devchart .cur{stroke:var(--brand);stroke-width:1;stroke-dasharray:3 3;pointer-events:none}
.devtip{position:fixed;z-index:200;pointer-events:none;background:rgba(23,26,32,.95);color:#fff;
  border-radius:var(--r-sm);padding:8px 11px;font-size:11.5px;line-height:1.65;
  box-shadow:0 6px 18px rgba(23,26,32,.28);max-width:260px;opacity:0;transition:opacity .12s}
.devtip.on{opacity:1}
.devtip .tt{font-size:12px;font-weight:600;margin-bottom:4px;font-variant-numeric:tabular-nums}
.devtip .tr{display:flex;align-items:center;gap:7px;justify-content:space-between}
.devtip .tr i{display:inline-block;width:8px;height:8px;border-radius:2px;flex:0 0 auto}
.devtip .tr span{flex:1;color:rgba(255,255,255,.72)}
.devtip .tr b{font-weight:600;font-variant-numeric:tabular-nums}
.devtip .tf{margin-top:5px;padding-top:5px;border-top:1px solid rgba(255,255,255,.16);
  color:rgba(255,255,255,.62);font-size:11px}

/* ---------- 设备数据：睡眠 ----------
   两条图各自回答一个问题，横轴含义不同，所以样式上也要能分开：
     上面 .nightbar 横轴 = 真实时刻（入睡 → 醒来），
     下面 .stg     横轴 = 占比（0% → 100%），两者**不是同一根轴**。 */
.devstage .stg{display:flex;gap:0;height:26px;border-radius:3px;overflow:hidden;margin:2px 0 0}
.devstage .stg i{display:block;height:100%}
.devstage .stg i + i{border-left:1px solid rgba(255,255,255,.55)}
.nightbar{margin-top:2px}
.stg-lab{margin-top:15px;font-size:12.5px;color:var(--ink-2);font-weight:600}
.stg-lab span{margin-left:8px;font-size:11px;font-weight:400;color:var(--ink-4)}
.devaxis{display:flex;justify-content:space-between;font-size:10px;color:var(--ink-4);
  margin-top:5px;font-variant-numeric:tabular-nums}
/* 最近一夜的指标表：分期时长 / 占比 / 参考值 / 是否正常 */
.stg-t td{padding:6px 10px;font-size:12px}
.stg-t .ok{color:var(--green)}
.stg-t .warn{color:var(--amber)}
.stg-t .bad{color:var(--red)}
.stg-t .ok,.stg-t .warn,.stg-t .bad{font-variant-numeric:tabular-nums}

/* ============================================================
   异常与预警：左右分栏（左「待处置」 / 右「背景层」）
   ------------------------------------------------------------
   两栏的语义是分开的，不是排版偏好：
     左 = 今天要动手的（时点预警 + 处置留痕）
     右 = 要理解的（绿警提示 / 疾病方向 / 数据链路 / 平台状态）
   所以左栏有按钮、右栏没有；左栏是能清空的，右栏通常清不完 ——
   一眼就能看出"还有活没干"，不必逐条读标题。
   ------------------------------------------------------------ */
.alrt-list .alrt-cols{grid-column:1/-1}
.alrt-list .al-tip{grid-column:1/-1}
.alrt-cols{display:grid;grid-template-columns:minmax(0,1.02fr) minmax(0,.98fr);gap:0;align-items:start}
/* 一边空就把整幅让给另一边 —— 空着半屏比左右不对称更难看 */
.alrt-cols.solo{grid-template-columns:minmax(0,1fr)}
/* 正在填留痕：表单要整幅宽（四个结论芯片 + 多行输入，挤在 400px 里会折成三行） */
.alrt-cols.editing{grid-template-columns:minmax(0,1fr)}
.al-col{min-width:0}
.al-col-r{border-left:1px solid var(--line-2);padding-left:16px;margin-left:16px}
.alrt-cols.solo .al-col-r{border-left:0;padding-left:0;margin-left:0}
.alrt-cols.editing .al-col-r{border-left:0;padding-left:0;margin-left:0;
  margin-top:14px;padding-top:14px;border-top:1px solid var(--line-2)}
.al-col > .al-sec:first-child{margin-top:0}
/* 左侧栏封顶：一栏 6 条待处置已经要滚很久了，再多也不该把右栏甩到看不见的地方 */
.al-col-l{max-height:min(78vh,900px);overflow:auto;padding-right:2px}

/* ---------- 处置结论芯片 ---------- */
.af-chips{display:flex;flex-wrap:wrap;gap:6px}
.af-chip{font-family:inherit;font-size:12.5px;padding:5px 12px;cursor:pointer;
  border:1px solid var(--line);background:var(--surface);color:var(--ink-2);
  border-radius:999px;display:inline-flex;align-items:center;gap:5px;line-height:1.5}
.af-chip:hover{border-color:var(--ink-4);color:var(--ink)}
.af-chip i{font-style:normal;font-size:10px;padding:1px 5px;border-radius:999px;
  background:var(--amber-bg);color:#8a6412}
.af-chip.on{font-weight:600}
.af-chip.on.ok{background:var(--green-bg);border-color:rgba(26,140,90,.42);color:var(--green)}
.af-chip.on.gray{background:var(--surface-3);border-color:var(--ink-4);color:var(--ink)}
.af-chip.on.amber{background:var(--amber-bg);border-color:rgba(201,148,26,.5);color:#8a6412}
.af-r-wide label{padding-top:0}
.af-tip{grid-column:2/3;font-size:11.5px;color:var(--ink-4);margin-top:5px;line-height:1.6}
.af-warn.amber{color:#8a6412}

/* ---------- 「打过几次没接通」：卡片上的过程记录 ---------- */
.alrt .v1 .try{color:#8a6412}
.altry{margin-top:6px;font-size:11.5px;color:var(--ink-3);line-height:1.6;
  padding:6px 9px;background:var(--surface-3);border-radius:var(--r-sm)}

@media (max-width:900px){
  .alrt-cols{grid-template-columns:minmax(0,1fr)}
  .al-col-r{border-left:0;padding-left:0;margin-left:0;margin-top:14px;padding-top:14px;
    border-top:1px solid var(--line-2)}
  .al-col-l{max-height:none;overflow:visible}
  .af-tip{grid-column:1/-1}
}

/* ---------- 跟进记录：一条预警可能跟过好几次 ----------
   按时间列出来，而不是只留最后一条 —— "打了两次没接通"本身就是判断依据：
   它说明这个人不是没数据，是联系不上，该换渠道而不是继续打电话。 */
.ad-recs{display:grid;gap:7px}
.ad-rec{padding:9px 11px;border-radius:var(--r-sm);background:var(--surface-2);
  border-left:2px solid var(--line)}
.ad-rec.open{background:var(--amber-bg);border-left-color:rgba(201,148,26,.6)}
.ad-rec-h{display:flex;align-items:baseline;gap:9px;font-size:12px;flex-wrap:wrap}
.ad-rec-h b{color:var(--ink);font-weight:600}
.ad-rec-h span{color:var(--ink-4);font-size:11.5px;font-variant-numeric:tabular-nums}
.ad-rec-b{font-size:12px;color:var(--ink-2);line-height:1.65;margin-top:3px}
.ad-rec-n{font-size:11.5px;color:#8a6412;margin-top:5px}
.algo{gap:7px}

/* 两边数量差得远时让栏宽跟着偏（左待处置多 / 右待处置多各一档）
   —— 五五开只适合"两边差不多"，一边一两条时那半屏白会显得像没渲染出来 */
.alrt-cols.wide-l{grid-template-columns:minmax(0,1.32fr) minmax(0,.68fr)}
.alrt-cols.wide-r{grid-template-columns:minmax(0,.72fr) minmax(0,1.28fr)}

/* ---------- 数据断链（详情页页头 + 异常与预警页） ----------
   超过静默线的人不再进预警与待办，但这个事实要一直看得见 ——
   它决定的是"这个人还值不值得跟"，不是"今天要不要打电话"。 */
.gapbox{display:flex;align-items:flex-start;gap:16px;padding:13px 16px;
  border-radius:var(--r-sm);background:var(--surface-2);border-left:3px solid var(--line)}
.gapbox.lost{background:var(--amber-bg);border-left-color:rgba(201,148,26,.55)}
.gapbox .gn{font-size:24px;font-weight:600;line-height:1.1;color:var(--ink);
  font-variant-numeric:tabular-nums;flex:0 0 auto}
.gapbox .gn small{font-size:12px;font-weight:400;margin-left:3px;color:var(--ink-3)}
.gapbox .gt{flex:1;min-width:0;font-size:12.5px;color:var(--ink-2);line-height:1.7}
.gapbox .gs{color:var(--ink-3);font-size:12px;margin-top:4px;line-height:1.65}

/* ---------- 运营账号（连接管理里可直接改） ----------
   以前它只在云函数环境变量里，改一次账号要重新部署一次 ——
   搬进库之后这里给一个能直接改的入口。 */
.opsacc{width:min(240px,100%);font-family:inherit;font-size:13px;padding:7px 10px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);color:var(--ink)}
.opsacc:focus{outline:none;border-color:var(--brand-line);box-shadow:0 0 0 2px var(--brand-bg)}
.connrow .cv .btn.tiny{margin-left:8px}

/* ============================================================
   v052 · 详情页透气 + 确诊时间控件 + 今日必做按人合并
   ============================================================ */

/* ---------- ① 统一版心留白 ----------
   页头 / 标签条 / 正文 / 页脚之前是 24px，正文另有一套 20px，
   三处对不齐，长内容贴边尤其明显。统一到 30px 一条线。 */
.drawer .dh{padding:18px 30px}
.drawer .dtabs{padding:0 30px}
.drawer .db{padding:24px 30px 64px}
.drawer .df{padding:14px 30px}

/* ---------- ② 块与行之间的呼吸 ---------- */
.block{margin-bottom:31px}
.block > .bt{padding-bottom:10px;margin-bottom:17px}
/* 手动录入上移后成了「数据」页的第一个块，需要与下面的块有同样的间距 */
.drawer .db > .mblock{margin-bottom:31px}

/* 键值对：标签列加宽（12 个字以内不再折行），行高与列间距一起放松 */
.kv{grid-template-columns:104px minmax(0,1fr);gap:12px 20px;line-height:1.7}
.kv .v{line-height:1.78;overflow-wrap:anywhere}
.kv .k{padding-top:2px}

/* 统计格：数字大，四周本来就该更空 */
.dgrid > div{padding:15px 14px}
.dgrid .k{margin-bottom:8px}

/* 时间线（触达 / 报告 / 处置留痕）：行距拉开，长备注自然折行不顶格 */
.log .li{padding:13px 0;gap:14px;line-height:1.7}
.log .li .t{width:86px;flex:0 0 86px}
.log .li .c{line-height:1.78;overflow-wrap:anywhere}
.log .li .c .tag{margin-right:2px}

/* 预警摘要那一行、以及各种 flex 行：宁可换行，不要挤成一长条 */
.alrt-sum{flex-wrap:wrap;gap:8px 22px;line-height:1.7}
.who .why{line-height:1.72}

/* 长串（手机号 / SN / 备注）在窄列里允许断行，避免把整格撑开 */
.note,.why,.v,.what,.meta{overflow-wrap:anywhere}

/* ---------- ③ 确诊时间：月份 / 年份两种精度 ---------- */
.disrow{align-items:center}
.dis-when{display:flex;align-items:center;gap:6px;min-width:0}
.dis-when input{flex:1 1 auto;min-width:0}
/* 精度切换是个小动作，做成贴边的小字按钮，不跟输入框抢宽度 */
.dis-when .dis-m{
  flex:0 0 auto;font-family:inherit;font-size:11px;line-height:1;
  padding:6px 8px;border:1px solid var(--line);border-radius:var(--r-sm);
  background:var(--surface);color:var(--ink-3);cursor:pointer;white-space:nowrap;
}
.dis-when .dis-m:hover{border-color:var(--brand-line);color:var(--brand-2)}
/* 控件表示不了的老值（"2019 年""前年"）：原文留在这儿，选了新值才覆盖 */
.dis-when .dis-legacy{
  flex:0 0 auto;font-size:11px;color:#8a6a1f;background:#fdf7e6;
  border:1px solid rgba(201,148,26,.28);border-radius:999px;padding:3px 8px;
  white-space:nowrap;max-width:120px;overflow:hidden;text-overflow:ellipsis;
}
.dis-hint{font-size:11.5px;color:var(--ink-4);line-height:1.65;padding-top:2px}

/* ---------- ④ 今日必做：按人合并 ---------- */
.task.grp{grid-template-columns:54px minmax(0,1fr) 118px 210px;align-items:start}
.task.grp .who{padding-top:1px}
.task.grp .act{margin-top:1px}
.task.grp .nm .tag.cnt{background:var(--brand-bg);color:var(--brand-2);font-weight:600}
.task.grp .what .sub{color:var(--ink-3);font-size:12.5px;font-weight:400}
/* 明细默认收起 —— 这一行要能一眼看完"是谁、最急的是什么" */
.task.grp .glist{display:none}
.task.grp.open .glist{display:grid}
.task.grp.open{align-items:start}
.glist{gap:6px;margin-top:11px;border-top:1px dashed var(--line);padding-top:11px}
.gitem{
  display:grid;grid-template-columns:auto minmax(112px,.8fr) minmax(0,1.7fr) 72px auto;
  gap:10px;align-items:center;
  padding:8px 10px;border-radius:var(--r-sm);background:var(--surface-2);
  font-size:12.5px;
}
.gitem:hover{background:var(--surface-3)}
.gitem .gi-lv{
  font-size:10.5px;font-weight:600;padding:2px 7px;border-radius:999px;
  background:var(--surface-3);color:var(--ink-3);white-space:nowrap;
}
.gitem .gi-lv.lv1{background:var(--red);color:#fff}
.gitem .gi-lv.lv2{background:var(--orange-bg);color:var(--orange)}
.gitem .gi-lv.lv3{background:var(--red-bg);color:var(--red)}
.gitem .gi-lv.lv4{background:var(--brand-bg);color:var(--brand-2)}
.gitem .gi-t{font-weight:600;color:var(--ink);min-width:0}
.gitem .gi-d{color:var(--ink-3);line-height:1.65;min-width:0;overflow-wrap:anywhere}
.gitem .gi-x{color:var(--ink-4);font-size:11.5px;text-align:right;white-space:nowrap;font-variant-numeric:tabular-nums}
.gitem .gi-a{display:flex;justify-content:flex-end}
.gitem.done{opacity:.55}
.gitem.done .gi-t{text-decoration:line-through;text-decoration-color:var(--ink-4)}
/* 窄屏：明细里的动作换到下一行，别把描述挤没 */
@media (max-width:1180px){
  .gitem{grid-template-columns:auto minmax(0,1fr) auto}
  .gitem .gi-d,.gitem .gi-x{display:none}
}

/* ---------- ⑤ 报告：版式自检 / 分享 / 导出 ---------- */
.auditwrap{margin-top:14px}
/* 自检结果块：它是"闸"，不是普通提示 —— 用边框和底色把它和正文分开 */
.auditbox{border:1px solid rgba(201,148,26,.35);border-radius:var(--r-sm);
  background:#fdf9ee;padding:14px 16px}
.auditbox .ab-h{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}
.auditbox .ab-h > span:first-child{font-size:13px;font-weight:600;color:#8a6412}
.auditbox .ab-h b{font-size:15px}
.auditbox .ab-n{font-size:11.5px;color:var(--ink-3)}
.ab-l{display:grid;gap:6px}
.ab-i{display:grid;grid-template-columns:64px 64px minmax(140px,1fr) minmax(0,1.4fr);
  gap:10px;align-items:baseline;padding:7px 10px;background:var(--surface);
  border-radius:var(--r-sm);font-size:12.5px}
.ab-i .ab-p{font-size:11.5px;color:#8a6412;white-space:nowrap;font-variant-numeric:tabular-nums}
.ab-i .ab-k{font-size:11.5px;font-weight:600;color:#8a6412;white-space:nowrap}
.ab-i .ab-w{color:var(--ink);overflow-wrap:anywhere}
.ab-i .ab-d{color:var(--ink-3);line-height:1.6;overflow-wrap:anywhere}
.ab-f{margin-top:11px;font-size:11.5px;color:var(--ink-2);line-height:1.75;
  border-top:1px solid rgba(201,148,26,.22);padding-top:10px}
.ab-ack{display:flex;align-items:center;gap:8px;margin-top:12px;font-size:12.5px;
  color:#8a6412;cursor:pointer;user-select:none}
.ab-ack input{width:15px;height:15px;accent-color:#c9941a}

/* 导出与分享 */
.exportbar{display:flex;align-items:center;gap:12px;margin:0 0 12px}
.exportbar .eb-n{font-size:11.5px;color:var(--ink-3);line-height:1.6}
.sharewrap{margin-top:22px}
.sharebar{display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  padding:11px 13px;border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface-2)}
.sharebar .sb-t{font-size:12.5px;font-weight:600;color:var(--ink-2);flex:0 0 auto}
.sharebar .sb-n{font-size:11.5px;color:var(--ink-4)}
.sharebar .sb-u{
  flex:1 1 260px;min-width:200px;font-family:inherit;font-size:12.5px;
  color:var(--ink-2);background:var(--surface);border:1px solid var(--line);
  border-radius:var(--r-sm);padding:7px 9px;
}
.sharebar .sb-u:focus{outline:none;border-color:var(--brand-line)}
.sb-warn{margin-top:8px;font-size:11.5px;color:#8a6412;background:#fdf7e6;
  border:1px solid rgba(201,148,26,.28);border-radius:var(--r-sm);
  padding:8px 11px;line-height:1.7}
.sb-warn b{color:#8a6412}
/* 窄屏：自检明细的说明列收起来，别把前两列压没 */
@media (max-width:980px){
  .ab-i{grid-template-columns:60px 60px minmax(0,1fr)}
  .ab-i .ab-d{display:none}
}

/* ============================================================
   v060 · 改善计划的四步：周期说明 + 逐日排期
   ------------------------------------------------------------
   右栏原来只放一个 `.pm`，现在多了一条步骤条 → 外面包一层 pwrap-r，
   步骤条固定高度、内容区自己滚动（长周期 30 天时滚动条只属于列表）。
   ============================================================ */
.plan2 .pwrap-r{flex:1;min-width:0;display:flex;flex-direction:column}
.psteps{
  display:flex;align-items:center;gap:4px;padding:10px 20px;flex:0 0 auto;
  border-bottom:1px solid var(--line);background:var(--surface);
}
.pstep{
  display:flex;align-items:center;gap:7px;padding:5px 11px;border:1px solid transparent;
  border-radius:999px;background:transparent;font-size:12.5px;color:var(--ink-3);font-family:inherit;
}
.pstep:hover:not([disabled]){background:var(--surface-3)}
.pstep[disabled]{opacity:.42}
.pstep .ps-n{
  width:17px;height:17px;border-radius:50%;background:var(--surface-3);color:var(--ink-4);
  display:flex;align-items:center;justify-content:center;font-size:10.5px;font-weight:600;flex:0 0 17px;
}
.pstep .ps-t{font-weight:500}
.pstep.past .ps-t{color:var(--ink-2)}
.pstep.past .ps-n{background:#e9efec;color:#5c8371}
.pstep.on{background:var(--brand-bg);border-color:var(--brand-line);color:var(--brand-2)}
.pstep.on .ps-n{background:var(--brand);color:#fff}
.ps-ar{color:var(--ink-4);font-size:12px}
.ps-meta{font-size:11.5px;color:var(--ink-4);white-space:nowrap}

/* ---- 第 2 步：周期说明 ---- */
.pth-in{
  width:100%;box-sizing:border-box;border:1px solid var(--line);border-radius:var(--r-sm);
  padding:10px 12px;font-size:13.5px;line-height:1.78;color:var(--ink);
  font-family:inherit;background:var(--surface);resize:vertical;max-width:820px;
}
.pth-in:focus{outline:0;border-color:var(--brand-line);box-shadow:0 0 0 3px var(--gold-l)}
.pth-warn{
  font-size:12px;line-height:1.75;color:var(--orange);background:var(--orange-bg);
  padding:9px 12px;border-radius:var(--r-sm);margin-bottom:10px;max-width:820px;
}
.pth-key-in{
  width:100%;max-width:520px;box-sizing:border-box;border:1px solid var(--line);
  border-radius:var(--r-sm);padding:8px 11px;font-size:13px;font-family:inherit;background:var(--surface);
}
.pth-key-in:focus{outline:0;border-color:var(--brand-line)}
.pth-prev{
  border:1px solid var(--line);border-radius:var(--r);padding:16px 18px;
  background:var(--surface-2);max-width:620px;
}
.pth-prev-t{font-size:14px;font-weight:600;margin-bottom:9px}
.pth-prev-k{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:11px}
.pth-prev-k span{
  font-size:11px;padding:2px 8px;border-radius:999px;
  background:var(--brand-bg);color:var(--brand-2);border:1px solid var(--brand-line);
}
.pth-prev-p{font-size:13px;line-height:1.8;color:var(--ink-2);margin-bottom:11px}
.pth-prev-g{
  font-size:12.5px;line-height:1.75;color:var(--ink-2);
  border-left:2px solid var(--brand-line);padding-left:11px;
}
.pth-prev-g b{display:block;font-size:11.5px;color:var(--brand-2);margin-bottom:3px}

/* ---- 第 3 步：逐日排期 ---- */
.pace-sum{display:flex;align-items:center;gap:9px;flex-wrap:wrap;margin-top:12px}
.pc{font-size:12px;padding:3px 10px;border-radius:999px;background:var(--surface-3);color:var(--ink-2)}
.pc b{font-weight:600}
.pc-focus{background:var(--brand-bg);color:var(--brand-2)}
.pc-lite{background:var(--blue-bg);color:var(--blue)}
.pc-rest{background:var(--gray-bg);color:var(--ink-4)}
.pc-meta{font-size:11.5px;color:var(--ink-4)}
.seg .on{background:var(--brand);color:#fff;font-weight:600}
.seg-sm button{font-size:12px;padding:5px 12px}

.sdlist{border:1px solid var(--line);border-radius:var(--r);overflow:hidden;max-width:900px;background:var(--surface)}
.sday{border-bottom:1px solid var(--line-2)}
.sday:last-child{border-bottom:0}
.sd-h{display:flex;align-items:center;gap:10px;padding:9px 13px;cursor:pointer;font-size:12.5px}
.sd-h:hover{background:var(--surface-2)}
.sday.custom .sd-h{background:#fffdf4}
.sday.open .sd-h{background:var(--surface-2);border-bottom:1px solid var(--line-2)}
.sd-n{flex:0 0 30px;font-weight:600;font-size:11.5px;color:var(--ink-4)}
.sd-d{flex:0 0 58px;font-size:11.5px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.sd-k{flex:0 0 auto;padding:1.5px 9px;border-radius:999px;font-size:11px;font-weight:600}
.k-focus .sd-k{background:var(--brand-bg);color:var(--brand-2)}
.k-normal .sd-k{background:var(--surface-3);color:var(--ink-2)}
.k-lite .sd-k{background:var(--blue-bg);color:var(--blue)}
.k-rest .sd-k{background:var(--gray-bg);color:var(--ink-4)}
.sday.k-rest .sd-p{color:var(--ink-4)}
.sday.k-rest{opacity:.72}
.sd-p{flex:1;min-width:0;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.sd-ms{font-size:10.5px;color:var(--amber);background:var(--amber-bg);padding:1px 7px;border-radius:999px}
.sd-cu{font-size:10.5px;color:var(--orange);background:var(--orange-bg);padding:1px 7px;border-radius:999px}
.sd-cv{color:var(--ink-4);font-size:12px;flex:0 0 auto}
.sd-b{padding:15px 16px 17px;background:var(--surface-2);border-top:1px solid var(--line-2)}
.sd-f{margin-bottom:15px}
.sd-f:last-child{margin-bottom:0}
.sd-fa{display:flex;justify-content:flex-end}
.sd-f > label{display:flex;align-items:baseline;gap:8px;font-size:12px;color:var(--ink-2);margin-bottom:8px;font-weight:600}
.sd-sub{font-weight:400;color:var(--ink-4);font-size:11.5px}
.sd-note{font-size:11.5px;color:var(--ink-4);margin-left:10px}
.sd-picks{display:flex;flex-direction:column;gap:6px}
.sdp{
  padding:8px 11px;background:var(--surface);
  border:1px solid var(--line);border-radius:var(--r-sm);font-size:12.5px;
}
.sdp.main{border-color:var(--brand-line);background:var(--brand-bg)}
.sdp.auto{background:var(--surface-2)}
.sdp-l{display:flex;align-items:baseline;gap:8px}
.sdp-goal{flex:0 0 auto;font-size:11px;color:var(--ink-3)}
.sdp.main .sdp-goal{color:var(--brand-2);font-weight:600}
.sdp-t{flex:0 1 auto;color:var(--ink)}
.sdp-r{flex:0 0 auto;font-size:12px;color:var(--brand-2);font-weight:600}
.sdp.auto .sdp-r{color:var(--ink-3);font-weight:400}
.sdp-w{flex:0 0 auto;font-size:10.5px;color:var(--ink-4);background:var(--surface-3);padding:1px 6px;border-radius:999px}
.sdp-auto{flex:0 0 auto;font-size:10.5px;color:var(--brand-2);background:var(--brand-bg);border:1px solid var(--brand-line);padding:1px 6px;border-radius:999px}
.sdp-how{margin-top:5px;font-size:11.5px;color:var(--ink-4);line-height:1.7}
.sdp-sw{
  flex:0 0 auto;border:1px solid var(--line);background:var(--surface);color:var(--ink-3);
  font-size:11px;padding:1px 8px;border-radius:999px;cursor:pointer;font-family:inherit;
}
.sdp-sw:hover{border-color:var(--brand-line);color:var(--brand-2);background:var(--brand-bg)}
.sdp-x{
  flex:0 0 auto;border:0;background:transparent;color:var(--ink-4);font-size:13px;
  cursor:pointer;padding:0 2px;line-height:1;
}
.sdp-x:hover{color:var(--red)}

/* ---- 运动处方（v064）：配置面板 + 换动作 + 逐日条目 ---- */
.rx-row{display:flex;align-items:center;gap:10px;margin:10px 0;font-size:12.5px;flex-wrap:wrap}
.rx-row > label{flex:0 0 78px;color:var(--ink-2);font-weight:600;font-size:12px}
.rx-hint{flex:1;min-width:220px;font-size:11.5px;color:var(--ink-4);line-height:1.75}
.rx-steps-in{
  width:88px;box-sizing:border-box;border:1px solid var(--line);border-radius:var(--r-sm);
  padding:6px 10px;font-size:12.5px;font-family:inherit;background:var(--surface);text-align:right;
}
.rx-steps-in:focus{outline:0;border-color:var(--brand-line)}
.rx-pools{display:flex;flex-direction:column;gap:13px;margin-top:6px}
.rx-g{border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden;background:var(--surface)}
.rx-gh{display:flex;align-items:baseline;gap:8px;padding:8px 12px;background:var(--surface-2);border-bottom:1px solid var(--line-2)}
.rx-gh b{font-size:12.5px;color:var(--ink)}
.rx-gs{font-size:11.5px;color:var(--ink-4)}
.rx-gn{font-size:11px;color:var(--ink-3)}
.rx-gb{display:flex;flex-wrap:wrap;gap:7px;padding:11px 12px}
.rx-b{
  display:inline-flex;flex-direction:column;gap:2px;padding:7px 11px;min-width:140px;
  border:1px solid var(--line);border-radius:var(--r-sm);background:var(--surface);
  font-family:inherit;text-align:left;cursor:pointer;
}
.rx-b:hover{border-color:var(--brand-line);background:var(--brand-bg)}
.rx-b.on{border-color:var(--brand);background:var(--brand-bg)}
.rx-b b{font-size:12.5px;color:var(--ink);font-weight:600}
.rx-b.on b{color:var(--brand-2)}
.rx-b i{font-style:normal;font-size:11.5px;color:var(--ink-3)}
.rx-b em{font-style:normal;font-size:10.5px;color:var(--ink-4)}
.rx-gt{padding:0 12px 10px;font-size:11.5px;color:var(--ink-4);line-height:1.7}
.rx-week{display:flex;flex-direction:column;border:1px solid var(--line);border-radius:var(--r-sm);overflow:hidden}
.rx-day{display:flex;align-items:baseline;gap:10px;padding:7px 12px;font-size:12px;border-bottom:1px solid var(--line-2)}
.rx-day:last-child{border-bottom:0}
.rx-dn{flex:0 0 50px;font-size:11.5px;color:var(--ink-4)}
.rx-dk{flex:0 0 50px;font-size:11px;font-weight:600;padding:1.5px 0;border-radius:999px;text-align:center;background:var(--surface-3);color:var(--ink-2)}
.rx-day.k-strength .rx-dk{background:var(--amber-bg);color:var(--amber)}
.rx-day.k-cardio .rx-dk{background:var(--brand-bg);color:var(--brand-2)}
.rx-dd{flex:1;min-width:0;color:var(--ink-2);line-height:1.75}
.rx-dd i{font-style:normal;color:var(--ink-4)}
.sd-swap{border:1px solid var(--brand-line);background:var(--brand-bg);border-radius:var(--r-sm);padding:12px 13px}
.sw-tabs{display:flex;flex-wrap:wrap;gap:6px;margin-bottom:10px}
.sw-tabs button{
  font-size:11.5px;padding:2.5px 10px;border-radius:999px;border:1px solid var(--line);
  background:var(--surface);color:var(--ink-2);cursor:pointer;font-family:inherit;
}
.sw-tabs button.on{background:var(--brand);color:#fff;border-color:var(--brand)}
.sw-bs{display:flex;flex-wrap:wrap;gap:7px}
.sw-b{
  display:inline-flex;align-items:baseline;gap:7px;padding:6px 11px;border:1px solid var(--line);
  border-radius:999px;background:var(--surface);font-size:12px;color:var(--ink);cursor:pointer;font-family:inherit;
}
.sw-b:hover{border-color:var(--brand);background:var(--brand-bg);color:var(--brand-2)}
.sw-b i{font-style:normal;font-size:10.5px;color:var(--ink-4)}
.sw-note{margin-top:9px;font-size:11.5px;color:var(--ink-3);line-height:1.7}
.sdr-rx{margin-top:8px;font-size:11.5px;color:var(--ink-3);line-height:1.8}

/* ---- 健康档案：导航的「全部字段」小标题 ----
   ⚠️ 这里原来还有 `.it.ivh`（导航最上面"边问边记"入口那一条）与整页的
      `.narr-*` / `.ivx-*` / `.ivk-*` / `.ask-*` 样式 —— 2026-09-20 随该功能一起删除。
      留下的这一条现在紧跟在导航顶部。 */
.iv-nav-cap{
  font-size:11px;color:var(--ink-4);letter-spacing:.04em;
  padding:12px 12px 5px;border-top:1px solid var(--line-2);margin-top:7px;
}

.sd-add{display:flex;flex-direction:column;gap:9px}








.sd-add{display:flex;flex-direction:column;gap:9px}
.sda-gt{font-size:11px;color:var(--ink-4);margin-bottom:5px}
.sda-b{
  display:inline-flex;align-items:baseline;gap:7px;margin:0 6px 6px 0;padding:5px 10px;
  border:1px dashed var(--line);border-radius:999px;background:var(--surface);
  font-size:12px;color:var(--ink-2);font-family:inherit;text-align:left;
}
.sda-b:hover{border-color:var(--brand-line);background:var(--brand-bg);color:var(--brand-2)}
.sda-b i{font-style:normal;font-size:10.5px;color:var(--ink-4)}
.sda-none{font-size:11.5px;color:var(--ink-4)}
.sd-note-in{
  width:100%;max-width:560px;box-sizing:border-box;border:1px solid var(--line);
  border-radius:var(--r-sm);padding:7px 11px;font-size:12.5px;font-family:inherit;background:var(--surface);
}
.sd-note-in:focus{outline:0;border-color:var(--brand-line)}

/* ---- 用户版：周期说明块 + 每天做什么 ---- */
.pv-theme{
  margin:16px 0 6px;padding:15px 17px;border-radius:var(--r);
  background:var(--brand-bg);border:1px solid var(--brand-line);
}
.pv-tk{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:10px}
.pv-tk span{
  font-size:11px;padding:2px 9px;border-radius:999px;
  background:var(--surface);color:var(--brand-2);border:1px solid var(--brand-line);
}
.pv-ti{font-size:13.5px;line-height:1.85;color:var(--ink)}
.pv-tg{
  margin-top:11px;padding-top:11px;border-top:1px dashed var(--brand-line);
  font-size:12.5px;line-height:1.8;color:var(--ink-2);
}
.pv-tg b{display:block;font-size:11.5px;color:var(--brand-2);margin-bottom:3px}
.pv-sched{margin-top:10px}
.pv-sch-m{font-size:12px;color:var(--ink-3);margin-bottom:10px}
.pv-sd{
  display:flex;align-items:baseline;gap:11px;padding:7px 0;
  border-bottom:1px solid var(--line-2);font-size:12.5px;
}
.pv-sd:last-of-type{border-bottom:0}
.pv-sd-d{flex:0 0 112px;color:var(--ink-3);font-size:11.5px}
.pv-sd-d b{color:var(--ink-2);margin-right:6px;font-size:11.5px}
.pv-sd-k{flex:0 0 42px;font-size:11px;font-weight:600;color:var(--ink-3)}
.pv-sd.k-focus .pv-sd-k{color:var(--brand-2)}
.pv-sd.k-lite .pv-sd-k{color:var(--blue)}
.pv-sd.k-rest{opacity:.6}
.pv-sd-c{flex:1;min-width:0;color:var(--ink-2);line-height:1.72}
.pv-sd-n{font-style:normal;color:var(--ink-4);margin-left:8px}
.pv-sch-f{font-size:11.5px;color:var(--ink-4);line-height:1.75;margin-top:11px}

/* ---- 详情页「本周期怎么走」（v060） ---- */
.sdr-theme{
  padding:12px 14px;border-radius:var(--r-sm);background:var(--brand-bg);
  border:1px solid var(--brand-line);margin-bottom:13px;
}
.sdr-k2{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:9px}
.sdr-k2 span{
  font-size:11px;padding:1.5px 8px;border-radius:999px;background:var(--surface);
  color:var(--brand-2);border:1px solid var(--brand-line);
}
.sdr-idea{font-size:13px;line-height:1.8;color:var(--ink)}
.sdr-goal{
  margin-top:9px;padding-top:9px;border-top:1px dashed var(--brand-line);
  font-size:12.5px;line-height:1.78;color:var(--ink-2);
}
.sdr-goal b{display:block;font-size:11.5px;color:var(--brand-2);margin-bottom:2px}
.sdr-sum{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:12px}
.sdr-days{border-top:1px solid var(--line-2)}
.sdr-lb{
  font-size:11px;color:var(--ink-4);margin-top:10px;margin-bottom:5px;font-weight:600;
}
.sdr-d{
  display:flex;align-items:baseline;gap:10px;padding:7px 11px;border-radius:var(--r-sm);
  background:var(--surface-2);font-size:12.5px;
}
.sdr-d.k-focus{background:var(--brand-bg)}
.sdr-d.k-lite{background:var(--blue-bg)}
.sdr-d.k-rest{background:var(--gray-bg);opacity:.75}
.sdr-n{flex:0 0 auto;font-size:11.5px;color:var(--ink-3)}
.sdr-k{
  flex:0 0 auto;font-size:11px;font-weight:600;color:var(--ink-2);
  background:var(--surface);padding:1px 7px;border-radius:999px;
}
.sdr-c{flex:1;min-width:0;color:var(--ink-2);line-height:1.7}
.sdr-c i{font-style:normal;color:var(--ink-4)}
.sdr-none{font-size:12px;color:var(--ink-4);padding:7px 11px}

/* ---- 节奏模板的系统推荐（v061） ----
   推荐只给建议、不锁选择：采纳是一个动作，改选也是一个动作，
   所以这一条不能做成"必选弹窗"，要做成"摆在模板上方、依据可读"的一行。 */
.pcrec{
  display:flex;align-items:center;gap:9px;flex-wrap:wrap;max-width:820px;
  padding:9px 12px;margin-bottom:12px;border-radius:var(--r-sm);
  border:1px solid var(--brand-line);background:var(--brand-bg);
}
.pcrec-t{
  font-size:11px;letter-spacing:.1em;color:var(--brand-2);background:var(--surface);
  border:1px solid var(--brand-line);padding:2px 7px;border-radius:999px;
}
.pcrec b{font-size:13.5px;color:var(--brand-2)}
.pcrec-on{font-size:11px;color:var(--ink-4)}
.pcrec-why{flex:1 0 100%;display:flex;flex-direction:column;gap:3px;margin-top:1px}
.pcrec-why span{position:relative;font-size:12px;line-height:1.7;color:var(--ink-2);padding-left:11px}
.pcrec-why span::before{content:'·';position:absolute;left:2px;color:var(--ink-4)}
/* 模板按钮上的「推荐」小标 —— 别让它撑高按钮，字号按 .seg 走 */
.seg button .pcb{
  font-style:normal;font-size:10px;margin-left:5px;padding:1px 5px;border-radius:999px;
  background:var(--brand-bg);color:var(--brand-2);border:1px solid var(--brand-line);
}
.seg button.on .pcb{background:rgba(255,255,255,.88);border-color:transparent;color:var(--brand-2)}

/* ============================================================
   v062 · 本周期行动计划（详情页）+ 计划器的编辑态
   ------------------------------------------------------------
   详情页这一块要回答"用户手机上看到的到底是什么"：
   周期说明 / 周期与节奏 / 逐日排期 / 调整记录，四段齐了才算"全部行动计划"。
   30 天周期的整表要限高滚动 —— 不加限高，详情页会被一张表拉成两屏。
   ============================================================ */
.pedit{
  display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;max-width:900px;
  margin:0 20px 12px;padding:9px 12px;border-radius:var(--r-sm);
  background:var(--brand-bg);border:1px solid var(--brand-line);
}
.pedit-t{font-size:12px;font-weight:600;color:var(--brand-2);white-space:nowrap}
.pedit-s{font-size:12px;line-height:1.7;color:var(--ink-2)}
.sdr-all{margin-top:10px}
.sdr-list{margin-top:9px;border-top:1px solid var(--line-2);max-height:360px;overflow:auto}
.sdr-list .sdr-d{border-radius:0;margin:0;border-bottom:1px solid var(--line-2)}
.sdr-list .sdr-d:last-child{border-bottom:0}
.sdr-cu{
  flex:0 0 auto;font-size:10.5px;color:var(--orange);background:var(--orange-bg);
  padding:1px 7px;border-radius:999px;
}
.sdr-revs{margin-top:14px;border-top:1px dashed var(--line);padding-top:4px}
.sdr-rev{
  display:flex;align-items:baseline;gap:9px;font-size:12px;line-height:1.72;
  padding:5px 0 5px 11px;border-bottom:1px solid var(--line-2);
}
.sdr-rev:last-child{border-bottom:0}
.sr-at{flex:0 0 auto;color:var(--ink-4);font-variant-numeric:tabular-nums}
.sr-by{flex:0 0 auto;color:var(--ink-3)}
.sr-sum{flex:1;min-width:0;color:var(--ink-2)}

/* ============================================================
   AI 建议卡（v067）：计划生成与报告复核共用一套外观
   ------------------------------------------------------------
   视觉上要一眼看出"这是建议、不是定稿"：
   底色用品牌色系的浅底 + 左侧一道竖线，按钮一律是「采纳」这类动作词，
   不做成和正文一样的白底卡片 —— 否则人会以为已经是计划的一部分。
   ============================================================ */
.ai{
  border:1px solid var(--brand-line);border-left:3px solid var(--brand);
  border-radius:var(--r-sm);background:var(--brand-bg);
  padding:12px 14px;margin:14px 0 4px;max-width:900px;
}
.ai-h{display:flex;align-items:baseline;gap:9px;flex-wrap:wrap}
.ai-h .ai-t{font-size:13px;font-weight:600;color:var(--brand-2)}
.ai-h .ai-s{font-size:11.5px;color:var(--ink-3);line-height:1.6}
.ai-h .ai-s b{color:var(--ink-2)}
.ai-wait{font-size:12px;color:var(--ink-3);padding:9px 0 2px}
.ai-err{
  margin-top:9px;font-size:12.5px;color:var(--red);background:var(--red-bg);
  border-radius:var(--r-sm);padding:9px 11px;line-height:1.7;
}
.ai-b{margin-top:11px;display:flex;flex-direction:column;gap:12px}
.ai-sec{background:var(--surface);border:1px solid var(--line);border-radius:var(--r-sm);padding:10px 12px}
.ai-sh{
  display:flex;align-items:baseline;gap:9px;font-size:12px;font-weight:600;
  color:var(--ink-2);margin-bottom:7px;
}
.ai-sh .ai-n{font-weight:400;font-size:11px;color:var(--ink-4)}
.ai-p{font-size:13px;line-height:1.85;color:var(--ink);white-space:pre-wrap}
.ai-p.dim{font-size:12.5px;color:var(--ink-2);margin-top:6px}
.ai-ol,.ai-ul{margin:0;padding-left:19px;font-size:12.5px;line-height:1.9;color:var(--ink-2)}
.ai-ul.warn li{color:var(--amber)}
.ai-days{display:grid;grid-template-columns:repeat(auto-fill,minmax(178px,1fr));gap:6px}
.ai-day{
  display:grid;grid-template-columns:auto auto;gap:2px 7px;align-items:baseline;
  border:1px solid var(--line);border-radius:var(--r-sm);padding:6px 9px;background:var(--surface-2);
}
.ai-day b{font-size:11px;color:var(--ink-4);font-variant-numeric:tabular-nums}
.ai-day i{font-style:normal;font-size:10.5px;color:var(--ink-3)}
.ai-day span{grid-column:1 / -1;font-size:12px;color:var(--ink);line-height:1.5}
.ai-day.k-focus{border-color:var(--brand-line);background:var(--brand-bg)}
.ai-day.k-focus i{color:var(--brand-2);font-weight:600}
.ai-day.k-lite{background:var(--blue-bg)}
.ai-day.k-lite i{color:var(--blue)}
.ai-day.k-rest{background:repeating-linear-gradient(45deg,var(--surface-3),var(--surface-3) 3px,transparent 3px,transparent 6px)}
.ai-sw{border-top:1px dashed var(--line-2);padding-top:8px;margin-top:8px}
.ai-sw:first-of-type{border-top:0;padding-top:0;margin-top:0}
.ai-sw-f{font-size:12px;color:var(--ink-4);text-decoration:line-through}
.ai-sw-t{font-size:12.5px;color:var(--ink);margin-top:3px}
.ai-sw-w{font-size:11.5px;color:var(--ink-3);margin-top:3px;line-height:1.65}
.ai-f{font-size:11px;color:var(--ink-4);line-height:1.7}

/* ============================================================
   v068：报告讲解面板 · 服务记录（触达与人时合并）
   ============================================================ */
/* 报告行右侧是按钮组，竖直居中才不显歪 */
.log .li.rli{align-items:center}

/* 服务记录一行末尾的人时 —— 与前面的事由对齐成三栏（时间 / 内容 / 分钟） */
.log .li .tmin{
  flex:0 0 62px;text-align:right;font-size:11.5px;color:var(--ink-3);
  font-variant-numeric:tabular-nums;padding-top:2px;
}

/* 人时分档的中性标签：它是"归类"，不是"状态" —— 不用彩色，免得和绿/红抢注意力 */
.tag.plain{
  background:transparent;border:1px solid var(--line);color:var(--ink-3);
  font-size:10.5px;padding:1px 7px;
}

/* 块标题里的补充说明（如"做过什么 · 花了多少人工"） */
.bt .bt-sub{font-size:11px;color:var(--ink-4);font-weight:400;margin-left:9px}

/* 人时四类的汇总格：比 dgrid 矮一点，它是辅助信息不是主指标 */
.kindgrid{
  display:grid;grid-template-columns:repeat(4,1fr);gap:1px;
  background:var(--line-2);border-radius:var(--r-sm);overflow:hidden;margin-top:12px;
}
.kindgrid > div{background:var(--surface);padding:9px 11px}
.kindgrid .k{font-size:11.5px;color:var(--ink-3);margin-bottom:5px}
.kindgrid .v{font-size:17px;font-weight:600;line-height:1;font-variant-numeric:tabular-nums}
.kindgrid .v small{font-size:10.5px;font-weight:400;color:var(--ink-4);margin-left:2px}

/* 四类各是什么意思 —— 一次性说清，省得再问"行政是啥" */
.kinds-note{margin-top:12px;display:grid;gap:5px}
.kinds-note > div{font-size:11.5px;color:var(--ink-3);line-height:1.6}
.kinds-note b{color:var(--ink-2);margin-right:7px;font-weight:600}

/* 服务记录表单：四行控件两行放，第二行是事由 + 保存 */
.touch-form .tf-min{flex:0 0 92px;min-width:92px}
.touch-form .tf-note{flex:1;min-width:220px}
.touch-form .tf-hint{font-size:11px;color:var(--ink-4);margin-top:7px;line-height:1.6}

/* 讲解记录的三个输入 */
.exrow{display:flex;gap:14px;flex-wrap:wrap;align-items:flex-end;margin-top:10px}
.exrow label{font-size:11.5px;color:var(--ink-3);display:flex;align-items:center;gap:7px}
.exrow label.grow{flex:1;min-width:230px}
.exrow input,.exrow select{
  font-family:inherit;font-size:13px;padding:6px 10px;border:1px solid var(--line);
  border-radius:var(--r-sm);outline:none;background:var(--surface);color:var(--ink);
}
.exrow input[type="number"]{width:74px}
.exrow input:focus,.exrow select:focus{border-color:var(--brand);box-shadow:0 0 0 3px rgba(13,148,136,.12)}

/* 讲解稿：要点做成编号段，念到第几点一眼看得见 */
.ai-pt{padding:10px 0;border-top:1px dashed var(--line-2)}
.ai-pt:first-of-type{border-top:0;padding-top:2px}
.ai-pt-h{display:flex;align-items:center;gap:8px;margin-bottom:6px}
.ai-pt-h b{font-size:12.5px;color:var(--ink-2)}
.ai-pt-n{
  flex:0 0 auto;width:18px;height:18px;border-radius:50%;background:var(--brand);color:#fff;
  font-size:11px;display:flex;align-items:center;justify-content:center;font-variant-numeric:tabular-nums;
}
.ai-pt-w{font-size:11.5px;color:var(--ink-4);margin-top:5px;line-height:1.65}

.ai-qa{padding:9px 0;border-top:1px dashed var(--line-2)}
.ai-qa:first-of-type{border-top:0;padding-top:2px}
.ai-qa-q{font-size:12.5px;color:var(--ink);font-weight:500;line-height:1.6}
.ai-qa-a{font-size:12.5px;color:var(--ink-2);margin-top:5px;line-height:1.75}


/* ================= 备注（健管师侧 · 认人用） =================
   平台昵称是「用户772685」这种，隔一天就认不出是谁；备注放微信昵称、怎么加上的这类线索。
   ⚠️ 只出现在工作台里（台账列表 / 详情抽屉 / 档案面板）——
      不进报告、不进用户端。改这里的地方要连带想一遍"会不会漏出去"。 */
.u-rmk{font-size:12px;color:var(--brand-2);line-height:1.6;word-break:break-all}
.u-rmk.none{color:var(--ink-4)}
/* 台账列表里限一行 + 省略号：备注是自由文本，写长了会把整行撑高、把表格挤乱。
   完整内容在 title 里，鼠标停一下就能看全。 */
.ledger .u-rmk{
  font-size:11.5px;font-weight:400;margin-top:2px;
  max-width:210px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.drawer .dh .meta.rmkrow .btn{margin-left:4px}
/* 档案面板里"不进报告"那句提示：比 fnote 更醒目一点，因为它是一条约束，
   不是说明 —— 健管师得先知道这句不会让居民看到。 */
.fld .fwarn{font-size:11.5px;color:var(--ink-3);margin-top:5px;line-height:1.6}

/* ---------- AI 润色：原稿 / 润色稿对照（2026-09-21） ---------- */
.polb{margin-top:12px;padding-top:12px;border-top:1px solid var(--line-2);max-width:1000px}
.poli{border:1px solid var(--line-2);border-radius:6px;margin-bottom:10px;overflow:hidden;background:var(--surface-2)}
.poli.on{border-color:var(--brand-2);box-shadow:0 0 0 1px var(--brand-2) inset}
.poli-h{display:flex;align-items:center;gap:10px;padding:8px 12px;background:var(--surface-2);font-size:12px;border-bottom:1px solid var(--line-2)}
.poli-h label{display:flex;align-items:center;gap:6px;cursor:pointer;font-weight:600}
.poli-id{margin-left:8px;font-family:Consolas,Monaco,monospace;font-size:11px;color:var(--ink-4)}
/* 「已手工改过」标记 —— 它吸掉左侧空白，右半边的 id 与「编辑」按钮就齐到右边了 */
.poli-ed{margin-left:auto;font-size:11px;color:var(--brand-2);background:var(--brand-soft,#eef3ff);
  border:1px solid var(--brand-2);border-radius:4px;padding:0 6px;line-height:16px}
/* ---------- 手工编辑框（2026-09-21） ---------- */
.poli-e{border-top:1px solid var(--line-2);background:var(--surface);padding:10px 12px}
.poli-e textarea{width:100%;box-sizing:border-box;min-height:66px;padding:9px 11px;font-size:12.5px;
  line-height:1.85;color:var(--ink);background:var(--surface-2);border:1px solid var(--line-2);
  border-radius:5px;resize:vertical;font-family:inherit}
.poli-e textarea:focus{outline:none;border-color:var(--brand-2)}
.poli-eh{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:8px}
.poli-eh .t{font-size:11.5px;color:var(--ink-4);line-height:1.7;flex:1 1 320px;min-width:0}
.poli-ee{margin-top:8px;font-size:12px;color:var(--red);background:var(--red-bg,#fdf1f0);
  border-radius:5px;padding:6px 10px;line-height:1.7}
.poli-c{display:grid;grid-template-columns:1fr 1fr}
.poli-c > div{padding:10px 12px;font-size:12.5px;line-height:1.85;word-break:break-word}
.poli-f{border-right:1px solid var(--line-2);color:var(--ink-3)}
.poli-t{color:var(--ink)}
.poli-c .k{display:block;font-size:11px;letter-spacing:.1em;color:var(--ink-4);margin-bottom:4px}
.poli-c b{color:var(--brand-2)}
.pol-act{display:flex;align-items:center;gap:10px;font-size:12px;color:var(--ink-3);padding-top:2px}
