juxscript 1.0.57 → 1.0.60

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,6 +1,6 @@
1
1
  /**
2
2
  * Default Preset - Grid Layout System
3
- * Minimal, clean layout with proper spacing
3
+ * Comprehensive component styling
4
4
  */
5
5
 
6
6
  /* ============================================
@@ -29,18 +29,24 @@
29
29
  --color-surface-base: #f7f7f7;
30
30
  --color-surface-elevated: #ffffff;
31
31
  --color-surface-hover: #f1f1f1;
32
+ --color-surface-active: #e8e8e8;
32
33
 
33
34
  --color-border: #e8e8e8;
34
35
  --color-border-hover: #d1d1d1;
35
36
 
37
+ --color-brand: #0ea5e9;
38
+ --color-brand-hover: #0284c7;
39
+
36
40
  /* Borders & Radius */
37
41
  --border-width: 1px;
38
42
  --radius-sm: 3px;
39
43
  --radius-md: 6px;
40
44
  --radius-lg: 8px;
45
+ --radius-full: 9999px;
41
46
 
42
47
  /* Transitions */
43
48
  --transition-base: 150ms ease;
49
+ --transition-fast: 100ms ease;
44
50
  }
45
51
 
46
52
  /* ============================================
@@ -57,6 +63,8 @@ body {
57
63
  color: var(--color-text-primary);
58
64
  background: var(--color-background);
59
65
  -webkit-font-smoothing: antialiased;
66
+ font-size: 14px;
67
+ line-height: 1.5;
60
68
  }
61
69
 
62
70
  /* ============================================
@@ -105,9 +113,8 @@ body {
105
113
  cursor: pointer;
106
114
  }
107
115
 
108
- /* ✅ Fix h1 inside logo - reset default heading styles */
109
116
  #appheader-logo h1 {
110
- font-size: 1.25rem;
117
+ font-size: 1.125rem;
111
118
  font-weight: 700;
112
119
  margin: 0;
113
120
  line-height: 1;
@@ -136,6 +143,7 @@ body {
136
143
  background: var(--color-surface-base);
137
144
  border-right: var(--border-width) solid var(--color-border);
138
145
  overflow-y: auto;
146
+ padding: var(--space-lg);
139
147
  }
140
148
 
141
149
  /* ============================================
@@ -149,7 +157,7 @@ body {
149
157
  }
150
158
 
151
159
  #appmain-content {
152
- max-width: 800px;
160
+ max-width: 900px;
153
161
  margin: 0 auto;
154
162
  padding: var(--space-3xl) var(--space-2xl);
155
163
  }
@@ -162,7 +170,7 @@ body {
162
170
  background: var(--color-surface-elevated);
163
171
  border-top: var(--border-width) solid var(--color-border);
164
172
  padding: var(--space-md) var(--space-2xl);
165
- font-size: 0.875rem;
173
+ font-size: 0.8125rem;
166
174
  color: var(--color-text-tertiary);
167
175
  min-height: 40px;
168
176
  display: flex;
@@ -176,141 +184,268 @@ body {
176
184
  }
177
185
 
178
186
  /* ============================================
179
- RIGHT SIDEBAR (Optional)
187
+ TYPOGRAPHY
180
188
  ============================================ */
181
- #appsidebar {
182
- grid-area: aside;
183
- width: 280px;
184
- background: var(--color-surface-base);
185
- border-left: var(--border-width) solid var(--color-border);
186
- display: none;
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;
187
194
  }
188
195
 
189
- #appsidebar.show {
190
- display: block;
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;
191
207
  }
192
208
 
193
- #appsidebar-header {
194
- padding: var(--space-lg);
195
- border-bottom: var(--border-width) solid var(--color-border);
196
- font-size: 0.75rem;
209
+ /* ============================================
210
+ HEADINGS
211
+ ============================================ */
212
+ .jux-heading {
197
213
  font-weight: 600;
198
- color: var(--color-text-tertiary);
199
- text-transform: uppercase;
214
+ line-height: 1.3;
215
+ color: var(--color-text-primary);
216
+ margin: 0 0 var(--space-md) 0;
200
217
  }
201
218
 
202
- #appsidebar-content {
203
- padding: var(--space-lg);
204
- overflow-y: auto;
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);
205
232
  }
206
233
 
207
- #appsidebar-footer {
208
- padding: var(--space-lg);
209
- border-top: var(--border-width) solid var(--color-border);
210
- font-size: 0.75rem;
211
- color: var(--color-text-tertiary);
234
+ .jux-hero-centered {
235
+ text-align: center;
212
236
  }
213
237
 
214
- /* ============================================
215
- SCROLLBARS
216
- ============================================ */
217
- #appmain::-webkit-scrollbar,
218
- #appaside::-webkit-scrollbar,
219
- #appsidebar-content::-webkit-scrollbar {
220
- width: 6px;
238
+ .jux-hero-content {
239
+ display: flex;
240
+ flex-direction: column;
241
+ gap: var(--space-lg);
221
242
  }
222
243
 
223
- #appmain::-webkit-scrollbar-track,
224
- #appaside::-webkit-scrollbar-track,
225
- #appsidebar-content::-webkit-scrollbar-track {
226
- background: transparent;
244
+ .jux-hero-centered .jux-hero-content {
245
+ align-items: center;
227
246
  }
228
247
 
229
- #appmain::-webkit-scrollbar-thumb,
230
- #appaside::-webkit-scrollbar-thumb,
231
- #appsidebar-content::-webkit-scrollbar-thumb {
232
- background: var(--color-border);
233
- border-radius: 3px;
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);
234
255
  }
235
256
 
236
- #appmain::-webkit-scrollbar-thumb:hover,
237
- #appaside::-webkit-scrollbar-thumb:hover,
238
- #appsidebar-content::-webkit-scrollbar-thumb:hover {
239
- background: var(--color-border-hover);
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);
240
287
  }
241
288
 
242
289
  /* ============================================
243
- RESPONSIVE
290
+ ALERT COMPONENT
244
291
  ============================================ */
245
- @media (max-width: 768px) {
246
- #app {
247
- grid-template-columns: 1fr;
248
- grid-template-areas:
249
- "header"
250
- "main"
251
- "footer";
252
- }
253
-
254
- #appaside {
255
- display: none;
256
- }
257
-
258
- #appheader {
259
- padding: 0 var(--space-lg);
260
- }
261
-
262
- #appmain-content {
263
- padding: var(--space-2xl) var(--space-lg);
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);
264
307
  }
265
-
266
- #appfooter {
267
- padding: var(--space-md) var(--space-lg);
308
+ to {
309
+ opacity: 1;
310
+ transform: translateY(0);
268
311
  }
269
312
  }
270
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
+
271
365
  /* ============================================
272
- COMPONENT STYLES
366
+ BADGE COMPONENT
273
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
+ }
274
400
 
275
- /* Buttons */
401
+ .jux-badge-info {
402
+ color: #1e40af;
403
+ background-color: #dbeafe;
404
+ }
405
+
406
+ /* ============================================
407
+ BUTTON COMPONENT
408
+ ============================================ */
276
409
  .jux-button {
277
410
  display: inline-flex;
278
411
  align-items: center;
279
412
  justify-content: center;
280
- padding: 0 var(--space-lg);
413
+ padding: 0 var(--space-xl);
281
414
  height: 36px;
282
415
  font-size: 0.875rem;
283
416
  font-weight: 500;
284
417
  font-family: var(--font-family-base);
285
- color: #ffffff;
286
- background: #0ea5e9;
418
+ color: white;
419
+ background: var(--color-brand);
287
420
  border: none;
288
421
  border-radius: var(--radius-md);
289
422
  cursor: pointer;
290
- transition: background-color var(--transition-base), transform 100ms ease;
423
+ transition: background-color var(--transition-base), transform var(--transition-fast);
291
424
  user-select: none;
292
425
  white-space: nowrap;
293
426
  }
294
427
 
295
428
  .jux-button:hover {
296
- background: #0284c7;
429
+ background: var(--color-brand-hover);
297
430
  }
298
431
 
299
432
  .jux-button:active {
300
433
  transform: scale(0.98);
301
434
  }
302
435
 
303
- .jux-button:focus {
304
- outline: 2px solid #0ea5e9;
305
- outline-offset: 2px;
306
- }
307
-
308
436
  .jux-button:disabled {
309
437
  opacity: 0.5;
310
438
  cursor: not-allowed;
311
439
  }
312
440
 
313
- /* Button variants */
441
+ .jux-button-primary {
442
+ background: var(--color-brand);
443
+ }
444
+
445
+ .jux-button-primary:hover {
446
+ background: var(--color-brand-hover);
447
+ }
448
+
314
449
  .jux-button-secondary {
315
450
  background: var(--color-surface-hover);
316
451
  color: var(--color-text-primary);
@@ -319,1114 +454,1159 @@ body {
319
454
 
320
455
  .jux-button-secondary:hover {
321
456
  background: var(--color-surface-active);
322
- border-color: var(--color-border-hover);
323
- }
324
-
325
- .jux-button-ghost {
326
- background: transparent;
327
- color: var(--color-text-secondary);
328
- }
329
-
330
- .jux-button-ghost:hover {
331
- background: var(--color-surface-hover);
332
457
  }
333
458
 
334
- /* Button sizes */
335
459
  .jux-button-small {
336
460
  height: 28px;
337
461
  padding: 0 var(--space-md);
338
462
  font-size: 0.8125rem;
339
463
  }
340
464
 
465
+ .jux-button-medium {
466
+ height: 36px;
467
+ }
468
+
341
469
  .jux-button-large {
342
470
  height: 44px;
343
471
  padding: 0 var(--space-2xl);
344
472
  font-size: 1rem;
345
473
  }
346
474
 
347
- /* Code blocks */
348
- .jux-code {
349
- background: var(--color-surface-base);
475
+ /* ============================================
476
+ CARD COMPONENT
477
+ ============================================ */
478
+ .jux-card {
479
+ background: var(--color-surface-elevated);
350
480
  border: var(--border-width) solid var(--color-border);
351
481
  border-radius: var(--radius-lg);
352
- padding: var(--space-lg);
353
- font-family: var(--font-family-mono);
354
- font-size: 0.8125rem;
355
- line-height: 1.6;
356
- overflow-x: auto;
357
- margin: var(--space-xl) 0;
482
+ overflow: hidden;
483
+ margin-bottom: var(--space-lg);
358
484
  }
359
485
 
360
- /* Hero */
361
- .jux-hero {
362
- margin-bottom: var(--space-3xl);
486
+ .jux-card-default {
487
+ /* Base card styles */
363
488
  }
364
489
 
365
- .jux-hero h1 {
366
- font-size: 2.5rem;
367
- font-weight: 700;
368
- line-height: 1.2;
369
- margin-bottom: var(--space-md);
370
- letter-spacing: -0.02em;
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);
371
494
  }
372
495
 
373
- .jux-hero p {
496
+ .jux-card-title {
374
497
  font-size: 1.125rem;
375
- color: var(--color-text-secondary);
376
- line-height: 1.6;
377
- }
378
-
379
- /* Dividers */
380
- .jux-divider {
381
- height: 1px;
382
- background: var(--color-border);
383
- border: none;
384
- margin: var(--space-2xl) 0;
385
- }
386
-
387
- /* Headings */
388
- h1, h2, h3, h4, h5, h6 {
389
498
  font-weight: 600;
390
- line-height: 1.3;
391
499
  color: var(--color-text-primary);
500
+ margin: 0;
392
501
  }
393
502
 
394
- h1 { font-size: 2rem; margin: var(--space-2xl) 0 var(--space-lg) 0; }
395
- h2 { font-size: 1.5rem; margin: var(--space-2xl) 0 var(--space-md) 0; }
396
- h3 { font-size: 1.25rem; margin: var(--space-xl) 0 var(--space-md) 0; }
397
-
398
- /* Paragraphs */
399
- p {
400
- line-height: 1.6;
503
+ .jux-card-body {
504
+ padding: var(--space-xl);
401
505
  color: var(--color-text-secondary);
402
- margin-bottom: var(--space-lg);
403
- }
404
-
405
- /* Lists */
406
- ul, ol {
407
- padding-left: var(--space-2xl);
408
- margin-bottom: var(--space-xl);
506
+ line-height: 1.6;
409
507
  }
410
508
 
411
- li {
412
- line-height: 1.6;
413
- color: var(--color-text-secondary);
414
- margin-bottom: var(--space-sm);
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);
415
515
  }
416
516
 
417
517
  /* ============================================
418
- COMPONENT STYLES (Extracted from TypeScript)
518
+ CHECKBOX COMPONENT
419
519
  ============================================ */
420
-
421
- /* Alert Component */
422
- .jux-alert {
423
- display: flex;
424
- align-items: center;
425
- gap: var(--space-md);
426
- padding: var(--space-lg);
427
- border-radius: var(--radius-lg);
428
- margin-bottom: var(--space-md);
429
- position: relative;
430
- animation: slideIn 0.3s ease-out;
520
+ .jux-checkbox {
521
+ margin-bottom: var(--space-md);
431
522
  }
432
523
 
433
- @keyframes slideIn {
434
- from {
435
- opacity: 0;
436
- transform: translateX(-20px);
437
- }
438
- to {
439
- opacity: 1;
440
- transform: translateX(0);
441
- }
524
+ .jux-checkbox-container {
525
+ display: inline-flex;
526
+ align-items: center;
527
+ gap: var(--space-md);
528
+ cursor: pointer;
529
+ user-select: none;
442
530
  }
443
531
 
444
- .jux-alert-info {
445
- background: #dbeafe;
446
- border-left: 4px solid #3b82f6;
447
- color: #1e40af;
532
+ .jux-checkbox-input {
533
+ position: absolute;
534
+ opacity: 0;
535
+ width: 0;
536
+ height: 0;
448
537
  }
449
538
 
450
- .jux-alert-success {
451
- background: #d1fae5;
452
- border-left: 4px solid #10b981;
453
- color: #065f46;
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);
454
549
  }
455
550
 
456
- .jux-alert-warning {
457
- background: #fef3c7;
458
- border-left: 4px solid #f59e0b;
459
- color: #92400e;
551
+ .jux-checkbox-input:checked + .jux-checkbox-checkmark {
552
+ background: var(--color-brand);
553
+ border-color: var(--color-brand);
460
554
  }
461
555
 
462
- .jux-alert-error {
463
- background: #fee2e2;
464
- border-left: 4px solid #ef4444;
465
- color: #991b1b;
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);
466
564
  }
467
565
 
468
- .jux-alert-icon {
469
- flex-shrink: 0;
566
+ .jux-checkbox-input:checked + .jux-checkbox-checkmark svg {
567
+ opacity: 1;
470
568
  }
471
569
 
472
- .jux-alert-content {
473
- flex: 1;
474
- font-size: 14px;
475
- }
476
-
477
- .jux-alert-close {
478
- flex-shrink: 0;
479
- background: transparent;
480
- border: none;
481
- font-size: 24px;
482
- cursor: pointer;
483
- opacity: 0.6;
484
- transition: opacity 0.2s;
485
- padding: 0;
486
- width: 24px;
487
- height: 24px;
488
- display: flex;
489
- align-items: center;
490
- justify-content: center;
491
- }
492
-
493
- .jux-alert-close:hover {
494
- opacity: 1;
495
- }
496
-
497
- /* Badge Component */
498
- .jux-badge {
499
- display: inline-block;
500
- padding: var(--space-xs) var(--space-md);
501
- font-size: 0.75rem;
502
- font-weight: 600;
503
- line-height: 1;
504
- text-align: center;
505
- white-space: nowrap;
506
- vertical-align: baseline;
507
- border-radius: var(--radius-sm);
508
- transition: all var(--transition-base);
509
- }
510
-
511
- .jux-badge-pill {
512
- border-radius: 10rem;
513
- }
514
-
515
- .jux-badge-default {
516
- color: #374151;
517
- background-color: #e5e7eb;
518
- }
519
-
520
- .jux-badge-success {
521
- color: #065f46;
522
- background-color: #d1fae5;
523
- }
524
-
525
- .jux-badge-warning {
526
- color: #92400e;
527
- background-color: #fef3c7;
570
+ .jux-checkbox-label-text {
571
+ font-size: 0.875rem;
572
+ color: var(--color-text-primary);
528
573
  }
529
574
 
530
- .jux-badge-error {
531
- color: #991b1b;
532
- background-color: #fee2e2;
575
+ .jux-input-error {
576
+ color: #ef4444;
577
+ font-size: 0.75rem;
578
+ margin-top: var(--space-xs);
533
579
  }
534
580
 
535
- .jux-badge-info {
536
- color: #1e40af;
537
- background-color: #dbeafe;
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;
538
591
  }
539
592
 
540
- /* Button Component - Add missing variants */
541
- .jux-button-danger {
542
- background: #ef4444;
543
- color: white;
593
+ .jux-code pre {
594
+ margin: 0;
595
+ font-family: var(--font-family-mono);
596
+ font-size: 0.8125rem;
597
+ line-height: 1.6;
544
598
  }
545
599
 
546
- .jux-button-danger:hover {
547
- background: #dc2626;
600
+ .jux-code code {
601
+ color: #d4d4d4;
602
+ font-family: inherit;
548
603
  }
549
604
 
550
- .jux-button-link {
551
- background: transparent;
552
- color: #3b82f6;
553
- text-decoration: underline;
605
+ /* ============================================
606
+ CONTAINER COMPONENT
607
+ ============================================ */
608
+ .jux-container {
609
+ display: block;
554
610
  }
555
611
 
556
- .jux-button-link:hover {
557
- color: #2563eb;
612
+ /* ============================================
613
+ DATEPICKER COMPONENT
614
+ ============================================ */
615
+ .jux-datepicker {
616
+ position: relative;
558
617
  }
559
618
 
560
- .jux-button-reset,
561
- .jux-button-submit {
562
- /* Use default button styles */
619
+ .jux-datepicker-container {
620
+ position: relative;
563
621
  }
564
622
 
565
- /* Card Component - Add missing classes */
566
- .jux-card-icon {
567
- flex-shrink: 0;
568
- margin-right: var(--space-md);
623
+ .jux-datepicker-input {
624
+ padding-left: var(--space-3xl);
569
625
  }
570
626
 
571
- .jux-card-hoverable {
572
- transition: box-shadow var(--transition-base), transform var(--transition-base);
627
+ /* ============================================
628
+ DIVIDER COMPONENT
629
+ ============================================ */
630
+ .jux-divider {
631
+ border: none;
632
+ margin: var(--space-2xl) 0;
573
633
  }
574
634
 
575
- .jux-card-hoverable:hover {
576
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
577
- transform: translateY(-2px);
635
+ .jux-divider-default {
636
+ border-top: var(--border-width) solid var(--color-border);
578
637
  }
579
638
 
580
- /* Checkbox Component - Add container class */
581
- .jux-checkbox-container {
582
- display: flex;
583
- flex-direction: column;
584
- gap: var(--space-sm);
639
+ /* ============================================
640
+ DROPDOWN COMPONENT
641
+ ============================================ */
642
+ .jux-dropdown {
643
+ position: relative;
644
+ display: inline-block;
585
645
  }
586
646
 
587
- .jux-checkbox-checkmark {
588
- /* Alias for jux-checkbox-mark */
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);
589
659
  }
590
660
 
591
- /* Datepicker Component - Add missing classes */
592
- .jux-datepicker-calendar {
593
- position: absolute;
594
- top: 100%;
595
- left: 0;
596
- margin-top: var(--space-xs);
597
- background: var(--color-surface-elevated);
598
- border: var(--border-width) solid var(--color-border);
599
- border-radius: var(--radius-lg);
600
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
601
- padding: var(--space-lg);
602
- z-index: 1000;
661
+ .jux-dropdown-trigger:hover {
662
+ background: var(--color-surface-hover);
603
663
  }
604
664
 
605
- .jux-datepicker-header {
606
- display: flex;
607
- justify-content: space-between;
608
- align-items: center;
609
- margin-bottom: var(--space-md);
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;
610
676
  }
611
677
 
612
- .jux-datepicker-nav {
613
- background: transparent;
614
- border: none;
615
- cursor: pointer;
616
- font-size: 1.125rem;
617
- padding: var(--space-xs) var(--space-sm);
618
- color: var(--color-text-secondary);
619
- transition: color var(--transition-base);
678
+ .jux-dropdown-menu.show {
679
+ display: block;
620
680
  }
621
681
 
622
- .jux-datepicker-nav:hover {
623
- color: var(--color-text-primary);
682
+ .jux-dropdown-bottom-left {
683
+ left: 0;
624
684
  }
625
685
 
626
- .jux-datepicker-month {
627
- font-weight: 600;
628
- font-size: 0.875rem;
629
- color: var(--color-text-primary);
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);
630
699
  }
631
700
 
632
- .jux-datepicker-grid {
633
- display: grid;
634
- grid-template-columns: repeat(7, 1fr);
635
- gap: var(--space-xs);
701
+ .jux-dropdown-item:hover {
702
+ background: var(--color-surface-hover);
636
703
  }
637
704
 
638
- .jux-datepicker-day {
639
- padding: var(--space-sm);
640
- text-align: center;
641
- cursor: pointer;
642
- border-radius: var(--radius-sm);
643
- font-size: 0.875rem;
644
- transition: background-color var(--transition-base);
705
+ /* ============================================
706
+ INPUT COMPONENT
707
+ ============================================ */
708
+ .jux-input {
709
+ margin-bottom: var(--space-lg);
645
710
  }
646
711
 
647
- .jux-datepicker-day:hover {
648
- background-color: var(--color-surface-hover);
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);
649
718
  }
650
719
 
651
- .jux-datepicker-day-selected {
652
- background-color: #3b82f6;
653
- color: white;
720
+ .jux-input-container {
721
+ position: relative;
722
+ display: flex;
723
+ align-items: center;
654
724
  }
655
725
 
656
- .jux-datepicker-day-disabled {
657
- color: var(--color-text-tertiary);
658
- cursor: not-allowed;
659
- opacity: 0.5;
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;
660
733
  }
661
734
 
662
- /* Dialog Component - Add missing variant classes */
663
- .jux-dialog-default {
664
- /* Uses base dialog styles */
735
+ .jux-input-icon svg {
736
+ width: 18px;
737
+ height: 18px;
665
738
  }
666
739
 
667
- .jux-dialog-warning {
668
- border-top: 4px solid #f59e0b;
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);
669
750
  }
670
751
 
671
- .jux-dialog-danger {
672
- border-top: 4px solid #ef4444;
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);
673
756
  }
674
757
 
675
- .jux-dialog-button-cancel {
676
- background: var(--color-surface-hover);
677
- color: var(--color-text-primary);
678
- border: var(--border-width) solid var(--color-border);
758
+ /* ============================================
759
+ FILE UPLOAD COMPONENT
760
+ ============================================ */
761
+ .jux-fileupload {
762
+ margin-bottom: var(--space-lg);
679
763
  }
680
764
 
681
- /* Divider Component - Add variants */
682
- .jux-divider-default {
683
- border-top: var(--border-width) solid var(--color-border);
765
+ .jux-fileupload-input {
766
+ display: none;
684
767
  }
685
768
 
686
- .jux-divider-dashed {
687
- border-top: var(--border-width) dashed var(--color-border);
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);
688
779
  }
689
780
 
690
- .jux-divider-dotted {
691
- border-top: var(--border-width) dotted var(--color-border);
781
+ .jux-fileupload-button-container:hover {
782
+ border-color: var(--color-brand);
783
+ background: var(--color-surface-base);
692
784
  }
693
785
 
694
- .jux-divider-text {
695
- display: flex;
696
- align-items: center;
697
- text-align: center;
698
- margin: var(--space-2xl) 0;
699
- color: var(--color-text-secondary);
700
- font-size: 0.875rem;
786
+ .jux-fileupload-icon svg {
787
+ width: 48px;
788
+ height: 48px;
789
+ color: var(--color-text-tertiary);
701
790
  }
702
791
 
703
- .jux-divider-text::before,
704
- .jux-divider-text::after {
705
- content: '';
706
- flex: 1;
707
- border-top: var(--border-width) solid var(--color-border);
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);
708
802
  }
709
803
 
710
- .jux-divider-text::before {
711
- margin-right: var(--space-md);
804
+ .jux-fileupload-button:hover {
805
+ background: var(--color-brand-hover);
712
806
  }
713
807
 
714
- .jux-divider-text::after {
715
- margin-left: var(--space-md);
808
+ .jux-fileupload-list {
809
+ margin-top: var(--space-lg);
716
810
  }
717
811
 
718
- /* Dropdown Component - Add divider */
719
- .jux-dropdown-divider {
720
- height: var(--border-width);
721
- background: var(--color-border);
722
- margin: var(--space-xs) 0;
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);
723
821
  }
724
822
 
725
- /* Element Component - Semantic HTML elements */
726
- .jux-header,
727
- .jux-footer,
728
- .jux-main,
729
- .jux-aside,
730
- .jux-section,
731
- .jux-article {
732
- display: block;
823
+ .jux-kpicard-content {
824
+ display: flex;
825
+ flex-direction: column;
826
+ gap: var(--space-sm);
733
827
  }
734
828
 
735
- /* Error Handler Component */
736
- .jux-error-container {
737
- position: fixed;
738
- top: var(--space-lg);
739
- right: var(--space-lg);
740
- max-width: 500px;
741
- background: var(--color-surface-elevated);
742
- border: var(--border-width) solid #ef4444;
743
- border-radius: var(--radius-lg);
744
- box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.2);
745
- z-index: 9999;
746
- animation: slideIn 0.3s ease-out;
829
+ .jux-kpicard-title {
830
+ font-size: 0.875rem;
831
+ color: var(--color-text-secondary);
832
+ font-weight: 500;
747
833
  }
748
834
 
749
- .jux-error-header {
750
- display: flex;
751
- justify-content: space-between;
752
- align-items: center;
753
- padding: var(--space-lg);
754
- border-bottom: var(--border-width) solid var(--color-border);
755
- background: #fee2e2;
835
+ .jux-kpicard-value {
836
+ font-size: 2rem;
837
+ font-weight: 700;
838
+ color: var(--color-text-primary);
839
+ line-height: 1;
756
840
  }
757
841
 
758
- .jux-error-title {
759
- font-size: 1rem;
760
- font-weight: 600;
761
- color: #991b1b;
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;
762
849
  }
763
850
 
764
- .jux-error-close {
765
- background: transparent;
766
- border: none;
767
- font-size: 1.5rem;
768
- cursor: pointer;
769
- color: #991b1b;
770
- padding: 0;
771
- width: 24px;
772
- height: 24px;
773
- display: flex;
774
- align-items: center;
775
- justify-content: center;
851
+ .jux-kpicard-delta svg {
852
+ width: 16px;
853
+ height: 16px;
776
854
  }
777
855
 
778
- .jux-error-message {
779
- padding: var(--space-lg);
780
- color: var(--color-text-primary);
781
- font-size: 0.875rem;
782
- font-family: var(--font-family-mono);
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);
783
864
  }
784
865
 
785
- .jux-error-stack,
786
- .jux-error-context,
787
- .jux-error-location,
788
- .jux-error-time {
789
- padding: var(--space-md) var(--space-lg);
790
- border-top: var(--border-width) solid var(--color-border);
791
- font-size: 0.75rem;
792
- color: var(--color-text-secondary);
793
- font-family: var(--font-family-mono);
866
+ .jux-list {
867
+ list-style: none;
868
+ margin: 0;
869
+ padding: 0;
794
870
  }
795
871
 
796
- /* File Upload Component */
797
- .jux-fileupload-button-container {
798
- display: flex;
799
- justify-content: center;
800
- margin-top: var(--space-md);
872
+ .jux-list-unordered {
873
+ /* Base list styles */
801
874
  }
802
875
 
803
- .jux-fileupload-button {
804
- padding: var(--space-sm) var(--space-lg);
805
- background: #3b82f6;
806
- color: white;
807
- border: none;
808
- border-radius: var(--radius-md);
809
- cursor: pointer;
810
- font-size: 0.875rem;
811
- transition: background-color var(--transition-base);
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);
812
882
  }
813
883
 
814
- .jux-fileupload-button:hover {
815
- background: #2563eb;
884
+ .jux-list-item:last-child {
885
+ border-bottom: none;
816
886
  }
817
887
 
818
- .jux-fileupload-icon {
819
- display: flex;
820
- justify-content: center;
821
- margin-bottom: var(--space-md);
822
- color: var(--color-text-secondary);
888
+ .jux-list-item-hoverable {
889
+ transition: background-color var(--transition-base);
890
+ cursor: pointer;
823
891
  }
824
892
 
825
- .jux-fileupload-item {
826
- display: flex;
827
- justify-content: space-between;
828
- align-items: center;
829
- padding: var(--space-md);
830
- background: var(--color-surface-hover);
831
- border-radius: var(--radius-md);
832
- margin-bottom: var(--space-sm);
893
+ .jux-list-item-hoverable:hover {
894
+ background: var(--color-surface-hover);
833
895
  }
834
896
 
835
- .jux-fileupload-list {
836
- margin-top: var(--space-lg);
897
+ .jux-list-item-content {
898
+ flex: 1;
837
899
  }
838
900
 
839
- /* Heading Component - Add level variants */
840
- .jux-heading-1 { font-size: 2rem; }
841
- .jux-heading-2 { font-size: 1.5rem; }
842
- .jux-heading-3 { font-size: 1.25rem; }
843
- .jux-heading-4 { font-size: 1.125rem; }
844
- .jux-heading-5 { font-size: 1rem; }
845
- .jux-heading-6 { font-size: 0.875rem; }
846
-
847
- /* Hero Component - Add all variants */
848
- .jux-hero-centered {
849
- text-align: center;
901
+ .jux-list-item-text {
902
+ color: var(--color-text-secondary);
903
+ font-size: 0.875rem;
904
+ line-height: 1.5;
850
905
  }
851
906
 
852
- .jux-hero-centered .jux-hero-content {
853
- align-items: center;
907
+ .jux-list-item-title {
908
+ font-weight: 600;
909
+ color: var(--color-text-primary);
910
+ margin-bottom: var(--space-xs);
854
911
  }
855
912
 
856
- /* KPI Card Component */
857
- .jux-kpicard {
858
- background: var(--color-surface-elevated);
859
- border: var(--border-width) solid var(--color-border);
860
- border-radius: var(--radius-lg);
861
- padding: var(--space-xl);
913
+ /* ============================================
914
+ LOADING COMPONENT
915
+ ============================================ */
916
+ .jux-loading {
917
+ display: flex;
918
+ align-items: center;
919
+ justify-content: center;
920
+ padding: var(--space-xl);
862
921
  }
863
922
 
864
- .jux-kpicard-title {
865
- font-size: 0.875rem;
866
- color: var(--color-text-secondary);
867
- margin-bottom: var(--space-sm);
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;
868
930
  }
869
931
 
870
- .jux-kpicard-value {
871
- font-size: 2rem;
872
- font-weight: 700;
873
- color: var(--color-text-primary);
874
- margin-bottom: var(--space-xs);
932
+ .jux-loading-lg .jux-loading-spinner {
933
+ width: 48px;
934
+ height: 48px;
935
+ border-width: 4px;
875
936
  }
876
937
 
877
- .jux-kpicard-delta {
878
- font-size: 0.875rem;
879
- font-weight: 500;
938
+ @keyframes spin {
939
+ to { transform: rotate(360deg); }
880
940
  }
881
941
 
882
- .jux-kpicard-content {
883
- display: flex;
884
- flex-direction: column;
942
+ /* ============================================
943
+ MENU COMPONENT
944
+ ============================================ */
945
+ .jux-menu {
946
+ display: flex;
947
+ gap: var(--space-xs);
885
948
  }
886
949
 
887
- /* List Component - Add all variant classes */
888
- .jux-list-wrapper {
889
- border: var(--border-width) solid var(--color-border);
890
- border-radius: var(--radius-lg);
891
- overflow: hidden;
950
+ .jux-menu-vertical {
951
+ flex-direction: column;
892
952
  }
893
953
 
894
- .jux-list-header {
895
- padding: var(--space-lg);
896
- background: var(--color-surface-base);
897
- border-bottom: var(--border-width) solid var(--color-border);
898
- font-weight: 600;
899
- color: var(--color-text-primary);
954
+ .jux-menu-item {
955
+ /* Menu item wrapper */
900
956
  }
901
957
 
902
- .jux-list-item {
903
- padding: var(--space-lg);
904
- border-bottom: var(--border-width) solid var(--color-border);
905
- transition: background-color var(--transition-base);
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);
906
972
  }
907
973
 
908
- .jux-list-item:last-child {
909
- border-bottom: none;
974
+ .jux-menu-button:hover {
975
+ background: var(--color-surface-hover);
910
976
  }
911
977
 
912
- .jux-list-item-bordered {
913
- border: var(--border-width) solid var(--color-border);
914
- border-radius: var(--radius-md);
915
- margin-bottom: var(--space-sm);
978
+ .jux-menu-label {
979
+ flex: 1;
916
980
  }
917
981
 
918
- .jux-list-item-hoverable:hover {
919
- background-color: var(--color-surface-hover);
920
- cursor: pointer;
982
+ /* ============================================
983
+ NAV COMPONENT
984
+ ============================================ */
985
+ .jux-nav {
986
+ display: flex;
987
+ gap: var(--space-sm);
921
988
  }
922
989
 
923
- .jux-list-item-selected {
924
- background-color: #eff6ff;
925
- border-left: 4px solid #3b82f6;
990
+ .jux-nav-default {
991
+ /* Base nav styles */
926
992
  }
927
993
 
928
- .jux-list-item-disabled {
929
- opacity: 0.5;
930
- cursor: not-allowed;
994
+ .jux-nav-items {
995
+ display: flex;
996
+ gap: var(--space-sm);
997
+ align-items: center;
931
998
  }
932
999
 
933
- .jux-list-item-striped:nth-child(even) {
934
- background-color: var(--color-surface-base);
1000
+ .jux-nav-item-wrapper {
1001
+ /* Nav item wrapper */
935
1002
  }
936
1003
 
937
- .jux-list-item-icon {
938
- margin-right: var(--space-md);
939
- color: var(--color-text-secondary);
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);
940
1011
  }
941
1012
 
942
- .jux-list-item-title {
943
- font-weight: 600;
944
- color: var(--color-text-primary);
945
- margin-bottom: var(--space-xs);
1013
+ .jux-nav-link:hover {
1014
+ background: var(--color-surface-hover);
1015
+ color: var(--color-brand);
946
1016
  }
947
1017
 
948
- .jux-list-item-text,
949
- .jux-list-item-body {
950
- color: var(--color-text-secondary);
951
- font-size: 0.875rem;
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;
952
1026
  }
953
1027
 
954
- .jux-list-item-content {
955
- flex: 1;
1028
+ /* ============================================
1029
+ PROGRESS COMPONENT
1030
+ ============================================ */
1031
+ .jux-progress {
1032
+ margin-bottom: var(--space-lg);
956
1033
  }
957
1034
 
958
- .jux-list-item-metadata {
959
- font-size: 0.75rem;
960
- color: var(--color-text-tertiary);
961
- margin-top: var(--space-xs);
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;
962
1041
  }
963
1042
 
964
- /* List item type variants */
965
- .jux-list-item-default { /* default styles */ }
966
- .jux-list-item-info { background-color: #eff6ff; }
967
- .jux-list-item-success { background-color: #f0fdf4; }
968
- .jux-list-item-warning { background-color: #fffbeb; }
969
- .jux-list-item-error { background-color: #fef2f2; }
970
-
971
- /* Loading Component - Add variants */
972
- .jux-loading-dots {
973
- display: flex;
974
- gap: var(--space-sm);
1043
+ .jux-progress-bar {
1044
+ height: 100%;
1045
+ background: var(--color-brand);
1046
+ transition: width 0.3s ease;
1047
+ border-radius: var(--radius-full);
975
1048
  }
976
1049
 
977
- .jux-loading-dot {
978
- width: 8px;
979
- height: 8px;
980
- background: #3b82f6;
981
- border-radius: 50%;
982
- animation: bounce 1.4s infinite ease-in-out both;
1050
+ .jux-progress-bar-success {
1051
+ background: #10b981;
983
1052
  }
984
1053
 
985
- .jux-loading-dot:nth-child(1) { animation-delay: -0.32s; }
986
- .jux-loading-dot:nth-child(2) { animation-delay: -0.16s; }
987
-
988
- @keyframes bounce {
989
- 0%, 80%, 100% { transform: scale(0); }
990
- 40% { transform: scale(1); }
1054
+ .jux-progress-bar-warning {
1055
+ background: #f59e0b;
991
1056
  }
992
1057
 
993
- .jux-loading-pulse {
994
- width: 40px;
995
- height: 40px;
996
- background: #3b82f6;
997
- border-radius: 50%;
998
- animation: pulse 1.5s infinite;
1058
+ .jux-progress-bar-error {
1059
+ background: #ef4444;
999
1060
  }
1000
1061
 
1001
- @keyframes pulse {
1002
- 0%, 100% { opacity: 1; }
1003
- 50% { opacity: 0.5; }
1062
+ /* ============================================
1063
+ RADIO COMPONENT
1064
+ ============================================ */
1065
+ .jux-radio {
1066
+ margin-bottom: var(--space-lg);
1004
1067
  }
1005
1068
 
1006
- /* Menu Component */
1007
- .jux-menu-button {
1008
- background: transparent;
1009
- border: none;
1010
- padding: var(--space-md);
1011
- cursor: pointer;
1012
- color: var(--color-text-primary);
1069
+ .jux-radio-options {
1070
+ display: flex;
1071
+ gap: var(--space-lg);
1013
1072
  }
1014
1073
 
1015
- .jux-menu-icon {
1016
- margin-right: var(--space-sm);
1074
+ .jux-radio-vertical {
1075
+ flex-direction: column;
1076
+ gap: var(--space-md);
1017
1077
  }
1018
1078
 
1019
- .jux-menu-label {
1020
- font-size: 0.75rem;
1021
- font-weight: 600;
1022
- color: var(--color-text-tertiary);
1023
- text-transform: uppercase;
1024
- padding: var(--space-md);
1079
+ .jux-radio-option {
1080
+ display: flex;
1081
+ align-items: center;
1082
+ gap: var(--space-md);
1083
+ cursor: pointer;
1084
+ user-select: none;
1025
1085
  }
1026
1086
 
1027
- .jux-menu-link {
1028
- display: flex;
1029
- align-items: center;
1030
- padding: var(--space-md);
1031
- color: var(--color-text-primary);
1032
- text-decoration: none;
1033
- transition: background-color var(--transition-base);
1087
+ .jux-radio-input {
1088
+ position: absolute;
1089
+ opacity: 0;
1090
+ width: 0;
1091
+ height: 0;
1034
1092
  }
1035
1093
 
1036
- .jux-menu-link:hover {
1037
- background-color: var(--color-surface-hover);
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);
1038
1104
  }
1039
1105
 
1040
- .jux-menu-link-active {
1041
- background-color: #eff6ff;
1042
- color: #3b82f6;
1043
- font-weight: 600;
1106
+ .jux-radio-input:checked + .jux-radio-mark {
1107
+ border-color: var(--color-brand);
1044
1108
  }
1045
1109
 
1046
- .jux-menu-submenu {
1047
- padding-left: var(--space-2xl);
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);
1048
1119
  }
1049
1120
 
1050
- /* Modal Component - Add variants */
1051
- .jux-modal-overlay {
1052
- position: fixed;
1053
- top: 0;
1054
- left: 0;
1055
- right: 0;
1056
- bottom: 0;
1057
- background-color: rgba(0, 0, 0, 0.5);
1058
- display: flex;
1059
- align-items: center;
1060
- justify-content: center;
1061
- z-index: 1000;
1121
+ .jux-radio-input:checked + .jux-radio-mark::after {
1122
+ opacity: 1;
1123
+ transform: scale(1);
1062
1124
  }
1063
1125
 
1064
- .jux-modal {
1065
- background: var(--color-surface-elevated);
1066
- border-radius: var(--radius-lg);
1067
- box-shadow: 0 20px 25px -5px rgba(0, 0, 0, 0.2);
1068
- max-width: 600px;
1069
- width: 90%;
1070
- max-height: 90vh;
1071
- overflow-y: auto;
1126
+ .jux-radio-label-text {
1127
+ font-size: 0.875rem;
1128
+ color: var(--color-text-primary);
1072
1129
  }
1073
1130
 
1074
- .jux-modal-header {
1075
- padding: var(--space-xl);
1076
- border-bottom: var(--border-width) solid var(--color-border);
1077
- display: flex;
1078
- justify-content: space-between;
1079
- align-items: center;
1131
+ /* ============================================
1132
+ SELECT COMPONENT
1133
+ ============================================ */
1134
+ .jux-select {
1135
+ margin-bottom: var(--space-lg);
1080
1136
  }
1081
1137
 
1082
- .jux-modal-body {
1083
- padding: var(--space-xl);
1138
+ .jux-select-container {
1139
+ position: relative;
1084
1140
  }
1085
1141
 
1086
- .jux-modal-close {
1087
- background: transparent;
1088
- border: none;
1089
- font-size: 1.5rem;
1090
- cursor: pointer;
1091
- color: var(--color-text-secondary);
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);
1092
1157
  }
1093
1158
 
1094
- /* Nav Component - Add all variants */
1095
- .jux-nav-brand {
1096
- font-weight: 700;
1097
- font-size: 1.25rem;
1098
- color: var(--color-text-primary);
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);
1099
1163
  }
1100
1164
 
1101
- .jux-nav-items {
1102
- display: flex;
1103
- gap: var(--space-md);
1104
- align-items: center;
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);
1105
1175
  }
1106
1176
 
1107
- .jux-nav-item-wrapper {
1108
- position: relative;
1177
+ .jux-sidebar-left {
1178
+ /* Left-aligned sidebar */
1109
1179
  }
1110
1180
 
1111
- .jux-nav-item-active {
1112
- font-weight: 600;
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;
1113
1193
  }
1114
1194
 
1115
- .jux-nav-link {
1116
- padding: var(--space-md) var(--space-lg);
1117
- text-decoration: none;
1118
- color: var(--color-text-primary);
1119
- transition: color var(--transition-base);
1195
+ /* ============================================
1196
+ SWITCH COMPONENT
1197
+ ============================================ */
1198
+ .jux-switch {
1199
+ margin-bottom: var(--space-lg);
1120
1200
  }
1121
1201
 
1122
- .jux-nav-link:hover {
1123
- color: #3b82f6;
1202
+ .jux-switch-container {
1203
+ display: inline-flex;
1204
+ align-items: center;
1205
+ gap: var(--space-md);
1206
+ cursor: pointer;
1207
+ user-select: none;
1124
1208
  }
1125
1209
 
1126
- .jux-nav-link-active {
1127
- color: #3b82f6;
1128
- font-weight: 600;
1210
+ .jux-switch-input {
1211
+ position: absolute;
1212
+ opacity: 0;
1213
+ width: 0;
1214
+ height: 0;
1129
1215
  }
1130
1216
 
1131
- .jux-nav-tabs {
1132
- border-bottom: var(--border-width) solid var(--color-border);
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);
1133
1224
  }
1134
1225
 
1135
- .jux-nav-tabs .jux-nav-link {
1136
- border-bottom: 2px solid transparent;
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);
1137
1236
  }
1138
1237
 
1139
- .jux-nav-tabs .jux-nav-link-active {
1140
- border-bottom-color: #3b82f6;
1238
+ .jux-switch-input:checked + .jux-switch-slider {
1239
+ background: var(--color-brand);
1141
1240
  }
1142
1241
 
1143
- .jux-nav-pills .jux-nav-link {
1144
- border-radius: var(--radius-md);
1242
+ .jux-switch-input:checked + .jux-switch-slider::before {
1243
+ transform: translateX(20px);
1145
1244
  }
1146
1245
 
1147
- .jux-nav-pills .jux-nav-link-active {
1148
- background-color: #3b82f6;
1149
- color: white;
1246
+ .jux-switch-label-text {
1247
+ font-size: 0.875rem;
1248
+ color: var(--color-text-primary);
1150
1249
  }
1151
1250
 
1152
- .jux-nav-sticky {
1153
- position: sticky;
1154
- top: 0;
1155
- z-index: 100;
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);
1156
1259
  }
1157
1260
 
1158
- /* Page Helper */
1159
- .jux-page {
1160
- min-height: 100vh;
1161
- display: flex;
1162
- flex-direction: column;
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);
1163
1269
  }
1164
1270
 
1165
- /* Progress Component - Fix class name */
1166
- .jux-progress-track {
1167
- /* Alias for jux-progress-bar */
1168
- width: 100%;
1169
- height: 8px;
1170
- background-color: var(--color-surface-base);
1171
- border-radius: var(--radius-lg);
1172
- overflow: hidden;
1271
+ .jux-table-filter:focus {
1272
+ outline: none;
1273
+ background: var(--color-surface-elevated);
1173
1274
  }
1174
1275
 
1175
- /* Radio Component - Add orientation classes */
1176
- .jux-radio-horizontal {
1177
- flex-direction: row;
1178
- flex-wrap: wrap;
1276
+ .jux-table {
1277
+ width: 100%;
1278
+ border-collapse: collapse;
1179
1279
  }
1180
1280
 
1181
- .jux-radio-vertical {
1182
- flex-direction: column;
1281
+ .jux-table-bordered {
1282
+ /* Bordered table variant */
1183
1283
  }
1184
1284
 
1185
- /* Script/Style placeholders */
1186
- .jux-script-,
1187
- .jux-style- {
1188
- /* These are injected dynamically */
1285
+ .jux-table thead {
1286
+ background: var(--color-surface-base);
1287
+ border-bottom: var(--border-width) solid var(--color-border);
1189
1288
  }
1190
1289
 
1191
- /* Sidebar Component - Add toggle */
1192
- .jux-sidebar-toggle {
1193
- position: absolute;
1194
- top: var(--space-lg);
1195
- right: calc(var(--space-lg) * -1);
1196
- background: var(--color-surface-elevated);
1197
- border: var(--border-width) solid var(--color-border);
1198
- border-radius: 0 var(--radius-md) var(--radius-md) 0;
1199
- padding: var(--space-sm);
1200
- cursor: pointer;
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;
1201
1298
  }
1202
1299
 
1203
- /* Table Component - Add missing classes */
1204
- .jux-table-wrapper {
1205
- overflow-x: auto;
1206
- border: var(--border-width) solid var(--color-border);
1207
- border-radius: var(--radius-lg);
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);
1208
1305
  }
1209
1306
 
1210
- .jux-table {
1211
- width: 100%;
1212
- border-collapse: collapse;
1307
+ .jux-table tbody tr:hover {
1308
+ background: var(--color-surface-hover);
1213
1309
  }
1214
1310
 
1215
- .jux-table-striped tbody tr:nth-child(even) {
1216
- background-color: var(--color-surface-base);
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);
1217
1319
  }
1218
1320
 
1219
- .jux-table-hoverable tbody tr:hover {
1220
- background-color: var(--color-surface-hover);
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);
1221
1330
  }
1222
1331
 
1223
- .jux-table-bordered th,
1224
- .jux-table-bordered td {
1225
- border: var(--border-width) solid var(--color-border);
1332
+ .jux-table-pagination button:hover:not(:disabled) {
1333
+ background: var(--color-surface-hover);
1226
1334
  }
1227
1335
 
1228
- .jux-table-row-selected {
1229
- background-color: #eff6ff !important;
1336
+ .jux-table-pagination button:disabled {
1337
+ opacity: 0.5;
1338
+ cursor: not-allowed;
1230
1339
  }
1231
1340
 
1232
- .jux-bulk-checkbox {
1233
- margin: 0;
1341
+ .jux-table-pagination span {
1342
+ font-size: 0.875rem;
1343
+ color: var(--color-text-secondary);
1234
1344
  }
1235
1345
 
1236
- .jux-table-filter {
1237
- padding: var(--space-lg);
1238
- border-bottom: var(--border-width) solid var(--color-border);
1346
+ /* ============================================
1347
+ TABS COMPONENT
1348
+ ============================================ */
1349
+ .jux-tabs {
1350
+ margin-bottom: var(--space-lg);
1239
1351
  }
1240
1352
 
1241
- .jux-table-pagination {
1242
- padding: var(--space-lg);
1243
- border-top: var(--border-width) solid var(--color-border);
1244
- display: flex;
1245
- justify-content: center;
1246
- gap: var(--space-sm);
1353
+ .jux-tabs-default {
1354
+ /* Base tabs styles */
1247
1355
  }
1248
1356
 
1249
- /* Tabs Component */
1250
1357
  .jux-tabs-list {
1251
- display: flex;
1252
- gap: var(--space-sm);
1253
- border-bottom: var(--border-width) solid var(--color-border);
1254
- margin-bottom: var(--space-lg);
1358
+ display: flex;
1359
+ gap: var(--space-xs);
1360
+ border-bottom: var(--border-width) solid var(--color-border);
1361
+ margin-bottom: var(--space-lg);
1255
1362
  }
1256
1363
 
1257
1364
  .jux-tabs-button {
1258
- padding: var(--space-md) var(--space-lg);
1259
- background: transparent;
1260
- border: none;
1261
- border-bottom: 2px solid transparent;
1262
- cursor: pointer;
1263
- color: var(--color-text-secondary);
1264
- font-weight: 500;
1265
- transition: all var(--transition-base);
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;
1266
1376
  }
1267
1377
 
1268
1378
  .jux-tabs-button:hover {
1269
- color: var(--color-text-primary);
1379
+ color: var(--color-text-primary);
1270
1380
  }
1271
1381
 
1272
1382
  .jux-tabs-button-active {
1273
- color: #3b82f6;
1274
- border-bottom-color: #3b82f6;
1383
+ color: var(--color-brand);
1384
+ border-bottom-color: var(--color-brand);
1275
1385
  }
1276
1386
 
1277
1387
  .jux-tabs-panels {
1278
- position: relative;
1388
+ /* Tabs panels container */
1279
1389
  }
1280
1390
 
1281
1391
  .jux-tabs-panel {
1282
- display: none;
1392
+ display: none;
1393
+ animation: fadeIn 0.2s ease-in;
1283
1394
  }
1284
1395
 
1285
1396
  .jux-tabs-panel-active {
1286
- display: block;
1287
- }
1288
-
1289
- /* Theme Toggle Component */
1290
- .jux-theme {
1291
- /* Theme wrapper class */
1292
- }
1293
-
1294
- .jux-theme-toggle {
1295
- cursor: pointer;
1296
- }
1297
-
1298
- .jux-theme-toggle-button {
1299
- background: var(--color-surface-hover);
1300
- border: var(--border-width) solid var(--color-border);
1301
- padding: var(--space-sm) var(--space-md);
1302
- border-radius: var(--radius-md);
1303
- cursor: pointer;
1397
+ display: block;
1304
1398
  }
1305
1399
 
1306
- .jux-theme-toggle-dropdown {
1307
- position: absolute;
1308
- top: 100%;
1309
- right: 0;
1310
- margin-top: var(--space-xs);
1311
- background: var(--color-surface-elevated);
1312
- border: var(--border-width) solid var(--color-border);
1313
- border-radius: var(--radius-md);
1314
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
1315
- min-width: 150px;
1316
- z-index: 1000;
1400
+ @keyframes fadeIn {
1401
+ from { opacity: 0; }
1402
+ to { opacity: 1; }
1317
1403
  }
1318
1404
 
1319
- .jux-theme-toggle-select {
1320
- /* Native select styling */
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);
1321
1414
  }
1322
1415
 
1323
- .jux-theme-toggle-cycle {
1324
- /* Button that cycles through themes */
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);
1325
1420
  }
1326
1421
 
1327
- /* Token Calculator Component */
1328
- .jux-token-calculator {
1329
- background: var(--color-surface-elevated);
1330
- border: var(--border-width) solid var(--color-border);
1331
- border-radius: var(--radius-lg);
1332
- padding: var(--space-xl);
1422
+ .jux-view-title {
1423
+ font-size: 1.5rem;
1424
+ font-weight: 600;
1425
+ color: var(--color-text-primary);
1426
+ margin: 0;
1333
1427
  }
1334
1428
 
1335
- .jux-token-calculator-header {
1336
- margin-bottom: var(--space-xl);
1337
- padding-bottom: var(--space-lg);
1338
- border-bottom: var(--border-width) solid var(--color-border);
1429
+ .jux-view-content {
1430
+ padding: var(--space-xl);
1339
1431
  }
1340
1432
 
1341
- .jux-token-calculator-content {
1342
- display: flex;
1343
- flex-direction: column;
1344
- gap: var(--space-lg);
1433
+ /* ============================================
1434
+ SCROLLBARS
1435
+ ============================================ */
1436
+ #appmain::-webkit-scrollbar,
1437
+ #appaside::-webkit-scrollbar {
1438
+ width: 6px;
1345
1439
  }
1346
1440
 
1347
- .jux-token-table {
1348
- width: 100%;
1349
- border-collapse: collapse;
1441
+ #appmain::-webkit-scrollbar-track,
1442
+ #appaside::-webkit-scrollbar-track {
1443
+ background: transparent;
1350
1444
  }
1351
1445
 
1352
- .jux-token-details {
1353
- font-size: 0.875rem;
1354
- color: var(--color-text-secondary);
1446
+ #appmain::-webkit-scrollbar-thumb,
1447
+ #appaside::-webkit-scrollbar-thumb {
1448
+ background: var(--color-border);
1449
+ border-radius: 3px;
1355
1450
  }
1356
1451
 
1357
- .jux-token-row-highlight {
1358
- background-color: #fffbeb;
1452
+ #appmain::-webkit-scrollbar-thumb:hover,
1453
+ #appaside::-webkit-scrollbar-thumb:hover {
1454
+ background: var(--color-border-hover);
1359
1455
  }
1360
1456
 
1361
- .jux-token-bar-container {
1362
- display: flex;
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 {
1363
1490
  flex-direction: column;
1364
- gap: var(--space-sm);
1365
- }
1366
-
1367
- .jux-token-bar-row {
1368
- display: flex;
1369
- gap: var(--space-xs);
1370
- align-items: center;
1371
- }
1372
-
1373
- .jux-token-bar-label {
1374
- min-width: 100px;
1375
- font-size: 0.875rem;
1376
- color: var(--color-text-secondary);
1377
- }
1378
-
1379
- .jux-token-bar-jux {
1380
- height: 24px;
1381
- background: #3b82f6;
1382
- border-radius: var(--radius-sm);
1383
- }
1384
-
1385
- .jux-token-bar-other {
1386
- height: 24px;
1387
- background: #e5e7eb;
1388
- border-radius: var(--radius-sm);
1389
- }
1390
-
1391
- .jux-token-bar-value {
1392
- min-width: 60px;
1393
- text-align: right;
1394
- font-size: 0.875rem;
1395
- font-weight: 600;
1491
+ }
1396
1492
  }
1397
1493
 
1398
- /* View Component */
1399
- .jux-view {
1400
- display: flex;
1401
- flex-direction: column;
1494
+ /* ============================================
1495
+ GRID COMPONENT
1496
+ ============================================ */
1497
+ .jux-grid {
1498
+ display: grid;
1499
+ position: relative;
1402
1500
  }
1403
1501
 
1404
- .jux-view-header {
1405
- padding: var(--space-xl);
1406
- border-bottom: var(--border-width) solid var(--color-border);
1502
+ .jux-grid-cell {
1503
+ position: relative;
1504
+ overflow: auto;
1505
+ min-width: 0; /* Prevent grid blowout */
1506
+ min-height: 0;
1407
1507
  }
1408
1508
 
1409
- .jux-view-title {
1410
- font-size: 1.5rem;
1411
- font-weight: 700;
1412
- color: var(--color-text-primary);
1413
- margin-bottom: var(--space-xs);
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;
1414
1582
  }
1415
1583
 
1416
- .jux-view-description {
1417
- font-size: 0.875rem;
1418
- color: var(--color-text-secondary);
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);
1419
1587
  }
1420
1588
 
1421
- .jux-view-content {
1422
- padding: var(--space-xl);
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);
1423
1594
  }
1424
1595
 
1425
- .jux-view-item {
1426
- padding: var(--space-lg);
1427
- border-bottom: var(--border-width) solid var(--color-border);
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);
1428
1602
  }
1429
1603
 
1430
- .jux-view-item:last-child {
1431
- border-bottom: none;
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;
1432
1612
  }