astralkit 0.7.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/tailwind.cjs CHANGED
@@ -1,536 +1,544 @@
1
- /**
2
- * AstralKit Tailwind CSS v3 Compatibility Plugin
3
- *
4
- * Registers all ak-* design tokens as Tailwind theme extensions
5
- * so that utility classes like bg-ak-bg, text-ak-text, p-ak-2, etc.
6
- * work in Tailwind v3 projects.
7
- *
8
- * Usage (tailwind.config.js):
9
- * const astralkit = require('astralkit/tailwind')
10
- * module.exports = { plugins: [astralkit] }
11
- *
12
- * In Tailwind v4, this plugin is NOT needed — the @theme directive
13
- * in astralkit/theme-v4 handles everything automatically.
14
- */
15
-
16
- const plugin = require('tailwindcss/plugin')
17
-
18
- // Shared spacing map — used by spacing, width, height, minWidth, minHeight, maxWidth
19
- // In Tailwind v4 spacing auto-feeds all sizing utils; in v3 we must extend each explicitly
20
- const AK_SPACING = {
21
- 'ak-0': 'var(--spacing-ak-0)',
22
- 'ak-px': 'var(--spacing-ak-px)',
23
- 'ak-0_5': 'var(--spacing-ak-0_5)',
24
- 'ak-0.5': 'var(--spacing-ak-0_5)',
25
- 'ak-0_75': 'var(--spacing-ak-0_75)',
26
- 'ak-0.75': 'var(--spacing-ak-0_75)',
27
- 'ak-1': 'var(--spacing-ak-1)',
28
- 'ak-1_25': 'var(--spacing-ak-1_25)',
29
- 'ak-1.25': 'var(--spacing-ak-1_25)',
30
- 'ak-1_5': 'var(--spacing-ak-1_5)',
31
- 'ak-1.5': 'var(--spacing-ak-1_5)',
32
- 'ak-2': 'var(--spacing-ak-2)',
33
- 'ak-2_5': 'var(--spacing-ak-2_5)',
34
- 'ak-2.5': 'var(--spacing-ak-2_5)',
35
- 'ak-3': 'var(--spacing-ak-3)',
36
- 'ak-3_5': 'var(--spacing-ak-3_5)',
37
- 'ak-3.5': 'var(--spacing-ak-3_5)',
38
- 'ak-4': 'var(--spacing-ak-4)',
39
- 'ak-4_5': 'var(--spacing-ak-4_5)',
40
- 'ak-4.5': 'var(--spacing-ak-4_5)',
41
- 'ak-5': 'var(--spacing-ak-5)',
42
- 'ak-5_5': 'var(--spacing-ak-5_5)',
43
- 'ak-5.5': 'var(--spacing-ak-5_5)',
44
- 'ak-6': 'var(--spacing-ak-6)',
45
- 'ak-7': 'var(--spacing-ak-7)',
46
- 'ak-8': 'var(--spacing-ak-8)',
47
- 'ak-9': 'var(--spacing-ak-9)',
48
- 'ak-10': 'var(--spacing-ak-10)',
49
- 'ak-11': 'var(--spacing-ak-11)',
50
- 'ak-12': 'var(--spacing-ak-12)',
51
- 'ak-14': 'var(--spacing-ak-14)',
52
- 'ak-16': 'var(--spacing-ak-16)',
53
- 'ak-20': 'var(--spacing-ak-20)',
54
- 'ak-24': 'var(--spacing-ak-24)',
55
- 'ak-mobile-bar': 'var(--spacing-ak-mobile-bar)',
56
- }
57
-
58
- module.exports = plugin(
59
- // Plugin function — intentionally empty.
60
- // Token values (CSS custom properties) now live in astralkit-utilities.css
61
- // inside @layer ak-tokens. This eliminates duplication and enables
62
- // native CSS @layer for cascade control.
63
- // Compatible with Tailwind v3 and v4.
64
- function () {},
65
-
66
- // Config — extends Tailwind's theme with ak-* utilities
67
- {
68
- theme: {
69
- extend: {
70
- /* ── Colors ──
71
- Every ak-* color token becomes a Tailwind color utility:
72
- bg-ak-bg, text-ak-text, border-ak-border, etc. */
73
- colors: {
74
- // Neutral scale
75
- 'ak-neutral-0': 'var(--color-ak-neutral-0)',
76
- 'ak-neutral-50': 'var(--color-ak-neutral-50)',
77
- 'ak-neutral-100': 'var(--color-ak-neutral-100)',
78
- 'ak-neutral-200': 'var(--color-ak-neutral-200)',
79
- 'ak-neutral-300': 'var(--color-ak-neutral-300)',
80
- 'ak-neutral-400': 'var(--color-ak-neutral-400)',
81
- 'ak-neutral-500': 'var(--color-ak-neutral-500)',
82
- 'ak-neutral-600': 'var(--color-ak-neutral-600)',
83
- 'ak-neutral-700': 'var(--color-ak-neutral-700)',
84
- 'ak-neutral-800': 'var(--color-ak-neutral-800)',
85
- 'ak-neutral-900': 'var(--color-ak-neutral-900)',
86
- 'ak-neutral-950': 'var(--color-ak-neutral-950)',
87
-
88
- // Primary scale
89
- 'ak-primary-50': 'var(--color-ak-primary-50)',
90
- 'ak-primary-100': 'var(--color-ak-primary-100)',
91
- 'ak-primary-200': 'var(--color-ak-primary-200)',
92
- 'ak-primary-300': 'var(--color-ak-primary-300)',
93
- 'ak-primary-400': 'var(--color-ak-primary-400)',
94
- 'ak-primary-500': 'var(--color-ak-primary-500)',
95
- 'ak-primary-600': 'var(--color-ak-primary-600)',
96
- 'ak-primary-700': 'var(--color-ak-primary-700)',
97
- 'ak-primary-800': 'var(--color-ak-primary-800)',
98
- 'ak-primary-900': 'var(--color-ak-primary-900)',
99
- 'ak-primary-950': 'var(--color-ak-primary-950)',
100
-
101
- // Primary action
102
- 'ak-primary': 'var(--color-ak-primary)',
103
- 'ak-primary-hover': 'var(--color-ak-primary-hover)',
104
- 'ak-primary-active': 'var(--color-ak-primary-active)',
105
-
106
- // Semantic surfaces
107
- 'ak-bg': 'var(--color-ak-bg)',
108
- 'ak-surface': 'var(--color-ak-surface)',
109
- 'ak-surface-2': 'var(--color-ak-surface-2)',
110
- 'ak-hover': 'var(--color-ak-hover)',
111
- 'ak-active': 'var(--color-ak-active)',
112
- 'ak-elevated': 'var(--color-ak-elevated)',
113
- 'ak-surface-raised': 'var(--color-ak-surface-raised)',
114
- 'ak-surface-raised-soft': 'var(--color-ak-surface-raised-soft)',
115
- 'ak-surface-glass': 'var(--color-ak-surface-glass)',
116
- 'ak-surface-glass-strong': 'var(--color-ak-surface-glass-strong)',
117
- 'ak-highlight-soft': 'var(--color-ak-highlight-soft)',
118
- 'ak-highlight-strong': 'var(--color-ak-highlight-strong)',
119
- 'ak-skeleton-base': 'var(--color-ak-skeleton-base)',
120
- 'ak-skeleton-shine': 'var(--color-ak-skeleton-shine)',
121
- 'ak-sheet-handle': 'var(--color-ak-sheet-handle)',
122
- 'ak-on-primary': 'var(--color-ak-on-primary)',
123
- 'ak-primary-subtle': 'var(--color-ak-primary-subtle)',
124
-
125
- // Selection accent: defaults to brand primary; palettes may split
126
- // (e.g. Pulse: ink CTAs via primary, volt-lime selection via accent).
127
- 'ak-accent': 'var(--color-ak-accent, var(--color-ak-primary))',
128
- 'ak-on-accent': 'var(--color-ak-on-accent, var(--color-ak-on-primary))',
129
- 'ak-accent-soft': 'var(--color-ak-accent-soft, var(--color-ak-surface-2))',
130
-
131
- // Slider/scrubber fill: defaults to primary; palettes may override to ink
132
- 'ak-slider-fill': 'var(--color-ak-slider-fill, var(--color-ak-primary))',
133
- 'ak-slider-ring': 'var(--color-ak-slider-ring, var(--color-ak-bg))',
134
-
135
- // M3 role layer (additive aliases)
136
- 'ak-surface-3': 'var(--color-ak-surface-3)',
137
- 'ak-surface-4': 'var(--color-ak-surface-4)',
138
- 'ak-surface-container-lowest': 'var(--color-ak-surface-container-lowest, var(--color-ak-bg))',
139
- 'ak-surface-container-low': 'var(--color-ak-surface-container-low, var(--color-ak-surface))',
140
- 'ak-surface-container': 'var(--color-ak-surface-container, var(--color-ak-surface-2))',
141
- 'ak-surface-container-high': 'var(--color-ak-surface-container-high, var(--color-ak-surface-3))',
142
- 'ak-surface-container-highest': 'var(--color-ak-surface-container-highest, var(--color-ak-surface-4))',
143
- 'ak-on-surface': 'var(--color-ak-on-surface, var(--color-ak-text))',
144
- 'ak-on-surface-variant': 'var(--color-ak-on-surface-variant, var(--color-ak-text-secondary))',
145
- 'ak-outline': 'var(--color-ak-outline, var(--color-ak-border))',
146
- 'ak-outline-variant': 'var(--color-ak-outline-variant, var(--color-ak-border-subtle))',
147
- 'ak-primary-container': 'var(--color-ak-primary-container, var(--color-ak-primary-subtle))',
148
- 'ak-on-primary-container': 'var(--color-ak-on-primary-container, var(--color-ak-primary-900))',
149
- 'ak-selection-ink': 'var(--color-ak-selection-ink, var(--color-ak-on-primary-container, var(--color-ak-primary-900)))',
150
- 'ak-primary-container-emphasis': 'var(--color-ak-primary-container-emphasis, var(--color-ak-selection-ink, var(--color-ak-on-primary-container)))',
151
- 'ak-secondary': 'var(--color-ak-secondary, var(--color-ak-accent, var(--color-ak-primary)))',
152
- 'ak-on-secondary': 'var(--color-ak-on-secondary, var(--color-ak-on-accent, var(--color-ak-on-primary)))',
153
- 'ak-secondary-container': 'var(--color-ak-secondary-container, var(--color-ak-accent-soft, var(--color-ak-surface-2)))',
154
- 'ak-on-secondary-container': 'var(--color-ak-on-secondary-container, var(--color-ak-text))',
155
- 'ak-tertiary': 'var(--color-ak-tertiary, var(--color-ak-info))',
156
- 'ak-on-tertiary': 'var(--color-ak-on-tertiary)',
157
- 'ak-tertiary-container': 'var(--color-ak-tertiary-container, var(--color-ak-info-subtle))',
158
- 'ak-on-tertiary-container': 'var(--color-ak-on-tertiary-container, var(--color-ak-info-text))',
159
- 'ak-error': 'var(--color-ak-error, var(--color-ak-danger))',
160
- 'ak-error-hover': 'var(--color-ak-error-hover, var(--color-ak-danger-hover))',
161
- 'ak-on-error': 'var(--color-ak-on-error)',
162
- 'ak-error-container': 'var(--color-ak-error-container, var(--color-ak-danger-subtle))',
163
- 'ak-on-error-container': 'var(--color-ak-on-error-container, var(--color-ak-danger-text))',
164
- 'ak-inverse-surface': 'var(--color-ak-inverse-surface)',
165
- 'ak-inverse-on-surface': 'var(--color-ak-inverse-on-surface)',
166
- 'ak-scrim': 'var(--color-ak-scrim, var(--color-ak-overlay))',
167
-
168
- 'ak-primary-subtle-hover': 'var(--color-ak-primary-subtle-hover)',
169
- 'ak-overlay': 'var(--color-ak-overlay)',
170
-
171
- // Semantic text
172
- 'ak-text': 'var(--color-ak-text)',
173
- 'ak-text-emphasis': 'var(--color-ak-text-emphasis)',
174
- 'ak-text-secondary': 'var(--color-ak-text-secondary)',
175
- 'ak-text-muted': 'var(--color-ak-text-muted)',
176
- 'ak-text-disabled': 'var(--color-ak-text-disabled)',
177
- 'ak-text-inverse': 'var(--color-ak-text-inverse)',
178
- 'ak-text-link': 'var(--color-ak-text-link)',
179
- 'ak-text-placeholder':'var(--color-ak-text-placeholder)',
180
-
181
- // Semantic border
182
- 'ak-border': 'var(--color-ak-border)',
183
- 'ak-border-subtle': 'var(--color-ak-border-subtle)',
184
- 'ak-border-strong': 'var(--color-ak-border-strong)',
185
- 'ak-border-focus': 'var(--color-ak-border-focus)',
186
-
187
- // Status
188
- 'ak-success': 'var(--color-ak-success)',
189
- 'ak-success-subtle': 'var(--color-ak-success-subtle)',
190
- 'ak-success-text': 'var(--color-ak-success-text)',
191
- 'ak-warning': 'var(--color-ak-warning)',
192
- 'ak-warning-subtle': 'var(--color-ak-warning-subtle)',
193
- 'ak-warning-text': 'var(--color-ak-warning-text)',
194
- 'ak-danger': 'var(--color-ak-danger)',
195
- 'ak-danger-hover': 'var(--color-ak-danger-hover)',
196
- 'ak-danger-subtle': 'var(--color-ak-danger-subtle)',
197
- 'ak-danger-text': 'var(--color-ak-danger-text)',
198
- 'ak-info': 'var(--color-ak-info)',
199
- 'ak-info-subtle': 'var(--color-ak-info-subtle)',
200
- 'ak-info-text': 'var(--color-ak-info-text)',
201
- 'ak-pink': 'var(--color-ak-pink)',
202
- 'ak-pink-subtle': 'var(--color-ak-pink-subtle)',
203
- 'ak-chart-1': 'var(--color-ak-chart-1)',
204
- 'ak-chart-2': 'var(--color-ak-chart-2)',
205
- 'ak-chart-3': 'var(--color-ak-chart-3)',
206
- 'ak-chart-4': 'var(--color-ak-chart-4)',
207
- 'ak-chart-5': 'var(--color-ak-chart-5)',
208
- 'ak-chart-6': 'var(--color-ak-chart-6)',
209
-
210
- // Neobrutalist
211
- 'ak-brutal-ink': 'var(--color-ak-brutal-ink)',
212
- 'ak-brutal-face': 'var(--color-ak-brutal-face)',
213
- 'ak-brutal-face-dark': 'var(--color-ak-brutal-face-dark)',
214
- 'ak-brutal-on-face': 'var(--color-ak-brutal-on-face)',
215
- 'ak-brutal-on-face-dark': 'var(--color-ak-brutal-on-face-dark)',
216
- },
217
-
218
- /* ── Spacing ──
219
- p-ak-2, m-ak-3, gap-ak-1, etc.
220
- In v3, spacing doesn't auto-feed into w-/h-/min-w-/min-h-/max-w-
221
- so we also spread AK_SPACING into those configs below. */
222
- spacing: {
223
- ...AK_SPACING,
224
- // Fluid spacing
225
- 'ak-fl-3xs': 'clamp(0.25rem, 0.21rem + 0.14vw, 0.375rem)',
226
- 'ak-fl-2xs': 'clamp(0.5rem, 0.43rem + 0.28vw, 0.75rem)',
227
- 'ak-fl-xs': 'clamp(0.75rem, 0.65rem + 0.42vw, 1rem)',
228
- 'ak-fl-sm': 'clamp(1rem, 0.86rem + 0.56vw, 1.5rem)',
229
- 'ak-fl-md': 'clamp(1.5rem, 1.29rem + 0.83vw, 2rem)',
230
- 'ak-fl-lg': 'clamp(2rem, 1.72rem + 1.11vw, 3rem)',
231
- 'ak-fl-xl': 'clamp(3rem, 2.5rem + 1.85vw, 4.5rem)',
232
- 'ak-fl-2xl': 'clamp(4rem, 3.22rem + 2.78vw, 6rem)',
233
- 'ak-fl-3xl': 'clamp(6rem, 4.86rem + 4.17vw, 9rem)',
234
- // Fluid space pairs
235
- 'ak-fl-xs-md': 'clamp(0.75rem, 0.43rem + 1.39vw, 2rem)',
236
- 'ak-fl-xs-lg': 'clamp(0.75rem, 0.14rem + 2.78vw, 3rem)',
237
- 'ak-fl-sm-lg': 'clamp(1rem, 0.43rem + 2.78vw, 3rem)',
238
- 'ak-fl-sm-xl': 'clamp(1rem, 0rem + 4.17vw, 4.5rem)',
239
- 'ak-fl-md-xl': 'clamp(1.5rem, 0.57rem + 3.47vw, 4.5rem)',
240
- 'ak-fl-md-2xl': 'clamp(1.5rem, 0rem + 5.56vw, 6rem)',
241
- 'ak-fl-lg-2xl': 'clamp(2rem, 0.57rem + 5.56vw, 6rem)',
242
- 'ak-fl-xl-3xl': 'clamp(3rem, 0.57rem + 8.33vw, 9rem)',
243
- 'ak-fl-page-margin': 'var(--spacing-ak-fl-page-margin)',
244
- },
245
-
246
- /* ── Font Family ── */
247
- fontFamily: {
248
- // Var-driven so a container/theme can re-font at runtime by setting
249
- // the CSS variable (the font dial). Literal stacks remain as var fallbacks.
250
- 'ak-sans': ['var(--font-ak-sans, Inter)', 'system-ui', '-apple-system', 'sans-serif'],
251
- 'ak-heading': ['var(--font-ak-heading, var(--font-ak-sans, Inter))', 'system-ui', 'sans-serif'],
252
- 'ak-serif': ['var(--font-ak-serif, "DM Serif Display")', 'Georgia', 'serif'],
253
- 'ak-mono': ['var(--font-ak-mono, "JetBrains Mono")', 'Fira Code', 'ui-monospace', 'monospace'],
254
- },
255
-
256
- /* ── Font Size ──
257
- text-ak-base, text-ak-lg, text-ak-fl-2xl, etc. */
258
- fontSize: {
259
- // Static scale
260
- 'ak-2xs': 'var(--text-ak-2xs)',
261
- 'ak-xs': 'var(--text-ak-xs)',
262
- 'ak-xs_5': 'var(--text-ak-xs_5)',
263
- 'ak-xs.5': 'var(--text-ak-xs_5)',
264
- 'ak-sm': 'var(--text-ak-sm)',
265
- 'ak-sm_5': 'var(--text-ak-sm_5)',
266
- 'ak-sm.5': 'var(--text-ak-sm_5)',
267
- 'ak-base': 'var(--text-ak-base)',
268
- 'ak-lg': 'var(--text-ak-lg)',
269
- 'ak-xl': 'var(--text-ak-xl)',
270
- 'ak-xl_5': 'var(--text-ak-xl_5)',
271
- 'ak-xl.5': 'var(--text-ak-xl_5)',
272
- 'ak-2xl': 'var(--text-ak-2xl)',
273
- 'ak-2xl_5': 'var(--text-ak-2xl_5)',
274
- 'ak-2xl.5': 'var(--text-ak-2xl_5)',
275
- 'ak-3xl': 'var(--text-ak-3xl)',
276
- 'ak-4xl': 'var(--text-ak-4xl)',
277
- 'ak-4xl_5': 'var(--text-ak-4xl_5)',
278
- 'ak-4xl.5': 'var(--text-ak-4xl_5)',
279
- 'ak-5xl': 'var(--text-ak-5xl)',
280
- 'ak-6xl': 'var(--text-ak-6xl)',
281
- 'ak-6xl_5': 'var(--text-ak-6xl_5)',
282
- 'ak-6xl.5': 'var(--text-ak-6xl_5)',
283
- 'ak-7xl': 'var(--text-ak-7xl)',
284
- 'ak-7xl_5': 'var(--text-ak-7xl_5)',
285
- 'ak-7xl.5': 'var(--text-ak-7xl_5)',
286
- 'ak-8xl': 'var(--text-ak-8xl)',
287
- 'ak-9xl': 'var(--text-ak-9xl)',
288
- 'ak-10xl': 'var(--text-ak-10xl)',
289
- // Fluid scale
290
- 'ak-fl-xs': 'clamp(0.6875rem, 0.67rem + 0.06vw, 0.75rem)',
291
- 'ak-fl-sm': 'clamp(0.75rem, 0.71rem + 0.12vw, 0.875rem)',
292
- 'ak-fl-base': 'clamp(0.875rem, 0.84rem + 0.12vw, 1rem)',
293
- 'ak-fl-lg': 'clamp(1rem, 0.96rem + 0.12vw, 1.125rem)',
294
- 'ak-fl-xl': 'clamp(1.125rem, 1.09rem + 0.12vw, 1.25rem)',
295
- 'ak-fl-2xl': 'clamp(1.25rem, 1.18rem + 0.23vw, 1.5rem)',
296
- 'ak-fl-3xl': 'clamp(1.5rem, 1.39rem + 0.35vw, 1.875rem)',
297
- 'ak-fl-4xl': 'clamp(1.875rem, 1.76rem + 0.35vw, 2.25rem)',
298
- 'ak-fl-5xl': 'clamp(2.25rem, 2.03rem + 0.69vw, 3rem)',
299
- 'ak-fl-6xl': 'clamp(3rem, 2.78rem + 0.69vw, 3.75rem)',
300
- 'ak-fl-7xl': 'clamp(3.5rem, 3.2rem + 0.93vw, 4.5rem)',
301
- 'ak-fl-8xl': 'clamp(4.5rem, 4.06rem + 1.39vw, 6rem)',
302
- 'ak-fl-9xl': 'clamp(5.25rem, 4.73rem + 1.62vw, 7rem)',
303
- // Display scale
304
- 'ak-display-xs': 'clamp(0.75rem, 0.7rem + 0.15vw, 0.875rem)',
305
- 'ak-display-sm': 'clamp(0.875rem, 0.83rem + 0.19vw, 1rem)',
306
- 'ak-display-base': 'clamp(1rem, 0.94rem + 0.28vw, 1.1875rem)',
307
- 'ak-display-lg': 'clamp(1.125rem, 1.01rem + 0.52vw, 1.5rem)',
308
- 'ak-display-xl': 'clamp(1.25rem, 1.07rem + 0.83vw, 1.875rem)',
309
- 'ak-display-2xl': 'clamp(1.5rem, 1.2rem + 1.11vw, 2.25rem)',
310
- 'ak-display-3xl': 'clamp(1.875rem, 1.42rem + 1.67vw, 3rem)',
311
- 'ak-display-4xl': 'clamp(2.25rem, 1.58rem + 2.5vw, 3.75rem)',
312
- 'ak-display-5xl': 'clamp(3rem, 2.07rem + 3.47vw, 5.25rem)',
313
- 'ak-display-6xl': 'clamp(3.75rem, 2.5rem + 4.63vw, 7rem)',
314
- 'ak-display-7xl': 'clamp(4.5rem, 3.06rem + 5.56vw, 8rem)',
315
- 'ak-display-8xl': 'clamp(5rem, 3.06rem + 6.94vw, 9rem)',
316
- 'ak-display-9xl': 'clamp(5.5rem, 3.06rem + 7.64vw, 10rem)',
317
-
318
- 'ak-watermark-2xs': 'clamp(1rem, 13cqi, 13rem)',
319
- 'ak-watermark-xs': 'clamp(1rem, 16cqi, 16rem)',
320
- 'ak-watermark-sm': 'clamp(1rem, 19cqi, 20rem)',
321
- 'ak-watermark-base': 'clamp(1rem, 21cqi, 22rem)',
322
- 'ak-watermark-md': 'clamp(1rem, 24cqi, 26rem)',
323
- 'ak-watermark-lg': 'clamp(1rem, 26cqi, 28rem)',
324
- 'ak-watermark-xl': 'clamp(1rem, 28cqi, 30rem)',
325
- 'ak-watermark-2xl': 'clamp(1rem, 30cqi, 34rem)',
326
- 'ak-watermark-3xl': 'clamp(1rem, 33cqi, 38rem)',
327
- 'ak-watermark-4xl': 'clamp(1rem, 36cqi, 42rem)',
328
- 'ak-watermark-5xl': 'clamp(1rem, 40cqi, 48rem)',
329
- // Avatar initials font size
330
- 'ak-avatar-xs': 'var(--text-ak-avatar-xs)',
331
- 'ak-avatar-sm': 'var(--text-ak-avatar-sm)',
332
- 'ak-avatar-md': 'var(--text-ak-avatar-md)',
333
- 'ak-avatar-lg': 'var(--text-ak-avatar-lg)',
334
- 'ak-avatar-xl': 'var(--text-ak-avatar-xl)',
335
- 'ak-avatar-2xl': 'var(--text-ak-avatar-2xl)',
336
- 'ak-avatar-3xl': 'var(--text-ak-avatar-3xl)',
337
- // Badge text size
338
- 'ak-badge-md': 'var(--text-ak-badge-md)',
339
- 'ak-badge-lg': 'var(--text-ak-badge-lg)',
340
- 'ak-badge-xl': 'var(--text-ak-badge-xl)',
341
- 'ak-badge-2xl': 'var(--text-ak-badge-2xl)',
342
- 'ak-badge-3xl': 'var(--text-ak-badge-3xl)',
343
- },
344
-
345
- /* ── Line Height ── */
346
- lineHeight: {
347
- 'ak-display': 'var(--leading-ak-display)',
348
- 'ak-squeezed': 'var(--leading-ak-squeezed)',
349
- 'ak-condensed': 'var(--leading-ak-condensed)',
350
- 'ak-none': 'var(--leading-ak-none)',
351
- 'ak-fitted': 'var(--leading-ak-fitted)',
352
- 'ak-compact': 'var(--leading-ak-compact)',
353
- 'ak-tighter': 'var(--leading-ak-tighter)',
354
- 'ak-snugger': 'var(--leading-ak-snugger)',
355
- 'ak-tight': 'var(--leading-ak-tight)',
356
- 'ak-snug': 'var(--leading-ak-snug)',
357
- 'ak-normal': 'var(--leading-ak-normal)',
358
- 'ak-relaxed': 'var(--leading-ak-relaxed)',
359
- 'ak-prose': 'var(--leading-ak-prose)',
360
- 'ak-loose': 'var(--leading-ak-loose)',
361
- },
362
-
363
- /* ── Letter Spacing ── */
364
- letterSpacing: {
365
- 'ak-tighter': 'var(--tracking-ak-tighter)',
366
- 'ak-tight': 'var(--tracking-ak-tight)',
367
- 'ak-subtle': 'var(--tracking-ak-subtle)',
368
- 'ak-normal': 'var(--tracking-ak-normal)',
369
- 'ak-wide': 'var(--tracking-ak-wide)',
370
- 'ak-wider': 'var(--tracking-ak-wider)',
371
- 'ak-widest': 'var(--tracking-ak-widest)',
372
- 'ak-section': 'var(--tracking-ak-section)',
373
- },
374
-
375
- /* ── Border Radius ── */
376
- borderRadius: {
377
- 'ak-none': 'var(--radius-ak-none)',
378
- 'ak-xs': 'var(--radius-ak-xs)',
379
- 'ak-sm': 'var(--radius-ak-sm)',
380
- 'ak-md': 'var(--radius-ak-md)',
381
- 'ak-lg': 'var(--radius-ak-lg)',
382
- 'ak-xl': 'var(--radius-ak-xl)',
383
- 'ak-2xl': 'var(--radius-ak-2xl)',
384
- 'ak-3xl': 'var(--radius-ak-3xl)',
385
- 'ak-full': 'var(--radius-ak-full)',
386
- 'ak-input': 'var(--radius-ak-input)',
387
- 'ak-control-sm': 'var(--radius-ak-control-sm)',
388
- // Neobrutalist
389
- 'ak-brutal': 'var(--radius-ak-brutal)',
390
- 'ak-brutal-sm': 'var(--radius-ak-brutal-sm)',
391
- },
392
-
393
- /* ── Border Width ── */
394
- borderWidth: {
395
- 'ak-brutal': 'var(--border-ak-brutal)',
396
- 'ak-brutal-lg': 'var(--border-ak-brutal-lg)',
397
- },
398
-
399
- /* ── Box Shadow ── */
400
- boxShadow: {
401
- 'ak-xs': 'var(--shadow-ak-xs)',
402
- 'ak-sm': 'var(--shadow-ak-sm)',
403
- 'ak-md': 'var(--shadow-ak-md)',
404
- 'ak-lg': 'var(--shadow-ak-lg)',
405
- 'ak-xl': 'var(--shadow-ak-xl)',
406
- 'ak-2xl': 'var(--shadow-ak-2xl)',
407
- 'ak-focus': 'var(--shadow-ak-focus)',
408
- 'ak-focus-primary': 'var(--shadow-ak-focus-primary)',
409
- 'ak-focus-danger': 'var(--shadow-ak-focus-danger)',
410
- 'ak-focus-success': 'var(--shadow-ak-focus-success)',
411
- // Neobrutalist
412
- 'ak-brutal-xs': 'var(--shadow-ak-brutal-xs)',
413
- 'ak-brutal-sm': 'var(--shadow-ak-brutal-sm)',
414
- 'ak-brutal': 'var(--shadow-ak-brutal)',
415
- 'ak-brutal-lg': 'var(--shadow-ak-brutal-lg)',
416
- 'ak-brutal-xl': 'var(--shadow-ak-brutal-xl)',
417
- 'ak-brutal-none': '0 0 0 0 #000',
418
- },
419
-
420
- /* ── Max Width (containers) ── */
421
- maxWidth: {
422
- 'ak-page': 'var(--container-ak-page)',
423
- 'ak-xs': 'var(--container-ak-xs)',
424
- 'ak-sm': 'var(--container-ak-sm)',
425
- 'ak-md': 'var(--container-ak-md)',
426
- 'ak-lg': 'var(--container-ak-lg)',
427
- 'ak-xl': 'var(--container-ak-xl)',
428
- 'ak-2xl': 'var(--container-ak-2xl)',
429
- 'ak-3xl': 'var(--container-ak-3xl)',
430
- 'ak-4xl': 'var(--container-ak-4xl)',
431
- 'ak-prose': 'var(--container-ak-prose)',
432
- },
433
-
434
- /* ── Z-Index (Chakra-inspired scale) ── */
435
- zIndex: {
436
- 'ak-base': 'var(--z-ak-base)',
437
- 'ak-docked': 'var(--z-ak-docked)',
438
- 'ak-dropdown': 'var(--z-ak-dropdown)',
439
- 'ak-sticky': 'var(--z-ak-sticky)',
440
- 'ak-banner': 'var(--z-ak-banner)',
441
- 'ak-overlay': 'var(--z-ak-overlay)',
442
- 'ak-modal': 'var(--z-ak-modal)',
443
- 'ak-popover': 'var(--z-ak-popover)',
444
- 'ak-toast': 'var(--z-ak-toast)',
445
- 'ak-tooltip': 'var(--z-ak-tooltip)',
446
- },
447
-
448
- /* ── Height ── (spacing + named heights) */
449
- height: {
450
- ...AK_SPACING,
451
- 'ak-nav': 'var(--height-ak-nav)',
452
- 'ak-touch': 'var(--height-ak-touch)',
453
- 'ak-control-sm': 'var(--height-ak-control-sm)',
454
- 'ak-control-md': 'var(--height-ak-control-md)',
455
- 'ak-control-lg': 'var(--height-ak-control-lg)',
456
- 'ak-control-xl': 'var(--height-ak-control-xl)',
457
- 'ak-control-2xl': 'var(--height-ak-control-2xl)',
458
- 'ak-row-compact': 'var(--height-ak-row-compact)',
459
- 'ak-row-default': 'var(--height-ak-row-default)',
460
- 'ak-row-comfortable': 'var(--height-ak-row-comfortable)',
461
- },
462
-
463
- /* ── Min Height ── */
464
- minHeight: {
465
- ...AK_SPACING,
466
- 'ak-nav': 'var(--height-ak-nav)',
467
- 'ak-touch': 'var(--height-ak-touch)',
468
- 'ak-touch-min': 'var(--size-ak-touch-min)',
469
- 'ak-control-sm': 'var(--height-ak-control-sm)',
470
- 'ak-control-md': 'var(--height-ak-control-md)',
471
- 'ak-control-lg': 'var(--height-ak-control-lg)',
472
- 'ak-control-xl': 'var(--height-ak-control-xl)',
473
- 'ak-control-2xl': 'var(--height-ak-control-2xl)',
474
- 'ak-row-compact': 'var(--height-ak-row-compact)',
475
- 'ak-row-default': 'var(--height-ak-row-default)',
476
- 'ak-row-comfortable': 'var(--height-ak-row-comfortable)',
477
- },
478
-
479
- /* ── Width ── */
480
- width: {
481
- ...AK_SPACING,
482
- 'ak-touch': 'var(--width-ak-touch)',
483
- 'ak-panel-width': 'var(--size-ak-panel-width)',
484
- 'ak-sidebar-collapsed': 'var(--width-ak-sidebar-collapsed)',
485
- 'ak-sidebar-expanded': 'var(--width-ak-sidebar-expanded)',
486
- },
487
-
488
- /* ── Min Width ── */
489
- minWidth: {
490
- ...AK_SPACING,
491
- 'ak-touch': 'var(--width-ak-touch)',
492
- 'ak-panel-width': 'var(--size-ak-panel-width)',
493
- 'ak-sidebar-collapsed': 'var(--width-ak-sidebar-collapsed)',
494
- },
495
-
496
- /* ── Size (width + height shorthand) ── */
497
- size: {
498
- ...AK_SPACING,
499
- 'ak-icon-xs': 'var(--size-ak-icon-xs)',
500
- 'ak-icon-sm': 'var(--size-ak-icon-sm)',
501
- 'ak-icon-md': 'var(--size-ak-icon-md)',
502
- 'ak-icon-lg': 'var(--size-ak-icon-lg)',
503
- 'ak-icon-xl': 'var(--size-ak-icon-xl)',
504
- 'ak-icon-2xl': 'var(--size-ak-icon-2xl)',
505
- 'ak-icon-3xl': 'var(--size-ak-icon-3xl)',
506
- 'ak-avatar-xs': 'var(--size-ak-avatar-xs)',
507
- 'ak-avatar-sm': 'var(--size-ak-avatar-sm)',
508
- 'ak-avatar-md': 'var(--size-ak-avatar-md)',
509
- 'ak-avatar-lg': 'var(--size-ak-avatar-lg)',
510
- 'ak-avatar-xl': 'var(--size-ak-avatar-xl)',
511
- 'ak-avatar-2xl': 'var(--size-ak-avatar-2xl)',
512
- 'ak-avatar-3xl': 'var(--size-ak-avatar-3xl)',
513
- 'ak-touch': 'var(--width-ak-touch)',
514
- 'ak-touch-min': 'var(--size-ak-touch-min)',
515
- },
516
-
517
- /* ── Transition Duration ── */
518
- transitionDuration: {
519
- 'ak-fast': 'var(--duration-ak-fast)',
520
- 'ak-base': 'var(--duration-ak-base)',
521
- 'ak-slow': 'var(--duration-ak-slow)',
522
- 'ak-skeleton': 'var(--duration-ak-skeleton)',
523
- },
524
-
525
- /* ── Transition Timing Function ── */
526
- transitionTimingFunction: {
527
- 'ak-default': 'var(--ease-ak-default)',
528
- 'ak-in': 'var(--ease-ak-in)',
529
- 'ak-out': 'var(--ease-ak-out)',
530
- 'ak-spring': 'var(--ease-ak-spring)',
531
- 'ak-bounce': 'var(--ease-ak-bounce)',
532
- },
533
- },
534
- },
535
- }
536
- )
1
+ /**
2
+ * AstralKit Tailwind CSS v3 Compatibility Plugin
3
+ *
4
+ * Registers all ak-* design tokens as Tailwind theme extensions
5
+ * so that utility classes like bg-ak-bg, text-ak-text, p-ak-4, etc.
6
+ * work in Tailwind v3 projects.
7
+ *
8
+ * Usage (tailwind.config.js):
9
+ * const astralkit = require('astralkit/tailwind')
10
+ * module.exports = { plugins: [astralkit] }
11
+ *
12
+ * In Tailwind v4, this plugin is NOT needed — the @theme directive
13
+ * in astralkit/theme-v4 handles everything automatically.
14
+ */
15
+
16
+ const plugin = require('tailwindcss/plugin')
17
+
18
+ // Shared spacing map — used by spacing, width, height, minWidth, minHeight, maxWidth
19
+ // In Tailwind v4 spacing auto-feeds all sizing utils; in v3 we must extend each explicitly
20
+ const AK_SPACING = {
21
+ 'ak-px': 'var(--spacing-ak-px)',
22
+ 'ak-0': 'var(--spacing-ak-0)',
23
+ 'ak-1': 'var(--spacing-ak-1)',
24
+ 'ak-2': 'var(--spacing-ak-2)',
25
+ 'ak-3': 'var(--spacing-ak-3)',
26
+ 'ak-4': 'var(--spacing-ak-4)',
27
+ 'ak-5': 'var(--spacing-ak-5)',
28
+ 'ak-6': 'var(--spacing-ak-6)',
29
+ 'ak-7': 'var(--spacing-ak-7)',
30
+ 'ak-8': 'var(--spacing-ak-8)',
31
+ 'ak-9': 'var(--spacing-ak-9)',
32
+ 'ak-10': 'var(--spacing-ak-10)',
33
+ 'ak-11': 'var(--spacing-ak-11)',
34
+ 'ak-12': 'var(--spacing-ak-12)',
35
+ 'ak-14': 'var(--spacing-ak-14)',
36
+ 'ak-16': 'var(--spacing-ak-16)',
37
+ 'ak-18': 'var(--spacing-ak-18)',
38
+ 'ak-20': 'var(--spacing-ak-20)',
39
+ 'ak-22': 'var(--spacing-ak-22)',
40
+ 'ak-24': 'var(--spacing-ak-24)',
41
+ 'ak-28': 'var(--spacing-ak-28)',
42
+ 'ak-32': 'var(--spacing-ak-32)',
43
+ 'ak-40': 'var(--spacing-ak-40)',
44
+ 'ak-48': 'var(--spacing-ak-48)',
45
+ // ── DEPRECATED legacy fraction names (pre-0.8 grammar) — same pixel values,
46
+ // kept so unswept code keeps rendering; remove in 1.0. New code: integers only.
47
+ 'ak-0_5': 'var(--spacing-ak-1)',
48
+ 'ak-0.5': 'var(--spacing-ak-1)',
49
+ 'ak-0_75': 'var(--spacing-ak-0_75)',
50
+ 'ak-0.75': 'var(--spacing-ak-0_75)',
51
+ 'ak-1_25': 'var(--spacing-ak-1_25)',
52
+ 'ak-1.25': 'var(--spacing-ak-1_25)',
53
+ 'ak-1_5': 'var(--spacing-ak-3)',
54
+ 'ak-1.5': 'var(--spacing-ak-3)',
55
+ 'ak-2_5': 'var(--spacing-ak-5)',
56
+ 'ak-2.5': 'var(--spacing-ak-5)',
57
+ 'ak-3_5': 'var(--spacing-ak-7)',
58
+ 'ak-3.5': 'var(--spacing-ak-7)',
59
+ 'ak-4_5': 'var(--spacing-ak-9)',
60
+ 'ak-4.5': 'var(--spacing-ak-9)',
61
+ 'ak-5_5': 'var(--spacing-ak-11)',
62
+ 'ak-5.5': 'var(--spacing-ak-11)',
63
+ 'ak-mobile-bar': 'var(--spacing-ak-mobile-bar)',
64
+ }
65
+
66
+ module.exports = plugin(
67
+ // Plugin function — intentionally empty.
68
+ // Token values (CSS custom properties) now live in astralkit-utilities.css
69
+ // inside @layer ak-tokens. This eliminates duplication and enables
70
+ // native CSS @layer for cascade control.
71
+ // Compatible with Tailwind v3 and v4.
72
+ function () {},
73
+
74
+ // Config — extends Tailwind's theme with ak-* utilities
75
+ {
76
+ theme: {
77
+ extend: {
78
+ /* ── Colors ──
79
+ Every ak-* color token becomes a Tailwind color utility:
80
+ bg-ak-bg, text-ak-text, border-ak-border, etc. */
81
+ colors: {
82
+ // Neutral scale
83
+ 'ak-neutral-0': 'var(--color-ak-neutral-0)',
84
+ 'ak-neutral-50': 'var(--color-ak-neutral-50)',
85
+ 'ak-neutral-100': 'var(--color-ak-neutral-100)',
86
+ 'ak-neutral-200': 'var(--color-ak-neutral-200)',
87
+ 'ak-neutral-300': 'var(--color-ak-neutral-300)',
88
+ 'ak-neutral-400': 'var(--color-ak-neutral-400)',
89
+ 'ak-neutral-500': 'var(--color-ak-neutral-500)',
90
+ 'ak-neutral-600': 'var(--color-ak-neutral-600)',
91
+ 'ak-neutral-700': 'var(--color-ak-neutral-700)',
92
+ 'ak-neutral-800': 'var(--color-ak-neutral-800)',
93
+ 'ak-neutral-900': 'var(--color-ak-neutral-900)',
94
+ 'ak-neutral-950': 'var(--color-ak-neutral-950)',
95
+
96
+ // Primary scale
97
+ 'ak-primary-50': 'var(--color-ak-primary-50)',
98
+ 'ak-primary-100': 'var(--color-ak-primary-100)',
99
+ 'ak-primary-200': 'var(--color-ak-primary-200)',
100
+ 'ak-primary-300': 'var(--color-ak-primary-300)',
101
+ 'ak-primary-400': 'var(--color-ak-primary-400)',
102
+ 'ak-primary-500': 'var(--color-ak-primary-500)',
103
+ 'ak-primary-600': 'var(--color-ak-primary-600)',
104
+ 'ak-primary-700': 'var(--color-ak-primary-700)',
105
+ 'ak-primary-800': 'var(--color-ak-primary-800)',
106
+ 'ak-primary-900': 'var(--color-ak-primary-900)',
107
+ 'ak-primary-950': 'var(--color-ak-primary-950)',
108
+
109
+ // Primary action
110
+ 'ak-primary': 'var(--color-ak-primary)',
111
+ 'ak-primary-hover': 'var(--color-ak-primary-hover)',
112
+ 'ak-primary-active': 'var(--color-ak-primary-active)',
113
+
114
+ // Semantic surfaces
115
+ 'ak-bg': 'var(--color-ak-bg)',
116
+ 'ak-surface': 'var(--color-ak-surface)',
117
+ 'ak-surface-2': 'var(--color-ak-surface-2)',
118
+ 'ak-hover': 'var(--color-ak-hover)',
119
+ 'ak-active': 'var(--color-ak-active)',
120
+ 'ak-elevated': 'var(--color-ak-elevated)',
121
+ 'ak-surface-raised': 'var(--color-ak-surface-raised)',
122
+ 'ak-surface-raised-soft': 'var(--color-ak-surface-raised-soft)',
123
+ 'ak-surface-glass': 'var(--color-ak-surface-glass)',
124
+ 'ak-surface-glass-strong': 'var(--color-ak-surface-glass-strong)',
125
+ 'ak-highlight-soft': 'var(--color-ak-highlight-soft)',
126
+ 'ak-highlight-strong': 'var(--color-ak-highlight-strong)',
127
+ 'ak-skeleton-base': 'var(--color-ak-skeleton-base)',
128
+ 'ak-skeleton-shine': 'var(--color-ak-skeleton-shine)',
129
+ 'ak-sheet-handle': 'var(--color-ak-sheet-handle)',
130
+ 'ak-on-primary': 'var(--color-ak-on-primary)',
131
+ 'ak-primary-subtle': 'var(--color-ak-primary-subtle)',
132
+
133
+ // Selection accent: defaults to brand primary; palettes may split
134
+ // (e.g. Pulse: ink CTAs via primary, volt-lime selection via accent).
135
+ 'ak-accent': 'var(--color-ak-accent, var(--color-ak-primary))',
136
+ 'ak-on-accent': 'var(--color-ak-on-accent, var(--color-ak-on-primary))',
137
+ 'ak-accent-soft': 'var(--color-ak-accent-soft, var(--color-ak-surface-2))',
138
+
139
+ // Slider/scrubber fill: defaults to primary; palettes may override to ink
140
+ 'ak-slider-fill': 'var(--color-ak-slider-fill, var(--color-ak-primary))',
141
+ 'ak-slider-ring': 'var(--color-ak-slider-ring, var(--color-ak-bg))',
142
+
143
+ // M3 role layer (additive aliases)
144
+ 'ak-surface-3': 'var(--color-ak-surface-3)',
145
+ 'ak-surface-4': 'var(--color-ak-surface-4)',
146
+ 'ak-surface-container-lowest': 'var(--color-ak-surface-container-lowest, var(--color-ak-bg))',
147
+ 'ak-surface-container-low': 'var(--color-ak-surface-container-low, var(--color-ak-surface))',
148
+ 'ak-surface-container': 'var(--color-ak-surface-container, var(--color-ak-surface-2))',
149
+ 'ak-surface-container-high': 'var(--color-ak-surface-container-high, var(--color-ak-surface-3))',
150
+ 'ak-surface-container-highest': 'var(--color-ak-surface-container-highest, var(--color-ak-surface-4))',
151
+ 'ak-on-surface': 'var(--color-ak-on-surface, var(--color-ak-text))',
152
+ 'ak-on-surface-variant': 'var(--color-ak-on-surface-variant, var(--color-ak-text-secondary))',
153
+ 'ak-outline': 'var(--color-ak-outline, var(--color-ak-border))',
154
+ 'ak-outline-variant': 'var(--color-ak-outline-variant, var(--color-ak-border-subtle))',
155
+ 'ak-primary-container': 'var(--color-ak-primary-container, var(--color-ak-primary-subtle))',
156
+ 'ak-on-primary-container': 'var(--color-ak-on-primary-container, var(--color-ak-primary-900))',
157
+ 'ak-selection-ink': 'var(--color-ak-selection-ink, var(--color-ak-on-primary-container, var(--color-ak-primary-900)))',
158
+ 'ak-primary-container-emphasis': 'var(--color-ak-primary-container-emphasis, var(--color-ak-selection-ink, var(--color-ak-on-primary-container)))',
159
+ 'ak-secondary': 'var(--color-ak-secondary, var(--color-ak-accent, var(--color-ak-primary)))',
160
+ 'ak-on-secondary': 'var(--color-ak-on-secondary, var(--color-ak-on-accent, var(--color-ak-on-primary)))',
161
+ 'ak-secondary-container': 'var(--color-ak-secondary-container, var(--color-ak-accent-soft, var(--color-ak-surface-2)))',
162
+ 'ak-on-secondary-container': 'var(--color-ak-on-secondary-container, var(--color-ak-text))',
163
+ 'ak-tertiary': 'var(--color-ak-tertiary, var(--color-ak-info))',
164
+ 'ak-on-tertiary': 'var(--color-ak-on-tertiary)',
165
+ 'ak-tertiary-container': 'var(--color-ak-tertiary-container, var(--color-ak-info-subtle))',
166
+ 'ak-on-tertiary-container': 'var(--color-ak-on-tertiary-container, var(--color-ak-info-text))',
167
+ 'ak-error': 'var(--color-ak-error, var(--color-ak-danger))',
168
+ 'ak-error-hover': 'var(--color-ak-error-hover, var(--color-ak-danger-hover))',
169
+ 'ak-on-error': 'var(--color-ak-on-error)',
170
+ 'ak-error-container': 'var(--color-ak-error-container, var(--color-ak-danger-subtle))',
171
+ 'ak-on-error-container': 'var(--color-ak-on-error-container, var(--color-ak-danger-text))',
172
+ 'ak-inverse-surface': 'var(--color-ak-inverse-surface)',
173
+ 'ak-inverse-on-surface': 'var(--color-ak-inverse-on-surface)',
174
+ 'ak-scrim': 'var(--color-ak-scrim, var(--color-ak-overlay))',
175
+
176
+ 'ak-primary-subtle-hover': 'var(--color-ak-primary-subtle-hover)',
177
+ 'ak-overlay': 'var(--color-ak-overlay)',
178
+
179
+ // Semantic text
180
+ 'ak-text': 'var(--color-ak-text)',
181
+ 'ak-text-emphasis': 'var(--color-ak-text-emphasis)',
182
+ 'ak-text-secondary': 'var(--color-ak-text-secondary)',
183
+ 'ak-text-muted': 'var(--color-ak-text-muted)',
184
+ 'ak-text-disabled': 'var(--color-ak-text-disabled)',
185
+ 'ak-text-inverse': 'var(--color-ak-text-inverse)',
186
+ 'ak-text-link': 'var(--color-ak-text-link)',
187
+ 'ak-text-placeholder':'var(--color-ak-text-placeholder)',
188
+
189
+ // Semantic border
190
+ 'ak-border': 'var(--color-ak-border)',
191
+ 'ak-border-subtle': 'var(--color-ak-border-subtle)',
192
+ 'ak-border-strong': 'var(--color-ak-border-strong)',
193
+ 'ak-border-focus': 'var(--color-ak-border-focus)',
194
+
195
+ // Status
196
+ 'ak-success': 'var(--color-ak-success)',
197
+ 'ak-success-subtle': 'var(--color-ak-success-subtle)',
198
+ 'ak-success-text': 'var(--color-ak-success-text)',
199
+ 'ak-warning': 'var(--color-ak-warning)',
200
+ 'ak-warning-subtle': 'var(--color-ak-warning-subtle)',
201
+ 'ak-warning-text': 'var(--color-ak-warning-text)',
202
+ 'ak-danger': 'var(--color-ak-danger)',
203
+ 'ak-danger-hover': 'var(--color-ak-danger-hover)',
204
+ 'ak-danger-subtle': 'var(--color-ak-danger-subtle)',
205
+ 'ak-danger-text': 'var(--color-ak-danger-text)',
206
+ 'ak-info': 'var(--color-ak-info)',
207
+ 'ak-info-subtle': 'var(--color-ak-info-subtle)',
208
+ 'ak-info-text': 'var(--color-ak-info-text)',
209
+ 'ak-pink': 'var(--color-ak-pink)',
210
+ 'ak-pink-subtle': 'var(--color-ak-pink-subtle)',
211
+ 'ak-chart-1': 'var(--color-ak-chart-1)',
212
+ 'ak-chart-2': 'var(--color-ak-chart-2)',
213
+ 'ak-chart-3': 'var(--color-ak-chart-3)',
214
+ 'ak-chart-4': 'var(--color-ak-chart-4)',
215
+ 'ak-chart-5': 'var(--color-ak-chart-5)',
216
+ 'ak-chart-6': 'var(--color-ak-chart-6)',
217
+
218
+ // Neobrutalist
219
+ 'ak-brutal-ink': 'var(--color-ak-brutal-ink)',
220
+ 'ak-brutal-face': 'var(--color-ak-brutal-face)',
221
+ 'ak-brutal-face-dark': 'var(--color-ak-brutal-face-dark)',
222
+ 'ak-brutal-on-face': 'var(--color-ak-brutal-on-face)',
223
+ 'ak-brutal-on-face-dark': 'var(--color-ak-brutal-on-face-dark)',
224
+ },
225
+
226
+ /* ── Spacing ──
227
+ p-ak-4, m-ak-6, gap-ak-2, etc.
228
+ In v3, spacing doesn't auto-feed into w-/h-/min-w-/min-h-/max-w-
229
+ so we also spread AK_SPACING into those configs below. */
230
+ spacing: {
231
+ ...AK_SPACING,
232
+ // Fluid spacing
233
+ 'ak-fl-3xs': 'clamp(0.25rem, 0.21rem + 0.14vw, 0.375rem)',
234
+ 'ak-fl-2xs': 'clamp(0.5rem, 0.43rem + 0.28vw, 0.75rem)',
235
+ 'ak-fl-xs': 'clamp(0.75rem, 0.65rem + 0.42vw, 1rem)',
236
+ 'ak-fl-sm': 'clamp(1rem, 0.86rem + 0.56vw, 1.5rem)',
237
+ 'ak-fl-md': 'clamp(1.5rem, 1.29rem + 0.83vw, 2rem)',
238
+ 'ak-fl-lg': 'clamp(2rem, 1.72rem + 1.11vw, 3rem)',
239
+ 'ak-fl-xl': 'clamp(3rem, 2.5rem + 1.85vw, 4.5rem)',
240
+ 'ak-fl-2xl': 'clamp(4rem, 3.22rem + 2.78vw, 6rem)',
241
+ 'ak-fl-3xl': 'clamp(6rem, 4.86rem + 4.17vw, 9rem)',
242
+ // Fluid space pairs
243
+ 'ak-fl-xs-md': 'clamp(0.75rem, 0.43rem + 1.39vw, 2rem)',
244
+ 'ak-fl-xs-lg': 'clamp(0.75rem, 0.14rem + 2.78vw, 3rem)',
245
+ 'ak-fl-sm-lg': 'clamp(1rem, 0.43rem + 2.78vw, 3rem)',
246
+ 'ak-fl-sm-xl': 'clamp(1rem, 0rem + 4.17vw, 4.5rem)',
247
+ 'ak-fl-md-xl': 'clamp(1.5rem, 0.57rem + 3.47vw, 4.5rem)',
248
+ 'ak-fl-md-2xl': 'clamp(1.5rem, 0rem + 5.56vw, 6rem)',
249
+ 'ak-fl-lg-2xl': 'clamp(2rem, 0.57rem + 5.56vw, 6rem)',
250
+ 'ak-fl-xl-3xl': 'clamp(3rem, 0.57rem + 8.33vw, 9rem)',
251
+ 'ak-fl-page-margin': 'var(--spacing-ak-fl-page-margin)',
252
+ },
253
+
254
+ /* ── Font Family ── */
255
+ fontFamily: {
256
+ // Var-driven so a container/theme can re-font at runtime by setting
257
+ // the CSS variable (the font dial). Literal stacks remain as var fallbacks.
258
+ 'ak-sans': ['var(--font-ak-sans, Inter)', 'system-ui', '-apple-system', 'sans-serif'],
259
+ 'ak-heading': ['var(--font-ak-heading, var(--font-ak-sans, Inter))', 'system-ui', 'sans-serif'],
260
+ 'ak-serif': ['var(--font-ak-serif, "DM Serif Display")', 'Georgia', 'serif'],
261
+ 'ak-mono': ['var(--font-ak-mono, "JetBrains Mono")', 'Fira Code', 'ui-monospace', 'monospace'],
262
+ },
263
+
264
+ /* ── Font Size ──
265
+ text-ak-base, text-ak-lg, text-ak-fl-2xl, etc. */
266
+ fontSize: {
267
+ // Static scale
268
+ 'ak-2xs': 'var(--text-ak-2xs)',
269
+ 'ak-xs': 'var(--text-ak-xs)',
270
+ 'ak-xs_5': 'var(--text-ak-xs_5)',
271
+ 'ak-xs.5': 'var(--text-ak-xs_5)',
272
+ 'ak-sm': 'var(--text-ak-sm)',
273
+ 'ak-sm_5': 'var(--text-ak-sm_5)',
274
+ 'ak-sm.5': 'var(--text-ak-sm_5)',
275
+ 'ak-base': 'var(--text-ak-base)',
276
+ 'ak-lg': 'var(--text-ak-lg)',
277
+ 'ak-xl': 'var(--text-ak-xl)',
278
+ 'ak-xl_5': 'var(--text-ak-xl_5)',
279
+ 'ak-xl.5': 'var(--text-ak-xl_5)',
280
+ 'ak-2xl': 'var(--text-ak-2xl)',
281
+ 'ak-2xl_5': 'var(--text-ak-2xl_5)',
282
+ 'ak-2xl.5': 'var(--text-ak-2xl_5)',
283
+ 'ak-3xl': 'var(--text-ak-3xl)',
284
+ 'ak-4xl': 'var(--text-ak-4xl)',
285
+ 'ak-4xl_5': 'var(--text-ak-4xl_5)',
286
+ 'ak-4xl.5': 'var(--text-ak-4xl_5)',
287
+ 'ak-5xl': 'var(--text-ak-5xl)',
288
+ 'ak-6xl': 'var(--text-ak-6xl)',
289
+ 'ak-6xl_5': 'var(--text-ak-6xl_5)',
290
+ 'ak-6xl.5': 'var(--text-ak-6xl_5)',
291
+ 'ak-7xl': 'var(--text-ak-7xl)',
292
+ 'ak-7xl_5': 'var(--text-ak-7xl_5)',
293
+ 'ak-7xl.5': 'var(--text-ak-7xl_5)',
294
+ 'ak-8xl': 'var(--text-ak-8xl)',
295
+ 'ak-9xl': 'var(--text-ak-9xl)',
296
+ 'ak-10xl': 'var(--text-ak-10xl)',
297
+ // Fluid scale
298
+ 'ak-fl-xs': 'clamp(0.6875rem, 0.67rem + 0.06vw, 0.75rem)',
299
+ 'ak-fl-sm': 'clamp(0.75rem, 0.71rem + 0.12vw, 0.875rem)',
300
+ 'ak-fl-base': 'clamp(0.875rem, 0.84rem + 0.12vw, 1rem)',
301
+ 'ak-fl-lg': 'clamp(1rem, 0.96rem + 0.12vw, 1.125rem)',
302
+ 'ak-fl-xl': 'clamp(1.125rem, 1.09rem + 0.12vw, 1.25rem)',
303
+ 'ak-fl-2xl': 'clamp(1.25rem, 1.18rem + 0.23vw, 1.5rem)',
304
+ 'ak-fl-3xl': 'clamp(1.5rem, 1.39rem + 0.35vw, 1.875rem)',
305
+ 'ak-fl-4xl': 'clamp(1.875rem, 1.76rem + 0.35vw, 2.25rem)',
306
+ 'ak-fl-5xl': 'clamp(2.25rem, 2.03rem + 0.69vw, 3rem)',
307
+ 'ak-fl-6xl': 'clamp(3rem, 2.78rem + 0.69vw, 3.75rem)',
308
+ 'ak-fl-7xl': 'clamp(3.5rem, 3.2rem + 0.93vw, 4.5rem)',
309
+ 'ak-fl-8xl': 'clamp(4.5rem, 4.06rem + 1.39vw, 6rem)',
310
+ 'ak-fl-9xl': 'clamp(5.25rem, 4.73rem + 1.62vw, 7rem)',
311
+ // Display scale
312
+ 'ak-display-xs': 'clamp(0.75rem, 0.7rem + 0.15vw, 0.875rem)',
313
+ 'ak-display-sm': 'clamp(0.875rem, 0.83rem + 0.19vw, 1rem)',
314
+ 'ak-display-base': 'clamp(1rem, 0.94rem + 0.28vw, 1.1875rem)',
315
+ 'ak-display-lg': 'clamp(1.125rem, 1.01rem + 0.52vw, 1.5rem)',
316
+ 'ak-display-xl': 'clamp(1.25rem, 1.07rem + 0.83vw, 1.875rem)',
317
+ 'ak-display-2xl': 'clamp(1.5rem, 1.2rem + 1.11vw, 2.25rem)',
318
+ 'ak-display-3xl': 'clamp(1.875rem, 1.42rem + 1.67vw, 3rem)',
319
+ 'ak-display-4xl': 'clamp(2.25rem, 1.58rem + 2.5vw, 3.75rem)',
320
+ 'ak-display-5xl': 'clamp(3rem, 2.07rem + 3.47vw, 5.25rem)',
321
+ 'ak-display-6xl': 'clamp(3.75rem, 2.5rem + 4.63vw, 7rem)',
322
+ 'ak-display-7xl': 'clamp(4.5rem, 3.06rem + 5.56vw, 8rem)',
323
+ 'ak-display-8xl': 'clamp(5rem, 3.06rem + 6.94vw, 9rem)',
324
+ 'ak-display-9xl': 'clamp(5.5rem, 3.06rem + 7.64vw, 10rem)',
325
+
326
+ 'ak-watermark-2xs': 'clamp(1rem, 13cqi, 13rem)',
327
+ 'ak-watermark-xs': 'clamp(1rem, 16cqi, 16rem)',
328
+ 'ak-watermark-sm': 'clamp(1rem, 19cqi, 20rem)',
329
+ 'ak-watermark-base': 'clamp(1rem, 21cqi, 22rem)',
330
+ 'ak-watermark-md': 'clamp(1rem, 24cqi, 26rem)',
331
+ 'ak-watermark-lg': 'clamp(1rem, 26cqi, 28rem)',
332
+ 'ak-watermark-xl': 'clamp(1rem, 28cqi, 30rem)',
333
+ 'ak-watermark-2xl': 'clamp(1rem, 30cqi, 34rem)',
334
+ 'ak-watermark-3xl': 'clamp(1rem, 33cqi, 38rem)',
335
+ 'ak-watermark-4xl': 'clamp(1rem, 36cqi, 42rem)',
336
+ 'ak-watermark-5xl': 'clamp(1rem, 40cqi, 48rem)',
337
+ // Avatar initials font size
338
+ 'ak-avatar-xs': 'var(--text-ak-avatar-xs)',
339
+ 'ak-avatar-sm': 'var(--text-ak-avatar-sm)',
340
+ 'ak-avatar-md': 'var(--text-ak-avatar-md)',
341
+ 'ak-avatar-lg': 'var(--text-ak-avatar-lg)',
342
+ 'ak-avatar-xl': 'var(--text-ak-avatar-xl)',
343
+ 'ak-avatar-2xl': 'var(--text-ak-avatar-2xl)',
344
+ 'ak-avatar-3xl': 'var(--text-ak-avatar-3xl)',
345
+ // Badge text size
346
+ 'ak-badge-md': 'var(--text-ak-badge-md)',
347
+ 'ak-badge-lg': 'var(--text-ak-badge-lg)',
348
+ 'ak-badge-xl': 'var(--text-ak-badge-xl)',
349
+ 'ak-badge-2xl': 'var(--text-ak-badge-2xl)',
350
+ 'ak-badge-3xl': 'var(--text-ak-badge-3xl)',
351
+ },
352
+
353
+ /* ── Line Height ── */
354
+ lineHeight: {
355
+ 'ak-display': 'var(--leading-ak-display)',
356
+ 'ak-squeezed': 'var(--leading-ak-squeezed)',
357
+ 'ak-condensed': 'var(--leading-ak-condensed)',
358
+ 'ak-none': 'var(--leading-ak-none)',
359
+ 'ak-fitted': 'var(--leading-ak-fitted)',
360
+ 'ak-compact': 'var(--leading-ak-compact)',
361
+ 'ak-tighter': 'var(--leading-ak-tighter)',
362
+ 'ak-snugger': 'var(--leading-ak-snugger)',
363
+ 'ak-tight': 'var(--leading-ak-tight)',
364
+ 'ak-snug': 'var(--leading-ak-snug)',
365
+ 'ak-normal': 'var(--leading-ak-normal)',
366
+ 'ak-relaxed': 'var(--leading-ak-relaxed)',
367
+ 'ak-prose': 'var(--leading-ak-prose)',
368
+ 'ak-loose': 'var(--leading-ak-loose)',
369
+ },
370
+
371
+ /* ── Letter Spacing ── */
372
+ letterSpacing: {
373
+ 'ak-tighter': 'var(--tracking-ak-tighter)',
374
+ 'ak-tight': 'var(--tracking-ak-tight)',
375
+ 'ak-subtle': 'var(--tracking-ak-subtle)',
376
+ 'ak-normal': 'var(--tracking-ak-normal)',
377
+ 'ak-wide': 'var(--tracking-ak-wide)',
378
+ 'ak-wider': 'var(--tracking-ak-wider)',
379
+ 'ak-widest': 'var(--tracking-ak-widest)',
380
+ 'ak-section': 'var(--tracking-ak-section)',
381
+ },
382
+
383
+ /* ── Border Radius ── */
384
+ borderRadius: {
385
+ 'ak-none': 'var(--radius-ak-none)',
386
+ 'ak-xs': 'var(--radius-ak-xs)',
387
+ 'ak-sm': 'var(--radius-ak-sm)',
388
+ 'ak-md': 'var(--radius-ak-md)',
389
+ 'ak-lg': 'var(--radius-ak-lg)',
390
+ 'ak-xl': 'var(--radius-ak-xl)',
391
+ 'ak-2xl': 'var(--radius-ak-2xl)',
392
+ 'ak-3xl': 'var(--radius-ak-3xl)',
393
+ 'ak-full': 'var(--radius-ak-full)',
394
+ 'ak-input': 'var(--radius-ak-input)',
395
+ 'ak-control-sm': 'var(--radius-ak-control-sm)',
396
+ // Neobrutalist
397
+ 'ak-brutal': 'var(--radius-ak-brutal)',
398
+ 'ak-brutal-sm': 'var(--radius-ak-brutal-sm)',
399
+ },
400
+
401
+ /* ── Border Width ── */
402
+ borderWidth: {
403
+ 'ak-brutal': 'var(--border-ak-brutal)',
404
+ 'ak-brutal-lg': 'var(--border-ak-brutal-lg)',
405
+ },
406
+
407
+ /* ── Box Shadow ── */
408
+ boxShadow: {
409
+ 'ak-xs': 'var(--shadow-ak-xs)',
410
+ 'ak-sm': 'var(--shadow-ak-sm)',
411
+ 'ak-md': 'var(--shadow-ak-md)',
412
+ 'ak-lg': 'var(--shadow-ak-lg)',
413
+ 'ak-xl': 'var(--shadow-ak-xl)',
414
+ 'ak-2xl': 'var(--shadow-ak-2xl)',
415
+ 'ak-focus': 'var(--shadow-ak-focus)',
416
+ 'ak-focus-primary': 'var(--shadow-ak-focus-primary)',
417
+ 'ak-focus-danger': 'var(--shadow-ak-focus-danger)',
418
+ 'ak-focus-success': 'var(--shadow-ak-focus-success)',
419
+ // Neobrutalist
420
+ 'ak-brutal-xs': 'var(--shadow-ak-brutal-xs)',
421
+ 'ak-brutal-sm': 'var(--shadow-ak-brutal-sm)',
422
+ 'ak-brutal': 'var(--shadow-ak-brutal)',
423
+ 'ak-brutal-lg': 'var(--shadow-ak-brutal-lg)',
424
+ 'ak-brutal-xl': 'var(--shadow-ak-brutal-xl)',
425
+ 'ak-brutal-none': '0 0 0 0 #000',
426
+ },
427
+
428
+ /* ── Max Width (containers) ── */
429
+ maxWidth: {
430
+ 'ak-page': 'var(--container-ak-page)',
431
+ 'ak-xs': 'var(--container-ak-xs)',
432
+ 'ak-sm': 'var(--container-ak-sm)',
433
+ 'ak-md': 'var(--container-ak-md)',
434
+ 'ak-lg': 'var(--container-ak-lg)',
435
+ 'ak-xl': 'var(--container-ak-xl)',
436
+ 'ak-2xl': 'var(--container-ak-2xl)',
437
+ 'ak-3xl': 'var(--container-ak-3xl)',
438
+ 'ak-4xl': 'var(--container-ak-4xl)',
439
+ 'ak-prose': 'var(--container-ak-prose)',
440
+ },
441
+
442
+ /* ── Z-Index (Chakra-inspired scale) ── */
443
+ zIndex: {
444
+ 'ak-base': 'var(--z-ak-base)',
445
+ 'ak-docked': 'var(--z-ak-docked)',
446
+ 'ak-dropdown': 'var(--z-ak-dropdown)',
447
+ 'ak-sticky': 'var(--z-ak-sticky)',
448
+ 'ak-banner': 'var(--z-ak-banner)',
449
+ 'ak-overlay': 'var(--z-ak-overlay)',
450
+ 'ak-modal': 'var(--z-ak-modal)',
451
+ 'ak-popover': 'var(--z-ak-popover)',
452
+ 'ak-toast': 'var(--z-ak-toast)',
453
+ 'ak-tooltip': 'var(--z-ak-tooltip)',
454
+ },
455
+
456
+ /* ── Height ── (spacing + named heights) */
457
+ height: {
458
+ ...AK_SPACING,
459
+ 'ak-nav': 'var(--height-ak-nav)',
460
+ 'ak-touch': 'var(--height-ak-touch)',
461
+ 'ak-control-sm': 'var(--height-ak-control-sm)',
462
+ 'ak-control-md': 'var(--height-ak-control-md)',
463
+ 'ak-control-lg': 'var(--height-ak-control-lg)',
464
+ 'ak-control-xl': 'var(--height-ak-control-xl)',
465
+ 'ak-control-2xl': 'var(--height-ak-control-2xl)',
466
+ 'ak-row-compact': 'var(--height-ak-row-compact)',
467
+ 'ak-row-default': 'var(--height-ak-row-default)',
468
+ 'ak-row-comfortable': 'var(--height-ak-row-comfortable)',
469
+ },
470
+
471
+ /* ── Min Height ── */
472
+ minHeight: {
473
+ ...AK_SPACING,
474
+ 'ak-nav': 'var(--height-ak-nav)',
475
+ 'ak-touch': 'var(--height-ak-touch)',
476
+ 'ak-touch-min': 'var(--size-ak-touch-min)',
477
+ 'ak-control-sm': 'var(--height-ak-control-sm)',
478
+ 'ak-control-md': 'var(--height-ak-control-md)',
479
+ 'ak-control-lg': 'var(--height-ak-control-lg)',
480
+ 'ak-control-xl': 'var(--height-ak-control-xl)',
481
+ 'ak-control-2xl': 'var(--height-ak-control-2xl)',
482
+ 'ak-row-compact': 'var(--height-ak-row-compact)',
483
+ 'ak-row-default': 'var(--height-ak-row-default)',
484
+ 'ak-row-comfortable': 'var(--height-ak-row-comfortable)',
485
+ },
486
+
487
+ /* ── Width ── */
488
+ width: {
489
+ ...AK_SPACING,
490
+ 'ak-touch': 'var(--width-ak-touch)',
491
+ 'ak-panel-width': 'var(--size-ak-panel-width)',
492
+ 'ak-sidebar-collapsed': 'var(--width-ak-sidebar-collapsed)',
493
+ 'ak-sidebar-expanded': 'var(--width-ak-sidebar-expanded)',
494
+ },
495
+
496
+ /* ── Min Width ── */
497
+ minWidth: {
498
+ ...AK_SPACING,
499
+ 'ak-touch': 'var(--width-ak-touch)',
500
+ 'ak-panel-width': 'var(--size-ak-panel-width)',
501
+ 'ak-sidebar-collapsed': 'var(--width-ak-sidebar-collapsed)',
502
+ },
503
+
504
+ /* ── Size (width + height shorthand) ── */
505
+ size: {
506
+ ...AK_SPACING,
507
+ 'ak-icon-xs': 'var(--size-ak-icon-xs)',
508
+ 'ak-icon-sm': 'var(--size-ak-icon-sm)',
509
+ 'ak-icon-md': 'var(--size-ak-icon-md)',
510
+ 'ak-icon-lg': 'var(--size-ak-icon-lg)',
511
+ 'ak-icon-xl': 'var(--size-ak-icon-xl)',
512
+ 'ak-icon-2xl': 'var(--size-ak-icon-2xl)',
513
+ 'ak-icon-3xl': 'var(--size-ak-icon-3xl)',
514
+ 'ak-avatar-xs': 'var(--size-ak-avatar-xs)',
515
+ 'ak-avatar-sm': 'var(--size-ak-avatar-sm)',
516
+ 'ak-avatar-md': 'var(--size-ak-avatar-md)',
517
+ 'ak-avatar-lg': 'var(--size-ak-avatar-lg)',
518
+ 'ak-avatar-xl': 'var(--size-ak-avatar-xl)',
519
+ 'ak-avatar-2xl': 'var(--size-ak-avatar-2xl)',
520
+ 'ak-avatar-3xl': 'var(--size-ak-avatar-3xl)',
521
+ 'ak-touch': 'var(--width-ak-touch)',
522
+ 'ak-touch-min': 'var(--size-ak-touch-min)',
523
+ },
524
+
525
+ /* ── Transition Duration ── */
526
+ transitionDuration: {
527
+ 'ak-fast': 'var(--duration-ak-fast)',
528
+ 'ak-base': 'var(--duration-ak-base)',
529
+ 'ak-slow': 'var(--duration-ak-slow)',
530
+ 'ak-skeleton': 'var(--duration-ak-skeleton)',
531
+ },
532
+
533
+ /* ── Transition Timing Function ── */
534
+ transitionTimingFunction: {
535
+ 'ak-default': 'var(--ease-ak-default)',
536
+ 'ak-in': 'var(--ease-ak-in)',
537
+ 'ak-out': 'var(--ease-ak-out)',
538
+ 'ak-spring': 'var(--ease-ak-spring)',
539
+ 'ak-bounce': 'var(--ease-ak-bounce)',
540
+ },
541
+ },
542
+ },
543
+ }
544
+ )