astralkit 0.3.0 → 0.3.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.
@@ -1,610 +1,618 @@
1
- :root {
2
- /* ══════════════════════════════════════════════════════════
3
- AstralKit Design Tokens (Tailwind v3)
4
- Default: Black & white neutral theme.
5
- Override any variable in your own :root block to brand it.
6
- ══════════════════════════════════════════════════════════ */
7
-
8
- /* ── Neutral scale (full 11-shade ramp) ── */
9
- --color-ak-neutral-0: #ffffff;
10
- --color-ak-neutral-50: #fafafa;
11
- --color-ak-neutral-100: #f5f5f5;
12
- --color-ak-neutral-200: #e5e5e5;
13
- --color-ak-neutral-300: #d4d4d4;
14
- --color-ak-neutral-400: #a3a3a3;
15
- --color-ak-neutral-500: #737373;
16
- --color-ak-neutral-600: #525252;
17
- --color-ak-neutral-700: #404040;
18
- --color-ak-neutral-800: #262626;
19
- --color-ak-neutral-900: #171717;
20
- --color-ak-neutral-950: #0a0a0a;
21
-
22
- /* ── Primary scale (full 11-shade ramp) ── */
23
- --color-ak-primary-50: #f5f5f5;
24
- --color-ak-primary-100: #e5e5e5;
25
- --color-ak-primary-200: #cccccc;
26
- --color-ak-primary-300: #a3a3a3;
27
- --color-ak-primary-400: #737373;
28
- --color-ak-primary-500: #525252;
29
- --color-ak-primary-600: #404040;
30
- --color-ak-primary-700: #333333;
31
- --color-ak-primary-800: #1a1a1a;
32
- --color-ak-primary-900: #000000;
33
- --color-ak-primary-950: #000000;
34
-
35
- /* ── Primary action colors ── */
36
- --color-ak-primary: #000000;
37
- --color-ak-primary-hover: #1a1a1a;
38
- --color-ak-primary-active: #333333;
39
-
40
- /* ── Semantic color aliases ── */
41
- --color-ak-bg: #ffffff;
42
- --color-ak-surface: #fafafa;
43
- --color-ak-surface-2: #f5f5f5;
44
- --color-ak-hover: #f7f7f7;
45
- --color-ak-active: #f0f0f0;
46
- --color-ak-elevated: #ffffff;
47
- --color-ak-surface-raised: #ffffff;
48
- --color-ak-surface-raised-soft: rgba(255, 255, 255, 0.78);
49
- --color-ak-surface-glass: rgba(255, 255, 255, 0.72);
50
- --color-ak-surface-glass-strong: rgba(255, 255, 255, 0.84);
51
- --color-ak-highlight-soft: rgba(255, 255, 255, 0.45);
52
- --color-ak-highlight-strong: rgba(255, 255, 255, 0.72);
53
- --color-ak-skeleton-base: #ededed;
54
- --color-ak-skeleton-shine: rgba(255, 255, 255, 0.72);
55
- --color-ak-overlay: rgba(0, 0, 0, 0.5);
56
- --color-ak-on-primary: #ffffff;
57
- --color-ak-primary-subtle: #f5f5f5;
58
-
59
- /* ── Semantic text ── */
60
- --color-ak-text: #171717;
61
- --color-ak-text-secondary: #525252;
62
- --color-ak-text-muted: #a3a3a3;
63
- --color-ak-text-disabled: #d4d4d4;
64
- --color-ak-text-inverse: #ffffff;
65
- --color-ak-text-link: #000000;
66
- --color-ak-text-placeholder:#525252;
67
-
68
- /* ── Semantic border ── */
69
- --color-ak-border: #dee2e6;
70
- --color-ak-border-subtle: #e5e5e5;
71
- --color-ak-border-strong: #525252;
72
- --color-ak-border-focus: #000000;
73
-
74
- /* ── Status colors ── */
75
- --color-ak-success: #16a34a;
76
- --color-ak-success-subtle: #f0fdf4;
77
- --color-ak-success-text: #15803d;
78
- --color-ak-warning: #d97706;
79
- --color-ak-warning-subtle: #fffbeb;
80
- --color-ak-warning-text: #b45309;
81
- --color-ak-danger: #dc2626;
82
- --color-ak-danger-subtle: #fef2f2;
83
- --color-ak-danger-text: #b91c1c;
84
- --color-ak-info: #2563eb;
85
- --color-ak-info-subtle: #eff6ff;
86
- --color-ak-pink: #db2777;
87
- --color-ak-pink-subtle: #fdf2f8;
88
- --color-ak-info-text: #1d4ed8;
89
-
90
- /* ── Font families ── */
91
- --font-ak-sans: 'DM Sans', system-ui, -apple-system, sans-serif;
92
- --font-ak-serif: 'DM Serif Display', Georgia, serif;
93
- --font-ak-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
94
-
95
- /* ── Type scale (static) ── */
96
- --text-ak-2xs: 0.6875rem;
97
- --text-ak-xs: 0.75rem;
98
- --text-ak-sm: 0.875rem;
99
- --text-ak-base: 1rem;
100
- --text-ak-lg: 1.125rem;
101
- --text-ak-xl: 1.25rem;
102
- --text-ak-2xl: 1.5rem;
103
- --text-ak-3xl: 2rem;
104
- --text-ak-4xl: 2.5rem;
105
- --text-ak-5xl: 3rem;
106
- --text-ak-6xl: 3.75rem;
107
- --text-ak-7xl: 4.5rem;
108
- --text-ak-8xl: 6rem;
109
- --text-ak-9xl: 7rem;
110
-
111
- /* ── Fluid type scale (viewport: 320px → 1400px) ──
112
- One class, zero breakpoints. Use text-ak-fl-* instead of text-ak-*.
113
- MAX of each step = the matching static token (e.g. fl-lg max = text-ak-lg).
114
- MIN = one static step down, giving subtle mobile shrink.
115
- WCAG SC 1.4.4 compliant: max ≤ 2.5× min on all steps. ── */
116
- --text-ak-fl-xs: clamp(0.6875rem, 0.67rem + 0.06vw, 0.75rem);
117
- --text-ak-fl-sm: clamp(0.75rem, 0.71rem + 0.12vw, 0.875rem);
118
- --text-ak-fl-base: clamp(0.875rem, 0.84rem + 0.12vw, 1rem);
119
- --text-ak-fl-lg: clamp(1rem, 0.96rem + 0.12vw, 1.125rem);
120
- --text-ak-fl-xl: clamp(1.125rem, 1.09rem + 0.12vw, 1.25rem);
121
- --text-ak-fl-2xl: clamp(1.25rem, 1.18rem + 0.23vw, 1.5rem);
122
- --text-ak-fl-3xl: clamp(1.5rem, 1.39rem + 0.35vw, 1.875rem);
123
- --text-ak-fl-4xl: clamp(1.875rem, 1.76rem + 0.35vw, 2.25rem);
124
- --text-ak-fl-5xl: clamp(2.25rem, 2.03rem + 0.69vw, 3rem);
125
- --text-ak-fl-6xl: clamp(3rem, 2.78rem + 0.69vw, 3.75rem);
126
- --text-ak-fl-7xl: clamp(3.5rem, 3.2rem + 0.93vw, 4.5rem);
127
- --text-ak-fl-8xl: clamp(4.5rem, 4.06rem + 1.39vw, 6rem);
128
- --text-ak-fl-9xl: clamp(5.25rem, 4.73rem + 1.62vw, 7rem);
129
-
130
- /* ── Display type scale (viewport: 320px → 1400px) ──
131
- Dramatic fluid scaling for hero headings and marketing display text.
132
- Each step grows ~1.5–2 static steps across the viewport range.
133
- Use text-ak-display-* for hero h1, section display headings, etc. ── */
134
- --text-ak-display-xs: clamp(0.75rem, 0.7rem + 0.15vw, 0.875rem);
135
- --text-ak-display-sm: clamp(0.875rem, 0.83rem + 0.19vw, 1rem);
136
- --text-ak-display-base: clamp(1rem, 0.94rem + 0.28vw, 1.1875rem);
137
- --text-ak-display-lg: clamp(1.125rem, 1.01rem + 0.52vw, 1.5rem);
138
- --text-ak-display-xl: clamp(1.25rem, 1.07rem + 0.83vw, 1.875rem);
139
- --text-ak-display-2xl: clamp(1.5rem, 1.2rem + 1.11vw, 2.25rem);
140
- --text-ak-display-3xl: clamp(1.875rem, 1.42rem + 1.67vw, 3rem);
141
- --text-ak-display-4xl: clamp(2.25rem, 1.58rem + 2.5vw, 3.75rem);
142
- --text-ak-display-5xl: clamp(3rem, 2.07rem + 3.47vw, 5.25rem);
143
- --text-ak-display-6xl: clamp(3.75rem, 2.5rem + 4.63vw, 7rem);
144
- --text-ak-display-7xl: clamp(4.5rem, 3.06rem + 5.56vw, 8rem);
145
- --text-ak-display-8xl: clamp(5rem, 3.06rem + 6.94vw, 9rem);
146
- --text-ak-display-9xl: clamp(5.5rem, 3.06rem + 7.64vw, 10rem);
147
-
148
- /* ── Line Height ── */
149
- --leading-ak-display: 0.85;
150
- --leading-ak-tighter: 1.1;
151
- --leading-ak-none: 1;
152
- --leading-ak-tight: 1.25;
153
- --leading-ak-snug: 1.375;
154
- --leading-ak-normal: 1.5;
155
- --leading-ak-relaxed: 1.625;
156
- --leading-ak-prose: 1.75;
157
- --leading-ak-loose: 2;
158
-
159
- /* ── Letter Spacing ── */
160
- --tracking-ak-tighter: -0.05em;
161
- --tracking-ak-tight: -0.025em;
162
- --tracking-ak-subtle: -0.01em;
163
- --tracking-ak-normal: 0em;
164
- --tracking-ak-wide: 0.025em;
165
- --tracking-ak-section: 0.08em;
166
- --tracking-ak-wider: 0.05em;
167
- --tracking-ak-widest: 0.1em;
168
-
169
- /* ── Spacing ── */
170
- --spacing-ak-0: 0rem;
171
- --spacing-ak-px: 0.0625rem;
172
- --spacing-ak-0_5: 0.25rem;
173
- --spacing-ak-1: 0.5rem;
174
- --spacing-ak-1_5: 0.75rem;
175
- --spacing-ak-2: 1rem;
176
- --spacing-ak-2_5: 1.25rem;
177
- --spacing-ak-3: 1.5rem;
178
- --spacing-ak-3_5: 1.75rem;
179
- --spacing-ak-4: 2rem;
180
- --spacing-ak-4_5: 2.25rem;
181
- --spacing-ak-5: 2.5rem;
182
- --spacing-ak-5_5: 2.75rem;
183
- --spacing-ak-6: 3rem;
184
- --spacing-ak-7: 3.5rem;
185
- --spacing-ak-8: 4rem;
186
- --spacing-ak-9: 4.5rem;
187
- --spacing-ak-10: 5rem;
188
- --spacing-ak-11: 5.5rem;
189
- --spacing-ak-12: 6rem;
190
- --spacing-ak-14: 7rem;
191
- --spacing-ak-16: 8rem;
192
- --spacing-ak-20: 10rem;
193
- --spacing-ak-24: 12rem;
194
- --spacing-ak-mobile-bar: 4.5rem;
195
- --size-ak-sheet-handle-width: 2.25rem;
196
- --size-ak-sheet-handle-height: 0.25rem;
197
- --color-ak-sheet-handle: #d4d4d4;
198
-
199
- /* ── Layout sizes ──
200
- Uses Tailwind v4 native namespaces so they generate real utilities:
201
- --container-* → max-w-*
202
- --height-* → h-*
203
- --width-* → w-* */
204
- --container-ak-page: 80rem;
205
- --height-ak-nav: 4.5rem;
206
- --height-ak-touch: 2.5rem;
207
- --width-ak-touch: 2.5rem;
208
-
209
- /* ── Control heights (buttons, inputs, selects) ──
210
- 48px (md) is the standard minimum for all interactive controls.
211
- Use h-ak-control-md, min-h-ak-control-md, etc. ── */
212
- --height-ak-control-sm: 2rem; /* 32px — compact desktop-only */
213
- --height-ak-control-md: 2.5rem; /* 40px — STANDARD */
214
- --height-ak-control-lg: 3rem; /* 48px — prominent CTAs */
215
- --height-ak-control-xl: 3.5rem; /* 56px — hero CTAs */
216
-
217
- /* ── Table row heights ── */
218
- --height-ak-row-compact: 2.5rem; /* 40px */
219
- --height-ak-row-default: 3rem; /* 48px */
220
- --height-ak-row-comfortable: 3.25rem; /* 52px */
221
-
222
- /* ── Fluid page margin (16px mobile → 80px desktop) ── */
223
- --spacing-ak-fl-page-margin: clamp(1rem, 0.26rem + 3.7vw, 5rem);
224
-
225
- /* ── Fluid spacing (viewport: 320px → 1400px) ──
226
- Scales smoothly. Use p-ak-fl-*, gap-ak-fl-*, m-ak-fl-*, etc.
227
- Named sizes (xs → 3xl) for intuitive selection. ── */
228
- --spacing-ak-fl-3xs: clamp(0.25rem, 0.21rem + 0.14vw, 0.375rem);
229
- --spacing-ak-fl-2xs: clamp(0.5rem, 0.43rem + 0.28vw, 0.75rem);
230
- --spacing-ak-fl-xs: clamp(0.75rem, 0.65rem + 0.42vw, 1rem);
231
- --spacing-ak-fl-sm: clamp(1rem, 0.86rem + 0.56vw, 1.5rem);
232
- --spacing-ak-fl-md: clamp(1.5rem, 1.29rem + 0.83vw, 2rem);
233
- --spacing-ak-fl-lg: clamp(2rem, 1.72rem + 1.11vw, 3rem);
234
- --spacing-ak-fl-xl: clamp(3rem, 2.5rem + 1.85vw, 4.5rem);
235
- --spacing-ak-fl-2xl: clamp(4rem, 3.22rem + 2.78vw, 6rem);
236
- --spacing-ak-fl-3xl: clamp(6rem, 4.86rem + 4.17vw, 9rem);
237
-
238
- /* ── Fluid space pairs (dramatic scaling for sections) ──
239
- "xs-lg" = starts at xs on mobile, reaches lg on desktop.
240
- Perfect for section padding, hero spacing, large gaps. ── */
241
- --spacing-ak-fl-xs-md: clamp(0.75rem, 0.43rem + 1.39vw, 2rem);
242
- --spacing-ak-fl-xs-lg: clamp(0.75rem, 0.14rem + 2.78vw, 3rem);
243
- --spacing-ak-fl-sm-lg: clamp(1rem, 0.43rem + 2.78vw, 3rem);
244
- --spacing-ak-fl-sm-xl: clamp(1rem, 0rem + 4.17vw, 4.5rem);
245
- --spacing-ak-fl-md-xl: clamp(1.5rem, 0.57rem + 3.47vw, 4.5rem);
246
- --spacing-ak-fl-md-2xl: clamp(1.5rem, 0rem + 5.56vw, 6rem);
247
- --spacing-ak-fl-lg-2xl: clamp(2rem, 0.57rem + 5.56vw, 6rem);
248
- --spacing-ak-fl-xl-3xl: clamp(3rem, 0.57rem + 8.33vw, 9rem);
249
-
250
- /* ── Border Radius ── */
251
- --radius-ak-xs: 0.125rem;
252
- --radius-ak-none: 0;
253
- --radius-ak-sm: 0.25rem;
254
- --radius-ak-md: 0.5rem;
255
- --radius-ak-lg: 0.75rem;
256
- --radius-ak-xl: 1rem;
257
- --radius-ak-2xl: 1.5rem;
258
- --radius-ak-3xl: 2rem;
259
- --radius-ak-full: 9999px;
260
-
261
- /* ── Shadows ── */
262
- --shadow-ak-xs: 0 1px 2px rgba(0,0,0,0.04);
263
- --shadow-ak-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
264
- --shadow-ak-md: 0 4px 12px rgba(0,0,0,0.06), 0 2px 4px rgba(0,0,0,0.04);
265
- --shadow-ak-lg: 0 8px 30px rgba(0,0,0,0.08), 0 4px 8px rgba(0,0,0,0.04);
266
- --shadow-ak-xl: 0 16px 50px rgba(0,0,0,0.1), 0 8px 16px rgba(0,0,0,0.05);
267
- --shadow-ak-2xl: 0 24px 60px rgba(0,0,0,0.14);
268
-
269
- /* ── Neobrutalist ──
270
- B&W brutalism toolkit. The core rule: face color is NEVER the same
271
- as shadow/ink color. This prevents "invisible shadow" bugs where a
272
- black button on a black shadow disappears. */
273
- --color-ak-brutal-ink: #000000;
274
- --color-ak-brutal-face: #ffffff;
275
- --color-ak-brutal-face-dark: #262626;
276
- --color-ak-brutal-on-face: #000000;
277
- --color-ak-brutal-on-face-dark: #ffffff;
278
- --shadow-ak-brutal-xs: 2px 2px 0 0 var(--color-ak-brutal-ink);
279
- --shadow-ak-brutal-sm: 3px 3px 0 0 var(--color-ak-brutal-ink);
280
- --shadow-ak-brutal: 4px 4px 0 0 var(--color-ak-brutal-ink);
281
- --shadow-ak-brutal-lg: 6px 6px 0 0 var(--color-ak-brutal-ink);
282
- --shadow-ak-brutal-xl: 8px 8px 0 0 var(--color-ak-brutal-ink);
283
- --border-ak-brutal: 2px;
284
- --border-ak-brutal-lg: 3px;
285
- --radius-ak-brutal: 0.5rem;
286
- --radius-ak-brutal-sm: 0.25rem;
287
-
288
- /* ── Component sizes ──
289
- --size-* namespace size-* utility (sets both width AND height).
290
- Use: size-ak-icon-lg, size-ak-avatar-md, etc. ── */
291
-
292
- /* Icons (for SVG w/h — also used by .ak-icon-* for font-size) */
293
- --size-ak-icon-xs: 0.75rem;
294
- --size-ak-icon-sm: 1rem;
295
- --size-ak-icon-md: 1.25rem;
296
- --size-ak-icon-lg: 1.5rem;
297
- --size-ak-icon-xl: 1.75rem;
298
- --size-ak-icon-2xl: 2rem;
299
- --size-ak-icon-3xl: 3rem;
300
-
301
- /* Panel width (sidebar flyout panels) */
302
- --size-ak-panel-width: 260px;
303
-
304
- /* Avatars */
305
- --size-ak-avatar-xs: 1.5rem;
306
- --size-ak-avatar-sm: 2rem;
307
- --size-ak-avatar-md: 2.5rem;
308
- --size-ak-avatar-lg: 3rem;
309
- --size-ak-avatar-xl: 4rem;
310
- --size-ak-avatar-2xl: 6rem;
311
- --size-ak-avatar-3xl: 8rem;
312
-
313
- /* Avatar initials font size */
314
- --text-ak-avatar-xs: 0.625rem;
315
- --text-ak-avatar-sm: 0.6875rem;
316
- --text-ak-avatar-md: 0.8125rem;
317
- --text-ak-avatar-lg: 1rem;
318
- --text-ak-avatar-xl: 1.25rem;
319
- --text-ak-avatar-2xl: 1.75rem;
320
- --text-ak-avatar-3xl: 2.25rem;
321
-
322
- /* Status dots */
323
- /* Status dots scale with avatar; smaller avatars keep a more
324
- subtle indicator, larger avatars match count-badge weight.
325
- Target ~28-35% of avatar size for a refined "hero" ratio. */
326
- --size-ak-status-md: 12px;
327
- --size-ak-status-lg: 14px;
328
- --size-ak-status-xl: 20px;
329
- --size-ak-status-2xl: 28px;
330
- --size-ak-status-3xl: 36px;
331
-
332
- /* Badges (count/notification) must accommodate 1-2 digit counts
333
- while keeping the circle shape. Min-width is applied via CSS. */
334
- --size-ak-badge-md: 18px;
335
- --size-ak-badge-lg: 20px;
336
- --size-ak-badge-xl: 24px;
337
- --size-ak-badge-2xl: 32px;
338
- --size-ak-badge-3xl: 40px;
339
-
340
- /* Badge border widths */
341
- --size-ak-badge-border-md: 2px;
342
- --size-ak-badge-border-lg: 2px;
343
- --size-ak-badge-border-xl: 3px;
344
- --size-ak-badge-border-2xl: 3.5px;
345
- --size-ak-badge-border-3xl: 4px;
346
-
347
- /* Icon badges (larger badge with icon inside) */
348
- --size-ak-icon-badge-md: 22px;
349
- --size-ak-icon-badge-lg: 24px;
350
- --size-ak-icon-badge-xl: 28px;
351
- --size-ak-icon-badge-2xl: 34px;
352
- --size-ak-icon-badge-3xl: 40px;
353
-
354
- /* Badge text sizes */
355
- --text-ak-badge-md: 0.625rem;
356
- --text-ak-badge-lg: 0.6875rem;
357
- --text-ak-badge-xl: 0.8125rem;
358
- --text-ak-badge-2xl: 0.9375rem;
359
- --text-ak-badge-3xl: 1.125rem;
360
-
361
- /* ── Avatar positioning offsets ──
362
- Used for absolute-positioned status dots, badges, and icon badges.
363
- Negative values pull elements inward; positive push outward. ── */
364
-
365
- /* Status dot offsets (bottom-right corner) */
366
- --offset-ak-status-md: -1px;
367
- --offset-ak-status-lg: -1px;
368
- --offset-ak-status-xl: -1px;
369
- --offset-ak-status-2xl: 2px;
370
- --offset-ak-status-3xl: 3px;
371
-
372
- /* Status ring offsets (with ring decoration) */
373
- --offset-ak-status-ring-md: -2px;
374
- --offset-ak-status-ring-lg: -2px;
375
- --offset-ak-status-ring-xl: 0px;
376
- --offset-ak-status-ring-2xl: 2px;
377
- --offset-ak-status-ring-3xl: 4px;
378
-
379
- /* Badge offsets (top-right corner) */
380
- /* Count badges are rectangular (99+ grows wider than tall) so top/right
381
- tune independently. Smaller avatars poke out at the corner; larger
382
- avatars sit flush-right and inset slightly from the top. */
383
- --offset-ak-badge-md-top: -3px; --offset-ak-badge-md-right: -3px;
384
- --offset-ak-badge-lg-top: -3px; --offset-ak-badge-lg-right: -3px;
385
- --offset-ak-badge-xl-top: -2px; --offset-ak-badge-xl-right: -2px;
386
- --offset-ak-badge-2xl-top: 2px; --offset-ak-badge-2xl-right: 0px;
387
- --offset-ak-badge-3xl-top: 5px; --offset-ak-badge-3xl-right: 0px;
388
- /* Legacy single-value token kept for backward compat (equal to -top) */
389
- --offset-ak-badge-md: -3px;
390
- --offset-ak-badge-lg: -3px;
391
- --offset-ak-badge-xl: -2px;
392
- --offset-ak-badge-2xl: 2px;
393
- --offset-ak-badge-3xl: 5px;
394
-
395
- /* Icon badge offsets (bottom-right corner) */
396
- --offset-ak-icon-badge-md: -5px;
397
- --offset-ak-icon-badge-lg: -5px;
398
- --offset-ak-icon-badge-xl: -5px;
399
- --offset-ak-icon-badge-2xl: -3px;
400
- --offset-ak-icon-badge-3xl: -1px;
401
-
402
- /* ── Content max-widths ──
403
- --container-* namespace max-w-* utility. ── */
404
- --container-ak-xs: 20rem;
405
- --container-ak-sm: 24rem;
406
- --container-ak-md: 28rem;
407
- --container-ak-lg: 32rem;
408
- --container-ak-xl: 36rem;
409
- --container-ak-2xl: 42rem;
410
- --container-ak-3xl: 48rem;
411
- --container-ak-4xl: 56rem;
412
- --container-ak-prose: 65ch;
413
-
414
- /* ── Animation ── */
415
- --duration-ak-fast: 110ms;
416
- --duration-ak-base: 150ms;
417
- --duration-ak-slow: 240ms;
418
- --duration-ak-skeleton: 1800ms;
419
- --ease-ak-default: cubic-bezier(0.4, 0, 0.2, 1);
420
- --ease-ak-in: cubic-bezier(0.4, 0, 1, 1);
421
- --ease-ak-out: cubic-bezier(0, 0, 0.2, 1);
422
- --ease-ak-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
423
- --ease-ak-bounce: cubic-bezier(0.25, 1, 0.5, 1);
424
-
425
- /* ── Z-index (Chakra-inspired scale) ── */
426
- --z-ak-base: 0;
427
- --z-ak-docked: 10;
428
- --z-ak-dropdown: 1000;
429
- --z-ak-sticky: 1100;
430
- --z-ak-banner: 1200;
431
- --z-ak-overlay: 1300;
432
- --z-ak-modal: 1400;
433
- --z-ak-popover: 1500;
434
- --z-ak-toast: 1700;
435
- --z-ak-tooltip: 1800;
436
-
437
- /* ── Control sizes (legacy --size-ak-control-* aliases) ── */
438
- --size-ak-control-sm: 2rem;
439
- --size-ak-control-md: 2.5rem;
440
- --size-ak-control-lg: 3rem;
441
-
442
- /* ── Touch target minimum ── */
443
- --size-ak-touch-min: 3rem;
444
-
445
- /* ── Focus ring style ── */
446
- --shadow-ak-focus: 0 0 0 3px rgba(0, 0, 0, 0.08);
447
- --shadow-ak-focus-primary: 0 0 0 3px rgba(0, 0, 0, 0.15);
448
- --shadow-ak-focus-danger: 0 0 0 3px rgba(220, 38, 38, 0.08);
449
- --shadow-ak-focus-success: 0 0 0 3px rgba(22, 163, 74, 0.08);
450
-
451
- /* ── Chart colors (colorblind-safe, Tableau 10 derived) ── */
452
- --color-ak-chart-1: #4e79a7;
453
- --color-ak-chart-2: #f28e2c;
454
- --color-ak-chart-3: #e15759;
455
- --color-ak-chart-4: #76b7b2;
456
- --color-ak-chart-5: #59a14f;
457
- --color-ak-chart-6: #edc949;
458
-
459
- /* ── Form input border radius ── */
460
- --radius-ak-input: 0.625rem;
461
-
462
- /* ── Sidebar widths ── */
463
- --width-ak-sidebar-collapsed: 5rem;
464
- --width-ak-sidebar-expanded: 18rem;
465
- }
466
-
467
- /* ══════════════════════════════════════════════════════════
468
- Density Modes
469
- Wrap any container with data-ak-density="compact|spacious"
470
- to override spacing and control sizes within it.
471
- Default (comfortable) uses the base tokens above.
472
- ══════════════════════════════════════════════════════════ */
473
-
474
- [data-ak-density="compact"] {
475
- --spacing-ak-1: 0.375rem; /* 6px (was 8px) */
476
- --spacing-ak-1_5: 0.5rem; /* 8px (was 12px) */
477
- --spacing-ak-2: 0.75rem; /* 12px (was 16px) */
478
- --spacing-ak-2_5: 1rem; /* 16px (was 20px) */
479
- --spacing-ak-3: 1.125rem; /* 18px (was 24px) */
480
- --height-ak-control-sm: 1.75rem; /* 28px (was 32px) */
481
- --height-ak-control-md: 2rem; /* 32px (was 40px) */
482
- --height-ak-control-lg: 2.5rem; /* 40px (was 48px) */
483
- --height-ak-row-default: 2.5rem; /* 40px (was 48px) */
484
- }
485
-
486
- [data-ak-density="spacious"] {
487
- --spacing-ak-1: 0.625rem; /* 10px (was 8px) */
488
- --spacing-ak-1_5: 1rem; /* 16px (was 12px) */
489
- --spacing-ak-2: 1.25rem; /* 20px (was 16px) */
490
- --spacing-ak-2_5: 1.5rem; /* 24px (was 20px) */
491
- --spacing-ak-3: 1.875rem; /* 30px (was 24px) */
492
- --height-ak-control-sm: 2.25rem; /* 36px (was 32px) */
493
- --height-ak-control-md: 3rem; /* 48px (was 40px) */
494
- --height-ak-control-lg: 3.5rem; /* 56px (was 48px) */
495
- --height-ak-row-default: 3.5rem; /* 56px (was 48px) */
496
- }
497
-
498
- /* ══════════════════════════════════════════════════════════
499
- Dark Mode
500
- Apply with .dark class on <html> (next-themes standard)
501
- or via @media (prefers-color-scheme: dark) — both supported.
502
- Neutral base works with any accent. For branded dark,
503
- override --color-ak-primary-* after this block.
504
- ══════════════════════════════════════════════════════════ */
505
-
506
- .dark,
507
- [data-theme="dark"] {
508
- /* ── Surfaces ── */
509
- --color-ak-neutral-0: #111113;
510
- --color-ak-neutral-50: #18191b;
511
- --color-ak-neutral-100: #1e1f21;
512
- --color-ak-neutral-200: #252628;
513
- --color-ak-neutral-300: #333436;
514
- --color-ak-neutral-400: #52525b;
515
- --color-ak-neutral-500: #71717a;
516
- --color-ak-neutral-600: #a1a1aa;
517
- --color-ak-neutral-700: #d4d4d8;
518
- --color-ak-neutral-800: #e4e4e7;
519
- --color-ak-neutral-900: #f4f4f5;
520
- --color-ak-neutral-950: #fafafa;
521
-
522
- --color-ak-bg: #111113;
523
- --color-ak-surface: #18191b;
524
- --color-ak-surface-2: #1e1f21;
525
- --color-ak-hover: rgba(255,255,255,0.04);
526
- --color-ak-active: rgba(255,255,255,0.08);
527
- --color-ak-elevated: #252628;
528
- --color-ak-surface-raised: #1e1f21;
529
- --color-ak-surface-raised-soft: rgba(255,255,255,0.04);
530
- --color-ak-surface-glass: rgba(255,255,255,0.05);
531
- --color-ak-surface-glass-strong: rgba(255,255,255,0.08);
532
- --color-ak-highlight-soft: rgba(255,255,255,0.06);
533
- --color-ak-highlight-strong: rgba(255,255,255,0.12);
534
- --color-ak-skeleton-base: #1e1f21;
535
- --color-ak-skeleton-shine: rgba(255,255,255,0.06);
536
- --color-ak-overlay: rgba(0,0,0,0.7);
537
- --color-ak-on-primary: #111113;
538
- --color-ak-primary-subtle: rgba(129, 140, 248, 0.15);
539
-
540
- /* ── Text ── */
541
- --color-ak-text: #f4f4f5;
542
- --color-ak-text-secondary: #a1a1aa;
543
- --color-ak-text-muted: #71717a;
544
- --color-ak-text-disabled: #52525b;
545
- --color-ak-text-inverse: #111113;
546
- --color-ak-text-link: #818cf8;
547
- --color-ak-text-placeholder:#a1a1aa;
548
-
549
- /* ── Borders (alpha — adapts to any surface) ── */
550
- --color-ak-border: rgba(255, 255, 255, 0.10);
551
- --color-ak-border-subtle: rgba(255, 255, 255, 0.06);
552
- --color-ak-border-strong: rgba(255, 255, 255, 0.16);
553
- --color-ak-border-focus: #ffffff;
554
-
555
- /* ── Primary (lightened for contrast on dark bg) ── */
556
- --color-ak-primary: #818cf8;
557
- --color-ak-primary-hover: #a5b4fc;
558
- --color-ak-primary-active: #6366f1;
559
-
560
- --color-ak-primary-50: rgba(129, 140, 248, 0.06);
561
- --color-ak-primary-100: rgba(129, 140, 248, 0.10);
562
- --color-ak-primary-200: rgba(129, 140, 248, 0.16);
563
- --color-ak-primary-300: rgba(129, 140, 248, 0.24);
564
- --color-ak-primary-400: #6366f1;
565
- --color-ak-primary-500: #818cf8;
566
- --color-ak-primary-600: #a5b4fc;
567
- --color-ak-primary-700: #c7d2fe;
568
- --color-ak-primary-800: #e0e7ff;
569
- --color-ak-primary-900: #eef2ff;
570
- --color-ak-primary-950: #f5f7ff;
571
-
572
- /* ── Status (lighter for dark bg readability) ── */
573
- --color-ak-success: #4ade80;
574
- --color-ak-success-subtle: rgba(34, 197, 94, 0.12);
575
- --color-ak-success-text: #4ade80;
576
- --color-ak-warning: #fbbf24;
577
- --color-ak-warning-subtle: rgba(251, 191, 36, 0.12);
578
- --color-ak-warning-text: #fbbf24;
579
- --color-ak-danger: #f87171;
580
- --color-ak-danger-subtle: rgba(248, 113, 113, 0.12);
581
- --color-ak-danger-text: #f87171;
582
- --color-ak-info: #60a5fa;
583
- --color-ak-info-subtle: rgba(96, 165, 250, 0.12);
584
- --color-ak-info-text: #60a5fa;
585
-
586
- /* ── Shadows (mostly invisible on dark — reduce or remove) ── */
587
- --shadow-ak-xs: none;
588
- --shadow-ak-sm: none;
589
- --shadow-ak-md: 0 4px 12px rgba(0,0,0,0.3);
590
- --shadow-ak-lg: 0 8px 30px rgba(0,0,0,0.4);
591
- --shadow-ak-xl: 0 16px 50px rgba(0,0,0,0.5);
592
- --shadow-ak-2xl: 0 24px 60px rgba(0,0,0,0.6);
593
-
594
- /* ── Focus rings (solid for AAA 2.4.13 compliance) ── */
595
- --color-ak-border-focus: #ffffff;
596
- --shadow-ak-focus: 0 0 0 3px rgba(255, 255, 255, 0.20);
597
- --shadow-ak-focus-primary: 0 0 0 3px rgba(129, 140, 248, 0.30);
598
- --shadow-ak-focus-danger: 0 0 0 3px rgba(248, 113, 113, 0.25);
599
- --shadow-ak-focus-success: 0 0 0 3px rgba(74, 222, 128, 0.25);
600
-
601
- /* ── Neobrutalist (dark mode — everything flips) ── */
602
- --color-ak-brutal-ink: #ffffff;
603
- --color-ak-brutal-face: #0a0a0a;
604
- --color-ak-brutal-face-dark: #e5e5e5;
605
- --color-ak-brutal-on-face: #ffffff;
606
- --color-ak-brutal-on-face-dark: #000000;
607
-
608
- /* ── Sheet handle ── */
609
- --color-ak-sheet-handle: #52525b;
610
- }
1
+ :root {
2
+ /* ══════════════════════════════════════════════════════════
3
+ AstralKit Design Tokens Tailwind v3 (default)
4
+
5
+ This is the default theme file, imported via `astralkit/theme`.
6
+ Tailwind v4 users opt in via `astralkit/theme-v4` (an
7
+ @theme-directive-based file at astralkit-theme-v4.css).
8
+
9
+ This file uses :root CSS variables because Tailwind v3
10
+ doesn't support the v4 @theme directive.
11
+
12
+ Default palette: black & white neutral.
13
+ Override any variable in your own :root block to brand it.
14
+ ══════════════════════════════════════════════════════════ */
15
+
16
+ /* ── Neutral scale (full 11-shade ramp) ── */
17
+ --color-ak-neutral-0: #ffffff;
18
+ --color-ak-neutral-50: #fafafa;
19
+ --color-ak-neutral-100: #f5f5f5;
20
+ --color-ak-neutral-200: #e5e5e5;
21
+ --color-ak-neutral-300: #d4d4d4;
22
+ --color-ak-neutral-400: #a3a3a3;
23
+ --color-ak-neutral-500: #737373;
24
+ --color-ak-neutral-600: #525252;
25
+ --color-ak-neutral-700: #404040;
26
+ --color-ak-neutral-800: #262626;
27
+ --color-ak-neutral-900: #171717;
28
+ --color-ak-neutral-950: #0a0a0a;
29
+
30
+ /* ── Primary scale (full 11-shade ramp) ── */
31
+ --color-ak-primary-50: #f5f5f5;
32
+ --color-ak-primary-100: #e5e5e5;
33
+ --color-ak-primary-200: #cccccc;
34
+ --color-ak-primary-300: #a3a3a3;
35
+ --color-ak-primary-400: #737373;
36
+ --color-ak-primary-500: #525252;
37
+ --color-ak-primary-600: #404040;
38
+ --color-ak-primary-700: #333333;
39
+ --color-ak-primary-800: #1a1a1a;
40
+ --color-ak-primary-900: #000000;
41
+ --color-ak-primary-950: #000000;
42
+
43
+ /* ── Primary action colors ── */
44
+ --color-ak-primary: #000000;
45
+ --color-ak-primary-hover: #1a1a1a;
46
+ --color-ak-primary-active: #333333;
47
+
48
+ /* ── Semantic color aliases ── */
49
+ --color-ak-bg: #ffffff;
50
+ --color-ak-surface: #fafafa;
51
+ --color-ak-surface-2: #f5f5f5;
52
+ --color-ak-hover: #f7f7f7;
53
+ --color-ak-active: #f0f0f0;
54
+ --color-ak-elevated: #ffffff;
55
+ --color-ak-surface-raised: #ffffff;
56
+ --color-ak-surface-raised-soft: rgba(255, 255, 255, 0.78);
57
+ --color-ak-surface-glass: rgba(255, 255, 255, 0.72);
58
+ --color-ak-surface-glass-strong: rgba(255, 255, 255, 0.84);
59
+ --color-ak-highlight-soft: rgba(255, 255, 255, 0.45);
60
+ --color-ak-highlight-strong: rgba(255, 255, 255, 0.72);
61
+ --color-ak-skeleton-base: #ededed;
62
+ --color-ak-skeleton-shine: rgba(255, 255, 255, 0.72);
63
+ --color-ak-overlay: rgba(0, 0, 0, 0.5);
64
+ --color-ak-on-primary: #ffffff;
65
+ --color-ak-primary-subtle: #f5f5f5;
66
+
67
+ /* ── Semantic text ── */
68
+ --color-ak-text: #171717;
69
+ --color-ak-text-secondary: #525252;
70
+ --color-ak-text-muted: #a3a3a3;
71
+ --color-ak-text-disabled: #d4d4d4;
72
+ --color-ak-text-inverse: #ffffff;
73
+ --color-ak-text-link: #000000;
74
+ --color-ak-text-placeholder:#525252;
75
+
76
+ /* ── Semantic border ── */
77
+ --color-ak-border: #dee2e6;
78
+ --color-ak-border-subtle: #e5e5e5;
79
+ --color-ak-border-strong: #525252;
80
+ --color-ak-border-focus: #000000;
81
+
82
+ /* ── Status colors ── */
83
+ --color-ak-success: #16a34a;
84
+ --color-ak-success-subtle: #f0fdf4;
85
+ --color-ak-success-text: #15803d;
86
+ --color-ak-warning: #d97706;
87
+ --color-ak-warning-subtle: #fffbeb;
88
+ --color-ak-warning-text: #b45309;
89
+ --color-ak-danger: #dc2626;
90
+ --color-ak-danger-subtle: #fef2f2;
91
+ --color-ak-danger-text: #b91c1c;
92
+ --color-ak-info: #2563eb;
93
+ --color-ak-info-subtle: #eff6ff;
94
+ --color-ak-pink: #db2777;
95
+ --color-ak-pink-subtle: #fdf2f8;
96
+ --color-ak-info-text: #1d4ed8;
97
+
98
+ /* ── Font families ── */
99
+ --font-ak-sans: 'DM Sans', system-ui, -apple-system, sans-serif;
100
+ --font-ak-serif: 'DM Serif Display', Georgia, serif;
101
+ --font-ak-mono: 'JetBrains Mono', 'Fira Code', ui-monospace, monospace;
102
+
103
+ /* ── Type scale (static) ── */
104
+ --text-ak-2xs: 0.6875rem;
105
+ --text-ak-xs: 0.75rem;
106
+ --text-ak-sm: 0.875rem;
107
+ --text-ak-base: 1rem;
108
+ --text-ak-lg: 1.125rem;
109
+ --text-ak-xl: 1.25rem;
110
+ --text-ak-2xl: 1.5rem;
111
+ --text-ak-3xl: 2rem;
112
+ --text-ak-4xl: 2.5rem;
113
+ --text-ak-5xl: 3rem;
114
+ --text-ak-6xl: 3.75rem;
115
+ --text-ak-7xl: 4.5rem;
116
+ --text-ak-8xl: 6rem;
117
+ --text-ak-9xl: 7rem;
118
+
119
+ /* ── Fluid type scale (viewport: 320px → 1400px) ──
120
+ One class, zero breakpoints. Use text-ak-fl-* instead of text-ak-*.
121
+ MAX of each step = the matching static token (e.g. fl-lg max = text-ak-lg).
122
+ MIN = one static step down, giving subtle mobile shrink.
123
+ WCAG SC 1.4.4 compliant: max ≤ 2.5× min on all steps. ── */
124
+ --text-ak-fl-xs: clamp(0.6875rem, 0.67rem + 0.06vw, 0.75rem);
125
+ --text-ak-fl-sm: clamp(0.75rem, 0.71rem + 0.12vw, 0.875rem);
126
+ --text-ak-fl-base: clamp(0.875rem, 0.84rem + 0.12vw, 1rem);
127
+ --text-ak-fl-lg: clamp(1rem, 0.96rem + 0.12vw, 1.125rem);
128
+ --text-ak-fl-xl: clamp(1.125rem, 1.09rem + 0.12vw, 1.25rem);
129
+ --text-ak-fl-2xl: clamp(1.25rem, 1.18rem + 0.23vw, 1.5rem);
130
+ --text-ak-fl-3xl: clamp(1.5rem, 1.39rem + 0.35vw, 1.875rem);
131
+ --text-ak-fl-4xl: clamp(1.875rem, 1.76rem + 0.35vw, 2.25rem);
132
+ --text-ak-fl-5xl: clamp(2.25rem, 2.03rem + 0.69vw, 3rem);
133
+ --text-ak-fl-6xl: clamp(3rem, 2.78rem + 0.69vw, 3.75rem);
134
+ --text-ak-fl-7xl: clamp(3.5rem, 3.2rem + 0.93vw, 4.5rem);
135
+ --text-ak-fl-8xl: clamp(4.5rem, 4.06rem + 1.39vw, 6rem);
136
+ --text-ak-fl-9xl: clamp(5.25rem, 4.73rem + 1.62vw, 7rem);
137
+
138
+ /* ── Display type scale (viewport: 320px 1400px) ──
139
+ Dramatic fluid scaling for hero headings and marketing display text.
140
+ Each step grows ~1.5–2 static steps across the viewport range.
141
+ Use text-ak-display-* for hero h1, section display headings, etc. ── */
142
+ --text-ak-display-xs: clamp(0.75rem, 0.7rem + 0.15vw, 0.875rem);
143
+ --text-ak-display-sm: clamp(0.875rem, 0.83rem + 0.19vw, 1rem);
144
+ --text-ak-display-base: clamp(1rem, 0.94rem + 0.28vw, 1.1875rem);
145
+ --text-ak-display-lg: clamp(1.125rem, 1.01rem + 0.52vw, 1.5rem);
146
+ --text-ak-display-xl: clamp(1.25rem, 1.07rem + 0.83vw, 1.875rem);
147
+ --text-ak-display-2xl: clamp(1.5rem, 1.2rem + 1.11vw, 2.25rem);
148
+ --text-ak-display-3xl: clamp(1.875rem, 1.42rem + 1.67vw, 3rem);
149
+ --text-ak-display-4xl: clamp(2.25rem, 1.58rem + 2.5vw, 3.75rem);
150
+ --text-ak-display-5xl: clamp(3rem, 2.07rem + 3.47vw, 5.25rem);
151
+ --text-ak-display-6xl: clamp(3.75rem, 2.5rem + 4.63vw, 7rem);
152
+ --text-ak-display-7xl: clamp(4.5rem, 3.06rem + 5.56vw, 8rem);
153
+ --text-ak-display-8xl: clamp(5rem, 3.06rem + 6.94vw, 9rem);
154
+ --text-ak-display-9xl: clamp(5.5rem, 3.06rem + 7.64vw, 10rem);
155
+
156
+ /* ── Line Height ── */
157
+ --leading-ak-display: 0.85;
158
+ --leading-ak-tighter: 1.1;
159
+ --leading-ak-none: 1;
160
+ --leading-ak-tight: 1.25;
161
+ --leading-ak-snug: 1.375;
162
+ --leading-ak-normal: 1.5;
163
+ --leading-ak-relaxed: 1.625;
164
+ --leading-ak-prose: 1.75;
165
+ --leading-ak-loose: 2;
166
+
167
+ /* ── Letter Spacing ── */
168
+ --tracking-ak-tighter: -0.05em;
169
+ --tracking-ak-tight: -0.025em;
170
+ --tracking-ak-subtle: -0.01em;
171
+ --tracking-ak-normal: 0em;
172
+ --tracking-ak-wide: 0.025em;
173
+ --tracking-ak-section: 0.08em;
174
+ --tracking-ak-wider: 0.05em;
175
+ --tracking-ak-widest: 0.1em;
176
+
177
+ /* ── Spacing ── */
178
+ --spacing-ak-0: 0rem;
179
+ --spacing-ak-px: 0.0625rem;
180
+ --spacing-ak-0_5: 0.25rem;
181
+ --spacing-ak-1: 0.5rem;
182
+ --spacing-ak-1_5: 0.75rem;
183
+ --spacing-ak-2: 1rem;
184
+ --spacing-ak-2_5: 1.25rem;
185
+ --spacing-ak-3: 1.5rem;
186
+ --spacing-ak-3_5: 1.75rem;
187
+ --spacing-ak-4: 2rem;
188
+ --spacing-ak-4_5: 2.25rem;
189
+ --spacing-ak-5: 2.5rem;
190
+ --spacing-ak-5_5: 2.75rem;
191
+ --spacing-ak-6: 3rem;
192
+ --spacing-ak-7: 3.5rem;
193
+ --spacing-ak-8: 4rem;
194
+ --spacing-ak-9: 4.5rem;
195
+ --spacing-ak-10: 5rem;
196
+ --spacing-ak-11: 5.5rem;
197
+ --spacing-ak-12: 6rem;
198
+ --spacing-ak-14: 7rem;
199
+ --spacing-ak-16: 8rem;
200
+ --spacing-ak-20: 10rem;
201
+ --spacing-ak-24: 12rem;
202
+ --spacing-ak-mobile-bar: 4.5rem;
203
+ --size-ak-sheet-handle-width: 2.25rem;
204
+ --size-ak-sheet-handle-height: 0.25rem;
205
+ --color-ak-sheet-handle: #d4d4d4;
206
+
207
+ /* ── Layout sizes ──
208
+ Uses Tailwind v4 native namespaces so they generate real utilities:
209
+ --container-* max-w-*
210
+ --height-* → h-*
211
+ --width-* → w-* */
212
+ --container-ak-page: 80rem;
213
+ --height-ak-nav: 4.5rem;
214
+ --height-ak-touch: 2.5rem;
215
+ --width-ak-touch: 2.5rem;
216
+
217
+ /* ── Control heights (buttons, inputs, selects) ──
218
+ 48px (md) is the standard minimum for all interactive controls.
219
+ Use h-ak-control-md, min-h-ak-control-md, etc. ── */
220
+ --height-ak-control-sm: 2rem; /* 32px — compact desktop-only */
221
+ --height-ak-control-md: 2.5rem; /* 40px — STANDARD */
222
+ --height-ak-control-lg: 3rem; /* 48px prominent CTAs */
223
+ --height-ak-control-xl: 3.5rem; /* 56px hero CTAs */
224
+
225
+ /* ── Table row heights ── */
226
+ --height-ak-row-compact: 2.5rem; /* 40px */
227
+ --height-ak-row-default: 3rem; /* 48px */
228
+ --height-ak-row-comfortable: 3.25rem; /* 52px */
229
+
230
+ /* ── Fluid page margin (16px mobile 80px desktop) ── */
231
+ --spacing-ak-fl-page-margin: clamp(1rem, 0.26rem + 3.7vw, 5rem);
232
+
233
+ /* ── Fluid spacing (viewport: 320px 1400px) ──
234
+ Scales smoothly. Use p-ak-fl-*, gap-ak-fl-*, m-ak-fl-*, etc.
235
+ Named sizes (xs 3xl) for intuitive selection. ── */
236
+ --spacing-ak-fl-3xs: clamp(0.25rem, 0.21rem + 0.14vw, 0.375rem);
237
+ --spacing-ak-fl-2xs: clamp(0.5rem, 0.43rem + 0.28vw, 0.75rem);
238
+ --spacing-ak-fl-xs: clamp(0.75rem, 0.65rem + 0.42vw, 1rem);
239
+ --spacing-ak-fl-sm: clamp(1rem, 0.86rem + 0.56vw, 1.5rem);
240
+ --spacing-ak-fl-md: clamp(1.5rem, 1.29rem + 0.83vw, 2rem);
241
+ --spacing-ak-fl-lg: clamp(2rem, 1.72rem + 1.11vw, 3rem);
242
+ --spacing-ak-fl-xl: clamp(3rem, 2.5rem + 1.85vw, 4.5rem);
243
+ --spacing-ak-fl-2xl: clamp(4rem, 3.22rem + 2.78vw, 6rem);
244
+ --spacing-ak-fl-3xl: clamp(6rem, 4.86rem + 4.17vw, 9rem);
245
+
246
+ /* ── Fluid space pairs (dramatic scaling for sections) ──
247
+ "xs-lg" = starts at xs on mobile, reaches lg on desktop.
248
+ Perfect for section padding, hero spacing, large gaps. ── */
249
+ --spacing-ak-fl-xs-md: clamp(0.75rem, 0.43rem + 1.39vw, 2rem);
250
+ --spacing-ak-fl-xs-lg: clamp(0.75rem, 0.14rem + 2.78vw, 3rem);
251
+ --spacing-ak-fl-sm-lg: clamp(1rem, 0.43rem + 2.78vw, 3rem);
252
+ --spacing-ak-fl-sm-xl: clamp(1rem, 0rem + 4.17vw, 4.5rem);
253
+ --spacing-ak-fl-md-xl: clamp(1.5rem, 0.57rem + 3.47vw, 4.5rem);
254
+ --spacing-ak-fl-md-2xl: clamp(1.5rem, 0rem + 5.56vw, 6rem);
255
+ --spacing-ak-fl-lg-2xl: clamp(2rem, 0.57rem + 5.56vw, 6rem);
256
+ --spacing-ak-fl-xl-3xl: clamp(3rem, 0.57rem + 8.33vw, 9rem);
257
+
258
+ /* ── Border Radius ── */
259
+ --radius-ak-xs: 0.125rem;
260
+ --radius-ak-none: 0;
261
+ --radius-ak-sm: 0.25rem;
262
+ --radius-ak-md: 0.5rem;
263
+ --radius-ak-lg: 0.75rem;
264
+ --radius-ak-xl: 1rem;
265
+ --radius-ak-2xl: 1.5rem;
266
+ --radius-ak-3xl: 2rem;
267
+ --radius-ak-full: 9999px;
268
+
269
+ /* ── Shadows ── */
270
+ --shadow-ak-xs: 0 1px 2px rgba(0,0,0,0.04);
271
+ --shadow-ak-sm: 0 1px 3px rgba(0,0,0,0.06), 0 1px 2px rgba(0,0,0,0.04);
272
+ --shadow-ak-md: 0 4px 12px rgba(0,0,0,0.06), 0 2px 4px rgba(0,0,0,0.04);
273
+ --shadow-ak-lg: 0 8px 30px rgba(0,0,0,0.08), 0 4px 8px rgba(0,0,0,0.04);
274
+ --shadow-ak-xl: 0 16px 50px rgba(0,0,0,0.1), 0 8px 16px rgba(0,0,0,0.05);
275
+ --shadow-ak-2xl: 0 24px 60px rgba(0,0,0,0.14);
276
+
277
+ /* ── Neobrutalist ──
278
+ B&W brutalism toolkit. The core rule: face color is NEVER the same
279
+ as shadow/ink color. This prevents "invisible shadow" bugs where a
280
+ black button on a black shadow disappears. */
281
+ --color-ak-brutal-ink: #000000;
282
+ --color-ak-brutal-face: #ffffff;
283
+ --color-ak-brutal-face-dark: #262626;
284
+ --color-ak-brutal-on-face: #000000;
285
+ --color-ak-brutal-on-face-dark: #ffffff;
286
+ --shadow-ak-brutal-xs: 2px 2px 0 0 var(--color-ak-brutal-ink);
287
+ --shadow-ak-brutal-sm: 3px 3px 0 0 var(--color-ak-brutal-ink);
288
+ --shadow-ak-brutal: 4px 4px 0 0 var(--color-ak-brutal-ink);
289
+ --shadow-ak-brutal-lg: 6px 6px 0 0 var(--color-ak-brutal-ink);
290
+ --shadow-ak-brutal-xl: 8px 8px 0 0 var(--color-ak-brutal-ink);
291
+ --border-ak-brutal: 2px;
292
+ --border-ak-brutal-lg: 3px;
293
+ --radius-ak-brutal: 0.5rem;
294
+ --radius-ak-brutal-sm: 0.25rem;
295
+
296
+ /* ── Component sizes ──
297
+ --size-* namespace → size-* utility (sets both width AND height).
298
+ Use: size-ak-icon-lg, size-ak-avatar-md, etc. ── */
299
+
300
+ /* Icons (for SVG w/h — also used by .ak-icon-* for font-size) */
301
+ --size-ak-icon-xs: 0.75rem;
302
+ --size-ak-icon-sm: 1rem;
303
+ --size-ak-icon-md: 1.25rem;
304
+ --size-ak-icon-lg: 1.5rem;
305
+ --size-ak-icon-xl: 1.75rem;
306
+ --size-ak-icon-2xl: 2rem;
307
+ --size-ak-icon-3xl: 3rem;
308
+
309
+ /* Panel width (sidebar flyout panels) */
310
+ --size-ak-panel-width: 260px;
311
+
312
+ /* Avatars */
313
+ --size-ak-avatar-xs: 1.5rem;
314
+ --size-ak-avatar-sm: 2rem;
315
+ --size-ak-avatar-md: 2.5rem;
316
+ --size-ak-avatar-lg: 3rem;
317
+ --size-ak-avatar-xl: 4rem;
318
+ --size-ak-avatar-2xl: 6rem;
319
+ --size-ak-avatar-3xl: 8rem;
320
+
321
+ /* Avatar initials font size */
322
+ --text-ak-avatar-xs: 0.625rem;
323
+ --text-ak-avatar-sm: 0.6875rem;
324
+ --text-ak-avatar-md: 0.8125rem;
325
+ --text-ak-avatar-lg: 1rem;
326
+ --text-ak-avatar-xl: 1.25rem;
327
+ --text-ak-avatar-2xl: 1.75rem;
328
+ --text-ak-avatar-3xl: 2.25rem;
329
+
330
+ /* Status dots */
331
+ /* Status dots scale with avatar; smaller avatars keep a more
332
+ subtle indicator, larger avatars match count-badge weight.
333
+ Target ~28-35% of avatar size for a refined "hero" ratio. */
334
+ --size-ak-status-md: 12px;
335
+ --size-ak-status-lg: 14px;
336
+ --size-ak-status-xl: 20px;
337
+ --size-ak-status-2xl: 28px;
338
+ --size-ak-status-3xl: 36px;
339
+
340
+ /* Badges (count/notification) must accommodate 1-2 digit counts
341
+ while keeping the circle shape. Min-width is applied via CSS. */
342
+ --size-ak-badge-md: 18px;
343
+ --size-ak-badge-lg: 20px;
344
+ --size-ak-badge-xl: 24px;
345
+ --size-ak-badge-2xl: 32px;
346
+ --size-ak-badge-3xl: 40px;
347
+
348
+ /* Badge border widths */
349
+ --size-ak-badge-border-md: 2px;
350
+ --size-ak-badge-border-lg: 2px;
351
+ --size-ak-badge-border-xl: 3px;
352
+ --size-ak-badge-border-2xl: 3.5px;
353
+ --size-ak-badge-border-3xl: 4px;
354
+
355
+ /* Icon badges (larger badge with icon inside) */
356
+ --size-ak-icon-badge-md: 22px;
357
+ --size-ak-icon-badge-lg: 24px;
358
+ --size-ak-icon-badge-xl: 28px;
359
+ --size-ak-icon-badge-2xl: 34px;
360
+ --size-ak-icon-badge-3xl: 40px;
361
+
362
+ /* Badge text sizes */
363
+ --text-ak-badge-md: 0.625rem;
364
+ --text-ak-badge-lg: 0.6875rem;
365
+ --text-ak-badge-xl: 0.8125rem;
366
+ --text-ak-badge-2xl: 0.9375rem;
367
+ --text-ak-badge-3xl: 1.125rem;
368
+
369
+ /* ── Avatar positioning offsets ──
370
+ Used for absolute-positioned status dots, badges, and icon badges.
371
+ Negative values pull elements inward; positive push outward. ── */
372
+
373
+ /* Status dot offsets (bottom-right corner) */
374
+ --offset-ak-status-md: -1px;
375
+ --offset-ak-status-lg: -1px;
376
+ --offset-ak-status-xl: -1px;
377
+ --offset-ak-status-2xl: 2px;
378
+ --offset-ak-status-3xl: 3px;
379
+
380
+ /* Status ring offsets (with ring decoration) */
381
+ --offset-ak-status-ring-md: -2px;
382
+ --offset-ak-status-ring-lg: -2px;
383
+ --offset-ak-status-ring-xl: 0px;
384
+ --offset-ak-status-ring-2xl: 2px;
385
+ --offset-ak-status-ring-3xl: 4px;
386
+
387
+ /* Badge offsets (top-right corner) */
388
+ /* Count badges are rectangular (99+ grows wider than tall) so top/right
389
+ tune independently. Smaller avatars poke out at the corner; larger
390
+ avatars sit flush-right and inset slightly from the top. */
391
+ --offset-ak-badge-md-top: -3px; --offset-ak-badge-md-right: -3px;
392
+ --offset-ak-badge-lg-top: -3px; --offset-ak-badge-lg-right: -3px;
393
+ --offset-ak-badge-xl-top: -2px; --offset-ak-badge-xl-right: -2px;
394
+ --offset-ak-badge-2xl-top: 2px; --offset-ak-badge-2xl-right: 0px;
395
+ --offset-ak-badge-3xl-top: 5px; --offset-ak-badge-3xl-right: 0px;
396
+ /* Legacy single-value token kept for backward compat (equal to -top) */
397
+ --offset-ak-badge-md: -3px;
398
+ --offset-ak-badge-lg: -3px;
399
+ --offset-ak-badge-xl: -2px;
400
+ --offset-ak-badge-2xl: 2px;
401
+ --offset-ak-badge-3xl: 5px;
402
+
403
+ /* Icon badge offsets (bottom-right corner) */
404
+ --offset-ak-icon-badge-md: -5px;
405
+ --offset-ak-icon-badge-lg: -5px;
406
+ --offset-ak-icon-badge-xl: -5px;
407
+ --offset-ak-icon-badge-2xl: -3px;
408
+ --offset-ak-icon-badge-3xl: -1px;
409
+
410
+ /* ── Content max-widths ──
411
+ --container-* namespace → max-w-* utility. ── */
412
+ --container-ak-xs: 20rem;
413
+ --container-ak-sm: 24rem;
414
+ --container-ak-md: 28rem;
415
+ --container-ak-lg: 32rem;
416
+ --container-ak-xl: 36rem;
417
+ --container-ak-2xl: 42rem;
418
+ --container-ak-3xl: 48rem;
419
+ --container-ak-4xl: 56rem;
420
+ --container-ak-prose: 65ch;
421
+
422
+ /* ── Animation ── */
423
+ --duration-ak-fast: 110ms;
424
+ --duration-ak-base: 150ms;
425
+ --duration-ak-slow: 240ms;
426
+ --duration-ak-skeleton: 1800ms;
427
+ --ease-ak-default: cubic-bezier(0.4, 0, 0.2, 1);
428
+ --ease-ak-in: cubic-bezier(0.4, 0, 1, 1);
429
+ --ease-ak-out: cubic-bezier(0, 0, 0.2, 1);
430
+ --ease-ak-spring: cubic-bezier(0.34, 1.56, 0.64, 1);
431
+ --ease-ak-bounce: cubic-bezier(0.25, 1, 0.5, 1);
432
+
433
+ /* ── Z-index (Chakra-inspired scale) ── */
434
+ --z-ak-base: 0;
435
+ --z-ak-docked: 10;
436
+ --z-ak-dropdown: 1000;
437
+ --z-ak-sticky: 1100;
438
+ --z-ak-banner: 1200;
439
+ --z-ak-overlay: 1300;
440
+ --z-ak-modal: 1400;
441
+ --z-ak-popover: 1500;
442
+ --z-ak-toast: 1700;
443
+ --z-ak-tooltip: 1800;
444
+
445
+ /* ── Control sizes (legacy --size-ak-control-* aliases) ── */
446
+ --size-ak-control-sm: 2rem;
447
+ --size-ak-control-md: 2.5rem;
448
+ --size-ak-control-lg: 3rem;
449
+
450
+ /* ── Touch target minimum ── */
451
+ --size-ak-touch-min: 3rem;
452
+
453
+ /* ── Focus ring style ── */
454
+ --shadow-ak-focus: 0 0 0 3px rgba(0, 0, 0, 0.08);
455
+ --shadow-ak-focus-primary: 0 0 0 3px rgba(0, 0, 0, 0.15);
456
+ --shadow-ak-focus-danger: 0 0 0 3px rgba(220, 38, 38, 0.08);
457
+ --shadow-ak-focus-success: 0 0 0 3px rgba(22, 163, 74, 0.08);
458
+
459
+ /* ── Chart colors (colorblind-safe, Tableau 10 derived) ── */
460
+ --color-ak-chart-1: #4e79a7;
461
+ --color-ak-chart-2: #f28e2c;
462
+ --color-ak-chart-3: #e15759;
463
+ --color-ak-chart-4: #76b7b2;
464
+ --color-ak-chart-5: #59a14f;
465
+ --color-ak-chart-6: #edc949;
466
+
467
+ /* ── Form input border radius ── */
468
+ --radius-ak-input: 0.625rem;
469
+
470
+ /* ── Sidebar widths ── */
471
+ --width-ak-sidebar-collapsed: 5rem;
472
+ --width-ak-sidebar-expanded: 18rem;
473
+ }
474
+
475
+ /* ══════════════════════════════════════════════════════════
476
+ Density Modes
477
+ Wrap any container with data-ak-density="compact|spacious"
478
+ to override spacing and control sizes within it.
479
+ Default (comfortable) uses the base tokens above.
480
+ ══════════════════════════════════════════════════════════ */
481
+
482
+ [data-ak-density="compact"] {
483
+ --spacing-ak-1: 0.375rem; /* 6px (was 8px) */
484
+ --spacing-ak-1_5: 0.5rem; /* 8px (was 12px) */
485
+ --spacing-ak-2: 0.75rem; /* 12px (was 16px) */
486
+ --spacing-ak-2_5: 1rem; /* 16px (was 20px) */
487
+ --spacing-ak-3: 1.125rem; /* 18px (was 24px) */
488
+ --height-ak-control-sm: 1.75rem; /* 28px (was 32px) */
489
+ --height-ak-control-md: 2rem; /* 32px (was 40px) */
490
+ --height-ak-control-lg: 2.5rem; /* 40px (was 48px) */
491
+ --height-ak-row-default: 2.5rem; /* 40px (was 48px) */
492
+ }
493
+
494
+ [data-ak-density="spacious"] {
495
+ --spacing-ak-1: 0.625rem; /* 10px (was 8px) */
496
+ --spacing-ak-1_5: 1rem; /* 16px (was 12px) */
497
+ --spacing-ak-2: 1.25rem; /* 20px (was 16px) */
498
+ --spacing-ak-2_5: 1.5rem; /* 24px (was 20px) */
499
+ --spacing-ak-3: 1.875rem; /* 30px (was 24px) */
500
+ --height-ak-control-sm: 2.25rem; /* 36px (was 32px) */
501
+ --height-ak-control-md: 3rem; /* 48px (was 40px) */
502
+ --height-ak-control-lg: 3.5rem; /* 56px (was 48px) */
503
+ --height-ak-row-default: 3.5rem; /* 56px (was 48px) */
504
+ }
505
+
506
+ /* ══════════════════════════════════════════════════════════
507
+ Dark Mode
508
+ Apply with .dark class on <html> (next-themes standard)
509
+ or via @media (prefers-color-scheme: dark) — both supported.
510
+ Neutral base — works with any accent. For branded dark,
511
+ override --color-ak-primary-* after this block.
512
+ ══════════════════════════════════════════════════════════ */
513
+
514
+ .dark,
515
+ [data-theme="dark"] {
516
+ /* ── Surfaces ── */
517
+ --color-ak-neutral-0: #111113;
518
+ --color-ak-neutral-50: #18191b;
519
+ --color-ak-neutral-100: #1e1f21;
520
+ --color-ak-neutral-200: #252628;
521
+ --color-ak-neutral-300: #333436;
522
+ --color-ak-neutral-400: #52525b;
523
+ --color-ak-neutral-500: #71717a;
524
+ --color-ak-neutral-600: #a1a1aa;
525
+ --color-ak-neutral-700: #d4d4d8;
526
+ --color-ak-neutral-800: #e4e4e7;
527
+ --color-ak-neutral-900: #f4f4f5;
528
+ --color-ak-neutral-950: #fafafa;
529
+
530
+ --color-ak-bg: #111113;
531
+ --color-ak-surface: #18191b;
532
+ --color-ak-surface-2: #1e1f21;
533
+ --color-ak-hover: rgba(255,255,255,0.04);
534
+ --color-ak-active: rgba(255,255,255,0.08);
535
+ --color-ak-elevated: #252628;
536
+ --color-ak-surface-raised: #1e1f21;
537
+ --color-ak-surface-raised-soft: rgba(255,255,255,0.04);
538
+ --color-ak-surface-glass: rgba(255,255,255,0.05);
539
+ --color-ak-surface-glass-strong: rgba(255,255,255,0.08);
540
+ --color-ak-highlight-soft: rgba(255,255,255,0.06);
541
+ --color-ak-highlight-strong: rgba(255,255,255,0.12);
542
+ --color-ak-skeleton-base: #1e1f21;
543
+ --color-ak-skeleton-shine: rgba(255,255,255,0.06);
544
+ --color-ak-overlay: rgba(0,0,0,0.7);
545
+ --color-ak-on-primary: #111113;
546
+ --color-ak-primary-subtle: rgba(129, 140, 248, 0.15);
547
+
548
+ /* ── Text ── */
549
+ --color-ak-text: #f4f4f5;
550
+ --color-ak-text-secondary: #a1a1aa;
551
+ --color-ak-text-muted: #71717a;
552
+ --color-ak-text-disabled: #52525b;
553
+ --color-ak-text-inverse: #111113;
554
+ --color-ak-text-link: #818cf8;
555
+ --color-ak-text-placeholder:#a1a1aa;
556
+
557
+ /* ── Borders (alpha — adapts to any surface) ── */
558
+ --color-ak-border: rgba(255, 255, 255, 0.10);
559
+ --color-ak-border-subtle: rgba(255, 255, 255, 0.06);
560
+ --color-ak-border-strong: rgba(255, 255, 255, 0.16);
561
+ --color-ak-border-focus: #ffffff;
562
+
563
+ /* ── Primary (lightened for contrast on dark bg) ── */
564
+ --color-ak-primary: #818cf8;
565
+ --color-ak-primary-hover: #a5b4fc;
566
+ --color-ak-primary-active: #6366f1;
567
+
568
+ --color-ak-primary-50: rgba(129, 140, 248, 0.06);
569
+ --color-ak-primary-100: rgba(129, 140, 248, 0.10);
570
+ --color-ak-primary-200: rgba(129, 140, 248, 0.16);
571
+ --color-ak-primary-300: rgba(129, 140, 248, 0.24);
572
+ --color-ak-primary-400: #6366f1;
573
+ --color-ak-primary-500: #818cf8;
574
+ --color-ak-primary-600: #a5b4fc;
575
+ --color-ak-primary-700: #c7d2fe;
576
+ --color-ak-primary-800: #e0e7ff;
577
+ --color-ak-primary-900: #eef2ff;
578
+ --color-ak-primary-950: #f5f7ff;
579
+
580
+ /* ── Status (lighter for dark bg readability) ── */
581
+ --color-ak-success: #4ade80;
582
+ --color-ak-success-subtle: rgba(34, 197, 94, 0.12);
583
+ --color-ak-success-text: #4ade80;
584
+ --color-ak-warning: #fbbf24;
585
+ --color-ak-warning-subtle: rgba(251, 191, 36, 0.12);
586
+ --color-ak-warning-text: #fbbf24;
587
+ --color-ak-danger: #f87171;
588
+ --color-ak-danger-subtle: rgba(248, 113, 113, 0.12);
589
+ --color-ak-danger-text: #f87171;
590
+ --color-ak-info: #60a5fa;
591
+ --color-ak-info-subtle: rgba(96, 165, 250, 0.12);
592
+ --color-ak-info-text: #60a5fa;
593
+
594
+ /* ── Shadows (mostly invisible on dark — reduce or remove) ── */
595
+ --shadow-ak-xs: none;
596
+ --shadow-ak-sm: none;
597
+ --shadow-ak-md: 0 4px 12px rgba(0,0,0,0.3);
598
+ --shadow-ak-lg: 0 8px 30px rgba(0,0,0,0.4);
599
+ --shadow-ak-xl: 0 16px 50px rgba(0,0,0,0.5);
600
+ --shadow-ak-2xl: 0 24px 60px rgba(0,0,0,0.6);
601
+
602
+ /* ── Focus rings (solid for AAA 2.4.13 compliance) ── */
603
+ --color-ak-border-focus: #ffffff;
604
+ --shadow-ak-focus: 0 0 0 3px rgba(255, 255, 255, 0.20);
605
+ --shadow-ak-focus-primary: 0 0 0 3px rgba(129, 140, 248, 0.30);
606
+ --shadow-ak-focus-danger: 0 0 0 3px rgba(248, 113, 113, 0.25);
607
+ --shadow-ak-focus-success: 0 0 0 3px rgba(74, 222, 128, 0.25);
608
+
609
+ /* ── Neobrutalist (dark mode — everything flips) ── */
610
+ --color-ak-brutal-ink: #ffffff;
611
+ --color-ak-brutal-face: #0a0a0a;
612
+ --color-ak-brutal-face-dark: #e5e5e5;
613
+ --color-ak-brutal-on-face: #ffffff;
614
+ --color-ak-brutal-on-face-dark: #000000;
615
+
616
+ /* ── Sheet handle ── */
617
+ --color-ak-sheet-handle: #52525b;
618
+ }