菜单

CSS 变量系统

相关源文件

CSS 变量系统负责在用户项目中自动注入和更新 CSS 自定义属性(CSS 变量)。该系统处理主题变量、颜色方案以及 Tailwind CSS 的 v3 和 v4 版本集成,以确保 shadcn/ui 组件在主题方面的一致性。

有关主题自定义和颜色配置的信息,请参阅 主题自定义。有关暗模式实现细节,请参阅 暗模式

架构概述

CSS 变量系统作为一个基于 PostCSS 的转换管道运行,该管道处理 CSS 文件,根据注册项规范注入或更新 CSS 变量。

来源: packages/shadcn/src/utils/updaters/update-css-vars.ts18-63 packages/shadcn/src/registry/schema.ts48-52

CSS 变量模式

CSS 变量在注册项中使用 cssVars 模式定义,支持三种上下文

上下文目的Tailwind 版本示例
theme@theme 指令变量仅 v4"font-sans": "Inter, sans-serif"
light浅色主题变量v3, v4"background": "0 0% 100%"
dark深色主题变量v3, v4"background": "240 10% 3.9%"

来源: packages/shadcn/src/registry/schema.ts48-52 apps/www/public/schema/registry-item.json133-158

Tailwind 版本支持

该系统为 Tailwind CSS v3 和 v4 提供了不同的处理管道,在变量管理方面采用了不同的方法

Tailwind v3 处理

  • 变量注入到 @layer base 中,使用 :root.dark 选择器
  • 使用 updateCssVarsPlugin 处理标准的 CSS 变量
  • 包含 updateBaseLayerPlugin 处理基础样式

Tailwind v4 处理

  • 变量注入到 @theme inline 指令
  • 使用带 HSL 颜色包装的 updateCssVarsPluginV4
  • 包含自动的 @custom-variant@plugin 指令
  • 特殊处理 --sidebar-background--sidebar 的转换

来源: packages/shadcn/src/utils/updaters/update-css-vars.ts98-131 packages/shadcn/src/utils/updaters/update-css-vars.ts393-496

处理管道

CSS 转换遵循一个多阶段的管道,该管道处理 CSS 变量注入的各个方面

来源: packages/shadcn/src/utils/updaters/update-css-vars.ts92-137 packages/shadcn/src/utils/updaters/update-css-vars.ts139-151

核心功能

updateCssVars

CSS 变量更新的主要入口点。处理文件 I/O 并协调转换过程。

参数

  • cssVars:来自注册项的 CSS 变量定义
  • config:包含已解析路径的项目配置
  • options:处理选项,包括 Tailwind 版本和覆盖行为

transformCssVars

核心转换引擎,应用 PostCSS 插件来处理 CSS 变量。

主要职责

  • 基于 Tailwind 版本组装插件链
  • 协调 PostCSS 处理
  • 输出清理和格式化

辅助函数

功能目的Tailwind 版本
isLocalHSLValue检测 HSL 颜色格式 "240 10% 3.9%"v4
isColorValue检测标准颜色格式v4
addOrUpdateVars在 AST 节点中更新 CSS 变量v3
upsertThemeNode创建或更新 @theme inline 指令v4

来源: packages/shadcn/src/utils/updaters/update-css-vars.ts18-63 packages/shadcn/src/utils/updaters/update-css-vars.ts65-152 packages/shadcn/src/utils/updaters/update-css-vars.ts877-902

PostCSS 插件系统

该系统使用专门的 PostCSS 插件来处理不同的转换方面

变量更新插件

updateCssVarsPlugin (Tailwind v3)

  • 将变量注入到 @layer base 中,使用 :root.dark 选择器
  • 处理标准的 CSS 变量格式

updateCssVarsPluginV4 (Tailwind v4)

  • 注入带 HSL 颜色包装的变量
  • 特殊处理 --sidebar-background--sidebar 的转换
  • 尊重 overwriteCssVars 选项来更新主题/样式

主题管理插件

updateThemePlugin

  • @theme inline 指令生成主题变量
  • 为颜色值创建带 --color-* 前缀的变量
  • 处理用于边框半径系统的 --radius-* 变量生成

updateBaseLayerPlugin

  • 确保存在 *body 选择器的基础层样式
  • 根据 Tailwind 版本调整 @apply 指令

配置插件

updateTailwindConfigPlugin

  • 为所需的 Tailwind 插件添加 @plugin 指令
  • 保留现有的引号样式(单引号/双引号)

updateTailwindConfigKeyframesPlugin / updateTailwindConfigAnimationPlugin

  • 处理主题指令中的动画和关键帧定义

来源: packages/shadcn/src/utils/updaters/update-css-vars.ts229-267 packages/shadcn/src/utils/updaters/update-css-vars.ts393-496 packages/shadcn/src/utils/updaters/update-css-vars.ts498-591

CLI 集成

CSS 变量系统通过组件安装流程与 CLI 命令集成

关键集成行为

组件添加(add 命令)

  • 调用 shouldOverwriteCssVars 来确定主题/样式组件是否需要变量覆盖
  • registry:themeregistry:style 类型设置 overwriteCssVars: true
  • 为常规组件添加保留用户定义的变量

项目初始化(init 命令)

  • 初始化时始终设置 overwriteCssVars: true
  • 为新项目启用 cleanupDefaultNextStyles 以移除框架默认设置
  • 在使用默认样式配置时设置 initIndex: true

来源: packages/shadcn/src/utils/add-components.ts91-99 packages/shadcn/src/utils/add-components.ts307-319 packages/shadcn/src/commands/init.ts216-224