laminark 2.21.6

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