unnamed-ui
设计变量

设计变量使用指南

从 Figma 复制样式到 Tailwind:理解并正确使用设计变量

当您从 Figma 设计稿复制样式时,经常会看到类似 background: var(--Container-bg-brand-light-hover, #DFE9FF) 的代码。本文档帮助您理解这些变量的含义,并在 Tailwind CSS 中正确使用它们。

目录

  1. 从设计稿到代码
  2. 变量命名规则
  3. 常用变量速查表
  4. 在 Tailwind 中使用
  5. 常见场景示例
  6. 主题与深浅色
  7. 常见问题

1. 从设计稿到代码

为什么是变量而不是颜色值?

Figma 导出的代码通常长这样:

background: var(--Container-bg-brand-light-hover, #DFE9FF);
  • var(--Container-bg-brand-light-hover):设计变量名,会随主题(浅色/深色)自动切换
  • #DFE9FF:fallback 兜底色,当变量未加载时显示

重要:请始终使用变量名,不要直接写 #DFE9FF。否则切换主题时颜色不会变化。


2. 变量命名规则

变量名采用 「类别-用途-语义」 结构,便于从名称推断用途。

类别前缀

前缀含义典型用途
Container容器/背景卡片、按钮、输入框背景
Text文字颜色标题、正文、占位符
Border边框分割线、输入框边框
Focusring焦点环输入框 focus 高亮
Page页面级页面背景、次级背景

语义后缀

后缀含义示例
-brand品牌色主按钮、链接
-neutral中性色背景、边框、正文
-success成功色成功状态、确认
-warning警告色警告提示
-error错误色错误提示、危险操作
-light浅色变体次要背景、hover 前
-light-hover浅色 hover悬停时背景
-light-active浅色 active按下时背景

命名示例

  • --Container-bg-brand:品牌色背景(主按钮)
  • --Container-bg-brand-light-hover:品牌色浅色背景的 hover 态
  • --Text-text-primary:主要文字颜色
  • --Border-border-neutral:中性色边框

3. 常用变量速查表

背景 (Container-bg-xxx,xxx 为 container、brand、neutral 等)

变量名用途
--Container-bg-container卡片、弹窗等容器背景
--Container-bg-container-secondary次级容器背景
--Container-bg-brand主按钮、品牌色块
--Container-bg-brand-light品牌色浅色背景
--Container-bg-brand-light-hover品牌色浅色 hover
--Container-bg-neutral-light中性浅色背景
--Container-bg-neutral-light-hover中性浅色 hover
--Container-bg-neutral深色中性背景(深色按钮)
--Container-bg-success成功色背景
--Container-bg-error错误色背景
--Page-bg-page页面主背景
--Page-bg-page-secondary页面次级背景

文字 (Text-text-*)

变量名用途
--Text-text-title标题
--Text-text-primary主要正文
--Text-text-secondary次要文字
--Text-text-tertiary辅助文字
--Text-text-placeholder占位符
--Text-text-brand品牌色文字(链接)
--Text-text-inverse反色文字(深色背景上的白字)

边框 (Border-border- 为 neutral/brand 等)

变量名用途
--Border-border-neutral中性边框
--Border-border-brand品牌色边框
--Border-divider-neutral-basic分割线
--Border-divider-neutral-strong强调分割线

焦点环 (Focusring-focusring-*)

变量名用途
--Focusring-focusring-brand输入框 focus 高亮
--Focusring-focusring-error错误态 focus

4. 在 Tailwind 中使用

Tailwind 通过 任意值语法 [var(--xxx)] 使用 CSS 变量。

基本写法

// 背景
className="bg-[var(--Container-bg-brand)]"

// 文字
className="text-[var(--Text-text-primary)]"

// 边框
className="border border-[var(--Border-border-neutral)]"

// 圆角(使用 radius 变量)
className="rounded-[var(--radius-lg)]"

// 字号与行高(leading 放前面,font-size 放后面)
className="leading-[var(--line-height-2)] font-size-2"
// 或使用任意值:text-[length:var(--font-size-2)](不要用 text-[var(--font-size-2)],易与颜色混淆)

状态变体

// hover
className="bg-[var(--Container-bg-neutral-light)] hover:bg-[var(--Container-bg-neutral-light-hover)]"

// focus
className="focus:ring-2 focus:ring-[var(--Focusring-focusring-brand)] focus:border-[var(--Border-border-brand)]"

// active
className="active:bg-[var(--Container-bg-brand-light-active)]"

与 shadcn 的关系

项目中的 shadcn 组件使用语义化别名(如 --primary--muted),这些别名底层指向上述 Figma 变量。因此:

  • 使用 shadcn 组件时:可直接用 bg-primarytext-muted-foreground
  • 自定义样式时:使用 bg-[var(--Container-bg-brand)] 等精确控制

5. 常见场景示例

主按钮

<button className="bg-[var(--Container-bg-brand)] text-[var(--Text-text-inverse)] hover:bg-[var(--Container-bg-brand-hover)] active:bg-[var(--Container-bg-brand-active)] rounded-[var(--radius-md)] px-4 py-2">
  确认
</button>

次要按钮(浅色背景)

<button className="bg-[var(--Container-bg-neutral-light)] text-[var(--Text-text-primary)] hover:bg-[var(--Container-bg-neutral-light-hover)] active:bg-[var(--Container-bg-neutral-light-active)] border border-[var(--Border-border-neutral)] rounded-[var(--radius-md)] px-4 py-2">
  取消
</button>

输入框

<input
  className="w-full border border-[var(--Border-border-neutral)] rounded-[var(--radius-md)] px-3 py-2 text-[var(--Text-text-primary)] placeholder:text-[var(--Text-text-placeholder)] focus:outline-none focus:ring-2 focus:ring-[var(--Focusring-focusring-brand)] focus:border-[var(--Border-border-brand)]"
  placeholder="请输入"
/>

卡片

<div className="bg-[var(--Container-bg-container)] border border-[var(--Border-border-neutral)] rounded-[var(--radius-lg)] p-4">
  <h3 className="text-[var(--Text-text-title)] mb-2">标题</h3>
  <p className="text-[var(--Text-text-secondary)]">内容</p>
</div>

品牌色链接

<a href="#" className="text-[var(--Text-text-brand)] hover:text-[var(--Text-text-brand-hover)]">
  查看详情
</a>

6. 主题与深浅色

变量会随 data-theme="light"data-theme="dark" 自动切换。确保您的应用根元素或 .theme-container 正确设置了主题,变量即可生效。

  • 不要 在代码中写死 #DFE9FF 等颜色值
  • 始终 使用 var(--Container-bg-brand-light-hover) 等形式

7. 常见问题

变量不生效、显示为空白?

  1. 确认已引入 Unnamed UI 的 globals.css
  2. 确认元素在 .theme-container 内(或根元素已应用主题)
  3. 检查变量名拼写是否正确(区分大小写)

设计稿只有色值,没有变量名?

参考 常用变量速查表,根据用途选择最接近的变量。例如浅蓝色背景通常是 --Container-bg-brand-light--Container-bg-brand-light-hover

如何自定义主题色?

推荐做法:新建 theme.css(或任意命名),在入口 CSS 中紧接在 globals 引入之后引入,用于覆盖变量。不要直接修改 globals.css,以便后续升级样式时不受影响。

/* src/index.css 或 app/globals.css */
@import "tailwindcss";
@import "./components/globals.css";  /* Unnamed UI 样式 */
@import "./theme.css";              /* 您的主题覆盖,放在 globals 下方 */

theme.css 中覆盖变量:

:root {
  --Light-Brand-brand-600: #00589f;
  --Container-bg-brand: #00589f;
}

.dark {
  --Dark-Brand-brand-600: #424cdc;
}

也可使用主题工作台(Theme Studio)调整后复制生成的 CSS 到 theme.css。详见新手指南中的 Token 定制说明

需要把 Figma 复制的 CSS 转成 Tailwind?

可将复制的内容提供给 AI 助手,并附上 Figma 样式转 Tailwind(LLM 参考) 作为参考,让模型按规范输出 Tailwind className。也可使用项目中的 docs/llm/design-tokens-conversion-prompt.md 将提示词复制到 AI 对话中。