# 44 个 Figma FLOAT 变量 —— 送 owner 看一眼的 diff（2026-09-01）
> **扫描面**：`figma-data/raw/variables.json` 里的 **44 个 Figma FLOAT 变量**（= 已生成 CSS 30 + 定案不出 token 14 + 待定名 0）

> ## ✅ 已结案（2026-09-01 下半场）—— owner 三问全部回完，30 个已接线
> | §C | 问的是 | owner 回复 | 落地 |
> |---|---|---|---|
> | 1 | `Basic Size/*` 不出 CSS token？ | **同意** | 14 个进 `variable-map.mjs` 的新表 `INTENTIONALLY_UNMAPPED`（⛔ 不是待办表，见那份文件的分工表）|
> | 2 | `Size/*` → `--size-*`？ | **同意** | 7 个已接进 CSS，`variables.css` 新开 `── Size ──` 块 |
> | 3 | `Module Width/*` → `--module-w-*`？ | **「是从 Figma 里面来的吗？如果是的话，那么 OK」** | 现取核实：9 条全是库里的 FLOAT 变量（id 段 `2566:34915` / `2599:5127*`，与 `Size/*` 同批）⇒ **条件成立**，已接线 |
>
> 连带 A 组（`Spacing/*` 8 + `Radius/*` 6）也已接线（名字本就不需要裁定）。⇒ **44 = 已生成 CSS 30 + 定案不出 token 14 + 待定名 0**，`UNMAPPED_PENDING` **已清空 = 那张表自己声明的终态**。
> **零视觉变化已机检**：逐行提取 `variables.css` 声明 diff ⇒ 0 个 token 值变了、0 个消失，只**新增** 16 个（`--size-*` 7 + `--module-w-*` 9，两族当前零消费方）。
> 📐 **owner 的视觉验收页**（每档用真实 CSS 值渲染）：<https://claude.ai/code/artifact/de0ad6b1-3503-4862-9752-fff08f303df3>
> ⚠️ **本文件下半部分的「今天的状态」与 §A/§B 描述的是接线前**，留作判据出处；**现取数字一律跑 §E 的命令**。

> **这份不是要一次裁定。** 方向 owner 当日已拍定，逐字是「**Figma 是真源，Code 是拿到 Figma
> 导出的数据后定义的**」，登记在 [`PROJECT_GOAL.md` §Token 架构](../../PROJECT_GOAL.md) 那条 ③。
> 要你看的只有一件事：**这 44 个变量在 code 侧该叫什么名字**（其中 20 个已经有名字、逐字对得上，
> 只有 30 个是新的）。⛔ 别把这份读成「要不要跟 Figma」——那个问题已经关了。
>
> **今天的状态**：44 个都已经进了 `figma-data/raw/variables.json`（Figma 真源的逐字镜像），
> 但**都还没有生成任何 CSS** —— 它们逐条具名挂在 `figma-sync/variable-map.mjs` 的
> `UNMAPPED_PENDING` 里。⇒ **本轮零视觉变化**，`src/tokens/variables.css` 实测零 diff。
>
> **数字别抄**：跑 `node figma-sync/variable-map.mjs` 每次自印现值。本文件写的是 2026-09-01 的读数。

---

## 一句话背景（为什么今天才看到这 44 个）

变量层的抓取从 **2026-04-22 起断了四个多月且不报错**（REST 那个端点要 Enterprise scope，
本账号是 Professional ⇒ 403，而 pipeline 把它 catch 掉只 warn 一行、SUMMARY 照打「✅ 全绿」）。
同一条链上还有第二个断点：`raw → normalized` **根本没接线**（normalize 读的是 normalized 自己）。
两个断点 2026-09-01 一起修完，抓取改走 `use_figma`（Plugin API 的执行面，无 plan 门槛）。
接通后第一次看到 live 是 **98 个变量**，而仓库快照里只有 54 个 —— 多出来的 44 个全是 FLOAT，
就是本文件这批。

**它们不是新加的**：Figma 里早就有（id 段 `2566:*` / `2599:*`），只是仓库这四个月看不见。

---

## A. 已有对应 token 的 20 个 —— 值**逐字相同**，改的只是「谁定义谁」

这两族在 code 侧已经有 1:1 的 token，且 **Figma 值与 code 现值一个字都不差**（机械核对，非目测）。
接进来之后，定义权从「手写在 `variables.css` 里」变成「从 Figma 同步下来」。**渲染结果不变。**

### A1 · `Spacing/*` → `--sp-*`（8 个，8/8 相同）

| Figma 变量 | Figma 值 | code token | code 现值 | |
|---|---|---|---|---|
| `Spacing/XXS` | 4 | `--sp-xxs` | 4px | ✅ |
| `Spacing/XS` | 8 | `--sp-xs` | 8px | ✅ |
| `Spacing/S` | 12 | `--sp-s` | 12px | ✅ |
| `Spacing/M` | 16 | `--sp-m` | 16px | ✅ |
| `Spacing/L` | 24 | `--sp-l` | 24px | ✅ |
| `Spacing/XL` | 32 | `--sp-xl` | 32px | ✅ |
| `Spacing/XXL` | 40 | `--sp-xxl` | 40px | ✅ |
| `Spacing/XXXL` | 56 | `--sp-xxxl` | 56px | ✅ |

### A2 · `Radius/*` → `--r-*`（6 个，6/6 相同）

| Figma 变量 | Figma 值 | code token | code 现值 | |
|---|---|---|---|---|
| `Radius/XS` | 2 | `--r-xs` | 2px | ✅ |
| `Radius/S` | 4 | `--r-s` | 4px | ✅ |
| `Radius/M` | 8 | `--r-m` | 8px | ✅ |
| `Radius/L` | 12 | `--r-l` | 12px | ✅ |
| `Radius/XL` | 16 | `--r-xl` | 16px | ✅ |
| `Radius/XXL` | 20 | `--r-xxl` | 20px | ✅ |

> `--r-xxl` 那条 code 侧带着一句注释：它 2026-06-12 从 `100px` 修回 `20px`，正是「照 Figma 改」的
> 一次先例。**接通后这类漂移会由管线自己发现**，不必再靠人撞见。

**⇒ A 组不需要你决定名字**，名字已经在用了。列在这里只是让你知道这 14 个会从「手写」变成「同步」。

---

## B. code 侧今天**没有**对应 token 的 30 个 —— 要你看名字

### B1 · `Basic Size/*`（14 个）—— 建议 **不单独出 CSS token**

| Figma 变量 | 值 | | Figma 变量 | 值 |
|---|---|---|---|---|
| `Basic Size/#2` | 2 | | `Basic Size/#32` | 32 |
| `Basic Size/#4` | 4 | | `Basic Size/#36` | 36 |
| `Basic Size/#8` | 8 | | `Basic Size/#40` | 40 |
| `Basic Size/#12` | 12 | | `Basic Size/#48` | 48 |
| `Basic Size/#16` | 16 | | `Basic Size/#56` | 56 |
| `Basic Size/#20` | 20 | | `Basic Size/#64` | 64 |
| `Basic Size/#24` | 24 | | `Basic Size/#80` | 80 |

**建议：不给它们 CSS 名字。** 理由：这一族是 Figma 内部的**原子阶梯**，`Spacing/*`、`Radius/*`、
`Size/*` 三族**全部是它的别名**（管线已把别名链解开后逐条核过：这三族 21 条里有 20 条别名到
`Basic Size/*`，唯一的例外是 `Size/L = 264` 直接写值）。给它们再出一套 `--basic-4` / `--basic-8`，
等于把同一个 `4px` 在 CSS 里放两个名字、用哪个都对 —— 那正是
[`working-principles.md` 原则 8](../../working-principles.md)（单一统一方法，不为分叉形式加规则）要防的。

> 📋 **顺带一条如实登记（不用你现在做什么）**：14 个里有 **2 个当前无人引用** ——
> `Basic Size/#36`（36）与 `Basic Size/#48`（48），没有任何 `Spacing/Radius/Size` 别名指向它们。
> 可能是备着的档位，也可能是留下的残余。**⛔ 我不建议删** —— 那是回头改已发布资产，撞
> 2026-09-01 的规则 ②；只是让你知道有这两条。

⇒ 它们留在 `raw/variables.json` 里当**别名解析的中间层**，不进 CSS。**要你确认的只有这一句：
「Basic Size 是内部阶梯、不对外暴露」这个理解对不对。**

### B2 · `Size/*`（7 个）—— 建议 `--size-*`

| Figma 变量 | 值 | 建议 code token | 备注 |
|---|---|---|---|
| `Size/XXXXS` | 16 | `--size-xxxxs` | |
| `Size/XXXS` | 24 | `--size-xxxs` | |
| `Size/XXS` | 32 | `--size-xxs` | code 侧现有 `--control-height-xxs: 32px`，值相同 |
| `Size/XS` | 40 | `--size-xs` | |
| `Size/S` | 64 | `--size-s` | |
| `Size/M` | 80 | `--size-m` | |
| `Size/L` | 264 | `--size-l` | ⚠️ **这一条不是别名**，是直接写的 264 |

命名依据：与已在用的 `--sp-*` / `--r-*` 同一范式（族前缀 + T 恤码，T 恤码逐字沿用 Figma 的），
[原则 2](../../working-principles.md) 说的「Vue 生态通行命名优先」在这里没有更通行的写法可用。
⛔ 没用 `--sz-*` 是因为 `--size-` 更好读，而这一族不像 `--sp-` 那样高频出现在每条 CSS 里。

**⚠️ 一个要你知道的联动**：接进来之后 `--control-height-xxs`（32px）与 `--size-xxs`（32）
是同一个值的两个名字。**本轮不动它** —— 归并是独立一件事，要逐个组件核，不该塞进这次接线里。

### B3 · `Module Width/*`（9 个）—— 建议 `--module-w-*`

| Figma 变量 | 值 | 建议 code token |
|---|---|---|
| `Module Width/XXS` | 200 | `--module-w-xxs` |
| `Module Width/XS` | 240 | `--module-w-xs` |
| `Module Width/S` | 280 | `--module-w-s` |
| `Module Width/M` | 320 | `--module-w-m` |
| `Module Width/L` | 360 | `--module-w-l` |
| `Module Width/XL` | 480 | `--module-w-xl` |
| `Module Width/XXL` | 680 | `--module-w-xxl` |
| `Module Width/XXXL` | 920 | `--module-w-xxxl` |
| `Module Width/XXXXL` | 1200 | `--module-w-xxxxl` |

> ⛔ **别把这一族读成 `--container-*` 的 Figma 来源，它们不是同一组值。**
> code 侧 `--container-narrow/prose/page/wide` = **720 / 840 / 1600 / 1800**，
> 与上表 200–1200 **没有一个重合**。而且 layout 断点与容器宽是 owner **2026-07-31 显式拍的
> code-first**，已登记在 `divergences-decisions.json` —— 那条裁定与本次的「Figma → code」
> **管的是不同的 token 族**，两条并存不矛盾。
>
> ⇒ `Module Width/*` 描述的是**模块（卡片 / 面板）的宽度档**，`--container-*` 描述的是
> **页面外壳的最大宽**。名字里保留 `module` 就是为了让这个区别在 CSS 里一眼可见。

---

## C. 要你回的三句话（其余不用管）

1. **B1**：「Basic Size 是内部阶梯、不对外暴露 CSS token」—— 对 / 不对？
2. **B2**：`Size/*` → `--size-*` —— 名字可以 / 换成别的（说一下叫什么）？
3. **B3**：`Module Width/*` → `--module-w-*` —— 名字可以 / 换成别的？

回完之后 code 侧才动。**在你回之前，这 44 个的状态是「已同步进仓库、但不生成 CSS」**，
零风险、零视觉变化，可以一直挂着。

---

## D. 顺带两条实测事实（不用你做什么，但会影响你对 Figma 库的判断）

1. **`Color Type/Text/Primary Button` 的绑定在这四个月里改过**：从 `grey-1 #FFFFFF` 改成了
   `grey-2 #F8F8F8`。仓库**早就用别的路子抓到并修对了**（2026-07-29），这次刷新是第三次独立坐实。
   ⇒ 那次改动没造成损失，但它证明了「变量层断流」是真会吃掉改动的。
2. **`getLocalVariablesAsync()` 在这个库里返回 98 个变量，里面没有名为 `444444` 的那个**
   （design-review-queue #6 记的那个野生变量）。可能的解释是它来自**另一个文件的库**而非本库本地变量。
   ⇒ 这只是一条观察，**#6 该怎么处理没有变**（它绑在 `input box/filled` 的叶子上、是本队列里唯一有
   可见视觉后果的一条）；只是提醒：动手时先确认那个变量到底住在哪个文件里，否则会在本库里找不到它。

---

## E. 复核这份 diff 的现取命令（⛔ 别信本文件的数，跑一次）

```bash
node figma-sync/variable-map.mjs          # 上游总数 / 已映射 / 具名待映射，逐条点名
pnpm audit:variables-freshness            # 恒等式：normalized + 具名待映射 === raw
git diff --stat src/tokens/variables.css  # 本轮应为空 —— 零视觉变化的判据
```
