/* Omnibus Portal 样式（从 base.html 内联抽出，2026-09-02，前端设计建议书 F-29）。
   主题：Mono Contrast × 键帽（2026-08-18 试衣间拍板，不重开）。
   字体：2026-09-02 切换为系统字体栈（Segoe UI / SF / Arial；等宽 Consolas）——
   Archivo 是宽体展示字体、Google 可变版无 hinting，在 Windows 10–13px 下发虚；
   The Edge Malaysia 亦以 Arial 为正文。三条排版规则同步：大写字距 ≤ .08em、
   数据字号 ≥ 12px（大写标签 11px）、品牌字重 700（建议书 §6.1 / D-UI-4）。
   NOTE: --jade 承担 ACCENT BLUE（旧名保留避免改动面）；--good 为 ok 状态绿。 */
:root{
  --bg:#e9edf3; --panel:#ffffff; --panel2:#f7f7f7; --line:#ccd4e0; --line2:#111111;
  --ink:#111111; --mut:#444444; --faint:#6b6b6b;
  --jade:#0b57d0; --jade-dim:#7fa3d9; --jade-glow:rgba(11,87,208,.10);
  --good:#0f7b34; --amber:#8f6400; --red:#c5221f; --cyan:#33689c;
  --buy:#0b57d0; --sell:#b45309;
  --sans:"Segoe UI",-apple-system,BlinkMacSystemFont,"Helvetica Neue",Arial,sans-serif;
  --serif:var(--sans);
  --mono:Consolas,"Cascadia Mono","SF Mono",Menlo,"Courier New",monospace;
}
*{box-sizing:border-box}
/* [hidden] 必须压过下面 button/.btn 的 display:inline-block（作者样式高于 UA 的 [hidden]{display:none}），
   否则 portal.js 里 apply.hidden=true 之类无效——分页栏的 Apply 按钮曾因此一直露着（2026-09-07 修） */
[hidden]{display:none!important}
html{scrollbar-gutter:stable}
body{margin:0;background:var(--bg);color:var(--ink);font:14px/1.5 var(--sans)}
a{color:var(--jade);text-decoration:none}
a:hover{color:#0a4cb5}
a:focus-visible,button:focus-visible,input:focus-visible,select:focus-visible,
textarea:focus-visible,summary:focus-visible{outline:2px solid var(--jade);outline-offset:2px}
.sr{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
/* ---------- masthead ---------- */
header.mast{border-bottom:1px solid var(--line);background:var(--bg);padding:12px 26px 0}
.mast-row{display:flex;align-items:center;gap:14px;flex-wrap:wrap}
.brand{font-family:var(--serif);font-size:20px;font-weight:700;letter-spacing:-.01em;color:var(--ink);white-space:nowrap}
.brand b{color:var(--jade);font-weight:700}
.brand small{font-family:var(--sans);font-size:11px;color:var(--faint);letter-spacing:.14em;
  text-transform:uppercase;margin-left:10px;font-weight:600}
.mast-right{margin-left:auto;display:flex;align-items:center;gap:12px;font-size:12px;flex-wrap:wrap}
.jump{display:flex;align-items:center;gap:6px}
.jump input{width:230px;font-family:var(--mono);font-size:12.5px;margin:0}
.jump kbd{font:600 11px var(--sans);border:1px solid #c2cbd9;border-bottom-width:2px;border-radius:4px;
  padding:0 5px;color:var(--mut);background:#f0f3f8}
.clock{color:var(--mut);font-family:var(--mono);font-size:12px;letter-spacing:.04em;white-space:nowrap}
.userchip{border:1px solid var(--line);border-radius:6px;padding:3px 10px;color:var(--mut);background:var(--panel);white-space:nowrap}
.userchip b{color:var(--jade);font-weight:normal}
nav.tabs{display:flex;gap:5px;margin-top:10px;flex-wrap:wrap;padding-bottom:10px;align-items:center}
nav.tabs a{font-family:var(--sans);font-size:11.5px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  color:var(--mut);padding:7px 13px;border-radius:7px;display:inline-flex;align-items:center;gap:6px;
  background:linear-gradient(180deg,#ffffff,#f0f3f8);
  border:1px solid #c2cbd9;border-bottom:3px solid #aab6c8;
  box-shadow:0 1px 2px rgba(16,24,40,.06);
  transition:transform .1s ease,background .12s ease,border-bottom-width .1s ease,color .12s ease}
nav.tabs a:hover{background:#ffffff;color:var(--ink)}
nav.tabs a:active{transform:translateY(2px);border-bottom-width:1px}
nav.tabs a.on{background:linear-gradient(180deg,#2f6fe0,#0b57d0);border-color:#0a4cb5;
  border-bottom:3px solid #083a8c;color:#fff}
nav.tabs .sep{width:1px;height:24px;background:#aab6c8;margin:0 4px}
nav.tabs a.right{margin-left:auto}
/* 待办计数徽标（F-01）：淡底色 + 彩色数字，小一号——实心大红圈过于显眼（2026-09-02 用户反馈）。
   bad 红 = 立即处理的异常；warn 琥珀 = 等本角色动作；info 蓝 = 信息 */
.badge{font:700 10px/1 var(--sans);letter-spacing:0;min-width:15px;height:15px;padding:0 4px;border-radius:8px;
  display:inline-flex;align-items:center;justify-content:center;text-transform:none;
  background:#f7efd8;color:var(--amber);border:1px solid #e0d0a0}
.badge.bad{background:#f9e7e7;color:var(--red);border-color:#e9c2c1}
.badge.info{background:#e9f1f9;color:var(--cyan);border-color:#bcd2e6}
nav.tabs a.on .badge{background:#fff;color:var(--jade);border-color:#fff}
/* ---------- layout ---------- */
main{max-width:1180px;margin:22px auto 60px;padding:0 22px}
.card{background:var(--panel);border:1px solid var(--line);border-radius:8px;
  box-shadow:0 2px 0 var(--line);
  padding:16px 18px 14px;margin:18px 0;position:relative}
/* L8 徽章编号卡标题（可为 h2，语义化） */
.tag{font-family:var(--sans);font-size:13px;letter-spacing:0;
  font-weight:600;color:#333;display:flex;align-items:center;gap:8px;flex-wrap:wrap;margin:0 0 10px}
.tag b{background:var(--jade);color:#fff;font-weight:700;font-size:11px;
  padding:1px 7px;border-radius:4px}
.tag .dim{font-weight:400}
.tag .right{margin-left:auto;display:flex;gap:8px;align-items:center;font-weight:400}
.card h3.sub{font-family:var(--sans);font-size:13px;font-weight:600;margin:16px 0 6px}
.card h3.sub .dim{font-weight:400}
.nowrap{white-space:nowrap}
h1{font-family:var(--serif);font-weight:700;font-size:22px;margin:4px 0 12px;display:flex;align-items:center;gap:10px;flex-wrap:wrap}
h1 .actions{margin-left:auto;display:flex;gap:6px;align-items:center;font-size:13px;font-weight:400}
.crumbs{font-size:12.5px;color:var(--faint);margin:2px 0 6px;display:flex;gap:8px;align-items:center;flex-wrap:wrap}
.crumbs .nav{margin-left:auto;display:flex;gap:10px}
/* ---------- KPI tiles ---------- */
.tiles{display:grid;grid-template-columns:repeat(6,minmax(0,1fr));gap:12px;margin:16px 0}
@media (max-width:980px){.tiles{grid-template-columns:repeat(3,minmax(0,1fr))}}
@media (max-width:560px){.tiles{grid-template-columns:repeat(2,minmax(0,1fr))}}
.tile{background:var(--panel);border:1px solid var(--line);border-radius:8px;
  box-shadow:0 2px 0 var(--line);padding:12px 13px 10px;min-width:0}
.tile .k{font-family:var(--sans);font-size:11.5px;letter-spacing:.01em;font-weight:600;color:var(--mut)}
.tile .v{font-family:var(--sans);font-size:clamp(15px,1.55vw,19px);font-weight:700;letter-spacing:-.01em;margin:6px 0 2px;
  font-variant-numeric:tabular-nums;color:var(--ink);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.tile .v small{font-size:12px;color:var(--faint);font-weight:600}
.tile .s{font-size:12px;color:var(--faint)}
.tile.alert{border-color:#e9c2c1;box-shadow:0 2px 0 #e9c2c1,inset 0 0 0 1px rgba(197,34,31,.12)}
/* ---------- tables ----------
   表头不再 sticky：.tblwrap 的 overflow-x:auto 使其成为 sticky 的滚动祖先，th 会相对
   容器而非视口偏移（2026-09-02 渲染检查发现表头被顶到表中段）。横向滚动容器优先。 */
.tblwrap{overflow-x:auto;margin:4px 0 2px}
table{border-collapse:collapse;width:100%;margin:6px 0 4px;font-size:13px}
th{font-family:var(--sans);font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  color:var(--faint);text-align:left;padding:7px 10px;border-bottom:1px solid var(--line2);
  background:var(--panel);white-space:nowrap}
th.sort a{color:inherit;display:inline-block}
th.sort.on{color:var(--jade);border-bottom:2px solid var(--jade)}
th.sort .arr{font-size:9px;margin-left:3px;letter-spacing:0}
td{padding:6px 10px;border-bottom:1px solid #dde2e9;color:var(--ink);
  font-variant-numeric:tabular-nums;vertical-align:middle}
td.n,th.n{text-align:right}
tfoot td{border-top:2px solid var(--line2);border-bottom:none;font-weight:700;background:var(--panel2)}
tbody tr:hover td{background:var(--jade-glow)}
table.dense td{padding:4px 8px;font-size:12.5px}
td .mono,.mono{font-family:var(--mono);font-size:12.5px}
.dim{color:var(--mut)}.faint{color:var(--faint);font-size:12.5px}
.rowact{white-space:nowrap;font-size:12.5px;text-align:right}
.rowact a+a{margin-left:10px}
td.detail-row{background:var(--panel2);padding:8px 12px}
.side-buy{color:var(--buy);font-weight:600;white-space:nowrap}
.side-sell{color:var(--sell);font-weight:600;white-space:nowrap}
/* ---------- toolbar / filter chips / pager ---------- */
.toolbar{display:flex;flex-wrap:wrap;align-items:center;gap:8px 14px;padding:0 0 10px;border-bottom:1px solid #dde2e9;margin-bottom:4px}
.toolbar .search{display:flex;align-items:center;gap:6px}
.toolbar .search input{width:220px;margin:0}
.toolbar .field{display:flex;align-items:center;gap:6px;font-size:12px;color:var(--mut)}
.toolbar .field input,.toolbar .field select{margin:0}
.toolbar .right{margin-left:auto;display:flex;align-items:center;gap:10px;font-size:12.5px;color:var(--mut)}
.chips{display:flex;gap:6px;flex-wrap:wrap}
.fchip{font:600 11.5px var(--sans);letter-spacing:.02em;padding:3px 10px;border-radius:14px;
  border:1px solid #c2cbd9;background:#fff;color:var(--mut);white-space:nowrap}
.fchip:hover{color:var(--ink);background:#f7f9fc}
.fchip.on{background:var(--jade);border-color:#0a4cb5;color:#fff}
.fchip small{opacity:.8;margin-left:3px;font-size:11px}
.pager{display:flex;align-items:center;gap:6px;flex-wrap:wrap;padding-top:12px;font-size:12.5px;color:var(--mut)}
.pager .range{margin-right:10px;font-variant-numeric:tabular-nums}
.pager .key{display:inline-block;min-width:30px;text-align:center;padding:4px 8px;border-radius:6px;color:var(--mut);font-weight:600;
  background:linear-gradient(180deg,#fff,#f0f3f8);border:1px solid #c2cbd9;border-bottom:3px solid #aab6c8;font-variant-numeric:tabular-nums}
.pager .key:hover{color:var(--ink)}
.pager .key.on{background:linear-gradient(180deg,#2f6fe0,#0b57d0);border-color:#0a4cb5;border-bottom-color:#083a8c;color:#fff}
.pager .key.off{opacity:.4;pointer-events:none}
.pager .gap{padding:0 2px;color:var(--faint)}
.pager .per{margin-left:auto;display:flex;align-items:center;gap:6px}
.pager .per select{margin:0}
/* ---------- pills & dots ---------- */
.pill{display:inline-block;font-family:var(--sans);font-size:11px;font-weight:600;letter-spacing:.04em;
  padding:2px 8px;border-radius:5px;border:1px solid var(--line);color:var(--mut);white-space:nowrap}
.pill.ok{color:var(--good);border-color:#bcd9c4;background:#e8f2ea}
.pill.warn{color:var(--amber);border-color:#e0d0a0;background:#f7efd8}
.pill.bad{color:var(--red);border-color:#e9c2c1;background:#f9e7e7}
.pill.info{color:var(--cyan);border-color:#bcd2e6;background:#e9f1f9}
.dot{display:inline-block;width:7px;height:7px;border-radius:50%;margin-right:6px;vertical-align:1px}
.dot.ok{background:var(--good)}.dot.warn{background:var(--amber)}
.dot.bad{background:var(--red);animation:pulse 1.4s ease-in-out infinite}
@keyframes pulse{50%{opacity:.35}}
.ok{color:var(--good)}.warn{color:var(--amber)}.bad{color:var(--red)}
/* ---------- forms & buttons ---------- */
input,select,textarea{background:#ffffff;border:1px solid #b9c3d2;color:var(--ink);
  border-radius:6px;padding:6px 9px;font:13px var(--sans);margin:2px 0}
input:focus,select:focus,textarea:focus{outline:none;border-color:var(--jade);
  box-shadow:0 0 0 2px var(--jade-glow)}
input.num,input[inputmode="decimal"]{font-variant-numeric:tabular-nums;text-align:right}
input.mono,textarea.mono{font-family:var(--mono);font-size:12.5px}
textarea{width:360px;height:74px;max-width:100%}
label,.lbl{font-family:var(--sans);font-size:12px;letter-spacing:0;font-weight:600;color:var(--mut)}
.formgrid{display:grid;grid-template-columns:repeat(auto-fit,minmax(150px,1fr));gap:8px 14px;max-width:820px;margin:4px 0 10px}
.formgrid label{display:flex;flex-direction:column;gap:3px}
.formgrid label.wide{grid-column:span 2}
.formgrid label.full{grid-column:1 / -1}
.formgrid input,.formgrid select,.formgrid textarea{width:100%;margin:0}
.formgrid .hint{font-weight:400;color:var(--faint);font-size:11.5px}
.rows{display:grid;gap:6px;max-width:560px;margin:4px 0}
.rows .r{display:grid;grid-template-columns:1fr 1fr;gap:8px}
.rows .r input{margin:0;width:100%}
.btnrow{display:flex;gap:8px;align-items:center;flex-wrap:wrap;margin-top:6px}
button,.btn{background:linear-gradient(180deg,#2f6fe0,#0b57d0);color:#ffffff;
  border:1px solid #0a4cb5;border-bottom:3px solid #083a8c;border-radius:7px;
  font:600 12.5px var(--sans);padding:7px 16px;cursor:pointer;letter-spacing:.01em;display:inline-block;
  transition:transform .1s ease,border-bottom-width .1s ease,filter .12s ease}
button:hover,.btn:hover{filter:brightness(1.07);color:#fff}
button:active,.btn:active{transform:translateY(2px);border-bottom-width:1px}
button.ghost,.btn.ghost{background:linear-gradient(180deg,#ffffff,#f0f3f8);color:var(--jade);
  border:1px solid #c2cbd9;border-bottom:3px solid #aab6c8}
button.ghost:hover,.btn.ghost:hover{background:#ffffff;filter:none;color:var(--jade)}
button.danger{background:linear-gradient(180deg,#d9463f,#c5221f);border-color:#a51c19;border-bottom-color:#7c1310}
button[disabled],.btn.off{opacity:.45;filter:grayscale(1);cursor:not-allowed;transform:none}
button.small{padding:4px 10px;font-size:12px;border-bottom-width:2px}
form.inline{display:inline-block;margin:3px 6px 3px 0}
details.fold{border:1px solid var(--line);border-radius:6px;padding:6px 10px;background:var(--panel2);font-size:12.5px;margin:6px 0}
details.fold summary{cursor:pointer;color:var(--jade);font-weight:600}
details.fold[open]{padding-bottom:10px}
/* ---------- 文件选择框（_macros.filepick；2026-09-07 重设计） ----------
   原生 file input 的文案跟随浏览器界面语言（lang 无效，2026-09-04 实测），所以自绘。
   第一版把透明的原生 input 铺在自绘按钮之上、靠层叠接住点击——结果「点按钮不弹框、
   点旁边文字才弹」：mousedown 落在 input 上触发 :active，键帽下压那条规则给 .btn 加了
   transform，它随即升到 input 之上，mouseup 落在 .btn，click 目标变成两者的共同祖先，
   input 永远收不到 click（2026-09-07 用 elementFromPoint + 事件计数实证）。
   这版不依赖层叠：整个控件是 <label for=…>，点任何位置都由浏览器原生激活 input；
   原生 input 视觉隐藏但可 Tab 聚焦、Enter/Space 弹框、required 气泡照常。
   外观是一个输入框：左侧键帽按钮，右侧文件名区（选中后名字 + 大小；可拖放）。 */
.filepick{position:relative;display:inline-flex;flex-direction:row;align-items:stretch;gap:0;
  max-width:100%;min-width:280px;margin:2px 0;vertical-align:middle;cursor:pointer;
  background:#ffffff;border:1px solid #b9c3d2;border-radius:6px;overflow:hidden;
  font-weight:400;letter-spacing:0;color:var(--ink)}
.filepick input[type=file]{position:absolute;left:0;top:0;width:1px;height:1px;
  margin:0;padding:0;border:0;opacity:0;pointer-events:none}
.filepick .fp-btn{display:inline-flex;align-items:center;flex:none;padding:0 13px;
  font:600 12.5px var(--sans);color:var(--jade);letter-spacing:.01em;white-space:nowrap;
  background:linear-gradient(180deg,#ffffff,#f0f3f8);border-right:1px solid #c2cbd9;
  box-shadow:inset 0 -3px 0 #aab6c8;transition:box-shadow .1s ease,background .12s ease}
.filepick:hover .fp-btn{background:#ffffff}
.filepick:active .fp-btn{box-shadow:inset 0 -1px 0 #aab6c8;background:#eef2f8}
.filepick .fp-name{flex:1 1 auto;min-width:0;align-self:center;padding:6px 10px;
  font-size:12.5px;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
.filepick .fp-name.has{color:var(--ink);font-family:var(--mono);font-size:12px}
.filepick .fp-name small{color:var(--faint);font-family:var(--sans);font-size:11.5px;margin-left:6px}
.filepick:focus-within,.filepick.drag{border-color:var(--jade);box-shadow:0 0 0 2px var(--jade-glow)}
.filepick.drag .fp-name{color:var(--jade)}
/* 表单网格：.formgrid label 的纵向 flex 不能套到本控件上；网格里也不能用 <label> 包它（嵌套 label 非法），
   用 .field 承担原来 label 的排版角色 */
.formgrid .filepick{display:flex;flex-direction:row;gap:0;width:100%;min-width:0;margin:0}
.formgrid .field{display:flex;flex-direction:column;gap:3px}
.formgrid .field.wide{grid-column:span 2}
/* ---------- 自绘英文日期框 + 日历（portal.js .dtp） ----------
   原生 <input type=date> 的占位符「年/月/日」与下拉日历同样跟随浏览器界面语言。
   有脚本时换成文本框 + 本页自绘的英文日历；无脚本时保留原生控件，功能不受影响。
   提交值始终是 YYYY-MM-DD，与原生 date 完全一致，服务端无需改动。 */
.dtp{position:relative;display:inline-flex;align-items:center;margin:2px 0}
.dtp>input{width:122px;margin:0;padding-right:28px;font-family:var(--mono);
  font-size:12.5px;font-variant-numeric:tabular-nums}
.dtp>.dtp-cal{position:absolute;right:1px;top:1px;bottom:1px;width:26px;padding:0;
  border:0;border-radius:0 5px 5px 0;background:transparent;color:var(--faint);
  font-size:13px;line-height:1;cursor:pointer;display:flex;align-items:center;
  justify-content:center;transform:none;transition:none}
.dtp>.dtp-cal:hover{color:var(--jade);background:#eef2f8;filter:none}
.dtp>.dtp-cal:active{transform:none}
.formgrid .dtp{width:100%;max-width:240px;margin:0}   /* 单列网格（签核页）里别把日期框拉到整行宽 */
.formgrid .dtp>input{width:100%}
.toolbar .dtp{margin:0}
/* 日历内部一律用 dtp- 前缀：全站已有 .today / .grid / .nav / .hd / .ft / .d 等
   通用类名，裸类名会被它们命中（.today 的 minmax(170px,1fr) 撑爆过日历列宽）。 */
.dtp-pop{position:absolute;z-index:40;top:calc(100% + 5px);left:0;width:240px;
  background:var(--panel);border:1px solid #b9c3d2;border-radius:8px;
  box-shadow:0 6px 20px rgba(16,24,40,.18);padding:8px;text-align:left}
.dtp-pop.dtp-up{top:auto;bottom:calc(100% + 5px)}
.dtp-hd{display:flex;align-items:center;gap:6px;margin-bottom:6px}
.dtp-hd b{flex:1;text-align:center;font:600 12.5px var(--sans);color:var(--ink)}
.dtp-nav{width:24px;height:24px;min-width:24px;padding:0;border-radius:6px;
  border:1px solid #c2cbd9;border-bottom:2px solid #aab6c8;color:var(--mut);
  background:linear-gradient(180deg,#ffffff,#f0f3f8);font-size:12px;line-height:1;
  display:flex;align-items:center;justify-content:center}
.dtp-nav:hover{color:var(--ink);filter:none;background:#ffffff}
.dtp-grid{display:grid;grid-template-columns:repeat(7,1fr);gap:2px}
.dtp-wd{font:600 10px var(--sans);letter-spacing:.05em;text-transform:uppercase;
  color:var(--faint);text-align:center;padding:3px 0}
.dtp-d{display:block;min-width:0;padding:5px 0;border:1px solid transparent;
  border-radius:6px;background:transparent;color:var(--ink);font:12.5px var(--mono);
  font-variant-numeric:tabular-nums;text-align:center;cursor:pointer;transform:none}
.dtp-d:hover{background:var(--jade-glow);color:var(--ink);filter:none}
.dtp-d:active{transform:none}
.dtp-d.dtp-out{color:#b6bfcc}
.dtp-d.dtp-now{border-color:var(--jade-dim);font-weight:700}
.dtp-d.dtp-sel{background:var(--jade);border-color:#0a4cb5;color:#ffffff}
.dtp-ft{display:flex;gap:6px;margin-top:7px;border-top:1px solid #dde2e9;padding-top:7px}
.dtp-ft button{flex:1;padding:4px 8px;font-size:11.5px;border-bottom-width:2px}
/* ---------- flash（三态） ---------- */
.flash{border:1px solid #e0d0a0;background:#f7efd8;color:var(--amber);
  font-size:13px;padding:9px 14px;margin:10px 0;border-radius:6px;display:flex;gap:10px;align-items:flex-start}
.flash i{font-style:normal;font-weight:800;width:16px;flex:none;text-align:center}
.flash.ok{border-color:#bcd9c4;background:#e8f2ea;color:var(--good)}
.flash.bad{border-color:#e9c2c1;background:#f9e7e7;color:var(--red)}
.flash.info{border-color:#bcd2e6;background:#e9f1f9;color:var(--cyan)}
.flash a{text-decoration:underline}
/* ---------- dashboard：关注条 / 今日流程 ---------- */
.attn{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));gap:10px;margin:16px 0 6px}
.attn .it{background:var(--panel);border:1px solid var(--line);border-left:4px solid var(--red);border-radius:6px;padding:8px 12px;font-size:12.5px;color:var(--mut)}
.attn .it.w{border-left-color:var(--amber)}.attn .it.i{border-left-color:var(--cyan)}.attn .it.g{border-left-color:var(--good)}
.attn .it b{display:block;font-size:16px;font-variant-numeric:tabular-nums;color:var(--ink)}
.attn .it a{font-size:12px;margin-left:6px}
.today{display:grid;grid-template-columns:repeat(auto-fit,minmax(170px,1fr));gap:8px}
.today .t{display:flex;gap:8px;align-items:flex-start;font-size:12.5px;padding:7px 10px;border:1px dashed #c2cbd9;border-radius:6px;background:#fff}
.today .t i{font-style:normal;font-weight:800;width:16px;flex:none;color:var(--faint)}
.today .t.d{border-style:solid;background:#e8f2ea;border-color:#bcd9c4}
.today .t.d i{color:var(--good)}
/* ---------- order lifecycle stepper ---------- */
.steps{display:flex;align-items:stretch;margin:6px 0 12px;overflow-x:auto}
.step{flex:1;min-width:120px;padding:8px 10px;border:1px solid var(--line);border-right:none;background:var(--panel2);font-size:11.5px;color:var(--faint)}
.step:first-child{border-radius:6px 0 0 6px}.step:last-child{border-right:1px solid var(--line);border-radius:0 6px 6px 0}
.step b{display:block;font-size:11.5px;letter-spacing:.06em;text-transform:uppercase}
.step.done{background:#e8f2ea;color:var(--good)}
.step.cur{background:var(--jade);color:#fff;border-color:#0a4cb5}
.step.bad{background:#f9e7e7;color:var(--red)}
/* ---------- confirm page ---------- */
.confirm{max-width:620px}
.confirm dl{display:grid;grid-template-columns:170px 1fr;gap:6px 14px;margin:8px 0 12px;font-size:13.5px}
.confirm dt{color:var(--faint)}.confirm dd{margin:0;font-variant-numeric:tabular-nums}
.confirm .delta{color:var(--jade);font-weight:700}
/* ---------- footer ---------- */
footer{border-top:1px solid var(--line);margin-top:50px;padding:12px 26px;
  font-family:var(--sans);font-size:11px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);
  display:flex;gap:24px;flex-wrap:wrap}
/* ---------- responsive / motion ---------- */
@media (max-width:760px){
  .jump input{width:150px}
  .toolbar .search input{width:150px}
  .confirm dl{grid-template-columns:1fr}
  textarea{width:100%}
}
@media (prefers-reduced-motion:reduce){
  nav.tabs a,button,.btn{transition:none}
  .dot.bad{animation:none}
}
@media print{header.mast,footer,.pager,.toolbar,.rowact{display:none}.card{break-inside:avoid;box-shadow:none}}
