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 变量在注册项中使用 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 CSS v3 和 v4 提供了不同的处理管道,在变量管理方面采用了不同的方法
@layer base 中,使用 :root 和 .dark 选择器updateCssVarsPlugin 处理标准的 CSS 变量updateBaseLayerPlugin 处理基础样式@theme inline 指令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
updateCssVarsCSS 变量更新的主要入口点。处理文件 I/O 并协调转换过程。
参数
cssVars:来自注册项的 CSS 变量定义config:包含已解析路径的项目配置options:处理选项,包括 Tailwind 版本和覆盖行为transformCssVars核心转换引擎,应用 PostCSS 插件来处理 CSS 变量。
主要职责
| 功能 | 目的 | 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 插件来处理不同的转换方面
updateCssVarsPlugin (Tailwind v3)
@layer base 中,使用 :root 和 .dark 选择器updateCssVarsPluginV4 (Tailwind v4)
--sidebar-background 到 --sidebar 的转换overwriteCssVars 选项来更新主题/样式updateThemePlugin
@theme inline 指令生成主题变量--color-* 前缀的变量--radius-* 变量生成updateBaseLayerPlugin
* 和 body 选择器的基础层样式@apply 指令updateTailwindConfigPlugin
@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
CSS 变量系统通过组件安装流程与 CLI 命令集成
组件添加(add 命令)
shouldOverwriteCssVars 来确定主题/样式组件是否需要变量覆盖registry:theme 和 registry:style 类型设置 overwriteCssVars: true项目初始化(init 命令)
overwriteCssVars: truecleanupDefaultNextStyles 以移除框架默认设置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