@opentrace/components 0.1.1-rc.30 → 0.1.1-rc.43

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,3 +1,1144 @@
1
+ /*
2
+ * Copyright 2026 OpenTrace Contributors
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ /* ── Backdrop ─────────────────────────────────── */
18
+ .modal-backdrop {
19
+ position: fixed;
20
+ inset: 0;
21
+ z-index: 100;
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ background: rgba(0, 0, 0, 0.6);
26
+ backdrop-filter: blur(4px);
27
+ }
28
+
29
+ /* ── Card ─────────────────────────────────────── */
30
+ .modal-card {
31
+ background: var(--card);
32
+ border: 1px solid color-mix(in oklch, var(--border) 30%, transparent);
33
+ border-radius: calc(var(--radius) + 8px);
34
+ padding: 36px 32px 28px;
35
+ width: 460px;
36
+ max-width: 90vw;
37
+ box-shadow: var(--shadow-xl);
38
+ animation: modalEnter 0.25s ease-out;
39
+ }
40
+
41
+ .modal-card-wide {
42
+ width: 520px;
43
+ min-height: 340px;
44
+ overflow: hidden;
45
+ }
46
+
47
+ @keyframes modalEnter {
48
+ from {
49
+ opacity: 0;
50
+ transform: translateY(10px) scale(0.97);
51
+ }
52
+ to {
53
+ opacity: 1;
54
+ transform: translateY(0) scale(1);
55
+ }
56
+ }
57
+
58
+ .modal-card h2 {
59
+ margin: 0;
60
+ font-size: 1.15rem;
61
+ font-weight: 600;
62
+ color: var(--foreground);
63
+ }
64
+
65
+ /* ── CTA Button ──────────────────────────────── */
66
+ .btn-cta {
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ gap: 8px;
71
+ width: 100%;
72
+ padding: 14px 24px;
73
+ margin-top: 16px;
74
+ font-size: 0.95rem;
75
+ font-weight: 600;
76
+ color: var(--primary-foreground);
77
+ background: var(--primary);
78
+ border: none;
79
+ border-radius: 14px;
80
+ cursor: pointer;
81
+ transition:
82
+ background 0.15s,
83
+ transform 0.1s;
84
+ }
85
+
86
+ .btn-cta:hover:not(:disabled) {
87
+ background: color-mix(in oklch, var(--primary) 85%, black);
88
+ }
89
+
90
+ .btn-cta:active:not(:disabled) {
91
+ transform: scale(0.985);
92
+ }
93
+
94
+ .btn-cta:disabled {
95
+ opacity: 0.6;
96
+ cursor: not-allowed;
97
+ }
98
+
99
+ .btn-cta--secondary {
100
+ background: color-mix(in oklch, var(--foreground) 10%, transparent);
101
+ color: var(--foreground);
102
+ }
103
+
104
+ .btn-cta--secondary:hover:not(:disabled) {
105
+ background: color-mix(in oklch, var(--foreground) 15%, transparent);
106
+ }
107
+
108
+ .btn-spinner {
109
+ width: 14px;
110
+ height: 14px;
111
+ border: 2px solid
112
+ color-mix(in oklch, var(--primary-foreground) 30%, transparent);
113
+ border-top-color: var(--primary-foreground);
114
+ border-radius: 50%;
115
+ animation: btnSpin 0.6s linear infinite;
116
+ }
117
+
118
+ @keyframes btnSpin {
119
+ to {
120
+ transform: rotate(360deg);
121
+ }
122
+ }
123
+
124
+ /* ── Mobile (≤ 640px): tighter modal layout ── */
125
+ @media (max-width: 640px) {
126
+ .modal-card {
127
+ padding: 24px 20px 20px;
128
+ }
129
+
130
+ .btn-cta {
131
+ min-height: 48px;
132
+ }
133
+ }
134
+ /*
135
+ * Copyright 2026 OpenTrace Contributors
136
+ *
137
+ * Licensed under the Apache License, Version 2.0 (the "License");
138
+ * you may not use this file except in compliance with the License.
139
+ * You may obtain a copy of the License at
140
+ *
141
+ * http://www.apache.org/licenses/LICENSE-2.0
142
+ *
143
+ * Unless required by applicable law or agreed to in writing, software
144
+ * distributed under the License is distributed on an "AS IS" BASIS,
145
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
146
+ * See the License for the specific language governing permissions and
147
+ * limitations under the License.
148
+ */
149
+
150
+ /* ── Chip Toggle (URL / Directory) ─────────────── */
151
+ .chip-toggle {
152
+ display: inline-flex;
153
+ border: 1px solid color-mix(in oklch, var(--border) 30%, transparent);
154
+ border-radius: 20px;
155
+ overflow: hidden;
156
+ }
157
+
158
+ .chip-toggle-btn {
159
+ padding: 6px 12px;
160
+ font-size: 0.75rem;
161
+ font-weight: 500;
162
+ color: var(--muted-foreground);
163
+ background: transparent;
164
+ border: none;
165
+ cursor: pointer;
166
+ transition: all 0.15s;
167
+ }
168
+
169
+ .chip-toggle-btn + .chip-toggle-btn {
170
+ border-left: 1px solid color-mix(in oklch, var(--border) 30%, transparent);
171
+ }
172
+
173
+ .chip-toggle-btn:hover:not(.active) {
174
+ color: var(--foreground);
175
+ }
176
+
177
+ .chip-toggle-btn.active {
178
+ color: var(--primary);
179
+ background: color-mix(in oklch, var(--primary) 10%, transparent);
180
+ font-weight: 600;
181
+ }
182
+
183
+ /* ── Source Toggle ───────────────────────────── */
184
+ .source-toggle {
185
+ display: flex;
186
+ justify-content: center;
187
+ margin-bottom: 20px;
188
+ }
189
+
190
+ /* ── Form Hero (centered icon + title) ───────── */
191
+ .form-hero {
192
+ display: flex;
193
+ flex-direction: column;
194
+ align-items: center;
195
+ text-align: center;
196
+ margin-bottom: 28px;
197
+ }
198
+
199
+ .hero-icon {
200
+ width: 64px;
201
+ height: 64px;
202
+ display: flex;
203
+ align-items: center;
204
+ justify-content: center;
205
+ border-radius: 16px;
206
+ background: color-mix(in oklch, var(--foreground) 10%, transparent);
207
+ color: var(--foreground);
208
+ margin-bottom: 16px;
209
+ position: relative;
210
+ overflow: hidden;
211
+ transition:
212
+ background 0.5s cubic-bezier(0.4, 0, 0.2, 1),
213
+ color 0.5s cubic-bezier(0.4, 0, 0.2, 1);
214
+ }
215
+
216
+ .hero-icon--provider {
217
+ background: color-mix(in oklch, var(--primary) 15%, transparent);
218
+ color: var(--primary);
219
+ }
220
+
221
+ /* --- Quad-split provider icon --- */
222
+
223
+ /* Each icon layer fills the hero-icon, clipped to its quadrant */
224
+ .quad-layer {
225
+ position: absolute;
226
+ inset: 12px;
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ transition: clip-path 0.6s cubic-bezier(0.4, 0, 0.2, 1);
231
+ }
232
+
233
+ /* X-shaped divider lines overlay */
234
+ .quad-dividers {
235
+ position: absolute;
236
+ inset: 0;
237
+ z-index: 1;
238
+ pointer-events: none;
239
+ transition: opacity 0.4s cubic-bezier(0.4, 0, 0.2, 1);
240
+ }
241
+
242
+ .quad-dividers--hidden {
243
+ opacity: 0;
244
+ }
245
+
246
+ .form-hero h2 {
247
+ margin: 0 0 6px;
248
+ font-size: 1.2rem;
249
+ }
250
+
251
+ .hero-subtitle {
252
+ margin: 0;
253
+ font-size: 0.82rem;
254
+ color: var(--muted-foreground);
255
+ line-height: 1.45;
256
+ }
257
+
258
+ /* ── Pill Inputs ─────────────────────────────── */
259
+ .form-fields {
260
+ display: flex;
261
+ flex-direction: column;
262
+ gap: 10px;
263
+ }
264
+
265
+ .input-pill {
266
+ display: block;
267
+ width: 100%;
268
+ padding: 14px 18px;
269
+ font-size: 0.88rem;
270
+ color: var(--foreground);
271
+ background: color-mix(in oklch, var(--foreground) 5%, transparent);
272
+ border: 1px solid color-mix(in oklch, var(--border) 25%, transparent);
273
+ border-radius: 14px;
274
+ outline: none;
275
+ transition:
276
+ border-color 0.15s,
277
+ box-shadow 0.15s;
278
+ box-sizing: border-box;
279
+ }
280
+
281
+ .input-pill:focus {
282
+ border-color: var(--primary);
283
+ box-shadow: 0 0 0 3px color-mix(in oklch, var(--primary) 10%, transparent);
284
+ }
285
+
286
+ .input-pill::placeholder {
287
+ color: var(--muted-foreground);
288
+ opacity: 0.55;
289
+ }
290
+
291
+ /* Pill row with inline icons */
292
+ .input-pill-row {
293
+ position: relative;
294
+ display: flex;
295
+ align-items: center;
296
+ }
297
+
298
+ .input-pill-row .input-icon {
299
+ position: absolute;
300
+ left: 14px;
301
+ color: var(--muted-foreground);
302
+ opacity: 0.5;
303
+ pointer-events: none;
304
+ z-index: 1;
305
+ }
306
+
307
+ .input-pill--icon {
308
+ padding-left: 42px;
309
+ padding-right: 42px;
310
+ }
311
+
312
+ .input-toggle {
313
+ position: absolute;
314
+ right: 8px;
315
+ width: 32px;
316
+ height: 32px;
317
+ display: flex;
318
+ align-items: center;
319
+ justify-content: center;
320
+ background: transparent;
321
+ border: none;
322
+ border-radius: 8px;
323
+ color: var(--muted-foreground);
324
+ opacity: 0.5;
325
+ cursor: pointer;
326
+ transition:
327
+ opacity 0.15s,
328
+ background 0.15s;
329
+ }
330
+
331
+ .input-toggle:hover {
332
+ opacity: 0.8;
333
+ background: color-mix(in oklch, var(--foreground) 6%, transparent);
334
+ }
335
+
336
+ /* ── Autocomplete Dropdown ─────────────────── */
337
+ .autocomplete-wrapper {
338
+ position: relative;
339
+ }
340
+
341
+ .autocomplete-dropdown {
342
+ position: absolute;
343
+ top: calc(100% + 4px);
344
+ left: 0;
345
+ right: 0;
346
+ z-index: 10;
347
+ background: var(--card);
348
+ border: 1px solid color-mix(in oklch, var(--border) 40%, transparent);
349
+ border-radius: 12px;
350
+ padding: 4px;
351
+ box-shadow: var(--shadow-xl);
352
+ animation: dropdownEnter 0.15s ease-out;
353
+ }
354
+
355
+ @keyframes dropdownEnter {
356
+ from {
357
+ opacity: 0;
358
+ transform: translateY(-4px);
359
+ }
360
+ to {
361
+ opacity: 1;
362
+ transform: translateY(0);
363
+ }
364
+ }
365
+
366
+ .autocomplete-label {
367
+ padding: 6px 10px 4px;
368
+ font-size: 0.65rem;
369
+ font-weight: 600;
370
+ text-transform: uppercase;
371
+ letter-spacing: 0.05em;
372
+ color: var(--muted-foreground);
373
+ opacity: 0.6;
374
+ }
375
+
376
+ .autocomplete-item {
377
+ display: flex;
378
+ align-items: center;
379
+ gap: 8px;
380
+ width: 100%;
381
+ padding: 8px 10px;
382
+ font-size: 0.82rem;
383
+ color: var(--foreground);
384
+ background: transparent;
385
+ border: none;
386
+ border-radius: 8px;
387
+ cursor: pointer;
388
+ text-align: left;
389
+ transition: background 0.1s;
390
+ }
391
+
392
+ .autocomplete-item:hover {
393
+ background: color-mix(in oklch, var(--foreground) 6%, transparent);
394
+ }
395
+
396
+ .autocomplete-item svg {
397
+ flex-shrink: 0;
398
+ color: var(--muted-foreground);
399
+ opacity: 0.5;
400
+ }
401
+
402
+ .autocomplete-item-text {
403
+ overflow: hidden;
404
+ text-overflow: ellipsis;
405
+ white-space: nowrap;
406
+ flex: 1;
407
+ min-width: 0;
408
+ }
409
+
410
+ .autocomplete-item-remove {
411
+ display: flex;
412
+ align-items: center;
413
+ justify-content: center;
414
+ width: 22px;
415
+ height: 22px;
416
+ flex-shrink: 0;
417
+ background: transparent;
418
+ border: none;
419
+ border-radius: 6px;
420
+ color: var(--muted-foreground);
421
+ opacity: 0;
422
+ cursor: pointer;
423
+ transition:
424
+ opacity 0.15s,
425
+ background 0.15s,
426
+ color 0.15s;
427
+ }
428
+
429
+ .autocomplete-item:hover .autocomplete-item-remove {
430
+ opacity: 0.5;
431
+ }
432
+
433
+ .autocomplete-item-remove:hover {
434
+ opacity: 1 !important;
435
+ background: color-mix(in oklch, var(--destructive) 12%, transparent);
436
+ color: var(--destructive);
437
+ }
438
+
439
+ /* ── Example Repos ──────────────────────────── */
440
+ .example-repos {
441
+ display: flex;
442
+ align-items: center;
443
+ gap: 6px;
444
+ flex-wrap: wrap;
445
+ }
446
+
447
+ .example-repos-label {
448
+ font-size: 0.72rem;
449
+ font-weight: 500;
450
+ color: var(--muted-foreground);
451
+ opacity: 0.7;
452
+ }
453
+
454
+ .example-repo-chip {
455
+ display: inline-flex;
456
+ align-items: center;
457
+ padding: 4px 10px;
458
+ font-size: 0.72rem;
459
+ font-weight: 500;
460
+ color: var(--muted-foreground);
461
+ background: color-mix(in oklch, var(--foreground) 5%, transparent);
462
+ border: 1px solid color-mix(in oklch, var(--border) 25%, transparent);
463
+ border-radius: 12px;
464
+ cursor: pointer;
465
+ transition: all 0.15s;
466
+ }
467
+
468
+ .example-repo-chip:hover {
469
+ color: var(--primary);
470
+ border-color: color-mix(in oklch, var(--primary) 40%, transparent);
471
+ background: color-mix(in oklch, var(--primary) 8%, transparent);
472
+ }
473
+
474
+ .example-repo-size {
475
+ margin-left: 6px;
476
+ padding: 1px 5px;
477
+ font-size: 0.6rem;
478
+ font-weight: 600;
479
+ letter-spacing: 0.02em;
480
+ border-radius: 4px;
481
+ line-height: 1.3;
482
+ }
483
+
484
+ .example-repo-size--s {
485
+ color: #4ade80;
486
+ background: color-mix(in oklch, #4ade80 12%, transparent);
487
+ }
488
+
489
+ .example-repo-size--m {
490
+ color: #fbbf24;
491
+ background: color-mix(in oklch, #fbbf24 12%, transparent);
492
+ }
493
+
494
+ .example-repo-size--l {
495
+ color: #f87171;
496
+ background: color-mix(in oklch, #f87171 12%, transparent);
497
+ }
498
+
499
+ /* ── Directory Picker ───────────────────────── */
500
+ .directory-picker {
501
+ position: relative;
502
+ }
503
+
504
+ .directory-input {
505
+ /* Hidden native file input */
506
+ position: absolute;
507
+ width: 1px;
508
+ height: 1px;
509
+ opacity: 0;
510
+ overflow: hidden;
511
+ }
512
+
513
+ .directory-browse-btn {
514
+ display: flex;
515
+ align-items: center;
516
+ gap: 10px;
517
+ cursor: pointer;
518
+ text-align: left;
519
+ color: var(--muted-foreground);
520
+ transition:
521
+ border-color 0.15s,
522
+ color 0.15s;
523
+ }
524
+
525
+ .directory-browse-btn:hover {
526
+ border-color: var(--primary);
527
+ color: var(--foreground);
528
+ }
529
+
530
+ .directory-browse-btn svg {
531
+ flex-shrink: 0;
532
+ opacity: 0.6;
533
+ }
534
+
535
+ .directory-name {
536
+ color: var(--foreground);
537
+ font-weight: 500;
538
+ }
539
+
540
+ .directory-count {
541
+ color: var(--muted-foreground);
542
+ font-weight: 400;
543
+ }
544
+
545
+ /* ── Form Error ──────────────────────────────── */
546
+ .form-error {
547
+ display: flex;
548
+ align-items: center;
549
+ gap: 8px;
550
+ padding: 10px 14px;
551
+ margin-top: 10px;
552
+ font-size: 0.8rem;
553
+ color: var(--destructive);
554
+ background: color-mix(in oklch, var(--destructive) 8%, transparent);
555
+ border: 1px solid color-mix(in oklch, var(--destructive) 20%, transparent);
556
+ border-radius: 10px;
557
+ }
558
+
559
+ .form-error svg {
560
+ flex-shrink: 0;
561
+ }
562
+
563
+ /* ── Already Indexed Notice ──────────────────── */
564
+ .form-indexed {
565
+ display: flex;
566
+ align-items: center;
567
+ gap: 8px;
568
+ padding: 10px 14px;
569
+ margin-top: 10px;
570
+ font-size: 0.8rem;
571
+ color: oklch(0.7 0.18 155);
572
+ background: color-mix(in oklch, oklch(0.7 0.18 155) 8%, transparent);
573
+ border: 1px solid color-mix(in oklch, oklch(0.7 0.18 155) 20%, transparent);
574
+ border-radius: 10px;
575
+ }
576
+
577
+ .form-indexed svg {
578
+ flex-shrink: 0;
579
+ }
580
+
581
+ .form-indexed strong {
582
+ font-weight: 600;
583
+ }
584
+
585
+ /* ── Form Info (warnings / informational notices) ── */
586
+ .form-info {
587
+ display: flex;
588
+ align-items: flex-start;
589
+ gap: 8px;
590
+ padding: 10px 14px;
591
+ margin-top: 6px;
592
+ font-size: 0.75rem;
593
+ line-height: 1.45;
594
+ color: color-mix(in oklch, var(--foreground) 70%, transparent);
595
+ background: color-mix(in oklch, var(--foreground) 4%, transparent);
596
+ border: 1px solid color-mix(in oklch, var(--foreground) 10%, transparent);
597
+ border-radius: 10px;
598
+ }
599
+
600
+ .form-info svg {
601
+ flex-shrink: 0;
602
+ margin-top: 1px;
603
+ opacity: 0.6;
604
+ }
605
+
606
+ /* ── Bottom Chips ────────────────────────────── */
607
+ .form-chips {
608
+ display: flex;
609
+ justify-content: center;
610
+ gap: 8px;
611
+ margin-top: 16px;
612
+ }
613
+
614
+ .chip {
615
+ display: inline-flex;
616
+ align-items: center;
617
+ gap: 5px;
618
+ padding: 6px 14px;
619
+ font-size: 0.75rem;
620
+ font-weight: 500;
621
+ color: var(--muted-foreground);
622
+ background: transparent;
623
+ border: 1px solid color-mix(in oklch, var(--border) 30%, transparent);
624
+ border-radius: 20px;
625
+ cursor: pointer;
626
+ transition: all 0.15s;
627
+ }
628
+
629
+ .chip:hover {
630
+ border-color: color-mix(in oklch, var(--border) 60%, transparent);
631
+ color: var(--foreground);
632
+ }
633
+
634
+ .chip svg {
635
+ opacity: 0.6;
636
+ }
637
+
638
+ .chip-input {
639
+ background: transparent;
640
+ border: none;
641
+ outline: none;
642
+ font-size: 0.75rem;
643
+ font-weight: 500;
644
+ color: var(--foreground);
645
+ width: 90px;
646
+ padding: 0;
647
+ margin: 0;
648
+ }
649
+
650
+ .chip-input::placeholder {
651
+ color: var(--muted-foreground);
652
+ opacity: 0.7;
653
+ }
654
+
655
+ /* ── Mobile (≤ 640px) ────────────────────────── */
656
+ @media (max-width: 640px) {
657
+ .autocomplete-dropdown {
658
+ max-height: 200px;
659
+ overflow-y: auto;
660
+ }
661
+
662
+ .chip-toggle-btn {
663
+ min-height: 44px;
664
+ }
665
+ }
666
+ /*
667
+ * Copyright 2026 OpenTrace Contributors
668
+ *
669
+ * Licensed under the Apache License, Version 2.0 (the "License");
670
+ * you may not use this file except in compliance with the License.
671
+ * You may obtain a copy of the License at
672
+ *
673
+ * http://www.apache.org/licenses/LICENSE-2.0
674
+ *
675
+ * Unless required by applicable law or agreed to in writing, software
676
+ * distributed under the License is distributed on an "AS IS" BASIS,
677
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
678
+ * See the License for the specific language governing permissions and
679
+ * limitations under the License.
680
+ */
681
+
682
+ /* ── Indexing Header (icon + title) ──────────── */
683
+ .indexing-header {
684
+ display: flex;
685
+ align-items: center;
686
+ gap: 10px;
687
+ margin-bottom: 4px;
688
+ }
689
+
690
+ .indexing-header h2 {
691
+ margin: 0;
692
+ }
693
+
694
+ .indexing-header-icon {
695
+ display: flex;
696
+ align-items: center;
697
+ justify-content: center;
698
+ width: 32px;
699
+ height: 32px;
700
+ border-radius: 8px;
701
+ background: color-mix(in oklch, var(--foreground) 8%, transparent);
702
+ color: var(--foreground);
703
+ flex-shrink: 0;
704
+ }
705
+
706
+ /* ── Indexing Progress ───────────────────────── */
707
+ .indexing-progress {
708
+ text-align: center;
709
+ padding: 12px 0;
710
+ }
711
+
712
+ .indexing-progress h2 {
713
+ margin-bottom: 20px;
714
+ }
715
+
716
+ .indexing-message {
717
+ font-size: 0.8rem;
718
+ color: var(--muted-foreground);
719
+ margin: 16px 0;
720
+ }
721
+
722
+ .indexing-message--truncate {
723
+ overflow: hidden;
724
+ text-overflow: ellipsis;
725
+ white-space: nowrap;
726
+ max-width: 100%;
727
+ }
728
+
729
+ .indexing-message--detail {
730
+ font-size: 0.75rem;
731
+ opacity: 0.7;
732
+ margin-top: -8px;
733
+ }
734
+
735
+ /* ── Multi-Stage Progress ────────────────────── */
736
+ .multi-stage-progress {
737
+ display: flex;
738
+ flex-direction: column;
739
+ margin-bottom: 16px;
740
+ text-align: left;
741
+ }
742
+
743
+ .stage-row {
744
+ display: flex;
745
+ flex-direction: column;
746
+ gap: 5px;
747
+ padding: 0 4px;
748
+ margin-bottom: 10px;
749
+ max-height: 70px;
750
+ opacity: 1;
751
+ overflow: hidden;
752
+ transition:
753
+ opacity 0.5s ease,
754
+ max-height 0.4s ease 0.15s,
755
+ gap 0.4s ease 0.15s,
756
+ margin 0.4s ease 0.15s;
757
+ }
758
+
759
+ .stage-row:last-child {
760
+ margin-bottom: 0;
761
+ }
762
+
763
+ .stage-row--completed {
764
+ opacity: 0.35;
765
+ }
766
+
767
+ .stage-row--removing {
768
+ opacity: 0;
769
+ max-height: 0;
770
+ gap: 0;
771
+ padding: 0;
772
+ margin-bottom: 0;
773
+ overflow: hidden;
774
+ pointer-events: none;
775
+ }
776
+
777
+ .stage-row--active .stage-label {
778
+ color: var(--foreground);
779
+ }
780
+
781
+ .stage-header {
782
+ display: flex;
783
+ align-items: baseline;
784
+ justify-content: space-between;
785
+ }
786
+
787
+ .stage-label {
788
+ font-size: 0.75rem;
789
+ font-weight: 600;
790
+ color: var(--muted-foreground);
791
+ white-space: nowrap;
792
+ }
793
+
794
+ .stage-count {
795
+ font-size: 0.68rem;
796
+ font-weight: 500;
797
+ color: var(--muted-foreground);
798
+ font-variant-numeric: tabular-nums;
799
+ white-space: nowrap;
800
+ }
801
+
802
+ .stage-detail {
803
+ font-size: 0.65rem;
804
+ color: var(--muted-foreground);
805
+ white-space: nowrap;
806
+ overflow: hidden;
807
+ text-overflow: ellipsis;
808
+ line-height: 1;
809
+ }
810
+
811
+ .stage-row--active .stage-detail {
812
+ color: color-mix(in oklch, var(--foreground) 65%, transparent);
813
+ }
814
+
815
+ .stage-row--completed .stage-detail {
816
+ font-size: 0.62rem;
817
+ }
818
+
819
+ .stage-bar {
820
+ height: 5px;
821
+ background: color-mix(in oklch, var(--foreground) 8%, transparent);
822
+ border-radius: 3px;
823
+ overflow: hidden;
824
+ }
825
+
826
+ .stage-bar-fill {
827
+ display: block;
828
+ height: 100%;
829
+ background: var(--primary);
830
+ border-radius: 3px;
831
+ transition: width 0.3s ease;
832
+ }
833
+
834
+ .stage-row--completed .stage-bar-fill {
835
+ background: oklch(0.7 0.18 155);
836
+ }
837
+
838
+ .stage-bar--indeterminate .stage-bar-fill {
839
+ width: 40%;
840
+ animation: indeterminate-slide 1.4s ease-in-out infinite;
841
+ }
842
+
843
+ @keyframes indeterminate-slide {
844
+ 0% {
845
+ transform: translateX(-100%);
846
+ }
847
+ 100% {
848
+ transform: translateX(250%);
849
+ }
850
+ }
851
+
852
+ /* ── Stats Grid ──────────────────────────────── */
853
+ .indexing-stats-grid {
854
+ display: grid;
855
+ grid-template-columns: 1fr 1fr;
856
+ gap: 12px;
857
+ margin: 16px 0;
858
+ }
859
+
860
+ .stat-card {
861
+ display: flex;
862
+ flex-direction: column;
863
+ align-items: center;
864
+ padding: 14px 12px;
865
+ background: color-mix(in oklch, var(--primary) 6%, transparent);
866
+ border: 1px solid color-mix(in oklch, var(--primary) 15%, transparent);
867
+ border-radius: var(--radius);
868
+ }
869
+
870
+ .stat-value {
871
+ font-size: 1.5rem;
872
+ font-weight: 700;
873
+ color: var(--foreground);
874
+ font-variant-numeric: tabular-nums;
875
+ line-height: 1.2;
876
+ }
877
+
878
+ .stat-label {
879
+ font-size: 0.7rem;
880
+ font-weight: 500;
881
+ color: var(--muted-foreground);
882
+ margin-top: 2px;
883
+ text-transform: uppercase;
884
+ letter-spacing: 0.05em;
885
+ }
886
+
887
+ /* ── Failed Stage ─────────────────────────────── */
888
+ .failed-content {
889
+ display: flex;
890
+ flex-direction: column;
891
+ align-items: center;
892
+ gap: 8px;
893
+ margin-bottom: 12px;
894
+ }
895
+
896
+ .failed-icon {
897
+ color: var(--destructive);
898
+ animation: doneAppear 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
899
+ }
900
+
901
+ .failed-content h2 {
902
+ margin: 0;
903
+ font-size: 1.1rem;
904
+ font-weight: 600;
905
+ color: var(--destructive);
906
+ }
907
+
908
+ .failed-message {
909
+ margin: 0;
910
+ font-size: 0.82rem;
911
+ color: var(--muted-foreground);
912
+ line-height: 1.45;
913
+ max-width: 360px;
914
+ }
915
+
916
+ /* ── Done Stage ──────────────────────────────── */
917
+ .done-content {
918
+ display: flex;
919
+ flex-direction: column;
920
+ align-items: center;
921
+ gap: 12px;
922
+ margin-bottom: 8px;
923
+ }
924
+
925
+ .done-content h2 {
926
+ margin: 0;
927
+ font-size: 1.1rem;
928
+ font-weight: 600;
929
+ color: oklch(0.7 0.18 155);
930
+ }
931
+
932
+ .done-checkmark {
933
+ color: oklch(0.7 0.18 155);
934
+ animation: doneAppear 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
935
+ }
936
+
937
+ .done-check-path {
938
+ animation: checkDraw 0.3s ease-out 0.3s both;
939
+ }
940
+
941
+ @keyframes doneAppear {
942
+ 0% {
943
+ transform: scale(0);
944
+ opacity: 0;
945
+ }
946
+ 70% {
947
+ transform: scale(1.15);
948
+ }
949
+ 100% {
950
+ transform: scale(1);
951
+ opacity: 1;
952
+ }
953
+ }
954
+
955
+ @keyframes checkDraw {
956
+ 0% {
957
+ opacity: 0;
958
+ stroke-dasharray: 20;
959
+ stroke-dashoffset: 20;
960
+ }
961
+ 100% {
962
+ opacity: 1;
963
+ stroke-dasharray: 20;
964
+ stroke-dashoffset: 0;
965
+ }
966
+ }
967
+
968
+ /* ── Step Indicator (legacy) ──────────────────── */
969
+ .step-indicator {
970
+ display: flex;
971
+ align-items: flex-start;
972
+ justify-content: center;
973
+ gap: 0;
974
+ margin-bottom: 20px;
975
+ }
976
+
977
+ .step {
978
+ display: flex;
979
+ flex-direction: column;
980
+ align-items: center;
981
+ position: relative;
982
+ flex: 1;
983
+ min-width: 0;
984
+ }
985
+
986
+ .step-circle {
987
+ width: 28px;
988
+ height: 28px;
989
+ border-radius: 50%;
990
+ display: flex;
991
+ align-items: center;
992
+ justify-content: center;
993
+ font-size: 0.7rem;
994
+ font-weight: 600;
995
+ position: relative;
996
+ z-index: 1;
997
+ transition: all 0.3s ease;
998
+ }
999
+
1000
+ .step-circle.completed {
1001
+ background: var(--primary);
1002
+ color: var(--primary-foreground);
1003
+ border: 2px solid var(--primary);
1004
+ }
1005
+
1006
+ .step-circle.current {
1007
+ background: transparent;
1008
+ color: var(--primary);
1009
+ border: 2px solid var(--primary);
1010
+ animation: stepPulse 2s ease-in-out infinite;
1011
+ }
1012
+
1013
+ .step-circle.future {
1014
+ background: transparent;
1015
+ color: var(--muted-foreground);
1016
+ border: 2px solid color-mix(in oklch, var(--border) 50%, transparent);
1017
+ }
1018
+
1019
+ .step-circle.failed {
1020
+ background: var(--destructive);
1021
+ color: white;
1022
+ border: 2px solid var(--destructive);
1023
+ }
1024
+
1025
+ .step-number {
1026
+ line-height: 1;
1027
+ }
1028
+
1029
+ .step-label {
1030
+ font-size: 0.65rem;
1031
+ font-weight: 500;
1032
+ color: var(--muted-foreground);
1033
+ margin-top: 6px;
1034
+ white-space: nowrap;
1035
+ }
1036
+
1037
+ .step-circle.completed + .step-label,
1038
+ .step-circle.current + .step-label {
1039
+ color: var(--foreground);
1040
+ }
1041
+
1042
+ .step-connector {
1043
+ position: absolute;
1044
+ top: 14px;
1045
+ right: calc(50% + 14px);
1046
+ width: calc(100% - 28px);
1047
+ height: 2px;
1048
+ background: color-mix(in oklch, var(--border) 50%, transparent);
1049
+ z-index: 0;
1050
+ transition: background 0.3s ease;
1051
+ }
1052
+
1053
+ .step-connector.completed {
1054
+ background: var(--primary);
1055
+ }
1056
+
1057
+ @keyframes stepPulse {
1058
+ 0%,
1059
+ 100% {
1060
+ box-shadow: 0 0 0 0 color-mix(in oklch, var(--primary) 40%, transparent);
1061
+ }
1062
+ 50% {
1063
+ box-shadow: 0 0 0 6px color-mix(in oklch, var(--primary) 0%, transparent);
1064
+ }
1065
+ }
1066
+
1067
+ /* ── Error Card ──────────────────────────────── */
1068
+ .indexing-error {
1069
+ margin-top: 16px;
1070
+ padding: 16px;
1071
+ background: color-mix(in oklch, var(--destructive) 8%, transparent);
1072
+ border: 1px solid color-mix(in oklch, var(--destructive) 25%, transparent);
1073
+ border-radius: var(--radius);
1074
+ text-align: left;
1075
+ }
1076
+
1077
+ .error-header {
1078
+ display: flex;
1079
+ align-items: center;
1080
+ gap: 8px;
1081
+ font-size: 0.85rem;
1082
+ font-weight: 600;
1083
+ color: var(--destructive);
1084
+ margin-bottom: 8px;
1085
+ }
1086
+
1087
+ .error-message {
1088
+ font-size: 0.8rem;
1089
+ color: var(--muted-foreground);
1090
+ margin: 0 0 8px;
1091
+ }
1092
+
1093
+ .error-list {
1094
+ font-size: 0.75rem;
1095
+ color: var(--muted-foreground);
1096
+ margin: 0 0 12px;
1097
+ padding-left: 18px;
1098
+ }
1099
+
1100
+ .error-list li {
1101
+ margin-bottom: 4px;
1102
+ }
1103
+
1104
+ /* ── Legacy support ──────────────────────────── */
1105
+ .modal-error {
1106
+ color: var(--destructive);
1107
+ font-size: 0.8rem;
1108
+ margin: 8px 0;
1109
+ }
1110
+
1111
+ .btn-cancel {
1112
+ padding: 8px 18px;
1113
+ font-size: 0.8rem;
1114
+ font-weight: 500;
1115
+ border-radius: var(--radius);
1116
+ border: 1px solid color-mix(in oklch, var(--border) 40%, transparent);
1117
+ color: var(--muted-foreground);
1118
+ background: transparent;
1119
+ cursor: pointer;
1120
+ transition: background 0.15s;
1121
+ }
1122
+
1123
+ .btn-cancel:hover {
1124
+ background: color-mix(in oklch, var(--border) 20%, transparent);
1125
+ }
1126
+
1127
+ .btn-cancel:disabled {
1128
+ opacity: 0.5;
1129
+ cursor: not-allowed;
1130
+ }
1131
+
1132
+ .indexing-error .btn-cancel {
1133
+ margin-top: 4px;
1134
+ }
1135
+
1136
+ /* ── Mobile (≤ 640px) ────────────────────────── */
1137
+ @media (max-width: 640px) {
1138
+ .indexing-stats-grid {
1139
+ grid-template-columns: 1fr;
1140
+ }
1141
+ }
1
1142
  :root{--sigma-background-color:#fff;--sigma-controls-background-color:#fff;--sigma-controls-background-color-hover:rgba(0,0,0,0.2);--sigma-controls-border-color:rgba(0,0,0,0.2);--sigma-controls-color:#000;--sigma-controls-zindex:100;--sigma-controls-margin:5px;--sigma-controls-size:30px;}div.react-sigma{height:100%;width:100%;position:relative;background:var(--sigma-background-color);}div.sigma-container{height:100%;width:100%;}.react-sigma-controls{position:absolute;z-index:var(--sigma-controls-zindex);border:2px solid var(--sigma-controls-border-color);border-radius:4px;color:var(--sigma-controls-color);background-color:var(--sigma-controls-background-color);}.react-sigma-controls.bottom-right{bottom:var(--sigma-controls-margin);right:var(--sigma-controls-margin);}.react-sigma-controls.bottom-left{bottom:var(--sigma-controls-margin);left:var(--sigma-controls-margin);}.react-sigma-controls.top-right{top:var(--sigma-controls-margin);right:var(--sigma-controls-margin);}.react-sigma-controls.top-left{top:var(--sigma-controls-margin);left:var(--sigma-controls-margin);}.react-sigma-controls:first-child{border-top-left-radius:2px;border-top-right-radius:2px;}.react-sigma-controls:last-child{border-bottom-left-radius:2px;border-bottom-right-radius:2px;}.react-sigma-control{width:var(--sigma-controls-size);height:var(--sigma-controls-size);line-height:var(--sigma-controls-size);background-color:var(--sigma-controls-background-color);border-bottom:1px solid var(--sigma-controls-border-color);}.react-sigma-control:last-child{border-bottom:none;}.react-sigma-control>*{box-sizing:border-box;}.react-sigma-control>button{display:block;border:none;margin:0;padding:0;width:var(--sigma-controls-size);height:var(--sigma-controls-size);line-height:var(--sigma-controls-size);background-position:center;background-size:50%;background-repeat:no-repeat;background-color:var(--sigma-controls-background-color);clip:rect(0,0,0,0);}.react-sigma-control>button:hover{background-color:var(--sigma-controls-background-color-hover);}.react-sigma-search{background-color:var(--sigma-controls-background-color);}.react-sigma-search label{visibility:hidden;}.react-sigma-search input{color:var(--sigma-controls-color);background-color:var(--sigma-controls-background-color);font-size:1em;width:100%;margin:0;border:none;padding:var(--sigma-controls-margin);box-sizing:border-box;}/*
2
1143
  * Copyright 2026 OpenTrace Contributors
3
1144
  *