@nationaldesignstudio/react 0.2.0 → 0.5.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.
Files changed (97) hide show
  1. package/dist/component-registry.md +1310 -127
  2. package/dist/components/atoms/background/background.d.ts +13 -27
  3. package/dist/components/atoms/button/button.d.ts +64 -72
  4. package/dist/components/atoms/button/button.figma.d.ts +1 -0
  5. package/dist/components/atoms/button/icon-button.d.ts +62 -110
  6. package/dist/components/atoms/input/input-group.d.ts +278 -0
  7. package/dist/components/atoms/input/input.d.ts +121 -0
  8. package/dist/components/atoms/popover/popover.d.ts +195 -0
  9. package/dist/components/atoms/select/select.d.ts +131 -0
  10. package/dist/components/atoms/tooltip/tooltip.d.ts +161 -0
  11. package/dist/components/organisms/card/card.d.ts +3 -3
  12. package/dist/components/sections/hero/hero.d.ts +2 -2
  13. package/dist/components/sections/prose/prose.d.ts +3 -3
  14. package/dist/components/sections/river/river.d.ts +1 -1
  15. package/dist/components/sections/tout/tout.d.ts +4 -4
  16. package/dist/components/shared/floating-arrow.d.ts +34 -0
  17. package/dist/index.d.ts +12 -0
  18. package/dist/index.js +13935 -7622
  19. package/dist/index.js.map +1 -1
  20. package/dist/lib/form-control.d.ts +106 -0
  21. package/dist/tokens.css +4725 -19065
  22. package/package.json +2 -1
  23. package/src/components/atoms/accordion/accordion.stories.tsx +1 -1
  24. package/src/components/atoms/accordion/accordion.tsx +2 -2
  25. package/src/components/atoms/background/background.tsx +71 -109
  26. package/src/components/atoms/button/button.figma.tsx +37 -0
  27. package/src/components/atoms/button/button.stories.tsx +253 -115
  28. package/src/components/atoms/button/button.test.tsx +289 -5
  29. package/src/components/atoms/button/button.tsx +40 -101
  30. package/src/components/atoms/button/button.visual.test.tsx +28 -32
  31. package/src/components/atoms/button/icon-button.stories.tsx +44 -101
  32. package/src/components/atoms/button/icon-button.test.tsx +26 -94
  33. package/src/components/atoms/button/icon-button.tsx +81 -224
  34. package/src/components/atoms/input/index.ts +17 -0
  35. package/src/components/atoms/input/input-group.stories.tsx +646 -0
  36. package/src/components/atoms/input/input-group.test.tsx +362 -0
  37. package/src/components/atoms/input/input-group.tsx +409 -0
  38. package/src/components/atoms/input/input.stories.tsx +228 -0
  39. package/src/components/atoms/input/input.test.tsx +167 -0
  40. package/src/components/atoms/input/input.tsx +104 -0
  41. package/src/components/atoms/pager-control/pager-control.stories.tsx +6 -8
  42. package/src/components/atoms/pager-control/pager-control.tsx +12 -12
  43. package/src/components/atoms/popover/index.ts +30 -0
  44. package/src/components/atoms/popover/popover.stories.tsx +531 -0
  45. package/src/components/atoms/popover/popover.test.tsx +486 -0
  46. package/src/components/atoms/popover/popover.tsx +488 -0
  47. package/src/components/atoms/select/index.ts +18 -0
  48. package/src/components/atoms/select/select.stories.tsx +455 -0
  49. package/src/components/atoms/select/select.tsx +324 -0
  50. package/src/components/atoms/tooltip/index.ts +24 -0
  51. package/src/components/atoms/tooltip/tooltip.stories.tsx +348 -0
  52. package/src/components/atoms/tooltip/tooltip.test.tsx +363 -0
  53. package/src/components/atoms/tooltip/tooltip.tsx +347 -0
  54. package/src/components/dev-tools/dev-toolbar/dev-toolbar.stories.tsx +8 -17
  55. package/src/components/dev-tools/dev-toolbar/dev-toolbar.tsx +3 -3
  56. package/src/components/foundation/typography/typography.stories.tsx +401 -0
  57. package/src/components/organisms/card/card.stories.tsx +19 -19
  58. package/src/components/organisms/card/card.test.tsx +1 -1
  59. package/src/components/organisms/card/card.tsx +3 -3
  60. package/src/components/organisms/card/card.visual.test.tsx +11 -11
  61. package/src/components/organisms/navbar/navbar.tsx +2 -2
  62. package/src/components/organisms/navbar/navbar.visual.test.tsx +2 -2
  63. package/src/components/organisms/us-gov-banner/us-gov-banner.tsx +2 -2
  64. package/src/components/sections/banner/banner.stories.tsx +1 -5
  65. package/src/components/sections/banner/banner.test.tsx +2 -2
  66. package/src/components/sections/banner/banner.tsx +6 -6
  67. package/src/components/sections/card-grid/card-grid.tsx +5 -5
  68. package/src/components/sections/faq-section/faq-section.tsx +2 -2
  69. package/src/components/sections/hero/hero.stories.tsx +7 -7
  70. package/src/components/sections/hero/hero.test.tsx +5 -5
  71. package/src/components/sections/hero/hero.tsx +10 -11
  72. package/src/components/sections/prose/prose.test.tsx +2 -2
  73. package/src/components/sections/prose/prose.tsx +6 -7
  74. package/src/components/sections/river/river.stories.tsx +8 -8
  75. package/src/components/sections/river/river.test.tsx +4 -4
  76. package/src/components/sections/river/river.tsx +8 -16
  77. package/src/components/sections/tout/tout.stories.tsx +7 -31
  78. package/src/components/sections/tout/tout.test.tsx +1 -1
  79. package/src/components/sections/tout/tout.tsx +11 -11
  80. package/src/components/sections/two-column-section/two-column-section.tsx +7 -9
  81. package/src/components/shared/floating-arrow.tsx +78 -0
  82. package/src/components/shared/index.ts +5 -0
  83. package/src/index.ts +98 -0
  84. package/src/lib/form-control.ts +71 -0
  85. package/src/stories/grid-system.stories.tsx +309 -0
  86. package/src/stories/{Introduction.mdx → introduction.mdx} +29 -15
  87. package/src/stories/{ThemeProvider.stories.tsx → theme-provider.stories.tsx} +8 -22
  88. package/src/stories/{TokenShowcase.stories.tsx → token-showcase.stories.tsx} +1 -20
  89. package/src/stories/token-showcase.tsx +777 -0
  90. package/src/styles.css +3 -0
  91. package/src/tests/token-resolution.test.tsx +298 -0
  92. package/src/theme/hooks.ts +1 -1
  93. package/src/theme/index.ts +1 -1
  94. package/src/theme/theme-provider.test.tsx +270 -0
  95. package/src/theme/{ThemeProvider.tsx → theme-provider.tsx} +18 -2
  96. package/src/stories/GridSystem.stories.tsx +0 -84
  97. package/src/stories/TokenShowcase.tsx +0 -1429
@@ -0,0 +1,777 @@
1
+ import type * as React from "react";
2
+
3
+ // =============================================================================
4
+ // Color Tokens
5
+ // =============================================================================
6
+
7
+ type ColorScale = {
8
+ name: string;
9
+ prefix: string;
10
+ shades: (string | number)[];
11
+ vibrant?: (string | number)[];
12
+ };
13
+
14
+ const neutralScales: ColorScale[] = [
15
+ {
16
+ name: "Gray",
17
+ prefix: "gray",
18
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200],
19
+ },
20
+ {
21
+ name: "Brown",
22
+ prefix: "brown",
23
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200],
24
+ },
25
+ {
26
+ name: "Steel",
27
+ prefix: "steel",
28
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100, 1200],
29
+ },
30
+ ];
31
+
32
+ const colorScales: ColorScale[] = [
33
+ {
34
+ name: "Red",
35
+ prefix: "red",
36
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
37
+ vibrant: ["v100", "v200", "v300", "v400"],
38
+ },
39
+ {
40
+ name: "Pink",
41
+ prefix: "pink",
42
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
43
+ vibrant: ["v100", "v200", "v300", "v400"],
44
+ },
45
+ {
46
+ name: "Purple",
47
+ prefix: "purple",
48
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
49
+ vibrant: ["v100", "v200", "v300", "v400"],
50
+ },
51
+ {
52
+ name: "Iris",
53
+ prefix: "iris",
54
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
55
+ vibrant: ["v100", "v200", "v300", "v400"],
56
+ },
57
+ {
58
+ name: "Indigo",
59
+ prefix: "indigo",
60
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
61
+ vibrant: ["v100", "v200", "v300", "v400"],
62
+ },
63
+ {
64
+ name: "Blue",
65
+ prefix: "blue",
66
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
67
+ vibrant: ["v100", "v200", "v300", "v400"],
68
+ },
69
+ {
70
+ name: "Ice",
71
+ prefix: "ice",
72
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
73
+ vibrant: ["v100", "v200", "v300", "v400"],
74
+ },
75
+ {
76
+ name: "Cyan",
77
+ prefix: "cyan",
78
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
79
+ vibrant: ["v100", "v200", "v300", "v400"],
80
+ },
81
+ {
82
+ name: "Teal",
83
+ prefix: "teal",
84
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
85
+ vibrant: ["v100", "v200", "v300", "v400"],
86
+ },
87
+ {
88
+ name: "Green",
89
+ prefix: "green",
90
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
91
+ vibrant: ["v100", "v200", "v300", "v400"],
92
+ },
93
+ {
94
+ name: "Sage",
95
+ prefix: "sage",
96
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
97
+ vibrant: ["v100", "v200", "v300", "v400"],
98
+ },
99
+ {
100
+ name: "Lime",
101
+ prefix: "lime",
102
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
103
+ vibrant: ["v100", "v200", "v300", "v400"],
104
+ },
105
+ {
106
+ name: "Yellow",
107
+ prefix: "yellow",
108
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
109
+ vibrant: ["v100", "v200", "v300", "v400"],
110
+ },
111
+ {
112
+ name: "Amber",
113
+ prefix: "amber",
114
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
115
+ vibrant: ["v100", "v200", "v300", "v400"],
116
+ },
117
+ {
118
+ name: "Orange",
119
+ prefix: "orange",
120
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
121
+ vibrant: ["v100", "v200", "v300", "v400"],
122
+ },
123
+ {
124
+ name: "Ember",
125
+ prefix: "ember",
126
+ shades: [50, 100, 200, 300, 400, 500, 600, 700, 800, 900],
127
+ vibrant: ["v100", "v200", "v300", "v400"],
128
+ },
129
+ ];
130
+
131
+ // Tailwind needs static class names - generate lookup maps
132
+ const bgClasses: Record<string, string> = {
133
+ // Neutrals
134
+ "gray-50": "bg-gray-50",
135
+ "gray-100": "bg-gray-100",
136
+ "gray-200": "bg-gray-200",
137
+ "gray-300": "bg-gray-300",
138
+ "gray-400": "bg-gray-400",
139
+ "gray-500": "bg-gray-500",
140
+ "gray-600": "bg-gray-600",
141
+ "gray-700": "bg-gray-700",
142
+ "gray-800": "bg-gray-800",
143
+ "gray-900": "bg-gray-900",
144
+ "gray-1000": "bg-gray-1000",
145
+ "gray-1100": "bg-gray-1100",
146
+ "gray-1200": "bg-gray-1200",
147
+ "brown-50": "bg-brown-50",
148
+ "brown-100": "bg-brown-100",
149
+ "brown-200": "bg-brown-200",
150
+ "brown-300": "bg-brown-300",
151
+ "brown-400": "bg-brown-400",
152
+ "brown-500": "bg-brown-500",
153
+ "brown-600": "bg-brown-600",
154
+ "brown-700": "bg-brown-700",
155
+ "brown-800": "bg-brown-800",
156
+ "brown-900": "bg-brown-900",
157
+ "brown-1000": "bg-brown-1000",
158
+ "brown-1100": "bg-brown-1100",
159
+ "brown-1200": "bg-brown-1200",
160
+ "steel-50": "bg-steel-50",
161
+ "steel-100": "bg-steel-100",
162
+ "steel-200": "bg-steel-200",
163
+ "steel-300": "bg-steel-300",
164
+ "steel-400": "bg-steel-400",
165
+ "steel-500": "bg-steel-500",
166
+ "steel-600": "bg-steel-600",
167
+ "steel-700": "bg-steel-700",
168
+ "steel-800": "bg-steel-800",
169
+ "steel-900": "bg-steel-900",
170
+ "steel-1000": "bg-steel-1000",
171
+ "steel-1100": "bg-steel-1100",
172
+ "steel-1200": "bg-steel-1200",
173
+ // Colors
174
+ "red-50": "bg-red-50",
175
+ "red-100": "bg-red-100",
176
+ "red-200": "bg-red-200",
177
+ "red-300": "bg-red-300",
178
+ "red-400": "bg-red-400",
179
+ "red-500": "bg-red-500",
180
+ "red-600": "bg-red-600",
181
+ "red-700": "bg-red-700",
182
+ "red-800": "bg-red-800",
183
+ "red-900": "bg-red-900",
184
+ "red-v100": "bg-red-v100",
185
+ "red-v200": "bg-red-v200",
186
+ "red-v300": "bg-red-v300",
187
+ "red-v400": "bg-red-v400",
188
+ "pink-50": "bg-pink-50",
189
+ "pink-100": "bg-pink-100",
190
+ "pink-200": "bg-pink-200",
191
+ "pink-300": "bg-pink-300",
192
+ "pink-400": "bg-pink-400",
193
+ "pink-500": "bg-pink-500",
194
+ "pink-600": "bg-pink-600",
195
+ "pink-700": "bg-pink-700",
196
+ "pink-800": "bg-pink-800",
197
+ "pink-900": "bg-pink-900",
198
+ "pink-v100": "bg-pink-v100",
199
+ "pink-v200": "bg-pink-v200",
200
+ "pink-v300": "bg-pink-v300",
201
+ "pink-v400": "bg-pink-v400",
202
+ "purple-50": "bg-purple-50",
203
+ "purple-100": "bg-purple-100",
204
+ "purple-200": "bg-purple-200",
205
+ "purple-300": "bg-purple-300",
206
+ "purple-400": "bg-purple-400",
207
+ "purple-500": "bg-purple-500",
208
+ "purple-600": "bg-purple-600",
209
+ "purple-700": "bg-purple-700",
210
+ "purple-800": "bg-purple-800",
211
+ "purple-900": "bg-purple-900",
212
+ "purple-v100": "bg-purple-v100",
213
+ "purple-v200": "bg-purple-v200",
214
+ "purple-v300": "bg-purple-v300",
215
+ "purple-v400": "bg-purple-v400",
216
+ "iris-50": "bg-iris-50",
217
+ "iris-100": "bg-iris-100",
218
+ "iris-200": "bg-iris-200",
219
+ "iris-300": "bg-iris-300",
220
+ "iris-400": "bg-iris-400",
221
+ "iris-500": "bg-iris-500",
222
+ "iris-600": "bg-iris-600",
223
+ "iris-700": "bg-iris-700",
224
+ "iris-800": "bg-iris-800",
225
+ "iris-900": "bg-iris-900",
226
+ "iris-v100": "bg-iris-v100",
227
+ "iris-v200": "bg-iris-v200",
228
+ "iris-v300": "bg-iris-v300",
229
+ "iris-v400": "bg-iris-v400",
230
+ "indigo-50": "bg-indigo-50",
231
+ "indigo-100": "bg-indigo-100",
232
+ "indigo-200": "bg-indigo-200",
233
+ "indigo-300": "bg-indigo-300",
234
+ "indigo-400": "bg-indigo-400",
235
+ "indigo-500": "bg-indigo-500",
236
+ "indigo-600": "bg-indigo-600",
237
+ "indigo-700": "bg-indigo-700",
238
+ "indigo-800": "bg-indigo-800",
239
+ "indigo-900": "bg-indigo-900",
240
+ "indigo-v100": "bg-indigo-v100",
241
+ "indigo-v200": "bg-indigo-v200",
242
+ "indigo-v300": "bg-indigo-v300",
243
+ "indigo-v400": "bg-indigo-v400",
244
+ "blue-50": "bg-blue-50",
245
+ "blue-100": "bg-blue-100",
246
+ "blue-200": "bg-blue-200",
247
+ "blue-300": "bg-blue-300",
248
+ "blue-400": "bg-blue-400",
249
+ "blue-500": "bg-blue-500",
250
+ "blue-600": "bg-blue-600",
251
+ "blue-700": "bg-blue-700",
252
+ "blue-800": "bg-blue-800",
253
+ "blue-900": "bg-blue-900",
254
+ "blue-v100": "bg-blue-v100",
255
+ "blue-v200": "bg-blue-v200",
256
+ "blue-v300": "bg-blue-v300",
257
+ "blue-v400": "bg-blue-v400",
258
+ "ice-50": "bg-ice-50",
259
+ "ice-100": "bg-ice-100",
260
+ "ice-200": "bg-ice-200",
261
+ "ice-300": "bg-ice-300",
262
+ "ice-400": "bg-ice-400",
263
+ "ice-500": "bg-ice-500",
264
+ "ice-600": "bg-ice-600",
265
+ "ice-700": "bg-ice-700",
266
+ "ice-800": "bg-ice-800",
267
+ "ice-900": "bg-ice-900",
268
+ "ice-v100": "bg-ice-v100",
269
+ "ice-v200": "bg-ice-v200",
270
+ "ice-v300": "bg-ice-v300",
271
+ "ice-v400": "bg-ice-v400",
272
+ "cyan-50": "bg-cyan-50",
273
+ "cyan-100": "bg-cyan-100",
274
+ "cyan-200": "bg-cyan-200",
275
+ "cyan-300": "bg-cyan-300",
276
+ "cyan-400": "bg-cyan-400",
277
+ "cyan-500": "bg-cyan-500",
278
+ "cyan-600": "bg-cyan-600",
279
+ "cyan-700": "bg-cyan-700",
280
+ "cyan-800": "bg-cyan-800",
281
+ "cyan-900": "bg-cyan-900",
282
+ "cyan-v100": "bg-cyan-v100",
283
+ "cyan-v200": "bg-cyan-v200",
284
+ "cyan-v300": "bg-cyan-v300",
285
+ "cyan-v400": "bg-cyan-v400",
286
+ "teal-50": "bg-teal-50",
287
+ "teal-100": "bg-teal-100",
288
+ "teal-200": "bg-teal-200",
289
+ "teal-300": "bg-teal-300",
290
+ "teal-400": "bg-teal-400",
291
+ "teal-500": "bg-teal-500",
292
+ "teal-600": "bg-teal-600",
293
+ "teal-700": "bg-teal-700",
294
+ "teal-800": "bg-teal-800",
295
+ "teal-900": "bg-teal-900",
296
+ "teal-v100": "bg-teal-v100",
297
+ "teal-v200": "bg-teal-v200",
298
+ "teal-v300": "bg-teal-v300",
299
+ "teal-v400": "bg-teal-v400",
300
+ "green-50": "bg-green-50",
301
+ "green-100": "bg-green-100",
302
+ "green-200": "bg-green-200",
303
+ "green-300": "bg-green-300",
304
+ "green-400": "bg-green-400",
305
+ "green-500": "bg-green-500",
306
+ "green-600": "bg-green-600",
307
+ "green-700": "bg-green-700",
308
+ "green-800": "bg-green-800",
309
+ "green-900": "bg-green-900",
310
+ "green-v100": "bg-green-v100",
311
+ "green-v200": "bg-green-v200",
312
+ "green-v300": "bg-green-v300",
313
+ "green-v400": "bg-green-v400",
314
+ "sage-50": "bg-sage-50",
315
+ "sage-100": "bg-sage-100",
316
+ "sage-200": "bg-sage-200",
317
+ "sage-300": "bg-sage-300",
318
+ "sage-400": "bg-sage-400",
319
+ "sage-500": "bg-sage-500",
320
+ "sage-600": "bg-sage-600",
321
+ "sage-700": "bg-sage-700",
322
+ "sage-800": "bg-sage-800",
323
+ "sage-900": "bg-sage-900",
324
+ "sage-v100": "bg-sage-v100",
325
+ "sage-v200": "bg-sage-v200",
326
+ "sage-v300": "bg-sage-v300",
327
+ "sage-v400": "bg-sage-v400",
328
+ "lime-50": "bg-lime-50",
329
+ "lime-100": "bg-lime-100",
330
+ "lime-200": "bg-lime-200",
331
+ "lime-300": "bg-lime-300",
332
+ "lime-400": "bg-lime-400",
333
+ "lime-500": "bg-lime-500",
334
+ "lime-600": "bg-lime-600",
335
+ "lime-700": "bg-lime-700",
336
+ "lime-800": "bg-lime-800",
337
+ "lime-900": "bg-lime-900",
338
+ "lime-v100": "bg-lime-v100",
339
+ "lime-v200": "bg-lime-v200",
340
+ "lime-v300": "bg-lime-v300",
341
+ "lime-v400": "bg-lime-v400",
342
+ "yellow-50": "bg-yellow-50",
343
+ "yellow-100": "bg-yellow-100",
344
+ "yellow-200": "bg-yellow-200",
345
+ "yellow-300": "bg-yellow-300",
346
+ "yellow-400": "bg-yellow-400",
347
+ "yellow-500": "bg-yellow-500",
348
+ "yellow-600": "bg-yellow-600",
349
+ "yellow-700": "bg-yellow-700",
350
+ "yellow-800": "bg-yellow-800",
351
+ "yellow-900": "bg-yellow-900",
352
+ "yellow-v100": "bg-yellow-v100",
353
+ "yellow-v200": "bg-yellow-v200",
354
+ "yellow-v300": "bg-yellow-v300",
355
+ "yellow-v400": "bg-yellow-v400",
356
+ "amber-50": "bg-amber-50",
357
+ "amber-100": "bg-amber-100",
358
+ "amber-200": "bg-amber-200",
359
+ "amber-300": "bg-amber-300",
360
+ "amber-400": "bg-amber-400",
361
+ "amber-500": "bg-amber-500",
362
+ "amber-600": "bg-amber-600",
363
+ "amber-700": "bg-amber-700",
364
+ "amber-800": "bg-amber-800",
365
+ "amber-900": "bg-amber-900",
366
+ "amber-v100": "bg-amber-v100",
367
+ "amber-v200": "bg-amber-v200",
368
+ "amber-v300": "bg-amber-v300",
369
+ "amber-v400": "bg-amber-v400",
370
+ "orange-50": "bg-orange-50",
371
+ "orange-100": "bg-orange-100",
372
+ "orange-200": "bg-orange-200",
373
+ "orange-300": "bg-orange-300",
374
+ "orange-400": "bg-orange-400",
375
+ "orange-500": "bg-orange-500",
376
+ "orange-600": "bg-orange-600",
377
+ "orange-700": "bg-orange-700",
378
+ "orange-800": "bg-orange-800",
379
+ "orange-900": "bg-orange-900",
380
+ "orange-v100": "bg-orange-v100",
381
+ "orange-v200": "bg-orange-v200",
382
+ "orange-v300": "bg-orange-v300",
383
+ "orange-v400": "bg-orange-v400",
384
+ "ember-50": "bg-ember-50",
385
+ "ember-100": "bg-ember-100",
386
+ "ember-200": "bg-ember-200",
387
+ "ember-300": "bg-ember-300",
388
+ "ember-400": "bg-ember-400",
389
+ "ember-500": "bg-ember-500",
390
+ "ember-600": "bg-ember-600",
391
+ "ember-700": "bg-ember-700",
392
+ "ember-800": "bg-ember-800",
393
+ "ember-900": "bg-ember-900",
394
+ "ember-v100": "bg-ember-v100",
395
+ "ember-v200": "bg-ember-v200",
396
+ "ember-v300": "bg-ember-v300",
397
+ "ember-v400": "bg-ember-v400",
398
+ // Alpha
399
+ "alpha-black-5": "bg-alpha-black-5",
400
+ "alpha-black-10": "bg-alpha-black-10",
401
+ "alpha-black-20": "bg-alpha-black-20",
402
+ "alpha-black-30": "bg-alpha-black-30",
403
+ "alpha-black-40": "bg-alpha-black-40",
404
+ "alpha-black-50": "bg-alpha-black-50",
405
+ "alpha-black-60": "bg-alpha-black-60",
406
+ "alpha-black-70": "bg-alpha-black-70",
407
+ "alpha-black-80": "bg-alpha-black-80",
408
+ "alpha-black-90": "bg-alpha-black-90",
409
+ "alpha-black-95": "bg-alpha-black-95",
410
+ "alpha-white-5": "bg-alpha-white-5",
411
+ "alpha-white-10": "bg-alpha-white-10",
412
+ "alpha-white-20": "bg-alpha-white-20",
413
+ "alpha-white-30": "bg-alpha-white-30",
414
+ "alpha-white-40": "bg-alpha-white-40",
415
+ "alpha-white-50": "bg-alpha-white-50",
416
+ "alpha-white-60": "bg-alpha-white-60",
417
+ "alpha-white-70": "bg-alpha-white-70",
418
+ "alpha-white-80": "bg-alpha-white-80",
419
+ "alpha-white-90": "bg-alpha-white-90",
420
+ "alpha-white-95": "bg-alpha-white-95",
421
+ };
422
+
423
+ const ColorScaleRow: React.FC<{ scale: ColorScale; showVibrant?: boolean }> = ({
424
+ scale,
425
+ showVibrant = true,
426
+ }) => {
427
+ const allShades =
428
+ showVibrant && scale.vibrant
429
+ ? [...scale.shades, ...scale.vibrant]
430
+ : scale.shades;
431
+ return (
432
+ <div className="grid grid-cols-[72px_1fr] gap-16 items-center">
433
+ <span className="text-14 font-medium text-gray-700">{scale.name}</span>
434
+ <div className="grid grid-flow-col auto-cols-fr gap-2">
435
+ {allShades.map((shade) => {
436
+ const key = `${scale.prefix}-${shade}`;
437
+ return (
438
+ <div
439
+ key={key}
440
+ className={`h-32 rounded-4 ${bgClasses[key] || ""}`}
441
+ title={`${scale.prefix}-${shade}`}
442
+ />
443
+ );
444
+ })}
445
+ </div>
446
+ </div>
447
+ );
448
+ };
449
+
450
+ export const ColorTokens: React.FC = () => (
451
+ <div className="space-y-48">
452
+ {/* Neutrals */}
453
+ <section>
454
+ <h3 className="text-12 font-semibold text-gray-500 uppercase tracking-wider mb-16">
455
+ Neutrals
456
+ </h3>
457
+ <div className="bg-white rounded-8 border border-gray-200 p-24 space-y-12">
458
+ {neutralScales.map((scale) => (
459
+ <ColorScaleRow key={scale.prefix} scale={scale} showVibrant={false} />
460
+ ))}
461
+ </div>
462
+ </section>
463
+
464
+ {/* Chromatic Colors */}
465
+ <section>
466
+ <h3 className="text-12 font-semibold text-gray-500 uppercase tracking-wider mb-16">
467
+ Colors
468
+ </h3>
469
+ <div className="bg-white rounded-8 border border-gray-200 p-24 space-y-12">
470
+ {colorScales.map((scale) => (
471
+ <ColorScaleRow key={scale.prefix} scale={scale} />
472
+ ))}
473
+ </div>
474
+ </section>
475
+
476
+ {/* Alpha Colors */}
477
+ <section>
478
+ <h3 className="text-12 font-semibold text-gray-500 uppercase tracking-wider mb-16">
479
+ Alpha
480
+ </h3>
481
+ <div className="grid grid-cols-2 gap-24">
482
+ <div className="bg-white rounded-8 border border-gray-200 p-24">
483
+ <div className="text-12 font-medium text-gray-600 mb-16">
484
+ Black (on light)
485
+ </div>
486
+ <div className="grid grid-flow-col auto-cols-fr gap-2 bg-gray-100 p-16 rounded-8">
487
+ {[5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95].map((alpha) => (
488
+ <div
489
+ key={`alpha-black-${alpha}`}
490
+ className={`h-32 rounded-4 ${bgClasses[`alpha-black-${alpha}`] || ""}`}
491
+ title={`alpha-black-${alpha}`}
492
+ />
493
+ ))}
494
+ </div>
495
+ </div>
496
+ <div className="bg-white rounded-8 border border-gray-200 p-24">
497
+ <div className="text-12 font-medium text-gray-600 mb-16">
498
+ White (on dark)
499
+ </div>
500
+ <div className="grid grid-flow-col auto-cols-fr gap-2 bg-gray-900 p-16 rounded-8">
501
+ {[5, 10, 20, 30, 40, 50, 60, 70, 80, 90, 95].map((alpha) => (
502
+ <div
503
+ key={`alpha-white-${alpha}`}
504
+ className={`h-32 rounded-4 ${bgClasses[`alpha-white-${alpha}`] || ""}`}
505
+ title={`alpha-white-${alpha}`}
506
+ />
507
+ ))}
508
+ </div>
509
+ </div>
510
+ </div>
511
+ </section>
512
+ </div>
513
+ );
514
+
515
+ // =============================================================================
516
+ // Spacing Tokens
517
+ // =============================================================================
518
+
519
+ const spacingScale = [
520
+ 2, 4, 6, 8, 10, 12, 16, 20, 24, 28, 32, 36, 40, 48, 56, 64, 72, 80, 96, 112,
521
+ 128, 144, 160, 176, 192, 208, 224, 240, 256, 288, 320, 352, 384, 400,
522
+ ];
523
+
524
+ const widthClasses: Record<number, string> = {
525
+ 2: "w-2",
526
+ 4: "w-4",
527
+ 6: "w-6",
528
+ 8: "w-8",
529
+ 10: "w-10",
530
+ 12: "w-12",
531
+ 16: "w-16",
532
+ 20: "w-20",
533
+ 24: "w-24",
534
+ 28: "w-28",
535
+ 32: "w-32",
536
+ 36: "w-36",
537
+ 40: "w-40",
538
+ 48: "w-48",
539
+ 56: "w-56",
540
+ 64: "w-64",
541
+ 72: "w-72",
542
+ 80: "w-80",
543
+ 96: "w-96",
544
+ 112: "w-112",
545
+ 128: "w-128",
546
+ 144: "w-144",
547
+ 160: "w-160",
548
+ 176: "w-176",
549
+ 192: "w-192",
550
+ 208: "w-208",
551
+ 224: "w-224",
552
+ 240: "w-240",
553
+ 256: "w-256",
554
+ 288: "w-288",
555
+ 320: "w-320",
556
+ 352: "w-352",
557
+ 384: "w-384",
558
+ 400: "w-400",
559
+ };
560
+
561
+ export const SpacingTokens: React.FC = () => (
562
+ <div className="bg-white rounded-8 border border-gray-200 overflow-hidden">
563
+ <div className="grid grid-cols-[64px_1fr_100px] gap-16 px-24 py-12 bg-gray-50 border-b border-gray-200 text-12 font-medium text-gray-500 uppercase">
564
+ <div>Value</div>
565
+ <div>Preview</div>
566
+ <div>Token</div>
567
+ </div>
568
+ <div className="divide-y divide-gray-100">
569
+ {spacingScale.map((size) => (
570
+ <div
571
+ key={size}
572
+ className="grid grid-cols-[64px_1fr_100px] gap-16 px-24 py-8 items-center"
573
+ >
574
+ <div className="text-14 font-mono text-gray-600">{size}px</div>
575
+ <div className="flex items-center">
576
+ <div
577
+ className={`h-12 bg-indigo-500 rounded-2 ${widthClasses[size]} max-w-full`}
578
+ />
579
+ </div>
580
+ <div className="text-12 font-mono text-gray-400">spacing-{size}</div>
581
+ </div>
582
+ ))}
583
+ </div>
584
+ </div>
585
+ );
586
+
587
+ // =============================================================================
588
+ // Typography Tokens
589
+ // =============================================================================
590
+
591
+ type TypographyToken = {
592
+ name: string;
593
+ class: string;
594
+ sizes: string;
595
+ };
596
+
597
+ const headingTokens: TypographyToken[] = [
598
+ {
599
+ name: "Display",
600
+ class: "typography-h1-display",
601
+ sizes: "64px → 96px → 128px",
602
+ },
603
+ { name: "H1", class: "typography-h1", sizes: "48px → 72px → 96px" },
604
+ { name: "H2", class: "typography-h2", sizes: "48px → 64px → 72px" },
605
+ { name: "H3", class: "typography-h3", sizes: "32px → 48px → 64px" },
606
+ { name: "H4", class: "typography-h4", sizes: "24px → 32px → 48px" },
607
+ { name: "H5", class: "typography-h5", sizes: "21px → 24px → 32px" },
608
+ ];
609
+
610
+ const bodyTokens: TypographyToken[] = [
611
+ {
612
+ name: "Body Large",
613
+ class: "typography-body-large",
614
+ sizes: "16px → 18px → 21px",
615
+ },
616
+ {
617
+ name: "Body Medium",
618
+ class: "typography-body-medium",
619
+ sizes: "14px → 16px → 18px",
620
+ },
621
+ {
622
+ name: "Body Small",
623
+ class: "typography-body-small",
624
+ sizes: "12px → 14px → 14px",
625
+ },
626
+ ];
627
+
628
+ const uiTokens: TypographyToken[] = [
629
+ { name: "Overline", class: "typography-overline", sizes: "14px" },
630
+ { name: "Caption", class: "typography-caption", sizes: "11px" },
631
+ { name: "Button Large", class: "typography-ui-button-large", sizes: "18px" },
632
+ {
633
+ name: "Button Medium",
634
+ class: "typography-ui-button-medium",
635
+ sizes: "16px",
636
+ },
637
+ { name: "Button Small", class: "typography-ui-button-small", sizes: "14px" },
638
+ { name: "Label", class: "typography-ui-label", sizes: "14px" },
639
+ ];
640
+
641
+ const TypographyRow: React.FC<{ token: TypographyToken; sample?: string }> = ({
642
+ token,
643
+ sample,
644
+ }) => {
645
+ const isHeading = token.class.includes("h1") || token.class.includes("h2");
646
+ const text = sample || (isHeading ? "Aa" : "The quick brown fox");
647
+
648
+ return (
649
+ <div className="py-12 border-b border-gray-100 last:border-0">
650
+ <div className="flex items-baseline justify-between gap-16 mb-4">
651
+ <code className="text-12 font-mono text-indigo-600 bg-indigo-50 px-8 py-2 rounded-4">
652
+ {token.class}
653
+ </code>
654
+ <span className="text-12 text-gray-400">{token.sizes}</span>
655
+ </div>
656
+ <p className={token.class}>{text}</p>
657
+ </div>
658
+ );
659
+ };
660
+
661
+ export const TypographyTokens: React.FC = () => (
662
+ <div className="space-y-32">
663
+ <section>
664
+ <h3 className="text-12 font-semibold text-gray-500 uppercase tracking-wider mb-16">
665
+ Headings (Responsive)
666
+ </h3>
667
+ <div className="bg-white rounded-8 border border-gray-200 p-24">
668
+ {headingTokens.map((token) => (
669
+ <TypographyRow key={token.class} token={token} />
670
+ ))}
671
+ </div>
672
+ </section>
673
+
674
+ <section>
675
+ <h3 className="text-12 font-semibold text-gray-500 uppercase tracking-wider mb-16">
676
+ Body (Responsive)
677
+ </h3>
678
+ <div className="bg-white rounded-8 border border-gray-200 p-24">
679
+ {bodyTokens.map((token) => (
680
+ <TypographyRow key={token.class} token={token} />
681
+ ))}
682
+ </div>
683
+ </section>
684
+
685
+ <section>
686
+ <h3 className="text-12 font-semibold text-gray-500 uppercase tracking-wider mb-16">
687
+ UI Elements
688
+ </h3>
689
+ <div className="bg-white rounded-8 border border-gray-200 p-24">
690
+ {uiTokens.map((token) => (
691
+ <TypographyRow key={token.class} token={token} />
692
+ ))}
693
+ </div>
694
+ </section>
695
+ </div>
696
+ );
697
+
698
+ // =============================================================================
699
+ // Responsive Typography Demo
700
+ // =============================================================================
701
+
702
+ export const ResponsiveTypography: React.FC = () => (
703
+ <div className="space-y-32">
704
+ <div className="bg-indigo-50 border border-indigo-100 rounded-8 p-16">
705
+ <p className="text-14 text-indigo-700">
706
+ <strong>Responsive Typography</strong> — Resize viewport to see
707
+ typography scale. Mobile (&lt;768px) → Tablet → Desktop (&gt;1440px)
708
+ </p>
709
+ </div>
710
+
711
+ <section className="space-y-16">
712
+ <div className="border-l-4 border-indigo-500 pl-16">
713
+ <code className="text-12 font-mono text-gray-500">
714
+ typography-h1-display
715
+ </code>
716
+ <h1 className="typography-h1-display">Display</h1>
717
+ </div>
718
+ <div className="border-l-4 border-indigo-400 pl-16">
719
+ <code className="text-12 font-mono text-gray-500">typography-h1</code>
720
+ <h1 className="typography-h1">Heading 1</h1>
721
+ </div>
722
+ <div className="border-l-4 border-indigo-300 pl-16">
723
+ <code className="text-12 font-mono text-gray-500">typography-h2</code>
724
+ <h2 className="typography-h2">Heading 2</h2>
725
+ </div>
726
+ <div className="border-l-4 border-indigo-200 pl-16">
727
+ <code className="text-12 font-mono text-gray-500">typography-h3</code>
728
+ <h3 className="typography-h3">Heading 3</h3>
729
+ </div>
730
+ </section>
731
+
732
+ <section className="bg-gray-50 rounded-8 p-16 space-y-12">
733
+ <div>
734
+ <code className="text-12 font-mono text-gray-500">
735
+ typography-body-large
736
+ </code>
737
+ <p className="typography-body-large">
738
+ Large body text scales from 16px to 21px.
739
+ </p>
740
+ </div>
741
+ <div>
742
+ <code className="text-12 font-mono text-gray-500">
743
+ typography-body-medium
744
+ </code>
745
+ <p className="typography-body-medium">
746
+ Medium body text scales from 14px to 18px.
747
+ </p>
748
+ </div>
749
+ <div>
750
+ <code className="text-12 font-mono text-gray-500">
751
+ typography-body-small
752
+ </code>
753
+ <p className="typography-body-small">
754
+ Small body text scales from 12px to 14px.
755
+ </p>
756
+ </div>
757
+ </section>
758
+ </div>
759
+ );
760
+
761
+ // =============================================================================
762
+ // Main Export
763
+ // =============================================================================
764
+
765
+ export const TokenShowcase: React.FC = () => (
766
+ <div className="p-32 bg-gray-50 min-h-screen">
767
+ <div className="max-w-6xl mx-auto">
768
+ <header className="mb-32">
769
+ <h1 className="text-24 font-bold text-gray-900">Design Tokens</h1>
770
+ <p className="text-gray-600">
771
+ Primitive color palette from the design system
772
+ </p>
773
+ </header>
774
+ <ColorTokens />
775
+ </div>
776
+ </div>
777
+ );