@adamarant/designsystem 0.11.2

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 (84) hide show
  1. package/README.md +101 -0
  2. package/dist/designsystem.css +13494 -0
  3. package/dist/designsystem.js +67 -0
  4. package/dist/designsystem.min.css +2 -0
  5. package/package.json +111 -0
  6. package/src/base/index.css +2 -0
  7. package/src/base/reset.css +119 -0
  8. package/src/base/typography.css +172 -0
  9. package/src/components/accordion.css +166 -0
  10. package/src/components/admin-layout.css +371 -0
  11. package/src/components/alert.css +159 -0
  12. package/src/components/avatar.css +109 -0
  13. package/src/components/badge.css +80 -0
  14. package/src/components/bottom-nav.css +125 -0
  15. package/src/components/bottom-sheet.css +146 -0
  16. package/src/components/breadcrumb.css +102 -0
  17. package/src/components/button.css +250 -0
  18. package/src/components/card.css +117 -0
  19. package/src/components/chip.css +79 -0
  20. package/src/components/collapsible.css +112 -0
  21. package/src/components/color-picker.css +82 -0
  22. package/src/components/combobox.css +420 -0
  23. package/src/components/command.css +210 -0
  24. package/src/components/context-menu.css +162 -0
  25. package/src/components/copy-button.css +106 -0
  26. package/src/components/custom-select.css +446 -0
  27. package/src/components/datepicker.css +301 -0
  28. package/src/components/description-list.css +100 -0
  29. package/src/components/divider.css +66 -0
  30. package/src/components/drawer.css +234 -0
  31. package/src/components/drop-zone.css +166 -0
  32. package/src/components/dropdown.css +169 -0
  33. package/src/components/empty-state.css +75 -0
  34. package/src/components/field.css +112 -0
  35. package/src/components/gallery.css +257 -0
  36. package/src/components/hero.css +111 -0
  37. package/src/components/icon-btn.css +103 -0
  38. package/src/components/index.css +74 -0
  39. package/src/components/input.css +311 -0
  40. package/src/components/kbd.css +54 -0
  41. package/src/components/media-library.css +230 -0
  42. package/src/components/modal.css +136 -0
  43. package/src/components/nav.css +198 -0
  44. package/src/components/number-input.css +163 -0
  45. package/src/components/pagination.css +175 -0
  46. package/src/components/pin-input.css +136 -0
  47. package/src/components/popover.css +111 -0
  48. package/src/components/progress.css +217 -0
  49. package/src/components/prose.css +337 -0
  50. package/src/components/result.css +80 -0
  51. package/src/components/scroll-area.css +73 -0
  52. package/src/components/search.css +311 -0
  53. package/src/components/segmented-control.css +94 -0
  54. package/src/components/skeleton.css +100 -0
  55. package/src/components/slider.css +133 -0
  56. package/src/components/sortable.css +70 -0
  57. package/src/components/spinner.css +60 -0
  58. package/src/components/star-rating.css +121 -0
  59. package/src/components/stat-card.css +44 -0
  60. package/src/components/table.css +359 -0
  61. package/src/components/tabs.css +215 -0
  62. package/src/components/tag.css +188 -0
  63. package/src/components/timeline.css +130 -0
  64. package/src/components/toast.css +90 -0
  65. package/src/components/toggle.css +173 -0
  66. package/src/components/toolbar.css +206 -0
  67. package/src/components/tooltip.css +167 -0
  68. package/src/components/truncated-text.css +75 -0
  69. package/src/index.css +21 -0
  70. package/src/js/theme.js +67 -0
  71. package/src/tokens/colors.css +256 -0
  72. package/src/tokens/index.css +11 -0
  73. package/src/tokens/shadows.css +55 -0
  74. package/src/tokens/spacing.css +82 -0
  75. package/src/tokens/tokens.json +413 -0
  76. package/src/tokens/typography.css +90 -0
  77. package/src/utilities/a11y.css +102 -0
  78. package/src/utilities/index.css +7 -0
  79. package/src/utilities/interactive.css +121 -0
  80. package/src/utilities/layout.css +273 -0
  81. package/src/utilities/sizing.css +85 -0
  82. package/src/utilities/spacing.css +204 -0
  83. package/src/utilities/states.css +182 -0
  84. package/src/utilities/text.css +381 -0
@@ -0,0 +1,413 @@
1
+ {
2
+ "$schema": "https://design-tokens.github.io/community-group/format/",
3
+ "color": {
4
+ "light": {
5
+ "bg": {
6
+ "$value": "#fafafa",
7
+ "$type": "color",
8
+ "$description": "Main background"
9
+ },
10
+ "bg-subtle": {
11
+ "$value": "#ffffff",
12
+ "$type": "color",
13
+ "$description": "Subtle background"
14
+ },
15
+ "bg-muted": {
16
+ "$value": "#e4e4e7",
17
+ "$type": "color",
18
+ "$description": "Muted background"
19
+ },
20
+ "bg-elevated": {
21
+ "$value": "#f4f4f5",
22
+ "$type": "color",
23
+ "$description": "Elevated background"
24
+ },
25
+ "surface": {
26
+ "$value": "#ffffff",
27
+ "$type": "color",
28
+ "$description": "Surface color"
29
+ },
30
+ "surface-hover": {
31
+ "$value": "#fafafa",
32
+ "$type": "color"
33
+ },
34
+ "surface-active": {
35
+ "$value": "#f4f4f5",
36
+ "$type": "color"
37
+ },
38
+ "text": {
39
+ "$value": "#09090b",
40
+ "$type": "color",
41
+ "$description": "Primary text — 19.3:1 contrast on bg"
42
+ },
43
+ "text-secondary": {
44
+ "$value": "#52525b",
45
+ "$type": "color",
46
+ "$description": "Secondary text — 7.6:1 contrast on bg"
47
+ },
48
+ "text-tertiary": {
49
+ "$value": "#a1a1aa",
50
+ "$type": "color",
51
+ "$description": "Tertiary text — decorative only"
52
+ },
53
+ "text-disabled": {
54
+ "$value": "#d4d4d8",
55
+ "$type": "color",
56
+ "$description": "Disabled text — exempt per WCAG 1.4.3"
57
+ },
58
+ "inverted": {
59
+ "$value": "#18181b",
60
+ "$type": "color"
61
+ },
62
+ "on-inverted": {
63
+ "$value": "#fafafa",
64
+ "$type": "color"
65
+ },
66
+ "border": {
67
+ "$value": "#e4e4e7",
68
+ "$type": "color"
69
+ },
70
+ "border-hover": {
71
+ "$value": "#d4d4d8",
72
+ "$type": "color"
73
+ },
74
+ "border-active": {
75
+ "$value": "#a1a1aa",
76
+ "$type": "color"
77
+ },
78
+ "border-subtle": {
79
+ "$value": "#f4f4f5",
80
+ "$type": "color"
81
+ },
82
+ "interactive": {
83
+ "$value": "#3f3f46",
84
+ "$type": "color"
85
+ },
86
+ "interactive-hover": {
87
+ "$value": "#27272a",
88
+ "$type": "color"
89
+ },
90
+ "overlay": {
91
+ "$value": "rgba(0, 0, 0, 0.5)",
92
+ "$type": "color"
93
+ },
94
+ "overlay-subtle": {
95
+ "$value": "rgba(0, 0, 0, 0.02)",
96
+ "$type": "color"
97
+ },
98
+ "overlay-hover": {
99
+ "$value": "rgba(0, 0, 0, 0.04)",
100
+ "$type": "color"
101
+ },
102
+ "overlay-active": {
103
+ "$value": "rgba(0, 0, 0, 0.08)",
104
+ "$type": "color"
105
+ },
106
+ "nav-bg": {
107
+ "$value": "rgba(250, 250, 250, 0.8)",
108
+ "$type": "color"
109
+ },
110
+ "nav-border": {
111
+ "$value": "rgba(228, 228, 231, 0.6)",
112
+ "$type": "color"
113
+ },
114
+ "selection-bg": {
115
+ "$value": "#09090b",
116
+ "$type": "color"
117
+ },
118
+ "selection-text": {
119
+ "$value": "#fafafa",
120
+ "$type": "color"
121
+ },
122
+ "scrollbar-thumb": {
123
+ "$value": "#d4d4d4",
124
+ "$type": "color"
125
+ },
126
+ "scrollbar-thumb-hover": {
127
+ "$value": "#a3a3a3",
128
+ "$type": "color"
129
+ }
130
+ },
131
+ "dark": {
132
+ "bg": {
133
+ "$value": "#09090b",
134
+ "$type": "color"
135
+ },
136
+ "bg-subtle": {
137
+ "$value": "#0f0f11",
138
+ "$type": "color"
139
+ },
140
+ "bg-muted": {
141
+ "$value": "#18181b",
142
+ "$type": "color"
143
+ },
144
+ "bg-elevated": {
145
+ "$value": "#1c1c20",
146
+ "$type": "color"
147
+ },
148
+ "surface": {
149
+ "$value": "#0f0f11",
150
+ "$type": "color"
151
+ },
152
+ "surface-hover": {
153
+ "$value": "#18181b",
154
+ "$type": "color"
155
+ },
156
+ "surface-active": {
157
+ "$value": "#27272a",
158
+ "$type": "color"
159
+ },
160
+ "text": {
161
+ "$value": "#fafafa",
162
+ "$type": "color"
163
+ },
164
+ "text-secondary": {
165
+ "$value": "#a1a1aa",
166
+ "$type": "color"
167
+ },
168
+ "text-tertiary": {
169
+ "$value": "#71717a",
170
+ "$type": "color"
171
+ },
172
+ "text-disabled": {
173
+ "$value": "#3f3f46",
174
+ "$type": "color"
175
+ },
176
+ "inverted": {
177
+ "$value": "#fafafa",
178
+ "$type": "color"
179
+ },
180
+ "on-inverted": {
181
+ "$value": "#09090b",
182
+ "$type": "color"
183
+ },
184
+ "border": {
185
+ "$value": "#27272a",
186
+ "$type": "color"
187
+ },
188
+ "border-hover": {
189
+ "$value": "#3f3f46",
190
+ "$type": "color"
191
+ },
192
+ "border-active": {
193
+ "$value": "#52525b",
194
+ "$type": "color"
195
+ },
196
+ "border-subtle": {
197
+ "$value": "#18181b",
198
+ "$type": "color"
199
+ },
200
+ "interactive": {
201
+ "$value": "#d4d4d8",
202
+ "$type": "color"
203
+ },
204
+ "interactive-hover": {
205
+ "$value": "#fafafa",
206
+ "$type": "color"
207
+ },
208
+ "overlay": {
209
+ "$value": "rgba(0, 0, 0, 0.7)",
210
+ "$type": "color"
211
+ },
212
+ "overlay-subtle": {
213
+ "$value": "rgba(255, 255, 255, 0.03)",
214
+ "$type": "color"
215
+ },
216
+ "overlay-hover": {
217
+ "$value": "rgba(255, 255, 255, 0.06)",
218
+ "$type": "color"
219
+ },
220
+ "overlay-active": {
221
+ "$value": "rgba(255, 255, 255, 0.1)",
222
+ "$type": "color"
223
+ },
224
+ "nav-bg": {
225
+ "$value": "rgba(9, 9, 11, 0.8)",
226
+ "$type": "color"
227
+ },
228
+ "nav-border": {
229
+ "$value": "rgba(39, 39, 42, 0.6)",
230
+ "$type": "color"
231
+ },
232
+ "selection-bg": {
233
+ "$value": "#fafafa",
234
+ "$type": "color"
235
+ },
236
+ "selection-text": {
237
+ "$value": "#09090b",
238
+ "$type": "color"
239
+ },
240
+ "scrollbar-thumb": {
241
+ "$value": "#27272a",
242
+ "$type": "color"
243
+ },
244
+ "scrollbar-thumb-hover": {
245
+ "$value": "#3f3f46",
246
+ "$type": "color"
247
+ }
248
+ },
249
+ "semantic": {
250
+ "success": {
251
+ "default": { "$value": "#16a34a", "$type": "color" },
252
+ "subtle": { "$value": "rgba(22, 163, 74, 0.1)", "$type": "color" },
253
+ "border": { "$value": "rgba(22, 163, 74, 0.2)", "$type": "color" },
254
+ "solid": { "$value": "#16a34a", "$type": "color" }
255
+ },
256
+ "warning": {
257
+ "default": { "$value": "#d97706", "$type": "color" },
258
+ "subtle": { "$value": "rgba(217, 119, 6, 0.1)", "$type": "color" },
259
+ "border": { "$value": "rgba(217, 119, 6, 0.2)", "$type": "color" },
260
+ "solid": { "$value": "#d97706", "$type": "color" }
261
+ },
262
+ "error": {
263
+ "default": { "$value": "#dc2626", "$type": "color" },
264
+ "subtle": { "$value": "rgba(220, 38, 38, 0.1)", "$type": "color" },
265
+ "border": { "$value": "rgba(220, 38, 38, 0.2)", "$type": "color" },
266
+ "solid": { "$value": "#dc2626", "$type": "color" }
267
+ },
268
+ "info": {
269
+ "default": { "$value": "#2563eb", "$type": "color" },
270
+ "subtle": { "$value": "rgba(37, 99, 235, 0.1)", "$type": "color" },
271
+ "border": { "$value": "rgba(37, 99, 235, 0.2)", "$type": "color" },
272
+ "solid": { "$value": "#2563eb", "$type": "color" }
273
+ }
274
+ },
275
+ "accent": {
276
+ "blue": { "$value": "#2563eb", "$type": "color" },
277
+ "blue-subtle": { "$value": "rgba(37, 99, 235, 0.1)", "$type": "color" },
278
+ "blue-border": { "$value": "rgba(37, 99, 235, 0.2)", "$type": "color" },
279
+ "purple": { "$value": "#7c3aed", "$type": "color" },
280
+ "purple-subtle": { "$value": "rgba(124, 58, 237, 0.1)", "$type": "color" },
281
+ "purple-border": { "$value": "rgba(124, 58, 237, 0.2)", "$type": "color" },
282
+ "green": { "$value": "#16a34a", "$type": "color" },
283
+ "green-subtle": { "$value": "rgba(22, 163, 74, 0.1)", "$type": "color" },
284
+ "green-border": { "$value": "rgba(22, 163, 74, 0.2)", "$type": "color" },
285
+ "orange": { "$value": "#d97706", "$type": "color" },
286
+ "orange-subtle": { "$value": "rgba(217, 119, 6, 0.1)", "$type": "color" },
287
+ "orange-border": { "$value": "rgba(217, 119, 6, 0.2)", "$type": "color" }
288
+ },
289
+ "shadow": {
290
+ "light": {
291
+ "sm": { "$value": "0 1px 2px rgba(0, 0, 0, 0.05)", "$type": "shadow" },
292
+ "md": { "$value": "0 4px 12px rgba(0, 0, 0, 0.08)", "$type": "shadow" },
293
+ "lg": { "$value": "0 8px 24px rgba(0, 0, 0, 0.12)", "$type": "shadow" }
294
+ },
295
+ "dark": {
296
+ "sm": { "$value": "0 1px 2px rgba(0, 0, 0, 0.2)", "$type": "shadow" },
297
+ "md": { "$value": "0 4px 12px rgba(0, 0, 0, 0.3)", "$type": "shadow" },
298
+ "lg": { "$value": "0 8px 24px rgba(0, 0, 0, 0.4)", "$type": "shadow" }
299
+ }
300
+ }
301
+ },
302
+ "spacing": {
303
+ "0": { "$value": "0", "$type": "dimension" },
304
+ "0-5": { "$value": "0.125rem", "$type": "dimension", "$description": "2px" },
305
+ "1": { "$value": "0.25rem", "$type": "dimension", "$description": "4px" },
306
+ "1-5": { "$value": "0.375rem", "$type": "dimension", "$description": "6px" },
307
+ "2": { "$value": "0.5rem", "$type": "dimension", "$description": "8px" },
308
+ "2-5": { "$value": "0.625rem", "$type": "dimension", "$description": "10px" },
309
+ "3": { "$value": "0.75rem", "$type": "dimension", "$description": "12px" },
310
+ "4": { "$value": "1rem", "$type": "dimension", "$description": "16px" },
311
+ "5": { "$value": "1.25rem", "$type": "dimension", "$description": "20px" },
312
+ "6": { "$value": "1.5rem", "$type": "dimension", "$description": "24px" },
313
+ "8": { "$value": "2rem", "$type": "dimension", "$description": "32px" },
314
+ "10": { "$value": "2.5rem", "$type": "dimension", "$description": "40px" },
315
+ "12": { "$value": "3rem", "$type": "dimension", "$description": "48px" },
316
+ "16": { "$value": "4rem", "$type": "dimension", "$description": "64px" },
317
+ "20": { "$value": "5rem", "$type": "dimension", "$description": "80px" },
318
+ "24": { "$value": "6rem", "$type": "dimension", "$description": "96px" },
319
+ "32": { "$value": "8rem", "$type": "dimension", "$description": "128px" }
320
+ },
321
+ "sizing": {
322
+ "1": { "$value": "1.5rem", "$type": "dimension", "$description": "24px — xs tier" },
323
+ "2": { "$value": "2rem", "$type": "dimension", "$description": "32px — sm tier" },
324
+ "3": { "$value": "2.5rem", "$type": "dimension", "$description": "40px — md tier" },
325
+ "4": { "$value": "3rem", "$type": "dimension", "$description": "48px — lg tier" }
326
+ },
327
+ "borderRadius": {
328
+ "none": { "$value": "0", "$type": "dimension" },
329
+ "sm": { "$value": "6px", "$type": "dimension" },
330
+ "md": { "$value": "8px", "$type": "dimension" },
331
+ "lg": { "$value": "12px", "$type": "dimension" },
332
+ "xl": { "$value": "16px", "$type": "dimension" },
333
+ "2xl": { "$value": "20px", "$type": "dimension" },
334
+ "full": { "$value": "9999px", "$type": "dimension" }
335
+ },
336
+ "typography": {
337
+ "fontFamily": {
338
+ "display": { "$value": "\"Clash Display\", system-ui, sans-serif", "$type": "fontFamily" },
339
+ "sans": { "$value": "\"Switzer\", system-ui, -apple-system, sans-serif", "$type": "fontFamily" },
340
+ "mono": { "$value": "\"Geist Mono\", ui-monospace, \"SF Mono\", monospace", "$type": "fontFamily" }
341
+ },
342
+ "fontSize": {
343
+ "2xs": { "$value": "0.625rem", "$type": "dimension", "$description": "10px" },
344
+ "xs": { "$value": "0.75rem", "$type": "dimension", "$description": "12px" },
345
+ "sm": { "$value": "0.875rem", "$type": "dimension", "$description": "14px" },
346
+ "base": { "$value": "1rem", "$type": "dimension", "$description": "16px" },
347
+ "lg": { "$value": "1.125rem", "$type": "dimension", "$description": "18px" },
348
+ "xl": { "$value": "1.25rem", "$type": "dimension", "$description": "20px" },
349
+ "2xl": { "$value": "1.5rem", "$type": "dimension", "$description": "24px" },
350
+ "3xl": { "$value": "1.875rem", "$type": "dimension", "$description": "30px" },
351
+ "4xl": { "$value": "2.25rem", "$type": "dimension", "$description": "36px" },
352
+ "5xl": { "$value": "3rem", "$type": "dimension", "$description": "48px" },
353
+ "6xl": { "$value": "3.75rem", "$type": "dimension", "$description": "60px" },
354
+ "7xl": { "$value": "4.5rem", "$type": "dimension", "$description": "72px" }
355
+ },
356
+ "fontWeight": {
357
+ "light": { "$value": 300, "$type": "fontWeight" },
358
+ "normal": { "$value": 400, "$type": "fontWeight" },
359
+ "medium": { "$value": 500, "$type": "fontWeight" },
360
+ "semibold": { "$value": 600, "$type": "fontWeight" },
361
+ "bold": { "$value": 700, "$type": "fontWeight" },
362
+ "display": { "$value": 400, "$type": "fontWeight", "$description": "Clash Display optimal weight" }
363
+ },
364
+ "lineHeight": {
365
+ "none": { "$value": "1", "$type": "number" },
366
+ "tight": { "$value": "1.1", "$type": "number" },
367
+ "snug": { "$value": "1.25", "$type": "number" },
368
+ "normal": { "$value": "1.5", "$type": "number" },
369
+ "relaxed": { "$value": "1.625", "$type": "number" },
370
+ "loose": { "$value": "2", "$type": "number" }
371
+ },
372
+ "letterSpacing": {
373
+ "tighter": { "$value": "-0.02em", "$type": "dimension" },
374
+ "tight": { "$value": "-0.01em", "$type": "dimension" },
375
+ "normal": { "$value": "0", "$type": "dimension" },
376
+ "wide": { "$value": "0.05em", "$type": "dimension" },
377
+ "wider": { "$value": "0.1em", "$type": "dimension" }
378
+ }
379
+ },
380
+ "zIndex": {
381
+ "base": { "$value": 0, "$type": "number" },
382
+ "dropdown": { "$value": 50, "$type": "number" },
383
+ "sticky": { "$value": 60, "$type": "number" },
384
+ "overlay": { "$value": 80, "$type": "number" },
385
+ "modal": { "$value": 100, "$type": "number" },
386
+ "toast": { "$value": 150, "$type": "number" },
387
+ "tooltip": { "$value": 200, "$type": "number" }
388
+ },
389
+ "duration": {
390
+ "fast": { "$value": "100ms", "$type": "duration" },
391
+ "normal": { "$value": "200ms", "$type": "duration" },
392
+ "slow": { "$value": "400ms", "$type": "duration" },
393
+ "slower": { "$value": "800ms", "$type": "duration" }
394
+ },
395
+ "easing": {
396
+ "default": { "$value": "ease", "$type": "cubicBezier" },
397
+ "out": { "$value": "cubic-bezier(0, 0, 0.2, 1)", "$type": "cubicBezier" },
398
+ "out-expo": { "$value": "cubic-bezier(0.16, 1, 0.3, 1)", "$type": "cubicBezier" },
399
+ "bounce": { "$value": "cubic-bezier(0.34, 1.56, 0.64, 1)", "$type": "cubicBezier" }
400
+ },
401
+ "blur": {
402
+ "sm": { "$value": "4px", "$type": "dimension" },
403
+ "md": { "$value": "12px", "$type": "dimension" },
404
+ "lg": { "$value": "20px", "$type": "dimension" }
405
+ },
406
+ "opacity": {
407
+ "disabled": { "$value": 0.5, "$type": "number" }
408
+ },
409
+ "focusRing": {
410
+ "width": { "$value": "2px", "$type": "dimension" },
411
+ "offset": { "$value": "2px", "$type": "dimension" }
412
+ }
413
+ }
@@ -0,0 +1,90 @@
1
+ /* ==========================================================================
2
+ Design Tokens: Typography
3
+ Clash Display headings, Switzer body.
4
+ Editorial feel, generous sizing, tight tracking on display.
5
+ ========================================================================== */
6
+
7
+ :root {
8
+ /* --- Font Families ---
9
+ Convention over configuration. If the consumer loads its typefaces via
10
+ `next/font/local` (or the `geist` package) using the conventional
11
+ variable names --font-display / --font-sans / --font-geist-mono, the DS
12
+ picks them up with zero extra wiring.
13
+
14
+ Why these are declared BOTH at :root and on body:
15
+ next/font injects --font-* on the <body> element (via className), not on
16
+ :root. If var(--font-*, fallback) were only resolved at :root, the
17
+ fallback literal would always win (the Next variable is not in scope
18
+ there). The body-level declaration below re-evaluates the token where
19
+ --font-* is actually set, so Next's internal font name resolves.
20
+
21
+ Root-level keeps the literal fallbacks so the DS still works in
22
+ environments without next/font (Storybook, plain HTML, etc.) — there
23
+ the quoted "Clash Display" / "Switzer" / "Geist Mono" need to be
24
+ loadable (e.g. locally installed or loaded via @font-face elsewhere).
25
+
26
+ Want a different typeface? Override --ds-font-display / --ds-font-sans
27
+ at consumer body scope and you are done (digiko used Manrope this way). */
28
+ --ds-font-display: "Clash Display", system-ui, sans-serif;
29
+ --ds-font-sans: "Switzer", system-ui, -apple-system, sans-serif;
30
+ --ds-font-mono: "Geist Mono", ui-monospace, "SF Mono", monospace;
31
+
32
+ /* --- Display Font Weight (Clash Display looks best at 400) --- */
33
+ --ds-font-display-weight: 400;
34
+
35
+ /* --- Font Sizes --- */
36
+ --ds-text-2xs: 0.625rem; /* 10px */
37
+ --ds-text-xs: 0.75rem; /* 12px */
38
+ --ds-text-sm: 0.875rem; /* 14px */
39
+ --ds-text-base: 1rem; /* 16px */
40
+ --ds-text-lg: 1.125rem; /* 18px */
41
+ --ds-text-xl: 1.25rem; /* 20px */
42
+ --ds-text-2xl: 1.5rem; /* 24px */
43
+ --ds-text-3xl: 1.875rem; /* 30px */
44
+ --ds-text-4xl: 2.25rem; /* 36px */
45
+ --ds-text-5xl: 3rem; /* 48px */
46
+ --ds-text-6xl: 3.75rem; /* 60px */
47
+ --ds-text-7xl: 4.5rem; /* 72px */
48
+
49
+ /* --- Editorial long-form fluid sizes ---
50
+ Promoted from esys/blog.css on 12 Apr 2026 after the blog incident.
51
+ These target magazine-style article reading, between the functional
52
+ UI scale (ds-text-*) and the display scale (ds-hero-title). Used by
53
+ .ds-editorial-title and .ds-editorial-lede in components/prose.css. */
54
+ --ds-text-editorial-title: clamp(2.5rem, 4vw + 1.5rem, 4.5rem); /* 40 → 72px */
55
+ --ds-text-editorial-lede: clamp(1.125rem, 0.5vw + 1rem, 1.375rem); /* 18 → 22px */
56
+ --ds-text-editorial-body: 1.125rem; /* 18px — editorial reading standard (was 17px pre-Apr 2026) */
57
+
58
+ /* --- Font Weights --- */
59
+ --ds-weight-extralight: 200;
60
+ --ds-weight-light: 300;
61
+ --ds-weight-normal: 400;
62
+ --ds-weight-medium: 500;
63
+ --ds-weight-semibold: 600;
64
+ --ds-weight-bold: 700;
65
+
66
+ /* --- Line Heights --- */
67
+ --ds-leading-none: 1;
68
+ --ds-leading-tight: 1.1;
69
+ --ds-leading-snug: 1.25;
70
+ --ds-leading-normal: 1.5;
71
+ --ds-leading-relaxed: 1.625;
72
+ --ds-leading-loose: 2;
73
+
74
+ /* --- Letter Spacing --- */
75
+ --ds-tracking-tighter: -0.02em;
76
+ --ds-tracking-tight: -0.01em;
77
+ --ds-tracking-normal: 0;
78
+ --ds-tracking-wide: 0.05em;
79
+ --ds-tracking-wider: 0.1em;
80
+ }
81
+
82
+ /* Body-scope re-declaration of the font tokens so they resolve against the
83
+ --font-* variables that next/font injects on <body> (see :root comment
84
+ above). Without this, the var(--font-*, fallback) would always hit the
85
+ fallback because --font-* is not in scope at :root. */
86
+ body {
87
+ --ds-font-display: var(--font-display, "Clash Display"), system-ui, sans-serif;
88
+ --ds-font-sans: var(--font-sans, "Switzer"), system-ui, -apple-system, sans-serif;
89
+ --ds-font-mono: var(--font-geist-mono, "Geist Mono"), ui-monospace, "SF Mono", monospace;
90
+ }
@@ -0,0 +1,102 @@
1
+ /* ==========================================================================
2
+ Utilities: Accessibility
3
+ Screen-reader helpers, skip links, focus utilities, and motion control.
4
+ ========================================================================== */
5
+
6
+ /* ---------------------------------------------------------------------------
7
+ Screen Reader Only — visually hidden, available to assistive technology
8
+ --------------------------------------------------------------------------- */
9
+
10
+ .ds-sr-only {
11
+ position: absolute;
12
+ width: 1px;
13
+ height: 1px;
14
+ padding: 0;
15
+ margin: -1px;
16
+ overflow: hidden;
17
+ clip: rect(0, 0, 0, 0);
18
+ white-space: nowrap;
19
+ border-width: 0;
20
+ }
21
+
22
+ /* ---------------------------------------------------------------------------
23
+ Not Screen Reader Only — reset ds-sr-only when needed (e.g., responsive)
24
+ --------------------------------------------------------------------------- */
25
+
26
+ .ds-not-sr-only {
27
+ position: static;
28
+ width: auto;
29
+ height: auto;
30
+ padding: 0;
31
+ margin: 0;
32
+ overflow: visible;
33
+ clip: auto;
34
+ white-space: normal;
35
+ }
36
+
37
+ /* ---------------------------------------------------------------------------
38
+ Focus Visible Only — invisible by default, shown on keyboard focus
39
+ --------------------------------------------------------------------------- */
40
+
41
+ .ds-focus-visible-only {
42
+ opacity: 0;
43
+ pointer-events: none;
44
+ }
45
+
46
+ .ds-focus-visible-only:focus-visible {
47
+ opacity: 1;
48
+ pointer-events: auto;
49
+ }
50
+
51
+ /* ---------------------------------------------------------------------------
52
+ Skip Link — skip to main content, visible only on focus
53
+ --------------------------------------------------------------------------- */
54
+
55
+ .ds-skip-link {
56
+ position: absolute;
57
+ width: 1px;
58
+ height: 1px;
59
+ padding: 0;
60
+ margin: -1px;
61
+ overflow: hidden;
62
+ clip: rect(0, 0, 0, 0);
63
+ white-space: nowrap;
64
+ border-width: 0;
65
+ }
66
+
67
+ .ds-skip-link:focus-visible {
68
+ position: fixed;
69
+ inset-block-start: 0;
70
+ inset-inline-start: 0;
71
+ z-index: var(--ds-z-tooltip, 200);
72
+ width: auto;
73
+ height: auto;
74
+ padding: var(--ds-space-3) var(--ds-space-5);
75
+ margin: 0;
76
+ overflow: visible;
77
+ clip: auto;
78
+ white-space: normal;
79
+ background-color: var(--ds-color-inverted);
80
+ color: var(--ds-color-on-inverted);
81
+ font-family: var(--ds-font-sans);
82
+ font-size: var(--ds-text-sm);
83
+ font-weight: var(--ds-weight-medium);
84
+ border-radius: 0 0 var(--ds-radius-lg) 0;
85
+ box-shadow: var(--ds-shadow-lg);
86
+ text-decoration: none;
87
+ outline: none;
88
+ }
89
+
90
+ /* ---------------------------------------------------------------------------
91
+ Reduce Motion — force reduced motion on a specific element
92
+ --------------------------------------------------------------------------- */
93
+
94
+ .ds-reduce-motion,
95
+ .ds-reduce-motion *,
96
+ .ds-reduce-motion *::before,
97
+ .ds-reduce-motion *::after {
98
+ animation-duration: 0.01ms !important;
99
+ animation-iteration-count: 1 !important;
100
+ transition-duration: 0.01ms !important;
101
+ scroll-behavior: auto !important;
102
+ }
@@ -0,0 +1,7 @@
1
+ @import './layout.css';
2
+ @import './spacing.css';
3
+ @import './sizing.css';
4
+ @import './text.css';
5
+ @import './interactive.css';
6
+ @import './states.css';
7
+ @import './a11y.css';