/* tokens.css —— 设计令牌唯一变量源（Task 37 D-1/D-5）。
   index.html / audit.html / components.css / app.css 的颜色、字号、间距一律引用本文件，
   禁止在他处写裸色值或 px 间距/字号。字体全部本地自托管（woff2），断网无外链、版式不跳变。
   正文色对均满足 WCAG AA（4.5:1）：primary 17.1:1 / tertiary 4.75:1 / on-primary 5.72:1。 */

/* ============ 本地字体（woff2，font-display:swap 首屏不阻塞）================ */
/* Source Sans 3 仅 400/600 两个字重文件：用区间描述符让 500/700 请求分别落到
   最近字面，避免浏览器合成伪粗体。中文回落系统黑体链。 */
@font-face {
  font-family: "Source Sans 3"; font-style: normal; font-weight: 100 500; font-display: swap;
  src: url("/static/fonts/source-sans-3-latin-400.woff2") format("woff2");
}
@font-face {
  font-family: "Source Sans 3"; font-style: normal; font-weight: 501 900; font-display: swap;
  src: url("/static/fonts/source-sans-3-latin-600.woff2") format("woff2");
}
@font-face {
  font-family: "Playfair Display"; font-style: normal; font-weight: 400; font-display: swap;
  src: url("/static/fonts/playfair-display-latin-400.woff2") format("woff2");
}
@font-face {
  font-family: "Playfair Display"; font-style: normal; font-weight: 600; font-display: swap;
  src: url("/static/fonts/playfair-display-latin-600.woff2") format("woff2");
}
@font-face {
  font-family: "Playfair Display"; font-style: normal; font-weight: 700; font-display: swap;
  src: url("/static/fonts/playfair-display-latin-700.woff2") format("woff2");
}
@font-face {
  font-family: "IBM Plex Mono"; font-style: normal; font-weight: 100 450; font-display: swap;
  src: url("/static/fonts/ibm-plex-mono-latin-400.woff2") format("woff2");
}
@font-face {
  font-family: "IBM Plex Mono"; font-style: normal; font-weight: 451 900; font-display: swap;
  src: url("/static/fonts/ibm-plex-mono-latin-500.woff2") format("woff2");
}

:root {
  /* ============ 字体族（中文回退链：PingFang / 雅黑 / 思源黑体至少一层）========= */
  --font-sans: "Source Sans 3", system-ui, -apple-system, "Segoe UI", "PingFang SC",
               "Hiragino Sans GB", "Microsoft YaHei", "Source Han Sans SC",
               "Noto Sans CJK SC", sans-serif;
  --font-serif: "Playfair Display", Georgia, "Songti SC", "STSong", "SimSun", serif;
  --font-mono: "IBM Plex Mono", "SFMono-Regular", Consolas, "Courier New", monospace;
  --weight-regular: 400;
  --weight-medium: 500;
  --weight-semibold: 600;
  --weight-bold: 700;

  /* ============ 中性色阶（slate，12 级）==================================== */
  --color-neutral-0:   #FFFFFF;
  --color-neutral-25:  #FAFAFA;
  --color-neutral-50:  #F8FAFC;
  --color-neutral-100: #F1F5F9;
  --color-neutral-200: #E2E8F0;
  --color-neutral-300: #CBD5E1;
  --color-neutral-400: #94A3B8;
  --color-neutral-500: #64748B;
  --color-neutral-600: #475569;
  --color-neutral-700: #334155;
  --color-neutral-800: #1E293B;
  --color-neutral-900: #0F172A;

  /* ============ 主色阶（品牌蓝，10 级）===================================== */
  --color-primary-50:  #EDF3FF;
  --color-primary-100: #DCE7FF;
  --color-primary-200: #B8CEFF;
  --color-primary-300: #8FB0FF;
  --color-primary-400: #4D7CFF;
  --color-primary-500: #0052FF;
  --color-primary-600: #0047E6;
  --color-primary-700: #0039B8;
  --color-primary-800: #002D8F;
  --color-primary-900: #002166;

  /* ============ 语义色：成功 / 警告 / 危险 / 信息 =========================== */
  --color-success:        #16A34A;
  --color-success-text:   #15803D;   /* 浅底文字，AA 4.5:1 */
  --color-success-bg:     #F0FDF4;
  --color-success-bg-soft:#E3F6E8;   /* 审计绿色徽标底 */
  --color-success-border: #BBF7D0;

  --color-warning:        #D97706;
  --color-warning-text:   #92400E;   /* 浅底强文字 */
  --color-warning-bg:     #FFFBEB;
  --color-warning-bg-soft:#FDEFDB;   /* 审计琥珀徽标底 */
  --color-warning-border: #FDE68A;

  --color-amber:          #D9A019;   /* 待审批状态金琥珀 */
  --color-amber-text:     #8A5A00;   /* 浅底文字，AA 4.7:1 */
  --color-amber-bg:       #FDEFDB;
  --color-amber-deep:     #8A5A00;   /* 深琥珀（白名单类徽标）*/
  --color-amber-deep-bg:  #FBE4C8;

  --color-danger:        #DC2626;
  --color-danger-text:   #B91C1C;   /* 浅底文字 */
  --color-danger-strong: #C0392B;   /* 审计拒绝红（与 danger-text 近义）*/
  --color-danger-bg:     #FEF2F2;
  --color-danger-bg-soft:#FDE2E2;
  --color-danger-border: #FECACA;

  --color-info:      #2563EB;
  --color-info-text: #2B55D6;       /* 浅底文字，AA 5.3:1 */
  --color-info-bg:   #E6EFFF;
  --color-info-bg-indigo: #E9F0FF;
  --color-purple:      #6B21A8;
  --color-purple-bg:   #EFE6FB;
  --color-cyan-text:   #0C6B78;     /* 审计 cyan 徽标，AA ≥4.5 */
  --color-cyan-bg:     #E6F6F8;
  --color-slate-text:  #55606B;
  --color-slate-bg:    #EEF1F4;

  /* ============ 深色反区块（风险监控）专用语义 ============================= */
  --color-bg-inverse: var(--color-neutral-900);
  --color-on-success:        #86EFAC;
  --color-on-success-bg:     rgba(22,163,74,.13);
  --color-on-success-border: rgba(22,163,74,.30);
  --color-on-danger:         #FCA5A5;
  --color-on-danger-dot:     #F87171;
  --color-on-danger-bg:      rgba(220,38,38,.14);
  --color-on-danger-border:  rgba(220,38,38,.35);
  --color-on-warning:        #FCD34D;
  --color-on-warning-dot:    #FBBF24;
  --color-on-warning-bg:     rgba(217,119,6,.14);
  --color-on-warning-border: rgba(217,119,6,.35);

  /* ============ 语义映射：文字 / 背景 / 边框 / 主色 ========================= */
  --color-text-primary:   var(--color-neutral-900);
  --color-text-secondary: var(--color-neutral-600);
  --color-text-tertiary:  var(--color-neutral-500);
  --color-text-disabled:  var(--color-neutral-400);
  --color-text-inverse:   var(--color-neutral-0);
  --color-text-on-dark:   rgba(255,255,255,.55);

  --color-bg-page:    var(--color-neutral-25);
  --color-bg-surface: var(--color-neutral-0);
  --color-bg-subtle:  var(--color-neutral-100);
  --color-bg-inset:   var(--color-neutral-50);
  --color-bg-key:     var(--color-warning-bg);    /* 审计关键事件行高亮 */

  --color-border:        var(--color-neutral-200);
  --color-border-strong: var(--color-neutral-300);

  --color-primary:          var(--color-primary-500);
  --color-primary-hover:    var(--color-primary-600);
  --color-primary-active:   var(--color-primary-700);
  --color-primary-soft:     var(--color-primary-50);
  --color-primary-disabled: var(--color-primary-200);
  --color-on-primary:       var(--color-neutral-0);
  --color-ring:             var(--color-primary-500);

  /* 主色透明层级（tint/玻璃/描边/选中态——统一收口，禁止他处写 rgba） */
  --color-primary-tint-2:  rgba(0,82,255,.025);
  --color-primary-tint-4:  rgba(0,82,255,.04);
  --color-primary-tint-5:  rgba(0,82,255,.05);
  --color-primary-tint-6:  rgba(0,82,255,.06);
  --color-primary-tint-8:  rgba(0,82,255,.08);
  --color-primary-tint-15: rgba(0,82,255,.15);
  --color-primary-border-soft:   rgba(0,82,255,.25);
  --color-primary-border:        rgba(0,82,255,.30);
  --color-primary-border-strong: rgba(0,82,255,.40);
  --color-info-tint-8:  rgba(37,99,235,.08);
  --color-info-tint-10: rgba(37,99,235,.10);
  --color-danger-tint-5: rgba(220,38,38,.05);
  --color-danger-border-soft: rgba(220,38,38,.35);
  --color-warning-border-soft: rgba(217,119,6,.30);
  --color-surface-glass:        rgba(255,255,255,.85);
  --color-surface-glass-strong: rgba(255,255,255,.90);
  --color-inset-wash:  rgba(15,23,42,.03);
  --color-scrim:       rgba(15,23,42,.35);
  --color-selection:   rgba(0,82,255,.15);

  /* ============ 来源色（信息着色固定语义：内=蓝 / akshare=绿 / 缓存=橙 ...）== */
  --color-src-internal-bg: var(--color-info-tint-10);
  --color-src-internal-fg: var(--color-info);
  --color-src-akshare-bg:  rgba(22,163,74,.10);
  --color-src-akshare-fg:  var(--color-success);
  --color-src-cache-bg:    rgba(217,119,6,.10);
  --color-src-cache-fg:    var(--color-warning);
  --color-src-wind-bg:     rgba(106,33,168,.10);
  --color-src-wind-fg:     var(--color-purple);
  --color-src-denied-bg:   rgba(220,38,38,.10);
  --color-src-denied-fg:   var(--color-danger);
  --color-src-unavailable-bg: rgba(100,116,139,.15);
  --color-src-unavailable-fg:  var(--color-neutral-500);

  /* ============ 渐变 ================================================================== */
  --gradient-primary:      linear-gradient(135deg, #0052FF, #4D7CFF);
  --gradient-primary-hover:linear-gradient(135deg, #0047E6, #3F6DF0);
  --gradient-primary-soft: linear-gradient(135deg, rgba(0,82,255,.08), rgba(77,124,255,.14));
  --gradient-underline:    linear-gradient(to right, rgba(0,82,255,.35), rgba(77,124,255,.15));
  --gradient-shimmer:      linear-gradient(90deg, var(--color-bg-subtle) 0%, var(--color-bg-surface) 50%, var(--color-bg-subtle) 100%);
  --gradient-card-denied:  linear-gradient(180deg, var(--color-bg-surface), var(--color-danger-bg) 90%);
  --glow-risk:             radial-gradient(circle, rgba(77,124,255,.35), transparent 70%);

  /* ============ 字阶 ================================================================= */
  --font-size-3xs: 9.5px;
  --font-size-2xs: 10px;
  --font-size-xs:  11px;
  --font-size-sm:  12px;
  --font-size-md:  13px;
  --font-size-base:14px;
  --font-size-lg:  15px;
  --font-size-xl:  16px;
  --font-size-2xl: 20px;
  --font-size-3xl: 22px;
  --font-size-4xl: 26px;
  --font-size-5xl: 30px;
  --font-size-6xl: 46px;
  --line-tight: 1.15;
  --line-snug:  1.45;
  --line-base:  1.6;
  --line-relaxed:1.75;

  /* ============ 间距（4px 基准栅格，2px 为半步）======================================= */
  --space-0:   0;
  --space-0-5: 2px;
  --space-1:   4px;
  --space-1-5: 6px;
  --space-2:   8px;
  --space-2-5: 10px;
  --space-3:   12px;
  --space-3-5: 14px;
  --space-4:   16px;
  --space-4-5: 18px;
  --space-5:   20px;
  --space-5-5: 22px;
  --space-6:   24px;
  --space-6-5: 26px;
  --space-7:   28px;
  --space-8:   32px;
  --space-9:   36px;
  --space-10:  40px;
  --space-12:  48px;
  --space-14:  56px;

  /* ============ 圆角 / 阴影 / 层级 / 布局尺寸 ========================================== */
  --radius-xs: 4px;
  --radius-sm: 6px;
  --radius-md: 8px;
  --radius-lg: 10px;
  --radius-xl: 12px;
  --radius-2xl:14px;
  --radius-3xl:18px;
  --radius-pill:999px;

  --shadow-xs: 0 1px 2px rgba(15,23,42,.05);
  --shadow-sm: 0 1px 3px rgba(15,23,42,.06);
  --shadow-md: 0 4px 6px rgba(15,23,42,.07);
  --shadow-lg: 0 10px 15px rgba(15,23,42,.08);
  --shadow-xl: 0 20px 25px rgba(15,23,42,.10);
  --shadow-primary:    0 4px 14px rgba(0,82,255,.25);
  --shadow-primary-lg: 0 8px 24px rgba(0,82,255,.35);
  --shadow-danger-sm:  0 1px 4px rgba(220,38,38,.50);
  --shadow-danger-md:  0 1px 8px rgba(220,38,38,.80);
  --shadow-focus:      0 0 0 3px rgba(0,82,255,.15);
  --shadow-focus-sm:   0 0 0 2px rgba(0,82,255,.12);

  --z-tab:     5;
  --z-header:  10;
  --z-sidebar: 20;
  --z-modal-mask: 9998;
  --z-modal:   9999;
  /* 引导期专用层级（Task 55 · 全局生效，**不依赖媒体查询**：真机上顶栏溢出会把布局视口
     撑宽 → 媒体查询内的层级修复不命中，故改为单一事实源的全局 token）。 */
  --z-scrim:  9900;   /* 变暗环（其 9999px 外阴影＝黑幕） */
  --z-target: 9950;   /* 高亮目标 */
  --z-guide:  10000;  /* 右栏抽屉 / 悬浮入口（要在黑幕之上） */
  --z-tip:    10100;  /* 引导气泡：永远最上层 */

  --layout-header-h: 56px;
  --layout-strip-h:  28px; /* Task 38：全站脱敏横幅固定高度（≤40px），手机抽屉顶边需补偿它 */
  --layout-left-w:  252px;
  --layout-right-w: 330px;
  --control-h: 38px;
}
