motif-design 0.1.0 → 0.2.0

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.
package/README.md CHANGED
@@ -20,7 +20,7 @@ This auto-detects your AI runtime (Claude Code for v1), installs design intellig
20
20
  |---------|-------------|
21
21
  | `/motif:init` | Interview, vertical detection, design brief |
22
22
  | `/motif:research` | 4-agent parallel research, locked design decisions |
23
- | `/motif:system` | Generate tokens + component specs + visual showcase |
23
+ | `/motif:system` | Generate tokens + component specs + icon catalog + visual showcase |
24
24
  | `/motif:compose [screen]` | Build screen with fresh agent context |
25
25
  | `/motif:review [screen\|all]` | 4-lens heuristic evaluation, scored /100 |
26
26
  | `/motif:fix [screen]` | Fix review findings systematically |
@@ -41,13 +41,15 @@ This auto-detects your AI runtime (Claude Code for v1), installs design intellig
41
41
 
42
42
  ## How It Works
43
43
 
44
- Three things make Motif different from generic UI generation:
44
+ Four things make Motif different from generic UI generation:
45
45
 
46
46
  **Domain intelligence.** Vertical databases contain domain-specific color palettes, typography scales, component patterns, layout conventions, and anti-patterns. When you tell Motif you are building a fintech app, every design decision draws from established fintech patterns -- not random defaults.
47
47
 
48
48
  **Fresh context per screen.** Each screen is composed by a fresh subagent with a full 200K token context window loaded with your design system, research decisions, and domain knowledge. There is no context degradation over time. The tenth screen gets the same quality as the first.
49
49
 
50
- **Design system enforcement.** Hooks run during composition to catch hardcoded color values, banned fonts, spacing violations, and accessibility issues before they ship. The design system is not advisory -- it is enforced.
50
+ **Icon library integration.** The system architect selects icons from curated libraries (Phosphor, Lucide, Heroicons) based on your domain vertical, generates an `ICON-CATALOG.md` with CDN links and usage syntax, and the composer consumes it -- so every screen uses real, consistent icons instead of placeholder text or hallucinated class names.
51
+
52
+ **Design system enforcement.** Hooks and validators run during composition to catch hardcoded color values, banned fonts, spacing violations, import cycles, naming conflicts, and accessibility issues before they ship. The design system is not advisory -- it is enforced.
51
53
 
52
54
  ## Architecture
53
55
 
@@ -64,14 +66,15 @@ User runs /motif:compose login
64
66
  |
65
67
  v
66
68
  Fresh Subagent (200K context)
67
- loads tokens.css + COMPONENT-SPECS.md + vertical DB
68
- builds screen -> commits atomically
69
+ loads tokens.css + COMPONENT-SPECS.md + ICON-CATALOG.md + vertical DB
70
+ builds screen -> validates -> commits atomically
69
71
  ```
70
72
 
71
73
  Motif uses a **core + adapters** architecture:
72
74
 
73
75
  - **Core** (`core/`) -- shared workflows, references, templates, vertical databases. Runtime-agnostic.
74
76
  - **Runtimes** (`runtimes/`) -- thin adapters per AI tool. v1 ships Claude Code; others follow with zero core changes.
77
+ - **Scripts** (`scripts/`) -- validation and analysis tools (compose-validator, token-extractor, gap-analyzer, contrast-checker).
75
78
 
76
79
  Installed file layout (Claude Code):
77
80
 
@@ -81,11 +84,87 @@ Installed file layout (Claude Code):
81
84
  .planning/design/ Generated design artifacts (tokens, specs, screens)
82
85
  ```
83
86
 
87
+ ## Verticals
88
+
89
+ Motif ships with domain intelligence for:
90
+
91
+ | Vertical | File |
92
+ |----------|------|
93
+ | Fintech | `core/references/verticals/fintech.md` |
94
+ | Health | `core/references/verticals/health.md` |
95
+ | SaaS | `core/references/verticals/saas.md` |
96
+ | E-commerce | `core/references/verticals/ecommerce.md` |
97
+
98
+ Each vertical contains color palettes, typography guidance, component patterns, layout conventions, icon recommendations, and anti-patterns specific to that domain. New verticals can be added using `core/templates/VERTICAL-TEMPLATE.md`.
99
+
84
100
  ## Requirements
85
101
 
86
102
  - Node.js >= 22.0.0
87
103
  - Claude Code (v1.0 -- more runtimes coming)
88
104
 
105
+ ## Contributing
106
+
107
+ Contributions are welcome. Here's how to get started.
108
+
109
+ ### Setup
110
+
111
+ ```bash
112
+ git clone https://github.com/Austine3000/motif.git
113
+ cd motif
114
+ npm install
115
+ ```
116
+
117
+ ### Project Structure
118
+
119
+ ```
120
+ bin/ Installer (npx entry point)
121
+ core/ Runtime-agnostic workflows, references, templates, verticals
122
+ runtimes/ Runtime-specific adapters (claude-code for v1)
123
+ scripts/ Validation and analysis tools
124
+ test/ E2E and validation tests
125
+ ```
126
+
127
+ ### Running Tests
128
+
129
+ ```bash
130
+ # Run the full validation suite against a test project
131
+ bash test/validation/run-all-validations.sh --controlled /path/to/test-project
132
+
133
+ # Run the compose validator on a screen
134
+ node scripts/compose-validator.js --screen login --files src/login.html
135
+ ```
136
+
137
+ ### Adding a Vertical
138
+
139
+ 1. Copy `core/templates/VERTICAL-TEMPLATE.md` to `core/references/verticals/<name>.md`
140
+ 2. Fill in domain-specific palettes, typography, component patterns, and anti-patterns
141
+ 3. Add the vertical to the installer's detection logic in `bin/install.js`
142
+
143
+ ### Adding a Runtime Adapter
144
+
145
+ 1. Create a new directory under `runtimes/<runtime-name>/`
146
+ 2. Implement thin command files that load core workflows
147
+ 3. Document the adapter in `core/references/runtime-adapters.md`
148
+
149
+ ### Commit Convention
150
+
151
+ This project uses scoped prefixes:
152
+
153
+ ```
154
+ feat(scope): New feature
155
+ fix(scope): Bug fix
156
+ docs(scope): Documentation
157
+ chore(scope): Maintenance
158
+ design(scope): Design system work (init, research, system, compose, review, fix, evolve, quick)
159
+ ```
160
+
161
+ ### Pull Requests
162
+
163
+ 1. Fork the repo and create a branch from `main`
164
+ 2. Make your changes with clear, atomic commits
165
+ 3. Ensure validation passes on any modified workflows or templates
166
+ 4. Open a PR with a summary of what changed and why
167
+
89
168
  ## License
90
169
 
91
170
  [MIT](LICENSE)
@@ -33,6 +33,7 @@ Every planning/design file has a maximum token budget. If a file exceeds its bud
33
33
  | COMPONENT-SPECS.md | 5,000 | Component XML specs |
34
34
  | [screen]-SUMMARY.md | 500 each | Per-screen summary |
35
35
  | [screen]-REVIEW.md | 1,000 each | Per-screen review |
36
+ | ICON-CATALOG.md | 1,000 | Per-project icon name lookup for composer |
36
37
 
37
38
  **Total context budget for a fully-loaded subagent**: ~15,000 tokens of context files, leaving ~185,000 tokens for the actual work.
38
39
 
@@ -48,7 +49,7 @@ Different commands need different slices of context. These profiles define exact
48
49
  .planning/design/DESIGN-BRIEF.md
49
50
  </always_load>
50
51
  <load_if_exists>
51
- .claude/get-motif/verticals/{vertical}.md
52
+ .claude/get-motif/references/verticals/{vertical}.md
52
53
  </load_if_exists>
53
54
  <never_load>
54
55
  tokens.css
@@ -69,7 +70,8 @@ Different commands need different slices of context. These profiles define exact
69
70
  <load_if_exists>
70
71
  .planning/design/research/02-visual-language.md
71
72
  .planning/design/research/03-accessibility.md
72
- .claude/get-motif/verticals/{vertical}.md
73
+ .claude/get-motif/references/verticals/{vertical}.md
74
+ .claude/get-motif/references/icon-libraries.md
73
75
  </load_if_exists>
74
76
  <never_load>
75
77
  research/01-vertical-patterns.md (already synthesized in DESIGN-RESEARCH.md)
@@ -86,6 +88,7 @@ Different commands need different slices of context. These profiles define exact
86
88
  .planning/design/PROJECT.md
87
89
  .planning/design/system/tokens.css
88
90
  .planning/design/system/COMPONENT-SPECS.md
91
+ .planning/design/system/ICON-CATALOG.md
89
92
  </always_load>
90
93
  <load_if_exists>
91
94
  .planning/design/DESIGN-RESEARCH.md
@@ -96,6 +99,7 @@ Different commands need different slices of context. These profiles define exact
96
99
  Raw research files (already synthesized)
97
100
  Other screen source code (only summaries)
98
101
  DESIGN-SYSTEM.md (tokens.css + COMPONENT-SPECS.md are sufficient)
102
+ icon-libraries.md (already distilled into ICON-CATALOG.md)
99
103
  </never_load>
100
104
  </context_profile>
101
105
  ```
@@ -112,6 +116,7 @@ Different commands need different slices of context. These profiles define exact
112
116
  <load_if_exists>
113
117
  .planning/design/PROJECT.md
114
118
  .planning/design/screens/{screen}-SUMMARY.md
119
+ .planning/design/system/ICON-CATALOG.md
115
120
  </load_if_exists>
116
121
  <never_load>
117
122
  DESIGN-BRIEF.md
@@ -0,0 +1,333 @@
1
+ # Icon Library Reference
2
+
3
+ Single source of truth for icon library metadata, domain affinity, and the selection algorithm. All downstream phases (vertical vocabularies, pipeline integration, enforcement) read from this file.
4
+
5
+ ---
6
+
7
+ ## Curated Libraries
8
+
9
+ ### Phosphor Icons
10
+
11
+ | Property | Value |
12
+ |----------|-------|
13
+ | Version | @phosphor-icons/web@2.1.2 |
14
+ | CDN (per-weight) | `https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/{weight}/style.css` |
15
+ | Usage Syntax | `<i class="ph ph-{name}"></i>` (regular) / `<i class="ph-{weight} ph-{name}"></i>` (other weights) |
16
+ | Icon Count | ~1,248 base icons (x6 weights = ~7,488 variants) |
17
+ | Weights/Variants | thin, light, regular, bold, fill, duotone (6 weights) |
18
+ | License | MIT |
19
+ | Requires JS | No |
20
+ | Last Verified | 2026-03-04 |
21
+
22
+ **Weight class mapping:** `ph` (regular), `ph-thin`, `ph-light`, `ph-bold`, `ph-fill`, `ph-duotone`
23
+
24
+ **Duotone note:** Secondary layer renders at 20% opacity by default. Detailed duotone styling is deferred to v1.2+ (REQUIREMENTS.md ICON-02). This phase documents duotone as a weight option only.
25
+
26
+ ---
27
+
28
+ ### Lucide
29
+
30
+ | Property | Value |
31
+ |----------|-------|
32
+ | Version | lucide@0.576.0 |
33
+ | CDN | `https://unpkg.com/lucide@0.576.0` |
34
+ | Usage Syntax | `<i data-lucide="{name}"></i>` + `lucide.createIcons()` |
35
+ | Icon Count | ~1,702 icons |
36
+ | Weights/Variants | Single outline style only (stroke width adjustable via attribute) |
37
+ | License | ISC |
38
+ | Requires JS | **Yes** -- must call `lucide.createIcons()` after DOM load |
39
+ | Last Verified | 2026-03-04 |
40
+
41
+ **IMPORTANT:** Lucide is the only library in the curated set that requires JavaScript initialization. The CDN script exposes a global `lucide` object; call `lucide.createIcons()` after the DOM is ready to render all `[data-lucide]` elements as inline SVGs.
42
+
43
+ **Version caveat:** Lucide is pre-1.0 (v0.576.0). Icon names may change between minor versions. Pin to this version and review quarterly. When Lucide reaches 1.0, update the pin and document the migration.
44
+
45
+ ---
46
+
47
+ ### Material Symbols
48
+
49
+ | Property | Value |
50
+ |----------|-------|
51
+ | Version | Google Fonts CDN (evergreen -- no version pin) |
52
+ | npm Version (self-hosting) | material-symbols@0.40.2 |
53
+ | CDN (Outlined) | `https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined` |
54
+ | CDN (Rounded) | `https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded` |
55
+ | CDN (Sharp) | `https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp` |
56
+ | Usage Syntax | `<span class="material-symbols-{style}">{icon_name}</span>` |
57
+ | Icon Count | ~2,500+ icons |
58
+ | Weights/Variants | 3 style families (Outlined, Rounded, Sharp) x variable font axes (FILL 0-1, wght 100-700, GRAD -50 to 200, opsz 20-48) |
59
+ | License | Apache 2.0 |
60
+ | Requires JS | No |
61
+ | Last Verified | 2026-03-04 |
62
+
63
+ **Version-pinning exception:** Material Symbols via Google Fonts is evergreen -- there is no `@0.40.2` in the Google Fonts URL. The font family name ("Material+Symbols+Outlined") is the stable identifier. For self-hosting with a pinned version, use the npm package `material-symbols@0.40.2`. This is the ONE exception to the CDN version-pinning rule.
64
+
65
+ **Naming convention:** Material Symbols uses underscores (`shopping_cart`), not hyphens. This is the most common source of icon name errors.
66
+
67
+ **Critical CSS requirement:** Always set explicit `font-size` AND matching `opsz` value. Default optical size is 48px, which renders icons oversized if not overridden.
68
+
69
+ ---
70
+
71
+ ### Tabler Icons
72
+
73
+ | Property | Value |
74
+ |----------|-------|
75
+ | Version | @tabler/icons-webfont@3.36.1 |
76
+ | CDN | `https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.36.1/dist/tabler-icons.min.css` |
77
+ | Usage Syntax | `<i class="ti ti-{name}"></i>` |
78
+ | Icon Count | ~6,038 total (4,985 outline + 1,053 filled) |
79
+ | Weights/Variants | Outline only via webfont (filled webfont has known bug -- see below) |
80
+ | License | MIT |
81
+ | Requires JS | No |
82
+ | Last Verified | 2026-03-04 |
83
+
84
+ **Known bug:** The filled variant webfont has a conflict where outline and filled icons cannot be used simultaneously via CDN. The filled webfont replaces outline classes rather than adding new ones (GitHub issue #1452, verified January 2026). **Use outline only for webfont/CDN usage.** The SVG package works fine for filled icons.
85
+
86
+ ---
87
+
88
+ ## Domain Affinity Matrix
89
+
90
+ | Vertical | Primary Library | Secondary Library | Default Weight | Emphasis Weight | Rationale |
91
+ |----------|----------------|-------------------|----------------|-----------------|-----------|
92
+ | Fintech | Phosphor Icons | Lucide | regular | bold | Weight variation for data-dense dashboards; duotone for hierarchy |
93
+ | Health | Material Symbols (Rounded) | Phosphor Icons | regular (wght:400) | filled (FILL:1) | Broadest medical icon coverage; Rounded style is warm, not clinical |
94
+ | SaaS | Lucide | Phosphor Icons | default (2px stroke) | default (2px stroke) | Feather-derived SaaS standard; single style means no weight variation |
95
+ | E-commerce | Material Symbols (Rounded) | Tabler Icons | regular (wght:400) | filled (FILL:1) | Action-oriented icons with fill for CTAs; Tabler for niche categories |
96
+
97
+ **Key rules:**
98
+ - One library per project -- no mixing libraries in the same output
99
+ - Secondary library = personality override pool, NOT a gap fallback
100
+ - Weight is a system-level decision applied consistently across all composed screens
101
+
102
+ ---
103
+
104
+ ## Selection Algorithm
105
+
106
+ Deterministic lookup: vertical + brand personality seed produces library + weight with zero ambiguity. Mirrors how Color and Typography Decision Algorithms work in `generate-system.md`.
107
+
108
+ **Inputs:**
109
+ - `vertical` (string): fintech | health | saas | ecommerce
110
+ - `personality` (integer, 1-10): from Differentiation Seed in DESIGN-BRIEF.md (see `core/references/design-inputs.md`)
111
+ - `formality` (integer, 1-10): from Differentiation Seed in DESIGN-BRIEF.md
112
+ - `user_library_override` (string, optional): explicit library choice from DESIGN-BRIEF.md
113
+
114
+ **Algorithm:**
115
+
116
+ ```
117
+ STEP 1 -- User override check
118
+ IF user_library_override IS SET in DESIGN-BRIEF.md:
119
+ selected_library = user_library_override
120
+ GOTO STEP 2 (still apply weight rules)
121
+ ELSE:
122
+ selected_library = AFFINITY_MATRIX[vertical].primary
123
+
124
+ STEP 2 -- Base weight assignment
125
+ default_weight = AFFINITY_MATRIX[vertical].default_weight
126
+ emphasis_weight = AFFINITY_MATRIX[vertical].emphasis_weight
127
+
128
+ STEP 3 -- Personality-based weight selection
129
+ IF selected_library supports weights (Phosphor Icons OR Material Symbols):
130
+ IF personality >= 7 (bold/rebellious):
131
+ Phosphor: default_weight = bold, emphasis_weight = fill
132
+ Material Symbols: default_weight = wght:600, emphasis_weight = FILL:1,wght:700
133
+ ELIF personality <= 3 (corporate/conservative):
134
+ Phosphor: default_weight = light, emphasis_weight = regular
135
+ Material Symbols: default_weight = wght:300, emphasis_weight = wght:400
136
+ ELSE (personality 4-6, balanced):
137
+ Phosphor: default_weight = regular, emphasis_weight = bold
138
+ Material Symbols: default_weight = wght:400, emphasis_weight = FILL:1
139
+ ELSE (Lucide OR Tabler -- no weight variants):
140
+ default_weight = default
141
+ emphasis_weight = default
142
+
143
+ STEP 4 -- Extreme personality library switch
144
+ IF personality >= 8 AND NOT user_library_override:
145
+ selected_library = AFFINITY_MATRIX[vertical].secondary
146
+ Recalculate weights for new library (repeat STEP 3 logic)
147
+ IF personality <= 2 AND NOT user_library_override:
148
+ selected_library = AFFINITY_MATRIX[vertical].secondary
149
+ Recalculate weights for new library (repeat STEP 3 logic)
150
+
151
+ STEP 5 -- Material Symbols style family selection
152
+ IF selected_library = Material Symbols:
153
+ IF formality <= 4 (casual/approachable):
154
+ style_family = Rounded
155
+ ELIF formality >= 7 (formal/institutional):
156
+ style_family = Sharp
157
+ ELSE (formality 5-6):
158
+ style_family = Outlined
159
+
160
+ STEP 6 -- Emit output
161
+ OUTPUT: {
162
+ library: selected_library,
163
+ default_weight: default_weight,
164
+ emphasis_weight: emphasis_weight,
165
+ style_family: style_family (Material Symbols only, omit otherwise),
166
+ cdn_url: look up in Curated Libraries section above,
167
+ usage_syntax: look up in Curated Libraries section above
168
+ }
169
+ ```
170
+
171
+ **Boundary values (inclusive):**
172
+ - `personality >= 7` triggers bold weights (7, 8, 9, 10 are all bold)
173
+ - `personality <= 3` triggers light weights (1, 2, 3 are all light)
174
+ - `personality >= 8` triggers library switch (8, 9, 10 switch to secondary)
175
+ - `personality <= 2` triggers library switch (1, 2 switch to secondary)
176
+ - `formality <= 4` selects Rounded (1, 2, 3, 4)
177
+ - `formality >= 7` selects Sharp (7, 8, 9, 10)
178
+ - Personality 4-6 are balanced (default weights, primary library)
179
+ - Formality 5-6 selects Outlined
180
+
181
+ ---
182
+
183
+ ## Icon Color
184
+
185
+ Icons use `currentColor` inheritance. No `--icon-color-*` tokens are needed.
186
+
187
+ Apply color via `color: var(--text-secondary)` on the parent or icon element. Icons inherit via CSS `currentColor`. For semantic colors, use existing tokens: `var(--color-success)`, `var(--color-error)`, `var(--color-warning)`.
188
+
189
+ ```css
190
+ /* Example: icon inherits color from parent */
191
+ .nav-item {
192
+ color: var(--text-secondary);
193
+ }
194
+ .nav-item.active {
195
+ color: var(--color-primary-500);
196
+ }
197
+ /* The icon inside inherits automatically via currentColor */
198
+ ```
199
+
200
+ ---
201
+
202
+ ## Icon Name Conventions
203
+
204
+ Common UI concepts mapped across all four libraries. Use these verified names to prevent hallucination.
205
+
206
+ | Concept | Phosphor | Lucide | Material Symbols | Tabler |
207
+ |---------|----------|--------|-----------------|--------|
208
+ | Home | ph-house | house | home | ti-home |
209
+ | Search | ph-magnifying-glass | search | search | ti-search |
210
+ | Settings | ph-gear | settings | settings | ti-settings |
211
+ | User/Profile | ph-user | user | person | ti-user |
212
+ | Cart | ph-shopping-cart | shopping-cart | shopping_cart | ti-shopping-cart |
213
+ | Heart/Favorite | ph-heart | heart | favorite | ti-heart |
214
+ | Arrow Right | ph-arrow-right | arrow-right | arrow_forward | ti-arrow-right |
215
+ | Chart/Analytics | ph-chart-line | bar-chart-2 | bar_chart | ti-chart-line |
216
+ | Notification | ph-bell | bell | notifications | ti-bell |
217
+ | Close | ph-x | x | close | ti-x |
218
+ | Check/Done | ph-check | check | check | ti-check |
219
+ | Mail | ph-envelope | mail | mail | ti-mail |
220
+ | Calendar | ph-calendar | calendar | calendar_month | ti-calendar |
221
+ | Lock/Security | ph-lock | lock | lock | ti-lock |
222
+ | Credit Card | ph-credit-card | credit-card | credit_card | ti-credit-card |
223
+
224
+ **Note:** Material Symbols uses underscores (`shopping_cart`, `arrow_forward`, `calendar_month`), not hyphens. Phosphor prefixes with `ph-`. Tabler prefixes with `ti-`. Lucide uses bare kebab-case names.
225
+
226
+ **This table covers common UI concepts only.** Curated per-vertical icon name vocabularies (e.g., fintech-specific icons like "bank", "transfer", "wallet") are defined in Phase 10.
227
+
228
+ ---
229
+
230
+ ## CDN Reference
231
+
232
+ Copy-paste-ready HTML snippets for each library.
233
+
234
+ ### Phosphor Icons
235
+
236
+ ```html
237
+ <!-- Regular weight (recommended starting point) -->
238
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/regular/style.css" />
239
+
240
+ <!-- Additional weights (load only what the design needs) -->
241
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/thin/style.css" />
242
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/light/style.css" />
243
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/bold/style.css" />
244
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/fill/style.css" />
245
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@phosphor-icons/web@2.1.2/src/duotone/style.css" />
246
+
247
+ <!-- Usage -->
248
+ <i class="ph ph-house"></i> <!-- Regular -->
249
+ <i class="ph-bold ph-house"></i> <!-- Bold -->
250
+ <i class="ph-light ph-house"></i> <!-- Light -->
251
+ <i class="ph-thin ph-house"></i> <!-- Thin -->
252
+ <i class="ph-fill ph-house"></i> <!-- Fill -->
253
+ <i class="ph-duotone ph-house"></i> <!-- Duotone -->
254
+ ```
255
+
256
+ ### Lucide
257
+
258
+ ```html
259
+ <!-- JS mode (recommended -- renders only icons present in DOM) -->
260
+ <script src="https://unpkg.com/lucide@0.576.0"></script>
261
+ <script>
262
+ document.addEventListener('DOMContentLoaded', () => {
263
+ lucide.createIcons();
264
+ });
265
+ </script>
266
+
267
+ <!-- Usage -->
268
+ <i data-lucide="house"></i>
269
+ <i data-lucide="settings"></i>
270
+ <i data-lucide="search"></i>
271
+ ```
272
+
273
+ **Lucide requires JS initialization.** Unlike Phosphor, Material Symbols, and Tabler, the icons will not render without calling `lucide.createIcons()`. This is the only library in the curated set with this requirement.
274
+
275
+ ### Material Symbols
276
+
277
+ ```html
278
+ <!-- Load one style family -->
279
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined" rel="stylesheet" />
280
+ <!-- OR Rounded -->
281
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded" rel="stylesheet" />
282
+ <!-- OR Sharp -->
283
+ <link href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp" rel="stylesheet" />
284
+
285
+ <!-- Usage -->
286
+ <span class="material-symbols-outlined">home</span>
287
+ <span class="material-symbols-rounded">settings</span>
288
+ <span class="material-symbols-sharp">search</span>
289
+ ```
290
+
291
+ **Required CSS setup for Material Symbols:**
292
+
293
+ ```css
294
+ /* CRITICAL: Always set explicit font-size AND matching opsz to prevent oversized rendering */
295
+ .material-symbols-outlined,
296
+ .material-symbols-rounded,
297
+ .material-symbols-sharp {
298
+ font-size: var(--icon-lg); /* Default 24px */
299
+ font-variation-settings:
300
+ 'FILL' 0,
301
+ 'wght' 400,
302
+ 'GRAD' 0,
303
+ 'opsz' 24;
304
+ }
305
+
306
+ /* Filled variant (emphasis weight) */
307
+ .material-symbols-outlined.filled,
308
+ .material-symbols-rounded.filled,
309
+ .material-symbols-sharp.filled {
310
+ font-variation-settings:
311
+ 'FILL' 1,
312
+ 'wght' 400,
313
+ 'GRAD' 0,
314
+ 'opsz' 24;
315
+ }
316
+ ```
317
+
318
+ ### Tabler Icons
319
+
320
+ ```html
321
+ <!-- Outline only -- filled webfont has known bug (GitHub #1452) -->
322
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/@tabler/icons-webfont@3.36.1/dist/tabler-icons.min.css" />
323
+
324
+ <!-- Usage -->
325
+ <i class="ti ti-home"></i>
326
+ <i class="ti ti-settings"></i>
327
+ <i class="ti ti-search"></i>
328
+ ```
329
+
330
+ ---
331
+
332
+ *Icon Library Reference for Motif Design System Pipeline*
333
+ *Created: 2026-03-04*
@@ -240,6 +240,52 @@ Product browsing needs breathing room for imagery. Cart and checkout need densit
240
240
  | shadow-lg | 0 12px 24px -4px rgba(0,0,0,0.10), 0 4px 8px -4px rgba(0,0,0,0.05) | Modals, cart drawer, mega-menu |
241
241
  | shadow-xl | 0 20px 40px -8px rgba(0,0,0,0.12), 0 8px 16px -8px rgba(0,0,0,0.06) | Lightbox overlay, elevated popovers |
242
242
 
243
+ <!-- Verified against Material Symbols via GitHub google/material-design-icons/symbols/web/ -->
244
+
245
+ ## Icon Vocabulary
246
+
247
+ Primary library: Material Symbols Rounded (from icon-libraries.md domain affinity matrix)
248
+
249
+ Note: Material Symbols uses underscores, not hyphens. Double-check every name.
250
+
251
+ ### Navigation
252
+ | Semantic Role | Material Symbols | Phosphor | Lucide | Tabler |
253
+ |---------------|-----------------|----------|--------|--------|
254
+ | home | home | ph-house | house | ti-home |
255
+ | search | search | ph-magnifying-glass | search | ti-search |
256
+ | cart | shopping_cart | ph-shopping-cart | shopping-cart | ti-shopping-cart |
257
+ | profile | person | ph-user | user | ti-user |
258
+ | menu | menu | ph-list | menu | ti-menu-2 |
259
+
260
+ ### Commerce
261
+ | Semantic Role | Material Symbols | Phosphor | Lucide | Tabler |
262
+ |---------------|-----------------|----------|--------|--------|
263
+ | storefront | storefront | ph-storefront | store | ti-building-store |
264
+ | favorite | favorite | ph-heart | heart | ti-heart |
265
+ | star-rating | star | ph-star | star | ti-star |
266
+ | shipping | local_shipping | ph-truck | truck | ti-truck |
267
+ | payments | payments | ph-credit-card | credit-card | ti-credit-card |
268
+ | discount | sell | ph-tag | tag | ti-tag |
269
+ | package | package_2 | ph-package | package | ti-package |
270
+ | receipt | receipt_long | ph-receipt | receipt | ti-receipt |
271
+
272
+ ### Status & Feedback
273
+ | Semantic Role | Material Symbols | Phosphor | Lucide | Tabler |
274
+ |---------------|-----------------|----------|--------|--------|
275
+ | success | check_circle | ph-check-circle | check-circle | ti-circle-check |
276
+ | error | cancel | ph-x-circle | x-circle | ti-circle-x |
277
+ | warning | warning | ph-warning | alert-triangle | ti-alert-triangle |
278
+ | inventory-low | inventory | ph-warehouse | warehouse | ti-building-warehouse |
279
+
280
+ ### Actions
281
+ | Semantic Role | Material Symbols | Phosphor | Lucide | Tabler |
282
+ |---------------|-----------------|----------|--------|--------|
283
+ | add-to-cart | add_shopping_cart | ph-shopping-cart-simple | shopping-cart | ti-shopping-cart-plus |
284
+ | remove | close | ph-x | x | ti-x |
285
+ | share | share | ph-share-network | share-2 | ti-share |
286
+ | filter | filter_list | ph-funnel | filter | ti-filter |
287
+ | sort | sort | ph-arrows-down-up | arrow-up-down | ti-arrows-sort |
288
+
243
289
  ## E-commerce-Specific Additions
244
290
  - **Product image gallery:** Thumbnail strip below main image (desktop), swipe carousel with dot indicators (mobile), pinch-to-zoom, fullscreen lightbox with arrow navigation
245
291
  - **Size/variant selectors:** Chip group layout, selected chip gets primary border + fill, out-of-stock chips show diagonal strike-through and reduced opacity, size guide link adjacent
@@ -120,7 +120,7 @@ Users need enough data to make decisions without excessive scrolling, but not so
120
120
  <component name="TransactionRow" category="data-display">
121
121
  <description>Single transaction in a list. Most-viewed component in any fintech app.</description>
122
122
  <structure>
123
- Row: [MerchantIcon 40×40] [Description + Subtitle stack] [Amount right-aligned]
123
+ Row: [icon: merchant category --icon-lg in 40x40 --radius-full container] [Description + Subtitle stack] [Amount right-aligned]
124
124
  Description: --font-body --text-sm --weight-medium --text-primary
125
125
  Subtitle: --font-body --text-xs --text-secondary (date, category, reference)
126
126
  Amount: --font-mono --text-sm --weight-semibold, right-aligned
@@ -216,6 +216,51 @@ Users need enough data to make decisions without excessive scrolling, but not so
216
216
  | shadow-md | 0 4px 6px -1px rgba(0,0,0,0.07), 0 2px 4px -2px rgba(0,0,0,0.05) | Elevated cards, dropdowns |
217
217
  | shadow-lg | 0 10px 15px -3px rgba(0,0,0,0.08), 0 4px 6px -4px rgba(0,0,0,0.04) | Modals, popovers |
218
218
 
219
+ <!-- Verified against Phosphor Icons @phosphor-icons/web@2.1.2 via GitHub phosphor-icons/core/assets/regular/ -->
220
+
221
+ ## Icon Vocabulary
222
+
223
+ Primary library: Phosphor Icons (from icon-libraries.md domain affinity matrix)
224
+
225
+ ### Navigation
226
+ | Semantic Role | Phosphor | Lucide | Material Symbols | Tabler |
227
+ |---------------|----------|--------|-----------------|--------|
228
+ | home | ph-house | house | home | ti-home |
229
+ | search | ph-magnifying-glass | search | search | ti-search |
230
+ | settings | ph-gear | settings | settings | ti-settings |
231
+ | profile | ph-user | user | person | ti-user |
232
+ | notifications | ph-bell | bell | notifications | ti-bell |
233
+
234
+ ### Finance
235
+ | Semantic Role | Phosphor | Lucide | Material Symbols | Tabler |
236
+ |---------------|----------|--------|-----------------|--------|
237
+ | bank | ph-bank | landmark | account_balance | ti-building-bank |
238
+ | wallet | ph-wallet | wallet | account_balance_wallet | ti-wallet |
239
+ | credit-card | ph-credit-card | credit-card | credit_card | ti-credit-card |
240
+ | money | ph-currency-dollar | dollar-sign | payments | ti-currency-dollar |
241
+ | transfer | ph-arrows-left-right | arrow-left-right | swap_horiz | ti-transfer |
242
+ | chart | ph-chart-line-up | trending-up | trending_up | ti-trending-up |
243
+ | receipt | ph-receipt | receipt | receipt_long | ti-receipt |
244
+ | coins | ph-coins | coins | toll | ti-coins |
245
+
246
+ ### Status & Feedback
247
+ | Semantic Role | Phosphor | Lucide | Material Symbols | Tabler |
248
+ |---------------|----------|--------|-----------------|--------|
249
+ | success | ph-check-circle | check-circle | check_circle | ti-circle-check |
250
+ | error | ph-x-circle | x-circle | cancel | ti-circle-x |
251
+ | warning | ph-warning | alert-triangle | warning | ti-alert-triangle |
252
+ | pending | ph-clock | clock | schedule | ti-clock |
253
+
254
+ ### Actions
255
+ | Semantic Role | Phosphor | Lucide | Material Symbols | Tabler |
256
+ |---------------|----------|--------|-----------------|--------|
257
+ | send | ph-paper-plane-tilt | send | send | ti-send |
258
+ | scan-qr | ph-qr-code | qr-code | qr_code_scanner | ti-qr-code |
259
+ | security | ph-shield-check | shield-check | verified_user | ti-shield-check |
260
+ | biometric | ph-fingerprint | fingerprint | fingerprint | ti-fingerprint |
261
+ | copy | ph-copy | copy | content_copy | ti-copy |
262
+ | close | ph-x | x | close | ti-x |
263
+
219
264
  ## Crypto-Specific Additions
220
265
  - Always show BOTH crypto amount AND fiat equivalent
221
266
  - Network/chain indicator on all addresses (tiny chip: "TRC-20", "ERC-20", "SOL")