@krizaka/sovkora-design-system 0.0.0-stage → 4.0.1

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 (56) hide show
  1. package/CHANGELOG.md +244 -0
  2. package/LICENSE +202 -0
  3. package/README.md +82 -2
  4. package/package.json +112 -3
  5. package/registry/badge.json +97 -0
  6. package/registry/button.json +140 -0
  7. package/registry/chat-showcase.json +113 -0
  8. package/registry/clip-player.json +120 -0
  9. package/registry/command-palette.json +116 -0
  10. package/registry/examples/badge/model-state.tsx +16 -0
  11. package/registry/examples/button/send.tsx +18 -0
  12. package/registry/examples/chat-showcase/french.tsx +20 -0
  13. package/registry/examples/chat-showcase/sovereign-answer.tsx +20 -0
  14. package/registry/examples/clip-player/tea-pour.tsx +27 -0
  15. package/registry/examples/command-palette/workspace.tsx +30 -0
  16. package/registry/examples/icon/engine.tsx +26 -0
  17. package/registry/examples/icon/in-a-button.tsx +12 -0
  18. package/registry/examples/run-facts/clip-run.tsx +15 -0
  19. package/registry/examples/sentinel-mini/sidebar.tsx +11 -0
  20. package/registry/examples/skeleton/answer-loading.tsx +11 -0
  21. package/registry/examples/video-result/assistant.tsx +36 -0
  22. package/registry/examples/video-result/tea-pour.tsx +40 -0
  23. package/registry/foundations.json +2067 -0
  24. package/registry/icon.json +109 -0
  25. package/registry/index.json +242 -0
  26. package/registry/run-facts.json +75 -0
  27. package/registry/sentinel-mini.json +81 -0
  28. package/registry/skeleton.json +116 -0
  29. package/registry/video-result.json +167 -0
  30. package/src/components/Badge.tsx +36 -0
  31. package/src/components/Button.tsx +26 -0
  32. package/src/components/ChatShowcase.tsx +248 -0
  33. package/src/components/ClipPlayer.tsx +223 -0
  34. package/src/components/CommandPalette.tsx +104 -0
  35. package/src/components/CommandPalette.types.ts +33 -0
  36. package/src/components/Input.tsx +14 -0
  37. package/src/components/RunFacts.tsx +36 -0
  38. package/src/components/SentinelMini.tsx +61 -0
  39. package/src/components/Skeleton.tsx +50 -0
  40. package/src/components/VideoResult.tsx +123 -0
  41. package/src/components/badge.meta.ts +34 -0
  42. package/src/components/button.meta.ts +35 -0
  43. package/src/components/chat-showcase.css.ts +19 -0
  44. package/src/components/chat-showcase.meta.ts +50 -0
  45. package/src/components/clip-player.meta.ts +48 -0
  46. package/src/components/command-palette.meta.ts +47 -0
  47. package/src/components/icon.meta.ts +45 -0
  48. package/src/components/run-facts.meta.ts +32 -0
  49. package/src/components/sentinel-mini.meta.ts +39 -0
  50. package/src/components/skeleton.meta.ts +42 -0
  51. package/src/components/video-result.meta.ts +53 -0
  52. package/src/icon.registry.tsx +737 -0
  53. package/src/icon.tsx +74 -0
  54. package/src/index.ts +43 -0
  55. package/src/meta.ts +76 -0
  56. package/src/theme.css +859 -0
@@ -0,0 +1,737 @@
1
+ /**
2
+ * @file icon.registry.tsx
3
+ * @description The SVG path data behind every `IconName`.
4
+ *
5
+ * Split out of `icon.tsx` so that file is a component again. The 250-line cap (AGENTS.md §8)
6
+ * exists to keep components readable; it was being broken by ~690 lines of pure path data that
7
+ * nobody reads top to bottom. Granting the file an exemption would have left the rule with a hole;
8
+ * moving the data leaves the rule intact and the component genuinely small.
9
+ *
10
+ * Still `.tsx` because the values are JSX elements — the cap applies here too, and this file will
11
+ * eventually need splitting by domain. That is a real signal, not a nuisance: a registry that
12
+ * outgrows a screen is a registry that wants sub-registries.
13
+ */
14
+
15
+ import React from "react";
16
+
17
+ /** Keeps stroke thickness constant while a layout animates. Used by every path below. */
18
+ const VE = "non-scaling-stroke" as const;
19
+
20
+ export const ICON_REGISTRY = {
21
+ // ── Navigation ──────────────────────────────────────────
22
+ dashboard: (
23
+ <>
24
+ {/* Hexagonal command center */}
25
+ <path d="M12 2L20 7V17L12 22L4 17V7L12 2Z" vectorEffect={VE} />
26
+ <circle cx="12" cy="12" r="3" vectorEffect={VE} />
27
+ <path d="M12 9V2M12 22V15" strokeWidth="1" opacity="0.4" vectorEffect={VE} />
28
+ </>
29
+ ),
30
+
31
+ chat: (
32
+ <>
33
+ {/* Angular speech terminal */}
34
+ <path d="M4 4H20V16H12L7 20V16H4V4Z" vectorEffect={VE} />
35
+ <path d="M8 9H16M8 12H13" strokeWidth="1.2" vectorEffect={VE} />
36
+ </>
37
+ ),
38
+
39
+ playground: (
40
+ <>
41
+ {/* Circuit board with processing nodes */}
42
+ <rect x="3" y="3" width="18" height="18" rx="2" vectorEffect={VE} />
43
+ <circle cx="8" cy="8" r="1.5" fill="currentColor" vectorEffect={VE} />
44
+ <circle cx="16" cy="8" r="1.5" fill="currentColor" vectorEffect={VE} />
45
+ <circle cx="12" cy="16" r="1.5" fill="currentColor" vectorEffect={VE} />
46
+ <path d="M8 9.5V14L12 14.5M16 9.5V12L12 14.5" strokeWidth="1" opacity="0.5" vectorEffect={VE} />
47
+ </>
48
+ ),
49
+
50
+ settings: (
51
+ <>
52
+ {/* Hexagonal gear with precision markers */}
53
+ <path
54
+ d="M12 2L14.5 4L17.5 3.5L18.5 6.5L21.5 8L20 10.5L21 13.5L18 14.5L17 17.5L14 17L12 19.5L10 17L7 17.5L6 14.5L3 13.5L4 10.5L2.5 8L5.5 6.5L6.5 3.5L9.5 4L12 2Z"
55
+ vectorEffect={VE}
56
+ />
57
+ <circle cx="12" cy="11" r="3" vectorEffect={VE} />
58
+ </>
59
+ ),
60
+
61
+ profile: (
62
+ <>
63
+ {/* Angular avatar frame */}
64
+ <path d="M12 2L19 6V12C19 16 16 19.5 12 22C8 19.5 5 16 5 12V6L12 2Z" vectorEffect={VE} />
65
+ <circle cx="12" cy="10" r="3" vectorEffect={VE} />
66
+ <path d="M7.5 18C8.5 16 10 15 12 15C14 15 15.5 16 16.5 18" strokeWidth="1.2" vectorEffect={VE} />
67
+ </>
68
+ ),
69
+
70
+ history: (
71
+ <>
72
+ {/* Temporal circuit with clock core */}
73
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
74
+ <path d="M12 7V12L15 15" vectorEffect={VE} />
75
+ <path d="M3 12H5M19 12H21M12 3V5" strokeWidth="1" opacity="0.3" vectorEffect={VE} />
76
+ </>
77
+ ),
78
+
79
+ admin: (
80
+ <>
81
+ {/* Command console with equalizer bars */}
82
+ <rect x="3" y="3" width="18" height="18" rx="2" vectorEffect={VE} />
83
+ <path d="M7 14V17M10 10V17M13 12V17M16 8V17M19 6" strokeWidth="1.5" vectorEffect={VE} />
84
+ <path d="M3 8H21" strokeWidth="1" opacity="0.3" vectorEffect={VE} />
85
+ </>
86
+ ),
87
+
88
+ // ── Playground Capabilities ─────────────────────────────
89
+ video: (
90
+ <>
91
+ {/* Film frame with play core */}
92
+ <rect x="2" y="4" width="20" height="16" rx="2" vectorEffect={VE} />
93
+ <polygon points="10,9 16,12 10,15" fill="currentColor" stroke="none" vectorEffect={VE} />
94
+ <path d="M2 8H4M20 8H22M2 16H4M20 16H22" strokeWidth="1" opacity="0.4" vectorEffect={VE} />
95
+ </>
96
+ ),
97
+
98
+ audio: (
99
+ <>
100
+ {/* Sound wave spectrum */}
101
+ <path d="M4 12H4.01M7 8V16M10 5V19M13 8V16M16 6V18M19 9V15M22 11V13" strokeWidth="1.8" vectorEffect={VE} />
102
+ </>
103
+ ),
104
+
105
+ code: (
106
+ <>
107
+ {/* Angular brackets with circuit trace */}
108
+ <path d="M8 5L3 12L8 19" vectorEffect={VE} />
109
+ <path d="M16 5L21 12L16 19" vectorEffect={VE} />
110
+ <path d="M14 3L10 21" strokeWidth="1" opacity="0.4" vectorEffect={VE} />
111
+ </>
112
+ ),
113
+
114
+ image: (
115
+ <>
116
+ {/* Frame with geometric landscape */}
117
+ <rect x="3" y="3" width="18" height="18" rx="2" vectorEffect={VE} />
118
+ <path d="M3 16L8 11L12 15L16 10L21 16" vectorEffect={VE} />
119
+ <circle cx="8.5" cy="8.5" r="2" vectorEffect={VE} />
120
+ </>
121
+ ),
122
+
123
+ speech: (
124
+ <>
125
+ {/* Microphone with HUD resonance rings */}
126
+ <rect x="9" y="2" width="6" height="10" rx="3" vectorEffect={VE} />
127
+ <path d="M5 11C5 14.866 8.134 18 12 18C15.866 18 19 14.866 19 11" vectorEffect={VE} />
128
+ <path d="M12 18V22M9 22H15" vectorEffect={VE} />
129
+ </>
130
+ ),
131
+
132
+ vision: (
133
+ <>
134
+ {/* Targeting eye with scan reticle */}
135
+ <path d="M2 12C2 12 5 5 12 5C19 5 22 12 22 12C22 12 19 19 12 19C5 19 2 12 2 12Z" vectorEffect={VE} />
136
+ <circle cx="12" cy="12" r="3" vectorEffect={VE} />
137
+ <circle cx="12" cy="12" r="1" fill="currentColor" stroke="none" vectorEffect={VE} />
138
+ </>
139
+ ),
140
+
141
+ text: (
142
+ <>
143
+ {/* Document with scan lines */}
144
+ <path d="M4 3H16L20 7V21H4V3Z" vectorEffect={VE} />
145
+ <path d="M16 3V7H20" vectorEffect={VE} />
146
+ <path d="M7 11H17M7 14H14M7 17H11" strokeWidth="1" opacity="0.5" vectorEffect={VE} />
147
+ </>
148
+ ),
149
+
150
+ // ── Interceptor Pipeline Icons ──────────────────────────
151
+ rag: (
152
+ <>
153
+ {/* Knowledge retrieval — book with search beam */}
154
+ <path d="M4 4H18C19.1 4 20 4.9 20 6V20L17 18H6C4.9 18 4 17.1 4 16V4Z" vectorEffect={VE} />
155
+ <circle cx="16" cy="14" r="3" vectorEffect={VE} />
156
+ <path d="M18.5 16.5L21 19" vectorEffect={VE} />
157
+ <path d="M7 8H13M7 11H11" strokeWidth="1" opacity="0.5" vectorEffect={VE} />
158
+ </>
159
+ ),
160
+
161
+ memory: (
162
+ <>
163
+ {/* Brain circuit — neural network nodes */}
164
+ <circle cx="6" cy="6" r="2" vectorEffect={VE} />
165
+ <circle cx="18" cy="6" r="2" vectorEffect={VE} />
166
+ <circle cx="12" cy="12" r="2.5" vectorEffect={VE} />
167
+ <circle cx="6" cy="18" r="2" vectorEffect={VE} />
168
+ <circle cx="18" cy="18" r="2" vectorEffect={VE} />
169
+ <path
170
+ d="M7.5 7.5L10 10M14 10L16.5 7.5M7.5 16.5L10 14M14 14L16.5 16.5"
171
+ strokeWidth="1"
172
+ opacity="0.4"
173
+ vectorEffect={VE}
174
+ />
175
+ </>
176
+ ),
177
+
178
+ mcp: (
179
+ <>
180
+ {/* Model Context Protocol — plug with data stream */}
181
+ <path d="M12 2V6M8 2V5M16 2V5" vectorEffect={VE} />
182
+ <rect x="5" y="6" width="14" height="8" rx="2" vectorEffect={VE} />
183
+ <path d="M9 14V18L12 20L15 18V14" vectorEffect={VE} />
184
+ <circle cx="12" cy="10" r="1.5" fill="currentColor" stroke="none" vectorEffect={VE} />
185
+ </>
186
+ ),
187
+
188
+ refiner: (
189
+ <>
190
+ {/* Precision funnel with filtering layers */}
191
+ <path d="M3 4H21L15 12V19L9 22V12L3 4Z" vectorEffect={VE} />
192
+ <path d="M6 7H18M8 10H16" strokeWidth="1" opacity="0.3" vectorEffect={VE} />
193
+ </>
194
+ ),
195
+
196
+ router: (
197
+ <>
198
+ {/* Intent router — directional split paths */}
199
+ <circle cx="5" cy="12" r="2.5" vectorEffect={VE} />
200
+ <circle cx="19" cy="6" r="2" vectorEffect={VE} />
201
+ <circle cx="19" cy="12" r="2" vectorEffect={VE} />
202
+ <circle cx="19" cy="18" r="2" vectorEffect={VE} />
203
+ <path d="M7.5 11L17 6.5M7.5 12H17M7.5 13L17 17.5" strokeWidth="1" vectorEffect={VE} />
204
+ </>
205
+ ),
206
+
207
+ shield: (
208
+ <>
209
+ {/* Security shield with check core */}
210
+ <path d="M12 2L21 6V12C21 17 17 21 12 22C7 21 3 17 3 12V6L12 2Z" vectorEffect={VE} />
211
+ <path d="M8.5 12L11 14.5L16 9.5" strokeWidth="1.8" vectorEffect={VE} />
212
+ </>
213
+ ),
214
+
215
+ quantum: (
216
+ <>
217
+ {/* Quantum validation — atomic orbital */}
218
+ <circle cx="12" cy="12" r="2" fill="currentColor" stroke="none" vectorEffect={VE} />
219
+ <ellipse cx="12" cy="12" rx="10" ry="4" vectorEffect={VE} />
220
+ <ellipse cx="12" cy="12" rx="10" ry="4" transform="rotate(60 12 12)" vectorEffect={VE} />
221
+ <ellipse cx="12" cy="12" rx="10" ry="4" transform="rotate(-60 12 12)" vectorEffect={VE} />
222
+ </>
223
+ ),
224
+
225
+ pipeline: (
226
+ <>
227
+ {/* Pipeline flow — connected processing nodes */}
228
+ <circle cx="4" cy="12" r="2" vectorEffect={VE} />
229
+ <circle cx="12" cy="12" r="2.5" vectorEffect={VE} />
230
+ <circle cx="20" cy="12" r="2" vectorEffect={VE} />
231
+ <path d="M6 12H9.5M14.5 12H18" vectorEffect={VE} />
232
+ <path d="M12 6V9.5M12 14.5V18" strokeWidth="1" opacity="0.3" vectorEffect={VE} />
233
+ </>
234
+ ),
235
+
236
+ model: (
237
+ <>
238
+ {/* AI model — brain chip */}
239
+ <rect x="4" y="4" width="16" height="16" rx="3" vectorEffect={VE} />
240
+ <circle cx="12" cy="12" r="3" vectorEffect={VE} />
241
+ <path d="M4 9H2M4 15H2M22 9H20M22 15H20M9 4V2M15 4V2M9 20V22M15 20V22" strokeWidth="1.2" vectorEffect={VE} />
242
+ </>
243
+ ),
244
+
245
+ costShield: (
246
+ <>
247
+ {/* Cost monitoring — shield with gauge */}
248
+ <path d="M12 2L20 6V12C20 17 16.5 20.5 12 22C7.5 20.5 4 17 4 12V6L12 2Z" vectorEffect={VE} />
249
+ <path d="M8 13C8 13 10 10 12 10C14 10 16 13 16 13" strokeWidth="1.2" vectorEffect={VE} />
250
+ <circle cx="12" cy="14" r="1" fill="currentColor" stroke="none" vectorEffect={VE} />
251
+ </>
252
+ ),
253
+
254
+ language: (
255
+ <>
256
+ {/* Translation — globe with text */}
257
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
258
+ <path d="M2.5 9H21.5M2.5 15H21.5" strokeWidth="1" opacity="0.4" vectorEffect={VE} />
259
+ <path d="M12 3C8 7 8 17 12 21M12 3C16 7 16 17 12 21" vectorEffect={VE} />
260
+ </>
261
+ ),
262
+
263
+ tool: (
264
+ <>
265
+ {/* Tool callback — wrench with circuit */}
266
+ <path
267
+ d="M14.7 6.3C13.3 4.9 11.1 4.6 9.3 5.5L12.5 8.7L11.1 10.1L7.9 6.9C7 8.7 7.3 10.9 8.7 12.3C10.1 13.7 12.2 14 14 13.2L19 18.2C19.4 18.6 20 18.6 20.4 18.2C20.8 17.8 20.8 17.2 20.4 16.8L15.4 11.8C16.2 10 15.9 7.9 14.7 6.3Z"
268
+ vectorEffect={VE}
269
+ />
270
+ </>
271
+ ),
272
+
273
+ context: (
274
+ <>
275
+ {/* User context — badge with identity */}
276
+ <circle cx="12" cy="8" r="4" vectorEffect={VE} />
277
+ <path d="M4 20C4 16.7 7.6 14 12 14C16.4 14 20 16.7 20 20" vectorEffect={VE} />
278
+ <path d="M16 7L18 5M8 7L6 5" strokeWidth="1" opacity="0.3" vectorEffect={VE} />
279
+ </>
280
+ ),
281
+
282
+ system: (
283
+ <>
284
+ {/* System context — server rack */}
285
+ <rect x="4" y="2" width="16" height="6" rx="1" vectorEffect={VE} />
286
+ <rect x="4" y="10" width="16" height="6" rx="1" vectorEffect={VE} />
287
+ <path d="M4 18H20V22H4Z" vectorEffect={VE} />
288
+ <circle cx="17" cy="5" r="1" fill="currentColor" stroke="none" vectorEffect={VE} />
289
+ <circle cx="17" cy="13" r="1" fill="currentColor" stroke="none" vectorEffect={VE} />
290
+ <circle cx="17" cy="20" r="1" fill="currentColor" stroke="none" vectorEffect={VE} />
291
+ </>
292
+ ),
293
+
294
+ // ── UI Actions ──────────────────────────────────────────
295
+ key: (
296
+ <>
297
+ <circle cx="8" cy="10" r="5" vectorEffect={VE} />
298
+ <path d="M12.5 13.5L21 22" vectorEffect={VE} />
299
+ <path d="M17 17L19 15M19.5 19.5L21.5 17.5" strokeWidth="1.2" vectorEffect={VE} />
300
+ </>
301
+ ),
302
+
303
+ logout: (
304
+ <>
305
+ <path d="M9 21H5C4.4 21 4 20.6 4 20V4C4 3.4 4.4 3 5 3H9" vectorEffect={VE} />
306
+ <path d="M16 17L21 12L16 7" vectorEffect={VE} />
307
+ <path d="M21 12H9" vectorEffect={VE} />
308
+ </>
309
+ ),
310
+
311
+ search: (
312
+ <>
313
+ <circle cx="10.5" cy="10.5" r="7" vectorEffect={VE} />
314
+ <path d="M15.5 15.5L21 21" strokeWidth="2" vectorEffect={VE} />
315
+ </>
316
+ ),
317
+
318
+ notification: (
319
+ <>
320
+ <path d="M18 8C18 4.7 15.3 2 12 2C8.7 2 6 4.7 6 8C6 15 3 17 3 17H21C21 17 18 15 18 8Z" vectorEffect={VE} />
321
+ <path d="M13.7 21C13.1 21.6 12.6 22 12 22C11.4 22 10.9 21.6 10.3 21" vectorEffect={VE} />
322
+ </>
323
+ ),
324
+
325
+ menu: (
326
+ <>
327
+ <path d="M4 7H20M4 12H20M4 17H20" strokeWidth="1.8" vectorEffect={VE} />
328
+ </>
329
+ ),
330
+
331
+ close: (
332
+ <>
333
+ <path d="M6 6L18 18M18 6L6 18" strokeWidth="1.8" vectorEffect={VE} />
334
+ </>
335
+ ),
336
+
337
+ chevronDown: (
338
+ <>
339
+ <path d="M6 9L12 15L18 9" strokeWidth="1.8" vectorEffect={VE} />
340
+ </>
341
+ ),
342
+
343
+ chevronRight: (
344
+ <>
345
+ <path d="M9 6L15 12L9 18" strokeWidth="1.8" vectorEffect={VE} />
346
+ </>
347
+ ),
348
+
349
+ plus: (
350
+ <>
351
+ <path d="M12 5V19M5 12H19" strokeWidth="1.8" vectorEffect={VE} />
352
+ </>
353
+ ),
354
+
355
+ send: (
356
+ <>
357
+ {/* Angular arrow — launch trajectory */}
358
+ <path d="M22 2L11 13" vectorEffect={VE} />
359
+ <path d="M22 2L15 22L11 13L2 9L22 2Z" vectorEffect={VE} />
360
+ </>
361
+ ),
362
+
363
+ eye: (
364
+ <>
365
+ <path d="M2 12C2 12 5 5 12 5C19 5 22 12 22 12C22 12 19 19 12 19C5 19 2 12 2 12Z" vectorEffect={VE} />
366
+ <circle cx="12" cy="12" r="3" vectorEffect={VE} />
367
+ </>
368
+ ),
369
+
370
+ eyeOff: (
371
+ <>
372
+ <path d="M2 2L22 22" strokeWidth="1.8" vectorEffect={VE} />
373
+ <path d="M6.7 6.7C4.3 8.5 2 12 2 12C2 12 5 19 12 19C13.8 19 15.4 18.5 16.8 17.8" vectorEffect={VE} />
374
+ <path d="M9.9 4.2C10.6 4.1 11.3 4 12 4C19 4 22 12 22 12C22 12 21 14.1 19 16" vectorEffect={VE} />
375
+ </>
376
+ ),
377
+
378
+ attach: (
379
+ <>
380
+ <path
381
+ d="M21.4 11.6L12.2 20.8C9.8 23.2 5.8 23.2 3.4 20.8C1 18.4 1 14.4 3.4 12L13.6 1.8C15.2 0.2 17.8 0.2 19.4 1.8C21 3.4 21 6 19.4 7.6L9.2 17.8C8.4 18.6 7.1 18.6 6.3 17.8C5.5 17 5.5 15.7 6.3 14.9L15.5 5.7"
382
+ vectorEffect={VE}
383
+ />
384
+ </>
385
+ ),
386
+
387
+ spark: (
388
+ <>
389
+ {/* AI spark — diamond with energy rays */}
390
+ <path d="M12 2L14 9L21 9L15.5 13.5L17.5 21L12 16.5L6.5 21L8.5 13.5L3 9L10 9L12 2Z" vectorEffect={VE} />
391
+ </>
392
+ ),
393
+
394
+ newChat: (
395
+ <>
396
+ {/* New conversation — chat bubble with plus */}
397
+ <path d="M4 4H20V16H12L7 20V16H4V4Z" vectorEffect={VE} />
398
+ <path d="M12 8V14M9 11H15" strokeWidth="1.5" vectorEffect={VE} />
399
+ </>
400
+ ),
401
+
402
+ // ── Extended Icons ──────────────────────────────────────
403
+ loader: (
404
+ <>
405
+ {/* Spinning loader ring */}
406
+ <path d="M12 2C6.5 2 2 6.5 2 12" strokeWidth="2" vectorEffect={VE} />
407
+ <path d="M12 2C17.5 2 22 6.5 22 12" strokeWidth="2" opacity="0.3" vectorEffect={VE} />
408
+ <path d="M22 12C22 17.5 17.5 22 12 22" strokeWidth="2" opacity="0.15" vectorEffect={VE} />
409
+ <path d="M2 12C2 17.5 6.5 22 12 22" strokeWidth="2" opacity="0.08" vectorEffect={VE} />
410
+ </>
411
+ ),
412
+
413
+ check: (
414
+ <>
415
+ <path d="M5 12L10 17L20 7" strokeWidth="2" vectorEffect={VE} />
416
+ </>
417
+ ),
418
+
419
+ warning: (
420
+ <>
421
+ {/* Triangle alert */}
422
+ <path d="M12 2L22 20H2L12 2Z" vectorEffect={VE} />
423
+ <path d="M12 10V14" strokeWidth="1.8" vectorEffect={VE} />
424
+ <circle cx="12" cy="17" r="0.5" fill="currentColor" stroke="none" vectorEffect={VE} />
425
+ </>
426
+ ),
427
+
428
+ info: (
429
+ <>
430
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
431
+ <path d="M12 8V8.01" strokeWidth="2" vectorEffect={VE} />
432
+ <path d="M12 12V17" strokeWidth="1.5" vectorEffect={VE} />
433
+ </>
434
+ ),
435
+
436
+ error: (
437
+ <>
438
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
439
+ <path d="M15 9L9 15M9 9L15 15" strokeWidth="1.8" vectorEffect={VE} />
440
+ </>
441
+ ),
442
+
443
+ arrowLeft: (
444
+ <>
445
+ <path d="M19 12H5M12 5L5 12L12 19" strokeWidth="1.8" vectorEffect={VE} />
446
+ </>
447
+ ),
448
+
449
+ arrowRight: (
450
+ <>
451
+ <path d="M5 12H19M12 5L19 12L12 19" strokeWidth="1.8" vectorEffect={VE} />
452
+ </>
453
+ ),
454
+
455
+ arrowDown: (
456
+ <>
457
+ <path d="M12 5V19M5 12L12 19L19 12" strokeWidth="1.8" vectorEffect={VE} />
458
+ </>
459
+ ),
460
+
461
+ refresh: (
462
+ <>
463
+ <path d="M3 12C3 7 7 3 12 3C15.5 3 18.5 5 20 8" vectorEffect={VE} />
464
+ <path d="M21 12C21 17 17 21 12 21C8.5 21 5.5 19 4 16" vectorEffect={VE} />
465
+ <path d="M20 3V8H15" vectorEffect={VE} />
466
+ <path d="M4 21V16H9" vectorEffect={VE} />
467
+ </>
468
+ ),
469
+
470
+ copy: (
471
+ <>
472
+ <rect x="9" y="9" width="12" height="12" rx="2" vectorEffect={VE} />
473
+ <path d="M5 15H4C3.4 15 3 14.6 3 14V4C3 3.4 3.4 3 4 3H14C14.6 3 15 3.4 15 4V5" vectorEffect={VE} />
474
+ </>
475
+ ),
476
+
477
+ edit: (
478
+ <>
479
+ <path d="M17 3L21 7L8 20H4V16L17 3Z" vectorEffect={VE} />
480
+ <path d="M14.5 5.5L18.5 9.5" strokeWidth="1" opacity="0.3" vectorEffect={VE} />
481
+ </>
482
+ ),
483
+
484
+ trash: (
485
+ <>
486
+ <path d="M3 6H21M8 6V4C8 3.4 8.4 3 9 3H15C15.6 3 16 3.4 16 4V6" vectorEffect={VE} />
487
+ <path d="M5 6V20C5 20.6 5.4 21 6 21H18C18.6 21 19 20.6 19 20V6" vectorEffect={VE} />
488
+ <path d="M10 10V17M14 10V17" strokeWidth="1.2" vectorEffect={VE} />
489
+ </>
490
+ ),
491
+
492
+ upload: (
493
+ <>
494
+ <path d="M4 17V19C4 20.1 4.9 21 6 21H18C19.1 21 20 20.1 20 19V17" vectorEffect={VE} />
495
+ <path d="M12 15V3" vectorEffect={VE} />
496
+ <path d="M8 7L12 3L16 7" vectorEffect={VE} />
497
+ </>
498
+ ),
499
+
500
+ mail: (
501
+ <>
502
+ <rect x="2" y="4" width="20" height="16" rx="2" vectorEffect={VE} />
503
+ <path d="M2 7L12 13L22 7" vectorEffect={VE} />
504
+ </>
505
+ ),
506
+
507
+ hash: (
508
+ <>
509
+ <path d="M4 9H20M4 15H20M10 3V21M14 3V21" vectorEffect={VE} />
510
+ </>
511
+ ),
512
+
513
+ sun: (
514
+ <>
515
+ <circle cx="12" cy="12" r="4" vectorEffect={VE} />
516
+ <path
517
+ d="M12 2V4M12 20V22M4.9 4.9L6.3 6.3M17.7 17.7L19.1 19.1M2 12H4M20 12H22M4.9 19.1L6.3 17.7M17.7 6.3L19.1 4.9"
518
+ vectorEffect={VE}
519
+ />
520
+ </>
521
+ ),
522
+
523
+ moon: (
524
+ <>
525
+ <path d="M21 12.8A9 9 0 1 1 11.2 3 7 7 0 0 0 21 12.8Z" vectorEffect={VE} />
526
+ </>
527
+ ),
528
+
529
+ gauge: (
530
+ <>
531
+ <path d="M12 2C6.5 2 2 6.5 2 12C2 17.5 6.5 22 12 22C17.5 22 22 17.5 22 12" vectorEffect={VE} />
532
+ <path d="M12 12L18 6" strokeWidth="1.8" vectorEffect={VE} />
533
+ <circle cx="12" cy="12" r="2" fill="currentColor" stroke="none" vectorEffect={VE} />
534
+ </>
535
+ ),
536
+
537
+ timer: (
538
+ <>
539
+ <circle cx="12" cy="13" r="8" vectorEffect={VE} />
540
+ <path d="M12 9V13L15 16" vectorEffect={VE} />
541
+ <path d="M10 2H14" strokeWidth="1.5" vectorEffect={VE} />
542
+ </>
543
+ ),
544
+
545
+ layers: (
546
+ <>
547
+ <path d="M12 2L2 7L12 12L22 7L12 2Z" vectorEffect={VE} />
548
+ <path d="M2 12L12 17L22 12" vectorEffect={VE} />
549
+ <path d="M2 17L12 22L22 17" vectorEffect={VE} />
550
+ </>
551
+ ),
552
+
553
+ activity: (
554
+ <>
555
+ <path d="M22 12H18L15 21L9 3L6 12H2" strokeWidth="1.8" vectorEffect={VE} />
556
+ </>
557
+ ),
558
+
559
+ trendingUp: (
560
+ <>
561
+ <path d="M2 17L8 11L12 15L22 5" strokeWidth="1.8" vectorEffect={VE} />
562
+ <path d="M16 5H22V11" vectorEffect={VE} />
563
+ </>
564
+ ),
565
+
566
+ chartBar: (
567
+ <>
568
+ <rect x="3" y="12" width="4" height="9" rx="1" vectorEffect={VE} />
569
+ <rect x="10" y="6" width="4" height="15" rx="1" vectorEffect={VE} />
570
+ <rect x="17" y="3" width="4" height="18" rx="1" vectorEffect={VE} />
571
+ </>
572
+ ),
573
+
574
+ fileJson: (
575
+ <>
576
+ <path d="M4 3H16L20 7V21H4V3Z" vectorEffect={VE} />
577
+ <path d="M16 3V7H20" vectorEffect={VE} />
578
+ <path
579
+ d="M8 13C8 12 9 12 9 13V14C9 15 8 15 8 14M16 13C16 12 15 12 15 13V14C15 15 16 15 16 14"
580
+ strokeWidth="1.2"
581
+ vectorEffect={VE}
582
+ />
583
+ <path d="M11 12H13" strokeWidth="1" opacity="0.5" vectorEffect={VE} />
584
+ </>
585
+ ),
586
+
587
+ fileOutput: (
588
+ <>
589
+ <path d="M4 3H16L20 7V21H4V3Z" vectorEffect={VE} />
590
+ <path d="M16 3V7H20" vectorEffect={VE} />
591
+ <path d="M9 15L12 18L15 15M12 11V18" strokeWidth="1.2" vectorEffect={VE} />
592
+ </>
593
+ ),
594
+
595
+ circle: (
596
+ <>
597
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
598
+ </>
599
+ ),
600
+
601
+ checkCircle: (
602
+ <>
603
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
604
+ <path d="M8 12L11 15L17 9" strokeWidth="1.8" vectorEffect={VE} />
605
+ </>
606
+ ),
607
+
608
+ chevronLeft: (
609
+ <>
610
+ <path d="M15 6L9 12L15 18" strokeWidth="1.8" vectorEffect={VE} />
611
+ </>
612
+ ),
613
+
614
+ zap: (
615
+ <>
616
+ {/* Lightning bolt — energy */}
617
+ <path d="M13 2L3 14H12L11 22L21 10H12L13 2Z" vectorEffect={VE} />
618
+ </>
619
+ ),
620
+
621
+ // ── Extended Registry (web-client migration off lucide) ─────
622
+ cpu: (
623
+ <>
624
+ {/* Processor die with pins */}
625
+ <rect x="6" y="6" width="12" height="12" rx="1.5" vectorEffect={VE} />
626
+ <rect x="9.5" y="9.5" width="5" height="5" rx="0.5" vectorEffect={VE} />
627
+ <path d="M9 2V5M15 2V5M9 19V22M15 19V22M2 9H5M2 15H5M19 9H22M19 15H22" strokeWidth="1.2" vectorEffect={VE} />
628
+ </>
629
+ ),
630
+
631
+ save: (
632
+ <>
633
+ {/* Floppy disk — persist */}
634
+ <path d="M5 3H16L21 8V19C21 20.1 20.1 21 19 21H5C3.9 21 3 20.1 3 19V5C3 3.9 3.9 3 5 3Z" vectorEffect={VE} />
635
+ <path d="M8 3V8H16" vectorEffect={VE} />
636
+ <rect x="7" y="13" width="10" height="8" rx="0.5" vectorEffect={VE} />
637
+ </>
638
+ ),
639
+
640
+ sliders: (
641
+ <>
642
+ {/* Filter sliders with knobs */}
643
+ <path d="M4 7H20M4 12H20M4 17H20" strokeWidth="1.5" vectorEffect={VE} />
644
+ <circle cx="9" cy="7" r="2.2" fill="currentColor" stroke="none" vectorEffect={VE} />
645
+ <circle cx="15" cy="12" r="2.2" fill="currentColor" stroke="none" vectorEffect={VE} />
646
+ <circle cx="8" cy="17" r="2.2" fill="currentColor" stroke="none" vectorEffect={VE} />
647
+ </>
648
+ ),
649
+
650
+ compass: (
651
+ <>
652
+ {/* Orientation compass with needle */}
653
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
654
+ <path d="M15.5 8.5L13.2 13.2L8.5 15.5L10.8 10.8L15.5 8.5Z" vectorEffect={VE} />
655
+ <circle cx="12" cy="12" r="0.6" fill="currentColor" stroke="none" vectorEffect={VE} />
656
+ </>
657
+ ),
658
+
659
+ palette: (
660
+ <>
661
+ {/* Artist palette — theming */}
662
+ <path
663
+ d="M12 3C6.5 3 3 7 3 12C3 16 6 19 10 19C11.1 19 12 18.1 12 17C12 16.5 11.8 16 11.5 15.6C11.2 15.2 11 14.7 11 14.2C11 13 12 12 13.2 12H16C18.2 12 20 10.2 20 8C20 5 16.5 3 12 3Z"
664
+ vectorEffect={VE}
665
+ />
666
+ <circle cx="7.5" cy="11.5" r="1.1" fill="currentColor" stroke="none" vectorEffect={VE} />
667
+ <circle cx="8" cy="7.5" r="1.1" fill="currentColor" stroke="none" vectorEffect={VE} />
668
+ <circle cx="12" cy="6.5" r="1.1" fill="currentColor" stroke="none" vectorEffect={VE} />
669
+ <circle cx="16" cy="8" r="1.1" fill="currentColor" stroke="none" vectorEffect={VE} />
670
+ </>
671
+ ),
672
+
673
+ laptop: (
674
+ <>
675
+ {/* System device — laptop */}
676
+ <rect x="4" y="5" width="16" height="11" rx="1.5" vectorEffect={VE} />
677
+ <path d="M2 20H22" strokeWidth="1.5" vectorEffect={VE} />
678
+ <path d="M10 20H14" strokeWidth="1" opacity="0.4" vectorEffect={VE} />
679
+ </>
680
+ ),
681
+
682
+ grip: (
683
+ <>
684
+ {/* Drag handle — two dot columns */}
685
+ <circle cx="9" cy="6" r="1.3" fill="currentColor" stroke="none" vectorEffect={VE} />
686
+ <circle cx="9" cy="12" r="1.3" fill="currentColor" stroke="none" vectorEffect={VE} />
687
+ <circle cx="9" cy="18" r="1.3" fill="currentColor" stroke="none" vectorEffect={VE} />
688
+ <circle cx="15" cy="6" r="1.3" fill="currentColor" stroke="none" vectorEffect={VE} />
689
+ <circle cx="15" cy="12" r="1.3" fill="currentColor" stroke="none" vectorEffect={VE} />
690
+ <circle cx="15" cy="18" r="1.3" fill="currentColor" stroke="none" vectorEffect={VE} />
691
+ </>
692
+ ),
693
+
694
+ terminal: (
695
+ <>
696
+ {/* Command terminal with prompt */}
697
+ <rect x="3" y="4" width="18" height="16" rx="2" vectorEffect={VE} />
698
+ <path d="M7 9L10 12L7 15" vectorEffect={VE} />
699
+ <path d="M12 15H16" strokeWidth="1.2" vectorEffect={VE} />
700
+ </>
701
+ ),
702
+
703
+ user: (
704
+ <>
705
+ {/* Generic person — head & shoulders */}
706
+ <circle cx="12" cy="8" r="4" vectorEffect={VE} />
707
+ <path d="M4 20C4 16.7 7.6 14 12 14C16.4 14 20 16.7 20 20" vectorEffect={VE} />
708
+ </>
709
+ ),
710
+
711
+ alertCircle: (
712
+ <>
713
+ {/* Circular alert */}
714
+ <circle cx="12" cy="12" r="9" vectorEffect={VE} />
715
+ <path d="M12 7V13" strokeWidth="1.6" vectorEffect={VE} />
716
+ <circle cx="12" cy="16.5" r="0.6" fill="currentColor" stroke="none" vectorEffect={VE} />
717
+ </>
718
+ ),
719
+ studio: (
720
+ <>
721
+ {/* Studio — a clapper board over a composed frame: a workflow that produces a piece */}
722
+ <path d="M3 9.5H21V19A1.5 1.5 0 0 1 19.5 20.5H4.5A1.5 1.5 0 0 1 3 19V9.5Z" vectorEffect={VE} />
723
+ <path d="M3 9.5L4.4 5.2A1.5 1.5 0 0 1 6 4.1L18.6 3.6A1.5 1.5 0 0 1 20.2 4.7L21 9.5" vectorEffect={VE} />
724
+ <path d="M8.6 3.9L7.2 9.5M13.9 3.7L12.5 9.5" strokeWidth="1" opacity="0.45" vectorEffect={VE} />
725
+ <path d="M10.4 13.2L14.6 15.4L10.4 17.6Z" strokeWidth="1.1" vectorEffect={VE} />
726
+ </>
727
+ ),
728
+ } satisfies Record<string, React.ReactNode>;
729
+
730
+ /**
731
+ * Every icon the system knows, derived from the registry rather than declared beside it.
732
+ *
733
+ * It used to be an 84-line hand-maintained union in `icon.tsx`, which also created an import cycle
734
+ * (the component needed the data, the data needed the type). Deriving it means a name that is not
735
+ * in the registry cannot be written, and the two can never drift.
736
+ */
737
+ export type IconName = keyof typeof ICON_REGISTRY;