跳到主要内容
menumenu tanreiexpand_morecontrasttranslate
tanreiexpand_more
开始使用WebReactSwiftUIJetpack ComposeFlutterReact Native预设你自己的设计系统与 AI 代理一起使用 Tanrei品牌设计令牌设计系统与定制Theme Studio颜色字体排印图标形状层级动效交互状态行为布局无障碍文字颜色令牌字阶令牌形状令牌层级令牌动效令牌状态令牌间距与度量令牌组件按钮主操作按钮分段按钮按钮组带菜单的按钮工具栏复制按钮复选框单选按钮开关纸片(Chip)菜单滑块滑块字段日历DateTimePicker字段组单选组复选框组下拉选择框下拉选择字段菜单栏文件上传文件选择器 进阶放置区文本输入框 进阶文本字段纸片字段字段组合框 进阶组合框字段数字输入框 进阶数字字段颜色输入框 进阶颜色字段一次性验证码输入框 进阶一次性验证码字段嵌入式文本输入框 进阶聊天输入栏卡片分隔线模态层 进阶对话框列表列表行底部面板侧边面板轮播代码块表格弹出框步骤折叠面板描述列表图示应用外壳页头树视图时间线图片预览调整手柄可调整大小的框滚动区域徽标进度指示器计量条数字滚动器加载指示器消息条(Snackbar)工具提示键盘快捷键标签(Tag)行内代码提示块(Callout)头像空状态标签组(Tag group)骨架屏文件项色块跑马灯文本标签页标签页视图应用栏导航栏导航抽屉搜索链接分页上一页/下一页链接步骤条面包屑目录链接卡片FAB 菜单状态Tanrei 是如何构建的参与贡献许可与致谢
首页基础颜色

颜色

颜色角色、单色的主色、唯一的强调色,以及每个配色方案如何生成和校验。

content_copy以 Markdown 格式查看

Tanrei 从不让组件自己挑选颜色。组件请求的是一个角色,例如 primary 或 surface-container,由当前生效的主题决定用哪种颜色来充当这个角色。角色由 Tanrei 的词汇定义,它们的值则由各个设计系统的层给出。

角色

  • 意图: primary、secondary,以及四个状态意图 error、success、warning 和 info。每个意图都是四个一组:颜色本身、用于其上内容的 on- 颜色、更低调的 -container,以及 on-…-container。
  • 表面: surface,从 surface-container-lowest 到 surface-container-highest 的五级阶梯,以及 surface-dim 和 surface-bright。任何表面上的内容都使用 on-surface,或更低调的 on-surface-variant。
  • 轮廓: outline 和 outline-variant(见下文)。
  • 反色角色,用于有意翻转主题的元素,例如消息条。
  • 固定角色,在浅色和深色下保持相同的色调。
  • 辅助: scrim、shadow、focus-ring,以及层级所用的圆环和阴影颜色。

填充色一定要与它自己的 on- 角色搭配使用。对比度检查所保证的,正是这种搭配。

单色的主色

在默认主题中,primary 在浅色模式下接近黑色,在深色模式下接近白色。因此,屏幕上最重要的操作就是对比度最高的那个对象,而且它绝不会与产品自身的颜色相争。secondary 是一种更柔和的中性色,用于辅助性的操作。

只有一个强调色,且要少用

强调色不属于核心词汇。它是默认的 Tanrei 系统声明的一个调色板(种子色为 #30a3f0),声明之后,它就拥有与任何意图相同的四个角色:accent、on-accent、accent-container、on-accent-container。核心角色 focus-ring 从它取色,此外再没有别的角色用它:在默认系统中,link 取主色的颜色,链接靠下划线与旁边的文本区分开来。产品也用同样的方式声明自己的调色板,例如不允许被重新计算的品牌色,或者测验中的“正确”与“错误”;模仿 Material Design 3 的预设也是这样声明 tertiary 的,而不是由 Tanrei 替所有人保留这个位置。不要用强调色来做装饰:当一切都是蓝色时,就没有什么能被注意到了。

outline 与 outline-variant

这两个轮廓角色看起来相似,作用却正好相反。

角色 用途 对比度
outline 功能性边界:它是表明控件所在位置的唯一依据,例如空的文本字段、未选中的复选框或 outlined 按钮。 相对于每个表面角色至少为 3:1
outline-variant 装饰性细线:分隔线、卡片边框、层级的圆环。去掉它不得隐藏任何信息。 标准对比度下没有要求,此时它是低透明度的黑色或白色。在中对比度下至少为 3:1,在高对比度下至少为 4.5:1,相对于每个表面角色而言,并且始终弱于 outline

警告

如果边框是表明控件存在的唯一线索,就必须使用 outline。透明度为 8% 的细线看着舒服,但很多人根本看不见它。

对比度级别

每个主题都有三个对比度级别。标准是默认级别。中和高会把内容角色推向两端,并同时加强两个轮廓角色。在 Web 上,prefers-contrast: more 时会自动应用高对比度;原生平台则遵循各自的系统设置。可以在这里试一试(开关作用于整个页面):

对比度

FilledTonalOutlinedText

配色方案如何生成

颜色不是手工挑选的。系统文件(tokens/systems/core.system.json)声明各个调色板:强调色和错误色各有一个种子色,中性色则给出色相和色度;它还以数据的形式写明,在浅色和深色的每个对比度级别下,每个角色取哪个调色板的哪个色调。构建时,生成器会:

  1. 使用 Apache-2.0 许可的 material-color-utilities 库,把每个关键色转换为 HCT 色彩空间中的色调调色板;在这个色彩空间里,色调与对比度之间的对应关系是可预测的;
  2. 把中性调色板的色度限制在主题规定的范围内,默认值为零,即纯灰色;
  3. 为浅色和深色的每个对比度级别下的每个角色分配一个色调;
  4. 把结果以 DTCG 文件的形式写入 tokens/generated/。

生成器的算法带有版本号(specVersion),因此对映射的修改是一次可以评审的、有意为之的变更,而不是所有颜色悄悄发生的偏移。

CI 中强制执行的不变式

对主题与对比度的全部六种组合,除非满足以下条件,否则令牌构建失败:

  • 每一对 (role, on-role) 达到 4.5:1,在两种高对比度方案中达到 7:1;
  • outline 相对于每个表面角色达到 3:1;
  • focus-ring 相对于绘制它的表面达到 3:1。

不得为了让构建通过而放宽阈值。角色和值的完整列表见颜色令牌参考。