跳至主要内容
💬 回報這一頁

提醒色辭典

這一頁是規範性辭典:每個提醒色一節,回答「這個色是什麼、用在哪、為什麼」。 與色彩語意分工——那一頁講原理與設計過程,這一頁供查閱與擴充: 之後要新增或調整任何提醒色,照這裡的固定格式補一節,讀的人就能用同一套欄位解讀。

提醒色的總原則:語意固定、主題不變。切色相主題、切深淺模式, 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"實色填底+高對比文字必須停下來決定的阻斷式訊息——出現頻率低才不累積疲勞

BadgeCallout 都吃這套語彙。資料表裡不要用高強度——表裡的狀態是常態資訊, 不是警報;一排實色徽章會把 10% 的高飽和預算全部花掉。

為什麼是這些色相

色相帶著既成慣例,狀態色鎖在慣例範圍內,只做感知調和的微調:

狀態OKLCH 色相慣例來源
danger17.7°紅=停止、錯誤
warning70.6°黃橙=注意
success162.4°綠=通行、完成
info238.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:動作的紅,不是資料的紅

destructivedanger
描述動作:按下去會刪東西資料:這筆有問題
載體Button variant="destructive"Badge、Callout、表列、Delta
同畫面共存一列紅色的異常資料,右邊一顆紅色的刪除鈕——兩者常常同時出現

分家的理由:混用會讓紅色失去意義——使用者不再知道紅色到底在警告什麼。 兩者色相刻意錯開(destructive 25.3° vs danger 17.7°),但不要依賴使用者分辨這 8°: 語意靠載體(按鈕 vs 標示)與文字傳達,色相差只是輔助。

edit:琥珀保留色(83.9°)

--edit 三件組只做一件事:標記「使用者改了,但還沒送出」。

  • 載體:EditableField 的已改動欄位、ChangeSummary 的變更清單、 BadgeChipsSegGroupeditchanged 樣式
  • 視覺是三件套(邊框+底色+文字色)+「已變更」文字標籤——顏色不是唯一線索
  • 不得挪作他用:不能當高亮、不能當「新功能」標記、不能當任何其他強調。 琥珀在畫面上一旦有第二種意思,「我改了什麼」這個最重要的訊號就被稀釋了, 而稀釋不可逆。想用琥珀做別的事,必須先推翻 ADR-0002
  • 守衛:元件庫禁止 amber-* 原始色階字面值(防「順便也是琥珀色」的高亮)

欄位色:只有兩種語意

Token意思視覺
--field-editable--field-border這一格你可以改底+清楚邊框
--field-readonly這一格是算出來的/唯讀muted,無邀請感

可編輯欄位刻意用冷色——與暖色的狀態語意(warning/danger)及琥珀(已改動)拉開距離。 欄位不做「輸入/假設/公式」三色:那是試算表慣例,使用者只在乎能不能改 (ADR-0002 記錄了三種暖色淡底實測分不開的教訓)。

加上 edit,一個欄位的完整生命週期是三種狀態:可編輯 → 已改動未送出 → (送出後回到)可編輯。

同框互動:提醒色 × 聚焦環 × 選取層

一個輸入框上最多同時出現三種視覺訊號,各管各的、不共享色相空間:

顏色管什麼
提醒色(edit 琥珀/danger 紅)彩色、語意固定這格的資料狀態
聚焦環(--ring中性、全主題一致鍵盤焦點現在在哪
已選(.state-layer 疊加)currentColor,無色相這格被選取
欄位錯誤(aria-invaliddanger 邊框+文字+圖示(底色不變)這格不合格——FormField 把 aria 接好

狀態色在圖表中的沿用(狀態組成堆疊、好壞偏差色階)走同一套語意—— 判斷樹與 STATUS_SERIES 色表見圖表的配色策略

這個分工是 ADR-0007 的直接動機:ring 曾經吃主題色相, 於是「琥珀欄位獲得焦點」在紫晶主題下是琥珀配紫、在青玉主題下是琥珀配青綠—— 同一個狀態組合的長相隨主題漂移,聚焦環會被誤讀成另一種提醒。 ring 改中性之後,「彩色=語意、中性=焦點」在所有主題下恆成立。

擴充程序:提醒色是有限枚舉

四種狀態+兩種強度是封頂,不是起點。要新增之前先依序回答:

  1. 現有四種+強度分級蓋不蓋得住? 大多數「需要新顏色」的需求其實是 「需要高一階或低一階的強度」。細節差異靠文字與圖示,不靠新色相。
  2. 蓋不住 → 走 RFC表單直達)。 提醒色是全系統契約,新增是規範變更。
  3. 通過 → 在 generate-theme.mjs 加參數,不是手填 hex。 四件組(實色+前景+淡底+淡底前景)由同一條規則生成,對比自動保證。
  4. verify:color 補門檻:新色相不得落入既有狀態色的保留區、 與六個既有提醒色的感知距離、淡底染色量與其他四種等量、 主題色相與圖表色對它的距離約束一併更新。
  5. 反向驗證:把值改回壞的,確認每條新門檻真的會紅。這個 repo 的守衛規則。

刪除或改語意,同樣走 RFC——已釋出的提醒色是取用端畫面上的既成事實。