juxscript 1.1.131 → 1.1.133

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.
Files changed (34) hide show
  1. package/dom-structure-map.json +1 -1
  2. package/index.d.ts +1 -2
  3. package/index.d.ts.map +1 -1
  4. package/index.js +8 -9
  5. package/lib/components/base/Animations.d.ts +36 -0
  6. package/lib/components/base/Animations.d.ts.map +1 -0
  7. package/lib/components/base/Animations.js +70 -0
  8. package/lib/components/base/Animations.ts +112 -0
  9. package/lib/components/base/BaseComponent.d.ts +3 -0
  10. package/lib/components/base/BaseComponent.d.ts.map +1 -1
  11. package/lib/components/base/BaseComponent.js +4 -8
  12. package/lib/components/base/BaseComponent.ts +6 -10
  13. package/lib/components/stack/BaseStack.d.ts +40 -56
  14. package/lib/components/stack/BaseStack.d.ts.map +1 -1
  15. package/lib/components/stack/BaseStack.js +101 -173
  16. package/lib/components/stack/BaseStack.ts +114 -229
  17. package/lib/components/stack/HStack.d.ts +14 -4
  18. package/lib/components/stack/HStack.d.ts.map +1 -1
  19. package/lib/components/stack/HStack.js +16 -15
  20. package/lib/components/stack/HStack.ts +17 -19
  21. package/lib/components/stack/VStack.d.ts +15 -7
  22. package/lib/components/stack/VStack.d.ts.map +1 -1
  23. package/lib/components/stack/VStack.js +17 -17
  24. package/lib/components/stack/VStack.ts +18 -22
  25. package/lib/components/stack/ZStack.d.ts +14 -4
  26. package/lib/components/stack/ZStack.d.ts.map +1 -1
  27. package/lib/components/stack/ZStack.js +16 -15
  28. package/lib/components/stack/ZStack.ts +17 -19
  29. package/lib/styles/shadcn.css +1106 -0
  30. package/package.json +1 -1
  31. package/lib/components/base/LayoutExtensions.d.ts +0 -112
  32. package/lib/components/base/LayoutExtensions.d.ts.map +0 -1
  33. package/lib/components/base/LayoutExtensions.js +0 -187
  34. package/lib/components/base/LayoutExtensions.ts +0 -345
@@ -0,0 +1,1106 @@
1
+ @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
2
+
3
+ * {
4
+ font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
5
+ }
6
+ /* Tabs */
7
+
8
+ .jux-tabs-list {
9
+ display: inline-flex;
10
+ height: 40px; /* h-10 */
11
+ align-items: center;
12
+ justify-content: center;
13
+ border-radius: 0.375rem; /* rounded-md */
14
+ background-color: #f4f4f5; /* bg-muted */
15
+ padding: 0.25rem; /* p-1 */
16
+ color: #71717a; /* text-muted-foreground */
17
+ border: none;
18
+ }
19
+
20
+ .jux-tabs-button {
21
+ display: inline-flex;
22
+ align-items: center;
23
+ justify-content: center;
24
+ white-space: nowrap;
25
+ border-radius: 0.125rem; /* rounded-sm */
26
+ padding: 0.375rem 0.75rem; /* px-3 py-1.5 */
27
+ font-size: 0.875rem; /* text-sm */
28
+ font-weight: 500; /* font-medium */
29
+ color: #71717a;
30
+ cursor: pointer;
31
+ border: none;
32
+ background: transparent;
33
+ transition-property: all;
34
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
35
+ transition-duration: 0.15s;
36
+ user-select: none;
37
+ }
38
+
39
+ /* Focus visible state mimicking ring-offset-background focus-visible:ring-2 ... */
40
+ .jux-tabs-button:focus-visible {
41
+ outline: 2px solid #18181b; /* ring-ring */
42
+ outline-offset: 2px;
43
+ }
44
+
45
+ .jux-tabs-button:disabled {
46
+ pointer-events: none;
47
+ opacity: 0.5;
48
+ }
49
+
50
+ .jux-tabs-button-active {
51
+ background-color: #ffffff; /* bg-background */
52
+ color: #09090b; /* text-foreground */
53
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); /* shadow-sm */
54
+ }
55
+
56
+ /* Content Panel */
57
+ .jux-tabs-panel {
58
+ margin-top: 0.5rem; /* mt-2 */
59
+ border-radius: 0.375rem;
60
+ border: 1px solid #e4e4e7;
61
+ padding: 1.5rem;
62
+ /* ring-offset-background equivalent if focused */
63
+ }
64
+ .jux-tabs-panel:focus-visible {
65
+ outline: 2px solid #18181b;
66
+ outline-offset: 2px;
67
+ }
68
+
69
+ /* Modal Overlay */
70
+ .jux-modal-overlay {
71
+ position: fixed;
72
+ inset: 0;
73
+ z-index: 50;
74
+ background-color: rgba(0, 0, 0, 0.8); /* bg-black/80 */
75
+ backdrop-filter: blur(2px);
76
+ display: flex;
77
+ align-items: center;
78
+ justify-content: center;
79
+ }
80
+
81
+ /* Modal Container */
82
+ .jux-modal {
83
+ position: relative;
84
+ background-color: #ffffff; /* bg-background */
85
+ border: 1px solid #e4e4e7; /* border */
86
+ border-radius: 0.5rem; /* rounded-lg */
87
+ box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05); /* lg:shadow-lg */
88
+ width: 100%;
89
+ max-width: 32rem; /* lg:max-w-lg default */
90
+ z-index: 51;
91
+ display: flex;
92
+ flex-direction: column;
93
+ gap: 1rem;
94
+ padding: 1.5rem; /* p-6 */
95
+ }
96
+
97
+ .jux-modal-small { max-width: 24rem; }
98
+ .jux-modal-medium { max-width: 32rem; }
99
+ .jux-modal-large { max-width: 48rem; }
100
+
101
+ /* Header */
102
+ .jux-modal-header {
103
+ display: flex;
104
+ align-items: flex-start;
105
+ gap: 0.75rem;
106
+ padding: 0;
107
+ text-align: left;
108
+ }
109
+
110
+ .jux-modal-header-icon {
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: center;
114
+ flex-shrink: 0;
115
+ color: #09090b;
116
+ margin-top: 0.125rem;
117
+ }
118
+
119
+ .jux-modal-header-title {
120
+ flex: 1;
121
+ font-size: 1.125rem; /* text-lg */
122
+ font-weight: 600; /* font-semibold */
123
+ line-height: 1.2;
124
+ color: #09090b; /* text-foreground */
125
+ }
126
+
127
+ /* Body / Content */
128
+ .jux-modal-content {
129
+ padding: 0;
130
+ font-size: 0.875rem; /* text-sm */
131
+ color: #71717a; /* text-muted-foreground */
132
+ line-height: 1.5;
133
+ display: flex;
134
+ flex-direction: column;
135
+ gap: 1rem;
136
+ }
137
+
138
+ /* Input Fields */
139
+ .jux-input {
140
+ display: flex;
141
+ flex-direction: column;
142
+ gap: 0.5rem;
143
+ width: 100%;
144
+ }
145
+
146
+ .jux-input-label {
147
+ font-size: 0.875rem; /* text-sm */
148
+ font-weight: 500; /* font-medium */
149
+ color: #09090b;
150
+ line-height: 1;
151
+ }
152
+
153
+ .jux-input-container {
154
+ position: relative;
155
+ width: 100%;
156
+ }
157
+
158
+ .jux-input-element {
159
+ display: flex;
160
+ height: 2.5rem; /* h-10 */
161
+ width: 100%;
162
+ border-radius: 0.375rem; /* rounded-md */
163
+ border: 1px solid #e4e4e7; /* border-input */
164
+ background-color: #ffffff; /* bg-background */
165
+ padding: 0.5rem 0.75rem; /* px-3 py-2 */
166
+ font-size: 0.875rem; /* text-sm */
167
+ color: #09090b;
168
+ outline: none;
169
+ transition: all 0.15s ease;
170
+ box-sizing: border-box;
171
+ }
172
+
173
+ .jux-input-element::placeholder {
174
+ color: #71717a; /* text-muted-foreground */
175
+ }
176
+
177
+ .jux-input-element:focus {
178
+ outline: 2px solid transparent;
179
+ outline-offset: 2px;
180
+ border-color: #18181b; /* focus-visible:ring-ring */
181
+ box-shadow: 0 0 0 2px #18181b, 0 0 0 4px rgba(24, 24, 27, 0.1);
182
+ }
183
+
184
+ .jux-input-element:disabled {
185
+ cursor: not-allowed;
186
+ opacity: 0.5;
187
+ }
188
+
189
+ .jux-input-error {
190
+ font-size: 0.875rem;
191
+ font-weight: 500;
192
+ color: #ef4444; /* text-destructive */
193
+ }
194
+
195
+ /* Footer with Actions */
196
+ .jux-modal-footer {
197
+ padding: 0;
198
+ padding-top: 0.5rem;
199
+ display: flex;
200
+ flex-direction: row;
201
+ justify-content: flex-end;
202
+ gap: 0.5rem; /* space-x-2 */
203
+ flex-wrap: wrap;
204
+ }
205
+
206
+ /* Modal Action Buttons */
207
+ .jux-modal-action {
208
+ display: inline-flex;
209
+ align-items: center;
210
+ justify-content: center;
211
+ white-space: nowrap;
212
+ border-radius: 0.375rem; /* rounded-md */
213
+ font-size: 0.875rem; /* text-sm */
214
+ font-weight: 500; /* font-medium */
215
+ height: 2.5rem; /* h-10 */
216
+ padding: 0 1rem; /* px-4 py-2 */
217
+ cursor: pointer;
218
+ transition: all 0.15s ease;
219
+ border: 1px solid transparent;
220
+ }
221
+
222
+ /* Ghost variant */
223
+ .jux-modal-action-ghost {
224
+ background-color: transparent;
225
+ color: #09090b;
226
+ border: none;
227
+ }
228
+ .jux-modal-action-ghost:hover {
229
+ background-color: #f4f4f5;
230
+ color: #18181b;
231
+ }
232
+
233
+ /* Secondary/Outline variant */
234
+ .jux-modal-action-secondary {
235
+ border: 1px solid #e4e4e7; /* border-input */
236
+ background-color: #ffffff; /* bg-background */
237
+ color: #09090b;
238
+ }
239
+ .jux-modal-action-secondary:hover {
240
+ background-color: #f4f4f5; /* hover:bg-accent */
241
+ color: #18181b;
242
+ }
243
+
244
+ /* Primary variant */
245
+ .jux-modal-action-primary {
246
+ background-color: #18181b; /* bg-primary */
247
+ color: #fafafa; /* text-primary-foreground */
248
+ border: none;
249
+ }
250
+ .jux-modal-action-primary:hover {
251
+ background-color: #27272a; /* hover:bg-primary/90 */
252
+ }
253
+
254
+ /* Destructive variant */
255
+ .jux-modal-action-destructive {
256
+ background-color: #ef4444; /* bg-destructive */
257
+ color: #ffffff;
258
+ border: none;
259
+ }
260
+ .jux-modal-action-destructive:hover {
261
+ background-color: #dc2626; /* hover:bg-destructive/90 */
262
+ }
263
+
264
+ /* Close Button (X) */
265
+ .jux-modal-close {
266
+ position: absolute;
267
+ top: 1rem; /* top-4 */
268
+ right: 1rem; /* right-4 */
269
+ border-radius: 0.125rem; /* rounded-sm */
270
+ opacity: 0.7;
271
+ transition: opacity 0.15s ease;
272
+ background: transparent;
273
+ border: none;
274
+ cursor: pointer;
275
+ color: #71717a;
276
+ padding: 0.25rem;
277
+ width: 1.5rem;
278
+ height: 1.5rem;
279
+ display: flex;
280
+ align-items: center;
281
+ justify-content: center;
282
+ font-size: 1.25rem;
283
+ line-height: 1;
284
+ }
285
+
286
+ .jux-modal-close:hover {
287
+ opacity: 1;
288
+ color: #09090b;
289
+ }
290
+
291
+ .jux-modal-close:focus-visible {
292
+ outline: 2px solid #18181b; /* ring-ring */
293
+ outline-offset: 2px;
294
+ }
295
+
296
+ /* Trigger Buttons (outside modal) */
297
+ button.jux-button,
298
+ .jux-button {
299
+ display: inline-flex;
300
+ align-items: center;
301
+ justify-content: center;
302
+ white-space: nowrap;
303
+ border-radius: 0.375rem;
304
+ font-size: 0.875rem;
305
+ font-weight: 500;
306
+ height: 2.5rem;
307
+ padding: 0 1rem;
308
+ cursor: pointer;
309
+ transition: all 0.15s ease;
310
+ border: 1px solid transparent;
311
+ margin: 0.25rem;
312
+ }
313
+
314
+ /* Button variants for triggers */
315
+ .jux-button-primary {
316
+ background-color: #18181b;
317
+ color: #fafafa;
318
+ }
319
+ .jux-button-primary:hover {
320
+ background-color: #27272a;
321
+ }
322
+
323
+ .jux-button-outline {
324
+ border: 1px solid #e4e4e7;
325
+ background-color: #ffffff;
326
+ color: #09090b;
327
+ }
328
+ .jux-button-outline:hover {
329
+ background-color: #f4f4f5;
330
+ color: #18181b;
331
+ }
332
+
333
+ button.jux-button:focus-visible,
334
+ .jux-button:focus-visible {
335
+ outline: 2px solid #18181b;
336
+ outline-offset: 2px;
337
+ }
338
+
339
+ /* Typography Styles */
340
+
341
+ /* Headings */
342
+ h1, .jux-heading-1 {
343
+ scroll-margin: 5rem; /* scroll-m-20 */
344
+ font-size: 2.25rem; /* text-4xl */
345
+ font-weight: 800; /* font-extrabold */
346
+ letter-spacing: -0.025em; /* tracking-tight */
347
+ text-wrap: balance;
348
+ }
349
+
350
+ h2, .jux-heading-2 {
351
+ scroll-margin: 5rem; /* scroll-m-20 */
352
+ border-bottom: 1px solid #e4e4e7;
353
+ padding-bottom: 0.5rem; /* pb-2 */
354
+ font-size: 1.875rem; /* text-3xl */
355
+ font-weight: 600; /* font-semibold */
356
+ letter-spacing: -0.025em; /* tracking-tight */
357
+ transition-property: color;
358
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
359
+ transition-duration: 0.15s;
360
+ }
361
+
362
+ h2:first-child, .jux-heading-2:first-child {
363
+ margin-top: 0;
364
+ }
365
+
366
+ h3, .jux-heading-3 {
367
+ scroll-margin: 5rem; /* scroll-m-20 */
368
+ font-size: 1.5rem; /* text-2xl */
369
+ font-weight: 600; /* font-semibold */
370
+ letter-spacing: -0.025em; /* tracking-tight */
371
+ }
372
+
373
+ h4, .jux-heading-4 {
374
+ scroll-margin: 5rem; /* scroll-m-20 */
375
+ font-size: 1.25rem; /* text-xl */
376
+ font-weight: 600; /* font-semibold */
377
+ letter-spacing: -0.025em; /* tracking-tight */
378
+ }
379
+
380
+ h5, .jux-heading-5 {
381
+ scroll-margin: 5rem;
382
+ font-size: 1.125rem; /* text-lg */
383
+ font-weight: 600; /* font-semibold */
384
+ letter-spacing: -0.025em;
385
+ }
386
+
387
+ h6, .jux-heading-6 {
388
+ scroll-margin: 5rem;
389
+ font-size: 1rem; /* text-base */
390
+ font-weight: 600; /* font-semibold */
391
+ letter-spacing: -0.025em;
392
+ }
393
+
394
+ /* Paragraph */
395
+ p, .jux-paragraph {
396
+ line-height: 1.75; /* leading-7 */
397
+ }
398
+
399
+ p:not(:first-child), .jux-paragraph:not(:first-child) {
400
+ margin-top: 1.5rem; /* mt-6 */
401
+ }
402
+
403
+ /* Lead Text */
404
+ .jux-lead {
405
+ font-size: 1.25rem; /* text-xl */
406
+ color: #71717a; /* text-muted-foreground */
407
+ }
408
+
409
+ /* Large Text */
410
+ .jux-large {
411
+ font-size: 1.125rem; /* text-lg */
412
+ font-weight: 600; /* font-semibold */
413
+ }
414
+
415
+ /* Small Text */
416
+ small, .jux-small {
417
+ font-size: 0.875rem; /* text-sm */
418
+ font-weight: 500; /* font-medium */
419
+ line-height: 1;
420
+ }
421
+
422
+ /* Muted Text */
423
+ .jux-muted {
424
+ font-size: 0.875rem; /* text-sm */
425
+ color: #71717a; /* text-muted-foreground */
426
+ }
427
+
428
+ /* Blockquote */
429
+ blockquote, .jux-blockquote {
430
+ margin-top: 1.5rem; /* mt-6 */
431
+ border-left: 2px solid #e4e4e7; /* border-l-2 */
432
+ padding-left: 1.5rem; /* pl-6 */
433
+ font-style: italic;
434
+ }
435
+
436
+ /* Inline Code */
437
+ code, .jux-inline-code {
438
+ position: relative;
439
+ border-radius: 0.25rem; /* rounded */
440
+ background-color: #f4f4f5; /* bg-muted */
441
+ padding: 0.15rem 0.3rem; /* px-[0.3rem] py-[0.2rem] */
442
+ font-family: ui-monospace, SFMono-Regular, 'SF Mono', Menlo, Consolas, 'Liberation Mono', monospace;
443
+ font-size: 0.875rem; /* text-sm */
444
+ font-weight: 600; /* font-semibold */
445
+ }
446
+
447
+ /* Lists */
448
+ ul, .jux-list {
449
+ margin-top: 1.5rem; /* my-6 */
450
+ margin-bottom: 1.5rem;
451
+ margin-left: 1.5rem; /* ml-6 */
452
+ list-style-type: disc; /* list-disc */
453
+ }
454
+
455
+ ol, .jux-list-ordered {
456
+ margin-top: 1.5rem;
457
+ margin-bottom: 1.5rem;
458
+ margin-left: 1.5rem;
459
+ list-style-type: decimal;
460
+ }
461
+
462
+ ul > li, ol > li,
463
+ .jux-list > li, .jux-list-ordered > li {
464
+ margin-top: 0.5rem; /* mt-2 */
465
+ }
466
+
467
+ /* Table */
468
+ table, .jux-table {
469
+ margin-top: 1.5rem; /* my-6 */
470
+ margin-bottom: 1.5rem;
471
+ width: 100%;
472
+ overflow-y: auto;
473
+ }
474
+
475
+ table thead tr, .jux-table thead tr {
476
+ margin: 0;
477
+ border-top: 1px solid #e4e4e7; /* border-t */
478
+ padding: 0;
479
+ }
480
+
481
+ table thead tr:nth-child(even),
482
+ .jux-table thead tr:nth-child(even) {
483
+ background-color: #f4f4f5; /* even:bg-muted */
484
+ }
485
+
486
+ table tbody tr, .jux-table tbody tr {
487
+ margin: 0;
488
+ border-top: 1px solid #e4e4e7;
489
+ padding: 0;
490
+ }
491
+
492
+ table tbody tr:nth-child(even),
493
+ .jux-table tbody tr:nth-child(even) {
494
+ background-color: #f4f4f5; /* even:bg-muted */
495
+ }
496
+
497
+ table th, .jux-table th {
498
+ border: 1px solid #e4e4e7;
499
+ padding: 0.5rem 1rem; /* px-4 py-2 */
500
+ text-align: left;
501
+ font-weight: 700; /* font-bold */
502
+ }
503
+
504
+ table th[align="center"],
505
+ .jux-table th[align="center"] {
506
+ text-align: center;
507
+ }
508
+
509
+ table th[align="right"],
510
+ .jux-table th[align="right"] {
511
+ text-align: right;
512
+ }
513
+
514
+ table td, .jux-table td {
515
+ border: 1px solid #e4e4e7;
516
+ padding: 0.5rem 1rem; /* px-4 py-2 */
517
+ text-align: left;
518
+ }
519
+
520
+ table td[align="center"],
521
+ .jux-table td[align="center"] {
522
+ text-align: center;
523
+ }
524
+
525
+ table td[align="right"],
526
+ .jux-table td[align="right"] {
527
+ text-align: right;
528
+ }
529
+
530
+ /* Horizontal Rule / Divider */
531
+ hr, .jux-hr {
532
+ margin-top: 1.5rem;
533
+ margin-bottom: 1.5rem;
534
+ border: none;
535
+ border-top: 1px solid #e4e4e7;
536
+ }
537
+
538
+ /* Card Styles */
539
+
540
+ .jux-card {
541
+ border-radius: 0.5rem; /* rounded-lg */
542
+ border: 1px solid #e4e4e7; /* border */
543
+ background-color: #ffffff; /* bg-card */
544
+ color: #09090b; /* text-card-foreground */
545
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05); /* shadow-sm */
546
+ overflow: hidden;
547
+ transition: all 0.15s ease;
548
+ }
549
+
550
+ .jux-card-hoverable {
551
+ cursor: pointer;
552
+ }
553
+
554
+ .jux-card-hoverable:hover {
555
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06); /* shadow-md */
556
+ border-color: #d4d4d8; /* hover:border-muted */
557
+ }
558
+
559
+ .jux-card-header {
560
+ display: flex;
561
+ flex-direction: row;
562
+ align-items: center;
563
+ gap: 0.75rem; /* space-x-3 */
564
+ padding: 1.5rem; /* p-6 */
565
+ background-color: #fafafa; /* bg-muted/50 */
566
+ border-bottom: 1px solid #e4e4e7;
567
+ }
568
+
569
+ .jux-card-icon {
570
+ display: flex;
571
+ align-items: center;
572
+ justify-content: center;
573
+ flex-shrink: 0;
574
+ width: 2.5rem; /* w-10 */
575
+ height: 2.5rem; /* h-10 */
576
+ border-radius: 0.375rem; /* rounded-md */
577
+ background-color: #f4f4f5; /* bg-muted */
578
+ color: #18181b; /* text-foreground */
579
+ font-size: 1.25rem; /* text-xl */
580
+ }
581
+
582
+ .jux-card-title {
583
+ flex: 1;
584
+ font-size: 1.125rem; /* text-lg */
585
+ font-weight: 600; /* font-semibold */
586
+ line-height: 1.2;
587
+ color: #09090b; /* text-foreground */
588
+ margin: 0;
589
+ }
590
+
591
+ .jux-card-body {
592
+ padding: 1.5rem; /* p-6 */
593
+ font-size: 0.875rem; /* text-sm */
594
+ line-height: 1.5;
595
+ color: #71717a; /* text-muted-foreground */
596
+ }
597
+
598
+ .jux-card-footer {
599
+ display: flex;
600
+ align-items: center;
601
+ padding: 1.5rem; /* p-6 */
602
+ padding-top: 1rem; /* pt-4 */
603
+ border-top: 1px solid #e4e4e7;
604
+ background-color: #fafafa; /* bg-muted/50 */
605
+ gap: 0.5rem;
606
+ }
607
+
608
+ /* Card variants */
609
+ .jux-card-compact .jux-card-header,
610
+ .jux-card-compact .jux-card-body,
611
+ .jux-card-compact .jux-card-footer {
612
+ padding: 1rem; /* p-4 */
613
+ }
614
+
615
+ .jux-card-flush .jux-card-header {
616
+ background-color: transparent;
617
+ border-bottom: none;
618
+ }
619
+
620
+ .jux-card-flush .jux-card-footer {
621
+ background-color: transparent;
622
+ border-top: none;
623
+ }
624
+
625
+ /* ═══════════════════════════════════════════════════════════════════
626
+ * BUTTON SIZE VARIANTS
627
+ * ═══════════════════════════════════════════════════════════════════ */
628
+
629
+ /* Extra Small */
630
+ button.jux-button-xs,
631
+ .jux-button-xs {
632
+ height: 2rem; /* h-8 */
633
+ padding: 0 0.75rem; /* px-3 */
634
+ font-size: 0.75rem; /* text-xs */
635
+ border-radius: 0.25rem; /* rounded-sm */
636
+ }
637
+
638
+ /* Small */
639
+ button.jux-button-sm,
640
+ .jux-button-sm {
641
+ height: 2.25rem; /* h-9 */
642
+ padding: 0 0.875rem; /* px-3.5 */
643
+ font-size: 0.8125rem; /* text-xs/sm */
644
+ border-radius: 0.3125rem;
645
+ }
646
+
647
+ /* Default/Medium (already defined above) */
648
+ button.jux-button,
649
+ .jux-button {
650
+ height: 2.5rem; /* h-10 */
651
+ padding: 0 1rem; /* px-4 */
652
+ font-size: 0.875rem; /* text-sm */
653
+ border-radius: 0.375rem; /* rounded-md */
654
+ }
655
+
656
+ /* Large */
657
+ button.jux-button-lg,
658
+ .jux-button-lg {
659
+ height: 2.75rem; /* h-11 */
660
+ padding: 0 1.25rem; /* px-5 */
661
+ font-size: 0.9375rem; /* text-base */
662
+ border-radius: 0.375rem; /* rounded-md */
663
+ }
664
+
665
+ /* Extra Large */
666
+ button.jux-button-xl,
667
+ .jux-button-xl {
668
+ height: 3rem; /* h-12 */
669
+ padding: 0 1.5rem; /* px-6 */
670
+ font-size: 1rem; /* text-base */
671
+ border-radius: 0.5rem; /* rounded-lg */
672
+ font-weight: 600; /* font-semibold */
673
+ }
674
+
675
+ /* 2X Large */
676
+ button.jux-button-2xl,
677
+ .jux-button-2xl {
678
+ height: 3.5rem; /* h-14 */
679
+ padding: 0 2rem; /* px-8 */
680
+ font-size: 1.125rem; /* text-lg */
681
+ border-radius: 0.5rem; /* rounded-lg */
682
+ font-weight: 600; /* font-semibold */
683
+ }
684
+
685
+ /* 3X Large */
686
+ button.jux-button-3xl,
687
+ .jux-button-3xl {
688
+ height: 4rem; /* h-16 */
689
+ padding: 0 2.5rem; /* px-10 */
690
+ font-size: 1.25rem; /* text-xl */
691
+ border-radius: 0.625rem; /* rounded-xl */
692
+ font-weight: 600; /* font-semibold */
693
+ }
694
+
695
+ /* ═══════════════════════════════════════════════════════════════════
696
+ * BUTTON VARIANTS (work with all sizes)
697
+ * ═══════════════════════════════════════════════════════════════════ */
698
+
699
+ /* Default/Primary */
700
+ .jux-button-default,
701
+ .jux-button-primary {
702
+ background-color: #18181b; /* bg-primary */
703
+ color: #fafafa; /* text-primary-foreground */
704
+ border: none;
705
+ }
706
+ .jux-button-default:hover,
707
+ .jux-button-primary:hover {
708
+ background-color: #27272a; /* hover:bg-primary/90 */
709
+ }
710
+
711
+ /* Secondary */
712
+ .jux-button-secondary {
713
+ background-color: #f4f4f5; /* bg-secondary */
714
+ color: #09090b; /* text-secondary-foreground */
715
+ border: none;
716
+ }
717
+ .jux-button-secondary:hover {
718
+ background-color: #e4e4e7; /* hover:bg-secondary/80 */
719
+ }
720
+
721
+ /* Destructive */
722
+ .jux-button-destructive {
723
+ background-color: #ef4444; /* bg-destructive */
724
+ color: #ffffff; /* text-destructive-foreground */
725
+ border: none;
726
+ }
727
+ .jux-button-destructive:hover {
728
+ background-color: #dc2626; /* hover:bg-destructive/90 */
729
+ }
730
+
731
+ /* Outline */
732
+ .jux-button-outline {
733
+ border: 1px solid #e4e4e7; /* border-input */
734
+ background-color: #ffffff; /* bg-background */
735
+ color: #09090b; /* text-foreground */
736
+ }
737
+ .jux-button-outline:hover {
738
+ background-color: #f4f4f5; /* hover:bg-accent */
739
+ color: #18181b; /* hover:text-accent-foreground */
740
+ }
741
+
742
+ /* Ghost */
743
+ .jux-button-ghost {
744
+ background-color: transparent;
745
+ color: #09090b;
746
+ border: none;
747
+ }
748
+ .jux-button-ghost:hover {
749
+ background-color: #f4f4f5; /* hover:bg-accent */
750
+ color: #18181b; /* hover:text-accent-foreground */
751
+ }
752
+
753
+ /* Link */
754
+ .jux-button-link {
755
+ background-color: transparent;
756
+ color: #18181b; /* text-primary */
757
+ text-decoration: underline;
758
+ text-underline-offset: 4px;
759
+ border: none;
760
+ padding: 0;
761
+ height: auto;
762
+ }
763
+ .jux-button-link:hover {
764
+ text-decoration: none;
765
+ }
766
+
767
+ /* ═══════════════════════════════════════════════════════════════════
768
+ * ICON BUTTONS (Square variants)
769
+ * ═══════════════════════════════════════════════════════════════════ */
770
+
771
+ .jux-button-icon {
772
+ padding: 0;
773
+ aspect-ratio: 1 / 1;
774
+ }
775
+
776
+ .jux-button-icon.jux-button-xs {
777
+ width: 2rem;
778
+ height: 2rem;
779
+ }
780
+
781
+ .jux-button-icon.jux-button-sm {
782
+ width: 2.25rem;
783
+ height: 2.25rem;
784
+ }
785
+
786
+ .jux-button-icon {
787
+ width: 2.5rem;
788
+ height: 2.5rem;
789
+ }
790
+
791
+ .jux-button-icon.jux-button-lg {
792
+ width: 2.75rem;
793
+ height: 2.75rem;
794
+ }
795
+
796
+ .jux-button-icon.jux-button-xl {
797
+ width: 3rem;
798
+ height: 3rem;
799
+ }
800
+
801
+ .jux-button-icon.jux-button-2xl {
802
+ width: 3.5rem;
803
+ height: 3.5rem;
804
+ }
805
+
806
+ .jux-button-icon.jux-button-3xl {
807
+ width: 4rem;
808
+ height: 4rem;
809
+ }
810
+
811
+ /* ═══════════════════════════════════════════════════════════════════
812
+ * BUTTON STATES
813
+ * ═══════════════════════════════════════════════════════════════════ */
814
+
815
+ button.jux-button:disabled,
816
+ .jux-button:disabled {
817
+ pointer-events: none;
818
+ opacity: 0.5;
819
+ }
820
+
821
+ button.jux-button:focus-visible,
822
+ .jux-button:focus-visible {
823
+ outline: 2px solid #18181b; /* ring-ring */
824
+ outline-offset: 2px;
825
+ }
826
+
827
+ button.jux-button:active,
828
+ .jux-button:active {
829
+ transform: scale(0.98);
830
+ }
831
+
832
+ /* Loading state */
833
+ .jux-button-loading {
834
+ position: relative;
835
+ color: transparent;
836
+ pointer-events: none;
837
+ }
838
+
839
+ .jux-button-loading::after {
840
+ content: '';
841
+ position: absolute;
842
+ width: 1rem;
843
+ height: 1rem;
844
+ top: 50%;
845
+ left: 50%;
846
+ margin-left: -0.5rem;
847
+ margin-top: -0.5rem;
848
+ border: 2px solid currentColor;
849
+ border-top-color: transparent;
850
+ border-radius: 50%;
851
+ animation: button-spin 0.6s linear infinite;
852
+ color: inherit;
853
+ }
854
+
855
+ @keyframes button-spin {
856
+ to { transform: rotate(360deg); }
857
+ }
858
+
859
+ /* ═══════════════════════════════════════════════════════════════════
860
+ * DARK MODE
861
+ * ═══════════════════════════════════════════════════════════════════ */
862
+
863
+ .dark .jux-button-default,
864
+ .dark .jux-button-primary {
865
+ background-color: #fafafa;
866
+ color: #18181b;
867
+ }
868
+ .dark .jux-button-default:hover,
869
+ .dark .jux-button-primary:hover {
870
+ background-color: #e4e4e7;
871
+ }
872
+
873
+ .dark .jux-button-secondary {
874
+ background-color: #27272a;
875
+ color: #fafafa;
876
+ }
877
+ .dark .jux-button-secondary:hover {
878
+ background-color: #3f3f46;
879
+ }
880
+
881
+ .dark .jux-button-outline {
882
+ border-color: #27272a;
883
+ background-color: #09090b;
884
+ color: #fafafa;
885
+ }
886
+ .dark .jux-button-outline:hover {
887
+ background-color: #27272a;
888
+ color: #fafafa;
889
+ }
890
+
891
+ .dark .jux-button-ghost {
892
+ color: #fafafa;
893
+ }
894
+ .dark .jux-button-ghost:hover {
895
+ background-color: #27272a;
896
+ color: #fafafa;
897
+ }
898
+
899
+ .dark .jux-button-link {
900
+ color: #fafafa;
901
+ }
902
+
903
+ .dark .jux-button:focus-visible {
904
+ outline-color: #fafafa;
905
+ }
906
+
907
+ /* ═══════════════════════════════════════════════════════════════════
908
+ * MENU STYLES (Shadcn Sidebar)
909
+ * ═══════════════════════════════════════════════════════════════════ */
910
+
911
+ /* Menu Container */
912
+ .jux-menu,
913
+ .jux-menu-vertical {
914
+ display: flex;
915
+ flex-direction: column;
916
+ gap: 0.25rem;
917
+ width: 100%;
918
+ padding: 0.5rem;
919
+ }
920
+
921
+ /* Menu Items Wrapper */
922
+ .jux-menu-items {
923
+ display: flex;
924
+ flex-direction: column;
925
+ gap: 0.25rem;
926
+ width: 100%;
927
+ }
928
+
929
+ /* Individual Menu Item Container */
930
+ .jux-menu-item-wrapper {
931
+ display: flex;
932
+ flex-direction: column;
933
+ width: 100%;
934
+ }
935
+
936
+ /* Menu Link/Item */
937
+ .jux-menu-link,
938
+ .jux-menu-item {
939
+ display: flex;
940
+ align-items: center;
941
+ gap: 0.75rem;
942
+ padding: 0.5rem 0.75rem;
943
+ border-radius: 0.375rem;
944
+ font-size: 0.875rem;
945
+ font-weight: 500;
946
+ color: #09090b;
947
+ cursor: pointer;
948
+ transition: background-color 0.15s;
949
+ text-decoration: none;
950
+ background: transparent;
951
+ border: none;
952
+ width: 100%;
953
+ text-align: left;
954
+ }
955
+
956
+ .jux-menu-link:hover,
957
+ .jux-menu-item:hover {
958
+ background-color: #f4f4f5;
959
+ }
960
+
961
+ .jux-menu-link-active,
962
+ .jux-menu-item-active {
963
+ background-color: #f4f4f5;
964
+ font-weight: 600;
965
+ }
966
+
967
+ /* Menu Label (text inside link) */
968
+ .jux-menu-label {
969
+ flex: 1;
970
+ font-size: 0.875rem;
971
+ font-weight: inherit;
972
+ color: inherit;
973
+ }
974
+
975
+ /* Section Label (header text) */
976
+ .jux-menu-section-label {
977
+ padding: 0.5rem;
978
+ font-size: 0.75rem;
979
+ font-weight: 600;
980
+ color: #71717a;
981
+ text-transform: uppercase;
982
+ letter-spacing: 0.05em;
983
+ }
984
+
985
+ /* Icon */
986
+ .jux-menu-icon {
987
+ width: 1.25rem;
988
+ height: 1.25rem;
989
+ flex-shrink: 0;
990
+ display: flex;
991
+ align-items: center;
992
+ justify-content: center;
993
+ }
994
+
995
+ /* Chevron for expandable items */
996
+ .jux-menu-chevron {
997
+ width: 1rem;
998
+ height: 1rem;
999
+ flex-shrink: 0;
1000
+ margin-left: auto;
1001
+ transition: transform 0.15s;
1002
+ color: #71717a;
1003
+ }
1004
+
1005
+ .jux-menu-item-expanded .jux-menu-chevron {
1006
+ transform: rotate(90deg);
1007
+ }
1008
+
1009
+ /* Submenu (indented) */
1010
+ .jux-menu-submenu {
1011
+ display: flex;
1012
+ flex-direction: column;
1013
+ gap: 0.125rem;
1014
+ margin-left: 2rem;
1015
+ padding-left: 0.75rem;
1016
+ border-left: 1px solid #e4e4e7;
1017
+ margin-top: 0.125rem;
1018
+ }
1019
+
1020
+ .jux-menu-submenu .jux-menu-link,
1021
+ .jux-menu-submenu .jux-menu-item {
1022
+ padding: 0.375rem 0.75rem;
1023
+ font-size: 0.8125rem;
1024
+ }
1025
+
1026
+ /* User Section at Bottom */
1027
+ .jux-menu-user {
1028
+ display: flex;
1029
+ align-items: center;
1030
+ gap: 0.75rem;
1031
+ padding: 0.75rem;
1032
+ margin-top: auto;
1033
+ border-top: 1px solid #e4e4e7;
1034
+ border-radius: 0.375rem;
1035
+ cursor: pointer;
1036
+ }
1037
+
1038
+ .jux-menu-user:hover {
1039
+ background-color: #f4f4f5;
1040
+ }
1041
+
1042
+ .jux-menu-user-avatar {
1043
+ width: 2rem;
1044
+ height: 2rem;
1045
+ border-radius: 50%;
1046
+ flex-shrink: 0;
1047
+ }
1048
+
1049
+ .jux-menu-user-info {
1050
+ flex: 1;
1051
+ display: flex;
1052
+ flex-direction: column;
1053
+ gap: 0.125rem;
1054
+ }
1055
+
1056
+ .jux-menu-user-name {
1057
+ font-size: 0.875rem;
1058
+ font-weight: 600;
1059
+ color: #09090b;
1060
+ }
1061
+
1062
+ .jux-menu-user-email {
1063
+ font-size: 0.75rem;
1064
+ color: #71717a;
1065
+ }
1066
+
1067
+ /* Dark Mode */
1068
+ .dark .jux-menu-link,
1069
+ .dark .jux-menu-item {
1070
+ color: #fafafa;
1071
+ }
1072
+
1073
+ .dark .jux-menu-link:hover,
1074
+ .dark .jux-menu-item:hover,
1075
+ .dark .jux-menu-link-active,
1076
+ .dark .jux-menu-item-active {
1077
+ background-color: #27272a;
1078
+ }
1079
+
1080
+ .dark .jux-menu-section-label {
1081
+ color: #a1a1aa;
1082
+ }
1083
+
1084
+ .dark .jux-menu-submenu {
1085
+ border-left-color: #27272a;
1086
+ }
1087
+
1088
+ .dark .jux-menu-user {
1089
+ border-top-color: #27272a;
1090
+ }
1091
+
1092
+ .dark .jux-menu-user:hover {
1093
+ background-color: #27272a;
1094
+ }
1095
+
1096
+ .dark .jux-menu-user-name {
1097
+ color: #fafafa;
1098
+ }
1099
+
1100
+ .dark .jux-menu-user-email {
1101
+ color: #a1a1aa;
1102
+ }
1103
+
1104
+ .dark .jux-menu-chevron {
1105
+ color: #a1a1aa;
1106
+ }