juxscript 1.0.64 → 1.0.65

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.
@@ -0,0 +1,1952 @@
1
+ /**
2
+ * Default Preset - Grid Layout System
3
+ * Comprehensive component styling
4
+ */
5
+
6
+ /* ============================================
7
+ CSS VARIABLES
8
+ ============================================ */
9
+ :root {
10
+ /* Typography */
11
+ --font-family-base: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
12
+ --font-family-mono: 'SF Mono', Monaco, Menlo, 'Courier New', monospace;
13
+
14
+ /* Spacing */
15
+ --space-xs: 0.25rem;
16
+ --space-sm: 0.5rem;
17
+ --space-md: 0.75rem;
18
+ --space-lg: 1rem;
19
+ --space-xl: 1.5rem;
20
+ --space-2xl: 2rem;
21
+ --space-3xl: 3rem;
22
+
23
+ /* Colors - Light Theme */
24
+ --color-text-primary: #111111;
25
+ --color-text-secondary: #65676b;
26
+ --color-text-tertiary: #8b8d94;
27
+
28
+ --color-background: #ffffff;
29
+ --color-surface-base: #f7f7f7;
30
+ --color-surface-elevated: #ffffff;
31
+ --color-surface-hover: #f1f1f1;
32
+ --color-surface-active: #e8e8e8;
33
+
34
+ --color-border: #e8e8e8;
35
+ --color-border-hover: #d1d1d1;
36
+
37
+ --color-brand: #0ea5e9;
38
+ --color-brand-hover: #0284c7;
39
+
40
+ /* Borders & Radius */
41
+ --border-width: 1px;
42
+ --radius-sm: 3px;
43
+ --radius-md: 6px;
44
+ --radius-lg: 8px;
45
+ --radius-full: 9999px;
46
+
47
+ /* Transitions */
48
+ --transition-base: 150ms ease;
49
+ --transition-fast: 100ms ease;
50
+ }
51
+
52
+ /* ============================================
53
+ GLOBAL RESET
54
+ ============================================ */
55
+ * {
56
+ margin: 0;
57
+ padding: 0;
58
+ box-sizing: border-box;
59
+ }
60
+
61
+ body {
62
+ font-family: var(--font-family-base);
63
+ color: var(--color-text-primary);
64
+ background: var(--color-background);
65
+ -webkit-font-smoothing: antialiased;
66
+ font-size: 14px;
67
+ line-height: 1.5;
68
+ }
69
+
70
+ /* ============================================
71
+ GRID LAYOUT
72
+ ============================================ */
73
+ #app {
74
+ display: grid;
75
+ grid-template-columns: auto 1fr;
76
+ grid-template-rows: auto 1fr auto;
77
+ grid-template-areas:
78
+ "header header"
79
+ "sidebar main"
80
+ "footer footer";
81
+ width: 100vw;
82
+ height: 100vh;
83
+ overflow: hidden;
84
+ }
85
+
86
+ /* ============================================
87
+ HEADER
88
+ ============================================ */
89
+ #appheader {
90
+ grid-area: header;
91
+ background: var(--color-surface-elevated);
92
+ border-bottom: var(--border-width) solid var(--color-border);
93
+ display: flex;
94
+ align-items: center;
95
+ padding: 0 var(--space-2xl);
96
+ height: 48px;
97
+ z-index: 100;
98
+ }
99
+
100
+ #appheader-content {
101
+ display: flex;
102
+ align-items: center;
103
+ justify-content: space-between;
104
+ width: 100%;
105
+ gap: var(--space-xl);
106
+ }
107
+
108
+ #appheader-logo {
109
+ display: flex;
110
+ align-items: center;
111
+ gap: var(--space-md);
112
+ font-weight: 600;
113
+ cursor: pointer;
114
+ }
115
+
116
+ #appheader-logo h1 {
117
+ font-size: 1.125rem;
118
+ font-weight: 700;
119
+ margin: 0;
120
+ line-height: 1;
121
+ letter-spacing: -0.02em;
122
+ }
123
+
124
+ #appheader-nav {
125
+ flex: 1;
126
+ display: flex;
127
+ align-items: center;
128
+ gap: var(--space-sm);
129
+ }
130
+
131
+ #appheader-actions {
132
+ display: flex;
133
+ align-items: center;
134
+ gap: var(--space-sm);
135
+ }
136
+
137
+ /* ============================================
138
+ SIDEBAR
139
+ ============================================ */
140
+ #appaside {
141
+ grid-area: sidebar;
142
+ width: 240px;
143
+ background: var(--color-surface-base);
144
+ border-right: var(--border-width) solid var(--color-border);
145
+ overflow-y: auto;
146
+ padding: var(--space-lg);
147
+ }
148
+
149
+ /* ============================================
150
+ MAIN CONTENT
151
+ ============================================ */
152
+ #appmain {
153
+ grid-area: main;
154
+ background: var(--color-background);
155
+ overflow-y: auto;
156
+ overflow-x: hidden;
157
+ }
158
+
159
+ #appmain-content {
160
+ max-width: 900px;
161
+ margin: 0 auto;
162
+ padding: var(--space-3xl) var(--space-2xl);
163
+ }
164
+
165
+ /* ============================================
166
+ FOOTER
167
+ ============================================ */
168
+ #appfooter {
169
+ grid-area: footer;
170
+ background: var(--color-surface-elevated);
171
+ border-top: var(--border-width) solid var(--color-border);
172
+ padding: var(--space-md) var(--space-2xl);
173
+ font-size: 0.8125rem;
174
+ color: var(--color-text-tertiary);
175
+ min-height: 40px;
176
+ display: flex;
177
+ align-items: center;
178
+ }
179
+
180
+ #appfooter-content {
181
+ display: flex;
182
+ align-items: center;
183
+ gap: var(--space-lg);
184
+ }
185
+
186
+ /* ============================================
187
+ TYPOGRAPHY
188
+ ============================================ */
189
+ h1, h2, h3, h4, h5, h6 {
190
+ font-weight: 600;
191
+ line-height: 1.3;
192
+ color: var(--color-text-primary);
193
+ margin: 0;
194
+ }
195
+
196
+ h1 { font-size: 2rem; }
197
+ h2 { font-size: 1.5rem; }
198
+ h3 { font-size: 1.125rem; margin-bottom: var(--space-md); }
199
+ h4 { font-size: 1rem; }
200
+ h5 { font-size: 0.875rem; }
201
+ h6 { font-size: 0.75rem; }
202
+
203
+ p {
204
+ line-height: 1.6;
205
+ color: var(--color-text-secondary);
206
+ margin: 0;
207
+ }
208
+
209
+ /* ============================================
210
+ HEADINGS
211
+ ============================================ */
212
+ .jux-heading {
213
+ font-weight: 600;
214
+ line-height: 1.3;
215
+ color: var(--color-text-primary);
216
+ margin: 0 0 var(--space-md) 0;
217
+ }
218
+
219
+ .jux-heading-1 { font-size: 2rem; }
220
+ .jux-heading-2 { font-size: 1.5rem; }
221
+ .jux-heading-3 { font-size: 1.125rem; font-weight: 700; }
222
+ .jux-heading-4 { font-size: 1rem; }
223
+ .jux-heading-5 { font-size: 0.875rem; }
224
+ .jux-heading-6 { font-size: 0.75rem; }
225
+
226
+ /* ============================================
227
+ HERO COMPONENT
228
+ ============================================ */
229
+ .jux-hero {
230
+ padding: var(--space-3xl) 0;
231
+ margin-bottom: var(--space-2xl);
232
+ }
233
+
234
+ .jux-hero-centered {
235
+ text-align: center;
236
+ }
237
+
238
+ .jux-hero-content {
239
+ display: flex;
240
+ flex-direction: column;
241
+ gap: var(--space-lg);
242
+ }
243
+
244
+ .jux-hero-centered .jux-hero-content {
245
+ align-items: center;
246
+ }
247
+
248
+ .jux-hero-title {
249
+ font-size: 2.5rem;
250
+ font-weight: 700;
251
+ line-height: 1.2;
252
+ margin: 0;
253
+ letter-spacing: -0.02em;
254
+ color: var(--color-text-primary);
255
+ }
256
+
257
+ .jux-hero-subtitle {
258
+ font-size: 1.25rem;
259
+ line-height: 1.6;
260
+ color: var(--color-text-secondary);
261
+ margin: 0;
262
+ }
263
+
264
+ .jux-hero-body {
265
+ font-size: 1rem;
266
+ line-height: 1.6;
267
+ color: var(--color-text-secondary);
268
+ max-width: 600px;
269
+ }
270
+
271
+ .jux-hero-cta {
272
+ display: inline-flex;
273
+ align-items: center;
274
+ justify-content: center;
275
+ padding: var(--space-md) var(--space-2xl);
276
+ font-size: 1rem;
277
+ font-weight: 600;
278
+ color: white;
279
+ background: var(--color-brand);
280
+ border-radius: var(--radius-md);
281
+ text-decoration: none;
282
+ transition: background-color var(--transition-base);
283
+ }
284
+
285
+ .jux-hero-cta:hover {
286
+ background: var(--color-brand-hover);
287
+ }
288
+
289
+ /* ============================================
290
+ ALERT COMPONENT
291
+ ============================================ */
292
+ .jux-alert {
293
+ display: flex;
294
+ align-items: flex-start;
295
+ gap: var(--space-md);
296
+ padding: var(--space-lg);
297
+ border-radius: var(--radius-lg);
298
+ margin-bottom: var(--space-lg);
299
+ position: relative;
300
+ animation: slideIn 0.3s ease-out;
301
+ }
302
+
303
+ @keyframes slideIn {
304
+ from {
305
+ opacity: 0;
306
+ transform: translateY(-10px);
307
+ }
308
+ to {
309
+ opacity: 1;
310
+ transform: translateY(0);
311
+ }
312
+ }
313
+
314
+ .jux-alert-info {
315
+ background: #dbeafe;
316
+ border-left: 4px solid #3b82f6;
317
+ color: #1e40af;
318
+ }
319
+
320
+ .jux-alert-success {
321
+ background: #d1fae5;
322
+ border-left: 4px solid #10b981;
323
+ color: #065f46;
324
+ }
325
+
326
+ .jux-alert-warning {
327
+ background: #fef3c7;
328
+ border-left: 4px solid #f59e0b;
329
+ color: #92400e;
330
+ }
331
+
332
+ .jux-alert-error {
333
+ background: #fee2e2;
334
+ border-left: 4px solid #ef4444;
335
+ color: #991b1b;
336
+ }
337
+
338
+ .jux-alert-content {
339
+ flex: 1;
340
+ font-size: 0.875rem;
341
+ line-height: 1.5;
342
+ }
343
+
344
+ .jux-alert-close {
345
+ flex-shrink: 0;
346
+ background: transparent;
347
+ border: none;
348
+ font-size: 1.25rem;
349
+ cursor: pointer;
350
+ opacity: 0.5;
351
+ transition: opacity var(--transition-base);
352
+ padding: 0;
353
+ width: 20px;
354
+ height: 20px;
355
+ display: flex;
356
+ align-items: center;
357
+ justify-content: center;
358
+ color: inherit;
359
+ }
360
+
361
+ .jux-alert-close:hover {
362
+ opacity: 1;
363
+ }
364
+
365
+ /* ============================================
366
+ BADGE COMPONENT
367
+ ============================================ */
368
+ .jux-badge {
369
+ display: inline-flex;
370
+ align-items: center;
371
+ padding: var(--space-xs) var(--space-md);
372
+ font-size: 0.75rem;
373
+ font-weight: 600;
374
+ line-height: 1;
375
+ text-align: center;
376
+ white-space: nowrap;
377
+ border-radius: var(--radius-sm);
378
+ transition: all var(--transition-base);
379
+ }
380
+
381
+ .jux-badge-default {
382
+ color: #374151;
383
+ background-color: #e5e7eb;
384
+ }
385
+
386
+ .jux-badge-success {
387
+ color: #065f46;
388
+ background-color: #d1fae5;
389
+ }
390
+
391
+ .jux-badge-warning {
392
+ color: #92400e;
393
+ background-color: #fef3c7;
394
+ }
395
+
396
+ .jux-badge-error {
397
+ color: #991b1b;
398
+ background-color: #fee2e2;
399
+ }
400
+
401
+ .jux-badge-info {
402
+ color: #1e40af;
403
+ background-color: #dbeafe;
404
+ }
405
+
406
+ /* ============================================
407
+ BUTTON COMPONENT
408
+ ============================================ */
409
+ .jux-button {
410
+ display: inline-flex;
411
+ align-items: center;
412
+ justify-content: center;
413
+ padding: 0 var(--space-xl);
414
+ height: 36px;
415
+ font-size: 0.875rem;
416
+ font-weight: 500;
417
+ font-family: var(--font-family-base);
418
+ color: white;
419
+ background: var(--color-brand);
420
+ border: none;
421
+ border-radius: var(--radius-md);
422
+ cursor: pointer;
423
+ transition: background-color var(--transition-base), transform var(--transition-fast);
424
+ user-select: none;
425
+ white-space: nowrap;
426
+ }
427
+
428
+ .jux-button:hover {
429
+ background: var(--color-brand-hover);
430
+ }
431
+
432
+ .jux-button:active {
433
+ transform: scale(0.98);
434
+ }
435
+
436
+ .jux-button:disabled {
437
+ opacity: 0.5;
438
+ cursor: not-allowed;
439
+ }
440
+
441
+ .jux-button-primary {
442
+ background: var(--color-brand);
443
+ }
444
+
445
+ .jux-button-primary:hover {
446
+ background: var(--color-brand-hover);
447
+ }
448
+
449
+ .jux-button-secondary {
450
+ background: var(--color-surface-hover);
451
+ color: var(--color-text-primary);
452
+ border: var(--border-width) solid var(--color-border);
453
+ }
454
+
455
+ .jux-button-secondary:hover {
456
+ background: var(--color-surface-active);
457
+ }
458
+
459
+ .jux-button-small {
460
+ height: 28px;
461
+ padding: 0 var(--space-md);
462
+ font-size: 0.8125rem;
463
+ }
464
+
465
+ .jux-button-medium {
466
+ height: 36px;
467
+ }
468
+
469
+ .jux-button-large {
470
+ height: 44px;
471
+ padding: 0 var(--space-2xl);
472
+ font-size: 1rem;
473
+ }
474
+
475
+ /* ============================================
476
+ CARD COMPONENT
477
+ ============================================ */
478
+ .jux-card {
479
+ background: var(--color-surface-elevated);
480
+ border: var(--border-width) solid var(--color-border);
481
+ border-radius: var(--radius-lg);
482
+ overflow: hidden;
483
+ margin-bottom: var(--space-lg);
484
+ }
485
+
486
+ .jux-card-default {
487
+ /* Base card styles */
488
+ }
489
+
490
+ .jux-card-header {
491
+ padding: var(--space-lg) var(--space-xl);
492
+ border-bottom: var(--border-width) solid var(--color-border);
493
+ background: var(--color-surface-base);
494
+ }
495
+
496
+ .jux-card-title {
497
+ font-size: 1.125rem;
498
+ font-weight: 600;
499
+ color: var(--color-text-primary);
500
+ margin: 0;
501
+ }
502
+
503
+ .jux-card-body {
504
+ padding: var(--space-xl);
505
+ color: var(--color-text-secondary);
506
+ line-height: 1.6;
507
+ }
508
+
509
+ .jux-card-footer {
510
+ padding: var(--space-lg) var(--space-xl);
511
+ border-top: var(--border-width) solid var(--color-border);
512
+ background: var(--color-surface-base);
513
+ font-size: 0.875rem;
514
+ color: var(--color-text-tertiary);
515
+ }
516
+
517
+ /* ============================================
518
+ CHECKBOX COMPONENT
519
+ ============================================ */
520
+ .jux-checkbox {
521
+ margin-bottom: var(--space-md);
522
+ }
523
+
524
+ .jux-checkbox-container {
525
+ display: inline-flex;
526
+ align-items: center;
527
+ gap: var(--space-md);
528
+ cursor: pointer;
529
+ user-select: none;
530
+ }
531
+
532
+ .jux-checkbox-input {
533
+ position: absolute;
534
+ opacity: 0;
535
+ width: 0;
536
+ height: 0;
537
+ }
538
+
539
+ .jux-checkbox-checkmark {
540
+ width: 20px;
541
+ height: 20px;
542
+ border: 2px solid var(--color-border);
543
+ border-radius: var(--radius-sm);
544
+ display: flex;
545
+ align-items: center;
546
+ justify-content: center;
547
+ transition: all var(--transition-base);
548
+ background: var(--color-surface-elevated);
549
+ }
550
+
551
+ .jux-checkbox-input:checked + .jux-checkbox-checkmark {
552
+ background: var(--color-brand);
553
+ border-color: var(--color-brand);
554
+ }
555
+
556
+ .jux-checkbox-checkmark svg {
557
+ width: 14px;
558
+ height: 14px;
559
+ fill: none;
560
+ stroke: white;
561
+ stroke-width: 2;
562
+ opacity: 0;
563
+ transition: opacity var(--transition-base);
564
+ }
565
+
566
+ .jux-checkbox-input:checked + .jux-checkbox-checkmark svg {
567
+ opacity: 1;
568
+ }
569
+
570
+ .jux-checkbox-label-text {
571
+ font-size: 0.875rem;
572
+ color: var(--color-text-primary);
573
+ }
574
+
575
+ .jux-input-error {
576
+ color: #ef4444;
577
+ font-size: 0.75rem;
578
+ margin-top: var(--space-xs);
579
+ }
580
+
581
+ /* ============================================
582
+ CODE COMPONENT
583
+ ============================================ */
584
+ .jux-code {
585
+ background: #1e1e1e;
586
+ border: var(--border-width) solid #2d2d2d;
587
+ border-radius: var(--radius-lg);
588
+ padding: var(--space-lg);
589
+ margin: var(--space-xl) 0;
590
+ overflow-x: auto;
591
+ }
592
+
593
+ .jux-code pre {
594
+ margin: 0;
595
+ font-family: var(--font-family-mono);
596
+ font-size: 0.8125rem;
597
+ line-height: 1.6;
598
+ }
599
+
600
+ .jux-code code {
601
+ color: #d4d4d4;
602
+ font-family: inherit;
603
+ }
604
+
605
+ /* ============================================
606
+ CONTAINER COMPONENT
607
+ ============================================ */
608
+ .jux-container {
609
+ display: block;
610
+ }
611
+
612
+ /* ============================================
613
+ DATEPICKER COMPONENT
614
+ ============================================ */
615
+ .jux-datepicker {
616
+ position: relative;
617
+ }
618
+
619
+ .jux-datepicker-container {
620
+ position: relative;
621
+ }
622
+
623
+ .jux-datepicker-input {
624
+ padding-left: var(--space-3xl);
625
+ }
626
+
627
+ /* ============================================
628
+ DIVIDER COMPONENT
629
+ ============================================ */
630
+ .jux-divider {
631
+ border: none;
632
+ margin: var(--space-2xl) 0;
633
+ }
634
+
635
+ .jux-divider-default {
636
+ border-top: var(--border-width) solid var(--color-border);
637
+ }
638
+
639
+ /* ============================================
640
+ DROPDOWN COMPONENT
641
+ ============================================ */
642
+ .jux-dropdown {
643
+ position: relative;
644
+ display: inline-block;
645
+ }
646
+
647
+ .jux-dropdown-trigger {
648
+ display: inline-flex;
649
+ align-items: center;
650
+ gap: var(--space-sm);
651
+ padding: var(--space-sm) var(--space-lg);
652
+ background: var(--color-surface-elevated);
653
+ border: var(--border-width) solid var(--color-border);
654
+ border-radius: var(--radius-md);
655
+ cursor: pointer;
656
+ font-size: 0.875rem;
657
+ color: var(--color-text-primary);
658
+ transition: background-color var(--transition-base);
659
+ }
660
+
661
+ .jux-dropdown-trigger:hover {
662
+ background: var(--color-surface-hover);
663
+ }
664
+
665
+ .jux-dropdown-menu {
666
+ position: absolute;
667
+ top: 100%;
668
+ margin-top: var(--space-xs);
669
+ background: var(--color-surface-elevated);
670
+ border: var(--border-width) solid var(--color-border);
671
+ border-radius: var(--radius-md);
672
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
673
+ min-width: 200px;
674
+ z-index: 1000;
675
+ display: none;
676
+ }
677
+
678
+ .jux-dropdown-menu.show {
679
+ display: block;
680
+ }
681
+
682
+ .jux-dropdown-bottom-left {
683
+ left: 0;
684
+ }
685
+
686
+ .jux-dropdown-item {
687
+ width: 100%;
688
+ padding: var(--space-md) var(--space-lg);
689
+ background: transparent;
690
+ border: none;
691
+ text-align: left;
692
+ cursor: pointer;
693
+ font-size: 0.875rem;
694
+ color: var(--color-text-primary);
695
+ transition: background-color var(--transition-base);
696
+ display: flex;
697
+ align-items: center;
698
+ gap: var(--space-md);
699
+ }
700
+
701
+ .jux-dropdown-item:hover {
702
+ background: var(--color-surface-hover);
703
+ }
704
+
705
+ /* ============================================
706
+ INPUT COMPONENT
707
+ ============================================ */
708
+ .jux-input {
709
+ margin-bottom: var(--space-lg);
710
+ }
711
+
712
+ .jux-input-label {
713
+ display: block;
714
+ font-size: 0.875rem;
715
+ font-weight: 500;
716
+ color: var(--color-text-primary);
717
+ margin-bottom: var(--space-sm);
718
+ }
719
+
720
+ .jux-input-container {
721
+ position: relative;
722
+ display: flex;
723
+ align-items: center;
724
+ }
725
+
726
+ .jux-input-icon {
727
+ position: absolute;
728
+ left: var(--space-md);
729
+ color: var(--color-text-tertiary);
730
+ display: flex;
731
+ align-items: center;
732
+ pointer-events: none;
733
+ }
734
+
735
+ .jux-input-icon svg {
736
+ width: 18px;
737
+ height: 18px;
738
+ }
739
+
740
+ .jux-input-element {
741
+ width: 100%;
742
+ padding: var(--space-md);
743
+ font-size: 0.875rem;
744
+ color: var(--color-text-primary);
745
+ background: var(--color-surface-elevated);
746
+ border: var(--border-width) solid var(--color-border);
747
+ border-radius: var(--radius-md);
748
+ transition: border-color var(--transition-base), box-shadow var(--transition-base);
749
+ font-family: var(--font-family-base);
750
+ }
751
+
752
+ .jux-input-element:focus {
753
+ outline: none;
754
+ border-color: var(--color-brand);
755
+ box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.1);
756
+ }
757
+
758
+ /* ============================================
759
+ FILE UPLOAD COMPONENT
760
+ ============================================ */
761
+ .jux-fileupload {
762
+ margin-bottom: var(--space-lg);
763
+ }
764
+
765
+ .jux-fileupload-input {
766
+ display: none;
767
+ }
768
+
769
+ .jux-fileupload-button-container {
770
+ display: flex;
771
+ flex-direction: column;
772
+ align-items: center;
773
+ gap: var(--space-md);
774
+ padding: var(--space-3xl);
775
+ border: 2px dashed var(--color-border);
776
+ border-radius: var(--radius-lg);
777
+ cursor: pointer;
778
+ transition: border-color var(--transition-base), background-color var(--transition-base);
779
+ }
780
+
781
+ .jux-fileupload-button-container:hover {
782
+ border-color: var(--color-brand);
783
+ background: var(--color-surface-base);
784
+ }
785
+
786
+ .jux-fileupload-icon svg {
787
+ width: 48px;
788
+ height: 48px;
789
+ color: var(--color-text-tertiary);
790
+ }
791
+
792
+ .jux-fileupload-button {
793
+ padding: var(--space-sm) var(--space-xl);
794
+ background: var(--color-brand);
795
+ color: white;
796
+ border: none;
797
+ border-radius: var(--radius-md);
798
+ cursor: pointer;
799
+ font-size: 0.875rem;
800
+ font-weight: 500;
801
+ transition: background-color var(--transition-base);
802
+ }
803
+
804
+ .jux-fileupload-button:hover {
805
+ background: var(--color-brand-hover);
806
+ }
807
+
808
+ .jux-fileupload-list {
809
+ margin-top: var(--space-lg);
810
+ }
811
+
812
+ /* ============================================
813
+ KPI CARD COMPONENT
814
+ ============================================ */
815
+ .jux-kpicard {
816
+ background: var(--color-surface-elevated);
817
+ border: var(--border-width) solid var(--color-border);
818
+ border-radius: var(--radius-lg);
819
+ padding: var(--space-xl);
820
+ margin-bottom: var(--space-lg);
821
+ }
822
+
823
+ .jux-kpicard-content {
824
+ display: flex;
825
+ flex-direction: column;
826
+ gap: var(--space-sm);
827
+ }
828
+
829
+ .jux-kpicard-title {
830
+ font-size: 0.875rem;
831
+ color: var(--color-text-secondary);
832
+ font-weight: 500;
833
+ }
834
+
835
+ .jux-kpicard-value {
836
+ font-size: 2rem;
837
+ font-weight: 700;
838
+ color: var(--color-text-primary);
839
+ line-height: 1;
840
+ }
841
+
842
+ .jux-kpicard-delta {
843
+ display: flex;
844
+ align-items: center;
845
+ gap: var(--space-xs);
846
+ font-size: 0.875rem;
847
+ font-weight: 500;
848
+ color: #10b981;
849
+ }
850
+
851
+ .jux-kpicard-delta svg {
852
+ width: 16px;
853
+ height: 16px;
854
+ }
855
+
856
+ /* ============================================
857
+ LIST COMPONENT
858
+ ============================================ */
859
+ .jux-list-wrapper {
860
+ border: var(--border-width) solid var(--color-border);
861
+ border-radius: var(--radius-lg);
862
+ overflow: hidden;
863
+ margin-bottom: var(--space-lg);
864
+ }
865
+
866
+ .jux-list {
867
+ list-style: none;
868
+ margin: 0;
869
+ padding: 0;
870
+ }
871
+
872
+ .jux-list-unordered {
873
+ /* Base list styles */
874
+ }
875
+
876
+ .jux-list-item {
877
+ padding: var(--space-lg);
878
+ border-bottom: var(--border-width) solid var(--color-border);
879
+ display: flex;
880
+ align-items: center;
881
+ gap: var(--space-md);
882
+ }
883
+
884
+ .jux-list-item:last-child {
885
+ border-bottom: none;
886
+ }
887
+
888
+ .jux-list-item-hoverable {
889
+ transition: background-color var(--transition-base);
890
+ cursor: pointer;
891
+ }
892
+
893
+ .jux-list-item-hoverable:hover {
894
+ background: var(--color-surface-hover);
895
+ }
896
+
897
+ .jux-list-item-content {
898
+ flex: 1;
899
+ }
900
+
901
+ .jux-list-item-text {
902
+ color: var(--color-text-secondary);
903
+ font-size: 0.875rem;
904
+ line-height: 1.5;
905
+ }
906
+
907
+ .jux-list-item-title {
908
+ font-weight: 600;
909
+ color: var(--color-text-primary);
910
+ margin-bottom: var(--space-xs);
911
+ }
912
+
913
+ /* ============================================
914
+ LOADING COMPONENT
915
+ ============================================ */
916
+ .jux-loading {
917
+ display: flex;
918
+ align-items: center;
919
+ justify-content: center;
920
+ padding: var(--space-xl);
921
+ }
922
+
923
+ .jux-loading-spinner {
924
+ width: 40px;
925
+ height: 40px;
926
+ border: 3px solid var(--color-border);
927
+ border-top-color: var(--color-brand);
928
+ border-radius: 50%;
929
+ animation: spin 0.8s linear infinite;
930
+ }
931
+
932
+ .jux-loading-lg .jux-loading-spinner {
933
+ width: 48px;
934
+ height: 48px;
935
+ border-width: 4px;
936
+ }
937
+
938
+ @keyframes spin {
939
+ to { transform: rotate(360deg); }
940
+ }
941
+
942
+ /* ============================================
943
+ MENU COMPONENT
944
+ ============================================ */
945
+ .jux-menu {
946
+ display: flex;
947
+ gap: var(--space-xs);
948
+ }
949
+
950
+ .jux-menu-vertical {
951
+ flex-direction: column;
952
+ }
953
+
954
+ .jux-menu-item {
955
+ /* Menu item wrapper */
956
+ }
957
+
958
+ .jux-menu-button {
959
+ width: 100%;
960
+ display: flex;
961
+ align-items: center;
962
+ gap: var(--space-md);
963
+ padding: var(--space-md) var(--space-lg);
964
+ background: transparent;
965
+ border: none;
966
+ text-align: left;
967
+ cursor: pointer;
968
+ font-size: 0.875rem;
969
+ color: var(--color-text-primary);
970
+ border-radius: var(--radius-md);
971
+ transition: background-color var(--transition-base);
972
+ }
973
+
974
+ .jux-menu-button:hover {
975
+ background: var(--color-surface-hover);
976
+ }
977
+
978
+ .jux-menu-label {
979
+ flex: 1;
980
+ }
981
+
982
+ /* ============================================
983
+ NAV COMPONENT
984
+ ============================================ */
985
+ .jux-nav {
986
+ display: flex;
987
+ gap: var(--space-sm);
988
+ }
989
+
990
+ .jux-nav-default {
991
+ /* Base nav styles */
992
+ }
993
+
994
+ .jux-nav-items {
995
+ display: flex;
996
+ gap: var(--space-sm);
997
+ align-items: center;
998
+ }
999
+
1000
+ .jux-nav-item-wrapper {
1001
+ /* Nav item wrapper */
1002
+ }
1003
+
1004
+ .jux-nav-link {
1005
+ padding: var(--space-sm) var(--space-lg);
1006
+ color: var(--color-text-primary);
1007
+ text-decoration: none;
1008
+ font-size: 0.875rem;
1009
+ border-radius: var(--radius-md);
1010
+ transition: background-color var(--transition-base), color var(--transition-base);
1011
+ }
1012
+
1013
+ .jux-nav-link:hover {
1014
+ background: var(--color-surface-hover);
1015
+ color: var(--color-brand);
1016
+ }
1017
+
1018
+ /* ============================================
1019
+ PARAGRAPH COMPONENT
1020
+ ============================================ */
1021
+ .jux-paragraph {
1022
+ line-height: 1.6;
1023
+ color: var(--color-text-secondary);
1024
+ margin-bottom: var(--space-lg);
1025
+ font-size: 0.875rem;
1026
+ }
1027
+
1028
+ /* ============================================
1029
+ PROGRESS COMPONENT
1030
+ ============================================ */
1031
+ .jux-progress {
1032
+ margin-bottom: var(--space-lg);
1033
+ }
1034
+
1035
+ .jux-progress-track {
1036
+ width: 100%;
1037
+ height: 8px;
1038
+ background: var(--color-surface-base);
1039
+ border-radius: var(--radius-full);
1040
+ overflow: hidden;
1041
+ }
1042
+
1043
+ .jux-progress-bar {
1044
+ height: 100%;
1045
+ background: var(--color-brand);
1046
+ transition: width 0.3s ease;
1047
+ border-radius: var(--radius-full);
1048
+ }
1049
+
1050
+ .jux-progress-bar-success {
1051
+ background: #10b981;
1052
+ }
1053
+
1054
+ .jux-progress-bar-warning {
1055
+ background: #f59e0b;
1056
+ }
1057
+
1058
+ .jux-progress-bar-error {
1059
+ background: #ef4444;
1060
+ }
1061
+
1062
+ /* ============================================
1063
+ RADIO COMPONENT
1064
+ ============================================ */
1065
+ .jux-radio {
1066
+ margin-bottom: var(--space-lg);
1067
+ }
1068
+
1069
+ .jux-radio-options {
1070
+ display: flex;
1071
+ gap: var(--space-lg);
1072
+ }
1073
+
1074
+ .jux-radio-vertical {
1075
+ flex-direction: column;
1076
+ gap: var(--space-md);
1077
+ }
1078
+
1079
+ .jux-radio-option {
1080
+ display: flex;
1081
+ align-items: center;
1082
+ gap: var(--space-md);
1083
+ cursor: pointer;
1084
+ user-select: none;
1085
+ }
1086
+
1087
+ .jux-radio-input {
1088
+ position: absolute;
1089
+ opacity: 0;
1090
+ width: 0;
1091
+ height: 0;
1092
+ }
1093
+
1094
+ .jux-radio-mark {
1095
+ width: 20px;
1096
+ height: 20px;
1097
+ border: 2px solid var(--color-border);
1098
+ border-radius: 50%;
1099
+ display: flex;
1100
+ align-items: center;
1101
+ justify-content: center;
1102
+ transition: all var(--transition-base);
1103
+ background: var(--color-surface-elevated);
1104
+ }
1105
+
1106
+ .jux-radio-input:checked + .jux-radio-mark {
1107
+ border-color: var(--color-brand);
1108
+ }
1109
+
1110
+ .jux-radio-mark::after {
1111
+ content: '';
1112
+ width: 10px;
1113
+ height: 10px;
1114
+ border-radius: 50%;
1115
+ background: var(--color-brand);
1116
+ opacity: 0;
1117
+ transform: scale(0);
1118
+ transition: all var(--transition-base);
1119
+ }
1120
+
1121
+ .jux-radio-input:checked + .jux-radio-mark::after {
1122
+ opacity: 1;
1123
+ transform: scale(1);
1124
+ }
1125
+
1126
+ .jux-radio-label-text {
1127
+ font-size: 0.875rem;
1128
+ color: var(--color-text-primary);
1129
+ }
1130
+
1131
+ /* ============================================
1132
+ SELECT COMPONENT
1133
+ ============================================ */
1134
+ .jux-select {
1135
+ margin-bottom: var(--space-lg);
1136
+ }
1137
+
1138
+ .jux-select-container {
1139
+ position: relative;
1140
+ }
1141
+
1142
+ .jux-select-element {
1143
+ width: 100%;
1144
+ padding: var(--space-md);
1145
+ font-size: 0.875rem;
1146
+ color: var(--color-text-primary);
1147
+ background: var(--color-surface-elevated);
1148
+ border: var(--border-width) solid var(--color-border);
1149
+ border-radius: var(--radius-md);
1150
+ cursor: pointer;
1151
+ appearance: none;
1152
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' fill='none' viewBox='0 0 24 24' stroke='%23666'%3E%3Cpath stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='M19 9l-7 7-7-7'%3E%3C/path%3E%3C/svg%3E");
1153
+ background-repeat: no-repeat;
1154
+ background-position: right var(--space-md) center;
1155
+ background-size: 20px;
1156
+ padding-right: var(--space-3xl);
1157
+ }
1158
+
1159
+ .jux-select-element:focus {
1160
+ outline: none;
1161
+ border-color: var(--color-brand);
1162
+ box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.1);
1163
+ }
1164
+
1165
+ /* ============================================
1166
+ SIDEBAR COMPONENT
1167
+ ============================================ */
1168
+ .jux-sidebar {
1169
+ position: relative;
1170
+ background: var(--color-surface-base);
1171
+ border: var(--border-width) solid var(--color-border);
1172
+ border-radius: var(--radius-lg);
1173
+ padding: var(--space-lg);
1174
+ margin-bottom: var(--space-lg);
1175
+ }
1176
+
1177
+ .jux-sidebar-left {
1178
+ /* Left-aligned sidebar */
1179
+ }
1180
+
1181
+ .jux-sidebar-toggle {
1182
+ position: absolute;
1183
+ top: var(--space-md);
1184
+ right: var(--space-md);
1185
+ background: transparent;
1186
+ border: none;
1187
+ cursor: pointer;
1188
+ padding: var(--space-xs);
1189
+ color: var(--color-text-secondary);
1190
+ display: flex;
1191
+ align-items: center;
1192
+ justify-content: center;
1193
+ }
1194
+
1195
+ /* ============================================
1196
+ SWITCH COMPONENT
1197
+ ============================================ */
1198
+ .jux-switch {
1199
+ margin-bottom: var(--space-lg);
1200
+ }
1201
+
1202
+ .jux-switch-container {
1203
+ display: inline-flex;
1204
+ align-items: center;
1205
+ gap: var(--space-md);
1206
+ cursor: pointer;
1207
+ user-select: none;
1208
+ }
1209
+
1210
+ .jux-switch-input {
1211
+ position: absolute;
1212
+ opacity: 0;
1213
+ width: 0;
1214
+ height: 0;
1215
+ }
1216
+
1217
+ .jux-switch-slider {
1218
+ width: 44px;
1219
+ height: 24px;
1220
+ background: var(--color-border);
1221
+ border-radius: var(--radius-full);
1222
+ position: relative;
1223
+ transition: background-color var(--transition-base);
1224
+ }
1225
+
1226
+ .jux-switch-slider::before {
1227
+ content: '';
1228
+ position: absolute;
1229
+ width: 18px;
1230
+ height: 18px;
1231
+ left: 3px;
1232
+ top: 3px;
1233
+ background: white;
1234
+ border-radius: 50%;
1235
+ transition: transform var(--transition-base);
1236
+ }
1237
+
1238
+ .jux-switch-input:checked + .jux-switch-slider {
1239
+ background: var(--color-brand);
1240
+ }
1241
+
1242
+ .jux-switch-input:checked + .jux-switch-slider::before {
1243
+ transform: translateX(20px);
1244
+ }
1245
+
1246
+ .jux-switch-label-text {
1247
+ font-size: 0.875rem;
1248
+ color: var(--color-text-primary);
1249
+ }
1250
+
1251
+ /* ============================================
1252
+ TABLE COMPONENT
1253
+ ============================================ */
1254
+ .jux-table-wrapper {
1255
+ border: var(--border-width) solid var(--color-border);
1256
+ border-radius: var(--radius-lg);
1257
+ overflow: hidden;
1258
+ margin-bottom: var(--space-lg);
1259
+ }
1260
+
1261
+ .jux-table-filter {
1262
+ width: 100%;
1263
+ padding: var(--space-md) var(--space-lg);
1264
+ font-size: 0.875rem;
1265
+ border: none;
1266
+ border-bottom: var(--border-width) solid var(--color-border);
1267
+ background: var(--color-surface-base);
1268
+ color: var(--color-text-primary);
1269
+ }
1270
+
1271
+ .jux-table-filter:focus {
1272
+ outline: none;
1273
+ background: var(--color-surface-elevated);
1274
+ }
1275
+
1276
+ .jux-table {
1277
+ width: 100%;
1278
+ border-collapse: collapse;
1279
+ }
1280
+
1281
+ .jux-table-bordered {
1282
+ /* Bordered table variant */
1283
+ }
1284
+
1285
+ .jux-table thead {
1286
+ background: var(--color-surface-base);
1287
+ border-bottom: var(--border-width) solid var(--color-border);
1288
+ }
1289
+
1290
+ .jux-table th {
1291
+ padding: var(--space-md) var(--space-lg);
1292
+ text-align: left;
1293
+ font-size: 0.75rem;
1294
+ font-weight: 600;
1295
+ color: var(--color-text-secondary);
1296
+ text-transform: uppercase;
1297
+ letter-spacing: 0.05em;
1298
+ }
1299
+
1300
+ .jux-table td {
1301
+ padding: var(--space-md) var(--space-lg);
1302
+ font-size: 0.875rem;
1303
+ color: var(--color-text-primary);
1304
+ border-top: var(--border-width) solid var(--color-border);
1305
+ }
1306
+
1307
+ .jux-table tbody tr:hover {
1308
+ background: var(--color-surface-hover);
1309
+ }
1310
+
1311
+ .jux-table-pagination {
1312
+ display: flex;
1313
+ align-items: center;
1314
+ justify-content: center;
1315
+ gap: var(--space-md);
1316
+ padding: var(--space-md) var(--space-lg);
1317
+ border-top: var(--border-width) solid var(--color-border);
1318
+ background: var(--color-surface-base);
1319
+ }
1320
+
1321
+ .jux-table-pagination button {
1322
+ padding: var(--space-xs) var(--space-md);
1323
+ background: var(--color-surface-elevated);
1324
+ border: var(--border-width) solid var(--color-border);
1325
+ border-radius: var(--radius-md);
1326
+ cursor: pointer;
1327
+ font-size: 0.875rem;
1328
+ color: var(--color-text-primary);
1329
+ transition: background-color var(--transition-base);
1330
+ }
1331
+
1332
+ .jux-table-pagination button:hover:not(:disabled) {
1333
+ background: var(--color-surface-hover);
1334
+ }
1335
+
1336
+ .jux-table-pagination button:disabled {
1337
+ opacity: 0.5;
1338
+ cursor: not-allowed;
1339
+ }
1340
+
1341
+ .jux-table-pagination span {
1342
+ font-size: 0.875rem;
1343
+ color: var(--color-text-secondary);
1344
+ }
1345
+
1346
+ /* ============================================
1347
+ TABS COMPONENT
1348
+ ============================================ */
1349
+ .jux-tabs {
1350
+ margin-bottom: var(--space-lg);
1351
+ }
1352
+
1353
+ .jux-tabs-default {
1354
+ /* Base tabs styles */
1355
+ }
1356
+
1357
+ .jux-tabs-list {
1358
+ display: flex;
1359
+ gap: var(--space-xs);
1360
+ border-bottom: var(--border-width) solid var(--color-border);
1361
+ margin-bottom: var(--space-lg);
1362
+ }
1363
+
1364
+ .jux-tabs-button {
1365
+ padding: var(--space-md) var(--space-xl);
1366
+ background: transparent;
1367
+ border: none;
1368
+ border-bottom: 2px solid transparent;
1369
+ cursor: pointer;
1370
+ font-size: 0.875rem;
1371
+ font-weight: 500;
1372
+ color: var(--color-text-secondary);
1373
+ transition: color var(--transition-base), border-color var(--transition-base);
1374
+ position: relative;
1375
+ bottom: -1px;
1376
+ }
1377
+
1378
+ .jux-tabs-button:hover {
1379
+ color: var(--color-text-primary);
1380
+ }
1381
+
1382
+ .jux-tabs-button-active {
1383
+ color: var(--color-brand);
1384
+ border-bottom-color: var(--color-brand);
1385
+ }
1386
+
1387
+ .jux-tabs-panels {
1388
+ /* Tabs panels container */
1389
+ }
1390
+
1391
+ .jux-tabs-panel {
1392
+ display: none;
1393
+ animation: fadeIn 0.2s ease-in;
1394
+ }
1395
+
1396
+ .jux-tabs-panel-active {
1397
+ display: block;
1398
+ }
1399
+
1400
+ @keyframes fadeIn {
1401
+ from { opacity: 0; }
1402
+ to { opacity: 1; }
1403
+ }
1404
+
1405
+ /* ============================================
1406
+ VIEW COMPONENT
1407
+ ============================================ */
1408
+ .jux-view {
1409
+ background: var(--color-surface-elevated);
1410
+ border: var(--border-width) solid var(--color-border);
1411
+ border-radius: var(--radius-lg);
1412
+ overflow: hidden;
1413
+ margin-bottom: var(--space-lg);
1414
+ }
1415
+
1416
+ .jux-view-header {
1417
+ padding: var(--space-xl);
1418
+ border-bottom: var(--border-width) solid var(--color-border);
1419
+ background: var(--color-surface-base);
1420
+ }
1421
+
1422
+ .jux-view-title {
1423
+ font-size: 1.5rem;
1424
+ font-weight: 600;
1425
+ color: var(--color-text-primary);
1426
+ margin: 0;
1427
+ }
1428
+
1429
+ .jux-view-content {
1430
+ padding: var(--space-xl);
1431
+ }
1432
+
1433
+ /* ============================================
1434
+ SCROLLBARS
1435
+ ============================================ */
1436
+ #appmain::-webkit-scrollbar,
1437
+ #appaside::-webkit-scrollbar {
1438
+ width: 6px;
1439
+ }
1440
+
1441
+ #appmain::-webkit-scrollbar-track,
1442
+ #appaside::-webkit-scrollbar-track {
1443
+ background: transparent;
1444
+ }
1445
+
1446
+ #appmain::-webkit-scrollbar-thumb,
1447
+ #appaside::-webkit-scrollbar-thumb {
1448
+ background: var(--color-border);
1449
+ border-radius: 3px;
1450
+ }
1451
+
1452
+ #appmain::-webkit-scrollbar-thumb:hover,
1453
+ #appaside::-webkit-scrollbar-thumb:hover {
1454
+ background: var(--color-border-hover);
1455
+ }
1456
+
1457
+ /* ============================================
1458
+ RESPONSIVE
1459
+ ============================================ */
1460
+ @media (max-width: 768px) {
1461
+ #app {
1462
+ grid-template-columns: 1fr;
1463
+ grid-template-areas:
1464
+ "header"
1465
+ "main"
1466
+ "footer";
1467
+ }
1468
+
1469
+ #appaside {
1470
+ display: none;
1471
+ }
1472
+
1473
+ #appheader {
1474
+ padding: 0 var(--space-lg);
1475
+ }
1476
+
1477
+ #appmain-content {
1478
+ padding: var(--space-2xl) var(--space-lg);
1479
+ }
1480
+
1481
+ #appfooter {
1482
+ padding: var(--space-md) var(--space-lg);
1483
+ }
1484
+
1485
+ .jux-hero-title {
1486
+ font-size: 2rem;
1487
+ }
1488
+
1489
+ .jux-radio-options {
1490
+ flex-direction: column;
1491
+ }
1492
+ }
1493
+
1494
+ /* ============================================
1495
+ GRID COMPONENT
1496
+ ============================================ */
1497
+ .jux-grid {
1498
+ display: grid;
1499
+ position: relative;
1500
+ }
1501
+
1502
+ .jux-grid-cell {
1503
+ position: relative;
1504
+ overflow: auto;
1505
+ min-width: 0; /* Prevent grid blowout */
1506
+ min-height: 0;
1507
+ }
1508
+
1509
+ /* ============================================
1510
+ GRID GRIDDER MODE (Blueprint Visualization)
1511
+ ============================================ */
1512
+ .jux-grid-gridder {
1513
+ /* Blueprint-style background */
1514
+ background-color: #0a1929;
1515
+ background-image:
1516
+ linear-gradient(rgba(59, 130, 246, 0.1) 1px, transparent 1px),
1517
+ linear-gradient(90deg, rgba(59, 130, 246, 0.1) 1px, transparent 1px);
1518
+ background-size: 20px 20px;
1519
+ padding: 2px;
1520
+ border: 2px solid #3b82f6;
1521
+ box-shadow:
1522
+ 0 0 0 1px rgba(59, 130, 246, 0.2),
1523
+ inset 0 0 20px rgba(59, 130, 246, 0.1);
1524
+ }
1525
+
1526
+ .jux-grid-gridder .jux-grid-cell {
1527
+ /* Cell styling in gridder mode */
1528
+ background: rgba(15, 23, 42, 0.8);
1529
+ border: 1px solid rgba(59, 130, 246, 0.4);
1530
+ box-shadow: inset 0 0 10px rgba(59, 130, 246, 0.05);
1531
+ min-height: 80px; /* Ensure cells are visible */
1532
+ display: flex;
1533
+ align-items: center;
1534
+ justify-content: center;
1535
+ position: relative;
1536
+ transition: all 0.2s ease;
1537
+ }
1538
+
1539
+ .jux-grid-gridder .jux-grid-cell:hover {
1540
+ background: rgba(30, 41, 59, 0.9);
1541
+ border-color: rgba(59, 130, 246, 0.8);
1542
+ box-shadow:
1543
+ inset 0 0 15px rgba(59, 130, 246, 0.15),
1544
+ 0 0 10px rgba(59, 130, 246, 0.3);
1545
+ }
1546
+
1547
+ /* Coordinate label (top-left corner) */
1548
+ .jux-grid-gridder .jux-grid-cell::before {
1549
+ content: attr(data-row) ',' attr(data-col);
1550
+ position: absolute;
1551
+ top: 4px;
1552
+ left: 4px;
1553
+ font-size: 10px;
1554
+ font-family: 'SF Mono', Monaco, 'Courier New', monospace;
1555
+ font-weight: 600;
1556
+ color: rgba(59, 130, 246, 0.8);
1557
+ background: rgba(15, 23, 42, 0.95);
1558
+ padding: 2px 6px;
1559
+ border-radius: 3px;
1560
+ border: 1px solid rgba(59, 130, 246, 0.3);
1561
+ letter-spacing: 0.5px;
1562
+ z-index: 10;
1563
+ }
1564
+
1565
+ /* ID label (bottom-right corner) */
1566
+ .jux-grid-gridder .jux-grid-cell::after {
1567
+ content: '#' attr(id);
1568
+ position: absolute;
1569
+ bottom: 4px;
1570
+ right: 4px;
1571
+ font-size: 9px;
1572
+ font-family: 'SF Mono', Monaco, 'Courier New', monospace;
1573
+ color: rgba(148, 163, 184, 0.6);
1574
+ background: rgba(15, 23, 42, 0.8);
1575
+ padding: 2px 5px;
1576
+ border-radius: 2px;
1577
+ border: 1px solid rgba(71, 85, 105, 0.3);
1578
+ max-width: calc(100% - 12px);
1579
+ overflow: hidden;
1580
+ text-overflow: ellipsis;
1581
+ white-space: nowrap;
1582
+ }
1583
+
1584
+ /* Grid lines (column separators) */
1585
+ .jux-grid-gridder .jux-grid-cell:not(:nth-child(1))::before {
1586
+ box-shadow: 0 0 5px rgba(59, 130, 246, 0.4);
1587
+ }
1588
+
1589
+ /* Remove default debug styles when gridder is active */
1590
+ .jux-grid-gridder.jux-grid-debug .jux-grid-cell {
1591
+ /* Gridder overrides debug mode */
1592
+ border-color: rgba(59, 130, 246, 0.4);
1593
+ background: rgba(15, 23, 42, 0.8);
1594
+ }
1595
+
1596
+ /* ============================================
1597
+ GRID DEBUG MODE (Legacy - simpler version)
1598
+ ============================================ */
1599
+ .jux-grid-debug .jux-grid-cell {
1600
+ border: 1px dashed var(--color-border);
1601
+ background: var(--color-surface-base);
1602
+ }
1603
+
1604
+ .jux-grid-debug .jux-grid-cell::before {
1605
+ content: attr(data-row) '-' attr(data-col);
1606
+ position: absolute;
1607
+ top: 2px;
1608
+ left: 2px;
1609
+ font-size: 10px;
1610
+ color: var(--color-text-tertiary);
1611
+ opacity: 0.5;
1612
+ }
1613
+
1614
+ /* ============================================
1615
+ CALENDAR COMPONENT
1616
+ ============================================ */
1617
+ .jux-calendar {
1618
+ background: var(--color-surface-elevated);
1619
+ border: var(--border-width) solid var(--color-border);
1620
+ border-radius: var(--radius-lg);
1621
+ overflow: hidden;
1622
+ margin-bottom: var(--space-lg);
1623
+ }
1624
+
1625
+ .jux-calendar-header {
1626
+ padding: var(--space-lg);
1627
+ border-bottom: var(--border-width) solid var(--color-border);
1628
+ background: var(--color-surface-base);
1629
+ }
1630
+
1631
+ .jux-calendar-nav {
1632
+ display: flex;
1633
+ align-items: center;
1634
+ justify-content: space-between;
1635
+ gap: var(--space-md);
1636
+ }
1637
+
1638
+ .jux-calendar-nav-btn {
1639
+ width: 32px;
1640
+ height: 32px;
1641
+ display: flex;
1642
+ align-items: center;
1643
+ justify-content: center;
1644
+ background: transparent;
1645
+ border: var(--border-width) solid var(--color-border);
1646
+ border-radius: var(--radius-md);
1647
+ cursor: pointer;
1648
+ font-size: 1.25rem;
1649
+ color: var(--color-text-primary);
1650
+ transition: all var(--transition-base);
1651
+ }
1652
+
1653
+ .jux-calendar-nav-btn:hover {
1654
+ background: var(--color-surface-hover);
1655
+ border-color: var(--color-brand);
1656
+ }
1657
+
1658
+ .jux-calendar-today-btn {
1659
+ padding: var(--space-xs) var(--space-lg);
1660
+ background: var(--color-brand);
1661
+ color: white;
1662
+ border: none;
1663
+ border-radius: var(--radius-md);
1664
+ cursor: pointer;
1665
+ font-size: 0.875rem;
1666
+ font-weight: 500;
1667
+ transition: background-color var(--transition-base);
1668
+ }
1669
+
1670
+ .jux-calendar-today-btn:hover {
1671
+ background: var(--color-brand-hover);
1672
+ }
1673
+
1674
+ .jux-calendar-title {
1675
+ flex: 1;
1676
+ text-align: center;
1677
+ font-size: 1.125rem;
1678
+ font-weight: 600;
1679
+ color: var(--color-text-primary);
1680
+ }
1681
+
1682
+ .jux-calendar-grid {
1683
+ padding: var(--space-md);
1684
+ }
1685
+
1686
+ .jux-calendar-days-header {
1687
+ display: grid;
1688
+ grid-template-columns: repeat(7, 1fr);
1689
+ gap: var(--space-xs);
1690
+ margin-bottom: var(--space-md);
1691
+ }
1692
+
1693
+ .jux-calendar-day-name {
1694
+ text-align: center;
1695
+ font-size: 0.75rem;
1696
+ font-weight: 600;
1697
+ color: var(--color-text-secondary);
1698
+ text-transform: uppercase;
1699
+ letter-spacing: 0.05em;
1700
+ padding: var(--space-sm);
1701
+ }
1702
+
1703
+ .jux-calendar-days-grid {
1704
+ display: grid;
1705
+ grid-template-columns: repeat(7, 1fr);
1706
+ gap: var(--space-xs);
1707
+ }
1708
+
1709
+ .jux-calendar-day-cell {
1710
+ min-height: 100px;
1711
+ padding: var(--space-sm);
1712
+ background: var(--color-surface-base);
1713
+ border: var(--border-width) solid var(--color-border);
1714
+ border-radius: var(--radius-md);
1715
+ cursor: pointer;
1716
+ transition: all var(--transition-base);
1717
+ display: flex;
1718
+ flex-direction: column;
1719
+ }
1720
+
1721
+ .jux-calendar-day-cell:hover {
1722
+ background: var(--color-surface-hover);
1723
+ border-color: var(--color-brand);
1724
+ }
1725
+
1726
+ .jux-calendar-day-cell.other-month {
1727
+ opacity: 0.4;
1728
+ }
1729
+
1730
+ .jux-calendar-day-cell.today {
1731
+ border-color: var(--color-brand);
1732
+ background: rgba(14, 165, 233, 0.05);
1733
+ }
1734
+
1735
+ .jux-calendar-day-number {
1736
+ font-size: 0.875rem;
1737
+ font-weight: 600;
1738
+ color: var(--color-text-primary);
1739
+ margin-bottom: var(--space-xs);
1740
+ }
1741
+
1742
+ .jux-calendar-day-cell.today .jux-calendar-day-number {
1743
+ color: var(--color-brand);
1744
+ }
1745
+
1746
+ .jux-calendar-day-events {
1747
+ display: flex;
1748
+ flex-direction: column;
1749
+ gap: var(--space-xs);
1750
+ flex: 1;
1751
+ overflow: hidden;
1752
+ }
1753
+
1754
+ .jux-calendar-event {
1755
+ padding: var(--space-xs) var(--space-sm);
1756
+ background: var(--color-brand);
1757
+ color: white;
1758
+ font-size: 0.75rem;
1759
+ border-radius: var(--radius-sm);
1760
+ cursor: pointer;
1761
+ transition: opacity var(--transition-base);
1762
+ white-space: nowrap;
1763
+ overflow: hidden;
1764
+ text-overflow: ellipsis;
1765
+ }
1766
+
1767
+ .jux-calendar-event:hover {
1768
+ opacity: 0.8;
1769
+ }
1770
+
1771
+ /* Popover */
1772
+ .jux-calendar-popover {
1773
+ background: var(--color-surface-elevated);
1774
+ border: var(--border-width) solid var(--color-border);
1775
+ border-radius: var(--radius-lg);
1776
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
1777
+ padding: var(--space-lg);
1778
+ min-width: 320px;
1779
+ max-width: 400px;
1780
+ z-index: 1000;
1781
+ }
1782
+
1783
+ .jux-calendar-event-form h4 {
1784
+ margin: 0 0 var(--space-lg) 0;
1785
+ font-size: 1.125rem;
1786
+ font-weight: 600;
1787
+ color: var(--color-text-primary);
1788
+ }
1789
+
1790
+ .jux-calendar-event-form label {
1791
+ display: block;
1792
+ margin-bottom: var(--space-md);
1793
+ }
1794
+
1795
+ .jux-calendar-event-form label span {
1796
+ display: block;
1797
+ font-size: 0.875rem;
1798
+ font-weight: 500;
1799
+ color: var(--color-text-primary);
1800
+ margin-bottom: var(--space-xs);
1801
+ }
1802
+
1803
+ .jux-calendar-event-form input,
1804
+ .jux-calendar-event-form textarea {
1805
+ width: 100%;
1806
+ padding: var(--space-sm);
1807
+ font-size: 0.875rem;
1808
+ color: var(--color-text-primary);
1809
+ background: var(--color-surface-base);
1810
+ border: var(--border-width) solid var(--color-border);
1811
+ border-radius: var(--radius-md);
1812
+ font-family: var(--font-family-base);
1813
+ }
1814
+
1815
+ .jux-calendar-event-form input:focus,
1816
+ .jux-calendar-event-form textarea:focus {
1817
+ outline: none;
1818
+ border-color: var(--color-brand);
1819
+ box-shadow: 0 0 0 3px rgba(14, 165, 233, 0.1);
1820
+ }
1821
+
1822
+ .jux-calendar-form-actions {
1823
+ display: flex;
1824
+ gap: var(--space-sm);
1825
+ margin-top: var(--space-lg);
1826
+ }
1827
+
1828
+ .jux-calendar-btn-primary,
1829
+ .jux-calendar-btn-secondary,
1830
+ .jux-calendar-btn-danger {
1831
+ padding: var(--space-sm) var(--space-lg);
1832
+ border: none;
1833
+ border-radius: var(--radius-md);
1834
+ cursor: pointer;
1835
+ font-size: 0.875rem;
1836
+ font-weight: 500;
1837
+ transition: all var(--transition-base);
1838
+ }
1839
+
1840
+ .jux-calendar-btn-primary {
1841
+ background: var(--color-brand);
1842
+ color: white;
1843
+ }
1844
+
1845
+ .jux-calendar-btn-primary:hover {
1846
+ background: var(--color-brand-hover);
1847
+ }
1848
+
1849
+ .jux-calendar-btn-secondary {
1850
+ background: var(--color-surface-base);
1851
+ color: var(--color-text-primary);
1852
+ border: var(--border-width) solid var(--color-border);
1853
+ }
1854
+
1855
+ .jux-calendar-btn-secondary:hover {
1856
+ background: var(--color-surface-hover);
1857
+ }
1858
+
1859
+ .jux-calendar-btn-danger {
1860
+ background: #ef4444;
1861
+ color: white;
1862
+ }
1863
+
1864
+ .jux-calendar-btn-danger:hover {
1865
+ background: #dc2626;
1866
+ }
1867
+
1868
+ /* ✅ ADD: Week view styles */
1869
+ .jux-calendar-week-view {
1870
+ display: grid;
1871
+ grid-template-columns: repeat(7, 1fr);
1872
+ gap: var(--space-xs);
1873
+ padding: var(--space-md);
1874
+ }
1875
+
1876
+ .jux-calendar-week-day-col {
1877
+ min-height: 400px;
1878
+ border: var(--border-width) solid var(--color-border);
1879
+ border-radius: var(--radius-md);
1880
+ }
1881
+
1882
+ /* ✅ ADD: Day view styles */
1883
+ .jux-calendar-day-view {
1884
+ padding: var(--space-md);
1885
+ max-height: 600px;
1886
+ overflow-y: auto;
1887
+ }
1888
+
1889
+ .jux-calendar-hour-slot {
1890
+ height: 60px;
1891
+ border-bottom: var(--border-width) solid var(--color-border);
1892
+ padding: var(--space-sm);
1893
+ position: relative;
1894
+ }
1895
+
1896
+ /* ✅ ADD: Year view styles */
1897
+ .jux-calendar-year-view {
1898
+ display: grid;
1899
+ grid-template-columns: repeat(3, 1fr);
1900
+ gap: var(--space-lg);
1901
+ padding: var(--space-lg);
1902
+ }
1903
+
1904
+ .jux-calendar-mini-month {
1905
+ border: var(--border-width) solid var(--color-border);
1906
+ border-radius: var(--radius-md);
1907
+ padding: var(--space-md);
1908
+ min-height: 150px;
1909
+ }
1910
+
1911
+
1912
+ /* componentsv2/list*/
1913
+ .jux-list {
1914
+ font-family: system-ui, -apple-system, sans-serif;
1915
+ padding: 1rem;
1916
+ border: 1px solid #eee;
1917
+ border-radius: 4px;
1918
+ transition: opacity 0.2s;
1919
+ }
1920
+
1921
+ .jux-list[aria-disabled="true"] {
1922
+ opacity: 0.5;
1923
+ pointer-events: none;
1924
+ background-color: #f9f9f9;
1925
+ }
1926
+
1927
+ .jux-list[aria-busy="true"] {
1928
+ cursor: wait;
1929
+ opacity: 0.7;
1930
+ }
1931
+
1932
+ /* Internal List Element */
1933
+ .jux-list-element {
1934
+ margin: 0;
1935
+ padding-left: 1.5rem;
1936
+ }
1937
+
1938
+ .jux-list li {
1939
+ padding: 0.25rem 0.5rem;
1940
+ cursor: default;
1941
+ border-radius: 2px;
1942
+ }
1943
+
1944
+ .jux-list li:hover {
1945
+ background-color: #f0f0f0;
1946
+ }
1947
+
1948
+ .jux-list li.jux-selected {
1949
+ background-color: #e3f2fd;
1950
+ color: #1565c0;
1951
+ font-weight: 500;
1952
+ }