/* ============================================================================
 * doudou.css —— 「窦窦 API」New API 原生页面全站换肤
 *
 * 机制：nginx sub_filter 在 </head> 前注入本文件（DESIGN_SPEC §4.7）。
 *       不改 New API 源码、不 fork 镜像、不动 DOM 结构与排版。
 *
 * 覆盖目标来自源码实读，不猜：
 *   web/src/styles/theme.css         —— :root / .dark 的 shadcn 语义 token
 *   web/src/styles/theme-presets.css —— [data-theme-preset|radius|font|scale]
 *   web/src/styles/index.css         —— @layer base/components/utilities
 *   web/src/components/ui/*.tsx      —— data-slot 组件级钩子
 * 取值来自 frontend/tailwind.config.ts 与 src/app/globals.css（DESIGN_SPEC §2.1），
 * 未自创任何颜色。
 *
 * 级联说明（为什么几乎不需要 !important）：
 *   New API 构建产物把样式放进 @layer properties/theme/base/components/utilities，
 *   本文件是「无层」样式，按 CSS Cascade Layers 规范无层永远压过任何层，
 *   因此普通选择器即可生效。
 *   全文件 !important 数量：**1**——只在 §5.14b，因为对方把那层渐变光晕写在
 *   style 属性里，内联样式压不过；已在该处逐条注明原因。
 * ==========================================================================*/

/* ---------------------------------------------------------------------------
 * 1. 字体（§2.2）—— 自托管 Inter / JetBrains Mono，与我们的 Next.js 前端同源
 *    （字体文件取自 frontend 的 next/font 自托管构建产物，未新增外部依赖，
 *      页面不向 fonts.googleapis.com 发任何请求）
 *    只带 latin 子集；latin-ext 与中日韩由 PingFang SC / Noto Sans SC 栈兜底。
 * -------------------------------------------------------------------------*/
@font-face {
  font-family: 'Inter';
  font-style: normal;
  font-weight: 100 900;
  font-display: swap;
  src: url('/theme/fonts/inter-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
    U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
    U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: 'JetBrains Mono';
  font-style: normal;
  font-weight: 100 800;
  font-display: swap;
  src: url('/theme/fonts/jetbrains-mono-latin.woff2') format('woff2');
  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA,
    U+02DC, U+0304, U+0308, U+0329, U+2000-206F, U+20AC, U+2122, U+2191, U+2193,
    U+2212, U+2215, U+FEFF, U+FFFD;
}

/* ---------------------------------------------------------------------------
 * 2. 窦窦设计 token（§2.1，逐项抄自 frontend/tailwind.config.ts 的 colors）
 *    统一加 --dd- 前缀，避免与 New API 的同名变量（--accent、--border…）打架。
 * -------------------------------------------------------------------------*/
:root {
  --dd-bg: #ffffff;
  --dd-surface: #f7f7fa;
  --dd-surface-2: #efeff5;
  --dd-border: #e4e4ec;
  --dd-ink: #1e1e2a;
  --dd-ink-2: #585878;
  --dd-ink-3: #9494aa;
  --dd-accent: #4f5bd5;
  --dd-accent-hover: #3f4ab8;
  --dd-accent-tint: #edeffb;
  --dd-star: #f2c94c;
  --dd-skin: #f8e8d8;
  --dd-ok: #2e9e6b;
  --dd-warn: #e0a526;
  --dd-err: #d64545;

  --dd-font-sans: 'Inter', 'PingFang SC', 'Noto Sans SC', 'Microsoft YaHei',
    -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue',
    Arial, sans-serif;
  --dd-font-mono: 'JetBrains Mono', Menlo, Consolas, 'Liberation Mono', monospace;

  /* §2.3 阴影：默认无，hover 允许这一档 */
  --dd-shadow-hover: 0 2px 8px rgba(31, 36, 33, 0.06);
  /* §2.4 hover 150ms ease-out */
  --dd-dur: 150ms;
}

/* ---------------------------------------------------------------------------
 * 3. 把窦窦 token 灌进 New API 的语义变量
 *
 *    特异性说明：New API 的主题轴（配色预设、圆角档、字体、密度）全写在 <body>
 *    的 data-* 属性上，最高一条是
 *    `.dark [data-theme-preset]:not(…):not(…):not(…)` = (0,5,0)；
 *    而自定义属性按「就近祖先」生效——写在 html 上的 :root 管不到 body 子树。
 *    所以两条选择器分工：
 *      :root —— 覆盖 html 自身，以及挂到 <html> 的 portal 节点
 *      body:not(:root)×5 —— body 永远不是根元素，:not(:root) 恒真，
 *        所以这条永远命中 body；5 个伪类把特异性抬到 (0,5,1)，
 *        压过上面那条 (0,5,0)，也压过 [data-theme-radius='lg'] 这类 (0,1,0)。
 *        即「用户在 UI 里切了任何主题轴，窦窦配色与圆角依然生效」。
 * -------------------------------------------------------------------------*/
:root,
body:not(:root):not(:root):not(:root):not(:root):not(:root) {
  /* —— 底与面（§2.1：白 ≥70%） —— */
  --background: var(--dd-bg);
  --foreground: var(--dd-ink);
  --card: var(--dd-bg);
  --card-foreground: var(--dd-ink);
  --popover: var(--dd-bg);
  --popover-foreground: var(--dd-ink);
  --secondary: var(--dd-surface-2);
  --secondary-foreground: var(--dd-ink-2);
  --muted: var(--dd-surface);
  --muted-foreground: var(--dd-ink-2);

  /* —— 主色 / 强调 ——
     ⚠ 语义错位，不能望名对齐：New API 的 --primary 才是「主色」，
     它的 --accent 是「浅色强调底」。所以 accent→primary、accent-tint→accent。 */
  --primary: var(--dd-accent);
  --primary-foreground: var(--dd-bg);
  --accent: var(--dd-accent-tint);
  --accent-foreground: var(--dd-accent-hover);

  /* —— 语义色 —— */
  --destructive: var(--dd-err);
  --destructive-foreground: var(--dd-bg);
  --success: var(--dd-ok);
  --success-foreground: var(--dd-bg);
  --warning: var(--dd-warn);
  --warning-foreground: var(--dd-ink);
  --info: var(--dd-accent);
  --info-foreground: var(--dd-bg);
  --neutral: var(--dd-ink-3);
  --neutral-foreground: var(--dd-ink);

  /* —— 描边与焦点（§2.3：1px border 代替阴影） —— */
  --border: var(--dd-border);
  --input: var(--dd-border);
  --ring: var(--dd-accent);

  /* —— 图表：一个主色 + 灰阶 + 两个语义色，不出彩虹（§2.1） —— */
  --chart-1: var(--dd-accent);
  --chart-2: var(--dd-ink-2);
  --chart-3: var(--dd-ink-3);
  --chart-4: var(--dd-ok);
  --chart-5: var(--dd-warn);
  --overview-accent-1: var(--dd-accent);
  --overview-accent-2: var(--dd-ink-2);
  --overview-accent-3: var(--dd-ink-3);

  /* —— 侧边栏（§2.1：导航用 surface） —— */
  --sidebar: var(--dd-surface);
  --sidebar-foreground: var(--dd-ink);
  --sidebar-primary: var(--dd-accent);
  --sidebar-primary-foreground: var(--dd-bg);
  --sidebar-accent: var(--dd-accent-tint);
  --sidebar-accent-foreground: var(--dd-accent-hover);
  --sidebar-border: var(--dd-border);
  --sidebar-ring: var(--dd-accent);

  /* —— 骨架屏 —— */
  --skeleton-base: var(--dd-surface-2);
  --skeleton-highlight: var(--dd-surface);

  /* —— 表格 —— */
  --table-row: var(--dd-bg);
  --table-header: var(--dd-surface);
  --table-header-hover: var(--dd-surface-2);
  --table-disabled: var(--dd-surface);
  --table-disabled-hover: var(--dd-surface-2);
  --table-disabled-border: var(--dd-border);

  /* —— 圆角（§2.3）——
     New API 的 @theme inline 把 rounded-* 编译成 calc(var(--radius) * n)，
     单一 --radius 是唯一杠杆：0.5rem 起算得 sm 4.8 / md 6.4 / lg 8（按钮·输入）
     / xl 11.2（卡片）。卡片与标签另在 §5.7 / §5.8 逐条钉到 12px / 6px。 */
  --radius: 0.5rem;

  /* —— 字体（§2.2）——
     --font-body 是 <body> 实际用的那条；--font-sans/inter/manrope/serif
     是 New API 留的几个别名，一并对齐，避免某个预设把衬线换回来。 */
  --font-body: var(--dd-font-sans);
  --font-sans: var(--dd-font-sans);
  --font-inter: var(--dd-font-sans);
  --font-manrope: var(--dd-font-sans);
  --font-serif: var(--dd-font-sans);
  --font-mono: var(--dd-font-mono);
}

/* ---------------------------------------------------------------------------
 * 4. Tailwind 调色板家族重映射
 *    New API 源码里有约 300 处硬编码的 bg-amber-500 / text-emerald-600 这类，
 *    它们编译成 var(--color-<家族>-<档>)，不走语义 token。下面只覆盖构建产物里
 *    真实被引用的 113 个档位（纯变量，不写一条选择器，零布局影响）。
 *    分组原则（§2.1 一个主色 + 一个点缀 + 其余灰阶）：
 *      blue/sky/indigo → accent；violet/purple → ink-2；cyan/teal → ink-3
 *      emerald/green/lime → ok；amber/yellow/orange → warn；red/rose/pink → err
 *      gray/slate → ink-2 灰阶
 *    配方：50–400 向 bg 混，500 取基色，600–950 向 ink 混。
 * -------------------------------------------------------------------------*/
:root,
body:not(:root):not(:root):not(:root):not(:root):not(:root) {
  /* 主色族（New API 原品牌蓝）→ accent */
  --color-blue-50: color-mix(in oklab, var(--dd-accent) 6%, var(--dd-bg));
  --color-blue-100: color-mix(in oklab, var(--dd-accent) 12%, var(--dd-bg));
  --color-blue-200: color-mix(in oklab, var(--dd-accent) 22%, var(--dd-bg));
  --color-blue-300: color-mix(in oklab, var(--dd-accent) 38%, var(--dd-bg));
  --color-blue-400: color-mix(in oklab, var(--dd-accent) 65%, var(--dd-bg));
  --color-blue-500: var(--dd-accent);
  --color-blue-600: color-mix(in oklab, var(--dd-accent) 88%, var(--dd-ink));
  --color-blue-700: color-mix(in oklab, var(--dd-accent) 74%, var(--dd-ink));
  --color-blue-800: color-mix(in oklab, var(--dd-accent) 58%, var(--dd-ink));
  --color-blue-900: color-mix(in oklab, var(--dd-accent) 42%, var(--dd-ink));
  --color-blue-950: color-mix(in oklab, var(--dd-accent) 28%, var(--dd-ink));
  --color-sky-50: color-mix(in oklab, var(--dd-accent) 6%, var(--dd-bg));
  --color-sky-200: color-mix(in oklab, var(--dd-accent) 22%, var(--dd-bg));
  --color-sky-300: color-mix(in oklab, var(--dd-accent) 38%, var(--dd-bg));
  --color-sky-400: color-mix(in oklab, var(--dd-accent) 65%, var(--dd-bg));
  --color-sky-500: var(--dd-accent);
  --color-sky-700: color-mix(in oklab, var(--dd-accent) 74%, var(--dd-ink));
  --color-sky-900: color-mix(in oklab, var(--dd-accent) 42%, var(--dd-ink));
  --color-sky-950: color-mix(in oklab, var(--dd-accent) 28%, var(--dd-ink));
  --color-indigo-100: color-mix(in oklab, var(--dd-accent) 12%, var(--dd-bg));
  --color-indigo-500: var(--dd-accent);
  --color-indigo-800: color-mix(in oklab, var(--dd-accent) 58%, var(--dd-ink));
  --color-indigo-900: color-mix(in oklab, var(--dd-accent) 42%, var(--dd-ink));

  /* 次级冷色 → ink-2 靛紫灰（与 accent 可区分，仍属灰阶） */
  --color-violet-100: color-mix(in oklab, var(--dd-ink-2) 12%, var(--dd-bg));
  --color-violet-300: color-mix(in oklab, var(--dd-ink-2) 38%, var(--dd-bg));
  --color-violet-400: color-mix(in oklab, var(--dd-ink-2) 65%, var(--dd-bg));
  --color-violet-500: var(--dd-ink-2);
  --color-violet-600: color-mix(in oklab, var(--dd-ink-2) 88%, var(--dd-ink));
  --color-violet-700: color-mix(in oklab, var(--dd-ink-2) 74%, var(--dd-ink));
  --color-violet-800: color-mix(in oklab, var(--dd-ink-2) 58%, var(--dd-ink));
  --color-violet-900: color-mix(in oklab, var(--dd-ink-2) 42%, var(--dd-ink));
  --color-violet-950: color-mix(in oklab, var(--dd-ink-2) 28%, var(--dd-ink));
  --color-purple-300: color-mix(in oklab, var(--dd-ink-2) 38%, var(--dd-bg));
  --color-purple-500: var(--dd-ink-2);
  --color-purple-700: color-mix(in oklab, var(--dd-ink-2) 74%, var(--dd-ink));

  /* 第三冷色 → ink-3（更灰一档，仍能与前两者区分，用于分类色） */
  --color-cyan-100: color-mix(in oklab, var(--dd-ink-3) 12%, var(--dd-bg));
  --color-cyan-300: color-mix(in oklab, var(--dd-ink-3) 38%, var(--dd-bg));
  --color-cyan-500: var(--dd-ink-3);
  --color-cyan-700: color-mix(in oklab, var(--dd-ink-3) 74%, var(--dd-ink));
  --color-cyan-800: color-mix(in oklab, var(--dd-ink-3) 58%, var(--dd-ink));
  --color-cyan-900: color-mix(in oklab, var(--dd-ink-3) 42%, var(--dd-ink));
  --color-teal-300: color-mix(in oklab, var(--dd-ink-3) 38%, var(--dd-bg));
  --color-teal-500: var(--dd-ink-3);
  --color-teal-800: color-mix(in oklab, var(--dd-ink-3) 58%, var(--dd-ink));

  /* 成功语义 → ok */
  --color-emerald-50: color-mix(in oklab, var(--dd-ok) 6%, var(--dd-bg));
  --color-emerald-100: color-mix(in oklab, var(--dd-ok) 12%, var(--dd-bg));
  --color-emerald-200: color-mix(in oklab, var(--dd-ok) 22%, var(--dd-bg));
  --color-emerald-300: color-mix(in oklab, var(--dd-ok) 38%, var(--dd-bg));
  --color-emerald-400: color-mix(in oklab, var(--dd-ok) 65%, var(--dd-bg));
  --color-emerald-500: var(--dd-ok);
  --color-emerald-600: color-mix(in oklab, var(--dd-ok) 88%, var(--dd-ink));
  --color-emerald-700: color-mix(in oklab, var(--dd-ok) 74%, var(--dd-ink));
  --color-emerald-800: color-mix(in oklab, var(--dd-ok) 58%, var(--dd-ink));
  --color-emerald-900: color-mix(in oklab, var(--dd-ok) 42%, var(--dd-ink));
  --color-emerald-950: color-mix(in oklab, var(--dd-ok) 28%, var(--dd-ink));
  --color-green-300: color-mix(in oklab, var(--dd-ok) 38%, var(--dd-bg));
  --color-green-400: color-mix(in oklab, var(--dd-ok) 65%, var(--dd-bg));
  --color-green-500: var(--dd-ok);
  --color-green-600: color-mix(in oklab, var(--dd-ok) 88%, var(--dd-ink));
  --color-green-700: color-mix(in oklab, var(--dd-ok) 74%, var(--dd-ink));
  --color-green-800: color-mix(in oklab, var(--dd-ok) 58%, var(--dd-ink));
  --color-lime-500: var(--dd-ok);

  /* 警告语义 → warn */
  --color-amber-50: color-mix(in oklab, var(--dd-warn) 6%, var(--dd-bg));
  --color-amber-100: color-mix(in oklab, var(--dd-warn) 12%, var(--dd-bg));
  --color-amber-200: color-mix(in oklab, var(--dd-warn) 22%, var(--dd-bg));
  --color-amber-300: color-mix(in oklab, var(--dd-warn) 38%, var(--dd-bg));
  --color-amber-400: color-mix(in oklab, var(--dd-warn) 65%, var(--dd-bg));
  --color-amber-500: var(--dd-warn);
  --color-amber-600: color-mix(in oklab, var(--dd-warn) 88%, var(--dd-ink));
  --color-amber-700: color-mix(in oklab, var(--dd-warn) 74%, var(--dd-ink));
  --color-amber-800: color-mix(in oklab, var(--dd-warn) 58%, var(--dd-ink));
  --color-amber-900: color-mix(in oklab, var(--dd-warn) 42%, var(--dd-ink));
  --color-amber-950: color-mix(in oklab, var(--dd-warn) 28%, var(--dd-ink));
  --color-yellow-400: color-mix(in oklab, var(--dd-warn) 65%, var(--dd-bg));
  --color-yellow-500: var(--dd-warn);
  --color-yellow-600: color-mix(in oklab, var(--dd-warn) 88%, var(--dd-ink));
  --color-orange-100: color-mix(in oklab, var(--dd-warn) 12%, var(--dd-bg));
  --color-orange-300: color-mix(in oklab, var(--dd-warn) 38%, var(--dd-bg));
  --color-orange-500: var(--dd-warn);
  --color-orange-700: color-mix(in oklab, var(--dd-warn) 74%, var(--dd-ink));
  --color-orange-800: color-mix(in oklab, var(--dd-warn) 58%, var(--dd-ink));
  --color-orange-900: color-mix(in oklab, var(--dd-warn) 42%, var(--dd-ink));

  /* 错误语义 → err */
  --color-red-50: color-mix(in oklab, var(--dd-err) 6%, var(--dd-bg));
  --color-red-100: color-mix(in oklab, var(--dd-err) 12%, var(--dd-bg));
  --color-red-200: color-mix(in oklab, var(--dd-err) 22%, var(--dd-bg));
  --color-red-300: color-mix(in oklab, var(--dd-err) 38%, var(--dd-bg));
  --color-red-400: color-mix(in oklab, var(--dd-err) 65%, var(--dd-bg));
  --color-red-500: var(--dd-err);
  --color-red-600: color-mix(in oklab, var(--dd-err) 88%, var(--dd-ink));
  --color-red-700: color-mix(in oklab, var(--dd-err) 74%, var(--dd-ink));
  --color-red-800: color-mix(in oklab, var(--dd-err) 58%, var(--dd-ink));
  --color-red-900: color-mix(in oklab, var(--dd-err) 42%, var(--dd-ink));
  --color-red-950: color-mix(in oklab, var(--dd-err) 28%, var(--dd-ink));
  --color-rose-50: color-mix(in oklab, var(--dd-err) 6%, var(--dd-bg));
  --color-rose-100: color-mix(in oklab, var(--dd-err) 12%, var(--dd-bg));
  --color-rose-200: color-mix(in oklab, var(--dd-err) 22%, var(--dd-bg));
  --color-rose-300: color-mix(in oklab, var(--dd-err) 38%, var(--dd-bg));
  --color-rose-400: color-mix(in oklab, var(--dd-err) 65%, var(--dd-bg));
  --color-rose-500: var(--dd-err);
  --color-rose-600: color-mix(in oklab, var(--dd-err) 88%, var(--dd-ink));
  --color-rose-700: color-mix(in oklab, var(--dd-err) 74%, var(--dd-ink));
  --color-rose-800: color-mix(in oklab, var(--dd-err) 58%, var(--dd-ink));
  --color-rose-900: color-mix(in oklab, var(--dd-err) 42%, var(--dd-ink));
  --color-rose-950: color-mix(in oklab, var(--dd-err) 28%, var(--dd-ink));
  --color-pink-500: var(--dd-err);

  /* 中性灰 → ink 灰阶 */
  --color-gray-200: color-mix(in oklab, var(--dd-ink-2) 22%, var(--dd-bg));
  --color-gray-400: color-mix(in oklab, var(--dd-ink-2) 65%, var(--dd-bg));
  --color-gray-500: var(--dd-ink-2);
  --color-slate-100: color-mix(in oklab, var(--dd-ink-2) 12%, var(--dd-bg));
  --color-slate-300: color-mix(in oklab, var(--dd-ink-2) 38%, var(--dd-bg));
  --color-slate-400: color-mix(in oklab, var(--dd-ink-2) 65%, var(--dd-bg));
  --color-slate-500: var(--dd-ink-2);
  --color-slate-700: color-mix(in oklab, var(--dd-ink-2) 74%, var(--dd-ink));
}

/* ---------------------------------------------------------------------------
 * 5. 组件级微调
 *
 *    纪律：本节不写任何影响排版的属性——没有 width / height / margin / padding /
 *    position / display / flex / grid / font-size / line-height。
 *    唯一例外是 §5.13 空状态表情包容器的尺寸，已在 T9 报告里单独申报。
 * -------------------------------------------------------------------------*/

/* 5.1 代码类走等宽（正文字体已由 §3 的 --font-body 换掉） */
code,
kbd,
pre,
samp,
.font-mono,
[data-slot='command-shortcut'] {
  font-family: var(--dd-font-mono);
}

/* 5.2 选中态用强调底（与我们 globals.css 的 ::selection 一致） */
::selection {
  background: var(--dd-accent-tint);
}

/* 5.3 强制浅色：§2.1「暗色模式 P2 不做」。New API 的 .dark 类仍可能被用户切上，
       §3 的 body 规则已让 token 恒为浅色，这里把表单原生控件的配色也钉住，
       避免出现浅底深控件的割裂。 */
:root,
:root.dark {
  color-scheme: light;
}

/* 5.4 按钮（§2.4：hover 150ms、背景变强调色；位移交给源码自带的
       active:translate-y-px，不动）。
       源码 button.tsx:29 只给 [a]:hover 写了主按钮 hover 底色，纯 <button>
       没有任何 hover 反馈，这里补齐。 */
[data-slot='button'] {
  transition-duration: var(--dd-dur);
  transition-timing-function: ease-out;
}
[data-slot='button'].bg-primary:not(:disabled):hover {
  background-color: var(--dd-accent-hover);
}
/* outline 变体（.bg-background）hover：§2.4「边框变 accent、背景变 accent-tint」。
   ghost 变体沿用源码的 hover:bg-muted —— muted 已是 surface，本身合规，
   不为它写转义类名选择器（.hover\:bg-muted 太脆）。 */
[data-slot='button'].bg-background:not(:disabled):hover {
  background-color: var(--dd-accent-tint);
  border-color: var(--dd-accent);
  color: var(--dd-accent-hover);
}

/* 5.5 §2.9 主按钮角标贴纸——**预留钩子，当前是死代码**。
       ⚠ 如实说明：doudou.js 里对 .dd-sticker 的引用数是 0，没有任何节点会拿到这个类，
       所以这段 CSS 现在一行都不会生效。保留它是为了 T4.1 的贴纸素材产出后能直接接上：
       届时给按钮加 class="dd-sticker" 并设
       --dd-sticker: url('/theme/decor/sticker-star.svg') 即可，无需再改样式表。
       未设 --dd-sticker 时 background 为 none，是个 20px 的透明块，不挡点击。 */
[data-slot='button'].dd-sticker {
  position: relative;
  overflow: visible;
}
[data-slot='button'].dd-sticker::after {
  content: '';
  position: absolute;
  top: -6px;
  inset-inline-end: -6px;
  width: 20px;
  height: 20px;
  pointer-events: none;
  background: var(--dd-sticker, none) center / contain no-repeat;
}

/* 5.6 输入类：hover 描边提示（§2.4 即时反馈）；focus 环已走 --ring */
[data-slot='input']:not(:disabled):hover,
[data-slot='textarea']:not(:disabled):hover,
[data-slot='select-trigger']:not(:disabled):hover,
[data-slot='command-input']:not(:disabled):hover {
  border-color: var(--dd-ink-3);
  transition-duration: var(--dd-dur);
}

/* 5.7 卡片（§2.3 圆角 12px、1px 描边代替阴影）
       card.tsx:31 用 ring-1 ring-foreground/10 画描边；ring 宽度不动，只换颜色，
       所以盒模型尺寸零变化。 */
[data-slot='card'] {
  --tw-ring-color: var(--dd-border);
  border-radius: 12px;
}
[data-slot='card-header'] {
  border-top-left-radius: 12px;
  border-top-right-radius: 12px;
}
[data-slot='card-footer'] {
  border-bottom-left-radius: 12px;
  border-bottom-right-radius: 12px;
  background-color: var(--dd-surface);
}

/* 5.8 标签（§2.3 标签 6px）。源码 badge.tsx 用 rounded-4xl（= --radius × 2.6）
       做成胶囊，与「不用 ≥20px 大圆角」冲突。 */
[data-slot='badge'] {
  border-radius: 6px;
}

/* 5.9 遮罩（§2.1 禁玻璃拟态；§4.7 指定 rgba(30,30,42,0.45)）
       四个 overlay 源码都写死 bg-black/10 + supports-backdrop-filter:backdrop-blur-xs
       （dialog.tsx:51、alert-dialog.tsx:51、sheet.tsx:50、drawer.tsx:59），
       不走 token，只能按组件覆盖。 */
[data-slot='dialog-overlay'],
[data-slot='alert-dialog-overlay'],
[data-slot='sheet-overlay'],
[data-slot='drawer-overlay'] {
  background-color: rgba(30, 30, 42, 0.45);
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
}

/* 5.10 浮层面板：1px border + §2.3 允许的那一档阴影（浮层必须与底分离） */
[data-slot='dialog-content'],
[data-slot='alert-dialog-content'],
[data-slot='sheet-content'],
[data-slot='drawer-content'],
[data-slot='popover-content'],
[data-slot='dropdown-menu-content'],
[data-slot='dropdown-menu-sub-content'],
[data-slot='context-menu-content'],
[data-slot='menubar-content'],
[data-slot='select-content'],
[data-slot='hover-card-content'],
[data-slot='command'] {
  border-color: var(--dd-border);
  box-shadow: var(--dd-shadow-hover);
}
[data-slot='tooltip-content'] {
  background-color: var(--dd-ink);
  color: var(--dd-bg);
}

/* 5.11 表格（§4.7：表头 surface、行 hover surface）
        表头：data-table 系列组件已经用 --table-header（§3 已映射成 surface），
        但裸 <Table> 的 thead 没底色，这里补上，让两类表格一致。
        行 hover：源码 table.tsx:88 是 color-mix(--muted 50%, --background)，
        会淡成 #FBFBFD，这里钉到规格要的 surface。 */
[data-slot='table-header'] {
  background-color: var(--dd-surface);
}
[data-slot='table-row']:hover,
[data-slot='table-row'][data-state='selected'] {
  background-color: var(--dd-surface);
  transition-duration: var(--dd-dur);
}

/* 5.12 Tab（§2.3 用 1px border 代替 shadow-sm）
        源码已给 trigger 预留 1px 透明边，这里只上色，不改宽度，所以无位移。 */
[data-slot='tabs-list'][data-variant='default'] {
  background-color: var(--dd-surface-2);
}
[data-slot='tabs-trigger'][data-active] {
  background-color: var(--dd-bg);
  border-color: var(--dd-border);
  box-shadow: none;
  color: var(--dd-ink);
}
[data-slot='tabs-trigger']:not([data-active]):hover {
  color: var(--dd-accent);
}

/* 5.13 空状态 / 错误状态的表情包（§4.6 映射，节点替换由 doudou.js 负责）
        ⚠ 全文件唯一改尺寸处：把 32px 的图标盒放大到 112px。
        影响范围只在 Empty 容器（源码 min-h-[300px]）内部，外部排版不动。
        用 :has() 而不是让 JS 加 data 属性——JS 改属性也是 DOM 改动。 */
[data-slot='empty-icon']:has(img.dd-mascot) {
  width: 112px;
  height: 112px;
  background-color: transparent;
  border-radius: 16px; /* §2.3 表情包容器 16px */
}
img.dd-mascot {
  width: 100%;
  height: 100%;
  object-fit: contain;
  /* §2.4 表情包出场：scale 0.96→1 + opacity，250ms */
  animation: dd-mascot-in 250ms ease-out both;
}
/* 整页错误页（404/401/403/429/500/503）插在 <h1> 之前的那张，§2.6 状态页 200px。
   这是 doudou.js 第三件事（总指挥 2026-09-15 单独批准的插入型 DOM 改动）。 */
img.dd-mascot.dd-mascot-page {
  width: 200px;
  height: 200px;
}
@keyframes dd-mascot-in {
  from {
    opacity: 0;
    transform: scale(0.96);
  }
  to {
    opacity: 1;
    transform: none;
  }
}

/* 5.14 压平玻璃拟态与渐变（§2.1 明令禁止）
        index.css 的 .glass-1..5 是 bg-linear-to-b 渐变卡面，用在首页与营销区块。 */
.glass-1,
.glass-2,
.glass-3,
.glass-4,
.glass-5 {
  background-image: none;
  background-color: var(--dd-surface);
  border-color: var(--dd-border);
}

/* 5.14a /dashboard/ 概览「剩余额度」面板的 135° 线性渐变（§2.1 禁渐变）
         源码 features/dashboard/components/overview/summary-cards.tsx:291，写法是
         Tailwind 任意值类 bg-[linear-gradient(135deg,…)]，三段色里还掺了一个写死的
         oklch(0.82 0.04 155) 绿。
         它是 **class 不是内联 style**，所以走 utilities 层，我们的无层样式直接压过，
         **不需要 !important**。压平成 surface 实底，与 §5.14 的 .glass-* 同一处理。
         用 [class*=] 子串匹配而不是那一长串转义类名，可读且不易写错；
         "bg-[linear-gradient(" 这个前缀不会误伤 .bg-linear-to-b 之类的类名。 */
[class*='bg-[linear-gradient('] {
  background-image: none;
  background-color: var(--dd-surface);
}

/* 5.14a-2 概览页还有两层装饰性渐变覆盖层（T9.1 自查发现，审计未点名）：
         features/dashboard/components/overview/overview-dashboard.tsx:191
           —— bg-[radial-gradient(ellipse…),linear-gradient(112deg,…)] 光晕 + 染色
         同文件 :217
           —— from-background/35 to-background/70 bg-linear-to-b 的淡出遮罩
         两者都是 pointer-events-none 的纯装饰层，§2.1 禁渐变与光效，压平。

         ⚠ 限定 .pointer-events-none 是**必须的**：Tailwind 的渐变文字
         （bg-clip-text + text-transparent，New API 首页在用）也走同一批 bg-*-gradient
         工具类，一刀切会让那些标题变成透明的看不见。装饰覆盖层一定带
         pointer-events-none，渐变文字一定不带，用它当护栏。

         同文件 :334 那条 `via-foreground/30 … h-px bg-linear-to-r` **故意不动**——
         它是一条两端淡出的 1px 发丝分隔线，本身没有 background-color，
         压平渐变等于把这条线整个删掉，那是倒退不是修复。
         规则里只写 to-b / to-br，不写 to-r，就是为了放过它。 */
.pointer-events-none[class*='bg-[radial-gradient('],
.pointer-events-none.bg-linear-to-b,
.pointer-events-none.bg-gradient-to-b,
.pointer-events-none.bg-linear-to-br,
.pointer-events-none.bg-gradient-to-br {
  background-image: none;
}

/* 5.14b ⚠ 全文件唯一一处 !important，原因逐条说明：
        /pricing/ 与 /rankings/ 顶部各有一层三重 radial-gradient 光晕
        （features/pricing/index.tsx:165-176、features/rankings/index.tsx:63），
        颜色是写死的 oklch 值，而且**写在 style 属性里**——内联样式的优先级高于
        任何外部样式表，普通选择器压不过，只能用 !important。
        §2.1 明令「禁止渐变、光效」，所以必须去掉。
        该节点带 aria-hidden + pointer-events-none，是纯装饰层，
        去掉背景后节点仍在、尺寸不变，**零布局影响**。 */
.pointer-events-none[aria-hidden][style*='radial-gradient'] {
  background: none !important;
}

/* 5.15 侧边栏选中项：底色已由 --sidebar-accent 给出，这里补字色与过渡 */
[data-slot='sidebar-menu-button'] {
  transition-duration: var(--dd-dur);
}
[data-slot='sidebar-menu-button'][data-active='true'] {
  color: var(--dd-accent-hover);
}

/* 5.16 Toast：sonner 的配色全走 --popover / --success / … 这些 token
        （sonner.tsx 的内联 style），已随 §3 改掉；这里只统一圆角与描边。 */
[data-sonner-toast] {
  border-radius: 8px;
  border-color: var(--dd-border);
}

/* ---------------------------------------------------------------------------
 * 6. doudou.js 注入的新用户横幅（§4.7 第 ② 项）
 *    这是全站唯一一个我们新增的 DOM 节点，样式自带 .dd-banner 命名空间。
 * -------------------------------------------------------------------------*/
.dd-banner {
  display: flex;
  /* 宿主 main[data-slot=sidebar-inset] 是定高 flex 列 + overflow-hidden，
     不写 flex:none 横幅会被内容挤扁。 */
  flex: none;
  align-items: center;
  gap: 12px;
  padding: 10px 16px;
  background-color: var(--dd-accent-tint);
  border-bottom: 1px solid var(--dd-border);
  color: var(--dd-ink);
  font-family: var(--dd-font-sans);
  font-size: 14px;
  line-height: 1.6;
  animation: dd-banner-in 300ms ease-out both;
}
@keyframes dd-banner-in {
  from {
    opacity: 0;
    transform: translateY(-12px);
  }
  to {
    opacity: 1;
    transform: none;
  }
}
.dd-banner__dot {
  width: 8px;
  height: 8px;
  flex: none;
  border-radius: 9999px;
  background-color: var(--dd-star);
}
.dd-banner__text {
  flex: 1 1 auto;
  min-width: 0;
}
.dd-banner__amount {
  font-weight: 600;
  font-variant-numeric: tabular-nums;
  color: var(--dd-accent-hover);
}
.dd-banner__cta {
  flex: none;
  padding: 5px 12px;
  border-radius: 8px;
  background-color: var(--dd-accent);
  color: var(--dd-bg);
  text-decoration: none;
  font-weight: 500;
  transition: background-color var(--dd-dur) ease-out;
}
.dd-banner__cta:hover {
  background-color: var(--dd-accent-hover);
}
.dd-banner__close {
  flex: none;
  width: 28px;
  height: 28px;
  border: 1px solid transparent;
  border-radius: 8px;
  background: transparent;
  color: var(--dd-ink-2);
  font-size: 16px;
  line-height: 1;
  cursor: pointer;
  transition:
    background-color var(--dd-dur) ease-out,
    border-color var(--dd-dur) ease-out;
}
.dd-banner__close:hover {
  background-color: var(--dd-bg);
  border-color: var(--dd-border);
}
@media (max-width: 640px) {
  .dd-banner {
    flex-wrap: wrap;
    font-size: 13px;
  }
}

/* ---------------------------------------------------------------------------
 * 7. 无障碍：§2.4 全站尊重 prefers-reduced-motion
 * -------------------------------------------------------------------------*/
@media (prefers-reduced-motion: reduce) {
  img.dd-mascot,
  .dd-banner {
    animation: none;
  }
}
