finchvox 0.0.1__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.
@@ -0,0 +1,774 @@
1
+ /* ==========================================
2
+ FINCHVOX UI STYLES
3
+ ========================================== */
4
+ /*
5
+ TABLE OF CONTENTS:
6
+ 1. CSS Variables & Root Styles
7
+ 2. Base & Reset Styles
8
+ 3. Layout & Page Structure
9
+ 4. Header & Navigation
10
+ 5. Audio Player & Waveform
11
+ 6. Text Chunks & Hover Markers
12
+ 7. Waterfall View
13
+ 8. Details Panel
14
+ 9. Traces List View
15
+ 10. Scrollbar Styles
16
+ 11. Utility Classes
17
+ */
18
+
19
+ /* ==========================================
20
+ 1. CSS VARIABLES & ROOT STYLES
21
+ ========================================== */
22
+ :root {
23
+ --bg-primary: #0a0a0a;
24
+ --bg-secondary: #1a1a1a;
25
+ --bg-tertiary: #2a2a2a;
26
+ --text-primary: #ffffff;
27
+ --text-secondary: #a0a0a0;
28
+ --text-tertiary: #6b7280;
29
+ --accent: #a855f7;
30
+ --accent-hover: #9333ea;
31
+ --border: #333333;
32
+ --zebra-stripe: #0f0f0f;
33
+ --span-stt: #f97316;
34
+ --span-stt-progress: #ea580c;
35
+ --span-llm: #ec4899;
36
+ --span-tts: #a855f7;
37
+ --span-turn: #10b981;
38
+ --span-default: #6b7280;
39
+
40
+ --waterfall-row-height: 32px;
41
+ --gutter-indent-size: 16px;
42
+ --gutter-base-width: 32px;
43
+ }
44
+
45
+ /* ==========================================
46
+ 2. BASE & RESET STYLES
47
+ ========================================== */
48
+ * {
49
+ margin: 0;
50
+ padding: 0;
51
+ box-sizing: border-box;
52
+ }
53
+
54
+ [x-cloak] {
55
+ display: none !important;
56
+ }
57
+
58
+ body {
59
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', sans-serif;
60
+ background: var(--bg-primary);
61
+ color: var(--text-primary);
62
+ min-height: 100vh;
63
+ display: flex;
64
+ flex-direction: column;
65
+ overflow-y: auto;
66
+ overflow-x: hidden;
67
+ font-size: 14px;
68
+ }
69
+
70
+ button:focus-visible {
71
+ outline: none;
72
+ }
73
+
74
+ a {
75
+ color: #a855f7;
76
+ text-decoration: underline;
77
+ transition: color 0.2s;
78
+ }
79
+
80
+ a:hover, a:focus {
81
+ color: #c084fc;
82
+ text-decoration: underline;
83
+ }
84
+
85
+ /* ==========================================
86
+ 3. LAYOUT & PAGE STRUCTURE
87
+ ========================================== */
88
+ .page-layout {
89
+ display: flex;
90
+ flex: 1;
91
+ overflow-y: hidden;
92
+ overflow-x: visible;
93
+ position: relative;
94
+ }
95
+
96
+ .main-content {
97
+ flex: 1;
98
+ display: flex;
99
+ flex-direction: column;
100
+ overflow-y: auto;
101
+ overflow-x: visible;
102
+ transition: margin-right 0.3s ease-out;
103
+ }
104
+
105
+ .main-content.panel-open {
106
+ margin-right: 400px;
107
+ }
108
+
109
+ .fixed-container {
110
+ position: fixed;
111
+ top: 0;
112
+ left: 0;
113
+ right: 0;
114
+ z-index: 100;
115
+ background-color: var(--bg-primary);
116
+ }
117
+
118
+ .main-content.panel-open .fixed-container {
119
+ right: 400px;
120
+ }
121
+
122
+ .content-area {
123
+ flex: 1;
124
+ margin-top: 280px;
125
+ }
126
+
127
+ /* ==========================================
128
+ 4. HEADER & NAVIGATION
129
+ ========================================== */
130
+ .page-header {
131
+ padding: 0.9rem 2rem;
132
+ border-bottom: 1px solid var(--border);
133
+ display: flex;
134
+ align-items: center;
135
+ gap: 10px;
136
+ background-color: var(--bg-primary);
137
+ }
138
+
139
+ .logo {
140
+ height: 20px;
141
+ width: auto;
142
+ }
143
+
144
+ /* ==========================================
145
+ 5. AUDIO PLAYER & WAVEFORM
146
+ ========================================== */
147
+ .audio-section {
148
+ padding: 1rem 2rem;
149
+ border-bottom: 1px solid var(--border);
150
+ }
151
+
152
+ .audio-controls {
153
+ display: flex;
154
+ align-items: center;
155
+ justify-content: space-between;
156
+ gap: 1rem;
157
+ margin-bottom: 1rem;
158
+ }
159
+
160
+ .audio-controls-left {
161
+ display: flex;
162
+ align-items: center;
163
+ gap: 1rem;
164
+ }
165
+
166
+ .download-button {
167
+ text-decoration: none;
168
+ display: flex;
169
+ gap: 8px;
170
+ }
171
+
172
+ .audio-time-display {
173
+ font-size: 11px;
174
+ line-height: 24px;
175
+ height: 24px;
176
+ vertical-align: middle;
177
+ }
178
+
179
+ .time {
180
+ font-family: 'SF Mono', 'Monaco', 'Courier New', monospace;
181
+ color: var(--text-secondary);
182
+ }
183
+
184
+ .time-separator {
185
+ color: var(--text-tertiary);
186
+ }
187
+
188
+ #timeline {
189
+ height: 24px;
190
+ margin-bottom: 0.25rem;
191
+ border-bottom: 1px solid var(--border);
192
+ padding-bottom: 2px;
193
+ }
194
+
195
+ .timeline-marker span {
196
+ font-size: 9px;
197
+ font-weight: 500;
198
+ letter-spacing: 0.02em;
199
+ }
200
+
201
+ #waveform {
202
+ margin-bottom: 0.25rem;
203
+ border-radius: 4px;
204
+ overflow: hidden;
205
+ border-bottom: 1px solid var(--border);
206
+ height: 81px;
207
+ }
208
+
209
+ .waveform-channel-icons {
210
+ position: absolute;
211
+ top: 94px;
212
+ left: 8px;
213
+ width: 16px;
214
+ z-index: 10;
215
+ }
216
+
217
+ .channel-icon {
218
+ width: 16px;
219
+ height: 16px;
220
+ position: absolute;
221
+ left: 0;
222
+ opacity: 1.0;
223
+ cursor: default;
224
+ }
225
+
226
+ .mic-icon {
227
+ top: 74px;
228
+ color: var(--span-stt);
229
+ }
230
+
231
+ .robot-icon {
232
+ top: 114px;
233
+ color: var(--span-tts);
234
+ }
235
+
236
+ .error {
237
+ display: flex;
238
+ align-items: center;
239
+ gap: 12px;
240
+ padding: 16px 20px;
241
+ margin: 100px 2rem 1rem 2rem;
242
+ background: var(--bg-secondary);
243
+ border: 1px solid var(--border);
244
+ border-radius: 2px;
245
+ color: #fb923c;
246
+ }
247
+
248
+ .error-icon {
249
+ width: 20px;
250
+ height: 20px;
251
+ flex-shrink: 0;
252
+ }
253
+
254
+ .error a {
255
+ color: #fb923c;
256
+ text-decoration: underline;
257
+ }
258
+
259
+ .error a:hover {
260
+ color: #fdba74;
261
+ }
262
+
263
+ /* ==========================================
264
+ 6. TEXT CHUNKS & HOVER MARKERS
265
+ ========================================== */
266
+ .text-chunk-row {
267
+ position: relative;
268
+ height: 22px;
269
+ margin-bottom: 0.25rem;
270
+ pointer-events: none;
271
+ }
272
+
273
+ .text-chunk-row.bot-chunks {
274
+ margin-bottom: 0;
275
+ }
276
+
277
+ .text-chunk {
278
+ position: absolute;
279
+ height: 20px;
280
+ padding: 0px 6px;
281
+ background-color: var(--bg-tertiary);
282
+ border-radius: 2px;
283
+ overflow: hidden;
284
+ white-space: nowrap;
285
+ pointer-events: auto;
286
+ cursor: pointer;
287
+ transition: background-color 0.15s ease;
288
+ border: 1px solid black;
289
+ text-overflow: ellipsis;
290
+ color: var(--text-secondary);
291
+ }
292
+
293
+ .text-chunk:hover {
294
+ background-color: #3a3a3a;
295
+ }
296
+
297
+ .text-chunk.highlighted {
298
+ background-color: #3a3a3a;
299
+ }
300
+
301
+ .chunk-text {
302
+ font-size: 10px;
303
+ line-height: 10px;
304
+ }
305
+
306
+ .hover-marker-overlay {
307
+ position: absolute;
308
+ top: 104px;
309
+ left: 0;
310
+ height: 157px;
311
+ pointer-events: none;
312
+ z-index: 20;
313
+ }
314
+
315
+ .hover-marker-line {
316
+ position: absolute;
317
+ top: 16px;
318
+ height: 117px;
319
+ left: 0;
320
+ width: 1px;
321
+ background-color: #6b7280;
322
+ }
323
+
324
+ .hover-marker-label {
325
+ position: absolute;
326
+ top: 0;
327
+ left: 50%;
328
+ transform: translateX(-50%);
329
+ background-color: #6b7280;
330
+ color: #000000;
331
+ padding: 2px 6px;
332
+ border-radius: 2px;
333
+ font-size: 10px;
334
+ font-weight: 500;
335
+ letter-spacing: 0.02em;
336
+ font-family: monospace;
337
+ white-space: nowrap;
338
+ z-index: 20;
339
+ }
340
+
341
+ /* ==========================================
342
+ 7. WATERFALL VIEW
343
+ ========================================== */
344
+ .waterfall-container {
345
+ overflow-y: hidden;
346
+ overflow-x: visible;
347
+ display: flex;
348
+ flex-direction: column;
349
+ height: calc(100vh - 320px);
350
+ }
351
+
352
+ .waterfall-toolbar {
353
+ padding: 1rem 2rem 0.75rem 2rem;
354
+ display: flex;
355
+ align-items: center;
356
+ justify-content: space-between;
357
+ }
358
+
359
+ .waterfall-body {
360
+ flex: 1;
361
+ overflow-y: auto;
362
+ overflow-x: visible;
363
+ padding: 0rem 2rem 0 2rem;
364
+ }
365
+
366
+ .waterfall-row {
367
+ height: var(--waterfall-row-height);
368
+ cursor: pointer;
369
+ transition: background 0.15s ease;
370
+ border-left: 1px solid transparent;
371
+
372
+ }
373
+
374
+ .waterfall-row:nth-child(even) {
375
+ background: var(--zebra-stripe);
376
+ }
377
+
378
+ .waterfall-row:hover {
379
+ background: rgba(168, 85, 247, 0.08);
380
+ }
381
+
382
+ .waterfall-row.selected {
383
+ background: rgba(168, 85, 247, 0.15);
384
+ border-left: 1px solid var(--accent);
385
+ }
386
+
387
+ .expand-toggle {
388
+ background: transparent;
389
+ border: none;
390
+ cursor: pointer;
391
+ padding: 0px 6px;
392
+ display: flex;
393
+ align-items: center;
394
+ justify-content: center;
395
+ color: var(--text-primary);
396
+ transition: color 0.2s;
397
+ z-index: 2;
398
+ margin-left: -22px;
399
+ }
400
+
401
+ .expand-toggle:hover {
402
+ color: var(--text-primary);
403
+ }
404
+
405
+ .expand-toggle svg {
406
+ width: 12px;
407
+ height: 12px;
408
+ transition: transform 0.2s;
409
+ }
410
+
411
+ .expand-toggle.expanded svg {
412
+ transform: rotate(90deg);
413
+ }
414
+
415
+ .waterfall-timeline-track {
416
+ position: relative;
417
+ padding: 0 16px 0 32px;
418
+ display: flex;
419
+ align-items: center;
420
+ height: 100%;
421
+ }
422
+
423
+ .timeline-bar {
424
+ position: absolute;
425
+ height: 22px;
426
+ min-width: 1px;
427
+ transition: all 0.15s ease;
428
+ display: flex;
429
+ align-items: center;
430
+ overflow: visible;
431
+ border-radius: 2px;
432
+ border: 1px solid transparent;
433
+ }
434
+
435
+ .timeline-bar:hover {
436
+ filter: brightness(1.2);
437
+ z-index: 5;
438
+ }
439
+
440
+ .bar-stt { background: var(--span-stt); }
441
+ .bar-llm { background: var(--span-llm); }
442
+ .bar-tts { background: var(--span-tts); }
443
+ .bar-turn { background: var(--span-turn); }
444
+
445
+ .selected .timeline-bar {
446
+ border: 1px solid white;
447
+ z-index: 10;
448
+ }
449
+
450
+ .bar-label {
451
+ color: white;
452
+ font-size: 11px;
453
+ font-weight: 500;
454
+ white-space: nowrap;
455
+ letter-spacing: 0.3px;
456
+ padding: 0 8px 0 4px;
457
+ }
458
+
459
+ .bar-duration {
460
+ color: rgba(255, 255, 255, 0.85);
461
+ font-size: 10px;
462
+ font-family: 'SF Mono', 'Monaco', monospace;
463
+ white-space: nowrap;
464
+ }
465
+
466
+ .span-stt {
467
+ background: var(--span-stt);
468
+ }
469
+
470
+ .span-llm {
471
+ background: var(--span-llm);
472
+ }
473
+
474
+ .span-tts {
475
+ background: var(--span-tts);
476
+ }
477
+
478
+ /* ==========================================
479
+ 8. DETAILS PANEL
480
+ ========================================== */
481
+ .details-panel {
482
+ position: fixed;
483
+ top: 48px;
484
+ right: 0;
485
+ bottom: 0;
486
+ width: 400px;
487
+ background: var(--bg-primary);
488
+ border-left: 1px solid var(--border);
489
+ border-top: 1px solid var(--border);
490
+ overflow-y: auto;
491
+ z-index: 100;
492
+ box-shadow: -4px 0 20px rgba(0, 0, 0, 0.5);
493
+ }
494
+
495
+ .panel-header {
496
+ display: flex;
497
+ justify-content: space-between;
498
+ align-items: center;
499
+ padding: 0.5rem 2rem;
500
+ border-bottom: 1px solid var(--border);
501
+ position: sticky;
502
+ top: 0;
503
+ z-index: 10;
504
+ background: var(--bg-primary);
505
+ }
506
+
507
+ .panel-header h3 {
508
+ font-size: 14px;
509
+ font-weight: 600;
510
+ letter-spacing: 0.5px;
511
+ }
512
+
513
+ .close-button {
514
+ background: transparent;
515
+ border: none;
516
+ color: var(--text-secondary);
517
+ font-size: 14px;
518
+ cursor: pointer;
519
+ width: 40px;
520
+ height: 40px;
521
+ display: flex;
522
+ align-items: center;
523
+ justify-content: center;
524
+ border-radius: 4px;
525
+ transition: all 0.2s;
526
+ }
527
+
528
+ .close-button:hover {
529
+ background: var(--bg-secondary);
530
+ color: var(--text-primary);
531
+ }
532
+
533
+ .panel-content {
534
+ padding: 2rem;
535
+ }
536
+
537
+ .detail-grid {
538
+ display: grid;
539
+ gap: 1rem;
540
+ margin-bottom: 2rem;
541
+ }
542
+
543
+ .detail-row {
544
+ display: grid;
545
+ grid-template-columns: 150px 1fr;
546
+ gap: 1rem;
547
+ }
548
+
549
+ .detail-row label {
550
+ color: var(--text-tertiary);
551
+ font-weight: 600;
552
+ font-size: 12px;
553
+ }
554
+
555
+ .detail-row span {
556
+ color: var(--text-primary);
557
+ font-size: 12px;
558
+ }
559
+
560
+ .section-label {
561
+ color: var(--text-tertiary);
562
+ font-weight: 600;
563
+ font-size: 12px;
564
+ margin-bottom: 0.5rem;
565
+ justify-content: space-between;
566
+ display: flex;
567
+ margin-bottom: 0.5rem;
568
+ align-items: center;
569
+ }
570
+
571
+ .attributes-json {
572
+ background: var(--bg-primary);
573
+ padding: 0.5rem;
574
+ overflow-x: auto;
575
+ font-family: 'SF Mono', 'Monaco', monospace;
576
+ font-size: 13px;
577
+ line-height: 1.6;
578
+ color: #10b981;
579
+ border: 1px solid var(--border);
580
+ margin-bottom: 1rem;
581
+ }
582
+
583
+ .attributes-json.dedicated-attribute {
584
+ max-height: 300px;
585
+ overflow-y: auto;
586
+ white-space: pre-wrap;
587
+ word-wrap: break-word;
588
+ }
589
+
590
+ .slide-in-right {
591
+ transition: transform 0.3s ease-out;
592
+ }
593
+
594
+ .slide-in-right-start {
595
+ transform: translateX(100%);
596
+ }
597
+
598
+ .slide-in-right-end {
599
+ transform: translateX(0);
600
+ }
601
+
602
+ .slide-out-right {
603
+ transition: transform 0.3s ease-in;
604
+ }
605
+
606
+ .slide-out-right-start {
607
+ transform: translateX(0);
608
+ }
609
+
610
+ .slide-out-right-end {
611
+ transform: translateX(100%);
612
+ }
613
+
614
+ .copy-button {
615
+ margin-left: 1rem;
616
+ }
617
+
618
+ .copy-button.copied {
619
+ opacity: 1;
620
+ color: #10b981;
621
+ }
622
+
623
+ /* ==========================================
624
+ 9. TRACES LIST VIEW
625
+ ========================================== */
626
+ .traces-list-view {
627
+ flex: 1;
628
+ overflow: auto;
629
+ padding: 0 2rem 4rem 2rem;
630
+ }
631
+
632
+ .empty-traces {
633
+ margin-top: 2rem;
634
+ }
635
+
636
+ .traces-table {
637
+ width: 100%;
638
+ border-collapse: collapse;
639
+ background: var(--bg-primary);
640
+ border-radius: 2px;
641
+ overflow: hidden;
642
+ margin-top: 1rem;
643
+ }
644
+
645
+ .traces-table thead {
646
+ background: var(--bg-tertiary);
647
+ }
648
+
649
+ .traces-table th {
650
+ text-align: left;
651
+ padding: 1rem 1.5rem;
652
+ font-size: 12px;
653
+ font-weight: 600;
654
+ letter-spacing: 0.5px;
655
+ color: var(--text-secondary);
656
+ }
657
+
658
+ .trace-row {
659
+ border-bottom: 1px solid var(--border);
660
+ transition: background 0.2s;
661
+ }
662
+
663
+ .trace-row:nth-child(even) {
664
+ background: var(--zebra-stripe);
665
+ }
666
+
667
+ .trace-row:hover {
668
+ background: rgba(168, 85, 247, 0.08);
669
+ }
670
+
671
+ .trace-row td {
672
+ padding: 1rem 1.5rem;
673
+ color: var(--text-secondary);
674
+ font-size: 14px;
675
+ }
676
+
677
+ .trace-id {
678
+ font-family: 'SF Mono', 'Monaco', monospace;
679
+ font-size: 13px;
680
+ }
681
+
682
+ /* ==========================================
683
+ 10. SCROLLBAR STYLES
684
+ ========================================== */
685
+ ::-webkit-scrollbar {
686
+ width: 8px;
687
+ height: 8px;
688
+ }
689
+
690
+ ::-webkit-scrollbar-track {
691
+ background: var(--bg-primary);
692
+ }
693
+
694
+ ::-webkit-scrollbar-thumb {
695
+ background: var(--border);
696
+ border-radius: 4px;
697
+ }
698
+
699
+ ::-webkit-scrollbar-thumb:hover {
700
+ background: #444444;
701
+ }
702
+
703
+ ::-webkit-scrollbar-corner {
704
+ background: var(--bg-primary);
705
+ }
706
+
707
+ /* ==========================================
708
+ 11. UTILITY CLASSES
709
+ ========================================== */
710
+ .secondary-text {
711
+ color: var(--text-secondary);
712
+ }
713
+
714
+ .mono {
715
+ font-family: 'SF Mono', 'Monaco', monospace;
716
+ font-size: 12px;
717
+ }
718
+
719
+ .live-badge {
720
+ display: inline-flex;
721
+ align-items: center;
722
+ gap: 4px;
723
+ font-size: 11px;
724
+ color: #fb923c;
725
+ font-weight: 600;
726
+ }
727
+
728
+ .live-badge::before {
729
+ content: "●";
730
+ animation: pulse 2s ease-in-out infinite;
731
+ }
732
+
733
+ @keyframes pulse {
734
+ 0%, 100% { opacity: 1; }
735
+ 50% { opacity: 0.4; }
736
+ }
737
+
738
+
739
+ .btn {
740
+ height: 24px;
741
+ cursor: pointer;
742
+ font-size: 11px;
743
+ border-radius: 2px;
744
+ transition: background 0.2s;
745
+ background: var(--bg-secondary);
746
+ border: 1px solid var(--border);
747
+ padding: 2px 10px;
748
+ color: var(--text-secondary);
749
+ text-decoration: none;
750
+ }
751
+
752
+ .btn:hover {
753
+ background: var(--bg-tertiary);
754
+ text-decoration: none;
755
+ color: var(--text-secondary);
756
+ }
757
+
758
+ .btn:focus {
759
+ outline: none;
760
+ text-decoration: none;
761
+ color: var(--text-secondary);
762
+ }
763
+
764
+ .btn span {
765
+ display: flex;
766
+ align-items: center;
767
+ justify-content: center;
768
+ gap: 8px;
769
+ }
770
+
771
+ .btn svg {
772
+ width: 16px;
773
+ height: 16px;
774
+ }