mcpField
M
material-design-3-color

material-design-3-color

github.com/shelbeely设计与 UI536 次安装36 周前更新
代码仓库

关于 material-design-3-color

为 UI 设计与开发提供 Material Design 3 Expressive 色彩和主题实践指南,涵盖动态配色、语义令牌及无障碍对比度,并附 CSS 令牌和示例资源。

主要功能

  1. 01五组色调调色板与语义色彩角色
  2. 02浅色与深色主题建议
  3. 03固定强调色和表面容器层级
  4. 04标准、中、高三档对比度指导
  5. 05CSS 色彩令牌及示例资源

适用场景

  1. 01为界面建立一致的 M3 色彩令牌
  2. 02根据来源颜色规划动态配色
  3. 03检查文本和交互元素的对比度

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/shelbeely/shelbeely-agent-skills --skill material-design-3-color

安装后在 Claude Code 中输入/material-design-3-color确认已加载。

附带文件examples/color-roles.svgtokens.css

详细介绍

Material Design 3 色彩与动态主题

概述

本技能将指导你运用 Material Design 3(M3)的表现力色彩与主题原则,打造鲜明、易于访问且能引发情感共鸣的用户界面。

关键词:Material Design 3、M3、动态色彩、主题、调色板、Material You、无障碍性、色彩令牌、表面颜色、强调色、固定强调色、强调颜色、对比度级别

核心原则

动态色彩系统

Material Design 3 的色彩系统基于动态色彩的概念构建,使界面能够适应用户偏好和使用情境:

  1. 色调调色板:使用五种关键色调调色板(主色、次色、第三色、中性色、中性变体),每种调色板包含多个色调(0-100)
  2. 颜色角色:将 26 种以上的颜色角色映射到 UI 元素(例如 primary、onPrimary、primaryContainer、onPrimaryContainer)
  3. 自适应主题:支持浅色和深色主题,并提供适当的对比度
  4. 用户个性化:允许配色方案根据用户壁纸或偏好进行调整(Material You)
  5. 固定强调色:提供在浅色和深色主题中保持一致的颜色令牌,以维护品牌形象
  6. 强调颜色:对关键 UI 元素使用更大胆、更鲜明的颜色角色,以提高明晰度并增强情感共鸣
调色板结构

创建调色板时,请遵循以下结构:

主色调色板(主要品牌色):

  • 主色:主要交互元素(按钮、激活状态)
  • 主色上的颜色:主色上的文本/图标
  • 主色容器:关键组件醒目的填充色
  • 主色容器上的颜色:主色容器上的文本/图标
  • 固定主色:在浅色和深色主题中保持不变
  • 固定主色上的颜色:固定主色上的文本/图标
  • 固定主色暗色变体:用于固定表面次级强调的暗色变体

次色调色板(互补强调色):

  • 次色:不那么突出的组件
  • 次色上的颜色:次色上的文本/图标
  • 次色容器:带色调的背景
  • 次色容器上的颜色:次色容器上的文本/图标
  • 固定次色:在浅色和深色主题中保持不变
  • 固定次色上的颜色:固定次色上的文本/图标
  • 固定次色暗色变体:用于固定表面的暗色变体

第三色调色板(对比强调色——如今是品牌塑造和突出显示中醒目的表现性强调色):

  • 第三色:对比强调色和突出色
  • 第三色上的颜色:第三色上的文本/图标
  • 第三色容器:输入元素
  • 第三色容器上的颜色:第三色容器上的文本/图标
  • 固定第四色:在浅色和深色主题中保持不变
  • 固定第四色上的颜色:固定第四色上的文本/图标
  • 固定第四色暗色变体:用于固定表面的暗色变体

中性色调色板(表面和背景):

  • 表面:组件的默认背景
  • 表面上的颜色:表面上的文本
  • 表面变体:备用表面颜色
  • 表面变体上的颜色:表面变体上的文本
  • 暗色表面:用于降低强调程度的暗色表面
  • 亮色表面:用于提高强调程度的亮色表面
  • 最低层级表面容器:强调程度最低的容器表面
  • 低层级表面容器:强调程度较低的容器表面
  • 表面容器:默认容器表面
  • 高层级表面容器:强调程度较高的容器表面
  • 最高层级表面容器:强调程度最高的容器表面
  • 轮廓:边框和分隔线
  • 轮廓变体:装饰元素
  • 反转表面:用于对比元素(例如,Snackbars)的反转表面
  • 反转表面上的颜色:反转表面上的文本
  • 反转主色:用于反转表面的主色

错误/警告/成功(反馈颜色):

  • 错误、警告、成功,以及对应的“其上”颜色和容器
无障碍指南
  1. 对比度级别(M3 Expressive 标准化了三个级别):

    • 标准:适用于大多数用户的默认对比度
    • 中等:增强对比度,提升可读性
    • 高:为低视力用户或偏好高对比度的用户提供最大对比度
    • 三个级别均已令牌化,便于实现
  2. 对比度要求:

    • 文本对比度:正文文本至少为 4.5:1,大号文本至少为 3:1(WCAG AA)
    • 交互元素:与背景的对比度至少为 3:1
    • 使用 “On” 颜色确保对比度适当
  3. 颜色独立性:

    • 绝不要仅依赖颜色传达信息
    • 除颜色外,还要搭配图标、文本标签或图案
    • 确保颜色组合对色盲用户友好
  4. 动态范围:

    • 浅色主题:表面使用较高色调(90-99),强调内容使用较低色调(10-40)
    • 深色主题:表面使用较低色调(10-20),强调内容使用较高色调(80-90)

实现指南

颜色令牌系统

所有颜色都使用 CSS 自定义属性(变量)。M3 Expressive 引入了 26 种以上颜色角色:

:root {
  /* Primary */
  --md-sys-color-primary: #6750A4;
  --md-sys-color-on-primary: #FFFFFF;
  --md-sys-color-primary-container: #EADDFF;
  --md-sys-color-on-primary-container: #21005D;
  
  /* Primary Fixed (consistent across themes) */
  --md-sys-color-primary-fixed: #EADDFF;
  --md-sys-color-on-primary-fixed: #21005D;
  --md-sys-color-primary-fixed-dim: #D0BCFF;
  --md-sys-color-on-primary-fixed-variant: #4F378B;
  
  /* Secondary */
  --md-sys-color-secondary: #625B71;
  --md-sys-color-on-secondary: #FFFFFF;
  --md-sys-color-secondary-container: #E8DEF8;
  --md-sys-color-on-secondary-container: #1D192B;
  
  /* Secondary Fixed */
  --md-sys-color-secondary-fixed: #E8DEF8;
  --md-sys-color-on-secondary-fixed: #1D192B;
  --md-sys-color-secondary-fixed-dim: #CCC2DC;
  --md-sys-color-on-secondary-fixed-variant: #4A4458;
  
  /* Tertiary */
  --md-sys-color-tertiary: #7D5260;
  --md-sys-color-on-tertiary: #FFFFFF;
  --md-sys-color-tertiary-container: #FFD8E4;
  --md-sys-color-on-tertiary-container: #31111D;
  
  /* Tertiary Fixed */
  --md-sys-color-tertiary-fixed: #FFD8E4;
  --md-sys-color-on-tertiary-fixed: #31111D;
  --md-sys-color-tertiary-fixed-dim: #EFB8C8;
  --md-sys-color-on-tertiary-fixed-variant: #633B48;
  
  /* Surface and Surface Containers */
  --md-sys-color-surface: #FEF7FF;
  --md-sys-color-on-surface: #1D1B20;
  --md-sys-color-surface-variant: #E7E0EC;
  --md-sys-color-on-surface-variant: #49454F;
  --md-sys-color-surface-dim: #DED8E1;
  --md-sys-color-surface-bright: #FEF7FF;
  --md-sys-color-surface-container-lowest: #FFFFFF;
  --md-sys-color-surface-container-low: #F7F2FA;
  --md-sys-color-surface-container: #F3EDF7;
  --md-sys-color-surface-container-high: #ECE6F0;
  --md-sys-color-surface-container-highest: #E6E0E9;
  
  /* Inverse */
  --md-sys-color-inverse-surface: #322F35;
  --md-sys-color-inverse-on-surface: #F5EFF7;
  --md-sys-color-inverse-primary: #D0BCFF;
  
  /* Outlines */
  --md-sys-color-outline: #79747E;
  --md-sys-color-outline-variant: #CAC4D0;
  
  /* Error */
  --md-sys-color-error: #B3261E;
  --md-sys-color-on-error: #FFFFFF;
  --md-sys-color-error-container: #F9DEDC;
  --md-sys-color-on-error-container: #410E0B;
  
  /* Scrim and Shadow */
  --md-sys-color-scrim: #000000;
  --md-sys-color-shadow: #000000;
}

[data-theme="dark"] {
  /* Primary */
  --md-sys-color-primary: #D0BCFF;
  --md-sys-color-on-primary: #381E72;
  --md-sys-color-primary-container: #4F378B;
  --md-sys-color-on-primary-container: #EADDFF;
  
  /* Primary Fixed (same as light — these don't change) */
  --md-sys-color-primary-fixed: #EADDFF;
  --md-sys-color-on-primary-fixed: #21005D;
  --md-sys-color-primary-fixed-dim: #D0BCFF;
  --md-sys-color-on-primary-fixed-variant: #4F378B;
  
  /* Secondary */
  --md-sys-color-secondary: #CCC2DC;
  --md-sys-color-on-secondary: #332D41;
  --md-sys-color-secondary-container: #4A4458;
  --md-sys-color-on-secondary-container: #E8DEF8;
  
  /* Secondary Fixed (same as light) */
  --md-sys-color-secondary-fixed: #E8DEF8;
  --md-sys-color-on-secondary-fixed: #1D192B;
  --md-sys-color-secondary-fixed-dim: #CCC2DC;
  --md-sys-color-on-secondary-fixed-variant: #4A4458;
  
  /* Tertiary */
  --md-sys-color-tertiary: #EFB8C8;
  --md-sys-color-on-tertiary: #492532;
  --md-sys-color-tertiary-container: #633B48;
  --md-sys-color-on-tertiary-container: #FFD8E4;
  
  /* Tertiary Fixed (same as light) */
  --md-sys-color-tertiary-fixed: #FFD8E4;
  --md-sys-color-on-tertiary-fixed: #31111D;
  --md-sys-color-tertiary-fixed-dim: #EFB8C8;
  --md-sys-color-on-tertiary-fixed-variant: #633B48;
  
  /* Surface and Surface Containers */
  --md-sys-color-surface: #141218;
  --md-sys-color-on-surface: #E6E0E9;
  --md-sys-color-surface-variant: #49454F;
  --md-sys-color-on-surface-variant: #CAC4D0;
  --md-sys-color-surface-dim: #141218;
  --md-sys-color-surface-bright: #3B383E;
  --md-sys-color-surface-container-lowest: #0F0D13;
  --md-sys-color-surface-container-low: #1D1B20;
  --md-sys-color-surface-container: #211F26;
  --md-sys-color-surface-container-high: #2B2930;
  --md-sys-color-surface-container-highest: #36343B;
  
  /* Inverse */
  --md-sys-color-inverse-surface: #E6E0E9;
  --md-sys-color-inverse-on-surface: #322F35;
  --md-sys-color-inverse-primary: #6750A4;
  
  /* Outlines */
  --md-sys-color-outline: #938F99;
  --md-sys-color-outline-variant: #49454F;
  
  /* Error */
  --md-sys-color-error: #F2B8B5;
  --md-sys-color-on-error: #601410;
  --md-sys-color-error-container: #8C1D18;
  --md-sys-color-on-error-container: #F9DEDC;
  
  /* Scrim and Shadow */
  --md-sys-color-scrim: #000000;
  --md-sys-color-shadow: #000000;
}
固定强调色

固定强调色是 M3 Expressive 中新增的功能。它们在浅色和深色主题中保持相同的值,适用于品牌标识元素:

/* Fixed colors remain identical in both themes */
.brand-banner {
  background-color: var(--md-sys-color-primary-fixed);
  color: var(--md-sys-color-on-primary-fixed);
}

.brand-accent {
  background-color: var(--md-sys-color-tertiary-fixed);
  color: var(--md-sys-color-on-tertiary-fixed);
}

/* Fixed Dim for secondary emphasis on fixed surfaces */
.brand-banner-secondary {
  background-color: var(--md-sys-color-primary-fixed-dim);
  color: var(--md-sys-color-on-primary-fixed);
}
对比度级别系统

M3 Expressive 标准化了三个无障碍对比度级别:

/* Standard contrast (default) */
:root {
  --md-sys-color-contrast-level: 0;
}

/* Medium contrast */
[data-contrast="medium"] {
  --md-sys-color-primary: #5640A0;
  --md-sys-color-on-primary: #FFFFFF;
  --md-sys-color-primary-container: #7B68BA;
  --md-sys-color-on-primary-container: #FFFFFF;
}

/* High contrast */
[data-contrast="high"] {
  --md-sys-color-primary: #2D0F6E;
  --md-sys-color-on-primary: #FFFFFF;
  --md-sys-color-primary-container: #4E3A87;
  --md-sys-color-on-primary-container: #FFFFFF;
}
颜色应用
  1. 交互元素:

    • 填充按钮:使用 primary 颜色和 on-primary 文本
    • 描边按钮:使用 outline 和 primary 文本
    • 文本按钮:仅使用 primary 文本
    • FAB:使用 primary-container 和 on-primary-container
    • 按钮组:使用 surface-container 和 on-surface 文本
  2. 表面和容器:

    • 主背景:surface
    • 高起组件(卡片、对话框):surface-container 变体
    • 输入框:surface-container-highest
    • Snackbars:使用 inverse-surface,并搭配 inverse-on-surface 文本
    • 底部面板:surface-container-low
  3. 状态层:

    • 悬停:应用 on-surface 的 8% 不透明度层
    • 焦点:应用 on-surface 的 12% 不透明度层
    • 按下:应用 on-surface 的 12% 不透明度层
    • 拖动:应用 on-surface 的 16% 不透明度层
  4. 强调和品牌:

    • 对于必须保持一致的品牌元素,使用固定强调色
    • 通过颜色饱和度和对比度来强调,而不仅仅依靠色相
    • 将 tertiary 用作富有表现力的强调色,适用于引导流程、重点内容和品牌塑造
动态颜色生成

从源颜色生成配色方案时:

  1. 提取核心色相:识别源颜色(例如用户壁纸)中的主导色相
  2. 生成色调调色板:使用 HCT(Hue、Chroma、Tone)颜色空间创建五组色调调色板
  3. 分配颜色角色:将生成的色调映射到语义颜色角色(26 种以上)
  4. 生成固定变体:创建在不同主题中保持不变的固定强调色
  5. 生成表面容器:创建五级表面容器层级
  6. 生成对比度变体:生成标准、中等和高对比度版本
  7. 验证对比度:确保所有角色对均符合无障碍要求
  8. 支持主题:生成浅色和深色两种变体
最佳实践
  1. 语义化命名:始终使用语义化颜色令牌(例如 primary、error),而非字面颜色(例如 blue、red)
  2. 一致应用:在所有组件中一致地应用颜色
  3. 高程着色:使用低不透明度的主色,为高程表面添加微妙的色调
  4. 颜色层级:主色用于主要操作,次色用于较不重要的操作,第三色用于富有表现力的点缀
  5. 测试两种主题:始终在浅色和深色模式下测试
  6. 鲜明表达:在 M3 Expressive 中,采用更丰富、更鲜明的颜色,同时保持无障碍性
  7. 关注上下文:根据应用上下文和用户偏好调整颜色强度和调色板
  8. 使用固定颜色进行品牌标识:为徽标颜色或主题间必须保持不变的元素使用固定强调色令牌
  9. 支持对比度级别:实现标准、中等和高对比度变体,以满足无障碍需求
  10. 表面容器层级:使用五个表面容器级别,营造清晰的视觉深度

工具和资源

应避免的常见问题

  1. ❌ 硬编码颜色值,而不使用令牌
  2. ❌ 所有状态都只使用一种颜色(没有悬停、焦点、按下状态的变体)
  3. ❌ 忽略深色主题,或将其视为事后补充
  4. ❌ 文本与背景之间的对比度不足
  5. ❌ 过度使用强调色(应仅少量用于突出重点)
  6. ❌ 未使用用户实际生成的配色方案进行测试
  7. ❌ 仅依赖颜色来传达状态或信息
  8. ❌ 忘记为品牌元素定义固定强调色
  9. ❌ 未实现多个对比度级别以满足无障碍需求
  10. ❌ 使用表面,而非适当的表面容器变体

颜色实现检查清单

实现 M3 颜色系统时,请确保:

  • 已定义全部五种色调调色板(主色、次要色、第三色、中性色、中性色变体)
  • 已实现浅色和深色主题
  • 所有颜色对均符合 WCAG 对比度要求
  • 全程使用语义颜色令牌(不硬编码十六进制值)
  • 已使用适当的不透明度实现状态层(悬停、焦点、按下)
  • 已为抬高的表面应用高程色调
  • 可根据用户源颜色动态生成配色方案
  • 所有组件都一致地使用颜色角色
  • 颜色不是状态或信息的唯一指示方式
  • 已为品牌元素定义固定强调色(固定主色、固定次要色、固定第三色)
  • 已实现表面容器层级(从最低到最高)
  • 已为对比度元素(消息栏、工具提示)定义反转颜色
  • 支持三种对比度级别(标准、中等、高)
  • 已定义遮罩和阴影令牌
  • 文档包含颜色令牌参考和使用指南

评论

支持 Markdown