packetsnitch 1.5.599

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.
Files changed (54) hide show
  1. package/.eslintrc.json +28 -0
  2. package/.webpack/x64/main/index.js +2 -0
  3. package/.webpack/x64/main/index.js.map +1 -0
  4. package/.webpack/x64/renderer/assets/css/rubikglitch.woff2 +0 -0
  5. package/.webpack/x64/renderer/assets/css/style.css +1916 -0
  6. package/.webpack/x64/renderer/assets/images/loading.gif +0 -0
  7. package/.webpack/x64/renderer/assets/images/logo.webp +0 -0
  8. package/.webpack/x64/renderer/assets/images/packet-snitch-tag.webp +0 -0
  9. package/.webpack/x64/renderer/main_window/index.html +3 -0
  10. package/.webpack/x64/renderer/main_window/index.js +3 -0
  11. package/.webpack/x64/renderer/main_window/index.js.LICENSE.txt +36 -0
  12. package/.webpack/x64/renderer/main_window/index.js.map +1 -0
  13. package/.webpack/x64/renderer/main_window/preload.js +2 -0
  14. package/.webpack/x64/renderer/main_window/preload.js.map +1 -0
  15. package/backend/common/GeoLite2-City.mmdb +0 -0
  16. package/backend/common/mac-vendors-export.csv +56923 -0
  17. package/backend/common/service-names-port-numbers.csv +15368 -0
  18. package/backend/requirements.txt +14 -0
  19. package/backend/snitch.py +3611 -0
  20. package/forge.config.js +80 -0
  21. package/package.json +102 -0
  22. package/ps-icon.ico +0 -0
  23. package/snitch.spec +44 -0
  24. package/src/assets/css/rubikglitch.woff2 +0 -0
  25. package/src/assets/css/style.css +1916 -0
  26. package/src/assets/images/loading.gif +0 -0
  27. package/src/assets/images/logo.webp +0 -0
  28. package/src/assets/images/packet-snitch-tag.webp +0 -0
  29. package/src/back-comm.js +70 -0
  30. package/src/decoders.js +579 -0
  31. package/src/filter.js +461 -0
  32. package/src/front.js +10 -0
  33. package/src/index.html +1036 -0
  34. package/src/logging.js +150 -0
  35. package/src/main.js +571 -0
  36. package/src/preload.js +73 -0
  37. package/src/renderer.js +30 -0
  38. package/src/ui/common-frontend.js +13 -0
  39. package/src/ui/context-menu.js +88 -0
  40. package/src/ui/decoders.js +1 -0
  41. package/src/ui/main-frontend.js +4957 -0
  42. package/src/ui/panels/crypt-panel.js +565 -0
  43. package/src/ui/panels/data-panel.js +151 -0
  44. package/src/ui/panels/data-tools-panel.js +939 -0
  45. package/src/ui/panels/install-screen.js +59 -0
  46. package/src/ui/panels/keystore-panel.js +1248 -0
  47. package/src/ui/panels/list-panel.js +403 -0
  48. package/src/ui/panels/stats-panel.js +351 -0
  49. package/src/ui/panels/summary-panel.js +63 -0
  50. package/webpack.main.config.js +11 -0
  51. package/webpack.plugins.js +13 -0
  52. package/webpack.preload.config.js +7 -0
  53. package/webpack.renderer.config.js +30 -0
  54. package/webpack.rules.js +35 -0
@@ -0,0 +1,1916 @@
1
+ :root {
2
+ --color-1: #7f80ff;
3
+ --color-2: #2a284a;
4
+ --color-2-hover: #201e3d;
5
+ --color-3: #8a87c0;
6
+ --color-4: #161a2b;
7
+ --color-5: #ccbdde;
8
+ --color-6: #b5b5b5;
9
+ --color-7: #413f6e;
10
+ --sidebar-width: 20%;
11
+ }
12
+
13
+ /* Page background */
14
+ body {
15
+ margin: 0;
16
+ background-color: #333333;
17
+ display: flex;
18
+ justify-content: center;
19
+ align-items: center;
20
+ height: 100vh;
21
+ font-family: "Courier New", Courier, monospace;
22
+ font-color: --var(--color-5);
23
+ overflow: hidden;
24
+ }
25
+
26
+ /* Outer container */
27
+ .container_box {
28
+ width: 100%;
29
+ height: 100%;
30
+ border: 3px solid var(--color-3);
31
+ display: flex;
32
+ flex-direction: column;
33
+ padding: 15px;
34
+ box-sizing: border-box;
35
+ background-color: black;
36
+ font-color: var(--color-5);
37
+ scrollbar-color: var(--color-7) black;
38
+ overflow: hidden;
39
+ }
40
+
41
+ #error-container {
42
+ position: absolute;
43
+ top: 50%;
44
+ left: 50%;
45
+ transform: translate(-50%, -50%);
46
+ background-color: rgba(180, 25, 25, 0.3);
47
+ padding: 20px;
48
+ border-radius: 10px;
49
+ text-align: center;
50
+ z-index: 1000;
51
+ width: 400px;
52
+ display: none;
53
+ }
54
+
55
+ #loading-container {
56
+ position: absolute;
57
+ top: 50%;
58
+ left: 50%;
59
+ transform: translate(-50%, -50%);
60
+ background-color: rgba(22, 26, 43, 0.3);
61
+ padding: 20px;
62
+ border-radius: 10px;
63
+ text-align: center;
64
+ z-index: 1000;
65
+ width: 400px;
66
+ display: none;
67
+ }
68
+
69
+ .loading::after {
70
+ content: ".";
71
+ animation: dots 1.5s steps(3, end) infinite;
72
+ }
73
+
74
+ @keyframes dots {
75
+ 0% {
76
+ content: ".";
77
+ }
78
+ 33% {
79
+ content: "..";
80
+ }
81
+ 66% {
82
+ content: "...";
83
+ }
84
+ 100% {
85
+ content: ".";
86
+ }
87
+ }
88
+
89
+ #loading {
90
+ width: "25%";
91
+ height: "25%";
92
+ }
93
+
94
+ #welcome {
95
+ margin-top: 20px;
96
+ margin-left: 40px;
97
+ width: 100%;
98
+ justify-content: left;
99
+ font-size: 22px;
100
+ color: var(--color-1);
101
+ }
102
+ /* Top title bar */
103
+ .top_bar {
104
+ height: 40px;
105
+ background-color: var(--color-7);
106
+ display: flex;
107
+ justify-content: center;
108
+ align-items: center;
109
+ border: 1px solid black;
110
+ border-radius: 6px;
111
+ position: relative;
112
+ -webkit-app-region: drag;
113
+ }
114
+
115
+ #close-btn {
116
+ position: absolute;
117
+ right: 8px;
118
+ background: transparent;
119
+ border: none;
120
+ color: #4a90e2;
121
+ font-size: 18px;
122
+ font-weight: bold;
123
+ cursor: pointer;
124
+ line-height: 1;
125
+ padding: 2px 6px;
126
+ border-radius: 4px;
127
+ -webkit-app-region: no-drag;
128
+ }
129
+
130
+ #close-btn:hover {
131
+ color: #82b4f0;
132
+ }
133
+
134
+ .rubik-glitch-regular {
135
+ font-family: "Rubik Glitch", system-ui;
136
+ font-weight: 400;
137
+ font-style: normal;
138
+ }
139
+
140
+ #psbyline {
141
+ width: 150px;
142
+ height: 30px;
143
+ }
144
+ .titleline {
145
+ font-size: 18pt;
146
+ font-family: "RG", system-ui;
147
+ }
148
+
149
+ .byline {
150
+ font-size: 10pt;
151
+ font-family: "Courier New", Courier, monospace;
152
+ position: relative;
153
+ left: -84px;
154
+ bottom: -13px;
155
+ }
156
+ /* Entry bar */
157
+ .entry_bar {
158
+ height: 60px;
159
+ background-color: var(--color-2);
160
+ border: 1px solid black;
161
+ padding: 5px;
162
+ display: flex;
163
+ align-items: center;
164
+ margin-top: 2px;
165
+ gap: 8px;
166
+ }
167
+
168
+ .entry_bar input[type="text"] {
169
+ flex: 1;
170
+ padding: 5px;
171
+ background-color: black;
172
+ border: 1px solid grey;
173
+ color: var(--color-6);
174
+ }
175
+
176
+ hr {
177
+ border: 4px solid var(--color-2);
178
+ border-radius: 2px;
179
+ }
180
+
181
+ /* Content area */
182
+ .content_area {
183
+ flex: 1;
184
+ min-height: 0;
185
+ margin-top: 5px;
186
+ display: flex;
187
+ margin-right: 5px;
188
+ font-family: Cantarell, system-ui;
189
+ font-size: 12px;
190
+ overflow: hidden;
191
+ word-break: break-all;
192
+ }
193
+
194
+ #main_content {
195
+ font-face: Cantarell, system-ui;
196
+ color: var(--color-1);
197
+ flex: 1;
198
+ min-height: 0;
199
+ width: 100%;
200
+ }
201
+
202
+ /* Sidebar */
203
+ .sidebar {
204
+ display: block;
205
+ position: static;
206
+ width: var(--sidebar-width);
207
+ min-width: 160px;
208
+ max-width: 300px;
209
+ background-color: var(--color-4);
210
+ border: 1px solid var(--color-3);
211
+ padding: 1px;
212
+ color: white;
213
+ margin-right: 1px;
214
+ padding-top: 2px;
215
+ margin-left: 6px;
216
+ height: 100%;
217
+ box-sizing: border-box;
218
+ overflow-y: auto;
219
+ align-items: center;
220
+ }
221
+
222
+ .sidebar select {
223
+ margin-bottom: 5px;
224
+ background-color: black;
225
+ border: 1px solid var(--color-3);
226
+ color: var(--color-3);
227
+ padding: 5px;
228
+ margin-top: 5px;
229
+ }
230
+
231
+ .sidebar option {
232
+ color: var(--color-1);
233
+ padding: 5px;
234
+ }
235
+
236
+ /* Main panel */
237
+ .main_panel {
238
+ background-color: #111;
239
+ color: white;
240
+ padding: 5px;
241
+ box-sizing: border-box;
242
+ font-family: word-break, monospace;
243
+ align-items: center;
244
+ flex: 1;
245
+ min-width: 0;
246
+ justify-items: center;
247
+ overflow-y: hidden;
248
+ }
249
+
250
+ /* #main is the outer flex column host for the three content panels */
251
+ #main {
252
+ display: flex;
253
+ flex-direction: column;
254
+ overflow: hidden;
255
+ height: 100%;
256
+ }
257
+
258
+ table,
259
+ th,
260
+ td {
261
+ background-color: var(--color-7);
262
+ text-align: right;
263
+ border: 1px solid var(--color-3);
264
+ border-collapse: collapse;
265
+ border-spacing: 3px;
266
+ padding: 6px;
267
+ color: white;
268
+ word-break: break-all;
269
+ font-size: 11px;
270
+ font-face: monospace, monospace;
271
+ }
272
+
273
+ table {
274
+ width: 100%;
275
+ }
276
+
277
+ th {
278
+ color: var(--color-6);
279
+ }
280
+
281
+ td {
282
+ color: white;
283
+ width: 30%;
284
+ }
285
+
286
+ strong {
287
+ color: white;
288
+ }
289
+
290
+ .menu_bar {
291
+ width: 100%;
292
+ align-items: center;
293
+ margin-top: -20px;
294
+ margin-left: var(--sidebar-width);
295
+ display: flex;
296
+ gap: 10px;
297
+ }
298
+
299
+ .menu-btns {
300
+ font-weight: bold;
301
+ width: 98%;
302
+ background-color: var(--color-7);
303
+ border: 2px solid black;
304
+ color: white;
305
+ padding: 5px 0px;
306
+ text-align: center;
307
+ align-items: center;
308
+ text-decoration: none;
309
+ display: block;
310
+ font-size: 14px;
311
+ border-radius: 5px;
312
+ transition:
313
+ background-color 0.3s,
314
+ border-color 0.3s;
315
+ }
316
+
317
+ .menu-btns:hover,
318
+ .menu-btns:focus {
319
+ background-color: var(--color-2);
320
+ border-color: black;
321
+ cursor: pointer;
322
+ }
323
+
324
+ .custom-btns {
325
+ max-width: 140px;
326
+ background-color: var(--color-7);
327
+ border: 3px solid black;
328
+ width: 140px;
329
+ color: white;
330
+ padding: 5px 0px;
331
+ text-align: center;
332
+ align-items: center;
333
+ text-decoration: none;
334
+ display: block;
335
+ font-size: 14px;
336
+ margin: 1px 1px;
337
+ cursor: pointer;
338
+ font-weight: bold;
339
+ border-radius: 5px;
340
+ opacity: 0.4;
341
+ transition:
342
+ background-color 0.3s,
343
+ border-color 0.3s;
344
+ }
345
+
346
+ .custom-btns:hover,
347
+ .custom-btns:focus {
348
+ background-color: var(--color-2);
349
+ border-color: dark-gray;
350
+ cursor: pointer;
351
+ }
352
+
353
+ /* Status bar */
354
+ #status {
355
+ text-align: left;
356
+ padding: 2px 8px;
357
+ height: 18px;
358
+ background-color: black;
359
+ color: white;
360
+ border: 1px solid grey;
361
+ font-size: small;
362
+ flex: 1;
363
+ }
364
+
365
+ .active {
366
+ padding: 5px;
367
+ word-break: break-word;
368
+ }
369
+
370
+ #active-recon {
371
+ background-color: var(--color-7);
372
+ position: absolute;
373
+ margin-top: 10px;
374
+ margin-right: 15px;
375
+ right: 0;
376
+ top: 0;
377
+ width: 28%;
378
+ min-width: 200px;
379
+ border: 1px solid var(--color-3);
380
+ height: 80%;
381
+ color: white;
382
+ overflow-y: auto;
383
+ }
384
+
385
+ #summary_content {
386
+ display: block;
387
+ border: 1px solid var(--color-3);
388
+ background-color: var(--color-7);
389
+ min-height: 100%;
390
+ padding: 10px;
391
+ width: 95%;
392
+ margin: 10px;
393
+ box-sizing: border-box;
394
+ }
395
+
396
+ #tab-btns {
397
+ width: 760px;
398
+ }
399
+
400
+ #rotate-btns {
401
+ position: absolute;
402
+ margin-left: 950px;
403
+ margin-top: 58px;
404
+ width: 120px;
405
+ justify-content: right;
406
+ align-items: right;
407
+ z-index: 5;
408
+ }
409
+
410
+ #summary_box {
411
+ display: block;
412
+ border: 8px solid var(--color-3);
413
+ background-color: var(--color-4);
414
+ padding: 10px;
415
+ width: 100%;
416
+ box-sizing: border-box;
417
+ margin-top: 2px;
418
+ flex: 1;
419
+ min-height: 0;
420
+ overflow-y: auto;
421
+ }
422
+
423
+ #stats_box {
424
+ display: none;
425
+ border: 8px solid var(--color-3);
426
+ background-color: var(--color-4);
427
+ padding: 10px;
428
+ width: 100%;
429
+ box-sizing: border-box;
430
+ margin-top: 2px;
431
+ flex: 1;
432
+ min-height: 0;
433
+ overflow-y: auto;
434
+ }
435
+
436
+ #stats_content {
437
+ color: var(--color-5);
438
+ }
439
+
440
+ #data_tools_box {
441
+ display: none;
442
+ border: 8px solid var(--color-3);
443
+ background-color: var(--color-4);
444
+ padding: 10px;
445
+ width: 100%;
446
+ box-sizing: border-box;
447
+ margin-top: 2px;
448
+ flex: 1;
449
+ min-height: 0;
450
+ overflow: hidden;
451
+ flex-direction: column;
452
+ color: var(--color-5);
453
+ }
454
+
455
+ #crypt_box {
456
+ display: none;
457
+ border: 8px solid var(--color-3);
458
+ background-color: var(--color-4);
459
+ padding: 10px;
460
+ width: 100%;
461
+ box-sizing: border-box;
462
+ margin-top: 2px;
463
+ flex: 1;
464
+ min-height: 0;
465
+ overflow: hidden;
466
+ flex-direction: column;
467
+ color: var(--color-5);
468
+ }
469
+
470
+ .keystore-workspace-header,
471
+ .crypt-workspace-header {
472
+ color: var(--color-1);
473
+ font-weight: bold;
474
+ margin-bottom: 8px;
475
+ }
476
+
477
+ .crypt-subtab-row {
478
+ display: flex;
479
+ gap: 8px;
480
+ margin-bottom: 10px;
481
+ }
482
+
483
+ .crypt-subtab-btn {
484
+ background-color: var(--color-7);
485
+ border: 1px solid var(--color-3);
486
+ color: var(--color-5);
487
+ font-weight: bold;
488
+ padding: 5px 10px;
489
+ cursor: pointer;
490
+ }
491
+
492
+ .crypt-subtab-btn.active {
493
+ background-color: var(--color-2);
494
+ color: var(--color-1);
495
+ }
496
+
497
+ .crypt-subtab-panel {
498
+ min-height: 0;
499
+ flex: 1;
500
+ overflow-y: auto;
501
+ }
502
+
503
+ .crypt-grid {
504
+ display: grid;
505
+ grid-template-columns: repeat(3, minmax(0, 1fr));
506
+ gap: 10px;
507
+ height: 100%;
508
+ }
509
+
510
+ .crypt-section {
511
+ border: 1px solid var(--color-3);
512
+ background-color: var(--color-7);
513
+ padding: 10px;
514
+ min-height: 0;
515
+ display: flex;
516
+ flex-direction: column;
517
+ gap: 8px;
518
+ }
519
+
520
+ .crypt-section-title {
521
+ font-size: 14px;
522
+ font-weight: bold;
523
+ color: var(--color-1);
524
+ }
525
+
526
+ #crypt-encountered-list,
527
+ #crypt-keystore-list,
528
+ #crypt-keystore-label,
529
+ #crypt-keystore-mode,
530
+ #crypt-keystore-unlock-password,
531
+ #crypt-keystore-manual-uri-input,
532
+ #crypt-cert-input,
533
+ #crypt-key-input,
534
+ #crypt-credential-input {
535
+ width: 100%;
536
+ box-sizing: border-box;
537
+ border: 1px solid var(--color-3);
538
+ background-color: #000;
539
+ color: var(--color-5);
540
+ font-family: "Courier New", Courier, monospace;
541
+ font-size: 12px;
542
+ }
543
+
544
+ #crypt-cert-input,
545
+ #crypt-key-input,
546
+ #crypt-credential-input {
547
+ min-height: 120px;
548
+ resize: vertical;
549
+ padding: 6px;
550
+ }
551
+
552
+ #crypt-encountered-list {
553
+ min-height: 180px;
554
+ }
555
+
556
+ #crypt-keystore-list {
557
+ min-height: 120px;
558
+ }
559
+
560
+ #crypt-keystore-label {
561
+ padding: 6px;
562
+ }
563
+
564
+ .keystore-mode-row {
565
+ display: flex;
566
+ align-items: center;
567
+ gap: 8px;
568
+ font-size: 12px;
569
+ }
570
+
571
+ #crypt-keystore-mode {
572
+ padding: 6px;
573
+ }
574
+
575
+ #crypt-keystore-unlock-status {
576
+ font-size: 12px;
577
+ color: var(--color-6);
578
+ }
579
+
580
+ #crypt-keystore-unlock-description,
581
+ #crypt-keystore-manual-uri-description {
582
+ font-size: 12px;
583
+ color: var(--color-6);
584
+ overflow-wrap: break-word;
585
+ max-width: 400px;
586
+ }
587
+
588
+ #save-session-dialog,
589
+ #crypt-keystore-unlock-dialog,
590
+ #crypt-keystore-manual-uri-dialog {
591
+ position: fixed;
592
+ inset: 0;
593
+ background-color: rgba(0, 0, 0, 0.65);
594
+ display: flex;
595
+ align-items: center;
596
+ justify-content: center;
597
+ z-index: 9999;
598
+ overflow-wrap: break-word;
599
+ }
600
+
601
+ #save-session-dialog[hidden],
602
+ #crypt-keystore-unlock-dialog[hidden],
603
+ #crypt-keystore-manual-uri-dialog[hidden] {
604
+ display: none !important;
605
+ }
606
+
607
+ #save-session-dialog-description {
608
+ font-size: 12px;
609
+ color: var(--color-6);
610
+ overflow-wrap: break-word;
611
+ max-width: 400px;
612
+ }
613
+
614
+ .crypt-keystore-unlock-content {
615
+ width: min(420px, 92vw);
616
+ border: 1px solid var(--color-3);
617
+ background-color: var(--color-4);
618
+ padding: 14px;
619
+ display: flex;
620
+ flex-direction: column;
621
+ gap: 10px;
622
+ }
623
+
624
+ .crypt-actions-row {
625
+ display: flex;
626
+ flex-wrap: wrap;
627
+ gap: 6px;
628
+ }
629
+
630
+ .crypt-actions-row button {
631
+ background-color: var(--color-2);
632
+ border: 1px solid var(--color-3);
633
+ color: var(--color-1);
634
+ padding: 4px 8px;
635
+ cursor: pointer;
636
+ }
637
+
638
+ .crypt-actions-row button:hover {
639
+ background-color: var(--color-2-hover);
640
+ }
641
+
642
+ .crypt-actions-row button:disabled {
643
+ opacity: 0.55;
644
+ cursor: not-allowed;
645
+ }
646
+
647
+ #crypt-encountered-details {
648
+ font-size: 12px;
649
+ color: var(--color-6);
650
+ white-space: pre-wrap;
651
+ }
652
+
653
+ #crypt-cert-preview,
654
+ #crypt-key-preview,
655
+ #crypt-decrypt-preview,
656
+ #crypt-keystore-details {
657
+ margin: 0;
658
+ white-space: pre-wrap;
659
+ word-break: break-word;
660
+ border: 1px solid var(--color-3);
661
+ background-color: #000;
662
+ color: var(--color-6);
663
+ min-height: 90px;
664
+ padding: 6px;
665
+ overflow-y: auto;
666
+ font-size: 12px;
667
+ }
668
+
669
+ .crypt-placeholder {
670
+ border: 1px solid var(--color-3);
671
+ background-color: var(--color-7);
672
+ color: var(--color-6);
673
+ padding: 12px;
674
+ }
675
+
676
+ #keystore_box {
677
+ display: none;
678
+ border: 8px solid var(--color-3);
679
+ background-color: var(--color-4);
680
+ padding: 10px;
681
+ width: 100%;
682
+ box-sizing: border-box;
683
+ margin-top: 2px;
684
+ flex: 1;
685
+ min-height: 0;
686
+ overflow: hidden;
687
+ flex-direction: column;
688
+ color: var(--color-5);
689
+ }
690
+
691
+ .keystore-grid {
692
+ display: grid;
693
+ grid-template-columns: repeat(2, minmax(0, 1fr));
694
+ gap: 10px;
695
+ height: 100%;
696
+ }
697
+
698
+ .data-tools-grid {
699
+ display: grid;
700
+ grid-template-columns: 1fr 1fr 0.6fr;
701
+ gap: 10px;
702
+ color: var(--color-5);
703
+ }
704
+
705
+ .data-tools-section {
706
+ border: 1px solid var(--color-3);
707
+ background-color: var(--color-7);
708
+ padding: 10px;
709
+ min-height: 0;
710
+ }
711
+
712
+ .data-tools-title {
713
+ font-size: 14px;
714
+ font-weight: bold;
715
+ color: var(--color-1);
716
+ margin-bottom: 8px;
717
+ }
718
+
719
+ #data-tools-format,
720
+ #data-tools-input,
721
+ #data-tools-hex-output,
722
+ #data-tools-binary-output,
723
+ #data-tools-decimal-output,
724
+ #data-tools-decimal-integer-output,
725
+ #data-tools-ascii-output,
726
+ #data-tools-base64-output {
727
+ width: 100%;
728
+ box-sizing: border-box;
729
+ background-color: #000;
730
+ border: 1px solid var(--color-3);
731
+ color: var(--color-5);
732
+ font-family: "Courier New", Courier, monospace;
733
+ font-size: 12px;
734
+ margin-top: 6px;
735
+ margin-bottom: 8px;
736
+ padding: 6px;
737
+ }
738
+
739
+ #data-tools-hex-output,
740
+ #data-tools-binary-output,
741
+ #data-tools-decimal-output,
742
+ #data-tools-decimal-integer-output,
743
+ #data-tools-ascii-output,
744
+ #data-tools-base64-output {
745
+ min-height: 58px;
746
+ resize: vertical;
747
+ }
748
+
749
+ #data-tools-input {
750
+ min-height: 450px;
751
+ resize: vertical;
752
+ }
753
+
754
+ .data-tools-output-label {
755
+ color: var(--color-1);
756
+ font-size: 12px;
757
+ margin-top: 4px;
758
+ }
759
+
760
+ .data-tools-actions {
761
+ display: flex;
762
+ gap: 8px;
763
+ margin-top: 8px;
764
+ }
765
+
766
+ .data-tools-actions button {
767
+ background-color: var(--color-2);
768
+ border: 1px solid var(--color-3);
769
+ color: var(--color-5);
770
+ padding: 6px 10px;
771
+ cursor: pointer;
772
+ }
773
+
774
+ .data-tools-actions button:hover {
775
+ background-color: var(--color-2-hover);
776
+ }
777
+
778
+ #data-tools-error {
779
+ min-height: 18px;
780
+ color: #ff8f8f;
781
+ margin-top: 8px;
782
+ }
783
+
784
+ .data-tools-kv {
785
+ margin-bottom: 10px;
786
+ padding: 8px;
787
+ background-color: rgba(0, 0, 0, 0.35);
788
+ border: 1px solid var(--color-3);
789
+ }
790
+
791
+ .data-tools-proto-section {
792
+ margin-top: 10px;
793
+ }
794
+
795
+ #data-tools-proto-select {
796
+ width: 100%;
797
+ box-sizing: border-box;
798
+ background-color: #000;
799
+ border: 1px solid var(--color-3);
800
+ color: var(--color-5);
801
+ font-family: "Courier New", Courier, monospace;
802
+ font-size: 12px;
803
+ margin-top: 6px;
804
+ margin-bottom: 8px;
805
+ padding: 6px;
806
+ }
807
+
808
+ #data-tools-proto-output {
809
+ margin-top: 8px;
810
+ color: var(--color-5);
811
+ }
812
+
813
+ .data-tools-proto-table {
814
+ width: 100%;
815
+ border-collapse: collapse;
816
+ font-family: "Courier New", Courier, monospace;
817
+ font-size: 12px;
818
+ }
819
+
820
+ .data-tools-proto-table th,
821
+ .data-tools-proto-table td {
822
+ border: 1px solid var(--color-3);
823
+ padding: 5px 8px;
824
+ text-align: left;
825
+ word-break: break-all;
826
+ }
827
+
828
+ .data-tools-proto-table th {
829
+ background-color: var(--color-2);
830
+ color: var(--color-1);
831
+ }
832
+
833
+ .data-tools-proto-table tr:nth-child(even) td {
834
+ background-color: rgba(0, 0, 0, 0.2);
835
+ }
836
+
837
+ .data-tools-proto-none {
838
+ color: var(--color-3);
839
+ font-size: 12px;
840
+ font-style: italic;
841
+ }
842
+
843
+ .data-tools-hashes-section {
844
+ margin-top: 10px;
845
+ }
846
+
847
+ .data-tools-hashes-grid {
848
+ display: grid;
849
+ grid-template-columns: 120px 1fr;
850
+ align-items: center;
851
+ gap: 4px 8px;
852
+ }
853
+
854
+ .data-tools-hashes-grid .data-tools-output-label {
855
+ margin-top: 0;
856
+ }
857
+
858
+ .data-tools-hash-input-reading {
859
+ width: 100%;
860
+ min-height: 48px;
861
+ box-sizing: border-box;
862
+ resize: vertical;
863
+ background-color: #000;
864
+ border: 1px solid var(--color-3);
865
+ color: var(--color-5);
866
+ font-family: "Courier New", Courier, monospace;
867
+ font-size: 12px;
868
+ padding: 4px 6px;
869
+ }
870
+
871
+ .data-tools-hash-output {
872
+ width: 100%;
873
+ box-sizing: border-box;
874
+ background-color: #000;
875
+ border: 1px solid var(--color-3);
876
+ color: var(--color-5);
877
+ font-family: "Courier New", Courier, monospace;
878
+ font-size: 12px;
879
+ padding: 4px 6px;
880
+ }
881
+
882
+ #convert-context-menu {
883
+ position: fixed;
884
+ z-index: 99999;
885
+ background-color: var(--color-4);
886
+ border: 1px solid var(--color-1);
887
+ border-radius: 6px;
888
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6);
889
+ padding: 4px 0;
890
+ min-width: 190px;
891
+ display: flex;
892
+ flex-direction: column;
893
+ }
894
+
895
+ #convert-context-menu[hidden] {
896
+ display: none !important;
897
+ }
898
+
899
+ #convert-context-menu button {
900
+ display: block;
901
+ width: 100%;
902
+ text-align: left;
903
+ background: none;
904
+ border: none;
905
+ color: var(--color-5);
906
+ font-family: "Courier New", Courier, monospace;
907
+ font-size: 13px;
908
+ padding: 8px 16px;
909
+ cursor: pointer;
910
+ }
911
+
912
+ #convert-context-menu button:hover {
913
+ background-color: var(--color-7);
914
+ color: white;
915
+ }
916
+
917
+ #convert-context-menu .ctx-submenu {
918
+ position: relative;
919
+ }
920
+
921
+ #convert-context-menu .ctx-branch {
922
+ position: relative;
923
+ padding-right: 26px;
924
+ }
925
+
926
+ #convert-context-menu .ctx-branch::after {
927
+ content: "\25B6";
928
+ position: absolute;
929
+ right: 10px;
930
+ top: 50%;
931
+ transform: translateY(-50%);
932
+ font-size: 10px;
933
+ color: var(--color-6);
934
+ }
935
+
936
+ #convert-context-menu .ctx-submenu-panel {
937
+ display: none;
938
+ position: absolute;
939
+ left: calc(100% - 2px);
940
+ top: -4px;
941
+ min-width: 210px;
942
+ background-color: var(--color-4);
943
+ border: 1px solid var(--color-1);
944
+ border-radius: 6px;
945
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.6);
946
+ padding: 4px 0;
947
+ z-index: 100000;
948
+ }
949
+
950
+ #convert-context-menu .ctx-submenu.ctx-submenu-flip-x > .ctx-submenu-panel {
951
+ left: auto;
952
+ right: calc(100% - 2px);
953
+ }
954
+
955
+ #convert-context-menu .ctx-submenu.ctx-submenu-flip-y > .ctx-submenu-panel {
956
+ top: auto;
957
+ bottom: -4px;
958
+ }
959
+
960
+ #convert-context-menu .ctx-submenu:hover > .ctx-submenu-panel,
961
+ #convert-context-menu .ctx-submenu:focus-within > .ctx-submenu-panel {
962
+ display: block;
963
+ }
964
+
965
+ #list_box {
966
+ display: none;
967
+ border: 8px solid var(--color-3);
968
+ background-color: var(--color-4);
969
+ padding: 10px;
970
+ width: 100%;
971
+ box-sizing: border-box;
972
+ margin-top: 2px;
973
+ flex: 1;
974
+ min-height: 0;
975
+ overflow: hidden;
976
+ flex-direction: column;
977
+ }
978
+
979
+ #notes_box {
980
+ display: none;
981
+ border: 8px solid var(--color-3);
982
+ background-color: var(--color-4);
983
+ padding: 10px;
984
+ width: 100%;
985
+ box-sizing: border-box;
986
+ margin-top: 2px;
987
+ flex: 1;
988
+ min-height: 0;
989
+ overflow: hidden;
990
+ flex-direction: column;
991
+ color: var(--color-5);
992
+ }
993
+
994
+ .notes-header {
995
+ color: var(--color-1);
996
+ font-weight: bold;
997
+ margin-bottom: 8px;
998
+ }
999
+
1000
+ #notes-controls {
1001
+ border: 1px solid var(--color-3);
1002
+ background-color: var(--color-7);
1003
+ padding: 8px;
1004
+ margin-bottom: 8px;
1005
+ }
1006
+
1007
+ #notes-new-input {
1008
+ width: 100%;
1009
+ min-height: 120px;
1010
+ box-sizing: border-box;
1011
+ border: 1px solid var(--color-3);
1012
+ background-color: #000;
1013
+ color: var(--color-5);
1014
+ font-family: "Courier New", Courier, monospace;
1015
+ font-size: 12px;
1016
+ margin-bottom: 8px;
1017
+ padding: 6px;
1018
+ resize: vertical;
1019
+ }
1020
+
1021
+ .notes-controls-row {
1022
+ display: flex;
1023
+ align-items: center;
1024
+ gap: 8px;
1025
+ }
1026
+
1027
+ #notes-new-color {
1028
+ width: 38px;
1029
+ height: 28px;
1030
+ border: 1px solid var(--color-3);
1031
+ padding: 0;
1032
+ background: #000;
1033
+ }
1034
+
1035
+ #notes-add-btn,
1036
+ #notes-save-btn {
1037
+ background-color: var(--color-2);
1038
+ border: 1px solid var(--color-3);
1039
+ color: var(--color-1);
1040
+ padding: 5px 8px;
1041
+ cursor: pointer;
1042
+ }
1043
+
1044
+ #notes-add-btn:hover,
1045
+ #notes-save-btn:hover {
1046
+ background-color: var(--color-2-hover);
1047
+ }
1048
+
1049
+ #notes-list {
1050
+ flex: 1;
1051
+ min-height: 0;
1052
+ overflow-y: auto;
1053
+ display: flex;
1054
+ flex-direction: column;
1055
+ gap: 8px;
1056
+ }
1057
+
1058
+ .notes-editor-wrap {
1059
+ flex: 1;
1060
+ min-height: 0;
1061
+ border: 1px solid var(--color-3);
1062
+ background-color: #000;
1063
+ padding: 6px;
1064
+ }
1065
+
1066
+ #notes-editor {
1067
+ width: 100%;
1068
+ height: 100%;
1069
+ min-height: 420px;
1070
+ box-sizing: border-box;
1071
+ border: 1px solid var(--color-3);
1072
+ background-color: #090909;
1073
+ color: var(--color-5);
1074
+ font-family: "Courier New", Courier, monospace;
1075
+ font-size: 12px;
1076
+ padding: 6px;
1077
+ resize: vertical;
1078
+ }
1079
+
1080
+ #rightside-notes {
1081
+ display: flex;
1082
+ flex-direction: column;
1083
+ gap: 8px;
1084
+ }
1085
+
1086
+ #rightside-notes[hidden] {
1087
+ display: none;
1088
+ }
1089
+
1090
+ #notes-select {
1091
+ width: 100%;
1092
+ min-height: 210px;
1093
+ box-sizing: border-box;
1094
+ border: 1px solid var(--color-3);
1095
+ background-color: #000;
1096
+ color: var(--color-5);
1097
+ font-family: "Courier New", Courier, monospace;
1098
+ font-size: 12px;
1099
+ }
1100
+
1101
+ .notes-sidebar-actions {
1102
+ justify-content: flex-start;
1103
+ }
1104
+
1105
+ #notes-remove-btn {
1106
+ background-color: #4d1f1f;
1107
+ border: 1px solid #933;
1108
+ color: #ffd8d8;
1109
+ padding: 5px 8px;
1110
+ cursor: pointer;
1111
+ }
1112
+
1113
+ #list_search_bar {
1114
+ margin-bottom: 8px;
1115
+ display: flex;
1116
+ align-items: center;
1117
+ gap: 10px;
1118
+ }
1119
+
1120
+ #list-search {
1121
+ flex: 1;
1122
+ box-sizing: border-box;
1123
+ padding: 6px 8px;
1124
+ background-color: #000;
1125
+ border: 1px solid var(--color-3);
1126
+ color: var(--color-5);
1127
+ font-family: "Courier New", Courier, monospace;
1128
+ font-size: 13px;
1129
+ }
1130
+
1131
+ #list-group-streams-wrap {
1132
+ display: inline-flex;
1133
+ align-items: center;
1134
+ gap: 6px;
1135
+ color: var(--color-5);
1136
+ font-size: 12px;
1137
+ white-space: nowrap;
1138
+ }
1139
+
1140
+ #list_content {
1141
+ overflow-y: auto;
1142
+ flex: 1;
1143
+ min-height: 0;
1144
+ height: 100%;
1145
+ }
1146
+
1147
+ .packet-list-table {
1148
+ width: 100%;
1149
+ border-collapse: collapse;
1150
+ table-layout: fixed;
1151
+ font-size: 12px;
1152
+ color: var(--color-5);
1153
+ }
1154
+
1155
+ .packet-list-table thead th {
1156
+ background-color: var(--color-2);
1157
+ color: var(--color-1);
1158
+ padding: 5px 8px;
1159
+ text-align: left;
1160
+ position: sticky;
1161
+ top: 0;
1162
+ z-index: 1;
1163
+ border-bottom: 2px solid var(--color-3);
1164
+ white-space: nowrap;
1165
+ overflow: hidden;
1166
+ text-overflow: ellipsis;
1167
+ }
1168
+
1169
+ .packet-list-table thead th.packet-list-sortable-header {
1170
+ cursor: pointer;
1171
+ user-select: none;
1172
+ }
1173
+
1174
+ .packet-list-table thead th.packet-list-sortable-header:focus {
1175
+ outline: 1px solid var(--color-5);
1176
+ outline-offset: -1px;
1177
+ }
1178
+
1179
+ /* Column widths: #, bookmark, stream, host, src/dst, ports, transport, app protocol */
1180
+ .packet-list-table thead th:nth-child(1) {
1181
+ width: 5%;
1182
+ }
1183
+ .packet-list-table thead th:nth-child(2) {
1184
+ width: 5%;
1185
+ }
1186
+ .packet-list-table thead th:nth-child(3) {
1187
+ width: 7%;
1188
+ }
1189
+ .packet-list-table thead th:nth-child(4) {
1190
+ width: 14%;
1191
+ }
1192
+ .packet-list-table thead th:nth-child(5) {
1193
+ width: 12%;
1194
+ }
1195
+ .packet-list-table thead th:nth-child(6) {
1196
+ width: 12%;
1197
+ }
1198
+ .packet-list-table thead th:nth-child(7) {
1199
+ width: 8%;
1200
+ }
1201
+ .packet-list-table thead th:nth-child(8) {
1202
+ width: 8%;
1203
+ }
1204
+ .packet-list-table thead th:nth-child(9) {
1205
+ width: 9%;
1206
+ }
1207
+ .packet-list-table thead th:nth-child(10) {
1208
+ width: 20%;
1209
+ }
1210
+
1211
+ .packet-list-table tbody tr {
1212
+ cursor: pointer;
1213
+ border-bottom: 1px solid var(--color-7);
1214
+ }
1215
+
1216
+ .packet-list-table tbody tr:hover,
1217
+ .packet-list-table tbody tr.packet-list-hovered {
1218
+ background-color: var(--color-7);
1219
+ color: var(--color-1);
1220
+ }
1221
+
1222
+ .packet-list-table tbody tr.packet-list-hovered:not(.packet-list-selected) {
1223
+ outline: 1px solid var(--color-3);
1224
+ outline-offset: -1px;
1225
+ }
1226
+
1227
+ .packet-list-table tbody tr.packet-list-stream-break {
1228
+ border-top: 2px solid var(--color-3);
1229
+ }
1230
+
1231
+ .packet-list-table tbody tr.packet-list-selected {
1232
+ background-color: var(--color-2);
1233
+ color: var(--color-1);
1234
+ }
1235
+
1236
+ .packet-list-table tbody tr.packet-list-selected:hover,
1237
+ .packet-list-table tbody tr.packet-list-selected.packet-list-hovered {
1238
+ background-color: var(--color-2-hover);
1239
+ }
1240
+
1241
+ .packet-list-table td {
1242
+ padding: 4px 8px;
1243
+ white-space: nowrap;
1244
+ overflow: hidden;
1245
+ text-overflow: ellipsis;
1246
+ }
1247
+
1248
+ .stats-section {
1249
+ margin-bottom: 18px;
1250
+ }
1251
+
1252
+ .stats-section-title {
1253
+ font-size: 16px;
1254
+ font-weight: bold;
1255
+ color: var(--color-1);
1256
+ background-color: var(--color-2);
1257
+ padding: 4px 8px;
1258
+ margin-bottom: 6px;
1259
+ }
1260
+
1261
+ .stats-tag-list {
1262
+ display: flex;
1263
+ flex-wrap: wrap;
1264
+ gap: 6px;
1265
+ padding: 4px 8px;
1266
+ }
1267
+
1268
+ .stats-tag {
1269
+ background-color: var(--color-7);
1270
+ border: 1px solid var(--color-3);
1271
+ color: white;
1272
+ padding: 3px 8px;
1273
+ font-size: 12px;
1274
+ border-radius: 3px;
1275
+ cursor: pointer;
1276
+ transition: background-color 0.2s;
1277
+ }
1278
+
1279
+ .stats-tag:hover {
1280
+ background-color: var(--color-2);
1281
+ }
1282
+
1283
+ .stats-kv {
1284
+ padding: 4px 8px;
1285
+ font-size: 13px;
1286
+ color: var(--color-6);
1287
+ }
1288
+
1289
+ #copyright {
1290
+ bottom: 0;
1291
+ position: absolute;
1292
+ text-align: right;
1293
+ padding: 5px;
1294
+ height: 5px;
1295
+ margin-bottom: 5px;
1296
+ justify-content: center;
1297
+ }
1298
+
1299
+ #packetInfoPane {
1300
+ overflow-y: scroll;
1301
+ overflow-x: hidden;
1302
+ width: 100%;
1303
+ box-sizing: border-box;
1304
+ color: var(--color-1);
1305
+ font-size: 13px;
1306
+ display: block;
1307
+ background-color: var(--color-4);
1308
+ border: 8px solid var(--color-3);
1309
+ flex: 1;
1310
+ min-height: 0;
1311
+ position: relative;
1312
+ }
1313
+
1314
+ #moredata {
1315
+ display: block;
1316
+ margin-left: 15px;
1317
+ margin-top: 10px;
1318
+ }
1319
+
1320
+ #sidedatatable {
1321
+ justify-content: center;
1322
+ }
1323
+
1324
+ #timestamp {
1325
+ font-size: 14px;
1326
+ color: white;
1327
+ }
1328
+
1329
+ #ip2ip {
1330
+ color: white;
1331
+ font-size: 15px;
1332
+ placment: absolute;
1333
+ text-align: center;
1334
+ display: block;
1335
+ width: 90%;
1336
+ }
1337
+
1338
+ #data-types {
1339
+ border: 1px solid var(--color-3);
1340
+ margin-left: 15px;
1341
+ margin-bottom: 20px;
1342
+ margin-top: 20px;
1343
+ width: 67%;
1344
+ max-width: 1000px;
1345
+ background-color: var(--color-7);
1346
+ height: 400px;
1347
+ display: flex;
1348
+ z-index: 1;
1349
+ }
1350
+
1351
+ .sidebar-header {
1352
+ font-size: 18px;
1353
+ background-color: var(--color-2);
1354
+ color: white;
1355
+ font-weight: bold;
1356
+ text-align: center;
1357
+ }
1358
+
1359
+ #mime-type {
1360
+ font-size: 14px;
1361
+ justify-content: left;
1362
+ text-align: left;
1363
+ color: var(--color-6);
1364
+ margin-top: 10px;
1365
+ margin-left: 15px;
1366
+ }
1367
+ #charset {
1368
+ font-size: 14px;
1369
+ justify-content: left;
1370
+ text-align: left;
1371
+ color: var(--color-6);
1372
+ margin-top: 10px;
1373
+ margin-left: 15px;
1374
+ }
1375
+ #encoding {
1376
+ font-size: 14px;
1377
+ justify-content: left;
1378
+ text-align: left;
1379
+ color: var(--color-6);
1380
+ margin-top: 10px;
1381
+ margin-left: 15px;
1382
+ }
1383
+ #language {
1384
+ font-size: 14px;
1385
+ justify-content: left;
1386
+ text-align: left;
1387
+ color: var(--color-6);
1388
+ margin-top: 10px;
1389
+ margin-left: 15px;
1390
+ }
1391
+
1392
+ #types-list {
1393
+ color: white;
1394
+ font-size: 14px;
1395
+ z-index: -1;
1396
+ }
1397
+
1398
+ #entropybox {
1399
+ text-align: center;
1400
+ font-size: 26px;
1401
+ font-weight: bold;
1402
+ background-color: var(--color-7);
1403
+ }
1404
+
1405
+ .low {
1406
+ color: green;
1407
+ }
1408
+
1409
+ .med {
1410
+ color: orange;
1411
+ }
1412
+
1413
+ .high {
1414
+ color: red;
1415
+ }
1416
+
1417
+ #file-info {
1418
+ position: relative;
1419
+ margin-top: 100px;
1420
+ margin-left: 15px;
1421
+ color: white;
1422
+ font-size: 16px;
1423
+ }
1424
+
1425
+ #packetPayloadPane {
1426
+ width: 100%;
1427
+ box-sizing: border-box;
1428
+ overflow-y: scroll;
1429
+ overflow-x: hidden;
1430
+ padding: 8px;
1431
+ background-color: var(--color-4);
1432
+ border: 8px solid var(--color-3);
1433
+ margin-top: 0;
1434
+ flex: 0 0 40%;
1435
+ /* z-index: 4; */
1436
+ position: relative;
1437
+ }
1438
+ #protoInfo {
1439
+ margin-top: 10px;
1440
+ margin-left: 15px;
1441
+ width: 67%;
1442
+ max-width: 1000px;
1443
+ display: block;
1444
+ font-size: 0px;
1445
+ border: 1px solid var(--color-3);
1446
+ }
1447
+ #protoInfoProto {
1448
+ font-size: 14px;
1449
+ width: 100%;
1450
+ display: flex;
1451
+ color: var(--color-6);
1452
+ }
1453
+
1454
+ .PHead {
1455
+ color: white;
1456
+ font-size: 18px;
1457
+ background-color: var(--color-2);
1458
+ text-align: center;
1459
+ }
1460
+
1461
+ /* to main protcol boxes, src/dest */
1462
+ #protoInfoSrc,
1463
+ #protoInfoDest {
1464
+ width: 100%;
1465
+ color: var(--color-6);
1466
+ font-size: 14px;
1467
+ background-color: var(--color-7);
1468
+ }
1469
+
1470
+ #hexg {
1471
+ z-index: 5;
1472
+ }
1473
+
1474
+ /* this is here to setup the grid bed */
1475
+ .hexGrid {
1476
+ font-size: 12px;
1477
+ display: grid;
1478
+ grid-template-columns: repeat(32, 27px);
1479
+ grid-template-rows: repeat(32, 27px);
1480
+ gap: 1px;
1481
+ justify-content: center;
1482
+ width: max-content;
1483
+ min-width: 100%;
1484
+ margin: 0 auto;
1485
+ border: 1px solid #ccc;
1486
+ background-color: var(--color-7);
1487
+ }
1488
+
1489
+ /* sets up the boxes on the grid waiting */
1490
+ /* to be assigned packet (hex) data */
1491
+ .griditem {
1492
+ background-color: var(--color-4);
1493
+ border: 1px solid var(--color-3);
1494
+ display: flex;
1495
+ justify-content: center;
1496
+ align-items: center;
1497
+ width: 27px;
1498
+ height: 27px;
1499
+ padding: 0;
1500
+ font-family: monospace;
1501
+ text-align: center;
1502
+ white-space: nowrap;
1503
+ line-height: 1;
1504
+ overflow: hidden;
1505
+ box-sizing: border-box;
1506
+ transition:
1507
+ background-color 0.3s,
1508
+ border-color 0.3s; /* Smooth transition */
1509
+ }
1510
+
1511
+ /* this is for the consecutive ones that are highlighted */
1512
+ .griditem.highlight {
1513
+ background-color: #413f6e;
1514
+ border-color: white;
1515
+ transition:
1516
+ background-color 0.3s,
1517
+ border-color 0.3s;
1518
+ }
1519
+
1520
+ /* this is for the one right under the cursor */
1521
+ .griditem:hover,
1522
+ .griditem:focus {
1523
+ background-color: var(--color-3); /* Highlight color */
1524
+ border-color: white;
1525
+ cursor: pointer;
1526
+ }
1527
+
1528
+ .logo-cont {
1529
+ width: 45px;
1530
+ height: 52px;
1531
+ }
1532
+
1533
+ .footer {
1534
+ flex: 0 0 auto;
1535
+ display: flex;
1536
+ align-items: center;
1537
+ background-color: black;
1538
+ width: 100%;
1539
+ box-sizing: border-box;
1540
+ color: white;
1541
+ font-size: small;
1542
+ padding: 0 5px;
1543
+ margin-top: 4px;
1544
+ }
1545
+
1546
+ .bmdrop {
1547
+ background-color: var(--color-2);
1548
+ border: 1px solid var(--color-4);
1549
+ padding: 5px;
1550
+ position: absolute;
1551
+ left: calc(var(--sidebar-width) + 30px);
1552
+ top: 165px;
1553
+ height: 30px;
1554
+ }
1555
+
1556
+ #filters-container {
1557
+ flex: 1;
1558
+ display: flex;
1559
+ align-items: center;
1560
+ width: auto;
1561
+ gap: 8px;
1562
+ }
1563
+
1564
+ #host_filter {
1565
+ width: 60px;
1566
+ display: none;
1567
+ }
1568
+
1569
+ #filterStr-wrap {
1570
+ --filter-clear-button-width: 64px;
1571
+ --filter-clear-right-offset: 6px;
1572
+ --filter-clear-padding: calc(
1573
+ var(--filter-clear-button-width) + var(--filter-clear-right-offset) + 6px
1574
+ );
1575
+ flex: 1;
1576
+ position: relative;
1577
+ min-width: 0;
1578
+ }
1579
+
1580
+ #filterStr-highlight {
1581
+ position: absolute;
1582
+ top: 1px;
1583
+ left: 1px;
1584
+ right: calc(var(--filter-clear-padding) + 1px);
1585
+ bottom: 1px;
1586
+ pointer-events: none;
1587
+ white-space: pre;
1588
+ overflow: hidden;
1589
+ padding: 5px;
1590
+ font: inherit;
1591
+ }
1592
+
1593
+ #filterStr {
1594
+ width: calc(100% - var(--filter-clear-padding));
1595
+ background-color: black;
1596
+ color: transparent;
1597
+ caret-color: white;
1598
+ border: 1px solid grey;
1599
+ padding: 5px;
1600
+ box-sizing: border-box;
1601
+ font: inherit;
1602
+ }
1603
+
1604
+ #filterStr-clear {
1605
+ position: absolute;
1606
+ top: 1px;
1607
+ margin-top: -2px;
1608
+ bottom: 1px;
1609
+ right: var(--filter-clear-right-offset);
1610
+ width: var(--filter-clear-button-width);
1611
+ border: 1px solid grey;
1612
+ background-color: var(--color-7);
1613
+ color: white;
1614
+ box-sizing: border-box;
1615
+ padding: 0 8px;
1616
+ display: flex;
1617
+ align-items: center;
1618
+ justify-content: center;
1619
+ font: inherit;
1620
+ line-height: 1;
1621
+ cursor: pointer;
1622
+ height: 32px;
1623
+ margin-right: 4px;
1624
+ }
1625
+
1626
+ #filterStr-clear:not(:disabled):hover,
1627
+ #filterStr-clear:not(:disabled):focus {
1628
+ background-color: var(--color-2);
1629
+ }
1630
+
1631
+ #filterStr-clear:disabled {
1632
+ opacity: 0.6;
1633
+ cursor: default;
1634
+ }
1635
+
1636
+ #filterStr::placeholder {
1637
+ color: var(--color-6);
1638
+ }
1639
+
1640
+ @media (forced-colors: active) {
1641
+ #filterStr {
1642
+ color: CanvasText;
1643
+ caret-color: CanvasText;
1644
+ }
1645
+
1646
+ #filterStr-highlight {
1647
+ display: none;
1648
+ }
1649
+ }
1650
+
1651
+ #filter-history {
1652
+ width: 320px;
1653
+ position: relative;
1654
+ }
1655
+
1656
+ #filter-history-select {
1657
+ width: 100%;
1658
+ background-color: black;
1659
+ color: white;
1660
+ border: 1px solid grey;
1661
+ padding: 5px;
1662
+ font: inherit;
1663
+ cursor: pointer;
1664
+ }
1665
+
1666
+ #filter-history-select:disabled {
1667
+ opacity: 0.6;
1668
+ cursor: default;
1669
+ }
1670
+
1671
+ .query-token-key {
1672
+ color: #b785ff;
1673
+ }
1674
+
1675
+ .query-token-logic,
1676
+ .query-token-paren {
1677
+ color: #6ab4ff;
1678
+ }
1679
+
1680
+ .query-token-operator {
1681
+ color: #ffb36b;
1682
+ }
1683
+
1684
+ .query-token-value {
1685
+ color: #ff7d7d;
1686
+ }
1687
+
1688
+ .query-token-colon {
1689
+ color: #6ab4ff;
1690
+ }
1691
+
1692
+ #payloadascii {
1693
+ width: 320px;
1694
+ height: 24px;
1695
+ position: fixed;
1696
+ text-size: 12px;
1697
+ background-color: var(--color-4);
1698
+ color: var(--color-1);
1699
+ font-family: monospace;
1700
+ padding: 5px;
1701
+ border: 1px solid var(--color-3);
1702
+ opacity: 0;
1703
+ z-index: 10;
1704
+ transition: opacity 0.3s ease;
1705
+ pointer-events: none;
1706
+ }
1707
+
1708
+ #asciiOffset {
1709
+ width: 80px;
1710
+ position: absolute;
1711
+ }
1712
+
1713
+ #asciiText {
1714
+ color: white;
1715
+ width: 250px;
1716
+ margin-left: 70px;
1717
+ position: absolute;
1718
+ text-align: right;
1719
+ }
1720
+ #payloadascii.visible {
1721
+ opacity: 1;
1722
+ pointer-events: auto;
1723
+ }
1724
+
1725
+ .logo-cont img {
1726
+ width: 100%;
1727
+ height: 100%;
1728
+ object-fit: cover; /* or 'contain' */
1729
+ margin-top: 9px;
1730
+ }
1731
+
1732
+ /* Installation complete screen */
1733
+ #install-screen {
1734
+ display: none;
1735
+ position: fixed;
1736
+ top: 0;
1737
+ left: 0;
1738
+ width: 100%;
1739
+ height: 100%;
1740
+ background-color: rgba(0, 0, 0, 0.82);
1741
+ z-index: 9999;
1742
+ justify-content: center;
1743
+ align-items: center;
1744
+ }
1745
+
1746
+ #install-screen-inner {
1747
+ background-color: var(--color-4);
1748
+ border: 2px solid var(--color-1);
1749
+ border-radius: 10px;
1750
+ padding: 30px 40px;
1751
+ max-width: 600px;
1752
+ width: 90%;
1753
+ color: var(--color-5);
1754
+ font-family: "Courier New", Courier, monospace;
1755
+ }
1756
+
1757
+ #install-title {
1758
+ font-size: 22px;
1759
+ color: var(--color-1);
1760
+ font-weight: bold;
1761
+ text-align: center;
1762
+ margin-bottom: 6px;
1763
+ }
1764
+
1765
+ #install-version {
1766
+ font-size: 13px;
1767
+ color: var(--color-3);
1768
+ text-align: center;
1769
+ margin-bottom: 10px;
1770
+ }
1771
+
1772
+ .install-divider {
1773
+ border: 1px solid var(--color-7);
1774
+ margin: 12px 0;
1775
+ }
1776
+
1777
+ #install-files-heading {
1778
+ font-size: 14px;
1779
+ color: var(--color-6);
1780
+ margin-bottom: 8px;
1781
+ font-weight: bold;
1782
+ }
1783
+
1784
+ #install-file-list {
1785
+ list-style: none;
1786
+ padding: 0;
1787
+ margin: 0 0 10px 0;
1788
+ }
1789
+
1790
+ #install-file-list li {
1791
+ padding: 4px 0;
1792
+ font-size: 13px;
1793
+ }
1794
+
1795
+ .install-file-ok {
1796
+ color: white;
1797
+ }
1798
+
1799
+ .install-file-missing {
1800
+ color: #e06b6b;
1801
+ font-weight: bold;
1802
+ }
1803
+
1804
+ #install-ollama-status {
1805
+ font-size: 13px;
1806
+ padding: 8px 10px;
1807
+ border-radius: 6px;
1808
+ margin-bottom: 18px;
1809
+ }
1810
+
1811
+ .install-ok {
1812
+ /* background-color: rgba(107, 224, 107, 0.12); */
1813
+ color: white;
1814
+ border: white;
1815
+ }
1816
+
1817
+ .install-warning {
1818
+ background-color: rgba(224, 180, 40, 0.12);
1819
+ color: #e0b428;
1820
+ border: 1px solid #e0b42844;
1821
+ }
1822
+
1823
+ #install-continue-btn {
1824
+ display: block;
1825
+ width: 100%;
1826
+ padding: 10px;
1827
+ background-color: var(--color-1);
1828
+ color: black;
1829
+ border: none;
1830
+ border-radius: 6px;
1831
+ font-size: 15px;
1832
+ font-weight: bold;
1833
+ cursor: pointer;
1834
+ font-family: "Courier New", Courier, monospace;
1835
+ transition: background-color 0.2s;
1836
+ }
1837
+
1838
+ #install-continue-btn:hover {
1839
+ background-color: var(--color-3);
1840
+ }
1841
+
1842
+ #activity-log-panel {
1843
+ display: none;
1844
+ position: fixed;
1845
+ right: 30px;
1846
+ top: 120px;
1847
+ width: 460px;
1848
+ height: 560px;
1849
+ z-index: 9000;
1850
+ background-color: var(--color-4);
1851
+ border: 2px solid var(--color-1);
1852
+ border-radius: 8px;
1853
+ padding: 10px;
1854
+ box-sizing: border-box;
1855
+ color: white;
1856
+ font-family: "Courier New", Courier, monospace;
1857
+ }
1858
+
1859
+ #activity-log-header {
1860
+ display: flex;
1861
+ align-items: center;
1862
+ justify-content: space-between;
1863
+ font-size: 16px;
1864
+ color: var(--color-1);
1865
+ margin-bottom: 6px;
1866
+ }
1867
+
1868
+ #close-log-btn {
1869
+ border: none;
1870
+ background: transparent;
1871
+ color: var(--color-1);
1872
+ font-size: 20px;
1873
+ cursor: pointer;
1874
+ }
1875
+
1876
+ #activity-log-path {
1877
+ border: 1px solid var(--color-3);
1878
+ background-color: #000;
1879
+ color: var(--color-6);
1880
+ padding: 6px;
1881
+ font-size: 12px;
1882
+ margin-bottom: 6px;
1883
+ word-break: break-all;
1884
+ }
1885
+
1886
+ #activity-log-entries {
1887
+ border: 1px solid var(--color-3);
1888
+ background-color: #000;
1889
+ height: 410px;
1890
+ overflow-y: auto;
1891
+ padding: 6px;
1892
+ margin-bottom: 6px;
1893
+ white-space: pre-wrap;
1894
+ word-break: break-word;
1895
+ }
1896
+
1897
+ .activity-log-entry {
1898
+ border-bottom: 1px solid #2f3257;
1899
+ padding: 5px 0;
1900
+ color: white;
1901
+ }
1902
+
1903
+ #activity-log-search {
1904
+ width: 100%;
1905
+ box-sizing: border-box;
1906
+ padding: 8px;
1907
+ border: 1px solid var(--color-3);
1908
+ background-color: #000;
1909
+ color: white;
1910
+ }
1911
+
1912
+ .ctx-divider {
1913
+ border: none;
1914
+ border-top: 1px solid var(--color-7);
1915
+ margin: 4px 0;
1916
+ }