juxscript 1.0.28 → 1.0.30

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,1380 +0,0 @@
1
-
2
- /* ============================================
3
- GLOBAL RESET & BASE STYLES
4
- ============================================ */
5
- * {
6
- box-sizing: border-box;
7
- margin: 0;
8
- padding: 0;
9
- }
10
-
11
- body {
12
- font-family: var(--font-family-base);
13
- font-size: var(--font-size-base);
14
- line-height: var(--line-height-normal);
15
- color: var(--color-text-primary);
16
- background: var(--color-background);
17
- transition: background-color var(--transition-base), color var(--transition-base);
18
- overflow: hidden;
19
- }
20
-
21
- /* ============================================
22
- APP CONTAINER - Main Layout Grid
23
- ============================================ */
24
- #app {
25
- display: grid;
26
- grid-template-columns: auto 1fr auto;
27
- grid-template-rows: auto 1fr auto;
28
- grid-template-areas:
29
- "header header header"
30
- "sidebar main aside"
31
- "footer footer footer";
32
- width: 100vw;
33
- height: 100vh;
34
- overflow: hidden;
35
- }
36
-
37
- /* ============================================
38
- HEADER - Top Navigation Bar
39
- ============================================ */
40
- #appheader {
41
- grid-area: header;
42
- background: var(--color-surface-elevated);
43
- border-bottom: var(--border-width) solid var(--color-border);
44
- display: flex;
45
- align-items: center;
46
- padding: 0 var(--space-lg);
47
- height: 48px;
48
- z-index: 100;
49
- transition: background-color var(--transition-base), border-color var(--transition-base);
50
- }
51
-
52
- #appheader-content {
53
- display: flex;
54
- align-items: center;
55
- justify-content: space-between;
56
- width: 100%;
57
- gap: var(--space-xl);
58
- }
59
-
60
- #appheader-logo {
61
- display: flex;
62
- align-items: center;
63
- gap: var(--space-md);
64
- font-size: var(--font-size-lg);
65
- font-weight: var(--font-weight-semibold);
66
- color: var(--color-text-primary);
67
- text-decoration: none;
68
- padding: var(--space-sm) var(--space-md);
69
- border-radius: var(--radius-md);
70
- transition: background-color var(--transition-fast);
71
- }
72
-
73
- #appheader-logo:hover {
74
- background: var(--color-surface-hover);
75
- }
76
-
77
- #appheader-nav {
78
- flex: 1;
79
- display: flex;
80
- align-items: center;
81
- gap: var(--space-sm);
82
- }
83
-
84
- #appheader-actions {
85
- display: flex;
86
- align-items: center;
87
- gap: var(--space-md);
88
- }
89
-
90
- /* ============================================
91
- SIDEBAR - Left Navigation
92
- ============================================ */
93
- .jux-sidebar,
94
- #appaside {
95
- grid-area: sidebar;
96
- width: 260px;
97
- background: var(--color-surface-base);
98
- border-right: var(--border-width) solid var(--color-border);
99
- display: flex;
100
- flex-direction: column;
101
- overflow: hidden;
102
- transition: width var(--transition-base);
103
- position: relative;
104
- }
105
-
106
- .jux-sidebar-collapsed,
107
- #appaside.jux-sidebar-collapsed {
108
- width: 60px;
109
- }
110
-
111
- .jux-sidebar-expand-on-hover.jux-sidebar-collapsed.jux-sidebar-hover-expanded,
112
- #appaside.jux-sidebar-expand-on-hover.jux-sidebar-collapsed.jux-sidebar-hover-expanded {
113
- width: 260px;
114
- z-index: 1000;
115
- /* box-shadow: var(--shadow-lg); */
116
- }
117
-
118
- .jux-sidebar-menu {
119
- flex: 1;
120
- overflow-y: auto;
121
- overflow-x: hidden;
122
- padding: var(--space-sm);
123
- }
124
-
125
- .jux-sidebar-menu::-webkit-scrollbar {
126
- width: 6px;
127
- }
128
-
129
- .jux-sidebar-menu::-webkit-scrollbar-thumb {
130
- background: var(--color-border);
131
- border-radius: var(--radius-full);
132
- }
133
-
134
- .jux-sidebar-toggle {
135
- margin-top: auto;
136
- order: 999;
137
- width: 32px;
138
- height: 32px;
139
- margin-left: auto;
140
- margin-right: var(--space-lg);
141
- margin-bottom: var(--space-lg);
142
- border: none;
143
- background: var(--color-surface-elevated);
144
- color: var(--color-text-secondary);
145
- border-radius: var(--radius-md);
146
- cursor: pointer;
147
- display: flex;
148
- align-items: center;
149
- justify-content: center;
150
- transition: all var(--transition-base);
151
- border: var(--border-width) solid var(--color-border);
152
- }
153
-
154
- .jux-sidebar-toggle:hover {
155
- background: var(--color-surface-hover);
156
- color: var(--color-text-primary);
157
- }
158
-
159
- .jux-sidebar-collapsed .jux-sidebar-toggle,
160
- #appaside.jux-sidebar-collapsed .jux-sidebar-toggle {
161
- margin-left: 14px;
162
- margin-right: 14px;
163
- }
164
-
165
- .jux-sidebar-hover-expanded .jux-sidebar-toggle,
166
- #appaside.jux-sidebar-hover-expanded .jux-sidebar-toggle {
167
- margin-left: auto;
168
- margin-right: var(--space-lg);
169
- }
170
-
171
- .jux-sidebar-toggle-icon {
172
- display: flex;
173
- align-items: center;
174
- justify-content: center;
175
- font-size: var(--font-size-lg);
176
- }
177
-
178
- /* Menu inside sidebar */
179
- .jux-sidebar .jux-menu {
180
- display: flex;
181
- flex-direction: column;
182
- gap: var(--space-xs);
183
- }
184
-
185
- .jux-sidebar .jux-menu-item {
186
- list-style: none;
187
- }
188
-
189
- .jux-sidebar .jux-menu-link,
190
- .jux-sidebar .jux-menu-button {
191
- display: flex;
192
- align-items: center;
193
- gap: var(--space-md);
194
- padding: var(--space-sm) var(--space-md);
195
- border-radius: var(--radius-md);
196
- color: var(--color-text-secondary);
197
- text-decoration: none;
198
- font-size: var(--font-size-sm);
199
- font-weight: var(--font-weight-medium);
200
- transition: all var(--transition-fast);
201
- cursor: pointer;
202
- border: none;
203
- background: transparent;
204
- width: 100%;
205
- text-align: left;
206
- white-space: nowrap;
207
- position: relative;
208
- }
209
-
210
- .jux-sidebar .jux-menu-link:hover,
211
- .jux-sidebar .jux-menu-button:hover {
212
- background: var(--color-surface-hover);
213
- color: var(--color-text-primary);
214
- }
215
-
216
- .jux-sidebar .jux-menu-item-active > .jux-menu-link,
217
- .jux-sidebar .jux-menu-item-active > .jux-menu-button,
218
- .jux-sidebar .jux-menu-link-active {
219
- background: var(--color-brand-subtle);
220
- color: var(--color-brand);
221
- font-weight: var(--font-weight-semibold);
222
- }
223
-
224
- .jux-sidebar .jux-menu-icon {
225
- flex-shrink: 0;
226
- width: 20px;
227
- display: flex;
228
- align-items: center;
229
- justify-content: center;
230
- }
231
-
232
- .jux-sidebar .jux-menu-label {
233
- flex: 1;
234
- overflow: hidden;
235
- text-overflow: ellipsis;
236
- }
237
-
238
- .jux-sidebar .jux-menu-chevron {
239
- flex-shrink: 0;
240
- transition: transform var(--transition-fast);
241
- font-size: var(--font-size-sm);
242
- color: var(--color-text-tertiary);
243
- }
244
-
245
- .jux-sidebar .jux-menu-item-open > .jux-menu-button .jux-menu-chevron {
246
- transform: rotate(90deg);
247
- }
248
-
249
- /* Collapsed state - hide labels and chevrons */
250
- .jux-sidebar-collapsed .jux-menu-label,
251
- .jux-sidebar-collapsed .jux-menu-chevron,
252
- #appaside.jux-sidebar-collapsed .jux-menu-label,
253
- #appaside.jux-sidebar-collapsed .jux-menu-chevron {
254
- display: none;
255
- }
256
-
257
- .jux-sidebar-collapsed .jux-menu-link,
258
- .jux-sidebar-collapsed .jux-menu-button,
259
- #appaside.jux-sidebar-collapsed .jux-menu-link,
260
- #appaside.jux-sidebar-collapsed .jux-menu-button {
261
- justify-content: center;
262
- padding: var(--space-sm);
263
- }
264
-
265
- /* Hover-expanded state - show labels */
266
- .jux-sidebar-hover-expanded .jux-menu-label,
267
- .jux-sidebar-hover-expanded .jux-menu-chevron,
268
- #appaside.jux-sidebar-hover-expanded .jux-menu-label,
269
- #appaside.jux-sidebar-hover-expanded .jux-menu-chevron {
270
- display: inline;
271
- }
272
-
273
- .jux-sidebar-hover-expanded .jux-menu-link,
274
- .jux-sidebar-hover-expanded .jux-menu-button,
275
- #appaside.jux-sidebar-hover-expanded .jux-menu-link,
276
- #appaside.jux-sidebar-hover-expanded .jux-menu-button {
277
- justify-content: flex-start;
278
- padding: var(--space-sm) var(--space-md);
279
- }
280
-
281
- /* Submenus */
282
- .jux-sidebar .jux-menu-submenu {
283
- display: none;
284
- flex-direction: column;
285
- gap: var(--space-xs);
286
- padding-left: var(--space-xl);
287
- margin-top: var(--space-xs);
288
- border-left: 2px solid var(--color-border);
289
- margin-left: var(--space-lg);
290
- }
291
-
292
- .jux-sidebar .jux-menu-item-open > .jux-menu-submenu {
293
- display: flex;
294
- }
295
-
296
- .jux-sidebar .jux-menu-submenu .jux-menu-link,
297
- .jux-sidebar .jux-menu-submenu .jux-menu-button {
298
- font-size: var(--font-size-xs);
299
- padding: var(--space-xs) var(--space-md);
300
- }
301
-
302
- /* Hide submenus when collapsed */
303
- .jux-sidebar-collapsed .jux-menu-submenu,
304
- #appaside.jux-sidebar-collapsed .jux-menu-submenu {
305
- display: none !important;
306
- }
307
-
308
- /* Show submenus when hover-expanded and open */
309
- .jux-sidebar-hover-expanded .jux-menu-item-open > .jux-menu-submenu,
310
- #appaside.jux-sidebar-hover-expanded .jux-menu-item-open > .jux-menu-submenu {
311
- display: flex !important;
312
- }
313
-
314
- /* ============================================
315
- MAIN CONTENT - Center Area
316
- ============================================ */
317
- #appmain {
318
- grid-area: main;
319
- background: var(--color-background);
320
- overflow-y: auto;
321
- overflow-x: hidden;
322
- display: flex;
323
- flex-direction: column;
324
- position: relative;
325
- }
326
-
327
- #appmain-content {
328
- flex: 1;
329
- padding: var(--space-3xl) var(--space-2xl);
330
- max-width: 1600px;
331
- width: 100%;
332
- margin: 0 auto;
333
- }
334
-
335
- /* Custom scrollbar for main content */
336
- #appmain::-webkit-scrollbar {
337
- width: 8px;
338
- }
339
-
340
- #appmain::-webkit-scrollbar-track {
341
- background: var(--color-surface-base);
342
- }
343
-
344
- #appmain::-webkit-scrollbar-thumb {
345
- background: var(--color-border);
346
- border-radius: var(--radius-full);
347
- }
348
-
349
- #appmain::-webkit-scrollbar-thumb:hover {
350
- background: var(--color-border-hover);
351
- }
352
-
353
- /* ============================================
354
- RIGHT SIDEBAR - Optional Panel
355
- ============================================ */
356
- #appsidebar {
357
- grid-area: aside;
358
- width: 280px;
359
- background: var(--color-surface-base);
360
- border-left: var(--border-width) solid var(--color-border);
361
- display: none;
362
- flex-direction: column;
363
- overflow: hidden;
364
- transition: width var(--transition-base), background-color var(--transition-base);
365
- }
366
-
367
- #appsidebar.show {
368
- display: flex;
369
- }
370
-
371
- #appsidebar.collapsed {
372
- width: 0;
373
- border: none;
374
- }
375
-
376
- #appsidebar-header {
377
- padding: var(--space-lg);
378
- border-bottom: var(--border-width) solid var(--color-border);
379
- font-weight: var(--font-weight-semibold);
380
- font-size: var(--font-size-sm);
381
- color: var(--color-text-secondary);
382
- text-transform: uppercase;
383
- letter-spacing: 0.05em;
384
- }
385
-
386
- #appsidebar-content {
387
- flex: 1;
388
- overflow-y: auto;
389
- overflow-x: hidden;
390
- padding: var(--space-lg);
391
- }
392
-
393
- #appsidebar-content::-webkit-scrollbar {
394
- width: 6px;
395
- }
396
-
397
- #appsidebar-content::-webkit-scrollbar-track {
398
- background: transparent;
399
- }
400
-
401
- #appsidebar-content::-webkit-scrollbar-thumb {
402
- background: var(--color-border);
403
- border-radius: var(--radius-full);
404
- }
405
-
406
- #appsidebar-content::-webkit-scrollbar-thumb:hover {
407
- background: var(--color-border-hover);
408
- }
409
-
410
- #appsidebar-footer {
411
- padding: var(--space-lg);
412
- border-top: var(--border-width) solid var(--color-border);
413
- font-size: var(--font-size-xs);
414
- color: var(--color-text-tertiary);
415
- }
416
-
417
- /* ============================================
418
- FOOTER - Bottom Bar
419
- ============================================ */
420
- #appfooter {
421
- grid-area: footer;
422
- background: var(--color-surface-elevated);
423
- border-top: var(--border-width) solid var(--color-border);
424
- padding: var(--space-lg) var(--space-2xl);
425
- display: flex;
426
- align-items: center;
427
- justify-content: space-between;
428
- font-size: var(--font-size-sm);
429
- color: var(--color-text-tertiary);
430
- transition: background-color var(--transition-base), border-color var(--transition-base);
431
- }
432
-
433
- #appfooter-content {
434
- display: flex;
435
- align-items: center;
436
- gap: var(--space-xl);
437
- }
438
-
439
- #appfooter-legal {
440
- display: flex;
441
- align-items: center;
442
- gap: var(--space-lg);
443
- }
444
-
445
- #appfooter a {
446
- color: var(--color-text-secondary);
447
- text-decoration: none;
448
- transition: color var(--transition-fast);
449
- }
450
-
451
- #appfooter a:hover {
452
- color: var(--color-text-primary);
453
- }
454
-
455
- /* ============================================
456
- THEME TOGGLE - Dark/Light Mode Button
457
- ============================================ */
458
- #theme-toggle {
459
- display: flex;
460
- align-items: center;
461
- gap: var(--space-sm);
462
- }
463
-
464
- #theme-toggle button {
465
- display: flex;
466
- align-items: center;
467
- justify-content: center;
468
- width: 32px;
469
- height: 32px;
470
- border-radius: var(--radius-md);
471
- border: none;
472
- background: var(--color-surface-hover);
473
- color: var(--color-text-secondary);
474
- cursor: pointer;
475
- transition: all var(--transition-fast);
476
- font-size: var(--font-size-lg);
477
- }
478
-
479
- #theme-toggle button:hover {
480
- background: var(--color-surface-active);
481
- color: var(--color-text-primary);
482
- transform: scale(1.05);
483
- }
484
-
485
- #theme-toggle button:active {
486
- transform: scale(0.95);
487
- }
488
-
489
- /* Mobile Sidebar Backdrop */
490
- .jux-sidebar-backdrop {
491
- display: none;
492
- position: fixed;
493
- top: 0;
494
- left: 0;
495
- right: 0;
496
- bottom: 0;
497
- background: rgba(0, 0, 0, 0.5);
498
- z-index: 999;
499
- backdrop-filter: blur(4px);
500
- animation: fadeIn 0.2s ease-out;
501
- }
502
-
503
- .jux-sidebar-backdrop.show {
504
- display: block;
505
- }
506
-
507
- /* ============================================
508
- RESPONSIVE DESIGN
509
- ============================================ */
510
- @media (max-width: 1024px) {
511
- #appaside {
512
- display: none;
513
- }
514
-
515
- #app {
516
- grid-template-columns: auto 1fr;
517
- grid-template-areas:
518
- "sidebar header"
519
- "sidebar main"
520
- "sidebar footer";
521
- }
522
- }
523
-
524
- @media (max-width: 768px) {
525
- /* Move sidebar toggle to header on mobile */
526
- .jux-sidebar-toggle,
527
- #appaside .jux-sidebar-toggle {
528
- position: fixed;
529
- top: 8px;
530
- left: var(--space-md);
531
- z-index: 1001;
532
- margin: 0;
533
- }
534
-
535
- .jux-sidebar,
536
- #appaside {
537
- display: none;
538
- position: fixed;
539
- left: 0;
540
- top: 0;
541
- bottom: 0;
542
- z-index: 1000;
543
- width: 260px;
544
- box-shadow: var(--shadow-xl);
545
- transform: translateX(-100%);
546
- transition: transform var(--transition-base);
547
- }
548
-
549
- .jux-sidebar.open,
550
- #appaside.open {
551
- display: flex;
552
- transform: translateX(0);
553
- }
554
-
555
- #app {
556
- grid-template-columns: 1fr;
557
- grid-template-areas:
558
- "header"
559
- "main"
560
- "footer";
561
- }
562
-
563
- #appmain-content {
564
- padding: var(--space-2xl) var(--space-lg);
565
- }
566
-
567
- #appheader {
568
- padding: 0 var(--space-md) 0 calc(var(--space-md) + 48px);
569
- }
570
- }
571
-
572
- /* ============================================
573
- ANIMATIONS
574
- ============================================ */
575
- @keyframes fadeIn {
576
- from {
577
- opacity: 0;
578
- transform: translateY(10px);
579
- }
580
- to {
581
- opacity: 1;
582
- transform: translateY(0);
583
- }
584
- }
585
-
586
- @keyframes slideIn {
587
- from {
588
- transform: translateX(-20px);
589
- opacity: 0;
590
- }
591
- to {
592
- transform: translateX(0);
593
- opacity: 1;
594
- }
595
- }
596
-
597
- .animate-fade-in {
598
- animation: fadeIn var(--transition-base) ease-out;
599
- }
600
-
601
- .animate-slide-in {
602
- animation: slideIn var(--transition-base) ease-out;
603
- }
604
-
605
- /* ============================================
606
- JUX COMPONENT STYLES
607
- ============================================ */
608
-
609
- /* Icon Component */
610
- .jux-icon {
611
- display: inline-flex;
612
- align-items: center;
613
- justify-content: center;
614
- vertical-align: middle;
615
- line-height: 1;
616
- }
617
-
618
- .jux-icon img,
619
- .jux-icon svg {
620
- display: block;
621
- width: 100%;
622
- height: 100%;
623
- object-fit: contain;
624
- }
625
-
626
- /* Hero Component */
627
- .jux-hero {
628
- padding: var(--space-3xl) 0;
629
- margin-bottom: var(--space-2xl);
630
- }
631
-
632
- .jux-hero-title {
633
- font-size: var(--font-size-3xl);
634
- font-weight: var(--font-weight-bold);
635
- color: var(--color-text-primary);
636
- margin-bottom: var(--space-md);
637
- line-height: var(--line-height-tight);
638
- }
639
-
640
- .jux-hero-subtitle {
641
- font-size: var(--font-size-lg);
642
- color: var(--color-text-secondary);
643
- line-height: var(--line-height-normal);
644
- }
645
-
646
- /* Hero centered variant */
647
- .jux-hero.jux-hero-centered {
648
- text-align: center;
649
- }
650
-
651
- .jux-hero.jux-hero-centered .jux-hero-title,
652
- .jux-hero.jux-hero-centered .jux-hero-subtitle {
653
- max-width: 800px;
654
- margin-left: auto;
655
- margin-right: auto;
656
- }
657
-
658
- /* Card Component */
659
- .jux-card {
660
- background: var(--color-surface-elevated);
661
- border: var(--border-width) solid var(--color-border);
662
- border-radius: var(--radius-lg);
663
- padding: var(--space-xl);
664
- transition: all var(--transition-base);
665
- position: relative;
666
- overflow: hidden;
667
- }
668
-
669
- .jux-card::before {
670
- content: '';
671
- position: absolute;
672
- top: 0;
673
- left: 0;
674
- right: 0;
675
- height: 2px;
676
- background: linear-gradient(90deg, var(--color-brand), var(--color-info));
677
- transform: translateY(-100%);
678
- transition: transform var(--transition-base);
679
- z-index: 1;
680
- }
681
-
682
- .jux-card:hover {
683
- box-shadow: var(--shadow-md);
684
- border-color: var(--color-border-hover);
685
- transform: translateY(-2px);
686
- }
687
-
688
- .jux-card:hover::before {
689
- transform: translateY(0);
690
- }
691
-
692
- .jux-card-title {
693
- font-size: var(--font-size-lg);
694
- font-weight: var(--font-weight-semibold);
695
- color: var(--color-text-primary);
696
- margin-bottom: var(--space-lg);
697
- letter-spacing: -0.01em;
698
- position: relative;
699
- z-index: 2;
700
- padding-right: calc(var(--font-size-2xl) + var(--space-lg));
701
- }
702
-
703
- .jux-card-icon {
704
- position: absolute;
705
- top: var(--space-xl);
706
- right: var(--space-xl);
707
- font-size: var(--font-size-2xl);
708
- line-height: 1;
709
- opacity: 0.8;
710
- transition: opacity var(--transition-fast);
711
- z-index: 2;
712
- }
713
-
714
- .jux-card:hover .jux-card-icon {
715
- opacity: 1;
716
- }
717
-
718
- .jux-card-body {
719
- font-size: var(--font-size-sm);
720
- color: var(--color-text-secondary);
721
- line-height: var(--line-height-relaxed);
722
- position: relative;
723
- z-index: 2;
724
- }
725
-
726
- .jux-card-body .jux-card-title {
727
- display: block;
728
- margin-top: 0;
729
- }
730
-
731
- .jux-card-content {
732
- font-size: var(--font-size-2xl);
733
- font-weight: var(--font-weight-bold);
734
- color: var(--color-text-primary);
735
- text-align: center;
736
- padding: var(--space-xl) 0;
737
- }
738
-
739
- .jux-card-body .jux-card-content {
740
- font-size: var(--font-size-sm);
741
- text-align: left;
742
- padding: 0;
743
- font-weight: var(--font-weight-normal);
744
- }
745
-
746
- .jux-card-footer {
747
- margin-top: var(--space-xl);
748
- padding-top: var(--space-lg);
749
- border-top: var(--border-width) solid var(--color-border);
750
- }
751
-
752
- .jux-card-actions {
753
- display: flex;
754
- gap: var(--space-md);
755
- justify-content: flex-start;
756
- }
757
-
758
- /* List Component */
759
- .jux-list {
760
- display: flex;
761
- flex-direction: column;
762
- gap: var(--space-md);
763
- list-style: none;
764
- padding: 0;
765
- margin: var(--space-lg);
766
- }
767
-
768
- .jux-list-wrapper {
769
- display: flex;
770
- flex-direction: column;
771
- gap: var(--space-md);
772
- }
773
-
774
- .jux-list-header {
775
- font-size: var(--font-size-sm);
776
- font-weight: var(--font-weight-semibold);
777
- color: var(--color-text-secondary);
778
- margin-bottom: var(--space-lg);
779
- padding: 0 var(--space-lg);
780
- text-transform: uppercase;
781
- letter-spacing: 0.05em;
782
- }
783
-
784
- .jux-list-item {
785
- display: flex;
786
- align-items: center;
787
- gap: var(--space-lg);
788
- padding: var(--space-lg);
789
- background: var(--color-surface-elevated);
790
- border: var(--border-width) solid var(--color-border);
791
- border-radius: var(--radius-lg);
792
- transition: all var(--transition-base);
793
- cursor: pointer;
794
- }
795
-
796
- .jux-list-item:hover {
797
- background: var(--color-surface-hover);
798
- border-color: var(--color-border-hover);
799
- box-shadow: var(--shadow-sm);
800
- }
801
-
802
- .jux-list-item.jux-list-item-selected {
803
- border-color: var(--color-brand);
804
- box-shadow: 0 0 0 3px var(--color-brand-subtle);
805
- }
806
-
807
- .jux-list-item-icon {
808
- display: flex;
809
- align-items: center;
810
- justify-content: center;
811
- flex-shrink: 0;
812
- width: 24px;
813
- height: 24px;
814
- color: var(--color-text-primary);
815
- }
816
-
817
- .jux-list-item-content {
818
- flex: 1;
819
- display: flex;
820
- flex-direction: column;
821
- gap: var(--space-xs);
822
- }
823
-
824
- .jux-list-item-title {
825
- font-size: var(--font-size-base);
826
- font-weight: var(--font-weight-semibold);
827
- color: var(--color-text-primary);
828
- line-height: var(--line-height-tight);
829
- }
830
-
831
- .jux-list-item-body {
832
- font-size: var(--font-size-sm);
833
- color: var(--color-text-secondary);
834
- line-height: var(--line-height-normal);
835
- }
836
-
837
- .jux-list-item-metadata {
838
- font-size: var(--font-size-xs);
839
- color: var(--color-text-tertiary);
840
- margin-left: auto;
841
- padding-left: var(--space-lg);
842
- white-space: nowrap;
843
- }
844
-
845
- .jux-list-item-success {
846
- border-left: 3px solid var(--color-success);
847
- }
848
-
849
- .jux-list-item-warning {
850
- border-left: 3px solid var(--color-warning);
851
- }
852
-
853
- .jux-list-item-error {
854
- border-left: 3px solid var(--color-danger);
855
- }
856
-
857
- .jux-list-item-info {
858
- border-left: 3px solid var(--color-info);
859
- }
860
-
861
- /* Container Component */
862
- .jux-container {
863
- width: 100%;
864
- }
865
-
866
- /* Button Component */
867
- .jux-button {
868
- display: inline-flex;
869
- align-items: center;
870
- justify-content: center;
871
- gap: var(--space-sm);
872
- padding: var(--space-sm) var(--space-lg);
873
- border: var(--border-width) solid var(--color-border);
874
- border-radius: var(--radius-md);
875
- background: var(--color-surface-elevated);
876
- color: var(--color-text-primary);
877
- font-size: var(--font-size-sm);
878
- font-weight: var(--font-weight-medium);
879
- cursor: pointer;
880
- transition: all var(--transition-fast);
881
- position: relative;
882
- overflow: hidden;
883
- }
884
-
885
- .jux-button::before {
886
- content: '';
887
- position: absolute;
888
- top: 50%;
889
- left: 50%;
890
- width: 0;
891
- height: 0;
892
- border-radius: var(--radius-full);
893
- background: rgba(255, 255, 255, 0.1);
894
- transform: translate(-50%, -50%);
895
- transition: width var(--transition-slow), height var(--transition-slow);
896
- }
897
-
898
- .jux-button:hover {
899
- background: var(--color-surface-hover);
900
- border-color: var(--color-border-hover);
901
- transform: translateY(-1px);
902
- box-shadow: var(--shadow-sm);
903
- }
904
-
905
- .jux-button:hover::before {
906
- width: 300px;
907
- height: 300px;
908
- }
909
-
910
- .jux-button-primary {
911
- background: var(--color-brand);
912
- color: var(--color-text-inverse);
913
- border-color: var(--color-brand);
914
- }
915
-
916
- .jux-button-primary:hover {
917
- background: var(--color-brand-hover);
918
- border-color: var(--color-brand-hover);
919
- box-shadow: var(--shadow-md), var(--shadow-glow);
920
- transform: translateY(-2px);
921
- }
922
-
923
- .jux-button:active {
924
- transform: translateY(0);
925
- }
926
-
927
- .jux-button:disabled {
928
- opacity: 0.5;
929
- cursor: not-allowed;
930
- transform: none;
931
- }
932
-
933
- /* Table Component */
934
- .jux-table {
935
- width: 100%;
936
- border-collapse: collapse;
937
- font-size: var(--font-size-sm);
938
- }
939
-
940
- .jux-table thead {
941
- background: var(--color-surface-base);
942
- border-bottom: 2px solid var(--color-border);
943
- }
944
-
945
- .jux-table th {
946
- padding: var(--space-md) var(--space-lg);
947
- text-align: left;
948
- font-weight: var(--font-weight-semibold);
949
- color: var(--color-text-primary);
950
- font-size: var(--font-size-xs);
951
- text-transform: uppercase;
952
- letter-spacing: 0.05em;
953
- border-bottom: var(--border-width) solid var(--color-border);
954
- }
955
-
956
- .jux-table td {
957
- padding: var(--space-md) var(--space-lg);
958
- color: var(--color-text-primary);
959
- border-bottom: var(--border-width) solid var(--color-border);
960
- }
961
-
962
- .jux-table tbody tr {
963
- transition: background-color var(--transition-fast);
964
- }
965
-
966
- .jux-table tbody tr:hover {
967
- background: var(--color-surface-hover);
968
- }
969
-
970
- .jux-table tbody tr:last-child td {
971
- border-bottom: none;
972
- }
973
-
974
- /* Alternating row colors for better readability */
975
- .jux-table tbody tr:nth-child(even) {
976
- background: var(--color-surface-base);
977
- }
978
-
979
- .jux-table tbody tr:nth-child(even):hover {
980
- background: var(--color-surface-hover);
981
- }
982
-
983
- /* Input Component */
984
- .jux-input {
985
- margin-bottom: var(--space-lg);
986
- position: relative;
987
- }
988
-
989
- .jux-input-label {
990
- display: block;
991
- margin-bottom: var(--space-sm);
992
- font-weight: var(--font-weight-medium);
993
- color: var(--color-text-primary);
994
- font-size: var(--font-size-sm);
995
- }
996
-
997
- .jux-input-required {
998
- color: var(--color-error);
999
- }
1000
-
1001
- .jux-input-element {
1002
- width: 100%;
1003
- padding: var(--space-md) var(--space-lg);
1004
- border: var(--border-width) solid var(--color-border);
1005
- border-radius: var(--radius-md);
1006
- font-size: var(--font-size-base);
1007
- background: var(--color-surface-elevated);
1008
- color: var(--color-text-primary);
1009
- transition: all var(--transition-fast);
1010
- box-sizing: border-box;
1011
- font-family: var(--font-family-base);
1012
- }
1013
-
1014
- .jux-input-element:hover {
1015
- border-color: var(--color-border-hover);
1016
- }
1017
-
1018
- .jux-input-element:focus {
1019
- outline: none;
1020
- border-color: var(--color-border-focus);
1021
- box-shadow: 0 0 0 3px var(--color-brand-subtle);
1022
- }
1023
-
1024
- .jux-input-element:disabled {
1025
- background-color: var(--color-surface-hover);
1026
- cursor: not-allowed;
1027
- opacity: 0.6;
1028
- }
1029
-
1030
- .jux-input-element.jux-input-invalid {
1031
- border-color: var(--color-error);
1032
- }
1033
-
1034
- .jux-input-element.jux-input-invalid:focus {
1035
- box-shadow: 0 0 0 3px rgba(239, 68, 68, 0.1);
1036
- }
1037
-
1038
- .jux-input-element::placeholder {
1039
- color: var(--color-text-tertiary);
1040
- }
1041
-
1042
- .jux-input-error {
1043
- color: var(--color-error);
1044
- font-size: var(--font-size-xs);
1045
- margin-top: var(--space-xs);
1046
- }
1047
-
1048
- .jux-input-counter {
1049
- text-align: right;
1050
- font-size: var(--font-size-xs);
1051
- color: var(--color-text-secondary);
1052
- margin-top: var(--space-xs);
1053
- }
1054
-
1055
- .jux-input-icon {
1056
- position: absolute;
1057
- left: var(--space-lg);
1058
- top: 50%;
1059
- transform: translateY(-50%);
1060
- color: var(--color-text-tertiary);
1061
- pointer-events: none;
1062
- font-size: var(--font-size-lg);
1063
- z-index: 1;
1064
- }
1065
-
1066
- .jux-input-container.jux-input-with-icon .jux-input-element {
1067
- padding-left: calc(var(--space-lg) * 2 + var(--font-size-lg));
1068
- }
1069
-
1070
- .jux-input-container:not(.jux-input-with-icon) .jux-input-element {
1071
- padding-left: var(--space-lg);
1072
- }
1073
-
1074
- /* File Upload Component */
1075
- .jux-fileupload {
1076
- margin: var(--space-xl);
1077
- display: flex;
1078
- flex-direction: column;
1079
- gap: var(--space-sm);
1080
- min-width: 200px;
1081
- flex: 1;
1082
- align-items: center;
1083
- }
1084
-
1085
- .jux-fileupload-label {
1086
- display: block;
1087
- font-size: var(--font-size-xs);
1088
- font-weight: var(--font-weight-semibold);
1089
- color: var(--color-text-tertiary);
1090
- text-transform: uppercase;
1091
- letter-spacing: 0.05em;
1092
- margin-bottom: 2px;
1093
- width: fit-content;
1094
- text-align: center;
1095
- white-space: nowrap;
1096
- }
1097
-
1098
- .jux-fileupload-input {
1099
- display: none;
1100
- }
1101
-
1102
- .jux-fileupload-button {
1103
- display: flex;
1104
- flex-direction: column;
1105
- align-items: center;
1106
- justify-content: center;
1107
- gap: var(--space-lg);
1108
- padding: var(--space-2xl) var(--space-lg);
1109
- background: var(--color-surface-elevated);
1110
- border: 2px dashed var(--color-border);
1111
- border-radius: var(--radius-xl);
1112
- color: var(--color-text-secondary);
1113
- font-family: inherit;
1114
- font-size: var(--font-size-sm);
1115
- cursor: pointer;
1116
- transition: all var(--transition-base);
1117
- position: relative;
1118
- overflow: wrap;
1119
- width: 100%;
1120
- }
1121
-
1122
- .jux-fileupload-icon {
1123
- font-size: 2rem;
1124
- line-height: 1;
1125
- opacity: 0.6;
1126
- transition: opacity var(--transition-fast), transform var(--transition-bounce);
1127
- }
1128
-
1129
- .jux-fileupload-button:hover .jux-fileupload-icon {
1130
- opacity: 1;
1131
- transform: translateY(-4px);
1132
- }
1133
-
1134
- .jux-fileupload-text {
1135
- font-weight: var(--font-weight-medium);
1136
- margin-top: var(--space-xs);
1137
- }
1138
-
1139
- .jux-fileupload-button:hover:not(:disabled) {
1140
- background: var(--color-surface-hover);
1141
- border-color: var(--color-brand);
1142
- color: var(--color-brand);
1143
- box-shadow: var(--shadow-md);
1144
- }
1145
-
1146
- .jux-fileupload-button:active:not(:disabled) {
1147
- transform: scale(0.98);
1148
- }
1149
-
1150
- .jux-fileupload-button:disabled {
1151
- opacity: 0.5;
1152
- cursor: not-allowed;
1153
- background: var(--color-surface-base);
1154
- }
1155
-
1156
- .jux-fileupload-list {
1157
- display: flex;
1158
- flex-direction: column;
1159
- gap: var(--space-xs);
1160
- margin-top: var(--space-xs);
1161
- color: var(--color-text-tertiary);
1162
- font-style: italic;
1163
- font-size: var(--font-size-xs);
1164
- }
1165
-
1166
- .jux-fileupload-item {
1167
- display: flex;
1168
- align-items: center;
1169
- gap: var(--space-md);
1170
- padding: var(--space-sm) var(--space-md);
1171
- background: var(--color-surface-base);
1172
- border: var(--border-width) solid var(--color-border);
1173
- border-radius: var(--radius-md);
1174
- color: var(--color-text-primary);
1175
- font-size: var(--font-size-sm);
1176
- font-style: normal;
1177
- animation: slideIn var(--transition-base) ease-out;
1178
- transition: all var(--transition-fast);
1179
- }
1180
-
1181
- .jux-fileupload-item:hover {
1182
- background: var(--color-surface-hover);
1183
- border-color: var(--color-border-hover);
1184
- transform: translateX(2px);
1185
- box-shadow: var(--shadow-xs);
1186
- }
1187
-
1188
- .jux-fileupload-item::before {
1189
- content: '📄';
1190
- font-size: 1.1rem;
1191
- filter: saturate(0.5);
1192
- }
1193
-
1194
- /* Progress Component */
1195
- .jux-progress {
1196
- margin-bottom: var(--space-lg);
1197
- }
1198
-
1199
- .jux-progress-label {
1200
- margin-bottom: var(--space-sm);
1201
- font-size: var(--font-size-sm);
1202
- color: var(--color-text-secondary);
1203
- font-weight: var(--font-weight-medium);
1204
- }
1205
-
1206
- .jux-progress-track {
1207
- width: 100%;
1208
- height: 8px;
1209
- background: var(--color-surface-base);
1210
- border-radius: var(--radius-full);
1211
- overflow: hidden;
1212
- position: relative;
1213
- }
1214
-
1215
- .jux-progress-bar {
1216
- height: 100%;
1217
- background: var(--color-brand);
1218
- border-radius: var(--radius-full);
1219
- transition: width var(--transition-slow);
1220
- position: relative;
1221
- }
1222
-
1223
- .jux-progress-bar-default {
1224
- background: var(--color-brand);
1225
- }
1226
-
1227
- .jux-progress-bar-success {
1228
- background: var(--color-success);
1229
- }
1230
-
1231
- .jux-progress-bar-warning {
1232
- background: var(--color-warning);
1233
- }
1234
-
1235
- .jux-progress-bar-error {
1236
- background: var(--color-danger);
1237
- }
1238
-
1239
- .jux-progress-bar-info {
1240
- background: var(--color-info);
1241
- }
1242
-
1243
- .jux-progress-bar-striped {
1244
- background-image: linear-gradient(
1245
- 45deg,
1246
- rgba(255, 255, 255, 0.15) 25%,
1247
- transparent 25%,
1248
- transparent 50%,
1249
- rgba(255, 255, 255, 0.15) 50%,
1250
- rgba(255, 255, 255, 0.15) 75%,
1251
- transparent 75%,
1252
- transparent
1253
- );
1254
- background-size: 1rem 1rem;
1255
- }
1256
-
1257
- .jux-progress-bar-animated {
1258
- animation: progress-stripes 1s linear infinite;
1259
- }
1260
-
1261
- @keyframes progress-stripes {
1262
- 0% { background-position: 1rem 0; }
1263
- 100% { background-position: 0 0; }
1264
- }
1265
-
1266
- /* Progress size variants */
1267
- .jux-progress-sm .jux-progress-track {
1268
- height: 4px;
1269
- }
1270
-
1271
- .jux-progress-md .jux-progress-track {
1272
- height: 8px;
1273
- }
1274
-
1275
- .jux-progress-lg .jux-progress-track {
1276
- height: 12px;
1277
- }
1278
-
1279
- /* Alert Component */
1280
- .jux-alert {
1281
- display: flex;
1282
- align-items: flex-start;
1283
- gap: var(--space-md);
1284
- padding: var(--space-lg);
1285
- border-radius: var(--radius-lg);
1286
- border: var(--border-width) solid;
1287
- font-size: var(--font-size-sm);
1288
- line-height: var(--line-height-normal);
1289
- animation: alertSlideIn var(--transition-base) ease-out;
1290
- transition: all var(--transition-fast);
1291
- box-shadow: var(--shadow-lg);
1292
- width: 100%;
1293
- position: relative;
1294
- z-index: 1000;
1295
- transform-origin: top center;
1296
- margin-bottom: 0;
1297
- }
1298
-
1299
- /* Alert Stack Effect (Scoped to .jux-alert-stack container) */
1300
- .jux-alert-stack {
1301
- position: relative;
1302
- min-height: 80px;
1303
- display: flex;
1304
- flex-direction: column-reverse; /* Keep newest at bottom of DOM but appearing correctly */
1305
- }
1306
-
1307
- /* Base stack state: Hidden for all */
1308
- .jux-alert-stack .jux-alert {
1309
- display: none !important;
1310
- transition: all var(--transition-bounce), opacity var(--transition-base);
1311
- margin-bottom: 0;
1312
- transform-origin: top center;
1313
- }
1314
-
1315
- /* Top Visible Alert: The one with no UN-HIDDEN siblings after it in the DOM */
1316
- .jux-alert-stack .jux-alert:not([style*="display: none"]):not(:has(~ .jux-alert:not([style*="display: none"]))) {
1317
- display: flex !important;
1318
- position: relative;
1319
- z-index: 20;
1320
- opacity: 1;
1321
- transform: translateY(0) scale(1);
1322
- }
1323
-
1324
- /* Second Visible Alert: The one with exactly one UN-HIDDEN sibling after it */
1325
- .jux-alert-stack .jux-alert:not([style*="display: none"]):has(~ .jux-alert:not([style*="display: none"])):not(:has(~ .jux-alert:not([style*="display: none"]) ~ .jux-alert:not([style*="display: none"]))) {
1326
- display: flex !important;
1327
- position: absolute;
1328
- top: 0;
1329
- left: 0;
1330
- right: 0;
1331
- z-index: 10;
1332
- opacity: 0.5;
1333
- transform: translateY(var(--space-sm)) scale(0.98);
1334
- pointer-events: none;
1335
- }
1336
-
1337
- .jux-alert-close {
1338
- flex-shrink: 0;
1339
- background: none;
1340
- border: none;
1341
- color: inherit;
1342
- font-size: var(--font-size-2xl);
1343
- line-height: 1;
1344
- cursor: pointer;
1345
- padding: 0;
1346
- width: 24px;
1347
- height: 24px;
1348
- display: flex;
1349
- align-items: center;
1350
- justify-content: center;
1351
- border-radius: var(--radius-sm);
1352
- transition: all var(--transition-fast);
1353
- opacity: 0.6;
1354
- }
1355
-
1356
-
1357
- /* Alert Type Variants */
1358
- .jux-alert-info {
1359
- background: var(--color-surface-elevated);
1360
- border-color: currentColor;
1361
- color: var(--color-info);
1362
- }
1363
-
1364
- .jux-alert-success {
1365
- background: var(--color-surface-elevated);
1366
- border-color: currentColor;
1367
- color: var(--color-success);
1368
- }
1369
-
1370
- .jux-alert-warning {
1371
- background: var(--color-surface-elevated);
1372
- border-color: currentColor;
1373
- color: var(--color-warning);
1374
- }
1375
-
1376
- .jux-alert-error {
1377
- background: var(--color-surface-elevated);
1378
- border-color: currentColor;
1379
- color: var(--color-danger);
1380
- }