设计令牌

概念·design-tokens

src/styles/tokens.css。三层结构:

primitive  → 原始值。组件永不直接引用
semantic   → 按用途引用 primitive。组件只引用这一层
component  → 只在某个组件内有意义的派生值

为什么分三层:要换配色时只动 primitive;要换暗色模式时只动 semantic 的映射。 如果组件里直接写 color: #002FA7,上面两件事都得全库搜索替换, 而且一定会漏掉几处,于是暗色模式下出现一块刺眼的亮蓝。

命名描述用途而非外观:--color-accent 而不是 --color-blue。 这样把强调色从克莱因蓝换成别的时,名字不用改。

配色怎么定的#

一个强调色,其余全是中性灰。

强调色取 International Klein Blue(#002FA7)——它是那个年代的产物, 与国际主义风格同源,不是随手挑的「好看的蓝」。

刻意避开的两个配色族:

  • 紫蓝渐变——AI 生成页面的第一识别特征
  • 米色/奶油底 + 黄铜/陶土 + 浓咖啡近黑——这个更隐蔽, 因为它看起来「有品味」。但它已经成了 2026 年可识别的默认值, 换成它只是把默认值换了个届,不是去 AI 味

亮暗不是反转#

暗色模式不是把亮色反过来:反转会让层级关系也翻过来 (原本的「抬升」变成「下沉」)。这里按表面亮度表达层级重新排: 画布最暗(#09090B)、卡片略亮(#131316),靠亮度差而非阴影建立纵深。

强调色在暗色下也不是同一个值:#002FA7 放到深色底上对比度只有约 2:1, 读不了。暗色下用提亮版 #6B91FF。

间距用 4 单位基数#

不是只用 8。因为 8 的刻度缺少中间步——想做「比 16 紧一点、但比 8 松」 的节奏时没有可用值,于是只能写一次性数值,节奏就散了。

圆角:全直角#

瑞士风格的一致性锁:要么全用一套,要么不用。 混用(胶囊按钮 + 方卡片)是坏设计,除非有写下来的规则说明为什么。

相关#

已复核 · 2026-09-24

「已复核」指有人在上面那个日期读过这一页并确认了当时的正文。它不表示内容一定正确,也不表示每条引用的原文都逐句支持了这里的结论—— 后者只能由人判断。正文在那之后若被改动,复核会自动失效,构建会拦下来。

这一页也有 markdown 版本:/letterpress/wiki/design-tokens.md
直接打开上面的 .md 链接即可读取;在支持内容协商的部署平台上, 也可以对页面 URL 发送 Accept: text/markdown。