@troyio/vite-file-router 0.4.0 → 0.4.1

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,231 +1,1136 @@
1
- :root {
2
- color-scheme: light dark;
3
- font-family: Inter, ui-sans-serif, system-ui, sans-serif;
4
- font-size: 13px;
5
- color: #24292f;
6
- background: #fff;
7
- font-synthesis: none;
8
- text-rendering: optimizeLegibility;
9
- }
10
-
11
- * {
12
- box-sizing: border-box;
13
- }
14
-
15
- body {
16
- margin: 0;
17
- min-width: 320px;
18
- }
19
-
20
- main {
21
- max-width: 1100px;
22
- margin: 0 auto;
23
- padding: 24px;
24
- }
25
-
26
- header,
27
- .toolbar {
28
- display: flex;
29
- align-items: center;
30
- justify-content: space-between;
31
- gap: 16px;
32
- }
33
-
34
- header {
35
- margin-bottom: 20px;
36
- }
37
-
38
- .eyebrow {
39
- margin: 0 0 5px;
40
- color: #6e7781;
41
- font-size: 10px;
42
- font-weight: 700;
43
- letter-spacing: 0.1em;
44
- }
45
-
46
- h1 {
47
- margin: 0;
48
- font-size: 22px;
49
- }
50
-
51
- #status {
52
- margin: 6px 0 0;
53
- color: #6e7781;
54
- }
55
-
56
- button,
57
- input {
58
- min-height: 34px;
59
- border: 1px solid #d0d7de;
60
- border-radius: 6px;
61
- background: #fff;
62
- color: inherit;
63
- font: inherit;
64
- }
65
-
66
- button {
67
- padding: 0 12px;
68
- cursor: pointer;
69
- }
70
-
71
- button:hover {
72
- background: #f6f8fa;
73
- }
74
-
75
- .toolbar {
76
- justify-content: flex-start;
77
- margin-bottom: 16px;
78
- }
79
-
80
- .search {
81
- flex: 1;
82
- }
83
-
84
- input {
85
- width: 100%;
86
- padding: 0 10px;
87
- }
88
-
89
- #error {
90
- padding: 10px;
91
- border: 1px solid #cf222e;
92
- border-radius: 6px;
93
- color: #cf222e;
94
- }
95
-
96
- .route-list,
97
- .file-list {
98
- margin: 0;
99
- padding-left: 20px;
100
- list-style: none;
101
- }
102
-
103
- .root-list {
104
- padding: 0;
105
- }
106
-
107
- .route-node {
108
- position: relative;
109
- padding: 3px 0;
110
- }
111
-
112
- .route-details {
113
- min-width: 0;
114
- }
115
-
116
- .route-summary {
117
- display: flex;
118
- align-items: center;
119
- flex-wrap: wrap;
120
- gap: 7px;
121
- min-height: 28px;
122
- cursor: pointer;
123
- }
124
-
125
- .route-path,
126
- .file-path {
127
- overflow-wrap: anywhere;
128
- font-family: ui-monospace, SFMono-Regular, Consolas, monospace;
129
- }
130
-
131
- .route-path {
132
- color: #0969da;
133
- font-weight: 600;
134
- }
135
-
136
- .badge {
137
- padding: 2px 6px;
138
- border-radius: 10px;
139
- background: #ddf4ff;
140
- color: #0550ae;
141
- font-size: 11px;
142
- }
143
-
144
- .group-badge {
145
- background: #fbefff;
146
- color: #8250df;
147
- }
148
-
149
- .optional-badge {
150
- background: #fff8c5;
151
- color: #7d4e00;
152
- }
153
-
154
- .file-list {
155
- padding-top: 3px;
156
- padding-bottom: 5px;
157
- }
158
-
159
- .file-row {
160
- display: flex;
161
- flex-wrap: wrap;
162
- gap: 10px;
163
- padding: 3px 0;
164
- color: #57606a;
165
- }
166
-
167
- .file-kind {
168
- min-width: 90px;
169
- font-weight: 600;
170
- }
171
-
172
- .empty {
173
- padding: 20px 0;
174
- color: #6e7781;
175
- }
176
-
177
- .visually-hidden {
178
- position: absolute;
179
- width: 1px;
180
- height: 1px;
181
- overflow: hidden;
182
- clip: rect(0, 0, 0, 0);
183
- white-space: nowrap;
184
- }
185
-
186
- @media (prefers-color-scheme: dark) {
187
- :root {
188
- color: #e6edf3;
189
- background: #0d1117;
190
- }
191
-
192
- button,
193
- input {
194
- border-color: #30363d;
195
- background: #161b22;
196
- }
197
-
198
- button:hover {
199
- background: #21262d;
200
- }
201
-
202
- #error {
203
- color: #ff7b72;
204
- }
205
-
206
- .route-path {
207
- color: #79c0ff;
208
- }
209
-
210
- .badge {
211
- background: #0c2d6b;
212
- color: #a5d6ff;
213
- }
214
-
215
- .group-badge {
216
- background: #2d1f4d;
217
- color: #d2a8ff;
218
- }
219
-
220
- .optional-badge {
221
- background: #3d2e00;
222
- color: #eac54f;
223
- }
224
-
225
- .file-row,
226
- .empty,
227
- #status,
228
- .eyebrow {
229
- color: #8b949e;
230
- }
231
- }
1
+ :root {
2
+ color-scheme: light;
3
+ --bg: #f7f8fa;
4
+ --surface: #ffffff;
5
+ --surface-2: #f2f4f7;
6
+ --border: #e4e7ec;
7
+ --border-strong: #d0d5dd;
8
+ --text: #101828;
9
+ --text-2: #475467;
10
+ --text-3: #667085;
11
+ --accent: #6d4aff;
12
+ --accent-soft: #f0ecff;
13
+ --accent-text: #5b36f2;
14
+ --success: #12b76a;
15
+ --success-soft: #e7f8ef;
16
+ --success-text: #067647;
17
+ --warning: #f79009;
18
+ --warning-soft: #fef4e6;
19
+ --warning-text: #b54708;
20
+ --danger: #f04438;
21
+ --danger-soft: #fef0ef;
22
+ --danger-text: #b42318;
23
+ --info-soft: #eaf2ff;
24
+ --info-text: #1858c7;
25
+ --match: rgba(109, 74, 255, 0.08);
26
+ --shadow: 0 1px 2px rgba(16, 24, 40, 0.05);
27
+ --ring: 0 0 0 3px rgba(109, 74, 255, 0.22);
28
+ --radius: 10px;
29
+ --mono: ui-monospace, "JetBrains Mono", SFMono-Regular, Menlo, Consolas, monospace;
30
+
31
+ font-family: Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
32
+ font-size: 13px;
33
+ line-height: 1.45;
34
+ color: var(--text);
35
+ background: var(--bg);
36
+ font-synthesis: none;
37
+ text-rendering: optimizeLegibility;
38
+ -webkit-font-smoothing: antialiased;
39
+ }
40
+
41
+ @media (prefers-color-scheme: dark) {
42
+ :root {
43
+ color-scheme: dark;
44
+ --bg: #0b0c10;
45
+ --surface: #121318;
46
+ --surface-2: #1a1b22;
47
+ --border: #23252e;
48
+ --border-strong: #30333f;
49
+ --text: #ecedf2;
50
+ --text-2: #b4b7c3;
51
+ --text-3: #868a99;
52
+ --accent: #8b6dff;
53
+ --accent-soft: rgba(139, 109, 255, 0.14);
54
+ --accent-text: #b9a6ff;
55
+ --success: #32d583;
56
+ --success-soft: rgba(50, 213, 131, 0.12);
57
+ --success-text: #6ce9a6;
58
+ --warning: #fdb022;
59
+ --warning-soft: rgba(253, 176, 34, 0.12);
60
+ --warning-text: #fec84b;
61
+ --danger: #f97066;
62
+ --danger-soft: rgba(249, 112, 102, 0.12);
63
+ --danger-text: #fda29b;
64
+ --info-soft: rgba(83, 151, 255, 0.14);
65
+ --info-text: #84adff;
66
+ --match: rgba(139, 109, 255, 0.12);
67
+ --shadow: none;
68
+ --ring: 0 0 0 3px rgba(139, 109, 255, 0.3);
69
+ }
70
+ }
71
+
72
+ * {
73
+ box-sizing: border-box;
74
+ }
75
+
76
+ [hidden] {
77
+ display: none !important;
78
+ }
79
+
80
+ body {
81
+ margin: 0;
82
+ min-width: 320px;
83
+ background: var(--bg);
84
+ }
85
+
86
+ svg {
87
+ width: 16px;
88
+ height: 16px;
89
+ flex: none;
90
+ }
91
+
92
+ h1,
93
+ h2,
94
+ p {
95
+ margin: 0;
96
+ }
97
+
98
+ button,
99
+ input {
100
+ font: inherit;
101
+ color: inherit;
102
+ }
103
+
104
+ :focus-visible {
105
+ outline: none;
106
+ box-shadow: var(--ring);
107
+ }
108
+
109
+ /* Top bar */
110
+
111
+ .topbar {
112
+ position: sticky;
113
+ top: 0;
114
+ z-index: 2;
115
+ display: flex;
116
+ align-items: center;
117
+ gap: 20px;
118
+ padding: 12px 20px;
119
+ border-bottom: 1px solid var(--border);
120
+ background: color-mix(in srgb, var(--surface) 88%, transparent);
121
+ backdrop-filter: blur(10px);
122
+ }
123
+
124
+ .brand {
125
+ display: flex;
126
+ align-items: center;
127
+ gap: 10px;
128
+ }
129
+
130
+ .brand-mark {
131
+ display: grid;
132
+ place-items: center;
133
+ width: 30px;
134
+ height: 30px;
135
+ border-radius: 8px;
136
+ background: linear-gradient(135deg, var(--accent), #b06dff);
137
+ color: #fff;
138
+ }
139
+
140
+ h1 {
141
+ font-size: 14px;
142
+ font-weight: 650;
143
+ letter-spacing: -0.01em;
144
+ }
145
+
146
+ .subtitle {
147
+ color: var(--text-3);
148
+ font-family: var(--mono);
149
+ font-size: 11px;
150
+ }
151
+
152
+ .stats {
153
+ display: flex;
154
+ gap: 6px;
155
+ margin: 0;
156
+ flex-wrap: wrap;
157
+ }
158
+
159
+ .stat {
160
+ display: flex;
161
+ align-items: baseline;
162
+ gap: 5px;
163
+ padding: 4px 9px;
164
+ border: 1px solid var(--border);
165
+ border-radius: 999px;
166
+ background: var(--surface);
167
+ }
168
+
169
+ .stat dt {
170
+ order: 2;
171
+ color: var(--text-3);
172
+ font-size: 11.5px;
173
+ }
174
+
175
+ .stat dd {
176
+ margin: 0;
177
+ font-weight: 650;
178
+ font-variant-numeric: tabular-nums;
179
+ }
180
+
181
+ .topbar-actions {
182
+ display: flex;
183
+ align-items: center;
184
+ gap: 8px;
185
+ margin-left: auto;
186
+ }
187
+
188
+ .live {
189
+ display: inline-flex;
190
+ align-items: center;
191
+ gap: 7px;
192
+ padding: 4px 10px;
193
+ border-radius: 999px;
194
+ background: var(--surface-2);
195
+ color: var(--text-2);
196
+ font-size: 12px;
197
+ font-weight: 550;
198
+ }
199
+
200
+ .live-dot {
201
+ position: relative;
202
+ width: 7px;
203
+ height: 7px;
204
+ border-radius: 50%;
205
+ background: var(--text-3);
206
+ }
207
+
208
+ .live[data-state="live"] {
209
+ background: var(--success-soft);
210
+ color: var(--success-text);
211
+ }
212
+
213
+ .live[data-state="live"] .live-dot {
214
+ background: var(--success);
215
+ }
216
+
217
+ .live[data-state="live"] .live-dot::after {
218
+ content: "";
219
+ position: absolute;
220
+ inset: -3px;
221
+ border-radius: 50%;
222
+ background: var(--success);
223
+ opacity: 0.35;
224
+ animation: pulse 2s ease-out infinite;
225
+ }
226
+
227
+ .live[data-state="reconnecting"] {
228
+ background: var(--warning-soft);
229
+ color: var(--warning-text);
230
+ }
231
+
232
+ .live[data-state="reconnecting"] .live-dot {
233
+ background: var(--warning);
234
+ }
235
+
236
+ @keyframes pulse {
237
+ from {
238
+ transform: scale(0.6);
239
+ opacity: 0.45;
240
+ }
241
+ to {
242
+ transform: scale(2);
243
+ opacity: 0;
244
+ }
245
+ }
246
+
247
+ @media (prefers-reduced-motion: reduce) {
248
+ .live-dot::after {
249
+ animation: none !important;
250
+ }
251
+ }
252
+
253
+ /* Controls */
254
+
255
+ .icon-button,
256
+ .button {
257
+ display: inline-flex;
258
+ align-items: center;
259
+ justify-content: center;
260
+ gap: 6px;
261
+ height: 32px;
262
+ border: 1px solid var(--border);
263
+ border-radius: 8px;
264
+ background: var(--surface);
265
+ color: var(--text-2);
266
+ cursor: pointer;
267
+ transition: background 120ms, border-color 120ms, color 120ms;
268
+ }
269
+
270
+ .icon-button {
271
+ width: 32px;
272
+ padding: 0;
273
+ }
274
+
275
+ .icon-button:hover {
276
+ border-color: var(--border-strong);
277
+ background: var(--surface-2);
278
+ color: var(--text);
279
+ }
280
+
281
+ .icon-button.spinning svg {
282
+ animation: spin 600ms ease;
283
+ }
284
+
285
+ @keyframes spin {
286
+ to {
287
+ transform: rotate(360deg);
288
+ }
289
+ }
290
+
291
+ .button {
292
+ padding: 0 14px;
293
+ border-color: transparent;
294
+ background: var(--accent);
295
+ color: #fff;
296
+ font-weight: 600;
297
+ }
298
+
299
+ .button:hover {
300
+ filter: brightness(1.08);
301
+ }
302
+
303
+ .field {
304
+ position: relative;
305
+ display: flex;
306
+ flex: 1;
307
+ align-items: center;
308
+ min-width: 0;
309
+ }
310
+
311
+ .field input {
312
+ width: 100%;
313
+ height: 32px;
314
+ padding: 0 10px;
315
+ border: 1px solid var(--border);
316
+ border-radius: 8px;
317
+ background: var(--surface);
318
+ transition: border-color 120ms, box-shadow 120ms;
319
+ }
320
+
321
+ .field input::placeholder {
322
+ color: var(--text-3);
323
+ }
324
+
325
+ .field input:focus {
326
+ border-color: var(--accent);
327
+ outline: none;
328
+ box-shadow: var(--ring);
329
+ }
330
+
331
+ .field-icon {
332
+ position: absolute;
333
+ left: 10px;
334
+ color: var(--text-3);
335
+ pointer-events: none;
336
+ }
337
+
338
+ .field-icon + .visually-hidden + input {
339
+ padding-left: 32px;
340
+ }
341
+
342
+ .field-mono input {
343
+ font-family: var(--mono);
344
+ font-size: 12.5px;
345
+ }
346
+
347
+ /* Alerts */
348
+
349
+ .alert,
350
+ .conflicts {
351
+ margin: 16px 20px 0;
352
+ padding: 12px 14px;
353
+ border: 1px solid color-mix(in srgb, var(--danger) 35%, transparent);
354
+ border-radius: var(--radius);
355
+ background: var(--danger-soft);
356
+ color: var(--danger-text);
357
+ }
358
+
359
+ .conflicts h2 {
360
+ margin-bottom: 6px;
361
+ font-size: 13px;
362
+ }
363
+
364
+ .conflicts p {
365
+ color: var(--text-2);
366
+ margin-bottom: 8px;
367
+ }
368
+
369
+ .conflict + .conflict {
370
+ margin-top: 8px;
371
+ }
372
+
373
+ .conflict code {
374
+ font-family: var(--mono);
375
+ font-weight: 600;
376
+ }
377
+
378
+ /* Layout */
379
+
380
+ .layout {
381
+ display: grid;
382
+ grid-template-columns: minmax(0, 1fr) minmax(300px, 380px);
383
+ gap: 16px;
384
+ align-items: start;
385
+ padding: 16px 20px 24px;
386
+ }
387
+
388
+ @media (max-width: 860px) {
389
+ .layout {
390
+ grid-template-columns: minmax(0, 1fr);
391
+ }
392
+
393
+ .topbar {
394
+ flex-wrap: wrap;
395
+ gap: 10px 16px;
396
+ }
397
+ }
398
+
399
+ .side {
400
+ display: grid;
401
+ gap: 16px;
402
+ }
403
+
404
+ @media (min-width: 861px) {
405
+ .side {
406
+ position: sticky;
407
+ top: 72px;
408
+ }
409
+ }
410
+
411
+ .panel {
412
+ min-width: 0;
413
+ border: 1px solid var(--border);
414
+ border-radius: var(--radius);
415
+ background: var(--surface);
416
+ box-shadow: var(--shadow);
417
+ }
418
+
419
+ .panel-header {
420
+ padding: 14px 16px 0;
421
+ }
422
+
423
+ .panel-header h2 {
424
+ font-size: 13px;
425
+ font-weight: 650;
426
+ }
427
+
428
+ .panel-header p {
429
+ margin-top: 2px;
430
+ color: var(--text-3);
431
+ font-size: 12px;
432
+ }
433
+
434
+ .panel-toolbar {
435
+ display: flex;
436
+ gap: 8px;
437
+ padding: 10px;
438
+ border-bottom: 1px solid var(--border);
439
+ }
440
+
441
+ /* Tree */
442
+
443
+ .tree {
444
+ padding: 6px;
445
+ }
446
+
447
+ .tree ul {
448
+ margin: 0;
449
+ padding: 0;
450
+ list-style: none;
451
+ }
452
+
453
+ .tree ul ul {
454
+ position: relative;
455
+ margin-left: 15px;
456
+ padding-left: 9px;
457
+ }
458
+
459
+ .tree ul ul::before {
460
+ content: "";
461
+ position: absolute;
462
+ top: 0;
463
+ bottom: 6px;
464
+ left: 0;
465
+ border-left: 1px solid var(--border);
466
+ }
467
+
468
+ .row {
469
+ display: flex;
470
+ align-items: center;
471
+ gap: 6px;
472
+ min-height: 30px;
473
+ padding: 3px 8px 3px 4px;
474
+ border-radius: 7px;
475
+ cursor: pointer;
476
+ user-select: none;
477
+ }
478
+
479
+ .row:hover {
480
+ background: var(--surface-2);
481
+ }
482
+
483
+ .row[aria-selected="true"] {
484
+ background: var(--accent-soft);
485
+ }
486
+
487
+ .row.matched {
488
+ box-shadow: inset 2px 0 0 var(--accent);
489
+ background: var(--match);
490
+ }
491
+
492
+ .row.matched[aria-selected="true"] {
493
+ background: var(--accent-soft);
494
+ }
495
+
496
+ .twisty {
497
+ display: grid;
498
+ place-items: center;
499
+ width: 18px;
500
+ height: 18px;
501
+ padding: 0;
502
+ border: 0;
503
+ border-radius: 4px;
504
+ background: none;
505
+ color: var(--text-3);
506
+ cursor: pointer;
507
+ }
508
+
509
+ .twisty svg {
510
+ width: 13px;
511
+ height: 13px;
512
+ transition: transform 120ms;
513
+ }
514
+
515
+ .twisty[aria-expanded="true"] svg {
516
+ transform: rotate(90deg);
517
+ }
518
+
519
+ .twisty:hover {
520
+ background: var(--border);
521
+ color: var(--text);
522
+ }
523
+
524
+ .twisty-spacer {
525
+ width: 18px;
526
+ flex: none;
527
+ }
528
+
529
+ .segment {
530
+ overflow: hidden;
531
+ font-family: var(--mono);
532
+ font-size: 12.5px;
533
+ font-weight: 550;
534
+ text-overflow: ellipsis;
535
+ white-space: nowrap;
536
+ }
537
+
538
+ .segment .slash {
539
+ color: var(--text-3);
540
+ font-weight: 400;
541
+ }
542
+
543
+ .segment .param {
544
+ color: var(--info-text);
545
+ }
546
+
547
+ .segment .optional {
548
+ color: var(--warning-text);
549
+ }
550
+
551
+ .segment .group {
552
+ color: var(--text-3);
553
+ font-style: italic;
554
+ }
555
+
556
+ .full-path {
557
+ overflow: hidden;
558
+ color: var(--text-3);
559
+ font-family: var(--mono);
560
+ font-size: 11.5px;
561
+ text-overflow: ellipsis;
562
+ white-space: nowrap;
563
+ }
564
+
565
+ .row-files {
566
+ display: flex;
567
+ gap: 3px;
568
+ margin-left: auto;
569
+ padding-left: 8px;
570
+ }
571
+
572
+ .chip {
573
+ display: inline-flex;
574
+ align-items: center;
575
+ height: 20px;
576
+ padding: 0 7px;
577
+ border-radius: 999px;
578
+ background: var(--surface-2);
579
+ color: var(--text-2);
580
+ font-size: 11px;
581
+ font-weight: 550;
582
+ white-space: nowrap;
583
+ }
584
+
585
+ .chip-page { background: var(--accent-soft); color: var(--accent-text); }
586
+ .chip-layout { background: var(--info-soft); color: var(--info-text); }
587
+ .chip-loader,
588
+ .chip-action { background: var(--success-soft); color: var(--success-text); }
589
+ .chip-loading { background: var(--warning-soft); color: var(--warning-text); }
590
+ .chip-error,
591
+ .chip-notFound { background: var(--danger-soft); color: var(--danger-text); }
592
+ .chip-group { background: transparent; border: 1px dashed var(--border-strong); color: var(--text-3); }
593
+
594
+ .empty {
595
+ padding: 28px 16px;
596
+ color: var(--text-3);
597
+ text-align: center;
598
+ }
599
+
600
+ mark {
601
+ border-radius: 3px;
602
+ background: color-mix(in srgb, var(--warning) 30%, transparent);
603
+ color: inherit;
604
+ }
605
+
606
+ /* Tester */
607
+
608
+ .tester {
609
+ display: flex;
610
+ gap: 8px;
611
+ padding: 12px 16px;
612
+ }
613
+
614
+ #tester-result:not(:empty) {
615
+ padding: 0 16px 16px;
616
+ }
617
+
618
+ .result-status {
619
+ display: flex;
620
+ align-items: center;
621
+ gap: 8px;
622
+ margin-bottom: 12px;
623
+ font-weight: 600;
624
+ }
625
+
626
+ .result-status .chip {
627
+ height: 22px;
628
+ font-size: 11.5px;
629
+ }
630
+
631
+ .result-pathname {
632
+ overflow: hidden;
633
+ color: var(--text-3);
634
+ font-family: var(--mono);
635
+ font-size: 12px;
636
+ font-weight: 400;
637
+ text-overflow: ellipsis;
638
+ white-space: nowrap;
639
+ }
640
+
641
+ .crumbs {
642
+ display: flex;
643
+ flex-wrap: wrap;
644
+ align-items: center;
645
+ gap: 4px;
646
+ margin-bottom: 12px;
647
+ font-family: var(--mono);
648
+ font-size: 12px;
649
+ }
650
+
651
+ .crumb {
652
+ padding: 2px 7px;
653
+ border: 1px solid var(--border);
654
+ border-radius: 6px;
655
+ background: var(--surface-2);
656
+ cursor: pointer;
657
+ }
658
+
659
+ .crumb:hover {
660
+ border-color: var(--accent);
661
+ }
662
+
663
+ .crumb-sep {
664
+ color: var(--text-3);
665
+ }
666
+
667
+ /* Definition lists in tester and details */
668
+
669
+ .facts {
670
+ display: grid;
671
+ gap: 10px;
672
+ margin: 0;
673
+ }
674
+
675
+ .facts > div {
676
+ display: grid;
677
+ gap: 4px;
678
+ }
679
+
680
+ .facts dt {
681
+ color: var(--text-3);
682
+ font-size: 11px;
683
+ font-weight: 600;
684
+ letter-spacing: 0.04em;
685
+ text-transform: uppercase;
686
+ }
687
+
688
+ .facts dd {
689
+ display: grid;
690
+ gap: 4px;
691
+ margin: 0;
692
+ min-width: 0;
693
+ }
694
+
695
+ .params {
696
+ display: flex;
697
+ flex-wrap: wrap;
698
+ gap: 6px;
699
+ }
700
+
701
+ .param-pill {
702
+ display: inline-flex;
703
+ overflow: hidden;
704
+ border: 1px solid var(--border);
705
+ border-radius: 6px;
706
+ font-family: var(--mono);
707
+ font-size: 12px;
708
+ }
709
+
710
+ .param-pill span {
711
+ padding: 2px 7px;
712
+ }
713
+
714
+ .param-pill span:first-child {
715
+ background: var(--surface-2);
716
+ color: var(--info-text);
717
+ }
718
+
719
+ .param-pill .missing {
720
+ color: var(--text-3);
721
+ font-style: italic;
722
+ }
723
+
724
+ .file-link {
725
+ display: flex;
726
+ align-items: center;
727
+ gap: 8px;
728
+ width: 100%;
729
+ min-width: 0;
730
+ padding: 6px 8px;
731
+ border: 1px solid var(--border);
732
+ border-radius: 7px;
733
+ background: var(--surface);
734
+ color: var(--text);
735
+ font-family: var(--mono);
736
+ font-size: 12px;
737
+ text-align: left;
738
+ cursor: pointer;
739
+ transition: border-color 120ms, background 120ms;
740
+ }
741
+
742
+ .file-link span {
743
+ overflow: hidden;
744
+ text-overflow: ellipsis;
745
+ white-space: nowrap;
746
+ direction: rtl;
747
+ text-align: left;
748
+ }
749
+
750
+ .file-link svg {
751
+ width: 14px;
752
+ height: 14px;
753
+ margin-left: auto;
754
+ color: var(--text-3);
755
+ opacity: 0;
756
+ transition: opacity 120ms;
757
+ }
758
+
759
+ .file-link:hover {
760
+ border-color: var(--accent);
761
+ background: var(--accent-soft);
762
+ }
763
+
764
+ .file-link:hover svg,
765
+ .file-link:focus-visible svg {
766
+ opacity: 1;
767
+ }
768
+
769
+ .file-link.opened {
770
+ border-color: var(--success);
771
+ }
772
+
773
+ .muted {
774
+ color: var(--text-3);
775
+ }
776
+
777
+ .details-body {
778
+ padding: 12px 16px 16px;
779
+ }
780
+
781
+ .details-path {
782
+ margin-bottom: 12px;
783
+ font-family: var(--mono);
784
+ font-size: 14px;
785
+ font-weight: 600;
786
+ overflow-wrap: anywhere;
787
+ }
788
+
789
+ .link-button {
790
+ justify-self: start;
791
+ padding: 0;
792
+ border: 0;
793
+ background: none;
794
+ color: var(--accent-text);
795
+ font-weight: 550;
796
+ cursor: pointer;
797
+ }
798
+
799
+ .link-button:hover {
800
+ text-decoration: underline;
801
+ }
802
+
803
+ .toast {
804
+ position: fixed;
805
+ bottom: 16px;
806
+ left: 50%;
807
+ z-index: 3;
808
+ padding: 8px 14px;
809
+ border-radius: 8px;
810
+ background: var(--text);
811
+ color: var(--bg);
812
+ font-size: 12px;
813
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.2);
814
+ transform: translateX(-50%);
815
+ animation: toast-in 160ms ease;
816
+ }
817
+
818
+ @keyframes toast-in {
819
+ from {
820
+ opacity: 0;
821
+ transform: translate(-50%, 6px);
822
+ }
823
+ }
824
+
825
+ .visually-hidden {
826
+ position: absolute;
827
+ width: 1px;
828
+ height: 1px;
829
+ overflow: hidden;
830
+ clip: rect(0, 0, 0, 0);
831
+ white-space: nowrap;
832
+ }
833
+
834
+ /* Current page */
835
+
836
+ .panel-header-row {
837
+ display: flex;
838
+ align-items: flex-start;
839
+ justify-content: space-between;
840
+ gap: 12px;
841
+ }
842
+
843
+ #current:not(:empty) {
844
+ padding: 12px 16px 16px;
845
+ }
846
+
847
+ .current-url {
848
+ display: flex;
849
+ align-items: center;
850
+ gap: 8px;
851
+ margin-bottom: 10px;
852
+ min-width: 0;
853
+ }
854
+
855
+ .current-url code {
856
+ overflow: hidden;
857
+ font-family: var(--mono);
858
+ font-size: 13px;
859
+ font-weight: 600;
860
+ text-overflow: ellipsis;
861
+ white-space: nowrap;
862
+ }
863
+
864
+ .current-dot {
865
+ width: 8px;
866
+ height: 8px;
867
+ flex: none;
868
+ border-radius: 50%;
869
+ background: var(--success);
870
+ box-shadow: 0 0 0 3px var(--success-soft);
871
+ }
872
+
873
+ .current-empty {
874
+ padding: 12px 16px 16px;
875
+ color: var(--text-3);
876
+ }
877
+
878
+ .tab-picker {
879
+ display: flex;
880
+ flex-wrap: wrap;
881
+ justify-content: flex-end;
882
+ gap: 4px;
883
+ }
884
+
885
+ .tab-picker button {
886
+ height: 24px;
887
+ padding: 0 8px;
888
+ border: 1px solid var(--border);
889
+ border-radius: 999px;
890
+ background: var(--surface);
891
+ color: var(--text-2);
892
+ font-size: 11.5px;
893
+ cursor: pointer;
894
+ }
895
+
896
+ .tab-picker button[aria-pressed="true"] {
897
+ border-color: var(--success);
898
+ background: var(--success-soft);
899
+ color: var(--success-text);
900
+ }
901
+
902
+ .row.current .segment::after {
903
+ content: "";
904
+ display: inline-block;
905
+ width: 6px;
906
+ height: 6px;
907
+ margin-left: 7px;
908
+ border-radius: 50%;
909
+ background: var(--success);
910
+ vertical-align: middle;
911
+ }
912
+
913
+ .row.current {
914
+ box-shadow: inset 2px 0 0 var(--success);
915
+ }
916
+
917
+ .row.current.matched {
918
+ box-shadow: inset 2px 0 0 var(--success), inset 4px 0 0 var(--accent);
919
+ }
920
+
921
+ /* Tabs */
922
+
923
+ .tabs {
924
+ display: flex;
925
+ gap: 4px;
926
+ padding: 4px;
927
+ border: 1px solid var(--border);
928
+ border-radius: var(--radius);
929
+ background: var(--surface);
930
+ }
931
+
932
+ .tab {
933
+ display: inline-flex;
934
+ flex: 1;
935
+ align-items: center;
936
+ justify-content: center;
937
+ gap: 6px;
938
+ height: 30px;
939
+ border: 0;
940
+ border-radius: 7px;
941
+ background: none;
942
+ color: var(--text-2);
943
+ font-weight: 600;
944
+ cursor: pointer;
945
+ }
946
+
947
+ .tab:hover {
948
+ color: var(--text);
949
+ }
950
+
951
+ .tab[aria-selected="true"] {
952
+ background: var(--accent-soft);
953
+ color: var(--accent-text);
954
+ }
955
+
956
+ .tab-count {
957
+ min-width: 18px;
958
+ height: 18px;
959
+ padding: 0 5px;
960
+ border-radius: 999px;
961
+ background: var(--accent);
962
+ color: #fff;
963
+ font-size: 10.5px;
964
+ line-height: 18px;
965
+ font-variant-numeric: tabular-nums;
966
+ }
967
+
968
+ .view {
969
+ display: grid;
970
+ gap: 16px;
971
+ }
972
+
973
+ .view[hidden] {
974
+ display: none;
975
+ }
976
+
977
+ .text-button {
978
+ width: auto;
979
+ padding: 0 10px;
980
+ font-size: 12px;
981
+ }
982
+
983
+ /* Timeline */
984
+
985
+ .timeline-toolbar {
986
+ display: grid;
987
+ gap: 8px;
988
+ padding: 12px 16px;
989
+ border-bottom: 1px solid var(--border);
990
+ }
991
+
992
+ .segmented {
993
+ display: flex;
994
+ gap: 2px;
995
+ padding: 2px;
996
+ border-radius: 8px;
997
+ background: var(--surface-2);
998
+ }
999
+
1000
+ .segmented button {
1001
+ flex: 1;
1002
+ height: 26px;
1003
+ border: 0;
1004
+ border-radius: 6px;
1005
+ background: none;
1006
+ color: var(--text-2);
1007
+ font-size: 12px;
1008
+ font-weight: 550;
1009
+ cursor: pointer;
1010
+ }
1011
+
1012
+ .segmented button[aria-pressed="true"] {
1013
+ background: var(--surface);
1014
+ color: var(--text);
1015
+ box-shadow: 0 1px 2px rgba(16, 24, 40, 0.1);
1016
+ }
1017
+
1018
+ .timeline {
1019
+ max-height: 560px;
1020
+ margin: 0;
1021
+ padding: 6px;
1022
+ overflow-y: auto;
1023
+ list-style: none;
1024
+ }
1025
+
1026
+ .timeline:empty::before {
1027
+ content: attr(data-empty);
1028
+ display: block;
1029
+ padding: 24px 12px;
1030
+ color: var(--text-3);
1031
+ text-align: center;
1032
+ }
1033
+
1034
+ .call {
1035
+ border-radius: 8px;
1036
+ }
1037
+
1038
+ .call + .call {
1039
+ margin-top: 2px;
1040
+ }
1041
+
1042
+ .call-summary {
1043
+ display: grid;
1044
+ grid-template-columns: auto minmax(0, 1fr) auto;
1045
+ gap: 4px 8px;
1046
+ align-items: center;
1047
+ width: 100%;
1048
+ padding: 8px 10px;
1049
+ border: 0;
1050
+ border-radius: 8px;
1051
+ background: none;
1052
+ color: inherit;
1053
+ text-align: left;
1054
+ cursor: pointer;
1055
+ }
1056
+
1057
+ .call-summary:hover,
1058
+ .call[open] .call-summary {
1059
+ background: var(--surface-2);
1060
+ }
1061
+
1062
+ .call-route {
1063
+ overflow: hidden;
1064
+ font-family: var(--mono);
1065
+ font-size: 12px;
1066
+ font-weight: 600;
1067
+ text-overflow: ellipsis;
1068
+ white-space: nowrap;
1069
+ }
1070
+
1071
+ .call-meta {
1072
+ grid-column: 2 / 4;
1073
+ display: flex;
1074
+ gap: 8px;
1075
+ min-width: 0;
1076
+ color: var(--text-3);
1077
+ font-size: 11.5px;
1078
+ }
1079
+
1080
+ .call-meta span:first-child {
1081
+ overflow: hidden;
1082
+ font-family: var(--mono);
1083
+ text-overflow: ellipsis;
1084
+ white-space: nowrap;
1085
+ }
1086
+
1087
+ .call-meta time {
1088
+ margin-left: auto;
1089
+ white-space: nowrap;
1090
+ }
1091
+
1092
+ .call-duration {
1093
+ color: var(--text-2);
1094
+ font-size: 11.5px;
1095
+ font-variant-numeric: tabular-nums;
1096
+ white-space: nowrap;
1097
+ }
1098
+
1099
+ .call-duration.slow {
1100
+ color: var(--warning-text);
1101
+ font-weight: 600;
1102
+ }
1103
+
1104
+ .call-body {
1105
+ display: grid;
1106
+ gap: 10px;
1107
+ padding: 4px 10px 12px;
1108
+ }
1109
+
1110
+ .call-preview {
1111
+ max-height: 160px;
1112
+ margin: 0;
1113
+ padding: 8px 10px;
1114
+ overflow: auto;
1115
+ border: 1px solid var(--border);
1116
+ border-radius: 7px;
1117
+ background: var(--surface-2);
1118
+ font-family: var(--mono);
1119
+ font-size: 11.5px;
1120
+ white-space: pre-wrap;
1121
+ word-break: break-all;
1122
+ }
1123
+
1124
+ .chip-skipped {
1125
+ background: var(--surface-2);
1126
+ color: var(--text-3);
1127
+ border: 1px dashed var(--border-strong);
1128
+ }
1129
+
1130
+ .call-summary {
1131
+ list-style: none;
1132
+ }
1133
+
1134
+ .call-summary::-webkit-details-marker {
1135
+ display: none;
1136
+ }