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