跳至主要內容
v0.2 · Living Spec

Design System

TrustGuard 是為 AI 投資代理人設計的信任 UX 探索。 這套系統以 深色暖調 + 溫暖橙 為核心,所有元件圍繞 5 條設計原則展開。

“使用者最害怕的不是 AI 做錯選擇,
而是自己沒有機會知道、理解、或阻止。”

— 使用者洞察,Week 1

How to read這份 Spec 怎麼讀

每個 token、每個元件旁邊會出現Why區塊,紀錄的是「為什麼這樣設計、而不是那樣」。 這不是規範文件,而是設計爭議時的仲裁紀錄 — 下次改版時能看懂每個決策的成本與交易。

Colors

色彩以語意分組,不以色相命名。每個 token 都有明確使用場景。

Brand & Surface

--background

oklch(0.145 0.005 50)

頁面底色

--card

oklch(0.185 0.006 50)

卡片、區塊

--popover

oklch(0.22 0.007 50)

Popover、Tooltip

--muted

oklch(0.26 0.006 50)

次要背景

--accent

oklch(0.28 0.015 55)

Hover 狀態

--primary

oklch(0.72 0.17 50)

品牌、CTA、重要動作

Why 暖橙而非冷色系

金融產品 9 成使用冷色藍(Robinhood、Coinbase、傳統銀行 app),原因是傳達「冷靜、專業、可信」。 TrustGuard 故意反其道而行 — Week 1 訪談中,使用者對 AI 代理人的核心恐懼是「它冷冰冰地把錢搞丟」。

暖橙(oklch 0.72 0.17 50)是決策的解藥:有溫度、有生命、但飽和度夠低不刺眼。 對應原則 03「夥伴關係,不是代理」— 顏色本身就是立場宣言。

Why 深色底

訪談顯示 Web3 使用者多在凌晨監看(時差、亞洲市場、鏈上事件),暗色介面對眼睛友善。 另一層原因是「警示色的對比強度」— 深色底讓 Panic 紅與 Warning 橘能拉出足夠視覺差異, 不會像亮色底那樣被整體色調稀釋。

Text

--foreground

oklch(0.97 0.008 70)

主要文字

--muted-foreground

oklch(0.68 0.008 70)

次要文字、提示

--primary-foreground

oklch(0.145 0.005 50)

Primary 上的文字

Semantic

用於非 Panic 的狀態指示

--success

oklch(0.75 0.15 155)

成功、正面

--warning

oklch(0.82 0.15 85)

警告、待確認

--info

oklch(0.7 0.13 225)

中性提示

--destructive

oklch(0.68 0.23 25)

刪除、撤銷

Why destructive ≠ panic

Destructive(紅偏粉)給「小範圍危險動作」使用 — 刪除一筆紀錄、取消一次訂閱。 Panic(飽和正紅)保留給「整個 session 級別的撤退」— 撤銷所有授權、切斷錢包連線。

兩者故意拉開色相差距(25° vs 25° 但飽和度差 0.04),避免使用者把「刪除交易」的肌肉記憶用在「緊急制動」。 這是原則 02「Panic 色是神聖的」的色票落地。

Panic · 緊急制動

神聖色 — 僅用於緊急中止情境,絕不重複使用

--panicSacred

oklch(0.63 0.27 25) · 僅用於 Emergency Stop 按鈕、異常警示、不可逆動作。

Why sacred? Week 1 原則 2:緊急制動神聖不可侵犯 — 若到處濫用紅色,真正需要時反而失去警示力。

Confidence Levels · 信心分數

AI 決策信心的視覺分級,與 Semantic 色分離使用

High

90 – 100%

AI 自主執行

Medium

60 – 89%

AI 執行但通知

Low

30 – 59%

AI 暫停,請使用者確認

Critical

< 30%

AI 拒絕執行,需人工決策

Why 4 階,不是 3 階或 5 階

大多數 AI 產品只顯示「高 / 中 / 低」三階。TrustGuard 故意切成四階,關鍵差異在 Critical(<30%)獨立出來 — 它的語意不是「信心很低」,而是「我建議你拒絕」。

3 階會讓 Low 同時包含「35% 需要你確認」與「15% 我不建議做」, 這兩個決策分歧很大。5 階又太細 — 使用者不會分辨 85% 和 92% 的差別。 4 階剛好對應四種不同動作:自主執行 / 執行但通知 / 暫停請示 / 拒絕。

Typography

Inter (拉丁) + Noto Sans TC (中文) + Geist Mono (數字、hash)。中英混排時同一層級視覺一致。

Scale

Display · 48px / 600

投資組合再平衡

Title 1 · 36px / 600

Portfolio Rebalancing

Title 2 · 30px / 600

AI 代理人正在思考

Title 3 · 24px / 500

Emergency Stop Activated

Heading · 20px / 500

今日資產變動

Lead · 18px / 400

偵測到 ETH 週漲幅達 12%

Body · 16px / 400

這筆交易將把你的 ETH 比例從 45% 降至 38%,符合保守再平衡策略。

Small · 14px / 400

Confidence: 92% · 已於 03:42 AM 執行

Caption · 12px / 400

最後同步:2 分鐘前 · Block #18923456

Monospace

Geist Mono — 用於 hash、地址、純數字

0xAbCd1234...ef56
0.3 ETH → 1,247.58 USDC
Block #18,923,456 · Gas 0.0042 ETH

Why 三種字體

Inter 處理拉丁文、Noto Sans TC 處理中文、Geist Mono 處理機器資料 — 三者的 x-height 與字重刻意挑過相近的,讓中英混排時同一層級視覺重量一致。

Mono 不是為了「工程師氣質」— 是因為 hash、地址、gas 這類資料需要等寬對齊掃讀,使用者比對 0x 開頭的前後 4 碼時才不會錯位。 這是原則 04「證據優先於承諾」的排版層面體現:鏈上資料用 mono,讓它看起來就是可驗證的。

Spacing & Radius

使用 Tailwind 4pt scale。Radius 以 0.625rem (10px) 為基數。

Spacing Scale

4pxp-1
8pxp-2
12pxp-3
16pxp-4
24pxp-6
32pxp-8
48pxp-12
64pxp-16

Radius Scale

sm6px
md8px
lg10px
xl14px
2xl18px
3xl22px

Why radius 偏大

基數從 10px 起跳、卡片預設 xl/2xl(14–18px),刻意比多數 fintech 圓潤。 尖角傳達「專業、嚴肅」,但對 AI 代理人來說容易過度冷漠; 圓角讓整個介面有「擬人感」,對應暖橙做的是同一件事 — 把硬體感柔化成夥伴感。

Shadows & Glows

陰影用於建立層次,Glow 用於強調 AI / Panic 狀態。

shadow-soft

卡片、對話框

shadow-lift

重要彈窗

shadow-glow-primary

AI 思考中

shadow-glow-panic

Panic 狀態

Why Glow 而不是加粗邊框

Agent 的「狀態」是動態的(思考中、警戒中),用 glow 擴散出邊框之外, 視覺上更像「輻射、呼吸」,比 solid border 更能傳達「它在運作」。

另一個原因:glow 本身是低飽和的顏色外溢,即使同時有 primary glow 和 panic glow 出現在同一畫面, 也不會互相搶焦 — 但如果是 2px border,視覺衝突會很強。

Components

基於 shadcn/ui,以 TrustGuard tokens 客製化。

Buttons

⚠️ Panic 情境不使用 Destructive — 改用專屬 PanicButton 元件(Day 11 建置)

Cards

ETH 再平衡
03:42 AM · Confidence 92%

偵測 ETH 週漲幅達 12%,依您設定觸發再平衡。

已完成 · 0.3 ETH → 1,247 USDC
需要您的確認
Confidence 45% · Low

市場波動超出歷史區間 2.3 倍,建議暫不執行。你覺得呢?

Badges

ActivePausedDry-runRevoked

Progress / Confidence Bar

ETH Confidence92%
x
Market Stability45%
x

Trust Components

這是 TrustGuard 最核心的四個元件,所有畫面都由它們組成。

ConfidenceScore

AI 的信心度視覺化。四種 variant,顏色依等級自動切換。

variant="bar"

高信心95
中等信心72
低信心45
極低信心18

variant="ring"

95
72
45
18

variant="dot"

95
72
45
18

variant="badge"

95· 高信心72· 中等信心45· 低信心18· 極低信心

Why 4 個 variant,不是 1 個

信心分數會出現在完全不同密度的畫面 — 卡片標頭只有 16px 高(用 dot), 對話框按鈕旁需要數字但不能搶焦(用 badge),Portfolio 大圖需要視覺主角(用 ring), 推理過程需要比較多組信心度(用 bar)。

同一筆資料用不同 variant 表達是故意的 — 原則 05「透明度要校準」: 資訊的重要性隨情境變化,元件要能隨之伸縮,而不是一種尺寸套到底。

StatusIndicator

Agent 當下的狀態。active / thinking 有動畫,critical 脈衝。

variant="pill" (default)

運作中分析中已暫停已撤銷緊急狀態

variant="icon"

ActivityCard

AI 的每一筆行動紀錄。pending_approval 才會顯示操作按鈕;reasoning 可摺疊。

今天 03:42 AM
已完成

ETH 再平衡

偵測 ETH 週漲幅達 12%,依您設定觸發再平衡。

0.3 ETH1,247 USDC
高信心92
昨天 14:30
等待決定

市場波動 · 暫停執行

市場波動超出歷史區間 2.3 倍,我不太確定該怎麼做。你覺得呢?

低信心45
昨天 09:15
已完成

USDC 質押收益入帳

每週 Aave USDC 質押收益自動領取。

USDC staked+$3.42
高信心98
2 天前 02:11
已攔截

可疑合約互動 · 已攔截

偵測到未驗證合約的 approve 請求,已自動阻擋並通知您。

極低信心18

AgentDialog

AI 主動向使用者說話。四種語氣:info / question / alert / success。

TrustGuard Agent運作中
今天 09:15

每日摘要已更新

昨日您的投資組合淨值 +1.2%。 已完成 3 筆再平衡、攔截 1 筆可疑合約互動。

TrustGuard Agent分析中
剛剛

我需要你的意見

市場波動超出歷史區間 2.3 倍,這個情境在歷史資料中僅出現 3 次。我對再平衡的信心下降到 45%,你覺得我應該先暫停嗎?

TrustGuard Agent緊急狀態
2 分鐘前

偵測到可疑活動

目標合約 0x3f...b2 未在白名單內,7 天內有 4 筆 rug 報告。 我已自動拒絕簽名並通知您。

TrustGuard Agent運作中
03:42 AM

ETH 再平衡已完成

依您設定的保守策略,自動賣出 0.3 ETH 換為 1,247 USDC。

Why AI 需要四種語氣

多數 AI 產品只有一種聲音 — 中性、禮貌、略帶行銷感。TrustGuard 把 AI 的語氣拆成四種, 因為 AI 在不同情境下對使用者的「情感負擔」完全不同:

info = 不打擾的摘要; question = 主動承認不確定(對應原則 03); alert = 該讓使用者警覺但不恐慌; success = 完成後簡潔回報,不邀功。

Alert 使用 scale + bounce 的 entrance animation,其他三種只是 fade-up — 動畫節奏本身就是語氣的一部分。

PanicButton

神聖紅按鈕 — 長按 1.5 秒確認撤銷。全專案僅此處允許大面積 panic 紅。

variant="solid" · sizes

variant="outline"

disabled

互動提示:按住任一顆按鈕不放,進度條會從左往右填滿;滿格後才真的撤銷。 中途放開則取消。

Why 長按 1.5 秒,不是確認對話框

PanicButton 是「不可逆動作」的代表 — 撤銷後所有授權需重新簽署。 業界慣例是「點擊 → 跳確認框 → 點 Yes」,但在恐慌場景下這個流程有兩個問題:

1. 使用者真的恐慌時,會連續快速點擊,確認框會被肌肉記憶秒點通過。 2. 確認框從按鈕處「飛出來」的時間成本與長按相當,但失去了「給使用者一個冷靜的 1.5 秒」。

長按的設計讓使用者在按住的過程中能夠反悔 — 放手就取消。 進度條視覺化這個「還沒發生、但正在逼近」的狀態,等於給使用者一個物理層面的 undo 緩衝。

TraceTimeline

AI 決策的推理軌跡。4 種節點:資料 / 推理 / 決策 / 執行,每一步都有證據可查。

  1. 資料03:42:08

    偵測到價格訊號

    ETH/USD 週線漲幅 +12.4%,24h 波動 2.8%。

  2. 推理03:42:10

    比對再平衡策略

    漲幅 12.4% 超過您設定的 10% 閾值 → 應賣出超額。

    高信心95
  3. 決策03:42:12

    決定執行部分賣出

    賣出 0.3 ETH(約佔 ETH 部位 15%),轉入 USDC。

    高信心92
  4. 執行03:42:15

    送出交易

    Hash: 0x8a…f3d · 已於 1 區塊內確認。

Why 把推理軌跡拆成 4 種節點

Black box 問題的標準解法是「把決策過程攤開」— 但若只是一串文字,使用者會略過。 TraceTimeline 把推理拆成 data → reasoning → decision → action 四種節點,每種節點的 icon 和可展開的 evidence 結構不同。

這個四段式對應心智模型: 「我看到什麼」→「我怎麼想」→「我決定什麼」→「我做了什麼」。 使用者可以在任一段質疑 AI — 是資料錯?推理錯?還是決策錯? 這是原則 04「證據優先於承諾」最直接的介面落地。

Motion

動畫語意:AI 思考 = 柔和呼吸感;Panic = 警覺脈衝;狀態切換 = 俐落不拖泥。

AI 正在思考

animate-thinking · 1.4s ease-in-out infinite

Panic 脈衝

animate-panic-pulse · 1.8s ease-in-out infinite

Why 1.4s 與 1.8s,不是更快

Thinking 用 1.4s 是貼近人類呼吸節奏(成人平均 12–16 次/分鐘,約 4s 一次完整呼吸、1.5s 一次吸氣)。 比這快會像「心跳過快」傳達焦慮;比這慢則失去「正在運作」的暗示。

Panic 脈衝故意用 1.8s — 比思考更慢。直覺上會以為緊急就該快閃,但快閃會讓使用者腎上腺素爆發、 做出不理性決定。1.8s 的節奏傳達的是「這很嚴重,但請冷靜看」, 配合長按 1.5s 的 PanicButton,整個 Panic 場景的節奏設計是「讓你警覺、但不讓你慌」。

Design Principles

貫穿所有設計決策的 5 條原則,來自 Week 1 使用者研究。

01

Translate, Don't Display

翻譯,不是顯示

AI 的技術資訊必須被翻譯成人話才能顯示。hash、wei、gas 都要人話化。

02

The Panic Button is Sacred

緊急制動神聖不可侵犯

在任何畫面、任何狀態,緊急制動必須 3 秒內可及。

03

Partnership, Not Delegation

是夥伴關係,不是丟包

介面語氣:「我們的組合」而非「你的組合」。AI 會主動問、會承認不確定。

04

Evidence Over Promises

用證據,不用承諾

信任來自可驗證的歷史,不是行銷話術。誠實顯示虧損。

05

Calibrated Transparency

分級透明

預設簡潔,想深入可展開。為散戶 / 進階 / 開發者提供不同深度。