@j3m-quantum/ui 0.4.0 → 0.7.1

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,26 +1,824 @@
1
1
  /* ========================================
2
- J3M QUANTUM UI - COMPLETE STYLES
3
-
4
- Self-contained styles for J3M UI components.
5
- No need to run shadcn init - everything is included.
2
+ J3M QUANTUM UI - Complete Theme
3
+ TweakCN-style structure for global theming
6
4
 
7
5
  Usage:
8
6
  @import "tailwindcss";
9
- @source "../node_modules/@j3m-quantum/ui/dist";
10
7
  @import "@j3m-quantum/ui/styles";
11
8
  ======================================== */
12
9
 
13
- /* 1. Base shadcn theme (theme variables, dark mode, base layer) */
14
- @import "./base.css";
10
+ /* ========================================
11
+ SCALE TOKENS (Primitives)
12
+ Direct values - source of truth
13
+ ======================================== */
14
+
15
+ :root {
16
+ /* Primary Orange Scale */
17
+ --j3m-primary-100: #FBCEB5;
18
+ --j3m-primary-200: #F79D6B;
19
+ --j3m-primary-250: #F58446;
20
+ --j3m-primary-300: #F36C21;
21
+ --j3m-primary-350: #EA5B0C;
22
+ --j3m-primary-400: #CA4F0B;
23
+ --j3m-primary-500: #8F3808;
24
+
25
+ /* Neutral Gray Scale */
26
+ --j3m-neutral-100: #FFFFFF;
27
+ --j3m-neutral-200: #E8E8E8;
28
+ --j3m-neutral-250: #DADBDC;
29
+ --j3m-neutral-300: #D2D2D2;
30
+ --j3m-neutral-350: #D1D1D1;
31
+ --j3m-neutral-400: #BBBBBB;
32
+ --j3m-neutral-500: #A4A4A4;
33
+ --j3m-neutral-600: #8E8E8E;
34
+ --j3m-neutral-700: #777777;
35
+ --j3m-neutral-750: #747474;
36
+ --j3m-neutral-800: #606060;
37
+ --j3m-neutral-900: #4A4A4A;
38
+ --j3m-neutral-1000: #333333;
39
+
40
+ /* Status Colors */
41
+ --j3m-red-100: #FB3748;
42
+ --j3m-red-200: #D00416;
43
+ --j3m-yellow-100: #FFDB43;
44
+ --j3m-yellow-200: #DFB400;
45
+ --j3m-green-100: #84EBB4;
46
+ --j3m-green-200: #1FC16B;
47
+
48
+ /* ========================================
49
+ SEMANTIC TOKENS
50
+ Purpose-driven aliases
51
+ ======================================== */
52
+
53
+ /* Background Hierarchy */
54
+ --color-bg-app: var(--j3m-neutral-350);
55
+ --color-bg-page: var(--j3m-neutral-200);
56
+ --color-bg-surface: var(--j3m-neutral-100);
57
+ --color-bg-subtle: var(--j3m-neutral-200);
58
+ --color-bg-toolbar: var(--j3m-neutral-250);
59
+
60
+ /* Text Colors (opacity-based for glass) */
61
+ --color-text-main: rgba(0, 0, 0, 0.7);
62
+ --color-text-muted: rgba(0, 0, 0, 0.5);
63
+ --color-text-soft: rgba(0, 0, 0, 0.4);
64
+ --color-text-on-accent: #FFFFFF;
65
+ --color-text-on-accent-muted: rgba(255, 255, 255, 0.5);
66
+
67
+ /* Border Colors */
68
+ --color-border-subtle: var(--j3m-neutral-200);
69
+ --color-border-strong: var(--j3m-neutral-400);
70
+
71
+ /* Accent/Interactive Colors */
72
+ --color-accent: var(--j3m-primary-250);
73
+ --color-accent-hover: var(--j3m-primary-300);
74
+ --color-accent-active: var(--j3m-primary-350);
75
+
76
+ /* Interactive Component Patterns */
77
+ --color-interactive-bg: var(--j3m-primary-250);
78
+ --color-interactive-text: var(--j3m-neutral-100);
79
+ --color-cta-bg: var(--j3m-primary-300);
80
+ --color-cta-text: var(--j3m-neutral-100);
81
+ --color-focus-ring: rgba(245, 132, 70, 0.2);
82
+ --color-hover-overlay-light: rgba(255, 255, 255, 0.2);
83
+ --color-hover-overlay-dark: rgba(51, 51, 51, 0.1);
84
+
85
+ /* Status Semantic */
86
+ --color-success-bg: var(--j3m-green-100);
87
+ --color-success-border: var(--j3m-green-200);
88
+ --color-success-text: var(--j3m-green-200);
89
+ --color-warning-bg: var(--j3m-yellow-100);
90
+ --color-warning-border: var(--j3m-yellow-200);
91
+ --color-warning-text: var(--j3m-yellow-200);
92
+ --color-error-bg: var(--j3m-red-100);
93
+ --color-error-border: var(--j3m-red-200);
94
+ --color-error-text: var(--j3m-red-100);
95
+
96
+ /* Tooltip */
97
+ --color-tooltip-bg: var(--j3m-neutral-1000);
98
+ --color-tooltip-text: var(--j3m-neutral-100);
99
+
100
+ /* Progress */
101
+ --color-progress-fill: var(--j3m-primary-250);
102
+ --color-progress-track: rgba(255, 255, 255, 0.5);
103
+
104
+ /* Form Controls */
105
+ --color-checkbox-bg: rgba(255, 255, 255, 0.5);
106
+ --color-radio-bg: rgba(255, 255, 255, 0.5);
107
+
108
+ /* ========================================
109
+ RADIUS TOKENS
110
+ ======================================== */
111
+ --j3m-radius-none: 0px;
112
+ --j3m-radius-2xs: 4px;
113
+ --j3m-radius-xs: 5px;
114
+ --j3m-radius-s: 8px;
115
+ --j3m-radius-m: 10px;
116
+ --j3m-radius-l: 18px;
117
+ --j3m-radius-xl: 22px;
118
+ --j3m-radius-2xl: 26px;
119
+ --j3m-radius-full: 9999px;
120
+
121
+ /* ========================================
122
+ SPACING TOKENS
123
+ ======================================== */
124
+ --j3m-spacing-xs: 8px;
125
+ --j3m-spacing-s: 12px;
126
+ --j3m-spacing-m: 16px;
127
+ --j3m-spacing-l: 24px;
128
+ --j3m-spacing-xl: 32px;
129
+
130
+ /* ========================================
131
+ STROKE/BORDER TOKENS
132
+ ======================================== */
133
+ --j3m-stroke-none: 0px;
134
+ --j3m-stroke-s: 1px;
135
+ --j3m-stroke-m: 2px;
136
+ --j3m-stroke-l: 3px;
137
+ --j3m-stroke-xl: 4px;
138
+
139
+ /* Stroke Colors (opacity-based) */
140
+ --j3m-stroke-dark-5: rgba(0, 0, 0, 0.05);
141
+ --j3m-stroke-dark-10: rgba(0, 0, 0, 0.1);
142
+ --j3m-stroke-dark-20: rgba(0, 0, 0, 0.2);
143
+ --j3m-stroke-light-5: rgba(255, 255, 255, 0.05);
144
+ --j3m-stroke-light-10: rgba(255, 255, 255, 0.1);
145
+ --j3m-stroke-light-20: rgba(255, 255, 255, 0.2);
146
+ --j3m-stroke-white: rgba(255, 255, 255, 1);
147
+ --j3m-stroke-primary-10: rgba(243, 108, 33, 0.1);
148
+ --j3m-stroke-primary-350-50: rgba(234, 91, 12, 0.5);
149
+ --j3m-stroke-neutral-1000-10: rgba(51, 51, 51, 0.1);
150
+
151
+ /* ========================================
152
+ GLASS EFFECTS
153
+ ======================================== */
154
+
155
+ /* Blur Scale */
156
+ --j3m-blur-sm: 10px;
157
+ --j3m-blur-md: 20px;
158
+ --j3m-blur-lg: 50px;
159
+
160
+ /* Glass Backgrounds */
161
+ --j3m-glass-light-10: rgba(255, 255, 255, 0.1);
162
+ --j3m-glass-light-20: rgba(255, 255, 255, 0.2);
163
+ --j3m-glass-light-40: rgba(255, 255, 255, 0.4);
164
+ --j3m-glass-light-50: rgba(255, 255, 255, 0.5);
165
+ --j3m-glass-light-70: rgba(255, 255, 255, 0.7);
166
+ --j3m-glass-light-80: rgba(255, 255, 255, 0.8);
167
+ --j3m-glass-light-subtle: rgba(255, 255, 255, 0.1);
168
+ --j3m-glass-light: rgba(255, 255, 255, 0.5);
169
+ --j3m-glass-light-hover: rgba(255, 255, 255, 0.7);
170
+ --j3m-glass-light-strong: rgba(255, 255, 255, 0.81);
171
+ --j3m-glass-dark: rgba(51, 51, 51, 0.6);
172
+ --j3m-glass-dark-hover: rgba(51, 51, 51, 0.7);
173
+ --j3m-glass-dark-strong: rgba(51, 51, 51, 0.85);
174
+ --j3m-glass-neutral-subtle: rgba(227, 227, 227, 0.3);
175
+ --j3m-glass-neutral: rgba(227, 227, 227, 0.5);
176
+ --j3m-glass-neutral-strong: rgba(227, 227, 227, 0.7);
177
+ --j3m-glass-primary: rgba(243, 108, 33, 0.1);
178
+ --j3m-glass-primary-highlight: rgba(243, 108, 33, 0.2);
179
+
180
+ /* Glass Borders */
181
+ --j3m-glass-border-light: rgba(255, 255, 255, 0.3);
182
+ --j3m-glass-border-subtle: rgba(255, 255, 255, 0.1);
183
+ --j3m-glass-border-white: rgba(255, 255, 255, 0.2);
184
+
185
+ /* Glass Shadows */
186
+ --j3m-glass-shadow-sm: 0 2px 8px rgba(0, 0, 0, 0.04), 0 1px 2px rgba(0, 0, 0, 0.06);
187
+ --j3m-glass-shadow-md: 0 4px 16px rgba(0, 0, 0, 0.06), 0 2px 4px rgba(0, 0, 0, 0.08);
188
+ --j3m-glass-shadow-lg: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
189
+ --j3m-glass-shadow-glow: 0 0 10px var(--j3m-primary-300);
190
+ --j3m-glass-shadow-glow-active: 0 0 20px var(--j3m-primary-350);
191
+
192
+ /* ========================================
193
+ SHADCN/TAILWIND SEMANTIC TOKENS
194
+ For standard shadcn component compatibility
195
+ ======================================== */
196
+ --primary: var(--j3m-primary-250);
197
+ --primary-foreground: #FFFFFF;
198
+ --secondary: var(--j3m-neutral-200);
199
+ --secondary-foreground: var(--j3m-neutral-900);
200
+ --muted: var(--j3m-neutral-200);
201
+ --muted-foreground: var(--j3m-neutral-600);
202
+ --accent: var(--j3m-primary-250);
203
+ --accent-foreground: #FFFFFF;
204
+ --destructive: var(--j3m-red-100);
205
+ --destructive-foreground: #FFFFFF;
206
+ --background: var(--j3m-neutral-100);
207
+ --foreground: var(--j3m-neutral-1000);
208
+ --card: var(--j3m-neutral-100);
209
+ --card-foreground: var(--j3m-neutral-1000);
210
+ --popover: var(--j3m-neutral-100);
211
+ --popover-foreground: var(--j3m-neutral-1000);
212
+ --border: var(--j3m-neutral-300);
213
+ --input: var(--j3m-neutral-300);
214
+ --ring: var(--j3m-primary-250);
215
+
216
+ /* Sidebar */
217
+ --sidebar: var(--j3m-neutral-100);
218
+ --sidebar-foreground: var(--j3m-neutral-900);
219
+ --sidebar-primary: var(--j3m-primary-300);
220
+ --sidebar-primary-foreground: #FFFFFF;
221
+ --sidebar-accent: var(--j3m-neutral-200);
222
+ --sidebar-accent-foreground: var(--j3m-neutral-900);
223
+ --sidebar-border: var(--j3m-neutral-200);
224
+ --sidebar-ring: var(--j3m-primary-300);
225
+
226
+ /* Chart Colors */
227
+ --chart-1: var(--j3m-primary-300);
228
+ --chart-2: var(--j3m-green-200);
229
+ --chart-3: var(--j3m-neutral-700);
230
+ --chart-4: var(--j3m-yellow-100);
231
+ --chart-5: var(--j3m-primary-200);
232
+
233
+ /* Global Radius */
234
+ --radius: 12px;
235
+
236
+ /* Shadows */
237
+ --shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
238
+ --shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1), 0 1px 2px -1px rgba(0, 0, 0, 0.1);
239
+ --shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -2px rgba(0, 0, 0, 0.1);
240
+ --shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -4px rgba(0, 0, 0, 0.1);
241
+ }
242
+
243
+ /* ========================================
244
+ DARK MODE
245
+ ======================================== */
246
+
247
+ .dark {
248
+ /* Background Hierarchy */
249
+ --color-bg-app: var(--j3m-neutral-1000);
250
+ --color-bg-page: var(--j3m-neutral-900);
251
+ --color-bg-surface: var(--j3m-neutral-800);
252
+ --color-bg-subtle: var(--j3m-neutral-700);
253
+ --color-bg-toolbar: var(--j3m-neutral-750);
254
+
255
+ /* Text Colors */
256
+ --color-text-main: rgba(255, 255, 255, 0.9);
257
+ --color-text-muted: rgba(255, 255, 255, 0.6);
258
+ --color-text-soft: rgba(255, 255, 255, 0.4);
259
+
260
+ /* Border Colors */
261
+ --color-border-subtle: var(--j3m-neutral-700);
262
+ --color-border-strong: var(--j3m-neutral-600);
263
+
264
+ /* Shadcn tokens */
265
+ --primary: var(--j3m-primary-250);
266
+ --primary-foreground: var(--j3m-neutral-1000);
267
+ --secondary: var(--j3m-neutral-800);
268
+ --secondary-foreground: var(--j3m-neutral-100);
269
+ --muted: var(--j3m-neutral-800);
270
+ --muted-foreground: var(--j3m-neutral-400);
271
+ --accent: var(--j3m-neutral-800);
272
+ --accent-foreground: var(--j3m-neutral-100);
273
+ --destructive: var(--j3m-red-200);
274
+ --destructive-foreground: #FFFFFF;
275
+ --background: var(--j3m-neutral-1000);
276
+ --foreground: var(--j3m-neutral-100);
277
+ --card: var(--j3m-neutral-900);
278
+ --card-foreground: var(--j3m-neutral-100);
279
+ --popover: var(--j3m-neutral-900);
280
+ --popover-foreground: var(--j3m-neutral-100);
281
+ --border: var(--j3m-neutral-700);
282
+ --input: var(--j3m-neutral-700);
283
+ --ring: var(--j3m-primary-250);
284
+
285
+ /* Sidebar */
286
+ --sidebar: var(--j3m-neutral-900);
287
+ --sidebar-foreground: var(--j3m-neutral-100);
288
+ --sidebar-primary: var(--j3m-primary-250);
289
+ --sidebar-primary-foreground: var(--j3m-neutral-1000);
290
+ --sidebar-accent: var(--j3m-neutral-800);
291
+ --sidebar-accent-foreground: var(--j3m-neutral-100);
292
+ --sidebar-border: var(--j3m-neutral-700);
293
+ --sidebar-ring: var(--j3m-primary-250);
294
+ }
295
+
296
+ /* ========================================
297
+ THEME MODE: SOLID (Default)
298
+ Opaque surfaces for admin/forms/data-heavy screens
299
+ ======================================== */
300
+
301
+ .theme-solid,
302
+ :root:not(.theme-glass) {
303
+ /* Surface tokens for solid mode */
304
+ --surface-bg: var(--color-bg-surface);
305
+ --surface-border: var(--color-border-subtle);
306
+ --surface-shadow: var(--shadow-sm);
307
+ --surface-radius: var(--j3m-radius-l);
308
+ --surface-blur: 0px;
309
+
310
+ /* Overlay surfaces (dialogs, popovers, etc) */
311
+ --overlay-bg: var(--color-bg-surface);
312
+ --overlay-border: var(--color-border-subtle);
313
+ --overlay-shadow: var(--shadow-lg);
314
+ --overlay-blur: 0px;
315
+ }
316
+
317
+ /* ========================================
318
+ THEME MODE: GLASS
319
+ Frosted translucent surfaces for overlays/HUDs
320
+ ======================================== */
321
+
322
+ .theme-glass {
323
+ /* Surface tokens for glass mode */
324
+ --surface-bg: var(--j3m-glass-light-40);
325
+ --surface-border: var(--j3m-glass-border-white);
326
+ --surface-shadow: var(--j3m-glass-shadow-md);
327
+ --surface-radius: var(--j3m-radius-l);
328
+ --surface-blur: var(--j3m-blur-lg);
329
+
330
+ /* Overlay surfaces (dialogs, popovers, etc) */
331
+ --overlay-bg: var(--j3m-glass-light-70);
332
+ --overlay-border: var(--j3m-glass-border-light);
333
+ --overlay-shadow: var(--j3m-glass-shadow-lg);
334
+ --overlay-blur: var(--j3m-blur-2xl);
335
+
336
+ /* Adjust input backgrounds for glass */
337
+ --input-bg: var(--j3m-glass-light-50);
338
+ --card: var(--j3m-glass-light-50);
339
+ --popover: var(--j3m-glass-light-70);
340
+ }
341
+
342
+ .theme-glass.dark {
343
+ /* Dark glass overrides */
344
+ --surface-bg: var(--j3m-glass-dark);
345
+ --surface-border: var(--j3m-stroke-light-10);
346
+ --overlay-bg: var(--j3m-glass-dark-hover);
347
+ --overlay-border: var(--j3m-stroke-light-20);
348
+ }
349
+
350
+ /* ========================================
351
+ GLASS CONTEXT
352
+ Applied inside glass surfaces to adjust nested components
353
+ ======================================== */
354
+
355
+ .glass-context {
356
+ --background: var(--j3m-glass-light-80);
357
+ --input: var(--j3m-glass-light-50);
358
+ --card: var(--j3m-glass-light-70);
359
+ --popover: var(--j3m-glass-light-80);
360
+ --muted: var(--j3m-glass-light-50);
361
+ --secondary: var(--j3m-glass-light-70);
362
+ --border: var(--j3m-glass-border-light);
363
+ }
364
+
365
+ /* ========================================
366
+ TAILWIND THEME MAPPING
367
+ @theme inline for Tailwind v4
368
+ ======================================== */
369
+
370
+ @theme inline {
371
+ /* Colors */
372
+ --color-background: var(--background);
373
+ --color-foreground: var(--foreground);
374
+ --color-card: var(--card);
375
+ --color-card-foreground: var(--card-foreground);
376
+ --color-popover: var(--popover);
377
+ --color-popover-foreground: var(--popover-foreground);
378
+ --color-primary: var(--primary);
379
+ --color-primary-foreground: var(--primary-foreground);
380
+ --color-secondary: var(--secondary);
381
+ --color-secondary-foreground: var(--secondary-foreground);
382
+ --color-muted: var(--muted);
383
+ --color-muted-foreground: var(--muted-foreground);
384
+ --color-accent: var(--accent);
385
+ --color-accent-foreground: var(--accent-foreground);
386
+ --color-destructive: var(--destructive);
387
+ --color-destructive-foreground: var(--destructive-foreground);
388
+ --color-border: var(--border);
389
+ --color-input: var(--input);
390
+ --color-ring: var(--ring);
391
+
392
+ /* Chart */
393
+ --color-chart-1: var(--chart-1);
394
+ --color-chart-2: var(--chart-2);
395
+ --color-chart-3: var(--chart-3);
396
+ --color-chart-4: var(--chart-4);
397
+ --color-chart-5: var(--chart-5);
398
+
399
+ /* Sidebar */
400
+ --color-sidebar: var(--sidebar);
401
+ --color-sidebar-foreground: var(--sidebar-foreground);
402
+ --color-sidebar-primary: var(--sidebar-primary);
403
+ --color-sidebar-primary-foreground: var(--sidebar-primary-foreground);
404
+ --color-sidebar-accent: var(--sidebar-accent);
405
+ --color-sidebar-accent-foreground: var(--sidebar-accent-foreground);
406
+ --color-sidebar-border: var(--sidebar-border);
407
+ --color-sidebar-ring: var(--sidebar-ring);
408
+
409
+ /* Radius */
410
+ --radius-sm: calc(var(--radius) - 4px);
411
+ --radius-md: calc(var(--radius) - 2px);
412
+ --radius-lg: var(--radius);
413
+ --radius-xl: calc(var(--radius) + 4px);
414
+
415
+ /* Shadows */
416
+ --shadow-sm: var(--shadow-sm);
417
+ --shadow: var(--shadow);
418
+ --shadow-md: var(--shadow-md);
419
+ --shadow-lg: var(--shadow-lg);
420
+ }
421
+
422
+ /* ========================================
423
+ BASE STYLES
424
+ ======================================== */
425
+
426
+ @layer base {
427
+ * {
428
+ border-color: var(--border);
429
+ }
430
+
431
+ body {
432
+ background-color: var(--background);
433
+ color: var(--foreground);
434
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
435
+ }
436
+ }
437
+
438
+ /* ========================================
439
+ GLASS CONTEXT
440
+ Apply when inside a glass container
441
+ ======================================== */
442
+
443
+ .glass-context {
444
+ --background: rgba(255, 255, 255, 0.8);
445
+ --input: rgba(255, 255, 255, 0.3);
446
+ --card: rgba(255, 255, 255, 0.7);
447
+ --popover: rgba(255, 255, 255, 0.85);
448
+ --muted: rgba(255, 255, 255, 0.6);
449
+ --secondary: rgba(255, 255, 255, 0.7);
450
+ --border: rgba(255, 255, 255, 0.3);
451
+ }
452
+
453
+ /* ========================================
454
+ COMPONENT-LEVEL OVERRIDES
455
+ Pill shapes for J3M design
456
+ ======================================== */
457
+
458
+ /* Buttons - pill shape */
459
+ button:where([class*="bg-primary"], [class*="bg-secondary"], [class*="bg-destructive"], [class*="border-input"]),
460
+ [data-slot="button"] {
461
+ border-radius: var(--j3m-radius-full) !important;
462
+ }
463
+
464
+ /* Inputs - pill shape */
465
+ input:where([class*="border-input"], [class*="rounded-md"]),
466
+ [data-slot="input"] {
467
+ border-radius: var(--j3m-radius-full) !important;
468
+ }
469
+
470
+ /* Textarea - standard radius */
471
+ textarea,
472
+ [data-slot="textarea"] {
473
+ border-radius: var(--radius) !important;
474
+ }
475
+
476
+ /* Select - pill shape */
477
+ [data-slot="select-trigger"] {
478
+ border-radius: var(--j3m-radius-full) !important;
479
+ }
480
+
481
+ /* Button Group - pill with squared middle (must override !important on base buttons) */
482
+ [data-slot="button-group"] > * {
483
+ border-radius: 0 !important;
484
+ }
485
+ [data-slot="button-group"] > *:first-child {
486
+ border-top-left-radius: var(--j3m-radius-full) !important;
487
+ border-bottom-left-radius: var(--j3m-radius-full) !important;
488
+ }
489
+ [data-slot="button-group"] > *:last-child {
490
+ border-top-right-radius: var(--j3m-radius-full) !important;
491
+ border-bottom-right-radius: var(--j3m-radius-full) !important;
492
+ }
493
+ /* Single item in group - keep full pill */
494
+ [data-slot="button-group"] > *:only-child {
495
+ border-radius: var(--j3m-radius-full) !important;
496
+ }
497
+
498
+ /* Tabs - pill shape */
499
+ [data-slot="tabs-list"] {
500
+ border-radius: var(--j3m-radius-full) !important;
501
+ }
502
+ [data-slot="tabs-trigger"] {
503
+ border-radius: var(--j3m-radius-full) !important;
504
+ }
505
+
506
+ /* Menubar - pill shape */
507
+ [data-slot="menubar"] {
508
+ border-radius: var(--j3m-radius-full) !important;
509
+ }
510
+ [data-slot="menubar-trigger"] {
511
+ border-radius: var(--j3m-radius-full) !important;
512
+ }
513
+
514
+ /* ========================================
515
+ GLASS UTILITY CLASSES
516
+ ======================================== */
517
+
518
+ .glass-light {
519
+ background: var(--j3m-glass-light-subtle);
520
+ backdrop-filter: blur(var(--j3m-blur-lg));
521
+ -webkit-backdrop-filter: blur(var(--j3m-blur-lg));
522
+ border: 1px solid var(--j3m-stroke-white);
523
+ box-shadow: var(--j3m-glass-shadow-lg);
524
+ }
525
+
526
+ .glass-dark {
527
+ background: var(--j3m-glass-dark);
528
+ backdrop-filter: blur(var(--j3m-blur-md));
529
+ -webkit-backdrop-filter: blur(var(--j3m-blur-md));
530
+ border: 1px solid var(--j3m-stroke-light-10);
531
+ box-shadow: var(--j3m-glass-shadow-lg);
532
+ }
533
+
534
+ .glass-neutral {
535
+ background: var(--j3m-glass-neutral-subtle);
536
+ backdrop-filter: blur(var(--j3m-blur-lg));
537
+ -webkit-backdrop-filter: blur(var(--j3m-blur-lg));
538
+ border: 1px solid var(--j3m-stroke-primary-10);
539
+ box-shadow: var(--j3m-glass-shadow-lg);
540
+ }
541
+
542
+ .glass-primary {
543
+ background: var(--j3m-glass-primary);
544
+ backdrop-filter: blur(var(--j3m-blur-sm));
545
+ -webkit-backdrop-filter: blur(var(--j3m-blur-sm));
546
+ border: 1px solid var(--j3m-stroke-dark-10);
547
+ box-shadow: var(--j3m-glass-shadow-glow);
548
+ }
549
+
550
+ /* ========================================
551
+ ANIMATIONS (tw-animate-css compatible)
552
+ Composable animation system using CSS variables
553
+ ======================================== */
554
+
555
+ /* Keyframes */
556
+ @keyframes enter {
557
+ from {
558
+ opacity: var(--tw-enter-opacity, 1);
559
+ transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0)
560
+ scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1))
561
+ rotate(var(--tw-enter-rotate, 0));
562
+ }
563
+ }
564
+
565
+ @keyframes exit {
566
+ to {
567
+ opacity: var(--tw-exit-opacity, 1);
568
+ transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0)
569
+ scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1))
570
+ rotate(var(--tw-exit-rotate, 0));
571
+ }
572
+ }
573
+
574
+ @keyframes accordion-down {
575
+ from { height: 0; }
576
+ to { height: var(--radix-accordion-content-height); }
577
+ }
578
+
579
+ @keyframes accordion-up {
580
+ from { height: var(--radix-accordion-content-height); }
581
+ to { height: 0; }
582
+ }
583
+
584
+ @keyframes collapsible-down {
585
+ from { height: 0; }
586
+ to { height: var(--radix-collapsible-content-height); }
587
+ }
588
+
589
+ @keyframes collapsible-up {
590
+ from { height: var(--radix-collapsible-content-height); }
591
+ to { height: 0; }
592
+ }
593
+
594
+ @keyframes spin {
595
+ from { transform: rotate(0deg); }
596
+ to { transform: rotate(360deg); }
597
+ }
598
+
599
+ /* Base animation classes */
600
+ .animate-in {
601
+ animation-name: enter;
602
+ animation-duration: 150ms;
603
+ animation-timing-function: ease-out;
604
+ --tw-enter-opacity: initial;
605
+ --tw-enter-scale: initial;
606
+ --tw-enter-rotate: initial;
607
+ --tw-enter-translate-x: initial;
608
+ --tw-enter-translate-y: initial;
609
+ }
610
+
611
+ .animate-out {
612
+ animation-name: exit;
613
+ animation-duration: 150ms;
614
+ animation-timing-function: ease-in;
615
+ --tw-exit-opacity: initial;
616
+ --tw-exit-scale: initial;
617
+ --tw-exit-rotate: initial;
618
+ --tw-exit-translate-x: initial;
619
+ --tw-exit-translate-y: initial;
620
+ }
621
+
622
+ /* Fade utilities */
623
+ .fade-in { --tw-enter-opacity: 0; }
624
+ .fade-in-0 { --tw-enter-opacity: 0; }
625
+ .fade-in-5 { --tw-enter-opacity: 0.05; }
626
+ .fade-in-10 { --tw-enter-opacity: 0.1; }
627
+ .fade-in-20 { --tw-enter-opacity: 0.2; }
628
+ .fade-in-25 { --tw-enter-opacity: 0.25; }
629
+ .fade-in-30 { --tw-enter-opacity: 0.3; }
630
+ .fade-in-40 { --tw-enter-opacity: 0.4; }
631
+ .fade-in-50 { --tw-enter-opacity: 0.5; }
632
+ .fade-in-60 { --tw-enter-opacity: 0.6; }
633
+ .fade-in-70 { --tw-enter-opacity: 0.7; }
634
+ .fade-in-75 { --tw-enter-opacity: 0.75; }
635
+ .fade-in-80 { --tw-enter-opacity: 0.8; }
636
+ .fade-in-90 { --tw-enter-opacity: 0.9; }
637
+ .fade-in-95 { --tw-enter-opacity: 0.95; }
638
+ .fade-in-100 { --tw-enter-opacity: 1; }
639
+
640
+ .fade-out { --tw-exit-opacity: 0; }
641
+ .fade-out-0 { --tw-exit-opacity: 0; }
642
+ .fade-out-5 { --tw-exit-opacity: 0.05; }
643
+ .fade-out-10 { --tw-exit-opacity: 0.1; }
644
+ .fade-out-20 { --tw-exit-opacity: 0.2; }
645
+ .fade-out-25 { --tw-exit-opacity: 0.25; }
646
+ .fade-out-30 { --tw-exit-opacity: 0.3; }
647
+ .fade-out-40 { --tw-exit-opacity: 0.4; }
648
+ .fade-out-50 { --tw-exit-opacity: 0.5; }
649
+ .fade-out-60 { --tw-exit-opacity: 0.6; }
650
+ .fade-out-70 { --tw-exit-opacity: 0.7; }
651
+ .fade-out-75 { --tw-exit-opacity: 0.75; }
652
+ .fade-out-80 { --tw-exit-opacity: 0.8; }
653
+ .fade-out-90 { --tw-exit-opacity: 0.9; }
654
+ .fade-out-95 { --tw-exit-opacity: 0.95; }
655
+ .fade-out-100 { --tw-exit-opacity: 1; }
656
+
657
+ /* Zoom/Scale utilities */
658
+ .zoom-in { --tw-enter-scale: 0; }
659
+ .zoom-in-0 { --tw-enter-scale: 0; }
660
+ .zoom-in-50 { --tw-enter-scale: 0.5; }
661
+ .zoom-in-75 { --tw-enter-scale: 0.75; }
662
+ .zoom-in-90 { --tw-enter-scale: 0.9; }
663
+ .zoom-in-95 { --tw-enter-scale: 0.95; }
664
+ .zoom-in-100 { --tw-enter-scale: 1; }
665
+ .zoom-in-105 { --tw-enter-scale: 1.05; }
666
+ .zoom-in-110 { --tw-enter-scale: 1.1; }
667
+ .zoom-in-125 { --tw-enter-scale: 1.25; }
668
+ .zoom-in-150 { --tw-enter-scale: 1.5; }
669
+
670
+ .zoom-out { --tw-exit-scale: 0; }
671
+ .zoom-out-0 { --tw-exit-scale: 0; }
672
+ .zoom-out-50 { --tw-exit-scale: 0.5; }
673
+ .zoom-out-75 { --tw-exit-scale: 0.75; }
674
+ .zoom-out-90 { --tw-exit-scale: 0.9; }
675
+ .zoom-out-95 { --tw-exit-scale: 0.95; }
676
+ .zoom-out-100 { --tw-exit-scale: 1; }
677
+ .zoom-out-105 { --tw-exit-scale: 1.05; }
678
+ .zoom-out-110 { --tw-exit-scale: 1.1; }
679
+ .zoom-out-125 { --tw-exit-scale: 1.25; }
680
+ .zoom-out-150 { --tw-exit-scale: 1.5; }
681
+
682
+ /* Slide utilities */
683
+ .slide-in-from-top { --tw-enter-translate-y: -100%; }
684
+ .slide-in-from-top-0 { --tw-enter-translate-y: 0px; }
685
+ .slide-in-from-top-1 { --tw-enter-translate-y: -0.25rem; }
686
+ .slide-in-from-top-2 { --tw-enter-translate-y: -0.5rem; }
687
+ .slide-in-from-top-3 { --tw-enter-translate-y: -0.75rem; }
688
+ .slide-in-from-top-4 { --tw-enter-translate-y: -1rem; }
689
+ .slide-in-from-top-5 { --tw-enter-translate-y: -1.25rem; }
690
+ .slide-in-from-top-6 { --tw-enter-translate-y: -1.5rem; }
691
+ .slide-in-from-top-8 { --tw-enter-translate-y: -2rem; }
692
+ .slide-in-from-top-10 { --tw-enter-translate-y: -2.5rem; }
693
+ .slide-in-from-top-12 { --tw-enter-translate-y: -3rem; }
694
+ .slide-in-from-top-16 { --tw-enter-translate-y: -4rem; }
695
+ .slide-in-from-top-20 { --tw-enter-translate-y: -5rem; }
696
+ .slide-in-from-top-24 { --tw-enter-translate-y: -6rem; }
697
+ .slide-in-from-top-full { --tw-enter-translate-y: -100%; }
698
+
699
+ .slide-in-from-bottom { --tw-enter-translate-y: 100%; }
700
+ .slide-in-from-bottom-0 { --tw-enter-translate-y: 0px; }
701
+ .slide-in-from-bottom-1 { --tw-enter-translate-y: 0.25rem; }
702
+ .slide-in-from-bottom-2 { --tw-enter-translate-y: 0.5rem; }
703
+ .slide-in-from-bottom-3 { --tw-enter-translate-y: 0.75rem; }
704
+ .slide-in-from-bottom-4 { --tw-enter-translate-y: 1rem; }
705
+ .slide-in-from-bottom-5 { --tw-enter-translate-y: 1.25rem; }
706
+ .slide-in-from-bottom-6 { --tw-enter-translate-y: 1.5rem; }
707
+ .slide-in-from-bottom-8 { --tw-enter-translate-y: 2rem; }
708
+ .slide-in-from-bottom-10 { --tw-enter-translate-y: 2.5rem; }
709
+ .slide-in-from-bottom-12 { --tw-enter-translate-y: 3rem; }
710
+ .slide-in-from-bottom-16 { --tw-enter-translate-y: 4rem; }
711
+ .slide-in-from-bottom-20 { --tw-enter-translate-y: 5rem; }
712
+ .slide-in-from-bottom-24 { --tw-enter-translate-y: 6rem; }
713
+ .slide-in-from-bottom-full { --tw-enter-translate-y: 100%; }
714
+
715
+ .slide-in-from-left { --tw-enter-translate-x: -100%; }
716
+ .slide-in-from-left-0 { --tw-enter-translate-x: 0px; }
717
+ .slide-in-from-left-1 { --tw-enter-translate-x: -0.25rem; }
718
+ .slide-in-from-left-2 { --tw-enter-translate-x: -0.5rem; }
719
+ .slide-in-from-left-3 { --tw-enter-translate-x: -0.75rem; }
720
+ .slide-in-from-left-4 { --tw-enter-translate-x: -1rem; }
721
+ .slide-in-from-left-5 { --tw-enter-translate-x: -1.25rem; }
722
+ .slide-in-from-left-6 { --tw-enter-translate-x: -1.5rem; }
723
+ .slide-in-from-left-8 { --tw-enter-translate-x: -2rem; }
724
+ .slide-in-from-left-10 { --tw-enter-translate-x: -2.5rem; }
725
+ .slide-in-from-left-12 { --tw-enter-translate-x: -3rem; }
726
+ .slide-in-from-left-16 { --tw-enter-translate-x: -4rem; }
727
+ .slide-in-from-left-20 { --tw-enter-translate-x: -5rem; }
728
+ .slide-in-from-left-24 { --tw-enter-translate-x: -6rem; }
729
+ .slide-in-from-left-52 { --tw-enter-translate-x: -13rem; }
730
+ .slide-in-from-left-full { --tw-enter-translate-x: -100%; }
731
+
732
+ .slide-in-from-right { --tw-enter-translate-x: 100%; }
733
+ .slide-in-from-right-0 { --tw-enter-translate-x: 0px; }
734
+ .slide-in-from-right-1 { --tw-enter-translate-x: 0.25rem; }
735
+ .slide-in-from-right-2 { --tw-enter-translate-x: 0.5rem; }
736
+ .slide-in-from-right-3 { --tw-enter-translate-x: 0.75rem; }
737
+ .slide-in-from-right-4 { --tw-enter-translate-x: 1rem; }
738
+ .slide-in-from-right-5 { --tw-enter-translate-x: 1.25rem; }
739
+ .slide-in-from-right-6 { --tw-enter-translate-x: 1.5rem; }
740
+ .slide-in-from-right-8 { --tw-enter-translate-x: 2rem; }
741
+ .slide-in-from-right-10 { --tw-enter-translate-x: 2.5rem; }
742
+ .slide-in-from-right-12 { --tw-enter-translate-x: 3rem; }
743
+ .slide-in-from-right-16 { --tw-enter-translate-x: 4rem; }
744
+ .slide-in-from-right-20 { --tw-enter-translate-x: 5rem; }
745
+ .slide-in-from-right-24 { --tw-enter-translate-x: 6rem; }
746
+ .slide-in-from-right-52 { --tw-enter-translate-x: 13rem; }
747
+ .slide-in-from-right-full { --tw-enter-translate-x: 100%; }
748
+
749
+ .slide-out-to-top { --tw-exit-translate-y: -100%; }
750
+ .slide-out-to-top-0 { --tw-exit-translate-y: 0px; }
751
+ .slide-out-to-top-1 { --tw-exit-translate-y: -0.25rem; }
752
+ .slide-out-to-top-2 { --tw-exit-translate-y: -0.5rem; }
753
+ .slide-out-to-top-3 { --tw-exit-translate-y: -0.75rem; }
754
+ .slide-out-to-top-4 { --tw-exit-translate-y: -1rem; }
755
+ .slide-out-to-top-5 { --tw-exit-translate-y: -1.25rem; }
756
+ .slide-out-to-top-6 { --tw-exit-translate-y: -1.5rem; }
757
+ .slide-out-to-top-8 { --tw-exit-translate-y: -2rem; }
758
+ .slide-out-to-top-full { --tw-exit-translate-y: -100%; }
759
+
760
+ .slide-out-to-bottom { --tw-exit-translate-y: 100%; }
761
+ .slide-out-to-bottom-0 { --tw-exit-translate-y: 0px; }
762
+ .slide-out-to-bottom-1 { --tw-exit-translate-y: 0.25rem; }
763
+ .slide-out-to-bottom-2 { --tw-exit-translate-y: 0.5rem; }
764
+ .slide-out-to-bottom-3 { --tw-exit-translate-y: 0.75rem; }
765
+ .slide-out-to-bottom-4 { --tw-exit-translate-y: 1rem; }
766
+ .slide-out-to-bottom-5 { --tw-exit-translate-y: 1.25rem; }
767
+ .slide-out-to-bottom-6 { --tw-exit-translate-y: 1.5rem; }
768
+ .slide-out-to-bottom-8 { --tw-exit-translate-y: 2rem; }
769
+ .slide-out-to-bottom-full { --tw-exit-translate-y: 100%; }
770
+
771
+ .slide-out-to-left { --tw-exit-translate-x: -100%; }
772
+ .slide-out-to-left-0 { --tw-exit-translate-x: 0px; }
773
+ .slide-out-to-left-1 { --tw-exit-translate-x: -0.25rem; }
774
+ .slide-out-to-left-2 { --tw-exit-translate-x: -0.5rem; }
775
+ .slide-out-to-left-3 { --tw-exit-translate-x: -0.75rem; }
776
+ .slide-out-to-left-4 { --tw-exit-translate-x: -1rem; }
777
+ .slide-out-to-left-5 { --tw-exit-translate-x: -1.25rem; }
778
+ .slide-out-to-left-6 { --tw-exit-translate-x: -1.5rem; }
779
+ .slide-out-to-left-8 { --tw-exit-translate-x: -2rem; }
780
+ .slide-out-to-left-52 { --tw-exit-translate-x: -13rem; }
781
+ .slide-out-to-left-full { --tw-exit-translate-x: -100%; }
782
+
783
+ .slide-out-to-right { --tw-exit-translate-x: 100%; }
784
+ .slide-out-to-right-0 { --tw-exit-translate-x: 0px; }
785
+ .slide-out-to-right-1 { --tw-exit-translate-x: 0.25rem; }
786
+ .slide-out-to-right-2 { --tw-exit-translate-x: 0.5rem; }
787
+ .slide-out-to-right-3 { --tw-exit-translate-x: 0.75rem; }
788
+ .slide-out-to-right-4 { --tw-exit-translate-x: 1rem; }
789
+ .slide-out-to-right-5 { --tw-exit-translate-x: 1.25rem; }
790
+ .slide-out-to-right-6 { --tw-exit-translate-x: 1.5rem; }
791
+ .slide-out-to-right-8 { --tw-exit-translate-x: 2rem; }
792
+ .slide-out-to-right-52 { --tw-exit-translate-x: 13rem; }
793
+ .slide-out-to-right-full { --tw-exit-translate-x: 100%; }
794
+
795
+ /* Duration utilities */
796
+ .duration-150 { animation-duration: 150ms; }
797
+ .duration-200 { animation-duration: 200ms; }
798
+ .duration-300 { animation-duration: 300ms; }
799
+ .duration-500 { animation-duration: 500ms; }
800
+ .duration-700 { animation-duration: 700ms; }
801
+ .duration-1000 { animation-duration: 1000ms; }
802
+
803
+ /* Accordion animations */
804
+ .animate-accordion-down {
805
+ animation: accordion-down 0.2s ease-out;
806
+ }
15
807
 
16
- /* 2. Animations (keyframes for all shadcn components) */
17
- @import "./animations.css";
808
+ .animate-accordion-up {
809
+ animation: accordion-up 0.2s ease-out;
810
+ }
18
811
 
19
- /* 3. J3M Design Tokens (color scales, spacing, radii, glass effects) */
20
- @import "./tokens.css";
812
+ /* Collapsible animations */
813
+ .animate-collapsible-down {
814
+ animation: collapsible-down 0.2s ease-out;
815
+ }
21
816
 
22
- /* 4. J3M Theme Overrides (replaces shadcn colors with J3M palette) */
23
- @import "./j3m-overrides.css";
817
+ .animate-collapsible-up {
818
+ animation: collapsible-up 0.2s ease-out;
819
+ }
24
820
 
25
- /* 5. Component-specific styles (toast, glass utilities) */
26
- @import "./theme.css";
821
+ /* Spin animation */
822
+ .animate-spin {
823
+ animation: spin 1s linear infinite;
824
+ }