# 策展 · X (Twitter) 🔥🔥🔥

> 📖 本站完整內容索引（documentation index）：[llms.txt](/llms.txt)

> 作者：小盖 (@xiaogaifun) · 平台：X (Twitter) · 日期：2026-06-23

> 原始來源：https://x.com/xiaogaifun/status/2069014055579509117

## 中文摘要

# 這簡直是教科書等級的 AI 設計規範。

Vercel 的設計系統規範，真的是我見過最頂尖的教科書級範例。

今天認真研讀了他們的 `DESIGN.md`，從亮色與暗色兩套主題出發，將顏色、字體、間距、組件、動效以及文案規則，徹底轉化為一套可執行的設計方法。

感覺以後我所有產品的 `design.md` 都可以照這個路子來寫了。

具體內容在這裡：

[vercel.com/design.md](https://vercel.com/design.md)

[vercel.com/design.dark.md](https://vercel.com/design.dark.md)

可能有些朋友還不太清楚 `DESIGN.md` 是什麼。簡單來說，它是一份給 AI 看的設計規範。當 AI 幫我們撰寫程式碼時，它需要知道該用什麼顏色、多大的字號、元素之間的間隔。

沒有這份文件，AI 每次產出的介面風格都會不一致，顯得飄忽不定。

看完 Vercel 的 `DESIGN.md` 之後，我發現一份好的 `DESIGN.md`，遠遠不止是告訴 AI 用什麼色號、選幾號字。它背後代表著一整套設計思維，這徹底顛覆了我的認知。

今天就拆解開來，聊聊這份文件到底好在哪裡。

---

### 1. 先說顏色

我最開始寫 `DESIGN.md` 時，顏色部分其實很簡單。列出幾個色值，告訴 AI 哪個是主色、哪個是輔助色、哪個是強調色，基本就結束了。

但這樣寫，AI 仍然不知道這些顏色應該如何對應不同的互動狀態。

比如一個按鈕，預設狀態該是什麼顏色？滑鼠懸停時該變深多少？點擊下去那一瞬間又該是什麼顏色？這些細節如果沒有明確規定，AI 每次生成的結果都可能不一樣。

Vercel 的做法完完全全解決了這個問題。

在他們的設計系統裡，每個顏色系列都被拆成了從 100 到 1000 的 10 個梯度，而且每個數字都對應一種固定的介面狀態。

![這是一份關於設計系統中顏色階層定義的說明文件，詳細列出了從 100 到 1000 的顏色數值及其對應的 UI 設計意圖。](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/68611ac7ee878024.jpg)

<details class="chart-data"><summary>展開畫面重點</summary><div class="me-note">該畫面為一段技術文件內容，標題為「## Colors」，說明非背景色階（non-background scale）包含 10 個步驟（從 `100` 到 `1000`），且每個步驟不僅代表明度，更定義了具體的設計意圖。詳細對應如下：
- `100` default background（預設背景）
- `200` hover background（懸停背景）
- `300` active background（點擊/啟用背景）
- `400` default border（預設邊框）
- `500` hover border（懸停邊框）
- `600` active border（點擊/啟用邊框）
- `700` solid fill, high contrast（實心填充，高對比）
- `800` solid fill, hover（實心填充，懸停）
- `900` secondary text and icons（次要文字與圖示）
- `1000` primary text and icons（主要文字與圖示）</div></details>

100 是元素的預設背景，200 是滑鼠懸停時的背景，300 是點擊時的背景。再往上，400 是預設邊框，500 是懸停邊框，600 是點擊邊框。

700 用於實心色塊，比如標籤或者按鈕本身；800 是這類色塊的懸停狀態。900 用於輔助文字和圖示，1000 用於主要文字和圖示。

看起來只是數字編號，但背後其實對應著一套完整的互動邏輯。

100 到 300 管理背景狀態；400 到 600 管理邊框狀態；700 和 800 管理實心色塊狀態；900 和 1000 管理資訊層級。

也就是說，Vercel 實際上是在告訴 AI「這裡有幾種狀態」。顏色只是這些狀態的表現形式。

這樣帶來的優點非常直接。

![這張插圖展示了透過語義層將淺色與深色主題進行對應與取值的設計概念。](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/aa73a6a126d11b31.jpg)

<details class="chart-data"><summary>展開畫面重點</summary><div class="me-note">圖片以手繪風格呈現，中央有一隻橘白色的柯基犬，雙手各拉著一條連接線，分別連接左側的「淺色」介面與右側的「深色」介面。
1. 左側標示為「淺色」，介面包含太陽圖示及各種 UI 元件框。
2. 中央標示為「語義」，下方列出了一系列圖示，包括圓形、方形、文字 T、方形、點陣圖示及堆疊圖示，這些圖示右側均對應一條橫線。
3. 右側標示為「深色」，介面包含月亮圖示及對應的深色 UI 元件框。
4. 底部兩側分別標示「取值」，並以虛線指向兩側介面，象徵從介面中提取數值或樣式設定。</div></details>

AI 在撰寫程式碼時，不需要再猜測按鈕懸停時該變深多少，也不用猜邊框該怎麼變化。預設態對應 100，懸停對應 200，點擊對應 300，規則已經提前定義好了。

另外，在此基礎上，Vercel 還提供了亮色和暗色兩套主題，但使用的是完全相同的 Token 名稱。

比如 `gray-1000`。在亮色主題裡，它是接近純黑的 `#171717`；在暗色主題裡，它變成了接近純白的 `#ededed`。

對於設計系統來說，這兩種顏色其實是同一個邏輯單元。

它們都代表頁面裡最重要的資訊。開發人員和 AI 在生成介面時，關注的是 `gray-1000` 這個語意，而不是背後的具體色值。當主題切換時，系統會自動把這個語意映射到對應的顏色。

---

### 2. 節奏感與角色思維

解決了顏色的問題之後，另一個更重要的約束是頁面的節奏感。

Vercel 的間距體系基於 4px 的倍數，總共只給了 9 個值：4、8、12、16、24、32、40、64、96。整個產品裡所有的間距，都從這幾個數字裡選。

我的第一反應會覺得有點少。萬一需要 20px 怎麼辦？需要 28px 怎麼辦？

問了一個設計師朋友，他說對於絕大多數產品而言，9 種間距樣式其實基本上也夠了。

如果有太多的間距選擇，那頁面的節奏感也就沒了。很多糟糕的網站，間距設計非常隨意，這其實是做產品的大忌。

優秀的設計系統不會給無限選擇，它會主動限制選擇。

Vercel 直接給出了一套明確的節奏建議：組內元素之間保持 8px，組與組之間保持 16px，板塊與板塊之間保持 32 到 40px。這確實是在定義頁面的呼吸節奏。

使用者未必會注意到這些間距，但會自然感受到哪裡屬於同一個整體，哪裡已經進入新的內容區域。

很多時候，一個頁面之所以顯得舒服，並不是因為設計師用了什麼高級技巧，而是因為這種節奏始終保持一致。

字體也是同樣的思路。

![這是一份關於設計系統中字體排版規範的技術文件說明。](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/949a41c9ea37b5cc.jpg)

<details class="chart-data"><summary>展開畫面重點</summary><div class="me-note">## Typography
Geist Sans sets UI and prose; Geist Mono sets code, data, and tabular figures. Both are open-source. The `typography` tokens above carry concrete `fontFamily`, `fontSize`, `fontWeight`, `lineHeight`, and `letterSpacing`:

- Headings, `heading-72` through `heading-14`, title pages and sections; `letterSpacing` tightens as the size grows.
- Labels, `label-20` through `label-12`, carry single-line, scannable text: navigation, form labels, table headers, metadata.
- Copy, `copy-24` through `copy-13`, set multi-line body text with a taller `lineHeight`.
- Buttons, `button-16` through `button-12`, are medium-weight labels for buttons and compact controls.

`copy-14` and `label-14` cover most text. The `-mono` tokens pair Geist Mono with the same metrics; prefer tabular figures when numbers need to align.

這段文字詳細說明了設計系統中字體的使用規範，明確區分了 Geist Sans 與 Geist Mono 的應用場景（UI/內文與程式碼/數據），並定義了標題（Headings）、標籤（Labels）、內文（Copy）與按鈕（Buttons）的字體代號（tokens）及其對應的排版特性。</div></details>

Vercel 的字體系統和顏色、間距的邏輯一模一樣。

所有文字都被歸納成幾個固定角色：標題 `heading`、標籤 `label`、正文 `copy`、按鈕 `button`。

每個角色下面再提供不同尺寸的 Token，每個 Token 都提前定義好了字體、字號、字重、行高和字間距。

之前面對一段文字，設計師可能會思考用 14px 還是 15px，行高設多少合適。

有了設計系統之後，思考方式變成了另一種：AI 先判斷這段文字是什麼角色——是標題、正文，還是輔助資訊？角色確定之後，對應的樣式也就確定了。

從「字號思維」變成「角色思維」，從「視覺決策」變成「語意決策」。這也是設計系統真正的價值所在，非常巧妙。

看到這裡會發現，無論是間距還是字體，Vercel 做的其實都是同一件事：盡可能減少執行階段的自由發揮，規則提前確定，執行時只需要選擇角色。

對設計師如此，對開發如此，對 AI 也是如此。

---

### 3. 文案與動效的克制

另外，文案同樣被當成 Vercel 設計規範的重要部分。這是大多數 `DESIGN.md` 裡最容易缺失的。

Vercel 對這些細節卻規定得非常具體。

![這是一份關於軟體介面文案撰寫規範的設計指南。](https://pub-75d4fe1e4e80421b9ecb1245a7ae0d1a.r2.dev/curated/78e6bdf41034d4a5.jpg)

<details class="chart-data"><summary>展開畫面重點</summary><div class="me-note">該畫面列出了「Voice &amp; Content」（語氣與內容）的設計準則，強調文案應精簡且無贅字。具體規範如下：
- 標籤、按鈕、標題與分頁標籤使用標題大小寫（Title Case）；內文、輔助文字與提示訊息（toasts）使用句首大寫（sentence case）。
- 動作命名需包含動詞與名詞（例如：`Deploy Project`、`Delete Member`），避免使用單純的 `Confirm`、`OK` 或單一動詞。
- 錯誤訊息應包含「發生什麼事」以及「下一步該怎麼做」（例如：`Build failed. Bundle exceeds 50 MB. Reduce it or raise the limit.`）。
- 提示訊息（toasts）應明確指出變更的項目，移除句尾句號，且不使用 `Successfully`（例如：`Project deleted`，而非 `Successfully deleted the project.`）。
- 空白狀態（Empty states）應引導使用者執行第一個動作（例如：`No deployments yet. Push to your Git repository to create one.`）。
- 進行中的狀態應使用現在分詞加上省略號（例如：`Deploying...`、`Saving...`）。
- 使用數字（例如：`3 projects`）、彎引號與省略號字元；避免使用 `please` 及行銷誇飾用語。</div></details>

比如按鈕文案，要求必須是一個「動作」加一個「物件」。像「部署專案」、「刪除成員」這樣，不能只寫「部署」、「確定」、「刪除」這種模糊詞。

原因很簡單。看到「刪除」的時候，使用者還需要想一下到底是刪除什麼。有動作、有物件，使用者立馬就能夠形成完整的理解。

報錯資訊也類似。Vercel 給出的規則很明確：先告訴使用者發生了什麼，再告訴使用者接下來應該怎麼辦。

例如「構建失敗」，原因是「打包檔案超過了大小限制」，解決辦法是「縮減體積或者調整限制」。三句話讀完，使用者立刻知道問題在哪裡，也知道下一步該做什麼。

很多產品裡的報錯提示是「操作失敗，請稍後重試」。這樣的提示資訊量幾乎為零。使用者讀完之後唯一獲得的資訊，就是「失敗了」。至於為什麼失敗、接下來怎麼辦，依然需要自己猜。

設計系統裡的文案規範，本質上是在減少這種猜測。

Vercel 也規範了操作完成後的提示資訊，只需要說明發生了什麼變化。比如「專案已刪除」，不能寫「專案刪除成功」。

因為提示框能夠彈出來，本身就已經說明操作完成了，「成功」這兩個字屬於重複資訊。

接下來是動效。

這一部分其實特別有意思，因為它和我的直覺剛好相反。我原本會覺得，動畫越多，產品越精緻。

所以，按鈕懸停加一點動畫、選單彈出加一點動畫，似乎這樣才顯得高級。現在好多 Vibe Coding 的產品似乎都朝著這樣的方向發展。

但 Vercel 的態度完全不同。他們甚至明確寫到，很多互動場景下，0 毫秒往往是最好的選擇。也就是說，不加動畫，瞬間完成。

如果一個按鈕從預設狀態變成懸停狀態，這個變化已經足夠清晰，那最好的回饋就是立刻發生；額外加一層動畫，反而會讓介面顯得拖沓。

當然，有些場景確實需要動效。

比如一個彈出視窗突然出現。如果完全沒有過渡，人會不知道它從哪裡來的。這時候動畫就有價值了。

Vercel 甚至把不同場景的時長都規定好了：普通狀態變化大約 150 毫秒，彈出層大約 200 毫秒，模態框大約 300 毫秒。

變化越大，給人的反應時間越長；變化越小，回饋越直接。

背後的邏輯始終只有一個：能不動就不動，需要動的時候，也要快、輕、克制。

最後一個讓我印象很深的部分是無障礙（Accessibility）。

說實話，這一部分以前我幾乎不會特別關注。因為大多數時候，一個產品只要介面好看、功能能用，好像就夠了。但 Vercel 在這裡寫得特別認真。

他們要求文字和背景之間必須保持足夠的對比度。狀態變化不能只靠顏色表達，還要搭配圖示或者文字說明。

所有可以互動的元素都必須有清晰的焦點狀態，不能為了視覺乾淨就去掉。

這些規則意味著設計系統服務的是所有人，包括色覺不敏感的人、用鍵盤導航的人、在強光下看手機的人。

這份 `DESIGN.md` 太專業了。我覺得後面大家要做新的產品，可以基於這兩套 MD 的思路去寫自己的 `DESIGN.md`。

## 標籤

教學資源, Web, Vercel
