提醒色辭典
這一頁是規範性辭典:每個提醒色一節,回答「這個色是什麼、用在哪、為什麼」。 與色彩語意分工——那一頁講原理與設計過程,這一頁供查閱與擴充: 之後要新增或調整任何提醒色,照這裡的固定格式補一節,讀的人就能用同一套欄位解讀。
提醒色的總原則:語意固定、主題不變。切色相主題、切深淺模式,
danger 永遠是那個紅——提醒色的語意空間完全獨立於主題(ADR-0007)。
聚焦環也因此是中性的:語意用彩色、焦點用中性,兩者可以出現在同一個輸入框上而不打架。
總表
| 語意 | Token 家族 | 一句話定義 | 主要載體 |
|---|---|---|---|
success | --success+-foreground/--success-subtle+-subtle-foreground | 良好/已完成/通過 | Badge、Callout、Stepper 完成態、Delta |
warning | 同上結構 | 需要注意,但不阻擋 | Badge、Callout |
info | 同上結構 | 中性提示/補充說明 | Badge、Callout |
danger | 同上結構 | 異常/錯誤/不合格(描述資料) | Badge、Callout、Delta、表列標示 |
destructive | --destructive+-foreground | 按下去會刪東西(描述動作) | Button 的 destructive variant |
edit | --edit/--edit-bg/--edit-foreground | 已改動未送出(保留色) | EditableField、ChangeSummary、Badge/Chips/SegGroup 的變更標示 |
field-editable | --field-editable+--field-border | 這一格你可以改 | 表單欄位、表格可編輯欄 |
field-readonly | --field-readonly | 這一格是算出來的/唯讀 | 表單欄位、表格計算欄 |
四個狀態色:success/warning/info/danger
定義與場景
| 定義 | 用(場景) | 不要用(反例) | |
|---|---|---|---|
success | 良好、已完成、通過 | 完成徽章、通過訊息、Stepper 已完成步驟、Delta 的「好」方向 | 不當「可以按」的暗示——按鈕的可用性靠 primary,不靠綠 |
warning | 需要注意,但不阻擋流程 | 快到期、接近上限、有風險但可繼續 | 不當「次要的錯誤」——會擋人的就是 danger,不要用黃色弱化它 |
info | 中性提示、補充說明 | 操作說明、背景資訊、不改變狀態的通知 | 不當裝飾藍——沒有訊息就不要有 info 色塊 |
danger | 資料異常、錯誤、不合格 | 驗證失敗的欄位訊息、異常列標示、Delta 的「壞」方向 | 不當刪除鈕的顏色——那是 destructive 的工作(見下) |
每個狀態色是四件組,對應兩種強度
--{狀態} 實色填底(高強度)
--{狀態}-foreground 實色上的文字
--{狀態}-subtle 淡底(低強度,預設)
--{狀態}-subtle-foreground 淡底上的文字(同色相深墨)
預設用淡底、實色只給阻斷式。 豐富度來自同一語意色的兩種強度,不是更多色相:
| 強度 | 樣式 | 時機 |
|---|---|---|
| 低(預設) | -subtle 淡底+同色相深墨文字 | 日常提示、徽章、表列標示——大量出現也不刺眼 |
高(intensity="high") | 實色填底+高對比文字 | 必須停下來決定的阻斷式訊息——出現頻率低才不累積疲勞 |
Badge 與 Callout 都吃這套語彙。資料表裡不要用高強度——表裡的狀態是常態資訊,
不是警報;一排實色徽章會把 10% 的高飽和預算全部花掉。
為什麼是這些色相
色相帶著既成慣例,狀態色鎖在慣例範圍內,只做感知調和的微調:
| 狀態 | OKLCH 色相 | 慣例來源 |
|---|---|---|
danger | 17.7° | 紅=停止、錯誤 |
warning | 70.6° | 黃橙=注意 |
success | 162.4° | 綠=通行、完成 |
info | 238.1° | 藍=中性系統訊息 |
這幾段色相是保留區:主題色相與圖表分類色都必須與它們保持距離
(verify:color 有兩條門檻盯著),否則使用者會停止把這些顏色讀成狀態。
對比保證(生成的,不是挑的)
| 項目 | 門檻 | 怎麼保證 |
|---|---|---|
| 實色上的文字 | 4.5:1 | 生成器反解:淺色調狀態改深墨前景、紅系壓深填色留白字 |
| 淡底上的文字 | 4.5:1 | 前景對「自家淡底」反解,不是挑好再量 |
| 四種淡底彼此 | 可分辨 | 染色量等量(ΔE00 對卡片表面比值 ≤1.3),不是彩度等值 |
| 色塊對頁面底 | 3:1 | 非文字元件門檻(WCAG 1.4.11) |
值都由 generate-theme.mjs 產生——要改就改生成器參數重跑 npm run build:theme,
不要手改 tokens.json。
destructive:動作的紅,不是資料的紅
destructive | danger | |
|---|---|---|
| 描述 | 動作:按下去會刪東西 | 資料:這筆有問題 |
| 載體 | Button variant="destructive" | Badge、Callout、表列、Delta |
| 同畫面共存 | 一列紅色的異常資料,右邊一顆紅色的刪除鈕——兩者常常同時出現 |
分家的理由:混用會讓紅色失去意義——使用者不再知道紅色到底在警告什麼。
兩者色相刻意錯開(destructive 25.3° vs danger 17.7°),但不要依賴使用者分辨這 8°:
語意靠載體(按鈕 vs 標示)與文字傳達,色相差只是輔助。
edit:琥珀保留色(83.9°)
--edit 三件組只做一件事:標記「使用者改了,但還沒送出」。
- 載體:
EditableField的已改動欄位、ChangeSummary的變更清單、Badge/Chips/SegGroup的edit/changed樣式 - 視覺是三件套(邊框+底色+文字色)+「已變更」文字標籤——顏色不是唯一線索
- 不得挪作他用:不能當高亮、不能當「新功能」標記、不能當任何其他強調。 琥珀在畫面上一旦有第二種意思,「我改了什麼」這個最重要的訊號就被稀釋了, 而稀釋不可逆。想用琥珀做別的事,必須先推翻 ADR-0002
- 守衛:元件庫禁止
amber-*原始色階字面值(防「順便也是琥珀色」的高亮)
欄位色:只有兩種語意
| Token | 意思 | 視覺 |
|---|---|---|
--field-editable+--field-border | 這一格你可以改 | 淡冷底+清楚邊框 |
--field-readonly | 這一格是算出來的/唯讀 | muted,無邀請感 |
可編輯欄位刻意用冷色——與暖色的狀態語意(warning/danger)及琥珀(已改動)拉開距離。 欄位不做「輸入/假設/公式」三色:那是試算表慣例,使用者只在乎能不能改 (ADR-0002 記錄了三種暖色淡底實測分不開的教訓)。
加上 edit,一個欄位的完整生命週期是三種狀態:可編輯 → 已改動未送出 → (送出後回到)可編輯。
同框互動:提醒色 × 聚焦環 × 選取層
一個輸入框上最多同時出現三種視覺訊號,各管各的、不共享色相空間:
| 層 | 顏色 | 管什麼 |
|---|---|---|
提醒色(edit 琥珀/danger 紅) | 彩色、語意固定 | 這格的資料狀態 |
聚焦環(--ring) | 中性、全主題一致 | 鍵盤焦點現在在哪 |
已選(.state-layer 疊加) | currentColor,無色相 | 這格被選取 |
欄位錯誤(aria-invalid) | danger 邊框+文字+圖示(底色不變) | 這格不合格——FormField 把 aria 接好 |
狀態色在圖表中的沿用(狀態組成堆疊、好壞偏差色階)走同一套語意——
判斷樹與 STATUS_SERIES 色表見圖表的配色策略。
這個分工是 ADR-0007 的直接動機:ring 曾經吃主題色相, 於是「琥珀欄位獲得焦點」在紫晶主題下是琥珀配紫、在青玉主題下是琥珀配青綠—— 同一個狀態組合的長相隨主題漂移,聚焦環會被誤讀成另一種提醒。 ring 改中性之後,「彩色=語意、中性=焦點」在所有主題下恆成立。
擴充程序:提醒色是有限枚舉
四種狀態+兩種強度是封頂,不是起點。要新增之前先依序回答:
- 現有四種+強度分級蓋不蓋得住? 大多數「需要新顏色」的需求其實是 「需要高一階或低一階的強度」。細節差異靠文字與圖示,不靠新色相。
- 蓋不住 → 走 RFC (表單直達)。 提醒色是全系統契約,新增是規範變更。
- 通過 → 在
generate-theme.mjs加參數,不是手填 hex。 四件組(實色+前景+淡底+淡底前景)由同一條規則生成,對比自動保證。 - 在
verify:color補門檻:新色相不得落入既有狀態色的保留區、 與六個既有提醒色的感知距離、淡底染色量與其他四種等量、 主題色相與圖表色對它的距離約束一併更新。 - 反向驗證:把值改回壞的,確認每條新門檻真的會紅。這個 repo 的守衛規則。
刪除或改語意,同樣走 RFC——已釋出的提醒色是取用端畫面上的既成事實。