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