un2266 Claude Opus 5 commited on
Commit
3dc69f8
·
1 Parent(s): 059e85b

淡藍底色體系:降低純白/純黑面積,深淺共用三層結構

Browse files

千卉回報「純黑或純白背景面積很大,整個視覺壓力也變大」,並指定淺色走
「氣泡淡藍+對話欄底稍深淡藍」(她的方案 2)、深色邏輯相同。量過之後
確認抱怨來源不只對話欄:淺色頁面底 #f8fafc 幾乎等於白,真正的大面積
純白是 --c-surface(表格資料列+所有 Gradio 區塊);深色則是 #020617
近乎純黑。

底色改成三層,淺深共用同一套邏輯:
底(--c-bg) 淺 #f8fafc→#e8f1fa 深 #020617→#0b1424
浮起物(--c-bubble-bg)淺 #eef2f7→#f5faff 深 #0d1526→#172136
資料紙張(--c-surface)淺 #ffffff 維持 深 #0d1526→#172136
淺色的表格/卡片刻意維持純白:75 項指標表格是資料密集區,可讀性優先於
「消滅所有純白」;染藍的是它下面那層底,白表格因此變成浮在淡藍上的紙張。
連帶 --c-surface2/--c-thead-bg/--background-fill-secondary 同批換成
同色相的值,避免藍底配灰塊。

線條改走 sky 相(千卉:淺色邊框不要太深,要維持亮麗的淺藍):
--c-border-strong #a3aebd→#6ba3d6(結構線,約 2.3:1)
--c-divider #b6c0cd→#a9cbe8(表格資料列細線)
--c-input-border #a3aebd→#7fb0d9(約 2.0:1)
亮度級距不動,只換色相,手感與上一輪柔化後相同。

順帶修掉一個自己上一輪引入的深淺不一致:氣泡邊框原本共用 --c-divider,
淺色值卻是對著「深色結構線那一級(alpha .28)」挑的,而深色 --c-divider
是更淡的 .18,實測深色 1.37:1/淺色 1.61:1,兩個主題看起來不一樣。改成
獨立 token --c-bubble-border(淺 #a9cbe8、深 rgba(148,163,184,.26)),
兩邊實測都是 1.61:1,--c-divider 也回歸單一用途。

docs/design.md 同步:新增「底色體系:三層」章節(含淺色表格為何維持白底
的準則)、線條表換新值並補「淺色一律走 sky 相」、氣泡章節記錄跨主題對齊
要給獨立 token 的教訓。

驗證:三個 token 宣告點同步(app.css :root/.dark、app_agent.py
_DARK_MODE_HEAD_CSS)。本機 .venv + Playwright 走完情境 1(真實檔案選擇器
上傳→格式驗證→語料說明→略過→運算完成→語言指標分析結果頁),淺深兩色
各量一輪:淺色文字 6.06–12.81:1、結構線 2.14–2.35:1、氣泡邊框 1.61:1;
深色文字 5.59–14.95:1、結構線 1.65–1.66:1、氣泡邊框 1.61:1。底色實際
渲染像素以 PIL 取樣確認(淺 232,241,250/深 11,20,36),未只憑目測。
console 僅 3 筆既有外部資源錯誤。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MQuAXWC1hCsiT48TXftPc7

Files changed (3) hide show
  1. app_agent.py +7 -6
  2. assets/app.css +40 -15
  3. docs/design.md +41 -20
app_agent.py CHANGED
@@ -1917,9 +1917,9 @@ _DARK_MODE_HEAD_CSS = """
1917
  }
1918
  @media (prefers-color-scheme: dark) {
1919
  :root:not(.light) {
1920
- --c-bg: #020617;
1921
- --c-surface: #0d1526;
1922
- --c-surface2: #111827;
1923
  --c-surface3: #1e293b;
1924
  --c-surface3-border: #334155;
1925
  --c-border: rgba(14,165,233,.11);
@@ -1930,8 +1930,9 @@ _DARK_MODE_HEAD_CSS = """
1930
  就會在某一種深色觸發方式下退回淺色值。 */
1931
  --c-border-strong: rgba(148,163,184,.28);
1932
  --c-divider: rgba(148,163,184,.18);
1933
- --c-thead-bg: #111827;
1934
- --c-bubble-bg: #0d1526;
 
1935
  --c-accent: #0ea5e9;
1936
  --c-accent-strong: #38bdf8;
1937
  --c-accent2: #818cf8;
@@ -1961,7 +1962,7 @@ _DARK_MODE_HEAD_CSS = """
1961
 
1962
  --body-background-fill: var(--c-bg) !important;
1963
  --background-fill-primary: var(--c-surface) !important;
1964
- --background-fill-secondary: #090e1a !important;
1965
  --block-background-fill: var(--c-surface) !important;
1966
  --block-border-color: var(--c-border) !important;
1967
  --border-color-primary: var(--c-border) !important;
 
1917
  }
1918
  @media (prefers-color-scheme: dark) {
1919
  :root:not(.light) {
1920
+ --c-bg: #0b1424;
1921
+ --c-surface: #172136;
1922
+ --c-surface2: #1b2740;
1923
  --c-surface3: #1e293b;
1924
  --c-surface3-border: #334155;
1925
  --c-border: rgba(14,165,233,.11);
 
1930
  就會在某一種深色觸發方式下退回淺色值。 */
1931
  --c-border-strong: rgba(148,163,184,.28);
1932
  --c-divider: rgba(148,163,184,.18);
1933
+ --c-bubble-border: rgba(148,163,184,.26);
1934
+ --c-thead-bg: #1e2a42;
1935
+ --c-bubble-bg: #172136;
1936
  --c-accent: #0ea5e9;
1937
  --c-accent-strong: #38bdf8;
1938
  --c-accent2: #818cf8;
 
1962
 
1963
  --body-background-fill: var(--c-bg) !important;
1964
  --background-fill-primary: var(--c-surface) !important;
1965
+ --background-fill-secondary: #080f1c !important;
1966
  --block-background-fill: var(--c-surface) !important;
1967
  --block-border-color: var(--c-border) !important;
1968
  --border-color-primary: var(--c-border) !important;
assets/app.css CHANGED
@@ -9,10 +9,20 @@
9
 
10
  /* ── 1. TOKENS & RESET ─────────────────────────────────────────── */
11
  /* 預設淺色;系統設定為深色模式時(或明確帶 .dark class)自動切換深色 */
 
 
 
 
 
 
 
 
 
 
12
  :root {
13
- --c-bg: #f8fafc;
14
  --c-surface: #ffffff;
15
- --c-surface2: #f1f5f9;
16
  --c-surface3: #ffffff;
17
  --c-surface3-border: #e2e8f0;
18
  --c-border: rgba(2,132,199,.16);
@@ -34,16 +44,28 @@
34
  跟深色 rgba(148,163,184,.28) 疊 #0d1526 算出來的 1.67:1 幾乎相同,
35
  這就是「深淺兩個模式的氣泡邊框看起來一樣淡」的依據(用量測對齊,
36
  不是各自挑一個看起來順眼的值)。
 
 
 
 
 
 
37
  --c-border 本身維持原值不動:它還餵給 --block-border-color/
38
  --border-color-primary 這兩個 Gradio 原生元件用的變數,動了會牽連
39
  一整批沒盤點過的元件。 */
40
- --c-border-strong: #a3aebd;
41
- --c-divider: #b6c0cd;
 
 
 
 
 
 
42
  /* 表格表頭底色與對話氣泡底色改成獨立 token(原本借用 --c-surface2/
43
  --c-surface):淺色時兩者疊在自己的鄰接底色上都只有 1.03–1.07:1,
44
  業主回報「表頭跟文字黏在一起」「看不清楚區塊的顏色」就是這個。 */
45
- --c-thead-bg: #e2e8f0;
46
- --c-bubble-bg: #eef2f7;
47
  --c-accent: #0284c7;
48
  --c-accent-strong: #0369a1;
49
  --c-accent2: #4f46e5;
@@ -68,7 +90,7 @@
68
  --c-input-bg: #ffffff;
69
  /* 2026-08-12:原本 rgba(2,132,199,.22) 疊白只有約 1.3:1,輸入框邊界同樣
70
  受 1.4.11 的 3:1 規範;語料 metadata 表單「欄位看不清楚」有一半是這條。 */
71
- --c-input-border: #a3aebd;
72
  --c-link-hover: #075985;
73
  --c-scrollbar: #cbd5e1;
74
  --c-scrollbar-hover: #94a3b8;
@@ -77,7 +99,7 @@
77
 
78
  --body-background-fill: var(--c-bg) !important;
79
  --background-fill-primary: var(--c-surface) !important;
80
- --background-fill-secondary: #eef2f7 !important;
81
  --block-background-fill: var(--c-surface) !important;
82
  --block-border-color: var(--c-border) !important;
83
  --border-color-primary: var(--c-border) !important;
@@ -97,9 +119,9 @@
97
  :root 一旦被包進 @media 只會留下加了前綴的版本,而 ":root" 不可能是任何元素的子孫,等於永遠不會命中。 */
98
  /* 明確以 ?__theme=dark 網址參數強制深色時 */
99
  .dark {
100
- --c-bg: #020617;
101
- --c-surface: #0d1526;
102
- --c-surface2: #111827;
103
  --c-surface3: #1e293b;
104
  --c-surface3-border: #334155;
105
  --c-border: rgba(14,165,233,.11);
@@ -109,8 +131,11 @@
109
  那些個別覆寫規則就整組刪掉了,避免同一個色值散落六處。 */
110
  --c-border-strong: rgba(148,163,184,.28);
111
  --c-divider: rgba(148,163,184,.18);
112
- --c-thead-bg: #111827;
113
- --c-bubble-bg: #0d1526;
 
 
 
114
  --c-accent: #0ea5e9;
115
  --c-accent-strong: #38bdf8;
116
  --c-accent2: #818cf8;
@@ -140,7 +165,7 @@
140
 
141
  --body-background-fill: var(--c-bg) !important;
142
  --background-fill-primary: var(--c-surface) !important;
143
- --background-fill-secondary: #090e1a !important;
144
  --block-background-fill: var(--c-surface) !important;
145
  --block-border-color: var(--c-border) !important;
146
  --border-color-primary: var(--c-border) !important;
@@ -653,7 +678,7 @@ div[role="log"][aria-label="chatbot conversation"],
653
  深色 rgba(148,163,184,.28) 疊 #0d1526 是 1.67:1,兩個模式的邊框
654
  亮度差幾乎相同,看起來才是同一種「淡邊框」。 */
655
  background: var(--c-bubble-bg) !important;
656
- border: 1px solid var(--c-divider) !important;
657
  border-radius: 10px !important;
658
  }
659
  /* ── AI 頭像(2026-08-12,業主要求)─────────────────────────────
 
9
 
10
  /* ── 1. TOKENS & RESET ─────────────────────────────────────────── */
11
  /* 預設淺色;系統設定為深色模式時(或明確帶 .dark class)自動切換深色 */
12
+ /* 底色體系(2026-08-12 三修):千卉回報「純黑或純白背景面積很大,視覺壓力
13
+ 也變大」。量過三層才確定抱怨的來源不只對話欄——淺色的頁面底 #f8fafc 幾乎
14
+ 等於白,而真正的大面積純白是 --c-surface(表格資料列+所有 Gradio 區塊);
15
+ 深色則是 #020617 近乎純黑。改成三層結構,淺深共用同一套邏輯:
16
+ 底(--c-bg) 淡藍/帶藍深色,鋪滿頁面、canvas、導覽、對話欄
17
+ 浮起物(--c-bubble-bg)比底亮一階,對話氣泡
18
+ 資料紙張(--c-surface)淺色維持純白當表格底(資料密集區可讀性優先),
19
+ 深色跟著抬亮
20
+ 淺色氣泡「比欄底亮一階、浮在上面」是千卉選的方案 2,剛好與深色本來就有的
21
+ 關係(氣泡比欄底亮)一致,兩個主題不再各講各的。 */
22
  :root {
23
+ --c-bg: #e8f1fa;
24
  --c-surface: #ffffff;
25
+ --c-surface2: #eef5fc;
26
  --c-surface3: #ffffff;
27
  --c-surface3-border: #e2e8f0;
28
  --c-border: rgba(2,132,199,.16);
 
44
  跟深色 rgba(148,163,184,.28) 疊 #0d1526 算出來的 1.67:1 幾乎相同,
45
  這就是「深淺兩個模式的氣泡邊框看起來一樣淡」的依據(用量測對齊,
46
  不是各自挑一個看起來順眼的值)。
47
+ 2026-08-12 三修(千卉:淺色系的邊框不要太深,要維持亮麗的淺藍):
48
+ #a3aebd/#b6c0cd 是中性灰藍,配上這輪的淡藍底會顯灰、顯髒。改走
49
+ sky 相:結構線 #6ba3d6、細線 #a9cbe8、輸入框 #7fb0d9。**亮度級距
50
+ 不動**(結構線仍約 2.3:1、氣泡邊框仍約 1.6:1,跟前一輪柔化後的手感
51
+ 相同),換的是色相不是輕重——這樣既維持千卉要的柔和度,也讓線條跟
52
+ 底色同屬一個藍色家族。
53
  --c-border 本身維持原值不動:它還餵給 --block-border-color/
54
  --border-color-primary 這兩個 Gradio 原生元件用的變數,動了會牽連
55
  一整批沒盤點過的元件。 */
56
+ --c-border-strong: #6ba3d6;
57
+ --c-divider: #a9cbe8;
58
+ /* 對話氣泡邊框獨立一個 token:前一版讓它共用 --c-divider,結果深淺兩邊
59
+ 對不齊——淺色的 #a9cbe8 是對著「結構線那一級的深色值(alpha .28)」
60
+ 挑的,但深色的 --c-divider 其實是更淡的 .18,實測深色氣泡邊框只有
61
+ 1.37:1、淺色 1.61:1,兩個模式看起來不一樣。分成獨立 token 之後兩邊
62
+ 各自對齊到 1.61:1,--c-divider 也回歸單一用途(表格資料列細線)。 */
63
+ --c-bubble-border: #a9cbe8;
64
  /* 表格表頭底色與對話氣泡底色改成獨立 token(原本借用 --c-surface2/
65
  --c-surface):淺色時兩者疊在自己的鄰接底色上都只有 1.03–1.07:1,
66
  業主回報「表頭跟文字黏在一起」「看不清楚區塊的顏色」就是這個。 */
67
+ --c-thead-bg: #d8e8f6;
68
+ --c-bubble-bg: #f5faff;
69
  --c-accent: #0284c7;
70
  --c-accent-strong: #0369a1;
71
  --c-accent2: #4f46e5;
 
90
  --c-input-bg: #ffffff;
91
  /* 2026-08-12:原本 rgba(2,132,199,.22) 疊白只有約 1.3:1,輸入框邊界同樣
92
  受 1.4.11 的 3:1 規範;語料 metadata 表單「欄位看不清楚」有一半是這條。 */
93
+ --c-input-border: #7fb0d9;
94
  --c-link-hover: #075985;
95
  --c-scrollbar: #cbd5e1;
96
  --c-scrollbar-hover: #94a3b8;
 
99
 
100
  --body-background-fill: var(--c-bg) !important;
101
  --background-fill-primary: var(--c-surface) !important;
102
+ --background-fill-secondary: #dfeaf6 !important;
103
  --block-background-fill: var(--c-surface) !important;
104
  --block-border-color: var(--c-border) !important;
105
  --border-color-primary: var(--c-border) !important;
 
119
  :root 一旦被包進 @media 只會留下加了前綴的版本,而 ":root" 不可能是任何元素的子孫,等於永遠不會命中。 */
120
  /* 明確以 ?__theme=dark 網址參數強制深色時 */
121
  .dark {
122
+ --c-bg: #0b1424;
123
+ --c-surface: #172136;
124
+ --c-surface2: #1b2740;
125
  --c-surface3: #1e293b;
126
  --c-surface3-border: #334155;
127
  --c-border: rgba(14,165,233,.11);
 
131
  那些個別覆寫規則就整組刪掉了,避免同一個色值散落六處。 */
132
  --c-border-strong: rgba(148,163,184,.28);
133
  --c-divider: rgba(148,163,184,.18);
134
+ /* .26 是實測對齊值:疊在深色氣泡底 #172136 上等於 1.61:1,跟淺色
135
+ #a9cbe8 疊 #f5faff 的 1.61:1 相同(見 :root 的同名 token 註解)。 */
136
+ --c-bubble-border: rgba(148,163,184,.26);
137
+ --c-thead-bg: #1e2a42;
138
+ --c-bubble-bg: #172136;
139
  --c-accent: #0ea5e9;
140
  --c-accent-strong: #38bdf8;
141
  --c-accent2: #818cf8;
 
165
 
166
  --body-background-fill: var(--c-bg) !important;
167
  --background-fill-primary: var(--c-surface) !important;
168
+ --background-fill-secondary: #080f1c !important;
169
  --block-background-fill: var(--c-surface) !important;
170
  --block-border-color: var(--c-border) !important;
171
  --border-color-primary: var(--c-border) !important;
 
678
  深色 rgba(148,163,184,.28) 疊 #0d1526 是 1.67:1,兩個模式的邊框
679
  亮度差幾乎相同,看起來才是同一種「淡邊框」。 */
680
  background: var(--c-bubble-bg) !important;
681
+ border: 1px solid var(--c-bubble-border) !important;
682
  border-radius: 10px !important;
683
  }
684
  /* ── AI 頭像(2026-08-12,業主要求)─────────────────────────────
docs/design.md CHANGED
@@ -1,5 +1,5 @@
1
  ---
2
- version: 1.1
3
  project: SpectraEngine(譯彩紛呈 II 分析引擎)
4
  brand: 致理科技大學應日系 鄧老師委託案
5
  last_updated: 2026-08-12
@@ -7,18 +7,18 @@ source: assets/app.css(E4 抽出前為 app_agent.py 內嵌 _CUSTOM_CSS 常數
7
 
8
  colors:
9
  light:
10
- bg: "#f8fafc"
11
  surface: "#ffffff"
12
- surface2: "#f1f5f9"
13
  surface3: "#ffffff"
14
  surface3-border: "#e2e8f0"
15
  border: "rgba(2,132,199,.16)"
16
  border-hover: "rgba(2,132,199,.35)"
17
- border-strong: "#a3aebd"
18
- divider: "#b6c0cd"
19
- thead-bg: "#e2e8f0"
20
- bubble-bg: "#eef2f7"
21
- input-border: "#a3aebd"
22
  accent: "#0284c7"
23
  accent-strong: "#0369a1"
24
  accent2: "#4f46e5"
@@ -34,17 +34,17 @@ colors:
34
  user-bubble-border: "#86efac"
35
  user-bubble-text: "#166534"
36
  dark:
37
- bg: "#020617"
38
- surface: "#0d1526"
39
- surface2: "#111827"
40
  surface3: "#1e293b"
41
  surface3-border: "#334155"
42
  border: "rgba(14,165,233,.11)"
43
  border-hover: "rgba(14,165,233,.30)"
44
  border-strong: "rgba(148,163,184,.28)"
45
  divider: "rgba(148,163,184,.18)"
46
- thead-bg: "#111827"
47
- bubble-bg: "#0d1526"
48
  input-border: "rgba(14,165,233,.15)"
49
  accent: "#0ea5e9"
50
  accent-strong: "#38bdf8"
@@ -141,6 +141,23 @@ layout:
141
 
142
  淺色模式的一般強調色 `#0284c7`(accent)用於一般大小的內文文字時,對比度 4.09:1 略低於 WCAG AA 的 4.5:1 門檻,但用於按鈕/圖示/大字等允許 3:1 門檻的地方完全合格。系統另外準備了 `accent-strong`(`#0369a1`,5.93:1)供小字/連結專用。**兩者不能混用**:一般強調色用在按鈕/圖示/大字,加強強調色用在小字/連結文字。
143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  ### 邊界與分隔線:兩級線條(2026-08-12 新增)
145
 
146
  WCAG 1.4.11 對「UI 元件與圖形物件的邊界」要求 3:1,這條在淺色模式一直沒被滿足:`--c-border`(`rgba(2,132,199,.16)`)疊在白/近白底上只有約 1.2:1,區塊外框、水平分界線、表格框線在淺色模式等於看不見(深色模式當初已針對 `.app-header`、欄邊框、標題底線個別補成 `rgba(148,163,184,.28)`,淺色端從沒補)。業主 2026-08-12 回報「淺色版看不清楚區塊的顏色」即為此。
@@ -149,22 +166,26 @@ WCAG 1.4.11 對「UI 元件與圖形物件的邊界」要求 3:1,這條在淺
149
 
150
  | Token | 用途 | 淺色 | 深色 |
151
  | :--- | :--- | :--- | :--- |
152
- | `--c-border-strong` | 結構線:區塊外框、欄位分隔、頂部列底線、標題底線、`hr`、表格外框與表頭分界 | `#a3aebd`(對白 2.25:1) | `rgba(148,163,184,.28)` |
153
- | `--c-divider` | 細線:表格資料列之間這種密集重複的線、對話氣泡邊框 | `#b6c0cd`(對氣泡底 1.64:1、對欄底 1.76:1) | `rgba(148,163,184,.18)` |
 
 
154
 
155
  密集重複的線刻意不拉到 3:1:整張資料表如果每一條線都是結構線強度,會變成網格紙、反而更難讀,1.4.11 的門檻也只針對「識別元件所必需」的邊界。
156
 
157
- **結構線 2.25:1 是刻意離開 3:1 門檻的決定**:第一版用 `#7c8798`(3.64:1,完全符合 1.4.11),實機檢視後判斷線條太搶眼、視覺變吵,柔化到 2.25:1。這個值仍是改版前 1.2:1 的近兩倍,業主回報的「淺色看不清楚區塊」在這個亮度差已解決。文字對比不受這條影響,全站文字仍通過 AA(淺色 6.15–14:1)。日後若無障礙稽核要求嚴格達標,把這個 token 調回 `#7c8798` 即可,全站 19 處線條會一起跟上,不用逐處改。
158
 
159
- `--c-border` 本身維持原值,因為它同時餵給 `--block-border-color` 與 `--border-color-primary` 兩個 Gradio 原生元件變數,改動會牽連一整批沒盤點過的元件。
160
 
161
- 同批把 `--c-input-border`(淺色)從 `rgba(2,132,199,.22)`(約 1.3:1)改成 `#7c8798`:輸入框邊界同樣受 1.4.11 規範,這是語料 metadata 表單「欄位看不清楚」的另一半原因。
162
 
163
  ### 對話氣泡(2026-08-12 更新)
164
 
165
- 淺色氣泡原本是白底無框,疊在對話欄底 `#f8fafc` 上只有 1.07:1。定案改成 **填色+淡邊框**:底色 `--c-bubble-bg`(淺色 `#eef2f7`、深色維持 `#0d1526`),外加 1px `--c-divider`。
 
 
166
 
167
- 邊框用細線而非結構線,是為了讓兩個主題的氣泡看起來一樣淡:淺色 `#b6c0cd` 對氣泡底 1.64:1、對欄底 1.76:1,深色 `rgba(148,163,184,.28)` 疊 `#0d1526` 算出來是 1.67:1。**「深淺一致」是用量測對齊的,不是兩邊各挑一個看起來順眼的值。**
168
 
169
  可見邊界畫在內層 `.md`,不是外層 `.message`(量測時要認這層)。使用者訊息與 AI 訊息共用同一層,目前兩側同款氣泡、只靠左右對齊區分,是 2026-08-12 業主確認過的現況。
170
 
 
1
  ---
2
+ version: 1.2
3
  project: SpectraEngine(譯彩紛呈 II 分析引擎)
4
  brand: 致理科技大學應日系 鄧老師委託案
5
  last_updated: 2026-08-12
 
7
 
8
  colors:
9
  light:
10
+ bg: "#e8f1fa"
11
  surface: "#ffffff"
12
+ surface2: "#eef5fc"
13
  surface3: "#ffffff"
14
  surface3-border: "#e2e8f0"
15
  border: "rgba(2,132,199,.16)"
16
  border-hover: "rgba(2,132,199,.35)"
17
+ border-strong: "#6ba3d6"
18
+ divider: "#a9cbe8"
19
+ thead-bg: "#d8e8f6"
20
+ bubble-bg: "#f5faff"
21
+ input-border: "#7fb0d9"
22
  accent: "#0284c7"
23
  accent-strong: "#0369a1"
24
  accent2: "#4f46e5"
 
34
  user-bubble-border: "#86efac"
35
  user-bubble-text: "#166534"
36
  dark:
37
+ bg: "#0b1424"
38
+ surface: "#172136"
39
+ surface2: "#1b2740"
40
  surface3: "#1e293b"
41
  surface3-border: "#334155"
42
  border: "rgba(14,165,233,.11)"
43
  border-hover: "rgba(14,165,233,.30)"
44
  border-strong: "rgba(148,163,184,.28)"
45
  divider: "rgba(148,163,184,.18)"
46
+ thead-bg: "#1e2a42"
47
+ bubble-bg: "#172136"
48
  input-border: "rgba(14,165,233,.15)"
49
  accent: "#0ea5e9"
50
  accent-strong: "#38bdf8"
 
141
 
142
  淺色模式的一般強調色 `#0284c7`(accent)用於一般大小的內文文字時,對比度 4.09:1 略低於 WCAG AA 的 4.5:1 門檻,但用於按鈕/圖示/大字等允許 3:1 門檻的地方完全合格。系統另外準備了 `accent-strong`(`#0369a1`,5.93:1)供小字/連結專用。**兩者不能混用**:一般強調色用在按鈕/圖示/大字,加強強調色用在小字/連結文字。
143
 
144
+ ### 底色體系:三層(2026-08-12 新增)
145
+
146
+ 業主回報「純黑或純白背景面積很大,整個視覺壓力也變大」。量過之後確認抱怨的來源不只對話欄:淺色的頁面底 `#f8fafc` 幾乎等於白,而真正的大面積純白是 `--c-surface`(表格資料列與所有 Gradio 區塊);深色則是 `#020617` 近乎純黑。
147
+
148
+ 改成三層結構,淺色與深色共用同一套邏輯:
149
+
150
+ | 層 | Token | 淺色 | 深色 | 鋪在哪 |
151
+ | :--- | :--- | :--- | :--- | :--- |
152
+ | 底 | `--c-bg` | `#e8f1fa` | `#0b1424` | 頁面、canvas、導覽列、對話欄 |
153
+ | 浮起物 | `--c-bubble-bg` | `#f5faff` | `#172136` | 對話氣泡,比底亮一階 |
154
+ | 資料紙張 | `--c-surface` | `#ffffff` | `#172136` | 表格資料列、卡片、輸入框、Gradio 區塊 |
155
+
156
+ 兩個判斷準則:
157
+
158
+ - **淺色的資料紙張維持純白**,不跟著染藍。75 項指標表格是資料密集區,白底的可讀性優先於「消滅所有純白」;染藍的是它下面那層底,白色表格因此變成浮在淡藍上的紙張,層次比原本白疊白更清楚。
159
+ - **氣泡比底亮一階、浮在上面**,深淺一致。深色本來就是這個關係(原 `#0d1526` 浮在 `#020617` 上),這輪讓淺色跟上,兩個主題不再各講各的。近白區間的填色差本來就只有一階,邊界靠細線邊框補(見下)。
160
+
161
  ### 邊界與分隔線:兩級線條(2026-08-12 新增)
162
 
163
  WCAG 1.4.11 對「UI 元件與圖形物件的邊界」要求 3:1,這條在淺色模式一直沒被滿足:`--c-border`(`rgba(2,132,199,.16)`)疊在白/近白底上只有約 1.2:1,區塊外框、水平分界線、表格框線在淺色模式等於看不見(深色模式當初已針對 `.app-header`、欄邊框、標題底線個別補成 `rgba(148,163,184,.28)`,淺色端從沒補)。業主 2026-08-12 回報「淺色版看不清楚區塊的顏色」即為此。
 
166
 
167
  | Token | 用途 | 淺色 | 深色 |
168
  | :--- | :--- | :--- | :--- |
169
+ | `--c-border-strong` | 結構線:區塊外框、欄位分隔、頂部列底線、標題底線、`hr`、表格外框與表頭分界 | `#6ba3d6`(對底約 2.3:1) | `rgba(148,163,184,.28)` |
170
+ | `--c-divider` | 細線:表格資料列之間這種密集重複的線 | `#a9cbe8` | `rgba(148,163,184,.18)` |
171
+ | `--c-bubble-border` | 對話氣泡邊框(獨立一級,兩個主題實測對齊 1.61:1) | `#a9cbe8` | `rgba(148,163,184,.26)` |
172
+ | `--c-input-border` | 輸入框邊界 | `#7fb0d9`(約 2.0:1) | `rgba(14,165,233,.15)` |
173
 
174
  密集重複的線刻意不拉到 3:1:整張資料表如果每一條線都是結構線強度,會變成網格紙、反而更難讀,1.4.11 的門檻也只針對「識別元件所必需」的邊界。
175
 
176
+ **淺色線條一律走 sky 相,不用中性灰藍。** 中間版本曾用 `#a3aebd`/`#b6c0cd`(同樣的亮度級距、但偏灰),配上淡藍底會顯灰顯髒,業主明確要求「維持亮麗的淺藍」。換色相時**亮度級距不動**,手感才不會又跑掉。
177
 
178
+ **結構線約 2.3:1 是刻意離開 3:1 門檻的決定**:第一版用 `#7c8798`(3.64:1,完全符合 1.4.11),實機檢視後判斷線條太搶眼、視覺變吵,柔化到這一級。這個值仍是改版前 1.2:1 的近兩倍,業主回報的「淺色看不清楚區塊」在這個亮度差已解決。文字對比不受這條影響,全站文字仍通過 AA。日後若無障礙稽核要求嚴格達標,把這個 token 換成同色相但更深的 sky 值即可,全站 19 處線條會一起跟上,不用逐處改。
179
 
180
+ `--c-border` 本身維持原值,因為它同時餵給 `--block-border-color` 與 `--border-color-primary` 兩個 Gradio 原生元件變數,改動會牽連一整批沒盤點過的元件。
181
 
182
  ### 對話氣泡(2026-08-12 更新)
183
 
184
+ 淺色氣泡原本是白底無框,疊在對話欄底 `#f8fafc` 上只有 1.07:1。定案改成 **填色+淡邊框**:底色 `--c-bubble-bg`(淺色 `#f5faff`、深色 `#172136`),外加 1px `--c-bubble-border`。氣泡比欄底亮一階、浮在上面(見上方「底色體系」)。
185
+
186
+ 邊框比結構線淡,才不會讓每一則訊息都像一張卡片。**「深淺一致」是用量測對齊的,不是兩邊各挑一個看起來順眼的值**:淺色 `#a9cbe8` 疊 `#f5faff` 與深色 `rgba(148,163,184,.26)` 疊 `#172136`,兩邊都是 1.61:1。
187
 
188
+ 這裡踩過一次坑值得記下來:中間版本讓氣泡邊框共用 `--c-divider`,淺色值卻是對著「深色結構線那一級(alpha `.28`)」挑的,而深色 `--c-divider` 其實是更淡的 `.18`——結果深色氣泡邊框只有 1.37:1、淺色 1.61:1,兩個主題看起來不一樣。**跨主題要對齊的視覺元素,就給它自己的 token,不要借用剛好數值接近的鄰居。**
189
 
190
  可見邊界畫在內層 `.md`,不是外層 `.message`(量測時要認這層)。使用者訊息與 AI 訊息共用同一層,目前兩側同款氣泡、只靠左右對齊區分,是 2026-08-12 業主確認過的現況。
191