# 颜色公式

颜色是**不靠手工挑选的**。每个图表颜色恰好执行四种工作之一，调色板只有在通过六项检查时才合法。这些检查就是产品——它们是使调色板安全可更改的原因，也是让同一方法在任何设计系统的色阶上运行的原因。

## 四种工作

| 工作 | 它编码什么 | 结构 |
|---|---|---|
| **分类** | 身份（哪个系列） | 8 个色调，固定顺序，按序列分配，永不循环 |
| **有序** | 序列中的位置（漏斗阶段、层级、桶） | 一个色调，单调明度步进；亮端仍在表面上 ≥ 2:1 |
| **顺序** | 大小（多少） | 一个色调，步进 100→700，浅→深；在暗模式下翻转锚点 |
| **发散** | 极性（基线的哪一侧） | 两个色调 + 一个中性灰中点；每臂等量步进 |
| **状态** | 状态（良好→严重） | 小型固定标尺，保留含义，始终 icon+label |

**分类或有序？** 如果交换类别顺序会改变含义——漏斗阶段、尺寸层级（S/M/L）、年龄段、队列桶——它是**有序**的，采用单色调标尺，让读者从颜色中看到顺序。如果交换不会——产品名称、团队、区域、端点——它是**名义分类**的，每个条采用*相同*的槽位-1 色调（一个系列，因此无图例框——标题为其命名），当有 N 个独立系列时使用槽位 1..N。永远不要按其值为名义条着色：那将身份通道花费在条长已经显示的信息上。

## 六项检查

每种分类颜色——当前或提议的——必须通过全部六项。

1. **固定色调锚点。** 八个家族按固定顺序。顺序是 CVD 安全机制；它永不改变。*（结构性的——强制执行，不通过测量）*
2. **每种模式的明度带。** OKLCH L ≈ 0.43–0.77 亮；≈ 0.48–0.67 暗。*（验证器）*
3. **色度下限。** OKLCH C ≥ ~0.10 ——低于它，色调读作灰色且停止身份识别工作。*（验证器）*
4. **CVD 分离。** Machado-2009 ΔE ≥ 12 目标 / ≥ 8 下限（下限仅在具有第二编码时合法），在红色盲和绿色盲下。*相邻*对用于堆叠/条/线（只有邻居接触——分配永不跳过）；**所有对用于散点、气泡、choropleth 和小倍数**，其中任意两个标记可以并排——在那里传递 `--pairs all`，否则真实的崩塌保持隐藏。*（验证器）*
5. **对比度 vs 表面。** ≥ 3:1 用于标记；在值可以通过其他方式读取时有条件放宽（可见标签或表格视图）。*（验证器）*
6. **仅记录在案的调色板。** 每个槽位是来自实例文件的十六进制（`palette.md` 或其等价物）——没有凭眼力的值。*（结构性；对于客户的色阶，对齐到最近——见下）*

## 运行检查——永远不要凭眼力判断

```
node scripts/validate_palette.js \
  "#2a78d6,#1baf7a,#eda100,#008300,#4a3aa7,#e34948,#e87ba4,#eb6834" --mode light
```

（`scripts/` 相对于此技能的基础目录，在提示顶部显示。）

（或在图表自己的页面中将其加载为 `<script type="module">`——它读取 `<body>` 上的 `data-palette` 并记录 `console.table` 报告）

报告每个可计算检查（2–5），包含 PASS / WARN / FAIL 加上最差的 CVD 对。退出码 0 = 没有硬 FAIL（WARN 带——下限带 CVD 8–12 和低于 3:1 对比度减免——仍然退出 0 并要求第二编码）；任何 FAIL 退出 1。每种模式运行一次（`--mode dark --surface "#1a1a19"`），并对散点/气泡/地图/小倍数图表添加 `--pairs all`（其中任意两个标记可以相邻——默认相邻检查会隐藏崩塌）。对于**有序**标尺传递 `--ordinal`——它切换到标尺检查（单调 L、相邻 ΔL ≥ 0.06、亮端对比度 ≥ 2.0:1、单色调）而非分类六项。CVD 上的 WARN（8–12 下限）仅在你也提供第二编码（直接标签、间隙或纹理）时才合法。对比度上的 WARN **不可忽略**——它要求减免通道（可见直接标签或表格视图）；两者都没有就发布低于 3:1 的填充是失败。

**范围——验证器涵盖和不涵盖什么。** 这六项检查验证一个*分类*调色板（系列身份）。它们**不**判断单个状态/文本颜色或顺序标尺。对于单个状态或文本颜色，运行 WCAG *文本*对比度检查（4.5:1 正常，3:1 大）——`validate_palette.js` 为此目的导出 `contrast(a, b)`。对于顺序/发散，检查是跨标尺的明度单调性，而非相邻 CVD——在顺序标尺上运行分类验证器**将按设计 FAIL**（它跨越带；步进紧密），这是预期的，不是真正的失败；不要"修复"一个好的标尺来满足它。

## 对齐到通过（任何设计系统）

给定客户的色阶和一个期望的顺序：
1. 为每个槽位，选择其 OKLCH L 位于模式带内且 C ≥ 下限的步骤。
2. 运行验证器。对于任何相邻对低于 ΔE 12，微调一个槽位 ± 一步（保持其色调，移动其明度）并重新运行。
3. 重复直到最差相邻对通过下限。功能保留，客户的色调保持。

## 主题

槽位**顺序**是一个可分离的、具名的选择——一个*主题*——在相同的色调和相同的六项检查上。每个设计系统命名一个默认顺序和任何备选；交换主题在不触碰方法的情况下调整情绪。一个表面采用一个主题并冻结它；永不在一个仪表盘内混合主题。（见 `palette.md`。）

**当系统尚无主题时推导顺序：** 不要猜测。枚举系统色调的候选排序，对每个运行验证器，并选择最大化*最小相邻* CVD ΔE 的那个。（通过色调家族类比从一个已知良好的顺序播种，然后优化，是可以的——这正是 `palette.md` 中默认值推导的方式。）

## 状态是固定的

状态从不跟随主题——它是一个小型固定标尺（良好 → 警告 → 严重 → 关键），具有保留含义，步骤刻意与分类槽位不同，使状态颜色从不会冒充系列，并始终与图标 + 标签配对（在亮表面上，警告和严重设计上低于 3:1——配对是缓解措施）。（具体步骤在 `palette.md` 中。）碰撞规则：当一个系列*意味着*好/坏（错误率、通过/失败）时，它穿戴状态令牌；当它只是"系列 4"时，它穿戴分类——永不在一个图表中同时使用。
