vespaembed 0.0.1__py3-none-any.whl → 0.0.3__py3-none-any.whl

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 (49) hide show
  1. vespaembed/__init__.py +1 -1
  2. vespaembed/cli/__init__.py +17 -0
  3. vespaembed/cli/commands/__init__.py +7 -0
  4. vespaembed/cli/commands/evaluate.py +85 -0
  5. vespaembed/cli/commands/export.py +86 -0
  6. vespaembed/cli/commands/info.py +52 -0
  7. vespaembed/cli/commands/serve.py +49 -0
  8. vespaembed/cli/commands/train.py +267 -0
  9. vespaembed/cli/vespaembed.py +55 -0
  10. vespaembed/core/__init__.py +2 -0
  11. vespaembed/core/config.py +164 -0
  12. vespaembed/core/registry.py +158 -0
  13. vespaembed/core/trainer.py +573 -0
  14. vespaembed/datasets/__init__.py +3 -0
  15. vespaembed/datasets/formats/__init__.py +5 -0
  16. vespaembed/datasets/formats/csv.py +15 -0
  17. vespaembed/datasets/formats/huggingface.py +34 -0
  18. vespaembed/datasets/formats/jsonl.py +26 -0
  19. vespaembed/datasets/loader.py +80 -0
  20. vespaembed/db.py +176 -0
  21. vespaembed/enums.py +58 -0
  22. vespaembed/evaluation/__init__.py +3 -0
  23. vespaembed/evaluation/factory.py +86 -0
  24. vespaembed/models/__init__.py +4 -0
  25. vespaembed/models/export.py +89 -0
  26. vespaembed/models/loader.py +25 -0
  27. vespaembed/static/css/styles.css +1800 -0
  28. vespaembed/static/js/app.js +1485 -0
  29. vespaembed/tasks/__init__.py +23 -0
  30. vespaembed/tasks/base.py +144 -0
  31. vespaembed/tasks/pairs.py +91 -0
  32. vespaembed/tasks/similarity.py +84 -0
  33. vespaembed/tasks/triplets.py +90 -0
  34. vespaembed/tasks/tsdae.py +102 -0
  35. vespaembed/templates/index.html +544 -0
  36. vespaembed/utils/__init__.py +3 -0
  37. vespaembed/utils/logging.py +69 -0
  38. vespaembed/web/__init__.py +1 -0
  39. vespaembed/web/api/__init__.py +1 -0
  40. vespaembed/web/app.py +605 -0
  41. vespaembed/worker.py +313 -0
  42. vespaembed-0.0.3.dist-info/METADATA +325 -0
  43. vespaembed-0.0.3.dist-info/RECORD +47 -0
  44. {vespaembed-0.0.1.dist-info → vespaembed-0.0.3.dist-info}/WHEEL +1 -1
  45. vespaembed-0.0.1.dist-info/METADATA +0 -20
  46. vespaembed-0.0.1.dist-info/RECORD +0 -7
  47. {vespaembed-0.0.1.dist-info → vespaembed-0.0.3.dist-info}/entry_points.txt +0 -0
  48. {vespaembed-0.0.1.dist-info → vespaembed-0.0.3.dist-info}/licenses/LICENSE +0 -0
  49. {vespaembed-0.0.1.dist-info → vespaembed-0.0.3.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1800 @@
1
+ /* VespaEmbed - Vespa AI Design System */
2
+ @import url('https://fonts.googleapis.com/css2?family=DM+Sans:wght@400;500;700&display=swap');
3
+
4
+ :root {
5
+ /* Vespa Brand Colors */
6
+ --rock: #2e2f27;
7
+ --heather: #1d3b31;
8
+ --heather-light: #2a5446;
9
+ --anchor: #0246c9;
10
+ --skjaer: #fbfbfa;
11
+ --skjaer-dark: #3a3b36;
12
+
13
+ /* Dark Mode Colors (based on Vespa's 12-shade system) */
14
+ --app-background: #1a1a1a;
15
+ --subtle-background: #222222;
16
+ --ui-element-background: #2a2a2a;
17
+ --hovered-ui-element-background: #333333;
18
+ --selected-ui-element-background: #3a3a3a;
19
+ --subtle-border: #404040;
20
+ --ui-element-border: #4a4a4a;
21
+ --hovered-border: #555555;
22
+ --solid-background: #2e2f27;
23
+ --low-contrast-text: #999999;
24
+ --high-contrast-text: #ededed;
25
+
26
+ /* Semantic Colors */
27
+ --success: #22c55e;
28
+ --success-dim: rgba(34, 197, 94, 0.15);
29
+ --danger: #ef4444;
30
+ --danger-dim: rgba(239, 68, 68, 0.15);
31
+ --warning: #eab308;
32
+ --warning-dim: rgba(234, 179, 8, 0.15);
33
+ --info: #3b82f6;
34
+ --info-dim: rgba(59, 130, 246, 0.15);
35
+
36
+ /* Typography */
37
+ --font: 'DM Sans', -apple-system, system-ui, sans-serif;
38
+ --mono: 'SF Mono', Monaco, 'Cascadia Code', monospace;
39
+
40
+ /* Font Sizes */
41
+ --font-xs: 12px;
42
+ --font-sm: 13px;
43
+ --font-md: 14px;
44
+ --font-lg: 16px;
45
+ --font-xl: 21px;
46
+
47
+ /* Font Weights */
48
+ --font-regular: 400;
49
+ --font-medium: 500;
50
+ --font-bold: 700;
51
+
52
+ /* Spacing (Vespa scale) */
53
+ --space-xs: 5px;
54
+ --space-sm: 8px;
55
+ --space-md: 13px;
56
+ --space-lg: 21px;
57
+ --space-xl: 34px;
58
+
59
+ /* Border Radius (Vespa uses small radii) */
60
+ --radius-xs: 2px;
61
+ --radius-sm: 5px;
62
+ --radius-md: 8px;
63
+ --radius-lg: 13px;
64
+ }
65
+
66
+ * {
67
+ box-sizing: border-box;
68
+ margin: 0;
69
+ padding: 0;
70
+ }
71
+
72
+ html,
73
+ body {
74
+ height: 100%;
75
+ overflow: hidden;
76
+ font-family: var(--font);
77
+ background: var(--app-background);
78
+ color: var(--high-contrast-text);
79
+ font-size: var(--font-md);
80
+ line-height: 1.5;
81
+ -webkit-font-smoothing: antialiased;
82
+ }
83
+
84
+ /* App Layout */
85
+ .app {
86
+ display: flex;
87
+ height: 100vh;
88
+ overflow: hidden;
89
+ }
90
+
91
+ /* Sidebar */
92
+ .sidebar {
93
+ width: 260px;
94
+ background: var(--app-background);
95
+ border-right: 1px solid var(--subtle-border);
96
+ display: flex;
97
+ flex-direction: column;
98
+ flex-shrink: 0;
99
+ }
100
+
101
+ .sidebar-brand {
102
+ padding: var(--space-lg);
103
+ display: flex;
104
+ align-items: center;
105
+ gap: var(--space-sm);
106
+ border-bottom: 1px solid var(--subtle-border);
107
+ }
108
+
109
+ .brand-icon {
110
+ font-size: 18px;
111
+ color: var(--success);
112
+ }
113
+
114
+ .brand-text {
115
+ font-weight: var(--font-bold);
116
+ font-size: var(--font-lg);
117
+ color: var(--high-contrast-text);
118
+ }
119
+
120
+ .status-dot {
121
+ width: 8px;
122
+ height: 8px;
123
+ border-radius: 50%;
124
+ background: var(--danger);
125
+ margin-left: auto;
126
+ transition: all 0.3s;
127
+ }
128
+
129
+ .status-dot.connected {
130
+ background: var(--success);
131
+ box-shadow: 0 0 8px var(--success);
132
+ }
133
+
134
+ .btn-new {
135
+ margin: var(--space-md);
136
+ padding: var(--space-sm) var(--space-md);
137
+ background: var(--heather-light);
138
+ color: var(--high-contrast-text);
139
+ border: none;
140
+ border-radius: var(--radius-xs);
141
+ font-weight: var(--font-medium);
142
+ font-size: var(--font-sm);
143
+ cursor: pointer;
144
+ transition: all 0.2s;
145
+ }
146
+
147
+ .btn-new:hover {
148
+ background: var(--heather);
149
+ }
150
+
151
+ .run-list {
152
+ flex: 1;
153
+ overflow-y: auto;
154
+ padding: var(--space-sm);
155
+ }
156
+
157
+ .run-item {
158
+ padding: var(--space-sm) var(--space-md);
159
+ border-radius: var(--radius-sm);
160
+ cursor: pointer;
161
+ display: flex;
162
+ align-items: center;
163
+ gap: var(--space-sm);
164
+ transition: all 0.15s;
165
+ margin-bottom: var(--space-xs);
166
+ border: 1px solid transparent;
167
+ }
168
+
169
+ .run-item:hover {
170
+ background: var(--ui-element-background);
171
+ }
172
+
173
+ .run-item.active {
174
+ background: var(--selected-ui-element-background);
175
+ border-color: var(--ui-element-border);
176
+ }
177
+
178
+ .run-item.placeholder {
179
+ color: var(--low-contrast-text);
180
+ font-size: var(--font-sm);
181
+ justify-content: center;
182
+ }
183
+
184
+ .run-status-icon {
185
+ width: 8px;
186
+ height: 8px;
187
+ border-radius: 50%;
188
+ background: var(--low-contrast-text);
189
+ flex-shrink: 0;
190
+ }
191
+
192
+ .run-status-icon.running {
193
+ background: var(--warning);
194
+ animation: pulse 1.5s infinite;
195
+ }
196
+
197
+ .run-status-icon.completed {
198
+ background: var(--success);
199
+ }
200
+
201
+ .run-status-icon.error {
202
+ background: var(--danger);
203
+ }
204
+
205
+ .run-status-icon.stopped {
206
+ background: var(--low-contrast-text);
207
+ }
208
+
209
+ .run-status-icon.pending {
210
+ background: var(--warning);
211
+ opacity: 0.5;
212
+ }
213
+
214
+ @keyframes pulse {
215
+ 0%, 100% { opacity: 1; }
216
+ 50% { opacity: 0.4; }
217
+ }
218
+
219
+ .run-info {
220
+ overflow: hidden;
221
+ flex: 1;
222
+ }
223
+
224
+ .run-id {
225
+ font-weight: var(--font-medium);
226
+ font-size: var(--font-sm);
227
+ color: var(--high-contrast-text);
228
+ white-space: nowrap;
229
+ overflow: hidden;
230
+ text-overflow: ellipsis;
231
+ }
232
+
233
+ .run-date {
234
+ font-size: var(--font-xs);
235
+ color: var(--low-contrast-text);
236
+ }
237
+
238
+ /* Project Summary in Sidebar */
239
+ .project-summary {
240
+ border-top: 1px solid var(--subtle-border);
241
+ padding: var(--space-md);
242
+ background: var(--subtle-background);
243
+ }
244
+
245
+ .summary-header {
246
+ display: flex;
247
+ justify-content: space-between;
248
+ align-items: center;
249
+ margin-bottom: var(--space-sm);
250
+ }
251
+
252
+ .summary-title {
253
+ font-weight: var(--font-bold);
254
+ font-size: var(--font-sm);
255
+ color: var(--high-contrast-text);
256
+ overflow: hidden;
257
+ text-overflow: ellipsis;
258
+ white-space: nowrap;
259
+ max-width: 130px;
260
+ }
261
+
262
+ .status-chip {
263
+ padding: var(--space-sm) var(--space-md);
264
+ background: var(--ui-element-background);
265
+ border: 1px solid var(--ui-element-border);
266
+ border-radius: var(--radius-sm);
267
+ font-size: var(--font-sm);
268
+ font-weight: var(--font-medium);
269
+ color: var(--low-contrast-text);
270
+ }
271
+
272
+ .status-chip.small {
273
+ padding: var(--space-xs) var(--space-sm);
274
+ font-size: var(--font-xs);
275
+ }
276
+
277
+ .status-chip.running {
278
+ color: var(--warning);
279
+ border-color: var(--warning);
280
+ background: var(--warning-dim);
281
+ }
282
+
283
+ .status-chip.completed {
284
+ color: var(--success);
285
+ border-color: var(--success);
286
+ background: var(--success-dim);
287
+ }
288
+
289
+ .status-chip.error {
290
+ color: var(--danger);
291
+ border-color: var(--danger);
292
+ background: var(--danger-dim);
293
+ }
294
+
295
+ .status-chip.stopped {
296
+ color: var(--low-contrast-text);
297
+ border-color: var(--subtle-border);
298
+ background: var(--subtle-background);
299
+ }
300
+
301
+ .summary-grid {
302
+ background: var(--app-background);
303
+ border-radius: var(--radius-sm);
304
+ padding: var(--space-sm);
305
+ margin-bottom: var(--space-sm);
306
+ border: 1px solid var(--subtle-border);
307
+ }
308
+
309
+ .summary-row {
310
+ display: flex;
311
+ justify-content: space-between;
312
+ padding: var(--space-xs) 0;
313
+ border-bottom: 1px solid var(--subtle-border);
314
+ }
315
+
316
+ .summary-row:last-child {
317
+ border-bottom: none;
318
+ }
319
+
320
+ .summary-key {
321
+ font-size: var(--font-xs);
322
+ color: var(--low-contrast-text);
323
+ text-transform: uppercase;
324
+ font-weight: var(--font-bold);
325
+ }
326
+
327
+ .summary-val {
328
+ font-size: var(--font-xs);
329
+ font-family: var(--mono);
330
+ color: var(--high-contrast-text);
331
+ text-align: right;
332
+ max-width: 55%;
333
+ overflow: hidden;
334
+ text-overflow: ellipsis;
335
+ white-space: nowrap;
336
+ }
337
+
338
+ .summary-actions {
339
+ display: flex;
340
+ gap: var(--space-sm);
341
+ }
342
+
343
+ .summary-actions button {
344
+ flex: 1;
345
+ padding: var(--space-sm);
346
+ font-size: var(--font-xs);
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: center;
350
+ gap: var(--space-xs);
351
+ }
352
+
353
+ .summary-actions button svg {
354
+ flex-shrink: 0;
355
+ }
356
+
357
+ /* Main Content */
358
+ .main {
359
+ flex: 1;
360
+ padding: var(--space-lg);
361
+ padding-bottom: 70px; /* Space for fixed progress bar */
362
+ display: flex;
363
+ flex-direction: column;
364
+ gap: var(--space-md);
365
+ overflow-y: auto;
366
+ min-height: 0;
367
+ background: var(--subtle-background);
368
+ position: relative;
369
+ }
370
+
371
+ .monitor-header {
372
+ display: flex;
373
+ align-items: center;
374
+ gap: var(--space-lg);
375
+ justify-content: space-between;
376
+ }
377
+
378
+ .header-actions {
379
+ display: flex;
380
+ gap: var(--space-sm);
381
+ }
382
+
383
+ .metrics-bar {
384
+ display: flex;
385
+ gap: var(--space-xl);
386
+ }
387
+
388
+ .metric {
389
+ display: flex;
390
+ align-items: baseline;
391
+ gap: var(--space-sm);
392
+ }
393
+
394
+ .metric-val {
395
+ font-size: var(--font-xl);
396
+ font-weight: var(--font-bold);
397
+ font-family: var(--mono);
398
+ color: var(--high-contrast-text);
399
+ }
400
+
401
+ .metric.highlight .metric-val {
402
+ color: var(--success);
403
+ }
404
+
405
+ .metric-label {
406
+ font-size: var(--font-xs);
407
+ color: var(--low-contrast-text);
408
+ text-transform: uppercase;
409
+ font-weight: var(--font-bold);
410
+ }
411
+
412
+ /* Chart Card */
413
+ .chart-card {
414
+ background: var(--app-background);
415
+ border: 1px solid var(--subtle-border);
416
+ border-radius: var(--radius-sm);
417
+ flex: 1 1 0;
418
+ min-height: 150px;
419
+ display: flex;
420
+ flex-direction: column;
421
+ overflow: hidden;
422
+ }
423
+
424
+ .chart-header {
425
+ padding: var(--space-md);
426
+ border-bottom: 1px solid var(--subtle-border);
427
+ display: flex;
428
+ justify-content: space-between;
429
+ align-items: center;
430
+ font-size: var(--font-sm);
431
+ font-weight: var(--font-medium);
432
+ color: var(--high-contrast-text);
433
+ }
434
+
435
+ .chart-controls {
436
+ display: flex;
437
+ align-items: center;
438
+ gap: var(--space-sm);
439
+ }
440
+
441
+ .metric-select {
442
+ background: var(--ui-element-background);
443
+ border: 1px solid var(--ui-element-border);
444
+ border-radius: var(--radius-sm);
445
+ color: var(--high-contrast-text);
446
+ padding: var(--space-xs) var(--space-sm);
447
+ font-size: var(--font-xs);
448
+ font-family: var(--font);
449
+ cursor: pointer;
450
+ min-width: 120px;
451
+ }
452
+
453
+ .metric-select:hover {
454
+ border-color: var(--hovered-border);
455
+ }
456
+
457
+ .metric-select:focus {
458
+ outline: none;
459
+ border-color: var(--heather-light);
460
+ }
461
+
462
+ .chart-wrapper {
463
+ flex: 1;
464
+ position: relative;
465
+ padding: var(--space-md);
466
+ min-height: 0;
467
+ }
468
+
469
+ .chart-wrapper canvas {
470
+ width: 100% !important;
471
+ height: 100% !important;
472
+ }
473
+
474
+ .chart-placeholder {
475
+ position: absolute;
476
+ inset: 0;
477
+ display: flex;
478
+ align-items: center;
479
+ justify-content: center;
480
+ color: var(--low-contrast-text);
481
+ font-size: var(--font-sm);
482
+ }
483
+
484
+ /* Progress Bar */
485
+ .progress-container {
486
+ position: fixed;
487
+ bottom: 0;
488
+ left: 260px; /* Sidebar width */
489
+ right: 0;
490
+ background: var(--app-background);
491
+ border-top: 1px solid var(--subtle-border);
492
+ padding: var(--space-sm) var(--space-lg);
493
+ z-index: 100;
494
+ }
495
+
496
+ .progress-bar {
497
+ height: 8px;
498
+ background: var(--ui-element-background);
499
+ border-radius: var(--radius-sm);
500
+ overflow: hidden;
501
+ margin-bottom: var(--space-xs);
502
+ }
503
+
504
+ .progress-fill {
505
+ height: 100%;
506
+ background: linear-gradient(90deg, var(--heather-light), var(--heather-dark));
507
+ border-radius: var(--radius-sm);
508
+ transition: width 0.3s ease;
509
+ }
510
+
511
+ .progress-text {
512
+ display: flex;
513
+ justify-content: space-between;
514
+ font-size: var(--font-xs);
515
+ color: var(--low-contrast-text);
516
+ font-family: var(--mono);
517
+ }
518
+
519
+ /* Status Banner */
520
+ .status-banner {
521
+ background: var(--ui-element-background);
522
+ border: 1px solid var(--subtle-border);
523
+ border-radius: var(--radius-sm);
524
+ padding: var(--space-sm) var(--space-md);
525
+ margin-bottom: var(--space-md);
526
+ display: flex;
527
+ align-items: center;
528
+ gap: var(--space-sm);
529
+ color: var(--high-contrast-text);
530
+ font-size: var(--font-sm);
531
+ }
532
+
533
+ .status-spinner,
534
+ .btn-spinner {
535
+ width: 16px;
536
+ height: 16px;
537
+ border: 2px solid var(--subtle-border);
538
+ border-top-color: var(--heather-light);
539
+ border-radius: 50%;
540
+ animation: spin 0.8s linear infinite;
541
+ }
542
+
543
+ .btn-spinner {
544
+ width: 12px;
545
+ height: 12px;
546
+ border-width: 2px;
547
+ display: none;
548
+ }
549
+
550
+ @keyframes spin {
551
+ to { transform: rotate(360deg); }
552
+ }
553
+
554
+ .btn-danger .btn-spinner {
555
+ border-color: rgba(255,255,255,0.3);
556
+ border-top-color: white;
557
+ }
558
+
559
+ /* Button loading state */
560
+ .btn-danger.loading .btn-text {
561
+ display: none;
562
+ }
563
+
564
+ .btn-danger.loading .btn-spinner {
565
+ display: inline-block !important;
566
+ }
567
+
568
+ /* Log Card */
569
+ .log-card {
570
+ background: var(--app-background);
571
+ border: 1px solid var(--subtle-border);
572
+ border-radius: var(--radius-sm);
573
+ height: 200px;
574
+ display: flex;
575
+ flex-direction: column;
576
+ overflow: hidden;
577
+ }
578
+
579
+ .card-header {
580
+ padding: var(--space-sm) var(--space-md);
581
+ border-bottom: 1px solid var(--subtle-border);
582
+ font-size: var(--font-xs);
583
+ font-weight: var(--font-bold);
584
+ text-transform: uppercase;
585
+ color: var(--low-contrast-text);
586
+ display: flex;
587
+ justify-content: space-between;
588
+ align-items: center;
589
+ }
590
+
591
+ .log-content {
592
+ flex: 1;
593
+ overflow-y: auto;
594
+ padding: var(--space-md);
595
+ font-family: var(--mono);
596
+ font-size: var(--font-xs);
597
+ color: var(--low-contrast-text);
598
+ white-space: pre-wrap;
599
+ word-break: break-all;
600
+ }
601
+
602
+ .badge {
603
+ background: var(--ui-element-background);
604
+ color: var(--low-contrast-text);
605
+ padding: 2px var(--space-sm);
606
+ border-radius: var(--radius-sm);
607
+ font-size: var(--font-xs);
608
+ font-family: var(--mono);
609
+ }
610
+
611
+ /* Modal */
612
+ .modal {
613
+ display: none;
614
+ position: fixed;
615
+ inset: 0;
616
+ background: rgba(0, 0, 0, 0.7);
617
+ backdrop-filter: blur(4px);
618
+ align-items: center;
619
+ justify-content: center;
620
+ z-index: 1000;
621
+ }
622
+
623
+ .modal-box {
624
+ background: var(--subtle-background);
625
+ border: 1px solid var(--subtle-border);
626
+ border-radius: var(--radius-sm);
627
+ width: 90%;
628
+ max-width: 500px;
629
+ max-height: 90vh;
630
+ display: flex;
631
+ flex-direction: column;
632
+ animation: modalIn 0.2s ease;
633
+ }
634
+
635
+ /* Fixed height modal for consistent size */
636
+ .modal-fixed {
637
+ max-width: 640px;
638
+ height: 85vh;
639
+ max-height: 700px;
640
+ }
641
+
642
+ .modal-fixed .modal-body {
643
+ flex: 1;
644
+ overflow-y: auto;
645
+ overflow-x: hidden;
646
+ }
647
+
648
+ /* Wide two-column modal */
649
+ .modal-wide {
650
+ width: 920px;
651
+ max-width: 95vw;
652
+ height: 85vh;
653
+ max-height: 800px;
654
+ display: flex;
655
+ flex-direction: column;
656
+ }
657
+
658
+ .modal-wide .modal-header {
659
+ padding: var(--space-sm) var(--space-lg);
660
+ font-size: var(--font-md);
661
+ flex-shrink: 0;
662
+ }
663
+
664
+ .modal-wide form {
665
+ display: flex;
666
+ flex-direction: column;
667
+ flex: 1;
668
+ min-height: 0;
669
+ }
670
+
671
+ .modal-two-column {
672
+ display: grid;
673
+ grid-template-columns: 1fr 1fr;
674
+ gap: var(--space-lg);
675
+ padding: var(--space-sm) var(--space-lg);
676
+ flex: 1;
677
+ min-height: 0;
678
+ overflow: hidden;
679
+ }
680
+
681
+ .modal-column {
682
+ display: flex;
683
+ flex-direction: column;
684
+ min-width: 0;
685
+ overflow-y: auto;
686
+ padding-right: var(--space-xs);
687
+ }
688
+
689
+ /* Artifacts Modal */
690
+ .artifacts-list {
691
+ display: flex;
692
+ flex-direction: column;
693
+ gap: var(--space-sm);
694
+ }
695
+
696
+ .artifacts-empty {
697
+ color: var(--low-contrast-text);
698
+ text-align: center;
699
+ padding: var(--space-lg);
700
+ }
701
+
702
+ .artifact-item {
703
+ display: flex;
704
+ align-items: center;
705
+ justify-content: space-between;
706
+ padding: var(--space-sm) var(--space-md);
707
+ background: var(--app-background);
708
+ border-radius: var(--radius-sm);
709
+ gap: var(--space-md);
710
+ }
711
+
712
+ .artifact-info {
713
+ display: flex;
714
+ flex-direction: column;
715
+ gap: 2px;
716
+ min-width: 0;
717
+ flex: 1;
718
+ }
719
+
720
+ .artifact-name {
721
+ font-weight: var(--font-medium);
722
+ color: var(--high-contrast-text);
723
+ }
724
+
725
+ .artifact-meta {
726
+ display: flex;
727
+ align-items: center;
728
+ gap: var(--space-sm);
729
+ font-size: var(--font-xs);
730
+ color: var(--low-contrast-text);
731
+ }
732
+
733
+ .artifact-category {
734
+ padding: 2px 6px;
735
+ background: var(--ui-element-background);
736
+ border-radius: var(--radius-xs);
737
+ text-transform: uppercase;
738
+ font-size: 10px;
739
+ letter-spacing: 0.5px;
740
+ }
741
+
742
+ .artifact-download {
743
+ padding: var(--space-xs) var(--space-sm);
744
+ background: var(--ui-element-background);
745
+ border: 1px solid var(--ui-element-border);
746
+ border-radius: var(--radius-sm);
747
+ color: var(--high-contrast-text);
748
+ font-size: var(--font-xs);
749
+ cursor: pointer;
750
+ transition: all 0.15s;
751
+ white-space: nowrap;
752
+ }
753
+
754
+ .artifact-download:hover {
755
+ background: var(--ui-element-background-hover);
756
+ border-color: var(--ui-element-border-hover);
757
+ }
758
+
759
+ .artifacts-footer {
760
+ margin-top: var(--space-md);
761
+ padding-top: var(--space-sm);
762
+ border-top: 1px solid var(--subtle-border);
763
+ }
764
+
765
+ .artifacts-path {
766
+ font-size: var(--font-xs);
767
+ color: var(--low-contrast-text);
768
+ font-family: monospace;
769
+ word-break: break-all;
770
+ }
771
+
772
+ .modal-column::-webkit-scrollbar {
773
+ width: 4px;
774
+ }
775
+
776
+ .modal-column::-webkit-scrollbar-thumb {
777
+ background: var(--subtle-border);
778
+ border-radius: 2px;
779
+ }
780
+
781
+ .modal-wide .modal-footer {
782
+ flex-shrink: 0;
783
+ }
784
+
785
+ .column-header {
786
+ font-size: var(--font-xs);
787
+ font-weight: var(--font-bold);
788
+ text-transform: uppercase;
789
+ color: var(--low-contrast-text);
790
+ letter-spacing: 0.05em;
791
+ margin-bottom: var(--space-sm);
792
+ padding-bottom: var(--space-xs);
793
+ border-bottom: 1px solid var(--subtle-border);
794
+ }
795
+
796
+ /* Compact form styles for modal */
797
+ .modal-wide .form-section {
798
+ margin-bottom: var(--space-sm);
799
+ }
800
+
801
+ .modal-wide .section-label {
802
+ margin-bottom: var(--space-xs);
803
+ font-size: var(--font-xs);
804
+ }
805
+
806
+ .modal-wide .form-field {
807
+ margin-bottom: var(--space-xs);
808
+ }
809
+
810
+ .modal-wide .form-field label {
811
+ margin-bottom: 2px;
812
+ }
813
+
814
+ .modal-wide .form-row {
815
+ gap: var(--space-sm);
816
+ margin-bottom: var(--space-xs);
817
+ }
818
+
819
+ .modal-wide input[type="text"],
820
+ .modal-wide input[type="number"],
821
+ .modal-wide select {
822
+ padding: var(--space-xs) var(--space-sm);
823
+ font-size: var(--font-sm);
824
+ }
825
+
826
+ .modal-wide .tabs {
827
+ margin-bottom: var(--space-xs);
828
+ }
829
+
830
+ .modal-wide .tab {
831
+ padding: var(--space-xs) var(--space-sm);
832
+ font-size: var(--font-xs);
833
+ }
834
+
835
+ .modal-wide .tab-container {
836
+ min-height: auto;
837
+ }
838
+
839
+ .modal-wide .upload-grid {
840
+ gap: var(--space-xs);
841
+ }
842
+
843
+ .modal-wide .upload-box {
844
+ padding: var(--space-xs) var(--space-sm);
845
+ min-height: 44px;
846
+ flex-direction: row;
847
+ gap: var(--space-xs);
848
+ }
849
+
850
+ .modal-wide .upload-box .upload-icon {
851
+ margin-bottom: 0;
852
+ }
853
+
854
+ .modal-wide .upload-icon {
855
+ font-size: var(--font-md);
856
+ }
857
+
858
+ .modal-wide .upload-label {
859
+ font-size: var(--font-xs);
860
+ margin-bottom: 2px;
861
+ }
862
+
863
+ .modal-wide .collapsible-header {
864
+ padding: var(--space-xs) var(--space-sm);
865
+ font-size: var(--font-xs);
866
+ }
867
+
868
+ .modal-wide .collapsible-content {
869
+ padding: var(--space-sm);
870
+ }
871
+
872
+ .modal-wide .advanced-group {
873
+ margin-bottom: var(--space-sm);
874
+ padding-bottom: var(--space-xs);
875
+ }
876
+
877
+ .modal-wide .group-label {
878
+ font-size: 10px;
879
+ margin-bottom: var(--space-xs);
880
+ }
881
+
882
+ .modal-wide .checkbox-grid {
883
+ gap: var(--space-md);
884
+ }
885
+
886
+ .modal-wide .checkbox-row label {
887
+ font-size: var(--font-xs);
888
+ }
889
+
890
+ .modal-wide .field-hint {
891
+ font-size: 10px;
892
+ margin-top: 2px;
893
+ }
894
+
895
+ /* Required columns */
896
+ .required-columns {
897
+ display: flex;
898
+ align-items: center;
899
+ gap: var(--space-xs);
900
+ margin-top: var(--space-xs);
901
+ font-size: var(--font-xs);
902
+ }
903
+
904
+ .required-columns-label {
905
+ color: var(--low-contrast-text);
906
+ }
907
+
908
+ .required-columns-list {
909
+ display: flex;
910
+ gap: var(--space-xs);
911
+ flex-wrap: wrap;
912
+ }
913
+
914
+ .required-column-tag {
915
+ background: var(--heather-dim);
916
+ color: var(--heather-light);
917
+ padding: 2px 6px;
918
+ border-radius: var(--radius-xs);
919
+ font-family: var(--mono);
920
+ font-size: 11px;
921
+ }
922
+
923
+ /* Sample data box */
924
+ .sample-data-box {
925
+ background: var(--app-background);
926
+ border: 1px solid var(--subtle-border);
927
+ border-radius: var(--radius-xs);
928
+ padding: var(--space-xs) var(--space-sm);
929
+ margin-top: var(--space-xs);
930
+ font-size: 11px;
931
+ font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
932
+ min-height: 70px; /* Fixed height to prevent layout shift */
933
+ max-height: 70px;
934
+ overflow: hidden;
935
+ }
936
+
937
+ .sample-data-header {
938
+ color: var(--low-contrast-text);
939
+ font-size: 10px;
940
+ margin-bottom: var(--space-xs);
941
+ font-family: var(--font-family);
942
+ text-transform: uppercase;
943
+ letter-spacing: 0.03em;
944
+ }
945
+
946
+ .sample-data-content {
947
+ color: var(--high-contrast-text);
948
+ line-height: 1.4;
949
+ }
950
+
951
+ .sample-data-row {
952
+ display: block;
953
+ padding: 1px 0;
954
+ white-space: nowrap;
955
+ overflow: hidden;
956
+ text-overflow: ellipsis;
957
+ }
958
+
959
+ .sample-data-key {
960
+ color: var(--heather);
961
+ }
962
+
963
+ .sample-data-value {
964
+ color: var(--low-contrast-text);
965
+ }
966
+
967
+ .modal-wide .modal-footer {
968
+ padding: var(--space-sm) var(--space-lg);
969
+ margin-top: var(--space-xs);
970
+ border-top: 1px solid var(--subtle-border);
971
+ }
972
+
973
+ /* Override base modal-footer styles in wide modal */
974
+ .modal-wide .modal-footer.modal-footer {
975
+ padding-top: var(--space-sm);
976
+ margin-top: var(--space-xs);
977
+ }
978
+
979
+ /* Responsive: stack columns on smaller screens */
980
+ @media (max-width: 768px) {
981
+ .modal-wide {
982
+ max-width: 95vw;
983
+ max-height: 90vh;
984
+ overflow-y: auto;
985
+ }
986
+
987
+ .modal-two-column {
988
+ grid-template-columns: 1fr;
989
+ }
990
+ }
991
+
992
+ @keyframes modalIn {
993
+ from {
994
+ opacity: 0;
995
+ transform: scale(0.96) translateY(-8px);
996
+ }
997
+ to {
998
+ opacity: 1;
999
+ transform: scale(1) translateY(0);
1000
+ }
1001
+ }
1002
+
1003
+ .modal-header {
1004
+ padding: var(--space-md) var(--space-lg);
1005
+ border-bottom: 1px solid var(--subtle-border);
1006
+ display: flex;
1007
+ justify-content: space-between;
1008
+ align-items: center;
1009
+ font-weight: var(--font-bold);
1010
+ font-size: var(--font-lg);
1011
+ }
1012
+
1013
+ .close-modal {
1014
+ background: none;
1015
+ border: none;
1016
+ color: var(--low-contrast-text);
1017
+ font-size: 20px;
1018
+ cursor: pointer;
1019
+ padding: 0;
1020
+ width: 28px;
1021
+ height: 28px;
1022
+ display: flex;
1023
+ align-items: center;
1024
+ justify-content: center;
1025
+ border-radius: var(--radius-xs);
1026
+ transition: all 0.15s;
1027
+ }
1028
+
1029
+ .close-modal:hover {
1030
+ background: var(--ui-element-background);
1031
+ color: var(--high-contrast-text);
1032
+ }
1033
+
1034
+ .modal-body {
1035
+ padding: var(--space-lg);
1036
+ overflow-y: auto;
1037
+ }
1038
+
1039
+ /* Form Styles */
1040
+ .form-section {
1041
+ margin-bottom: var(--space-md);
1042
+ }
1043
+
1044
+ .section-label {
1045
+ display: block;
1046
+ font-size: var(--font-xs);
1047
+ font-weight: var(--font-bold);
1048
+ text-transform: uppercase;
1049
+ color: var(--low-contrast-text);
1050
+ margin-bottom: var(--space-sm);
1051
+ }
1052
+
1053
+ .upload-box {
1054
+ border: 1px dashed var(--ui-element-border);
1055
+ border-radius: var(--radius-sm);
1056
+ padding: var(--space-md) var(--space-sm);
1057
+ text-align: center;
1058
+ cursor: pointer;
1059
+ transition: all 0.2s;
1060
+ display: flex;
1061
+ flex-direction: column;
1062
+ align-items: center;
1063
+ gap: var(--space-xs);
1064
+ }
1065
+
1066
+ .upload-box:hover {
1067
+ border-color: var(--hovered-border);
1068
+ background: var(--ui-element-background);
1069
+ }
1070
+
1071
+ .upload-box.uploaded {
1072
+ border-color: var(--success);
1073
+ border-style: solid;
1074
+ background: var(--success-dim);
1075
+ }
1076
+
1077
+ .upload-icon {
1078
+ font-size: 18px;
1079
+ color: var(--low-contrast-text);
1080
+ }
1081
+
1082
+ .upload-box.uploaded .upload-icon {
1083
+ color: var(--success);
1084
+ }
1085
+
1086
+ .upload-text {
1087
+ font-size: var(--font-xs);
1088
+ color: var(--low-contrast-text);
1089
+ white-space: nowrap;
1090
+ overflow: hidden;
1091
+ text-overflow: ellipsis;
1092
+ max-width: 100%;
1093
+ }
1094
+
1095
+ .upload-box.uploaded .upload-text {
1096
+ color: var(--success);
1097
+ font-weight: var(--font-medium);
1098
+ }
1099
+
1100
+ .form-row {
1101
+ display: grid;
1102
+ grid-template-columns: 1fr 1fr;
1103
+ gap: var(--space-sm);
1104
+ margin-bottom: var(--space-sm);
1105
+ }
1106
+
1107
+ .form-row:last-child {
1108
+ margin-bottom: 0;
1109
+ }
1110
+
1111
+ .form-row-4 {
1112
+ grid-template-columns: repeat(4, 1fr);
1113
+ }
1114
+
1115
+ .form-field {
1116
+ display: flex;
1117
+ flex-direction: column;
1118
+ }
1119
+
1120
+ .form-field.compact label {
1121
+ font-size: var(--font-xs);
1122
+ color: var(--low-contrast-text);
1123
+ margin-bottom: var(--space-xs);
1124
+ text-transform: uppercase;
1125
+ font-weight: var(--font-bold);
1126
+ }
1127
+
1128
+ .checkbox-row {
1129
+ display: flex;
1130
+ align-items: center;
1131
+ gap: var(--space-sm);
1132
+ margin-bottom: var(--space-sm);
1133
+ }
1134
+
1135
+ .checkbox-row input[type="checkbox"] {
1136
+ width: 16px;
1137
+ height: 16px;
1138
+ accent-color: var(--heather-light);
1139
+ cursor: pointer;
1140
+ }
1141
+
1142
+ .checkbox-row label {
1143
+ font-size: var(--font-sm);
1144
+ color: var(--low-contrast-text);
1145
+ cursor: pointer;
1146
+ user-select: none;
1147
+ }
1148
+
1149
+ select,
1150
+ input[type="text"],
1151
+ input[type="number"] {
1152
+ width: 100%;
1153
+ padding: var(--space-sm);
1154
+ background-color: var(--ui-element-background);
1155
+ border: 1px solid var(--ui-element-border);
1156
+ border-radius: var(--radius-xs);
1157
+ color: var(--high-contrast-text);
1158
+ font-size: var(--font-sm);
1159
+ font-family: var(--font);
1160
+ transition: all 0.2s;
1161
+ }
1162
+
1163
+ select {
1164
+ -webkit-appearance: none;
1165
+ -moz-appearance: none;
1166
+ appearance: none;
1167
+ 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='%23999' d='M6 8L2 4h8z'/%3E%3C/svg%3E");
1168
+ background-repeat: no-repeat;
1169
+ background-position: right 10px center;
1170
+ padding-right: 30px;
1171
+ cursor: pointer;
1172
+ }
1173
+
1174
+ select:focus,
1175
+ input:focus {
1176
+ outline: none;
1177
+ border-color: var(--heather-light);
1178
+ }
1179
+
1180
+ select:disabled,
1181
+ input:disabled {
1182
+ opacity: 0.4;
1183
+ cursor: not-allowed;
1184
+ }
1185
+
1186
+ .btn-primary {
1187
+ width: 100%;
1188
+ padding: var(--space-sm) var(--space-md);
1189
+ background: var(--heather-light);
1190
+ color: var(--high-contrast-text);
1191
+ border: none;
1192
+ border-radius: var(--radius-xs);
1193
+ font-weight: var(--font-medium);
1194
+ font-size: var(--font-sm);
1195
+ cursor: pointer;
1196
+ transition: all 0.2s;
1197
+ margin-top: var(--space-sm);
1198
+ }
1199
+
1200
+ .btn-primary:hover {
1201
+ background: var(--heather);
1202
+ }
1203
+
1204
+ .btn-primary:disabled {
1205
+ opacity: 0.4;
1206
+ cursor: not-allowed;
1207
+ }
1208
+
1209
+ .btn-danger {
1210
+ padding: var(--space-sm);
1211
+ background: transparent;
1212
+ border: 1px solid var(--danger);
1213
+ color: var(--danger);
1214
+ border-radius: var(--radius-xs);
1215
+ font-weight: var(--font-medium);
1216
+ font-size: var(--font-xs);
1217
+ cursor: pointer;
1218
+ transition: all 0.2s;
1219
+ }
1220
+
1221
+ .btn-danger:hover {
1222
+ background: var(--danger);
1223
+ color: var(--high-contrast-text);
1224
+ }
1225
+
1226
+ .btn-ghost {
1227
+ padding: var(--space-sm);
1228
+ background: transparent;
1229
+ border: 1px solid var(--ui-element-border);
1230
+ color: var(--low-contrast-text);
1231
+ border-radius: var(--radius-xs);
1232
+ font-weight: var(--font-medium);
1233
+ font-size: var(--font-xs);
1234
+ cursor: pointer;
1235
+ transition: all 0.2s;
1236
+ }
1237
+
1238
+ .btn-ghost:hover {
1239
+ border-color: var(--hovered-border);
1240
+ color: var(--high-contrast-text);
1241
+ }
1242
+
1243
+ .btn-ghost:disabled {
1244
+ opacity: 0.4;
1245
+ cursor: not-allowed;
1246
+ pointer-events: none;
1247
+ }
1248
+
1249
+ /* Icon Button */
1250
+ .icon-btn {
1251
+ width: 34px;
1252
+ height: 34px;
1253
+ display: flex;
1254
+ align-items: center;
1255
+ justify-content: center;
1256
+ background: var(--ui-element-background);
1257
+ border: 1px solid var(--subtle-border);
1258
+ border-radius: var(--radius-sm);
1259
+ color: var(--low-contrast-text);
1260
+ cursor: pointer;
1261
+ transition: all 0.2s;
1262
+ flex-shrink: 0;
1263
+ }
1264
+
1265
+ .icon-btn:hover {
1266
+ background: var(--hovered-ui-element-background);
1267
+ border-color: var(--hovered-border);
1268
+ color: var(--high-contrast-text);
1269
+ }
1270
+
1271
+ .icon-btn:disabled {
1272
+ opacity: 0.4;
1273
+ cursor: not-allowed;
1274
+ pointer-events: none;
1275
+ }
1276
+
1277
+ /* Data Preview */
1278
+ .data-preview {
1279
+ background: var(--app-background);
1280
+ border: 1px solid var(--subtle-border);
1281
+ border-radius: var(--radius-sm);
1282
+ padding: var(--space-md);
1283
+ margin-top: var(--space-sm);
1284
+ max-height: 150px;
1285
+ overflow: auto;
1286
+ }
1287
+
1288
+ .data-preview table {
1289
+ width: 100%;
1290
+ border-collapse: collapse;
1291
+ font-size: var(--font-xs);
1292
+ font-family: var(--mono);
1293
+ }
1294
+
1295
+ .data-preview th,
1296
+ .data-preview td {
1297
+ padding: var(--space-xs) var(--space-sm);
1298
+ text-align: left;
1299
+ border-bottom: 1px solid var(--subtle-border);
1300
+ white-space: nowrap;
1301
+ max-width: 150px;
1302
+ overflow: hidden;
1303
+ text-overflow: ellipsis;
1304
+ }
1305
+
1306
+ .data-preview th {
1307
+ color: var(--low-contrast-text);
1308
+ font-weight: var(--font-bold);
1309
+ text-transform: uppercase;
1310
+ }
1311
+
1312
+ /* Larger Modal */
1313
+ .modal-box-lg {
1314
+ max-width: 600px;
1315
+ }
1316
+
1317
+ /* Tabs */
1318
+ .tabs {
1319
+ display: flex;
1320
+ gap: var(--space-xs);
1321
+ margin-bottom: var(--space-md);
1322
+ background: var(--app-background);
1323
+ padding: var(--space-xs);
1324
+ border-radius: var(--radius-sm);
1325
+ border: 1px solid var(--subtle-border);
1326
+ }
1327
+
1328
+ .tab {
1329
+ flex: 1;
1330
+ padding: var(--space-sm) var(--space-md);
1331
+ background: transparent;
1332
+ border: none;
1333
+ border-radius: var(--radius-xs);
1334
+ color: var(--low-contrast-text);
1335
+ font-size: var(--font-sm);
1336
+ font-weight: var(--font-medium);
1337
+ cursor: pointer;
1338
+ transition: all 0.2s;
1339
+ }
1340
+
1341
+ .tab:hover {
1342
+ color: var(--high-contrast-text);
1343
+ background: var(--ui-element-background);
1344
+ }
1345
+
1346
+ .tab.active {
1347
+ background: var(--heather-light);
1348
+ color: var(--high-contrast-text);
1349
+ }
1350
+
1351
+ .tab-content {
1352
+ display: none;
1353
+ }
1354
+
1355
+ .tab-content.active {
1356
+ display: block;
1357
+ }
1358
+
1359
+ /* Tab container with fixed height */
1360
+ .tab-container {
1361
+ min-height: 140px;
1362
+ position: relative;
1363
+ }
1364
+
1365
+ /* Upload Grid */
1366
+ .upload-grid {
1367
+ display: grid;
1368
+ grid-template-columns: 1fr 1fr;
1369
+ gap: var(--space-md);
1370
+ }
1371
+
1372
+ .upload-section {
1373
+ display: flex;
1374
+ flex-direction: column;
1375
+ }
1376
+
1377
+ .upload-label {
1378
+ font-size: var(--font-xs);
1379
+ color: var(--low-contrast-text);
1380
+ margin-bottom: var(--space-xs);
1381
+ font-weight: var(--font-medium);
1382
+ }
1383
+
1384
+ .required {
1385
+ color: var(--danger);
1386
+ }
1387
+
1388
+ .optional {
1389
+ color: var(--low-contrast-text);
1390
+ font-weight: var(--font-regular);
1391
+ }
1392
+
1393
+ /* Collapsible */
1394
+ .collapsible-header {
1395
+ width: 100%;
1396
+ display: flex;
1397
+ justify-content: space-between;
1398
+ align-items: center;
1399
+ padding: var(--space-sm) var(--space-md);
1400
+ background: var(--ui-element-background);
1401
+ border: 1px solid var(--ui-element-border);
1402
+ border-radius: var(--radius-sm);
1403
+ color: var(--high-contrast-text);
1404
+ font-size: var(--font-sm);
1405
+ font-weight: var(--font-medium);
1406
+ cursor: pointer;
1407
+ transition: all 0.2s;
1408
+ }
1409
+
1410
+ .collapsible-header:hover {
1411
+ background: var(--hovered-ui-element-background);
1412
+ border-color: var(--hovered-border);
1413
+ }
1414
+
1415
+ .collapsible-icon {
1416
+ font-size: var(--font-xs);
1417
+ color: var(--low-contrast-text);
1418
+ transition: transform 0.2s;
1419
+ }
1420
+
1421
+ .collapsible-content {
1422
+ display: none;
1423
+ padding: var(--space-md);
1424
+ background: var(--app-background);
1425
+ border: 1px solid var(--subtle-border);
1426
+ border-top: none;
1427
+ border-radius: 0 0 var(--radius-sm) var(--radius-sm);
1428
+ margin-top: -1px;
1429
+ }
1430
+
1431
+ .collapsible-content.expanded {
1432
+ display: block;
1433
+ }
1434
+
1435
+ /* Advanced Groups */
1436
+ .advanced-group {
1437
+ margin-bottom: var(--space-lg);
1438
+ padding-bottom: var(--space-md);
1439
+ border-bottom: 1px solid var(--subtle-border);
1440
+ }
1441
+
1442
+ .advanced-group:last-child {
1443
+ margin-bottom: 0;
1444
+ padding-bottom: 0;
1445
+ border-bottom: none;
1446
+ }
1447
+
1448
+ .group-label {
1449
+ display: block;
1450
+ font-size: var(--font-xs);
1451
+ font-weight: var(--font-bold);
1452
+ text-transform: uppercase;
1453
+ color: var(--low-contrast-text);
1454
+ margin-bottom: var(--space-sm);
1455
+ }
1456
+
1457
+ /* Form field with label */
1458
+ .form-field label {
1459
+ display: block;
1460
+ font-size: var(--font-xs);
1461
+ color: var(--low-contrast-text);
1462
+ margin-bottom: var(--space-xs);
1463
+ font-weight: var(--font-medium);
1464
+ }
1465
+
1466
+ /* Field Hint */
1467
+ .field-hint {
1468
+ display: block;
1469
+ font-size: var(--font-xs);
1470
+ color: var(--low-contrast-text);
1471
+ margin-top: var(--space-xs);
1472
+ font-style: italic;
1473
+ }
1474
+
1475
+ /* Preview Info */
1476
+ .preview-info {
1477
+ font-size: var(--font-xs);
1478
+ color: var(--success);
1479
+ margin-bottom: var(--space-sm);
1480
+ font-weight: var(--font-medium);
1481
+ }
1482
+
1483
+ /* Secondary Button */
1484
+ .btn-secondary {
1485
+ padding: var(--space-sm) var(--space-md);
1486
+ background: var(--ui-element-background);
1487
+ color: var(--high-contrast-text);
1488
+ border: 1px solid var(--ui-element-border);
1489
+ border-radius: var(--radius-xs);
1490
+ font-weight: var(--font-medium);
1491
+ font-size: var(--font-sm);
1492
+ cursor: pointer;
1493
+ transition: all 0.2s;
1494
+ margin-top: var(--space-sm);
1495
+ }
1496
+
1497
+ .btn-secondary:hover {
1498
+ background: var(--hovered-ui-element-background);
1499
+ border-color: var(--hovered-border);
1500
+ }
1501
+
1502
+ .btn-secondary:disabled {
1503
+ opacity: 0.5;
1504
+ cursor: not-allowed;
1505
+ }
1506
+
1507
+ .btn-sm {
1508
+ padding: var(--space-xs) var(--space-sm);
1509
+ font-size: var(--font-xs);
1510
+ }
1511
+
1512
+ /* Checkbox Grid */
1513
+ .checkbox-grid {
1514
+ display: flex;
1515
+ gap: var(--space-lg);
1516
+ flex-wrap: wrap;
1517
+ }
1518
+
1519
+ .checkbox-grid .checkbox-row {
1520
+ margin-bottom: 0;
1521
+ }
1522
+
1523
+ /* Compact Data Preview */
1524
+ .data-preview-compact {
1525
+ background: var(--app-background);
1526
+ border: 1px solid var(--subtle-border);
1527
+ border-radius: var(--radius-sm);
1528
+ padding: var(--space-sm);
1529
+ margin-top: var(--space-sm);
1530
+ max-height: 80px;
1531
+ overflow: auto;
1532
+ font-size: var(--font-xs);
1533
+ }
1534
+
1535
+ .data-preview-compact table {
1536
+ width: 100%;
1537
+ border-collapse: collapse;
1538
+ font-family: var(--mono);
1539
+ }
1540
+
1541
+ .data-preview-compact th,
1542
+ .data-preview-compact td {
1543
+ padding: var(--space-xs);
1544
+ text-align: left;
1545
+ border-bottom: 1px solid var(--subtle-border);
1546
+ white-space: nowrap;
1547
+ max-width: 100px;
1548
+ overflow: hidden;
1549
+ text-overflow: ellipsis;
1550
+ }
1551
+
1552
+ .data-preview-compact th {
1553
+ color: var(--low-contrast-text);
1554
+ font-weight: var(--font-bold);
1555
+ text-transform: uppercase;
1556
+ font-size: 10px;
1557
+ }
1558
+
1559
+ /* Modal Footer */
1560
+ .modal-footer {
1561
+ padding-top: var(--space-md);
1562
+ border-top: 1px solid var(--subtle-border);
1563
+ margin-top: var(--space-md);
1564
+ }
1565
+
1566
+ .modal-footer .btn-primary {
1567
+ margin-top: 0;
1568
+ }
1569
+
1570
+ /* Scrollbar */
1571
+ ::-webkit-scrollbar {
1572
+ width: var(--space-sm);
1573
+ height: var(--space-sm);
1574
+ }
1575
+
1576
+ ::-webkit-scrollbar-track {
1577
+ background: var(--subtle-border);
1578
+ border-radius: var(--radius-xs);
1579
+ }
1580
+
1581
+ ::-webkit-scrollbar-thumb {
1582
+ background: var(--ui-element-border);
1583
+ border-radius: var(--radius-xs);
1584
+ }
1585
+
1586
+ ::-webkit-scrollbar-thumb:hover {
1587
+ background: var(--hovered-border);
1588
+ }
1589
+
1590
+ * {
1591
+ scrollbar-width: thin;
1592
+ scrollbar-color: var(--ui-element-border) var(--subtle-border);
1593
+ }
1594
+
1595
+ /* ==================== */
1596
+ /* Wizard Modal Styles */
1597
+ /* ==================== */
1598
+
1599
+ .modal-wizard {
1600
+ width: 600px;
1601
+ max-width: 95vw;
1602
+ height: 85vh;
1603
+ max-height: 700px;
1604
+ display: flex;
1605
+ flex-direction: column;
1606
+ }
1607
+
1608
+ .modal-wizard .modal-header {
1609
+ padding: var(--space-sm) var(--space-lg);
1610
+ font-size: var(--font-md);
1611
+ flex-shrink: 0;
1612
+ }
1613
+
1614
+ /* Step Indicators */
1615
+ .wizard-steps {
1616
+ display: flex;
1617
+ justify-content: center;
1618
+ align-items: center;
1619
+ padding: var(--space-md) var(--space-lg);
1620
+ background: var(--subtle-background);
1621
+ border-bottom: 1px solid var(--subtle-border);
1622
+ gap: var(--space-xl);
1623
+ }
1624
+
1625
+ .wizard-step {
1626
+ display: flex;
1627
+ align-items: center;
1628
+ gap: var(--space-sm);
1629
+ opacity: 0.5;
1630
+ transition: opacity 0.2s;
1631
+ }
1632
+
1633
+ .wizard-step.active {
1634
+ opacity: 1;
1635
+ }
1636
+
1637
+ .wizard-step.completed {
1638
+ opacity: 0.8;
1639
+ }
1640
+
1641
+ .step-number {
1642
+ width: 24px;
1643
+ height: 24px;
1644
+ border-radius: 50%;
1645
+ background: var(--ui-element-background);
1646
+ border: 2px solid var(--subtle-border);
1647
+ display: flex;
1648
+ align-items: center;
1649
+ justify-content: center;
1650
+ font-size: var(--font-xs);
1651
+ font-weight: var(--font-bold);
1652
+ transition: all 0.2s;
1653
+ }
1654
+
1655
+ .wizard-step.active .step-number {
1656
+ background: var(--heather);
1657
+ border-color: var(--heather-light);
1658
+ color: white;
1659
+ }
1660
+
1661
+ .wizard-step.completed .step-number {
1662
+ background: var(--success);
1663
+ border-color: var(--success);
1664
+ color: white;
1665
+ }
1666
+
1667
+ .step-label {
1668
+ font-size: var(--font-sm);
1669
+ font-weight: var(--font-medium);
1670
+ color: var(--low-contrast-text);
1671
+ }
1672
+
1673
+ .wizard-step.active .step-label {
1674
+ color: var(--high-contrast-text);
1675
+ }
1676
+
1677
+ /* Wizard Content */
1678
+ .wizard-content {
1679
+ flex: 1;
1680
+ overflow-y: auto;
1681
+ padding: var(--space-lg);
1682
+ }
1683
+
1684
+ .modal-wizard form {
1685
+ display: flex;
1686
+ flex-direction: column;
1687
+ flex: 1;
1688
+ min-height: 0;
1689
+ overflow: hidden;
1690
+ }
1691
+
1692
+ /* Wizard Footer */
1693
+ .wizard-footer {
1694
+ display: flex;
1695
+ align-items: center;
1696
+ padding: var(--space-md) var(--space-lg);
1697
+ border-top: 1px solid var(--subtle-border);
1698
+ gap: var(--space-sm);
1699
+ }
1700
+
1701
+ .wizard-footer .footer-spacer {
1702
+ flex: 1;
1703
+ }
1704
+
1705
+ .btn-secondary {
1706
+ background: var(--ui-element-background);
1707
+ color: var(--high-contrast-text);
1708
+ border: 1px solid var(--ui-element-border);
1709
+ padding: var(--space-sm) var(--space-md);
1710
+ border-radius: var(--radius-sm);
1711
+ font-size: var(--font-sm);
1712
+ font-weight: var(--font-medium);
1713
+ cursor: pointer;
1714
+ transition: all 0.15s;
1715
+ }
1716
+
1717
+ .btn-secondary:hover {
1718
+ background: var(--hovered-ui-element-background);
1719
+ border-color: var(--hovered-border);
1720
+ }
1721
+
1722
+ /* Compact form styles for wizard */
1723
+ .modal-wizard .form-section {
1724
+ margin-bottom: var(--space-md);
1725
+ }
1726
+
1727
+ .modal-wizard .section-label {
1728
+ margin-bottom: var(--space-xs);
1729
+ font-size: var(--font-xs);
1730
+ }
1731
+
1732
+ .modal-wizard .form-field {
1733
+ margin-bottom: var(--space-xs);
1734
+ }
1735
+
1736
+ .modal-wizard .form-field label {
1737
+ margin-bottom: 2px;
1738
+ }
1739
+
1740
+ .modal-wizard .form-row {
1741
+ gap: var(--space-sm);
1742
+ margin-bottom: var(--space-xs);
1743
+ }
1744
+
1745
+ .modal-wizard input[type="text"],
1746
+ .modal-wizard input[type="number"],
1747
+ .modal-wizard select {
1748
+ padding: var(--space-xs) var(--space-sm);
1749
+ font-size: var(--font-sm);
1750
+ }
1751
+
1752
+ .modal-wizard .tabs {
1753
+ margin-bottom: var(--space-xs);
1754
+ }
1755
+
1756
+ .modal-wizard .tab {
1757
+ padding: var(--space-xs) var(--space-sm);
1758
+ font-size: var(--font-xs);
1759
+ }
1760
+
1761
+ .modal-wizard .upload-grid {
1762
+ gap: var(--space-xs);
1763
+ }
1764
+
1765
+ .modal-wizard .upload-box {
1766
+ padding: var(--space-sm);
1767
+ min-height: 60px;
1768
+ }
1769
+
1770
+ .modal-wizard .upload-label {
1771
+ font-size: var(--font-xs);
1772
+ margin-bottom: 2px;
1773
+ }
1774
+
1775
+ .modal-wizard .checkbox-row label {
1776
+ font-size: var(--font-xs);
1777
+ }
1778
+
1779
+ .modal-wizard .field-hint {
1780
+ font-size: 10px;
1781
+ margin-top: 2px;
1782
+ }
1783
+
1784
+ /* Responsive */
1785
+ @media (max-width: 640px) {
1786
+ .modal-wizard {
1787
+ max-width: 100vw;
1788
+ max-height: 100vh;
1789
+ height: 100vh;
1790
+ border-radius: 0;
1791
+ }
1792
+
1793
+ .wizard-steps {
1794
+ gap: var(--space-md);
1795
+ }
1796
+
1797
+ .step-label {
1798
+ display: none;
1799
+ }
1800
+ }