juxscript 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/bin/cli.js +121 -72
  2. package/lib/components/alert.ts +212 -165
  3. package/lib/components/badge.ts +93 -103
  4. package/lib/components/base/BaseComponent.ts +397 -0
  5. package/lib/components/base/FormInput.ts +322 -0
  6. package/lib/components/button.ts +63 -122
  7. package/lib/components/card.ts +109 -155
  8. package/lib/components/charts/areachart.ts +315 -0
  9. package/lib/components/charts/barchart.ts +421 -0
  10. package/lib/components/charts/doughnutchart.ts +263 -0
  11. package/lib/components/charts/lib/BaseChart.ts +402 -0
  12. package/lib/components/charts/lib/chart-types.ts +159 -0
  13. package/lib/components/charts/lib/chart-utils.ts +160 -0
  14. package/lib/components/charts/lib/chart.ts +707 -0
  15. package/lib/components/checkbox.ts +264 -127
  16. package/lib/components/code.ts +75 -108
  17. package/lib/components/container.ts +113 -130
  18. package/lib/components/data.ts +37 -5
  19. package/lib/components/datepicker.ts +195 -147
  20. package/lib/components/dialog.ts +187 -157
  21. package/lib/components/divider.ts +85 -191
  22. package/lib/components/docs-data.json +544 -2027
  23. package/lib/components/dropdown.ts +178 -136
  24. package/lib/components/element.ts +227 -171
  25. package/lib/components/fileupload.ts +285 -228
  26. package/lib/components/guard.ts +92 -0
  27. package/lib/components/heading.ts +46 -69
  28. package/lib/components/helpers.ts +13 -6
  29. package/lib/components/hero.ts +107 -95
  30. package/lib/components/icon.ts +160 -0
  31. package/lib/components/icons.ts +175 -0
  32. package/lib/components/include.ts +153 -5
  33. package/lib/components/input.ts +174 -374
  34. package/lib/components/kpicard.ts +16 -16
  35. package/lib/components/list.ts +378 -240
  36. package/lib/components/loading.ts +142 -211
  37. package/lib/components/menu.ts +103 -97
  38. package/lib/components/modal.ts +138 -144
  39. package/lib/components/nav.ts +169 -90
  40. package/lib/components/paragraph.ts +49 -150
  41. package/lib/components/progress.ts +118 -200
  42. package/lib/components/radio.ts +297 -149
  43. package/lib/components/script.ts +19 -87
  44. package/lib/components/select.ts +184 -186
  45. package/lib/components/sidebar.ts +152 -140
  46. package/lib/components/style.ts +19 -82
  47. package/lib/components/switch.ts +258 -188
  48. package/lib/components/table.ts +1117 -170
  49. package/lib/components/tabs.ts +162 -145
  50. package/lib/components/theme-toggle.ts +108 -169
  51. package/lib/components/tooltip.ts +86 -157
  52. package/lib/components/write.ts +108 -127
  53. package/lib/jux.ts +86 -41
  54. package/machinery/build.js +466 -0
  55. package/machinery/compiler.js +354 -105
  56. package/machinery/server.js +23 -100
  57. package/machinery/watcher.js +153 -130
  58. package/package.json +1 -2
  59. package/presets/base.css +1166 -0
  60. package/presets/notion.css +2 -1975
  61. package/lib/adapters/base-adapter.js +0 -35
  62. package/lib/adapters/index.js +0 -33
  63. package/lib/adapters/mysql-adapter.js +0 -65
  64. package/lib/adapters/postgres-adapter.js +0 -70
  65. package/lib/adapters/sqlite-adapter.js +0 -56
  66. package/lib/components/areachart.ts +0 -1246
  67. package/lib/components/areachartsmooth.ts +0 -1380
  68. package/lib/components/barchart.ts +0 -1250
  69. package/lib/components/chart.ts +0 -127
  70. package/lib/components/doughnutchart.ts +0 -1191
  71. package/lib/components/footer.ts +0 -165
  72. package/lib/components/header.ts +0 -187
  73. package/lib/components/layout.ts +0 -239
  74. package/lib/components/main.ts +0 -137
  75. package/lib/layouts/default.jux +0 -8
  76. package/lib/layouts/figma.jux +0 -0
  77. /package/lib/{themes → components/charts/lib}/charts.js +0 -0
@@ -1,7 +1,7 @@
1
1
  /**
2
- * Notion Preset - Theming Only
2
+ * Notion Preset - Complete Theme & Layout
3
3
  * Light/Dark mode via [data-theme] attribute
4
- * Layout should be handled by separate layout presets
4
+ * Includes Notion-inspired layout system
5
5
  */
6
6
 
7
7
  /* ============================================
@@ -125,1976 +125,3 @@
125
125
  --shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.7);
126
126
  --shadow-glow: 0 0 30px rgba(56, 189, 248, 0.2);
127
127
  }
128
-
129
- /* ============================================
130
- GLOBAL STYLES
131
- ============================================ */
132
- * {
133
- margin: 0;
134
- padding: 0;
135
- box-sizing: border-box;
136
- }
137
-
138
- body {
139
- font-family: var(--font-family-base);
140
- font-size: var(--font-size-base);
141
- line-height: var(--line-height-normal);
142
- color: var(--color-text-primary);
143
- background: var(--color-background);
144
- transition: background-color var(--transition-base), color var(--transition-base);
145
- -webkit-font-smoothing: antialiased;
146
- -moz-osx-font-smoothing: grayscale;
147
- }
148
-
149
- a {
150
- color: var(--color-brand);
151
- text-decoration: none;
152
- transition: color var(--transition-fast);
153
- position: relative;
154
- }
155
-
156
- a:hover {
157
- color: var(--color-brand-hover);
158
- }
159
-
160
- /* Subtle underline animation for links */
161
- a:not(.jux-button):not(.jux-menu-item)::after {
162
- content: '';
163
- position: absolute;
164
- bottom: -2px;
165
- left: 0;
166
- width: 0;
167
- height: 1px;
168
- background: var(--color-brand);
169
- transition: width var(--transition-base);
170
- }
171
-
172
- a:not(.jux-button):not(.jux-menu-item):hover::after {
173
- width: 100%;
174
- }
175
-
176
- button {
177
- font-family: inherit;
178
- cursor: pointer;
179
- }
180
-
181
- input, textarea, select {
182
- font-family: inherit;
183
- font-size: inherit;
184
- }
185
-
186
- h1, h2, h3, h4, h5, h6 {
187
- font-weight: var(--font-weight-semibold);
188
- line-height: var(--line-height-tight);
189
- color: var(--color-text-primary);
190
- }
191
-
192
- h1 { font-size: var(--font-size-3xl); letter-spacing: -0.02em; }
193
- h2 { font-size: var(--font-size-2xl); letter-spacing: -0.01em; }
194
- h3 { font-size: var(--font-size-xl); }
195
- h4 { font-size: var(--font-size-lg); }
196
- h5 { font-size: var(--font-size-base); }
197
- h6 { font-size: var(--font-size-sm); }
198
-
199
- /* ============================================
200
- THEME TOGGLE - Enhanced
201
- ============================================ */
202
- .jux-theme-toggle {
203
- display: inline-flex;
204
- align-items: center;
205
- gap: var(--space-sm);
206
- }
207
-
208
- .jux-theme-toggle-button {
209
- padding: var(--space-sm);
210
- background: transparent;
211
- border: none;
212
- border-radius: var(--radius-md);
213
- cursor: pointer;
214
- font-size: 1.25rem;
215
- line-height: 1;
216
- transition: all var(--transition-bounce);
217
- color: var(--color-text-tertiary);
218
- display: flex;
219
- align-items: center;
220
- justify-content: center;
221
- width: 2rem;
222
- height: 2rem;
223
- position: relative;
224
- }
225
-
226
- .jux-theme-toggle-button:hover {
227
- background: var(--color-surface-hover);
228
- color: var(--color-text-primary);
229
- transform: scale(1.1) rotate(10deg);
230
- }
231
-
232
- .jux-theme-toggle-button:active {
233
- transform: scale(0.95);
234
- }
235
-
236
- [data-theme="light"] .jux-theme-toggle-button {
237
- color: #f59e0b;
238
- }
239
-
240
- [data-theme="dark"] .jux-theme-toggle-button {
241
- color: #fbbf24;
242
- }
243
-
244
- /* ============================================
245
- HEADER COMPONENT - Enhanced
246
- ============================================ */
247
- .jux-header {
248
- display: flex;
249
- align-items: center;
250
- gap: var(--space-lg);
251
- padding: 0 var(--space-xl);
252
- height: 48px;
253
- background: var(--color-surface-elevated);
254
- border-bottom: var(--border-width) solid var(--color-border);
255
- backdrop-filter: blur(10px);
256
- position: sticky;
257
- top: 0;
258
- z-index: 100;
259
- }
260
-
261
- .jux-header-title {
262
- font-size: var(--font-size-lg);
263
- font-weight: var(--font-weight-semibold);
264
- color: var(--color-text-primary);
265
- margin: 0;
266
- letter-spacing: -0.01em;
267
- }
268
-
269
- .jux-header-nav {
270
- display: flex;
271
- gap: var(--space-xs);
272
- margin-left: auto;
273
- align-items: center;
274
- }
275
-
276
- .jux-header-nav-link {
277
- color: var(--color-text-secondary);
278
- text-decoration: none;
279
- transition: all var(--transition-fast);
280
- padding: var(--space-sm) var(--space-md);
281
- border-radius: var(--radius-md);
282
- font-weight: var(--font-weight-medium);
283
- font-size: var(--font-size-sm);
284
- position: relative;
285
- }
286
-
287
- .jux-header-nav-link::after {
288
- display: none;
289
- }
290
-
291
- .jux-header-nav-link:hover {
292
- color: var(--color-text-primary);
293
- background: var(--color-surface-hover);
294
- transform: translateY(-1px);
295
- }
296
-
297
- .jux-header-nav-link.active {
298
- color: var(--color-brand);
299
- background: var(--color-brand-subtle);
300
- }
301
-
302
- /* ============================================
303
- SIDEBAR COMPONENT - Enhanced
304
- ============================================ */
305
- .jux-sidebar {
306
- height: 100%;
307
- overflow-y: auto;
308
- background: var(--color-surface-base);
309
- }
310
-
311
- .jux-sidebar-heading {
312
- font-size: var(--font-size-xs);
313
- text-transform: uppercase;
314
- color: var(--color-text-tertiary);
315
- margin: var(--space-lg) var(--space-md) var(--space-sm);
316
- font-weight: var(--font-weight-semibold);
317
- letter-spacing: 0.05em;
318
- }
319
-
320
- .jux-sidebar-link {
321
- display: flex;
322
- align-items: center;
323
- gap: var(--space-md);
324
- padding: var(--space-sm) var(--space-md);
325
- color: var(--color-text-secondary);
326
- text-decoration: none;
327
- border-radius: var(--radius-md);
328
- transition: all var(--transition-fast);
329
- margin: 1px var(--space-sm);
330
- font-weight: var(--font-weight-medium);
331
- font-size: var(--font-size-sm);
332
- position: relative;
333
- overflow: hidden;
334
- }
335
-
336
- .jux-sidebar-link::after {
337
- display: none;
338
- }
339
-
340
- .jux-sidebar-link::before {
341
- content: '';
342
- position: absolute;
343
- left: 0;
344
- top: 0;
345
- width: 3px;
346
- height: 100%;
347
- background: var(--color-brand);
348
- transform: translateX(-100%);
349
- transition: transform var(--transition-fast);
350
- }
351
-
352
- .jux-sidebar-link:hover {
353
- background: var(--color-surface-elevated);
354
- color: var(--color-text-primary);
355
- transform: translateX(2px);
356
- }
357
-
358
- .jux-sidebar-link.active,
359
- .jux-sidebar-link-active {
360
- background: var(--color-brand-subtle);
361
- color: var(--color-brand);
362
- font-weight: var(--font-weight-semibold);
363
- }
364
-
365
- .jux-sidebar-link.active::before,
366
- .jux-sidebar-link-active::before {
367
- transform: translateX(0);
368
- }
369
-
370
- /* ============================================
371
- FOOTER COMPONENT
372
- ============================================ */
373
- .jux-footer {
374
- display: flex;
375
- align-items: center;
376
- justify-content: space-between;
377
- padding: 0 var(--space-xl);
378
- min-height: 32px;
379
- background: var(--color-surface-elevated);
380
- border-top: var(--border-width) solid var(--color-border);
381
- color: var(--color-text-tertiary);
382
- font-size: var(--font-size-xs);
383
- }
384
-
385
- /* ============================================
386
- CARD COMPONENT - Enhanced
387
- ============================================ */
388
- .jux-card {
389
- background: var(--color-surface-elevated);
390
- border: var(--border-width) solid var(--color-border);
391
- border-radius: var(--radius-lg);
392
- padding: var(--space-xl);
393
- transition: all var(--transition-base);
394
- position: relative;
395
- overflow: hidden;
396
- }
397
-
398
- .jux-card::before {
399
- content: '';
400
- position: absolute;
401
- top: 0;
402
- left: 0;
403
- right: 0;
404
- height: 2px;
405
- background: linear-gradient(90deg, var(--color-brand), var(--color-info));
406
- transform: translateY(-100%);
407
- transition: transform var(--transition-base);
408
- }
409
-
410
- .jux-card:hover {
411
- box-shadow: var(--shadow-lg);
412
- border-color: var(--color-border-hover);
413
- transform: translateY(-2px);
414
- }
415
-
416
- .jux-card:hover::before {
417
- transform: translateY(0);
418
- }
419
-
420
- .jux-card-title {
421
- font-size: var(--font-size-xl);
422
- font-weight: var(--font-weight-semibold);
423
- margin: 0 0 var(--space-md) 0;
424
- color: var(--color-text-primary);
425
- letter-spacing: -0.01em;
426
- }
427
-
428
- .jux-card-body {
429
- font-size: var(--font-size-sm);
430
- color: var(--color-text-secondary);
431
- line-height: var(--line-height-relaxed);
432
- }
433
-
434
- /* ============================================
435
- BUTTON COMPONENT - Enhanced
436
- ============================================ */
437
- .jux-button {
438
- padding: var(--space-sm) var(--space-lg);
439
- border: var(--border-width) solid var(--color-border);
440
- border-radius: var(--radius-md);
441
- cursor: pointer;
442
- font-size: var(--font-size-sm);
443
- background: var(--color-surface-elevated);
444
- color: var(--color-text-primary);
445
- font-weight: var(--font-weight-medium);
446
- transition: all var(--transition-fast);
447
- display: inline-flex;
448
- align-items: center;
449
- justify-content: center;
450
- gap: var(--space-sm);
451
- position: relative;
452
- overflow: hidden;
453
- }
454
-
455
- .jux-button::before {
456
- content: '';
457
- position: absolute;
458
- top: 50%;
459
- left: 50%;
460
- width: 0;
461
- height: 0;
462
- border-radius: var(--radius-full);
463
- background: rgba(255, 255, 255, 0.1);
464
- transform: translate(-50%, -50%);
465
- transition: width var(--transition-slow), height var(--transition-slow);
466
- }
467
-
468
- .jux-button:hover::before {
469
- width: 300px;
470
- height: 300px;
471
- }
472
-
473
- .jux-button:hover {
474
- background: var(--color-surface-hover);
475
- border-color: var(--color-border-hover);
476
- transform: translateY(-1px);
477
- box-shadow: var(--shadow-sm);
478
- }
479
-
480
- .jux-button-primary {
481
- background: var(--color-brand);
482
- color: var(--color-text-inverse);
483
- border-color: var(--color-brand);
484
- }
485
-
486
- .jux-button-primary:hover {
487
- background: var(--color-brand-hover);
488
- border-color: var(--color-brand-hover);
489
- box-shadow: var(--shadow-md), var(--shadow-glow);
490
- transform: translateY(-2px);
491
- }
492
-
493
- .jux-button:active {
494
- transform: translateY(0);
495
- }
496
-
497
- .jux-button:disabled {
498
- opacity: 0.5;
499
- cursor: not-allowed;
500
- transform: none;
501
- }
502
-
503
- /* ============================================
504
- INPUT COMPONENT - Enhanced
505
- ============================================ */
506
- .jux-input-wrapper {
507
- display: flex;
508
- flex-direction: column;
509
- gap: var(--space-xs);
510
- margin-bottom: var(--space-lg);
511
- }
512
-
513
- .jux-input-label {
514
- display: block;
515
- margin-bottom: var(--space-xs);
516
- font-size: var(--font-size-sm);
517
- font-weight: var(--font-weight-medium);
518
- color: var(--color-text-primary);
519
- }
520
-
521
- .jux-input {
522
- margin-bottom: var(--space-lg);
523
- width: 100%;
524
- padding: var(--space-sm) var(--space-md);
525
- font-size: var(--font-size-sm);
526
- background: var(--color-surface-elevated);
527
- border: var(--border-width) solid var(--color-border);
528
- border-radius: var(--radius-md);
529
- color: var(--color-text-primary);
530
- transition: all var(--transition-fast);
531
- box-sizing: border-box;
532
- font-family: inherit;
533
- }
534
-
535
- .jux-input:hover {
536
- border-color: var(--color-border-hover);
537
- box-shadow: var(--shadow-xs);
538
- }
539
-
540
- .jux-input:focus {
541
- outline: none;
542
- border-color: var(--color-border-focus);
543
- box-shadow: 0 0 0 3px var(--color-brand-subtle), var(--shadow-sm);
544
- transform: translateY(-1px);
545
- }
546
-
547
- .jux-input::placeholder {
548
- color: var(--color-text-tertiary);
549
- }
550
-
551
- .jux-input-required {
552
- color: var(--color-danger);
553
- margin-left: 2px;
554
- }
555
-
556
- .jux-input-element {
557
- width: 100%;
558
- padding: var(--space-sm) var(--space-md);
559
- font-size: var(--font-size-sm);
560
- background: var(--color-surface-elevated);
561
- border: var(--border-width) solid var(--color-border);
562
- border-radius: var(--radius-md);
563
- color: var(--color-text-primary);
564
- transition: all var(--transition-fast);
565
- box-sizing: border-box;
566
- font-family: inherit;
567
- }
568
-
569
- .jux-input-element:hover {
570
- border-color: var(--color-border-hover);
571
- box-shadow: var(--shadow-xs);
572
- }
573
-
574
- .jux-input-element:focus {
575
- outline: none;
576
- border-color: var(--color-border-focus);
577
- box-shadow: 0 0 0 3px var(--color-brand-subtle), var(--shadow-sm);
578
- transform: translateY(-1px);
579
- }
580
-
581
- .jux-input-element:disabled {
582
- background: var(--color-surface-base);
583
- color: var(--color-text-tertiary);
584
- cursor: not-allowed;
585
- opacity: 0.6;
586
- }
587
-
588
- .jux-input-element::placeholder {
589
- color: var(--color-text-tertiary);
590
- }
591
-
592
- .jux-input-element.jux-input-invalid {
593
- border-color: var(--color-danger);
594
- }
595
-
596
- .jux-input-element.jux-input-invalid:focus {
597
- box-shadow: 0 0 0 3px rgba(220, 38, 38, 0.1);
598
- }
599
-
600
- .jux-input-error {
601
- color: var(--color-danger);
602
- font-size: var(--font-size-xs);
603
- margin-top: var(--space-xs);
604
- display: none;
605
- }
606
-
607
- .jux-input-counter {
608
- text-align: right;
609
- font-size: var(--font-size-xs);
610
- color: var(--color-text-tertiary);
611
- margin-top: var(--space-xs);
612
- }
613
-
614
- /* Textarea specific */
615
- textarea.jux-input-element {
616
- resize: vertical;
617
- min-height: 80px;
618
- line-height: var(--line-height-relaxed);
619
- }
620
-
621
- /* ============================================
622
- SELECT COMPONENT - Enhanced
623
- ============================================ */
624
- .jux-select {
625
- margin-bottom: var(--space-lg);
626
- }
627
-
628
- .jux-select-label {
629
- display: block;
630
- margin-bottom: var(--space-xs);
631
- font-size: var(--font-size-sm);
632
- font-weight: var(--font-weight-medium);
633
- color: var(--color-text-primary);
634
- }
635
-
636
- .jux-select-element {
637
- width: 100%;
638
- padding: var(--space-sm) var(--space-md);
639
- font-size: var(--font-size-sm);
640
- background: var(--color-surface-elevated);
641
- border: var(--border-width) solid var(--color-border);
642
- border-radius: var(--radius-md);
643
- color: var(--color-text-primary);
644
- cursor: pointer;
645
- transition: all var(--transition-fast);
646
- box-sizing: border-box;
647
- font-family: inherit;
648
- appearance: none;
649
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%2371717a' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
650
- background-repeat: no-repeat;
651
- background-position: right 12px center;
652
- padding-right: 36px;
653
- }
654
-
655
- .jux-select-element:hover {
656
- border-color: var(--color-border-hover);
657
- box-shadow: var(--shadow-xs);
658
- }
659
-
660
- .jux-select-element:focus {
661
- outline: none;
662
- border-color: var(--color-border-focus);
663
- box-shadow: 0 0 0 3px var(--color-brand-subtle), var(--shadow-sm);
664
- transform: translateY(-1px);
665
- }
666
-
667
- .jux-select-element:disabled {
668
- background: var(--color-surface-base);
669
- color: var(--color-text-tertiary);
670
- cursor: not-allowed;
671
- opacity: 0.6;
672
- }
673
-
674
- .jux-select-element option {
675
- background: var(--color-surface-elevated);
676
- color: var(--color-text-primary);
677
- }
678
-
679
- .jux-select-element option:disabled {
680
- color: var(--color-text-tertiary);
681
- }
682
-
683
- /* Dark mode dropdown arrow */
684
- [data-theme="dark"] .jux-select-element {
685
- background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23a1a1aa' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
686
- }
687
-
688
- /* ============================================
689
- CHECKBOX COMPONENT - Enhanced
690
- ============================================ */
691
- .jux-checkbox {
692
- margin-bottom: var(--space-md);
693
- }
694
-
695
- .jux-checkbox-label {
696
- display: inline-flex;
697
- align-items: center;
698
- gap: var(--space-sm);
699
- cursor: pointer;
700
- user-select: none;
701
- transition: transform var(--transition-fast);
702
- }
703
-
704
- .jux-checkbox-label:hover {
705
- transform: translateX(2px);
706
- }
707
-
708
- .jux-checkbox-input {
709
- appearance: none;
710
- width: 18px;
711
- height: 18px;
712
- border: var(--border-width) solid var(--color-border);
713
- border-radius: var(--radius-sm);
714
- background: var(--color-surface-elevated);
715
- cursor: pointer;
716
- transition: all var(--transition-bounce);
717
- position: relative;
718
- flex-shrink: 0;
719
- }
720
-
721
- .jux-checkbox-input:hover {
722
- border-color: var(--color-border-hover);
723
- box-shadow: var(--shadow-xs);
724
- transform: scale(1.05);
725
- }
726
-
727
- .jux-checkbox-input:focus {
728
- outline: none;
729
- border-color: var(--color-border-focus);
730
- box-shadow: 0 0 0 3px var(--color-brand-subtle);
731
- }
732
-
733
- .jux-checkbox-input:checked {
734
- background: var(--color-brand);
735
- border-color: var(--color-brand);
736
- animation: checkBounce var(--transition-bounce);
737
- }
738
-
739
- @keyframes checkBounce {
740
- 0%, 100% { transform: scale(1); }
741
- 50% { transform: scale(1.15); }
742
- }
743
-
744
- .jux-checkbox-input:checked::after {
745
- content: '';
746
- position: absolute;
747
- left: 5px;
748
- top: 2px;
749
- width: 5px;
750
- height: 9px;
751
- border: solid white;
752
- border-width: 0 2px 2px 0;
753
- transform: rotate(45deg);
754
- animation: checkSlide 0.2s ease-out;
755
- }
756
-
757
- @keyframes checkSlide {
758
- from {
759
- transform: translateY(-5px) rotate(45deg);
760
- opacity: 0;
761
- }
762
- to {
763
- transform: translateY(0) rotate(45deg);
764
- opacity: 1;
765
- }
766
- }
767
-
768
- .jux-checkbox-input:disabled {
769
- background: var(--color-surface-base);
770
- border-color: var(--color-border);
771
- cursor: not-allowed;
772
- opacity: 0.5;
773
- }
774
-
775
- .jux-checkbox-text {
776
- font-size: var(--font-size-sm);
777
- color: var(--color-text-primary);
778
- font-weight: var(--font-weight-medium);
779
- }
780
-
781
- /* ============================================
782
- RADIO COMPONENT - Enhanced
783
- ============================================ */
784
- .jux-radio-vertical {
785
- display: flex;
786
- flex-direction: column;
787
- gap: var(--space-sm);
788
- margin-bottom: var(--space-lg);
789
- }
790
-
791
- .jux-radio-horizontal {
792
- display: flex;
793
- flex-direction: row;
794
- flex-wrap: wrap;
795
- gap: var(--space-lg);
796
- margin-bottom: var(--space-lg);
797
- }
798
-
799
- .jux-radio-label {
800
- display: inline-flex;
801
- align-items: center;
802
- gap: var(--space-sm);
803
- cursor: pointer;
804
- user-select: none;
805
- transition: transform var(--transition-fast);
806
- }
807
-
808
- .jux-radio-label:hover {
809
- transform: translateX(2px);
810
- }
811
-
812
- .jux-radio-input {
813
- appearance: none;
814
- width: 18px;
815
- height: 18px;
816
- border: var(--border-width) solid var(--color-border);
817
- border-radius: var(--radius-full);
818
- background: var(--color-surface-elevated);
819
- cursor: pointer;
820
- transition: all var(--transition-bounce);
821
- position: relative;
822
- flex-shrink: 0;
823
- }
824
-
825
- .jux-radio-input:hover {
826
- border-color: var(--color-border-hover);
827
- box-shadow: var(--shadow-xs);
828
- transform: scale(1.05);
829
- }
830
-
831
- .jux-radio-input:focus {
832
- outline: none;
833
- border-color: var(--color-border-focus);
834
- box-shadow: 0 0 0 3px var(--color-brand-subtle);
835
- }
836
-
837
- .jux-radio-input:checked {
838
- border-color: var(--color-brand);
839
- border-width: 5px;
840
- animation: radioPulse var(--transition-bounce);
841
- }
842
-
843
- @keyframes radioPulse {
844
- 0%, 100% { transform: scale(1); }
845
- 50% { transform: scale(1.15); }
846
- }
847
-
848
- .jux-radio-input:disabled {
849
- background: var(--color-surface-base);
850
- border-color: var(--color-border);
851
- cursor: not-allowed;
852
- opacity: 0.5;
853
- }
854
-
855
- .jux-radio-text {
856
- font-size: var(--font-size-sm);
857
- color: var(--color-text-primary);
858
- font-weight: var(--font-weight-medium);
859
- }
860
-
861
- /* ============================================
862
- FILE UPLOAD COMPONENT - Enhanced
863
- ============================================ */
864
- .jux-fileupload {
865
- margin-bottom: var(--space-lg);
866
- }
867
-
868
- .jux-fileupload-input {
869
- display: none;
870
- }
871
-
872
- .jux-fileupload-dropzone {
873
- border: 2px dashed var(--color-border);
874
- border-radius: var(--radius-lg);
875
- padding: var(--space-3xl) var(--space-2xl);
876
- text-align: center;
877
- cursor: pointer;
878
- transition: all var(--transition-base);
879
- background: var(--color-surface-base);
880
- position: relative;
881
- overflow: hidden;
882
- }
883
-
884
- .jux-fileupload-dropzone::before {
885
- content: '';
886
- position: absolute;
887
- top: -100%;
888
- left: 0;
889
- right: 0;
890
- bottom: 0;
891
- background: linear-gradient(180deg, transparent, var(--color-brand-muted));
892
- transition: top var(--transition-base);
893
- }
894
-
895
- .jux-fileupload-dropzone:hover {
896
- border-color: var(--color-brand);
897
- background: var(--color-brand-subtle);
898
- transform: scale(1.02);
899
- }
900
-
901
- .jux-fileupload-dropzone:hover::before {
902
- top: 0;
903
- }
904
-
905
- .jux-fileupload-dropzone-active {
906
- border-color: var(--color-brand);
907
- background: var(--color-brand-subtle);
908
- border-style: solid;
909
- transform: scale(1.02);
910
- }
911
-
912
- .jux-fileupload-icon {
913
- font-size: 3rem;
914
- margin-bottom: var(--space-md);
915
- position: relative;
916
- z-index: 1;
917
- animation: float 3s ease-in-out infinite;
918
- }
919
-
920
- @keyframes float {
921
- 0%, 100% { transform: translateY(0); }
922
- 50% { transform: translateY(-10px); }
923
- }
924
-
925
- .jux-fileupload-text {
926
- font-size: var(--font-size-sm);
927
- color: var(--color-text-secondary);
928
- font-weight: var(--font-weight-medium);
929
- position: relative;
930
- z-index: 1;
931
- }
932
-
933
- .jux-fileupload-list {
934
- margin-top: var(--space-md);
935
- display: flex;
936
- flex-direction: column;
937
- gap: var(--space-sm);
938
- }
939
-
940
- .jux-fileupload-file {
941
- display: flex;
942
- align-items: center;
943
- gap: var(--space-md);
944
- padding: var(--space-sm) var(--space-md);
945
- background: var(--color-surface-elevated);
946
- border: var(--border-width) solid var(--color-border);
947
- border-radius: var(--radius-md);
948
- transition: all var(--transition-fast);
949
- animation: slideIn var(--transition-base);
950
- }
951
-
952
- @keyframes slideIn {
953
- from {
954
- opacity: 0;
955
- transform: translateX(-20px);
956
- }
957
- to {
958
- opacity: 1;
959
- transform: translateX(0);
960
- }
961
- }
962
-
963
- .jux-fileupload-file:hover {
964
- box-shadow: var(--shadow-sm);
965
- transform: translateX(2px);
966
- }
967
-
968
- .jux-fileupload-file-name {
969
- flex: 1;
970
- font-size: var(--font-size-sm);
971
- color: var(--color-text-primary);
972
- font-weight: var(--font-weight-medium);
973
- overflow: hidden;
974
- text-overflow: ellipsis;
975
- white-space: nowrap;
976
- }
977
-
978
- .jux-fileupload-file-size {
979
- font-size: var(--font-size-xs);
980
- color: var(--color-text-tertiary);
981
- flex-shrink: 0;
982
- }
983
-
984
- .jux-fileupload-file-remove {
985
- background: none;
986
- border: none;
987
- color: var(--color-text-tertiary);
988
- font-size: var(--font-size-xl);
989
- line-height: 1;
990
- cursor: pointer;
991
- padding: 0;
992
- width: 20px;
993
- height: 20px;
994
- display: flex;
995
- align-items: center;
996
- justify-content: center;
997
- border-radius: var(--radius-sm);
998
- transition: all var(--transition-fast);
999
- flex-shrink: 0;
1000
- }
1001
-
1002
- .jux-fileupload-file-remove:hover {
1003
- background: var(--color-surface-hover);
1004
- color: var(--color-danger);
1005
- transform: rotate(90deg) scale(1.2);
1006
- }
1007
-
1008
- /* ============================================
1009
- PROGRESS COMPONENT - Enhanced
1010
- ============================================ */
1011
- .jux-progress {
1012
- display: flex;
1013
- flex-direction: column;
1014
- gap: var(--space-xs);
1015
- width: 100%;
1016
- }
1017
-
1018
- .jux-progress-label {
1019
- font-size: var(--font-size-sm);
1020
- font-weight: var(--font-weight-medium);
1021
- color: var(--color-text-secondary);
1022
- display: flex;
1023
- justify-content: space-between;
1024
- align-items: center;
1025
- }
1026
-
1027
- .jux-progress-track {
1028
- width: 100%;
1029
- background: var(--color-surface-base);
1030
- border-radius: var(--radius-full);
1031
- overflow: hidden;
1032
- position: relative;
1033
- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.05);
1034
- }
1035
-
1036
- .jux-progress-bar {
1037
- height: 100%;
1038
- background: linear-gradient(90deg, var(--color-brand), var(--color-info));
1039
- border-radius: var(--radius-full);
1040
- transition: width var(--transition-slow);
1041
- position: relative;
1042
- overflow: hidden;
1043
- }
1044
-
1045
- .jux-progress-bar::after {
1046
- content: '';
1047
- position: absolute;
1048
- top: 0;
1049
- left: 0;
1050
- bottom: 0;
1051
- right: 0;
1052
- background: linear-gradient(
1053
- 90deg,
1054
- transparent,
1055
- rgba(255, 255, 255, 0.3),
1056
- transparent
1057
- );
1058
- animation: shimmer 2s infinite;
1059
- }
1060
-
1061
- @keyframes shimmer {
1062
- 0% { transform: translateX(-100%); }
1063
- 100% { transform: translateX(100%); }
1064
- }
1065
-
1066
- /* Size variants */
1067
- .jux-progress-sm .jux-progress-track {
1068
- height: 4px;
1069
- }
1070
-
1071
- .jux-progress-md .jux-progress-track {
1072
- height: 8px;
1073
- }
1074
-
1075
- .jux-progress-lg .jux-progress-track {
1076
- height: 12px;
1077
- }
1078
-
1079
- /* Color variants */
1080
- .jux-progress-bar-default {
1081
- background: linear-gradient(90deg, var(--color-brand), var(--color-info));
1082
- }
1083
-
1084
- .jux-progress-bar-success {
1085
- background: linear-gradient(90deg, var(--color-success), #10b981);
1086
- }
1087
-
1088
- .jux-progress-bar-warning {
1089
- background: linear-gradient(90deg, var(--color-warning), #f59e0b);
1090
- }
1091
-
1092
- .jux-progress-bar-error {
1093
- background: linear-gradient(90deg, var(--color-danger), #ef4444);
1094
- }
1095
-
1096
- .jux-progress-bar-info {
1097
- background: linear-gradient(90deg, var(--color-info), #3b82f6);
1098
- }
1099
-
1100
- /* Striped variant */
1101
- .jux-progress-bar-striped {
1102
- background-image: linear-gradient(
1103
- 45deg,
1104
- rgba(255, 255, 255, 0.15) 25%,
1105
- transparent 25%,
1106
- transparent 50%,
1107
- rgba(255, 255, 255, 0.15) 50%,
1108
- rgba(255, 255, 255, 0.15) 75%,
1109
- transparent 75%,
1110
- transparent
1111
- );
1112
- background-size: 1rem 1rem;
1113
- }
1114
-
1115
- /* Animated variant */
1116
- .jux-progress-bar-animated {
1117
- animation: jux-progress-stripes 1s linear infinite;
1118
- }
1119
-
1120
- @keyframes jux-progress-stripes {
1121
- 0% {
1122
- background-position: 1rem 0;
1123
- }
1124
- 100% {
1125
- background-position: 0 0;
1126
- }
1127
- }
1128
-
1129
- /* Dark theme adjustments */
1130
- [data-theme="dark"] .jux-progress-track {
1131
- background: var(--color-surface-elevated);
1132
- }
1133
-
1134
- /* ============================================
1135
- HEADING COMPONENT
1136
- ============================================ */
1137
- .jux-heading {
1138
- margin-bottom: var(--space-lg);
1139
- }
1140
-
1141
- /* Override default heading styles if needed */
1142
- h1.jux-heading,
1143
- h2.jux-heading,
1144
- h3.jux-heading,
1145
- h4.jux-heading,
1146
- h5.jux-heading,
1147
- h6.jux-heading {
1148
- margin: 0 0 var(--space-md) 0;
1149
- }
1150
-
1151
- /* ============================================
1152
- MENU/NAV COMPONENT - Enhanced
1153
- ============================================ */
1154
- .jux-menu {
1155
- list-style: none;
1156
- padding: var(--space-xs);
1157
- margin: 0;
1158
- }
1159
-
1160
- .jux-menu-item {
1161
- display: flex;
1162
- align-items: center;
1163
- gap: var(--space-md);
1164
- padding: var(--space-sm) var(--space-md);
1165
- cursor: pointer;
1166
- border-radius: var(--radius-md);
1167
- transition: all var(--transition-fast);
1168
- color: var(--color-text-secondary);
1169
- font-size: var(--font-size-sm);
1170
- font-weight: var(--font-weight-medium);
1171
- text-decoration: none;
1172
- position: relative;
1173
- }
1174
-
1175
- .jux-menu-item::after {
1176
- display: none;
1177
- }
1178
-
1179
- .jux-menu-item::before {
1180
- content: '';
1181
- position: absolute;
1182
- left: 0;
1183
- top: 0;
1184
- width: 3px;
1185
- height: 100%;
1186
- background: var(--color-brand);
1187
- transform: translateX(-100%);
1188
- transition: transform var(--transition-fast);
1189
- border-radius: 0 var(--radius-sm) var(--radius-sm) 0;
1190
- }
1191
-
1192
- .jux-menu-item:hover {
1193
- background: var(--color-surface-elevated);
1194
- color: var(--color-text-primary);
1195
- transform: translateX(2px);
1196
- }
1197
-
1198
- .jux-menu-item.active,
1199
- .jux-menu-item-active {
1200
- background: var(--color-brand-subtle);
1201
- color: var(--color-brand);
1202
- font-weight: var(--font-weight-semibold);
1203
- }
1204
-
1205
- .jux-menu-item.active::before,
1206
- .jux-menu-item-active::before {
1207
- transform: translateX(0);
1208
- }
1209
-
1210
- /* ============================================
1211
- MODAL COMPONENT - Enhanced
1212
- ============================================ */
1213
- .jux-modal {
1214
- position: fixed;
1215
- top: 0;
1216
- left: 0;
1217
- right: 0;
1218
- bottom: 0;
1219
- z-index: 2000;
1220
- display: none;
1221
- align-items: center;
1222
- justify-content: center;
1223
- animation: fadeIn var(--transition-base);
1224
- }
1225
-
1226
- @keyframes fadeIn {
1227
- from { opacity: 0; }
1228
- to { opacity: 1; }
1229
- }
1230
-
1231
- .jux-modal.active {
1232
- display: flex;
1233
- }
1234
-
1235
- .jux-modal-overlay {
1236
- position: absolute;
1237
- top: 0;
1238
- left: 0;
1239
- right: 0;
1240
- bottom: 0;
1241
- background: rgba(0, 0, 0, 0.5);
1242
- backdrop-filter: blur(8px);
1243
- }
1244
-
1245
- .jux-modal-dialog {
1246
- position: relative;
1247
- background: var(--color-surface-elevated);
1248
- border-radius: var(--radius-xl);
1249
- box-shadow: var(--shadow-xl);
1250
- max-width: 90vw;
1251
- max-height: 90vh;
1252
- overflow: auto;
1253
- border: var(--border-width) solid var(--color-border);
1254
- animation: modalSlideUp var(--transition-base);
1255
- }
1256
-
1257
- @keyframes modalSlideUp {
1258
- from {
1259
- opacity: 0;
1260
- transform: translateY(20px);
1261
- }
1262
- to {
1263
- opacity: 1;
1264
- transform: translateY(0);
1265
- }
1266
- }
1267
-
1268
- .jux-modal-header {
1269
- display: flex;
1270
- align-items: center;
1271
- justify-content: space-between;
1272
- padding: var(--space-lg) var(--space-xl);
1273
- border-bottom: var(--border-width) solid var(--color-border);
1274
- }
1275
-
1276
- .jux-modal-title {
1277
- font-size: var(--font-size-xl);
1278
- font-weight: var(--font-weight-semibold);
1279
- letter-spacing: -0.01em;
1280
- }
1281
-
1282
- .jux-modal-close {
1283
- background: none;
1284
- border: none;
1285
- font-size: var(--font-size-xl);
1286
- cursor: pointer;
1287
- color: var(--color-text-tertiary);
1288
- padding: var(--space-xs);
1289
- border-radius: var(--radius-md);
1290
- transition: all var(--transition-fast);
1291
- }
1292
-
1293
- .jux-modal-close:hover {
1294
- background: var(--color-surface-hover);
1295
- color: var(--color-text-primary);
1296
- transform: rotate(90deg);
1297
- }
1298
-
1299
- .jux-modal-body {
1300
- padding: var(--space-xl);
1301
- }
1302
-
1303
- /* ============================================
1304
- TABLE COMPONENT - Enhanced
1305
- ============================================ */
1306
- .jux-table {
1307
- width: 100%;
1308
- border-collapse: collapse;
1309
- font-size: var(--font-size-sm);
1310
- }
1311
-
1312
- .jux-table th {
1313
- background: var(--color-surface-base);
1314
- padding: var(--space-md) var(--space-lg);
1315
- text-align: left;
1316
- font-weight: var(--font-weight-semibold);
1317
- border-bottom: 2px solid var(--color-border);
1318
- color: var(--color-text-primary);
1319
- font-size: var(--font-size-xs);
1320
- text-transform: uppercase;
1321
- letter-spacing: 0.05em;
1322
- position: sticky;
1323
- top: 0;
1324
- z-index: 10;
1325
- }
1326
-
1327
- .jux-table td {
1328
- padding: var(--space-md) var(--space-lg);
1329
- border-bottom: var(--border-width) solid var(--color-border);
1330
- color: var(--color-text-secondary);
1331
- transition: all var(--transition-fast);
1332
- }
1333
-
1334
- .jux-table tr {
1335
- transition: all var(--transition-fast);
1336
- }
1337
-
1338
- .jux-table tr:hover {
1339
- background: var(--color-surface-hover);
1340
- transform: scale(1.01);
1341
- }
1342
-
1343
- .jux-table tr:last-child td {
1344
- border-bottom: none;
1345
- }
1346
-
1347
- /* ============================================
1348
- CODE COMPONENT - Enhanced
1349
- ============================================ */
1350
- .jux-code-container {
1351
- background: var(--color-surface-elevated);
1352
- border: var(--border-width) solid var(--color-border);
1353
- border-radius: var(--radius-lg);
1354
- overflow: hidden;
1355
- margin: var(--space-lg) 0;
1356
- box-shadow: var(--shadow-sm);
1357
- }
1358
-
1359
- .jux-code-pre {
1360
- margin: 0;
1361
- padding: var(--space-lg);
1362
- font-family: var(--font-family-mono);
1363
- font-size: 13px;
1364
- line-height: 1.6;
1365
- overflow-x: auto;
1366
- }
1367
-
1368
- /* ============================================
1369
- SCROLLBAR STYLING - Enhanced
1370
- ============================================ */
1371
- ::-webkit-scrollbar {
1372
- width: 8px;
1373
- height: 8px;
1374
- }
1375
-
1376
- ::-webkit-scrollbar-track {
1377
- background: transparent;
1378
- }
1379
-
1380
- ::-webkit-scrollbar-thumb {
1381
- background: var(--color-border);
1382
- border-radius: var(--radius-full);
1383
- transition: background var(--transition-fast);
1384
- }
1385
-
1386
- ::-webkit-scrollbar-thumb:hover {
1387
- background: var(--color-border-hover);
1388
- }
1389
-
1390
- ::-webkit-scrollbar-thumb:active {
1391
- background: var(--color-brand);
1392
- }
1393
-
1394
- /* Firefox scrollbar */
1395
- * {
1396
- scrollbar-width: thin;
1397
- scrollbar-color: var(--color-border) transparent;
1398
- }
1399
-
1400
- /* ============================================
1401
- UTILITIES - Enhanced
1402
- ============================================ */
1403
- .jux-grid {
1404
- display: grid;
1405
- gap: var(--space-lg);
1406
- grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
1407
- }
1408
-
1409
- .jux-stack {
1410
- display: flex;
1411
- flex-direction: column;
1412
- gap: var(--space-md);
1413
- }
1414
-
1415
- .jux-stack-horizontal {
1416
- flex-direction: row;
1417
- }
1418
-
1419
- /* Fade in animation utility */
1420
- @keyframes fadeInUp {
1421
- from {
1422
- opacity: 0;
1423
- transform: translateY(10px);
1424
- }
1425
- to {
1426
- opacity: 1;
1427
- transform: translateY(0);
1428
- }
1429
- }
1430
-
1431
- .jux-fade-in {
1432
- animation: fadeInUp var(--transition-base);
1433
- }
1434
-
1435
- /* ============================================
1436
- RESPONSIVE FONT SIZING
1437
- ============================================ */
1438
-
1439
- /* Mobile */
1440
- @media (max-width: 768px) {
1441
- :root {
1442
- --font-size-xs: 0.7rem;
1443
- --font-size-sm: 0.8rem;
1444
- --font-size-base: 0.9rem;
1445
- --font-size-lg: 1rem;
1446
- --font-size-xl: 1.1rem;
1447
- --font-size-2xl: 1.3rem;
1448
- --font-size-3xl: 1.75rem;
1449
- }
1450
-
1451
- .jux-theme-toggle-button {
1452
- width: 2.25rem;
1453
- height: 2.25rem;
1454
- font-size: 1.25rem;
1455
- }
1456
- }
1457
-
1458
- /* ============================================
1459
- SMOOTH TRANSITIONS
1460
- ============================================ */
1461
- body,
1462
- .jux-theme-toggle-button,
1463
- .jux-input-element,
1464
- .jux-select-element,
1465
- .jux-checkbox-input,
1466
- .jux-radio-input,
1467
- .jux-fileupload-dropzone {
1468
- transition: background-color var(--transition-base),
1469
- border-color var(--transition-base),
1470
- color var(--transition-base);
1471
- }
1472
-
1473
- /* ============================================
1474
- BADGE COMPONENT
1475
- ============================================ */
1476
- .jux-badge {
1477
- display: inline-flex;
1478
- align-items: center;
1479
- padding: var(--space-xs) var(--space-sm);
1480
- font-size: var(--font-size-xs);
1481
- font-weight: var(--font-weight-semibold);
1482
- border-radius: var(--radius-sm);
1483
- line-height: 1;
1484
- text-transform: uppercase;
1485
- letter-spacing: 0.025em;
1486
- transition: all var(--transition-fast);
1487
- }
1488
-
1489
- .jux-badge-default {
1490
- background: var(--color-surface-active);
1491
- color: var(--color-text-primary);
1492
- }
1493
-
1494
- .jux-badge-success {
1495
- background: #dcfce7;
1496
- color: #166534;
1497
- }
1498
-
1499
- [data-theme="dark"] .jux-badge-success {
1500
- background: #14532d;
1501
- color: #86efac;
1502
- }
1503
-
1504
- .jux-badge-warning {
1505
- background: #fed7aa;
1506
- color: #9a3412;
1507
- }
1508
-
1509
- [data-theme="dark"] .jux-badge-warning {
1510
- background: #7c2d12;
1511
- color: #fdba74;
1512
- }
1513
-
1514
- .jux-badge-error {
1515
- background: #fecaca;
1516
- color: #991b1b;
1517
- }
1518
-
1519
- [data-theme="dark"] .jux-badge-error {
1520
- background: #7f1d1d;
1521
- color: #fca5a5;
1522
- }
1523
-
1524
- .jux-badge-info {
1525
- background: #dbeafe;
1526
- color: #1e40af;
1527
- }
1528
-
1529
- [data-theme="dark"] .jux-badge-info {
1530
- background: #1e3a8a;
1531
- color: #93c5fd;
1532
- }
1533
-
1534
- .jux-badge-pill {
1535
- border-radius: var(--radius-full);
1536
- padding: var(--space-xs) var(--space-md);
1537
- }
1538
-
1539
- /* ============================================
1540
- SWITCH COMPONENT
1541
- ============================================ */
1542
- .jux-switch {
1543
- margin-bottom: var(--space-md);
1544
- }
1545
-
1546
- .jux-switch-label {
1547
- display: inline-flex;
1548
- align-items: center;
1549
- gap: var(--space-sm);
1550
- cursor: pointer;
1551
- user-select: none;
1552
- }
1553
-
1554
- .jux-switch-input {
1555
- appearance: none;
1556
- width: 40px;
1557
- height: 22px;
1558
- background: var(--color-border);
1559
- border-radius: var(--radius-full);
1560
- position: relative;
1561
- cursor: pointer;
1562
- transition: all var(--transition-fast);
1563
- flex-shrink: 0;
1564
- }
1565
-
1566
- .jux-switch-input:hover {
1567
- background: var(--color-border-hover);
1568
- }
1569
-
1570
- .jux-switch-input::before {
1571
- content: '';
1572
- position: absolute;
1573
- top: 2px;
1574
- left: 2px;
1575
- width: 18px;
1576
- height: 18px;
1577
- background: white;
1578
- border-radius: var(--radius-full);
1579
- transition: all var(--transition-fast);
1580
- box-shadow: var(--shadow-sm);
1581
- }
1582
-
1583
- .jux-switch-input:checked {
1584
- background: var(--color-brand);
1585
- }
1586
-
1587
- .jux-switch-input:checked::before {
1588
- left: 20px;
1589
- }
1590
-
1591
- .jux-switch-input:focus {
1592
- outline: none;
1593
- box-shadow: 0 0 0 3px var(--color-brand-subtle);
1594
- }
1595
-
1596
- .jux-switch-input:disabled {
1597
- opacity: 0.5;
1598
- cursor: not-allowed;
1599
- }
1600
-
1601
- .jux-switch-text {
1602
- font-size: var(--font-size-sm);
1603
- color: var(--color-text-primary);
1604
- font-weight: var(--font-weight-medium);
1605
- }
1606
-
1607
- /* ============================================
1608
- DATEPICKER COMPONENT
1609
- ============================================ */
1610
- .jux-datepicker {
1611
- margin-bottom: var(--space-lg);
1612
- }
1613
-
1614
- .jux-datepicker-label {
1615
- display: block;
1616
- margin-bottom: var(--space-xs);
1617
- font-size: var(--font-size-sm);
1618
- font-weight: var(--font-weight-medium);
1619
- color: var(--color-text-primary);
1620
- }
1621
-
1622
- .jux-datepicker-input {
1623
- width: 100%;
1624
- padding: var(--space-sm) var(--space-md);
1625
- font-size: var(--font-size-sm);
1626
- background: var(--color-surface-elevated);
1627
- border: var(--border-width) solid var(--color-border);
1628
- border-radius: var(--radius-md);
1629
- color: var(--color-text-primary);
1630
- cursor: pointer;
1631
- transition: all var(--transition-fast);
1632
- box-sizing: border-box;
1633
- font-family: inherit;
1634
- }
1635
-
1636
- .jux-datepicker-input:hover {
1637
- border-color: var(--color-border-hover);
1638
- box-shadow: var(--shadow-xs);
1639
- }
1640
-
1641
- .jux-datepicker-input:focus {
1642
- outline: none;
1643
- border-color: var(--color-border-focus);
1644
- box-shadow: 0 0 0 3px var(--color-brand-subtle), var(--shadow-sm);
1645
- transform: translateY(-1px);
1646
- }
1647
-
1648
- .jux-datepicker-input:disabled {
1649
- background: var(--color-surface-base);
1650
- color: var(--color-text-tertiary);
1651
- cursor: not-allowed;
1652
- opacity: 0.6;
1653
- }
1654
-
1655
- /* ============================================
1656
- DROPDOWN COMPONENT
1657
- ============================================ */
1658
- .jux-dropdown {
1659
- position: relative;
1660
- display: inline-block;
1661
- }
1662
-
1663
- .jux-dropdown-trigger {
1664
- padding: var(--space-sm) var(--space-lg);
1665
- background: var(--color-surface-elevated);
1666
- border: var(--border-width) solid var(--color-border);
1667
- border-radius: var(--radius-md);
1668
- color: var(--color-text-primary);
1669
- font-size: var(--font-size-sm);
1670
- font-weight: var(--font-weight-medium);
1671
- cursor: pointer;
1672
- transition: all var(--transition-fast);
1673
- display: inline-flex;
1674
- align-items: center;
1675
- gap: var(--space-sm);
1676
- }
1677
-
1678
- .jux-dropdown-trigger:hover {
1679
- background: var(--color-surface-hover);
1680
- border-color: var(--color-border-hover);
1681
- transform: translateY(-1px);
1682
- box-shadow: var(--shadow-sm);
1683
- }
1684
-
1685
- .jux-dropdown-menu {
1686
- position: absolute;
1687
- top: calc(100% + 4px);
1688
- min-width: 200px;
1689
- background: var(--color-surface-elevated);
1690
- border: var(--border-width) solid var(--color-border);
1691
- border-radius: var(--radius-lg);
1692
- box-shadow: var(--shadow-lg);
1693
- padding: var(--space-xs);
1694
- opacity: 0;
1695
- visibility: hidden;
1696
- transform: translateY(-10px);
1697
- transition: all var(--transition-fast);
1698
- z-index: 1000;
1699
- }
1700
-
1701
- .jux-dropdown-menu.active {
1702
- opacity: 1;
1703
- visibility: visible;
1704
- transform: translateY(0);
1705
- }
1706
-
1707
- .jux-dropdown-menu-left {
1708
- left: 0;
1709
- }
1710
-
1711
- .jux-dropdown-menu-right {
1712
- right: 0;
1713
- }
1714
-
1715
- .jux-dropdown-item {
1716
- display: flex;
1717
- align-items: center;
1718
- gap: var(--space-sm);
1719
- padding: var(--space-sm) var(--space-md);
1720
- color: var(--color-text-primary);
1721
- font-size: var(--font-size-sm);
1722
- border-radius: var(--radius-md);
1723
- cursor: pointer;
1724
- transition: all var(--transition-fast);
1725
- white-space: nowrap;
1726
- }
1727
-
1728
- .jux-dropdown-item:hover {
1729
- background: var(--color-surface-hover);
1730
- transform: translateX(2px);
1731
- }
1732
-
1733
- .jux-dropdown-divider {
1734
- height: 1px;
1735
- background: var(--color-border);
1736
- margin: var(--space-xs) 0;
1737
- }
1738
-
1739
- /* ============================================
1740
- ALERT COMPONENT
1741
- ============================================ */
1742
- .jux-alert {
1743
- display: flex;
1744
- align-items: flex-start;
1745
- gap: var(--space-md);
1746
- padding: var(--space-md) var(--space-lg);
1747
- border-radius: var(--radius-lg);
1748
- margin-bottom: var(--space-lg);
1749
- border-left: 3px solid;
1750
- animation: slideIn var(--transition-base);
1751
- }
1752
-
1753
- .jux-alert-icon {
1754
- font-size: var(--font-size-xl);
1755
- flex-shrink: 0;
1756
- }
1757
-
1758
- .jux-alert-content {
1759
- flex: 1;
1760
- }
1761
-
1762
- .jux-alert-message {
1763
- font-size: var(--font-size-sm);
1764
- line-height: var(--line-height-relaxed);
1765
- margin: 0;
1766
- }
1767
-
1768
- .jux-alert-close {
1769
- background: none;
1770
- border: none;
1771
- font-size: var(--font-size-lg);
1772
- cursor: pointer;
1773
- padding: 0;
1774
- width: 20px;
1775
- height: 20px;
1776
- display: flex;
1777
- align-items: center;
1778
- justify-content: center;
1779
- border-radius: var(--radius-sm);
1780
- transition: all var(--transition-fast);
1781
- flex-shrink: 0;
1782
- color: inherit;
1783
- opacity: 0.6;
1784
- }
1785
-
1786
- .jux-alert-close:hover {
1787
- opacity: 1;
1788
- background: rgba(0, 0, 0, 0.1);
1789
- }
1790
-
1791
- .jux-alert-success {
1792
- background: #dcfce7;
1793
- border-color: var(--color-success);
1794
- color: #166534;
1795
- }
1796
-
1797
- [data-theme="dark"] .jux-alert-success {
1798
- background: #14532d;
1799
- color: #86efac;
1800
- }
1801
-
1802
- .jux-alert-info {
1803
- background: #dbeafe;
1804
- border-color: var(--color-info);
1805
- color: #1e40af;
1806
- }
1807
-
1808
- [data-theme="dark"] .jux-alert-info {
1809
- background: #1e3a8a;
1810
- color: #93c5fd;
1811
- }
1812
-
1813
- .jux-alert-warning {
1814
- background: #fed7aa;
1815
- border-color: var(--color-warning);
1816
- color: #9a3412;
1817
- }
1818
-
1819
- [data-theme="dark"] .jux-alert-warning {
1820
- background: #7c2d12;
1821
- color: #fdba74;
1822
- }
1823
-
1824
- .jux-alert-error {
1825
- background: #fecaca;
1826
- border-color: var(--color-danger);
1827
- color: #991b1b;
1828
- }
1829
-
1830
- [data-theme="dark"] .jux-alert-error {
1831
- background: #7f1d1d;
1832
- color: #fca5a5;
1833
- }
1834
-
1835
- /* ============================================
1836
- LOADING COMPONENT
1837
- ============================================ */
1838
- .jux-loading {
1839
- display: inline-flex;
1840
- align-items: center;
1841
- justify-content: center;
1842
- }
1843
-
1844
- /* Spinner variant */
1845
- .jux-loading-spinner {
1846
- width: 40px;
1847
- height: 40px;
1848
- border: 3px solid var(--color-surface-active);
1849
- border-top-color: var(--color-brand);
1850
- border-radius: var(--radius-full);
1851
- animation: spin 0.8s linear infinite;
1852
- }
1853
-
1854
- @keyframes spin {
1855
- to { transform: rotate(360deg); }
1856
- }
1857
-
1858
- /* Dots variant */
1859
- .jux-loading-dots {
1860
- display: flex;
1861
- gap: var(--space-sm);
1862
- }
1863
-
1864
- .jux-loading-dot {
1865
- width: 12px;
1866
- height: 12px;
1867
- background: var(--color-brand);
1868
- border-radius: var(--radius-full);
1869
- animation: bounce 1.4s infinite ease-in-out both;
1870
- }
1871
-
1872
- .jux-loading-dot:nth-child(1) {
1873
- animation-delay: -0.32s;
1874
- }
1875
-
1876
- .jux-loading-dot:nth-child(2) {
1877
- animation-delay: -0.16s;
1878
- }
1879
-
1880
- @keyframes bounce {
1881
- 0%, 80%, 100% {
1882
- transform: scale(0);
1883
- opacity: 0.5;
1884
- }
1885
- 40% {
1886
- transform: scale(1);
1887
- opacity: 1;
1888
- }
1889
- }
1890
-
1891
- /* Pulse variant */
1892
- .jux-loading-pulse {
1893
- width: 40px;
1894
- height: 40px;
1895
- background: var(--color-brand);
1896
- border-radius: var(--radius-full);
1897
- animation: pulse 1.4s cubic-bezier(0.4, 0, 0.6, 1) infinite;
1898
- }
1899
-
1900
- @keyframes pulse {
1901
- 0%, 100% {
1902
- opacity: 1;
1903
- }
1904
- 50% {
1905
- opacity: 0.3;
1906
- }
1907
- }
1908
-
1909
- /* ============================================
1910
- TOOLTIP COMPONENT
1911
- ============================================ */
1912
- .jux-tooltip {
1913
- position: absolute;
1914
- background: var(--color-surface-elevated);
1915
- color: var(--color-text-primary);
1916
- padding: var(--space-xs) var(--space-sm);
1917
- font-size: var(--font-size-xs);
1918
- border-radius: var(--radius-md);
1919
- box-shadow: var(--shadow-lg);
1920
- border: var(--border-width) solid var(--color-border);
1921
- white-space: nowrap;
1922
- pointer-events: none;
1923
- opacity: 0;
1924
- transition: opacity var(--transition-fast);
1925
- z-index: 9999;
1926
- }
1927
-
1928
- .jux-tooltip.active {
1929
- opacity: 1;
1930
- }
1931
-
1932
- .jux-tooltip::before {
1933
- content: '';
1934
- position: absolute;
1935
- width: 0;
1936
- height: 0;
1937
- border: 5px solid transparent;
1938
- }
1939
-
1940
- /* Top */
1941
- .jux-tooltip-top {
1942
- transform: translateX(-50%) translateY(-8px);
1943
- }
1944
-
1945
- .jux-tooltip-top::before {
1946
- bottom: -10px;
1947
- left: 50%;
1948
- transform: translateX(-50%);
1949
- border-top-color: var(--color-border);
1950
- }
1951
-
1952
- /* Bottom */
1953
- .jux-tooltip-bottom {
1954
- transform: translateX(-50%) translateY(8px);
1955
- }
1956
-
1957
- .jux-tooltip-bottom::before {
1958
- top: -10px;
1959
- left: 50%;
1960
- transform: translateX(-50%);
1961
- border-bottom-color: var(--color-border);
1962
- }
1963
-
1964
- /* Left */
1965
- .jux-tooltip-left {
1966
- transform: translateX(-8px) translateY(-50%);
1967
- }
1968
-
1969
- .jux-tooltip-left::before {
1970
- right: -10px;
1971
- top: 50%;
1972
- transform: translateY(-50%);
1973
- border-left-color: var(--color-border);
1974
- }
1975
-
1976
- /* Right */
1977
- .jux-tooltip-right {
1978
- transform: translateX(8px) translateY(-50%);
1979
- }
1980
-
1981
- .jux-tooltip-right::before {
1982
- left: -10px;
1983
- top: 50%;
1984
- transform: translateY(-50%);
1985
- border-right-color: var(--color-border);
1986
- }
1987
-
1988
- /* ============================================
1989
- DIALOG COMPONENT
1990
- ============================================ */
1991
- .jux-dialog {
1992
- position: fixed;
1993
- top: 0;
1994
- left: 0;
1995
- right: 0;
1996
- bottom: 0;
1997
- z-index: 2000;
1998
- display: none;
1999
- align-items: center;
2000
- justify-content: center;
2001
- animation: fadeIn var(--transition-base);
2002
- }
2003
-
2004
- .jux-dialog.active {
2005
- display: flex;
2006
- }
2007
-
2008
- .jux-dialog-overlay {
2009
- position: absolute;
2010
- top: 0;
2011
- left: 0;
2012
- right: 0;
2013
- bottom: 0;
2014
- background: rgba(0, 0, 0, 0.5);
2015
- backdrop-filter: blur(8px);
2016
- }
2017
-
2018
- .jux-dialog-content {
2019
- position: relative;
2020
- background: var(--color-surface-elevated);
2021
- border-radius: var(--radius-xl);
2022
- box-shadow: var(--shadow-xl);
2023
- max-width: 500px;
2024
- width: 90vw;
2025
- border: var(--border-width) solid var(--color-border);
2026
- animation: modalSlideUp var(--transition-base);
2027
- }
2028
-
2029
- .jux-dialog-header {
2030
- padding: var(--space-lg) var(--space-xl);
2031
- border-bottom: var(--border-width) solid var(--color-border);
2032
- }
2033
-
2034
- .jux-dialog-title {
2035
- font-size: var(--font-size-xl);
2036
- font-weight: var(--font-weight-semibold);
2037
- color: var(--color-text-primary);
2038
- margin: 0;
2039
- }
2040
-
2041
- .jux-dialog-body {
2042
- padding: var(--space-xl);
2043
- }
2044
-
2045
- .jux-dialog-message {
2046
- font-size: var(--font-size-sm);
2047
- color: var(--color-text-secondary);
2048
- line-height: var(--line-height-relaxed);
2049
- margin: 0;
2050
- }
2051
-
2052
- .jux-dialog-footer {
2053
- padding: var(--space-lg) var(--space-xl);
2054
- border-top: var(--border-width) solid var(--color-border);
2055
- display: flex;
2056
- gap: var(--space-sm);
2057
- justify-content: flex-end;
2058
- }
2059
-
2060
- /* Dialog variants */
2061
- .jux-dialog-danger .jux-dialog-title {
2062
- color: var(--color-danger);
2063
- }
2064
-
2065
- .jux-dialog-warning .jux-dialog-title {
2066
- color: var(--color-warning);
2067
- }
2068
-
2069
- /* ============================================
2070
- SECTION SPACING
2071
- ============================================ */
2072
- .section {
2073
- margin-bottom: var(--space-3xl);
2074
- padding-bottom: var(--space-xl);
2075
- }
2076
-
2077
- .section:not(:last-child) {
2078
- border-bottom: var(--border-width) solid var(--color-border);
2079
- }
2080
-
2081
- .section h2 {
2082
- margin-bottom: var(--space-lg);
2083
- color: var(--color-text-primary);
2084
- }
2085
-
2086
- .section h3 {
2087
- margin-top: var(--space-xl);
2088
- margin-bottom: var(--space-md);
2089
- color: var(--color-text-primary);
2090
- }
2091
-
2092
- /* ============================================
2093
- BADGE GROUP SPACING
2094
- ============================================ */
2095
- .badge-group {
2096
- display: flex;
2097
- gap: var(--space-sm);
2098
- flex-wrap: wrap;
2099
- margin-top: var(--space-md);
2100
- }