doru 1.0.0

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.
@@ -0,0 +1,1293 @@
1
+ :root {
2
+ /* base surfaces */
3
+ --bg: #1a1a1f;
4
+ --bg-alt: #202025;
5
+ --surface: #26262c;
6
+ --surface-2: #2e2e36;
7
+
8
+ /* borders */
9
+ --border: #3a3a44;
10
+ --border-hover: #4a4a56;
11
+
12
+ /* text hierarchy */
13
+ --fg: #f5f5f7;
14
+ --fg-2: #d0d0d8;
15
+ --muted: #9090a0;
16
+
17
+ /* accent - amber/orange */
18
+ --accent: #f59e0b;
19
+ --accent-dim: rgba(245, 158, 11, 0.18);
20
+
21
+ /* semantic colors */
22
+ --green: #34d399;
23
+ --yellow: #fbbf24;
24
+ --red: #f87171;
25
+ --blue: #60a5fa;
26
+
27
+ /* status icon colors (for CSS var fallbacks) */
28
+ --color-success: #22c55e;
29
+ --color-redirect: #3b82f6;
30
+ --color-warning: #f59e0b;
31
+ --color-error: #ef4444;
32
+ --color-muted: #6b7280;
33
+
34
+ /* derived */
35
+ --pill: #3a3a44;
36
+ --shadow: 0 1px 2px rgba(0, 0, 0, 0.5);
37
+
38
+ /* typography */
39
+ --font-mono: "SF Mono", "Fira Code", "JetBrains Mono", ui-monospace, monospace;
40
+ --font-sans: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
41
+ }
42
+
43
+ /* light theme */
44
+ [data-theme="light"] {
45
+ /* base surfaces */
46
+ --bg: #f5f5f7;
47
+ --bg-alt: #eeeef0;
48
+ --surface: #ffffff;
49
+ --surface-2: #f0f0f2;
50
+
51
+ /* borders */
52
+ --border: #d4d4d8;
53
+ --border-hover: #a1a1aa;
54
+
55
+ /* text hierarchy */
56
+ --fg: #18181b;
57
+ --fg-2: #3f3f46;
58
+ --muted: #71717a;
59
+
60
+ /* accent - darker amber for light bg */
61
+ --accent: #d97706;
62
+ --accent-dim: rgba(217, 119, 6, 0.15);
63
+
64
+ /* semantic colors - darker for light bg */
65
+ --green: #16a34a;
66
+ --yellow: #ca8a04;
67
+ --red: #dc2626;
68
+ --blue: #2563eb;
69
+
70
+ /* status icon colors - adjusted for light bg */
71
+ --color-success: #16a34a;
72
+ --color-redirect: #2563eb;
73
+ --color-warning: #d97706;
74
+ --color-error: #dc2626;
75
+ --color-muted: #71717a;
76
+
77
+ /* derived */
78
+ --pill: #e4e4e7;
79
+ --shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
80
+ }
81
+
82
+ * {
83
+ box-sizing: border-box;
84
+ }
85
+
86
+ html,
87
+ body {
88
+ height: 100%;
89
+ width: 100%;
90
+ }
91
+
92
+ body {
93
+ margin: 0;
94
+ background: var(--bg);
95
+ color: var(--fg);
96
+ font: 12px/1.5 var(--font-sans);
97
+ overflow: hidden;
98
+ -webkit-font-smoothing: antialiased;
99
+ -moz-osx-font-smoothing: grayscale;
100
+ }
101
+
102
+ #app {
103
+ width: 100vw;
104
+ height: 100vh;
105
+ display: grid;
106
+ grid-template-rows: 40px 1fr 24px;
107
+ }
108
+
109
+ /* scrollbars */
110
+ ::-webkit-scrollbar {
111
+ width: 8px;
112
+ height: 8px;
113
+ }
114
+ ::-webkit-scrollbar-track {
115
+ background: transparent;
116
+ }
117
+ ::-webkit-scrollbar-thumb {
118
+ background: var(--border);
119
+ border-radius: 4px;
120
+ }
121
+ ::-webkit-scrollbar-thumb:hover {
122
+ background: var(--border-hover);
123
+ }
124
+ ::-webkit-scrollbar-corner {
125
+ background: transparent;
126
+ }
127
+
128
+ /* header bar */
129
+ header {
130
+ display: flex;
131
+ align-items: center;
132
+ justify-content: space-between;
133
+ padding: 0 12px;
134
+ background: var(--bg);
135
+ border-bottom: 1px solid var(--border);
136
+ }
137
+
138
+ header .brand {
139
+ display: flex;
140
+ gap: 8px;
141
+ align-items: center;
142
+ font-weight: 500;
143
+ font-size: 13px;
144
+ letter-spacing: -0.01em;
145
+ color: var(--fg-2);
146
+ }
147
+
148
+ .badge {
149
+ font-family: var(--font-mono);
150
+ font-weight: 600;
151
+ font-size: 11px;
152
+ padding: 2px 6px;
153
+ border-radius: 3px;
154
+ background: var(--accent);
155
+ color: var(--bg);
156
+ text-transform: uppercase;
157
+ letter-spacing: 0.5px;
158
+ }
159
+
160
+ .brand-name {
161
+ font-family: var(--font-mono);
162
+ font-weight: 600;
163
+ font-size: 12px;
164
+ letter-spacing: 0.1em;
165
+ text-transform: uppercase;
166
+ color: var(--fg);
167
+ }
168
+
169
+ .input,
170
+ .select {
171
+ background: var(--surface);
172
+ border: 1px solid var(--border);
173
+ color: var(--fg);
174
+ padding: 5px 8px;
175
+ border-radius: var(--radius);
176
+ outline: none;
177
+ font-family: var(--font-mono);
178
+ font-size: 11px;
179
+ }
180
+
181
+ .input:focus,
182
+ .select:focus {
183
+ border-color: var(--border-hover);
184
+ background: var(--surface-2);
185
+ }
186
+
187
+ .input::placeholder {
188
+ color: var(--muted);
189
+ }
190
+
191
+ .btn {
192
+ border: 1px solid var(--border);
193
+ background: var(--surface);
194
+ color: var(--fg-2);
195
+ border-radius: var(--radius);
196
+ padding: 5px 10px;
197
+ cursor: pointer;
198
+ font-family: var(--font-mono);
199
+ font-size: 11px;
200
+ transition: all 0.1s ease;
201
+ }
202
+
203
+ .btn:hover {
204
+ background: var(--surface-2);
205
+ border-color: var(--border-hover);
206
+ color: var(--fg);
207
+ }
208
+
209
+ .btn.active {
210
+ background: var(--accent-dim);
211
+ border-color: var(--accent);
212
+ color: var(--accent);
213
+ }
214
+
215
+ .theme-btn {
216
+ display: flex;
217
+ align-items: center;
218
+ justify-content: center;
219
+ padding: 5px 8px;
220
+ }
221
+
222
+ .theme-btn svg {
223
+ display: block;
224
+ }
225
+
226
+ #stats {
227
+ font-family: var(--font-mono);
228
+ color: var(--muted);
229
+ font-size: 11px;
230
+ }
231
+
232
+ .header-right {
233
+ display: flex;
234
+ align-items: center;
235
+ gap: 12px;
236
+ }
237
+
238
+ /* main layout */
239
+ main {
240
+ display: flex;
241
+ height: 100%;
242
+ min-height: 0;
243
+ min-width: 0;
244
+ }
245
+
246
+ /* list panel */
247
+ #list {
248
+ width: 100%;
249
+ height: 100%;
250
+ border-right: 1px solid var(--border);
251
+ background: var(--bg);
252
+ display: flex;
253
+ flex-direction: column;
254
+ min-height: 0;
255
+ min-width: 0;
256
+ overflow: auto;
257
+ }
258
+
259
+ /* resize handle */
260
+ .resize-handle {
261
+ width: 3px;
262
+ background: var(--border) !important;
263
+ cursor: col-resize;
264
+ transition: background 0.1s ease;
265
+ }
266
+
267
+ .resize-handle:hover,
268
+ .resize-handle:active,
269
+ .resize-handle[data-resize-handle-active] {
270
+ background: var(--accent) !important;
271
+ }
272
+
273
+ /* filter bar in list panel */
274
+ #filterBar {
275
+ display: flex;
276
+ gap: 6px;
277
+ padding: 8px;
278
+ background: var(--bg-alt);
279
+ border-bottom: 1px solid var(--border);
280
+ flex-wrap: wrap;
281
+ }
282
+
283
+ #filterBar .input {
284
+ flex: 1;
285
+ min-width: 120px;
286
+ }
287
+
288
+ #filterBar .select {
289
+ min-width: 80px;
290
+ }
291
+
292
+ #listHeader {
293
+ display: flex;
294
+ gap: 6px;
295
+ align-items: center;
296
+ padding: 4px 8px;
297
+ font-family: var(--font-mono);
298
+ font-size: 10px;
299
+ text-transform: uppercase;
300
+ letter-spacing: 0.5px;
301
+ color: var(--muted);
302
+ border-bottom: 1px solid var(--border);
303
+ position: sticky;
304
+ top: 0;
305
+ background: var(--bg);
306
+ z-index: 1;
307
+ }
308
+
309
+ #listHeader > :nth-child(1) {
310
+ flex: 0 0 52px;
311
+ }
312
+ #listHeader > :nth-child(2) {
313
+ flex: 0 0 48px;
314
+ }
315
+ #listHeader > :nth-child(3) {
316
+ flex: 1 1 auto;
317
+ min-width: 0;
318
+ }
319
+ #listHeader > :nth-child(4) {
320
+ flex: 0 0 60px;
321
+ text-align: right;
322
+ }
323
+ #listHeader > :nth-child(5) {
324
+ flex: 0 0 50px;
325
+ text-align: right;
326
+ }
327
+ #listHeader > :nth-child(6) {
328
+ flex: 0 0 70px;
329
+ text-align: right;
330
+ }
331
+
332
+ #listBody {
333
+ flex: 1 1 auto;
334
+ min-height: 0;
335
+ }
336
+
337
+ .row {
338
+ display: flex;
339
+ gap: 6px;
340
+ align-items: center;
341
+ padding: 5px 8px;
342
+ border-bottom: 1px solid var(--border);
343
+ cursor: pointer;
344
+ min-width: 0;
345
+ transition: background 0.05s ease;
346
+ }
347
+
348
+ .row > :nth-child(1) {
349
+ flex: 0 0 52px;
350
+ }
351
+ .row > :nth-child(2) {
352
+ flex: 0 0 48px;
353
+ }
354
+ .row > :nth-child(3) {
355
+ flex: 1 1 auto;
356
+ min-width: 0;
357
+ }
358
+ .row > :nth-child(4) {
359
+ flex: 0 0 60px;
360
+ text-align: right;
361
+ }
362
+ .row > :nth-child(5) {
363
+ flex: 0 0 50px;
364
+ text-align: right;
365
+ }
366
+ .row > :nth-child(6) {
367
+ flex: 0 0 70px;
368
+ text-align: right;
369
+ }
370
+
371
+ .row:hover {
372
+ background: var(--surface);
373
+ }
374
+
375
+ .row.sel {
376
+ background: var(--accent-dim);
377
+ border-left: 2px solid var(--accent);
378
+ padding-left: 6px;
379
+ }
380
+
381
+ /* utilities */
382
+ .ellipsis {
383
+ overflow: hidden;
384
+ text-overflow: ellipsis;
385
+ white-space: nowrap;
386
+ }
387
+
388
+ .mono {
389
+ font-family: var(--font-mono);
390
+ font-size: 11px;
391
+ }
392
+
393
+ .pill {
394
+ padding: 1px 6px;
395
+ border-radius: 3px;
396
+ font-family: var(--font-mono);
397
+ font-weight: 600;
398
+ font-size: 10px;
399
+ background: var(--pill);
400
+ color: #fff;
401
+ display: inline-block;
402
+ text-align: center;
403
+ text-transform: uppercase;
404
+ }
405
+
406
+ .status {
407
+ padding: 1px 6px;
408
+ border-radius: 3px;
409
+ font-family: var(--font-mono);
410
+ font-weight: 600;
411
+ font-size: 10px;
412
+ display: inline-block;
413
+ text-align: center;
414
+ }
415
+
416
+ .s-2 {
417
+ background: rgba(52, 211, 153, 0.2);
418
+ color: #6ee7b7;
419
+ }
420
+ .s-3 {
421
+ background: rgba(251, 191, 36, 0.2);
422
+ color: #fcd34d;
423
+ }
424
+ .s-4 {
425
+ background: rgba(251, 146, 60, 0.2);
426
+ color: #fdba74;
427
+ }
428
+ .s-5 {
429
+ background: rgba(248, 113, 113, 0.2);
430
+ color: #fca5a5;
431
+ }
432
+
433
+ /* light theme status badges */
434
+ [data-theme="light"] .s-2 {
435
+ background: rgba(22, 163, 74, 0.15);
436
+ color: #15803d;
437
+ }
438
+ [data-theme="light"] .s-3 {
439
+ background: rgba(202, 138, 4, 0.15);
440
+ color: #a16207;
441
+ }
442
+ [data-theme="light"] .s-4 {
443
+ background: rgba(234, 88, 12, 0.15);
444
+ color: #c2410c;
445
+ }
446
+ [data-theme="light"] .s-5 {
447
+ background: rgba(220, 38, 38, 0.15);
448
+ color: #b91c1c;
449
+ }
450
+
451
+ .muted {
452
+ color: var(--muted);
453
+ }
454
+
455
+ .dot {
456
+ width: 6px;
457
+ height: 6px;
458
+ border-radius: 50%;
459
+ display: inline-block;
460
+ }
461
+
462
+ .dot.ok {
463
+ background: var(--green);
464
+ }
465
+ .dot.warn {
466
+ background: var(--yellow);
467
+ }
468
+ .dot.err {
469
+ background: var(--red);
470
+ }
471
+
472
+ /* detail panel */
473
+ #detail {
474
+ display: flex;
475
+ flex-direction: column;
476
+ width: 100%;
477
+ height: 100%;
478
+ min-height: 0;
479
+ min-width: 0;
480
+ background: var(--bg);
481
+ overflow: hidden;
482
+ }
483
+
484
+ #detail > .tabs {
485
+ flex-shrink: 0;
486
+ }
487
+
488
+ #detail > .tab,
489
+ #detail > div:last-child {
490
+ flex: 1 1 auto;
491
+ min-height: 0;
492
+ }
493
+
494
+ #summary {
495
+ display: grid;
496
+ grid-template-columns: auto 1fr auto auto;
497
+ gap: 10px;
498
+ align-items: center;
499
+ padding: 8px 12px;
500
+ border-bottom: 1px solid var(--border);
501
+ background: var(--bg-alt);
502
+ }
503
+
504
+ #summary .url {
505
+ font-family: var(--font-mono);
506
+ font-size: 12px;
507
+ font-weight: 500;
508
+ color: var(--fg);
509
+ }
510
+
511
+ #summary .meta {
512
+ display: flex;
513
+ gap: 12px;
514
+ font-family: var(--font-mono);
515
+ color: var(--muted);
516
+ font-size: 10px;
517
+ }
518
+
519
+ /* tabs */
520
+ .tabs {
521
+ display: flex;
522
+ gap: 0;
523
+ padding: 0 8px;
524
+ border-bottom: 1px solid var(--border);
525
+ background: var(--bg-alt);
526
+ justify-content: flex-start;
527
+ align-items: stretch;
528
+ flex-wrap: nowrap;
529
+ overflow-x: auto;
530
+ }
531
+
532
+ .tab-btn {
533
+ padding: 8px 12px;
534
+ border: none;
535
+ border-bottom: 2px solid transparent;
536
+ background: transparent;
537
+ cursor: pointer;
538
+ color: var(--muted);
539
+ font-family: var(--font-mono);
540
+ font-size: 11px;
541
+ font-weight: 500;
542
+ text-transform: uppercase;
543
+ letter-spacing: 0.5px;
544
+ flex: none;
545
+ white-space: nowrap;
546
+ transition: all 0.1s ease;
547
+ }
548
+
549
+ .tab-btn:hover {
550
+ color: var(--fg-2);
551
+ }
552
+
553
+ .tab-btn.active {
554
+ color: var(--accent);
555
+ border-bottom-color: var(--accent);
556
+ }
557
+
558
+ .tab-content {
559
+ flex: 1 1 auto;
560
+ min-height: 0;
561
+ display: flex;
562
+ overflow: hidden;
563
+ }
564
+
565
+ .tab {
566
+ display: none;
567
+ height: 100%;
568
+ width: 100%;
569
+ }
570
+
571
+ .tab.active {
572
+ display: flex;
573
+ flex: 1 1 auto;
574
+ min-height: 0;
575
+ height: 100%;
576
+ width: 100%;
577
+ }
578
+
579
+ /* react-resizable-panels overrides */
580
+ [data-group] {
581
+ height: 100% !important;
582
+ width: 100% !important;
583
+ }
584
+
585
+ [data-panel] {
586
+ overflow: hidden;
587
+ }
588
+
589
+ [data-panel] > div {
590
+ display: flex;
591
+ flex-direction: column;
592
+ height: 100%;
593
+ width: 100%;
594
+ }
595
+
596
+ [data-panel] .panel {
597
+ flex: 1 1 0;
598
+ min-height: 0;
599
+ width: 100%;
600
+ }
601
+
602
+ .panel {
603
+ border: none;
604
+ overflow: hidden;
605
+ display: flex;
606
+ flex-direction: column;
607
+ min-height: 0;
608
+ min-width: 0;
609
+ background: var(--surface);
610
+ border-right: 1px solid var(--border);
611
+ border-bottom: 1px solid var(--border);
612
+ }
613
+
614
+ .panel .title {
615
+ flex: 0 0 auto;
616
+ padding: 6px 10px;
617
+ font-family: var(--font-mono);
618
+ font-size: 10px;
619
+ font-weight: 500;
620
+ text-transform: uppercase;
621
+ letter-spacing: 0.5px;
622
+ color: var(--muted);
623
+ background: var(--surface-2);
624
+ border-bottom: 1px solid var(--border);
625
+ display: flex;
626
+ align-items: center;
627
+ justify-content: space-between;
628
+ gap: 8px;
629
+ }
630
+
631
+ .panel .body {
632
+ flex: 1 1 0;
633
+ min-height: 0;
634
+ overflow: auto;
635
+ background: var(--surface);
636
+ }
637
+
638
+ /* vertical resize handle for detail panel columns */
639
+ .resize-handle-v {
640
+ height: 3px;
641
+ background: var(--border) !important;
642
+ cursor: row-resize;
643
+ transition: background 0.1s ease;
644
+ }
645
+
646
+ .resize-handle-v:hover,
647
+ .resize-handle-v:active,
648
+ .resize-handle-v[data-resize-handle-active] {
649
+ background: var(--accent) !important;
650
+ }
651
+
652
+ .panel .body.code-wrap {
653
+ display: flex;
654
+ flex-direction: column;
655
+ }
656
+
657
+ .panel .body.code-wrap > pre.code,
658
+ .panel .body.code-wrap > iframe.preview,
659
+ .panel .body.code-wrap > .img-preview {
660
+ flex: 1 1 0;
661
+ min-height: 0;
662
+ width: 100%;
663
+ }
664
+
665
+ pre.code {
666
+ width: 100%;
667
+ }
668
+
669
+ /* key-value grid */
670
+ .kv {
671
+ display: grid;
672
+ grid-template-columns: 160px 1fr;
673
+ border-bottom: 1px solid var(--border);
674
+ }
675
+
676
+ .kv div {
677
+ padding: 6px 10px;
678
+ font-family: var(--font-mono);
679
+ font-size: 11px;
680
+ }
681
+
682
+ .kv .k {
683
+ color: var(--muted);
684
+ background: var(--surface-2);
685
+ }
686
+
687
+ .kv .v {
688
+ color: var(--fg-2);
689
+ word-break: break-all;
690
+ }
691
+
692
+ .empty {
693
+ color: var(--muted);
694
+ padding: 20px;
695
+ text-align: center;
696
+ font-size: 11px;
697
+ }
698
+
699
+ .section-label {
700
+ padding: 6px 10px;
701
+ font-family: var(--font-mono);
702
+ font-size: 9px;
703
+ font-weight: 500;
704
+ text-transform: uppercase;
705
+ letter-spacing: 0.5px;
706
+ color: var(--muted);
707
+ background: var(--surface-2);
708
+ border-bottom: 1px solid var(--border);
709
+ }
710
+
711
+ /* code and preview */
712
+ .code-wrap {
713
+ padding: 0;
714
+ }
715
+
716
+ pre.code {
717
+ margin: 0;
718
+ padding: 10px;
719
+ overflow: auto;
720
+ white-space: pre;
721
+ font-family: var(--font-mono);
722
+ font-size: 11px;
723
+ line-height: 1.6;
724
+ width: 100%;
725
+ color: var(--fg-2);
726
+ }
727
+
728
+ .controls {
729
+ display: flex;
730
+ gap: 6px;
731
+ align-items: center;
732
+ }
733
+
734
+ .panel .title .controls-slot {
735
+ margin-left: auto;
736
+ display: flex;
737
+ align-items: center;
738
+ gap: 6px;
739
+ }
740
+
741
+ .panel .title .controls-slot .controls {
742
+ display: contents;
743
+ }
744
+
745
+ .controls .btn {
746
+ padding: 3px 6px;
747
+ font-size: 10px;
748
+ }
749
+
750
+ iframe.preview {
751
+ width: 100%;
752
+ height: 100%;
753
+ border: 0;
754
+ background: white;
755
+ }
756
+
757
+ .img-preview {
758
+ display: flex;
759
+ align-items: center;
760
+ justify-content: center;
761
+ padding: 12px;
762
+ width: 100%;
763
+ height: 100%;
764
+ box-sizing: border-box;
765
+ }
766
+
767
+ .img-preview img {
768
+ max-width: 100%;
769
+ max-height: 100%;
770
+ border-radius: var(--radius);
771
+ }
772
+
773
+ /* footer */
774
+ footer {
775
+ padding: 0 12px;
776
+ border-top: 1px solid var(--border);
777
+ background: var(--bg);
778
+ color: var(--muted);
779
+ font-family: var(--font-mono);
780
+ font-size: 10px;
781
+ display: flex;
782
+ align-items: center;
783
+ justify-content: space-between;
784
+ }
785
+
786
+ /* view */
787
+ .view-switcher {
788
+ display: flex;
789
+ gap: 2px;
790
+ background: var(--surface);
791
+ padding: 2px;
792
+ border-radius: 6px;
793
+ border: 1px solid var(--border);
794
+ }
795
+
796
+ .view-btn {
797
+ display: flex;
798
+ align-items: center;
799
+ gap: 6px;
800
+ padding: 4px 10px;
801
+ border: none;
802
+ border-radius: 4px;
803
+ background: transparent;
804
+ color: var(--muted);
805
+ cursor: pointer;
806
+ font-size: 11px;
807
+ font-family: var(--font-sans);
808
+ transition: all 0.1s ease;
809
+ }
810
+
811
+ .view-btn:hover {
812
+ color: var(--fg);
813
+ background: var(--surface-2);
814
+ }
815
+
816
+ .view-btn.active {
817
+ background: var(--accent-dim);
818
+ color: var(--accent);
819
+ }
820
+
821
+ .view-btn svg {
822
+ opacity: 0.7;
823
+ }
824
+
825
+ .view-btn.active svg {
826
+ opacity: 1;
827
+ }
828
+
829
+ /* sortable headers */
830
+ .sortable {
831
+ cursor: pointer;
832
+ user-select: none;
833
+ transition: color 0.1s ease;
834
+ }
835
+
836
+ .sortable:hover {
837
+ color: var(--fg-2);
838
+ }
839
+
840
+ .sortable.active {
841
+ color: var(--accent);
842
+ }
843
+
844
+ /* status cell with icon */
845
+ .status-cell {
846
+ display: flex;
847
+ align-items: center;
848
+ gap: 4px;
849
+ }
850
+
851
+ .status-icon {
852
+ flex-shrink: 0;
853
+ }
854
+
855
+ /* copy as cURL button */
856
+ .copy-curl-btn {
857
+ border: 1px solid var(--border);
858
+ background: var(--surface);
859
+ color: var(--fg-2);
860
+ border-radius: 4px;
861
+ padding: 3px 8px;
862
+ cursor: pointer;
863
+ font-family: var(--font-mono);
864
+ font-size: 10px;
865
+ transition: all 0.1s ease;
866
+ margin-left: 8px;
867
+ }
868
+
869
+ .copy-curl-btn:hover {
870
+ background: var(--surface-2);
871
+ border-color: var(--border-hover);
872
+ }
873
+
874
+ .copy-curl-btn.copied {
875
+ background: rgba(52, 211, 153, 0.2);
876
+ border-color: var(--green);
877
+ color: var(--green);
878
+ }
879
+
880
+ .copy-curl-btn.error {
881
+ background: rgba(248, 113, 113, 0.2);
882
+ border-color: var(--red);
883
+ color: var(--red);
884
+ }
885
+
886
+ /* skeleton */
887
+ .skeleton {
888
+ background: linear-gradient(90deg, var(--surface-2) 25%, var(--surface) 50%, var(--surface-2) 75%);
889
+ background-size: 200% 100%;
890
+ animation: skeleton-shimmer 1.5s ease-in-out infinite;
891
+ }
892
+
893
+ @keyframes skeleton-shimmer {
894
+ 0% {
895
+ background-position: 200% 0;
896
+ }
897
+ 100% {
898
+ background-position: -200% 0;
899
+ }
900
+ }
901
+
902
+ .skeleton-row {
903
+ display: flex;
904
+ gap: 6px;
905
+ align-items: center;
906
+ padding: 10px 8px;
907
+ border-bottom: 1px solid var(--border);
908
+ }
909
+
910
+ .skeleton-row > * {
911
+ flex: 1;
912
+ }
913
+
914
+ .skeleton-list {
915
+ padding: 0;
916
+ }
917
+
918
+ /* empty state */
919
+ .empty-state {
920
+ display: flex;
921
+ flex-direction: column;
922
+ align-items: center;
923
+ justify-content: center;
924
+ padding: 40px 20px;
925
+ text-align: center;
926
+ height: 100%;
927
+ min-height: 200px;
928
+ }
929
+
930
+ .empty-state-icon {
931
+ color: var(--muted);
932
+ opacity: 0.5;
933
+ margin-bottom: 16px;
934
+ }
935
+
936
+ .empty-state-title {
937
+ margin: 0 0 8px;
938
+ font-size: 14px;
939
+ font-weight: 600;
940
+ color: var(--fg);
941
+ }
942
+
943
+ .empty-state-description {
944
+ margin: 0 0 16px;
945
+ font-size: 12px;
946
+ color: var(--muted);
947
+ max-width: 280px;
948
+ }
949
+
950
+ .empty-state-action {
951
+ border: 1px solid var(--border);
952
+ background: var(--surface);
953
+ color: var(--fg-2);
954
+ border-radius: 4px;
955
+ padding: 6px 12px;
956
+ cursor: pointer;
957
+ font-size: 12px;
958
+ transition: all 0.1s ease;
959
+ }
960
+
961
+ .empty-state-action:hover {
962
+ background: var(--surface-2);
963
+ border-color: var(--accent);
964
+ color: var(--accent);
965
+ }
966
+
967
+ /* error boundary */
968
+ .error-boundary {
969
+ display: flex;
970
+ flex-direction: column;
971
+ align-items: center;
972
+ justify-content: center;
973
+ padding: 40px 20px;
974
+ text-align: center;
975
+ height: 100%;
976
+ }
977
+
978
+ .error-boundary-icon {
979
+ color: var(--red);
980
+ opacity: 0.7;
981
+ margin-bottom: 16px;
982
+ }
983
+
984
+ .error-boundary-title {
985
+ margin: 0 0 8px;
986
+ font-size: 16px;
987
+ font-weight: 600;
988
+ color: var(--fg);
989
+ }
990
+
991
+ .error-boundary-message {
992
+ margin: 0 0 16px;
993
+ font-size: 12px;
994
+ color: var(--muted);
995
+ font-family: var(--font-mono);
996
+ max-width: 400px;
997
+ word-break: break-word;
998
+ }
999
+
1000
+ .error-boundary-retry {
1001
+ border: 1px solid var(--red);
1002
+ background: rgba(248, 113, 113, 0.1);
1003
+ color: var(--red);
1004
+ border-radius: 4px;
1005
+ padding: 8px 16px;
1006
+ cursor: pointer;
1007
+ font-size: 12px;
1008
+ transition: all 0.1s ease;
1009
+ }
1010
+
1011
+ .error-boundary-retry:hover {
1012
+ background: rgba(248, 113, 113, 0.2);
1013
+ }
1014
+
1015
+ /* waterfall */
1016
+ .waterfall-view {
1017
+ display: flex;
1018
+ flex-direction: column;
1019
+ height: 100%;
1020
+ width: 100%;
1021
+ background: var(--bg);
1022
+ }
1023
+
1024
+ .waterfall-header {
1025
+ display: flex;
1026
+ padding: 8px 12px;
1027
+ background: var(--bg-alt);
1028
+ border-bottom: 1px solid var(--border);
1029
+ font-family: var(--font-mono);
1030
+ font-size: 10px;
1031
+ text-transform: uppercase;
1032
+ letter-spacing: 0.5px;
1033
+ color: var(--muted);
1034
+ }
1035
+
1036
+ .waterfall-url-col {
1037
+ flex: 0 0 280px;
1038
+ min-width: 0;
1039
+ display: flex;
1040
+ align-items: center;
1041
+ gap: 8px;
1042
+ overflow: hidden;
1043
+ }
1044
+
1045
+ .waterfall-timeline-col {
1046
+ flex: 1;
1047
+ min-width: 0;
1048
+ }
1049
+
1050
+ .waterfall-time-markers {
1051
+ display: flex;
1052
+ justify-content: space-between;
1053
+ }
1054
+
1055
+ .waterfall-time-marker {
1056
+ font-size: 9px;
1057
+ }
1058
+
1059
+ .waterfall-body {
1060
+ flex: 1;
1061
+ overflow: auto;
1062
+ }
1063
+
1064
+ .waterfall-row {
1065
+ display: flex;
1066
+ align-items: center;
1067
+ padding: 4px 12px;
1068
+ border-bottom: 1px solid var(--border);
1069
+ cursor: pointer;
1070
+ transition: background 0.05s ease;
1071
+ }
1072
+
1073
+ .waterfall-row:hover {
1074
+ background: var(--surface);
1075
+ }
1076
+
1077
+ .waterfall-row.selected {
1078
+ background: var(--accent-dim);
1079
+ }
1080
+
1081
+ .waterfall-method {
1082
+ font-family: var(--font-mono);
1083
+ font-size: 10px;
1084
+ font-weight: 600;
1085
+ flex-shrink: 0;
1086
+ width: 40px;
1087
+ }
1088
+
1089
+ .waterfall-url {
1090
+ font-family: var(--font-mono);
1091
+ font-size: 11px;
1092
+ overflow: hidden;
1093
+ text-overflow: ellipsis;
1094
+ white-space: nowrap;
1095
+ }
1096
+
1097
+ .waterfall-bar-container {
1098
+ position: relative;
1099
+ height: 16px;
1100
+ width: 100%;
1101
+ }
1102
+
1103
+ .waterfall-bar {
1104
+ position: absolute;
1105
+ top: 4px;
1106
+ height: 8px;
1107
+ border-radius: 2px;
1108
+ min-width: 2px;
1109
+ opacity: 0.85;
1110
+ transition: opacity 0.1s ease;
1111
+ }
1112
+
1113
+ .waterfall-row:hover .waterfall-bar {
1114
+ opacity: 1;
1115
+ }
1116
+
1117
+ /* analytics */
1118
+ .analytics-dashboard {
1119
+ display: flex;
1120
+ flex-direction: column;
1121
+ height: 100%;
1122
+ width: 100%;
1123
+ overflow: auto;
1124
+ padding: 16px;
1125
+ gap: 16px;
1126
+ background: var(--bg);
1127
+ }
1128
+
1129
+ .analytics-stats {
1130
+ display: grid;
1131
+ grid-template-columns: repeat(auto-fit, minmax(140px, 1fr));
1132
+ gap: 12px;
1133
+ }
1134
+
1135
+ .stat-card {
1136
+ background: var(--surface);
1137
+ border: 1px solid var(--border);
1138
+ border-radius: 8px;
1139
+ padding: 16px;
1140
+ text-align: center;
1141
+ }
1142
+
1143
+ .stat-value {
1144
+ font-family: var(--font-mono);
1145
+ font-size: 24px;
1146
+ font-weight: 600;
1147
+ color: var(--fg);
1148
+ margin-bottom: 4px;
1149
+ }
1150
+
1151
+ .stat-label {
1152
+ font-size: 11px;
1153
+ color: var(--muted);
1154
+ text-transform: uppercase;
1155
+ letter-spacing: 0.5px;
1156
+ }
1157
+
1158
+ .stat-subvalue {
1159
+ font-size: 10px;
1160
+ color: var(--red);
1161
+ margin-top: 4px;
1162
+ }
1163
+
1164
+ .analytics-section {
1165
+ background: var(--surface);
1166
+ border: 1px solid var(--border);
1167
+ border-radius: 8px;
1168
+ padding: 16px;
1169
+ }
1170
+
1171
+ .analytics-section h3 {
1172
+ margin: 0 0 12px;
1173
+ font-size: 12px;
1174
+ font-weight: 600;
1175
+ color: var(--fg);
1176
+ text-transform: uppercase;
1177
+ letter-spacing: 0.5px;
1178
+ }
1179
+
1180
+ .breakdown-bar {
1181
+ display: flex;
1182
+ height: 8px;
1183
+ border-radius: 4px;
1184
+ overflow: hidden;
1185
+ background: var(--surface-2);
1186
+ margin-bottom: 8px;
1187
+ }
1188
+
1189
+ .breakdown-segment {
1190
+ transition: width 0.3s ease;
1191
+ }
1192
+
1193
+ .breakdown-legend {
1194
+ display: flex;
1195
+ flex-wrap: wrap;
1196
+ gap: 12px;
1197
+ font-size: 11px;
1198
+ color: var(--muted);
1199
+ }
1200
+
1201
+ .legend-item {
1202
+ display: flex;
1203
+ align-items: center;
1204
+ gap: 4px;
1205
+ }
1206
+
1207
+ .legend-dot {
1208
+ width: 8px;
1209
+ height: 8px;
1210
+ border-radius: 50%;
1211
+ }
1212
+
1213
+ .analytics-tables {
1214
+ display: grid;
1215
+ grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
1216
+ gap: 16px;
1217
+ }
1218
+
1219
+ .analytics-table {
1220
+ width: 100%;
1221
+ border-collapse: collapse;
1222
+ font-size: 11px;
1223
+ }
1224
+
1225
+ .analytics-table th {
1226
+ text-align: left;
1227
+ padding: 8px;
1228
+ font-weight: 500;
1229
+ color: var(--muted);
1230
+ text-transform: uppercase;
1231
+ letter-spacing: 0.5px;
1232
+ border-bottom: 1px solid var(--border);
1233
+ }
1234
+
1235
+ .analytics-table td {
1236
+ padding: 8px;
1237
+ border-bottom: 1px solid var(--border);
1238
+ }
1239
+
1240
+ .analytics-table tr.clickable {
1241
+ cursor: pointer;
1242
+ transition: background 0.05s ease;
1243
+ }
1244
+
1245
+ .analytics-table tr.clickable:hover {
1246
+ background: var(--surface-2);
1247
+ }
1248
+
1249
+ /* main view */
1250
+ .main-view-full {
1251
+ width: 100%;
1252
+ height: 100%;
1253
+ overflow: hidden;
1254
+ }
1255
+
1256
+ /* summary section */
1257
+ #sumUrl {
1258
+ display: flex;
1259
+ gap: 8px;
1260
+ align-items: center;
1261
+ overflow: hidden;
1262
+ }
1263
+
1264
+ #sumUrl .method {
1265
+ padding: 2px 6px;
1266
+ border-radius: 3px;
1267
+ font-size: 10px;
1268
+ font-weight: 600;
1269
+ color: #fff;
1270
+ flex-shrink: 0;
1271
+ }
1272
+
1273
+ #sumUrl .url {
1274
+ overflow: hidden;
1275
+ text-overflow: ellipsis;
1276
+ white-space: nowrap;
1277
+ }
1278
+
1279
+ #sumMeta {
1280
+ display: flex;
1281
+ align-items: center;
1282
+ gap: 12px;
1283
+ font-family: var(--font-mono);
1284
+ font-size: 11px;
1285
+ color: var(--muted);
1286
+ }
1287
+
1288
+ #sumStatus {
1289
+ padding: 4px 10px;
1290
+ border-radius: 4px;
1291
+ font-size: 12px;
1292
+ font-weight: 600;
1293
+ }