/* ============================================================
   「个人全景工作台」· 样式
   品牌色卡取自官方 LOGO：
     奶油黄 #FFF8E7 · 亮黄 #FAE719 · 草绿 #8AD71E · 暖墨 #4A3F35
   设计语言：明亮、圆润、暖调，黄色为行动色，绿色为达成色。
   ============================================================ */

*{margin:0;padding:0;box-sizing:border-box;}
:root{
  /* —— 底色：暖奶油 —— */
  --bg:#FFFCF2; --card:#FFFFFF; --card-2:#FFFBF0;
  --line:#F1EAD8; --line-strong:#E2D9BE;
  /* —— 文字：品牌暖墨 —— */
  --ink:#2B2622; --ink-2:#5C5348; --ink-3:#948A79;
  /* —— 主色：品牌亮黄（浅底深字，保证对比度）—— */
  --brand:#FAE719; --brand-soft:#FFF7CC; --brand-line:#EFDF85;
  /* —— 品牌暖墨（深色强调 / 描边）—— */
  --brand-deep:#4A3F35; --brand-deep-soft:#F3EFE9;
  /* —— 次色：品牌草绿 —— */
  --grass:#8AD71E; --grass-soft:#F1FADF; --grass-line:#CBE89B;
  /* —— 语义色 —— */
  --warn:#C98A00; --warn-soft:#FFF6E0; --warn-line:#F0DCB0;
  --risk:#D6452F; --risk-soft:#FDEDEA; --risk-line:#F0C9C2;
  --ok:#5B9E0A; --ok-soft:#F1FADF; --ok-line:#CBE89B;
  --info:#2A7A9B; --info-soft:#EAF5FA; --info-line:#C4E1EC;
  --radius:16px; --radius-sm:11px;
  --sidebar:244px;
  --shadow:0 1px 2px rgba(74,63,53,.04), 0 4px 14px rgba(74,63,53,.05);
  --shadow-lg:0 12px 40px rgba(74,63,53,.14);
}
html,body{height:100%;}
body{
  background:var(--bg); color:var(--ink);
  font-family:-apple-system,BlinkMacSystemFont,"Segoe UI","PingFang SC","Hiragino Sans GB","Microsoft YaHei",sans-serif;
  font-size:14px; line-height:1.65; -webkit-font-smoothing:antialiased;
}
a{color:#8A6D00;text-decoration:none;}
button,input,select,textarea{font-family:inherit;font-size:inherit;color:inherit;}
::-webkit-scrollbar{width:9px;height:9px;}
::-webkit-scrollbar-thumb{background:#E2D9BE;border-radius:9px;}
::-webkit-scrollbar-thumb:hover{background:#CFC3A0;}

/* ============ 布局 ============ */
.app{display:flex;min-height:100vh;}
.sidebar{
  width:var(--sidebar);flex:0 0 var(--sidebar);
  background:linear-gradient(180deg,#FFFCF2 0%,#FFF8E7 100%);
  border-right:1px solid var(--line);
  display:flex;flex-direction:column;position:sticky;top:0;height:100vh;overflow-y:auto;
}
.brand{padding:18px 18px 15px;border-bottom:1px solid var(--line);}
.brand .logo{display:block;width:100%;max-width:196px;height:auto;}
.brand .nm{font-weight:800;font-size:15.5px;letter-spacing:-.02em;}
.brand .nm b{color:var(--brand-deep);background:linear-gradient(transparent 58%,var(--brand) 58%);padding:0 2px;}
.brand .sb{font-size:11.5px;color:var(--ink-3);letter-spacing:.1em;margin-top:7px;font-weight:700;}
.nav{padding:12px 10px 20px;flex:1;}
.nav .grp{font-size:11px;font-weight:800;letter-spacing:.12em;color:var(--ink-3);padding:15px 10px 6px;}
.nav a{
  display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:11px;color:var(--ink-2);
  font-weight:600;font-size:13.5px;cursor:pointer;transition:.14s;position:relative;
}
.nav a:hover{background:#FFF6CC;color:var(--brand-deep);}
.nav a.on{background:var(--brand);color:#3A3218;font-weight:700;box-shadow:0 2px 8px rgba(250,231,25,.5);}
.nav a .ic{width:16px;text-align:center;font-size:13px;opacity:.85;}
.nav a .badge-n{margin-left:auto;background:var(--brand-deep);color:#fff;font-size:10.5px;font-weight:800;padding:1px 6px;border-radius:99px;}
.nav a .badge-n.r{background:var(--risk);}
.side-foot{padding:12px 16px;border-top:1px solid var(--line);font-size:11.5px;color:var(--ink-3);}

/* ===== 双区切换（v2.16）=====
   品牌下方的「生活｜工作」分段控件：侧栏顶部一眼可见，切区不跳页。
   折叠态下区名仍是完整的「作用词」，收起手机侧栏也看得见自己是哪个区。 */
.zone-seg{display:flex;gap:3px;margin:12px 14px 2px;padding:3px;background:#F5EFE0;border-radius:11px;}
.zone-seg button{flex:1;appearance:none;border:none;background:none;padding:7px 0;border-radius:9px;
  cursor:pointer;font-weight:800;font-size:13px;letter-spacing:.08em;color:var(--ink-2);transition:.14s;}
.zone-seg button:hover{color:var(--brand-deep);}
.zone-seg button.on{background:var(--brand);color:#3A3218;box-shadow:0 1px 4px rgba(250,231,25,.55);}
/* 非当前区的组与入口整段收走。!important 要留着 —— admin 的「账号/登录日志」靠内联
   display:'' 显隐，普通优先级压不过它，zone-off 会失效。 */
.nav .zone-off,.tabbar .zone-off{display:none!important;}

/* ===== 内联 SVG 图标（icons.js）=====
   v2.12 把功能性 emoji 与侧栏几何符号换成内联 SVG。换完必须守住三件事：
     1) **宽度不变** —— 侧栏收起/展开的布局不能因为换图标而漂（.ic 仍是定宽容器）
     2) **垂直居中** —— SVG 默认按基线对齐，直接塞进去会往下掉一截
     3) **跟随 currentColor** —— 这正是换 SVG 的意义：`.nav a.on` / `.mk.y` 这些状态色
        能直接作用到图标上（emoji 是固定色，做不到） */
svg.ico{display:inline-block;vertical-align:-.16em;flex:0 0 auto}
.nav a .ic,.tabbar a .ic,.ng-ic{display:inline-flex;align-items:center;justify-content:center}
.nav a .ic{height:16px}
.tabbar a .ic{height:20px}
.ng-ic{width:20px;height:20px}
.search .si{display:flex;align-items:center}
button[data-icon],.bell span[data-icon],.fab span[data-icon]{display:inline-flex;align-items:center;justify-content:center}
.empty .big svg{display:block;margin:0 auto}
.row-i .mk svg,.mk svg{display:block}

.main{flex:1;min-width:0;display:flex;flex-direction:column;}
.topbar{
  height:58px;flex:0 0 58px;background:rgba(255,252,242,.9);backdrop-filter:blur(10px);
  border-bottom:1px solid var(--line);display:flex;align-items:center;gap:14px;
  padding:0 22px;position:sticky;top:0;z-index:40;
}
.topbar .crumb{font-weight:800;font-size:15.5px;letter-spacing:-.01em;color:var(--brand-deep);}
.topbar .sp{flex:1;}

/* ============ 全局搜索 ============ */
.search{position:relative;flex:0 1 300px;min-width:130px;}
.search .si{position:absolute;left:10px;top:50%;transform:translateY(-50%);color:var(--ink-3);
  font-size:14px;pointer-events:none;line-height:1;}
.search input{width:100%;padding:7px 12px 7px 29px;border-radius:10px;border:1px solid var(--line-strong);
  background:var(--card);font-size:13px;font-family:inherit;color:var(--ink);transition:.15s;}
.search input::placeholder{color:var(--ink-3);}
.search input:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}
.search-res{position:absolute;top:calc(100% + 7px);left:0;right:0;background:var(--card);
  border:1px solid var(--line-strong);border-radius:13px;box-shadow:0 14px 34px rgba(74,63,53,.18);
  max-height:min(62vh,420px);overflow:auto;z-index:60;display:none;}
.search-res.on{display:block;}
/* 结果按条给分类徽标，不做分组标题 —— 所以没有 .sr-head */
.sr-item{display:flex;align-items:center;gap:9px;padding:9px 12px;cursor:pointer;
  border-bottom:1px dashed var(--line);}
.sr-item:last-child{border-bottom:none;}
.sr-item.on,.sr-item:hover{background:var(--brand-soft);}
.sr-k{flex:0 0 auto;font-size:10.5px;font-weight:800;color:var(--brand-deep);
  background:var(--brand-deep-soft);border-radius:6px;padding:2px 6px;letter-spacing:.02em;}
.sr-t{flex:1;min-width:0;font-size:13px;font-weight:700;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;color:var(--ink);}
.sr-t em{background:var(--brand);color:#3A3218;font-style:normal;border-radius:3px;padding:0 1px;}
.sr-s{flex:0 0 auto;font-size:11px;color:var(--ink-3);}
.sr-empty{padding:20px 12px;text-align:center;color:var(--ink-3);font-size:12.5px;line-height:1.7;}
.sr-foot{padding:6px 12px;font-size:10.5px;color:var(--ink-3);background:var(--card-2);
  border-top:1px solid var(--line);display:flex;gap:10px;}
.sr-foot b{font-weight:700;color:var(--ink-2);}
.bell{position:relative;width:36px;height:36px;border-radius:11px;border:1px solid var(--line-strong);background:#fff;
  cursor:pointer;display:grid;place-items:center;font-size:15px;transition:.14s;}
.bell:hover{border-color:var(--brand);background:var(--brand-soft);}
.bell .dotn{position:absolute;top:-5px;right:-5px;background:var(--risk);color:#fff;font-size:10px;font-weight:800;
  min-width:17px;height:17px;border-radius:99px;display:grid;place-items:center;padding:0 4px;}
.me{display:flex;align-items:center;gap:8px;cursor:pointer;padding:4px 8px;border-radius:11px;transition:.14s;}
.me:hover{background:#FFF6CC;}
/* 头像：统一的猫头标记，靠描边色区分人 */
.avatar{
  width:30px;height:30px;border-radius:11px;background:#FFFDF6;
  border:2.5px solid var(--av,#4A3F35);
  display:grid;place-items:center;flex:0 0 auto;overflow:hidden;padding:1.5px;box-sizing:border-box;
}
.avatar img{width:100%;height:100%;object-fit:contain;display:block;}
.avatar.sm{width:23px;height:23px;border-radius:8px;border-width:2px;padding:1px;}
.avatar.lg{width:44px;height:44px;border-radius:14px;border-width:3px;padding:2.5px;}
.avatar.xl{width:64px;height:64px;border-radius:20px;border-width:3.5px;padding:3.5px;}
.role-tag{font-size:10.5px;font-weight:800;letter-spacing:.05em;padding:1.5px 7px;border-radius:6px;
  background:var(--brand-soft);color:#8A6D00;}
.role-tag.lead{background:var(--grass-soft);color:#4C8608;}
.role-tag.member{background:var(--brand-deep-soft);color:var(--ink-2);}

.page{padding:24px 26px 90px;max-width:1420px;width:100%;}
.ph{margin-bottom:20px;}
.ph h1{font-size:23px;font-weight:800;letter-spacing:-.02em;color:var(--brand-deep);}
.ph .d{color:var(--ink-3);font-size:13px;margin-top:5px;}
.ph-row{display:flex;align-items:flex-start;gap:14px;}
.ph-row .sp{flex:1;}

/* ============ 基础元件 ============ */
.btn{
  appearance:none;border:1px solid var(--line-strong);background:#fff;color:var(--ink);
  padding:6px 13px;border-radius:11px;cursor:pointer;font-weight:700;font-size:13px;transition:.15s;white-space:nowrap;
}
.btn:hover{border-color:var(--brand-line);background:var(--brand-soft);}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#3A3218;}
.btn.primary:hover{background:#EFD900;border-color:#EFD900;color:#3A3218;}
.btn.dark{background:var(--brand-deep);border-color:var(--brand-deep);color:#FFF8E7;}
.btn.dark:hover{background:#3B322A;border-color:#3B322A;color:#FFF8E7;}
.btn.danger{color:var(--risk);border-color:var(--risk-line);}
.btn.danger:hover{background:var(--risk-soft);border-color:var(--risk-line);}
.btn.ghost{border-color:transparent;background:transparent;}
.btn.ghost:hover{background:var(--brand-soft);color:var(--brand-deep);}
.btn.sm{padding:4px 10px;font-size:12px;border-radius:9px;}
.btn.xs{padding:2px 8px;font-size:11.5px;border-radius:7px;}
.btn:disabled{opacity:.45;cursor:not-allowed;}
.btn.on{background:var(--brand);border-color:var(--brand);color:#3A3218;}

.panel{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:20px 22px;box-shadow:var(--shadow);}
.panel+.panel{margin-top:14px;}
.panel h3{font-size:12px;font-weight:800;letter-spacing:.08em;color:var(--ink-3);
  margin-bottom:14px;display:flex;align-items:center;gap:8px;}
.panel h3 .tally{margin-left:auto;font-size:12px;font-weight:700;letter-spacing:0;color:var(--ink-2);}
.panel h3 .tally.alert{color:var(--risk);}

.grid2{display:grid;grid-template-columns:1fr 1fr;gap:14px;}
.grid3{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;}
.grid4{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;}
.grid-auto{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:14px;}

.callout{background:var(--card);border:1px solid var(--line);border-left:4px solid var(--brand);
  border-radius:12px;padding:15px 19px;font-size:13.5px;margin-top:14px;}
.callout.w{border-left-color:var(--warn);background:var(--warn-soft);border-color:var(--warn-line);}
.callout.r{border-left-color:var(--risk);background:var(--risk-soft);border-color:var(--risk-line);}
.callout.g{border-left-color:var(--ok);background:var(--ok-soft);border-color:var(--ok-line);}

.tag{display:inline-flex;align-items:center;gap:4px;font-size:11px;font-weight:700;padding:2px 8px;border-radius:7px;
  background:var(--brand-deep-soft);color:var(--ink-2);white-space:nowrap;}
.tag.purple{background:var(--brand-soft);color:#8A6D00;}
.tag.blue{background:var(--info-soft);color:var(--info);}
.tag.amber{background:var(--warn-soft);color:var(--warn);}
.tag.red{background:var(--risk-soft);color:var(--risk);}
.tag.green{background:var(--ok-soft);color:var(--ok);}
.tag.gray{background:var(--brand-deep-soft);color:var(--ink-2);}
.tag.yellow{background:var(--brand);color:#3A3218;}
.tag.lime{background:var(--grass);color:#2F4D06;}
.dot-i{width:7px;height:7px;border-radius:50%;flex:0 0 auto;}

.muted{color:var(--ink-3);}
.t-bad{color:var(--risk);}
.small{font-size:12.5px;}
.mono{font-family:ui-monospace,Menlo,Consolas,monospace;}
.nowrap{white-space:nowrap;}
.right{text-align:right;}
.center{text-align:center;}
.empty{padding:34px 10px;text-align:center;color:var(--ink-3);font-size:13px;}
.empty .big{font-size:26px;margin-bottom:8px;opacity:.4;}

/* 表单 */
.fld{margin-bottom:13px;}
.fld label{display:block;font-size:12px;font-weight:700;color:var(--ink-2);margin-bottom:5px;letter-spacing:.02em;}
.fld input,.fld select,.fld textarea{
  width:100%;padding:9px 12px;border:1px solid var(--line-strong);border-radius:11px;background:#fff;outline:none;transition:.14s;
}
.fld input:focus,.fld select:focus,.fld textarea:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}
.fld textarea{resize:vertical;min-height:74px;line-height:1.6;}
.fld .hint{font-size:11.5px;color:var(--ink-3);margin-top:4px;}
.fld2{display:grid;grid-template-columns:1fr 1fr;gap:11px;}
.fld3{display:grid;grid-template-columns:repeat(3,1fr);gap:11px;}
.msg{font-size:12.5px;margin:8px 0;min-height:0;}
.msg.on{padding:7px 11px;border-radius:9px;}
.msg.ok{background:var(--ok-soft);color:var(--ok);}
.msg.err{background:var(--risk-soft);color:var(--risk);}

/* ============ 表格 ============ */
table.tb{width:100%;border-collapse:collapse;font-size:13.5px;}
table.tb th{text-align:left;font-size:11px;letter-spacing:.07em;color:var(--ink-3);
  font-weight:800;padding:0 12px 9px 0;border-bottom:1px solid var(--line);white-space:nowrap;}
table.tb td{padding:11px 12px 11px 0;border-bottom:1px solid var(--line);vertical-align:middle;}
table.tb tr:last-child td{border-bottom:none;}
table.tb tbody tr:hover{background:#FFFBF0;}
table.tb td.num{text-align:right;font-variant-numeric:tabular-nums;white-space:nowrap;}

/* ============ 首页 ============ */
.stat-row{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:16px;}
/* min-width:0 是关键：1fr 默认为 minmax(auto,1fr)，卡在内容的最小宽度上；
   全景总览「这一周」的备注里一旦出现长串（金额浮点噪声），
   卡片就再也收不下去，整页跟着横向滚动（实测 390px 视口溢出 309px）。 */
.stat{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:15px 17px;cursor:pointer;transition:.15s;box-shadow:var(--shadow);min-width:0;}
.stat:hover{border-color:var(--brand-line);transform:translateY(-2px);}
.stat .k{font-size:12px;color:var(--ink-3);font-weight:700;}
/* 字号跟着视口收缩 —— 三列统计卡在 390px 下每格只有 ~80px 宽，
   25px 的数字放不下「¥5,515」，会被 overflow-wrap 从中间断成两行。
   用 clamp 让窄屏自己变小，而不是靠断行硬塞。 */
.stat .v{font-size:clamp(17px,5.2vw,25px);font-weight:800;margin-top:5px;letter-spacing:-.02em;font-variant-numeric:tabular-nums;color:var(--brand-deep);}
.stat .n{font-size:11.5px;color:var(--ink-3);margin-top:1px;}
.stat .k,.stat .v,.stat .n{overflow-wrap:anywhere;}
/* 卡片状态色：必须用 st- 前缀。
   ⚠ 别改回 .stat.risk —— .risk 在下面被「风险队列」组件占用了
   （.risk{display:flex;gap:13px;...}），同优先级下后出现的会赢，
   卡片会被抢成横向 flex、内容压成三窄列。见 statCard() 的注释。 */
.stat.st-warn .v{color:var(--warn);}
.stat.st-risk .v{color:var(--risk);}
.stat.st-ok .v{color:var(--ok);}

/* 「今日看点」卡片 —— 沿用 AI 卡样式，改为品牌黄渐变 */
.ai-card{background:linear-gradient(135deg,#FFF8E7 0%,#FFFBE9 55%,#F6FCE4 100%);
  border:1px solid var(--brand-line);
  border-radius:var(--radius);padding:18px 20px;margin-bottom:16px;}
.ai-card .hd{display:flex;align-items:center;gap:9px;font-weight:800;font-size:13px;color:var(--brand-deep);margin-bottom:10px;}
.ai-card .hd .cat{width:20px;height:20px;object-fit:contain;}
.ai-card .bd{font-size:13.5px;line-height:1.75;color:var(--ink);white-space:pre-wrap;}
.ai-card .bd .cur{display:inline-block;width:7px;height:14px;background:var(--brand-deep);vertical-align:-2px;animation:bl 1s steps(2) infinite;}
@keyframes bl{50%{opacity:0;}}

/* ============ 看板 ============ */
.board{display:grid;grid-template-columns:repeat(4,1fr);gap:13px;align-items:start;}
.col{background:#FBF7EA;border:1px solid var(--line);border-radius:var(--radius);padding:11px;min-height:150px;}
.col.drag-over{background:var(--brand-soft);border-color:var(--brand);}
.col-hd{display:flex;align-items:center;gap:8px;padding:2px 4px 10px;font-weight:800;font-size:13px;color:var(--brand-deep);}
.col-hd .cnt{margin-left:auto;font-size:11.5px;color:var(--ink-2);font-weight:800;
  background:#fff;border-radius:99px;padding:1px 8px;border:1px solid var(--line-strong);}
.tcard{background:#fff;border:1px solid var(--line);border-radius:13px;padding:11px 12px;margin-bottom:9px;
  cursor:grab;transition:.14s;border-left:4px solid var(--line-strong);box-shadow:0 1px 3px rgba(74,63,53,.04);}
.tcard:hover{border-color:var(--brand-line);box-shadow:0 4px 14px rgba(74,63,53,.09);transform:translateY(-1px);}
.tcard.dragging{opacity:.4;}
.tcard .tid{font-size:11px;font-weight:800;color:var(--ink-3);letter-spacing:.03em;font-family:ui-monospace,Menlo,Consolas,monospace;}
.tcard .tt{font-size:13.5px;font-weight:600;margin:4px 0 7px;line-height:1.5;}
.tcard.done .tt{text-decoration:line-through;color:var(--ink-3);}
.tcard .mt{display:flex;align-items:center;gap:6px;flex-wrap:wrap;font-size:11.5px;color:var(--ink-3);}
.tcard .mt .sp{flex:1;}
.tcard .tprog{height:4px;background:#F1EAD8;border-radius:99px;margin-top:8px;overflow:hidden;}
.tcard .tprog i{display:block;height:100%;background:var(--grass);border-radius:99px;}

/* 列表视图 */
.trow{display:flex;align-items:center;gap:12px;padding:10px 12px;border-bottom:1px solid var(--line);cursor:pointer;transition:.12s;}
.trow:hover{background:#FFFBF0;}
.trow:last-child{border-bottom:none;}
.trow .tid{font-size:11.5px;font-weight:800;color:var(--ink-3);width:74px;flex:0 0 74px;font-family:ui-monospace,Menlo,Consolas,monospace;}
.trow .tt{flex:1;min-width:0;font-weight:600;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.trow.done .tt{text-decoration:line-through;color:var(--ink-3);}
.trow .cb{flex:0 0 auto;}

/* 筛选条 */
.filters{display:flex;gap:9px;flex-wrap:wrap;align-items:center;margin-bottom:14px;}
.filters select,.filters input{padding:7px 11px;border:1px solid var(--line-strong);border-radius:11px;background:#fff;font-size:12.5px;outline:none;}
.filters select:focus,.filters input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}
/* flex-wrap:wrap —— 生活页现在有 7 个分段（今天/待办/日子/打卡/钱/健康/关于我），
   390px 视口下不换行会直接撑出横向滚动。按钮少的页面不受影响。 */
.seg{display:inline-flex;flex-wrap:wrap;background:#F5EFE0;border-radius:11px;padding:3px;}
.seg button{appearance:none;border:none;background:none;padding:5px 14px;border-radius:9px;cursor:pointer;font-weight:700;font-size:12.5px;color:var(--ink-2);}
.seg button.on{background:var(--brand);color:#3A3218;box-shadow:0 1px 4px rgba(250,231,25,.55);}

/* ============ 甘特 / 时间轴 ============ */
.gantt{overflow-x:auto;border:1px solid var(--line);border-radius:var(--radius);background:#fff;}
.gantt-in{min-width:900px;}
.g-head{display:flex;position:sticky;top:0;background:#FFFBF0;border-bottom:1px solid var(--line);z-index:2;}
.g-label{width:300px;flex:0 0 300px;padding:9px 14px;font-size:11px;font-weight:800;color:var(--ink-3);
  letter-spacing:.07em;border-right:1px solid var(--line);}
.g-days{display:flex;flex:1;position:relative;}
.g-day{flex:1;min-width:26px;text-align:center;font-size:10.5px;color:var(--ink-3);padding:9px 0;border-right:1px solid #F7F2E4;}
.g-day.we{background:#FBF7EA;}
.g-day .mm{display:block;font-size:9.5px;color:#BDB29B;}
.g-row{display:flex;border-bottom:1px solid var(--line);align-items:center;}
.g-row:last-child{border-bottom:none;}
.g-row .g-label{border-right:1px solid var(--line);padding:7px 14px;font-size:12.5px;font-weight:600;
  color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.g-track{flex:1;position:relative;height:34px;}
.g-bar{position:absolute;top:7px;height:20px;border-radius:8px;background:var(--brand);opacity:.95;
  display:flex;align-items:center;padding:0 8px;font-size:10.5px;color:#3A3218;font-weight:800;white-space:nowrap;cursor:pointer;}
.g-bar.done{background:var(--grass);color:#2F4D06;}
.g-bar.late{background:var(--risk);color:#fff;}
.g-bar.blocked{background:#CFC7B8;color:#4A3F35;}
.g-dep{position:absolute;height:2px;background:var(--risk);opacity:.32;top:16px;}
.g-today{position:absolute;top:0;bottom:0;width:2px;background:var(--brand-deep);opacity:.45;z-index:1;}

/* ============ 任务详情抽屉 ============ */
.drawer-mask{position:fixed;inset:0;background:rgba(43,38,34,.34);z-index:60;display:none;}
.drawer-mask.on{display:block;}
.drawer{position:fixed;top:0;right:0;bottom:0;width:min(680px,94vw);background:#fff;z-index:61;
  transform:translateX(102%);transition:transform .24s cubic-bezier(.4,0,.2,1);display:flex;flex-direction:column;
  box-shadow:-10px 0 40px rgba(74,63,53,.16);}
.drawer.on{transform:translateX(0);}
.drawer-hd{padding:17px 22px;border-bottom:1px solid var(--line);display:flex;align-items:flex-start;gap:12px;
  background:linear-gradient(135deg,#FFFCF2 0%,#FFF8E7 100%);}
.drawer-hd .x{margin-left:auto;font-size:19px;cursor:pointer;color:var(--ink-3);line-height:1;padding:2px 8px;border-radius:9px;}
.drawer-hd .x:hover{background:var(--brand-soft);color:var(--brand-deep);}
.drawer-bd{flex:1;overflow-y:auto;padding:20px 22px 40px;}
.drawer-ft{padding:13px 22px;border-top:1px solid var(--line);display:flex;gap:9px;align-items:center;background:#FFFBF0;}
.dsec{margin-bottom:22px;}
.dsec .dt{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ink-3);margin-bottom:9px;}
.kv-grid{display:grid;grid-template-columns:110px 1fr;gap:8px 12px;font-size:13px;}
.kv-grid .k{color:var(--ink-3);font-weight:700;}
.chk{display:flex;align-items:flex-start;gap:9px;padding:6px 0;font-size:13.5px;}
.chk input{margin-top:4px;flex:0 0 auto;accent-color:var(--grass);}
.chk.done span{text-decoration:line-through;color:var(--ink-3);}
.dep-pill{display:inline-flex;align-items:center;gap:5px;font-size:11.5px;font-weight:700;padding:3px 9px;border-radius:8px;
  background:var(--brand-deep-soft);color:var(--ink-2);margin:0 5px 5px 0;cursor:pointer;}
.dep-pill.pending{background:var(--risk-soft);color:var(--risk);}
.dep-pill.ok{background:var(--ok-soft);color:var(--ok);}

/* 评论时间线 */
.cm-list{display:flex;flex-direction:column;gap:13px;}
.cm{display:flex;gap:10px;}
.cm .bd{flex:1;min-width:0;}
.cm .hd{display:flex;align-items:baseline;gap:8px;font-size:12.5px;}
.cm .hd .nm{font-weight:800;color:var(--brand-deep);}
.cm .hd .ts{color:var(--ink-3);font-size:11.5px;}
.cm .tx{font-size:13.5px;margin-top:2px;white-space:pre-wrap;word-break:break-word;}
.cm .tx .am{color:#7A6000;font-weight:800;background:var(--brand-soft);padding:0 4px;border-radius:5px;}
.cm.sys .tx{color:var(--ink-2);font-size:13px;}

/* ============ 弹窗 ============ */
.mask{position:fixed;inset:0;background:rgba(43,38,34,.34);z-index:70;display:none;overflow-y:auto;padding:40px 16px;}
.mask.on{display:block;}
.modal{background:#fff;border-radius:20px;max-width:640px;margin:0 auto;padding:24px 26px;
  box-shadow:var(--shadow-lg);}
.modal.wide{max-width:880px;}
.modal.narrow{max-width:440px;}
.modal h3{font-size:17px;font-weight:800;margin-bottom:5px;color:var(--brand-deep);}
.modal .hint{font-size:12.5px;color:var(--ink-3);margin-bottom:18px;}
.modal .foot{display:flex;gap:9px;justify-content:flex-end;margin-top:20px;align-items:center;}
.modal .foot .sp{margin-right:auto;}

/* 通知面板 */
.notif-panel{position:fixed;top:62px;right:20px;width:390px;max-height:calc(100vh - 94px);overflow-y:auto;
  background:#fff;border:1px solid var(--line);border-radius:16px;z-index:65;display:none;
  box-shadow:var(--shadow-lg);}
.notif-panel.on{display:block;}
.notif-panel .hd{padding:14px 17px;border-bottom:1px solid var(--line);display:flex;align-items:center;gap:9px;
  font-weight:800;font-size:13.5px;position:sticky;top:0;background:linear-gradient(135deg,#FFFCF2,#FFF8E7);border-radius:16px 16px 0 0;color:var(--brand-deep);}
.notif-item{padding:11px 17px;border-bottom:1px solid var(--line);font-size:13px;cursor:pointer;display:flex;gap:9px;}
.notif-item:hover{background:#FFFBF0;}
.notif-item.unread{background:#FFFDF2;}
.notif-item .nd{width:7px;height:7px;border-radius:50%;background:var(--brand-deep);flex:0 0 auto;margin-top:7px;}
.notif-item.read .nd{background:transparent;}
.notif-item .ttl{font-weight:700;}
.notif-item .bd2{color:var(--ink-3);font-size:12px;margin-top:2px;}
.notif-item .ts2{color:var(--ink-3);font-size:11px;margin-top:3px;}

/* ============ 模块卡 ============ */
.mod-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:17px 19px;cursor:pointer;transition:.15s;
  border-top:4px solid var(--brand);box-shadow:var(--shadow);}
.mod-card:hover{box-shadow:0 6px 22px rgba(74,63,53,.12);transform:translateY(-2px);}
.mod-card .mh{display:flex;align-items:center;gap:9px;margin-bottom:9px;}
.mod-card .mn{font-weight:800;font-size:15px;color:var(--brand-deep);}
.mod-card .mg{font-size:12.5px;color:var(--ink-2);line-height:1.6;min-height:40px;}
.mod-card .ms{display:flex;align-items:center;gap:9px;margin-top:13px;font-size:12px;color:var(--ink-3);}
.mod-card .pbar{height:7px;background:#F5EFE0;border-radius:99px;overflow:hidden;margin-top:11px;}
.mod-card .pbar i{display:block;height:100%;border-radius:99px;transition:.3s;}

/* ============ 目标树 ============ */
.goal-q{background:linear-gradient(135deg,#FFF8E7 0%,#FFFBE9 55%,#F6FCE4 100%);border:1px solid var(--brand-line);
  border-radius:var(--radius);padding:20px 22px;margin-bottom:16px;}
.goal-q .lv{font-size:11px;font-weight:800;letter-spacing:.12em;color:#8A6D00;}
.goal-q .tt{font-size:19px;font-weight:800;margin-top:7px;letter-spacing:-.01em;color:var(--brand-deep);}
.goal-q .mt{color:var(--ink-2);font-size:13px;margin-top:6px;}
.goal-m{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:16px 18px;border-left:4px solid var(--grass);box-shadow:var(--shadow);}
.goal-m .tt{font-weight:800;font-size:14px;margin-bottom:7px;color:var(--brand-deep);}
.goal-m .li{font-size:12.5px;color:var(--ink-2);display:flex;gap:8px;padding:3px 0;}
.goal-m .li .k{color:var(--ink-3);width:52px;flex:0 0 52px;font-weight:700;}

/* ============ 里程碑 / 风险 / 台账 ============ */
.tl{position:relative;padding-left:26px;}
.tl:before{content:'';position:absolute;left:7px;top:6px;bottom:6px;width:2px;background:var(--line-strong);}
.ms{position:relative;padding:0 0 20px;}
.ms:last-child{padding-bottom:0;}
.ms:before{content:'';position:absolute;left:-24px;top:5px;width:13px;height:13px;border-radius:50%;
  background:#fff;border:3px solid var(--brand);}
.ms.done:before{background:var(--grass);border-color:var(--grass);}
.ms.warn:before{background:var(--warn);border-color:var(--warn);}
.ms .d{font-size:12px;font-weight:800;color:#8A6D00;letter-spacing:.03em;}
.ms .t{font-weight:800;font-size:14.5px;margin-top:2px;color:var(--brand-deep);}
.ms .x{color:var(--ink-2);font-size:13px;margin-top:3px;}

.risk{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:16px 19px;
  display:flex;gap:13px;margin-bottom:11px;box-shadow:var(--shadow);}
.risk .lv{flex:0 0 27px;height:27px;border-radius:9px;display:grid;place-items:center;font-size:11.5px;font-weight:800;color:#fff;}
.risk .lv.h{background:var(--risk);} .risk .lv.m{background:var(--warn);} .risk .lv.l{background:#A79C88;}
.risk .rt{font-weight:800;font-size:14.5px;color:var(--brand-deep);}
.risk .rd{color:var(--ink-2);font-size:13px;margin-top:5px;}
.risk .fix{background:#FFFBF0;border-radius:11px;padding:10px 13px;font-size:12.5px;margin-top:9px;color:var(--ink-2);}

/* ============ 条目的操作按钮组 ============
   默认压低透明度，hover 才显眼 —— 否则满屏按钮会盖住内容本身 */
.row-act{display:inline-flex;gap:5px;align-items:center;}
.row-act.col{flex-direction:column;gap:4px;}
.row-act .btn{opacity:.58;transition:opacity .15s;}
.row-act .btn:hover,.row-act .btn:focus-visible{opacity:1;}

.ms > .d{display:flex;align-items:center;gap:6px;flex-wrap:wrap;}
.ms > .d .row-act{margin-left:auto;}
.risk .meta{font-size:11.5px;color:var(--ink-3);margin-top:7px;display:flex;align-items:center;gap:8px;}
.risk .meta .row-act{margin-left:auto;}

/* 已关闭风险：折叠收纳，不占版面 */
.closed-box{margin-top:15px;border-top:1px dashed var(--line);padding-top:8px;}
.closed-box summary{cursor:pointer;font-size:12.5px;font-weight:700;color:var(--ink-3);padding:5px 0;list-style:none;}
.closed-box summary::-webkit-details-marker{display:none;}
.closed-box summary:before{content:'▸';display:inline-block;width:14px;transition:transform .18s;}
.closed-box[open] summary:before{transform:rotate(90deg);}
.closed-box .row-i{padding:9px 0;}

/* 空态里的行动入口 —— 空页不能是死胡同 */
.empty-act{display:flex;flex-direction:column;align-items:center;gap:9px;padding:0 20px 18px;}
.ea-t{font-size:14px;font-weight:800;color:var(--ink);}
.ea-d{font-size:12.5px;color:var(--ink-3);line-height:1.7;max-width:540px;text-align:center;}

/* ============ 周报 ============ */
.rep-g{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:800;color:var(--brand-deep);
  margin:14px 0 2px;padding:5px 10px;background:var(--brand-deep-soft);border-radius:8px;}
.rep-g:first-of-type{margin-top:4px;}
.rep-g .n{margin-left:auto;font-size:11px;color:var(--ink-3);font-weight:700;}
.rep-out{width:100%;border:1px solid var(--line-strong);border-radius:12px;padding:13px 15px;
  font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;line-height:1.85;
  color:var(--ink-2);background:var(--card-2);resize:vertical;box-sizing:border-box;}
.rep-out:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}

/* ============ 工时复盘（预估 vs 实际） ============ */
.kpi .v .u{font-size:13px;font-weight:700;margin-left:2px;color:var(--ink-3);}
/* 注意：JS 产出的是 class="v dev bad|good"，所以这里必须写 .v.bad 而不是 .v.dev-bad */
.kpi .v.bad{color:var(--risk);}
.kpi .v.good{color:var(--ok);}
/* 分组汇总表：右侧四列数字用等宽数字对齐，扫一眼就能比出高低 */
.hrev{margin-top:14px;border:1px solid var(--line);border-radius:12px;overflow:hidden;background:#fff;}
.hrev .hr-h,.hrev .hr-r{display:grid;grid-template-columns:minmax(0,1fr) 58px 74px 74px 70px;gap:8px;
  align-items:center;padding:9px 14px;font-size:12.5px;}
.hrev .hr-h{background:var(--brand-deep-soft);font-weight:800;font-size:11.5px;
  color:var(--brand-deep);letter-spacing:.02em;}
.hrev .hr-r{border-top:1px solid var(--line);}
.hrev .hr-r .hr-k{font-weight:700;color:var(--brand-deep);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.hrev .hr-r span:not(.hr-k){text-align:right;color:var(--ink-2);font-variant-numeric:tabular-nums;}
.hrev .hr-r .dev{font-weight:800;}
.dev.bad{color:var(--risk);} .dev.good{color:var(--ok);}
/* 「超出预估 / 低于预估」小标签 —— 比圆形箭头徽标好认 */
.dev-tag{flex:0 0 auto;font-size:10.5px;font-weight:800;letter-spacing:.02em;
  padding:3px 8px;border-radius:99px;white-space:nowrap;}
.dev-tag.over{background:var(--risk-soft);color:var(--risk);}
.dev-tag.under{background:var(--ok-soft);color:var(--ok);}
h4.sub-h{font-size:12.5px;font-weight:800;color:var(--ink-3);margin:18px 0 6px;letter-spacing:.02em;}

/* ============ 业务项目 ============ */
.pgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(320px,1fr));gap:14px;}
.pcard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:16px 17px;
  cursor:pointer;transition:.15s;box-shadow:var(--shadow);}
.pcard:hover{border-color:var(--brand-line);transform:translateY(-1px);box-shadow:var(--shadow-lg);}
.pcard.off{opacity:.62;}
.pc-top{display:flex;align-items:flex-start;gap:9px;}
.pc-name{flex:1;font-size:14.5px;font-weight:800;color:var(--ink);line-height:1.45;}
.pc-brief{font-size:12px;color:var(--ink-3);margin-top:6px;line-height:1.6;}
.pc-bar{height:6px;border-radius:99px;background:var(--brand-deep-soft);margin:13px 0 7px;overflow:hidden;}
.pc-bar i{display:block;height:100%;background:var(--grass);border-radius:99px;transition:.3s;}
.pc-num{font-size:12px;color:var(--ink-3);}
.pc-num b{color:var(--ink);font-size:13.5px;}
.pc-flags{display:flex;flex-wrap:wrap;gap:5px;margin-top:10px;}
.pc-foot{display:flex;flex-wrap:wrap;gap:12px;margin-top:11px;padding-top:10px;border-top:1px solid var(--line);
  font-size:11.5px;color:var(--ink-3);}

.pd-top{display:flex;align-items:flex-start;gap:11px;}
.pd-top h2{flex:1;font-size:18px;font-weight:800;color:var(--ink);line-height:1.4;}
.pd-brief{font-size:13px;color:var(--ink-2);margin-top:8px;line-height:1.7;}
.pd-meta{display:flex;flex-wrap:wrap;gap:8px 22px;margin-top:14px;font-size:12.5px;color:var(--ink-2);}
.pd-meta b{color:var(--ink-3);font-weight:700;margin-right:6px;font-size:11.5px;}
.pd-list{padding:6px 8px;}
.pd-list .row-i{padding:9px 8px;border-radius:10px;}
.pd-list .row-i:hover{background:var(--card-2);}

/* 概览页的迷你项目卡 */
.pmini{display:grid;grid-template-columns:repeat(auto-fill,minmax(240px,1fr));gap:12px;}
.pm{border:1px solid var(--line);border-radius:var(--radius-sm);padding:12px 13px;
  cursor:pointer;transition:.14s;background:var(--card);}
.pm:hover{border-color:var(--brand-line);background:var(--card-2);}
.pm-h{display:flex;align-items:flex-start;gap:8px;margin-bottom:9px;}
.pm-n{flex:1;font-size:12.5px;font-weight:800;color:var(--ink);line-height:1.45;}
.pm .pc-bar{margin:0;}
.pm-f{font-size:11.5px;color:var(--ink-3);margin-top:6px;}
.pm-f .rd{color:var(--risk);font-weight:700;}

/* ============ 资料库：先记一笔 ============ */
.note-in{background:var(--card);border:1px solid var(--line-strong);border-radius:var(--radius);
  padding:13px 14px;box-shadow:var(--shadow);}
.note-in textarea{width:100%;border:none;outline:none;resize:vertical;font-size:13.5px;
  line-height:1.7;color:var(--ink);background:transparent;min-height:52px;font-family:inherit;}
.note-in textarea::placeholder{color:var(--ink-3);}
.ni-row{display:flex;flex-wrap:wrap;gap:7px;align-items:center;margin-top:9px;
  padding-top:10px;border-top:1px solid var(--line);}
.ni-row select{border:1px solid var(--line-strong);border-radius:9px;padding:5px 9px;
  font-size:12px;background:#fff;color:var(--ink-2);outline:none;max-width:170px;}
.ni-hint{font-size:11.5px;color:var(--ink-3);}

.ncard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:12px 14px;margin-bottom:9px;transition:.14s;cursor:pointer;}
.ncard:hover{border-color:var(--brand-line);}
.ncard.pin{border-left:4px solid var(--brand);background:var(--card-2);}
.nc-top{display:flex;flex-wrap:wrap;gap:6px;align-items:center;margin-bottom:7px;}
.nc-t{font-size:11.5px;color:var(--ink-3);}
.nc-body{font-size:13px;line-height:1.75;color:var(--ink);white-space:pre-wrap;word-break:break-word;}
/* 操作按钮不能靠降透明度隐藏 —— 看不见就等于没有。
   用白底描边常驻，静默但看得见。 */
.ncard .row-act{opacity:1;margin-top:9px;gap:6px;}
.ncard .row-act .btn{color:var(--ink-2);border-color:var(--line-strong);background:#fff;padding:3px 10px;font-size:11.5px;}
.ncard .row-act .btn:hover{color:var(--brand-deep);background:var(--brand-soft);border-color:var(--brand-line);}

/* 搜索定位闪烁 —— 跳过去之后得让人看见是哪一条 */
@keyframes wbblink{
  0%,40%{background:var(--brand-soft);box-shadow:0 0 0 3px var(--brand-soft);}
  100%{background:transparent;box-shadow:none;}
}
.blink{animation:wbblink 2.4s ease-out;border-radius:10px;}

/* 四列表单栅格 */
.fld4{display:grid;grid-template-columns:repeat(4,1fr);gap:11px;}
.kpis.k4{grid-template-columns:repeat(4,1fr);}

/* ============ 键盘快捷键说明 ============ */
.kbd-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:9px 20px;}
.kbd-row{display:flex;align-items:center;gap:10px;font-size:13px;}
.kbd-row kbd{flex:0 0 auto;min-width:96px;text-align:center;
  font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11.5px;font-weight:700;
  color:var(--brand-deep);background:var(--brand-deep-soft);
  border:1px solid var(--line-strong);border-bottom-width:2px;border-radius:7px;padding:3px 8px;}
.kbd-row span{color:var(--ink-2);}

/* 页面内的分节标题（模板库的「我的模板 / 内置模板」） */
h3.sec-h{display:flex;align-items:center;gap:8px;font-size:13.5px;font-weight:800;color:var(--brand-deep);
  margin:0 0 12px;padding-bottom:8px;border-bottom:1px solid var(--line);letter-spacing:-.01em;}
h3.sec-h .tally{margin-left:auto;font-size:12px;font-weight:700;color:var(--ink-3);}

/* ============ 批量选择 ============ */
.pick{width:15px;height:15px;accent-color:var(--brand);cursor:pointer;flex:0 0 auto;margin:0;}
.tcard.picked,.trow.picked{outline:2px solid var(--brand);outline-offset:1px;background:#FFFDF2;}
/* 必须 fixed —— 用 sticky+bottom 时，元素的自然位置在长列表最末尾，
   不滚到底就永远浮不上来，用户在列表顶部勾选时根本看不到操作条。
   .page 的 padding-bottom:90px 已经给这条让出了空间。 */
.batch-bar{position:fixed;bottom:14px;left:calc(var(--sidebar) + 26px);right:26px;
  display:flex;align-items:center;gap:8px;flex-wrap:wrap;
  background:var(--brand-deep);color:#fff;border-radius:14px;padding:11px 15px;
  box-shadow:0 10px 26px rgba(74,63,53,.3);z-index:60;}
.batch-bar b{font-size:13px;font-weight:800;letter-spacing:.01em;}
.batch-bar .sp{flex:1;min-width:6px;}
.batch-bar .btn{background:rgba(255,255,255,.14);border-color:rgba(255,255,255,.24);color:#fff;}
.batch-bar .btn:hover{background:rgba(255,255,255,.26);}
.batch-bar .btn.danger{background:var(--risk);border-color:var(--risk);color:#fff;}
.batch-bar .btn.danger:hover{background:#C13A26;}
.batch-bar.idle{background:var(--card);color:var(--ink-2);border:1px dashed var(--line-strong);
  box-shadow:none;font-size:13px;}
.batch-bar.idle .btn{background:transparent;border-color:var(--line-strong);color:var(--ink-2);}

/* ============ 卡片上的快捷操作 ============ */
/* 常驻但压低透明度 —— 完全隐藏（opacity:0）会让新功能无处可发现，hover 变亮即用 */
.card-act{opacity:.34;transition:opacity .15s;}
.tcard:hover .card-act,.card-act:focus-visible{opacity:1;}
.card-act:disabled{opacity:.2;cursor:not-allowed;}
.col-add{opacity:.45;transition:opacity .15s;}
.col:hover .col-add{opacity:1;}

/* ============ 看板列内按模块分组 ============ */
.bgrp{margin-bottom:8px;}
.bgrp>summary{display:flex;align-items:center;gap:6px;font-size:11.5px;font-weight:800;color:var(--ink-2);
  cursor:pointer;padding:5px 8px;border-radius:8px;list-style:none;background:#F3EDDD;margin-bottom:6px;}
.bgrp>summary::-webkit-details-marker{display:none;}
.bgrp>summary:before{content:'▾';font-size:9px;color:var(--ink-3);transition:transform .16s;display:inline-block;}
.bgrp:not([open])>summary:before{transform:rotate(-90deg);}
.bgrp>summary .bn{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.bgrp>summary .n{font-size:10.5px;color:var(--ink-3);font-weight:700;}
.bgrp:not([open]) .tcard{display:none;}

/* 紧凑密度：保留全部信息，只压掉留白 */
.board.dense .tcard{padding:7px 9px;margin-bottom:6px;border-radius:11px;}
.board.dense .tcard .tt{font-size:12.5px;margin:2px 0 5px;line-height:1.4;}
.board.dense .tcard .tprog{margin-top:5px;}
.board.dense .bgrp>summary{padding:3px 7px;margin-bottom:4px;}

.row-i{display:flex;gap:11px;padding:11px 0;border-bottom:1px dashed var(--line);align-items:flex-start;}
.row-i:last-child{border-bottom:none;}
.row-i .mk{flex:0 0 18px;height:18px;border-radius:50%;margin-top:2px;display:grid;place-items:center;font-size:11px;font-weight:800;color:#fff;}
.mk.y{background:var(--grass);color:#2F4D06;} .mk.n{background:var(--brand);color:#3A3218;}
.row-i .lb{font-weight:700;font-size:13.5px;}
.row-i .vl{color:var(--ink-2);font-size:12.5px;margin-top:1px;}

/* 定价计算器 */
.calc{display:grid;grid-template-columns:330px 1fr;gap:15px;}
.calc-in,.calc-out{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:20px 22px;box-shadow:var(--shadow);}
.calc .sec-t{font-size:11px;font-weight:800;color:var(--ink-3);letter-spacing:.08em;
  margin:15px 0 9px;padding-top:12px;border-top:1px solid var(--line);}
.calc .sec-t:first-child{margin-top:0;padding-top:0;border-top:none;}
.calc .fld{display:flex;align-items:center;gap:9px;margin-bottom:8px;}
.calc .fld label{flex:1;font-size:13px;font-weight:700;color:var(--ink-2);margin:0;}
.calc .fld input{width:98px;padding:6px 10px;text-align:right;border:1px solid var(--line-strong);border-radius:9px;outline:none;}
.calc .fld input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}
.calc .fld .u{font-size:12px;color:var(--ink-3);width:16px;}
.big-out{font-size:34px;font-weight:800;letter-spacing:-.03em;font-variant-numeric:tabular-nums;color:var(--brand-deep);}
.big-out.pos{color:var(--ok);} .big-out.neg{color:var(--risk);}
.stack{display:flex;height:24px;border-radius:9px;overflow:hidden;margin:14px 0 8px;background:#F5EFE0;}
.stack i{height:100%;transition:.3s;}
.legend{display:flex;flex-wrap:wrap;gap:9px;font-size:11.5px;color:var(--ink-2);}
.legend span{display:inline-flex;align-items:center;gap:5px;}
.legend b{width:9px;height:9px;border-radius:3px;display:block;}
.out-line{display:flex;justify-content:space-between;font-size:13px;padding:5px 0;}
.out-line span:last-child{font-variant-numeric:tabular-nums;font-weight:700;}
.out-lab{font-size:12px;color:var(--ink-3);font-weight:700;}

/* 预算条 */
.bud{display:grid;grid-template-columns:190px 1fr 96px 52px;gap:12px;align-items:center;padding:8px 0;}
.bud .nm{font-size:13px;font-weight:700;}
.bud .tr{height:10px;background:#F5EFE0;border-radius:99px;overflow:hidden;}
.bud .tr i{display:block;height:100%;border-radius:99px;}
.bud .am{text-align:right;font-weight:800;font-variant-numeric:tabular-nums;font-size:13px;}
.bud .pc{text-align:right;font-size:12px;color:var(--ink-3);font-variant-numeric:tabular-nums;}

/* 品牌定位 */
.hero-pos{background:linear-gradient(135deg,#FFF8E7 0%,#FFFBE9 55%,#F6FCE4 100%);border:1px solid var(--brand-line);
  border-radius:var(--radius);padding:26px 28px;margin-bottom:14px;}
.hero-pos .qm{font-size:11px;font-weight:800;letter-spacing:.12em;color:#8A6D00;}
.hero-pos .big{font-size:21px;font-weight:800;line-height:1.5;margin-top:10px;letter-spacing:-.01em;color:var(--brand-deep);}
.hero-pos .big b{background:linear-gradient(transparent 58%,var(--brand) 58%);padding:0 2px;}
.hero-pos .sm{margin-top:12px;color:var(--ink-2);font-size:13.5px;}
.hook{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:17px 19px;box-shadow:var(--shadow);}
.hook .n2{font-size:11px;font-weight:800;letter-spacing:.1em;color:#8A6D00;}
.hook .h2t{font-weight:800;font-size:14.5px;margin-top:6px;color:var(--brand-deep);}
.hook .d2{color:var(--ink-2);font-size:12.5px;margin-top:6px;}

/* KPI */
.kpis{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-top:20px;}
/* 只有 3 张卡时用 k3 —— 不声明就会空出第 4 格，右侧看起来像少了东西 */
.kpis.k3{grid-template-columns:repeat(3,1fr);}
.kpi{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:15px 17px;box-shadow:var(--shadow);}
.kpi .k{font-size:12px;color:var(--ink-3);font-weight:700;}
.kpi .v{font-size:23px;font-weight:800;margin-top:5px;letter-spacing:-.02em;color:var(--brand-deep);}
.kpi .n{font-size:11.5px;color:var(--ink-3);margin-top:1px;}

.foot{padding:22px 26px;color:var(--ink-3);font-size:12px;border-top:1px solid var(--line);margin-top:30px;}

/* 会议 */
.mt-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:18px 20px;margin-bottom:13px;box-shadow:var(--shadow);}
.mt-card .mh{display:flex;align-items:center;gap:10px;margin-bottom:10px;}
.mt-card .mt-t{font-weight:800;font-size:15.5px;color:var(--brand-deep);}
.mt-card .mnote{font-size:13px;color:var(--ink-2);white-space:pre-wrap;line-height:1.7;}
.mt-card .mdec{background:var(--brand-soft);border-radius:11px;padding:12px 14px;font-size:13px;margin-top:11px;white-space:pre-wrap;color:#5C4A00;}
.mt-card .mitem{display:flex;gap:9px;align-items:flex-start;padding:6px 0;font-size:13px;border-bottom:1px dashed var(--line);}
.mt-card .mitem:last-child{border-bottom:none;}

/* 资料库 */
.file-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;
  display:flex;gap:12px;align-items:center;transition:.14s;box-shadow:var(--shadow);}
.file-card:hover{border-color:var(--brand-line);transform:translateY(-1px);}
.file-card .fi{width:40px;height:40px;border-radius:12px;background:var(--brand-soft);display:grid;place-items:center;
  font-size:11px;font-weight:800;color:#8A6D00;flex:0 0 auto;}
.file-card .fn{font-weight:700;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.file-card .fm{font-size:11.5px;color:var(--ink-3);margin-top:2px;}

/* 图片卡片（v2.18）—— 缩略图网格：一眼看见拍了什么，点开看大图。
   桌面排成一行行小图；手机 390 下每行 ≥3 张、不横向滚动。 */
.img-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:12px;}
.img-tile{position:relative;background:#fff;border:1px solid var(--line);border-radius:var(--radius);
  padding:7px;box-shadow:var(--shadow);transition:.14s;}
.img-tile:hover{border-color:var(--brand-line);transform:translateY(-1px);}
.img-tile .thumb{width:100%;aspect-ratio:1/1;object-fit:cover;border-radius:10px;display:block;
  background:var(--brand-soft);cursor:zoom-in;}
.img-tile .it-nm{margin-top:5px;font-size:12px;font-weight:600;color:var(--ink-2);cursor:zoom-in;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.img-tile .it-del{position:absolute;top:6px;right:6px;background:rgba(255,255,255,.92);}
@media(max-width:640px){
  .img-grid{grid-template-columns:repeat(auto-fill,minmax(88px,1fr));gap:8px;}
  .img-tile{padding:5px;}
  .img-tile .it-nm{font-size:11px;}
}

/* 大图弹层（v2.18）—— 复用 .mask/.modal，手机竖屏图片高度不超视口 */
.imgview{position:relative;background:#FBF7EF;border-radius:14px;padding:10px;text-align:center;
  max-height:72vh;overflow:auto;}
.imgview img{max-width:100%;max-height:66vh;border-radius:10px;display:block;margin:0 auto;}
.imgview .iv-x{position:absolute;top:8px;right:8px;background:rgba(255,255,255,.92);}
.iv-cap{margin-top:10px;font-size:12.5px;color:var(--ink-3);overflow:hidden;
  text-overflow:ellipsis;white-space:nowrap;text-align:center;}
@media(max-width:640px){
  .imgview{max-height:76vh;padding:5px;}
  .imgview img{max-height:70vh;}
}

/* 上传拖放区 */
.drop{border:2px dashed var(--line-strong);border-radius:var(--radius);padding:18px;text-align:center;
  color:var(--ink-3);font-size:12.5px;cursor:pointer;transition:.15s;background:#FFFBF0;}
.drop:hover,.drop.over{border-color:var(--brand);background:var(--brand-soft);color:#8A6D00;}

/* 模板库 */
.tpl-card{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:15px 17px;cursor:pointer;
  transition:.15s;box-shadow:var(--shadow);border-left:4px solid var(--brand);}
.tpl-card:hover{transform:translateY(-2px);box-shadow:0 6px 22px rgba(74,63,53,.12);border-left-color:var(--grass);}

/* ============ 全局提示条 ============ */
#toasts{position:fixed;left:50%;bottom:32px;transform:translateX(-50%);z-index:120;
  display:flex;flex-direction:column;gap:8px;align-items:center;pointer-events:none;}
.toast{background:var(--brand-deep);color:#FFF8E7;font-size:13.5px;font-weight:700;padding:11px 20px;border-radius:12px;
  box-shadow:0 10px 30px rgba(74,63,53,.28);max-width:min(560px,86vw);text-align:center;
  animation:tin .22s cubic-bezier(.4,0,.2,1);}
.toast.ok{background:var(--grass);color:#2F4D06;}
.toast.err{background:var(--risk);color:#fff;}
.toast.out{opacity:0;transform:translateY(8px);transition:.3s;}
@keyframes tin{from{opacity:0;transform:translateY(10px);}to{opacity:1;transform:translateY(0);}}

@media(max-width:1180px){
  .board{grid-template-columns:repeat(2,1fr);}
  .stat-row,.kpis{grid-template-columns:repeat(2,1fr);}
  /* .kpis.k3/.k4 的优先级高于 .kpis，不显式写就压不下去 */
  .kpis.k3,.kpis.k4{grid-template-columns:repeat(2,1fr);}
  .fld4{grid-template-columns:repeat(2,1fr);}
  .calc{grid-template-columns:1fr;}
  .g-label{width:220px;flex:0 0 220px;}
}
@media(max-width:860px){
  .sidebar{position:fixed;left:0;top:0;z-index:80;transform:translateX(-100%);transition:.2s;}
  .sidebar.open{transform:translateX(0);}
  .board{grid-template-columns:1fr;}
  .grid3,.grid4{grid-template-columns:1fr 1fr;}
  .pgrid{grid-template-columns:1fr;}
  .fld2,.fld3,.fld4{grid-template-columns:1fr;}
  .ni-row select{max-width:100%;flex:1;}
  .page{padding:18px 16px 80px;}
  .batch-bar{left:12px;right:12px;bottom:10px;}
  .nm-hide{display:none;}
}

/* ============================================================
   移动端（≤860px）· 本轮重做
   ------------------------------------------------------------
   为什么值得单独做一整块：团队 5–8 人、活流在微信群 —— 手机才是主入口。
   原来的 860px 断点只做了两件事：把侧栏推出屏幕、把网格改单列。
   结果是手机上：顶部栏挤成一团（面包屑被压成竖排）、表格右半边被推到屏幕外、
   抽屉和通知面板还按桌面宽度排、而且汉堡按钮带着内联 display:none 根本没人让它显示，
   侧栏又被推到屏幕外 —— 等于导航彻底进不去。功能再全也是零。
   ============================================================ */

/* 以下这些只在手机上出现，桌面一律不显示 */
#burger{display:none;}
#searchTg{display:none;}
#searchClose{display:none;}
.side-mask{display:none;}
.tabbar{display:none;}
.fab{display:none;}

/* 面包屑别被压成竖排 —— 标题栏在手机上就这点宽 */
.crumb{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;}

@media(max-width:860px){

  /* ---------- 顶部栏：只留真正要用的 ---------- */
  #burger{display:flex;}
  #searchTg{
    display:flex;align-items:center;justify-content:center;
    padding:6px 9px;border-radius:10px;background:var(--card-2);
    border:1px solid var(--line);font-size:15px;line-height:1;
  }
  .topbar{gap:8px;padding:0 12px;}
  .topbar .crumb{font-size:14.5px;}
  #quickAdd{display:none;}        /* 新建任务走页面内按钮 + 速记浮标，顶栏不再挤 */
  .me .nm-hide{display:none;}     /* 头像留着，姓名与角色收进「我的」 */
  .bell{padding:6px 9px;}

  /* ---------- 搜索：收起成图标，点开是全屏搜索层 ---------- */
  .search{display:none;}
  .search.open{
    display:block;position:fixed;inset:0;z-index:90;background:var(--bg);padding:14px;
  }
  .search.open input{width:100%;padding:11px 64px 11px 36px;font-size:15px;border-radius:12px;}
  .search.open .si{left:26px;font-size:16px;}
  .search.open #searchClose{
    display:flex;align-items:center;position:absolute;right:18px;top:14px;height:40px;
    border:0;background:transparent;color:var(--ink-2);font:700 13.5px inherit;cursor:pointer;
  }
  .search.open .search-res{
    position:absolute;left:14px;right:14px;top:68px;max-height:calc(100vh - 96px);
    max-height:calc(100dvh - 96px);      /* iOS 上键盘/地址栏变化时 dvh 才跟得上可见高度 */
    overflow-y:auto;
  }

  /* ---------- 侧栏：拉出 + 遮罩，点遮罩收回 ---------- */
  .side-mask{
    display:block;position:fixed;inset:0;z-index:79;background:rgba(43,38,34,.42);
    opacity:0;pointer-events:none;transition:opacity .2s;
  }
  .side-mask.on{opacity:1;pointer-events:auto;}
  .sidebar{width:min(300px,84vw);flex:0 0 min(300px,84vw);height:100dvh;}

  /* ---------- 底部 Tab：手机上最高频的五个去处，一指点达 ---------- */
  .tabbar{
    display:flex;position:fixed;left:0;right:0;bottom:0;z-index:70;
    background:rgba(255,252,242,.97);backdrop-filter:blur(12px);
    border-top:1px solid var(--line);padding-bottom:env(safe-area-inset-bottom);
  }
  .tabbar a{
    flex:1;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;
    gap:3px;height:56px;font-size:10.5px;font-weight:700;color:var(--ink-3);
    text-decoration:none;-webkit-tap-highlight-color:transparent;
  }
  .tabbar a .ic{font-size:17px;line-height:1;}
  .tabbar a.on{color:var(--brand-deep);}
  .tabbar a.on::before{
    content:'';position:absolute;top:0;left:50%;transform:translateX(-50%);
    width:26px;height:3px;border-radius:0 0 3px 3px;background:var(--brand);
  }
  /* 底部 Tab 上的红点：.badge-n 原来只对侧栏生效（.nav a .badge-n），
     Tab 栏里就是一行裸文字 */
  .tabbar .badge-n{
    position:absolute;top:6px;left:calc(50% + 8px);
    background:var(--brand-deep);color:#fff;font-size:9.5px;font-weight:800;
    line-height:15px;min-width:15px;height:15px;padding:0 4px;
    border-radius:99px;text-align:center;
  }

  /* ---------- 速记浮标：落在 Tab 栏之上，避开 iPhone 底部横条 ---------- */
  .fab{
    display:flex;align-items:center;justify-content:center;
    position:fixed;right:16px;bottom:calc(72px + env(safe-area-inset-bottom));
    width:54px;height:54px;border-radius:50%;border:0;z-index:71;
    background:var(--brand);color:var(--brand-deep);font-size:21px;
    box-shadow:0 6px 20px rgba(74,63,53,.28);cursor:pointer;transition:transform .12s;
    -webkit-tap-highlight-color:transparent;
  }
  .fab:active{transform:scale(.93);}

  /* ---------- 给底部 Tab 让出位置 ---------- */
  .page{padding:16px 14px calc(84px + env(safe-area-inset-bottom));}

  /* ---------- 任务抽屉全屏（原来留的 6vw 缝在手机上没法点，等于白留） ---------- */
  .drawer{width:100vw;max-width:100vw;}
  .drawer-hd{padding:15px 16px;}
  .drawer-bd{padding:16px 16px 60px;}
  .drawer-ft{padding:11px 14px calc(11px + env(safe-area-inset-bottom));}

  /* ---------- 通知面板撑满可用宽度（原来固定 390px 直接溢出屏幕） ---------- */
  .notif-panel{left:12px;right:12px;width:auto;top:58px;max-height:calc(100vh - 80px);
               max-height:calc(100dvh - 80px);}

  /* ---------- 表格卡片化：表头藏起来，每行变成一张小卡（都是配了 data-label 的） ---------- */
  .tb{display:block;}
  .tb thead{display:none;}
  .tb tbody{display:block;}
  .tb tr{
    display:block;background:var(--card);border:1px solid var(--line);
    border-radius:13px;padding:11px 13px;margin-bottom:10px;
  }
  .tb td{
    display:flex;justify-content:space-between;align-items:center;gap:6px 14px;
    border:0;padding:5px 0;text-align:right;flex-wrap:wrap;
  }
  .tb td::before{
    content:attr(data-label);flex:0 0 auto;color:var(--ink-3);
    font-size:11.5px;font-weight:700;text-align:left;
  }
  .tb td:not([data-label])::before{content:none;}
  .tb td:not([data-label]){justify-content:flex-end;}

  /* ---------- 触摸尺寸：手指点得中 ----------
     v2.21 起统一交给文件末尾的「手机手感」块（44px 触达 + :active），
     这里只留基线 38，具体值见 .v221 段——不要再在中间改小。 */
  .btn{min-height:38px;}
  .btn.sm{min-height:35px;}
  .btn.xs{min-height:31px;padding:0 10px;}
  .filters .seg button{min-height:35px;}
  .row-i{padding:11px 12px;}
  .nav a{padding:11px 16px;}

  /* 资料库顶部输入框：窄屏下「Ctrl + Enter 直接存」会被「存下来」挤到重叠，让它换行 */
  .ni-row{flex-wrap:wrap;}
  .ni-row .ni-hint{flex:1 1 100%;order:9;}
  .ni-row .btn{flex:0 0 auto;}

  /* ---------- 两栏一律堆叠 ---------- */
  .grid2{grid-template-columns:1fr;}
}

/* 弹窗在更窄的屏上别顶到边 */
@media(max-width:640px){
  .mask{padding:18px 12px;}
  .modal{padding:20px 17px;border-radius:17px;}
  /* 表单/说明一长，「保存」就被推到屏幕外（决策表单实测高 1194px，
     在 844px 视口里要滚 348px 才够得着）——让操作条粘在底部。 */
  .modal .foot{flex-wrap:wrap;position:sticky;bottom:0;background:#fff;
               margin-top:16px;padding-top:12px;box-shadow:0 -10px 18px rgba(74,63,53,.07);}

  /* .grid3/.grid4 在 ≤860px 只降到两列，390px 下每张卡仍被挤出屏幕
     （工作模块实测越界 221px、目标 37px）——窄屏收成一列。 */
  .grid3,.grid4{grid-template-columns:1fr;}

  /* .bud 是 190px+1fr+96px+52px 的固定列栅格，固定项本身就有 338px，
     加间距后超过 390px 的可用宽（品牌总览/预算实测越界 21px）——窄屏改两行。 */
  .bud{grid-template-columns:1fr auto;gap:7px 10px;}
  .bud .tr{grid-column:1/-1;}
  .bud .pc{grid-column:2;}

  /* .trow 的固定列（编号 74 + 负责人 74 + 日期 64 + 状态 76 + 删除键 30 + 间距）
     远超 390px 的可用宽：标题被压成 0 宽、删除键被顶出右边界 148px。
     窄屏的处理办法：
       · 标题独占第一行 —— 只靠收缩的话它只剩一个字的宽度，会竖着排；
       · 收起编号与负责人（单人版负责人恒为自己，零信息量）；
       · 日期 / 状态 / 删除键挪到第二行，放不下就换行，宁可换行也不越界。 */
  .trow{flex-wrap:wrap;gap:6px 8px;padding:11px 10px;}
  .trow .tid,.trow .trow-who{display:none;}
  .trow .tt{order:1;flex:1 1 100%;white-space:normal;overflow:visible;
            text-overflow:clip;line-height:1.45;font-size:14px;}
  .trow .tag{order:2;}
  .trow .trow-due{order:2;width:auto!important;}
  .trow .trow-st{order:2;width:auto!important;margin-left:auto;}
  .trow .row-del{order:3;margin-left:auto;}

  /* 项目档案的 .kpis 用内联 style 写死了 grid-template-columns，
     内联优先级高于媒体查询 —— 不加 !important 这里的规则对它完全无效。
     现在 kpis 少所以只在 320px 露头（实测越界 33px），kpis 一多 390px 也会中招。 */
  .kpis{grid-template-columns:repeat(2,1fr)!important;}
}

/* 页头在手机上折成两行（v2.17）。
   现状：.ph-row = 「标题 div flex:1」+「右侧按钮排成一行」。
   中文每字都可断行，标题的 min-content 只有一个字宽 —— 一旦右侧按钮够多，
   标题就被压到一两字宽、竖排成一条，按钮还被顶出屏幕右缘。
   实测（390 宽）事务主体 26×152、项目视图 26×152、文档库 51×76、资金 31×76。
   ≤640 才折：标题独占一行，操作按钮另起一行、放不下继续换行；
   桌面与平板（>640）保持原排版不动。 */
@media(max-width:640px){
  .ph-row{flex-wrap:wrap;row-gap:10px;}
  .ph-row>div:first-child{flex:1 1 100%!important;}
  .ph-row>span,.ph-row>div:not(:first-child){flex-wrap:wrap;row-gap:8px;}
}

/* ============================================================
   上传入口（资料库）—— 手机上「拍照 / 选图」是主入口
   ============================================================ */
.up-row{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin-bottom:12px;}
@media(max-width:860px){
  .up-row{display:none;}        /* 手机上标题栏那两个按钮就是入口，底部不再重复 */
  .drop{display:none;}          /* 手机上没法拖拽 */
}

/* ============================================================
   速记弹层（手机浮标 / 电脑 Ctrl+Shift+K 共用）
   ============================================================ */
.nq-ta{width:100%;min-height:118px;resize:vertical;}
.nq-row{display:flex;gap:8px;align-items:center;margin-top:10px;flex-wrap:wrap;}
.nq-row select{flex:1 1 130px;min-width:110px;}
.nq-hint{font-size:11.5px;color:var(--ink-3);}

/* ============================================================
   数据看板（概览页）· 手写 SVG，零依赖
   ============================================================ */
.dash{display:grid;grid-template-columns:1.25fr 1fr;gap:14px;margin-top:14px;align-items:start;}
@media(max-width:860px){.dash{grid-template-columns:1fr;}}
.dash .panel{margin:0;}
.spark{width:100%;height:auto;display:block;overflow:visible;}
.spark .gl{stroke:var(--line);stroke-width:1;}
.spark .ln{fill:none;stroke:var(--brand-deep);stroke-width:2.4;stroke-linejoin:round;stroke-linecap:round;}
.spark .ar{fill:var(--brand);opacity:.2;}
.spark .dt{fill:var(--brand-deep);}
.spark .lb{fill:var(--ink-3);font-size:9.5px;font-weight:700;}
.spark .vv{fill:var(--brand-deep);font-size:9.5px;font-weight:800;}
.delta{display:inline-flex;align-items:baseline;gap:5px;font-weight:800;}
.delta.up{color:var(--ok);}
.delta.down{color:var(--risk);}
.delta.flat{color:var(--ink-3);}
.delta .ar{font-size:12px;}
.dash-kpis{display:grid;grid-template-columns:1fr 1fr;gap:9px;}
.dk{background:var(--card-2);border:1px solid var(--line);border-radius:12px;padding:10px 12px;}
.dk .k{font-size:11.5px;color:var(--ink-3);font-weight:700;}
.dk .v{font-size:20px;font-weight:800;color:var(--brand-deep);line-height:1.25;}
.dk .n{font-size:11px;color:var(--ink-3);}
.pbar-row{display:flex;align-items:center;gap:9px;padding:5px 0;}
.pbar-row .nm{flex:0 0 118px;font-size:12.5px;font-weight:700;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.pbar-row .tr{flex:1;height:7px;border-radius:4px;background:var(--line);overflow:hidden;}
.pbar-row .tr i{display:block;height:100%;border-radius:4px;}
.pbar-row .pc{flex:0 0 34px;text-align:right;font-size:11.5px;font-weight:700;color:var(--ink-2);}

/* ================== v1.3 · 全景总览 / 事务主体 ================== */
.sdot{display:inline-block;width:8px;height:8px;border-radius:50%;margin-right:7px;vertical-align:middle;}

/* 事项三栏卡：具体情况 / 解决方案 / 事项进度 */
.t3{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  padding:15px 17px;margin-bottom:12px;box-shadow:var(--shadow);transition:.15s;cursor:pointer;}
.t3:hover{border-color:var(--brand-line);transform:translateY(-1px);box-shadow:var(--shadow-lg);}
.t3-hd{display:flex;align-items:flex-start;gap:10px;margin-bottom:12px;}
.t3-title{flex:1;font-size:14.5px;font-weight:800;color:var(--ink);line-height:1.45;}
.t3-tags{display:inline-flex;flex-wrap:wrap;gap:5px;flex:0 0 auto;}
.t3-id{font-size:11.5px;color:var(--ink-3);margin-top:11px;padding-top:10px;border-top:1px dashed var(--line);}

.three-col{display:grid;grid-template-columns:repeat(3,1fr);gap:14px;}
.three-col .col-h{font-size:11px;font-weight:800;color:var(--ink-3);letter-spacing:.06em;
  margin-bottom:5px;padding-bottom:4px;border-bottom:1px solid var(--line);}
.three-col .col-b{font-size:13px;color:var(--ink-2);line-height:1.68;white-space:pre-wrap;word-break:break-word;}
.three-col .col-b.mt{color:var(--ink-3);opacity:.6;}

/* 骨架期页面（资金 / 认识我 / 生活）：先把口径写清楚，别给空壳 */
.soon{padding:4px 2px;}
.soon-i{display:flex;gap:12px;padding:11px 2px;border-bottom:1px dashed var(--line);}
.soon-i:last-child{border-bottom:0;}
.soon-i b{flex:0 0 100px;font-size:13px;color:var(--ink);}
.soon-i span{flex:1;font-size:13px;color:var(--ink-2);line-height:1.65;}

/* ===== v1.4 两级主体：卡片条线 chips + 条线区块 ===== */
.pc-kids{display:flex;flex-wrap:wrap;gap:5px;margin-top:9px;}
.pc-kids span{font-size:11px;color:var(--ink-3);background:var(--bg);border:1px solid var(--line);
  border-radius:20px;padding:2px 9px;white-space:nowrap;line-height:1.5;}
.sl-wrap{margin-bottom:20px;}
.sl-hd{display:flex;align-items:center;gap:8px;padding:8px 0 8px 12px;
  border-left:3px solid var(--brand-line);margin-bottom:7px;}
.sl-name{font-weight:700;font-size:14px;color:var(--ink);}
.sl-brief{font-size:12px;color:var(--ink-3);margin:0 0 10px 15px;line-height:1.6;}
.sl-tasks{margin-left:15px;}

@media(max-width:860px){
  .three-col{grid-template-columns:1fr;gap:11px;}
  .soon-i{flex-direction:column;gap:3px;}
  .soon-i b{flex:none;}
  .sl-tasks{margin-left:0;}
  .sl-brief{margin-left:12px;}
}

/* ============ 文档库（#/docs） ============ */
.dstat{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:12px;margin-bottom:16px;}
.dcard{background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:14px 16px;
  display:flex;flex-direction:column;gap:3px;box-shadow:var(--shadow);}
.dcard .dc-n{font-size:20px;font-weight:800;color:var(--brand-deep);letter-spacing:-.5px;}
.dcard .dc-t{font-size:11.5px;color:var(--ink-3);font-weight:600;}

.dfilter{display:flex;gap:10px;align-items:flex-start;margin-bottom:9px;}
.dfilter .df-lb{flex:none;width:34px;font-size:12px;font-weight:700;color:var(--ink-3);padding-top:5px;}
.dchips{display:flex;gap:7px;flex-wrap:wrap;}
.dchip{background:#fff;border:1px solid var(--line-strong);border-radius:999px;padding:5px 11px;
  font-size:12px;font-weight:600;color:var(--ink-2);cursor:pointer;transition:.14s;}
.dchip:hover{border-color:var(--brand-line);background:var(--brand-soft);}
.dchip.on{background:var(--brand);border-color:var(--brand-line);color:var(--brand-deep);font-weight:800;}
.dchip b{font-weight:800;opacity:.7;margin-left:3px;}

.dsearch{display:flex;gap:9px;align-items:center;flex-wrap:wrap;margin:14px 0 6px;
  background:#fff;border:1px solid var(--line);border-radius:var(--radius);padding:10px 12px;box-shadow:var(--shadow);}
.dsearch input{flex:1;min-width:200px;padding:8px 12px;border:1px solid var(--line-strong);
  border-radius:11px;outline:none;font-size:13px;}
.dsearch input:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}
.dsearch select{padding:7px 10px;border:1px solid var(--line-strong);border-radius:11px;background:#fff;
  font-size:12.5px;outline:none;}

.dlist{display:flex;flex-direction:column;gap:8px;}
.drow{background:#fff;border:1px solid var(--line);border-radius:var(--radius);overflow:hidden;transition:.14s;}
.drow:hover{border-color:var(--brand-line);}
.drow.open{border-color:var(--brand-line);box-shadow:var(--shadow);}
.drow-hd{display:flex;gap:12px;align-items:flex-start;padding:12px 14px;cursor:pointer;}
.drow-hd .di{flex:none;width:38px;height:38px;border-radius:11px;background:var(--brand-soft);
  display:grid;place-items:center;font-size:10px;font-weight:800;color:#8A6D00;border:1px solid var(--brand-line);}
.dmain{flex:1;min-width:0;}
.dname{font-weight:700;font-size:13.5px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.dmeta{display:flex;gap:7px;flex-wrap:wrap;align-items:center;font-size:11.5px;color:var(--ink-3);margin-top:3px;}
.dpath{font-size:11px;color:var(--ink-3);margin-top:4px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
  font-family:ui-monospace,Menlo,Consolas,monospace;}
.dsnip{font-size:12px;color:var(--ink-2);margin-top:6px;background:var(--brand-soft);
  border-left:3px solid var(--brand-line);padding:6px 9px;border-radius:0 8px 8px 0;line-height:1.6;}
.dact{display:flex;gap:6px;flex:none;align-items:center;}
.drow-bd{border-top:1px solid var(--line);background:var(--card-2);padding:12px 14px;}
.dbody{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12px;line-height:1.65;color:var(--ink-2);
  white-space:pre-wrap;word-break:break-word;max-height:420px;overflow:auto;margin:0;}
.dpager{display:flex;gap:12px;align-items:center;justify-content:center;margin-top:18px;
  font-size:12.5px;color:var(--ink-3);}

@media(max-width:860px){
  .dfilter{flex-direction:column;gap:5px;}
  .dfilter .df-lb{width:auto;}
  .drow-hd{flex-wrap:wrap;}
  .dact{width:100%;justify-content:flex-end;}
  .dchip{font-size:11.5px;padding:4px 9px;}
}

/* ============================================================
   v1.6 新增：侧栏分组折叠 · 资金 · 生活
   ============================================================ */

/* ---- 侧栏二级导航：分组标题可点开 / 收起，默认全收起 ---- */
.nav .grp{cursor:pointer;user-select:none;display:flex;align-items:center;}
.nav .grp::after{content:'▾';margin-left:6px;font-size:9.5px;opacity:.65;transition:transform .16s;}
.nav .grp[data-collapsed="1"]::after{transform:rotate(-90deg);}
.nav .grp[data-collapsed="1"]{opacity:.82;}
.nav .grp:hover{color:var(--ink-2);}
/* 项数徽标：收起时也知道里面有几项，不用点开挨个数 */
.nav .grp .n{margin-left:auto;font-size:10px;font-weight:800;line-height:1.65;min-width:17px;text-align:center;
  color:var(--ink-3);background:var(--line);border-radius:99px;padding:0 5px;}
/* 置顶的全景总览 —— 不属于任何组，和下面折叠的组拉开一点间距 */
.nav a.nav-top{margin-bottom:3px;}
.nav .hide{display:none;}

/* ---- 资金：账户卡片 ---- */
.agrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(238px,1fr));gap:12px;}
.acard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);padding:14px 15px;
  transition:.14s;box-shadow:var(--shadow);}
.acard:hover{border-color:var(--brand-line);transform:translateY(-1px);box-shadow:var(--shadow-lg);}
.ac-top{display:flex;align-items:center;justify-content:space-between;gap:8px;}
.ac-name{font-weight:800;font-size:13.5px;display:inline-flex;align-items:center;gap:6px;min-width:0;}
.ac-num{font-size:21px;font-weight:800;letter-spacing:-.02em;color:var(--brand-deep);margin-top:6px;}
.ac-num.neg{color:var(--risk);}
.ac-meta{display:flex;flex-wrap:wrap;gap:8px;margin-top:6px;font-size:11.5px;color:var(--ink-3);}
.ac-note{margin-top:6px;font-size:11.5px;color:var(--ink-3);border-top:1px dashed var(--line);padding-top:6px;}

/* ---- 资金：12 个月收支柱 ---- */
.trend{display:flex;align-items:flex-end;gap:6px;height:132px;padding-top:6px;}
.tr-col{flex:1;display:flex;flex-direction:column;align-items:center;gap:4px;height:100%;justify-content:flex-end;}
.tr-bars{display:flex;align-items:flex-end;gap:2px;height:100%;width:100%;justify-content:center;}
.tr-bars i{flex:0 0 9px;border-radius:3px 3px 0 0;display:block;}
.tr-in{background:var(--grass);}
.tr-out{background:var(--brand);}
.tr-m{font-size:10.5px;color:var(--ink-3);}
.tr-k{display:flex;gap:14px;margin-top:10px;font-size:11.5px;color:var(--ink-2);}
.tr-k span{display:inline-flex;align-items:center;gap:5px;}
.tr-k i{width:9px;height:9px;border-radius:2px;display:inline-block;}

/* ---- 资金：支出结构 ---- */
.catlist{display:flex;flex-direction:column;gap:9px;}
.catrow{display:grid;grid-template-columns:150px 56px 1fr 40px 92px 52px;gap:9px;align-items:center;font-size:12.5px;}
.cr-name{font-weight:700;display:inline-flex;align-items:center;gap:6px;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cr-bar{height:8px;background:var(--card-2);border:1px solid var(--line);border-radius:99px;overflow:hidden;}
.cr-bar i{display:block;height:100%;border-radius:99px;}
.cr-p,.cr-n{color:var(--ink-3);font-size:11.5px;text-align:right;}
.cr-v{text-align:right;font-weight:700;color:var(--brand-deep);}

/* ---- 资金：流水表 ---- */
.txnlist{padding:4px 8px;}
.txnrow{display:flex;align-items:center;gap:11px;padding:9px 8px;border-radius:10px;border-bottom:1px dashed var(--line);}
.txnrow:last-child{border-bottom:none;}
.txnrow:hover{background:var(--card-2);}
.tx-d{flex:0 0 44px;font-size:11.5px;color:var(--ink-3);font-variant-numeric:tabular-nums;}
.tx-i{display:flex;align-items:center;gap:9px;flex:1;min-width:0;}
.tx-ic{flex:0 0 22px;height:22px;border-radius:7px;display:grid;place-items:center;font-size:11px;font-weight:800;}
.tx-t{display:flex;flex-direction:column;min-width:0;}
.tx-t b{font-weight:700;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tx-t i{font-style:normal;font-size:11.5px;color:var(--ink-3);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.tx-v{font-weight:800;font-size:13.5px;letter-spacing:-.01em;font-variant-numeric:tabular-nums;}
.tx-v.in{color:var(--ok);}
.tx-v.out{color:var(--brand-deep);}

/* ---- 生活：日子倒计时徽标 ---- */
.day-badge{flex:0 0 44px;display:flex;flex-direction:column;align-items:center;justify-content:center;
  background:var(--card-2);border:1px solid var(--line);border-radius:11px;padding:4px 0;}
.day-badge b{font-size:15px;font-weight:800;line-height:1.1;color:var(--brand-deep);}
.day-badge i{font-style:normal;font-size:9.5px;color:var(--ink-3);}
.day-badge.soon{border-color:var(--warn-line);background:var(--warn-soft);}
.day-badge.soon b{color:var(--warn);}
.day-badge.today{border-color:var(--grass-line);background:var(--grass-soft);}
.day-badge.today b{color:var(--ok);font-size:13px;}

/* ---- 生活：打卡网格 ---- */
.hgrid{overflow-x:auto;padding-bottom:4px;}
.hg-row{display:flex;align-items:center;gap:5px;padding:5px 0;border-bottom:1px dashed var(--line);min-width:max-content;}
.hg-row:last-child{border-bottom:none;}
.hg-head{font-size:11px;color:var(--ink-3);font-weight:700;border-bottom:1px solid var(--line-strong);}
.hg-name{flex:0 0 132px;font-weight:700;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.hg-d{flex:0 0 24px;text-align:center;}
.hg-head .hg-d{font-size:10.5px;}
.hg-d.today{background:var(--brand-soft);border-radius:7px;font-weight:800;}
.hb{display:inline-block;width:17px;height:17px;border-radius:6px;border:1.5px solid var(--line-strong);
  background:#fff;cursor:pointer;vertical-align:middle;transition:.12s;}
.hb:hover{border-color:var(--brand);}
.hb.off{background:transparent;border-style:dashed;cursor:default;}
.hb.off:hover{border-color:var(--line-strong);}
.hg-sum,.hg-streak{flex:0 0 52px;text-align:right;font-size:11.5px;color:var(--ink-3);font-weight:700;}
.hg-sum.ok{color:var(--ok);}

/* ---- 习惯打卡卡片 + 本月热力格（v2.16）---- */
.hlist{display:flex;flex-direction:column;gap:12px;}
.hcard{padding:14px 16px;}
.hc-top{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:10px;}
.hc-name{appearance:none;border:none;background:none;padding:0;cursor:pointer;font:700 14px inherit;color:var(--ink);
  display:inline-flex;align-items:center;gap:5px;}
.hc-name:hover{color:var(--brand-deep);}
.hm-grid{display:grid;grid-template-columns:repeat(7,22px);gap:4px;}
.hm-head{display:contents;}
.hm-head span{font-size:10px;color:var(--ink-3);font-weight:700;text-align:center;line-height:22px;}
.hm-cell{width:22px;height:22px;border-radius:6px;border:1.5px solid var(--line-strong);background:#fff;cursor:pointer;display:block;}
.hm-cell.on{border-color:transparent;}
.hm-cell.today{outline:2px solid var(--brand);outline-offset:1px;}
.hm-cell.future{border-style:dashed;opacity:.5;cursor:default;}
.hm-cell.empty{border:none;background:none;cursor:default;}

/* ---- 生活：体重曲线 ---- */
.wchart{display:flex;align-items:flex-end;gap:4px;height:104px;padding-top:8px;}
.wchart i{flex:1;min-width:4px;background:linear-gradient(180deg,var(--grass) 0%,var(--grass-line) 100%);
  border-radius:4px 4px 0 0;display:block;}

/* ---- 健康档案：手绘 SVG 趋势图（v2.16）---- */
.hchart{overflow-x:auto;}
.hchart svg{display:block;width:100%;height:auto;}

/* ---- 生活预算 / 消费结构（v2.16）---- */
.bt-bar{height:8px;border-radius:5px;background:#F1EFE8;overflow:hidden;margin:5px 0 3px;}
.bt-bar i{display:block;height:100%;border-radius:5px;background:linear-gradient(90deg,#E7C64A,var(--brand));}
.bt-bar i.over{background:linear-gradient(90deg,#E08B8B,var(--risk));}
.bt-over{font-size:11.5px;color:var(--risk);font-weight:700;}
.bt-none{font-size:11.5px;color:var(--ink-3);}
.ring-wrap{display:flex;align-items:center;gap:22px;flex-wrap:wrap;}
.ring{flex:0 0 auto;}
.ring-legend{flex:1;min-width:220px;display:flex;flex-direction:column;gap:6px;}
.rg-i{display:flex;align-items:center;gap:8px;font-size:12.5px;}
.rg-n{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rg-v{font-weight:700;color:var(--ink-2);}
.rg-p{flex:0 0 40px;text-align:right;color:var(--ink-3);font-weight:700;}

/* ---- 响应式兜底 ---- */
@media(max-width:860px){
  .catrow{grid-template-columns:104px 1fr 34px 78px;gap:7px;}
  .catrow .tag,.catrow .cr-n{display:none;}
  .trend{height:104px;gap:3px;}
  .tr-bars i{flex:0 0 6px;}
  .hg-name{flex:0 0 92px;font-size:12px;}
  .agrid{grid-template-columns:1fr;}
  .txnrow{gap:8px;}
  .tx-d{flex:0 0 38px;}
}

/* ---- 登录日志（安全加固 §9.2）----
   失败 TOP IP 的排行行：IP 左对齐、次数右对齐、解锁按钮贴右。
   不用 .catrow —— 那是资金页 6 列网格，列数对不上会错位。 */
.iprow{display:flex;align-items:center;gap:10px;padding:9px 0;border-top:1px solid var(--line);font-size:12.5px;}
.iprow:first-child{border-top:0;}
.ip-a{font-weight:800;flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ip-b{color:var(--ink-3);font-size:11.5px;font-weight:700;flex:0 0 auto;}
@media(max-width:860px){
  .ip-b{display:none;}
}

/* ==========================================================================
   v1.7 · 单人化 / 提醒 / 主力页重做
   ========================================================================== */

/* ---- 主体卡：卡面一块可点，卡脚一排操作 ----
   padding 从 .pcard 挪到 .pc-main，否则按钮行会被卡片的圆角切掉。 */
.pcard{padding:0;overflow:hidden;display:flex;flex-direction:column;}
.pc-main{padding:15px 16px 13px;cursor:pointer;flex:1;}
.pcard-done .pc-main{background:linear-gradient(180deg,#FCFBF7,#fff);}
.pc-acts{display:flex;align-items:center;gap:2px;padding:6px 7px;border-top:1px solid var(--line);background:var(--bg);}
.pact{flex:1;border:0;background:transparent;border-radius:8px;padding:6px 4px;font-size:11.5px;font-weight:700;
  color:var(--ink-3);cursor:pointer;white-space:nowrap;transition:.15s;font-family:inherit;}
.pact:hover{background:#fff;color:var(--ink);box-shadow:0 1px 3px rgba(74,63,53,.09);}
.pact.on{color:var(--ok);}
.pact.danger:hover{color:var(--risk);}

/* ---- 全景总览：盯着点 ---- */
.wgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(228px,1fr));gap:12px;}
.wcard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);padding:12px 13px;}
.wc-hd{display:flex;align-items:center;gap:7px;margin-bottom:8px;}
.wc-n{font-weight:800;font-size:12.5px;flex:1;}
.wc-list{display:flex;flex-direction:column;gap:4px;}
.wc-i{font-size:12px;color:var(--ink-2);cursor:pointer;padding:3px 0;line-height:1.5;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.wc-i:hover{color:var(--brand-deep);}
.wc-more{font-size:11px;color:var(--ink-3);padding-top:2px;}

/* ---- 全景总览：手上的盘（一行一个主体） ---- */
.sline-wrap{padding:6px 4px;}
.sline{display:flex;align-items:center;gap:9px;padding:8px 10px;border-radius:10px;cursor:pointer;transition:.12s;}
.sline:hover{background:#FFFBF0;}
.sline + .sline{border-top:1px solid var(--line);}
.sl-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto;}
.sl-nm{font-weight:700;font-size:13px;flex:0 0 auto;max-width:230px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.sl-kd{flex:0 0 auto;}
.sl-bar{flex:1;height:5px;border-radius:99px;background:var(--brand-deep-soft);overflow:hidden;min-width:50px;}
.sl-bar i{display:block;height:100%;border-radius:99px;}
.sl-num{flex:0 0 54px;text-align:right;font-size:11.5px;font-weight:800;color:var(--ink-3);
  font-variant-numeric:tabular-nums;}
.sl-flag{flex:0 0 auto;display:flex;gap:4px;}
/* 「手上的盘」每行的「＋」—— **常显**：把按钮藏进 hover 等于没有按钮
   （用户的原话就是"按钮不齐全"）。但压成低对比，11 行不至于变成一排高亮块。 */
.sl-add{flex:0 0 auto;color:var(--ink-3);border-color:var(--line);opacity:.75;}
.sline:hover .sl-add{color:var(--brand-deep);border-color:var(--brand);opacity:1;}
.sec-a{float:right;font-size:11.5px;font-weight:700;color:var(--brand-deep);text-decoration:none;}
.sec-a:hover{text-decoration:underline;}

/* ---- 提醒面板（原「通知」） ----
   分三级底色：bad 要马上动手 / warn 今天内 / ok 无事。
   连成一片会看不出轻重，所以整条上色，而不是只染一个小点。 */
.al-card{border-bottom:1px solid var(--line);}
.al-card.lv-bad{background:#FFF7F5;}
.al-card.lv-warn{background:#FFFDF3;}
.al-card.lv-ok{background:#F7FDF2;}
.al-hd{display:flex;align-items:flex-start;gap:10px;padding:12px 17px;}
.al-hd[data-act]{cursor:pointer;}
.al-hd[data-act]:hover{background:rgba(74,63,53,.035);}
.al-ic{flex:0 0 auto;width:18px;text-align:center;font-size:13px;color:var(--ink-3);line-height:1.6;}
.al-tt{font-weight:800;font-size:13px;line-height:1.5;}
.al-ss{font-size:11.5px;color:var(--ink-3);margin-top:3px;line-height:1.5;}
.al-arrow{color:var(--ink-3);font-size:13px;flex:0 0 auto;line-height:1.7;}
.al-body{padding:0 17px 11px 45px;display:flex;flex-direction:column;gap:1px;}
.al-item{display:flex;gap:8px;align-items:flex-start;padding:5px 7px;border-radius:8px;cursor:pointer;}
.al-item:hover{background:#fff;}
.al-dot{width:5px;height:5px;border-radius:50%;background:var(--ink-3);flex:0 0 auto;margin-top:7px;}
.al-t{font-size:12.5px;font-weight:600;line-height:1.5;}
.al-s{font-size:11px;color:var(--ink-3);margin-top:2px;}

/* ---- 文档库：图片库 ----
   图要「看」，所以给网格，不给文件名列表。 */
.imgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:11px;}
.imgcell{background:var(--card);border:1px solid var(--line);border-radius:var(--radius-sm);overflow:hidden;
  cursor:pointer;transition:.15s;}
.imgcell:hover{border-color:var(--brand-line);transform:translateY(-2px);box-shadow:var(--shadow-lg);}
.imgbox{height:130px;background:var(--bg);display:grid;place-items:center;overflow:hidden;}
.imgbox img{width:100%;height:100%;object-fit:cover;display:block;}
/* 索引里有这张图、但实体文件没同步到服务器 —— 显示占位块，而不是一片裂图 */
.imgbox.noimg{background:var(--bg);height:62px;}
.imgbox.noimg::after{content:'图片未同步';font-size:10px;color:var(--ink-3);letter-spacing:.4px;}
/* 图片实体不在服务器上时，路径是唯一的定位线索 —— 卡片上要看得见。
   单行省略：Windows 路径没有空格，折行会在词中间断开，反而更难读 */
.imgpath{margin:4px 9px 8px;font-size:10px;color:var(--ink-3);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.imgname{margin:8px 9px 0;font-size:11.5px;font-weight:700;line-height:1.45;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.imgmeta{margin:3px 9px 9px;font-size:10.5px;color:var(--ink-3);}

/* ---- 图片大图预览 ---- */
.imgview{max-width:min(1100px,92vw);}
.iv-box{background:#2A2621;border-radius:12px;display:grid;place-items:center;max-height:72vh;overflow:auto;}
.iv-box img{max-width:100%;max-height:72vh;display:block;}
.iv-box.miss{min-height:200px;background:var(--bg);}
/* 本机路径条：图片实体不在服务器上时，这是唯一的定位线索 */
.iv-path{display:flex;align-items:center;gap:10px;margin-top:10px;padding:9px 11px;
  background:var(--bg);border-radius:8px;font-size:11.5px;}
.ivp-t{flex:1;min-width:0;word-break:break-all;color:var(--ink-3);}
.iv-box.miss::after{content:'这张图的实体文件还没同步到服务器';color:var(--ink-3);font-size:12.5px;
  padding:84px 24px;text-align:center;line-height:1.6;}
.iv-ft{display:flex;align-items:center;gap:8px;margin-top:12px;flex-wrap:wrap;}
.iv-n{font-size:12.5px;font-weight:800;min-width:0;overflow:hidden;text-overflow:ellipsis;
  white-space:nowrap;max-width:44%;}

/* ---- 随手记 / 会议纪要：折叠区 ---- */
.ni-fold{display:flex;gap:8px;margin-top:9px;flex-wrap:wrap;}
.ni-fold select{flex:1;min-width:120px;}
.mtg-fold{margin-top:6px;padding-top:12px;border-top:1px dashed var(--line);}

/* ---- 任务卡 / 行的删除键 ---- */
.row-del{opacity:.45;padding:2px 7px;}
.row-del:hover{opacity:1;color:var(--risk);border-color:var(--risk-line);background:var(--risk-soft);}
.card-act.danger{color:var(--risk);}

/* ---- 响应式 ---- */
@media(max-width:860px){
  .sl-kd,.sl-flag{display:none;}
  .sl-nm{max-width:132px;}
  .wgrid{grid-template-columns:1fr;}
  .imgrid{grid-template-columns:repeat(auto-fill,minmax(108px,1fr));gap:8px;}
  .imgbox{height:96px;}
  .pc-acts{gap:0;}
  .pact{font-size:11px;padding:7px 2px;}
  .al-body{padding-left:17px;}
  .iv-n{max-width:100%;}
}

/* ============ v1.8 · 「我的」页全站目录 ============
   手机底部只有 5 个 Tab，其余页面以前只能从侧栏抽屉里翻 25 项。
   这一块把全站摊成一屏网格，一指点达。 */
.ng-grp{margin:15px 0 8px;font-size:11.5px;font-weight:800;
  color:var(--ink-3);letter-spacing:.6px;}
.ng-grp:first-of-type{margin-top:6px;}
.navgrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(108px,1fr));gap:8px;}
.ng-item{
  display:flex;align-items:center;gap:8px;padding:10px 11px;
  border:1px solid var(--line);border-radius:var(--radius-sm);
  background:var(--card-2);cursor:pointer;text-align:left;
  font-size:13px;font-weight:600;color:var(--ink);
  transition:border-color .14s, transform .14s, background .14s;
}
.ng-item:hover{border-color:var(--line-strong);transform:translateY(-1px);}
.ng-item.on{background:var(--brand-soft);border-color:var(--brand-line);}
.ng-ic{flex:0 0 20px;width:20px;text-align:center;font-size:14px;color:var(--ink-2);}
.ng-item.on .ng-ic{color:var(--brand-deep);}
.ng-lb{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

@media(max-width:860px){
  .navgrid{grid-template-columns:repeat(auto-fill,minmax(96px,1fr));gap:7px;}
  .ng-item{padding:9px 10px;font-size:12.5px;gap:6px;}
  .ng-ic{flex:0 0 17px;width:17px;font-size:13px;}
}

/* ============ v1.8 · 决策档案 ============
   一条决策 = 一张卡，从上往下读：处境 → 选项 → 选择 → 理由 → 预期 → 实际 → 复盘。
   不用表格 —— 表格会把长文本压扁，而这里的长文本才是重点。 */
.dc-card{border:1px solid var(--line);border-radius:var(--radius);background:var(--card);
  padding:14px 15px;margin-bottom:12px;}
.dc-card:last-child{margin-bottom:0;}
.dc-hd{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin-bottom:5px;}
.dc-t{font-size:15px;font-weight:800;color:var(--ink);}
.dc-st{font-size:11px;font-weight:800;padding:2px 9px;border-radius:999px;letter-spacing:.3px;}
.dc-st.open{background:var(--warn-soft);color:var(--warn);border:1px solid var(--warn-line);}
.dc-st.done{background:var(--ok-soft);color:var(--ok);border:1px solid var(--ok-line);}
.dc-meta{font-size:11.5px;color:var(--ink-3);margin-bottom:10px;}
.dc-sec{margin:10px 0;}
.dc-sec>b{display:block;font-size:11px;font-weight:800;letter-spacing:.5px;
  color:var(--ink-3);margin-bottom:3px;}
.dc-sec p{font-size:13.5px;color:var(--ink-2);line-height:1.72;white-space:pre-wrap;}
.dc-sec.act{background:var(--brand-soft);border-left:3px solid var(--brand-line);
  padding:9px 12px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;}
.dc-sec.retro{background:var(--grass-soft);border-left:3px solid var(--grass-line);
  padding:9px 12px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;}
.dc-chosen{font-weight:700;color:var(--ink) !important;}
.dc-opts{list-style:none;display:flex;flex-direction:column;gap:5px;}
.dc-opts li{font-size:13.5px;color:var(--ink-2);padding:7px 11px;border:1px solid var(--line);
  border-radius:9px;background:var(--card-2);display:flex;align-items:center;gap:8px;}
.dc-opts li.on{border-color:var(--brand-line);background:var(--brand-soft);
  color:var(--ink);font-weight:700;}
.dc-ft{display:flex;align-items:center;gap:7px;margin-top:13px;
  padding-top:11px;border-top:1px dashed var(--line);}
.dc-recall{background:var(--card-2);border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:11px 13px;margin-bottom:13px;}
.rc-row{display:flex;gap:10px;font-size:12.5px;margin-bottom:5px;}
.rc-row:last-child{margin-bottom:0;}
.rc-row>b{flex:0 0 62px;color:var(--ink-3);font-weight:700;}
.rc-row>span{color:var(--ink-2);min-width:0;word-break:break-word;}
.dc-fold{margin-top:11px;padding-top:11px;border-top:1px dashed var(--line);}

@media(max-width:860px){
  .dc-card{padding:12px;}
  .dc-opts li{font-size:13px;padding:6px 10px;}
  .rc-row>b{flex:0 0 54px;}
}

/* ============ v1.8 · 认识我 ============ */
.b5-wrap{display:grid;grid-template-columns:236px 1fr;gap:20px;align-items:center;}
.b5-radar{max-width:236px;}
.radar{display:block;width:100%;height:auto;overflow:visible;}
.b5-bars{display:flex;flex-direction:column;gap:12px;}
.b5-hd{display:flex;align-items:baseline;justify-content:space-between;font-size:13px;}
.b5-hd .mono{font-size:12px;color:var(--ink-3);}
.b5-bar{height:7px;border-radius:99px;background:var(--line);overflow:hidden;margin:5px 0 3px;}
.b5-bar i{display:block;height:100%;border-radius:99px;
  background:linear-gradient(90deg,var(--brand-line),var(--brand));}
.b5-ds{font-size:11.5px;color:var(--ink-3);}

/* 答题（大五 50 题 / 才干 34 项共用一套选项按钮） */
.b5-form,.gl-form{max-height:56vh;overflow-y:auto;padding-right:4px;margin:12px 0;}
.b5-grp{margin-bottom:18px;}
.b5-gt,.gl-gt{font-size:12px;font-weight:800;color:var(--ink-2);letter-spacing:.4px;
  margin-bottom:8px;padding-bottom:6px;border-bottom:1px solid var(--line);}
.b5-q,.gl-row{display:flex;align-items:center;gap:12px;padding:6px 0;}
.b5-qt{flex:1;min-width:0;font-size:13.5px;}
.b5-opts{display:flex;gap:4px;flex:0 0 auto;}
.b5-opt{width:30px;height:30px;border-radius:9px;border:1px solid var(--line);background:var(--card-2);
  font-size:12.5px;font-weight:700;color:var(--ink-2);cursor:pointer;transition:.12s;}
.b5-opt:hover{border-color:var(--line-strong);}
.b5-opt.on{background:var(--brand);border-color:var(--brand-line);color:var(--brand-deep);}
.gl-row{align-items:flex-start;border-bottom:1px dashed var(--line);padding:9px 0;}
.gl-row:last-child{border-bottom:none;}
.gl-row .lb{font-size:13.5px;font-weight:700;}
.gl-row .vl{font-size:11.5px;color:var(--ink-3);}

/* 才干结果 */
.gl-dom{display:flex;flex-wrap:wrap;gap:7px;margin-bottom:14px;}
.gl-chip{font-size:12px;padding:4px 11px;border-radius:999px;border:1px solid var(--line);
  background:var(--card-2);color:var(--ink-3);font-weight:700;}
.gl-chip.on{border-color:var(--brand-line);background:var(--brand-soft);color:var(--brand-deep);}
.gl-item{display:flex;align-items:center;gap:11px;padding:9px 0;border-bottom:1px dashed var(--line);}
.gl-item:last-child{border-bottom:none;}
.gl-rk{flex:0 0 22px;height:22px;border-radius:50%;background:var(--brand);color:var(--brand-deep);
  display:grid;place-items:center;font-size:11px;font-weight:800;}
.gl-item .lb{font-size:13.5px;font-weight:700;}
.gl-item .vl{font-size:11.5px;color:var(--ink-3);}
.gl-sc{font-size:13px;font-weight:800;color:var(--ink-2);}

/* 行为信号 */
.sig-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(212px,1fr));gap:11px;}
.sig-card{border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card-2);padding:13px;}
.sg-t{font-size:11.5px;font-weight:800;color:var(--ink-3);letter-spacing:.4px;}
.sg-v{font-size:22px;font-weight:800;color:var(--ink);margin:4px 0 2px;line-height:1.2;}
.sg-s{font-size:11.5px;color:var(--ink-3);}
.sg-bar{height:5px;border-radius:99px;background:var(--line);overflow:hidden;margin:9px 0 7px;}
.sg-bar i{display:block;height:100%;border-radius:99px;
  background:linear-gradient(90deg,var(--grass-line),var(--grass));}
.sg-n{font-size:11px;color:var(--ink-3);line-height:1.6;}

/* 画像 */
.pf-sec{margin:13px 0;}
.pf-sec>b{display:block;font-size:11px;font-weight:800;letter-spacing:.5px;color:var(--ink-3);margin-bottom:4px;}
.pf-sec p{font-size:13.5px;color:var(--ink-2);line-height:1.78;}
.pf-sec p b{color:var(--ink);}
.pf-sec.note{background:var(--brand-soft);border-left:3px solid var(--brand-line);
  padding:10px 13px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;}

@media(max-width:860px){
  .b5-wrap{grid-template-columns:1fr;gap:14px;}
  .b5-radar{max-width:200px;margin:0 auto;}
  .b5-form,.gl-form{max-height:60vh;}
  .b5-q{flex-direction:column;align-items:flex-start;gap:6px;padding:8px 0;}
  .b5-opt{width:34px;height:32px;}
  .sig-grid{grid-template-columns:1fr;}
}

/* ============================================================
   v1.10 · 批量导入
   两步：先「解析并预览」（只校验，不落库），确认后才真写。
   预览里必须同时能看到「能进多少」和「哪几行没通过」——
   只报一个成功数，用户没法判断是自己填错了还是系统吃掉了。
   ============================================================ */
.imp-note{font-size:12.5px;color:var(--ink-2);line-height:1.7;
  background:var(--brand-soft);border-left:3px solid var(--brand-line);
  padding:9px 12px;border-radius:0 var(--radius-sm) var(--radius-sm) 0;margin-bottom:10px;}
.imp-head{font-size:12px;color:var(--ink-3);margin-bottom:6px;line-height:1.7;}
.imp-head b{color:var(--ink-2);font-weight:700;}
.imp-ta{width:100%;height:190px;resize:vertical;padding:11px 13px;
  border:1px solid var(--line-strong);border-radius:var(--radius-sm);
  background:var(--card-2);font-family:ui-monospace,Menlo,Consolas,monospace;
  font-size:12.5px;line-height:1.7;white-space:pre;overflow:auto;}
.imp-ta:focus{outline:none;border-color:var(--brand-line);background:#fff;}
.imp-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:10px;}
.imp-pick{cursor:pointer;}
.imp-or{font-size:12px;color:var(--ink-3);}
.imp-err{margin-top:10px;font-size:12.5px;color:var(--risk);
  background:var(--risk-soft);border-radius:var(--radius-sm);padding:8px 12px;}

.imp-sum{display:flex;gap:8px;flex-wrap:wrap;margin-bottom:12px;}
.imp-k{font-size:12.5px;color:var(--ink-2);background:var(--card-2);
  border:1px solid var(--line);border-radius:99px;padding:4px 12px;}
.imp-k b{color:var(--ink);font-size:14px;}
.imp-k.ok{background:var(--grass-soft);border-color:var(--grass-line);color:var(--ok);}
.imp-k.ok b{color:var(--ok);}
.imp-k.bad{background:var(--risk-soft);border-color:var(--risk-line);color:var(--risk);}
.imp-k.bad b{color:var(--risk);}
.imp-pt{font-size:11px;font-weight:800;letter-spacing:.5px;color:var(--ink-3);margin-bottom:6px;}
.imp-prob{max-height:170px;overflow:auto;background:var(--risk-soft);
  border:1px solid var(--risk-line);border-radius:var(--radius-sm);padding:9px 11px;margin-bottom:12px;}
.imp-pi{font-size:12.5px;color:var(--ink-2);line-height:1.7;display:flex;gap:8px;}
.imp-pi span{color:var(--risk);font-weight:700;flex:0 0 62px;}
.imp-prev{background:var(--card-2);border:1px solid var(--line);
  border-radius:var(--radius-sm);padding:9px 11px;}
.imp-ptb{overflow:auto;max-height:190px;}
.imp-ptb table{border-collapse:collapse;font-size:12px;white-space:nowrap;}
.imp-ptb th{text-align:left;font-weight:700;color:var(--ink-2);
  background:var(--brand-soft);padding:5px 9px;border-bottom:1px solid var(--line-strong);}
.imp-ptb td{padding:5px 9px;color:var(--ink-2);border-bottom:1px solid var(--line);
  max-width:190px;overflow:hidden;text-overflow:ellipsis;}

@media(max-width:640px){
  .imp-ta{height:150px;font-size:12px;}
  .imp-pi{flex-direction:column;gap:0;}
  .imp-pi span{flex:none;}
}

/* ============================================================
   今日（首页 v2.13）· 手机优先的今日简报
   ------------------------------------------------------------
   设计取舍：钱一律中性色（品牌暖墨），只有「方向」用 进 / 出 区分 ——
   支出不是坏事，收入也不是好事，红绿涨跌色放在这里会误导判断。
   真正需要报警的（逾期、磁盘快满、今日有错误）才用 warn / risk 色。
   ============================================================ */
.bv-row{display:flex;align-items:center;gap:10px;padding:9px 0;border-bottom:1px dashed var(--line);}
.bv-row:last-child{border-bottom:none;}
.bv-k{flex:0 0 52px;font-size:12.5px;font-weight:800;color:var(--ink-3);}
.bv-v{flex:1;display:flex;gap:14px;justify-content:flex-end;flex-wrap:wrap;}
.bv-in,.bv-out{display:inline-flex;align-items:center;gap:6px;font-weight:800;
  font-variant-numeric:tabular-nums;color:var(--brand-deep);font-size:15px;}
.bvd{width:7px;height:7px;border-radius:2px;display:inline-block;flex:0 0 auto;}
.bvd.in{background:var(--grass);}
.bvd.out{background:var(--ink-3);}
.bguide{padding:14px 0 6px;}
.bguide b{color:var(--ink-2);font-size:13.5px;}
.brief-chips{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:12px 0 2px;}
.bchip{display:inline-flex;align-items:center;gap:5px;font-size:12px;font-weight:700;
  padding:4px 10px;border-radius:9px;background:var(--card-2);border:1px solid var(--line);}
.bchip.warn{background:var(--warn-soft);border-color:var(--warn-line);color:var(--warn);}
.bchip.risk{background:var(--risk-soft);border-color:var(--risk-line);color:var(--risk);}
.b-alert{display:flex;align-items:flex-start;gap:9px;padding:9px 0;border-bottom:1px dashed var(--line);}
.b-alert:last-child{border-bottom:none;}
.b-dot{width:8px;height:8px;border-radius:50%;flex:0 0 auto;margin-top:6px;}
.b-dot.warn{background:var(--warn);}
.b-dot.info{background:var(--info);}
.b-dot.ok{background:var(--ok);}
.bsys{display:flex;gap:16px;flex-wrap:wrap;margin:14px 2px 0;
  font-size:11.5px;color:var(--ink-3);font-weight:700;}
.bsys-i{display:inline-flex;align-items:center;gap:5px;}
.bsys-i.warn{color:var(--warn);}
.bsys-i.risk{color:var(--risk);}
.bquick{margin-top:14px;}
.bq{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px;}
.bq-i{display:flex;flex-direction:column;align-items:center;gap:7px;padding:14px 8px;
  border:1px solid var(--line);border-radius:var(--radius-sm);background:var(--card-2);
  cursor:pointer;font-weight:700;font-size:13px;color:var(--ink-2);transition:.14s;}
.bq-i:hover{border-color:var(--brand-line);background:var(--brand-soft);color:var(--brand-deep);}
.bq-ic{display:flex;color:var(--brand-deep);}
.bq-hint{margin-top:11px;font-size:11.5px;color:var(--ink-3);line-height:1.6;
  display:flex;align-items:flex-start;gap:5px;}
#page.fdrop{outline:2px dashed var(--brand);outline-offset:-10px;border-radius:var(--radius);}
@media(max-width:640px){
  .bq{grid-template-columns:1fr 1fr 1fr;gap:8px;}
  .bq-i{padding:12px 6px;font-size:12.5px;}
  .bv-v{gap:10px;font-size:14px;}
  .bv-in,.bv-out{font-size:14px;}
}

/* ============================================================
   对账台（v2.13）· 4 步向导
   ============================================================ */
.rcsteps{display:flex;align-items:center;gap:6px;flex-wrap:wrap;margin:12px 0 16px;}
.rcstep{display:inline-flex;align-items:center;gap:6px;font-size:12px;font-weight:700;color:var(--ink-3);
  padding:4px 10px;border-radius:9px;background:var(--card-2);border:1px solid var(--line);}
.rcstep i{display:inline-flex;align-items:center;justify-content:center;width:17px;height:17px;
  border-radius:50%;background:var(--line-strong);color:#fff;font-size:10.5px;font-style:normal;font-weight:800;}
.rcstep.on{color:var(--brand-deep);border-color:var(--brand-line);background:var(--brand-soft);}
.rcstep.on i{background:var(--brand-deep);}
.rcstep.done{color:var(--ok);}
.rcstep.done i{background:var(--ok);}
.rcsep{color:var(--ink-3);display:inline-flex;align-items:center;}
.rcslots{display:grid;grid-template-columns:1fr 1fr;gap:12px;margin-bottom:12px;}
.rcslot{border:1px dashed var(--line-strong);border-radius:var(--radius-sm);padding:13px 14px;
  display:flex;flex-direction:column;gap:9px;align-items:flex-start;background:var(--card-2);min-width:0;}
.rcs-h{font-size:11.5px;font-weight:800;letter-spacing:.06em;color:var(--ink-3);}
.rcs-file{display:flex;align-items:center;gap:7px;width:100%;min-width:0;color:var(--brand-deep);}
.rcs-file b{font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rcs-empty{color:var(--ink-3);font-size:12.5px;padding:3px 0;}
.rc-foot{display:flex;align-items:center;gap:9px;margin-top:12px;flex-wrap:wrap;}
.rcp-e{flex:0 0 auto;font-size:10.5px;font-weight:800;color:var(--ink-3);
  background:var(--card-2);border:1px solid var(--line);border-radius:7px;padding:3px 6px;}
.rcplist{max-height:52vh;overflow:auto;border:1px solid var(--line);border-radius:var(--radius-sm);}
.rcp-i{display:flex;align-items:center;gap:10px;padding:10px 12px;border-bottom:1px solid var(--line);cursor:pointer;}
.rcp-i:last-child{border-bottom:none;}
.rcp-i:hover{background:var(--brand-soft);}
.rcp-n{font-weight:700;font-size:13px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rcp-m{font-size:11.5px;color:var(--ink-3);margin-top:1px;}
.rcpv-tb,.rc-tb{overflow:auto;}
.rcpv-tb table{border-collapse:collapse;font-size:12px;white-space:nowrap;}
.rcpv-tb th{text-align:left;font-weight:700;color:var(--ink-2);background:var(--brand-soft);
  padding:5px 9px;border-bottom:1px solid var(--line-strong);}
.rcpv-tb td{padding:5px 9px;color:var(--ink-2);border-bottom:1px solid var(--line);max-width:190px;overflow:hidden;text-overflow:ellipsis;}
.rc-tb table{width:100%;border-collapse:collapse;font-size:12.5px;}
.rc-tb th{text-align:left;font-weight:800;color:var(--ink-3);font-size:11.5px;letter-spacing:.04em;
  padding:6px 9px;border-bottom:1px solid var(--line-strong);white-space:nowrap;}
.rc-tb td{padding:7px 9px;border-bottom:1px solid var(--line);font-variant-numeric:tabular-nums;}
.rc-k{font-weight:700;max-width:260px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rc-d{color:var(--risk);font-weight:800;}
.rcwiz .hint{font-size:12.5px;color:var(--ink-3);margin:2px 0 12px;}
@media(max-width:640px){
  .rcslots{grid-template-columns:1fr;}
  .rc-tb table{min-width:480px;}
  .rcstep{padding:3px 8px;font-size:11.5px;}
  .rcsep{display:none;}
}

/* ============================================================
   图标选择器（v2.13）· 主体 / 模板共用
   ============================================================ */
.iconbtn{display:inline-flex;align-items:center;gap:2px;justify-content:flex-start;
  min-width:150px;text-align:left;}
.iconbtn .ico{color:var(--brand-deep);}
.mh-ic{display:inline-flex;align-items:center;color:var(--brand-deep);}
.icgrid{margin-top:9px;border:1px solid var(--line);border-radius:var(--radius-sm);
  background:var(--card-2);padding:9px;}
.icbar{display:flex;gap:8px;align-items:center;margin-bottom:9px;}
.icsq{flex:1;min-width:0;padding:7px 10px;border:1px solid var(--line-strong);border-radius:10px;
  background:#fff;outline:none;font-size:12.5px;}
.icsq:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}
.iccells{display:grid;grid-template-columns:repeat(auto-fill,minmax(80px,1fr));gap:7px;
  max-height:34vh;overflow:auto;}
.iccell{display:flex;flex-direction:column;align-items:center;gap:6px;padding:11px 6px;
  border:1px solid var(--line);border-radius:11px;background:var(--card-2);cursor:pointer;
  color:var(--ink-2);transition:.13s;min-width:0;}
.iccell:hover{border-color:var(--brand-line);background:var(--brand-soft);color:var(--brand-deep);}
.iccell span{font-size:10px;font-weight:700;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}

/* 导入框：备用表头提示（v2.13 读运行时 /api/import/spec） */
.imp-alias{font-size:11.5px;color:var(--ink-3);margin:-4px 0 10px;line-height:1.6;}

/* 导入框：已读入的文件（v2.14 · xlsx 浏览器端解析） */
.imp-filebox{background:var(--card-2);border:1px solid var(--line);border-radius:var(--radius-sm);
  padding:11px 13px;margin-bottom:10px;}
.imp-filehd{display:flex;align-items:center;gap:6px;font-size:13px;color:var(--brand-deep);}
.imp-filehd b{word-break:break-all;}
.imp-filemeta{font-size:11.5px;color:var(--ink-3);margin-top:4px;}
.imp-kindrow{gap:9px;}
.imp-kindrow .imp-klb{font-size:12px;font-weight:700;color:var(--ink-2);flex:0 0 auto;}
.imp-kindrow select{padding:7px 10px;border:1px solid var(--line-strong);border-radius:11px;
  background:#fff;font-size:12.5px;outline:none;}
.imp-kindrow select:focus{border-color:var(--brand);box-shadow:0 0 0 3px var(--brand-soft);}

/* ============================================================
   加到主屏引导（手机，可关）
   ============================================================ */
.a2hs{position:fixed;left:12px;right:12px;bottom:calc(132px + env(safe-area-inset-bottom));
  z-index:72;display:flex;align-items:center;gap:10px;padding:11px 13px;
  background:var(--card);border:1px solid var(--brand-line);border-radius:var(--radius);
  box-shadow:var(--shadow-lg);}
.a2hs-t{flex:1;font-size:12.5px;color:var(--ink-2);line-height:1.5;}
.a2hs .btn{flex:0 0 auto;}
/* 「查看安装步骤 →」：装不上主屏时最需要的那一步 —— iPhone / 华为的图文步骤在这 */
.a2hs-link{display:block;margin-top:4px;font-size:12px;font-weight:700;color:var(--brand-deep);
  text-decoration:none;}
.a2hs-link:hover{text-decoration:underline;}




/* ============================================================
   v2.20 · 手机版 2.0（今日驾驶舱 #/m + 全部功能 #/all）
   ------------------------------------------------------------
   设计口径：内容优先、入口精简。首屏先回答「今天要办什么 / 最近记了什么」，
   入口只留 4 个；数字与任务都来自现有接口，不新造数据。
   命名统一 m2- 前缀，跟桌面组件（.card / .panel）彻底隔开。
   ============================================================ */

/* ---- 手机版底栏：中间突出大圆钮直接拍照 ---- */
.tabbar.mtab{align-items:center;}
.tabbar.mtab a{
  flex:1;position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:3px;height:56px;font-size:10.5px;font-weight:700;color:var(--ink-3);
  background:transparent;border:0;font-family:inherit;cursor:pointer;
  text-decoration:none;-webkit-tap-highlight-color:transparent;
}
.tabbar.mtab a .ic{
  display:inline-flex;align-items:center;justify-content:center;height:20px;
}
.tabbar.mtab a.on{color:var(--brand-deep);}
.tabbar.mtab a.on::before{
  content:'';position:absolute;top:0;left:50%;transform:translateX(-50%);
  width:26px;height:3px;border-radius:0 0 3px 3px;background:var(--brand);
}
.tabbar.mtab .mtab-cam{
  flex:0 0 auto;align-self:center;width:58px;height:58px;margin:0 4px;position:relative;top:-13px;
  display:flex;align-items:center;justify-content:center;border:0;border-radius:50%;
  background:var(--brand);color:var(--brand-deep);cursor:pointer;
  box-shadow:0 6px 18px rgba(74,63,53,.28);-webkit-tap-highlight-color:transparent;
  transition:transform .12s;
}
.tabbar.mtab .mtab-cam:active{transform:scale(.94);}
.tabbar.mtab .mtab-cam .ic{height:auto;}

/* ---- 驾驶舱骨架：一条手机宽度的列，块与块之间留 12px ---- */
.m2{max-width:640px;margin:0 auto;display:flex;flex-direction:column;gap:12px;}
.m2-sec{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:13px 15px 11px;}
.m2-h{display:flex;align-items:center;gap:8px;margin-bottom:6px;}
.m2-h b{font-size:15px;font-weight:800;color:var(--brand-deep);letter-spacing:-.01em;}
.m2-n{font-size:11.5px;font-weight:800;color:var(--brand-deep);background:var(--brand-soft);
  border-radius:99px;padding:1px 8px;}
.m2-h .sp{flex:1;}
.m2-more{font-size:12px;font-weight:700;color:var(--ink-3);text-decoration:none;white-space:nowrap;}
.m2-more:hover{color:var(--brand-deep);}
.m2-foot{font-size:11.5px;color:var(--ink-3);padding-top:7px;border-top:1px dashed var(--line);}
.m2-foot a{font-weight:700;color:var(--brand-deep);text-decoration:none;}

/* ---- 今天要办：一行一条，勾选框在左 ---- */
.m2-t{display:flex;align-items:center;gap:11px;padding:9px 0;border-top:1px dashed var(--line);}
.m2-t:first-child{border-top:0;padding-top:4px;}
.m2-ck{flex:0 0 auto;width:24px;height:24px;border-radius:8px;border:1.6px solid var(--line-strong);
  background:#fff;color:transparent;display:grid;place-items:center;cursor:pointer;padding:0;
  -webkit-tap-highlight-color:transparent;transition:.13s;}
.m2-ck:hover{border-color:var(--brand);background:var(--brand-soft);}
.m2-ck:active{transform:scale(.9);}
.m2-tb{flex:1;min-width:0;}
.m2-tt{font-size:13.5px;font-weight:600;color:var(--ink);line-height:1.45;
  display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;}
.m2-tm{font-size:11px;color:var(--ink-3);margin-top:1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.m2-up{display:flex;align-items:center;gap:11px;padding:7px 0;border-top:1px dashed var(--line);}
.m2-up:first-of-type{border-top:0;}
.m2-ui{flex:0 0 auto;display:flex;color:var(--brand-deep);width:24px;justify-content:center;}

/* ---- 资金一行 ---- */
.m2-money{display:grid;grid-template-columns:1.12fr 1fr;gap:10px;}
.m2-mc{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:10px 14px;
  box-shadow:var(--shadow);cursor:pointer;transition:transform .1s;}
.m2-mc:active{transform:scale(.985);}
.m2-mc .k{font-size:11px;font-weight:700;color:var(--ink-3);}
.m2-mc .v{font-size:17px;font-weight:800;color:var(--brand-deep);margin-top:2px;letter-spacing:-.02em;}
.m2-mc .v.bad{color:var(--risk);}
.m2-mc .n{font-size:11px;color:var(--ink-3);margin-top:1px;}
.m2-dash{color:var(--ink-3);}

/* ---- 4 个入口：横向紧凑，图标 21px ---- */
.m2-quick{display:grid;grid-template-columns:repeat(4,1fr);gap:9px;}
.m2-q{display:flex;flex-direction:column;align-items:center;gap:6px;padding:11px 4px;
  background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);
  font-size:11.5px;font-weight:700;color:var(--brand-deep);cursor:pointer;text-decoration:none;
  transition:transform .1s,border-color .14s,background .14s;-webkit-tap-highlight-color:transparent;}
.m2-q:hover{border-color:var(--brand-line);background:var(--brand-soft);}
.m2-q:active{transform:scale(.97);}
.m2-qi{display:flex;color:var(--brand-deep);}

/* ---- 最近记录 ---- */
.m2-recs{display:flex;flex-direction:column;}
.m2-r{display:flex;align-items:center;gap:11px;padding:8px 0;border-top:1px dashed var(--line);
  text-decoration:none;color:inherit;-webkit-tap-highlight-color:transparent;}
.m2-r:first-child{border-top:0;padding-top:3px;}
.m2-r:active{opacity:.75;}
.m2-rth{flex:0 0 auto;width:44px;height:44px;border-radius:11px;object-fit:cover;
  border:1px solid var(--line);background:var(--card-2);}
.m2-rico{flex:0 0 auto;width:44px;height:44px;border-radius:11px;display:grid;place-items:center;
  background:var(--brand-deep-soft);color:var(--brand-deep);}
.m2-rt{flex:1;min-width:0;display:flex;flex-direction:column;}
.m2-rt b{font-size:13px;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.m2-rt span{font-size:11px;color:var(--ink-3);margin-top:1px;}

/* ---- 空态：给下一步动作，不留一片白 ---- */
.m2-empty{padding:4px 0 3px;display:flex;flex-direction:column;gap:4px;}
.m2-empty b{font-size:13.5px;font-weight:700;color:var(--ink);}
.m2-empty span{font-size:12px;color:var(--ink-3);line-height:1.6;}
.m2-empty>div{display:flex;gap:8px;margin-top:5px;}

/* ---- 全部功能（#/all）：四张分组卡 + 常驻条 ---- */
.m2-all{gap:12px;max-width:900px;}
.m2-ahero{padding:2px 2px 0;}
.m2-ahero .t{font-size:21px;font-weight:800;letter-spacing:-.02em;color:var(--brand-deep);}
.m2-ahero .d{font-size:12.5px;color:var(--ink-3);margin-top:3px;}
.m2-pin{display:flex;align-items:center;gap:10px;flex-wrap:wrap;padding:10px 13px;
  background:var(--card);border:1px solid var(--line);border-radius:14px;box-shadow:var(--shadow);}
.m2-pinl{font-size:11px;font-weight:800;color:var(--ink-3);letter-spacing:.08em;}
.m2-cards{display:grid;grid-template-columns:1fr;gap:12px;}
@media(min-width:720px){.m2-cards{grid-template-columns:1fr 1fr;align-items:start;}}
.m2-gcard{background:var(--card);border:1px solid var(--line);border-radius:var(--radius);
  box-shadow:var(--shadow);padding:13px 15px;}
.m2-gh{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
.m2-gi{display:flex;color:var(--brand-deep);}
.m2-gh b{font-size:15px;font-weight:800;color:var(--brand-deep);}
.m2-gd{font-size:11px;color:var(--ink-3);margin-left:auto;text-align:right;}
.m2-gg{margin-top:9px;}
.m2-gl{font-size:11px;font-weight:800;color:var(--ink-3);letter-spacing:.06em;margin-bottom:6px;}
.m2-chips{display:flex;flex-wrap:wrap;gap:7px;}
.m2-chip{display:inline-flex;align-items:center;gap:5px;padding:6px 10px;border:1px solid var(--line);
  border-radius:999px;background:var(--card-2);color:var(--ink-2);font-size:12.5px;font-weight:600;
  text-decoration:none;transition:transform .1s,border-color .13s,background .13s;
  -webkit-tap-highlight-color:transparent;}
.m2-chip:hover{border-color:var(--brand-line);background:var(--brand-soft);color:var(--brand-deep);}
.m2-chip:active{transform:scale(.97);}
.m2-ci{display:flex;color:var(--brand-deep);}
/* 驾驶舱/全部功能页自带「记文字」入口，浮标在这里只压内容（app.js 在 render 里挂 body 类） */
.m2-page .fab{display:none;}

/* ---- toast 上的「去查看」动作（#toasts 是 pointer-events:none，这里单独放行）---- */
.toast-go,.toast-undo{margin-left:10px;padding:2px 9px;border:1px solid rgba(255,255,255,.55);border-radius:99px;
  background:transparent;color:inherit;font:700 12px inherit;cursor:pointer;pointer-events:auto;}

/* ============================================================
   v2.21 · 手机「手感」（触达 44 / 按压反馈 / 输入不缩放）
   ------------------------------------------------------------
   起因：田田「感觉很多交互，按钮都存在问题」。量化诊断（205 个 data-act 全有实现、
   弹层 189 项全开合）说明**不是接线问题，是手感问题**：
     A 按钮实测 26–35px 高，手指点不中；
     B 全站只有 :hover —— 手机没有 hover，按下去屏幕一动不动，像坏了；
     C 输入框 12.5–14px，iOS 聚焦会强制把整页放大；
     D 没有 touch-action，双击判定要等 300ms。
   ⚠ 全部写在 ≤860px 内 —— 桌面（>860px）一个像素都不许动。
   ============================================================ */
@media(max-width:860px){
  /* 按压底色的统一色阶：比 hover 的 --brand-soft(#FFF7CC) 再深一档，
     这样「按下」和「悬停」不会长得一模一样（手机虽无 hover，但 iOS 点击会给粘滞 hover）。 */
  :root{--tap:#FFEFA8;}

  /* ---------- D. 触控：消灭双击缩放判定 ---------- */
  html,body{touch-action:manipulation;}

  /* ---------- A. 触达 44px ----------
     口径：能长高的就直接长（不留热区重叠的歧义），
     只有「视觉必须小」的图标键（.m2-ck）才用 ::after 扩热区。
     之前 .btn 26–30px / .sm 35 / .xs 31，全不达标。 */
  .btn{min-height:44px;font-size:15px;padding:10px 16px;}
  .btn.sm{min-height:44px;min-width:44px;font-size:14px;padding:8px 13px;}
  /* 图标型 .sm（顶栏搜索）只有 36 宽，靠 min-width 补到 44，文字型本来就超 44 不受影响 */
  /* <a class="btn"> 是 inline，min-height 对它无效 —— 必须给 inline-flex 才吃得到 44 */
  a.btn{display:inline-flex;align-items:center;justify-content:center;}
  /* .xs 不再靠缩字号撑密度：图标型（→ / ＋）给 min-width，避免宽 32 点不中 */
  .btn.xs{min-height:44px;min-width:44px;font-size:13px;padding:4px 12px;}
  /* 卡片脚那排「完成 / 延期 / 删」是纯文字按键，29px 高；flex:1 撑宽，长高即可 */
  .pact{min-height:44px;font-size:12.5px;padding:10px 4px;}
  /* 筛选 chip：25px 高的胶囊在手机上是纯受罪 */
  .dchip{min-height:44px;font-size:13px;padding:8px 13px;display:inline-flex;align-items:center;}
  /* 分段控件（生活｜工作 / 全部 / 待办…）贴着排，只能长高不能扩热区 */
  .seg button{min-height:44px;min-width:44px;font-size:13px;padding:8px 14px;}
  .filters .seg button{min-height:44px;}
  /* 顶栏铃铛 36×36 */
  .bell{width:44px;height:44px;}
  /* 「我的」页导航宫格 40 高 */
  .ng-item{min-height:44px;}
  /* 全功能页入口胶囊 35 高 */
  .m2-chip{min-height:44px;font-size:13px;padding:9px 13px;}
  /* 区块标题右侧的「全部 →」「管理主体 →」是区块级入口，视觉是字，
     但真要点得中 —— 用伪元素扩热区，行高不动，标题排版不变。 */
  .m2-more,.sec-a{position:relative;}
  .m2-more::after,.sec-a::after{content:'';position:absolute;inset:-13px -8px;}
  /* 原生下拉是拇指目标，34px 太矮（字号在下面统一升到 16，这里补高度） */
  select{min-height:44px;}

  /* 唯一用伪元素扩热区的：待办勾选框。它是 24×24 的方框，
     撑成 44 会把视觉方框放大一倍，而四周是非交互文字，扩热区不会误伤。 */
  .m2-ck{position:relative;}
  /* -12 而不是 -10：24px 的框有 1.6px 边框，按 padding box 算 -10 只有 41px，
     得把边框一起吃掉才是 44。 */
  .m2-ck::after{content:'';position:absolute;inset:-12px;}
  /* 勾选框原本就有 scale(.9)，这里只补底色，不改它自己的按压幅度 */
  .m2-ck:active{background:var(--tap);border-color:var(--brand);}

  /* ---------- B. 按压反馈 ----------
     选「统一 :active」而不是改 tap-highlight：两者同时开会叠加成双反馈
     （iOS 的灰闪 + 我们的缩放），反而更乱。所以全站 -webkit-tap-highlight-color
     保持 transparent，反馈一律由 :active 给：transform:scale(.97) + 背景深一档 + .1s。
     手机上没有 hover，这是用户唯一能拿到的「按下去了」的信号。 */
  .btn,button,.pact,.dchip,.m2-chip,.m2-q,.m2-mc,.m2-r,.ng-item,.tabbar a,.nav a,
  .drow-hd,.trow,.sr-item,.stat,.al-item,.notif-item,.pick,.imp-pick,.tpl-card{
    transition:transform .1s ease,background-color .12s ease,border-color .12s ease,opacity .12s ease;
    -webkit-user-select:none;user-select:none;
  }
  .btn:active,button:active,.pact:active,.dchip:active,.ng-item:active,
  .tabbar a:active,.nav a:active,.drow-hd:active,.trow:active,.sr-item:active,
  .stat:active,.al-item:active,.notif-item:active,.pick:active,.tpl-card:active,
  [data-act]:active,[data-task]:active{
    transform:scale(.97);
  }
  /* 背景各按语义深一档（黄更深、白底转暖、危险转红），比统一灰更低对比度损失 */
  .btn:active{border-color:var(--brand-line);background:var(--tap);}
  .btn.primary:active{background:#E8D400;border-color:#E8D400;}
  .btn.dark:active{background:#3B322A;border-color:#3B322A;}
  .btn.danger:active{background:var(--risk-soft);border-color:var(--risk-line);}
  .btn.ghost:active{background:var(--tap);}
  /* 已选中的（.on / primary）不能被按下态「按浅」—— 只能更深 */
  .btn.on:active,.btn.primary.on:active,.dchip.on:active,.pact.on:active{
    background:#E8D400;border-color:#E8D400;color:#3A3218;
  }
  .btn:disabled:active{transform:none;background:#fff;}
  .btn.primary:disabled:active{background:var(--brand);}
  .pact:active{background:var(--tap);color:var(--ink);box-shadow:0 1px 3px rgba(74,63,53,.09);}
  .dchip:active,.m2-chip:active{border-color:var(--brand-line);background:var(--tap);}
  .drow-hd:active,.stat:active,.al-item:active,.pick:active,.tpl-card:active{background:var(--tap);}
  .sr-item:active,.notif-item:active{background:var(--tap);}
  .trow:active{background:var(--tap);}
  .tabbar a:active,.nav a:active{background:rgba(217,168,0,.18);}
  /* 底栏那张「拍照」大圆钮本来就有 .94 缩放，别再被通用 .97 覆盖 */
  .tabbar.mtab .mtab-cam:active{transform:scale(.94);}

  /* ---------- C. iOS 聚焦不缩放 ----------
     16px 是硬门槛：低于它 Safari 会把整页放大。
     44 个路由里共有 31 个可见输入控件，改前 31/31 全部 12.5–14px（无一合格）。
     变体太多（.filters select / .note-in textarea / .dsearch select / .calc .fld input…），
     一处一处补必然漏，所以在移动端用一条 !important 兜底 —— 只作用于字号，
     不动 padding/宽度，不会把布局撑开。 */
  input,select,textarea{font-size:16px!important;}
  /* 输入框也是拇指目标：日期/金额这类原生输入改前 39px 高。
     checkbox/radio 除外 —— 撑高会把勾选框拉变形。 */
  input:not([type=checkbox]):not([type=radio]),select,textarea{min-height:44px;}

  /* 输入框仍然要能长按选中（上面的 user-select:none 只给按键） */
  input,select,textarea{-webkit-user-select:text;user-select:text;}
}

/* ============================================================
   v2.22 · 工作台 12 项全量（P1 七项：G I J M O R S）
   ------------------------------------------------------------
   口径：全部复用既有设计语言（暖墨 / .panel / .tag / .seg），
   只新增下面这几组前缀，不造第二套组件风格。
     cmdk- 命令面板 · undo- 撤销条 · drill- 下钻 chip
     tl-   实体时间线 · rv- 每日回顾 · rule- 分类规则
   ============================================================ */

/* ---- G 命令面板 ---- */
.cmdk{position:fixed;inset:0;z-index:130;display:none;}
.cmdk.on{display:block;}
.cmdk-mask{position:absolute;inset:0;background:rgba(35,29,22,.36);}
.cmdk-box{position:absolute;left:50%;top:11vh;transform:translateX(-50%);
  width:min(660px,calc(100% - 32px));max-height:70vh;display:flex;flex-direction:column;
  background:var(--card);border:1px solid var(--line-strong);border-radius:16px;
  box-shadow:0 26px 64px rgba(35,29,22,.3);overflow:hidden;}
.cmdk-in{display:flex;align-items:center;gap:9px;padding:13px 15px;border-bottom:1px solid var(--line);}
.cm-ic{display:flex;flex:0 0 auto;color:var(--ink-3);}
.cmdk-in input{flex:1;min-width:0;border:0;outline:0;background:transparent;font-size:15px;color:var(--ink);font-family:inherit;}
.cmdk-x{border:1px solid var(--line);background:var(--card-2);color:var(--ink-3);border-radius:7px;
  font:700 11px/1 inherit;padding:4px 7px;cursor:pointer;}
.cmdk-res{overflow:auto;padding:4px 0 8px;flex:1;min-height:0;}
.cm-g{font-size:10.5px;font-weight:800;letter-spacing:.1em;color:var(--ink-3);padding:10px 16px 4px;}
.cm-i{display:flex;align-items:center;gap:9px;padding:8px 16px;cursor:pointer;}
.cm-i.on{background:var(--brand-soft);}
.cm-t{font-size:13.5px;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cm-i .cm-s{font-size:11.5px;color:var(--ink-3);margin-left:auto;max-width:46%;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.cm-empty{padding:24px 16px;font-size:12.5px;color:var(--ink-3);line-height:1.7;}
.cmdk-foot{display:flex;gap:15px;padding:8px 16px;border-top:1px solid var(--line);font-size:11px;color:var(--ink-3);}
.cmdk-foot b{color:var(--ink-2);font-weight:800;}
@media(max-width:860px){
  /* 手机上面板就是整屏：小屏里「居中浮层」上下都露一条背景，反而干扰 */
  .cmdk-box{top:0;left:0;transform:none;width:100%;height:100%;max-height:100%;border:0;border-radius:0;}
  .cmdk-in{padding:14px 14px;}
  .cm-i{min-height:48px;padding:10px 14px;}
  .cmdk-foot{padding-bottom:calc(8px + env(safe-area-inset-bottom));}
}

/* ---- I 撤销条（与 .toast 同一条通道，只是多一个可点的「撤销」）---- */
.toast.undo{background:var(--brand-deep);color:#FFF8E7;}
.toast.undo .undo-tx{margin-right:2px;}

/* ---- J 手机列表行尾复选框 ---- */
.trow-pick{flex:0 0 auto;display:flex;align-items:center;justify-content:center;width:30px;}
.trow-pick .pick{width:19px;height:19px;accent-color:var(--brand-deep);}
@media(max-width:860px){
  /* 批量条不许压在底栏上：底栏 56 + 安全区，条自己再抬 8 */
  .batch-bar{bottom:calc(64px + env(safe-area-inset-bottom));}
  /* 复选框排在第二行最右：状态标签后面、删除键前面。
     行内第二行本来是 [tag][due] … [状态][删除]，状态自带 margin-left:auto
     把空隙吸走，所以复选框只要老老实实跟在它后面即可。 */
  .trow .trow-pick{order:3;width:44px;margin-left:2px;}
  .trow .row-del{order:4;margin-left:0;}
  .trow-pick .pick{width:22px;height:22px;}
}

/* ---- M 数字下钻 ----
   .stat 一直带着 cursor:pointer，但绝大多数数字点了没反应 —— 那是假按钮。
   现在只有真能跳的（.is-link）才给可点样式：数字加下划线 + 右下角箭头。 */
#page .stat{cursor:default;}
#page .stat.is-link{cursor:pointer;position:relative;}
#page .stat.is-link .v{text-decoration:underline;text-decoration-thickness:1.5px;
  text-underline-offset:4px;text-decoration-color:rgba(74,63,53,.32);}
#page .stat.is-link::after{content:'→';position:absolute;right:14px;bottom:11px;
  font-size:12px;font-weight:800;color:var(--ink-3);}
.kpi.is-link{cursor:pointer;position:relative;}
.kpi.is-link .v{text-decoration:underline;text-decoration-thickness:1.5px;
  text-underline-offset:4px;text-decoration-color:rgba(74,63,53,.3);}
.kpi.is-link::after{content:'→';position:absolute;right:14px;bottom:10px;
  font-size:12px;font-weight:800;color:var(--ink-3);}

/* 下钻后的筛选 chip：一眼看见「我现在看的是被筛过的」，且能一键清掉 */
.drill{display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:2px 0 12px;}
.drill-l{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ink-3);}
.drill-c{display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border-radius:999px;
  background:var(--brand-soft);border:1px solid var(--brand-line);color:var(--brand-deep);
  font-size:12px;font-weight:700;}
.drill-c button{border:0;background:transparent;color:inherit;font:800 13px/1 inherit;
  cursor:pointer;padding:0 1px;opacity:.72;}
.drill-c button:hover{opacity:1;}
.drill-x{border:1px dashed var(--line-strong);background:transparent;color:var(--ink-3);
  border-radius:999px;padding:4px 10px;font:700 12px inherit;cursor:pointer;}
.drill-x:hover{border-color:var(--brand-line);color:var(--brand-deep);}

/* ---- O 每日回顾「翻到旧东西」---- */
.rv-i{display:flex;align-items:flex-start;gap:10px;padding:9px 0;border-top:1px dashed var(--line);
  text-decoration:none;color:inherit;}
.rv-i:first-of-type{border-top:0;padding-top:3px;}
.rv-i:hover .rv-t{color:var(--brand-deep);}
.rv-k{flex:0 0 auto;display:grid;place-items:center;width:26px;height:26px;border-radius:9px;
  background:var(--brand-deep-soft);color:var(--brand-deep);margin-top:1px;}
.rv-b{flex:1;min-width:0;}
.rv-t{font-size:13px;font-weight:600;color:var(--ink);line-height:1.45;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rv-s{font-size:11.5px;color:var(--ink-3);margin-top:1px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.rv-d{flex:0 0 auto;font-size:11px;color:var(--ink-3);white-space:nowrap;margin-top:3px;}

/* ---- S 实体时间线（按天分组的竖向轴）---- */
.tl{position:relative;padding-left:18px;}
.tl::before{content:'';position:absolute;left:5px;top:4px;bottom:4px;width:1.5px;
  background:linear-gradient(var(--line-strong),var(--line));border-radius:2px;}
.tl-d{font-size:11px;font-weight:800;letter-spacing:.06em;color:var(--ink-3);
  margin:10px 0 5px;position:relative;}
.tl-d:first-child{margin-top:0;}
.tl-d::before{content:'';position:absolute;left:-16.5px;top:4px;width:7px;height:7px;border-radius:50%;
  background:var(--brand);border:1.5px solid var(--card);}
.tl-i{display:flex;align-items:flex-start;gap:8px;padding:6px 0;text-decoration:none;color:inherit;
  border-radius:8px;}
.tl-i:hover{background:var(--brand-soft);}
.tl-ic{flex:0 0 auto;display:flex;color:var(--ink-3);margin-top:2px;position:relative;left:-3px;}
.tl-t{font-size:13px;font-weight:600;color:var(--ink);line-height:1.45;}
.tl-s{font-size:11.5px;color:var(--ink-3);margin-top:1px;}
.tl-empty{font-size:12.5px;color:var(--ink-3);padding:10px 0 4px;}

/* ---- R 分类规则 ---- */
.rule-row{display:flex;align-items:flex-start;gap:10px;padding:11px 0;border-top:1px dashed var(--line);}
.rule-row:first-child{border-top:0;}
.rule-b{flex:1;min-width:0;}
.rule-n{font-size:13.5px;font-weight:700;color:var(--ink);}
.rule-kw{display:flex;flex-wrap:wrap;gap:5px;margin-top:5px;}
.rule-kw span{font-size:11.5px;font-weight:600;color:var(--ink-2);background:var(--card-2);
  border:1px solid var(--line);border-radius:999px;padding:2px 8px;}
.rule-hit{font-size:11.5px;color:var(--ink-3);white-space:nowrap;margin-top:3px;}

/* 链接化的数字卡：<a> 默认 inline + 下划线，这里恢复成卡片外观 */
#page .stat.is-link{display:block;text-decoration:none;color:inherit;}
.kpi.is-link{display:block;text-decoration:none;color:inherit;}
.m2-mc{display:block;text-decoration:none;color:inherit;}
/* 回顾 / 时间线的两行文字（span 结构里要显式成块，否则会并排成一行） */
.rv-b{display:flex;flex-direction:column;min-width:0;}
.tl-i>span{display:flex;flex-direction:column;min-width:0;}

/* 手机资金两格：也是真链接，给下划线 + 箭头（与桌面 .stat.is-link 同一套语义） */
.m2-mc{position:relative;}
.m2-mc .v{text-decoration:underline;text-decoration-thickness:1.5px;
  text-underline-offset:3px;text-decoration-color:rgba(74,63,53,.28);}
.m2-mc::after{content:'→';position:absolute;right:11px;top:9px;
  font-size:11px;font-weight:800;color:var(--ink-3);}
/* 回顾条目两种载体（<a> / 点了执行动作的 <div>）观感一致 */
.rv-i{cursor:pointer;}

/* v2.22 手机触达：新加的这几类可点元素也得 ≥44（tap-audit 会量它们） */
@media(max-width:860px){
  .drill-x{min-height:44px;padding:8px 14px;display:inline-flex;align-items:center;}
  .rv-i{min-height:44px;}
  .tl-i{min-height:44px;}
  .rule-row .btn.xs{min-height:44px;}
}

/* 桌面「翻到旧东西」可折叠（原生 details，默认展开） */
.rv-det>summary{list-style:none;cursor:pointer;display:flex;align-items:center;gap:7px;
  font-size:13.5px;font-weight:800;color:var(--brand-deep);margin-bottom:6px;}
.rv-det>summary::-webkit-details-marker{display:none;}
.rv-det>summary::after{content:'⌄';margin-left:auto;color:var(--ink-3);font-weight:800;
  transition:transform .15s;}
.rv-det:not([open])>summary::after{transform:rotate(-90deg);}
.rv-det:not([open])>summary{margin-bottom:0;}

/* ============================================================
   v2.22.1 · P2（H K L N P Q T）
     m2-tbx 时间盒 · oboard/ocard 订单看板 · ocal 订单日历
     ptl 项目时间线 · ptl-bar 表格进度条
   ============================================================ */

/* ---- Q 今天的时间盒 ---- */
.m2-tbx{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px dashed var(--line);}
.m2-tbx:first-child{border-top:0;padding-top:2px;}
.m2-tbx.done{opacity:.55;}
.m2-tbt{flex:0 0 44px;font-size:12px;font-weight:800;font-variant-numeric:tabular-nums;
  color:var(--brand-deep);}
.m2-tbb{flex:1;min-width:0;display:flex;flex-direction:column;}
.m2-tbb b{font-size:13.5px;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.m2-tbb span{font-size:11.5px;color:var(--ink-3);margin-top:1px;}

/* ---- K 订单看板 ---- */
.oboard{display:grid;grid-template-columns:repeat(6,minmax(150px,1fr));gap:10px;margin-top:14px;
  overflow-x:auto;padding-bottom:4px;}
.ocol{background:var(--card-2);border:1px solid var(--line);border-radius:12px;padding:8px;min-height:120px;}
.ocol-h{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding:2px 3px 7px;border-bottom:1px dashed var(--line);}
.ocol-h b{font-size:12.5px;font-weight:800;color:var(--brand-deep);}
.ocol-s{margin-left:auto;font-size:11px;font-weight:700;color:var(--ink-3);}
.ocol-e{font-size:11.5px;color:var(--ink-3);padding:10px 3px;}
.ocard{background:var(--card);border:1px solid var(--line);border-radius:10px;padding:8px 9px;
  margin-top:8px;cursor:pointer;box-shadow:var(--shadow);}
.ocard:hover{border-color:var(--brand-line);}
.ocard-n{font-size:11.5px;font-weight:800;color:var(--ink-2);font-family:ui-monospace,Menlo,Consolas,monospace;}
.ocard-p{font-size:12.5px;font-weight:600;color:var(--ink);margin-top:2px;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ocard-a{font-size:13px;font-weight:800;color:var(--brand-deep);margin-top:2px;}
.ocard-d{font-size:10.5px;color:var(--ink-3);margin-top:1px;}

/* ---- K 订单日历 ---- */
.ocal{margin-top:14px;}
.ocal-hd{display:flex;align-items:center;gap:10px;margin-bottom:8px;}
.ocal-hd b{font-size:14px;font-weight:800;color:var(--brand-deep);}
.ocal-g{display:grid;grid-template-columns:repeat(7,1fr);gap:6px;}
.ocal-w{font-size:10.5px;font-weight:800;color:var(--ink-3);text-align:center;padding-bottom:2px;letter-spacing:.08em;}
.ocal-c{background:var(--card);border:1px solid var(--line);border-radius:9px;min-height:72px;padding:5px 6px;}
.ocal-c.pad{background:transparent;border-color:transparent;}
.ocal-c.today{border-color:var(--brand);background:var(--brand-soft);}
.ocal-d{font-size:11px;font-weight:800;color:var(--ink-3);font-variant-numeric:tabular-nums;}
.ocal-i{margin-top:3px;font-size:10.5px;font-weight:700;color:var(--brand-deep);background:var(--card-2);
  border:1px solid var(--line);border-radius:6px;padding:1px 4px;cursor:pointer;
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ocal-i:hover{border-color:var(--brand-line);}
.ocal-m{font-size:10px;color:var(--ink-3);margin-top:2px;}

/* ---- K 项目时间线 ---- */
.ptl{padding:14px 16px;}
.ptl-hd{display:flex;align-items:center;font-size:11px;font-weight:700;color:var(--ink-3);
  padding-bottom:8px;border-bottom:1px dashed var(--line);margin-bottom:6px;}
.ptl-row{display:flex;align-items:center;gap:10px;padding:7px 0;cursor:pointer;border-radius:8px;}
.ptl-row:hover{background:var(--brand-soft);}
.ptl-nm{flex:0 0 128px;font-size:12.5px;font-weight:600;color:var(--ink);
  overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
.ptl-track{flex:1;position:relative;height:18px;background:var(--card-2);border-radius:6px;min-width:80px;}
.ptl-b{position:absolute;top:3px;height:12px;border-radius:5px;opacity:.92;
  display:flex;align-items:center;justify-content:flex-end;padding-right:4px;min-width:6px;}
.ptl-b b{font-size:9.5px;font-weight:800;color:#fff;letter-spacing:.02em;}
.ptl-d{flex:0 0 148px;text-align:right;font-size:10.5px;color:var(--ink-3);
  font-variant-numeric:tabular-nums;}
/* 表格里的进度条 */
.ptl-bar{height:6px;background:var(--card-2);border-radius:4px;overflow:hidden;margin-bottom:3px;}
.ptl-bar i{display:block;height:100%;border-radius:4px;}
@media(max-width:860px){
  /* 六列看板在手机上横向滚动，列宽收紧；日历格子压到能看见金额 */
  .oboard{grid-template-columns:repeat(6,minmax(132px,1fr));}
  .ocal-g{gap:4px;}
  .ocal-c{min-height:64px;padding:4px;}
  .ptl-nm{flex:0 0 84px;font-size:12px;}
  .ptl-d{display:none;}
}

/* ---- N 版面布局面板 ---- */
.plrow{display:flex;align-items:center;gap:8px;padding:7px 4px;border-bottom:1px dashed var(--line);cursor:grab;}
.plrow:last-child{border-bottom:0;}
.plrow.dragging{opacity:.45;background:var(--brand-soft);}
.plrow .plck{width:18px;height:18px;accent-color:var(--brand-deep);}
.plrow .plnm{flex:1;font-size:13.5px;font-weight:600;color:var(--ink);}

/* ---- P 本周回顾 ---- */
.wkr{display:grid;grid-template-columns:repeat(5,1fr);gap:8px;}
.wkr-i{display:flex;flex-direction:column;gap:2px;padding:8px 10px;border-radius:10px;
  background:var(--card-2);border:1px solid var(--line);text-decoration:none;color:inherit;}
.wkr-i:hover{border-color:var(--brand-line);background:var(--brand-soft);}
.wkr-k{font-size:11px;font-weight:700;color:var(--ink-3);}
.wkr-v{font-size:13px;font-weight:800;color:var(--brand-deep);font-variant-numeric:tabular-nums;}
.wkr-top{display:flex;align-items:center;gap:10px;flex-wrap:wrap;margin-top:9px;
  padding-top:8px;border-top:1px dashed var(--line);}
.wkr-top b{font-size:11px;font-weight:800;letter-spacing:.06em;color:var(--ink-3);}
.wkr-t{font-size:12px;font-weight:700;color:var(--ink-2);}
.wkr-t i{display:inline-grid;place-items:center;width:15px;height:15px;border-radius:50%;
  background:var(--brand-deep);color:#FFF8E7;font-style:normal;font-size:9.5px;margin-right:4px;}
@media(max-width:860px){.wkr{grid-template-columns:1fr 1fr;}}

/* ---- T 自动化规则 ---- */
.arow{display:flex;align-items:flex-start;gap:12px;padding:10px 0;border-top:1px dashed var(--line);}
.arow:first-of-type{border-top:0;}
.arow-b{flex:1;min-width:0;}
.arow-n{font-size:13.5px;font-weight:700;color:var(--ink);}
.arow-m{font-size:11.5px;color:var(--ink-3);margin-top:2px;line-height:1.55;}
.arow-sw{flex:0 0 auto;display:flex;align-items:center;gap:5px;font-size:11.5px;font-weight:800;
  color:var(--ink-3);cursor:pointer;padding-top:2px;}
.arow-sw input{width:18px;height:18px;accent-color:var(--brand-deep);}
.arow-logs{margin-top:10px;padding-top:9px;border-top:1px dashed var(--line);}
.arow-logs>b{font-size:11px;font-weight:800;letter-spacing:.06em;color:var(--ink-3);}
.arow-l{display:flex;gap:10px;font-size:11.5px;color:var(--ink-3);padding:3px 0;}
.arow-l .ok{color:var(--ok);font-weight:800;}
.arow-l .bad{color:var(--risk);font-weight:800;}

/* 手机版「收尾」是 <button class="m2-more">，把按钮默认外观去掉 */
button.m2-more{border:0;background:transparent;font-family:inherit;cursor:pointer;padding:0;}

/* v2.22.1 手机触达补偿（tap-audit 会逐个量）：
   日历条目 / 项目时间线行 / 手机版「收尾」都是视觉紧凑的可点元素，
   按 44px 撑开（用负 margin 抵掉行高变化，排版不变）。 */
@media(max-width:860px){
  .ocal-i{min-height:44px;display:flex;align-items:center;padding:2px 5px;white-space:normal;}
  .ocal-c{min-height:auto;}
  .ptl-row{min-height:44px;}
  button.m2-more{min-height:44px;min-width:44px;margin:-12px 0;display:inline-flex;
    align-items:center;justify-content:center;padding:0 8px;}
}

/* 周报卡的「收支」值是全卡最长的一串：手机上让它独占一行，别把字挤成两截 */
.wkr-v{overflow-wrap:anywhere;}
@media(max-width:860px){
  .wkr-i:nth-child(4){grid-column:1/-1;}
}

/* 手机上日历表头一行放得下：标题不折行、说明文字让位（它只是口径提示） */
@media(max-width:860px){
  .ocal-hd{gap:6px;}
  .ocal-hd b{white-space:nowrap;font-size:13px;}
  .ocal-hd .small{display:none;}
}

/* v2.22.1 修复：只有真能打开的条目才给"可点"光标（打不开的是纯文本） */
.rv-i[data-act],.tl-i[data-act]{cursor:pointer;}

/* ============================================================
   v2.23 · P1（A 四象限 / B 智能日期 / C 语音）
   ============================================================ */

/* ---- A 四象限：2×2，桌面大格、手机两列 ---- */
.quad{display:grid;grid-template-columns:1fr 1fr;gap:13px;align-items:start;}
.qcell{
  min-width:0;background:#FBF7EA;border:1px solid var(--line);
  border-radius:var(--radius);padding:12px;min-height:168px;
  border-left:3px solid var(--line-strong);
}
.qcell.q1{border-left-color:var(--risk);}
.qcell.q2{border-left-color:var(--warn);}
.qcell.q3{border-left-color:var(--info);}
.qcell.q4{border-left-color:var(--line-strong);}
.qh{display:flex;align-items:center;gap:7px;padding:1px 2px 9px;flex-wrap:wrap;}
.qh b{font-size:12.5px;font-weight:800;color:var(--brand-deep);letter-spacing:.01em;}
.qn{margin-left:auto;font-size:11.5px;font-weight:800;color:var(--ink-2);
  background:#FFF;border:1px solid var(--line);border-radius:99px;padding:0 8px;line-height:19px;}
.qd{flex:0 0 100%;font-size:11px;color:var(--ink-3);margin-top:-2px;padding-left:2px;}
.qcard{
  display:flex;gap:8px;background:#fff;border:1px solid var(--line);border-radius:12px;
  padding:8px 10px;margin-bottom:7px;cursor:pointer;transition:border-color .14s,box-shadow .14s;
}
.qcard:last-child{margin-bottom:0;}
.qcard:hover{border-color:var(--brand-line);box-shadow:0 3px 10px rgba(74,63,53,.07);}
.qdot{flex:0 0 auto;width:7px;height:7px;border-radius:50%;margin-top:6px;}
.qmain{min-width:0;flex:1;}
.qt{font-size:12.8px;font-weight:600;line-height:1.45;overflow-wrap:anywhere;}
.qm{font-size:10.8px;color:var(--ink-3);margin-top:3px;overflow-wrap:anywhere;}
.qid{font-family:ui-monospace,Menlo,Consolas,monospace;font-weight:700;letter-spacing:.02em;}
.qlate{color:var(--risk);font-weight:800;}
.qmuted{color:var(--ink-3);}
.qempty{font-size:11.5px;color:var(--ink-3);line-height:1.65;padding:10px 2px;}

@media(max-width:860px){
  .quad{gap:9px;}
  .qcell{padding:9px;min-height:132px;border-radius:14px;}
  .qh{padding-bottom:7px;gap:5px;}
  .qh b{font-size:12px;}
  .qd{font-size:10.5px;}
  .qcard{padding:7px 8px;border-radius:10px;margin-bottom:6px;min-height:44px;align-items:center;}
  .qdot{margin-top:0;}
  .qt{font-size:12.2px;}
  .qempty{font-size:11px;}
}

/* ---- B 智能日期：输入框 + 识别 chip ---- */
.sd-in{margin-top:6px;font-size:12.5px;}
.sd-box{min-height:0;}
.sd-chip{
  display:flex;align-items:center;gap:6px;flex-wrap:wrap;
  background:var(--brand-soft);border:1px solid var(--brand-line);border-radius:10px;
  padding:6px 8px;margin-top:5px;font-size:12px;color:var(--ink-2);
}
.sd-tx{min-width:0;}
.sd-tx b{font-weight:800;color:var(--brand-deep);}
.sd-warn{color:var(--warn);font-size:11px;margin-left:6px;font-weight:700;}
.sd-chip .btn.xs{padding:2px 9px;font-size:11.5px;}

/* ---- C 语音输入：按钮只在支持的浏览器里出现 ---- */
.nq-tools{display:flex;align-items:center;gap:8px;margin-top:7px;flex-wrap:wrap;}
.nq-tools:empty{display:none;}
.mic-btn{display:inline-flex;align-items:center;gap:6px;font-weight:700;color:var(--ink-2);}
.mic-lb{font-weight:700;}
.mic-btn.on{background:var(--risk-soft);border-color:var(--risk-line);color:var(--risk);}
.mic-live{margin-top:6px;font-size:12px;color:var(--ink-3);line-height:1.6;min-height:0;}
.mic-live.on{color:var(--info);}
@media(max-width:860px){
  .mic-btn{min-height:44px;padding:0 14px;}
  .sd-chip .btn.xs{min-height:44px;padding:0 14px;}
}

/* ============================================================
   v2.23.1 · P2（D 标签 / E 保存视图 / F API 访问）
   ============================================================ */

/* ---- D 标签：记录卡片上的 chips ---- */
.nc-tags{display:flex;flex-wrap:wrap;gap:5px;margin:6px 0 2px;}
.ttag{
  border:1px solid var(--line);background:#FFFDF6;color:var(--info);border-radius:99px;
  padding:1px 9px;font-size:11.5px;font-weight:700;line-height:18px;cursor:pointer;font-family:inherit;
}
.ttag:hover{border-color:var(--info-line);background:var(--info-soft);}
.ttag.on{background:var(--info-soft);border-color:var(--info);}
.ne-tags{margin-top:4px;min-height:18px;}

/* ---- E 保存视图 chips ---- */
.vbar{display:flex;align-items:center;gap:7px;flex-wrap:wrap;margin:0 0 9px;}
.vb-l{font-size:11px;font-weight:800;letter-spacing:.08em;color:var(--ink-3);}
.vchip{display:inline-flex;align-items:stretch;background:#fff;border:1px solid var(--line);
  border-radius:99px;overflow:hidden;}
.vchip.on{border-color:var(--brand-line);background:var(--brand-soft);}
.vc-main{
  border:0;background:none;padding:3px 11px;font-size:12px;font-weight:700;color:var(--ink-2);
  cursor:pointer;font-family:inherit;max-width:190px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
}
.vchip.on .vc-main{color:var(--brand-deep);}
.vc-x{border:0;border-left:1px solid var(--line);background:none;padding:0 8px;
  color:var(--ink-3);cursor:pointer;font-size:14px;line-height:1;}
.vc-x:hover{color:var(--risk);background:var(--risk-soft);}

/* ---- F API 访问 ---- */
.tk-list{margin:10px 0 4px;}
.tk-row{display:flex;align-items:center;gap:10px;padding:8px 0;border-top:1px dashed var(--line);}
.tk-row:first-child{border-top:0;}
.tk-row.off{opacity:.62;}
.tk-main{flex:1;min-width:0;}
.tk-n{font-size:13px;font-weight:700;display:flex;align-items:center;gap:7px;flex-wrap:wrap;}
.tk-m{font-size:11.5px;color:var(--ink-3);margin-top:2px;}
.tk-once{margin:10px 0;background:var(--brand-soft);border:1px solid var(--brand-line);
  border-radius:11px;padding:11px 12px;overflow-x:auto;}
.tk-once code{font-family:ui-monospace,Menlo,Consolas,monospace;font-size:12.5px;word-break:break-all;}
.tk-curl{position:relative;margin-bottom:9px;}
.tk-curl-h{display:flex;align-items:center;gap:8px;margin-bottom:4px;}
.tk-curl-l{flex:1;font-size:11.5px;font-weight:800;color:var(--ink-3);}
.tk-curl pre{
  margin:0;background:#FBF7EA;border:1px solid var(--line);border-radius:10px;padding:9px 11px;
  font-family:ui-monospace,Menlo,Consolas,monospace;font-size:11.5px;line-height:1.65;
  overflow-x:auto;white-space:pre;
}
/* v2.24 权限分级：徽标 + 新建弹层的二选一 */
.tk-badge{flex:0 0 auto;}
.tk-badge.read{background:var(--brand-deep-soft);color:var(--ink-2);}
.tk-badge.write{background:var(--warn-soft);color:var(--warn);}
.tk-scope-note{margin:-4px 0 11px;line-height:1.6;}
.tk-scope{display:flex;gap:9px;flex-wrap:wrap;}
.tk-opt{flex:1 1 180px;display:flex;align-items:flex-start;gap:8px;cursor:pointer;
  background:var(--card-2);border:1px solid var(--line);border-radius:11px;padding:9px 11px;}
.tk-opt:hover{border-color:var(--line-strong);}
.tk-opt.on{background:var(--brand-soft);border-color:var(--brand-line);
  box-shadow:0 0 0 2px rgba(250,231,25,.32);}
.tk-opt input{margin:3px 0 0;flex:0 0 auto;accent-color:var(--brand-deep);}
.tk-opt b{font-size:12.5px;}
.tk-opt-d{display:block;font-size:11.5px;color:var(--ink-3);line-height:1.55;margin-top:2px;}

@media(max-width:860px){
  /* 标签 chip 也是可点控件 —— 直接 44，别用伪元素糊（tap-audit 只认四边都定的 ::after） */
  .ttag{min-height:44px;display:inline-flex;align-items:center;padding:0 12px;font-size:12.5px;}
  .vc-main{min-height:44px;display:inline-flex;align-items:center;padding:0 12px;}
  .vc-x{min-width:44px;min-height:44px;}
  /* 权限两档是单选卡，手机上整张卡都要能点 */
  .tk-opt{min-height:44px;align-items:center;}
}



/* ============================================================
   v2.25 · 票据拍照记账
   ------------------------------------------------------------
   只新增三个令牌（--tap / --bar / --mask），其余全部引用现有 :root。
   缩略图一律 contain（票面不能被裁掉，裁了就核对不了）。
   红色只用于「没存上」；重复提示是黄色（它是提醒，不是错误）。
   ============================================================ */
:root{
  --tap:44px;                      /* 最小可点热区 */
  --bar:56px;                      /* 取景底部工具条 */
  --mask:rgba(43,38,34,.58);       /* 全屏层的遮罩 */
}

/* ---- 入口 ---- */
.rcp-entry{display:inline-flex;align-items:center;gap:6px;white-space:nowrap;}
.rcp-entry .rcp-sub{font-style:normal;font-weight:600;font-size:10.5px;color:var(--ink-3);
  padding-left:7px;margin-left:1px;border-left:1px solid var(--line-strong);}
.rcp-entry:hover .rcp-sub{color:var(--ink-2);}

/* ---- 全屏层（复用 #modal 宿主，不改路由） ---- */
.mask.shot-on{padding:0;overflow:hidden;background:var(--mask);}
.modal.shot{max-width:none;width:100%;height:100dvh;min-height:100dvh;border-radius:0;
  padding:0;margin:0;display:flex;flex-direction:column;overflow:hidden;background:#1B1815;color:#fff;}
.modal.shot.rcp-conf,.modal.shot.rcp-preview{background:var(--bg);color:var(--ink);}

/* ---- 取景 ---- */
.shot-hd{height:var(--bar);flex:0 0 var(--bar);display:flex;align-items:center;justify-content:space-between;
  padding:0 8px;border-bottom:1px solid rgba(255,255,255,.1);}
.shot-hd b{font-size:15px;font-weight:800;letter-spacing:.01em;}
.shot-x{width:var(--tap);height:var(--tap);display:flex;align-items:center;justify-content:center;
  background:none;border:0;color:inherit;cursor:pointer;border-radius:12px;}
.shot-x:active{background:rgba(255,255,255,.12);}
.shot-view{flex:1;position:relative;overflow:hidden;background:#000;display:flex;align-items:center;justify-content:center;}
.shot-view video{width:100%;height:100%;object-fit:cover;display:block;}
.shot-frame{position:absolute;inset:9% 6%;pointer-events:none;}
.shot-frame i{position:absolute;width:26px;height:26px;border:2.5px solid rgba(255,255,255,.92);border-radius:2px;}
.shot-frame .tl{left:0;top:0;border-right:0;border-bottom:0;}
.shot-frame .tr{right:0;top:0;border-left:0;border-bottom:0;}
.shot-frame .bl{left:0;bottom:0;border-right:0;border-top:0;}
.shot-frame .br{right:0;bottom:0;border-left:0;border-top:0;}
.shot-nocam{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:6px;text-align:center;padding:0 26px;color:rgba(255,255,255,.86);font-size:13px;font-weight:700;}
.shot-nocam em{font-style:normal;font-weight:600;font-size:11.5px;color:rgba(255,255,255,.55);line-height:1.6;}
.shot-tip{flex:0 0 auto;text-align:center;font-size:11.5px;color:rgba(255,255,255,.6);padding:8px 0 2px;}
.shot-bar{height:calc(var(--bar) + 34px);flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;
  padding:0 30px calc(env(safe-area-inset-bottom));}
.shot-side{width:64px;height:var(--tap);display:flex;flex-direction:column;align-items:center;justify-content:center;
  gap:2px;background:none;border:0;color:rgba(255,255,255,.88);font-size:10.5px;font-weight:700;cursor:pointer;border-radius:12px;}
.shot-side[aria-pressed="true"]{color:var(--brand);}
.shot-btn{width:70px;height:70px;border-radius:50%;background:#fff;border:4px solid rgba(255,255,255,.35);
  cursor:pointer;box-shadow:0 0 0 2px rgba(0,0,0,.25);}
.shot-btn:active{transform:scale(.94);}
.shot-foot{flex:0 0 auto;display:flex;gap:10px;padding:12px 16px calc(12px + env(safe-area-inset-bottom));
  background:var(--bg);border-top:1px solid var(--line);}
.shot-foot .btn{flex:1;min-height:var(--tap);justify-content:center;}
body.rcp-fill-light::after{content:"";position:fixed;inset:0;background:#fff;z-index:9999;pointer-events:none;opacity:.94;}

/* ---- 预览 / 同意 ---- */
.rcp-prev-body{flex:1;overflow-y:auto;padding:14px 16px 8px;background:var(--bg);}
.rcp-prev-img{background:#000;border-radius:14px;overflow:hidden;display:flex;align-items:center;justify-content:center;
  height:min(46vh,340px);margin:10px 0 14px;}
.rcp-prev-img img{max-width:100%;max-height:100%;object-fit:contain;}
.rcp-steps{display:flex;align-items:center;gap:6px;font-size:10.5px;color:var(--ink-3);font-weight:700;}
.rcp-steps span{display:inline-flex;align-items:center;gap:4px;white-space:nowrap;}
.rcp-steps span b{width:16px;height:16px;border-radius:50%;background:var(--line);color:var(--ink-3);
  display:inline-flex;align-items:center;justify-content:center;font-size:9.5px;}
.rcp-steps span.on{color:var(--brand-deep);}
.rcp-steps span.on b{background:var(--brand);color:var(--brand-deep);}
.rcp-steps span.done b{background:var(--grass-soft);color:var(--ok);}
.rcp-steps i{flex:1;height:1px;background:var(--line-strong);min-width:6px;}
.rcp-consent{background:var(--card);border:1px solid var(--line);border-radius:14px;padding:14px 15px;box-shadow:var(--shadow);}
.rcp-consent b{font-size:14px;display:block;margin-bottom:5px;color:var(--ink);}
.rcp-consent p{font-size:12.5px;color:var(--ink-2);line-height:1.7;}
.rcp-consent-btns{display:flex;gap:9px;margin-top:12px;}
.rcp-consent-btns .btn{flex:1;min-height:var(--tap);justify-content:center;}
.rcp-consent-btns .btn.ghost{border:1px solid var(--line-strong);background:var(--card);}
.rcp-consent-btns .btn.picked{box-shadow:0 0 0 2px var(--brand-deep) inset;}

/* ---- 读 ---- */
.rcp-reading{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  padding:24px;background:var(--bg);color:var(--ink);text-align:center;}
.rcp-read-img{width:min(58vw,220px);height:min(36vh,240px);display:flex;align-items:center;justify-content:center;
  background:#000;border-radius:12px;overflow:hidden;margin-bottom:8px;}
.rcp-read-img img{max-width:100%;max-height:100%;object-fit:contain;}
.rcp-reading b{font-size:15px;}
.rcp-reading p{font-size:12px;color:var(--ink-3);}
.rcp-slow{font-size:11.5px;color:var(--warn);margin-top:2px;}

/* ---- 失败 / 没账户 ---- */
.rcp-fail{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;
  padding:26px 22px;background:var(--bg);color:var(--ink);text-align:center;}
.rcp-fail b{font-size:15px;}
.rcp-fail p{font-size:12.5px;color:var(--ink-2);line-height:1.7;max-width:32em;}
.rcp-fail-btns{display:flex;gap:9px;margin-top:8px;}
.rcp-fail em{font-style:normal;font-size:11px;color:var(--ink-3);margin-top:4px;}

/* ---- 确认页 ---- */
.rcp-conf{flex:1;display:flex;flex-direction:column;min-height:0;background:var(--bg);color:var(--ink);}
.rcp-conf-hd{border-bottom:1px solid var(--line);background:var(--bg);color:var(--ink);}
.rcp-view-btn{min-height:var(--tap);padding:0 10px;background:none;border:0;color:var(--ink-2);
  font-size:12.5px;font-weight:700;cursor:pointer;display:inline-flex;align-items:center;gap:4px;}
.rcp-conf-body{flex:1;overflow-y:auto;-webkit-overflow-scrolling:touch;padding:12px 16px 10px;}
.rcp-hero{display:flex;gap:13px;align-items:flex-start;margin:12px 0 6px;}
.rcp-thumb{position:relative;flex:0 0 78px;width:78px;height:96px;border-radius:11px;overflow:hidden;
  background:#000;border:1px solid var(--line-strong);padding:0;cursor:pointer;}
.rcp-thumb img{width:100%;height:100%;object-fit:contain;display:block;}
.rcp-thumb i{position:absolute;left:0;right:0;bottom:0;background:rgba(43,38,34,.62);color:#fff;
  font-style:normal;font-size:9.5px;text-align:center;padding:2px 0;font-weight:700;}
.rcp-amt-wrap{flex:1;min-width:0;}
.rcp-amt-row{display:flex;align-items:baseline;gap:4px;border-bottom:2px solid var(--line-strong);padding-bottom:2px;}
.rcp-amt-row:focus-within{border-bottom-color:var(--brand-deep);}
.rcp-cur{font-size:20px;font-weight:800;color:var(--ink-2);}
#rcpAmt{flex:1;min-width:0;border:0;background:none;font-size:34px;font-weight:800;letter-spacing:-.02em;
  padding:0;outline:none;font-variant-numeric:tabular-nums;color:var(--ink);}
#rcpAmt.need-tap{background:var(--brand-soft);border-radius:8px;}
#rcpAmt::placeholder{font-size:15px;font-weight:700;color:var(--ink-3);letter-spacing:0;}
.rcp-amt-wrap{position:relative;}
/* 「你改的」挂在右上角，别插在 ¥ 和数字中间 —— 那会让人读成金额的一部分 */
.rcp-amt-wrap.edited::after{content:"你改的";position:absolute;right:0;top:-2px;font-size:9.5px;
  font-weight:700;color:var(--ink-3);background:var(--line);border-radius:999px;padding:1px 7px;}
.rcp-dir{display:inline-flex;gap:4px;margin-top:8px;}
.rcp-dir button{min-height:32px;padding:0 13px;border-radius:999px;border:1px solid var(--line-strong);
  background:var(--card);font-size:12px;font-weight:700;color:var(--ink-2);cursor:pointer;}
.rcp-dir button.on{background:var(--brand);border-color:var(--brand);color:var(--brand-deep);}
.rcp-hint{font-size:11.5px;color:var(--warn);line-height:1.5;margin-top:7px;min-height:0;}
.rcp-hint.on{min-height:18px;}
.rcp-hint.soft{color:var(--ink-3);}

.rcp-rows{margin-top:10px;border-top:1px solid var(--line);}
.rcp-row{display:flex;align-items:center;gap:12px;min-height:var(--tap);padding:4px 0;
  border-bottom:1px solid var(--line);}
.rcp-row>span{flex:0 0 44px;font-size:12px;color:var(--ink-3);font-weight:700;}
.rcp-row input,.rcp-row select{flex:1;min-width:0;min-height:var(--tap);border:0;background:none;
  font-size:14px;font-weight:600;color:var(--ink);outline:none;padding:0;}
.rcp-row2{display:flex;gap:10px;border-bottom:1px solid var(--line);padding:2px 0 6px;}
.rcp-row2 label{flex:1;min-width:0;display:flex;align-items:center;gap:8px;min-height:var(--tap);}
.rcp-row2 label>span{flex:0 0 32px;font-size:12px;color:var(--ink-3);font-weight:700;}
.rcp-row2 select{flex:1;min-width:0;min-height:var(--tap);border:0;background:none;font-size:13px;
  font-weight:600;color:var(--ink);outline:none;padding:0;}
.rcp-unclear{font-style:normal;font-size:9.5px;font-weight:700;color:var(--ink-3);background:var(--line);
  border-radius:999px;padding:2px 7px;display:none;flex:0 0 auto;}
.rcp-unclear.on{display:inline-block;}
.rcp-note-tg{display:inline-flex;align-items:center;gap:5px;min-height:var(--tap);background:none;border:0;
  color:var(--ink-3);font-size:12px;font-weight:700;cursor:pointer;padding:0 2px;}
.rcp-note-tg.open{color:var(--ink-2);}
.rcp-note textarea{width:100%;border:1px solid var(--line-strong);border-radius:11px;padding:9px 11px;
  font-size:13px;resize:none;outline:none;background:var(--card);}
.rcp-note textarea:focus{border-color:var(--brand-line);box-shadow:0 0 0 2px rgba(250,231,25,.28);}

/* 重复：黄色提醒，不是错误。只指向一笔，给两个明确出口。 */
.rcp-dup{background:var(--warn-soft);border:1px solid var(--warn-line);border-radius:12px;padding:10px 12px;margin:10px 0 2px;}
.rcp-dup-t{font-size:12px;color:#7A5200;font-weight:700;line-height:1.65;}
.rcp-dup-b{display:flex;gap:8px;margin-top:8px;}
.rcp-dup-b .btn{min-height:36px;}

/* 底部：状态行 + 「记下 金额」 */
.rcp-foot{flex:0 0 auto;padding:6px 16px calc(10px + env(safe-area-inset-bottom));
  background:linear-gradient(180deg,rgba(255,252,242,.4),var(--bg) 34%);border-top:1px solid var(--line);}
.rcp-status{width:100%;min-height:var(--tap);display:flex;align-items:center;justify-content:space-between;
  background:none;border:0;font-size:11.5px;color:var(--ink-3);font-weight:600;text-align:left;cursor:pointer;
  padding:0 2px;}
.rcp-status .rcp-arrow{font-size:14px;color:var(--ink-3);}
.rcp-save{width:100%;min-height:52px;justify-content:center;font-size:16px;font-weight:800;
  border-radius:14px;margin-top:2px;}
.rcp-save[disabled]{opacity:.62;}
.rcp-save.busy{background:var(--line-strong);border-color:var(--line-strong);color:var(--ink-2);}
.rcp-msg{font-size:12px;line-height:1.6;margin-top:6px;display:none;}
.rcp-msg.on{display:block;}
.rcp-msg.err{color:var(--risk);}

/* ---- 模式二选一（常驻行进来的「再次」） ---- */
.rcp-mode-list{display:flex;flex-direction:column;gap:9px;}
.rcp-mode{display:flex;align-items:center;gap:11px;width:100%;text-align:left;background:var(--card);
  border:1px solid var(--line-strong);border-radius:13px;padding:12px 13px;min-height:var(--tap);cursor:pointer;}
.rcp-mode.on{border-color:var(--brand-deep);box-shadow:0 0 0 2px rgba(250,231,25,.35);}
.rcp-mode>span{flex:1;min-width:0;display:flex;flex-direction:column;}
.rcp-mode b{font-size:13.5px;}
.rcp-mode em{font-style:normal;font-size:11.5px;color:var(--ink-3);}
.rcp-tick{color:var(--ok);display:flex;}

/* ---- 全屏原图（contain + 缩放） ---- */
.rcp-viewer .rcp-view-stage{flex:1;overflow:auto;display:flex;align-items:center;justify-content:center;
  padding:8px;background:#000;touch-action:pinch-zoom;}
.rcp-view-stage img{max-width:100%;max-height:100%;object-fit:contain;transition:transform .16s ease;
  transform-origin:center;}
.rcp-view-bar{flex:0 0 auto;display:flex;align-items:center;gap:7px;padding:8px 12px calc(10px + env(safe-area-inset-bottom));
  background:#141210;border-top:1px solid rgba(255,255,255,.1);}
.rcp-view-bar .btn{background:rgba(255,255,255,.1);border-color:rgba(255,255,255,.16);color:#fff;min-height:38px;}
.rcp-view-bar .sp{flex:1;}

/* ---- 流水详情票据位 ---- */
.rcp-slot{display:flex;align-items:center;gap:10px;margin:10px 0 2px;padding:7px 9px;border:1px solid var(--line);
  border-radius:12px;background:var(--card-2);cursor:pointer;min-height:var(--tap);}
.rcp-slot img{width:72px;height:90px;max-width:46%;max-height:96px;object-fit:contain;
  border-radius:7px;background:#111;border:1px solid var(--line);}
.rcp-slot.none{cursor:default;color:var(--ink-3);font-size:12px;font-weight:600;}
.rcp-slot-t{font-size:12px;font-weight:700;color:var(--ink-2);display:flex;flex-direction:column;gap:2px;}
.rcp-slot-t em{font-style:normal;font-size:10.5px;color:var(--ink-3);font-weight:600;}

/* ---- 恢复条 / 样例条 ---- */
.rcp-host{margin:12px 0 0;}
.rcp-restore{display:flex;align-items:center;gap:9px;background:var(--brand-soft);border:1px solid var(--brand-line);
  border-radius:14px;padding:9px 11px;flex-wrap:wrap;}
.rcp-restore-ic{width:32px;height:32px;border-radius:10px;background:#fff;color:var(--brand-deep);
  display:flex;align-items:center;justify-content:center;flex:0 0 auto;}
.rcp-restore-t{flex:1;min-width:130px;display:flex;flex-direction:column;line-height:1.45;}
.rcp-restore-t b{font-size:13px;}
.rcp-restore-t em{font-style:normal;font-size:11px;color:var(--ink-2);}
.rcp-restore .btn{min-height:36px;}
.rcp-sample{display:flex;align-items:center;gap:9px;background:var(--card);border:1px dashed var(--line-strong);
  border-radius:14px;padding:9px 11px;flex-wrap:wrap;}
.rcp-sample-t{flex:1;min-width:180px;font-size:11.5px;color:var(--ink-2);line-height:1.6;
  display:flex;align-items:center;gap:6px;}
.rcp-sample-t svg{flex:0 0 auto;color:var(--ink-3);}
.rcp-sample .btn{min-height:36px;}
.rcp-smp{margin-left:7px;font-size:9.5px;padding:1px 5px;vertical-align:middle;}
.rcp-plist{display:flex;align-items:center;gap:10px;padding:10px 2px;border-bottom:1px solid var(--line);cursor:pointer;}
.rcp-plist>span{color:var(--ink-3);display:flex;}
.rcp-plist>div{flex:1;min-width:0;display:flex;flex-direction:column;}
.rcp-plist b{font-size:13px;}
.rcp-plist em{font-style:normal;font-size:11px;color:var(--ink-3);}
.rcp-plist i{font-style:normal;font-size:11.5px;color:var(--ink-3);}

@media(max-width:860px){
  /* 手机上入口副标不占地方：按钮本身就得短，副标进 title */
  .rcp-entry .rcp-sub{display:none;}
  .rcp-entry{min-height:var(--tap);padding:0 12px;}
  .m2-quick{grid-template-columns:repeat(5,1fr);gap:7px;}
  .m2-q{font-size:10.5px;padding:10px 2px;}
  #rcpAmt{font-size:31px;}
  .rcp-conf-body{padding:10px 14px 8px;}
  .rcp-thumb{flex-basis:70px;width:70px;height:88px;}
  .rcp-slot img{max-height:96px;}
  .rcp-view-bar .btn{min-height:var(--tap);}
}

/* 全屏票据层打开时，页面级的浮标/底部导航/加主屏提示一律让开 ——
   它们压在「记下」按钮上，是真实的手感 bug，不是美观问题。 */
body.rcp-shot .a2hs,body.rcp-shot .fab,body.rcp-shot .tabbar{display:none!important;}
/* toast 放在底部操作条上方：顶部会糊住金额，正中会糊住缩略图。
   确认页脚更高（状态行 44 + 主按钮 52），单独抬高一点。同一时刻只留一条（JS 里清空重发）。 */
body.rcp-shot #toasts{bottom:calc(env(safe-area-inset-bottom) + 84px);top:auto;}
body.rcp-shot:has(.rcp-conf) #toasts{bottom:calc(env(safe-area-inset-bottom) + 124px);}
.shot-foot.one .btn{flex:1;}

/* 平板/桌面宽度：全屏层仍然是全屏，但内容居中到一列（744 下铺满一条太长，
   眼睛从「金额」扫到「分类」要横跨整屏）。 */
@media(min-width:600px){
  .rcp-conf-body,.rcp-prev-body,.rcp-foot,.shot-foot{max-width:620px;margin-left:auto;margin-right:auto;width:100%;}
  .rcp-conf-hd{padding:0 max(8px,calc((100% - 620px)/2));}
  .rcp-conf-body{max-height:none;}
}
@media(max-width:860px){
  /* 恢复条 / 样例条 / 重复黄条里的按钮也是手指点的，别用桌面的 36px */
  .rcp-restore .btn,.rcp-sample .btn,.rcp-dup-b .btn{min-height:var(--tap);}
}

/* v2.25.1：统计区下面的样例脚注（只在「有真账 + 有样例」时出现） */
.rcp-note-line{font-size:11px;color:var(--ink-3);line-height:1.6;margin:-4px 0 6px;padding:0 2px;}

/* ============================================================
   v2.26 · 对账卡 / 下一次会议 / 库存
   ============================================================ */
.rr-line{font-size:13px;color:var(--ink-2);line-height:1.9;}
.rr-line b{font-weight:800;color:var(--ink);font-variant-numeric:tabular-nums;}
.rr-line .rr-warn{color:var(--warn);}
.rr-ok{margin-top:8px;font-size:12px;color:var(--ok);display:flex;align-items:center;gap:5px;font-weight:700;}
.rcp-miss:hover{background:var(--brand-soft);}
.mt-next{border-color:var(--brand-line);background:linear-gradient(180deg,var(--brand-soft),#fff 62%);}
.mt-next .lb{font-size:15px;font-weight:800;color:var(--brand-deep);margin-bottom:2px;}
.inv-amt{margin-top:6px;font-size:13px;font-weight:800;color:var(--brand-deep);
  background:var(--brand-soft);border:1px solid var(--brand-line);border-radius:10px;padding:7px 11px;
  font-variant-numeric:tabular-nums;}

/* v2.26.2：库存统计卡在手机上用 2×2 —— 390 宽下一行四列只有 46px 文字宽，
   「库存成本 / 本月出入」必然折行；两列给足宽度，标签保持原样。 */
@media(max-width:860px){
  .stat-row.inv-stats{grid-template-columns:1fr 1fr !important;}
}

/* v2.26.3：库存产品行 —— 手机上名称与数量同排、四个按钮换到第二行。
   之前名称列 flex:1;min-width:0 会被不收缩的按钮组压成 0 宽。 */
.inv-row{flex-wrap:wrap;align-items:flex-start;}
.inv-main{flex:1 1 auto;min-width:0;}
.inv-qty{flex:0 0 auto;text-align:right;min-width:72px;}
.inv-ops{flex:1 1 100%;display:flex;gap:4px;flex-wrap:wrap;justify-content:flex-end;margin-top:6px;}
@media(min-width:861px){
  .inv-row{flex-wrap:nowrap;align-items:center;}
  .inv-ops{flex:0 0 auto;margin-top:0;}
}

/* v2.26.4：本周关注的行是可点的，手机上给 44 热区（原来是 24px 的纯文字行） */
@media(max-width:860px){
  .wc-i{min-height:44px;display:flex;align-items:center;padding:0;}
}

/* v2.27：窄屏下把表单页脚那句「创建后可在详情里继续补充」收起来 ——
   它会把「取消 / 创建任务」挤到两行，主按钮反而掉到下面。 */
@media(max-width:520px){
  .foot .foot-hint{display:none;}
}
