Skip to content
Back to skills

Ui Design System Builder

ASecurity

当使用者说"帮我做个界面"、"这个页面太丑"、"看着像模板/像 AI 做的"、"给这个项目定个视觉风格"、"配色和字体你来定"、"把这几个页面统一一下"时使用。先从项目本身抠出一个具体意象,据此定出一版完整的 CSS 变量与排版尺度(不是"现代简洁"这种废话),再用这些 token 拼组件;每个非显然的取舍都在代码注释里写清理由、代价和怎么改回去。中文界面必须同时配 CJK 字体。不装 UI 框架来跳过这一步,不改业务逻辑,不为了好看牺牲对比度和可读性。

  • 5 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 7, 2026
designgo

Works with

  • cursor

Security analysis

A100/100

Pro scans all 2 files and shows the line behind each finding

Scanned November 7, 2026

npx -y skills add ChromiteCr/Skills --skill ui-design-system-builder --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Ui Design System Builder?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Ui Design System Builder
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/chromitecr-ui-design-system-builder/badge)](https://www.skillsdirectory.com/skills/chromitecr-ui-design-system-builder)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: ui-design-system-builder
description: 当使用者说"帮我做个界面"、"这个页面太丑"、"看着像模板/像 AI 做的"、"给这个项目定个视觉风格"、"配色和字体你来定"、"把这几个页面统一一下"时使用。先从项目本身抠出一个具体意象,据此定出一版完整的 CSS 变量与排版尺度(不是"现代简洁"这种废话),再用这些 token 拼组件;每个非显然的取舍都在代码注释里写清理由、代价和怎么改回去。中文界面必须同时配 CJK 字体。不装 UI 框架来跳过这一步,不改业务逻辑,不为了好看牺牲对比度和可读性。
category: coding-helper/ui-design
version: 0.1.1
status: draft
priority: P0
compatible_agents:
  - claude-code
  - cursor
  - codebuddy
  - generic-llm-agent
display_name: 定一套界面的视觉语言
outputs:
  - chat
max_rounds: 20
suggest_hint: 界面看着像模板?用「定一套界面的视觉语言」从项目本身推一套配色和排版出来
---

# 定一套界面的视觉语言 / UI Design System Builder

给一个项目定出**它自己的**视觉语言:一版 token、一套排版尺度、几个用 token 拼出来的组件。

界面之所以像模板,不是因为审美差,是因为每个决定都取了默认值 ——
默认的 Inter、默认的 8px 圆角、默认的 `0 4px 12px rgba(0,0,0,.1)`。
这个技能要求每个决定**能说出为什么是这个项目该用的**。

## 何时使用 / When to use

- 项目要起前端,还没定视觉
- 已有界面能用但"像模板 / 像 AI 随手做的"
- 几个页面各写各的样式,想统一
- 要换字体、换配色、加暗色模式这类会波及全站的改动

**不适用于** / Not for:

- 只改一个按钮的边距 —— 直接改,别起一套系统
- 已经有设计稿或设计规范 —— 那是照着实现,不是重新定
- 想直接套用 MaestrWave 那套现成的深色衬线视觉 —— 用 `maestrwave-ui-system`,
  那边有可粘贴的 `global.css` 与组件层,不用从头推
- 组件库选型、状态管理、性能优化 —— 那是别的问题

## 一条主线:意象 → token → 组件

倒过来做就会失败。先挑组件、边写边配色,最后拼出来的一定是一堆互不相干的局部最优。

### 1. 从项目里抠一个具体意象

读 README 的项目定位和领域名词,**只读这些**,找一个**能画出来的**意象。

| 弱 | 强 |
|---|---|
| 现代、简洁、专业 | 月光下的水面(音频波形应用) |
| 科技感 | 老式示波器的荧光余晖 |
| 温暖友好 | 图书馆闭馆前那盏台灯 |

判据:这个意象能直接推出颜色和材质。"简洁"推不出任何具体值,"月光下的水面"能推出
暖炭黑基底 + 浅水蓝主色 + 低透明度的叠层波浪。

抠不出来就问一句,别自己编一个宏大的概念糊上去。

### 2. 直接写出一版完整 token

不要贴调色板让人挑。**写出一份能直接粘进 `global.css` 的 `:root`**,
包含背景层级、主色、状态色、文字色、描边色、字体栈,每一支都在注释里写为什么。

```css
:root {
  --bg: #15130f;          /* 暖炭黑,不用纯黑:纯黑上任何颜色都发脏 */
  --surface: #211c15;
  --surface-2: #2c2519;   /* 层级靠明度递增,不靠阴影 —— 深色界面里阴影几乎看不见 */
  --accent: #7cb2e8;      /* 浅水蓝,呼应波形主题 */
  --wine: #b8453a;        /* 状态色(录制/危险),和蓝形成一冷一暖 */
  --ink: #f3eddd;         /* 暖白,不用 #fff:和暖底搭配才不割裂 */
  --line: rgba(243, 237, 221, 0.1);
}
```

要点:

- **层级用明度台阶**(surface / surface-2 / surface-3),深色界面里阴影不出力
- **文字层级用 `color-mix(in srgb, var(--ink) 55%, transparent)`**,不另起一堆灰色 token
- **状态色只留一支**够用了,第二支状态色多半是没想清楚
- **token 是唯一真相**。canvas / SVG 也要读 token(`getComputedStyle` 取回来),
  不然换主题时这些地方会被漏掉

### 3. 定尺度对比,而不是定一堆字号

一套排版系统的性格来自**极端之间的落差**,不是来自中间有多少档。

```
display-1   clamp(40px, 6vw, 64px)  weight 600  line-height 0.98  letter-spacing -0.02em
display-2   clamp(24px, 3vw, 32px)
body        14px                    line-height 1.5
eyebrow     11px  letter-spacing 0.14em  uppercase  用主色
label       12px  透明度 55%
```

巨大的标题配 11px 的全大写小标签,这个对比本身就是设计。中间再加三档只会把它磨平。

把这套固化成一个 `PageHeader` 组件(eyebrow + 大标题 + 小号元信息),
每页都用它,不允许各页自己写标题样式。

### 4. 组件从 token 拼,样式分两层

- **跨页复用的排版类**(`.display-1` `.eyebrow` `.label` `.mono-chip` `.field-label`)
  → `styles/global.css`,全局可用
- **只属于某个页面/组件的布局** → 同目录的 `X.module.css`

判据很简单:**第二个地方要用到了,就往 global 提**。在页面里第二次复制粘贴同一段
标签样式时,就是该提的时候。

层级要**换手法**,不要同一手法调强度:一级导航用「描边 + 微亮底」,二级用「实心高亮」。
两级都用实心块的话,视线分不出主次,加大色差也救不回来。

### 5. 可用性底线,写完对一遍

- `@media (prefers-reduced-motion: reduce)` 全局把动效降到 0.001ms
- 装饰层 `aria-hidden="true"` + `pointer-events: none`
- 焦点统一:`border-color: var(--accent)` + 3px 的半透明 ring,**不要 `outline: none` 了事**
- `:disabled` 用 `opacity: 0.4` + `cursor: not-allowed`
- 数字(时间码、计数、图表刻度)加 `font-variant-numeric: tabular-nums`,否则会跳
- 动效只用来表达状态:加载中的呼吸、按下的 `scale(0.98)`。**纯装饰的动画一律不加**

### 6. 每个非显然的取舍留一段注释

这一步是这套方法真正省时间的地方。注释写三件事:**为什么这么选、代价是什么、想改回去改哪一行**。

```css
/*
  --font-mono 现在也是衬线体(按「UI 全部改 Serif」的要求)。代价是数字不再等宽,
  图表刻度、时间码这些地方会参差 —— DOM 里靠 font-variant-numeric: tabular-nums
  补救,canvas 里补救不了。
  觉得不合适时把这一行改回 "IBM Plex Mono", ui-monospace, monospace 即可,
  其余代码全都引用 token,不用动。
*/
```

半年后回来看,没有这段注释就只能重新试一遍。

## 反默认自查 / Anti-default check

写完对一遍。命中任何一条,说明那里取的是默认值,重挑:

- [ ] 配色是纯黑 + 荧光绿 / 暖白 + 赤陶 / 紫蓝渐变
- [ ] 字体是 Inter(或系统默认)配一个没指定的等宽
- [ ] 全站一个圆角值
- [ ] 阴影是 `0 4px 12px rgba(0,0,0,0.1)`
- [ ] 主色是 `#3b82f6` 或它的近邻
- [ ] 说不出任何一支颜色为什么是这个值

## 中文界面的字体 / CJK typography

界面以中文为主时,**只换拉丁字体等于没换** —— 中文会掉到系统默认(macOS 上是黑体系),
一衬线一无衬线,界面立刻割裂。

- 拉丁与 CJK **成对引入**,字体栈里 CJK 排在拉丁之后(浏览器按字形覆盖逐字回退)
- CJK 字重**只引实际用到的两档**。`@fontsource` 的中文包按 unicode-range 切成上百个分片,
  每多一档,产物 CSS 就多几十 KB —— 而 CSS 阻塞渲染。中间档(500)交给浏览器回退到 400,
  中文场合看不出差别
- 中文没有小型大写和真正的斜体,`text-transform: uppercase` 那套只对拉丁标签有效

## 输出格式 / Output

一次给完,别分三轮问:

````markdown
**视觉主张**:<一句话,含那个具体意象>

**Token**(粘进 `styles/global.css` 的 `:root`)

```css
<完整的一版,每支带注释>
```

**排版尺度**

<表格:类名 / 字号 / 字重 / 字距 / 用在哪>

**示范组件**:<挑一个最能体现这套语言的,给完整代码>

**我替你定了的**
- <取舍 1 + 代价 + 怎么改回去>
- <取舍 2>
````

## 边界 / Boundaries

- **不装 UI 框架来跳过这一步**。除非使用者明确要求,不要为了"快"引入 Tailwind / MUI /
  shadcn —— 那等于把视觉决定交给框架默认值,正好是这个技能要解决的问题。
- **不改业务逻辑**。只动样式、类名和纯展示组件;发现逻辑问题就说出来,别顺手改。
- **不为了好看牺牲可读性**。正文对比度不足、点击区小于 40px、焦点态看不见,
  这些没有商量余地。
- **不编造品牌资产**。项目已有 logo、图标或既定色时,围着它们定,不要另起一套。
- **不一次改完全站**。先在一个页面上把这套语言坐实,跑起来看过,再铺开。
- **不写"现代、简洁、优雅"这类词**当作设计说明 —— 说不出具体值就是还没想清楚。

## Token 控制 / Token discipline

- 第一步只读 README 的项目定位段 + 现有 `global.css` + **一个**代表性页面,
  不通读全部组件。视觉语言是从项目定位推出来的,不是从组件清单里归纳出来的。
- 需要 MaestrWave 的完整实例(token 表、层级手法、注释样例)时再读
  `references/maestrwave-example.md`,别默认加载。
- 改定后只贴改动的那几行,不重贴整份 CSS。

## 变更记录 / Changelog

| 版本 | 日期 | 变更 | 类型 |
|---|---|---|---|
| 0.1.1 | 2026-09-26 | 参考实例里 `.field-label` 的 ink 比例随 maestrwave-ui-system 由 48% 改为 52%(48% 在 11px 时对比度不到 AA 4.5:1),两边保持逐项一致 | patch |
| 0.1.0 | 2026-08-10 | 初始草稿,方法总结自 MaestrWave 前端 | minor |

Files in this skill

  • SKILL.md9.7 KB
  • references/maestrwave-example.md7.3 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.