/* public/app/design-system.css — LANN editorial 设计系统 SSoT */
:root{
  --paper:#F4F1EA; --paper-2:#ECE6D7; --paper-3:#E2DBC8;
  --ink:#14110F; --ink-2:#4A4239; --ink-3:#7A6F62;
  --rule:#C9C0AD; --rule-2:#D9D2BF;
  --oxblood:#7A1E1A; --oxblood-2:#A33028; --gold:#9B7A1F; --forest:#2E5D3A;
  --serif:'Fraunces',Georgia,serif;
  --sans:'IBM Plex Sans','IBM Plex Sans SC',-apple-system,'PingFang SC',sans-serif;
  --mono:'IBM Plex Mono','SF Mono',Menlo,monospace;
  --s1:4px; --s2:8px; --s3:12px; --s4:16px; --s5:24px; --s6:32px; --s7:48px;
  --r-sm:7px; --r-md:11px; --r-lg:16px;
  --shadow-sm:0 1px 2px rgba(20,17,15,.04), 0 1px 3px rgba(20,17,15,.06);
  --shadow-md:0 2px 8px rgba(20,17,15,.06), 0 8px 24px rgba(20,17,15,.05);
  --shadow-pop:0 4px 16px rgba(122,30,26,.10), 0 12px 40px rgba(20,17,15,.08);
}
*{margin:0;padding:0;box-sizing:border-box;-webkit-tap-highlight-color:transparent}
/* 工具类：!important 让其能压过 id 选择器(如 #loginView)。SPA 此前缺定义→showLoginView 隐藏失效=桌面白屏，dashboard 自定义区间收起也失效 */
.hidden{display:none!important}
/* 登录视图(非飞书环境/JSSDK 免登失败时揭示) */
#loginView{min-height:100vh;display:flex;flex-direction:column;align-items:center;justify-content:center;text-align:center;padding:40px 24px}
#loginView .lv-bureau{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3);margin-bottom:20px}
#loginView .lv-mark{font-family:var(--serif);font-size:40px;font-weight:600;letter-spacing:-.02em;line-height:.95;margin-bottom:14px}
#loginView .lv-mark .amp{font-style:italic;font-weight:500;color:var(--oxblood)}
#loginView .lv-sub{color:var(--ink-3);font-size:14px;margin-bottom:32px}
body{font-family:var(--sans);color:var(--ink);line-height:1.6;font-size:15px;background:var(--paper);
  background-image:radial-gradient(circle at 15% 0%,rgba(155,122,31,.04),transparent 40%),radial-gradient(circle at 85% 100%,rgba(46,93,58,.035),transparent 45%);
  background-attachment:fixed}
/* app shell 宽度：手机/平板保持 600 单列；桌面放宽，数据密集视图(.wide)用全宽，表单/阅读视图收窄列 */
#app{max-width:600px;margin:0 auto}
@media(min-width:1024px){
  #app{max-width:860px}        /* 桌面默认：舒适阅读/填写列 */
  #app.wide{max-width:1200px}  /* 看板/列表/表格等数据密集视图：放宽多列铺开 */
  .nav{max-width:720px}        /* 底栏在桌面稍放宽、仍居中 */
}
/* platform-nav — LANN 平台导航条（跨应用拼接契约：#1f2733 / 12px / 5px 16px / gap 14px / 不换行横向滚动）
   普通流排在 masthead 之上（shell.js 渲染于 #app 首位），随页面滚走；底色独立于 paper 主题，刻意区隔「平台层」 */
.platform-nav{background:#1f2733;font-size:12px;padding:5px 16px;display:flex;align-items:center;gap:14px;overflow-x:auto;white-space:nowrap;scrollbar-width:none;-webkit-overflow-scrolling:touch}
.platform-nav::-webkit-scrollbar{display:none}
.platform-nav .pn-brand{color:#fff;font-weight:600;flex:none}
.platform-nav a{color:#cfd8e3;text-decoration:none;flex:none;transition:color .15s}
.platform-nav a:hover{color:#fff}
.platform-nav a.on{color:#fff;border-bottom:2px solid currentColor}
/* icon */
.ic{width:20px;height:20px;stroke:currentColor;stroke-width:1.5;fill:none;stroke-linecap:round;stroke-linejoin:round;display:inline-block;vertical-align:middle}
.ic-sm{width:16px;height:16px}
/* masthead — editorial 报头 */
.masthead{background:var(--paper);border-bottom:2px solid var(--ink);padding:16px 20px 0}
.masthead .dateline{font-family:var(--mono);font-size:10px;letter-spacing:.16em;text-transform:uppercase;color:var(--ink-3);display:flex;justify-content:space-between;align-items:center;padding-bottom:10px;border-bottom:1px solid var(--rule)}
.masthead .bureau{font-weight:600;color:var(--ink-2)}
.masthead .endate{flex:1;text-align:center}
.masthead .who{display:flex;align-items:center;gap:7px}
.masthead .who .nm{color:var(--ink-2)}
.masthead .avatar{width:24px;height:24px;border-radius:50%;background:var(--ink);color:var(--paper);display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;cursor:pointer}
.masthead .mast-row{display:flex;justify-content:space-between;align-items:flex-end;padding:10px 0}
.masthead .m-title{font-family:var(--serif);font-weight:600;font-size:32px;line-height:.92;letter-spacing:-.02em;font-variation-settings:'opsz' 144}
.masthead .m-title .amp{font-style:italic;font-weight:500;color:var(--oxblood);padding:0 .06em}
.masthead .section{text-align:right;line-height:1.25}
.masthead .sec-en{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--oxblood);font-weight:600}
.masthead .sec-zh{font-family:var(--mono);font-size:11px;letter-spacing:.16em;color:var(--ink-3)}
/* layout */
.view-pad{padding:var(--s6) 20px 90px}
.kicker{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--oxblood);font-weight:600;margin-bottom:var(--s2);display:flex;align-items:center;gap:var(--s2)}
.kicker::before{content:'';width:18px;height:2px;background:var(--oxblood)}
h2.sec{font-family:var(--serif);font-size:24px;font-weight:600;letter-spacing:-.02em;margin-bottom:var(--s2)}
.label{font-family:var(--mono);font-size:10px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);margin-bottom:var(--s2)}
.muted{color:var(--ink-3)} .grp-label{font-family:var(--mono);font-size:11px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);margin:var(--s5) 0 var(--s2);display:flex;justify-content:space-between;align-items:center}
/* card */
.card{background:var(--paper);border:1px solid var(--rule);border-radius:var(--r-md);padding:var(--s4);box-shadow:var(--shadow-sm)}
.card+.card{margin-top:var(--s3)}
.card.feature{border-color:var(--oxblood);box-shadow:var(--shadow-pop)}
/* stat */
.stat-grid{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:var(--s3)}
.stat{min-width:0;background:var(--paper);border:1px solid var(--rule);border-radius:var(--r-md);padding:var(--s4) var(--s3);overflow:hidden}
.stat .v{font-family:var(--serif);font-size:28px;font-weight:600;letter-spacing:-.02em;line-height:1;font-variation-settings:'opsz' 60}
.stat .v .unit{font-size:15px;color:var(--ink-3);font-weight:500}
.stat .l{font-family:var(--mono);font-size:10px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);margin-top:var(--s2)}
.stat .delta{font-family:var(--mono);font-size:11px;margin-top:var(--s1);display:flex;align-items:center;gap:3px}
.delta.up{color:var(--forest)} .delta.down{color:var(--oxblood)}
/* progress */
.prog{height:7px;background:var(--paper-3);border-radius:99px;overflow:hidden;margin-top:var(--s2)}
.prog .fill{height:100%;background:linear-gradient(90deg,var(--oxblood),var(--oxblood-2));border-radius:99px}
/* todo */
.todo{display:flex;align-items:center;gap:var(--s3);padding:var(--s3) var(--s4);background:var(--paper);border:1px solid var(--rule);border-radius:var(--r-md);margin-bottom:var(--s2);text-decoration:none;color:inherit}
.todo .marker{width:8px;height:8px;border-radius:99px;background:var(--oxblood);flex-shrink:0;box-shadow:0 0 0 3px rgba(122,30,26,.12)}
.todo.sev-high .marker{background:var(--oxblood);box-shadow:0 0 0 3px rgba(122,30,26,.12)}
.todo.sev-med .marker{background:var(--gold);box-shadow:0 0 0 3px rgba(155,122,31,.14)}
.todo.sev-low .marker{background:var(--ink-3);box-shadow:0 0 0 3px rgba(122,111,98,.12)}
.todo .txt{font-size:14px;flex:1} .todo .go{font-family:var(--mono);font-size:11px;color:var(--ink-3);display:flex;align-items:center;gap:4px}
/* button */
.btn{font-family:var(--sans);font-size:14px;font-weight:600;padding:11px 18px;border-radius:var(--r-sm);border:1px solid var(--ink);background:var(--ink);color:var(--paper);cursor:pointer;transition:.2s;display:inline-flex;align-items:center;gap:7px}
.btn:active{transform:translateY(1px)} .btn.ghost{background:transparent;color:var(--ink)} .btn.ox{background:var(--oxblood);border-color:var(--oxblood)}
.btn-row{display:flex;gap:var(--s2);flex-wrap:wrap}
/* leaf (workbench) */
.leafgrid{display:grid;grid-template-columns:1fr 1fr;gap:var(--s2)}
.leaf{background:var(--paper);border:1px solid var(--rule);border-radius:var(--r-md);padding:var(--s4) var(--s3);position:relative;transition:.22s;text-decoration:none;color:inherit;display:block}
.leaf:active{transform:translateY(1px);box-shadow:var(--shadow-md)}
.leaf .ic{width:22px;height:22px;display:block;margin-bottom:var(--s2);color:var(--ink)}
.leaf .nm{font-weight:600;font-size:14px} .leaf .meta{font-family:var(--mono);font-size:10px;color:var(--ink-3);margin-top:2px}
.leaf .pin{position:absolute;top:9px;right:9px;color:var(--rule);background:none;border:none;cursor:pointer}
.leaf .pin .ic{width:15px;height:15px;margin:0;display:block}
.leaf.pinned .pin{color:var(--oxblood)} .leaf.pinned .pin .ic{fill:rgba(122,30,26,.12)}
/* bottom nav */
.nav{position:fixed;bottom:0;left:0;right:0;max-width:600px;margin:0 auto;background:var(--paper);border-top:2px solid var(--ink);display:flex;box-shadow:0 -4px 24px rgba(20,17,15,.06);z-index:50}
.nav a{flex:1;text-align:center;padding:9px 2px 8px;text-decoration:none;color:var(--ink-3);display:flex;flex-direction:column;align-items:center;gap:4px;transition:.2s;position:relative}
.nav a .nav-badge{position:absolute;top:3px;left:calc(50% + 4px);min-width:15px;height:15px;padding:0 3px;border-radius:99px;background:var(--oxblood);color:#fff;font-family:var(--mono);font-size:9px;font-weight:700;line-height:15px;text-align:center;box-shadow:0 1px 2px rgba(122,30,26,.4)}
.leaf .leaf-badge{position:absolute;top:7px;left:7px;min-width:16px;height:16px;padding:0 4px;border-radius:99px;background:var(--oxblood);color:#fff;font-family:var(--mono);font-size:10px;font-weight:700;line-height:16px;text-align:center;box-shadow:0 1px 3px rgba(122,30,26,.4)}
.nav a .ic{width:19px;height:19px} .nav a .lb{font-family:var(--mono);font-size:9px;letter-spacing:.04em}
.nav a.on{color:var(--ink)} .nav a.on::after{content:'';position:absolute;bottom:0;width:24px;height:2px;background:var(--oxblood);border-radius:2px 2px 0 0}
/* 窄屏 7 格底栏（首页+工作台+看板 3 锚点 + 最多 4 钉叶子）：375px iPhone 也能排下，缩字号防换行 */
@media(max-width:399px){
  .nav a{padding:8px 1px 7px;gap:3px}
  .nav a .ic{width:18px;height:18px}
  .nav a .lb{font-size:8px;letter-spacing:.01em;white-space:nowrap;max-width:100%;overflow:hidden;text-overflow:ellipsis}
}
/* tabs (view 内二级) */
.subtabs{display:flex;gap:2px;border-bottom:1px solid var(--rule);margin-bottom:var(--s4);overflow-x:auto}
.subtabs button{font-family:var(--sans);font-size:14px;font-weight:600;padding:10px 14px;background:none;border:none;border-bottom:2px solid transparent;color:var(--ink-3);cursor:pointer;white-space:nowrap}
.subtabs button.on{color:var(--ink);border-bottom-color:var(--oxblood)}
/* form */
.field{margin-bottom:var(--s4)} .field label{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--ink-2);margin-bottom:var(--s2)}
.field input,.field select,.field textarea{width:100%;font-family:var(--sans);font-size:15px;padding:10px 12px;border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--paper);color:var(--ink)}
/* date input：iOS Safari 原生渲染偏高/居中、与相邻 select 不齐 → 压平外观与 select 等高左对齐
   （appearance:none 仅改外观，不影响点击仍弹原生日期选择器）*/
.field input[type=date],.ds-field input[type=date]{-webkit-appearance:none;appearance:none;font-size:15px;line-height:1.4;text-align:left}
.field input[type=date]::-webkit-date-and-time-value,.ds-field input[type=date]::-webkit-date-and-time-value{text-align:left}
/* 顶部控件下拉 (editorial 风裸 select 统一样式) */
.ctl-sel{font-family:var(--sans);font-size:13px;padding:8px 30px 8px 11px;border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--paper);color:var(--ink);appearance:none;-webkit-appearance:none;background-image:url("data:image/svg+xml,%3Csvg width='10' height='6' viewBox='0 0 10 6' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M1 1l4 4 4-4' stroke='%2314110F' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");background-repeat:no-repeat;background-position:right 10px center;cursor:pointer}
.ctl-sel:focus{outline:none;border-color:var(--ink)}
/* loading/empty/toast */
.loading,.empty{text-align:center;color:var(--ink-3);font-family:var(--mono);font-size:13px;padding:var(--s7) 0}
.toast{position:fixed;bottom:80px;left:50%;transform:translateX(-50%);background:var(--ink);color:var(--paper);padding:10px 18px;border-radius:var(--r-sm);font-size:14px;z-index:200;box-shadow:var(--shadow-pop)}
@keyframes rise{from{opacity:0;transform:translateY(8px)}to{opacity:1;transform:none}}
.rise{animation:rise .4s both}

/* ═══════════ DASHBOARD (经营看板) 组件类 ═══════════ */
/* — 月份导航条 / scope — */
.db-monthbar{display:flex;align-items:center;gap:var(--s2);margin-bottom:var(--s4);flex-wrap:wrap}
.db-mnav{display:inline-flex;align-items:stretch;border:1px solid var(--ink);background:var(--paper)}
.db-mnav button{background:none;border:none;padding:6px 14px;font-family:var(--serif);font-size:18px;color:var(--ink-2);cursor:pointer;transition:background .12s,color .12s}
.db-mnav button:hover{background:var(--paper-2);color:var(--ink)}
.db-mnav .db-mlabel{padding:7px 14px;border-left:1px solid var(--rule);border-right:1px solid var(--rule);font-family:var(--mono);font-size:13px;font-weight:600;letter-spacing:.08em;color:var(--ink);min-width:92px;text-align:center;font-variant-numeric:tabular-nums}
.db-scope{display:inline-flex;align-items:center;gap:6px;padding:6px 12px;border:1px solid var(--rule);background:var(--paper);font-family:var(--mono);font-size:10px;letter-spacing:.06em;text-transform:uppercase;color:var(--ink-3);cursor:pointer;transition:.2s}
.db-scope.active{border-color:var(--oxblood);color:var(--oxblood)}
.db-metricsel{font-family:var(--sans);font-size:13px;padding:6px 10px;border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--paper);color:var(--ink)}
/* — 头版双 LEAD — */
.headline{background:var(--paper);border:1px solid var(--ink);padding:18px 16px 14px;margin-bottom:18px;position:relative}
.headline::before{content:attr(data-kicker);position:absolute;top:-9px;left:14px;background:var(--ink);color:var(--paper);font-family:var(--mono);font-size:9px;text-transform:uppercase;letter-spacing:.18em;padding:3px 10px;font-weight:600}
.headline-top{display:flex;align-items:flex-end;justify-content:space-between;gap:14px;flex-wrap:wrap}
.headline-main{flex:1;min-width:200px}
.headline-mtd-label{font-family:var(--mono);font-size:9.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--ink-3);margin-bottom:2px}
.headline-lede{font-family:var(--serif);font-size:30px;font-weight:600;line-height:1;letter-spacing:-.02em;color:var(--ink);font-variant-numeric:tabular-nums;font-variation-settings:'opsz' 144;white-space:nowrap}
.headline-lede .cur{font-size:16px;color:var(--oxblood);font-style:italic;font-weight:500;margin-right:4px}
.headline-deck{font-family:var(--serif);font-size:14px;line-height:1.5;color:var(--ink-2);margin-top:10px;font-style:italic}
.headline-stats{display:grid;gap:var(--s2);margin-top:14px}
.headline-stats.cols-4{grid-template-columns:repeat(2,1fr)}
.headline-stats.cols-3{grid-template-columns:repeat(3,1fr)}
.headline-stat{border-top:1px solid var(--rule);padding-top:7px;min-width:0}
.headline-stat .st-label{font-family:var(--mono);font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.headline-stat .st-val{font-family:var(--serif);font-size:16px;font-weight:600;color:var(--ink);line-height:1.1;margin-top:2px;font-variant-numeric:tabular-nums;white-space:nowrap}
.headline-stat .st-sub{font-family:var(--mono);font-size:8.5px;color:var(--ink-3);margin-top:1px;line-height:1.2}
.headline-ranking{flex:1 1 100%;width:100%;margin-top:14px;border-top:1px solid var(--rule);padding-top:12px}
.headline-ranking .hr-title{font-family:var(--mono);font-size:8.5px;letter-spacing:.12em;text-transform:uppercase;color:var(--ink-3);margin-bottom:6px}
.rank-row{display:flex;align-items:baseline;gap:8px;padding:3px 0;border-bottom:1px dotted var(--rule);font-size:12px}
.rank-row .n{font-family:var(--mono);font-size:10px;color:var(--ink-3);width:18px;flex-shrink:0}
.rank-row .store{flex:1;font-family:var(--serif);color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:12px}
.rank-row .v{font-family:var(--mono);font-size:11px;color:var(--ink);font-variant-numeric:tabular-nums}
.rank-row.top .store{color:var(--oxblood);font-weight:600}
.rank-row.top .n{color:var(--oxblood)}
.rank-more{font-family:var(--mono);font-size:8.5px;letter-spacing:.08em;color:var(--ink-3);margin-top:6px}
/* — KPI 网格 — */
.kpi-sections{display:block}
.kpi-section{margin-bottom:18px}
.kpi-section-rule{display:flex;align-items:baseline;justify-content:space-between;border-bottom:2px solid var(--ink);padding-bottom:4px;margin-bottom:10px}
.kpi-section-label{font-family:var(--serif);font-size:17px;font-weight:600;color:var(--ink);letter-spacing:-.01em}
.kpi-section-meta{font-family:var(--mono);font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.kpi-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:var(--s2)}
.kpi-card{background:var(--paper);border:1px solid var(--rule);padding:11px 12px;cursor:pointer;transition:border-color .12s,background .12s}
.kpi-card:hover{border-color:var(--ink);background:var(--paper-2)}
.kpi-head{display:flex;justify-content:space-between;align-items:baseline;margin-bottom:5px}
.kpi-group{font-family:var(--mono);font-size:8px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.kpi-op{font-family:var(--mono);font-size:8px;letter-spacing:.06em;color:var(--oxblood)}
.kpi-label{font-family:var(--serif);font-size:13px;font-weight:500;color:var(--ink-2);line-height:1.2;margin-bottom:4px}
.kpi-value{font-family:var(--serif);font-size:24px;font-weight:600;color:var(--ink);line-height:1;font-variant-numeric:tabular-nums;letter-spacing:-.02em}
.kpi-value .unit{font-size:12px;color:var(--ink-3);font-weight:500;margin-left:2px}
.kpi-foot{display:flex;justify-content:space-between;align-items:baseline;margin-top:6px;font-family:var(--mono);font-size:9px;color:var(--ink-3)}
.kpi-foot .top{color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:62%;text-align:right}
/* — 排行多列 — */
.rank-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:var(--s3)}
.rank-col{background:var(--paper);border:1px solid var(--ink);display:flex;flex-direction:column}
.rank-col-full{grid-column:1/-1}
.rank-col-head{padding:9px 12px;border-bottom:1px solid var(--ink);background:var(--paper-2)}
.rank-col-title{display:block;font-family:var(--serif);font-size:15px;font-weight:600;color:var(--ink);line-height:1.15}
.rank-col-meta{display:block;font-family:var(--mono);font-size:8px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);margin-top:2px}
.rank-list{padding:6px 12px;flex:1}
.rank-line{display:flex;align-items:baseline;gap:8px;padding:5px 0;border-bottom:1px dotted var(--rule);flex-wrap:wrap}
.rank-line .num{font-family:var(--mono);font-size:11px;color:var(--ink-3);width:22px;flex-shrink:0}
.rank-line .store{flex:1;font-family:var(--serif);font-size:13px;color:var(--ink-2);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:60px}
.rank-line .val{font-family:var(--mono);font-size:12px;color:var(--ink);font-variant-numeric:tabular-nums}
.rank-line.top .store{color:var(--oxblood);font-weight:600}
.rank-line.top .num,.rank-line.top .val{color:var(--oxblood)}
.rank-line.top-2 .store,.rank-line.top-3 .store{font-weight:600;color:var(--ink)}
.rank-detail{flex:0 0 100%;display:flex;align-items:baseline;gap:8px;font-family:var(--mono);font-size:9px;color:var(--ink-3);margin-top:2px}
.rd-target{color:var(--ink-3)}
.rd-pct{color:var(--ink-2)}
.rd-pace.ahead{color:var(--forest)}
.rd-pace.onpace{color:var(--ink-2)}
.rd-pace.behind{color:var(--oxblood)}
.rank-bar{flex:0 0 100%;position:relative;height:4px;background:var(--paper-3);margin-top:3px;overflow:hidden}
.rank-bar .fill{height:100%;background:linear-gradient(90deg,var(--oxblood),var(--oxblood-2))}
.rank-bar .pace-mark{position:absolute;top:-1px;bottom:-1px;width:1.5px;background:var(--ink)}
.rank-footer{display:flex;justify-content:space-between;align-items:baseline;padding:8px 12px;border-top:1px solid var(--ink);background:var(--paper-2);font-family:var(--mono);font-size:9px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3)}
.rank-footer .tot{font-size:13px;color:var(--ink);text-transform:none;letter-spacing:0;font-variant-numeric:tabular-nums}
/* — 探索 pills — */
.epi-table{border:1px solid var(--rule);background:var(--paper)}
.epi-row{display:flex;align-items:flex-start;gap:10px;padding:8px 12px;border-bottom:1px dotted var(--rule)}
.epi-row:last-child{border-bottom:none}
.epi-label{font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);flex:0 0 56px;padding-top:4px}
.epi-pills{display:flex;flex-wrap:wrap;gap:6px;flex:1}
.epi-pill{font-family:var(--sans);font-size:12px;padding:4px 10px;border:1px solid var(--rule);background:var(--paper-2);color:var(--ink-2);cursor:pointer;transition:.12s}
.epi-pill:hover{border-color:var(--ink);color:var(--ink)}
.epi-pill.active{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.epi-empty{padding:14px;font-family:var(--mono);font-size:11px;color:var(--ink-3);text-align:center}
.db-optoggle{display:inline-flex;border:1px solid var(--rule)}
.db-optoggle .op{font-family:var(--mono);font-size:9.5px;letter-spacing:.06em;text-transform:uppercase;padding:5px 11px;background:var(--paper);color:var(--ink-3);cursor:pointer}
.db-optoggle .op.active{background:var(--ink);color:var(--paper)}
/* — 日历热力 — */
.cal-wrap{margin-top:var(--s3)}
.cal-summary{display:grid;grid-template-columns:repeat(4,1fr);gap:var(--s2);margin-bottom:var(--s3)}
.cal-sum-card{border:1px solid var(--rule);padding:8px 10px;background:var(--paper)}
.cal-sum-card .csc-label{font-family:var(--mono);font-size:8px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.cal-sum-card .csc-val{font-family:var(--serif);font-size:18px;font-weight:600;color:var(--ink);line-height:1.1;margin-top:2px;font-variant-numeric:tabular-nums}
.cal-grid{display:grid;grid-template-columns:repeat(7,1fr) 64px;gap:1px;background:var(--rule);border:1px solid var(--ink)}
.cal-dow{background:var(--paper-2);font-family:var(--mono);font-size:9px;letter-spacing:.06em;text-align:center;padding:5px 0;color:var(--ink-3)}
.cal-dow.weekend{color:var(--oxblood)}
.cal-dow.col-week{background:var(--ink);color:var(--paper)}
.cal-cell{background:var(--paper);min-height:62px;padding:4px 5px;position:relative;overflow:hidden}
.cal-cell.weekend{background:#F0EBDE}
.cal-cell.padded{background:#EDE8DB;opacity:.55}
.cal-cell.today{box-shadow:inset 0 0 0 2px var(--oxblood)}
.cal-cell.all-submitted::after{content:'';position:absolute;top:4px;right:4px;width:5px;height:5px;border-radius:50%;background:var(--forest);z-index:2}
.cal-num{font-family:var(--mono);font-size:10px;color:var(--ink-3);position:relative;z-index:2;display:flex;align-items:center;gap:4px}
.peak-mark{font-size:6.5px;letter-spacing:.08em;background:var(--oxblood);color:var(--paper);padding:1px 3px}
.cal-val{font-family:var(--serif);font-size:13px;font-weight:600;color:var(--ink);line-height:1.05;margin-top:1px;position:relative;z-index:2;font-variant-numeric:tabular-nums}
.cal-val .pre{font-size:9px;color:var(--ink-3);margin-right:1px}
.cal-val .suf{font-size:9px;color:var(--ink-3);margin-left:1px}
.cal-val.nodata{color:var(--rule);font-weight:400}
.cal-stores{font-family:var(--mono);font-size:8px;color:var(--ink-3);margin-top:2px;position:relative;z-index:2}
.cal-stores .mis{color:var(--oxblood)}
.cal-miss{font-family:var(--mono);font-size:7.5px;color:var(--oxblood);line-height:1.25;margin-top:2px;position:relative;z-index:2;word-break:break-all}
.cal-miss-head{display:inline-block;background:var(--oxblood);color:var(--paper);padding:0 3px;margin-right:3px}
.cal-cell .heat{position:absolute;inset:0;background:var(--oxblood);z-index:1}
.cal-week{background:var(--paper-2);padding:5px 6px;display:flex;flex-direction:column;gap:1px}
.cal-week.future{opacity:.5}
.cw-no{font-family:var(--mono);font-size:9px;font-weight:600;color:var(--oxblood);letter-spacing:.04em}
.cw-range{font-family:var(--mono);font-size:7.5px;color:var(--ink-3)}
.cw-row{display:flex;align-items:baseline;gap:3px;justify-content:space-between}
.cw-label{font-family:var(--mono);font-size:7.5px;color:var(--ink-3)}
.cw-val{font-family:var(--mono);font-size:10px;color:var(--ink);font-variant-numeric:tabular-nums}
.cw-val.weak{color:var(--ink-3);font-size:9px}
.cw-delta{font-family:var(--mono);font-size:9px;font-weight:600;margin-top:1px}
.cw-delta.up{color:var(--forest)}
.cw-delta.down{color:var(--oxblood)}
.cw-delta.flat{color:var(--ink-3)}
/* — 趋势 Chart — */
.chart-wrap{position:relative;height:340px;background:var(--paper);border:1px solid var(--ink);padding:10px}
.db-trend-head{display:flex;align-items:baseline;justify-content:space-between;gap:8px;flex-wrap:wrap;margin-bottom:var(--s2)}
.db-trend-title{font-family:var(--serif);font-size:16px;font-weight:600;color:var(--ink)}
.db-trend-sub{font-family:var(--mono);font-size:9px;letter-spacing:.1em;color:var(--ink-3)}
.days-row{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:var(--s2)}
.days-pill{font-family:var(--mono);font-size:10px;letter-spacing:.06em;padding:5px 11px;border:1px solid var(--rule);background:var(--paper);color:var(--ink-3);cursor:pointer;transition:.12s}
.days-pill:hover{border-color:var(--ink);color:var(--ink)}
.days-pill.active{background:var(--ink);color:var(--paper);border-color:var(--ink)}
.custom-range{display:flex;gap:6px;align-items:center;flex-wrap:wrap;margin-bottom:var(--s2)}
.custom-range input[type=date]{font-family:var(--mono);font-size:12px;padding:4px 8px;border:1px solid var(--rule);background:var(--paper);color:var(--ink)}
.data-table{width:100%;border-collapse:collapse;margin-top:var(--s3);font-family:var(--mono);font-size:12px}
.data-table th{text-align:left;font-size:8.5px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);border-bottom:1px solid var(--ink);padding:5px 6px}
.data-table td{padding:5px 6px;border-bottom:1px dotted var(--rule);color:var(--ink)}
.data-table td.num{text-align:right;font-variant-numeric:tabular-nums}
/* — sub section heading — */
.db-block{margin-bottom:var(--s6)}
.db-block-hd{display:flex;align-items:baseline;justify-content:space-between;gap:8px;margin-bottom:var(--s3);flex-wrap:wrap}
.db-block-hd .roman{font-family:var(--mono);font-size:11px;color:var(--oxblood);letter-spacing:.08em;margin-right:6px}

/* ═══════════ SHARED 跨视图组件类 (staff/recruit/complaint/settings/headcount/plan/ranking/fieldtrain) ═══════════ */
/* — 表单 (复用已有 .field;补行布局/动作区/紧凑 ds-field) — */
.ds-field{margin-bottom:var(--s3)}
.ds-field label{display:block;font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--ink-2);margin-bottom:6px}
.ds-field label .req{color:var(--oxblood);margin-left:2px}
.ds-field input,.ds-field select,.ds-field textarea{width:100%;font-family:var(--sans);font-size:15px;padding:10px 12px;border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--paper);color:var(--ink)}
.ds-field input:focus,.ds-field select:focus,.ds-field textarea:focus{outline:none;border-color:var(--ink)}
.ds-field textarea{min-height:72px;resize:vertical;line-height:1.5}
.ds-field .hint{font-family:var(--mono);font-size:10px;color:var(--ink-3);margin-top:4px;line-height:1.4}
.ds-form-row{display:grid;grid-template-columns:1fr 1fr;gap:var(--s3)}
.ds-form-row.cols-3{grid-template-columns:1fr 1fr 1fr}
.ds-form-row>*{margin-bottom:0}
@media(max-width:420px){.ds-form-row,.ds-form-row.cols-3{grid-template-columns:1fr;gap:0}.ds-form-row>*{margin-bottom:var(--s3)}}
.ds-form-actions{display:flex;gap:var(--s2);justify-content:flex-end;align-items:center;margin-top:var(--s4);padding-top:var(--s3);border-top:1px solid var(--rule);flex-wrap:wrap}
.ds-form-actions .spacer{flex:1}
/* — 弹层 / 底部抽屉 + 居中 modal + 遮罩 — */
.ds-backdrop{position:fixed;inset:0;background:rgba(20,17,15,.42);z-index:120;display:flex;flex-direction:column;justify-content:flex-end;animation:dsFade .2s both}
.ds-backdrop.center{justify-content:center;align-items:center;padding:20px}
@keyframes dsFade{from{opacity:0}to{opacity:1}}
.ds-sheet{background:var(--paper);border-top:2px solid var(--ink);border-radius:var(--r-lg) var(--r-lg) 0 0;max-height:88vh;display:flex;flex-direction:column;box-shadow:var(--shadow-pop);animation:dsSlideUp .26s cubic-bezier(.2,.8,.2,1) both}
.ds-backdrop.center .ds-sheet{border:1px solid var(--ink);border-radius:var(--r-md);max-width:520px;width:100%;max-height:84vh;animation:dsPop .22s both}
@keyframes dsSlideUp{from{transform:translateY(100%)}to{transform:none}}
@keyframes dsPop{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:none}}
.ds-sheet-hd{display:flex;align-items:center;justify-content:space-between;gap:var(--s3);padding:14px var(--s4) 12px;border-bottom:1px solid var(--rule);flex-shrink:0}
.ds-sheet-hd .ds-sheet-title{font-family:var(--serif);font-size:19px;font-weight:600;letter-spacing:-.01em;color:var(--ink)}
.ds-sheet-hd .ds-sheet-close{background:none;border:none;color:var(--ink-3);cursor:pointer;padding:4px;display:flex;line-height:0}
.ds-sheet-hd .ds-sheet-close:active{color:var(--ink)}
.ds-sheet-body{padding:var(--s4);overflow-y:auto;-webkit-overflow-scrolling:touch;flex:1}
/* — 状态徽章 — */
.ds-badge{display:inline-flex;align-items:center;gap:4px;font-family:var(--mono);font-size:10px;font-weight:600;letter-spacing:.04em;padding:3px 8px;border-radius:99px;border:1px solid var(--rule);background:var(--paper-2);color:var(--ink-2);white-space:nowrap;line-height:1.3}
.ds-badge .dot{width:5px;height:5px;border-radius:99px;background:currentColor;flex-shrink:0}
.ds-badge-ok{background:rgba(46,93,58,.1);border-color:rgba(46,93,58,.3);color:var(--forest)}
.ds-badge-warn{background:rgba(155,122,31,.12);border-color:rgba(155,122,31,.34);color:var(--gold)}
.ds-badge-danger{background:rgba(122,30,26,.1);border-color:rgba(122,30,26,.32);color:var(--oxblood)}
.ds-badge-muted{background:var(--paper-3);border-color:var(--rule);color:var(--ink-3)}
/* — 头像 (列表 + 档案大图;img 裂→首字母占位) — */
.ds-avatar{position:relative;width:46px;height:46px;border-radius:50%;flex-shrink:0;background:var(--paper-3);border:1px solid var(--rule);display:inline-flex;align-items:center;justify-content:center;font-family:var(--serif);font-size:17px;font-weight:600;color:var(--ink-2);overflow:hidden;text-transform:uppercase}
/* img 绝对定位铺满,完全盖住居中的首字母占位;img onerror 被 remove 后才露出占位字 */
.ds-avatar img,.ds-avatar-lg img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover;border-radius:inherit;display:block}
.ds-avatar-lg{position:relative;width:96px;height:96px;border-radius:50%;flex-shrink:0;background:var(--paper-3);border:1px solid var(--rule);box-shadow:var(--shadow-sm);display:inline-flex;align-items:center;justify-content:center;font-family:var(--serif);font-size:34px;font-weight:600;color:var(--ink-2);overflow:hidden;text-transform:uppercase}
/* — 星级 (显示态 + 可点选) — */
.ds-rating{display:inline-flex;align-items:center;gap:1px;font-size:15px;line-height:1;color:var(--gold);letter-spacing:1px}
.ds-rating .off{color:var(--rule)}
.ds-rating-input{display:inline-flex;align-items:center;gap:3px}
.ds-rating-input .star{font-size:24px;line-height:1;color:var(--rule);cursor:pointer;background:none;border:none;padding:0 1px;transition:color .12s,transform .1s}
.ds-rating-input .star.on{color:var(--gold)}
.ds-rating-input .star:active{transform:scale(1.18)}
/* — 文件上传 + 附件 — */
.ds-upload{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:6px;padding:18px 14px;border:1.5px dashed var(--rule);border-radius:var(--r-md);background:var(--paper-2);color:var(--ink-3);cursor:pointer;text-align:center;transition:border-color .15s,color .15s}
.ds-upload:hover{border-color:var(--ink);color:var(--ink-2)}
.ds-upload .ic{color:inherit}
.ds-upload .up-label{font-family:var(--mono);font-size:11px;letter-spacing:.04em}
.ds-upload .up-hint{font-family:var(--mono);font-size:9.5px;color:var(--ink-3)}
.ds-upload input[type=file]{display:none}
.ds-attach{display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);font-size:11px;color:var(--ink-2);text-decoration:none;padding:4px 9px;border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--paper);max-width:100%;transition:border-color .12s,color .12s}
.ds-attach:hover{border-color:var(--ink);color:var(--ink)}
.ds-attach .ic{width:13px;height:13px;flex-shrink:0;color:var(--ink-3)}
.ds-attach .nm{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-attach-row{display:flex;flex-wrap:wrap;gap:6px;margin-top:var(--s2)}
/* — 多行子表 (横向可滚, 教育/工作经历等) — */
.ds-rowtbl{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch;border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--paper)}
.ds-rowtbl table{width:100%;min-width:max-content;border-collapse:collapse;font-size:13px}
.ds-rowtbl th{text-align:left;font-family:var(--mono);font-size:8.5px;letter-spacing:.08em;text-transform:uppercase;color:var(--ink-3);background:var(--paper-2);border-bottom:1px solid var(--ink);padding:6px 10px;white-space:nowrap;font-weight:600}
.ds-rowtbl td{padding:7px 10px;border-bottom:1px dotted var(--rule);color:var(--ink-2);white-space:nowrap;vertical-align:top}
.ds-rowtbl tr:last-child td{border-bottom:none}
.ds-rowtbl td input,.ds-rowtbl td select{font-family:var(--sans);font-size:13px;padding:5px 7px;border:1px solid var(--rule);border-radius:5px;background:var(--paper);color:var(--ink);min-width:90px}
.ds-rowtbl .empty-cell{color:var(--rule)}
/* — 可展开行 (点击 stat/行 展开明细面板) — */
.ds-row{display:flex;align-items:center;gap:var(--s3);padding:10px var(--s3);border:1px solid var(--rule);border-radius:var(--r-sm);background:var(--paper);cursor:pointer;transition:border-color .12s,background .12s;margin-bottom:6px}
.ds-row:hover{border-color:var(--ink);background:var(--paper-2)}
.ds-row.open{border-color:var(--ink)}
.ds-row .ds-row-main{flex:1;min-width:0}
.ds-row .ds-row-nm{font-family:var(--serif);font-size:14px;font-weight:600;color:var(--ink);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ds-row .ds-row-sub{font-family:var(--mono);font-size:10px;color:var(--ink-3);margin-top:1px}
.ds-row .ds-row-chev{color:var(--ink-3);transition:transform .18s;flex-shrink:0}
.ds-row.open .ds-row-chev{transform:rotate(90deg)}
.ds-row-detail{border:1px solid var(--rule);border-top:none;border-radius:0 0 var(--r-sm) var(--r-sm);background:var(--paper-2);padding:var(--s3);margin:-6px 0 var(--s3);animation:rise .3s both}
.ds-row-detail .ds-rd-group{font-family:var(--mono);font-size:9px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3);margin:var(--s2) 0 6px}
.ds-row-detail .ds-rd-group:first-child{margin-top:0}
.ds-row-detail .ds-rd-item{display:flex;align-items:baseline;justify-content:space-between;gap:8px;padding:5px 0;border-bottom:1px dotted var(--rule);font-size:13px}
.ds-row-detail .ds-rd-item:last-child{border-bottom:none}
.ds-row-detail .ds-rd-item .nm{font-family:var(--serif);color:var(--ink-2);cursor:pointer}
.ds-row-detail .ds-rd-item .nm:hover{color:var(--oxblood)}
