cover

網頁有 Material Design、iOS 有 Human Interface Guidelines,但 TUI?每個工具都在自己發明輪子。

先講結論

TUI(Terminal User Interface)正在經歷文藝復興。lazygit、btop、k9s、Claude Code——越來越多開發者工具選擇終端介面。但目前沒有統一的設計規範,導致每個工具的操作方式都不同。這篇嘗試整理一套一致性框架,不是強制規格書,而是「如果大家都這樣做,使用者會更開心」的建議。

系列文章:本篇:原則、色彩與佈局元件、框架與實戰分析

為什麼 TUI 正在流行

lazygit 取代了 GitKraken、k9s 取代了 Kubernetes Dashboard、btop 取代了系統監控 GUI。然後 Claude Code、GitHub Copilot CLI 等 AI 工具也選了 TUI——這不只是復古潮流,是有實質優勢的選擇。

核心優勢很直接:SSH 可達(任何有終端的地方都能用)、啟動毫秒級(Electron 動輒吃幾百 MB)、鍵盤效率碾壓滑鼠、天然適合自動化和管道串接。加上 Bubble Tea、Ink、Rich 這些現代框架,打造精美 TUI 變得前所未有地簡單。

五大設計原則

原則一:鍵盤優先

每一個操作都必須能透過鍵盤完成。 滑鼠支援是加分項,不是必要條件。這跟網頁的 Mobile-First 類似——先確保核心互動在最受限的情境下可用。

原則二:漸進式揭露

終端空間有限,不能像網頁無限捲動。先顯示關鍵摘要,按需展開詳情。lazygit 是典範:左側面板顯示檔案列表,選取後右側顯示 diff,按 Enter 進入逐行檢視。

原則三:情境感知

使用者在任何時刻都要能回答:我在哪裡?我能做什麼?剛才發生了什麼?用高亮標示焦點、底部狀態列顯示快捷鍵、操作後顯示回饋訊息。

原則四:優雅降級

你精心調教的 True Color 配色,在某些終端可能只有 16 色。設計時以 80 欄寬、ANSI 16 色為基線,寬螢幕和 True Color 是加分項。

原則五:一致的回饋

沒有回饋是最糟的體驗——使用者按了一個鍵,什麼都沒發生。是成功了?失敗了?還是沒偵測到?

成功:✓ Done      (綠色)
失敗:✗ Error     (紅色,停留直到按鍵關閉)
進行中:⠋ Loading...(旋轉動畫)
警告:⚠ Warning   (黃色)

色彩系統

ANSI 16 色的語意映射

不要用「紅色」思考,要用「語意」思考:

語意色彩符號場景
errorRed錯誤、失敗
successGreen成功、完成
warningYellow警告、注意
infoBlue提示、說明
destructiveRed + Bold✗✗刪除、不可逆
secondaryDim/Gray·次要、已停用

無障礙:不要只靠顏色

約 8% 的男性有色覺障礙。永遠不要讓顏色成為唯一的資訊傳遞方式:

不好:紅色文字 = 失敗 | 綠色文字 = 成功
好的:✗ 紅色文字 = 失敗 | ✓ 綠色文字 = 成功

同時使用顏色 + 符號(或文字標籤),確保單色環境也能讀。

深色/淺色終端

是的,有人用淺色背景。避免硬編碼「白色文字 + 黑色背景」,使用終端的預設前景/背景色。兩種主題都要測試。

佈局模式

全螢幕應用佈局

┌─────────────────────────────────────────────┐
│  標題列                          [模式/狀態]  │
├──────────────┬──────────────────────────────┤
│              │                              │
│  側邊欄       │  主要內容區                   │
│  (20-30 欄)  │  (剩餘空間)                   │
│              │                              │
├──────────────┴──────────────────────────────┤
│  ↑↓ 導航 | Enter 選取 | q 退出 | ? 說明      │
└─────────────────────────────────────────────┘

狀態列永遠在最下方,列出目前可用的快捷鍵。這是 TUI 裡最重要的設計決策之一——使用者不需要背快捷鍵,看底部就知道能做什麼。

響應式設計

寬度 >= 120:雙欄(側邊欄 + 主內容)
寬度 80-119:全螢幕列表,Enter 進入詳情
寬度 < 80:  簡化顯示,截斷長文字

模態對話框

┌─── 確認刪除 ──────────┐
│                       │
│  確定要刪除 main.js? │
│  [Yes]     [No]      │
└───────────────────────┘

預設焦點放在安全選項上(通常是 No/Cancel)。危險操作?要求使用者輸入確認文字:

⚠ 此操作將刪除所有資料且無法復原。
請輸入 "delete-all" 以確認:> █

互動模式

導航鍵位

同時支援 Vim 和方向鍵是最佳實踐——不需要強制 Vim,但終端使用者群跟 Vim 使用者群高度重疊。

操作Vim方向鍵
上/下移j/k↑/↓
左/右h/l←/→
頂部/底部g/GHome/End
上/下一頁Ctrl+u/dPgUp/PgDn
切換面板TabTab

系統操作

按鍵操作
?顯示快捷鍵說明
q退出(有未儲存變更先確認)
Ctrl+C強制退出(永遠要能用)
/開始搜尋
Space切換選取
Enter確認
Esc取消/返回

狀態列要跟著情境變

在列表頁:↑↓ 導航 | Enter 檢視 | d 刪除 | / 搜尋
在編輯模式:Esc 取消 | Ctrl+S 儲存 | Tab 下一個欄位
在確認對話框:y 確認 | n 取消

Web 有完整的設計系統,TUI 才剛起步。但隨著 AI 工具越來越多選擇終端介面,TUI 設計的重要性只會持續增長。


延伸閱讀