@nextlyhq/ui 0.0.2-alpha.33 → 0.0.2-alpha.35

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/dist/theme.css ADDED
@@ -0,0 +1,859 @@
1
+ /**
2
+ * Nextly design-system theme.
3
+ *
4
+ * Single source of truth for tokens, the Tailwind `@theme inline` mappings, the
5
+ * dark variant, and the animation keyframes. It does NOT include a base reset —
6
+ * that lives in `index.css` and ships in the pre-compiled `styles.css` bundle.
7
+ * Consumed two ways:
8
+ * - Source: `@import "@nextlyhq/ui/theme.css"` after `@import "tailwindcss"`
9
+ * to compile against the token contract (admin, power-user plugins).
10
+ * - Pre-compiled: `@nextlyhq/ui/styles.css` bundles this behind a Tailwind
11
+ * build so plugins get styled components with zero setup.
12
+ *
13
+ * Selectors are unscoped (`:root` / `.dark`); a consumer that embeds the UI in a
14
+ * host page scopes them at build time (admin rewrites to `.nextly-admin`).
15
+ */
16
+
17
+ /**
18
+ * Activate `dark:` utilities from the `.dark` class rather than the OS
19
+ * `prefers-color-scheme`, so an explicit light choice wins over system dark.
20
+ */
21
+ @custom-variant dark (&:where(.dark, .dark *));
22
+
23
+ @theme inline {
24
+ /* ============================================
25
+ * ANIMATIONS (Tailwind v4.1)
26
+ * ============================================ */
27
+ --animate-accordion-down: accordion-down 0.3s cubic-bezier(0.87, 0, 0.13, 1);
28
+ --animate-accordion-up: accordion-up 0.3s cubic-bezier(0.87, 0, 0.13, 1);
29
+ --animate-fade-in: fade-in 0.2s ease-out;
30
+ --animate-fade-out: fade-out 0.2s ease-in;
31
+ --animate-zoom-in-95: zoom-in-95 0.1s ease-out;
32
+ --animate-zoom-out-95: zoom-out-95 0.1s ease-in;
33
+ --animate-slide-in-from-top-2: slide-in-from-top-2 0.2s ease-out;
34
+ --animate-slide-in-from-bottom-2: slide-in-from-bottom-2 0.2s ease-out;
35
+ --animate-slide-in-from-left-2: slide-in-from-left-2 0.2s ease-out;
36
+ --animate-slide-in-from-right-2: slide-in-from-right-2 0.2s ease-out;
37
+ --animate-brand-orbit: brand-orbit 2.4s linear infinite;
38
+ --animate-brand-pulse: brand-pulse 2s cubic-bezier(0.2, 0.8, 0.2, 1) infinite;
39
+
40
+ /* ============================================
41
+ * COLOR PALETTE (Tailwind v4.1)
42
+ * Monochrome design system, WCAG 2.2 AA compliant.
43
+ *
44
+ * Color Format Strategy:
45
+ * - Reference scales (blue/slate/etc.): HEX, kept for utility classes.
46
+ * - Semantic tokens: OKLCH full-color values defined in `:root` / `.dark`,
47
+ * mapped here via `@theme inline` with bare `var()` so scoped/dark
48
+ * overrides resolve at the consuming element.
49
+ * ============================================ */
50
+
51
+ /* Blue Scale - Primary Brand Color */
52
+ --color-blue-50: #eff6ff;
53
+ --color-blue-100: #dbeafe;
54
+ --color-blue-200: #bfdbfe;
55
+ --color-blue-300: #93c5fd;
56
+ --color-blue-400: #60a5fa;
57
+ --color-blue-500: #3b82f6;
58
+ --color-blue-600: #2563eb;
59
+ --color-blue-700: #1d4ed8;
60
+ --color-blue-800: #1e40af;
61
+ --color-blue-900: #1e3a8a;
62
+ --color-blue-950: #172554;
63
+
64
+ /* Cyan Scale - Accent Color */
65
+ --color-cyan-50: #ecfeff;
66
+ --color-cyan-100: #cffafe;
67
+ --color-cyan-200: #a5f3fc;
68
+ --color-cyan-300: #67e8f9;
69
+ --color-cyan-400: #22d3ee;
70
+ --color-cyan-500: #06b6d4;
71
+ --color-cyan-600: #0891b2;
72
+ --color-cyan-700: #0e7490;
73
+ --color-cyan-800: #155e75;
74
+ --color-cyan-900: #164e63;
75
+ --color-cyan-950: #083344;
76
+
77
+ /* Green Scale - Success Color */
78
+ --color-green-50: #f0fdf4;
79
+ --color-green-100: #dcfce7;
80
+ --color-green-200: #bbf7d0;
81
+ --color-green-300: #86efac;
82
+ --color-green-400: #4ade80;
83
+ --color-green-500: #22c55e;
84
+ --color-green-600: #16a34a;
85
+ --color-green-700: #15803d;
86
+ --color-green-800: #166534;
87
+ --color-green-900: #14532d;
88
+ --color-green-950: #052e16;
89
+
90
+ /* Amber Scale - Warning Color */
91
+ --color-amber-50: #fffbeb;
92
+ --color-amber-100: #fef3c7;
93
+ --color-amber-200: #fde68a;
94
+ --color-amber-300: #fcd34d;
95
+ --color-amber-400: #fbbf24;
96
+ --color-amber-500: #f59e0b;
97
+ --color-amber-600: #d97706;
98
+ --color-amber-700: #b45309;
99
+ --color-amber-800: #92400e;
100
+ --color-amber-900: #78350f;
101
+ --color-amber-950: #451a03;
102
+
103
+ /* Red Scale - Error/Destructive Color */
104
+ --color-red-50: #fef2f2;
105
+ --color-red-100: #fee2e2;
106
+ --color-red-200: #fecaca;
107
+ --color-red-300: #fca5a5;
108
+ --color-red-400: #f87171;
109
+ --color-red-500: #ef4444;
110
+ --color-red-600: #dc2626;
111
+ --color-red-700: #b91c1c;
112
+ --color-red-800: #991b1b;
113
+ --color-red-900: #7f1d1d;
114
+ --color-red-950: #450a0a;
115
+
116
+ /* Slate Scale - Neutral Colors */
117
+ --color-slate-50: #f8fafc;
118
+ --color-slate-100: #f1f5f9;
119
+ --color-slate-200: #e2e8f0;
120
+ --color-slate-300: #cbd5e1;
121
+ --color-slate-400: #94a3b8;
122
+ --color-slate-500: #64748b;
123
+ --color-slate-600: #475569;
124
+ --color-slate-700: #334155;
125
+ --color-slate-800: #1e293b;
126
+ --color-slate-900: #0f172a;
127
+ --color-slate-950: #020617;
128
+
129
+ /* ============================================
130
+ * SEMANTIC COLOR TOKENS (Tailwind v4.1)
131
+ * Reference color scales defined above
132
+ * ============================================ */
133
+
134
+ /* shadcn/ui semantic colors - reference CSS variables defined below */
135
+ --color-border: var(--nx-border);
136
+ --color-border-subtle: var(--nx-border-subtle);
137
+ --color-border-strong: var(--nx-border-strong);
138
+ --color-input: var(--nx-input);
139
+ --color-ring: var(--nx-ring);
140
+ --color-background: var(--nx-background);
141
+ --color-foreground: var(--nx-foreground);
142
+
143
+ --color-primary: var(--nx-primary);
144
+ --color-primary-50: color-mix(in srgb, var(--nx-primary), white 95%);
145
+ --color-primary-100: color-mix(in srgb, var(--nx-primary), white 90%);
146
+ --color-primary-200: color-mix(in srgb, var(--nx-primary), white 70%);
147
+ --color-primary-300: color-mix(in srgb, var(--nx-primary), white 50%);
148
+ --color-primary-400: color-mix(in srgb, var(--nx-primary), white 30%);
149
+ --color-primary-500: var(--nx-primary);
150
+ --color-primary-600: color-mix(in srgb, var(--nx-primary), black 10%);
151
+ --color-primary-700: color-mix(in srgb, var(--nx-primary), black 30%);
152
+ --color-primary-800: color-mix(in srgb, var(--nx-primary), black 50%);
153
+ --color-primary-900: color-mix(in srgb, var(--nx-primary), black 70%);
154
+ --color-primary-950: color-mix(in srgb, var(--nx-primary), black 85%);
155
+ --color-primary-foreground: var(--nx-primary-foreground);
156
+
157
+ --color-secondary: var(--nx-secondary);
158
+ --color-secondary-foreground: var(--nx-secondary-foreground);
159
+
160
+ /* Status scales, derived the same way as the primary scale above.
161
+ *
162
+ * A status role is one token; the scale is mixed from it, so retheming
163
+ * `--nx-success` moves every shade with it and they cannot drift apart. The
164
+ * shades exist because a status needs more than its solid colour: a tinted
165
+ * surface, a border on that surface, and text dark enough to read on it.
166
+ * Mixing toward white and black keeps 50 pale and 900 deep in both modes,
167
+ * which is what a `dark:` pair at the call site already assumes. */
168
+ --color-destructive: var(--nx-destructive);
169
+ --color-destructive-50: color-mix(in srgb, var(--nx-destructive), white 95%);
170
+ --color-destructive-100: color-mix(in srgb, var(--nx-destructive), white 90%);
171
+ --color-destructive-200: color-mix(in srgb, var(--nx-destructive), white 70%);
172
+ --color-destructive-300: color-mix(in srgb, var(--nx-destructive), white 50%);
173
+ --color-destructive-400: color-mix(in srgb, var(--nx-destructive), white 30%);
174
+ --color-destructive-500: var(--nx-destructive);
175
+ --color-destructive-600: color-mix(in srgb, var(--nx-destructive), black 10%);
176
+ --color-destructive-700: color-mix(in srgb, var(--nx-destructive), black 30%);
177
+ --color-destructive-800: color-mix(in srgb, var(--nx-destructive), black 50%);
178
+ --color-destructive-900: color-mix(in srgb, var(--nx-destructive), black 70%);
179
+ --color-destructive-950: color-mix(in srgb, var(--nx-destructive), black 85%);
180
+ --color-destructive-foreground: var(--nx-destructive-foreground);
181
+
182
+ --color-success: var(--nx-success);
183
+ --color-success-50: color-mix(in srgb, var(--nx-success), white 95%);
184
+ --color-success-100: color-mix(in srgb, var(--nx-success), white 90%);
185
+ --color-success-200: color-mix(in srgb, var(--nx-success), white 70%);
186
+ --color-success-300: color-mix(in srgb, var(--nx-success), white 50%);
187
+ --color-success-400: color-mix(in srgb, var(--nx-success), white 30%);
188
+ --color-success-500: var(--nx-success);
189
+ --color-success-600: color-mix(in srgb, var(--nx-success), black 10%);
190
+ --color-success-700: color-mix(in srgb, var(--nx-success), black 30%);
191
+ --color-success-800: color-mix(in srgb, var(--nx-success), black 50%);
192
+ --color-success-900: color-mix(in srgb, var(--nx-success), black 70%);
193
+ --color-success-950: color-mix(in srgb, var(--nx-success), black 85%);
194
+ --color-success-foreground: var(--nx-success-foreground);
195
+
196
+ --color-warning: var(--nx-warning);
197
+ --color-warning-50: color-mix(in srgb, var(--nx-warning), white 95%);
198
+ --color-warning-100: color-mix(in srgb, var(--nx-warning), white 90%);
199
+ --color-warning-200: color-mix(in srgb, var(--nx-warning), white 70%);
200
+ --color-warning-300: color-mix(in srgb, var(--nx-warning), white 50%);
201
+ --color-warning-400: color-mix(in srgb, var(--nx-warning), white 30%);
202
+ --color-warning-500: var(--nx-warning);
203
+ --color-warning-600: color-mix(in srgb, var(--nx-warning), black 10%);
204
+ --color-warning-700: color-mix(in srgb, var(--nx-warning), black 30%);
205
+ --color-warning-800: color-mix(in srgb, var(--nx-warning), black 50%);
206
+ --color-warning-900: color-mix(in srgb, var(--nx-warning), black 70%);
207
+ --color-warning-950: color-mix(in srgb, var(--nx-warning), black 85%);
208
+ --color-warning-foreground: var(--nx-warning-foreground);
209
+
210
+ /* The editor's highlight mark. A token rather than a literal because it
211
+ * styles authored content, which an integrator restyles to their own site
212
+ * and which has to stay readable on a dark page. */
213
+ --color-highlight: var(--nx-highlight);
214
+ --color-highlight-foreground: var(--nx-highlight-foreground);
215
+
216
+ /* Syntax colors, so code tokens are styled the same way as everything else
217
+ * (text-code-keyword, bg-code-bg) instead of through bespoke CSS. */
218
+ --color-code-bg: var(--nx-code-bg);
219
+ --color-code-fg: var(--nx-code-fg);
220
+ --color-code-comment: var(--nx-code-comment);
221
+ --color-code-keyword: var(--nx-code-keyword);
222
+ --color-code-string: var(--nx-code-string);
223
+ --color-code-number: var(--nx-code-number);
224
+ --color-code-function: var(--nx-code-function);
225
+ --color-code-operator: var(--nx-code-operator);
226
+ --color-code-punctuation: var(--nx-code-punctuation);
227
+ --color-code-variable: var(--nx-code-variable);
228
+ --color-code-tag: var(--nx-code-tag);
229
+ --color-code-deleted: var(--nx-code-deleted);
230
+ --color-code-inserted: var(--nx-code-inserted);
231
+
232
+ --color-muted: var(--nx-muted);
233
+ --color-muted-foreground: var(--nx-muted-foreground);
234
+
235
+ --color-accent: var(--nx-accent);
236
+ --color-accent-50: color-mix(in srgb, var(--nx-accent), white 95%);
237
+ --color-accent-100: color-mix(in srgb, var(--nx-accent), white 90%);
238
+ --color-accent-200: color-mix(in srgb, var(--nx-accent), white 70%);
239
+ --color-accent-300: color-mix(in srgb, var(--nx-accent), white 50%);
240
+ --color-accent-400: color-mix(in srgb, var(--nx-accent), white 30%);
241
+ --color-accent-500: var(--nx-accent);
242
+ --color-accent-600: color-mix(in srgb, var(--nx-accent), black 10%);
243
+ --color-accent-700: color-mix(in srgb, var(--nx-accent), black 30%);
244
+ --color-accent-800: color-mix(in srgb, var(--nx-accent), black 50%);
245
+ --color-accent-900: color-mix(in srgb, var(--nx-accent), black 70%);
246
+ --color-accent-950: color-mix(in srgb, var(--nx-accent), black 85%);
247
+ --color-accent-foreground: var(--nx-accent-foreground);
248
+
249
+ --color-card: var(--nx-card);
250
+ --color-card-foreground: var(--nx-card-foreground);
251
+
252
+ --color-popover: var(--nx-popover);
253
+ --color-popover-foreground: var(--nx-popover-foreground);
254
+
255
+ /* Sidebar semantic tokens */
256
+ --color-sidebar: var(--nx-sidebar-background);
257
+ --color-sidebar-background: var(--nx-sidebar-background);
258
+ --color-sidebar-foreground: var(--nx-sidebar-foreground);
259
+ --color-sidebar-primary: var(--nx-sidebar-primary);
260
+ --color-sidebar-primary-foreground: var(--nx-sidebar-primary-foreground);
261
+ --color-sidebar-accent: var(--nx-sidebar-accent);
262
+ --color-sidebar-accent-background: var(--nx-sidebar-accent);
263
+ --color-sidebar-accent-foreground: var(--nx-sidebar-accent-foreground);
264
+ --color-sidebar-border: var(--nx-sidebar-border);
265
+ --color-sidebar-ring: var(--nx-sidebar-ring);
266
+
267
+ /* ============================================
268
+ * TYPOGRAPHY (Tailwind v4.1)
269
+ * Perfect Fourth Scale (1.333 ratio) - WCAG 2.2 AA Compliant
270
+ * ============================================ */
271
+
272
+ /* Font Families */
273
+ --font-sans: var(--font-inter), Inter, sans-serif;
274
+ --font-mono:
275
+ ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono",
276
+ "Courier New", monospace;
277
+
278
+ /* Type Scale - Base Size: 16px (1rem) */
279
+ --text-xs: 0.75rem;
280
+ /* 12px */
281
+ --text-sm: 0.875rem;
282
+ /* 14px */
283
+ --text-base: 1rem;
284
+ /* 16px - body text (WCAG minimum) */
285
+ --text-lg: 1.125rem;
286
+ /* 18px */
287
+ --text-xl: 1.25rem;
288
+ /* 20px */
289
+ --text-2xl: 1.5rem;
290
+ /* 24px */
291
+ --text-3xl: 1.875rem;
292
+ /* 30px */
293
+ --text-4xl: 2.25rem;
294
+ /* 36px */
295
+ --text-5xl: 3rem;
296
+ /* 48px */
297
+ --text-6xl: 3.75rem;
298
+ /* 60px */
299
+
300
+ /* Font Weights */
301
+ --font-normal: 400;
302
+ /* Body text, captions */
303
+ --font-medium: 500;
304
+ /* Subheadings, emphasis */
305
+ --font-semibold: 600;
306
+ /* Headings, buttons */
307
+ --font-bold: 700;
308
+ /* Strong emphasis (rarely used) */
309
+
310
+ /* Line Heights (Leading) */
311
+ --leading-none: 1;
312
+ /* Large display text */
313
+ --leading-tight: 1.25;
314
+ /* Headings */
315
+ --leading-snug: 1.375;
316
+ /* Tight UI elements */
317
+ --leading-normal: 1.5;
318
+ /* Default for UI text */
319
+ --leading-relaxed: 1.625;
320
+ /* Long-form content */
321
+ --leading-loose: 2;
322
+ /* Very spacious text */
323
+
324
+ /* Letter Spacing (Tracking) */
325
+ --tracking-tighter: -0.05em;
326
+ /* -0.8px at 16px */
327
+ --tracking-tight: -0.025em;
328
+ /* -0.4px at 16px - for large headings */
329
+ --tracking-normal: 0em;
330
+ /* Default */
331
+ --tracking-wide: 0.025em;
332
+ /* +0.4px at 16px - for small text */
333
+ --tracking-wider: 0.05em;
334
+ /* +0.8px at 16px - for uppercase */
335
+ --tracking-widest: 0.1em;
336
+ /* +1.6px at 16px */
337
+
338
+ /* ============================================
339
+ * SPACING & LAYOUT (Tailwind v4.1)
340
+ * 8px Grid System - Industry Standard
341
+ * ============================================ */
342
+
343
+ /* Spacing Scale (8px base unit) */
344
+ --space-0: 0rem;
345
+ /* 0px */
346
+ --space-px: 0.0625rem;
347
+ /* 1px - for fine borders */
348
+ --space-0-5: 0.125rem;
349
+ /* 2px */
350
+ --space-1: 0.25rem;
351
+ /* 4px - icon padding, tiny gaps */
352
+ --space-1-5: 0.375rem;
353
+ /* 6px */
354
+ --space-2: 0.5rem;
355
+ /* 8px - tight spacing, inline elements */
356
+ --space-2-5: 0.625rem;
357
+ /* 10px */
358
+ --space-3: 0.75rem;
359
+ /* 12px - between related elements */
360
+ --space-3-5: 0.875rem;
361
+ /* 14px */
362
+ --space-4: 1rem;
363
+ /* 16px - standard element spacing */
364
+ --space-5: 1.25rem;
365
+ /* 20px */
366
+ --space-6: 1.5rem;
367
+ /* 24px - between form fields */
368
+ --space-7: 1.75rem;
369
+ /* 28px */
370
+ --space-8: 2rem;
371
+ /* 32px - between sections */
372
+ --space-9: 2.25rem;
373
+ /* 36px */
374
+ --space-10: 2.5rem;
375
+ /* 40px */
376
+ --space-11: 2.75rem;
377
+ /* 44px - minimum touch target */
378
+ --space-12: 3rem;
379
+ /* 48px - between major sections */
380
+ --space-14: 3.5rem;
381
+ /* 56px */
382
+ --space-16: 4rem;
383
+ /* 64px - page margins */
384
+ --space-20: 5rem;
385
+ /* 80px */
386
+ --space-24: 6rem;
387
+ /* 96px - large section breaks */
388
+
389
+ /* ============================================
390
+ * BORDER RADIUS (Tailwind v4.1)
391
+ * Derived from the single --radius knob (shadcn pattern). With
392
+ * --radius: 0 (sharp-corner design) every step resolves to 0.
393
+ * ============================================ */
394
+ --radius-sm: calc(var(--radius) - 4px);
395
+ --radius-md: calc(var(--radius) - 2px);
396
+ --radius-lg: var(--radius);
397
+ --radius-xl: calc(var(--radius) + 4px);
398
+ --radius-2xl: calc(var(--radius) + 8px);
399
+
400
+ /* ============================================
401
+ * BOX SHADOWS (Tailwind v4.1)
402
+ * ============================================ */
403
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
404
+ --shadow-md:
405
+ 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
406
+ --shadow-lg:
407
+ 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05);
408
+ --shadow-xl:
409
+ 0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04);
410
+
411
+ /* Custom Functional Shadows (Fixes build warnings from arbitrary values) */
412
+ --shadow-inner-subtle: 0 -4px 6px -1px rgba(0, 0, 0, 0.05);
413
+ --shadow-glow-success: 0 0 10px
414
+ color-mix(in srgb, var(--nx-success) 10%, transparent);
415
+ --shadow-glow-primary: 0 0 15px
416
+ color-mix(in srgb, var(--nx-primary) 50%, transparent);
417
+ --shadow-elevation-primary: 0 8px 20px -8px
418
+ color-mix(in srgb, var(--nx-primary) 40%, transparent);
419
+ --shadow-soft-primary: 0 8px 30px
420
+ color-mix(in srgb, var(--nx-primary) 6%, transparent);
421
+ --shadow-neo: 4px 4px 0px 0px rgba(0, 0, 0, 0.1);
422
+
423
+ /* ============================================
424
+ * FLUID TYPOGRAPHY (Tailwind v4.1)
425
+ * Fixes build warnings from arbitrary values
426
+ * ============================================ */
427
+ --text-fluid-2xs: clamp(0.6rem, 0.55rem + 0.1vw, 0.65rem);
428
+ --text-fluid-xs: clamp(0.65rem, 0.6rem + 0.1vw, 0.7rem);
429
+ --text-fluid-sm: clamp(0.7rem, 0.65rem + 0.1vw, 0.75rem);
430
+ --text-fluid-base: clamp(0.875rem, 0.8rem + 0.2vw, 1rem);
431
+ --text-fluid-lg: clamp(1rem, 2vw, 1.125rem);
432
+ --text-fluid-xl: clamp(1.25rem, 3vw, 1.5rem);
433
+ --text-fluid-2xl: clamp(1.5rem, 5vw, 2.25rem);
434
+ --text-fluid-3xl: clamp(1.5rem, 5vw, 2.5rem);
435
+ --text-fluid-4xl: clamp(1.75rem, 5vw, 2.5rem);
436
+
437
+ /* Custom Transitions */
438
+ --ease-premium: cubic-bezier(0.2, 0.8, 0.2, 1);
439
+ }
440
+
441
+ /* ============================================
442
+ * RESPONSIVE TYPOGRAPHY (Desktop)
443
+ * Scale up larger text sizes on desktop screens
444
+ * Must be outside @theme block due to Tailwind v4.1 restrictions
445
+ * ============================================ */
446
+ @media (min-width: 768px) {
447
+ @theme {
448
+ --text-2xl: 1.75rem;
449
+ /* 28px on desktop (from 24px) */
450
+ --text-3xl: 2.25rem;
451
+ /* 36px on desktop (from 30px) */
452
+ --text-4xl: 3rem;
453
+ /* 48px on desktop (from 36px) */
454
+ --text-5xl: 4rem;
455
+ /* 64px on desktop (from 48px) */
456
+ }
457
+ }
458
+
459
+ /* Animation keyframes referenced by the --animate-* tokens above. */
460
+ /* Keyframes for custom animations */
461
+ @keyframes brand-orbit {
462
+ from {
463
+ transform: rotate(0deg);
464
+ }
465
+ to {
466
+ transform: rotate(360deg);
467
+ }
468
+ }
469
+
470
+ @keyframes brand-pulse {
471
+ 0%,
472
+ 100% {
473
+ transform: scale(0.97);
474
+ filter: drop-shadow(
475
+ 0 0 10px color-mix(in srgb, var(--nx-primary) 8%, transparent)
476
+ );
477
+ }
478
+ 50% {
479
+ transform: scale(1.03);
480
+ filter: drop-shadow(
481
+ 0 0 20px color-mix(in srgb, var(--nx-primary) 22%, transparent)
482
+ );
483
+ }
484
+ }
485
+
486
+ @keyframes accordion-down {
487
+ from {
488
+ height: 0;
489
+ }
490
+
491
+ to {
492
+ height: var(--radix-accordion-content-height);
493
+ }
494
+ }
495
+
496
+ @keyframes accordion-up {
497
+ from {
498
+ height: var(--radix-accordion-content-height);
499
+ }
500
+
501
+ to {
502
+ height: 0;
503
+ }
504
+ }
505
+
506
+ @keyframes fade-in {
507
+ from {
508
+ opacity: 0;
509
+ }
510
+
511
+ to {
512
+ opacity: 1;
513
+ }
514
+ }
515
+
516
+ @keyframes fade-out {
517
+ from {
518
+ opacity: 1;
519
+ }
520
+
521
+ to {
522
+ opacity: 0;
523
+ }
524
+ }
525
+
526
+ @keyframes zoom-in-95 {
527
+ from {
528
+ opacity: 0;
529
+ transform: scale(0.95);
530
+ }
531
+
532
+ to {
533
+ opacity: 1;
534
+ transform: scale(1);
535
+ }
536
+ }
537
+
538
+ @keyframes zoom-out-95 {
539
+ from {
540
+ opacity: 1;
541
+ transform: scale(1);
542
+ }
543
+
544
+ to {
545
+ opacity: 0;
546
+ transform: scale(0.95);
547
+ }
548
+ }
549
+
550
+ @keyframes slide-in-from-top-2 {
551
+ from {
552
+ transform: translateY(-0.5rem);
553
+ }
554
+
555
+ to {
556
+ transform: translateY(0);
557
+ }
558
+ }
559
+
560
+ @keyframes slide-in-from-bottom-2 {
561
+ from {
562
+ transform: translateY(0.5rem);
563
+ }
564
+
565
+ to {
566
+ transform: translateY(0);
567
+ }
568
+ }
569
+
570
+ @keyframes slide-in-from-left-2 {
571
+ from {
572
+ transform: translateX(-0.5rem);
573
+ }
574
+
575
+ to {
576
+ transform: translateX(0);
577
+ }
578
+ }
579
+
580
+ @keyframes slide-in-from-right-2 {
581
+ from {
582
+ transform: translateX(0.5rem);
583
+ }
584
+
585
+ to {
586
+ transform: translateX(0);
587
+ }
588
+ }
589
+
590
+ :root {
591
+ /* Base colors - using Slate neutral scale */
592
+ --nx-background: oklch(1 0 0);
593
+ /* Pure white for weightless aesthetic */
594
+ --nx-page-background: oklch(0.9818 0 0);
595
+ /* #f9f9f9 for page content area */
596
+ --nx-foreground: oklch(0.2079 0.0399 265.73);
597
+ /* slate-900 */
598
+
599
+ /* Component colors */
600
+ --nx-card: oklch(1 0 0);
601
+ /* pure white for cards to pop on off-white bg */
602
+ --nx-card-foreground: oklch(0.2079 0.0399 265.73);
603
+ /* slate-900 */
604
+ --nx-popover: oklch(1 0 0);
605
+ /* white */
606
+ --nx-popover-foreground: oklch(0.2079 0.0399 265.73);
607
+ /* slate-900 */
608
+
609
+ /* Brand colors - Blue-Cyan Professional Palette */
610
+ --nx-primary: oklch(0 0 0);
611
+ /* Black for premium minimalist aesthetic */
612
+ --nx-primary-foreground: oklch(1 0 0);
613
+ /* white */
614
+
615
+ /* Secondary colors - using slate-100 for subtle backgrounds */
616
+ --nx-secondary: oklch(0.9684 0.0068 247.9);
617
+ /* slate-100 */
618
+ --nx-secondary-foreground: oklch(0.2079 0.0399 265.73);
619
+ /* slate-900 */
620
+
621
+ /* Utility colors */
622
+ --nx-muted: oklch(0.9696 0 0);
623
+ --nx-muted-foreground: oklch(0.5547 0.0407 257.44);
624
+ /* slate-500 */
625
+ --nx-accent: oklch(0.5547 0.0407 257.44);
626
+ /* Slate-500 per user request #64748b */
627
+ --nx-accent-foreground: oklch(1 0 0);
628
+ /* white */
629
+
630
+ /* State colors - WCAG 2.2 AA Compliant */
631
+ --nx-destructive: oklch(0.6368 0.2078 25.33);
632
+ /* red-500 (#ef4444) */
633
+ --nx-destructive-foreground: oklch(1 0 0);
634
+ /* white */
635
+ --nx-success: oklch(0.6273 0.17 149.2);
636
+ /* green-600 (#16a34a) - AA compliant */
637
+ --nx-success-foreground: oklch(1 0 0);
638
+ /* white */
639
+ --nx-warning: oklch(0.7686 0.1646 70.11);
640
+ /* amber-500 (#f59e0b) */
641
+ --nx-warning-foreground: oklch(0.2079 0.0399 265.73);
642
+ /* slate-900 - REQUIRED for AA contrast (warning-500 on white = 3.4:1, fails AA) */
643
+
644
+ /* The highlighter mark in authored content. Kept a light yellow in both
645
+ * modes on purpose: it stands for a marker pen drawn over the text, and the
646
+ * pairing below is what keeps that readable rather than the page's own
647
+ * foreground, which would be white-on-yellow in dark mode. */
648
+ --nx-highlight: oklch(0.9297 0.1638 101.06);
649
+ /* yellow-200 */
650
+ --nx-highlight-foreground: oklch(0.2079 0.0399 265.73);
651
+ /* slate-900 — the mark keeps its own dark text, whatever the page does */
652
+
653
+ /* Syntax colors. The tokenizer reports what a token *is*; these decide how
654
+ * it looks, so a code block carries no colour of its own and renders from
655
+ * whichever mode is active. Kept muted against the monochrome chrome, and
656
+ * held above 4.5:1 on --nx-code-bg since code is small text. */
657
+ --nx-code-bg: oklch(0.9761 0.0035 247.86);
658
+ --nx-code-fg: oklch(0.2079 0.0399 265.73);
659
+ --nx-code-comment: oklch(0.5547 0.0407 257.44);
660
+ --nx-code-keyword: oklch(0.4882 0.2172 303.9);
661
+ --nx-code-string: oklch(0.4478 0.1189 152.1);
662
+ --nx-code-number: oklch(0.5106 0.1518 44.2);
663
+ --nx-code-function: oklch(0.4757 0.1444 254.6);
664
+ --nx-code-operator: oklch(0.4936 0.1418 8.4);
665
+ --nx-code-punctuation: oklch(0.5547 0.0407 257.44);
666
+ --nx-code-variable: oklch(0.4694 0.1173 62.3);
667
+ --nx-code-tag: oklch(0.5054 0.1905 27.5);
668
+ --nx-code-deleted: oklch(0.5054 0.1905 27.5);
669
+ --nx-code-inserted: oklch(0.4478 0.1189 152.1);
670
+
671
+ /* Element colors — 3-tier translucent border scale (monochrome).
672
+ * Was a single --nx-border at 5% black (~1.05:1, effectively invisible).
673
+ * subtle = decorative dividers/cards; default = tables/groups;
674
+ * strong = interactive control edges (inputs/checkbox) for prominence. */
675
+ --nx-border-subtle: oklch(0 0 0 / 0.08);
676
+ --nx-border: oklch(0 0 0 / 0.13);
677
+ --nx-border-strong: oklch(0 0 0 / 0.3);
678
+ --nx-input: oklch(
679
+ 0.7384 0.0116 286.11
680
+ ); /* zinc-400: stronger visible field border (was zinc-300, too faint) */
681
+ --nx-ring: var(--nx-primary);
682
+
683
+ /* Chart colors for data visualization */
684
+ --nx-chart-1: var(--nx-primary);
685
+ --nx-chart-2: oklch(0.7399 0.1277 209.34);
686
+ /* cyan-500 */
687
+ --nx-chart-3: oklch(0.6273 0.17 149.2);
688
+ /* green-600 */
689
+ --nx-chart-4: oklch(0.7686 0.1646 70.11);
690
+ /* amber-500 */
691
+ --nx-chart-5: oklch(0.6368 0.2078 25.33);
692
+ /* red-500 */
693
+
694
+ /* Design tokens */
695
+ --radius: 0px;
696
+
697
+ /* Control sizing — derived from a single height knob so control density
698
+ * scales from one place. Steps map to the control size variants:
699
+ * sm 32px, md 36px, default 40px, lg 44px. */
700
+ --nx-control-height: 2.5rem;
701
+ --nx-control-height-sm: calc(var(--nx-control-height) - 0.5rem);
702
+ --nx-control-height-md: calc(var(--nx-control-height) - 0.25rem);
703
+ --nx-control-height-lg: calc(var(--nx-control-height) + 0.25rem);
704
+
705
+ /* Focus ring colors */
706
+ --nx-focus-ring: var(--nx-primary);
707
+ --nx-focus-ring-offset: oklch(1 0 0);
708
+ /* white */
709
+
710
+ /* Sidebar specific colors - using Slate scale */
711
+ --nx-sidebar-background: var(--nx-background);
712
+ /* flat with the content surface; nav is separated by borders, not fill */
713
+ --nx-sidebar-foreground: oklch(0.372 0.0392 257.3);
714
+ /* slate-700 */
715
+ --nx-sidebar-primary: oklch(0.2079 0.0399 265.73);
716
+ /* slate-900 */
717
+ --nx-sidebar-primary-foreground: oklch(0.9838 0.0035 247.86);
718
+ /* slate-50 */
719
+ --nx-sidebar-accent: oklch(0.9684 0.0068 247.9);
720
+ /* slate-100 */
721
+ --nx-sidebar-accent-foreground: oklch(0.2079 0.0399 265.73);
722
+ /* slate-900 */
723
+ --nx-sidebar-border: oklch(0.929 0.0126 255.53);
724
+ /* slate-200 */
725
+ --nx-sidebar-ring: var(--nx-primary);
726
+
727
+ /* Data table specific colors */
728
+ --nx-table-row-hover: oklch(0.9848 0 0);
729
+ --nx-table-row-selected: var(--nx-primary);
730
+ --nx-table-border: var(--nx-border);
731
+ }
732
+
733
+ /* Dark theme overrides when using class-based theming */
734
+ .dark {
735
+ /* Base colors - using Slate dark scale */
736
+ --nx-background: oklch(0.1358 0.0163 262.71);
737
+ /* ultra deep dark background (darker than slate-950) */
738
+ --nx-page-background: oklch(0.1358 0.0163 262.71);
739
+ /* Matches background in dark mode */
740
+ --nx-foreground: oklch(0.9838 0.0035 247.86);
741
+ /* slate-50 */
742
+
743
+ /* Component colors */
744
+ --nx-card: oklch(0.1916 0.0228 266.36);
745
+ /* raised one tonal step above --nx-background (222 47% 4%) so panels/cards
746
+ * read as distinct surfaces in dark mode instead of merging into the page */
747
+ --nx-card-foreground: oklch(0.9838 0.0035 247.86);
748
+ /* slate-50 */
749
+ --nx-popover: oklch(0.369 0.0249 257.44);
750
+ /* slate-800 */
751
+ --nx-popover-foreground: oklch(0.9838 0.0035 247.86);
752
+ /* slate-50 */
753
+
754
+ /* Brand colors - Blue-Cyan Professional Palette (Dark Mode) */
755
+ --nx-primary: oklch(1 0 0); /* High contrast White for dark mode */
756
+ --nx-primary-foreground: oklch(0.2079 0.0399 265.73);
757
+ /* slate-900 */
758
+
759
+ /* Secondary colors - using slate-800 for dark backgrounds */
760
+ --nx-secondary: oklch(0.28 0.0369 259.97);
761
+ /* slate-800 */
762
+ --nx-secondary-foreground: oklch(0.9838 0.0035 247.86);
763
+ /* slate-50 */
764
+
765
+ /* Utility colors */
766
+ --nx-muted: oklch(0.28 0.0369 259.97);
767
+ /* slate-800 */
768
+ --nx-muted-foreground: oklch(0.7107 0.0351 256.79);
769
+ /* slate-400 */
770
+ --nx-accent: oklch(
771
+ 0.5547 0.0407 257.44
772
+ ); /* Slate-500 per user request #64748b */
773
+ --nx-accent-foreground: oklch(1 0 0);
774
+ /* white */
775
+
776
+ /* State colors - WCAG 2.2 AA Compliant (Dark Mode) */
777
+ --nx-destructive: oklch(0.6368 0.2078 25.33);
778
+ /* red-500 */
779
+ --nx-destructive-foreground: oklch(1 0 0);
780
+ /* white */
781
+ --nx-success: oklch(0.7229 0.1921 149.58);
782
+ /* green-500 - brighter for dark mode */
783
+ --nx-success-foreground: oklch(1 0 0);
784
+ /* white */
785
+ --nx-warning: oklch(0.7686 0.1646 70.11);
786
+ /* amber-500 */
787
+ --nx-warning-foreground: oklch(0.2079 0.0399 265.73);
788
+ /* slate-900 */
789
+
790
+ /* Dimmed so the mark reads as highlighted rather than as a lamp on a dark
791
+ * page, while its own foreground stays dark enough to read against it. */
792
+ --nx-highlight: oklch(0.8 0.1425 101.06);
793
+ /* yellow-300-ish, pulled back for the dark surface */
794
+ --nx-highlight-foreground: oklch(0.2079 0.0399 265.73);
795
+ /* slate-900 */
796
+
797
+ /* Syntax colors (dark). Lightened rather than reused from light mode: the
798
+ * light hues sit near 0.45-0.5 lightness and disappear on the dark surface.
799
+ * Chroma is pulled back slightly so they don't vibrate against it. */
800
+ --nx-code-bg: oklch(0.1916 0.0228 266.36);
801
+ --nx-code-fg: oklch(0.9838 0.0035 247.86);
802
+ --nx-code-comment: oklch(0.6626 0.0364 256.79);
803
+ --nx-code-keyword: oklch(0.7482 0.1235 303.9);
804
+ --nx-code-string: oklch(0.7654 0.1476 152.1);
805
+ --nx-code-number: oklch(0.7807 0.1189 44.2);
806
+ --nx-code-function: oklch(0.7365 0.1163 254.6);
807
+ --nx-code-operator: oklch(0.7549 0.1234 8.4);
808
+ --nx-code-punctuation: oklch(0.6626 0.0364 256.79);
809
+ --nx-code-variable: oklch(0.7938 0.1052 62.3);
810
+ --nx-code-tag: oklch(0.7118 0.1476 27.5);
811
+ --nx-code-deleted: oklch(0.7118 0.1476 27.5);
812
+ --nx-code-inserted: oklch(0.7654 0.1476 152.1);
813
+
814
+ /* Element colors — 3-tier translucent border scale (white-alpha for dark).
815
+ * Recomputed as white-over-dark alpha (not a flipped hex) so dividers read
816
+ * on the deep background without glowing. Was ~1.2:1 (too faint). */
817
+ --nx-border-subtle: oklch(1 0 0 / 0.08);
818
+ --nx-border: oklch(1 0 0 / 0.13);
819
+ --nx-border-strong: oklch(1 0 0 / 0.34);
820
+ --nx-input: oklch(
821
+ 0.4987 0.0128 285.92
822
+ ); /* stronger visible field border (was zinc-700, too faint) */
823
+ --nx-ring: var(--nx-primary);
824
+
825
+ /* Chart colors for data visualization (same as light mode) */
826
+ --nx-chart-1: var(--nx-primary);
827
+ --nx-chart-2: oklch(0.7399 0.1277 209.34);
828
+ /* cyan-500 */
829
+ --nx-chart-3: oklch(0.7229 0.1921 149.58);
830
+ /* green-500 */
831
+ --nx-chart-4: oklch(0.7686 0.1646 70.11);
832
+ /* amber-500 */
833
+ --nx-chart-5: oklch(0.6368 0.2078 25.33);
834
+ /* red-500 */
835
+
836
+ /* Sidebar specific colors - dark mode */
837
+ --nx-sidebar-background: var(--nx-background);
838
+ /* flat with the content surface; nav is separated by borders, not fill */
839
+ --nx-sidebar-foreground: oklch(0.9838 0.0035 247.86);
840
+ /* slate-50 */
841
+ --nx-sidebar-primary: oklch(0.9838 0.0035 247.86);
842
+ /* slate-50 */
843
+ --nx-sidebar-primary-foreground: oklch(0.2079 0.0399 265.73);
844
+ /* slate-900 */
845
+ --nx-sidebar-accent: oklch(0.28 0.0369 259.97);
846
+ /* slate-800 */
847
+ --nx-sidebar-accent-foreground: oklch(0.9838 0.0035 247.86);
848
+ /* slate-50 */
849
+ --nx-sidebar-border: oklch(0.2321 0.0129 257.43);
850
+ /* subtle slate-900 */
851
+ --nx-sidebar-ring: var(--nx-primary);
852
+
853
+ /* Data table specific colors - dark mode */
854
+ --nx-table-row-hover: oklch(0.28 0.0369 259.97);
855
+ /* slate-800 */
856
+ --nx-table-row-selected: var(--nx-primary);
857
+ --nx-table-border: var(--nx-border);
858
+ /* inherit the retuned white-alpha border (was a fixed faint slate) */
859
+ }