:root {
  --amber: #F5A623;
  --amber-deep: #E09500;
  --amber-light: rgba(245,166,35,0.12);
  --green: #00C853;
  --green-light: rgba(0,200,83,0.1);
  --red: #E53935;
  --red-light: rgba(229,57,53,0.08);
  --black: #0F0F0F;
  --white: #FFF;
  --bg: #F0F2F5;
  --card: #FFF;
  --border: #E2E4E8;
  --border-light: #F0F1F3;
  --gray: #6B7280;
  --gray-light: #9CA3AF;
  /* PWA-aligned tokens (aliases — same values as the working palette) */
  --c-amber: var(--amber);
  --c-green: var(--green);
  --c-red: var(--red);
  --c-text: #1A1A1A;
  --c-on-amber: #1A1A1A;
  --c-on-green: #FFFFFF;
  --c-on-red: #FFFFFF;
  --c-text-muted: var(--gray);
  --c-text-dim: var(--gray-light);
  --c-surface: var(--card);
  --c-bg: var(--bg);
  --c-border: var(--border);
  --c-border-light: var(--border-light);
  --c-hover-bg: rgba(0,0,0,0.04);
  --c-danger: var(--red);
  --c-success: var(--green);
  --c-warn: #E65100;
  --shadow-amber: 0 4px 20px rgba(245,166,35,0.25);
  --radius-xs: 6px;
  --radius-sm: 8px;
  --radius-lg: 16px;
  --shadow: 0 1px 3px rgba(0,0,0,0.04), 0 1px 2px rgba(0,0,0,0.03);
  --shadow-md: 0 4px 12px rgba(0,0,0,0.06), 0 2px 4px rgba(0,0,0,0.04);
  --shadow-lg: 0 8px 24px rgba(0,0,0,0.08);
  --orange: #FF8C00;
  --blue: #2196F3;
  --teal: #00BCD4;
  --purple: #6458C8;
  --font: -apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;
  --transition: 0.2s cubic-bezier(0.4,0,0.2,1);
  /* Spacing scale */
  --space-1: 4px; --space-2: 8px; --space-3: 12px; --space-4: 16px;
  --space-5: 24px; --space-6: 32px; --space-7: 48px;
  /* Type scale — 与应用侧 `pages/css/app.css` 同一张表。
     2026-10-20：这里原先只有 xs/sm/md/lg，而下面一直在用 `--fs-xl`/`--fs-2xs`/`--fs-3xs`/
     `--fs-base`/`--fs-1-1`/`--fs-1-2` ⇒ 这些声明**全部无效**（`var()` 未定义 = 回退继承），
     统计卡数字、分组标签、徽标、页头都按正文字号渲染 —— 后台「看着挤/分不清层级」的一大半在这里。 */
  --fs-xs: 0.72rem; --fs-sm: 0.8rem; --fs-md: 0.9rem; --fs-lg: 1.05rem; --fs-xl: 1.3rem;
  --fs-2xl: 1.6rem;
  --fs-base: 1rem;
  --fs-2xs: 0.65rem; --fs-3xs: 0.6rem; --fs-1-1: 1.1rem; --fs-1-2: 1.2rem;
}
*{box-sizing:border-box;margin:0;padding:0}
body{font-family:var(--font);background:var(--bg);color:var(--black);padding:20px 24px;max-width:1440px;margin:0 auto;min-height:100vh;-webkit-font-smoothing:antialiased}
/* ---- Header ---- */
.header{display:flex;justify-content:space-between;align-items:center;padding:12px 8px 8px;flex-wrap:wrap;gap:8px}
.header-left{display:flex;align-items:center;gap:12px}
.header-logo{width:36px;height:36px;border-radius:10px;box-shadow:0 2px 8px rgba(245,166,35,0.15)}
.header-title{font-size:var(--fs-1-2);font-weight:800;letter-spacing:-.03em}
.header-title span{color:var(--amber)}
.header-actions{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
/* ---- Stats ---- */
.stats{display:grid;grid-template-columns:repeat(6,1fr);gap:8px;margin:12px 0}
@media(max-width:640px){.stats{grid-template-columns:repeat(3,1fr);gap:6px}}
/* Record grids (activation / withdrawals / users / commissions): two columns
   from 640px so half-screen windows use the space like the full desktop */
@media(min-width:640px){.card-grid-2{grid-template-columns:1fr 1fr;gap:10px}}
@media(max-width:380px){.stats{grid-template-columns:repeat(2,1fr)}}
.stat-card{background:var(--card);border-radius:var(--radius-sm);padding:12px 8px;text-align:center;border:1px solid var(--border);box-shadow:var(--shadow);transition:all var(--transition);position:relative;overflow:hidden}
.stat-val{font-size:var(--fs-xl);font-weight:800;line-height:1.2;letter-spacing:-0.5px}
.stat-lbl{font-size:var(--fs-2xs);color:var(--gray);margin-top:4px;line-height:1.2;font-weight:600}
.stat-card::before{content:'';position:absolute;top:0;left:0;right:0;height:3px;background:var(--border);transition:background var(--transition)}
.stat-card:hover{box-shadow:var(--shadow-md);transform:translateY(-1px)}
.stat-card:hover::before{background:var(--amber)}
.tabs{display:flex;gap:4px;margin:12px 0;overflow-x:auto;padding:4px;background:var(--card);border:1px solid var(--border);border-radius:var(--radius-sm);box-shadow:var(--shadow);-webkit-overflow-scrolling:touch;scrollbar-width:none}
@media (-webkit-min-device-pixel-ratio:0){.tabs::-webkit-scrollbar{display:none}}
.tab-btn{flex-shrink:0;padding:8px 16px;border-radius:8px;border:none;background:transparent;font-size:var(--fs-xs);font-weight:600;cursor:pointer;color:var(--gray);transition:all var(--transition);white-space:nowrap;display:flex;align-items:center;gap:4px}
.tab-btn:hover{background:var(--bg);color:var(--black)}
/* 只此一条 active —— 别再补第二条：此前误存了一份 amber 版本（黑底白字才是生效的那条），
   两条并存时以后写的为准，读代码的人会以为 amber 生效。深色主题的 amber 覆写在下方 [data-theme="dark"] 段。 */
.tab-btn.active{background:var(--black);color:var(--white);box-shadow:var(--shadow-md)}
/* ---- Tab Groups ---- */
.tab-group{display:flex;flex-direction:column;gap:2px;flex-shrink:0}
.tab-group-label{flex-shrink:0;font-size:var(--fs-3xs);font-weight:800;text-transform:uppercase;letter-spacing:0.08em;color:var(--gray-light);padding:0 8px;white-space:nowrap}
.tab-group-btns{display:flex;gap:4px}
[data-theme="dark"] .tab-group-label{color:var(--gray)}
/* ---- Tab Content ---- */
.tab-content{display:none;animation:fadeIn 0.25s ease}
.tab-content.active{display:block}
@keyframes fadeIn{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:translateY(0)}}
.tab-header{display:flex;justify-content:space-between;align-items:center;margin:16px 0 12px;flex-wrap:wrap;gap:8px}
.tab-header h2{font-size:var(--fs-base);font-weight:700;margin:0}
/* ---- Cards ---- */
.card{background:var(--card);border-radius:var(--radius-sm);padding:14px 16px;border:1px solid var(--border);margin-bottom:8px;box-shadow:var(--shadow);transition:all var(--transition)}
.card:hover{box-shadow:var(--shadow-md);border-color:var(--amber-light)}
.card-row{display:flex;justify-content:space-between;align-items:flex-start;flex-wrap:wrap;gap:8px;margin-bottom:4px}
.card-row:last-child{margin-bottom:0}
.card-code{font-weight:700;font-family:'SF Mono',Menlo,monospace;color:var(--amber);font-size:var(--fs-md);word-break:break-all}
.card-meta{font-size:var(--fs-xs);color:var(--gray);margin-top:3px;line-height:1.4}
.card-badge{display:inline-block;font-size:var(--fs-3xs);padding:3px 10px;border-radius:99px;font-weight:700;white-space:nowrap}
/* ---- Grids ---- */
.card-grid-2{display:grid;grid-template-columns:1fr;gap:10px}
.card-grid-3{display:grid;grid-template-columns:1fr;gap:10px}
.card-grid-2>.card{min-width:0}
.card-actions{margin-top:10px;display:flex;gap:4px;flex-wrap:wrap}
.badge-pending{background:#FFF3E0;color:var(--c-warn)}
/* 免费档徽标：此前 `refreshUsers`/客户档案都挂了 `.badge-free`，样式表里却没有这条规则
   ⇒ 免费客户的徽标只是一块没有颜色的文字。v3.62.5 补上（与其它档位同一套实心底+深色字）。 */
.badge-free{background:#F1F3F5;color:#495057}
.badge-submitted{background:#E3F2FD;color:#1565C0}
.badge-paid,.badge-activated{background:#E8F5E9;color:#2E7D32}
.badge-used{background:#E0F2F1;color:#00695C}
.badge-rejected{background:#FFEBEE;color:#C62828}
/* ---- Danger Zone ---- */
.danger-zone{border-color:var(--red-light)}
.danger-zone-toggle{display:flex;align-items:center;gap:8px;cursor:pointer;font-size:var(--fs-sm);font-weight:700;color:var(--red);list-style:none;user-select:none;-webkit-tap-highlight-color:transparent}
.danger-zone-toggle::-webkit-details-marker{display:none}
.danger-zone-toggle::before{content:'🧨';font-size:var(--fs-md)}
.danger-zone-toggle::after{content:'▾';margin-left:auto;color:var(--gray-light);font-size:var(--fs-xs)}
.danger-zone[open] .danger-zone-toggle::after{content:'▴'}
/* ---- Settlement Workbench Panel ---- */
.settlement-panel{padding:0;overflow:hidden}
.settlement-header{display:flex;align-items:baseline;gap:8px;flex-wrap:wrap;padding:8px 14px;border-bottom:1px solid var(--border-light);background:var(--amber-light)}
.settlement-title{font-size:var(--fs-sm);font-weight:800;color:var(--black)}
.settlement-sub{font-size:var(--fs-2xs);color:var(--gray)}
.settlement-body{padding:10px 14px}
/* ---- Settings Sections ---- */
.settings-section{padding:14px 16px}
.settings-section-title{font-size:var(--fs-sm);font-weight:800;margin:0 0 4px;color:var(--black)}
.settings-section .card-actions{margin-top:8px}
/* ---- Overview Quick Actions ---- */
.quick-actions{padding:12px 16px}
.quick-actions-title{font-size:var(--fs-xs);font-weight:800;text-transform:uppercase;letter-spacing:0.06em;color:var(--gray);margin-bottom:8px}
.quick-actions-btns{display:flex;gap:6px;flex-wrap:wrap}
/* ---- Buttons (PWA-aligned) ----
   Sizes: 主操作 = 44px floor, 紧凑 (.btn--sm) = 40px —— 见 document/06 §26.1。
   状态：:active 按压 · :focus-visible 键盘焦点 · :disabled 真不可用（真属性，不是假样式）。 */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:6px;padding:10px 20px;min-height:44px;border-radius:999px;font-weight:700;font-size:var(--fs-sm);border:none;cursor:pointer;white-space:nowrap;transition:all var(--transition);-webkit-tap-highlight-color:transparent;user-select:none}
.btn:active{transform:scale(0.97)}
.btn:focus-visible{outline:2px solid var(--amber);outline-offset:2px}
.btn:disabled{opacity:0.5;cursor:not-allowed}
.btn--primary{background:var(--amber);color:var(--c-on-amber);box-shadow:0 2px 8px rgba(245,166,35,0.25)}
.btn--primary:hover{box-shadow:0 4px 14px rgba(245,166,35,0.4);transform:translateY(-1px)}
.btn--danger{background:var(--red);color:var(--c-on-red);box-shadow:0 2px 8px rgba(229,57,53,0.2)}
.btn--danger:hover{box-shadow:0 4px 14px rgba(229,57,53,0.35);transform:translateY(-1px)}
.btn--outline{border:2px solid var(--border);background:transparent;color:var(--c-text)}
.btn--outline:hover{background:var(--bg);border-color:var(--amber);color:var(--amber)}
.btn--sm{padding:6px 14px;min-height:40px;font-size:var(--fs-xs);border-radius:999px}
.btn--block{width:100%}
/* ---- Filter / toggle chips (页签之外的筛选/切换：选中态 amber，与主操作按钮区分) ---- */
.chip{display:inline-flex;align-items:center;justify-content:center;min-height:40px;padding:6px 14px;border-radius:999px;font-size:var(--fs-xs);font-weight:700;border:1.5px solid var(--border);background:var(--card);color:var(--c-text);cursor:pointer;white-space:nowrap;transition:all var(--transition)}
.chip:hover{border-color:var(--amber);color:var(--amber)}
.chip:active{transform:scale(0.97)}
.chip:focus-visible{outline:2px solid var(--amber);outline-offset:2px}
.chip--active{background:var(--amber);color:var(--c-on-amber);border-color:var(--amber);box-shadow:var(--shadow-amber)}
.chip.chip--active:hover{color:var(--c-on-amber)}
/* Ticket attachment composer: the ✕ badge and the dashed add slot used to carry inline visuals. */
.att-del{position:absolute;top:-5px;right:-5px;width:16px;height:16px;border-radius:50%;border:none;background:#c62828;color:#fff;font-size:var(--fs-3xs);line-height:1;cursor:pointer}
.att-add{width:44px;height:44px;border-radius:6px;border:1.5px dashed var(--gray);background:transparent;color:var(--gray);font-size:var(--fs-1-2);cursor:pointer}
/* ---- Desktop Adaptations ---- */
@media(min-width:768px){
  body{padding:24px 32px}
  .header{padding:16px 8px 12px}
  .header-title{font-size:var(--fs-xl)}
  .header-logo{width:40px;height:40px}
  .stats{gap:12px}
  .stat-card{padding:18px 12px}
  .stat-val{font-size:var(--fs-2xl)}
  .card-grid-2{grid-template-columns:1fr 1fr;gap:10px}
  .card-grid-2>.card{margin-bottom:0}
  .search-box input{font-size:var(--fs-sm);padding:10px 16px}
  .login-box{margin:120px auto;padding:48px 40px}
  .toast{font-size:var(--fs-md);padding:14px 32px}
}
@media(min-width:1200px){
  body{padding:24px 40px}
  .header-title{font-size:var(--fs-xl)}
  .stats{gap:12px}
  .stat-card{padding:16px 12px}
  .stat-val{font-size:var(--fs-2xl)}
  .stat-lbl{font-size:var(--fs-2xs)}
  .tab-btn{font-size:var(--fs-sm);padding:9px 16px}
  .card{padding:16px 20px}
  .card-grid-2{gap:12px}
  .card-grid-3{gap:12px}
  .tabs{gap:5px}
}
/* ---- Forms ---- */
input,select{padding:10px 14px;border:1.5px solid var(--border);border-radius:var(--radius-sm);font-size:var(--fs-md);width:100%;margin-bottom:8px;background:var(--card);color:var(--black);transition:border-color var(--transition),box-shadow var(--transition)}
input:focus,select:focus{outline:none;border-color:var(--amber);box-shadow:0 0 0 3px var(--amber-light)}
/* ---- Login ---- */
.login-box{max-width:380px;margin:80px auto;text-align:center;padding:44px 36px;background:var(--card);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:0 8px 32px rgba(0,0,0,0.06)}
.login-logo{width:72px;height:72px;border-radius:18px;margin-bottom:16px;box-shadow:0 4px 12px rgba(245,166,35,0.15)}
.login-box h1{font-size:var(--fs-xl);font-weight:800}
.login-box p{margin:8px 0 24px;font-size:var(--fs-md);color:var(--gray)}
/* ---- Confirm Modal ---- */
.modal-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,0.45);z-index:1000;display:flex;align-items:center;justify-content:center;padding:16px;animation:fadeIn 0.2s ease}
/* 2026-10-15：后台弹层原来只有 max-width —— 内容一长（客户档案里有设备/付款/工单/返佣每一行）
   就上下都溢出屏幕，电脑与手机都一样。这里补齐应用侧早就有的契约：**定高 + 头尾固定 + 正文内部滚动**
   （`document/07 §30` 同一套；`test/frontend/modal-height.test.js` 钉住两个面都不许退回去）。 */
.modal{background:var(--card);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow-lg);max-width:400px;width:100%;display:flex;flex-direction:column;max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);overflow:hidden;animation:toastIn 0.25s ease}
.modal-header{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:14px 16px;border-bottom:1px solid var(--border-light)}
.modal-header h3{font-size:var(--fs-sm);font-weight:700;margin:0;color:var(--black)}
.modal-close{background:none;border:none;cursor:pointer;font-size:var(--fs-sm);color:var(--gray-light);padding:2px 6px;border-radius:6px;transition:all var(--transition)}
.modal-close:hover{color:var(--red);background:var(--red-light)}
.modal-body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:16px;display:flex;flex-direction:column;gap:12px}
.modal-msg{font-size:var(--fs-sm);color:var(--gray);line-height:1.5;white-space:pre-line;word-break:break-word;margin:0}
.modal-input-wrap input{margin-bottom:0}
.modal-actions{flex:0 0 auto;display:flex;justify-content:flex-end;gap:8px;padding:0 16px 16px}
[data-theme="dark"] .modal{background:var(--card);border-color:var(--border)}
/* ---- Overlay panels (data drawers: customer file · support desk · ticket thread) ----
   2026-10-20 owner 实报：「管理员界面的客户档案打开之后很长，看不到全貌也无法滚动」。
   根因：`showOverlay` 当时用内联样式写死 `max-width:380px`，**既没有高度约束，也不是滚动容器** ——
   内容一长就被 `align-items:center` 从上下两端一起顶出屏幕，弹层又是 `position:fixed`，
   页面滚动也带不动它。这里把弹层收成一套类：定高 + 面板内部滚动 + 三档宽度 + 手机全屏。
   `--fill` 是工作台形态（头/尾钉住、`.ovl__body` 承担滚动），与上面 `.modal` 同一套契约。 */
.ovl{position:fixed;top:0;left:0;right:0;bottom:0;z-index:999;display:flex;align-items:center;justify-content:center;padding:16px;background:rgba(0,0,0,0.45);animation:fadeOverlay .2s ease}
.ovl__panel{background:var(--card);color:var(--black);border-radius:var(--radius-lg);border:1px solid var(--border);box-shadow:var(--shadow-lg);width:100%;max-width:440px;max-height:calc(100vh - 32px);max-height:calc(100dvh - 32px);overflow-y:auto;overscroll-behavior:contain;padding:18px 20px;animation:toastIn .25s ease}
.ovl__panel--wide{max-width:720px}
.ovl__panel--xl{max-width:960px}
.ovl__panel--fill{display:flex;flex-direction:column;overflow:hidden;padding:0;max-width:960px;height:calc(100vh - 32px);height:calc(100dvh - 32px)}
.ovl__head{flex:0 0 auto;display:flex;align-items:center;justify-content:space-between;gap:8px;flex-wrap:wrap;padding:14px 20px;border-bottom:1px solid var(--border-light)}
.ovl__body{flex:1 1 auto;min-height:0;overflow-y:auto;overscroll-behavior:contain;padding:14px 20px}
.ovl__foot{flex:0 0 auto;display:flex;justify-content:flex-end;gap:6px;flex-wrap:wrap;padding:10px 20px;border-top:1px solid var(--border-light)}
@media(max-width:640px){
  .ovl{padding:0}
  .ovl__panel{max-width:none;max-height:100dvh;height:100dvh;border-radius:0;border:none;padding:16px}
  .ovl__panel--fill{padding:0;height:100dvh}
  .ovl__head,.ovl__body,.ovl__foot{padding-left:16px;padding-right:16px}
}
@keyframes fadeOverlay{from{opacity:0}to{opacity:1}}
@keyframes toastIn{from{opacity:0;transform:translateY(8px) scale(.98)}to{opacity:1;transform:none}}
/* Customer file: identity + plan at a glance, then the ledgers two-up */
.cust__id{display:flex;align-items:center;gap:8px;flex-wrap:wrap;min-width:0}
.cust__id strong{font-size:var(--fs-md);word-break:break-all}
.cust__sync{font-size:var(--fs-xs);color:var(--gray)}
.cust__grid{display:grid;grid-template-columns:1fr;gap:10px}
@media(min-width:720px){.cust__grid{grid-template-columns:1fr 1fr}}
.cust__grid>.card{margin-bottom:0;min-width:0}
.cust__card-title{display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:var(--fs-xs);font-weight:800;text-transform:uppercase;letter-spacing:.04em;color:var(--gray);margin-bottom:6px}
.kv{display:flex;justify-content:space-between;align-items:baseline;gap:10px;padding:3px 0;font-size:var(--fs-sm)}
.kv__k{flex:0 0 auto;font-size:var(--fs-xs);color:var(--gray)}
.kv__v{min-width:0;text-align:right;font-weight:600;word-break:break-all}
.cust__list{max-height:190px;overflow-y:auto;overscroll-behavior:contain}
/* Ticket thread inside `--fill`: the log owns the scroll, the composer stays reachable */
.tk-head__title{min-width:0;font-weight:700;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
/* Desk card preview: two readable lines instead of the old single-ellipsis strip
   (the operator could not tell two tickets apart without opening both). */
.tk-preview{display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden;font-size:var(--fs-xs);color:var(--gray);line-height:1.4;margin:2px 0 4px}
/* ---- Utilities ---- */
.hidden{display:none!important}
.text-center{text-align:center}
.t-muted{color:var(--c-text-muted)}
.t-dim{color:var(--c-text-dim)}
.fs-sm{font-size:var(--fs-sm)}
/* v3.62.6：`admin-views.ts` 里 15 处 `class="fs-2xs …"`（决策/分析面板的说明行）一直没有定义 ——
   同一族「挂死类」（badge-free / chip--quick 同类），那些说明行按正文字号渲染，层级消失。 */
.fs-2xs{font-size:var(--fs-2xs)}
.danger-zone-body{padding:6px 2px 2px}
.mt-2{margin-top:var(--space-2)}
.mb-2{margin-bottom:var(--space-2)}
.gap-2{gap:var(--space-2)}
.flex{display:flex}
.items-center{align-items:center}
.justify-between{justify-content:space-between}
.search-box{display:flex;gap:8px;margin-bottom:12px}
.search-box input{flex:1;margin-bottom:0}
.list-count{font-size:var(--fs-xs);color:var(--gray-light);margin-bottom:6px}
/* ---- Lang Switcher ---- */
.lang-switch{display:flex;align-items:center;gap:3px}
.lang-btn{background:transparent;color:var(--gray);border:1px solid transparent;border-radius:6px;padding:3px 6px;font-size:var(--fs-2xs);font-weight:600;cursor:pointer;transition:all 0.2s;white-space:nowrap}
.lang-btn:hover{color:var(--c-text);border-color:var(--border)}
.lang-btn--active{background:var(--amber);color:var(--c-on-amber);border-color:var(--amber)}
[data-theme="dark"] .lang-btn{color:var(--gray)}
[data-theme="dark"] .lang-btn:hover{color:var(--black);border-color:var(--gray)}
[data-theme="dark"] .lang-btn--active{background:var(--amber);color:var(--c-on-amber);border-color:var(--amber)}
/* ---- Theme Toggle ---- */
.theme-toggle-admin{font-size:var(--fs-1-1);background:none;border:none;cursor:pointer;padding:4px 6px;border-radius:6px;color:var(--gray);transition:all 0.2s}
.theme-toggle-admin:hover{color:var(--c-text)}
[data-theme="dark"] .theme-toggle-admin{color:var(--gray)}
[data-theme="dark"] .theme-toggle-admin:hover{color:var(--black)}
/* ---- Dark Theme ---- */
[data-theme="dark"] {
  --bg: #14171D;
  --card: #1A1D24;
  --black: #F0F1F3;
  --c-text: #F0F1F3;
  --border: #272C35;
  --border-light: #1E2228;
  --gray: #9BA1AA;
  --gray-light: #6B7280;
  --c-btn-dark-bg: #2A2D35;
  --c-btn-dark-text: #F0F1F3;
  --c-hover-bg: rgba(255,255,255,0.06);
  --shadow: 0 1px 3px rgba(0,0,0,0.2), 0 1px 2px rgba(0,0,0,0.15);
  --shadow-lg: 0 8px 24px rgba(0,0,0,0.35);
}
[data-theme="dark"] .tab-btn{color:var(--gray)}
[data-theme="dark"] .tab-btn:hover{background:var(--border);color:var(--black)}
[data-theme="dark"] .tab-btn.active{background:var(--amber);color:var(--c-on-amber)}
[data-theme="dark"] .login-box{background:var(--card);border-color:var(--border)}
[data-theme="dark"] .toast{background:var(--card);color:var(--black)}
[data-theme="dark"] .stat-card:hover::before{background:var(--amber)}
[data-theme="dark"] input,select{background:var(--card);color:var(--black);border-color:var(--border)}
/* ── Accessibility: reduced motion ── */
@media(prefers-reduced-motion:reduce){
  *,.btn,.tab-btn{animation:none!important;transition:none!important}
  .btn:hover,.tab-btn:hover{transform:none!important}
}
.loading-dots{display:flex;justify-content:center;align-items:center;gap:6px;padding:48px 0}
.loading-dots span{width:8px;height:8px;border-radius:50%;background:var(--amber);animation:dotPulse 1.2s ease-in-out infinite}
.loading-dots span:nth-child(2){animation-delay:0.2s}
.loading-dots span:nth-child(3){animation-delay:0.4s}
@keyframes dotPulse{0%,80%,100%{transform:scale(0.6);opacity:0.3}40%{transform:scale(1);opacity:1}}
