@lemantorus/opencode-analytics 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,826 @@
1
+ :root {
2
+ --bg-primary: #0a0a0a;
3
+ --bg-secondary: #0d0d0d;
4
+ --bg-tertiary: #111111;
5
+ --bg-hover: #161616;
6
+ --bg-active: #1a1a1a;
7
+ --text-primary: #e0e0e0;
8
+ --text-secondary: #888888;
9
+ --text-muted: #555555;
10
+ --accent: #00ff88;
11
+ --accent-dim: #00cc6a;
12
+ --accent-glow: rgba(0, 255, 136, 0.15);
13
+ --cyan: #00d4aa;
14
+ --yellow: #ffcc00;
15
+ --orange: #ff8800;
16
+ --red: #ff4444;
17
+ --purple: #aa88ff;
18
+ --border: #1a1a1a;
19
+ --border-light: #2a2a2a;
20
+ --border-accent: #00ff8833;
21
+ }
22
+
23
+ @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;500;600;700&display=swap');
24
+
25
+ * {
26
+ margin: 0;
27
+ padding: 0;
28
+ box-sizing: border-box;
29
+ }
30
+
31
+ body {
32
+ font-family: 'JetBrains Mono', 'SF Mono', 'Fira Code', 'Consolas', monospace;
33
+ background: var(--bg-primary);
34
+ color: var(--text-primary);
35
+ line-height: 1.5;
36
+ min-height: 100vh;
37
+ font-size: 13px;
38
+ }
39
+
40
+ .container {
41
+ max-width: 1600px;
42
+ margin: 0 auto;
43
+ padding: 1.5rem;
44
+ }
45
+
46
+ header {
47
+ display: flex;
48
+ justify-content: space-between;
49
+ align-items: flex-start;
50
+ margin-bottom: 1.5rem;
51
+ flex-wrap: wrap;
52
+ gap: 1rem;
53
+ padding-bottom: 1rem;
54
+ border-bottom: 1px solid var(--border);
55
+ }
56
+
57
+ .header-left {
58
+ display: flex;
59
+ flex-direction: column;
60
+ gap: 0.25rem;
61
+ }
62
+
63
+ h1 {
64
+ font-size: 1.25rem;
65
+ font-weight: 600;
66
+ letter-spacing: -0.02em;
67
+ color: var(--accent);
68
+ text-shadow: 0 0 20px var(--accent-glow);
69
+ }
70
+
71
+ .subtitle {
72
+ font-size: 0.75rem;
73
+ color: var(--text-muted);
74
+ }
75
+
76
+ .header-controls {
77
+ display: flex;
78
+ gap: 0.5rem;
79
+ flex-wrap: wrap;
80
+ }
81
+
82
+ .btn {
83
+ padding: 0.5rem 0.875rem;
84
+ border: 1px solid var(--border-light);
85
+ border-radius: 4px;
86
+ cursor: pointer;
87
+ font-size: 0.75rem;
88
+ font-weight: 500;
89
+ font-family: inherit;
90
+ transition: all 0.1s ease;
91
+ white-space: nowrap;
92
+ background: var(--bg-tertiary);
93
+ color: var(--text-secondary);
94
+ }
95
+
96
+ .btn:hover {
97
+ border-color: var(--accent);
98
+ color: var(--accent);
99
+ background: var(--bg-hover);
100
+ }
101
+
102
+ .btn-sm {
103
+ padding: 0.35rem 0.6rem;
104
+ font-size: 0.7rem;
105
+ }
106
+
107
+ .btn-primary {
108
+ background: var(--accent);
109
+ color: var(--bg-primary);
110
+ border-color: var(--accent);
111
+ font-weight: 600;
112
+ }
113
+
114
+ .btn-primary:hover {
115
+ background: var(--accent-dim);
116
+ border-color: var(--accent-dim);
117
+ color: var(--bg-primary);
118
+ }
119
+
120
+ .btn-secondary {
121
+ background: transparent;
122
+ color: var(--text-secondary);
123
+ border-color: var(--border-light);
124
+ }
125
+
126
+ .btn-secondary:hover {
127
+ border-color: var(--accent);
128
+ color: var(--accent);
129
+ }
130
+
131
+ .btn-secondary.active {
132
+ background: var(--accent);
133
+ color: var(--bg-primary);
134
+ border-color: var(--accent);
135
+ }
136
+
137
+ .btn-outline {
138
+ background: transparent;
139
+ border: 1px solid var(--border-light);
140
+ color: var(--text-muted);
141
+ }
142
+
143
+ .btn-outline:hover {
144
+ border-color: var(--cyan);
145
+ color: var(--cyan);
146
+ }
147
+
148
+ .checkbox-wrapper {
149
+ display: flex;
150
+ align-items: center;
151
+ gap: 0.5rem;
152
+ padding: 0.5rem 0.875rem;
153
+ background: var(--bg-tertiary);
154
+ border: 1px solid var(--border-light);
155
+ border-radius: 4px;
156
+ cursor: pointer;
157
+ font-size: 0.75rem;
158
+ font-weight: 500;
159
+ color: var(--text-secondary);
160
+ transition: all 0.1s ease;
161
+ user-select: none;
162
+ }
163
+
164
+ .checkbox-wrapper:hover {
165
+ border-color: var(--accent);
166
+ color: var(--accent);
167
+ }
168
+
169
+ .checkbox-wrapper input[type="checkbox"] {
170
+ appearance: none;
171
+ width: 14px;
172
+ height: 14px;
173
+ border: 1px solid var(--border-light);
174
+ border-radius: 3px;
175
+ background: var(--bg-primary);
176
+ cursor: pointer;
177
+ position: relative;
178
+ transition: all 0.15s ease;
179
+ }
180
+
181
+ .checkbox-wrapper input[type="checkbox"]:checked {
182
+ background: var(--accent);
183
+ border-color: var(--accent);
184
+ }
185
+
186
+ .checkbox-wrapper input[type="checkbox"]:checked::after {
187
+ content: '';
188
+ position: absolute;
189
+ left: 4px;
190
+ top: 1px;
191
+ width: 4px;
192
+ height: 8px;
193
+ border: solid var(--bg-primary);
194
+ border-width: 0 2px 2px 0;
195
+ transform: rotate(45deg);
196
+ }
197
+
198
+ .checkbox-wrapper input[type="checkbox"]:focus {
199
+ outline: none;
200
+ box-shadow: 0 0 0 2px var(--accent-glow);
201
+ }
202
+
203
+ .overview-cards {
204
+ display: grid;
205
+ grid-template-columns: repeat(5, 1fr);
206
+ gap: 0.75rem;
207
+ margin-bottom: 1.5rem;
208
+ }
209
+
210
+ .card {
211
+ background: var(--bg-secondary);
212
+ border: 1px solid var(--border);
213
+ border-radius: 6px;
214
+ padding: 1rem 1.25rem;
215
+ display: flex;
216
+ align-items: center;
217
+ gap: 0.875rem;
218
+ transition: all 0.15s ease;
219
+ }
220
+
221
+ .card:hover {
222
+ border-color: var(--border-light);
223
+ }
224
+
225
+ .card.highlight {
226
+ background: linear-gradient(135deg, rgba(0, 255, 136, 0.1) 0%, rgba(0, 212, 170, 0.05) 100%);
227
+ border-color: var(--accent);
228
+ box-shadow: 0 0 30px var(--accent-glow), inset 0 0 30px var(--accent-glow);
229
+ }
230
+
231
+ .card-icon {
232
+ font-size: 1.25rem;
233
+ opacity: 0.8;
234
+ }
235
+
236
+ .card.highlight .card-icon {
237
+ opacity: 1;
238
+ }
239
+
240
+ .card-content {
241
+ flex: 1;
242
+ min-width: 0;
243
+ }
244
+
245
+ .card-label {
246
+ font-size: 0.65rem;
247
+ color: var(--text-muted);
248
+ text-transform: uppercase;
249
+ letter-spacing: 0.1em;
250
+ font-weight: 500;
251
+ }
252
+
253
+ .card.highlight .card-label {
254
+ color: var(--accent);
255
+ }
256
+
257
+ .card-value {
258
+ font-size: 1.125rem;
259
+ font-weight: 700;
260
+ margin-top: 0.125rem;
261
+ font-variant-numeric: tabular-nums;
262
+ color: var(--text-primary);
263
+ }
264
+
265
+ .card.highlight .card-value {
266
+ color: var(--accent);
267
+ text-shadow: 0 0 10px var(--accent-glow);
268
+ }
269
+
270
+ .time-filter-row {
271
+ display: flex;
272
+ align-items: center;
273
+ gap: 1rem;
274
+ margin-bottom: 1.25rem;
275
+ flex-wrap: wrap;
276
+ }
277
+
278
+ .time-filter {
279
+ display: flex;
280
+ gap: 0.25rem;
281
+ background: var(--bg-secondary);
282
+ padding: 0.25rem;
283
+ border-radius: 4px;
284
+ border: 1px solid var(--border);
285
+ }
286
+
287
+ .time-filter .btn {
288
+ background: transparent;
289
+ border: none;
290
+ color: var(--text-muted);
291
+ border-radius: 3px;
292
+ }
293
+
294
+ .time-filter .btn:hover {
295
+ color: var(--text-primary);
296
+ background: var(--bg-tertiary);
297
+ }
298
+
299
+ .time-filter .btn.active {
300
+ background: var(--accent);
301
+ color: var(--bg-primary);
302
+ }
303
+
304
+ .date-range-picker {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 0.5rem;
308
+ background: var(--bg-secondary);
309
+ padding: 0.25rem 0.75rem;
310
+ border-radius: 4px;
311
+ border: 1px solid var(--border);
312
+ }
313
+
314
+ .date-range-picker label {
315
+ font-size: 0.7rem;
316
+ color: var(--text-muted);
317
+ }
318
+
319
+ .date-range-picker input[type="date"] {
320
+ background: var(--bg-tertiary);
321
+ border: 1px solid var(--border);
322
+ border-radius: 3px;
323
+ padding: 0.35rem 0.5rem;
324
+ color: var(--text-primary);
325
+ font-family: inherit;
326
+ font-size: 0.7rem;
327
+ }
328
+
329
+ .date-range-picker input[type="date"]:focus {
330
+ outline: none;
331
+ border-color: var(--accent);
332
+ }
333
+
334
+ .charts-grid {
335
+ display: grid;
336
+ grid-template-columns: repeat(2, 1fr);
337
+ gap: 1rem;
338
+ margin-bottom: 1.5rem;
339
+ }
340
+
341
+ .chart-container {
342
+ background: var(--bg-secondary);
343
+ border: 1px solid var(--border);
344
+ border-radius: 6px;
345
+ padding: 1rem;
346
+ }
347
+
348
+ .chart-container.full-width {
349
+ grid-column: 1 / -1;
350
+ }
351
+
352
+ .chart-header {
353
+ display: flex;
354
+ justify-content: space-between;
355
+ align-items: center;
356
+ margin-bottom: 0.75rem;
357
+ gap: 1rem;
358
+ flex-wrap: wrap;
359
+ }
360
+
361
+ .chart-container h3 {
362
+ font-size: 0.8rem;
363
+ font-weight: 600;
364
+ color: var(--accent);
365
+ margin-bottom: 0.75rem;
366
+ letter-spacing: 0.02em;
367
+ }
368
+
369
+ .chart-header h3 {
370
+ margin-bottom: 0;
371
+ }
372
+
373
+ .chart-controls {
374
+ display: flex;
375
+ gap: 0.75rem;
376
+ align-items: center;
377
+ }
378
+
379
+ .chart-type-toggle {
380
+ display: flex;
381
+ gap: 0.25rem;
382
+ background: var(--bg-tertiary);
383
+ padding: 0.2rem;
384
+ border-radius: 4px;
385
+ border: 1px solid var(--border);
386
+ }
387
+
388
+ .chart-type-toggle .btn {
389
+ padding: 0.25rem 0.5rem;
390
+ font-size: 0.65rem;
391
+ background: transparent;
392
+ color: var(--text-muted);
393
+ border: none;
394
+ }
395
+
396
+ .chart-type-toggle .btn.active {
397
+ background: var(--accent);
398
+ color: var(--bg-primary);
399
+ }
400
+
401
+ .chart-wrapper {
402
+ height: 200px;
403
+ position: relative;
404
+ }
405
+
406
+ .chart-wrapper.large {
407
+ height: 280px;
408
+ }
409
+
410
+ .models-table {
411
+ background: var(--bg-secondary);
412
+ border: 1px solid var(--border);
413
+ border-radius: 6px;
414
+ padding: 1rem;
415
+ }
416
+
417
+ .models-table h3 {
418
+ font-size: 0.8rem;
419
+ font-weight: 600;
420
+ margin-bottom: 0.75rem;
421
+ color: var(--accent);
422
+ }
423
+
424
+ .table-wrapper {
425
+ overflow-x: auto;
426
+ margin: 0 -0.5rem;
427
+ padding: 0 0.5rem;
428
+ }
429
+
430
+ table {
431
+ width: 100%;
432
+ border-collapse: collapse;
433
+ font-size: 0.75rem;
434
+ }
435
+
436
+ th, td {
437
+ text-align: left;
438
+ padding: 0.5rem 0.75rem;
439
+ }
440
+
441
+ th {
442
+ font-size: 0.65rem;
443
+ text-transform: uppercase;
444
+ color: var(--text-muted);
445
+ font-weight: 500;
446
+ letter-spacing: 0.05em;
447
+ border-bottom: 1px solid var(--border);
448
+ position: sticky;
449
+ top: 0;
450
+ background: var(--bg-secondary);
451
+ }
452
+
453
+ td {
454
+ color: var(--text-primary);
455
+ font-variant-numeric: tabular-nums;
456
+ }
457
+
458
+ tbody tr {
459
+ border-bottom: 1px solid var(--border);
460
+ }
461
+
462
+ tbody tr:last-child {
463
+ border-bottom: none;
464
+ }
465
+
466
+ tbody tr:hover {
467
+ background: var(--bg-tertiary);
468
+ }
469
+
470
+ .badge {
471
+ display: inline-block;
472
+ padding: 0.15rem 0.4rem;
473
+ border-radius: 3px;
474
+ font-size: 0.6rem;
475
+ font-weight: 600;
476
+ text-transform: uppercase;
477
+ letter-spacing: 0.03em;
478
+ }
479
+
480
+ .badge-free {
481
+ background: rgba(0, 255, 136, 0.15);
482
+ color: var(--accent);
483
+ border: 1px solid rgba(0, 255, 136, 0.3);
484
+ }
485
+
486
+ .badge-paid {
487
+ background: rgba(255, 136, 0, 0.15);
488
+ color: var(--orange);
489
+ border: 1px solid rgba(255, 136, 0, 0.3);
490
+ }
491
+
492
+ .modal {
493
+ display: none;
494
+ position: fixed;
495
+ inset: 0;
496
+ background: rgba(0, 0, 0, 0.85);
497
+ backdrop-filter: blur(8px);
498
+ z-index: 1000;
499
+ align-items: center;
500
+ justify-content: center;
501
+ padding: 1rem;
502
+ }
503
+
504
+ .modal.show {
505
+ display: flex;
506
+ }
507
+
508
+ .modal-content {
509
+ background: var(--bg-secondary);
510
+ border: 1px solid var(--border);
511
+ border-radius: 8px;
512
+ width: 100%;
513
+ max-width: 700px;
514
+ max-height: 85vh;
515
+ overflow: hidden;
516
+ box-shadow: 0 0 60px rgba(0, 255, 136, 0.1);
517
+ }
518
+
519
+ .modal-header {
520
+ display: flex;
521
+ justify-content: space-between;
522
+ align-items: center;
523
+ padding: 1rem 1.25rem;
524
+ border-bottom: 1px solid var(--border);
525
+ }
526
+
527
+ .modal-header h2 {
528
+ font-size: 1rem;
529
+ font-weight: 600;
530
+ color: var(--accent);
531
+ }
532
+
533
+ .close-btn {
534
+ background: var(--bg-tertiary);
535
+ border: 1px solid var(--border);
536
+ color: var(--text-muted);
537
+ font-size: 1.25rem;
538
+ cursor: pointer;
539
+ width: 32px;
540
+ height: 32px;
541
+ border-radius: 4px;
542
+ display: flex;
543
+ align-items: center;
544
+ justify-content: center;
545
+ transition: all 0.15s;
546
+ font-family: inherit;
547
+ }
548
+
549
+ .close-btn:hover {
550
+ border-color: var(--red);
551
+ color: var(--red);
552
+ }
553
+
554
+ .modal-body {
555
+ padding: 1.25rem;
556
+ overflow-y: auto;
557
+ max-height: calc(85vh - 60px);
558
+ }
559
+
560
+ .modal-info {
561
+ font-size: 0.75rem;
562
+ color: var(--text-secondary);
563
+ margin-bottom: 1rem;
564
+ padding: 0.75rem;
565
+ background: var(--bg-tertiary);
566
+ border-radius: 4px;
567
+ border-left: 2px solid var(--accent);
568
+ }
569
+
570
+ .pricing-item {
571
+ display: grid;
572
+ grid-template-columns: 1fr repeat(3, 90px) 60px;
573
+ gap: 0.5rem;
574
+ align-items: center;
575
+ padding: 0.75rem 0;
576
+ border-bottom: 1px solid var(--border);
577
+ }
578
+
579
+ .pricing-item:last-child {
580
+ border-bottom: none;
581
+ }
582
+
583
+ .pricing-item label {
584
+ font-weight: 500;
585
+ font-size: 0.8rem;
586
+ color: var(--text-primary);
587
+ }
588
+
589
+ .pricing-item input {
590
+ background: var(--bg-tertiary);
591
+ border: 1px solid var(--border);
592
+ border-radius: 4px;
593
+ padding: 0.5rem 0.625rem;
594
+ color: var(--text-primary);
595
+ width: 100%;
596
+ font-size: 0.75rem;
597
+ font-family: inherit;
598
+ font-variant-numeric: tabular-nums;
599
+ }
600
+
601
+ .pricing-item input:focus {
602
+ outline: none;
603
+ border-color: var(--accent);
604
+ }
605
+
606
+ .pricing-item .save-btn {
607
+ padding: 0.5rem 0.75rem;
608
+ }
609
+
610
+ .loading {
611
+ position: fixed;
612
+ inset: 0;
613
+ background: var(--bg-primary);
614
+ display: flex;
615
+ flex-direction: column;
616
+ align-items: center;
617
+ justify-content: center;
618
+ gap: 1rem;
619
+ z-index: 2000;
620
+ transition: opacity 0.3s;
621
+ }
622
+
623
+ .loading.hidden {
624
+ opacity: 0;
625
+ pointer-events: none;
626
+ }
627
+
628
+ .spinner {
629
+ width: 32px;
630
+ height: 32px;
631
+ border: 2px solid var(--border);
632
+ border-top-color: var(--accent);
633
+ border-radius: 50%;
634
+ animation: spin 0.6s linear infinite;
635
+ }
636
+
637
+ @keyframes spin {
638
+ to { transform: rotate(360deg); }
639
+ }
640
+
641
+ .loading span {
642
+ color: var(--accent);
643
+ font-size: 0.8rem;
644
+ }
645
+
646
+ @media (max-width: 1024px) {
647
+ .overview-cards {
648
+ grid-template-columns: repeat(3, 1fr);
649
+ }
650
+ }
651
+
652
+ @media (max-width: 768px) {
653
+ .container {
654
+ padding: 1rem;
655
+ }
656
+
657
+ .overview-cards {
658
+ grid-template-columns: repeat(2, 1fr);
659
+ }
660
+
661
+ .card {
662
+ padding: 0.875rem;
663
+ }
664
+
665
+ .card-value {
666
+ font-size: 1rem;
667
+ }
668
+
669
+ .charts-grid {
670
+ grid-template-columns: 1fr;
671
+ }
672
+
673
+ .chart-container.full-width {
674
+ grid-column: 1;
675
+ }
676
+
677
+ .pricing-item {
678
+ grid-template-columns: 1fr 1fr;
679
+ gap: 0.5rem 0.75rem;
680
+ }
681
+
682
+ .pricing-item .save-btn {
683
+ grid-column: span 2;
684
+ }
685
+
686
+ .chart-header {
687
+ flex-direction: column;
688
+ align-items: flex-start;
689
+ }
690
+
691
+ .date-range-picker {
692
+ margin-left: 0;
693
+ margin-top: 0.5rem;
694
+ }
695
+ }
696
+
697
+ @media (max-width: 480px) {
698
+ .overview-cards {
699
+ grid-template-columns: 1fr;
700
+ }
701
+
702
+ .card.highlight {
703
+ order: -1;
704
+ }
705
+
706
+ .header-controls {
707
+ width: 100%;
708
+ }
709
+
710
+ .header-controls .btn {
711
+ flex: 1;
712
+ }
713
+ }
714
+
715
+ #tpsModelSelect {
716
+ background: var(--bg-tertiary);
717
+ border: 1px solid var(--border-light);
718
+ border-radius: 4px;
719
+ color: var(--text-secondary);
720
+ font-family: inherit;
721
+ font-size: 0.7rem;
722
+ padding: 0.25rem 0.5rem;
723
+ min-width: 200px;
724
+ max-height: 80px;
725
+ overflow-y: auto;
726
+ }
727
+
728
+ #tpsModelSelect:focus {
729
+ outline: none;
730
+ border-color: var(--accent);
731
+ }
732
+
733
+ #tpsModelSelect option {
734
+ padding: 0.25rem;
735
+ }
736
+
737
+ #tpsModelSelect option:checked {
738
+ background: var(--accent);
739
+ color: var(--bg-primary);
740
+ }
741
+
742
+ .dropdown {
743
+ position: relative;
744
+ display: inline-block;
745
+ }
746
+
747
+ .dropdown-toggle {
748
+ background: var(--bg-tertiary);
749
+ border: 1px solid var(--border-light);
750
+ border-radius: 4px;
751
+ color: var(--text-secondary);
752
+ font-family: inherit;
753
+ font-size: 0.7rem;
754
+ padding: 0.35rem 0.75rem;
755
+ cursor: pointer;
756
+ min-width: 180px;
757
+ text-align: left;
758
+ transition: border-color 0.15s ease;
759
+ }
760
+
761
+ .dropdown-toggle:hover {
762
+ border-color: var(--accent);
763
+ }
764
+
765
+ .dropdown-toggle::after {
766
+ content: ' ▼';
767
+ font-size: 0.6rem;
768
+ float: right;
769
+ margin-top: 3px;
770
+ }
771
+
772
+ .dropdown-menu {
773
+ display: none;
774
+ position: absolute;
775
+ top: 100%;
776
+ left: 0;
777
+ margin-top: 4px;
778
+ background: var(--bg-secondary);
779
+ border: 1px solid var(--border-light);
780
+ border-radius: 6px;
781
+ min-width: 220px;
782
+ max-height: 250px;
783
+ overflow-y: auto;
784
+ z-index: 100;
785
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
786
+ }
787
+
788
+ .dropdown.open .dropdown-menu {
789
+ display: block;
790
+ }
791
+
792
+ .dropdown-options {
793
+ padding: 0.5rem;
794
+ }
795
+
796
+ .dropdown-option {
797
+ display: flex;
798
+ align-items: center;
799
+ gap: 0.5rem;
800
+ padding: 0.4rem 0.5rem;
801
+ border-radius: 4px;
802
+ cursor: pointer;
803
+ color: var(--text-secondary);
804
+ font-size: 0.7rem;
805
+ transition: background 0.1s ease;
806
+ }
807
+
808
+ .dropdown-option:hover {
809
+ background: var(--bg-hover);
810
+ }
811
+
812
+ .dropdown-option input[type="checkbox"] {
813
+ accent-color: var(--accent);
814
+ width: 14px;
815
+ height: 14px;
816
+ cursor: pointer;
817
+ }
818
+
819
+ .dropdown-option.selected {
820
+ color: var(--accent);
821
+ }
822
+
823
+ .dropdown-option.selected::before {
824
+ content: '✓ ';
825
+ font-size: 0.65rem;
826
+ }