/* ============================================================================
 * tokens.css —— 标书智能平台 · 令牌层（候选 v1）
 *
 * 判据：`python -I check_tokens.py tokens.css`（必须全绿）
 * 取值来源：`app/static/console.css`（1594 行 / md5 a1b78ac9d3）实测抄录
 *          + 《网站设计详情 v1》§2 / §3
 *
 * ⚠️⚠️ 未冻结 —— 线上 css 是 `74894e37e0`（接了样板 A 视觉层），本文件依据的是
 *      `a1b78ac9d3`（未接）。冻结前必须复核 S-3，见《执行顺序 v1》§6。
 *      已知线上多出样板 A 的 `--bad` 等（A 套的 `.card.edge.err` 用 `--bad`，
 *      生产叫 `--err`）——**同一语义两个名字**是迁移时最容易静默出错的地方。
 *
 * 三条不可动的规矩（违反即 C1/C2 破防）：
 *   1. 零外链 —— 字体/图标/统计脚本的 CDN 都会把平台品牌漏到代理站点上
 *   2. 语义色不可被代理注入 —— 代理把"错误色"改成品牌色，用户就认不出什么是出错
 *   3. `--brand` 与 `--brand-ink` 必须成对 —— 只给一个颜色 = 必然对比度事故
 * ==========================================================================*/

:root{
  /* ---- 底与面 ---------------------------------------------------------- */
  /* ⚠️ 生产是 #F5F7FA。这里 +2 色阶到 #F7F9FC：实测 `--accent` 压 #F5F7FA
     只有 **4.49:1**（差 0.01 不达 AA），压 #F7F9FC 是 4.56:1。
     两阶色差肉眼不可辨，但把这条边界从「临界失败」变成「有余量」。 */
  --bg:        #F7F9FC;   /* 页底：冷灰，让白柱浮起来 */
  --surface:   #FFFFFF;   /* 主面 */
  --surface-2: #FAFBFD;   /* 次级面：表头、条纹行 */
  --surface-3: #F1F4F9;   /* 三级面：上下文侧栏、代码/引文块 */

  /* ---- 品牌族 ★ 白标唯一注入点 ----------------------------------------
     只这三个（外加派生色）可被代理覆盖；其余令牌全站恒定。
     值默认 = 现生产 `--navy #1B3A6B`，白字 11.27:1。 */
  --brand:      #1B3A6B;
  --brand-ink:  #FFFFFF;   /* ★ 与 --brand 成对，由预设一并注入 */
  --brand-soft: #EEF3FA;   /* 品牌浅底：选中态、品牌强调块 */

  /* 品牌派生色 —— 由预设一并给出，**不由 CSS 现场计算**
     （color-mix 的结果无法在提交前算对比度，等于把合规判据让给运行时） */
  --brand-700: #152E56;
  --brand-200: #C3D2E8;
  --brand-100: #DCE6F4;

  /* ---- 强调色（链接、主按钮、焦点环）---------------------------------
     ★ 刻意不跟品牌走：链接色若随品牌变，每个品牌色都要重算一次链接对比度，
       而链接是小字号、要求更严。让 --brand 只作用于「主按钮底 / 品牌强调块 /
       选中态」三处，风险面最小。 */
  --accent:     #2E6BE6;
  --accent-700: #2358C4;
  --accent-50:  #EDF3FE;
  /* ⚠️ 新增：浅底上的链接前景。
     实测 `--accent` 压在 `--accent-50` 上只有 **4.32:1**（< 4.5），
     而这个组合是**真实存在的**：`.btn.ghost:hover{background:var(--accent-50)}`
     配 `.btn.ghost{color:var(--accent)}` —— 鼠标一放上去就触发。
     生产 CSS 里这条是活的缺陷。此处用 --accent-700（实测 5.78:1）修掉。
     ⚠️ 组件侧要跟着改：`.btn.ghost:hover{color:var(--accent-on-soft)}` */
  --accent-on-soft: #2358C4;

  /* ---- 文字 ------------------------------------------------------------ */
  --ink:      #1F2933;   /* 正文        14.76:1 */
  --ink-soft: #3E4C59;   /* 次级正文     8.81:1 */
  --muted:    #5B6B7F;   /* 说明         5.45:1 */
  --muted-2:  #8595A8;   /* 占位/禁用    3.06:1（仅占位，不做正文）*/

  /* ---- 描边（分层靠描边不靠阴影）-------------------------------------- */
  --line:        #E3E7ED;
  --line-strong: #CDD5E0;
  --line-soft:   #EFF2F6;

  /* ---- 语义色（★ 换色值不换语义；代理不可注入）------------------------- */
  --ok:   #0F6B45;  --ok-bg:   #E7F4EE;  --ok-line:   #BCE0CE;
  --err:  #A8231B;  --err-bg:  #FCEDEC;  --err-line:  #F2C9C6;
  --warn: #8A5A00;  --warn-bg: #FFF7E8;  --warn-line: #F0DCB4;
  --info: #1A5578;  --info-bg: #EAF2F8;  --info-line: #C4DAEA;

  /* ---- 间距 ------------------------------------------------------------ */
  --sp-1: 4px;  --sp-2: 8px;   --sp-3: 12px;  --sp-4: 16px;
  --sp-5: 22px; --sp-6: 30px;  --sp-7: 42px;  --sp-8: 64px;

  /* ---- 圆角（克制；商务场景的大圆角削弱可信感）------------------------- */
  --r-xs: 3px; --r-sm: 5px; --r-md: 7px; --r-lg: 10px; --r-xl: 12px; --r-full: 999px;

  /* ---- 字号（★ 正文基准 13.5px，不是 16px —— 移植时别"顺手调大"）------- */
  --fs-xs: 11.5px; --fs-sm: 12.5px; --fs-base: 13.5px; --fs-md: 14.5px;
  --fs-lg: 16px;   --fs-xl: 19px;   --fs-2xl: 24px;    --fs-3xl: 30px; --fs-4xl: 38px;

  /* ---- 阴影（最重的几乎看不见；层级感来自描边）------------------------ */
  --sh-1: 0 1px 2px rgba(16,28,48,.05);
  --sh-2: 0 2px 8px rgba(16,28,48,.07);
  --sh-3: 0 12px 34px rgba(16,28,48,.14);

  /* ---- 布局 ------------------------------------------------------------ */
  --w-page:   1440px;   /* 外壳总宽（含左右细线）*/
  --w-wide:   1120px;   /* 内容区 */
  --w-side:   216px;    /* 上下文侧栏 */
  --topbar-h: 58px;
  --w-read:   920px;    /* 长文白卡最大宽 */
  --ch:       74ch;     /* 正文行宽上限 */

  /* ---- 白标预设色板（§3.3 实测 16 候选的幸存者）-----------------------
     ★ 每个预设**自带配对的 ink**，代理只选一个色块 ⇒ 写不进对比度事故。
     深色系 12 个配白字；浅色系 2 个配深字。
     ⚠️ 已剔除：`#3B82F6`（最"标准"的品牌蓝）—— 白字 3.68 / 深字 4.01
        两个方向都 < 4.5。它是最常见的品牌色，也是最不能直接当按钮底的。 */
  --preset-navy:   #1B3A6B;
  --preset-slate:  #334155;
  --preset-ink:    #2C3E50;
  --preset-plum:   #4C1D95;
  --preset-wine:   #7F1D1D;
  --preset-indigo: #3730A3;
  --preset-moss:   #14532D;
  --preset-crimson:#8C1D18;
  --preset-teal:   #065F46;
  --preset-burnt:  #9A3412;
  --preset-ochre:  #92400E;
  --preset-cyan:   #0E7490;
  --preset-sky:    #60A5FA;   /* ★ 配深字 5.80:1 */
  --preset-amber:  #F59E0B;   /* ★ 配深字 6.87:1 */
  /* 深字色（浅色系品牌配套用） */
  --ink-on-light-brand: #1F2933;
}

/* ============================================================================
 * 白标注入（代理租户）—— 由服务端在 <head> 里插一段 inline <style>。
 * **不用外链 CSS 文件**（保持零外链）。
 *
 * 注入的只有品牌族 6 个令牌；其余一律不动。
 * 服务端在写这段之前必须跑一次对比度校验：--brand-ink 压 --brand ≥ 4.5。
 * ===========================================================================*/
:root[data-brand="example"]{
  --brand:      #7F1D1D;
  --brand-ink:  #FFFFFF;
  --brand-soft: #FDF2F2;
  --brand-700:  #5F1515;
  --brand-200:  #EBC4C4;
  --brand-100:  #F5DEDE;
}
