/* 品源 样式单一事实源 v1（2026-09-11 冻结）
   几何冻结值（CDP 实测，改前先量）：sidebar 252 / topbar 42 / 身份卡 114 / logo 34 /
   菜单行 42.5 / 子行 39 / 顶栏簇间距 34·34·14 / 占位卡 262×148.5 / 侧栏内边距 14·12
   纪律：所有内容页只许 link 本文件 + shell.js；禁止页内私改外壳几何；
   换色只改 :root token（品牌色单一来源 --brand/--brand-soft）。 */
:root{
  --sb-bg:#F7F8FA; --sb-sel:#E8EAED; --kid-bg:#F0F1F3; --sb-hov:#EDEEF0;
  --tx:#1F2329; --tx2:#646A73; --tx3:#8F959E;
  --brand:#2E6BF0; --brand-soft:#E9F0FE; /* 品牌主色单一来源：身份卡/呼吸灯/标签/以后按钮链接焦点全读这两个 token */
  --line:#DEE0E3; --content:#F2F3F5; --card:#fff;
}
*{box-sizing:border-box;margin:0;padding:0}
html,body{height:100%}
body{font:14px/1.5 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif;color:var(--tx);overflow:hidden}
button{font:inherit;cursor:pointer;background:none;border:none;color:inherit}
svg{display:block}
.app{display:flex;height:100vh}
/* ============ 左：菜单栏 ============ */
aside.sb{width:252px;flex:none;background:var(--sb-bg);padding:14px 12px;overflow-y:auto}
body.nosb aside.sb{display:none}
/* 顶部身份卡：高114=用户指认的原大块尺寸，不可点；色读 --brand/--brand-soft */
.idcard{height:114px;border-radius:8px;background:var(--brand-soft);display:flex;align-items:center;gap:10px;padding:0 12px;margin:0 0 8px;cursor:default}
.idcard .slogo{width:34px;height:34px;flex:none;border-radius:8px;background:var(--brand);color:#fff;font-weight:700;display:flex;align-items:center;justify-content:center;font-size:16px}
.idcard .si{min-width:0;display:flex;flex-direction:column;gap:2px}
.idcard .si b{font-size:15px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.idcard .si small{font-size:11px;color:var(--tx3)}
.row{display:flex;align-items:center;gap:9px;padding:10px 10px;border-radius:8px;cursor:pointer;user-select:none;position:relative}
.row:hover{background:var(--sb-hov)}
.row .chev{width:15px;height:15px;flex:none;color:var(--tx3);transition:transform .18s ease}
/* 占位 chevron：类名 hide（勿用 ph——曾与右区空态卡 .ph 的 46/64 内边距冲突把行撑成 130x94） */
.row .chev.hide{visibility:hidden}
.grp.open > .row .chev{transform:rotate(90deg)}
.row .ic{width:18px;height:18px;flex:none}
.row .lb{font-size:15px;color:var(--tx);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.row.sel{background:var(--sb-sel)}
.row.sel .lb{font-weight:600}
.grp.open > .row.sel{border-radius:8px 8px 0 0}
/* 呼吸灯 */
.row .dot{margin-left:auto;width:8px;height:8px;flex:none;border-radius:50%;background:var(--brand);animation:breathe 1.8s ease-in-out infinite}
@keyframes breathe{
  0%,100%{transform:scale(.7);opacity:.4;box-shadow:0 0 0 0 rgba(46,107,240,.30)}
  50%{transform:scale(1.15);opacity:1;box-shadow:0 0 0 6px rgba(46,107,240,0)}
}
/* 展开的子页块 */
.kids{display:none;background:var(--kid-bg);border-radius:0 0 8px 8px;padding:2px 0 5px;margin-top:-4px}
.grp.open .kids{display:block}
.grp > .row.sel + .kids{border-radius:0 0 8px 8px}
.kid{display:flex;align-items:center;gap:9px;padding:9px 10px 9px 34px;cursor:pointer;user-select:none;border-radius:6px;margin:0 4px}
.kid:hover{background:#E9EBEE}
.kid .ic{width:17px;height:17px;flex:none}
.kid .lb{font-size:14px;color:var(--tx);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.kid.sel{background:#E4E6E9;font-weight:600}
.kid .dot{margin-left:auto;width:8px;height:8px;flex:none;border-radius:50%;background:var(--brand);animation:breathe 1.8s ease-in-out infinite}
/* ============ 右：主区 ============ */
.main{flex:1;min-width:0;display:flex;flex-direction:column}
header.tb{height:42px;flex:none;background:var(--card);border-bottom:1px solid var(--line);display:flex;align-items:center;gap:18px;padding:0 18px}
.ham{width:30px;height:30px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:var(--tx)}
.ham:hover{background:var(--sb-hov)}
.crumb{font-size:13px;color:var(--tx2)}
.crumb b{color:var(--tx);font-weight:600}
.grow{flex:1}
.tbic{width:30px;height:30px;border-radius:6px;display:flex;align-items:center;justify-content:center;color:var(--tx);position:relative}
.tbic:hover{background:var(--sb-hov)}
.tbic i{position:absolute;top:0px;right:-1px;background:#F54A45;color:#fff;font-size:10px;font-style:normal;line-height:1;border-radius:8px;padding:2px 4px}
.tbic + .tbic{margin-left:16px}
.who{display:flex;align-items:center;gap:14px;margin-left:16px}
.ava{width:24px;height:24px;border-radius:50%;background:#E8EAED;display:flex;align-items:center;justify-content:center;font-size:11px;color:var(--tx2)}
.rtag{font-size:11px;color:var(--brand);border:1px solid var(--brand);border-radius:4px;padding:2px 8px}
main.ct{flex:1;min-height:0;background:var(--content);display:flex;align-items:center;justify-content:center;overflow:auto}
.ph{border:1px dashed #CDD1D6;border-radius:12px;background:#FAFBFC;padding:46px 64px;text-align:center;color:var(--tx3)}
.ph b{display:block;font-size:17px;color:var(--tx2);font-weight:600;margin-bottom:8px}
.ph span{font-size:13px}
/* ============ 内容组件 v1（2026-09-11 起：内容页共用，禁止各页私写） ============ */
.pg{width:100%;height:100%;overflow:auto;background:var(--card);padding:24px 28px}
.pg h3{font-size:16px;font-weight:600;margin-bottom:4px}
.pg .sub{font-size:12px;color:var(--tx3);margin-bottom:16px}
.frm{display:grid;grid-template-columns:84px 1fr;gap:12px 12px;align-items:center;max-width:460px}
.frm label{font-size:13px;color:var(--tx2);text-align:right}
.inp{height:32px;border:1px solid var(--line);border-radius:6px;padding:0 10px;font:inherit;font-size:13px;width:100%;background:#fff;color:var(--tx)}
.inp:focus{outline:none;border-color:var(--brand);box-shadow:0 0 0 2px var(--brand-soft)}
.btn{height:32px;padding:0 16px;border-radius:6px;border:1px solid var(--line);background:#fff;font:inherit;font-size:13px;color:var(--tx);cursor:pointer}
.btn:hover{background:var(--sb-hov)}
.btn.primary{background:var(--brand);border-color:var(--brand);color:#fff}
.btn.primary:hover{opacity:.92}
.btn.sm{height:26px;padding:0 10px;font-size:12px;border-radius:5px}
.btn.danger{color:#D54941;border-color:#EBC4C0}
.ops{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.inp.sm{height:26px;padding:0 8px;font-size:12px}
.rowline{display:flex;gap:10px;align-items:center;margin-top:16px}
.msg{font-size:13px;margin-top:12px;padding:8px 12px;border-radius:6px}
.msg.ok{background:#E6F4EA;color:#1A7F37}
.msg.err{background:#FDECEA;color:#C5221F}
.tbl{width:100%;border-collapse:collapse;font-size:13px;margin-top:8px}
.tbl th,.tbl td{padding:8px 10px;border-bottom:1px solid var(--line);text-align:left;vertical-align:middle}
.tbl th{color:var(--tx2);font-weight:600;background:var(--sb-bg);white-space:nowrap}
.tag{font-size:11px;border-radius:4px;padding:2px 8px;white-space:nowrap}
.tag.ok{color:#1A7F37;background:#E6F4EA}
.tag.off{color:#646A73;background:#EFF0F1}
.tag.warn{color:#B45309;background:#FEF3C7}
.idline{display:flex;gap:18px;align-items:center;font-size:13px;color:var(--tx2)}
.idline b{color:var(--tx);font-size:14px}
/* 选日期弹层 v1：选完不自动关，点续费/点外面才关（原生 date 输入拦不住 Chrome 选完即关） */
.calwrap{position:relative}
.cal{position:absolute;top:30px;left:0;z-index:40;width:236px;background:var(--card);border:1px solid var(--line);border-radius:8px;box-shadow:0 10px 28px rgba(31,35,41,.14);padding:10px}
.cal .chd{display:flex;align-items:center;justify-content:space-between;margin-bottom:6px}
.cal .chd b{font-size:13px}
.cal .chd button{width:24px;height:24px;border-radius:5px;color:var(--tx2);font-size:13px}
.cal .chd button:hover{background:var(--sb-hov)}
.cal .gw,.cal .gd{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.cal .gw span{text-align:center;font-size:11px;color:var(--tx3);padding:2px 0}
.cal .gd button{height:28px;border-radius:6px;font-size:12px;color:var(--tx)}
.cal .gd button:hover{background:var(--sb-hov)}
.cal .gd button.dim{color:var(--tx3)}
.cal .gd button.sel{background:var(--brand);color:#fff}
.cal .gd button.today{box-shadow:inset 0 0 0 1px var(--brand)}
