juxscript 1.1.245 → 1.1.246

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 (36) hide show
  1. package/dist/lib/components/dataframe.d.ts +1 -0
  2. package/dist/lib/components/dataframe.d.ts.map +1 -0
  3. package/dist/lib/components/dataframe.js +1 -0
  4. package/dist/lib/components/include.d.ts +86 -0
  5. package/dist/lib/components/include.d.ts.map +1 -0
  6. package/{lib/components/include.ts → dist/lib/components/include.js} +57 -100
  7. package/dist/lib/components/tag.d.ts +27 -0
  8. package/dist/lib/components/tag.d.ts.map +1 -0
  9. package/{lib/components/tag.ts → dist/lib/components/tag.js} +14 -25
  10. package/dist/lib/index.d.ts +17 -0
  11. package/dist/lib/index.d.ts.map +1 -0
  12. package/{index.js → dist/lib/index.js} +4 -2
  13. package/dist/lib/utils/codeparser.d.ts +29 -0
  14. package/dist/lib/utils/codeparser.d.ts.map +1 -0
  15. package/{lib/utils/codeparser.ts → dist/lib/utils/codeparser.js} +64 -91
  16. package/dist/lib/utils/fetch.d.ts +176 -0
  17. package/dist/lib/utils/fetch.d.ts.map +1 -0
  18. package/{lib/utils/fetch.ts → dist/lib/utils/fetch.js} +80 -206
  19. package/dist/lib/utils/formatId.d.ts +16 -0
  20. package/dist/lib/utils/formatId.d.ts.map +1 -0
  21. package/{lib/utils/formatId.ts → dist/lib/utils/formatId.js} +7 -8
  22. package/dist/lib/utils/idgen.d.ts +2 -0
  23. package/dist/lib/utils/idgen.d.ts.map +1 -0
  24. package/{lib/utils/idgen.ts → dist/lib/utils/idgen.js} +2 -4
  25. package/package.json +2 -7
  26. package/lib/components/dataframe.ts +0 -0
  27. package/lib/styles/animations.css +0 -218
  28. package/lib/styles/foundation.css +0 -542
  29. package/lib/styles/gradients.css +0 -326
  30. package/lib/styles/link.css +0 -158
  31. package/lib/styles/modal.css +0 -402
  32. package/lib/styles/modifiers.css +0 -103
  33. package/lib/styles/nav.css +0 -322
  34. package/lib/styles/shadcn.css +0 -960
  35. package/lib/styles/stacks.css +0 -132
  36. package/lib/styles/themes.css +0 -486
@@ -1,960 +0,0 @@
1
- @import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap');
2
-
3
- /* ═══════════════════════════════════════════════════════════════════
4
- * DESIGN TOKENS
5
- * ═══════════════════════════════════════════════════════════════════ */
6
-
7
- :root {
8
- --background: 0 0% 100%;
9
- --foreground: 0 0% 3.9%;
10
- --muted: 0 0% 96.1%;
11
- --muted-foreground: 0 0% 45.1%;
12
- --border: 0 0% 89.8%;
13
- --input: 0 0% 89.8%;
14
- --ring: 0 0% 3.9%;
15
- --primary: 0 0% 9%;
16
- --primary-foreground: 0 0% 98%;
17
- --secondary: 0 0% 96.1%;
18
- --secondary-foreground: 0 0% 9%;
19
- --accent: 0 0% 96.1%;
20
- --accent-foreground: 0 0% 9%;
21
- --destructive: 0 84.2% 60.2%;
22
- --destructive-foreground: 0 0% 98%;
23
- --success: 142 71% 45%;
24
- --success-foreground: 0 0% 98%;
25
- --warning: 48 96% 53%;
26
- --warning-foreground: 0 0% 9%;
27
- --radius: 0.5rem;
28
- font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
29
- }
30
-
31
- .dark {
32
- --background: 0 0% 3.9%;
33
- --foreground: 0 0% 98%;
34
- --muted: 0 0% 14.9%;
35
- --muted-foreground: 0 0% 63.9%;
36
- --border: 0 0% 14.9%;
37
- --input: 0 0% 14.9%;
38
- --ring: 0 0% 83.1%;
39
- --primary: 0 0% 98%;
40
- --primary-foreground: 0 0% 9%;
41
- --secondary: 0 0% 14.9%;
42
- --secondary-foreground: 0 0% 98%;
43
- --accent: 0 0% 14.9%;
44
- --accent-foreground: 0 0% 98%;
45
- }
46
-
47
- /* ═══════════════════════════════════════════════════════════════════
48
- * BASE INPUTS
49
- * ═══════════════════════════════════════════════════════════════════ */
50
-
51
- .jux-input-element,
52
- .jux-table-filter,
53
- .jux-dataframe-filter-input {
54
- height: 2.5rem;
55
- width: 100%;
56
- border-radius: var(--radius);
57
- border: 1px solid hsl(var(--input));
58
- background: hsl(var(--background));
59
- padding: 0.5rem 0.75rem;
60
- font-size: 0.875rem;
61
- color: hsl(var(--foreground));
62
- outline: none !important;
63
- transition: border-color 0.2s, box-shadow 0.2s;
64
- }
65
-
66
- .jux-input-element::placeholder,
67
- .jux-table-filter::placeholder,
68
- .jux-dataframe-filter-input::placeholder {
69
- color: hsl(var(--muted-foreground));
70
- }
71
-
72
- .jux-input-element:focus,
73
- .jux-table-filter:focus,
74
- .jux-dataframe-filter-input:focus {
75
- border-color: hsl(var(--ring));
76
- box-shadow: 0 0 0 3px hsl(var(--ring) / 0.1);
77
- }
78
-
79
- /* ═══════════════════════════════════════════════════════════════════
80
- * BUTTONS
81
- * ═══════════════════════════════════════════════════════════════════ */
82
-
83
- .jux-button,
84
- .jux-modal-action,
85
- .jux-table-pagination button,
86
- .jux-fileupload-button {
87
- display: inline-flex;
88
- align-items: center;
89
- justify-content: center;
90
- white-space: nowrap;
91
- border-radius: var(--radius);
92
- font-size: 0.875rem;
93
- font-weight: 500;
94
- height: 2.5rem;
95
- padding: 0 1rem;
96
- cursor: pointer;
97
- transition: all 0.2s;
98
- border: none;
99
- background: hsl(var(--primary));
100
- color: hsl(var(--primary-foreground));
101
- }
102
-
103
- .jux-button:hover,
104
- .jux-table-pagination button:hover:not(:disabled) {
105
- opacity: 0.9;
106
- }
107
-
108
- .jux-button:disabled,
109
- .jux-table-pagination button:disabled {
110
- pointer-events: none;
111
- opacity: 0.5;
112
- }
113
-
114
- .jux-button-outline,
115
- .jux-fileupload-button {
116
- border: 1px solid hsl(var(--input));
117
- background: hsl(var(--background));
118
- color: hsl(var(--foreground));
119
- }
120
-
121
- .jux-button-outline:hover,
122
- .jux-fileupload-button:hover {
123
- background: hsl(var(--accent));
124
- }
125
-
126
- .jux-button-ghost {
127
- background: transparent;
128
- color: hsl(var(--foreground));
129
- }
130
-
131
- .jux-button-ghost:hover {
132
- background: hsl(var(--accent));
133
- }
134
-
135
- /* ═══════════════════════════════════════════════════════════════════
136
- * TYPOGRAPHY
137
- * ═══════════════════════════════════════════════════════════════════ */
138
-
139
- h1, h2, h3, h4, h5, h6 {
140
- font-weight: 600;
141
- letter-spacing: -0.025em;
142
- color: hsl(var(--foreground));
143
- }
144
-
145
- h1 { font-size: 2.25rem; font-weight: 800; }
146
- h2 { font-size: 1.875rem; padding-bottom: 0.5rem; border-bottom: 1px solid hsl(var(--border)); }
147
- h3 { font-size: 1.5rem; }
148
- h4 { font-size: 1.25rem; }
149
-
150
- p { line-height: 1.75; color: hsl(var(--foreground)); }
151
-
152
- /* ═══════════════════════════════════════════════════════════════════
153
- * DATAFRAME
154
- * ═══════════════════════════════════════════════════════════════════ */
155
-
156
- .jux-dataframe {
157
- display: flex;
158
- flex-direction: column;
159
- gap: 1rem;
160
- width: 100%;
161
- min-width: 0;
162
- max-width: 100%;
163
- overflow: hidden;
164
- /* ✅ Card-like container to visually partition each dataframe */
165
- padding: 1rem;
166
- border: 1px solid hsl(var(--border));
167
- border-radius: var(--radius);
168
- background: hsl(var(--background));
169
- box-shadow: 0 1px 3px hsl(0 0% 0% / 0.04);
170
- }
171
-
172
- /* ✅ Ensure table respects dataframe container */
173
- .jux-dataframe .jux-table-wrapper {
174
- min-width: 0;
175
- max-width: 100%;
176
- overflow-x: auto;
177
- }
178
-
179
- .jux-dataframe .jux-table {
180
- min-width: 0;
181
- }
182
-
183
- /* ✅ NEW: Enhanced upload area */
184
- .jux-dataframe-upload-area {
185
- display: flex;
186
- flex-direction: column;
187
- align-items: flex-start;
188
- gap: 0.5rem;
189
- padding: 0.5rem;
190
- background: transparent;
191
- border: none;
192
- border-radius: 0;
193
- transition: all 0.2s;
194
- }
195
-
196
- .jux-dataframe-upload-area:hover {
197
- background: transparent;
198
- }
199
-
200
- .jux-dataframe-upload-area:has(.jux-fileupload-filelist:not(:empty)) {
201
- background: transparent;
202
- border: none;
203
- }
204
-
205
- .jux-dataframe-upload {
206
- display: flex;
207
- align-items: center;
208
- gap: 0.75rem;
209
- }
210
-
211
- .jux-dataframe-upload-description {
212
- font-size: 0.8125rem;
213
- color: hsl(var(--muted-foreground));
214
- line-height: 1.4;
215
- }
216
-
217
- /* ✅ Style the fileupload button inside dataframe */
218
- .jux-dataframe-upload .jux-fileupload {
219
- display: flex;
220
- align-items: center;
221
- gap: 0.75rem;
222
- }
223
-
224
- .jux-dataframe-upload .jux-fileupload-button {
225
- display: inline-flex;
226
- align-items: center;
227
- gap: 0.5rem;
228
- padding: 0.5rem 1rem;
229
- font-weight: 500;
230
- border-radius: var(--radius);
231
- transition: all 0.15s;
232
- }
233
-
234
- .jux-dataframe-upload .jux-fileupload-button:hover {
235
- background: hsl(var(--accent));
236
- }
237
-
238
- /* ✅ File list styling inside dataframe */
239
- .jux-dataframe-upload .jux-fileupload-filelist {
240
- margin-top: 0;
241
- }
242
-
243
- .jux-dataframe-upload .jux-fileupload-item {
244
- background: hsl(var(--background));
245
- border: 1px solid hsl(var(--border));
246
- padding: 0.5rem 0.75rem;
247
- font-size: 0.8125rem;
248
- }
249
-
250
- .jux-dataframe-status {
251
- display: flex;
252
- align-items: center;
253
- gap: 0.5rem;
254
- padding: 0.75rem 1rem;
255
- font-size: 0.875rem;
256
- font-weight: 500;
257
- border-radius: var(--radius);
258
- border: 1px solid hsl(var(--border));
259
- background: hsl(var(--muted) / 0.5);
260
- color: hsl(var(--muted-foreground));
261
- }
262
-
263
- .jux-dataframe-status-success {
264
- background: hsl(var(--success) / 0.1);
265
- border-color: hsl(var(--success) / 0.2);
266
- color: hsl(var(--success));
267
- }
268
-
269
- .jux-dataframe-status-warning {
270
- background: hsl(var(--warning) / 0.1);
271
- border-color: hsl(var(--warning) / 0.3);
272
- color: hsl(var(--warning-foreground));
273
- }
274
-
275
- .jux-dataframe-status-loading {
276
- background: hsl(var(--warning) / 0.1);
277
- border-color: hsl(var(--warning) / 0.2);
278
- color: hsl(var(--warning));
279
- }
280
-
281
- .jux-dataframe-status-error {
282
- background: hsl(var(--destructive) / 0.1);
283
- border-color: hsl(var(--destructive) / 0.2);
284
- color: hsl(var(--destructive));
285
- }
286
-
287
- .jux-dataframe-filter {
288
- position: relative;
289
- display: flex;
290
- align-items: center;
291
- margin-bottom: 0.75rem;
292
- }
293
-
294
- .jux-dataframe-filter-icon {
295
- position: absolute;
296
- left: 0.75rem;
297
- top: 50%;
298
- transform: translateY(-50%);
299
- color: hsl(var(--muted-foreground));
300
- pointer-events: none;
301
- z-index: 1;
302
- }
303
-
304
- .jux-dataframe-filter-input {
305
- padding-left: 2.5rem !important;
306
- }
307
-
308
- /* ═══════════════════════════════════════════════════════════════════
309
- * TABS
310
- * ═══════════════════════════════════════════════════════════════════ */
311
-
312
- .jux-tabs {
313
- width: 100%;
314
- }
315
-
316
- .jux-tabs-list {
317
- display: inline-flex;
318
- height: 2.5rem;
319
- align-items: center;
320
- justify-content: flex-start;
321
- gap: 0.25rem;
322
- border-radius: var(--radius);
323
- background: hsl(var(--muted) / 0.3);
324
- padding: 0.25rem;
325
- border: 1px solid hsl(var(--border));
326
- }
327
-
328
- .jux-tabs-button {
329
- display: inline-flex;
330
- align-items: center;
331
- justify-content: center;
332
- white-space: nowrap;
333
- border-radius: calc(var(--radius) - 0.125rem);
334
- padding: 0.5rem 1rem;
335
- font-size: 0.875rem;
336
- font-weight: 500;
337
- color: hsl(var(--muted-foreground));
338
- cursor: pointer;
339
- border: none;
340
- background: transparent;
341
- transition: all 0.2s;
342
- }
343
-
344
- .jux-tabs-button:hover {
345
- background: hsl(var(--muted) / 0.5);
346
- color: hsl(var(--foreground));
347
- }
348
-
349
- .jux-tabs-button-active {
350
- background: hsl(var(--background));
351
- color: hsl(var(--foreground));
352
- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
353
- font-weight: 600;
354
- }
355
-
356
- .jux-tabs-panel {
357
- margin-top: 1rem;
358
- border-radius: var(--radius);
359
- border: 1px solid hsl(var(--border));
360
- background: hsl(var(--background));
361
- padding: 0;
362
- overflow: hidden;
363
- }
364
-
365
- /* ✅ Remove inner padding/border from tables inside tabs */
366
- .jux-tabs-panel .jux-table-wrapper {
367
- border: none;
368
- border-radius: 0;
369
- }
370
-
371
- .jux-tabs-panel .jux-dataframe-filter {
372
- padding: 1rem 1rem 0;
373
- margin-bottom: 0.75rem;
374
- }
375
-
376
- /* ═══════════════════════════════════════════════════════════════════
377
- * TABLE
378
- * ═══════════════════════════════════════════════════════════════════ */
379
-
380
- .jux-table-wrapper {
381
- width: 100%;
382
- overflow-x: auto;
383
- border-radius: var(--radius);
384
- border: 1px solid hsl(var(--border));
385
- background: hsl(var(--background));
386
- }
387
-
388
- .jux-table {
389
- width: 100%;
390
- border-collapse: collapse;
391
- }
392
-
393
- .jux-table thead tr {
394
- border-bottom: 1px solid hsl(var(--border));
395
- background: hsl(var(--muted) / 0.3);
396
- }
397
-
398
- .jux-table tbody tr {
399
- border-bottom: 1px solid hsl(var(--border));
400
- transition: background-color 0.15s;
401
- }
402
-
403
- .jux-table tbody tr:last-child {
404
- border-bottom: none;
405
- }
406
-
407
- .jux-table th,
408
- .jux-table td {
409
- padding: 0.75rem 1rem;
410
- text-align: left;
411
- border: none;
412
- }
413
-
414
- .jux-table th {
415
- font-weight: 600;
416
- font-size: 0.875rem;
417
- color: hsl(var(--foreground));
418
- }
419
-
420
- .jux-table td {
421
- font-size: 0.875rem;
422
- color: hsl(var(--foreground));
423
- }
424
-
425
- .jux-table-striped tbody tr:nth-child(even) {
426
- background: hsl(var(--muted) / 0.2);
427
- }
428
-
429
- .jux-table-hoverable tbody tr:hover {
430
- background: hsl(var(--muted) / 0.5);
431
- }
432
-
433
- .jux-table-pagination {
434
- margin-top: 1rem;
435
- padding: 0.75rem 1rem;
436
- display: flex;
437
- gap: 0.5rem;
438
- justify-content: center;
439
- align-items: center;
440
- border-top: 1px solid hsl(var(--border));
441
- background: hsl(var(--muted) / 0.2);
442
- }
443
-
444
- .jux-table-pagination span {
445
- font-size: 0.875rem;
446
- color: hsl(var(--foreground));
447
- font-weight: 500;
448
- }
449
-
450
- /* ═══════════════════════════════════════════════════════════════════
451
- * FILE UPLOAD
452
- * ═══════════════════════════════════════════════════════════════════ */
453
-
454
- .jux-fileupload-item {
455
- display: flex;
456
- align-items: center;
457
- gap: 0.75rem;
458
- padding: 0.75rem 1rem;
459
- background: hsl(var(--muted) / 0.3);
460
- border: 1px solid hsl(var(--border));
461
- border-radius: var(--radius);
462
- font-size: 0.875rem;
463
- }
464
-
465
- .jux-fileupload-filename {
466
- flex: 1;
467
- font-weight: 500;
468
- color: hsl(var(--foreground));
469
- overflow: hidden;
470
- text-overflow: ellipsis;
471
- white-space: nowrap;
472
- }
473
-
474
- .jux-fileupload-filesize {
475
- color: hsl(var(--muted-foreground));
476
- font-size: 0.8125rem;
477
- }
478
-
479
- .jux-fileupload-remove {
480
- background: transparent;
481
- border: none;
482
- color: hsl(var(--muted-foreground));
483
- cursor: pointer;
484
- padding: 0.25rem;
485
- border-radius: 0.25rem;
486
- transition: all 0.2s;
487
- }
488
-
489
- .jux-fileupload-remove:hover {
490
- color: hsl(var(--destructive));
491
- background: hsl(var(--destructive) / 0.1);
492
- }
493
-
494
- /* ═══════════════════════════════════════════════════════════════════
495
- * UTILITIES
496
- * ═══════════════════════════════════════════════════════════════════ */
497
-
498
- .jux-muted {
499
- font-size: 0.875rem;
500
- color: hsl(var(--muted-foreground));
501
- }
502
-
503
- hr {
504
- margin: 1.5rem 0;
505
- border: none;
506
- border-top: 1px solid hsl(var(--border));
507
- }
508
-
509
- code {
510
- border-radius: 0.25rem;
511
- background: hsl(var(--muted));
512
- padding: 0.2rem 0.4rem;
513
- font-family: ui-monospace, monospace;
514
- font-size: 0.875rem;
515
- font-weight: 600;
516
- color: hsl(var(--foreground));
517
- }
518
-
519
- /* ✅ Warning button variant */
520
- .jux-button-warning {
521
- background: hsl(var(--warning));
522
- color: hsl(var(--warning-foreground));
523
- border: 1px solid hsl(var(--warning));
524
- }
525
-
526
- .jux-button-warning:hover {
527
- background: hsl(var(--warning) / 0.9);
528
- }
529
-
530
- /* ═══════════════════════════════════════════════════════════════════
531
- * MODAL
532
- * ═══════════════════════════════════════════════════════════════════ */
533
-
534
- .jux-modal-overlay {
535
- position: fixed;
536
- top: 0;
537
- left: 0;
538
- width: 100vw;
539
- height: 100vh;
540
- z-index: 9999;
541
- background: rgba(0, 0, 0, 0.5);
542
- display: flex;
543
- align-items: center;
544
- justify-content: center;
545
- backdrop-filter: blur(2px);
546
- }
547
-
548
- .jux-modal {
549
- position: relative;
550
- background: hsl(var(--background));
551
- border: 1px solid hsl(var(--border));
552
- border-radius: var(--radius);
553
- box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15), 0 2px 10px rgba(0, 0, 0, 0.1);
554
- width: 90%;
555
- max-height: 85vh;
556
- overflow-y: auto;
557
- animation: jux-modal-enter 0.2s ease-out;
558
- }
559
-
560
- @keyframes jux-modal-enter {
561
- from {
562
- opacity: 0;
563
- transform: scale(0.96) translateY(8px);
564
- }
565
- to {
566
- opacity: 1;
567
- transform: scale(1) translateY(0);
568
- }
569
- }
570
-
571
- .jux-modal-small { max-width: 400px; }
572
- .jux-modal-medium { max-width: 600px; }
573
- .jux-modal-large { max-width: 900px; }
574
-
575
- .jux-modal-close {
576
- position: absolute;
577
- top: 0.75rem;
578
- right: 0.75rem;
579
- width: 2rem;
580
- height: 2rem;
581
- display: flex;
582
- align-items: center;
583
- justify-content: center;
584
- background: transparent;
585
- border: none;
586
- border-radius: var(--radius);
587
- color: hsl(var(--muted-foreground));
588
- font-size: 1.25rem;
589
- cursor: pointer;
590
- transition: all 0.15s;
591
- z-index: 1;
592
- }
593
-
594
- .jux-modal-close:hover {
595
- background: hsl(var(--muted));
596
- color: hsl(var(--foreground));
597
- }
598
-
599
- .jux-modal-header {
600
- display: flex;
601
- align-items: center;
602
- gap: 0.5rem;
603
- padding: 1.25rem 1.5rem;
604
- border-bottom: 1px solid hsl(var(--border));
605
- }
606
-
607
- .jux-modal-header-icon {
608
- display: flex;
609
- align-items: center;
610
- color: hsl(var(--foreground));
611
- }
612
-
613
- .jux-modal-header-title {
614
- font-size: 1.125rem;
615
- font-weight: 600;
616
- color: hsl(var(--foreground));
617
- }
618
-
619
- .jux-modal-content {
620
- padding: 1.5rem;
621
- }
622
-
623
- .jux-modal-footer {
624
- display: flex;
625
- align-items: center;
626
- justify-content: flex-end;
627
- gap: 0.5rem;
628
- padding: 1rem 1.5rem;
629
- border-top: 1px solid hsl(var(--border));
630
- background: hsl(var(--muted) / 0.3);
631
- border-radius: 0 0 var(--radius) var(--radius);
632
- }
633
-
634
- .jux-modal-action {
635
- display: inline-flex;
636
- align-items: center;
637
- justify-content: center;
638
- white-space: nowrap;
639
- border-radius: var(--radius);
640
- font-size: 0.875rem;
641
- font-weight: 500;
642
- height: 2.25rem;
643
- padding: 0 1rem;
644
- cursor: pointer;
645
- transition: all 0.15s;
646
- border: none;
647
- }
648
-
649
- .jux-modal-action-primary {
650
- background: hsl(var(--primary));
651
- color: hsl(var(--primary-foreground));
652
- }
653
-
654
- .jux-modal-action-primary:hover {
655
- opacity: 0.9;
656
- }
657
-
658
- .jux-modal-action-secondary {
659
- background: transparent;
660
- border: 1px solid hsl(var(--input));
661
- color: hsl(var(--foreground));
662
- }
663
-
664
- .jux-modal-action-secondary:hover {
665
- background: hsl(var(--accent));
666
- }
667
-
668
- .jux-modal-action-default {
669
- background: hsl(var(--primary));
670
- color: hsl(var(--primary-foreground));
671
- }
672
-
673
- /* Position variants */
674
- .jux-modal-position-top { align-items: flex-start; padding-top: 5vh; }
675
- .jux-modal-position-bottom { align-items: flex-end; padding-bottom: 5vh; }
676
- .jux-modal-position-fullscreen .jux-modal { width: 100%; max-width: 100%; height: 100vh; max-height: 100vh; border-radius: 0; }
677
-
678
- /* ═══════════════════════════════════════════════════════════════════
679
- * DATAFRAME TAB SETTINGS COG
680
- * ═══════════════════════════════════════════════════════════════════ */
681
-
682
- .jux-dataframe-tab-settings {
683
- display: inline-flex;
684
- align-items: center;
685
- justify-content: center;
686
- background: transparent;
687
- border: none;
688
- padding: 0.125rem;
689
- margin-left: 0.375rem;
690
- border-radius: 0.25rem;
691
- cursor: pointer;
692
- color: hsl(var(--muted-foreground));
693
- opacity: 0.5;
694
- transition: all 0.15s;
695
- }
696
-
697
- .jux-dataframe-tab-settings:hover {
698
- opacity: 1;
699
- background: hsl(var(--muted) / 0.5);
700
- color: hsl(var(--foreground));
701
- }
702
-
703
- .jux-tabs-button-active .jux-dataframe-tab-settings {
704
- opacity: 0.7;
705
- }
706
-
707
- .jux-tabs-button-active .jux-dataframe-tab-settings:hover {
708
- opacity: 1;
709
- }
710
-
711
- /* Make tabs list scrollable if many sheets */
712
- .jux-dataframe-tabs .jux-tabs-list {
713
- overflow-x: auto;
714
- flex-wrap: nowrap;
715
- max-width: 100%;
716
- }
717
-
718
- .jux-dataframe-tabs .jux-tabs-button {
719
- display: inline-flex;
720
- align-items: center;
721
- flex-shrink: 0;
722
- }
723
-
724
- /* ══════════════════════════════════════════════════════════════════
725
- JUX STACKS - Layout System
726
- Uses foundation tokens for spacing, auto-adapts to themes
727
- ══════════════════════════════════════════════════════════════════ */
728
-
729
- /* ═════════════════════════════════════════════════════════════════
730
- * BASE STACK STYLES
731
- * ═════════════════════════════════════════════════════════════════ */
732
-
733
- .jux-vstack,
734
- .jux-hstack,
735
- .jux-zstack {
736
- display: flex;
737
- width: 100%;
738
-
739
- /* ✅ Use CSS variables from foundation/theme */
740
- gap: var(--jux-gap, 1rem);
741
- padding: var(--jux-pad, 0);
742
-
743
- /* Default alignment — stretch so children fill cross-axis */
744
- align-items: var(--jux-align, stretch);
745
- }
746
-
747
- /* ═════════════════════════════════════════════════════════════════
748
- * VERTICAL STACK (Column)
749
- * ═════════════════════════════════════════════════════════════════ */
750
-
751
- .jux-vstack {
752
- flex-direction: column;
753
- }
754
-
755
- /* ═════════════════════════════════════════════════════════════════
756
- * HORIZONTAL STACK (Row)
757
- * ═════════════════════════════════════════════════════════════════ */
758
-
759
- .jux-hstack {
760
- flex-direction: row;
761
- flex-wrap: nowrap; /* ✅ Don't wrap — stay horizontal */
762
- }
763
-
764
- /* ✅ HStack children share space equally */
765
- .jux-hstack > * {
766
- flex: 1;
767
- min-width: 0;
768
- }
769
-
770
- /* ✅ Opt out for intrinsic-size elements */
771
- .jux-hstack > button,
772
- .jux-hstack > .jux-button,
773
- .jux-hstack > .jux-icon,
774
- .jux-hstack > .jux-fileupload {
775
- flex: none;
776
- }
777
-
778
- /* ═════════════════════════════════════════════════════════════════
779
- * Z-STACK (Layered)
780
- * ═════════════════════════════════════════════════════════════════ */
781
-
782
- .jux-zstack {
783
- position: relative;
784
- flex-direction: column;
785
- }
786
-
787
- .jux-zstack > * {
788
- position: absolute;
789
- top: 0;
790
- left: 0;
791
- }
792
-
793
- /* ═════════════════════════════════════════════════════════════════
794
- * ALIGNMENT UTILITIES (Via CSS Variables)
795
- * Applied via .align-* descriptor classes
796
- * ═════════════════════════════════════════════════════════════════ */
797
-
798
- .align-start { --jux-align: flex-start; }
799
- .align-center { --jux-align: center; }
800
- .align-end { --jux-align: flex-end; }
801
- .align-stretch { --jux-align: stretch; }
802
- .align-baseline { --jux-align: baseline; }
803
-
804
- /* ═════════════════════════════════════════════════════════════════
805
- * JUSTIFY CONTENT (For HStack distribution)
806
- * ═════════════════════════════════════════════════════════════════ */
807
-
808
- .justify-start { justify-content: flex-start; }
809
- .justify-center { justify-content: center; }
810
- .justify-end { justify-content: flex-end; }
811
- .justify-between { justify-content: space-between; }
812
- .justify-around { justify-content: space-around; }
813
- .justify-evenly { justify-content: space-evenly; }
814
-
815
- /* ═════════════════════════════════════════════════════════════════
816
- * RESPONSIVE BEHAVIOR
817
- * HStack becomes VStack on mobile for better UX
818
- * ═════════════════════════════════════════════════════════════════ */
819
-
820
- @media (max-width: 768px) {
821
- .jux-hstack {
822
- flex-wrap: wrap; /* ✅ Only wrap on mobile */
823
- }
824
-
825
- .jux-hstack.stay-horizontal {
826
- flex-wrap: nowrap;
827
- }
828
- }
829
-
830
- /* ═════════════════════════════════════════════════════════════════
831
- * FULL WIDTH/HEIGHT UTILITIES
832
- * ═════════════════════════════════════════════════════════════════ */
833
-
834
- .full-width {
835
- width: 100%;
836
- }
837
-
838
- .full-height {
839
- height: 100%;
840
- min-height: 100vh;
841
- }
842
-
843
- /* ═════════════════════════════════════════════════════════════════
844
- * CENTERED CONTENT (Common Layout Pattern)
845
- * ═════════════════════════════════════════════════════════════════ */
846
-
847
- .center-content {
848
- justify-content: center;
849
- align-items: center;
850
- }
851
-
852
- /* ═════════════════════════════════════════════════════════════════
853
- * SCROLL BEHAVIOR
854
- * ═════════════════════════════════════════════════════════════════ */
855
-
856
- .scroll-x {
857
- overflow-x: auto;
858
- overflow-y: hidden;
859
- }
860
-
861
- .scroll-y {
862
- overflow-y: auto;
863
- overflow-x: hidden;
864
- }
865
-
866
- .scroll-both {
867
- overflow: auto;
868
- }
869
-
870
- /* ═══════════════════════════════════════════════════════════════════
871
- * DATAFRAME DATA VIEW (Post-upload clean UI)
872
- * ═══════════════════════════════════════════════════════════════════ */
873
-
874
- .jux-dataframe-data {
875
- display: flex;
876
- flex-direction: column;
877
- gap: 0.5rem;
878
- }
879
-
880
- .jux-dataframe-toolbar {
881
- display: flex;
882
- justify-content: flex-end;
883
- align-items: center;
884
- padding: 0.25rem 0;
885
- }
886
-
887
- .jux-dataframe-gear {
888
- display: inline-flex;
889
- align-items: center;
890
- justify-content: center;
891
- width: 2rem;
892
- height: 2rem;
893
- padding: 0;
894
- border: none;
895
- background: transparent;
896
- border-radius: var(--radius);
897
- cursor: pointer;
898
- font-size: 1rem;
899
- color: hsl(var(--muted-foreground));
900
- transition: all 0.15s;
901
- }
902
-
903
- .jux-dataframe-gear:hover {
904
- background: hsl(var(--muted) / 0.5);
905
- color: hsl(var(--foreground));
906
- }
907
-
908
- .jux-dataframe-gear-warning {
909
- color: hsl(var(--warning));
910
- }
911
-
912
- .jux-dataframe-gear-warning:hover {
913
- background: hsl(var(--warning) / 0.1);
914
- }
915
-
916
- /* Settings modal content */
917
- .jux-dataframe-settings-content {
918
- display: flex;
919
- flex-direction: column;
920
- gap: 1rem;
921
- }
922
-
923
- .jux-dataframe-settings-section {
924
- display: flex;
925
- flex-direction: column;
926
- gap: 0.25rem;
927
- }
928
-
929
- .jux-dataframe-settings-label {
930
- font-size: 0.75rem;
931
- font-weight: 600;
932
- text-transform: uppercase;
933
- letter-spacing: 0.05em;
934
- color: hsl(var(--muted-foreground));
935
- }
936
-
937
- .jux-dataframe-settings-value {
938
- font-size: 0.875rem;
939
- color: hsl(var(--foreground));
940
- }
941
-
942
- /* Summary gear in collapsible mode */
943
- .jux-dataframe-summary-gear {
944
- padding: 0.25rem 0.5rem;
945
- font-size: 0.875rem;
946
- border: none;
947
- background: transparent;
948
- cursor: pointer;
949
- color: hsl(var(--muted-foreground));
950
- transition: all 0.15s;
951
- margin-left: auto;
952
- }
953
-
954
- .jux-dataframe-summary-gear:hover {
955
- color: hsl(var(--foreground));
956
- }
957
-
958
- .jux-dataframe-summary-gear.jux-dataframe-gear-warning {
959
- color: hsl(var(--warning));
960
- }