用 Mermaid 原文畫深色、分區的流程圖:每個節點掛九類語意色之一,Pele 用 CSS 變數套整體配色,classDef 套節點顏色。
為什麼選 Pele、它跟原生 Mermaid 和其他工具比起來差在哪,見〈Mermaid 美化工具比較:Pele、beautiful-mermaid、Diagram Design 實測〉。
九類語意色
每個節點都要掛其中一類,顏色只用來表達節點的意思,不拿來裝飾單一條線。底色是深色帶一點該色的色調,文字一律白色粗體,節點圓角 10px。
| class | 用在 | 底色 | 框色 | 備註 |
|---|---|---|---|---|
input |
起點、輸入、外部來源 | #191C20 |
灰 #64748B |
|
step |
一般處理步驟 | #1B1B26 |
靛 #818CF8 |
|
agent |
AI 或自動化程式的產出 | #1F1A23 |
紫 #C084FC |
|
handoff |
交接給下一個人或系統 | #181D25 |
藍 #60A5FA |
|
decide |
要判斷的地方 | #221F18 |
琥珀 #F59E0B |
虛線框 4 3,配菱形 {},不設圓角 |
check |
檢查、稽核、對帳 | #191F1F |
青 #2DD4BF |
|
ok |
成功、完成、核准 | #19231F |
綠 #34D399 |
|
fail |
失敗、重試、被擋下 | #241A19 |
紅 #F87171 |
|
archive |
封存、結束 | #191C20 |
石板 #94A3B8 |
分區(subgraph)用深藍面板:底 #111827、框 #334155。要跟其他區分開的分區(例如夜間流程)改用深紫:底 #1C1725、框 #4C1D95。
Pele 怎麼設
Pele 不吃 Mermaid 的主題設定,整體配色要用 CSS 變數設在圖的根節點 .pele 上;節點顏色照樣靠原文裡的 classDef。下面這段貼進頁面的 CSS 就好。
.pele {
--pele-bg: #181818; /* 圖的背景 */
--pele-fg: #E8E8E8; /* 一般文字 */
--pele-fg-on-dark: #FFFFFF; /* 深色節點上的文字 */
--pele-muted: #94A3B8; /* 次要文字 */
--pele-line: #64748B; /* 連線與箭頭 */
--pele-surface: #191C20; /* 沒掛 class 的節點底色 */
--pele-surface-alt: #111827; /* 分區底色 */
--pele-border: #64748B; /* 節點與分區邊框 */
--pele-accent: #818CF8; /* 強調色 */
--pele-radius: 10px; /* 圓角 */
background: #181818;
}
.pele-cluster > rect { fill: #111827; stroke: #334155; } /* 分區面板 */
.pele-cluster-label { fill: #E8E8E8; } /* 分區標題 */
/* 所有連線統一灰色:分區用了深色填色時,Pele 會自動把區內連線換成白色 */
.pele .pele-edge { stroke: var(--pele-line); }
.pele .pele-edge .pele-marker { fill: var(--pele-line); }
- 節點文字自動配色:Pele 會在「淺底用深字、深底用淺字」之間自己挑對比高的,所以
--pele-fg-on-dark一定要設成白色。 - 深淺色切換不用重畫:要做淺色版,另寫一組變數套在
@media (prefers-color-scheme: light)即可;但classDef的顏色是寫死的,不會跟著變。 - 字型:換字型會影響文字量測與版面,要在
render()時用fontFamily指定,不要只在 CSS 改。中文可用Arial, PingFang TC, Microsoft JhengHei, sans-serif。 - 想單獨改某一種元素,可用 Pele 的 class:
pele-node(節點)、pele-edge(連線)、pele-edge-label(連線標籤)、pele-cluster(分區)、pele-label(節點文字)。
Mermaid 原文範本
複製後改文字就能用:每個節點用 :::class 掛一類,九行 classDef 放在圖的最後;要跟其他區分開的分區加一行 style。這份範本 2026-11-01 用 Pele 1.13.0 實測過。
flowchart TD
subgraph DAY["☀️ 白天:分區標題"]
A["📥 起點/輸入"]:::input --> B["一般處理步驟<br/>第二行說明"]:::step
B --> C{"要判斷?"}:::decide
C -->|"是"| D["AI/自動化產出"]:::agent
C -->|"否"| E["交接給下一關"]:::handoff
end
subgraph NIGHT["🌙 夜間:分區標題"]
N1["夜間排程"]:::step --> N2["檢查/稽核"]:::check
N2 -.->|"失敗"| NF["失敗、隔晚重試"]:::fail
end
D --> OK["成功/完成"]:::ok
E --> OK
N2 --> OK
OK --> AR["封存/結束"]:::archive
classDef input fill:#191C20,stroke:#64748B,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
classDef step fill:#1B1B26,stroke:#818CF8,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
classDef agent fill:#1F1A23,stroke:#C084FC,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
classDef handoff fill:#181D25,stroke:#60A5FA,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
classDef decide fill:#221F18,stroke:#F59E0B,stroke-width:2px,stroke-dasharray:4 3,color:#FFFFFF,font-weight:bold
classDef check fill:#191F1F,stroke:#2DD4BF,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
classDef ok fill:#19231F,stroke:#34D399,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
classDef fail fill:#241A19,stroke:#F87171,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
classDef archive fill:#191C20,stroke:#94A3B8,stroke-width:2px,color:#FFFFFF,font-weight:bold,rx:10px,ry:10px
style NIGHT fill:#1C1725,stroke:#4C1D95,color:#E8E8E8
寫法規則:
- 方向:預設直向
flowchart TD;5 格以內的單線流程才用橫向LR。 - 線條:主流程實線
-->;失敗、旁支、通知用虛線-.->。不用linkStyle幫單一條線換色。 - 斷行:每行自己用
<br/>斷,一行約 14 個中文字以內。 - 引號:節點、分區標題、連線標籤遇到中文標點、emoji、括號、冒號,一律用
["…"]包住。數字開頭的標籤(1. …)改用圈圈數字①。 - 太複雜就拆:連線繞回頭的大圖,拆成幾張小圖比硬調排版清楚。
實際畫出來的樣子
上面的範本配上「Pele 怎麼設」那段 CSS,用 Pele 1.13.0 畫出來就是這樣(Chrome 無頭模式截圖)。九類語意色、分區面板、判斷框的虛線都有套上;連線是 Pele 自己的圓弧折線。

跟原生 Mermaid 不一樣的地方
同一份原文兩邊都能畫,但配色與排版的來源不同:原生 Mermaid 靠開頭的 %%{init}%%,Pele 靠 CSS 變數。
| 項目 | 原生 Mermaid | Pele |
|---|---|---|
| 整體配色 | %%{init}%% 的 themeVariables |
CSS 變數;themeVariables 只當系列色盤,其他不生效 |
| 節點顏色 | classDef |
classDef(一樣) |
| 排版 | Mermaid 自己的版面引擎 | Pele 自己的版面引擎;節點位置、間距、連線路徑都不同,設定支援度依圖種而異 |
| 節點文字 | 可用 HTML | 只支援換行、粗體、斜體;不吃任意 HTML |
| 點擊 | 連結與 JavaScript 回呼 | 只支援開連結,JavaScript 回呼忽略 |
| 窄螢幕 | 整張縮小 | 會縮小,給 maxWidth 時可能改成直向排版;responsive: false 固定尺寸 |
| 外掛圖種 | 依安裝 | ZenUML 等外掛不支援 |
同一份原文也要給原生 Mermaid 看(例如 GitHub、筆記軟體)時,在最上面加這段開頭;Pele 會略過它的配色部分,兩邊可以共用。有分區的直向圖,最後一行的 rankSpacing 改成 100 並加 "subGraphTitleMargin": {"top": 14, "bottom": 10},分區標題才不會貼著方框。
%%{init: {
"theme": "base",
"themeVariables": {
"background": "#181818", "fontSize": "15px",
"primaryColor": "#191C20", "primaryTextColor": "#FFFFFF", "primaryBorderColor": "#64748B",
"lineColor": "#64748B", "textColor": "#E8E8E8", "titleColor": "#E8E8E8",
"clusterBkg": "#111827", "clusterBorder": "#334155", "edgeLabelBackground": "#131313",
"noteBkgColor": "#221F18", "noteBorderColor": "#F59E0B", "noteTextColor": "#FFFFFF"
},
"flowchart": {"curve": "stepAfter", "nodeSpacing": 40, "rankSpacing": 50, "padding": 14, "wrappingWidth": 320}
}}%%
原生 Mermaid 的兩個坑:edgeLabelBackground 不要刪,刪了連線標籤會變成淺粉底、讀不到;classDef 的圓角要寫 rx:10px 帶單位,不帶單位在 Safari/iPhone 上會變直角。
每張圖畫完的檢查清單
實際打開畫好的圖看,只看程式沒報錯不算通過。
- 內容:沒有漏掉節點、分支、條件或連線方向
- 每個節點都掛了 class,而且掛對類別(判斷用
decide、失敗用fail…) - 文字:不截字、不重疊,分區標題跟方框之間有留白
- 連線:箭頭確實指到目標,不擦邊、不穿過別的節點;顏色全部是灰色
- 交付格式:交 SVG 或 PNG 就打開那個檔案看;會在手機上看的,在手機上實際打開過
- 原文留著:每張圖的 Mermaid 原文跟成品一起保存,之後改內容才不用重畫
來源
- Pele 官方網站:用法與安裝(
npm install pele) - Pele 相容性:支援的圖種、跟 Mermaid 的差異
- Pele 主題設定:CSS 變數、class 名稱、圖內樣式
- Pele 原始碼(GitHub):由 Obsidian 官方組織發布
- Mermaid 官方說明
本文的版本與實測結果以 Pele 1.13.0 為準;升版後先用範本重畫一次再使用。