Communitygithub.com

bompus/hr-better-colors

Web UI 的顏色規則:調色板漸層、語意顏色代號、顏色表示法與色域,以及渲染配對的對比度測量。在選擇、審查或修正 Web UI 的顏色、顏色代號、主題或文字對比度時使用。

hr-better-colors 是什麼?

此技能為 AI 代理(如 Claude Code、Cursor、Codex)提供一套嚴謹的顏色系統規則,專注於 Web UI 的顏色選擇、審查與修正。它強調顏色問題通常是系統性錯誤,而非單一數值問題,因此要求開發者以可測量、可計算的方式處理顏色,避免直覺猜測。技能支援多種平台,並詳細說明了如何建立以「漸層(ramp)」為基礎的顏色系統,包括中性、強調與狀態漸層,並要求每個漸層階梯都必須有明確的角色(如頁面背景、邊框、文字)。核心原則包括:保持色相(hue)在整個漸層中一致、使用語意代號(semantic tokens)而非原始數值、測量實際渲染配對的對比度(而非頁面背景),以及為漸層選擇合適的插值空間(如 `oklch` 或 `oklab`)。最後,它提供了一個完整的檢查清單和報告格式,用於評估顏色系統的品質,包括高、中、低嚴重性等級,並要求對每個檢查項目進行驗證。

相容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/bompus/house-rules/tree/HEAD/skills/hr-better-colors

在你喜歡的 AI 中提問

開啟一個已預先載入此 Agent Skill 的新對話。

說明文件

顏色

顏色系統是一小組漸層,按角色命名,並根據它們實際渲染的背景進行驗證。大多數顏色錯誤都是系統性錯誤。一個孤立挑選的值、一個因為看起來對就借用的代號、一個無人測量的配對。

永遠不要回報你沒有測量過的對比度值,也永遠不要猜測一個你可以計算出來的顏色。顏色是少數有精確答案的介面問題之一,所以請提供精確答案。

對比度要求屬於 hr-better-accessibility。表面、陰影和圖示顏色不在此技能範圍內。

符合專案的顏色系統

重複使用專案的代號和表示法。為了修正一個數值而添加第二種表示法,會讓調色板更難理解。一個一致的十六進位系統,勝過散落著 oklch() 的十六進位系統。

一旦代號存在,就用 lint 規則或 guard 測試來強制執行,該規則會對代號檔案以外的顏色文字報錯,並保留一個簡短的允許清單給那些設計上需要原始值的地方。一條只有文字的「使用代號」規則,背後沒有檢查機制,很快就會失靈。

對於一個新系統,oklch() 是最好的預設值,因為它的數字行為符合下面漸層規則的描述。在其他所有地方,一個顏色函式庫會在專案自己的表示法中產生相同的漸層(color-formats.md)。

系統是漸層,不是顏色

一個中性漸層、一個強調漸層,以及產品實際渲染的狀態漸層。一個沒有任何地方匯入的 warning 漸層,是對零像素的維護。第二個強調色相只有在兩個東西必須一眼就能區分開來時,才有其存在的價值。

每個階梯都有其任務

一個漸層不是一個可以憑肉眼挑選的漸層色帶。每個階梯的存在是因為某個角色需要它:頁面背景、元件懸停、邊框、實心填色、內文文字。不要產生沒有任何角色使用的階梯。Tailwind 的 50–950 和 Radix 的 1–12 慣例都可以對應到這些角色(palette-structure.md)。

按色相命名原始值,按角色命名語意

原始值命名一個數值(--blue-500),且永遠不會在元件中使用。語意代號命名一個任務(--color-text-secondary),指向一個原始值,並且是元件唯一會引用的層級。

這個界線正是讓主題化成為可能的關鍵。沒有它,深色模式就意味著需要審查每一個用法,以弄清楚哪個是指「強調色」,哪個只是想要藍色(token-naming.md)。

僅在角色內使用代號

永遠不要因為某個代號今天的數值看起來正確就借用它。一個用作文字顏色的分隔線,在邊框變淺之前都還可以,但之後文字也會跟著變淺。如果某個角色沒有對應的代號,請新增該代號。

在漸層中保持色相一致

一個結構良好的漸層由四個屬性定義:

  • 階梯遵循一個精心設計的感知亮度進程(palette-generation.md)。
  • 色相從頭到尾保持恆定。
  • 鮮豔度在漸層中間達到峰值,並在兩端衰減。
  • 階梯在淺色端比在深色端分佈得更密集。

兩端都應避免使用純黑色和純白色,因為它們根本無法承載色相。請使用顏色函式庫,而不是憑感覺(palette-generation.md)。

一個顏色,一個意義

在整個介面中為一個顏色賦予單一用途,並將色相相差 15° 以內的任何顏色視為同一種顏色。如果強調色代表「可互動」,那麼靜態文字上的這個色相會告訴使用者點擊某個不可點擊的東西,而一個以中性色渲染的互動元素也會同樣誤導使用者。顏色絕不是意義的唯一載體,這由 hr-better-accessibility 負責。

每個視圖只填滿一個操作

當填滿的顏色用來表示主要強調時,一個主要操作獲得此顏色,而其同級操作保持中性。把顏色放在背景上,而不是標籤上。一個填滿的按鈕在整個房間都能被看出是主要按鈕;而中性按鈕上使用強調色的文字看起來像連結。

當多個有顏色的背景是用於編碼不同的狀態或類別,而非彼此競爭時,這是可以的。

測量實際渲染的配對,然後回報

測量前景色與其實際渲染的背景(而非頁面背景)之間的對比度。當一個配對失敗時,回報該配對、其測量值以及它未達到的閾值,然後不要更改顏色。顏色是設計決策。只有在被要求時才更改它們,更改後重新測量(contrast.md)。

選擇漸層的插值空間

插值空間是一種外觀設定,而非正確性設定。

  • in oklab 是最好的預設值:亮度均勻,沒有色相驚喜。
  • in oklch 繞色相環移動,而不是穿過中間,保持鮮豔並橫掃兩個端點之間的所有色相。當一個雙色相漸層在中間變成灰色時,請使用它。
  • sRGB 預設值 會使中間點變暗並變鈍。這是大多數介面已有的情況,因為這是不指定任何值時得到的結果。

請參閱 color-usage.md。

完成前

錯誤修正
在專案已有代號的地方使用了原始數值使用或新增該角色的代號,並使用專案規定的表示法
在十六進位程式碼庫中隨意加入了孤立的 oklch() 值除非遷移計畫已包含在內,否則保持既有的表示法
像 --blue-500 這樣的原始值直接在元件中使用建立一個語意代號指向它
代號以其外觀命名(--color-blue-button)或首次使用(--color-sidebar-gray)以其角色命名:--color-accent-solid、--color-bg-surface
--color-primary 同時代表品牌色,而 --color-text-primary 代表內文文字保留 accent 給品牌色;讓 primary 表示「其群組中最突出的」
語意代號用於其角色之外(例如分隔線用作文字)為缺失的角色新增代號;永遠不要按數值借用
通過改變 HSL 亮度來建立的漸層根據感知亮度重建,並保持色相恆定
漸層在整個範圍內均勻分佈收緊淺色端,直到 50 和 100 看起來像兩個不同的表面
不同色相使用相同的飽和度數值匹配每個色相自身最大值的比例,而不是原始數值
狀態色相與強調色相衝突移動它,直到破壞性操作和主要操作並排時可以區分
深色模式是通過機械地反轉淺色調色板製作的將反轉作為起點,然後降低鮮豔度,加寬深色端,並重新檢查每個配對
prefers-color-scheme 設定了一些代號,而 .dark 類別設定了其他一些選擇一種切換機制並始終如一地使用它
通過改變色相來修正對比度改變亮度,這才是對比度會回應的通道
P3 色域顏色沒有 sRGB 備案先宣告 sRGB 值,然後在 @media (color-gamut: p3) 內部進行覆蓋

回報

嚴重性。 HIGH 使內容無法閱讀或賦予了誤導性的語意顏色。MEDIUM 是明顯的主題、代號或色域失敗。LOW 是孤立的打磨問題。

驗證。 沒有瀏覽器:代號值、每個宣告顏色的色域、兩個主題區塊都存在,以及從宣告的代號配對計算出的對比度。有瀏覽器:文字實際渲染的背景,包括透明度及其下方的任何圖像,在淺色和深色模式下都進行測量。失敗的配對會被回報,而不會被重新繪製。回報每個你無法執行的檢查為 Not verified。

格式。 根據每個發現違反的原則進行分組,按嚴重性排序,每個根本原因一行,列出其出現的每個位置:

嚴重性位置之前之後原因

位置 是 path/to/file:line。原因 指出違反的原則和使用者影響。

當任何 HIGH 嚴重性問題仍然存在時,回報 Block,否則回報 Approve,並將剩下的問題留在表格中作為待辦事項。永遠不要在未檢查的範圍上 Approve。如果沒有發現任何問題,則陳述「No actionable color findings」並報告驗證結果。

Individual skills in this repo

This repo contains 3 individual skills — each has its own dedicated page.

相關技能