/* ============================================================
   tokens.css —— 全站设计令牌「单一事实源」
   月报 / 看板 / CA借阅 三端共用；此前 9 个模板各自重复声明一套，
   本文件上线后各模板内的 :root / [data-theme] 令牌块一律删除。
   默认 :root = 暖纸调（未显式设置 data-theme 时的兜底）。
   ============================================================ */
:root{
  --bg:#f2ebdb;--paper:#f2ebdb;--paper-2:#ece2cc;--card:#fbf6ea;--card-2:#f4ecd8;
  --ink:#2b2620;--ink-soft:#6f6453;--muted:#94876f;
  --line:#d8c9ab;--line-strong:#b89c6e;
  --accent:#cf7a26;--accent-hover:#a85d16;--accent-press:#8a4d12;
  --accent-ink:#ffffff;--accent-text:#a85d16;
  --accent-soft:#f4e6cb;--accent-glow:7px 7px 0 rgba(43,38,32,.15);
  --accent-grad:#cf7a26;--accent-grad-hover:#a85d16;--accent-grad-soft:#f4e6cb;
  --ok:#5d7a39;--ok-soft:#e9efdc;--ok-line:#bcd3a0;--ok-deep:#4a6329;
  --warn:#c08a2b;--warn-soft:#fdf3e2;--warn-line:#efd7a8;--warn-deep:#8a5a12;
  --danger:#b23b2e;--danger-soft:#fbeee9;--danger-line:#e8c5bd;--danger-deep:#93291f;
  --info:#3a6ea5;--info-soft:#eaf1f9;--info-line:#c3d7ee;--info-deep:#2c5a8a;
  --amber:#c08a2b;--amber-deep:#a85d16;--amber-soft:#f6ecd2;
  --sand:#ece2cc;--sand-deep:#d8c9ab;
  --blue:#3a6ea5;--blue-d:#2c5a8a;--blue-l:#eaf1f9;
  --navy:#2b2620;--navy-d:#1a1a1a;
  --text:#2b2620;--text-2:#6f6453;
  --green:#5d7a39;--green-l:#e9efdc;--red:#b23b2e;--red-l:#fbeee9;
  --gray-1:#7a7160;--gray-2:#94876f;--gray-3:#b4a992;
  --inp-border:var(--line);--inp-focus-border:var(--accent);
  --inp-focus-glow:0 0 0 3px var(--accent-soft);
  --inp-error-border:var(--danger);--inp-error-glow:0 0 0 3px var(--danger-soft);
  --shadow-sm:0 1px 2px rgba(16,24,40,.05);
  --shadow:0 1px 3px rgba(16,24,40,.07),0 1px 2px rgba(16,24,40,.04);
  --shadow-hard:0 8px 24px -10px rgba(16,24,40,.20);
  --shadow-hard-hover:0 12px 32px -12px rgba(16,24,40,.22),0 2px 6px rgba(16,24,40,.05);
  --shadow-press:0 1px 2px rgba(16,24,40,.10);
  --radius:16px;--radius-sm:12px;--radius-xs:8px;
  --sans:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Heiti SC","Microsoft YaHei","Source Han Sans SC","Noto Sans CJK SC",Arial,system-ui,sans-serif;
  --serif:-apple-system,BlinkMacSystemFont,"SF Pro Text","SF Pro Display","Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Heiti SC","Microsoft YaHei","Source Han Sans SC","Noto Sans CJK SC",Arial,system-ui,sans-serif;
  --mono:ui-monospace,"SF Mono",SFMono-Regular,Menlo,Monaco,"Cascadia Mono","Roboto Mono",Consolas,"Liberation Mono","Courier New","PingFang SC","Microsoft YaHei",monospace;
  --sf:var(--sans);--sf-text:var(--sans);--sf-display:var(--sans);--sf-mono:var(--mono);
  --font-sans:var(--sans);--font-mono:var(--mono);--font-text:var(--sans);
  --fs-xs:11px;--fs-sm:12.5px;--fs-md:13.5px;--fs-base:14px;--fs-lg:16px;--fs-xl:18px;--fs-2xl:24px;
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:22px;--sp-6:28px;
  --grain:1;
  /* 兼容别名：旧模板散落的 -bg / -l 写法统一指向语义令牌，跟随主题自动切换 */
  --danger-bg:var(--danger-soft);--ok-bg:var(--ok-soft);--warn-bg:var(--warn-soft);
  --amber-l:var(--warn-soft);--accent-l:var(--accent-soft);
  --panel:var(--card);--bg-soft:var(--paper-2);
  --sans-base:var(--sans);--mono-base:var(--mono);
  /* —— 语义字号别名（P2-3 反向对齐：给「裸数字」一个语义名）——
     现状：全站 391 处直接写 font-size:13px，只有 8 处引用 --fs-*（采纳率 2%）。
     令牌体系不是不好用，是被架空了。这里补一批语义别名，让新写/改写的
     样式能用「读得懂的名字」而不是魔法数字：
       --fs-label  说明性小字（表单 label、表格副文本）
       --fs-body   正文默认
       --fs-strong 强调正文 / 数值
       --fs-title  卡片标题
       --fs-btn    按钮文字（与 --btn-fs 同步）
     只在 :root 定义一次，三套皮肤自动继承，避免四份重复。
     数值刻意与既有裸数字一一对应，因此**替换不产生任何视觉变化**；
     现有裸数字继续有效，向后完全兼容。 */
  --fs-label:13px;--fs-body:14px;--fs-strong:15px;--fs-title:18px;--fs-btn:var(--fs-base,14px);
}

/* ===================== 纸感 PAPER（暖纸 + 紫罗兰主色） ===================== */
[data-theme="paper"]{
  --bg:#EFE9DD;--paper:#EFE9DD;--paper-2:#F5EFE1;
  --card:#FBF7EB;--card-2:#F5EFE1;--panel:#FBF7EB;--bg-soft:#F5EFE1;
  --ink:#2B2620;--ink-soft:#5C5347;--muted:#7D7466;--text:#2B2620;--text-2:#5C5347;
  --line:#E0D7C4;--line-strong:#BFB291;
  --accent:#8A4EEF;--accent-ink:#FFFFFF;--accent-hover:#7140C4;
  --accent-press:#5B339E;--accent-text:#6C3DBA;--accent-soft:#F6F1FE;
  --accent-l:#F6F1FE;--accent-glow:0 8px 24px -8px rgba(138,78,239,0.35);
  --accent-grad:#8A4EEF;--accent-grad-hover:#7140C4;--accent-grad-soft:#F6F1FE;
  --ok:#2F7D4F;--ok-soft:#EAF2ED;--ok-line:#BCD5C7;--ok-deep:#225A39;
  --warn:#A9761A;--warn-soft:#F6F1E8;--warn-line:#E3D3B6;--warn-deep:#7A5513;
  --danger:#C0392B;--danger-soft:#F9EBEA;--danger-line:#EBC0BB;--danger-deep:#8A291F;
  --info:#2B6CB0;--info-soft:#EAF0F7;--info-line:#BBD0E6;--info-deep:#1F4E7F;
  --amber:#A9761A;--amber-deep:#7A5513;--amber-soft:#F6F1E8;--amber-l:#F6F1E8;
  --sand:#F5EFE1;--sand-deep:#BFB291;
  --blue:#2B6CB0;--blue-d:#1F4E7F;--blue-l:#EAF0F7;
  --navy:#1E4C7B;--navy-d:#183B61;--green:#2F7D4F;--green-l:#EAF2ED;
  --red:#C0392B;--red-l:#F9EBEA;
  --gray-1:#5C5347;--gray-2:#7D7466;--gray-3:#BFB291;
  --inp-border:#BFB291;--inp-focus-border:#8A4EEF;--inp-focus-glow:0 0 0 3px rgba(138,78,239,0.14);
  --inp-error-border:#C0392B;--inp-error-glow:0 0 0 3px rgba(192,57,43,0.18);
  --shadow-sm:0 1px 2px rgba(16,24,40,.05);
  --shadow:0 1px 3px rgba(16,24,40,.07),0 1px 2px rgba(16,24,40,.04);
  --shadow-hard:0 8px 24px -10px rgba(16,24,40,.20);
  --shadow-hard-hover:0 12px 32px -12px rgba(16,24,40,.22),0 2px 6px rgba(16,24,40,.05);
  --shadow-press:0 1px 2px rgba(16,24,40,.10);
  --radius:10px;--radius-sm:7px;--radius-xs:6px;
  --fs-xs:11px;--fs-sm:12.5px;--fs-md:13.5px;--fs-base:14px;--fs-lg:16px;--fs-xl:18px;--fs-2xl:24px;
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:22px;--sp-6:28px;
  --grain:0;
}

/* ===================== 简约 SIMPLE（冷白 + 克莱因蓝） ===================== */
[data-theme="simple"]{
  --bg:#F4F5F7;--paper:#F4F5F7;--paper-2:#FAFBFC;
  --card:#FFFFFF;--card-2:#FAFBFC;--panel:#FFFFFF;--bg-soft:#FAFBFC;
  --ink:#14171A;--ink-soft:#5A626B;--muted:#8A9299;--text:#14171A;--text-2:#5A626B;
  --line:#E4E7EA;--line-strong:#C9CED4;
  --accent:#2E5BFF;--accent-ink:#FFFFFF;--accent-hover:#264BD1;
  --accent-press:#1E3CA8;--accent-text:#2447C7;--accent-soft:#EEF2FF;
  --accent-l:#EEF2FF;--accent-glow:0 8px 24px -8px rgba(46,91,255,0.35);
  --accent-grad:#2E5BFF;--accent-grad-hover:#264BD1;--accent-grad-soft:#EEF2FF;
  --ok:#1E7F52;--ok-soft:#E8F2EE;--ok-line:#B7D6C8;--ok-deep:#165B3B;
  --warn:#8A6100;--warn-soft:#F3EFE6;--warn-line:#DACCAD;--warn-deep:#634600;
  --danger:#C0362C;--danger-soft:#F9EBEA;--danger-line:#EBBFBB;--danger-deep:#8A2720;
  --info:#1F6FEB;--info-soft:#E9F1FD;--info-line:#B7D1F9;--info-deep:#1650A9;
  --amber:#8A6100;--amber-deep:#634600;--amber-soft:#F3EFE6;--amber-l:#F3EFE6;
  --sand:#FAFBFC;--sand-deep:#C9CED4;
  --blue:#1F6FEB;--blue-d:#1650A9;--blue-l:#E9F1FD;
  --navy:#164EA4;--navy-d:#113D81;--green:#1E7F52;--green-l:#E8F2EE;
  --red:#C0362C;--red-l:#F9EBEA;
  --gray-1:#5A626B;--gray-2:#8A9299;--gray-3:#C9CED4;
  --inp-border:#C9CED4;--inp-focus-border:#2E5BFF;--inp-focus-glow:0 0 0 3px rgba(46,91,255,0.14);
  --inp-error-border:#C0362C;--inp-error-glow:0 0 0 3px rgba(192,54,44,0.18);
  --shadow-sm:0 1px 2px rgba(16,24,40,.05);
  --shadow:0 1px 3px rgba(16,24,40,.07),0 1px 2px rgba(16,24,40,.04);
  --shadow-hard:0 8px 24px -10px rgba(16,24,40,.20);
  --shadow-hard-hover:0 12px 32px -12px rgba(16,24,40,.22),0 2px 6px rgba(16,24,40,.05);
  --shadow-press:0 1px 2px rgba(16,24,40,.10);
  --radius:12px;--radius-sm:9px;--radius-xs:6px;
  --fs-xs:11px;--fs-sm:12.5px;--fs-md:13.5px;--fs-base:14px;--fs-lg:16px;--fs-xl:18px;--fs-2xl:24px;
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:22px;--sp-6:28px;
  --grain:0;
}

/* ===================== 碳黑 MONO（暗色） ===================== */
[data-theme="mono"]{
  --bg:transparent;--paper:#232120;--paper-2:#2B2826;
  --card:#232120;--card-2:#2B2826;--panel:#232120;--bg-soft:#2B2826;
  --ink:#F2EFEA;--ink-soft:#C2BCB4;--muted:#948E86;--text:#F2EFEA;--text-2:#C2BCB4;
  --line:rgba(255,255,255,.10);--line-strong:rgba(255,255,255,.18);
  --accent:#E8DFD0;--accent-ink:#1A1817;--accent-hover:#ECE5D8;
  --accent-press:#EFE9DF;--accent-text:#E8DFD0;--accent-soft:rgba(232,223,208,0.14);
  --accent-l:rgba(232,223,208,0.14);--accent-glow:0 8px 24px -8px rgba(232,223,208,0.3);
  --accent-grad:#E8DFD0;--accent-grad-hover:#ECE5D8;--accent-grad-soft:rgba(232,223,208,0.14);
  --ok:#6FBF8F;--ok-soft:rgba(111,191,143,0.16);--ok-line:rgba(111,191,143,0.34);--ok-deep:#8FCDA8;
  --warn:#D9AE5C;--warn-soft:rgba(217,174,92,0.16);--warn-line:rgba(217,174,92,0.34);--warn-deep:#E1C080;
  --danger:#E0685C;--danger-soft:rgba(224,104,92,0.16);--danger-line:rgba(224,104,92,0.34);--danger-deep:#E78980;
  --info:#7FA8D8;--info-soft:rgba(127,168,216,0.16);--info-line:rgba(127,168,216,0.34);--info-deep:#9BBBE1;
  --amber:#D9AE5C;--amber-deep:#E1C080;--amber-soft:rgba(217,174,92,0.16);--amber-l:rgba(217,174,92,0.16);
  --sand:#2B2826;--sand-deep:rgba(255,255,255,.18);
  --blue:#7FA8D8;--blue-d:#9BBBE1;--blue-l:rgba(127,168,216,0.16);
  --navy:#8CB1DC;--navy-d:#A3C0E3;--green:#6FBF8F;--green-l:rgba(111,191,143,0.16);
  --red:#E0685C;--red-l:rgba(224,104,92,0.16);
  --gray-1:#C2BCB4;--gray-2:#948E86;--gray-3:rgba(255,255,255,.18);
  --inp-border:rgba(255,255,255,0.14);--inp-focus-border:#E8DFD0;--inp-focus-glow:0 0 0 3px rgba(232,223,208,0.16);
  --inp-error-border:#E0685C;--inp-error-glow:0 0 0 3px rgba(224,104,92,0.18);
  --shadow-sm:0 1px 2px rgba(0,0,0,.32);--shadow:0 2px 10px rgba(0,0,0,.34);
  --shadow-hard:0 10px 32px -12px rgba(0,0,0,.55);
  --shadow-hard-hover:0 16px 44px -14px rgba(0,0,0,.62),0 2px 8px rgba(0,0,0,.30);
  --shadow-press:0 1px 3px rgba(0,0,0,.36);
  --radius:14px;--radius-sm:10px;--radius-xs:6px;
  --fs-xs:11px;--fs-sm:12.5px;--fs-md:13.5px;--fs-base:14px;--fs-lg:16px;--fs-xl:18px;--fs-2xl:24px;
  --sp-1:4px;--sp-2:8px;--sp-3:12px;--sp-4:16px;--sp-5:22px;--sp-6:28px;
  --grain:0;color-scheme:dark;
}

/* ============================================================
   圆角语言 + 按钮令牌 + 历史兼容别名
   集中在共享层管理；base.css 统一施加，避免再被页面样式覆盖。
   圆角派生自各主题的 --radius / --radius-sm，随皮肤自动变化。
   ============================================================ */
:root{
  /* —— 圆角规范（统一语言）—— */
  --radius-pill:980px;                    /* 胶囊：胶囊按钮 / 标签 / 徽章 */
  --radius-card:var(--radius);            /* 卡片 / 面板 */
  --radius-modal:calc(var(--radius) + 4px);/* 弹窗 */
  --radius-btn:var(--radius-sm);          /* 按钮（主/次/图标）*/
  --radius-btn-sm:max(calc(var(--radius-sm) - 2px),4px); /* 小尺寸按钮 */
  --radius-input:var(--radius-sm);        /* 输入框 / 下拉 / 文本域 */
  --radius-badge:var(--radius-pill);      /* 徽章 / 状态标签 */
  --radius-chip:var(--radius-pill);       /* chip / 分段控件 */
  /* —— 按钮令牌组（原定义在 base.html，整合时被误删，此处归位）—— */
  --btn-fs:var(--fs-base,14px);
  --btn-h:38px;
  --btn-px:18px;
  --btn-gap:var(--sp-2,10px);
  --btn-radius:var(--radius-btn);
  --z-base:1;
  --z-header:60;     /* 顶栏（base.css .modal 现状 60，故 header 取此层）*/
  --z-mask:80;       /* 弹窗遮罩（与 base.html .modal-mask 现状一致）*/
  --z-panel:81;      /* 遮罩内的弹窗内容 */
  --z-toast:9999;    /* 轻提示 toast（core.js ybToasts / base.html 一致）*/
  --z-progress:10000;/* 全局加载进度条 #globalBusy */
  /* —— 历史兼容别名（原散落各页局部，统一指向语义令牌，随主题切换）—— */
  --green-deep:var(--ok-deep);
  --ink2:var(--ink-soft);
  --ink3:var(--gray-3);
  --a2:var(--accent-hover);
  --r:var(--radius);
  --rl:calc(var(--radius) + 4px);
}

/* ============================================================
   弹窗语义规范（P2-4 · 渐进迁移第一步：只立规范，不动存量）
   ------------------------------------------------------------
   背景：`.modal` 历史上「一符两义」，是本项目反复踩的地雷——
     · 遮罩型（borrow_admin、base.css）：position:fixed + inset:0，
       通过 .open 切换，负责铺满全屏、压住背景、承载滚动。
     · 卡片型（base / fill / manage）：position:static + margin:auto，
       外面套一层 .modal-mask，只负责居中与白底外观。
     两套完全不同的行为挂在同一个类名上：谁新增页面都可能写错，
     也可能被另一套样式「吃掉」（base.html 至今仍需显式重置
     position/inset/z-index/overflow 四组属性来 dodge 冲突）。

   迁移策略（本次采用，已评估 68 个存量实例的回归成本后确定）：
     不做一次性全量改名，改为「立规范 + 双别名 + 自然迭代」。
     理由：存量 68 个弹窗目前工作正常，全量改名需回归 5 个模板
     （fill 28 / manage 23 / borrow_admin 7 / base 8 / bid 2），
     风险与回滚成本都远大于收益；而语义分裂只影响「新弹窗用哪个
     类」，存量不受影响。

   约定：
     新写弹窗 → 遮罩层用 .modal-mask（已存在），内容层用 .modal-panel。
     存量弹窗保持 .modal 不变，待其因业务迭代重写时自然迁移。
     下方别名让 .modal-panel 与 .modal 视觉完全一致，
     因此新增弹窗照抄存量样式也不会出现外观偏差。
   ============================================================ */
.modal-panel{
  display:block;position:static;inset:auto;z-index:auto;overflow:visible;margin:auto;
  background:var(--card);border:1px solid var(--line);
  border-radius:var(--radius-modal);
  width:360px;max-width:100%;padding:24px;
  box-shadow:var(--shadow-hard-hover);
}
.modal-panel.wide{width:520px}
.modal-mask > .modal-panel{z-index:var(--z-panel,81)}
