@quazardous/qdadm 2.32.0 → 2.33.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.
Files changed (41) hide show
  1. package/dist/styles/qdadm.css +1 -1
  2. package/package.json +9 -2
  3. package/src/components/display/EmailPreview.vue +227 -0
  4. package/src/components/display/EntityTimeline.vue +408 -0
  5. package/src/components/display/LogStream.vue +364 -0
  6. package/src/components/display/PayloadDiff.vue +236 -0
  7. package/src/components/display/PayloadViewer.vue +246 -0
  8. package/src/components/index.ts +8 -0
  9. package/src/components/layout/AppLayout.vue +8 -0
  10. package/src/components/tasks/TaskDialog.vue +95 -0
  11. package/src/components/tasks/TaskHost.vue +45 -0
  12. package/src/components/tasks/TaskTray.vue +54 -0
  13. package/src/composables/index.ts +11 -0
  14. package/src/composables/useListPage.filters.ts +26 -1
  15. package/src/composables/useLogStream.ts +264 -0
  16. package/src/email/index.ts +46 -0
  17. package/src/entity/storage/SdkStorage.ts +53 -1
  18. package/src/entity/storage/index.ts +2 -0
  19. package/src/i18n/defaults/core.en.generated.ts +85 -0
  20. package/src/i18n/defaults/core.en.yml +85 -0
  21. package/src/i18n/defaults/core.fr.generated.ts +85 -0
  22. package/src/i18n/defaults/core.fr.yml +85 -0
  23. package/src/index.ts +21 -0
  24. package/src/kernel/Kernel.vue.ts +9 -2
  25. package/src/kernel/Module.ts +3 -2
  26. package/src/modules/debug/DebugModule.ts +3 -1
  27. package/src/modules/debug/styles.generated.css +2895 -0
  28. package/src/notifications/NotificationModule.ts +1 -1
  29. package/src/notifications/{styles.scss → styles.css} +5 -5
  30. package/src/styles/_email.scss +188 -0
  31. package/src/styles/_log-stream.scss +167 -0
  32. package/src/styles/_payload.scss +312 -0
  33. package/src/styles/_tasks.scss +212 -0
  34. package/src/styles/_timeline.scss +229 -0
  35. package/src/styles/index.scss +5 -0
  36. package/src/tasks/taskStore.ts +460 -0
  37. package/src/tasks/useTaskRunner.ts +52 -0
  38. package/src/utils/ansi.ts +127 -0
  39. package/src/utils/email.ts +270 -0
  40. package/src/utils/index.ts +32 -0
  41. package/src/utils/payload.ts +480 -0
@@ -0,0 +1,2895 @@
1
+ /* GENERATED from styles.scss by `npm run gen:debug-css -w packages/qdadm` (#4140) — DO NOT EDIT. */
2
+ /**
3
+ * qdadm Debug Module Styles
4
+ *
5
+ * Consolidated styles for debug bar and panels.
6
+ * Loaded dynamically when DebugModule is used.
7
+ */
8
+ /* Minimized button */
9
+ .debug-minimized {
10
+ position: fixed;
11
+ bottom: 1rem;
12
+ right: 1rem;
13
+ width: 44px;
14
+ height: 44px;
15
+ border-radius: 8px;
16
+ background: #18181b;
17
+ border: 1px solid #3f3f46;
18
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ cursor: pointer;
23
+ transition: transform 0.15s;
24
+ }
25
+
26
+ .debug-minimized:hover {
27
+ transform: scale(1.08);
28
+ border-color: #60a5fa;
29
+ }
30
+
31
+ /* Separate badges */
32
+ .debug-badge {
33
+ position: absolute;
34
+ min-width: 16px;
35
+ height: 16px;
36
+ padding: 0 4px;
37
+ border-radius: 8px;
38
+ font-size: 10px;
39
+ font-weight: 600;
40
+ display: flex;
41
+ align-items: center;
42
+ justify-content: center;
43
+ gap: 2px;
44
+ }
45
+
46
+ .debug-badge .pi {
47
+ font-size: 8px;
48
+ }
49
+
50
+ /* Header inline badges */
51
+ .debug-header-badge {
52
+ display: inline-flex;
53
+ align-items: center;
54
+ gap: 3px;
55
+ padding: 2px 6px;
56
+ border-radius: 10px;
57
+ font-size: 11px;
58
+ font-weight: 600;
59
+ }
60
+
61
+ .debug-header-badge .pi {
62
+ font-size: 10px;
63
+ }
64
+
65
+ .debug-header-badge-error {
66
+ background: #ef4444;
67
+ color: white;
68
+ }
69
+
70
+ .debug-header-badge-signal {
71
+ background: #8b5cf6;
72
+ color: white;
73
+ }
74
+
75
+ .debug-badge-error {
76
+ top: -4px;
77
+ right: -4px;
78
+ background: #ef4444;
79
+ color: white;
80
+ }
81
+
82
+ .debug-badge-signal {
83
+ bottom: -4px;
84
+ right: -4px;
85
+ background: #8b5cf6;
86
+ color: white;
87
+ }
88
+
89
+ /* Panel base */
90
+ .debug-panel {
91
+ position: fixed;
92
+ background: #18181b;
93
+ border: 1px solid #3f3f46;
94
+ font-family: system-ui, sans-serif;
95
+ font-size: 13px;
96
+ color: #f4f4f5;
97
+ display: flex;
98
+ flex-direction: column;
99
+ }
100
+
101
+ /* Bottom mode */
102
+ .debug-bottom {
103
+ bottom: 0;
104
+ left: 0;
105
+ right: 0;
106
+ border-top: 1px solid #3f3f46;
107
+ border-left: none;
108
+ border-right: none;
109
+ border-bottom: none;
110
+ }
111
+
112
+ .debug-bottom.debug-expanded {
113
+ min-height: 100px;
114
+ max-height: 600px;
115
+ }
116
+
117
+ /* Right mode - vertical header on left, horizontal slide */
118
+ .debug-right {
119
+ top: 0;
120
+ right: 0;
121
+ bottom: 0;
122
+ flex-direction: row;
123
+ border-left: 1px solid #3f3f46;
124
+ border-top: none;
125
+ border-right: none;
126
+ border-bottom: none;
127
+ transition: transform 0.2s ease-out;
128
+ }
129
+
130
+ .debug-right:not(.debug-expanded) {
131
+ transform: translateX(calc(100% - 44px));
132
+ }
133
+
134
+ .debug-right.debug-expanded {
135
+ min-width: 200px;
136
+ max-width: 800px;
137
+ transform: translateX(0);
138
+ }
139
+
140
+ /* Window mode - floating draggable/resizable */
141
+ .debug-window {
142
+ /* Window appearance */
143
+ position: fixed;
144
+ border-radius: 8px;
145
+ box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);
146
+ border: 1px solid #3f3f46;
147
+ min-width: 280px;
148
+ min-height: 200px;
149
+ }
150
+
151
+ .debug-window .debug-header {
152
+ cursor: move;
153
+ user-select: none;
154
+ flex-wrap: nowrap;
155
+ }
156
+
157
+ .debug-window .debug-tabs {
158
+ flex: 1;
159
+ min-width: 0;
160
+ overflow: hidden;
161
+ }
162
+
163
+ .debug-window .debug-actions {
164
+ flex-shrink: 0;
165
+ }
166
+
167
+ .debug-window .debug-content {
168
+ flex: 1;
169
+ min-height: 0;
170
+ overflow: auto;
171
+ }
172
+
173
+ .debug-resize-handle {
174
+ position: absolute;
175
+ bottom: 0;
176
+ right: 0;
177
+ width: 16px;
178
+ height: 16px;
179
+ cursor: nwse-resize;
180
+ background: linear-gradient(135deg, transparent 50%, #3f3f46 50%);
181
+ border-bottom-right-radius: 8px;
182
+ z-index: 10;
183
+ }
184
+
185
+ .debug-resize-handle:hover {
186
+ background: linear-gradient(135deg, transparent 50%, #60a5fa 50%);
187
+ }
188
+
189
+ /* Panel resize handles for docked modes */
190
+ .debug-panel-resize {
191
+ position: absolute;
192
+ z-index: 10;
193
+ background: transparent;
194
+ }
195
+
196
+ .debug-panel-resize-top {
197
+ top: 0;
198
+ left: 0;
199
+ right: 0;
200
+ height: 4px;
201
+ cursor: ns-resize;
202
+ }
203
+
204
+ .debug-panel-resize-top:hover {
205
+ background: linear-gradient(180deg, #60a5fa 0%, transparent 100%);
206
+ }
207
+
208
+ .debug-panel-resize-left {
209
+ top: 0;
210
+ left: 0;
211
+ bottom: 0;
212
+ width: 4px;
213
+ cursor: ew-resize;
214
+ }
215
+
216
+ .debug-panel-resize-left:hover {
217
+ background: linear-gradient(90deg, #60a5fa 0%, transparent 100%);
218
+ }
219
+
220
+ .debug-right .debug-header {
221
+ flex-direction: column;
222
+ width: 44px;
223
+ padding: 8px 6px;
224
+ border-bottom: none;
225
+ border-right: 1px solid #3f3f46;
226
+ align-items: center;
227
+ gap: 4px;
228
+ }
229
+
230
+ .debug-right .debug-title {
231
+ flex-direction: column;
232
+ gap: 4px;
233
+ }
234
+
235
+ .debug-right .debug-title span:not(.debug-header-badge) {
236
+ display: none;
237
+ }
238
+
239
+ .debug-right .debug-tabs {
240
+ flex-direction: column;
241
+ margin-left: 0;
242
+ margin-top: 8px;
243
+ gap: 2px;
244
+ }
245
+
246
+ .debug-right .debug-tab {
247
+ width: 32px;
248
+ height: 32px;
249
+ padding: 0;
250
+ justify-content: center;
251
+ position: relative;
252
+ }
253
+
254
+ .debug-right .debug-tab-label {
255
+ display: none;
256
+ }
257
+
258
+ .debug-right .debug-tab .qd-badge {
259
+ position: absolute;
260
+ top: -2px;
261
+ right: -2px;
262
+ min-width: 14px;
263
+ height: 14px;
264
+ font-size: 9px;
265
+ padding: 0 3px;
266
+ }
267
+
268
+ /* Content header for right mode */
269
+ .debug-content-header {
270
+ display: flex;
271
+ align-items: center;
272
+ justify-content: space-between;
273
+ padding: 6px 12px;
274
+ background: #27272a;
275
+ border-bottom: 1px solid #3f3f46;
276
+ flex-shrink: 0;
277
+ }
278
+
279
+ .debug-content-title {
280
+ font-weight: 600;
281
+ font-size: 12px;
282
+ color: #a1a1aa;
283
+ }
284
+
285
+ .debug-content-controls {
286
+ display: flex;
287
+ gap: 4px;
288
+ }
289
+
290
+ .debug-content-controls .debug-tab-toggle,
291
+ .debug-content-controls .debug-tab-clear {
292
+ margin-left: 0;
293
+ width: 22px;
294
+ height: 22px;
295
+ }
296
+
297
+ .debug-right .debug-actions {
298
+ flex-direction: column;
299
+ margin-left: 0;
300
+ margin-top: auto;
301
+ gap: 2px;
302
+ }
303
+
304
+ .debug-right .debug-actions .p-button {
305
+ width: 28px;
306
+ height: 28px;
307
+ }
308
+
309
+ .debug-right .debug-content {
310
+ flex: 1;
311
+ min-width: 0;
312
+ }
313
+
314
+ /* Fullscreen - standalone mode like window but full viewport */
315
+ .debug-fullscreen {
316
+ position: fixed;
317
+ top: 0;
318
+ left: 0;
319
+ right: 0;
320
+ bottom: 0;
321
+ width: auto;
322
+ height: auto;
323
+ border: none;
324
+ border-radius: 0;
325
+ flex-direction: column;
326
+ }
327
+
328
+ .debug-fullscreen .debug-header {
329
+ flex-direction: row;
330
+ width: auto;
331
+ height: auto;
332
+ padding: 8px 16px;
333
+ border-bottom: 1px solid #3f3f46;
334
+ border-right: none;
335
+ }
336
+
337
+ .debug-fullscreen .debug-title {
338
+ flex-direction: row;
339
+ }
340
+
341
+ .debug-fullscreen .debug-title span:not(.debug-header-badge) {
342
+ display: inline;
343
+ }
344
+
345
+ .debug-fullscreen .debug-tabs {
346
+ flex-direction: row;
347
+ margin-left: 12px;
348
+ margin-top: 0;
349
+ }
350
+
351
+ .debug-fullscreen .debug-tab {
352
+ width: auto;
353
+ height: auto;
354
+ padding: 4px 10px;
355
+ }
356
+
357
+ .debug-fullscreen .debug-tab-label {
358
+ display: inline;
359
+ }
360
+
361
+ .debug-fullscreen .debug-tab .qd-badge {
362
+ position: static;
363
+ }
364
+
365
+ .debug-fullscreen .debug-actions {
366
+ flex-direction: row;
367
+ margin-left: auto;
368
+ margin-top: 0;
369
+ }
370
+
371
+ .debug-fullscreen .debug-actions .p-button {
372
+ width: auto;
373
+ height: auto;
374
+ }
375
+
376
+ .debug-fullscreen .debug-content {
377
+ flex: 1;
378
+ min-height: 0;
379
+ overflow: auto;
380
+ }
381
+
382
+ /* Mobile mode - fullscreen with vertical menu like right panel */
383
+ .debug-mobile {
384
+ position: fixed;
385
+ top: 0;
386
+ left: 0;
387
+ right: 0;
388
+ bottom: 0;
389
+ width: auto;
390
+ height: auto;
391
+ border: none;
392
+ border-radius: 0;
393
+ flex-direction: row; /* Like right panel: header on left, content on right */
394
+ }
395
+
396
+ .debug-mobile .debug-header {
397
+ flex-direction: column;
398
+ width: 44px;
399
+ padding: 8px 6px;
400
+ border-bottom: none;
401
+ border-right: 1px solid #3f3f46;
402
+ align-items: center;
403
+ gap: 4px;
404
+ height: 100%;
405
+ overflow: hidden;
406
+ }
407
+
408
+ .debug-mobile .debug-title {
409
+ flex-direction: column;
410
+ gap: 4px;
411
+ flex-shrink: 0;
412
+ }
413
+
414
+ .debug-mobile .debug-title span:not(.debug-header-badge) {
415
+ display: none;
416
+ }
417
+
418
+ .debug-mobile .debug-tabs {
419
+ flex-direction: column;
420
+ margin-left: 0;
421
+ margin-top: 8px;
422
+ gap: 2px;
423
+ flex: 1;
424
+ overflow-y: auto;
425
+ overflow-x: visible;
426
+ min-height: 0;
427
+ padding-right: 4px; /* Space for badge overflow */
428
+ }
429
+
430
+ .debug-mobile .debug-tab {
431
+ width: 32px;
432
+ height: 32px;
433
+ padding: 0;
434
+ justify-content: center;
435
+ position: relative;
436
+ }
437
+
438
+ .debug-mobile .debug-tab-label {
439
+ display: none;
440
+ }
441
+
442
+ .debug-mobile .debug-tab .qd-badge {
443
+ position: absolute;
444
+ top: -2px;
445
+ right: -2px;
446
+ min-width: 14px;
447
+ height: 14px;
448
+ font-size: 9px;
449
+ padding: 0 3px;
450
+ }
451
+
452
+ .debug-mobile .debug-actions {
453
+ flex-direction: column;
454
+ margin-left: 0;
455
+ margin-top: 8px;
456
+ padding-top: 8px;
457
+ border-top: 1px solid #3f3f46;
458
+ gap: 2px;
459
+ flex-shrink: 0;
460
+ }
461
+
462
+ .debug-mobile .debug-actions .p-button {
463
+ width: 28px;
464
+ height: 28px;
465
+ }
466
+
467
+ .debug-mobile .debug-content {
468
+ flex: 1;
469
+ min-width: 0;
470
+ min-height: 0;
471
+ overflow: auto;
472
+ }
473
+
474
+ /* Header */
475
+ .debug-header {
476
+ display: flex;
477
+ align-items: center;
478
+ gap: 8px;
479
+ padding: 6px 12px;
480
+ background: #27272a;
481
+ border-bottom: 1px solid #3f3f46;
482
+ flex-shrink: 0;
483
+ }
484
+
485
+ .debug-title {
486
+ display: flex;
487
+ align-items: center;
488
+ gap: 6px;
489
+ font-weight: 600;
490
+ }
491
+
492
+ .debug-title-draggable {
493
+ cursor: grab;
494
+ }
495
+
496
+ .debug-title-draggable:active {
497
+ cursor: grabbing;
498
+ }
499
+
500
+ .debug-tabs {
501
+ display: flex;
502
+ gap: 2px;
503
+ margin-left: 12px;
504
+ }
505
+
506
+ .debug-tabs-compact {
507
+ gap: 1px;
508
+ }
509
+
510
+ .debug-tabs-compact .debug-tab {
511
+ padding: 4px 6px;
512
+ }
513
+
514
+ .debug-tab {
515
+ display: flex;
516
+ align-items: center;
517
+ gap: 4px;
518
+ padding: 4px 10px;
519
+ background: transparent;
520
+ border: none;
521
+ border-radius: 4px;
522
+ color: #a1a1aa;
523
+ cursor: pointer;
524
+ font-size: 12px;
525
+ }
526
+
527
+ .debug-tab:hover {
528
+ background: #3f3f46;
529
+ color: #f4f4f5;
530
+ }
531
+
532
+ .debug-tab-active {
533
+ background: #3f3f46;
534
+ color: #a78bfa;
535
+ }
536
+
537
+ /* Tabs dropdown mode */
538
+ .debug-tabs-dropdown {
539
+ position: relative;
540
+ margin-left: 12px;
541
+ overflow: visible;
542
+ }
543
+
544
+ .debug-dropdown-trigger {
545
+ display: flex;
546
+ align-items: center;
547
+ gap: 6px;
548
+ padding: 4px 10px;
549
+ background: #3f3f46;
550
+ border: none;
551
+ border-radius: 4px;
552
+ color: #f4f4f5;
553
+ cursor: pointer;
554
+ font-size: 12px;
555
+ }
556
+
557
+ .debug-dropdown-trigger:hover {
558
+ background: #52525b;
559
+ }
560
+
561
+ .debug-dropdown-trigger .pi-chevron-down {
562
+ font-size: 10px;
563
+ color: #71717a;
564
+ margin-left: 4px;
565
+ }
566
+
567
+ .debug-dropdown-menu {
568
+ position: absolute;
569
+ top: 100%;
570
+ left: 0;
571
+ margin-top: 4px;
572
+ background: #27272a;
573
+ border: 1px solid #3f3f46;
574
+ border-radius: 6px;
575
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4);
576
+ min-width: 160px;
577
+ z-index: 10001;
578
+ padding: 4px;
579
+ }
580
+
581
+ .debug-dropdown-item {
582
+ display: flex;
583
+ align-items: center;
584
+ gap: 8px;
585
+ width: 100%;
586
+ padding: 6px 10px;
587
+ background: transparent;
588
+ border: none;
589
+ border-radius: 4px;
590
+ color: #a1a1aa;
591
+ cursor: pointer;
592
+ font-size: 12px;
593
+ text-align: left;
594
+ }
595
+
596
+ .debug-dropdown-item:hover {
597
+ background: #3f3f46;
598
+ color: #f4f4f5;
599
+ }
600
+
601
+ .debug-dropdown-item-active {
602
+ background: #3f3f46;
603
+ color: #a78bfa;
604
+ }
605
+
606
+ .debug-actions {
607
+ display: flex;
608
+ gap: 2px;
609
+ margin-left: auto;
610
+ }
611
+
612
+ /* Content */
613
+ .debug-content {
614
+ flex: 1;
615
+ overflow: auto;
616
+ background: #18181b;
617
+ }
618
+
619
+ .debug-empty {
620
+ display: flex;
621
+ flex-direction: column;
622
+ align-items: center;
623
+ justify-content: center;
624
+ height: 100%;
625
+ color: #71717a;
626
+ gap: 8px;
627
+ }
628
+
629
+ /* Per-collector toggle button */
630
+ .debug-tab-toggle {
631
+ display: flex;
632
+ align-items: center;
633
+ justify-content: center;
634
+ width: 18px;
635
+ height: 18px;
636
+ margin-left: 4px;
637
+ padding: 0;
638
+ background: transparent;
639
+ border: none;
640
+ border-radius: 3px;
641
+ color: #71717a;
642
+ cursor: pointer;
643
+ font-size: 9px;
644
+ }
645
+
646
+ .debug-tab-toggle:hover {
647
+ background: #52525b;
648
+ color: #f4f4f5;
649
+ }
650
+
651
+ .debug-tab-toggle-paused {
652
+ color: #f59e0b;
653
+ }
654
+
655
+ .debug-tab-clear {
656
+ display: flex;
657
+ align-items: center;
658
+ justify-content: center;
659
+ width: 18px;
660
+ height: 18px;
661
+ margin-left: 2px;
662
+ padding: 0;
663
+ background: transparent;
664
+ border: none;
665
+ border-radius: 3px;
666
+ color: #71717a;
667
+ cursor: pointer;
668
+ font-size: 9px;
669
+ }
670
+
671
+ .debug-tab-clear:hover {
672
+ background: #ef4444;
673
+ color: white;
674
+ }
675
+
676
+ /* Custom mode toggle button */
677
+ .debug-mode-btn {
678
+ display: flex;
679
+ align-items: center;
680
+ justify-content: center;
681
+ width: 2rem;
682
+ height: 2rem;
683
+ padding: 0;
684
+ background: transparent;
685
+ border: none;
686
+ border-radius: 50%;
687
+ color: #a1a1aa;
688
+ cursor: pointer;
689
+ font-size: 18px;
690
+ font-weight: bold;
691
+ font-family: monospace;
692
+ line-height: 1;
693
+ transition: background-color 0.15s, color 0.15s;
694
+ }
695
+
696
+ .debug-mode-btn:hover {
697
+ background: rgba(255, 255, 255, 0.1);
698
+ color: #f4f4f5;
699
+ }
700
+
701
+ /* =============================================================================
702
+ PANEL TOOLBAR (unified action bar at top of panels)
703
+ ============================================================================= */
704
+ .debug-panel-toolbar {
705
+ display: flex;
706
+ align-items: center;
707
+ gap: 8px;
708
+ padding: 8px 12px;
709
+ background: #27272a;
710
+ border-bottom: 1px solid #3f3f46;
711
+ }
712
+
713
+ /* Toolbar button - standard */
714
+ .debug-toolbar-btn {
715
+ display: inline-flex;
716
+ align-items: center;
717
+ gap: 4px;
718
+ padding: 3px 8px;
719
+ background: #3f3f46;
720
+ border: none;
721
+ border-radius: 3px;
722
+ color: #a1a1aa;
723
+ cursor: pointer;
724
+ font-size: 10px;
725
+ white-space: nowrap;
726
+ }
727
+
728
+ .debug-toolbar-btn:hover {
729
+ background: #52525b;
730
+ color: #f4f4f5;
731
+ }
732
+
733
+ .debug-toolbar-btn .pi {
734
+ font-size: 10px;
735
+ }
736
+
737
+ /* Toolbar button - danger variant */
738
+ .debug-toolbar-btn--danger {
739
+ background: rgba(239, 68, 68, 0.15);
740
+ color: #f87171;
741
+ }
742
+
743
+ .debug-toolbar-btn--danger:hover {
744
+ background: rgba(239, 68, 68, 0.3);
745
+ color: #fca5a5;
746
+ }
747
+
748
+ /* Toolbar button - active/pressed state */
749
+ .debug-toolbar-btn--active {
750
+ background: #8b5cf6;
751
+ color: white;
752
+ }
753
+
754
+ .debug-toolbar-btn--active:hover {
755
+ background: #7c3aed;
756
+ }
757
+
758
+ /* Toolbar input */
759
+ .debug-toolbar-input {
760
+ flex: 1;
761
+ min-width: 0;
762
+ font-size: 11px;
763
+ padding: 4px 8px;
764
+ background: #18181b;
765
+ border: 1px solid #3f3f46;
766
+ border-radius: 4px;
767
+ color: #f4f4f5;
768
+ }
769
+
770
+ .debug-toolbar-input:focus {
771
+ outline: none;
772
+ border-color: #8b5cf6;
773
+ }
774
+
775
+ .debug-toolbar-input::placeholder {
776
+ color: #71717a;
777
+ }
778
+
779
+ /* Toolbar icon (standalone) */
780
+ .debug-toolbar-icon {
781
+ color: #71717a;
782
+ font-size: 12px;
783
+ }
784
+
785
+ /* Toolbar label/text */
786
+ .debug-toolbar-label {
787
+ font-size: 10px;
788
+ color: #71717a;
789
+ }
790
+
791
+ /* Toolbar separator */
792
+ .debug-toolbar-separator {
793
+ width: 1px;
794
+ height: 16px;
795
+ background: #3f3f46;
796
+ }
797
+
798
+ /* =============================================================================
799
+ OBJECT TREE
800
+ ============================================================================= */
801
+ .obj-node {
802
+ font-family: "JetBrains Mono", "Fira Code", Consolas, monospace;
803
+ font-size: 12px;
804
+ line-height: 1.4;
805
+ }
806
+
807
+ .obj-line {
808
+ display: flex;
809
+ align-items: flex-start;
810
+ gap: 4px;
811
+ padding: 1px 0;
812
+ cursor: default;
813
+ white-space: nowrap;
814
+ }
815
+
816
+ .obj-line:hover {
817
+ background: rgba(255, 255, 255, 0.05);
818
+ }
819
+
820
+ .obj-toggle {
821
+ color: #71717a;
822
+ font-size: 10px;
823
+ width: 12px;
824
+ flex-shrink: 0;
825
+ cursor: pointer;
826
+ transition: transform 0.1s;
827
+ display: inline-block;
828
+ }
829
+
830
+ .obj-toggle.obj-expanded {
831
+ transform: rotate(90deg);
832
+ }
833
+
834
+ .obj-key {
835
+ color: #a78bfa;
836
+ }
837
+
838
+ .obj-preview {
839
+ color: #71717a;
840
+ font-style: italic;
841
+ }
842
+
843
+ .obj-empty {
844
+ color: #71717a;
845
+ }
846
+
847
+ .obj-children {
848
+ border-left: 1px solid #3f3f46;
849
+ margin-left: 5px;
850
+ }
851
+
852
+ .obj-string {
853
+ color: #fbbf24;
854
+ }
855
+
856
+ .obj-number {
857
+ color: #34d399;
858
+ }
859
+
860
+ .obj-boolean {
861
+ color: #60a5fa;
862
+ }
863
+
864
+ .obj-null, .obj-undefined {
865
+ color: #71717a;
866
+ font-style: italic;
867
+ }
868
+
869
+ .obj-function {
870
+ color: #c084fc;
871
+ font-style: italic;
872
+ }
873
+
874
+ .obj-truncated, .obj-max-depth {
875
+ color: #71717a;
876
+ font-style: italic;
877
+ padding-left: 16px;
878
+ }
879
+
880
+ /* =============================================================================
881
+ AUTH PANEL
882
+ ============================================================================= */
883
+ .auth-panel {
884
+ padding: 0;
885
+ display: flex;
886
+ flex-direction: column;
887
+ gap: 8px;
888
+ }
889
+
890
+ .auth-panel-content {
891
+ padding: 0 8px 8px 8px;
892
+ display: flex;
893
+ flex-direction: column;
894
+ gap: 8px;
895
+ }
896
+
897
+ /* Activity indicator */
898
+ .auth-activity {
899
+ display: flex;
900
+ align-items: center;
901
+ gap: 8px;
902
+ padding: 8px 12px;
903
+ border-radius: 4px;
904
+ font-size: 12px;
905
+ font-weight: 600;
906
+ transition: opacity 3s ease-out, transform 0.3s ease-out;
907
+ }
908
+
909
+ .auth-activity.fading {
910
+ opacity: 0;
911
+ }
912
+
913
+ /* TransitionGroup animations */
914
+ .event-enter-active {
915
+ transition: all 0.3s ease-out;
916
+ }
917
+
918
+ .event-leave-active {
919
+ transition: all 0.5s ease-in;
920
+ }
921
+
922
+ .event-enter-from {
923
+ opacity: 0;
924
+ transform: translateY(-10px);
925
+ }
926
+
927
+ .event-leave-to {
928
+ opacity: 0;
929
+ transform: translateY(30px);
930
+ }
931
+
932
+ .auth-activity.login {
933
+ background: linear-gradient(90deg, rgba(34, 197, 94, 0.2) 0%, rgba(34, 197, 94, 0.05) 100%);
934
+ border-left: 3px solid #22c55e;
935
+ color: #22c55e;
936
+ }
937
+
938
+ .auth-activity.logout {
939
+ background: linear-gradient(90deg, rgba(239, 68, 68, 0.2) 0%, rgba(239, 68, 68, 0.05) 100%);
940
+ border-left: 3px solid #ef4444;
941
+ color: #ef4444;
942
+ }
943
+
944
+ .auth-activity.impersonate {
945
+ background: linear-gradient(90deg, rgba(249, 115, 22, 0.2) 0%, rgba(249, 115, 22, 0.05) 100%);
946
+ border-left: 3px solid #f97316;
947
+ color: #f97316;
948
+ }
949
+
950
+ .auth-activity.impersonate-stop {
951
+ background: linear-gradient(90deg, rgba(161, 161, 170, 0.2) 0%, rgba(161, 161, 170, 0.05) 100%);
952
+ border-left: 3px solid #a1a1aa;
953
+ color: #a1a1aa;
954
+ }
955
+
956
+ .auth-activity.login-error {
957
+ background: linear-gradient(90deg, rgba(239, 68, 68, 0.2) 0%, rgba(239, 68, 68, 0.05) 100%);
958
+ border-left: 3px solid #ef4444;
959
+ color: #ef4444;
960
+ }
961
+
962
+ .auth-time {
963
+ margin-left: auto;
964
+ font-size: 10px;
965
+ opacity: 0.6;
966
+ font-weight: 400;
967
+ }
968
+
969
+ .auth-item {
970
+ background: #27272a;
971
+ border-radius: 4px;
972
+ padding: 8px;
973
+ }
974
+
975
+ .auth-item--impersonated {
976
+ background: linear-gradient(90deg, rgba(249, 115, 22, 0.15) 0%, rgba(249, 115, 22, 0.05) 100%);
977
+ border-left: 3px solid #f97316;
978
+ }
979
+
980
+ .auth-header {
981
+ display: flex;
982
+ align-items: center;
983
+ gap: 6px;
984
+ margin-bottom: 6px;
985
+ color: #10b981;
986
+ }
987
+
988
+ .auth-header--impersonated {
989
+ color: #f97316;
990
+ }
991
+
992
+ .auth-label {
993
+ font-weight: 600;
994
+ }
995
+
996
+ .auth-message {
997
+ color: #71717a;
998
+ font-size: 12px;
999
+ }
1000
+
1001
+ /* =============================================================================
1002
+ ENTITIES PANEL
1003
+ ============================================================================= */
1004
+ .entities-panel {
1005
+ padding: 8px;
1006
+ display: flex;
1007
+ flex-direction: column;
1008
+ gap: 8px;
1009
+ }
1010
+
1011
+ .entities-status {
1012
+ color: #71717a;
1013
+ font-size: 12px;
1014
+ padding: 12px;
1015
+ text-align: center;
1016
+ }
1017
+
1018
+ .entity-item {
1019
+ background: #27272a;
1020
+ border-radius: 4px;
1021
+ padding: 8px;
1022
+ border-left: 3px solid transparent;
1023
+ transition: border-color 0.2s ease;
1024
+ }
1025
+
1026
+ .entity-active {
1027
+ border-left-color: #f59e0b;
1028
+ background: linear-gradient(90deg, rgba(245, 158, 11, 0.1) 0%, #27272a 30%);
1029
+ }
1030
+
1031
+ .entity-system {
1032
+ border-left-color: #ef4444;
1033
+ background: linear-gradient(90deg, rgba(239, 68, 68, 0.1) 0%, #27272a 30%);
1034
+ }
1035
+
1036
+ .entity-system .entity-header {
1037
+ color: #ef4444;
1038
+ }
1039
+
1040
+ .entity-system .entity-header:hover {
1041
+ color: #f87171;
1042
+ }
1043
+
1044
+ .entity-system .entity-name::after {
1045
+ content: " (system)";
1046
+ font-size: 9px;
1047
+ color: #f87171;
1048
+ font-weight: normal;
1049
+ }
1050
+
1051
+ .entity-header {
1052
+ display: flex;
1053
+ align-items: center;
1054
+ gap: 8px;
1055
+ color: #3b82f6;
1056
+ cursor: pointer;
1057
+ }
1058
+
1059
+ .entity-header:hover {
1060
+ color: #60a5fa;
1061
+ }
1062
+
1063
+ .entity-expand {
1064
+ display: flex;
1065
+ align-items: center;
1066
+ justify-content: center;
1067
+ width: 16px;
1068
+ height: 16px;
1069
+ padding: 0;
1070
+ background: transparent;
1071
+ border: none;
1072
+ color: #71717a;
1073
+ cursor: pointer;
1074
+ font-size: 10px;
1075
+ }
1076
+
1077
+ .entity-expand:hover {
1078
+ color: #f4f4f5;
1079
+ }
1080
+
1081
+ .entity-name {
1082
+ font-weight: 600;
1083
+ font-family: "JetBrains Mono", monospace;
1084
+ }
1085
+
1086
+ .entity-perms-icons {
1087
+ display: flex;
1088
+ gap: 4px;
1089
+ margin-left: 6px;
1090
+ }
1091
+
1092
+ .entity-perms-icons .pi {
1093
+ font-size: 12px;
1094
+ cursor: help;
1095
+ }
1096
+
1097
+ .perm-icon-granted {
1098
+ color: #22c55e;
1099
+ }
1100
+
1101
+ .perm-icon-denied {
1102
+ color: #52525b;
1103
+ }
1104
+
1105
+ .perm-icon-readonly {
1106
+ color: #f59e0b;
1107
+ margin-left: 2px;
1108
+ }
1109
+
1110
+ .perm-icon-auth-sensitive {
1111
+ color: #8b5cf6;
1112
+ margin-left: 2px;
1113
+ }
1114
+
1115
+ .debug-panel .entity-label {
1116
+ color: #a1a1aa;
1117
+ font-size: 11px;
1118
+ }
1119
+
1120
+ .entity-cache {
1121
+ margin-left: auto;
1122
+ display: flex;
1123
+ align-items: center;
1124
+ gap: 4px;
1125
+ padding: 2px 6px;
1126
+ background: #3f3f46;
1127
+ border-radius: 3px;
1128
+ font-size: 10px;
1129
+ color: #71717a;
1130
+ }
1131
+
1132
+ .entity-cache-valid {
1133
+ background: rgba(34, 197, 94, 0.2);
1134
+ color: #22c55e;
1135
+ }
1136
+
1137
+ .entity-cache-disabled {
1138
+ background: transparent;
1139
+ color: #52525b;
1140
+ font-size: 9px;
1141
+ }
1142
+
1143
+ .entity-cache-na {
1144
+ color: #52525b;
1145
+ font-style: italic;
1146
+ }
1147
+
1148
+ .entity-load-btn {
1149
+ display: inline-flex;
1150
+ align-items: center;
1151
+ gap: 4px;
1152
+ padding: 2px 8px;
1153
+ background: #3f3f46;
1154
+ border: none;
1155
+ border-radius: 3px;
1156
+ color: #a1a1aa;
1157
+ cursor: pointer;
1158
+ font-size: 10px;
1159
+ margin-left: auto;
1160
+ }
1161
+
1162
+ .entity-load-btn:hover {
1163
+ background: #52525b;
1164
+ color: #f4f4f5;
1165
+ }
1166
+
1167
+ .entity-load-btn:disabled {
1168
+ opacity: 0.5;
1169
+ cursor: not-allowed;
1170
+ }
1171
+
1172
+ .entity-invalidate-btn {
1173
+ display: inline-flex;
1174
+ align-items: center;
1175
+ justify-content: center;
1176
+ width: 20px;
1177
+ height: 20px;
1178
+ padding: 0;
1179
+ background: transparent;
1180
+ border: none;
1181
+ border-radius: 3px;
1182
+ color: #71717a;
1183
+ cursor: pointer;
1184
+ margin-left: auto;
1185
+ }
1186
+
1187
+ .entity-invalidate-btn:hover {
1188
+ background: rgba(239, 68, 68, 0.2);
1189
+ color: #ef4444;
1190
+ }
1191
+
1192
+ .entity-test-btn {
1193
+ display: inline-flex;
1194
+ align-items: center;
1195
+ gap: 4px;
1196
+ padding: 2px 8px;
1197
+ background: #3b82f6;
1198
+ border: none;
1199
+ border-radius: 3px;
1200
+ color: #fff;
1201
+ cursor: pointer;
1202
+ font-size: 10px;
1203
+ margin-left: auto;
1204
+ }
1205
+
1206
+ .entity-test-btn:hover {
1207
+ background: #2563eb;
1208
+ }
1209
+
1210
+ .entity-test-btn:disabled {
1211
+ opacity: 0.5;
1212
+ cursor: not-allowed;
1213
+ }
1214
+
1215
+ .entity-test-result {
1216
+ display: inline-flex;
1217
+ align-items: center;
1218
+ gap: 4px;
1219
+ padding: 2px 6px;
1220
+ border-radius: 3px;
1221
+ font-size: 10px;
1222
+ margin-left: 8px;
1223
+ }
1224
+
1225
+ .test-success {
1226
+ background: rgba(34, 197, 94, 0.2);
1227
+ color: #22c55e;
1228
+ }
1229
+
1230
+ .test-error {
1231
+ background: rgba(239, 68, 68, 0.2);
1232
+ color: #ef4444;
1233
+ }
1234
+
1235
+ .entity-test-na {
1236
+ color: #52525b;
1237
+ font-style: italic;
1238
+ }
1239
+
1240
+ /* Collapsed summary */
1241
+ .entity-summary {
1242
+ display: flex;
1243
+ align-items: center;
1244
+ gap: 8px;
1245
+ margin-left: 24px;
1246
+ margin-top: 4px;
1247
+ font-size: 11px;
1248
+ color: #71717a;
1249
+ }
1250
+
1251
+ .entity-storage {
1252
+ color: #a1a1aa;
1253
+ }
1254
+
1255
+ .entity-fields {
1256
+ color: #71717a;
1257
+ }
1258
+
1259
+ /* Expanded details */
1260
+ .entity-details {
1261
+ font-size: 11px;
1262
+ margin-left: 24px;
1263
+ margin-top: 8px;
1264
+ padding-top: 8px;
1265
+ border-top: 1px solid #3f3f46;
1266
+ }
1267
+
1268
+ .entity-row {
1269
+ display: flex;
1270
+ align-items: center;
1271
+ gap: 6px;
1272
+ margin-bottom: 3px;
1273
+ }
1274
+
1275
+ .entity-key {
1276
+ color: #71717a;
1277
+ min-width: 60px;
1278
+ }
1279
+
1280
+ .entity-value {
1281
+ color: #d4d4d8;
1282
+ }
1283
+
1284
+ .entity-endpoint {
1285
+ color: #a1a1aa;
1286
+ font-family: "JetBrains Mono", monospace;
1287
+ font-size: 10px;
1288
+ padding: 1px 4px;
1289
+ background: #3f3f46;
1290
+ border-radius: 2px;
1291
+ }
1292
+
1293
+ .entity-normalize-badge {
1294
+ display: inline-flex;
1295
+ align-items: center;
1296
+ justify-content: center;
1297
+ width: 18px;
1298
+ height: 18px;
1299
+ background: rgba(139, 92, 246, 0.2);
1300
+ color: #a78bfa;
1301
+ border-radius: 3px;
1302
+ font-size: 10px;
1303
+ }
1304
+
1305
+ .entity-multi-badge {
1306
+ display: inline-flex;
1307
+ align-items: center;
1308
+ gap: 3px;
1309
+ padding: 2px 6px;
1310
+ background: rgba(59, 130, 246, 0.2);
1311
+ color: #60a5fa;
1312
+ border-radius: 3px;
1313
+ font-size: 10px;
1314
+ font-weight: 600;
1315
+ }
1316
+
1317
+ .perm-icon-asymmetric {
1318
+ color: #a855f7;
1319
+ margin-left: 2px;
1320
+ }
1321
+
1322
+ /* Storages section */
1323
+ .entity-storages-section {
1324
+ margin-bottom: 8px;
1325
+ }
1326
+
1327
+ .entity-storages-header {
1328
+ display: flex;
1329
+ align-items: center;
1330
+ gap: 6px;
1331
+ color: #a1a1aa;
1332
+ font-size: 11px;
1333
+ margin-bottom: 6px;
1334
+ }
1335
+
1336
+ .entity-storages-header .pi {
1337
+ font-size: 10px;
1338
+ }
1339
+
1340
+ .entity-storage-card {
1341
+ background: #1f1f23;
1342
+ border-radius: 4px;
1343
+ padding: 6px 8px;
1344
+ margin-bottom: 4px;
1345
+ border-left: 2px solid #3b82f6;
1346
+ }
1347
+
1348
+ .entity-storage-alt {
1349
+ border-left-color: #8b5cf6;
1350
+ }
1351
+
1352
+ .entity-storage-header {
1353
+ display: flex;
1354
+ align-items: center;
1355
+ gap: 6px;
1356
+ }
1357
+
1358
+ .entity-storage-name {
1359
+ color: #60a5fa;
1360
+ font-weight: 500;
1361
+ font-family: "JetBrains Mono", monospace;
1362
+ font-size: 11px;
1363
+ }
1364
+
1365
+ .entity-storage-alt .entity-storage-name {
1366
+ color: #a78bfa;
1367
+ }
1368
+
1369
+ .entity-storage-type {
1370
+ color: #a1a1aa;
1371
+ font-size: 10px;
1372
+ }
1373
+
1374
+ .entity-storage-endpoint {
1375
+ color: #71717a;
1376
+ font-family: "JetBrains Mono", monospace;
1377
+ font-size: 10px;
1378
+ padding: 2px 0;
1379
+ margin-top: 2px;
1380
+ }
1381
+
1382
+ .entity-storage-row {
1383
+ display: flex;
1384
+ align-items: center;
1385
+ gap: 8px;
1386
+ margin-top: 4px;
1387
+ }
1388
+
1389
+ .entity-storage-caps {
1390
+ display: flex;
1391
+ gap: 4px;
1392
+ flex-wrap: wrap;
1393
+ }
1394
+
1395
+ .entity-storage-fetch-btn {
1396
+ display: inline-flex;
1397
+ align-items: center;
1398
+ justify-content: center;
1399
+ width: 22px;
1400
+ height: 22px;
1401
+ padding: 0;
1402
+ margin-left: auto;
1403
+ background: #3b82f6;
1404
+ border: none;
1405
+ border-radius: 3px;
1406
+ color: #fff;
1407
+ cursor: pointer;
1408
+ font-size: 10px;
1409
+ }
1410
+
1411
+ .entity-storage-fetch-btn:hover {
1412
+ background: #2563eb;
1413
+ }
1414
+
1415
+ .entity-storage-fetch-btn:disabled {
1416
+ opacity: 0.5;
1417
+ cursor: not-allowed;
1418
+ }
1419
+
1420
+ .entity-storage-test-result {
1421
+ display: inline-flex;
1422
+ align-items: center;
1423
+ gap: 3px;
1424
+ padding: 2px 6px;
1425
+ border-radius: 3px;
1426
+ font-size: 10px;
1427
+ margin-left: auto;
1428
+ }
1429
+
1430
+ .entity-capabilities {
1431
+ display: flex;
1432
+ gap: 4px;
1433
+ flex-wrap: wrap;
1434
+ }
1435
+
1436
+ .entity-cap {
1437
+ display: flex;
1438
+ align-items: center;
1439
+ justify-content: center;
1440
+ width: 20px;
1441
+ height: 20px;
1442
+ border-radius: 3px;
1443
+ cursor: help;
1444
+ }
1445
+
1446
+ .entity-cap .pi {
1447
+ font-size: 11px;
1448
+ }
1449
+
1450
+ .entity-cap-enabled {
1451
+ background: rgba(34, 197, 94, 0.2);
1452
+ color: #22c55e;
1453
+ }
1454
+
1455
+ .entity-cap-disabled {
1456
+ background: rgba(239, 68, 68, 0.15);
1457
+ color: #71717a;
1458
+ }
1459
+
1460
+ .entity-cap-auth {
1461
+ background: rgba(245, 158, 11, 0.2);
1462
+ color: #f59e0b;
1463
+ }
1464
+
1465
+ .entity-required {
1466
+ color: #f59e0b;
1467
+ font-size: 10px;
1468
+ }
1469
+
1470
+ .entity-relation {
1471
+ display: inline-flex;
1472
+ align-items: center;
1473
+ gap: 2px;
1474
+ padding: 1px 4px;
1475
+ background: #3f3f46;
1476
+ border-radius: 2px;
1477
+ margin-right: 4px;
1478
+ font-size: 10px;
1479
+ }
1480
+
1481
+ .entity-relation .pi {
1482
+ font-size: 8px;
1483
+ }
1484
+
1485
+ .entity-reference {
1486
+ background: #1e3a5f;
1487
+ color: #93c5fd;
1488
+ }
1489
+
1490
+ /* Stats */
1491
+ .entity-stats {
1492
+ margin-top: 8px;
1493
+ padding-top: 8px;
1494
+ border-top: 1px solid #3f3f46;
1495
+ }
1496
+
1497
+ .entity-stats-header {
1498
+ display: flex;
1499
+ align-items: center;
1500
+ gap: 6px;
1501
+ color: #a1a1aa;
1502
+ font-size: 11px;
1503
+ margin-bottom: 6px;
1504
+ }
1505
+
1506
+ .entity-stats-header .pi {
1507
+ font-size: 10px;
1508
+ }
1509
+
1510
+ .entity-stats-grid {
1511
+ display: flex;
1512
+ gap: 8px;
1513
+ flex-wrap: wrap;
1514
+ }
1515
+
1516
+ .entity-stat {
1517
+ display: flex;
1518
+ flex-direction: column;
1519
+ align-items: center;
1520
+ padding: 4px 8px;
1521
+ background: #1f1f23;
1522
+ border-radius: 4px;
1523
+ min-width: 40px;
1524
+ }
1525
+
1526
+ .entity-stat-value {
1527
+ font-size: 14px;
1528
+ font-weight: 600;
1529
+ color: #d4d4d8;
1530
+ font-family: "JetBrains Mono", monospace;
1531
+ }
1532
+
1533
+ .entity-stat-label {
1534
+ font-size: 9px;
1535
+ color: #71717a;
1536
+ text-transform: uppercase;
1537
+ }
1538
+
1539
+ .entity-stat-cache {
1540
+ border-left: 1px solid #3f3f46;
1541
+ padding-left: 12px;
1542
+ margin-left: 4px;
1543
+ }
1544
+
1545
+ .entity-stat-max {
1546
+ border-left: 1px solid #3f3f46;
1547
+ padding-left: 12px;
1548
+ margin-left: 4px;
1549
+ }
1550
+
1551
+ .entity-stat-max .entity-stat-value {
1552
+ color: #60a5fa;
1553
+ }
1554
+
1555
+ .stat-positive {
1556
+ color: #22c55e;
1557
+ }
1558
+
1559
+ .stat-negative {
1560
+ color: #f59e0b;
1561
+ }
1562
+
1563
+ /* Cached items */
1564
+ .entity-items {
1565
+ margin-top: 8px;
1566
+ padding-top: 8px;
1567
+ border-top: 1px solid #3f3f46;
1568
+ }
1569
+
1570
+ .entity-items-header {
1571
+ display: flex;
1572
+ align-items: center;
1573
+ gap: 6px;
1574
+ color: #a1a1aa;
1575
+ font-size: 11px;
1576
+ margin-bottom: 6px;
1577
+ }
1578
+
1579
+ .entity-items-header .pi {
1580
+ font-size: 10px;
1581
+ }
1582
+
1583
+ .entity-items-list {
1584
+ display: flex;
1585
+ flex-direction: column;
1586
+ gap: 4px;
1587
+ max-height: 200px;
1588
+ overflow-y: auto;
1589
+ }
1590
+
1591
+ .entity-item-row {
1592
+ background: #1f1f23;
1593
+ border-radius: 3px;
1594
+ padding: 4px 6px;
1595
+ }
1596
+
1597
+ .entity-items-more {
1598
+ color: #71717a;
1599
+ font-size: 10px;
1600
+ font-style: italic;
1601
+ padding: 4px;
1602
+ }
1603
+
1604
+ /* Full config tree */
1605
+ .entity-config {
1606
+ margin-top: 8px;
1607
+ padding-top: 8px;
1608
+ border-top: 1px solid #3f3f46;
1609
+ }
1610
+
1611
+ .entity-config summary {
1612
+ cursor: pointer;
1613
+ color: #71717a;
1614
+ font-size: 11px;
1615
+ }
1616
+
1617
+ .entity-config summary:hover {
1618
+ color: #a1a1aa;
1619
+ }
1620
+
1621
+ /* =============================================================================
1622
+ ENTRIES PANEL
1623
+ ============================================================================= */
1624
+ /* Horizontal entries (bottom mode) */
1625
+ .entries-h {
1626
+ display: flex;
1627
+ gap: 1px;
1628
+ height: 100%;
1629
+ overflow-x: auto;
1630
+ }
1631
+
1632
+ .entry-h {
1633
+ flex: 0 0 auto;
1634
+ min-width: 200px;
1635
+ max-width: 320px;
1636
+ padding: 8px 12px;
1637
+ border-right: 1px solid #3f3f46;
1638
+ overflow: hidden;
1639
+ }
1640
+
1641
+ .entry-h:last-child {
1642
+ border-right: none;
1643
+ }
1644
+
1645
+ /* Vertical entries (right/fullscreen mode) */
1646
+ .entries-v {
1647
+ display: flex;
1648
+ flex-direction: column;
1649
+ }
1650
+
1651
+ .entry-v {
1652
+ padding: 8px 12px;
1653
+ border-bottom: 1px solid #27272a;
1654
+ }
1655
+
1656
+ .entry-v:hover {
1657
+ background: #1f1f23;
1658
+ }
1659
+
1660
+ /* New entry indicator */
1661
+ .entry-new {
1662
+ position: relative;
1663
+ background: rgba(245, 158, 11, 0.08);
1664
+ }
1665
+
1666
+ .entry-v.entry-new::before {
1667
+ content: "";
1668
+ position: absolute;
1669
+ left: 0;
1670
+ top: 0;
1671
+ bottom: 0;
1672
+ width: 3px;
1673
+ background: #f59e0b;
1674
+ }
1675
+
1676
+ .entry-h.entry-new {
1677
+ border-left: 3px solid #f59e0b;
1678
+ }
1679
+
1680
+ .entry-new-dot {
1681
+ display: inline-block;
1682
+ width: 6px;
1683
+ height: 6px;
1684
+ background: #f59e0b;
1685
+ border-radius: 50%;
1686
+ margin-right: 4px;
1687
+ flex-shrink: 0;
1688
+ }
1689
+
1690
+ /* Entry parts */
1691
+ .entry-meta, .entry-header {
1692
+ display: flex;
1693
+ align-items: center;
1694
+ gap: 6px;
1695
+ margin-bottom: 4px;
1696
+ }
1697
+
1698
+ .entry-time {
1699
+ font-family: "JetBrains Mono", monospace;
1700
+ font-size: 10px;
1701
+ color: #71717a;
1702
+ background: #27272a;
1703
+ padding: 1px 4px;
1704
+ border-radius: 2px;
1705
+ }
1706
+
1707
+ .entry-name {
1708
+ color: #a78bfa;
1709
+ font-weight: 500;
1710
+ font-size: 12px;
1711
+ }
1712
+
1713
+ .entry-message {
1714
+ color: #f87171;
1715
+ font-size: 12px;
1716
+ }
1717
+
1718
+ /* Copy button */
1719
+ .entry-copy {
1720
+ margin-left: auto;
1721
+ display: flex;
1722
+ align-items: center;
1723
+ justify-content: center;
1724
+ width: 22px;
1725
+ height: 22px;
1726
+ padding: 0;
1727
+ background: transparent;
1728
+ border: none;
1729
+ border-radius: 3px;
1730
+ color: #71717a;
1731
+ cursor: pointer;
1732
+ opacity: 0;
1733
+ transition: opacity 0.15s, background 0.15s, color 0.15s;
1734
+ }
1735
+
1736
+ .entry-v:hover .entry-copy {
1737
+ opacity: 1;
1738
+ }
1739
+
1740
+ .entry-copy:hover {
1741
+ background: #3f3f46;
1742
+ color: #d4d4d8;
1743
+ }
1744
+
1745
+ .entry-copied {
1746
+ opacity: 1;
1747
+ color: #22c55e;
1748
+ }
1749
+
1750
+ .entry-copy .pi {
1751
+ font-size: 12px;
1752
+ }
1753
+
1754
+ /* =============================================================================
1755
+ ROUTER PANEL
1756
+ ============================================================================= */
1757
+ .router-panel {
1758
+ display: flex;
1759
+ flex-direction: column;
1760
+ height: 100%;
1761
+ overflow: hidden;
1762
+ }
1763
+
1764
+ /* Address Bar */
1765
+ .address-bar {
1766
+ display: flex;
1767
+ align-items: center;
1768
+ gap: 8px;
1769
+ padding: 8px 12px;
1770
+ background: #18181b;
1771
+ border-bottom: 1px solid #3f3f46;
1772
+ }
1773
+
1774
+ .address-bar .pi {
1775
+ color: #71717a;
1776
+ font-size: 12px;
1777
+ }
1778
+
1779
+ .address-input {
1780
+ flex: 1;
1781
+ font-size: 12px;
1782
+ padding: 6px 10px;
1783
+ background: #27272a;
1784
+ border: 1px solid #3f3f46;
1785
+ border-radius: 4px;
1786
+ color: #f4f4f5;
1787
+ font-family: monospace;
1788
+ }
1789
+
1790
+ .address-input:focus {
1791
+ border-color: #3b82f6;
1792
+ outline: none;
1793
+ }
1794
+
1795
+ .address-go {
1796
+ display: flex;
1797
+ align-items: center;
1798
+ justify-content: center;
1799
+ width: 28px;
1800
+ height: 28px;
1801
+ background: #3b82f6;
1802
+ border: none;
1803
+ border-radius: 4px;
1804
+ color: white;
1805
+ cursor: pointer;
1806
+ }
1807
+
1808
+ .address-go:hover:not(:disabled) {
1809
+ background: #2563eb;
1810
+ }
1811
+
1812
+ .address-go:disabled {
1813
+ background: #3f3f46;
1814
+ color: #71717a;
1815
+ cursor: not-allowed;
1816
+ }
1817
+
1818
+ .address-go .pi {
1819
+ font-size: 12px;
1820
+ color: inherit;
1821
+ }
1822
+
1823
+ /* ActiveStack */
1824
+ .stack-empty {
1825
+ display: flex;
1826
+ align-items: center;
1827
+ gap: 8px;
1828
+ padding: 8px;
1829
+ background: #27272a;
1830
+ border-radius: 4px;
1831
+ color: #71717a;
1832
+ font-size: 11px;
1833
+ }
1834
+
1835
+ .stack-list {
1836
+ display: flex;
1837
+ flex-direction: column;
1838
+ gap: 4px;
1839
+ }
1840
+
1841
+ .stack-entry {
1842
+ padding: 6px 8px;
1843
+ background: #27272a;
1844
+ border-radius: 4px;
1845
+ font-size: 11px;
1846
+ border-left: 2px solid #3f3f46;
1847
+ }
1848
+
1849
+ .stack-current {
1850
+ border-left-color: #3b82f6;
1851
+ background: #1e3a5f;
1852
+ }
1853
+
1854
+ .stack-entry-header {
1855
+ display: flex;
1856
+ align-items: center;
1857
+ gap: 8px;
1858
+ }
1859
+
1860
+ .stack-index {
1861
+ width: 16px;
1862
+ height: 16px;
1863
+ display: flex;
1864
+ align-items: center;
1865
+ justify-content: center;
1866
+ background: #3f3f46;
1867
+ border-radius: 50%;
1868
+ font-size: 10px;
1869
+ color: #a1a1aa;
1870
+ }
1871
+
1872
+ .stack-entity {
1873
+ font-weight: 500;
1874
+ color: #60a5fa;
1875
+ }
1876
+
1877
+ .stack-has-data {
1878
+ color: #10b981;
1879
+ font-size: 10px;
1880
+ }
1881
+
1882
+ .stack-loading {
1883
+ opacity: 0.7;
1884
+ }
1885
+
1886
+ /* Hydration badge */
1887
+ .stack-hydration-badge {
1888
+ font-size: 10px;
1889
+ margin-left: auto;
1890
+ }
1891
+
1892
+ .hydration-badge-loading {
1893
+ color: #f59e0b;
1894
+ }
1895
+
1896
+ .hydration-badge-data {
1897
+ color: #10b981;
1898
+ }
1899
+
1900
+ .hydration-badge-ready {
1901
+ color: #71717a;
1902
+ }
1903
+
1904
+ .hydration-badge-pending {
1905
+ color: #f59e0b;
1906
+ }
1907
+
1908
+ /* Hydration details row */
1909
+ .stack-entry-hydration {
1910
+ padding-left: 24px;
1911
+ margin-top: 4px;
1912
+ font-size: 10px;
1913
+ }
1914
+
1915
+ .hydration-loading {
1916
+ color: #f59e0b;
1917
+ }
1918
+
1919
+ .hydration-ready {
1920
+ display: flex;
1921
+ align-items: center;
1922
+ gap: 6px;
1923
+ }
1924
+
1925
+ .hydration-label {
1926
+ color: #a1a1aa;
1927
+ font-style: italic;
1928
+ }
1929
+
1930
+ .hydration-data {
1931
+ font-size: 10px;
1932
+ title: "Has entity data";
1933
+ }
1934
+
1935
+ .hydration-pending {
1936
+ color: #71717a;
1937
+ }
1938
+
1939
+ .stack-entry-props {
1940
+ display: flex;
1941
+ flex-wrap: wrap;
1942
+ gap: 12px;
1943
+ padding-left: 24px;
1944
+ margin-top: 4px;
1945
+ }
1946
+
1947
+ .stack-prop {
1948
+ color: #71717a;
1949
+ font-size: 10px;
1950
+ }
1951
+
1952
+ .stack-prop code {
1953
+ color: #fbbf24;
1954
+ background: #18181b;
1955
+ padding: 1px 4px;
1956
+ border-radius: 2px;
1957
+ }
1958
+
1959
+ .router-tabs {
1960
+ display: flex;
1961
+ gap: 2px;
1962
+ padding: 8px 12px;
1963
+ background: #27272a;
1964
+ border-bottom: 1px solid #3f3f46;
1965
+ }
1966
+
1967
+ .router-tab {
1968
+ display: flex;
1969
+ align-items: center;
1970
+ gap: 6px;
1971
+ padding: 4px 12px;
1972
+ font-size: 11px;
1973
+ background: transparent;
1974
+ border: none;
1975
+ border-radius: 4px;
1976
+ color: #a1a1aa;
1977
+ cursor: pointer;
1978
+ }
1979
+
1980
+ .router-tab:hover {
1981
+ background: #3f3f46;
1982
+ color: #f4f4f5;
1983
+ }
1984
+
1985
+ .router-tab-active {
1986
+ background: #3b82f6;
1987
+ color: white;
1988
+ }
1989
+
1990
+ .router-tab .pi {
1991
+ font-size: 12px;
1992
+ }
1993
+
1994
+ .tab-badge {
1995
+ background: #f59e0b;
1996
+ color: #18181b;
1997
+ font-size: 10px;
1998
+ padding: 0 5px;
1999
+ border-radius: 8px;
2000
+ font-weight: 600;
2001
+ }
2002
+
2003
+ .tab-count {
2004
+ font-size: 10px;
2005
+ color: #71717a;
2006
+ }
2007
+
2008
+ .router-content {
2009
+ flex: 1;
2010
+ overflow-y: auto;
2011
+ padding: 8px;
2012
+ }
2013
+
2014
+ .router-empty {
2015
+ display: flex;
2016
+ flex-direction: column;
2017
+ align-items: center;
2018
+ justify-content: center;
2019
+ height: 100%;
2020
+ color: #71717a;
2021
+ gap: 8px;
2022
+ }
2023
+
2024
+ .router-empty .pi {
2025
+ font-size: 24px;
2026
+ }
2027
+
2028
+ /* Current Route */
2029
+ .route-current {
2030
+ padding: 8px;
2031
+ }
2032
+
2033
+ .route-header {
2034
+ display: flex;
2035
+ flex-direction: column;
2036
+ gap: 4px;
2037
+ margin-bottom: 12px;
2038
+ }
2039
+
2040
+ .route-name {
2041
+ font-size: 14px;
2042
+ font-weight: 600;
2043
+ color: #3b82f6;
2044
+ }
2045
+
2046
+ .route-path {
2047
+ font-size: 12px;
2048
+ font-family: monospace;
2049
+ color: #a1a1aa;
2050
+ word-break: break-all;
2051
+ }
2052
+
2053
+ /* Router-panel breadcrumb list — namespaced under .router-panel because
2054
+ `.breadcrumb-list` already exists globally for the AppLayout breadcrumb
2055
+ in styles/_main.scss (align-items: center, gap, etc.) and would otherwise
2056
+ clobber these rules. */
2057
+ .router-panel .breadcrumb-list {
2058
+ display: flex;
2059
+ flex-direction: column;
2060
+ align-items: stretch;
2061
+ gap: 4px;
2062
+ }
2063
+
2064
+ .router-panel .breadcrumb-entry {
2065
+ padding: 6px 8px;
2066
+ background: #27272a;
2067
+ border-radius: 4px;
2068
+ font-size: 11px;
2069
+ border-left: 2px solid #3f3f46;
2070
+ }
2071
+
2072
+ .router-panel .breadcrumb-entry-header {
2073
+ display: flex;
2074
+ align-items: center;
2075
+ gap: 8px;
2076
+ }
2077
+
2078
+ .router-panel .breadcrumb-index {
2079
+ width: 16px;
2080
+ height: 16px;
2081
+ display: flex;
2082
+ align-items: center;
2083
+ justify-content: center;
2084
+ background: #3f3f46;
2085
+ border-radius: 50%;
2086
+ font-size: 10px;
2087
+ color: #a1a1aa;
2088
+ }
2089
+
2090
+ .router-panel .breadcrumb-kind {
2091
+ font-weight: 500;
2092
+ color: #f4f4f5;
2093
+ }
2094
+
2095
+ .router-panel .breadcrumb-entry-props {
2096
+ display: flex;
2097
+ flex-wrap: wrap;
2098
+ gap: 12px;
2099
+ padding-left: 24px;
2100
+ margin-top: 4px;
2101
+ }
2102
+
2103
+ .router-panel .breadcrumb-prop {
2104
+ color: #71717a;
2105
+ font-size: 10px;
2106
+ }
2107
+
2108
+ .router-panel .breadcrumb-prop code {
2109
+ color: #60a5fa;
2110
+ background: #18181b;
2111
+ padding: 1px 4px;
2112
+ border-radius: 2px;
2113
+ }
2114
+
2115
+ /* Kind-based colors */
2116
+ .router-panel .breadcrumb-route {
2117
+ border-left-color: #71717a;
2118
+ }
2119
+
2120
+ .router-panel .breadcrumb-entity-list {
2121
+ border-left-color: #3b82f6;
2122
+ }
2123
+
2124
+ .router-panel .breadcrumb-entity-show {
2125
+ border-left-color: #10b981;
2126
+ }
2127
+
2128
+ .router-panel .breadcrumb-entity-edit {
2129
+ border-left-color: #f59e0b;
2130
+ }
2131
+
2132
+ .router-panel .breadcrumb-entity-create {
2133
+ border-left-color: #8b5cf6;
2134
+ }
2135
+
2136
+ .router-panel .breadcrumb-entity-delete {
2137
+ border-left-color: #ef4444;
2138
+ }
2139
+
2140
+ .route-section {
2141
+ margin-bottom: 12px;
2142
+ }
2143
+
2144
+ .section-label {
2145
+ font-size: 10px;
2146
+ font-weight: 600;
2147
+ color: #71717a;
2148
+ text-transform: uppercase;
2149
+ margin-bottom: 4px;
2150
+ }
2151
+
2152
+ .route-hash {
2153
+ font-size: 12px;
2154
+ color: #fbbf24;
2155
+ background: #27272a;
2156
+ padding: 2px 6px;
2157
+ border-radius: 3px;
2158
+ }
2159
+
2160
+ /* Matched Routes */
2161
+ .matched-list {
2162
+ display: flex;
2163
+ flex-direction: column;
2164
+ gap: 4px;
2165
+ }
2166
+
2167
+ .matched-entry {
2168
+ padding: 6px 8px;
2169
+ background: #27272a;
2170
+ border-radius: 4px;
2171
+ font-size: 11px;
2172
+ border-left: 2px solid #3f3f46;
2173
+ }
2174
+
2175
+ .matched-header {
2176
+ display: flex;
2177
+ align-items: center;
2178
+ gap: 8px;
2179
+ }
2180
+
2181
+ .matched-index {
2182
+ width: 16px;
2183
+ height: 16px;
2184
+ display: flex;
2185
+ align-items: center;
2186
+ justify-content: center;
2187
+ background: #3f3f46;
2188
+ border-radius: 50%;
2189
+ font-size: 10px;
2190
+ color: #a1a1aa;
2191
+ }
2192
+
2193
+ .matched-name {
2194
+ font-weight: 500;
2195
+ color: #d4d4d8;
2196
+ }
2197
+
2198
+ .matched-path {
2199
+ font-size: 10px;
2200
+ color: #71717a;
2201
+ font-family: monospace;
2202
+ padding-left: 24px;
2203
+ margin-top: 2px;
2204
+ }
2205
+
2206
+ .matched-meta {
2207
+ padding-left: 24px;
2208
+ margin-top: 4px;
2209
+ }
2210
+
2211
+ /* History */
2212
+ .history-header-bar {
2213
+ display: flex;
2214
+ justify-content: space-between;
2215
+ align-items: center;
2216
+ padding: 8px;
2217
+ background: #27272a;
2218
+ border-radius: 4px;
2219
+ margin-bottom: 8px;
2220
+ }
2221
+
2222
+ .history-stats {
2223
+ font-size: 11px;
2224
+ color: #71717a;
2225
+ }
2226
+
2227
+ .history-max {
2228
+ display: flex;
2229
+ align-items: center;
2230
+ gap: 6px;
2231
+ font-size: 11px;
2232
+ color: #a1a1aa;
2233
+ }
2234
+
2235
+ .max-select {
2236
+ padding: 2px 6px;
2237
+ font-size: 11px;
2238
+ background: #18181b;
2239
+ border: 1px solid #3f3f46;
2240
+ border-radius: 4px;
2241
+ color: #f4f4f5;
2242
+ cursor: pointer;
2243
+ }
2244
+
2245
+ .max-select:focus {
2246
+ border-color: #3b82f6;
2247
+ outline: none;
2248
+ }
2249
+
2250
+ .history-list {
2251
+ display: flex;
2252
+ flex-direction: column;
2253
+ gap: 4px;
2254
+ }
2255
+
2256
+ .history-entry {
2257
+ padding: 8px;
2258
+ background: #27272a;
2259
+ border-radius: 4px;
2260
+ font-size: 12px;
2261
+ }
2262
+
2263
+ .history-entry:hover {
2264
+ background: #3f3f46;
2265
+ }
2266
+
2267
+ .history-new {
2268
+ border-left: 2px solid #f59e0b;
2269
+ padding-left: 6px;
2270
+ }
2271
+
2272
+ .history-header {
2273
+ display: flex;
2274
+ align-items: center;
2275
+ gap: 8px;
2276
+ }
2277
+
2278
+ .history-dot {
2279
+ width: 6px;
2280
+ height: 6px;
2281
+ background: #f59e0b;
2282
+ border-radius: 50%;
2283
+ flex-shrink: 0;
2284
+ }
2285
+
2286
+ .history-time {
2287
+ font-size: 10px;
2288
+ color: #71717a;
2289
+ font-family: monospace;
2290
+ }
2291
+
2292
+ .history-arrow {
2293
+ display: flex;
2294
+ align-items: center;
2295
+ gap: 4px;
2296
+ color: #d4d4d8;
2297
+ }
2298
+
2299
+ .history-arrow .pi {
2300
+ font-size: 10px;
2301
+ color: #52525b;
2302
+ }
2303
+
2304
+ .history-path {
2305
+ font-size: 11px;
2306
+ color: #71717a;
2307
+ font-family: monospace;
2308
+ margin-top: 4px;
2309
+ word-break: break-all;
2310
+ }
2311
+
2312
+ .history-nav-btn {
2313
+ margin-left: auto;
2314
+ display: flex;
2315
+ align-items: center;
2316
+ justify-content: center;
2317
+ width: 20px;
2318
+ height: 20px;
2319
+ background: transparent;
2320
+ border: none;
2321
+ border-radius: 3px;
2322
+ color: #71717a;
2323
+ cursor: pointer;
2324
+ opacity: 0;
2325
+ transition: opacity 0.15s;
2326
+ }
2327
+
2328
+ .history-entry:hover .history-nav-btn {
2329
+ opacity: 1;
2330
+ }
2331
+
2332
+ .history-nav-btn:hover {
2333
+ background: #3f3f46;
2334
+ color: #3b82f6;
2335
+ }
2336
+
2337
+ .history-nav-btn .pi {
2338
+ font-size: 11px;
2339
+ }
2340
+
2341
+ /* Routes */
2342
+ .routes-filter {
2343
+ display: flex;
2344
+ align-items: center;
2345
+ gap: 8px;
2346
+ padding: 8px;
2347
+ background: #27272a;
2348
+ border-radius: 4px;
2349
+ margin-bottom: 8px;
2350
+ }
2351
+
2352
+ .routes-filter .pi {
2353
+ color: #71717a;
2354
+ font-size: 12px;
2355
+ }
2356
+
2357
+ .filter-input {
2358
+ flex: 1;
2359
+ font-size: 12px;
2360
+ padding: 4px 8px;
2361
+ background: #18181b;
2362
+ border: 1px solid #3f3f46;
2363
+ border-radius: 4px;
2364
+ color: #f4f4f5;
2365
+ }
2366
+
2367
+ .filter-input:focus {
2368
+ border-color: #3b82f6;
2369
+ outline: none;
2370
+ }
2371
+
2372
+ .routes-list {
2373
+ display: flex;
2374
+ flex-direction: column;
2375
+ gap: 4px;
2376
+ }
2377
+
2378
+ .route-entry {
2379
+ padding: 8px;
2380
+ background: #27272a;
2381
+ border-radius: 4px;
2382
+ font-size: 12px;
2383
+ }
2384
+
2385
+ .route-entry:hover {
2386
+ background: #3f3f46;
2387
+ }
2388
+
2389
+ .route-current-entry {
2390
+ border-left: 2px solid #3b82f6;
2391
+ padding-left: 6px;
2392
+ }
2393
+
2394
+ .route-internal {
2395
+ opacity: 0.6;
2396
+ }
2397
+
2398
+ .route-internal .route-entry-name {
2399
+ font-style: italic;
2400
+ }
2401
+
2402
+ .route-entry-header {
2403
+ display: flex;
2404
+ align-items: center;
2405
+ gap: 6px;
2406
+ }
2407
+
2408
+ .route-entry-name {
2409
+ font-weight: 500;
2410
+ color: #d4d4d8;
2411
+ }
2412
+
2413
+ .route-no-component {
2414
+ color: #f59e0b;
2415
+ font-size: 10px;
2416
+ }
2417
+
2418
+ .route-entry-path {
2419
+ font-size: 11px;
2420
+ color: #71717a;
2421
+ font-family: monospace;
2422
+ margin-top: 2px;
2423
+ }
2424
+
2425
+ .route-entry-meta {
2426
+ display: flex;
2427
+ gap: 4px;
2428
+ margin-top: 4px;
2429
+ }
2430
+
2431
+ .meta-tag {
2432
+ padding: 1px 6px;
2433
+ font-size: 10px;
2434
+ border-radius: 3px;
2435
+ }
2436
+
2437
+ .meta-public {
2438
+ background: #065f46;
2439
+ color: #6ee7b7;
2440
+ }
2441
+
2442
+ .meta-entity {
2443
+ background: #1e3a5f;
2444
+ color: #93c5fd;
2445
+ }
2446
+
2447
+ .meta-permission {
2448
+ background: #4c1d95;
2449
+ color: #c4b5fd;
2450
+ }
2451
+
2452
+ /* =============================================================================
2453
+ SIGNALS PANEL
2454
+ ============================================================================= */
2455
+ .signals-panel {
2456
+ display: flex;
2457
+ flex-direction: column;
2458
+ height: 100%;
2459
+ overflow-x: hidden;
2460
+ }
2461
+
2462
+ .signals-filter {
2463
+ padding: 8px 12px;
2464
+ background: #27272a;
2465
+ border-bottom: 1px solid #3f3f46;
2466
+ display: flex;
2467
+ flex-direction: column;
2468
+ gap: 6px;
2469
+ }
2470
+
2471
+ .signals-filter-input {
2472
+ display: flex;
2473
+ align-items: center;
2474
+ gap: 8px;
2475
+ }
2476
+
2477
+ .signals-filter-input .pi {
2478
+ color: #71717a;
2479
+ font-size: 12px;
2480
+ }
2481
+
2482
+ .filter-input {
2483
+ flex: 1;
2484
+ font-size: 12px;
2485
+ padding: 4px 8px;
2486
+ background: #18181b;
2487
+ border: 1px solid #3f3f46;
2488
+ border-radius: 4px;
2489
+ color: #f4f4f5;
2490
+ }
2491
+
2492
+ .filter-input:focus {
2493
+ border-color: #8b5cf6;
2494
+ outline: none;
2495
+ }
2496
+
2497
+ .signals-count {
2498
+ font-size: 11px;
2499
+ color: #71717a;
2500
+ min-width: 40px;
2501
+ text-align: right;
2502
+ }
2503
+
2504
+ .signals-max-label {
2505
+ font-size: 10px;
2506
+ color: #52525b;
2507
+ margin-left: 8px;
2508
+ }
2509
+
2510
+ .max-input {
2511
+ width: 50px;
2512
+ font-size: 11px;
2513
+ padding: 2px 4px;
2514
+ background: #18181b;
2515
+ border: 1px solid #3f3f46;
2516
+ border-radius: 3px;
2517
+ color: #a1a1aa;
2518
+ text-align: center;
2519
+ }
2520
+
2521
+ .max-input:focus {
2522
+ border-color: #8b5cf6;
2523
+ outline: none;
2524
+ color: #f4f4f5;
2525
+ }
2526
+
2527
+ .signals-presets {
2528
+ display: flex;
2529
+ gap: 4px;
2530
+ flex-wrap: wrap;
2531
+ }
2532
+
2533
+ .preset-btn {
2534
+ padding: 2px 8px;
2535
+ font-size: 10px;
2536
+ background: #3f3f46;
2537
+ border: none;
2538
+ border-radius: 3px;
2539
+ color: #a1a1aa;
2540
+ cursor: pointer;
2541
+ }
2542
+
2543
+ .preset-btn:hover {
2544
+ background: #52525b;
2545
+ color: #f4f4f5;
2546
+ }
2547
+
2548
+ .preset-active {
2549
+ background: #8b5cf6;
2550
+ color: white;
2551
+ }
2552
+
2553
+ .signals-list {
2554
+ flex: 1;
2555
+ overflow-y: auto;
2556
+ padding: 4px;
2557
+ }
2558
+
2559
+ .signals-empty {
2560
+ display: flex;
2561
+ flex-direction: column;
2562
+ align-items: center;
2563
+ justify-content: center;
2564
+ height: 100%;
2565
+ color: #71717a;
2566
+ gap: 8px;
2567
+ }
2568
+
2569
+ .signal-entry {
2570
+ padding: 6px 8px;
2571
+ margin-bottom: 2px;
2572
+ background: #27272a;
2573
+ border-radius: 4px;
2574
+ font-size: 12px;
2575
+ }
2576
+
2577
+ .signal-entry:hover {
2578
+ background: #3f3f46;
2579
+ }
2580
+
2581
+ .signal-entry.signal-new {
2582
+ border-left: 2px solid #f59e0b;
2583
+ padding-left: 6px;
2584
+ }
2585
+
2586
+ .signal-new-dot {
2587
+ display: inline-block;
2588
+ width: 6px;
2589
+ height: 6px;
2590
+ background: #f59e0b;
2591
+ border-radius: 50%;
2592
+ margin-right: 4px;
2593
+ flex-shrink: 0;
2594
+ }
2595
+
2596
+ .signal-header {
2597
+ display: flex;
2598
+ align-items: center;
2599
+ gap: 8px;
2600
+ }
2601
+
2602
+ .signal-time {
2603
+ font-size: 10px;
2604
+ color: #71717a;
2605
+ font-family: monospace;
2606
+ }
2607
+
2608
+ .signal-name {
2609
+ font-weight: 500;
2610
+ font-family: monospace;
2611
+ }
2612
+
2613
+ .signal-data {
2614
+ margin-top: 4px;
2615
+ padding-left: 12px;
2616
+ font-size: 11px;
2617
+ }
2618
+
2619
+ /* =============================================================================
2620
+ TOASTS PANEL
2621
+ ============================================================================= */
2622
+ .toasts-panel {
2623
+ display: flex;
2624
+ flex-direction: column;
2625
+ }
2626
+
2627
+ .toast-entry {
2628
+ padding: 8px 12px;
2629
+ border-bottom: 1px solid #27272a;
2630
+ border-left: 3px solid;
2631
+ }
2632
+
2633
+ .toast-entry:hover {
2634
+ background: #1f1f23;
2635
+ }
2636
+
2637
+ .toast-success {
2638
+ border-left-color: #22c55e;
2639
+ }
2640
+
2641
+ .toast-info {
2642
+ border-left-color: #3b82f6;
2643
+ }
2644
+
2645
+ .toast-warn {
2646
+ border-left-color: #f59e0b;
2647
+ }
2648
+
2649
+ .toast-error {
2650
+ border-left-color: #ef4444;
2651
+ }
2652
+
2653
+ .toast-header {
2654
+ display: flex;
2655
+ align-items: center;
2656
+ gap: 6px;
2657
+ margin-bottom: 4px;
2658
+ }
2659
+
2660
+ .toast-time {
2661
+ font-family: "JetBrains Mono", monospace;
2662
+ font-size: 10px;
2663
+ color: #71717a;
2664
+ background: #27272a;
2665
+ padding: 1px 4px;
2666
+ border-radius: 2px;
2667
+ }
2668
+
2669
+ .toast-severity {
2670
+ padding: 1px 6px;
2671
+ border-radius: 3px;
2672
+ font-size: 10px;
2673
+ font-weight: 600;
2674
+ text-transform: uppercase;
2675
+ }
2676
+
2677
+ .toast-severity-success {
2678
+ background: #22c55e;
2679
+ color: white;
2680
+ }
2681
+
2682
+ .toast-severity-info {
2683
+ background: #3b82f6;
2684
+ color: white;
2685
+ }
2686
+
2687
+ .toast-severity-warn {
2688
+ background: #f59e0b;
2689
+ color: white;
2690
+ }
2691
+
2692
+ .toast-severity-error {
2693
+ background: #ef4444;
2694
+ color: white;
2695
+ }
2696
+
2697
+ .toast-summary {
2698
+ font-weight: 500;
2699
+ color: #f4f4f5;
2700
+ }
2701
+
2702
+ .toast-detail {
2703
+ color: #a1a1aa;
2704
+ font-size: 11px;
2705
+ margin-top: 4px;
2706
+ }
2707
+
2708
+ .toast-emitter {
2709
+ margin-left: auto;
2710
+ padding: 1px 6px;
2711
+ background: #3f3f46;
2712
+ border-radius: 3px;
2713
+ font-size: 10px;
2714
+ color: #a1a1aa;
2715
+ font-family: "JetBrains Mono", monospace;
2716
+ }
2717
+
2718
+ /* New entry indicator */
2719
+ .entry-new {
2720
+ position: relative;
2721
+ background: rgba(139, 92, 246, 0.08);
2722
+ }
2723
+
2724
+ .entry-new::before {
2725
+ content: "";
2726
+ position: absolute;
2727
+ left: 0;
2728
+ top: 0;
2729
+ bottom: 0;
2730
+ width: 3px;
2731
+ background: #8b5cf6;
2732
+ }
2733
+
2734
+ /* =============================================================================
2735
+ ZONES PANEL
2736
+ ============================================================================= */
2737
+ .zones-panel {
2738
+ padding: 0;
2739
+ display: flex;
2740
+ flex-direction: column;
2741
+ gap: 8px;
2742
+ }
2743
+
2744
+ .zones-panel-content {
2745
+ padding: 0 8px 8px 8px;
2746
+ display: flex;
2747
+ flex-direction: column;
2748
+ gap: 8px;
2749
+ }
2750
+
2751
+ .zones-toolbar {
2752
+ display: flex;
2753
+ align-items: center;
2754
+ gap: 8px;
2755
+ margin-bottom: 4px;
2756
+ }
2757
+
2758
+ .zones-empty {
2759
+ display: flex;
2760
+ flex-direction: column;
2761
+ align-items: center;
2762
+ justify-content: center;
2763
+ gap: 8px;
2764
+ padding: 32px;
2765
+ color: #71717a;
2766
+ font-size: 12px;
2767
+ }
2768
+
2769
+ .zones-empty i {
2770
+ font-size: 24px;
2771
+ }
2772
+
2773
+ .zones-toggle {
2774
+ display: flex;
2775
+ align-items: center;
2776
+ gap: 6px;
2777
+ padding: 4px 10px;
2778
+ background: #3f3f46;
2779
+ border: none;
2780
+ border-radius: 4px;
2781
+ color: #a1a1aa;
2782
+ cursor: pointer;
2783
+ font-size: 11px;
2784
+ }
2785
+
2786
+ .zones-toggle:hover {
2787
+ background: #52525b;
2788
+ color: #f4f4f5;
2789
+ }
2790
+
2791
+ .zones-toggle-on {
2792
+ background: #06b6d4;
2793
+ color: white;
2794
+ }
2795
+
2796
+ .zones-toggle-on:hover {
2797
+ background: #0891b2;
2798
+ }
2799
+
2800
+ .zones-toggle-internal {
2801
+ background: #f59e0b;
2802
+ color: white;
2803
+ }
2804
+
2805
+ .zones-toggle-internal:hover {
2806
+ background: #d97706;
2807
+ }
2808
+
2809
+ .zone-item {
2810
+ background: #27272a;
2811
+ border-radius: 4px;
2812
+ padding: 8px;
2813
+ }
2814
+
2815
+ .zone-header {
2816
+ display: flex;
2817
+ align-items: center;
2818
+ gap: 8px;
2819
+ margin-bottom: 6px;
2820
+ }
2821
+
2822
+ .zone-highlight {
2823
+ display: flex;
2824
+ align-items: center;
2825
+ justify-content: center;
2826
+ width: 22px;
2827
+ height: 22px;
2828
+ padding: 0;
2829
+ background: #3f3f46;
2830
+ border: none;
2831
+ border-radius: 4px;
2832
+ color: #71717a;
2833
+ cursor: pointer;
2834
+ }
2835
+
2836
+ .zone-highlight:hover {
2837
+ background: #52525b;
2838
+ color: #06b6d4;
2839
+ }
2840
+
2841
+ .zone-highlight-active {
2842
+ background: #06b6d4;
2843
+ color: white;
2844
+ }
2845
+
2846
+ .zone-name {
2847
+ font-weight: 600;
2848
+ color: #06b6d4;
2849
+ }
2850
+
2851
+ .zone-count {
2852
+ color: #71717a;
2853
+ font-size: 11px;
2854
+ }
2855
+
2856
+ .zone-blocks {
2857
+ display: flex;
2858
+ flex-direction: column;
2859
+ gap: 4px;
2860
+ margin-left: 30px;
2861
+ }
2862
+
2863
+ .zone-block {
2864
+ display: flex;
2865
+ align-items: center;
2866
+ gap: 8px;
2867
+ font-size: 11px;
2868
+ padding: 2px 6px;
2869
+ background: #1f1f23;
2870
+ border-radius: 2px;
2871
+ }
2872
+
2873
+ .block-id {
2874
+ color: #a78bfa;
2875
+ font-weight: 500;
2876
+ }
2877
+
2878
+ .block-component {
2879
+ color: #d4d4d8;
2880
+ }
2881
+
2882
+ .block-weight {
2883
+ color: #71717a;
2884
+ font-size: 10px;
2885
+ }
2886
+
2887
+ .block-wrappers {
2888
+ color: #f59e0b;
2889
+ }
2890
+
2891
+ .zone-default {
2892
+ color: #71717a;
2893
+ font-size: 11px;
2894
+ margin-left: 30px;
2895
+ }