@qijenchen/design-system 0.1.0-beta.74 → 0.1.0-beta.75

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (82) hide show
  1. package/dist/components/BulkActionBar/bulk-action-bar.d.ts.map +1 -1
  2. package/dist/components/BulkActionBar/bulk-action-bar.js +1 -1
  3. package/dist/components/BulkActionBar/bulk-action-bar.js.map +1 -1
  4. package/dist/components/DataTable/data-table.d.ts +27 -6
  5. package/dist/components/DataTable/data-table.d.ts.map +1 -1
  6. package/dist/components/DataTable/data-table.js +57 -34
  7. package/dist/components/DataTable/data-table.js.map +1 -1
  8. package/ds-canonical/hooks/check_story_invariants.sh +26 -0
  9. package/ds-canonical/hooks/tests/test_check_story_invariants.sh +30 -0
  10. package/llms-full.txt +1 -1
  11. package/llms.txt +1 -1
  12. package/package.json +1 -1
  13. package/src/components/Accordion/accordion.principles.stories.tsx +3 -3
  14. package/src/components/Alert/alert.principles.stories.tsx +5 -5
  15. package/src/components/AppShell/app-shell.principles.stories.tsx +6 -6
  16. package/src/components/AspectRatio/aspect-ratio.principles.stories.tsx +1 -1
  17. package/src/components/Avatar/avatar.principles.stories.tsx +3 -3
  18. package/src/components/Badge/badge.principles.stories.tsx +3 -3
  19. package/src/components/Breadcrumb/breadcrumb.principles.stories.tsx +3 -3
  20. package/src/components/BulkActionBar/bulk-action-bar.anatomy.stories.tsx +1 -1
  21. package/src/components/BulkActionBar/bulk-action-bar.principles.stories.tsx +3 -3
  22. package/src/components/BulkActionBar/bulk-action-bar.spec.md +4 -2
  23. package/src/components/BulkActionBar/bulk-action-bar.stories.tsx +2 -2
  24. package/src/components/BulkActionBar/bulk-action-bar.tsx +3 -2
  25. package/src/components/Button/button.principles.stories.tsx +3 -3
  26. package/src/components/Calendar/calendar.principles.stories.tsx +3 -3
  27. package/src/components/Carousel/carousel.principles.stories.tsx +2 -2
  28. package/src/components/Chart/chart.principles.stories.tsx +4 -4
  29. package/src/components/Checkbox/checkbox.principles.stories.tsx +2 -2
  30. package/src/components/Chip/chip.principles.stories.tsx +3 -3
  31. package/src/components/Coachmark/coachmark.principles.stories.tsx +3 -3
  32. package/src/components/Combobox/combobox.anatomy.stories.tsx +2 -2
  33. package/src/components/Combobox/combobox.principles.stories.tsx +5 -5
  34. package/src/components/Command/command.principles.stories.tsx +7 -7
  35. package/src/components/DataTable/data-table.principles.stories.tsx +3 -3
  36. package/src/components/DataTable/data-table.spec.md +23 -15
  37. package/src/components/DataTable/data-table.stories.tsx +29 -25
  38. package/src/components/DataTable/data-table.tsx +92 -44
  39. package/src/components/DateGrid/date-grid.principles.stories.tsx +4 -4
  40. package/src/components/DatePicker/date-picker.principles.stories.tsx +5 -5
  41. package/src/components/DescriptionList/description-list.principles.stories.tsx +5 -5
  42. package/src/components/Dialog/dialog.principles.stories.tsx +4 -4
  43. package/src/components/DropdownMenu/dropdown-menu.anatomy.stories.tsx +1 -1
  44. package/src/components/DropdownMenu/dropdown-menu.principles.stories.tsx +5 -5
  45. package/src/components/Empty/empty.principles.stories.tsx +2 -2
  46. package/src/components/Field/field.principles.stories.tsx +4 -4
  47. package/src/components/FileItem/file-item.principles.stories.tsx +5 -5
  48. package/src/components/FileUpload/file-upload.principles.stories.tsx +4 -4
  49. package/src/components/FileViewer/file-viewer.principles.stories.tsx +5 -5
  50. package/src/components/HoverCard/hover-card.principles.stories.tsx +5 -5
  51. package/src/components/Input/input.principles.stories.tsx +4 -4
  52. package/src/components/LinkInput/link-input.principles.stories.tsx +5 -5
  53. package/src/components/Menu/menu-item.principles.stories.tsx +7 -7
  54. package/src/components/Notice/notice.principles.stories.tsx +7 -7
  55. package/src/components/NumberInput/number-input.principles.stories.tsx +4 -4
  56. package/src/components/OverflowIndicator/overflow-indicator.principles.stories.tsx +5 -5
  57. package/src/components/PeoplePicker/people-picker.principles.stories.tsx +3 -3
  58. package/src/components/Popover/popover.principles.stories.tsx +1 -1
  59. package/src/components/ProfileCard/profile-card.principles.stories.tsx +1 -1
  60. package/src/components/ProgressBar/progress-bar.principles.stories.tsx +2 -2
  61. package/src/components/RadioGroup/radio-group.principles.stories.tsx +2 -2
  62. package/src/components/Rating/rating.principles.stories.tsx +3 -3
  63. package/src/components/ScrollArea/scroll-area.principles.stories.tsx +4 -4
  64. package/src/components/Select/select.principles.stories.tsx +5 -5
  65. package/src/components/SelectMenu/select-menu.principles.stories.tsx +8 -8
  66. package/src/components/SelectionControl/selection-item.principles.stories.tsx +7 -7
  67. package/src/components/Separator/separator.principles.stories.tsx +4 -4
  68. package/src/components/Sheet/sheet.principles.stories.tsx +2 -2
  69. package/src/components/Sidebar/sidebar.principles.stories.tsx +4 -4
  70. package/src/components/Skeleton/skeleton.principles.stories.tsx +5 -5
  71. package/src/components/Slider/slider.principles.stories.tsx +3 -3
  72. package/src/components/Steps/steps.principles.stories.tsx +4 -4
  73. package/src/components/Switch/switch.principles.stories.tsx +1 -1
  74. package/src/components/Tabs/tabs.principles.stories.tsx +3 -3
  75. package/src/components/Tag/tag.principles.stories.tsx +3 -3
  76. package/src/components/Textarea/textarea.principles.stories.tsx +2 -2
  77. package/src/components/TimePicker/time-picker.principles.stories.tsx +5 -5
  78. package/src/components/Toast/toast.principles.stories.tsx +2 -2
  79. package/src/components/Tooltip/tooltip.principles.stories.tsx +3 -3
  80. package/src/components/TreeView/tree-view.principles.stories.tsx +5 -5
  81. package/src/components/TreeView/tree-view.stories.tsx +1 -1
  82. package/src/tokens/color/color.spec.md +2 -0
@@ -708,6 +708,31 @@ rule_handcraft_overlay_header() {
708
708
  fi
709
709
  }
710
710
 
711
+ # ─────────────────────────────────────────────────────────────────────────────
712
+ # R10 — link_canonical(2026-06-22 codify per user;color.spec.md「Action — Primary」)
713
+ # canonical 文字連結 = text-primary + hover:text-primary-hover(hover 換色,無底線);
714
+ # 禁 `text-primary hover:underline`(用底線取代換色)。真元件(Breadcrumb / LinkInput /
715
+ # Button / RadioGroup)已遵循;本 rule 防 story LinkTo 導覽連結復發 drift(曾累積 232 處)。
716
+ # P1 WARN(story 導覽 style 低風險,不 block)。豁免:檔首 `// @link-style-allow:`。
717
+ # ─────────────────────────────────────────────────────────────────────────────
718
+ rule_link_canonical() {
719
+ [ "$EVENT" = "PostToolUse" ] && return 0
720
+ printf '%s' "$NEW_CONTENT" | grep -q '@link-style-allow:' && return 0
721
+ # text-primary …(中間可隔 tailwind class:cursor-pointer / font-medium 等)… hover:underline。
722
+ # 中間段限 class-char [a-z0-9:_-] → 不誤判描述用 label「text-primary · hover:underline」(· 非 class-char)。
723
+ if printf '%s' "$NEW_CONTENT" | grep -qE 'text-primary([[:space:]]+[a-z0-9:_-]+)*[[:space:]]+hover:underline'; then
724
+ {
725
+ echo ""
726
+ echo "╔═══ R10 link_canonical — 連結 hover 樣式 drift ═══"
727
+ echo "[P1 WARN] ${FILE_PATH}"
728
+ echo " 偵測到 'text-primary hover:underline' = 用底線取代換色,偏離 canonical。"
729
+ echo " canonical(color.spec.md「Action — Primary」)= text-primary + hover:text-primary-hover(換色,無底線)。"
730
+ echo " 修:hover:underline → hover:text-primary-hover。豁免:檔首 // @link-style-allow: <reason>"
731
+ } >&2
732
+ # P1 warn:not block
733
+ fi
734
+ }
735
+
711
736
  # ─── Run rules ───
712
737
  rule_anatomy
713
738
  rule_slot_split
@@ -718,5 +743,6 @@ rule_description_jargon
718
743
  rule_story_baseline_reference
719
744
  rule_story_archetype_registry
720
745
  rule_handcraft_overlay_header
746
+ rule_link_canonical
721
747
 
722
748
  exit $WORST
@@ -345,6 +345,36 @@ export const P = () => (<div className="px-[var(--layout-space-loose)] border-b
345
345
  '
346
346
  expect_pass_silent "23. R9 skip FileViewer(isOverlay 家)→ 不檢查"
347
347
 
348
+ # 24. R10 link_canonical: text-primary hover:underline → P1 warn(非 block)
349
+ run_hook "PreToolUse" "Edit" "/foo/my-project/packages/design-system/src/components/Foo/foo.principles.stories.tsx" '
350
+ <span className="text-primary hover:underline font-medium cursor-pointer">查看詳情</span>
351
+ '
352
+ expect_warn "24. R10 text-primary hover:underline → P1 warn" "R10 link_canonical"
353
+
354
+ # 25. R10 canonical(hover:text-primary-hover 換色)→ silent
355
+ run_hook "PreToolUse" "Edit" "/foo/my-project/packages/design-system/src/components/Foo/foo.principles.stories.tsx" '
356
+ <span className="text-primary hover:text-primary-hover font-medium cursor-pointer">查看詳情</span>
357
+ '
358
+ expect_pass_silent "25. R10 canonical hover:text-primary-hover → silent"
359
+
360
+ # 26. R10 escape marker @link-style-allow → silent
361
+ run_hook "PreToolUse" "Edit" "/foo/my-project/packages/design-system/src/components/Foo/foo.principles.stories.tsx" '// @link-style-allow: legacy doc-nav underline
362
+ <span className="text-primary hover:underline">查看詳情</span>
363
+ '
364
+ expect_pass_silent "26. R10 @link-style-allow 豁免 → silent"
365
+
366
+ # 27. R10 broadened: class-separated(cursor-pointer 隔開)text-primary … hover:underline → warn
367
+ run_hook "PreToolUse" "Edit" "/foo/my-project/packages/design-system/src/components/Foo/foo.anatomy.stories.tsx" '
368
+ <button className="text-caption text-primary cursor-pointer hover:underline">重設</button>
369
+ '
370
+ expect_warn "27. R10 class-separated text-primary…hover:underline → warn" "R10 link_canonical"
371
+
372
+ # 28. R10 不誤判描述 label「text-primary · hover:underline」(· 非 class-char,如 LinkInput anatomy 註解)→ silent
373
+ run_hook "PreToolUse" "Edit" "/foo/my-project/packages/design-system/src/components/Foo/foo.anatomy.stories.tsx" '
374
+ <span className="text-fg-muted font-mono">text-primary · hover:underline · 點擊開啟連結</span>
375
+ '
376
+ expect_pass_silent "28. R10 描述 label(· 分隔)→ 不誤判"
377
+
348
378
  echo ""
349
379
  echo "=== Summary ==="
350
380
  echo "Passed: $PASS / $((PASS + FAIL))"
package/llms-full.txt CHANGED
@@ -1,6 +1,6 @@
1
1
  # @qijenchen/design-system — 完整設計參考(llms-full)
2
2
 
3
- > 全 component / pattern 的 variants / sizes / 禁止事項。build-time 從 spec.md frontmatter 生成,禁手改。v0.1.0-beta.74
3
+ > 全 component / pattern 的 variants / sizes / 禁止事項。build-time 從 spec.md frontmatter 生成,禁手改。v0.1.0-beta.75
4
4
 
5
5
  # Components
6
6
 
package/llms.txt CHANGED
@@ -1,7 +1,7 @@
1
1
  # @qijenchen/design-system
2
2
 
3
3
  > World-class React design system(Radix/shadcn + Tailwind v4 + 自訂 design token)。
4
- > 54 components + 4 public patterns + design tokens。v0.1.0-beta.74
4
+ > 54 components + 4 public patterns + design tokens。v0.1.0-beta.75
5
5
 
6
6
  本檔由 source(spec.md frontmatter + Storybook index)build-time 自動生成,**禁手改**(CI --check drift gate 守)。
7
7
  每元件 / pattern 的完整 variants / sizes / 禁止事項 全文見 [llms-full.txt](./llms-full.txt)。
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@qijenchen/design-system",
3
- "version": "0.1.0-beta.74",
3
+ "version": "0.1.0-beta.75",
4
4
  "private": false,
5
5
  "description": "World-class design system — components, patterns, tokens, hooks (single source of truth for team distribution).",
6
6
  "type": "module",
@@ -69,13 +69,13 @@ export const UsageGuidance: Story = {
69
69
  >
70
70
  <ul className="space-y-1">
71
71
  <li>
72
- <LinkTo kind="Design System/Components/Accordion/展示" name="FAQ 常見問題"><span className="text-primary hover:underline font-medium cursor-pointer">FAQ 常見問題</span></LinkTo>
72
+ <LinkTo kind="Design System/Components/Accordion/展示" name="FAQ 常見問題"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">FAQ 常見問題</span></LinkTo>
73
73
  </li>
74
74
  <li>
75
- <LinkTo kind="Design System/Components/Accordion/展示" name="設定分組"><span className="text-primary hover:underline font-medium cursor-pointer">設定分組</span></LinkTo>
75
+ <LinkTo kind="Design System/Components/Accordion/展示" name="設定分組"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">設定分組</span></LinkTo>
76
76
  </li>
77
77
  <li>
78
- <LinkTo kind="Design System/Components/Accordion/展示" name="進階選項可隱藏"><span className="text-primary hover:underline font-medium cursor-pointer">進階選項可隱藏</span></LinkTo>
78
+ <LinkTo kind="Design System/Components/Accordion/展示" name="進階選項可隱藏"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">進階選項可隱藏</span></LinkTo>
79
79
  </li>
80
80
  </ul>
81
81
  </Rule>
@@ -41,19 +41,19 @@ export const UsageGuidance: Story = {
41
41
  <p>適合 Alert 的真實業務場景(點擊跳轉「展示」頁範例):</p>
42
42
  <ul className="space-y-1">
43
43
  <li>
44
- <LinkTo kind="Design System/Components/Alert/展示" name="低調單行"><span className="text-primary hover:underline font-medium cursor-pointer">低調單行</span></LinkTo>
44
+ <LinkTo kind="Design System/Components/Alert/展示" name="低調單行"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">低調單行</span></LinkTo>
45
45
  </li>
46
46
  <li>
47
- <LinkTo kind="Design System/Components/Alert/展示" name="實心單行"><span className="text-primary hover:underline font-medium cursor-pointer">實心單行</span></LinkTo>
47
+ <LinkTo kind="Design System/Components/Alert/展示" name="實心單行"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">實心單行</span></LinkTo>
48
48
  </li>
49
49
  <li>
50
- <LinkTo kind="Design System/Components/Alert/展示" name="低調含說明文字"><span className="text-primary hover:underline font-medium cursor-pointer">低調含說明文字</span></LinkTo>
50
+ <LinkTo kind="Design System/Components/Alert/展示" name="低調含說明文字"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">低調含說明文字</span></LinkTo>
51
51
  </li>
52
52
  <li>
53
- <LinkTo kind="Design System/Components/Alert/展示" name="實心含說明文字"><span className="text-primary hover:underline font-medium cursor-pointer">實心含說明文字</span></LinkTo>
53
+ <LinkTo kind="Design System/Components/Alert/展示" name="實心含說明文字"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">實心含說明文字</span></LinkTo>
54
54
  </li>
55
55
  <li>
56
- <LinkTo kind="Design System/Components/Alert/展示" name="右上角操作群組"><span className="text-primary hover:underline font-medium cursor-pointer">右上角操作群組</span></LinkTo>
56
+ <LinkTo kind="Design System/Components/Alert/展示" name="右上角操作群組"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">右上角操作群組</span></LinkTo>
57
57
  </li>
58
58
  </ul>
59
59
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見 <code>Vs*Rule</code> stories)。</p>
@@ -18,15 +18,15 @@ export const UsageGuidance: Story = {
18
18
  <ul className="text-body space-y-2">
19
19
  <li>
20
20
  • 多頁 web service 的主結構——Linear / Notion / Slack / GitHub / Asana 這類「左側導覽 + 中央工作區」產品。完整組合見{' '}
21
- <LinkTo kind="Design System/Components/AppShell/展示" name="主側欄佈局 — Linear 式議題追蹤"><span className="text-primary hover:underline font-medium cursor-pointer">展示 → 主側欄佈局 — Linear 式議題追蹤</span></LinkTo>
21
+ <LinkTo kind="Design System/Components/AppShell/展示" name="主側欄佈局 — Linear 式議題追蹤"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">展示 → 主側欄佈局 — Linear 式議題追蹤</span></LinkTo>
22
22
  </li>
23
23
  <li>
24
24
  • 需要 sidebar + main 持續共存——在議題列表、看板、報表等頁面間切換時,左側導覽不重渲染、捲動位置不丟失。見{' '}
25
- <LinkTo kind="Design System/Components/AppShell/展示" name="主側欄佈局 + 頁面分頁"><span className="text-primary hover:underline font-medium cursor-pointer">展示 → 主側欄佈局 + 頁面分頁</span></LinkTo>
25
+ <LinkTo kind="Design System/Components/AppShell/展示" name="主側欄佈局 + 頁面分頁"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">展示 → 主側欄佈局 + 頁面分頁</span></LinkTo>
26
26
  </li>
27
27
  <li>
28
28
  • 需要右側詳情面板(議題詳情 / inspector / 成員資料)跟 main 並存——如 Linear 點選議題後右側展開詳情。開合行為見{' '}
29
- <LinkTo kind="Design System/Components/AppShell/設計規格" name="右側面板開合行為(兩種模式)"><span className="text-primary hover:underline font-medium cursor-pointer">設計規格 → 右側面板開合行為</span></LinkTo>
29
+ <LinkTo kind="Design System/Components/AppShell/設計規格" name="右側面板開合行為(兩種模式)"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">設計規格 → 右側面板開合行為</span></LinkTo>
30
30
  </li>
31
31
  </ul>
32
32
  </section>
@@ -46,7 +46,7 @@ export const UsageGuidance: Story = {
46
46
  <p className="text-body">
47
47
  兩種佈局模式(primary-sidebar / primary-header)的選型決策樹獨立成「佈局模式怎麼選」story(含
48
48
  WorkspaceBrand 放置規則),見本頁側欄或{' '}
49
- <LinkTo kind="Design System/Components/AppShell/設計原則" name="佈局模式怎麼選"><span className="text-primary hover:underline font-medium cursor-pointer">設計原則 → 佈局模式怎麼選</span></LinkTo>
49
+ <LinkTo kind="Design System/Components/AppShell/設計原則" name="佈局模式怎麼選"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">設計原則 → 佈局模式怎麼選</span></LinkTo>
50
50
  </p>
51
51
  </section>
52
52
 
@@ -98,12 +98,12 @@ export const LayoutModeRule: Story = {
98
98
  服務整個 app(account / workspace switcher / 跨頁 search / notifications);local toolbar
99
99
  <em>仍在</em> main col 頂,只是上面多了 global header。WorkspaceBrand 改放 globalHeader 左側。
100
100
  參考 GitHub / Slack / Gmail。完整組合見{' '}
101
- <LinkTo kind="Design System/Components/AppShell/展示" name="主標頭佈局 — 全域+本地兩層(GitHub/Gmail/Slack 派)"><span className="text-primary hover:underline font-medium cursor-pointer">展示 → 主標頭佈局 — 全域+本地兩層</span></LinkTo>
101
+ <LinkTo kind="Design System/Components/AppShell/展示" name="主標頭佈局 — 全域+本地兩層(GitHub/Gmail/Slack 派)"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">展示 → 主標頭佈局 — 全域+本地兩層</span></LinkTo>
102
102
  </li>
103
103
  </ul>
104
104
  <p className="text-caption text-fg-secondary mt-2">
105
105
  兩 mode 是 product 角色表態——啟動時固定,不該在 runtime 切換。視覺對照圖見{' '}
106
- <LinkTo kind="Design System/Components/AppShell/設計規格" name="兩種布局模式對照圖"><span className="text-primary hover:underline font-medium cursor-pointer">設計規格 → 兩種布局模式對照圖</span></LinkTo>
106
+ <LinkTo kind="Design System/Components/AppShell/設計規格" name="兩種布局模式對照圖"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">設計規格 → 兩種布局模式對照圖</span></LinkTo>
107
107
  </p>
108
108
  </section>
109
109
 
@@ -197,7 +197,7 @@ export const RatioChoice: Story = {
197
197
  <p className="text-caption text-fg-muted max-w-[720px] leading-relaxed mb-8">
198
198
  先看內容方向(橫 / 方 / 直),再對到下方的判斷準則即可選定。五個 ratio 的並排視覺對照見{' '}
199
199
  <LinkTo kind="Design System/Components/AspectRatio/設計規格" name="標準 比例 視覺對照">
200
- <span className="text-primary hover:underline font-medium cursor-pointer">設計規格 → 標準 比例 視覺對照</span>
200
+ <span className="text-primary hover:text-primary-hover font-medium cursor-pointer">設計規格 → 標準 比例 視覺對照</span>
201
201
  </LinkTo>
202
202
  ,此處只講「怎麼選」的決策邏輯,不重畫圖。
203
203
  </p>
@@ -47,9 +47,9 @@ export const UsageGuidance: Story = {
47
47
  <div className="prose prose-sm max-w-prose mb-8">
48
48
  <p>Avatar 代表「誰」——人、團隊、組織、專案的視覺身份。適合的真實業務場景(點擊跳轉「展示」頁範例):</p>
49
49
  <ul className="space-y-1">
50
- <li>留言者、指派者、團隊成員列表的人員識別;workspace / 組織 / App 的身份標識 —— 見 <LinkTo kind="Design System/Components/Avatar/展示" name="四模式"><span className="text-primary hover:underline font-medium cursor-pointer">四模式</span></LinkTo></li>
51
- <li>成員沒上傳照片、或頭像圖片載入失敗時,以名字首字 + 色彩維持可辨識 —— 見 <LinkTo kind="Design System/Components/Avatar/展示" name="備援顯示"><span className="text-primary hover:underline font-medium cursor-pointer">備援顯示</span></LinkTo></li>
52
- <li>通訊錄、成員選單、chat 列表等列表項目的主視覺 prefix —— 見 <LinkTo kind="Design System/Components/Avatar/展示" name="情境用例"><span className="text-primary hover:underline font-medium cursor-pointer">情境用例</span></LinkTo></li>
50
+ <li>留言者、指派者、團隊成員列表的人員識別;workspace / 組織 / App 的身份標識 —— 見 <LinkTo kind="Design System/Components/Avatar/展示" name="四模式"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">四模式</span></LinkTo></li>
51
+ <li>成員沒上傳照片、或頭像圖片載入失敗時,以名字首字 + 色彩維持可辨識 —— 見 <LinkTo kind="Design System/Components/Avatar/展示" name="備援顯示"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">備援顯示</span></LinkTo></li>
52
+ <li>通訊錄、成員選單、chat 列表等列表項目的主視覺 prefix —— 見 <LinkTo kind="Design System/Components/Avatar/展示" name="情境用例"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">情境用例</span></LinkTo></li>
53
53
  </ul>
54
54
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見下方 vs 近親 段)。</p>
55
55
  </div>
@@ -45,13 +45,13 @@ export const UsageGuidance: Story = {
45
45
  <p>適合 Badge 的真實業務場景(點擊跳轉「展示」頁範例):</p>
46
46
  <ul className="space-y-1">
47
47
  <li>
48
- <LinkTo kind="Design System/Components/Badge/展示" name="正圓 vs 膠囊"><span className="text-primary hover:underline font-medium cursor-pointer">正圓 vs 膠囊</span></LinkTo>
48
+ <LinkTo kind="Design System/Components/Badge/展示" name="正圓 vs 膠囊"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">正圓 vs 膠囊</span></LinkTo>
49
49
  </li>
50
50
  <li>
51
- <LinkTo kind="Design System/Components/Badge/展示" name="圓點模式"><span className="text-primary hover:underline font-medium cursor-pointer">Dot 模式</span></LinkTo>
51
+ <LinkTo kind="Design System/Components/Badge/展示" name="圓點模式"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">Dot 模式</span></LinkTo>
52
52
  </li>
53
53
  <li>
54
- <LinkTo kind="Design System/Components/Badge/展示" name="數量上限"><span className="text-primary hover:underline font-medium cursor-pointer">Max 上限</span></LinkTo>
54
+ <LinkTo kind="Design System/Components/Badge/展示" name="數量上限"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">Max 上限</span></LinkTo>
55
55
  </li>
56
56
  </ul>
57
57
  <p className="text-fg-muted mt-3">判斷不確定時:先確認使用者真正需要的是「有沒有新東西」(用 Dot)還是「有多少」(用數字)。若兩者都不貼切,代表這裡可能不該放 Badge——改用文字標籤或其他狀態指示。</p>
@@ -65,15 +65,15 @@ export const UsageGuidance: Story = {
65
65
  <ul className="space-y-1">
66
66
  <li>
67
67
  電商多層分類、檔案管理器等深層頁面,路徑過長時中段折疊、點 ⋯ 可展開中間層 —— 見{' '}
68
- <LinkTo kind="Design System/Components/Breadcrumb/展示" name="可互動省略"><span className="text-primary hover:underline font-medium cursor-pointer">可互動省略</span></LinkTo>
68
+ <LinkTo kind="Design System/Components/Breadcrumb/展示" name="可互動省略"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">可互動省略</span></LinkTo>
69
69
  </li>
70
70
  <li>
71
71
  路徑由路由 / CMS 資料動態產生,直接傳資料陣列、超過層數自動收合中段 —— 見{' '}
72
- <LinkTo kind="Design System/Components/Breadcrumb/展示" name="宣告式 API + 自動收合"><span className="text-primary hover:underline font-medium cursor-pointer">宣告式 API + 自動收合</span></LinkTo>
72
+ <LinkTo kind="Design System/Components/Breadcrumb/展示" name="宣告式 API + 自動收合"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">宣告式 API + 自動收合</span></LinkTo>
73
73
  </li>
74
74
  <li>
75
75
  SPA 內點麵包屑要走前端路由、不整頁重載 —— 見{' '}
76
- <LinkTo kind="Design System/Components/Breadcrumb/展示" name="整合 React Router / Next.js Link"><span className="text-primary hover:underline font-medium cursor-pointer">整合 React Router / Next.js Link</span></LinkTo>
76
+ <LinkTo kind="Design System/Components/Breadcrumb/展示" name="整合 React Router / Next.js Link"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">整合 React Router / Next.js Link</span></LinkTo>
77
77
  </li>
78
78
  </ul>
79
79
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用相近的其他元件(見下方「跟相近元件怎麼分」的範例)。</p>
@@ -76,7 +76,7 @@ export const Overview: Story = {
76
76
  title={
77
77
  <>
78
78
  已選取本頁全部 50 個。{' '}
79
- <button type="button" className="text-primary hover:underline">
79
+ <button type="button" className="text-primary hover:text-primary-hover">
80
80
  點此選取全部 5370 個項目
81
81
  </button>
82
82
  </>
@@ -40,8 +40,8 @@ export const UsageGuidance: Story = {
40
40
  <div className="prose prose-sm max-w-prose">
41
41
  <p>BulkActionBar 是「選取狀態驅動」的批次操作列,跟 selection state 生命週期綁定。真實業務場景:</p>
42
42
  <ul className="space-y-1">
43
- <li><LinkTo kind="Design System/Components/BulkActionBar/展示" name="基本"><span className="text-primary hover:underline cursor-pointer">基本</span></LinkTo>(收件匣多選郵件後,一次封存 / 加標籤 / 刪除)</li>
44
- <li><LinkTo kind="Design System/Components/BulkActionBar/展示" name="提示擴選整個資料集"><span className="text-primary hover:underline cursor-pointer">提示擴選整個資料集</span></LinkTo>(資料集共 5370 筆、本頁只顯示 50 筆:本頁全選後浮出提示,可一鍵把選取範圍擴大到全部 5370 筆)</li>
43
+ <li><LinkTo kind="Design System/Components/BulkActionBar/展示" name="基本"><span className="text-primary hover:text-primary-hover cursor-pointer">基本</span></LinkTo>(收件匣多選郵件後,一次封存 / 加標籤 / 刪除)</li>
44
+ <li><LinkTo kind="Design System/Components/BulkActionBar/展示" name="提示擴選整個資料集"><span className="text-primary hover:text-primary-hover cursor-pointer">提示擴選整個資料集</span></LinkTo>(資料集共 5370 筆、本頁只顯示 50 筆:本頁全選後浮出提示,可一鍵把選取範圍擴大到全部 5370 筆)</li>
45
45
  </ul>
46
46
  <p className="text-fg-muted mt-3">判斷不確定:對照 spec.md「何時用 / 何時不用」段。</p>
47
47
  </div>
@@ -201,7 +201,7 @@ export const HintBannerRule: Story = {
201
201
  title={
202
202
  <>
203
203
  已選取本頁全部 50 個。{' '}
204
- <button type="button" className="text-primary hover:underline">
204
+ <button type="button" className="text-primary hover:text-primary-hover">
205
205
  點此選取全部 5370 個項目
206
206
  </button>
207
207
  </>
@@ -76,7 +76,7 @@ benchmark:
76
76
  - `gap-2`(8px)+ `<ButtonDivider />`(自帶 mx-1 = 12px 視覺距離)
77
77
  - `px-[var(--layout-space-loose)] py-[var(--layout-space-tight)]`
78
78
  - 自然高度 56md / 68lg(md Button `--field-height-md` 32/36 + `py-[var(--layout-space-tight)]` 12/16 ×2;對齊 SurfaceFooter / DataTable toolbar canonical)
79
- - `selection.length === 0` → 回 null 不佔 layout
79
+ - `selection.length === 0` **且** `totalSelected` 為 0/未設 → 回 null 不佔 layout(反向選取 all 模式 `totalSelected > 0` 但可見列全 excluded 時仍顯示,見「Extend dataset pattern」)
80
80
  - **寬度邊界**:actions 為單行 flex 排列(`gap-2`),無折行、無內建 overflow 收納;寬度受限場景由 consumer 控制 action 數量
81
81
 
82
82
  ### Slot
@@ -170,6 +170,8 @@ interface BulkActionBarLabels {
170
170
 
171
171
  「本頁全選 → hint 點擊 → 擴選整個 dataset」2-step 後,consumer 把 `totalSelected` 設為 dataset 真總數,count 區改顯示該值(否則 fallback `selection.length`)——避免 Alert 顯「已選 5370」但 bar 仍顯「已選 50」的不同步(2026-05-13 ship)。對齊 Gmail / Linear / Notion 全選 dataset hint pattern。
172
172
 
173
+ **可見性與反向選取(DataTable all 模式,2026-06-22)**:顯示判準 = `selection.length > 0 || (totalSelected ?? 0) > 0`。反向選取(`{ mode:'all', excluded }`)下若可見列全被 excluded、`selection`(可見代表)為空但 `totalSelected > 0`(全集仍有選取),bar **仍顯示**(否則「已選 N 個但 bar 消失」矛盾)。對應 `data-table.spec.md`「L2 選取」inverted 模型。
174
+
173
175
  ---
174
176
 
175
177
  ## a11y 預設
@@ -185,7 +187,7 @@ interface BulkActionBarLabels {
185
187
 
186
188
  ## 視覺與動畫
187
189
 
188
- - **出現 / 消失**:`selection.length` 0→>0 直接 mount;>0→0 null 直接 unmount(無 fade 動畫)。inline composition 下自然 reflow;consumer 需固定高度時自擺 placeholder(見「禁止事項」)
190
+ - **出現 / 消失**:有選取(`selection.length > 0` **或** `totalSelected > 0`)直接 mount;歸零回 null 直接 unmount(無 fade 動畫)。inline composition 下自然 reflow;consumer 需固定高度時自擺 placeholder(見「禁止事項」)
189
191
  - **底色**:**無底色 contrast**,跟 page 同色(`bg-canvas` / `bg-surface` 視 placement 繼承)。對齊 Notion / Linear minimalist — 用文字內容切換呈現「mode」,**不**用底色 highlight。**不像 Polaris 那種顯著底色變化** <!-- @benchmark-unverified: see frontmatter benchmark list for canonical DS source URL -->
190
192
  - **邊界**:**無外框邊界**(融入 page chrome)— 恆 **`border-top` border-divider 切割 layout**(bar 是 page 結構,不是 floating overlay,不用 box-shadow 製造「浮層」誤導)。top-toolbar 變體為未來項(見「Size canonical」)
191
193
  - **與 table 的關係**:inline composition — bar 接在 DataTable 下方,toolbar 永遠保留(見「Placement」)
@@ -83,7 +83,7 @@ export const WithExtendDatasetHint: Story = {
83
83
  <button
84
84
  type="button"
85
85
  onClick={() => { setSelection([]); setAllSelected(false) }}
86
- className="text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"
86
+ className="text-primary hover:text-primary-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"
87
87
  >
88
88
  清除選取項目
89
89
  </button>
@@ -94,7 +94,7 @@ export const WithExtendDatasetHint: Story = {
94
94
  <button
95
95
  type="button"
96
96
  onClick={() => setAllSelected(true)}
97
- className="text-primary hover:underline focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"
97
+ className="text-primary hover:text-primary-hover focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring rounded-sm"
98
98
  >
99
99
  點此選取全部 {TOTAL} 個項目
100
100
  </button>
@@ -82,8 +82,9 @@ const BulkActionBar = React.forwardRef<HTMLDivElement, BulkActionBarProps>(
82
82
  [labelsOverride]
83
83
  )
84
84
 
85
- // selection.length === 0 自動藏(對齊 spec 禁止事項 #3)
86
- if (selection.length === 0) return null
85
+ // selection.length === 0 自動藏(對齊 spec 禁止事項 #3)
86
+ // 反向選取(DataTable all 模式)例外:visible 全被 excluded 但 totalSelected>0 仍有選取 → 顯示(2026-06-22)
87
+ if (selection.length === 0 && (totalSelected ?? 0) === 0) return null
87
88
 
88
89
  return (
89
90
  <div
@@ -51,13 +51,13 @@ export const UsageGuidance: Story = {
51
51
  <p>適合 Button 的真實業務場景(點擊跳轉「展示」頁範例):</p>
52
52
  <ul className="space-y-1">
53
53
  <li>
54
- <LinkTo kind="Design System/Components/Button/展示" name="危險 語意"><span className="text-primary hover:underline font-medium cursor-pointer">Danger 語意</span></LinkTo>
54
+ <LinkTo kind="Design System/Components/Button/展示" name="危險 語意"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">Danger 語意</span></LinkTo>
55
55
  </li>
56
56
  <li>
57
- <LinkTo kind="Design System/Components/Button/展示" name="滑鼠移過 / 鍵盤聚焦"><span className="text-primary hover:underline font-medium cursor-pointer">滑鼠移過 / 鍵盤聚焦</span></LinkTo>
57
+ <LinkTo kind="Design System/Components/Button/展示" name="滑鼠移過 / 鍵盤聚焦"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">滑鼠移過 / 鍵盤聚焦</span></LinkTo>
58
58
  </li>
59
59
  <li>
60
- <LinkTo kind="Design System/Components/Button/展示" name="純圖示加 Tooltip"><span className="text-primary hover:underline font-medium cursor-pointer">純圖示加 Tooltip</span></LinkTo>
60
+ <LinkTo kind="Design System/Components/Button/展示" name="純圖示加 Tooltip"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">純圖示加 Tooltip</span></LinkTo>
61
61
  </li>
62
62
  </ul>
63
63
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見 <code>Vs*Rule</code> stories)。</p>
@@ -41,13 +41,13 @@ export const UsageGuidance: Story = {
41
41
  <p>適合 Calendar 的真實業務場景(點擊跳轉「展示」頁範例):</p>
42
42
  <ul className="space-y-1">
43
43
  <li>
44
- <LinkTo kind="Design System/Components/Calendar/展示" name="團隊行事曆"><span className="text-primary hover:underline font-medium cursor-pointer">團隊行事曆</span></LinkTo>
44
+ <LinkTo kind="Design System/Components/Calendar/展示" name="團隊行事曆"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">團隊行事曆</span></LinkTo>
45
45
  </li>
46
46
  <li>
47
- <LinkTo kind="Design System/Components/Calendar/展示" name="內容發佈月曆"><span className="text-primary hover:underline font-medium cursor-pointer">內容發佈月曆</span></LinkTo>
47
+ <LinkTo kind="Design System/Components/Calendar/展示" name="內容發佈月曆"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">內容發佈月曆</span></LinkTo>
48
48
  </li>
49
49
  <li>
50
- <LinkTo kind="Design System/Components/Calendar/展示" name="空行事曆"><span className="text-primary hover:underline font-medium cursor-pointer">空行事曆</span></LinkTo>
50
+ <LinkTo kind="Design System/Components/Calendar/展示" name="空行事曆"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">空行事曆</span></LinkTo>
51
51
  </li>
52
52
  </ul>
53
53
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見下方「vs 近親」)。</p>
@@ -72,8 +72,8 @@ export const UsageGuidance: Story = {
72
72
  <div className="prose prose-sm max-w-prose mb-8">
73
73
  <p>適合 Carousel 的真實業務場景(點擊跳轉「展示」頁範例):</p>
74
74
  <ul className="space-y-1">
75
- <li><LinkTo kind="Design System/Components/Carousel/展示" name="首頁主視覺橫幅"><span className="text-primary hover:underline font-medium cursor-pointer">首頁 Hero Banner</span></LinkTo></li>
76
- <li><LinkTo kind="Design System/Components/Carousel/展示" name="商品圖片輪播"><span className="text-primary hover:underline font-medium cursor-pointer">商品圖片輪播</span></LinkTo></li>
75
+ <li><LinkTo kind="Design System/Components/Carousel/展示" name="首頁主視覺橫幅"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">首頁 Hero Banner</span></LinkTo></li>
76
+ <li><LinkTo kind="Design System/Components/Carousel/展示" name="商品圖片輪播"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">商品圖片輪播</span></LinkTo></li>
77
77
  </ul>
78
78
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見下方 vs 近親 段)。</p>
79
79
  </div>
@@ -149,16 +149,16 @@ export const UsageGuidance: Story = {
149
149
  <p>適合 Chart 的真實業務場景(點擊跳轉「展示」頁範例):</p>
150
150
  <ul className="space-y-1">
151
151
  <li>
152
- <LinkTo kind="Design System/Components/Chart/展示" name="長條 Chart — 月營收"><span className="text-primary hover:underline font-medium cursor-pointer">長條 Chart — 月營收</span></LinkTo>
152
+ <LinkTo kind="Design System/Components/Chart/展示" name="長條 Chart — 月營收"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">長條 Chart — 月營收</span></LinkTo>
153
153
  </li>
154
154
  <li>
155
- <LinkTo kind="Design System/Components/Chart/展示" name="折線 Chart — 伺服器回應時間"><span className="text-primary hover:underline font-medium cursor-pointer">折線 Chart — 伺服器回應時間</span></LinkTo>
155
+ <LinkTo kind="Design System/Components/Chart/展示" name="折線 Chart — 伺服器回應時間"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">折線 Chart — 伺服器回應時間</span></LinkTo>
156
156
  </li>
157
157
  <li>
158
- <LinkTo kind="Design System/Components/Chart/展示" name="環圈 Chart — 流量來源分布"><span className="text-primary hover:underline font-medium cursor-pointer">環圈 Chart — 流量來源分布</span></LinkTo>
158
+ <LinkTo kind="Design System/Components/Chart/展示" name="環圈 Chart — 流量來源分布"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">環圈 Chart — 流量來源分布</span></LinkTo>
159
159
  </li>
160
160
  <li>
161
- <LinkTo kind="Design System/Components/Chart/展示" name="堆疊 面積 — 部門支出"><span className="text-primary hover:underline font-medium cursor-pointer">堆疊 面積 — 部門支出</span></LinkTo>
161
+ <LinkTo kind="Design System/Components/Chart/展示" name="堆疊 面積 — 部門支出"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">堆疊 面積 — 部門支出</span></LinkTo>
162
162
  </li>
163
163
  </ul>
164
164
  <p className="text-fg-muted mt-3">不確定該不該用 Chart 時:先確認資料是否真的需要視覺化(單一數字、2-3 個小數字或可排序篩選的清單,通常用文字、描述清單或表格更清楚);若資料量夠多且要看趨勢、比例或分布,才用 Chart。</p>
@@ -52,10 +52,10 @@ export const UsageGuidance: Story = {
52
52
  >
53
53
  <ul className="space-y-1">
54
54
  <li>
55
- <LinkTo kind="Design System/Components/Checkbox/展示" name="直式群組"><span className="text-primary hover:underline font-medium cursor-pointer">商品類別的複選清單(直式群組)</span></LinkTo>
55
+ <LinkTo kind="Design System/Components/Checkbox/展示" name="直式群組"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">商品類別的複選清單(直式群組)</span></LinkTo>
56
56
  </li>
57
57
  <li>
58
- <LinkTo kind="Design System/Components/Checkbox/展示" name="水平排列"><span className="text-primary hover:underline font-medium cursor-pointer">篩選列的少量選項複選(水平排列)</span></LinkTo>
58
+ <LinkTo kind="Design System/Components/Checkbox/展示" name="水平排列"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">篩選列的少量選項複選(水平排列)</span></LinkTo>
59
59
  </li>
60
60
  </ul>
61
61
  </Rule>
@@ -51,13 +51,13 @@ export const UsageGuidance: Story = {
51
51
  <p>適合 Chip 的真實業務場景(點擊跳轉「展示」頁範例):</p>
52
52
  <ul className="space-y-1">
53
53
  <li>
54
- <LinkTo kind="Design System/Components/Chip/展示" name="預設"><span className="text-primary hover:underline font-medium cursor-pointer">技術文章列表的語言標籤濾鏡(多選)</span></LinkTo>
54
+ <LinkTo kind="Design System/Components/Chip/展示" name="預設"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">技術文章列表的語言標籤濾鏡(多選)</span></LinkTo>
55
55
  </li>
56
56
  <li>
57
- <LinkTo kind="Design System/Components/Chip/展示" name="帶 Badge"><span className="text-primary hover:underline font-medium cursor-pointer">任務列表的狀態篩選 — Badge 顯示各狀態筆數</span></LinkTo>
57
+ <LinkTo kind="Design System/Components/Chip/展示" name="帶 Badge"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">任務列表的狀態篩選 — Badge 顯示各狀態筆數</span></LinkTo>
58
58
  </li>
59
59
  <li>
60
- <LinkTo kind="Design System/Components/Chip/展示" name="單選"><span className="text-primary hover:underline font-medium cursor-pointer">程式語言擇一的單選濾鏡(type="single")</span></LinkTo>
60
+ <LinkTo kind="Design System/Components/Chip/展示" name="單選"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">程式語言擇一的單選濾鏡(type="single")</span></LinkTo>
61
61
  </li>
62
62
  </ul>
63
63
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見下方「vs 近親元件」段)。</p>
@@ -70,9 +70,9 @@ export const UsageGuidance: Story = {
70
70
  <div className="prose prose-sm max-w-prose mb-8">
71
71
  <p>適合 Coachmark 的真實業務場景(點擊跳轉「展示」頁範例):</p>
72
72
  <ul className="space-y-1">
73
- <li><LinkTo kind="Design System/Components/Coachmark/展示" name="單步驟新功能介紹"><span className="text-primary hover:underline font-medium cursor-pointer">首次推出 AI 助理時 anchor 到入口按鈕介紹(單步驟)</span></LinkTo></li>
74
- <li><LinkTo kind="Design System/Components/Coachmark/展示" name="多步 新手導覽"><span className="text-primary hover:underline font-medium cursor-pointer">新用戶首登的三步功能導覽(多步 Onboarding)</span></LinkTo></li>
75
- <li><LinkTo kind="Design System/Components/Coachmark/展示" name="多步提示"><span className="text-primary hover:underline font-medium cursor-pointer">進階快捷鍵的漸進式提示(多步 Tips)</span></LinkTo></li>
73
+ <li><LinkTo kind="Design System/Components/Coachmark/展示" name="單步驟新功能介紹"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">首次推出 AI 助理時 anchor 到入口按鈕介紹(單步驟)</span></LinkTo></li>
74
+ <li><LinkTo kind="Design System/Components/Coachmark/展示" name="多步 新手導覽"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">新用戶首登的三步功能導覽(多步 Onboarding)</span></LinkTo></li>
75
+ <li><LinkTo kind="Design System/Components/Coachmark/展示" name="多步提示"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">進階快捷鍵的漸進式提示(多步 Tips)</span></LinkTo></li>
76
76
  </ul>
77
77
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見下方 vs 近親 段)。</p>
78
78
  </div>
@@ -850,7 +850,7 @@ export const StateBehavior = {
850
850
  <button
851
851
  type="button"
852
852
  onClick={() => setClearV(['electronics', 'food', 'lifestyle'])}
853
- className="text-caption text-primary cursor-pointer hover:underline"
853
+ className="text-caption text-primary cursor-pointer hover:text-primary-hover"
854
854
  >
855
855
  重設
856
856
  </button>
@@ -876,7 +876,7 @@ export const StateBehavior = {
876
876
  <button
877
877
  type="button"
878
878
  onClick={() => setDismissV(['electronics', 'food', 'lifestyle'])}
879
- className="text-caption text-primary cursor-pointer hover:underline"
879
+ className="text-caption text-primary cursor-pointer hover:text-primary-hover"
880
880
  >
881
881
  重設
882
882
  </button>
@@ -57,19 +57,19 @@ export const UsageGuidance: Story = {
57
57
  <p>適合 Combobox 的真實業務場景(點擊跳轉「展示」頁範例):</p>
58
58
  <ul className="space-y-1">
59
59
  <li>
60
- <LinkTo kind="Design System/Components/Combobox/展示" name="四模式"><span className="text-primary hover:underline font-medium cursor-pointer">四模式</span></LinkTo>
60
+ <LinkTo kind="Design System/Components/Combobox/展示" name="四模式"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">四模式</span></LinkTo>
61
61
  </li>
62
62
  <li>
63
- <LinkTo kind="Design System/Components/Combobox/展示" name="尺寸與 Button 對齊"><span className="text-primary hover:underline font-medium cursor-pointer">尺寸與 Button 對齊</span></LinkTo>
63
+ <LinkTo kind="Design System/Components/Combobox/展示" name="尺寸與 Button 對齊"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">尺寸與 Button 對齊</span></LinkTo>
64
64
  </li>
65
65
  <li>
66
- <LinkTo kind="Design System/Components/Combobox/展示" name="單行 vs 換行"><span className="text-primary hover:underline font-medium cursor-pointer">單行 vs 換行</span></LinkTo>
66
+ <LinkTo kind="Design System/Components/Combobox/展示" name="單行 vs 換行"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">單行 vs 換行</span></LinkTo>
67
67
  </li>
68
68
  <li>
69
- <LinkTo kind="Design System/Components/Combobox/展示" name="搜尋"><span className="text-primary hover:underline font-medium cursor-pointer">搜尋</span></LinkTo>
69
+ <LinkTo kind="Design System/Components/Combobox/展示" name="搜尋"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">搜尋</span></LinkTo>
70
70
  </li>
71
71
  <li>
72
- <LinkTo kind="Design System/Components/Combobox/展示" name="DataTable 整合"><span className="text-primary hover:underline font-medium cursor-pointer">DataTable 整合</span></LinkTo>
72
+ <LinkTo kind="Design System/Components/Combobox/展示" name="DataTable 整合"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">DataTable 整合</span></LinkTo>
73
73
  </li>
74
74
  </ul>
75
75
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見 <code>Vs*Rule</code> stories)。</p>
@@ -24,16 +24,16 @@ export const UsageGuidance: Story = {
24
24
  <p>適合 Command 的真實業務場景(點擊跳轉「展示」頁範例):</p>
25
25
  <ul className="space-y-1">
26
26
  <li>
27
- <LinkTo kind="Design System/Internal/Command/展示" name="全域指令面板"><span className="text-primary hover:underline font-medium cursor-pointer">全域指令面板(⌘K)— Linear / VS Code 式跨頁搜尋與快速動作</span></LinkTo>
27
+ <LinkTo kind="Design System/Internal/Command/展示" name="全域指令面板"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">全域指令面板(⌘K)— Linear / VS Code 式跨頁搜尋與快速動作</span></LinkTo>
28
28
  </li>
29
29
  <li>
30
- <LinkTo kind="Design System/Internal/Command/展示" name="行內搜尋清單"><span className="text-primary hover:underline font-medium cursor-pointer">行內搜尋清單 — Gmail 式 sidebar 信件資料夾過濾</span></LinkTo>
30
+ <LinkTo kind="Design System/Internal/Command/展示" name="行內搜尋清單"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">行內搜尋清單 — Gmail 式 sidebar 信件資料夾過濾</span></LinkTo>
31
31
  </li>
32
32
  <li>
33
- <LinkTo kind="Design System/Internal/Command/展示" name="外觀切換器"><span className="text-primary hover:underline font-medium cursor-pointer">外觀切換器 — 選中立即執行的純動作清單</span></LinkTo>
33
+ <LinkTo kind="Design System/Internal/Command/展示" name="外觀切換器"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">外觀切換器 — 選中立即執行的純動作清單</span></LinkTo>
34
34
  </li>
35
35
  <li>
36
- <LinkTo kind="Design System/Internal/Command/展示" name="無結果狀態"><span className="text-primary hover:underline font-medium cursor-pointer">搜尋無結果時的空狀態文案(CommandEmpty)</span></LinkTo>
36
+ <LinkTo kind="Design System/Internal/Command/展示" name="無結果狀態"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">搜尋無結果時的空狀態文案(CommandEmpty)</span></LinkTo>
37
37
  </li>
38
38
  </ul>
39
39
  <p className="text-fg-muted mt-3">判斷不確定時:對照 spec.md「何時用 / 何時不用」段;若仍不符,改用近親元件(見下方「vs 近親」段)。</p>
@@ -64,9 +64,9 @@ export const CompositionRules: Story = {
64
64
  <h4>Pattern 1 — SelectMenu 內嵌 Command(searchable form input)</h4>
65
65
  <p>需要「搜尋 + 選值寫回 form」→ 用 <code>SelectMenu</code>(內部已組合 <code>Popover + Command</code>),<strong>不要</strong>自己組合:</p>
66
66
  <ul>
67
- <li><LinkTo kind="Design System/Components/Combobox/展示" name="四模式"><span className="text-primary hover:underline font-medium cursor-pointer">Combobox</span></LinkTo>——可搜尋多選(如商品類別多選標籤)</li>
68
- <li><LinkTo kind="Design System/Components/Select/展示" name="搜尋"><span className="text-primary hover:underline font-medium cursor-pointer">Select(searchable)</span></LinkTo>——可搜尋單選(如從長國家清單打字篩選)</li>
69
- <li><LinkTo kind="Design System/Components/PeoplePicker/展示" name="單人"><span className="text-primary hover:underline font-medium cursor-pointer">PeoplePicker</span></LinkTo>——人員搜尋(如指派任務負責人)</li>
67
+ <li><LinkTo kind="Design System/Components/Combobox/展示" name="四模式"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">Combobox</span></LinkTo>——可搜尋多選(如商品類別多選標籤)</li>
68
+ <li><LinkTo kind="Design System/Components/Select/展示" name="搜尋"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">Select(searchable)</span></LinkTo>——可搜尋單選(如從長國家清單打字篩選)</li>
69
+ <li><LinkTo kind="Design System/Components/PeoplePicker/展示" name="單人"><span className="text-primary hover:text-primary-hover font-medium cursor-pointer">PeoplePicker</span></LinkTo>——人員搜尋(如指派任務負責人)</li>
70
70
  </ul>
71
71
 
72
72
  <h4>Pattern 2 — Popover + Command 組成 Command Palette(Cmd+K)</h4>