@qijenchen/design-system 0.1.0-beta.72 → 0.1.0-beta.73

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 (39) hide show
  1. package/dist/components/AppShell/_demo-helpers.d.ts.map +1 -1
  2. package/ds-canonical/fork/governance.lock +106 -2
  3. package/ds-canonical/fork/launchers/inject_fork_governance_preamble.sh +8 -0
  4. package/ds-canonical/fork/manifest.json +15 -1
  5. package/ds-canonical/fork/skills/bug-fix-rhythm/SKILL.md +181 -0
  6. package/ds-canonical/fork/skills/code-quality-audit/SKILL.md +63 -0
  7. package/ds-canonical/fork/skills/delivery-handoff/SKILL.md +229 -0
  8. package/ds-canonical/fork/skills/delivery-handoff/references/flow-diagram.md +180 -0
  9. package/ds-canonical/fork/skills/delivery-handoff/references/handoff-template.md +177 -0
  10. package/ds-canonical/fork/skills/delivery-handoff/references/inventory-checklist.md +196 -0
  11. package/ds-canonical/fork/skills/performance-audit/SKILL.md +107 -0
  12. package/ds-canonical/fork/skills/product-ui-audit/SKILL.md +230 -0
  13. package/ds-canonical/fork/skills/product-ui-audit/references/audit-checks.md +246 -0
  14. package/ds-canonical/fork/skills/product-ui-audit/references/common-misuses.md +329 -0
  15. package/ds-canonical/fork/skills/product-ui-audit/references/report-template.md +159 -0
  16. package/ds-canonical/fork/skills/propose-options/SKILL.md +177 -0
  17. package/ds-canonical/fork/skills/prototype/SKILL.md +244 -0
  18. package/ds-canonical/fork/skills/prototype/references/audit-checks.md +37 -0
  19. package/ds-canonical/fork/skills/prototype/references/benchmark-sources.md +94 -0
  20. package/ds-canonical/fork/skills/prototype/references/checkpoints.md +191 -0
  21. package/ds-canonical/fork/skills/prototype/references/evaluation-matrix.md +141 -0
  22. package/ds-canonical/fork/skills/prototype/references/ooux-template.md +198 -0
  23. package/ds-canonical/fork/skills/prototype/references/proposal-template.md +229 -0
  24. package/ds-canonical/fork/skills/scan-similar-bugs/SKILL.md +198 -0
  25. package/ds-canonical/fork/skills/ux-audit/SKILL.md +130 -0
  26. package/ds-canonical/fork/skills/visual-audit/SKILL.md +245 -0
  27. package/ds-canonical/fork/skills/visual-audit/output/.gitkeep +0 -0
  28. package/ds-canonical/fork/skills/visual-audit/references/audit-architecture.md +100 -0
  29. package/ds-canonical/fork/skills/visual-audit/references/visual-checklist.md +297 -0
  30. package/ds-canonical/fork/skills/visual-audit/references/world-class-benchmarks.md +198 -0
  31. package/ds-canonical/hooks/lib/_app_shell_primary_header_consistency.sh +6 -3
  32. package/ds-canonical/hooks/tests/test_check_app_shell_primary_header_consistency.sh +12 -0
  33. package/llms-full.txt +1 -1
  34. package/llms.txt +1 -1
  35. package/package.json +1 -1
  36. package/src/components/AppShell/_demo-helpers.tsx +9 -2
  37. package/src/components/AppShell/app-shell.spec.md +4 -0
  38. package/src/components/AppShell/app-shell.stories.tsx +4 -0
  39. package/src/components/Sidebar/sidebar.spec.md +2 -0
@@ -0,0 +1,141 @@
1
+ # Evaluation Matrix — 4 軸評分 + 決策規則
2
+
3
+ Phase 2 將 Phase 1 scan 結果變成可決策的評分表。
4
+
5
+ ---
6
+
7
+ ## 4 軸評分表
8
+
9
+ ### 結構
10
+
11
+ ```
12
+ | Candidate | 優缺(pros / cons) | DS 一致性(1-5) | 業務 fit(1-5) | 複雜度(1-5,低=高分) | 小計 | 備註 |
13
+ |-----------|---------------------|------------------|------------------|------------------------|------|------|
14
+ | Linear 風格 | + 簡潔直覺 / - 太新 consumer 不熟 | 5(全用既有) | 4 | 5(複用 Button/Popover) | 14/15 | Mindset #1 我們 / Linear 一樣簡潔,差別: ... |
15
+ | Notion 風格 | + 高階彈性 / - 學習曲線陡 | 3(需新 Command Palette) | 3 | 2(重度自訂) | 8/15 | Mindset #2 需新 primitive 評估 |
16
+ | Stripe 風格 | + 流程嚴謹 / - 太多 modal | 4(消費 Dialog) | 5(業務就是金流) | 3 | 12/15 | ... |
17
+ ```
18
+
19
+ ---
20
+
21
+ ## 每軸打分規則
22
+
23
+ ### 優缺(bullets,不打分)
24
+
25
+ 列 3-5 個 pros + 3-5 個 cons。**避免抽象形容詞**(「好看 / 直覺」— meaningless),用:
26
+ - 具體機制(「一鍵快速篩選」)
27
+ - 業務對映(「能直接表達 VIP 客戶分類」)
28
+ - 量化預期(「估可減 30% 誤點擊」)
29
+
30
+ ### DS 一致性(1-5,5 最高)
31
+
32
+ - **5**:全部消費 `node_modules/@qijenchen/design-system/src/components/` 既有元件 + 既有 layout primitives
33
+ - **4**:0-1 個新 primitive / 新 variant(低成本)
34
+ - **3**:1-2 個新元件或顯著新 pattern(中成本)
35
+ - **2**:3+ 個新元件 / 新 pattern(高成本 — 審慎)
36
+ - **1**:衝突(違反既有 mindset / layout primitive SSOT)
37
+
38
+ **扣分場景**:
39
+ - 候選需要覆蓋 `--chart-*` token 家族 → DS 一致性扣
40
+ - 需要 hack Popover / Dialog 基底 → DS 一致性扣
41
+ - 違反 token 防線 lib/_token_hygiene.sh 5 條守則 → 直接 1(這是 bug,不是 DS 選擇)
42
+
43
+ ### 業務 fit(1-5,5 最高)
44
+
45
+ 依 Phase 0 framing 打分:
46
+ - **5**:完美對映 primary jobs-to-be-done;使用者直接看懂情境
47
+ - **4**:對映但需要少量 onboarding
48
+ - **3**:可用但需要使用者重新學習
49
+ - **2**:不完全對映,但有救(次級情境)
50
+ - **1**:語境衝突(「這個 pattern 是 e-commerce 的,我們是 B2B SaaS」)
51
+
52
+ ### 複雜度(1-5,**低複雜度 = 高分**,反向)
53
+
54
+ - **5**:一週內可完成
55
+ - **4**:1-2 週
56
+ - **3**:2-4 週
57
+ - **2**:1-2 個月
58
+ - **1**:>2 個月(通常 skill 不走這條)
59
+
60
+ ## 小計 & 決策門檻
61
+
62
+ **小計 = DS一致性 + 業務 fit + 複雜度**(滿分 15)。
63
+
64
+ **決策規則**:
65
+ - ≥ 12/15 → **strong shortlist**(必進 Phase 3)
66
+ - 9-11/15 → **可 shortlist**(若有特別理由,如業務 fit=5 彌補其他)
67
+ - ≤ 8/15 → **drop**(記入 notes.md ruled-out reasons,保留學習價值)
68
+
69
+ **Tie-breaker**(兩個 12/15):
70
+ 1. 業務 fit 分數高者優先
71
+ 2. DS 一致性分數高者次之
72
+ 3. 都平手 → 同時進 Phase 3(讓 stakeholder 決)
73
+
74
+ **不以 AI 決定 drop**:邊界 candidate(9-11)user 可能有戰略理由選中,flagging + 等 Checkpoint 2 決策。
75
+
76
+ ---
77
+
78
+ ## Narrative 必寫項目(對齊 Mindset)
79
+
80
+ **每個 candidate 的 1-2 段摘要必含**:
81
+
82
+ 1. **對齊 Mindset #1「對標世界級」**:
83
+ - 「我們的做法 vs 這家是一樣 / 不同,不同的理由是 ___」
84
+ - 說不出理由 = 設計 bug
85
+
86
+ 2. **對齊 Mindset #2「不憑直覺發明」**:
87
+ - 「此 candidate 需要的新 primitive 是 ___ / 既有 primitive `X` 已可滿足」
88
+ - grep 既有 DS 的證據
89
+
90
+ 3. **對齊 Mindset #4「真實業務場景」**:
91
+ - 「此候選在我們的 `{業務場景 A}` / `{場景 B}` 會呈現 ___」
92
+ - 不是抽象「UX 好」
93
+
94
+ 4. **OOUX / IA 深度對標**(see `ooux-template.md`):
95
+ - 「此 candidate 的 object model 對應競品的 `{Linear/Jira}` 方式,差異在 `{relationship depth / progressive disclosure 策略}` 是 ___」
96
+ - 不是只比視覺表皮;若 candidate 實際上是同個 object model 的 UI shape 變體,narrative 需明點出
97
+ - 若候選會變更 object definition(拆分 / 合併 object),**扣 DS 一致性分**(代表與 product canonical object model 漂移)
98
+
99
+ 4. **對齊 Mindset #5「猶豫就問」**:
100
+ - 若 candidate 的某部分無法評(資訊不足),**flag 而非猜**
101
+
102
+ ---
103
+
104
+ ## 輸出範本
105
+
106
+ ```markdown
107
+ ## 候選 A:Linear-style Quick Filter(推薦★)
108
+
109
+ **核心機制**:Popover + 多 checkbox + saved filter。
110
+
111
+ **優**:
112
+ - Shortcut(`Cmd+Shift+F`)符合 power user 習慣
113
+ - 我們既有 Popover + Checkbox 直接能組,零新元件
114
+ - 「saved filter」延伸功能未來 scalable
115
+
116
+ **缺**:
117
+ - 初次使用需 onboarding(Mindset #4:我們客群是 enterprise 中小企業,重度用戶少,需評估滲透率)
118
+ - shortcut 行動裝置 fallback 需另設計
119
+
120
+ **評分**:
121
+ - DS 一致性 **5**(100% 既有元件)
122
+ - 業務 fit **4**(power user 場景 100%,輕度用戶 onboarding 佔 20% 扣)
123
+ - 複雜度 **5**(預計 3 天完成)
124
+ - 小計 **14/15** → **strong shortlist**
125
+
126
+ **Mindset check**:
127
+ - #1:我們 vs Linear 一樣簡潔,差別我們加 filter preview(e-commerce 業務)
128
+ - #2:無需新 primitive
129
+ - #4:對 B2B SaaS 真實場景契合(sales daily filter 使用頻率高)
130
+ ```
131
+
132
+ ---
133
+
134
+ ## 反-patterns(評分偏誤)
135
+
136
+ - ❌ **偏好視覺酷炫**:Notion-style 華麗 = 高分 → 忽略業務/DS 扣分
137
+ - ❌ **偏好「我們獨創」**:自創 pattern 在 DS 一致性給高分 → 違反 Mindset #2
138
+ - ❌ **過度保守**:只打 3 分求穩 → Phase 2 失去篩選功能
139
+ - ❌ **抽象優缺**:「好看」「直覺」「簡潔」— 無決策力,等於沒寫
140
+ - ❌ **跳 tie-breaker 規則**:AI 挑一個 convenient 進 shortlist,違反 Checkpoint 2 精神
141
+ - ❌ **只比視覺不比 IA**:只看 Phase 1 表層 / 沒分析 object model 就打分 → 抄到形式,抄不到深度(見 ooux-template.md)
@@ -0,0 +1,198 @@
1
+ # OOUX Template — Object-Oriented UX(Object Map + NOM + CTA Inventory)
2
+
3
+ Object-Oriented UX 是 Sophia V. Prater(Rewired UX)提出的方法論。核心主張:使用者想的是**物件**,不是流程。設計 UI 前先盤核心 objects(名詞),產出以物件為中心的 UI。
4
+
5
+ **為什麼本 skill 整合 OOUX**:
6
+ - Phase 1 benchmark 只看視覺 + 功能 = 抄形式,抄不到 **information architecture**;加 OOUX 看物件結構才是深度對標
7
+ - Phase 3 每 candidate 先定 object model,UI 決策變 derivation(list view 顯示什麼 attributes / detail view 什麼 CTAs)— 不靠直覺
8
+ - 跨 candidate 共享同一 product-level object 定義,stakeholder 比稿時不被物件命名差異污染
9
+
10
+ 出處:[Sophia V. Prater — OOUX](https://www.ooux.com/) / [Rewired UX podcast](https://rewiredux.com/)
11
+
12
+ ---
13
+
14
+ ## ORCA Process(4 步)
15
+
16
+ 1. **O**bjects — 找出產品核心「名詞」
17
+ 2. **R**elationships — 物件間如何關聯(NOM = Nested Object Matrix)
18
+ 3. **C**TAs — 每個物件 per user role 可做什麼動作
19
+ 4. **A**ttributes — 每個物件的 properties
20
+
21
+ Airbnb 範例(參考 reference model):
22
+
23
+ | Object | Attributes | Relationships | CTAs(Host) | CTAs(Guest) |
24
+ |--------|-----------|---------------|------------|------------|
25
+ | Listing | title / photos / price / amenities / location | has many Reviews / belongs to Host / has many Reservations | Edit / Delist / Update price | Book / Save / Share |
26
+ | Reservation | check-in / check-out / total / status | belongs to Listing / belongs to Guest | View / Cancel | View / Cancel / Review |
27
+ | Review | rating / text / photos / date | belongs to Listing / by Guest | Reply | Write / Edit / Delete |
28
+ | Host | name / avatar / bio / languages / response-rate | has many Listings / has many Reviews | Edit profile | View profile / Message |
29
+ | Guest | name / avatar / verified / trips | has many Reservations / has many Reviews | — | Edit profile |
30
+
31
+ 注意:一個 object 可能有**不同 UI 展示 shape**(list row / card / detail page / inline chip),OOUX 不決定 shape,只決定 structure。shape 選擇走 Phase 3 時 consume DS 元件決定。
32
+
33
+ ---
34
+
35
+ ## Phase 1 用法 — 分析每個競品的 object model
36
+
37
+ benchmark scan 時,每個 reference 後加 mini object map:
38
+
39
+ ```markdown
40
+ ### Reference: Linear(issue tracking)
41
+
42
+ **Core objects identified**:
43
+ - Issue(title / desc / priority / assignee / labels / cycle / status)
44
+ - Cycle(name / start-end / scope / issues)
45
+ - Project(name / description / lead / issues / status)
46
+ - User(avatar / name / role)
47
+ - Team(name / members / issues)
48
+
49
+ **Relationships**(NOM highlights):
50
+ - Issue belongs to Project(1:1 optional)+ Cycle(1:1 optional)+ Assignee(1:1)
51
+ - Issue has many Comments / many Labels
52
+ - Cycle belongs to Team / has many Issues
53
+ - Project has many Issues / has Lead(= User)
54
+
55
+ **CTAs per role**(key ones):
56
+ - Admin/Lead:create / archive Project;set Cycle;assign Issue
57
+ - Member:create Issue;comment;change status;assign self
58
+
59
+ **UI shape observed**:
60
+ - Issue:row in list view / card in board view / detail page / quick-preview peek panel
61
+ - Cycle:sidebar entry / breadcrumb / filter chip
62
+ - Project:sidebar nav / breadcrumb / filter
63
+
64
+ **深度觀察**(比視覺更有價值的 pattern):
65
+ - Issue 物件在 5 種 UI shape 中 attributes 顯示不同但 identity 一致 — row 只看 title + assignee,card 加 priority + label,detail 全顯示。這種「attribute progressive disclosure by context」是 Linear IA 強項。
66
+ ```
67
+
68
+ 做完 5+ 家 benchmark 後,可能發現:
69
+ - 每家都有 "Issue / Task / Ticket / Work Item" 類的 object → 我們也該命名一個 canonical 名詞(Phase 3 用)
70
+ - 關係模型普遍是 `Item → Project → Team` 三層,有例外值得留意
71
+
72
+ ---
73
+
74
+ ## Phase 3.0 — Build our own Object Map(design 前強制步驟)
75
+
76
+ 每個 shortlisted candidate 開始 design 前,先完成 ORCA。不是每個 candidate 都有獨立 object map — 通常**同一 feature 的 3 個 candidate 共享 product-level object definition**,差異只在 UI shape + CTAs 順序。
77
+
78
+ ### Step 1:Objects(從 Phase 0 framing + Phase 1 benchmark 抽)
79
+
80
+ 列出核心名詞。**原則**:
81
+ - 2-7 個 objects 最理想(>7 通常是合併機會)
82
+ - 命名三重 test(CLAUDE.md):既有設計語言 / 世界級 idiom / 跨元件認知衝突
83
+ - 若 benchmark 發現 Linear 叫 "Issue"、Jira 叫 "Ticket"、我們叫什麼?根據自身業務 + 目標 user 慣用語 pick one,整個 skill 延伸統一用此命名
84
+
85
+ ```markdown
86
+ ## Our Feature Object Map
87
+
88
+ **Objects**(我們 feature 的核心名詞):
89
+ 1. Task(對齊 Jira convention,台灣用戶更熟)
90
+ 2. Sprint(對齊 Agile convention)
91
+ 3. User
92
+ 4. Comment
93
+ 5. Attachment
94
+ ```
95
+
96
+ ### Step 2:Attributes per object
97
+
98
+ ```markdown
99
+ | Object | Core attributes | Metadata | Identifying |
100
+ |--------|----------------|----------|-------------|
101
+ | Task | title / description / priority / status / assignee | created-at / updated-at | id / title |
102
+ | Sprint | name / start-end / goal / velocity | state(active/closed) | id / name |
103
+ | User | avatar / name / role / email | joined-at | id / email |
104
+ | Comment | body / author / timestamp | edited / reactions | id |
105
+ | Attachment | filename / size / type / url | uploaded-by | id |
106
+ ```
107
+
108
+ ### Step 3:Relationships(NOM)
109
+
110
+ ```markdown
111
+ | From → To | Relationship |
112
+ |-----------|-------------|
113
+ | Task → Sprint | belongs to(optional,unscheduled Task 也 OK) |
114
+ | Task → User(assignee) | belongs to(1:1 optional) |
115
+ | Task → User(reporter) | belongs to(1:1 required) |
116
+ | Task → Comments | has many |
117
+ | Task → Attachments | has many |
118
+ | Sprint → Tasks | has many |
119
+ | Sprint → Team(via Users) | indirect |
120
+ | Comment → Task | belongs to(1:1 required) |
121
+ | Comment → User(author) | belongs to(1:1 required) |
122
+ | Attachment → Task | belongs to(1:1 required) |
123
+ ```
124
+
125
+ ### Step 4:CTAs per role per object
126
+
127
+ ```markdown
128
+ ## CTA Inventory
129
+
130
+ ### Role: Admin
131
+ - Task: Create / Edit / Delete / Assign / Change status / Move to sprint
132
+ - Sprint: Create / Close / Reopen / Edit goal
133
+ - User: Invite / Remove / Change role
134
+ - Comment: Pin / Delete any
135
+ - Attachment: Delete any
136
+
137
+ ### Role: Member(assignee)
138
+ - Task: Create / Edit own / Change status / Add comment / Add attachment
139
+ - Sprint: View / Join
140
+ - User: Edit own profile
141
+ - Comment: Edit own / Delete own
142
+ - Attachment: Add / Delete own
143
+
144
+ ### Role: Viewer
145
+ - Task: View / Add comment
146
+ - Sprint: View
147
+ - User: View profile
148
+ - Comment: Add
149
+ ```
150
+
151
+ ### Step 5:以 Object Map 推 UI 決策
152
+
153
+ 每個 object 要決定的展示 shape(consume DS 元件):
154
+
155
+ ```markdown
156
+ ## UI Shape per Object
157
+
158
+ | Object | List | Card | Detail | Inline |
159
+ |--------|------|------|--------|--------|
160
+ | Task | MenuItem(sidebar quick) / DataTable row(board) | FileItem-style card 若有 attachment preview / 普通 Card | Page 全螢幕 + Tabs 切換 | Tag(labels)/ Chip(status) |
161
+ | Sprint | MenuItem | Summary Card | Dialog + Tabs | Badge(active dot) |
162
+ | User | Avatar + name(inline)/ MenuItem(picker) | NameCard(hover) | Profile Page | Avatar(chip) |
163
+ | Comment | Message item(chat style) | — | — | Thread inline |
164
+ | Attachment | FileItem compact | FileItem rich | — | Link(inline mention) |
165
+ ```
166
+
167
+ 此表直接對齊 DS 既有元件(MenuItem / DataTable / Card / Avatar / NameCard / FileItem / Tag / Chip 等)。若某 cell 找不到對應 DS 元件 → Phase 3 可能需要新 primitive(走 Checkpoint 3)。
168
+
169
+ ---
170
+
171
+ ## Object Map 跨 candidate 一致性
172
+
173
+ **關鍵 insight**:Phase 3 每 candidate 共享同一 Object Map。候選差別在:
174
+ - Attributes progressive disclosure 策略不同(Linear:list 只秀 3 attr / Jira:list 秀 8 attr)
175
+ - CTAs 順序 / 預設值不同(Notion:Edit 藏 hover 選單 / Jira:直接可見)
176
+ - Relationship 展示方式不同(Linear:inline chip / Jira:separate section)
177
+
178
+ 但 **object 本身的定義**(什麼是 Task / 什麼是 Sprint / 怎麼關聯)必須 identical。否則 stakeholder Phase 4 比稿變成「比物件定義」,失焦。
179
+
180
+ ---
181
+
182
+ ## 何時 OOUX 不適用 / 過度
183
+
184
+ - 極小 feature(單一 button 加到既有 page,無新 object)→ 跳過 ORCA,直接 Phase 3
185
+ - 純視覺 refresh(無 data model 改動)→ 跳過
186
+ - 1-object features(e.g., 設定單一開關)→ ORCA 退化為「這 object 有哪些 attributes」
187
+
188
+ 判斷法:若 Phase 0 framing 涉及 2+ 名詞互動 → OOUX 有用;若只涉及 1 動作 1 物件 → 跳過。
189
+
190
+ ---
191
+
192
+ ## References
193
+
194
+ - Sophia V. Prater, "OOUX: A Foundation for Interaction Design" — Rewired UX blog
195
+ - [ooux.com/tools](https://www.ooux.com/tools) — Object Map / NOM / CTA template 原版
196
+ - Rewired podcast(搜「OOUX」)
197
+ - Dan Klyn "Information Architecture Institute" 相關 IA 理論
198
+ - Alan Cooper "About Face" — 互動設計經典,object-centric 思維源頭之一
@@ -0,0 +1,229 @@
1
+ # Proposal Template — explorations/ 結構 + Storybook 編排
2
+
3
+ Phase 3 每個 shortlisted candidate 建一個 story + 共用 notes.md。
4
+
5
+ ---
6
+
7
+ ## 目錄結構(對齊 CLAUDE.md「Exploration 規則」)
8
+
9
+ ```
10
+ src/explorations/{topic-slug}/
11
+ ├── notes.md # 本 topic 的 source of truth
12
+ ├── {CandidateA-name}.stories.tsx # 候選 A 原型(1 檔內 3+ stories 各場景)
13
+ ├── {CandidateB-name}.stories.tsx
14
+ ├── {CandidateC-name}.stories.tsx
15
+ └── _shared/ # 僅此 topic 內共用的 helper(可選)
16
+ └── mock-data.ts
17
+ ```
18
+
19
+ ### 檔名慣例
20
+
21
+ - **Topic slug**:kebab-case,描述問題(`onboarding-tour` / `bulk-action-confirm` / `empty-state-first-visit`)
22
+ - **Candidate stories filename**:kebab-case + 描述性名稱(`linear-quick-filter.stories.tsx`)—**不用 `CandidateA/B/C`**(違反 CLAUDE.md「範例必須真實」mindset)
23
+
24
+ ### Storybook title 慣例(不與 Components/ 衝突)
25
+
26
+ ```tsx
27
+ title: 'Explorations/{Topic Title}/{Candidate Name}'
28
+ ```
29
+
30
+ 範例:
31
+ - `Explorations/Bulk Filter/Linear Quick-Filter`
32
+ - `Explorations/Bulk Filter/Notion Command Palette`
33
+ - `Explorations/Bulk Filter/Stripe Step Wizard`
34
+
35
+ ---
36
+
37
+ ## notes.md 範本
38
+
39
+ ```markdown
40
+ # {Topic Title}
41
+
42
+ ## 問題定義(Phase 0 framing)
43
+
44
+ **誰**:{primary user persona,如「Sales Ops 主管」}
45
+ **想**:{jobs-to-be-done,如「在 50+ 筆 leads 中快速 filter 這週要跟進」}
46
+ **解決**:{解除的痛點,如「現在得滾一頁找 tags,誤點率高」}
47
+ **Constraints**:{mobile?a11y?時程?}
48
+
49
+ ## Phase 2 評估摘要
50
+
51
+ 見 Phase 2 完整評分表(略)。Shortlist 3 個:
52
+
53
+ | Candidate | 核心機制 | 評分 | Phase 3 檔案 |
54
+ |-----------|---------|------|-------------|
55
+ | Linear Quick-Filter | Popover + checkbox + saved | 14/15 | `linear-quick-filter.stories.tsx` |
56
+ | Notion Command Palette | modal Cmd-K + query | 11/15 | `notion-command-palette.stories.tsx` |
57
+ | Stripe Step Wizard | Dialog + 3 步 fine-grained | 12/15 | `stripe-step-wizard.stories.tsx` |
58
+
59
+ ## Phase 3.0 Object Map(全 candidate 共享)
60
+
61
+ 本 feature 的 canonical object model,由 Phase 1 benchmark 的 OOUX 分析收斂 + Phase 0 framing 收敛而成。**3 個 candidate 共享此 Object Map**,差異只在 UI shape + CTAs 順序。
62
+
63
+ **Objects**(core nouns):
64
+ - {Object A}(核心名詞 1)
65
+ - {Object B}(核心名詞 2)
66
+ - {Object C}(若有)
67
+
68
+ **Attributes per object**:
69
+
70
+ | Object | Core attributes | Metadata | Identifying |
71
+ |--------|----------------|----------|-------------|
72
+ | {A} | ... | ... | ... |
73
+ | {B} | ... | ... | ... |
74
+
75
+ **Relationships(NOM)**:
76
+
77
+ | From → To | Relationship |
78
+ |-----------|-------------|
79
+ | {A} → {B} | belongs to / has many / ... |
80
+ | ... | ... |
81
+
82
+ **CTAs per role per object**:
83
+
84
+ | Role | {A} CTAs | {B} CTAs |
85
+ |------|----------|----------|
86
+ | Admin | Create / Edit / Delete | ... |
87
+ | Member | View / Comment | ... |
88
+
89
+ **UI Shape → DS 元件映射**:
90
+
91
+ | Object | List | Card | Detail | Inline |
92
+ |--------|------|------|--------|--------|
93
+ | {A} | MenuItem / DataTable row | Card / FileItem | Page + Tabs | Tag / Chip |
94
+ | {B} | ... | ... | ... | ... |
95
+
96
+ 完整 ORCA 方法與範本見 [`ooux-template.md`](ooux-template.md)。
97
+
98
+ ## 候選獨立說明
99
+
100
+ ### Linear Quick-Filter
101
+
102
+ - **positioning**:面向重度 power user,shortcut-first
103
+ - **適合場景**:
104
+ - Sales Ops 每日追蹤 leads(frequency=high,repeat task)
105
+ - Project Manager bulk status update
106
+ - Support 團隊 ticket triage
107
+ - **不適合**:
108
+ - 新手 user(沒 onboarding 不知道 shortcut)
109
+ - 行動裝置(shortcut 無對應)
110
+ - **新元件需求**:無(既有 Popover + Checkbox + Button 就夠)
111
+
112
+ ### Notion Command Palette
113
+
114
+ - **positioning**:開放式 query,unified search
115
+ - **適合場景**:
116
+ - 多維 filter(人 + tag + date)同時作用
117
+ - 可 memory 用戶的自訂 query
118
+ - **不適合**:
119
+ - 情境簡單(2-3 filter)會 overkill
120
+ - 首次 user onboarding 負擔重
121
+ - **新元件需求**:**可能需 `CommandPalette` 新元件**(本 DS 目前有 `Command` 但無全站 palette 結構)。若採用此 candidate,Checkpoint 3 討論是否升級。
122
+
123
+ ### Stripe Step Wizard
124
+
125
+ - **positioning**:流程化,降低誤操作
126
+ - **適合場景**:
127
+ - 破壞性 bulk action(delete 多筆)
128
+ - 需 audit trail 的金流 / 合規 action
129
+ - **不適合**:
130
+ - 高頻日常操作(步驟拖慢速度)
131
+ - **新元件需求**:無(既有 Dialog + Steps + Checkbox)
132
+
133
+ ## 下一步
134
+
135
+ Phase 4 summary 整理完畢後,stakeholder 決定採用,走 graduation 流程:
136
+ - 採用者遷移到 `node_modules/@qijenchen/design-system/src/`(若有新元件)或直接 app-level UI
137
+ - 未採用者:留 `explorations/{topic-slug}/` 或移 `_archive/`(保紀錄)
138
+
139
+ ## 參考
140
+
141
+ - Phase 1 research 連結(略)
142
+ - Phase 2 評估完整表(略)
143
+ - Storybook 路徑:`Explorations/{Topic Title}/*`
144
+ ```
145
+
146
+ ---
147
+
148
+ ## Candidate story 範本
149
+
150
+ 每個 `{candidate-name}.stories.tsx` 建議結構:
151
+
152
+ ```tsx
153
+ import type { Meta, StoryObj } from '@storybook/react'
154
+ // 從 DS import 既有元件
155
+ import { Popover, PopoverContent, PopoverTrigger } from '@/design-system/components/Popover/popover'
156
+ import { Checkbox } from '@/design-system/components/Checkbox/checkbox'
157
+ // ...
158
+
159
+ const meta: Meta = {
160
+ title: 'Explorations/Bulk Filter/Linear Quick-Filter',
161
+ parameters: { layout: 'padded' },
162
+ }
163
+ export default meta
164
+
165
+ type Story = StoryObj
166
+
167
+ // Story 1:positioning 說明(不可互動也 OK)
168
+ export const Positioning: Story = {
169
+ name: '1. Positioning',
170
+ render: () => (
171
+ <div className="max-w-lg flex flex-col gap-3">
172
+ <h3 className="text-body-lg font-medium">Linear Quick-Filter</h3>
173
+ <p className="text-body text-fg-secondary">
174
+ shortcut `Cmd+Shift+F` 開 Popover,checkbox 多選,支援 saved filter 組合。
175
+ 面向 sales ops 每日場景:速度 > 引導。
176
+ </p>
177
+ <div className="border-t border-divider pt-3">
178
+ <a href="..." className="text-info">Linear 原始參考 →</a>
179
+ </div>
180
+ </div>
181
+ ),
182
+ }
183
+
184
+ // Story 2-4:具體情境(3 個以上,對齊 Mindset #4)
185
+ export const SalesOpsDaily: Story = {
186
+ name: '2. Sales Ops 每日追蹤 leads',
187
+ render: () => { /* 完整互動 prototype */ },
188
+ }
189
+
190
+ export const ProjectBulkStatus: Story = {
191
+ name: '3. PM bulk status update',
192
+ render: () => { /* */ },
193
+ }
194
+
195
+ export const SupportTriage: Story = {
196
+ name: '4. Support ticket triage',
197
+ render: () => { /* */ },
198
+ }
199
+
200
+ // Story 5(可選):edge case / failure mode(讓 stakeholder 看弱點也是成熟的設計溝通)
201
+ export const NewbieOnboardingConcern: Story = {
202
+ name: '5. ⚠️ 新手首次遇到(知識死角)',
203
+ render: () => (
204
+ <div>
205
+ {/* 示範新手沒 shortcut 知識時看到什麼 */}
206
+ </div>
207
+ ),
208
+ }
209
+ ```
210
+
211
+ ---
212
+
213
+ ## DS 使用鐵律(per CLAUDE.md)
214
+
215
+ Phase 3 建 exploration 時:
216
+
217
+ 1. **優先用既有元件** `node_modules/@qijenchen/design-system/src/components/`,不自創
218
+ 2. **Layout primitives 消費**(per CLAUDE.md 清單):Empty / item-layout / overlay-surface / ScrollArea / AspectRatio
219
+ 3. **Token 紀律**:只用 semantic token,不硬寫 hex / rgb / shadow-sm
220
+ 4. **token 防線 lib/_token_hygiene.sh 5-check**:shadcn alias / v4 shorthand / hardcoded shadow / primitive-color-as-utility / native overflow — 5 項全過
221
+ 5. **新元件需求**:**notes.md 明文標示**,不偷偷 add 到 Components/(Checkpoint 3 專屬)
222
+
223
+ ---
224
+
225
+ ## Non-goals
226
+
227
+ - Pixel-perfect 不是目標(Phase 3 看 pattern 可行性)
228
+ - 不做完整 test coverage(exploration 不上 prod)
229
+ - 不覆寫 DS 元件 props(若需 override, 代表這個 candidate 不適合既有 DS)