laminark 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/README.md +147 -0
  2. package/package.json +65 -0
  3. package/plugin/.claude-plugin/plugin.json +13 -0
  4. package/plugin/.mcp.json +12 -0
  5. package/plugin/CLAUDE.md +10 -0
  6. package/plugin/commands/recall.md +55 -0
  7. package/plugin/commands/remember.md +34 -0
  8. package/plugin/commands/resume.md +45 -0
  9. package/plugin/commands/stash.md +34 -0
  10. package/plugin/commands/status.md +33 -0
  11. package/plugin/dist/analysis/worker.d.ts +1 -0
  12. package/plugin/dist/analysis/worker.js +233 -0
  13. package/plugin/dist/analysis/worker.js.map +1 -0
  14. package/plugin/dist/config-t8LZeB-u.mjs +90 -0
  15. package/plugin/dist/config-t8LZeB-u.mjs.map +1 -0
  16. package/plugin/dist/hooks/handler.d.ts +286 -0
  17. package/plugin/dist/hooks/handler.d.ts.map +1 -0
  18. package/plugin/dist/hooks/handler.js +2413 -0
  19. package/plugin/dist/hooks/handler.js.map +1 -0
  20. package/plugin/dist/index.d.ts +447 -0
  21. package/plugin/dist/index.d.ts.map +1 -0
  22. package/plugin/dist/index.js +7334 -0
  23. package/plugin/dist/index.js.map +1 -0
  24. package/plugin/dist/observations-CorAAc1A.d.mts +192 -0
  25. package/plugin/dist/observations-CorAAc1A.d.mts.map +1 -0
  26. package/plugin/dist/tool-registry-e710BvXq.mjs +3574 -0
  27. package/plugin/dist/tool-registry-e710BvXq.mjs.map +1 -0
  28. package/plugin/hooks/hooks.json +78 -0
  29. package/plugin/laminark.db +0 -0
  30. package/plugin/package.json +17 -0
  31. package/plugin/scripts/README.md +65 -0
  32. package/plugin/scripts/bump-version.sh +42 -0
  33. package/plugin/scripts/dev-sync.sh +58 -0
  34. package/plugin/scripts/ensure-deps.sh +15 -0
  35. package/plugin/scripts/install.sh +139 -0
  36. package/plugin/scripts/local-install.sh +138 -0
  37. package/plugin/scripts/uninstall.sh +133 -0
  38. package/plugin/scripts/update.sh +39 -0
  39. package/plugin/scripts/verify-install.sh +87 -0
  40. package/plugin/skills/status/SKILL.md +6 -0
  41. package/plugin/ui/activity.js +197 -0
  42. package/plugin/ui/app.js +1612 -0
  43. package/plugin/ui/graph.js +2560 -0
  44. package/plugin/ui/help/activity-feed.png +0 -0
  45. package/plugin/ui/help/analysis-panel.png +0 -0
  46. package/plugin/ui/help/graph-toolbar.png +0 -0
  47. package/plugin/ui/help/graph-view.png +0 -0
  48. package/plugin/ui/help/settings.png +0 -0
  49. package/plugin/ui/help/timeline.png +0 -0
  50. package/plugin/ui/help.js +932 -0
  51. package/plugin/ui/index.html +756 -0
  52. package/plugin/ui/settings.js +1414 -0
  53. package/plugin/ui/styles.css +3856 -0
  54. package/plugin/ui/timeline.js +652 -0
  55. package/plugin/ui/tools.js +826 -0
@@ -0,0 +1,3856 @@
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 — collapsed by default, expands on hover */
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: 6px;
852
+ backdrop-filter: blur(8px);
853
+ -webkit-backdrop-filter: blur(8px);
854
+ z-index: 5;
855
+ display: flex;
856
+ flex-direction: column;
857
+ gap: 0;
858
+ pointer-events: auto;
859
+ overflow: hidden;
860
+ transition: padding 200ms ease, gap 200ms ease;
861
+ cursor: default;
862
+ }
863
+
864
+ .graph-legend:hover {
865
+ padding: 12px;
866
+ gap: 6px;
867
+ }
868
+
869
+ .graph-legend-title {
870
+ font-size: 10px;
871
+ font-weight: 600;
872
+ text-transform: uppercase;
873
+ letter-spacing: 0.05em;
874
+ color: var(--text-muted);
875
+ margin-bottom: 0;
876
+ white-space: nowrap;
877
+ transition: margin-bottom 200ms ease;
878
+ }
879
+
880
+ .graph-legend:hover .graph-legend-title {
881
+ margin-bottom: 2px;
882
+ }
883
+
884
+ .graph-legend-item {
885
+ display: flex;
886
+ flex-direction: row;
887
+ align-items: center;
888
+ gap: 8px;
889
+ font-size: 12px;
890
+ color: var(--text);
891
+ line-height: 1;
892
+ max-height: 0;
893
+ opacity: 0;
894
+ overflow: hidden;
895
+ transition: max-height 200ms ease, opacity 200ms ease;
896
+ }
897
+
898
+ .graph-legend:hover .graph-legend-item {
899
+ max-height: 20px;
900
+ opacity: 1;
901
+ }
902
+
903
+ .legend-color {
904
+ display: inline-block;
905
+ width: 12px;
906
+ height: 12px;
907
+ flex-shrink: 0;
908
+ }
909
+
910
+ /* Fit-to-view button */
911
+ .fit-btn {
912
+ position: absolute;
913
+ top: 16px;
914
+ right: 16px;
915
+ width: 32px;
916
+ height: 32px;
917
+ background: rgba(13, 17, 23, 0.85);
918
+ border: 1px solid var(--border);
919
+ border-radius: var(--radius);
920
+ color: var(--text-muted);
921
+ cursor: pointer;
922
+ display: flex;
923
+ align-items: center;
924
+ justify-content: center;
925
+ backdrop-filter: blur(8px);
926
+ -webkit-backdrop-filter: blur(8px);
927
+ z-index: 5;
928
+ transition: color var(--transition), border-color var(--transition);
929
+ }
930
+
931
+ .fit-btn:hover {
932
+ color: var(--text);
933
+ border-color: var(--text-muted);
934
+ }
935
+
936
+ /* Graph stats */
937
+ .graph-stats {
938
+ position: absolute;
939
+ top: 16px;
940
+ left: 16px;
941
+ font-size: 12px;
942
+ color: var(--text-muted);
943
+ background: rgba(13, 17, 23, 0.85);
944
+ border: 1px solid var(--border);
945
+ border-radius: var(--radius);
946
+ padding: 4px 10px;
947
+ backdrop-filter: blur(8px);
948
+ -webkit-backdrop-filter: blur(8px);
949
+ z-index: 5;
950
+ pointer-events: none;
951
+ }
952
+
953
+ /* Graph empty state */
954
+ .graph-empty-state {
955
+ position: absolute;
956
+ top: 50%;
957
+ left: 50%;
958
+ transform: translate(-50%, -50%);
959
+ color: var(--text-muted);
960
+ font-size: 14px;
961
+ text-align: center;
962
+ max-width: 300px;
963
+ padding: 24px;
964
+ z-index: 2;
965
+ }
966
+
967
+ /* Performance overlay (Ctrl+Shift+P) */
968
+ .perf-overlay {
969
+ position: absolute;
970
+ top: 48px;
971
+ right: 16px;
972
+ font-family: 'SF Mono', 'Menlo', 'Monaco', 'Consolas', monospace;
973
+ font-size: 11px;
974
+ color: #7ee787;
975
+ background: rgba(13, 17, 23, 0.85);
976
+ border: 1px solid var(--border);
977
+ border-radius: var(--radius);
978
+ padding: 4px 10px;
979
+ backdrop-filter: blur(8px);
980
+ -webkit-backdrop-filter: blur(8px);
981
+ z-index: 6;
982
+ pointer-events: none;
983
+ white-space: nowrap;
984
+ }
985
+
986
+ /* Project selector dropdown */
987
+ .project-selector {
988
+ background: var(--bg);
989
+ color: var(--text);
990
+ border: 1px solid var(--border);
991
+ border-radius: var(--radius);
992
+ padding: 4px 8px;
993
+ font-size: 12px;
994
+ font-family: inherit;
995
+ cursor: pointer;
996
+ max-width: 180px;
997
+ overflow: hidden;
998
+ text-overflow: ellipsis;
999
+ white-space: nowrap;
1000
+ color-scheme: dark;
1001
+ transition: border-color var(--transition);
1002
+ }
1003
+
1004
+ .project-selector:hover {
1005
+ border-color: var(--text-muted);
1006
+ }
1007
+
1008
+ .project-selector:focus {
1009
+ border-color: var(--accent);
1010
+ outline: none;
1011
+ }
1012
+
1013
+ /* Activity view */
1014
+ #activity-view {
1015
+ overflow-y: auto;
1016
+ }
1017
+
1018
+ .activity-feed-header {
1019
+ display: flex;
1020
+ align-items: center;
1021
+ justify-content: space-between;
1022
+ padding: 12px 16px;
1023
+ border-bottom: 1px solid var(--border);
1024
+ background: var(--surface);
1025
+ }
1026
+
1027
+ .activity-feed-header h3 {
1028
+ font-size: 14px;
1029
+ font-weight: 600;
1030
+ color: var(--text);
1031
+ }
1032
+
1033
+ .activity-clear-btn {
1034
+ padding: 3px 10px;
1035
+ background: transparent;
1036
+ border: 1px solid var(--border);
1037
+ border-radius: 12px;
1038
+ color: var(--text-muted);
1039
+ font-size: 11px;
1040
+ cursor: pointer;
1041
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
1042
+ }
1043
+
1044
+ .activity-clear-btn:hover {
1045
+ border-color: var(--text-muted);
1046
+ color: var(--text);
1047
+ }
1048
+
1049
+ .activity-feed {
1050
+ padding: 8px 16px;
1051
+ max-width: 800px;
1052
+ margin: 0 auto;
1053
+ }
1054
+
1055
+ .activity-item {
1056
+ display: flex;
1057
+ align-items: flex-start;
1058
+ gap: 10px;
1059
+ padding: 10px 12px;
1060
+ border-bottom: 1px solid rgba(48, 54, 61, 0.5);
1061
+ }
1062
+
1063
+ .activity-item:last-child {
1064
+ border-bottom: none;
1065
+ }
1066
+
1067
+ .activity-icon {
1068
+ font-size: 16px;
1069
+ flex-shrink: 0;
1070
+ width: 24px;
1071
+ text-align: center;
1072
+ line-height: 1.4;
1073
+ }
1074
+
1075
+ .activity-body {
1076
+ flex: 1;
1077
+ min-width: 0;
1078
+ }
1079
+
1080
+ .activity-title {
1081
+ font-size: 11px;
1082
+ font-weight: 600;
1083
+ text-transform: uppercase;
1084
+ letter-spacing: 0.04em;
1085
+ margin-bottom: 2px;
1086
+ }
1087
+
1088
+ .activity-observation .activity-title { color: var(--accent); }
1089
+ .activity-entity .activity-title { color: var(--color-solution); }
1090
+ .activity-topic-shift .activity-title { color: #f0883e; }
1091
+ .activity-session-start .activity-title { color: var(--success); }
1092
+ .activity-session-end .activity-title { color: var(--text-muted); }
1093
+
1094
+ .activity-desc {
1095
+ font-size: 13px;
1096
+ color: var(--text);
1097
+ line-height: 1.4;
1098
+ overflow: hidden;
1099
+ text-overflow: ellipsis;
1100
+ white-space: nowrap;
1101
+ }
1102
+
1103
+ .activity-time {
1104
+ font-size: 11px;
1105
+ color: var(--text-muted);
1106
+ flex-shrink: 0;
1107
+ white-space: nowrap;
1108
+ font-family: monospace;
1109
+ }
1110
+
1111
+ /* Slide-in animation */
1112
+ @keyframes activitySlideIn {
1113
+ from {
1114
+ opacity: 0;
1115
+ transform: translateY(-8px);
1116
+ }
1117
+ to {
1118
+ opacity: 1;
1119
+ transform: translateY(0);
1120
+ }
1121
+ }
1122
+
1123
+ .activity-slide-in {
1124
+ animation: activitySlideIn 0.25s ease-out;
1125
+ }
1126
+
1127
+ /* Graph breadcrumb bar */
1128
+ .graph-breadcrumbs {
1129
+ display: flex;
1130
+ align-items: center;
1131
+ gap: 4px;
1132
+ padding: 6px 16px;
1133
+ background: var(--surface);
1134
+ border-bottom: 1px solid var(--border);
1135
+ z-index: 6;
1136
+ position: relative;
1137
+ font-size: 12px;
1138
+ flex-shrink: 0;
1139
+ }
1140
+
1141
+ .graph-breadcrumbs.hidden {
1142
+ display: none;
1143
+ }
1144
+
1145
+ .breadcrumb-item {
1146
+ background: transparent;
1147
+ border: 1px solid var(--border);
1148
+ border-radius: 4px;
1149
+ color: var(--accent);
1150
+ font-size: 12px;
1151
+ padding: 2px 10px;
1152
+ cursor: pointer;
1153
+ white-space: nowrap;
1154
+ transition: background 0.15s, color 0.15s;
1155
+ }
1156
+
1157
+ .breadcrumb-item:hover {
1158
+ background: rgba(88, 166, 255, 0.12);
1159
+ }
1160
+
1161
+ .breadcrumb-item.current {
1162
+ color: var(--text);
1163
+ border-color: var(--text-muted);
1164
+ cursor: default;
1165
+ }
1166
+
1167
+ .breadcrumb-item.current:hover {
1168
+ background: transparent;
1169
+ }
1170
+
1171
+ .breadcrumb-separator {
1172
+ color: var(--text-muted);
1173
+ font-size: 11px;
1174
+ user-select: none;
1175
+ }
1176
+
1177
+ /* Graph toolbar (layout selector + fit button) */
1178
+ .graph-toolbar {
1179
+ position: absolute;
1180
+ top: 16px;
1181
+ right: 16px;
1182
+ display: flex;
1183
+ align-items: center;
1184
+ gap: 8px;
1185
+ z-index: 5;
1186
+ }
1187
+
1188
+ .graph-toolbar .fit-btn {
1189
+ position: static;
1190
+ }
1191
+
1192
+ /* Layout selector */
1193
+ .layout-selector {
1194
+ display: flex;
1195
+ gap: 0;
1196
+ background: rgba(13, 17, 23, 0.85);
1197
+ border: 1px solid var(--border);
1198
+ border-radius: var(--radius);
1199
+ overflow: hidden;
1200
+ backdrop-filter: blur(8px);
1201
+ -webkit-backdrop-filter: blur(8px);
1202
+ }
1203
+
1204
+ .layout-btn {
1205
+ padding: 4px 10px;
1206
+ background: transparent;
1207
+ border: none;
1208
+ border-right: 1px solid var(--border);
1209
+ color: var(--text-muted);
1210
+ font-size: 11px;
1211
+ cursor: pointer;
1212
+ white-space: nowrap;
1213
+ transition: background 0.15s, color 0.15s;
1214
+ }
1215
+
1216
+ .layout-btn:last-child {
1217
+ border-right: none;
1218
+ }
1219
+
1220
+ .layout-btn:hover {
1221
+ color: var(--text);
1222
+ background: rgba(255, 255, 255, 0.04);
1223
+ }
1224
+
1225
+ .layout-btn.active {
1226
+ color: var(--accent);
1227
+ background: rgba(88, 166, 255, 0.12);
1228
+ }
1229
+
1230
+ /* Focus-root node glow */
1231
+ @keyframes focusGlow {
1232
+ 0%, 100% { box-shadow: 0 0 8px rgba(88, 166, 255, 0.6); }
1233
+ 50% { box-shadow: 0 0 16px rgba(88, 166, 255, 0.9); }
1234
+ }
1235
+
1236
+ /* Panel header actions (focus + close buttons) */
1237
+ .panel-header-actions {
1238
+ display: flex;
1239
+ align-items: center;
1240
+ gap: 4px;
1241
+ }
1242
+
1243
+ .panel-action-btn {
1244
+ background: none;
1245
+ border: 1px solid var(--border);
1246
+ border-radius: 4px;
1247
+ color: var(--text-muted);
1248
+ cursor: pointer;
1249
+ padding: 3px 6px;
1250
+ display: flex;
1251
+ align-items: center;
1252
+ justify-content: center;
1253
+ transition: color 0.15s, border-color 0.15s, background 0.15s;
1254
+ }
1255
+
1256
+ .panel-action-btn:hover {
1257
+ color: var(--accent);
1258
+ border-color: var(--accent);
1259
+ background: rgba(88, 166, 255, 0.08);
1260
+ }
1261
+
1262
+ /* Settings view */
1263
+ #settings-view {
1264
+ overflow: hidden;
1265
+ }
1266
+
1267
+ #settings-view.active {
1268
+ display: flex;
1269
+ }
1270
+
1271
+ .settings-layout {
1272
+ display: flex;
1273
+ flex: 1;
1274
+ min-height: 0;
1275
+ }
1276
+
1277
+ .settings-sidebar {
1278
+ width: 200px;
1279
+ flex-shrink: 0;
1280
+ border-right: 1px solid var(--border);
1281
+ display: flex;
1282
+ flex-direction: column;
1283
+ padding: 12px 0;
1284
+ background: var(--surface);
1285
+ overflow-y: auto;
1286
+ }
1287
+
1288
+ .settings-sidebar-item {
1289
+ padding: 10px 16px;
1290
+ cursor: pointer;
1291
+ font-size: 13px;
1292
+ font-weight: 500;
1293
+ color: var(--text-muted);
1294
+ border-radius: 4px;
1295
+ margin: 2px 8px;
1296
+ transition: background 0.15s, color 0.15s;
1297
+ user-select: none;
1298
+ }
1299
+
1300
+ .settings-sidebar-item:hover {
1301
+ background: rgba(255, 255, 255, 0.04);
1302
+ color: var(--text);
1303
+ }
1304
+
1305
+ .settings-sidebar-item.active {
1306
+ background: rgba(88, 166, 255, 0.1);
1307
+ color: var(--accent);
1308
+ }
1309
+
1310
+ .settings-sidebar-item-danger {
1311
+ margin-top: auto;
1312
+ }
1313
+
1314
+ .settings-sidebar-item-danger.active {
1315
+ background: rgba(248, 81, 73, 0.1);
1316
+ color: var(--danger);
1317
+ }
1318
+
1319
+ .settings-content {
1320
+ flex: 1;
1321
+ overflow-y: auto;
1322
+ padding: 24px;
1323
+ min-width: 0;
1324
+ }
1325
+
1326
+ .settings-panel {
1327
+ display: none;
1328
+ }
1329
+
1330
+ .settings-panel.active {
1331
+ display: block;
1332
+ }
1333
+
1334
+ .settings-heading {
1335
+ font-size: 16px;
1336
+ font-weight: 600;
1337
+ color: var(--text);
1338
+ margin-bottom: 16px;
1339
+ }
1340
+
1341
+ .settings-heading-danger {
1342
+ color: var(--danger);
1343
+ margin-top: 32px;
1344
+ }
1345
+
1346
+ /* Stat cards grid */
1347
+ .db-stats-grid {
1348
+ display: grid;
1349
+ grid-template-columns: repeat(auto-fill, minmax(140px, 1fr));
1350
+ gap: 12px;
1351
+ margin-bottom: 8px;
1352
+ }
1353
+
1354
+ .stat-card {
1355
+ background: var(--surface);
1356
+ border: 1px solid var(--border);
1357
+ border-radius: var(--radius);
1358
+ padding: 16px;
1359
+ text-align: center;
1360
+ }
1361
+
1362
+ .stat-value {
1363
+ font-size: 24px;
1364
+ font-weight: 700;
1365
+ color: var(--accent);
1366
+ font-variant-numeric: tabular-nums;
1367
+ }
1368
+
1369
+ .stat-label {
1370
+ font-size: 11px;
1371
+ color: var(--text-muted);
1372
+ margin-top: 4px;
1373
+ text-transform: uppercase;
1374
+ letter-spacing: 0.04em;
1375
+ }
1376
+
1377
+ .system-info-grid {
1378
+ grid-template-columns: repeat(auto-fill, minmax(170px, 1fr));
1379
+ }
1380
+
1381
+ .system-info-grid .stat-value {
1382
+ font-size: 16px;
1383
+ }
1384
+
1385
+ /* Success message */
1386
+ .settings-success {
1387
+ padding: 10px 14px;
1388
+ background: rgba(63, 185, 80, 0.12);
1389
+ border: 1px solid var(--success);
1390
+ border-radius: var(--radius);
1391
+ color: var(--success);
1392
+ font-size: 13px;
1393
+ margin-bottom: 16px;
1394
+ }
1395
+
1396
+ .settings-success.hidden {
1397
+ display: none;
1398
+ }
1399
+
1400
+ /* Scope selector */
1401
+ .settings-scope {
1402
+ display: flex;
1403
+ gap: 16px;
1404
+ margin-bottom: 16px;
1405
+ }
1406
+
1407
+ .scope-radio {
1408
+ display: flex;
1409
+ align-items: center;
1410
+ gap: 6px;
1411
+ font-size: 13px;
1412
+ color: var(--text);
1413
+ cursor: pointer;
1414
+ }
1415
+
1416
+ .scope-radio input[type="radio"] {
1417
+ accent-color: var(--accent);
1418
+ }
1419
+
1420
+ /* Danger zone */
1421
+ .danger-zone {
1422
+ border: 1px solid rgba(248, 81, 73, 0.4);
1423
+ border-radius: var(--radius);
1424
+ overflow: hidden;
1425
+ }
1426
+
1427
+ .reset-action-card {
1428
+ display: flex;
1429
+ align-items: center;
1430
+ justify-content: space-between;
1431
+ gap: 16px;
1432
+ padding: 16px;
1433
+ border-bottom: 1px solid var(--border);
1434
+ }
1435
+
1436
+ .reset-action-card:last-child {
1437
+ border-bottom: none;
1438
+ }
1439
+
1440
+ .reset-action-card-destructive {
1441
+ background: rgba(248, 81, 73, 0.04);
1442
+ }
1443
+
1444
+ .reset-action-info h3 {
1445
+ font-size: 14px;
1446
+ font-weight: 600;
1447
+ color: var(--text);
1448
+ margin-bottom: 2px;
1449
+ }
1450
+
1451
+ .reset-action-info p {
1452
+ font-size: 12px;
1453
+ color: var(--text-muted);
1454
+ }
1455
+
1456
+ .btn-danger {
1457
+ padding: 6px 14px;
1458
+ background: transparent;
1459
+ border: 1px solid rgba(248, 81, 73, 0.5);
1460
+ border-radius: var(--radius);
1461
+ color: var(--danger);
1462
+ font-size: 12px;
1463
+ font-weight: 500;
1464
+ cursor: pointer;
1465
+ white-space: nowrap;
1466
+ transition: background 0.15s, border-color 0.15s;
1467
+ }
1468
+
1469
+ .btn-danger:hover {
1470
+ background: rgba(248, 81, 73, 0.1);
1471
+ border-color: var(--danger);
1472
+ }
1473
+
1474
+ .btn-danger-primary {
1475
+ padding: 6px 14px;
1476
+ background: var(--danger);
1477
+ border: 1px solid var(--danger);
1478
+ border-radius: var(--radius);
1479
+ color: #fff;
1480
+ font-size: 12px;
1481
+ font-weight: 600;
1482
+ cursor: pointer;
1483
+ white-space: nowrap;
1484
+ transition: background 0.15s, opacity 0.15s;
1485
+ }
1486
+
1487
+ .btn-danger-primary:hover {
1488
+ background: #da3633;
1489
+ }
1490
+
1491
+ .btn-danger-primary:disabled {
1492
+ opacity: 0.5;
1493
+ cursor: not-allowed;
1494
+ }
1495
+
1496
+ /* Confirmation modal */
1497
+ .confirm-overlay {
1498
+ position: fixed;
1499
+ inset: 0;
1500
+ background: rgba(0, 0, 0, 0.6);
1501
+ display: flex;
1502
+ align-items: center;
1503
+ justify-content: center;
1504
+ z-index: 100;
1505
+ backdrop-filter: blur(2px);
1506
+ }
1507
+
1508
+ .confirm-overlay.hidden {
1509
+ display: none;
1510
+ }
1511
+
1512
+ .confirm-dialog {
1513
+ background: var(--surface);
1514
+ border: 1px solid var(--border);
1515
+ border-radius: 12px;
1516
+ padding: 24px;
1517
+ max-width: 440px;
1518
+ width: 90%;
1519
+ }
1520
+
1521
+ .confirm-dialog h3 {
1522
+ font-size: 16px;
1523
+ font-weight: 600;
1524
+ color: var(--danger);
1525
+ margin-bottom: 12px;
1526
+ }
1527
+
1528
+ .confirm-dialog p {
1529
+ font-size: 13px;
1530
+ color: var(--text);
1531
+ margin-bottom: 8px;
1532
+ line-height: 1.5;
1533
+ }
1534
+
1535
+ .confirm-count {
1536
+ font-size: 13px;
1537
+ font-weight: 600;
1538
+ color: var(--warning);
1539
+ margin-bottom: 16px;
1540
+ }
1541
+
1542
+ .confirm-input {
1543
+ width: 100%;
1544
+ padding: 8px 12px;
1545
+ background: var(--bg);
1546
+ border: 1px solid var(--border);
1547
+ border-radius: var(--radius);
1548
+ color: var(--text);
1549
+ font-size: 14px;
1550
+ font-family: inherit;
1551
+ margin-bottom: 16px;
1552
+ }
1553
+
1554
+ .confirm-input:focus {
1555
+ border-color: var(--danger);
1556
+ outline: none;
1557
+ }
1558
+
1559
+ .confirm-actions {
1560
+ display: flex;
1561
+ justify-content: flex-end;
1562
+ gap: 8px;
1563
+ }
1564
+
1565
+ .btn-secondary {
1566
+ padding: 6px 14px;
1567
+ background: transparent;
1568
+ border: 1px solid var(--border);
1569
+ border-radius: var(--radius);
1570
+ color: var(--text);
1571
+ font-size: 12px;
1572
+ font-weight: 500;
1573
+ cursor: pointer;
1574
+ transition: background 0.15s, border-color 0.15s;
1575
+ }
1576
+
1577
+ .btn-secondary:hover {
1578
+ background: rgba(255, 255, 255, 0.04);
1579
+ border-color: var(--text-muted);
1580
+ }
1581
+
1582
+ /* =========================================================================
1583
+ * Graph Search
1584
+ * ========================================================================= */
1585
+
1586
+ .filter-search-wrapper {
1587
+ position: relative;
1588
+ margin-left: auto;
1589
+ flex-shrink: 0;
1590
+ }
1591
+
1592
+ .graph-search-input {
1593
+ width: 180px;
1594
+ padding: 4px 10px;
1595
+ background: var(--bg);
1596
+ border: 1px solid var(--border);
1597
+ border-radius: 14px;
1598
+ color: var(--text);
1599
+ font-size: 12px;
1600
+ font-family: inherit;
1601
+ transition: border-color var(--transition), width var(--transition);
1602
+ }
1603
+
1604
+ .graph-search-input:focus {
1605
+ border-color: var(--accent);
1606
+ outline: none;
1607
+ width: 240px;
1608
+ }
1609
+
1610
+ .graph-search-input::placeholder {
1611
+ color: var(--text-muted);
1612
+ }
1613
+
1614
+ .search-results-dropdown {
1615
+ position: absolute;
1616
+ top: calc(100% + 4px);
1617
+ right: 0;
1618
+ width: 320px;
1619
+ max-height: 360px;
1620
+ overflow-y: auto;
1621
+ background: var(--surface);
1622
+ border: 1px solid var(--border);
1623
+ border-radius: var(--radius);
1624
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1625
+ z-index: 50;
1626
+ }
1627
+
1628
+ .search-results-dropdown.hidden {
1629
+ display: none;
1630
+ }
1631
+
1632
+ .search-result-item {
1633
+ display: flex;
1634
+ align-items: center;
1635
+ gap: 8px;
1636
+ padding: 8px 12px;
1637
+ cursor: pointer;
1638
+ transition: background 0.1s;
1639
+ border-bottom: 1px solid rgba(48, 54, 61, 0.5);
1640
+ }
1641
+
1642
+ .search-result-item:last-child {
1643
+ border-bottom: none;
1644
+ }
1645
+
1646
+ .search-result-item:hover,
1647
+ .search-result-item.active {
1648
+ background: rgba(88, 166, 255, 0.08);
1649
+ }
1650
+
1651
+ .search-result-dot {
1652
+ width: 8px;
1653
+ height: 8px;
1654
+ border-radius: 50%;
1655
+ flex-shrink: 0;
1656
+ }
1657
+
1658
+ .search-result-label {
1659
+ font-size: 13px;
1660
+ color: var(--text);
1661
+ flex: 1;
1662
+ min-width: 0;
1663
+ overflow: hidden;
1664
+ text-overflow: ellipsis;
1665
+ white-space: nowrap;
1666
+ }
1667
+
1668
+ .search-result-type {
1669
+ font-size: 10px;
1670
+ color: var(--text-muted);
1671
+ flex-shrink: 0;
1672
+ }
1673
+
1674
+ .search-result-snippet {
1675
+ font-size: 11px;
1676
+ color: var(--text-muted);
1677
+ margin-top: 2px;
1678
+ overflow: hidden;
1679
+ text-overflow: ellipsis;
1680
+ white-space: nowrap;
1681
+ }
1682
+
1683
+ .search-result-source {
1684
+ font-size: 10px;
1685
+ color: var(--text-muted);
1686
+ opacity: 0.6;
1687
+ flex-shrink: 0;
1688
+ }
1689
+
1690
+ .search-no-results {
1691
+ padding: 12px;
1692
+ text-align: center;
1693
+ color: var(--text-muted);
1694
+ font-size: 12px;
1695
+ }
1696
+
1697
+ /* Search highlight/dimmed states on graph nodes */
1698
+ .search-dimmed {
1699
+ opacity: 0.15 !important;
1700
+ }
1701
+
1702
+ .search-match {
1703
+ border-width: 3px !important;
1704
+ border-color: #d29922 !important;
1705
+ }
1706
+
1707
+ /* =========================================================================
1708
+ * Graph Context Menu
1709
+ * ========================================================================= */
1710
+
1711
+ .graph-context-menu {
1712
+ position: fixed;
1713
+ z-index: 60;
1714
+ min-width: 180px;
1715
+ max-width: 260px;
1716
+ background: var(--surface);
1717
+ border: 1px solid var(--border);
1718
+ border-radius: 8px;
1719
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
1720
+ padding: 4px 0;
1721
+ font-size: 13px;
1722
+ }
1723
+
1724
+ .graph-context-menu.hidden {
1725
+ display: none;
1726
+ }
1727
+
1728
+ .context-menu-header {
1729
+ padding: 6px 12px 2px;
1730
+ font-size: 10px;
1731
+ text-transform: uppercase;
1732
+ letter-spacing: 0.05em;
1733
+ color: var(--text-muted);
1734
+ user-select: none;
1735
+ }
1736
+
1737
+ .context-menu-item {
1738
+ display: flex;
1739
+ align-items: center;
1740
+ gap: 8px;
1741
+ padding: 6px 12px;
1742
+ color: var(--text-primary);
1743
+ cursor: pointer;
1744
+ white-space: nowrap;
1745
+ user-select: none;
1746
+ }
1747
+
1748
+ .context-menu-item:hover {
1749
+ background: rgba(56, 139, 253, 0.15);
1750
+ }
1751
+
1752
+ .context-menu-item .type-dot {
1753
+ width: 8px;
1754
+ height: 8px;
1755
+ border-radius: 50%;
1756
+ flex-shrink: 0;
1757
+ }
1758
+
1759
+ .context-menu-divider {
1760
+ height: 1px;
1761
+ margin: 4px 0;
1762
+ background: var(--border);
1763
+ }
1764
+
1765
+ /* =========================================================================
1766
+ * Analysis Panel (left sidebar)
1767
+ * ========================================================================= */
1768
+
1769
+ .analysis-panel {
1770
+ width: 320px;
1771
+ flex-shrink: 0;
1772
+ background: var(--surface);
1773
+ border-left: 1px solid var(--border);
1774
+ display: flex;
1775
+ flex-direction: column;
1776
+ overflow: hidden;
1777
+ transition: width var(--transition), opacity var(--transition);
1778
+ }
1779
+
1780
+ .analysis-panel.hidden {
1781
+ width: 0;
1782
+ opacity: 0;
1783
+ pointer-events: none;
1784
+ border-left: none;
1785
+ }
1786
+
1787
+ .analysis-panel .panel-header {
1788
+ display: flex;
1789
+ align-items: center;
1790
+ justify-content: space-between;
1791
+ padding: 12px 16px;
1792
+ border-bottom: 1px solid var(--border);
1793
+ flex-shrink: 0;
1794
+ }
1795
+
1796
+ .analysis-panel .panel-header h3 {
1797
+ font-size: 14px;
1798
+ font-weight: 600;
1799
+ color: var(--text);
1800
+ }
1801
+
1802
+ #analysis-close {
1803
+ background: none;
1804
+ border: none;
1805
+ color: var(--text-muted);
1806
+ font-size: 20px;
1807
+ cursor: pointer;
1808
+ padding: 0 4px;
1809
+ line-height: 1;
1810
+ }
1811
+
1812
+ #analysis-close:hover {
1813
+ color: var(--text);
1814
+ }
1815
+
1816
+ .analysis-body {
1817
+ flex: 1;
1818
+ overflow-y: auto;
1819
+ overflow-x: hidden;
1820
+ padding: 16px;
1821
+ min-width: 0;
1822
+ }
1823
+
1824
+ /* Analysis sections */
1825
+ .analysis-section {
1826
+ margin-bottom: 20px;
1827
+ }
1828
+
1829
+ .analysis-section-title {
1830
+ font-size: 11px;
1831
+ font-weight: 600;
1832
+ text-transform: uppercase;
1833
+ letter-spacing: 0.05em;
1834
+ color: var(--text-muted);
1835
+ margin-bottom: 8px;
1836
+ }
1837
+
1838
+ /* Bar chart rows */
1839
+ .analysis-bar-row {
1840
+ display: flex;
1841
+ align-items: center;
1842
+ gap: 8px;
1843
+ margin-bottom: 4px;
1844
+ font-size: 12px;
1845
+ }
1846
+
1847
+ .analysis-bar-label {
1848
+ width: 90px;
1849
+ color: var(--text);
1850
+ white-space: nowrap;
1851
+ overflow: hidden;
1852
+ text-overflow: ellipsis;
1853
+ flex-shrink: 0;
1854
+ }
1855
+
1856
+ .analysis-bar-track {
1857
+ flex: 1;
1858
+ height: 14px;
1859
+ background: rgba(255, 255, 255, 0.04);
1860
+ border-radius: 3px;
1861
+ overflow: hidden;
1862
+ }
1863
+
1864
+ .analysis-bar-fill {
1865
+ height: 100%;
1866
+ border-radius: 3px;
1867
+ transition: width 0.3s ease;
1868
+ }
1869
+
1870
+ .analysis-bar-count {
1871
+ width: 32px;
1872
+ text-align: right;
1873
+ color: var(--text-muted);
1874
+ font-size: 11px;
1875
+ flex-shrink: 0;
1876
+ font-variant-numeric: tabular-nums;
1877
+ }
1878
+
1879
+ /* Top entity list */
1880
+ .analysis-entity-item {
1881
+ display: flex;
1882
+ align-items: center;
1883
+ gap: 8px;
1884
+ padding: 6px 8px;
1885
+ border-radius: 4px;
1886
+ cursor: pointer;
1887
+ transition: background 0.15s;
1888
+ margin-bottom: 2px;
1889
+ }
1890
+
1891
+ .analysis-entity-item:hover {
1892
+ background: rgba(255, 255, 255, 0.04);
1893
+ }
1894
+
1895
+ .analysis-entity-dot {
1896
+ width: 8px;
1897
+ height: 8px;
1898
+ border-radius: 50%;
1899
+ flex-shrink: 0;
1900
+ }
1901
+
1902
+ .analysis-entity-name {
1903
+ flex: 1;
1904
+ font-size: 12px;
1905
+ color: var(--text);
1906
+ min-width: 0;
1907
+ overflow: hidden;
1908
+ text-overflow: ellipsis;
1909
+ white-space: nowrap;
1910
+ }
1911
+
1912
+ .analysis-entity-degree {
1913
+ font-size: 11px;
1914
+ color: var(--text-muted);
1915
+ flex-shrink: 0;
1916
+ font-variant-numeric: tabular-nums;
1917
+ }
1918
+
1919
+ /* Cluster cards */
1920
+ .analysis-cluster-card {
1921
+ padding: 8px 10px;
1922
+ background: rgba(255, 255, 255, 0.02);
1923
+ border: 1px solid var(--border);
1924
+ border-radius: var(--radius);
1925
+ margin-bottom: 6px;
1926
+ cursor: pointer;
1927
+ transition: background 0.15s, border-color 0.15s;
1928
+ }
1929
+
1930
+ .analysis-cluster-card:hover {
1931
+ background: rgba(88, 166, 255, 0.06);
1932
+ border-color: var(--accent);
1933
+ }
1934
+
1935
+ .analysis-cluster-label {
1936
+ font-size: 12px;
1937
+ font-weight: 500;
1938
+ color: var(--text);
1939
+ margin-bottom: 2px;
1940
+ }
1941
+
1942
+ .analysis-cluster-meta {
1943
+ font-size: 11px;
1944
+ color: var(--text-muted);
1945
+ }
1946
+
1947
+ /* Recent activity stat row */
1948
+ .analysis-stat-row {
1949
+ display: flex;
1950
+ justify-content: space-between;
1951
+ padding: 4px 0;
1952
+ font-size: 12px;
1953
+ }
1954
+
1955
+ .analysis-stat-label {
1956
+ color: var(--text-muted);
1957
+ }
1958
+
1959
+ .analysis-stat-value {
1960
+ color: var(--text);
1961
+ font-weight: 500;
1962
+ font-variant-numeric: tabular-nums;
1963
+ }
1964
+
1965
+ /* Analysis button in toolbar */
1966
+ /* Edge label toggle button */
1967
+ .edge-labels-btn {
1968
+ width: 32px;
1969
+ height: 32px;
1970
+ background: rgba(13, 17, 23, 0.85);
1971
+ border: 1px solid var(--border);
1972
+ border-radius: var(--radius);
1973
+ color: var(--text-muted);
1974
+ cursor: pointer;
1975
+ display: flex;
1976
+ align-items: center;
1977
+ justify-content: center;
1978
+ backdrop-filter: blur(8px);
1979
+ -webkit-backdrop-filter: blur(8px);
1980
+ transition: color var(--transition), border-color var(--transition);
1981
+ font-size: 11px;
1982
+ font-weight: 600;
1983
+ }
1984
+
1985
+ .edge-labels-btn:hover {
1986
+ color: var(--text);
1987
+ border-color: var(--text-muted);
1988
+ }
1989
+
1990
+ .edge-labels-btn.active {
1991
+ color: var(--accent);
1992
+ border-color: var(--accent);
1993
+ }
1994
+
1995
+ /* Edge labels dropdown */
1996
+ .edge-labels-dropdown {
1997
+ position: absolute;
1998
+ top: calc(100% + 6px);
1999
+ right: 0;
2000
+ min-width: 180px;
2001
+ background: var(--surface);
2002
+ border: 1px solid var(--border);
2003
+ border-radius: var(--radius);
2004
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
2005
+ padding: 4px 0;
2006
+ z-index: 50;
2007
+ }
2008
+
2009
+ .edge-labels-dropdown.hidden {
2010
+ display: none;
2011
+ }
2012
+
2013
+ .edge-labels-dropdown-item {
2014
+ display: flex;
2015
+ align-items: center;
2016
+ gap: 8px;
2017
+ padding: 5px 12px;
2018
+ font-size: 12px;
2019
+ cursor: pointer;
2020
+ transition: background 0.1s;
2021
+ }
2022
+
2023
+ .edge-labels-dropdown-item:hover {
2024
+ background: rgba(255, 255, 255, 0.04);
2025
+ }
2026
+
2027
+ .edge-labels-dropdown-item label {
2028
+ cursor: pointer;
2029
+ color: var(--text);
2030
+ flex: 1;
2031
+ }
2032
+
2033
+ .edge-labels-dropdown-item input[type="checkbox"] {
2034
+ accent-color: var(--accent);
2035
+ cursor: pointer;
2036
+ }
2037
+
2038
+ .edge-labels-dropdown-divider {
2039
+ height: 1px;
2040
+ margin: 4px 0;
2041
+ background: var(--border);
2042
+ }
2043
+
2044
+ .edge-type-dot {
2045
+ width: 8px;
2046
+ height: 8px;
2047
+ border-radius: 50%;
2048
+ flex-shrink: 0;
2049
+ }
2050
+
2051
+ .analysis-btn {
2052
+ width: 32px;
2053
+ height: 32px;
2054
+ background: rgba(13, 17, 23, 0.85);
2055
+ border: 1px solid var(--border);
2056
+ border-radius: var(--radius);
2057
+ color: var(--text-muted);
2058
+ cursor: pointer;
2059
+ display: flex;
2060
+ align-items: center;
2061
+ justify-content: center;
2062
+ backdrop-filter: blur(8px);
2063
+ -webkit-backdrop-filter: blur(8px);
2064
+ transition: color var(--transition), border-color var(--transition);
2065
+ }
2066
+
2067
+ .analysis-btn:hover {
2068
+ color: var(--text);
2069
+ border-color: var(--text-muted);
2070
+ }
2071
+
2072
+ .analysis-btn.active {
2073
+ color: var(--accent);
2074
+ border-color: var(--accent);
2075
+ }
2076
+
2077
+ /* Responsive: analysis panel full-width on mobile */
2078
+ @media (max-width: 768px) {
2079
+ .graph-content-row {
2080
+ flex-direction: column;
2081
+ }
2082
+ .analysis-panel {
2083
+ width: 100%;
2084
+ border-left: none;
2085
+ border-top: 1px solid var(--border);
2086
+ max-height: 50%;
2087
+ }
2088
+ .analysis-panel.hidden {
2089
+ width: 100%;
2090
+ height: 0;
2091
+ }
2092
+ }
2093
+
2094
+ /* =========================================================================
2095
+ * Help View — Sidebar Tree Layout
2096
+ * ========================================================================= */
2097
+
2098
+ #help-view {
2099
+ overflow: hidden;
2100
+ }
2101
+
2102
+ #help-view.active {
2103
+ display: flex;
2104
+ flex-direction: row;
2105
+ }
2106
+
2107
+ /* Sidebar */
2108
+ .help-sidebar {
2109
+ width: 240px;
2110
+ flex-shrink: 0;
2111
+ border-right: 1px solid var(--border);
2112
+ display: flex;
2113
+ flex-direction: column;
2114
+ overflow: hidden;
2115
+ background: var(--surface);
2116
+ }
2117
+
2118
+ .help-sidebar-search {
2119
+ padding: 12px;
2120
+ border-bottom: 1px solid var(--border);
2121
+ flex-shrink: 0;
2122
+ }
2123
+
2124
+ .help-tree-container {
2125
+ flex: 1;
2126
+ overflow-y: auto;
2127
+ padding: 8px 0;
2128
+ }
2129
+
2130
+ .help-tree {
2131
+ list-style: none;
2132
+ padding: 0;
2133
+ margin: 0;
2134
+ }
2135
+
2136
+ .help-tree-item {
2137
+ user-select: none;
2138
+ }
2139
+
2140
+ .help-tree-label {
2141
+ display: flex;
2142
+ align-items: center;
2143
+ gap: 6px;
2144
+ padding: 7px 12px;
2145
+ cursor: pointer;
2146
+ font-size: 13px;
2147
+ color: var(--text-muted);
2148
+ border-radius: 4px;
2149
+ margin: 0 8px;
2150
+ transition: background 0.15s, color 0.15s;
2151
+ }
2152
+
2153
+ .help-tree-label:hover {
2154
+ background: rgba(255, 255, 255, 0.04);
2155
+ color: var(--text);
2156
+ }
2157
+
2158
+ .help-tree-label.active {
2159
+ background: rgba(88, 166, 255, 0.1);
2160
+ color: var(--accent);
2161
+ }
2162
+
2163
+ .help-tree-toggle {
2164
+ width: 16px;
2165
+ flex-shrink: 0;
2166
+ font-size: 10px;
2167
+ color: var(--text-muted);
2168
+ transition: transform 0.15s;
2169
+ text-align: center;
2170
+ }
2171
+
2172
+ .help-tree-item.expanded > .help-tree-label .help-tree-toggle {
2173
+ transform: rotate(90deg);
2174
+ }
2175
+
2176
+ .help-tree-children {
2177
+ list-style: none;
2178
+ padding: 0 0 0 20px;
2179
+ margin: 0;
2180
+ display: none;
2181
+ }
2182
+
2183
+ .help-tree-item.expanded > .help-tree-children {
2184
+ display: block;
2185
+ }
2186
+
2187
+ .help-tree-child-label {
2188
+ display: block;
2189
+ padding: 5px 12px;
2190
+ cursor: pointer;
2191
+ font-size: 12px;
2192
+ color: var(--text-muted);
2193
+ border-radius: 4px;
2194
+ margin: 0 8px;
2195
+ transition: background 0.15s, color 0.15s;
2196
+ }
2197
+
2198
+ .help-tree-child-label:hover {
2199
+ background: rgba(255, 255, 255, 0.04);
2200
+ color: var(--text);
2201
+ }
2202
+
2203
+ .help-tree-child-label.active {
2204
+ color: var(--accent);
2205
+ }
2206
+
2207
+ /* Content area */
2208
+ .help-content-area {
2209
+ flex: 1;
2210
+ overflow-y: auto;
2211
+ padding: 24px 32px;
2212
+ min-width: 0;
2213
+ }
2214
+
2215
+ .help-section {
2216
+ margin-bottom: 0;
2217
+ }
2218
+
2219
+ .help-section-title {
2220
+ font-size: 18px;
2221
+ font-weight: 600;
2222
+ color: var(--text);
2223
+ margin-bottom: 16px;
2224
+ padding-bottom: 8px;
2225
+ border-bottom: 1px solid var(--border);
2226
+ }
2227
+
2228
+ .help-intro {
2229
+ font-size: 13px;
2230
+ color: var(--text);
2231
+ line-height: 1.6;
2232
+ margin-bottom: 16px;
2233
+ }
2234
+
2235
+ .help-cards {
2236
+ display: grid;
2237
+ grid-template-columns: repeat(auto-fill, minmax(320px, 1fr));
2238
+ gap: 10px;
2239
+ }
2240
+
2241
+ .help-card {
2242
+ background: var(--surface);
2243
+ border: 1px solid var(--border);
2244
+ border-radius: var(--radius);
2245
+ padding: 12px 14px;
2246
+ }
2247
+
2248
+ .help-card-name {
2249
+ font-size: 13px;
2250
+ font-weight: 600;
2251
+ color: var(--accent);
2252
+ font-family: 'SF Mono', 'Menlo', 'Monaco', 'Consolas', monospace;
2253
+ margin-bottom: 4px;
2254
+ }
2255
+
2256
+ .help-card-desc {
2257
+ font-size: 12px;
2258
+ color: var(--text-muted);
2259
+ line-height: 1.4;
2260
+ }
2261
+
2262
+ .help-entity-list {
2263
+ display: flex;
2264
+ flex-direction: column;
2265
+ gap: 8px;
2266
+ }
2267
+
2268
+ .help-entity-item {
2269
+ display: flex;
2270
+ align-items: center;
2271
+ gap: 10px;
2272
+ font-size: 13px;
2273
+ }
2274
+
2275
+ .help-entity-dot {
2276
+ width: 10px;
2277
+ height: 10px;
2278
+ border-radius: 50%;
2279
+ flex-shrink: 0;
2280
+ }
2281
+
2282
+ .help-entity-name {
2283
+ font-weight: 600;
2284
+ color: var(--text);
2285
+ min-width: 70px;
2286
+ }
2287
+
2288
+ .help-entity-desc {
2289
+ color: var(--text-muted);
2290
+ }
2291
+
2292
+ .help-shortcuts {
2293
+ width: 100%;
2294
+ border-collapse: collapse;
2295
+ }
2296
+
2297
+ .help-shortcuts td {
2298
+ padding: 6px 8px;
2299
+ font-size: 13px;
2300
+ border-bottom: 1px solid rgba(48, 54, 61, 0.5);
2301
+ }
2302
+
2303
+ .help-shortcuts td:first-child {
2304
+ white-space: nowrap;
2305
+ width: 180px;
2306
+ }
2307
+
2308
+ .help-shortcuts td:last-child {
2309
+ color: var(--text-muted);
2310
+ }
2311
+
2312
+ .help-shortcuts kbd {
2313
+ display: inline-block;
2314
+ padding: 2px 6px;
2315
+ font-size: 11px;
2316
+ font-family: 'SF Mono', 'Menlo', 'Monaco', 'Consolas', monospace;
2317
+ color: var(--text);
2318
+ background: var(--bg);
2319
+ border: 1px solid var(--border);
2320
+ border-radius: 3px;
2321
+ }
2322
+
2323
+ .help-tab-item {
2324
+ margin-bottom: 10px;
2325
+ }
2326
+
2327
+ .help-tab-name {
2328
+ font-weight: 600;
2329
+ color: var(--text);
2330
+ font-size: 13px;
2331
+ margin-bottom: 2px;
2332
+ }
2333
+
2334
+ .help-tab-desc {
2335
+ font-size: 12px;
2336
+ color: var(--text-muted);
2337
+ line-height: 1.4;
2338
+ }
2339
+
2340
+ /* =========================================================================
2341
+ * Config Sections (Settings tab)
2342
+ * ========================================================================= */
2343
+
2344
+ .config-section {
2345
+ background: var(--surface);
2346
+ border: 1px solid var(--border);
2347
+ border-radius: var(--radius);
2348
+ margin-bottom: 16px;
2349
+ overflow: hidden;
2350
+ }
2351
+
2352
+ .config-section-header {
2353
+ display: flex;
2354
+ align-items: center;
2355
+ justify-content: space-between;
2356
+ padding: 12px 16px;
2357
+ cursor: pointer;
2358
+ user-select: none;
2359
+ transition: background 0.15s;
2360
+ }
2361
+
2362
+ .config-section-header:hover {
2363
+ background: rgba(255, 255, 255, 0.02);
2364
+ }
2365
+
2366
+ .config-section-header h3 {
2367
+ font-size: 14px;
2368
+ font-weight: 600;
2369
+ color: var(--text);
2370
+ display: flex;
2371
+ align-items: center;
2372
+ gap: 8px;
2373
+ }
2374
+
2375
+ .config-section-header .toggle-icon {
2376
+ font-size: 10px;
2377
+ color: var(--text-muted);
2378
+ transition: transform 0.2s;
2379
+ display: inline-block;
2380
+ }
2381
+
2382
+ .config-section.collapsed .config-section-header .toggle-icon {
2383
+ transform: rotate(-90deg);
2384
+ }
2385
+
2386
+ .config-section.collapsed .config-section-body {
2387
+ display: none;
2388
+ }
2389
+
2390
+ .config-section-status {
2391
+ font-size: 10px;
2392
+ padding: 2px 8px;
2393
+ border-radius: 10px;
2394
+ font-weight: 500;
2395
+ letter-spacing: 0.02em;
2396
+ }
2397
+
2398
+ .config-section-status.enabled {
2399
+ background: rgba(63, 185, 80, 0.15);
2400
+ color: var(--success);
2401
+ }
2402
+
2403
+ .config-section-status.disabled {
2404
+ background: rgba(139, 148, 158, 0.15);
2405
+ color: var(--text-muted);
2406
+ }
2407
+
2408
+ .config-section-body {
2409
+ padding: 0 16px 16px;
2410
+ border-top: 1px solid var(--border);
2411
+ }
2412
+
2413
+ .config-section-body.disabled-fields {
2414
+ opacity: 0.5;
2415
+ pointer-events: none;
2416
+ }
2417
+
2418
+ /* Config field layout */
2419
+ .config-field {
2420
+ padding: 10px 0;
2421
+ border-bottom: 1px solid rgba(48, 54, 61, 0.5);
2422
+ }
2423
+
2424
+ .config-field:last-child {
2425
+ border-bottom: none;
2426
+ }
2427
+
2428
+ .config-field-header {
2429
+ display: flex;
2430
+ align-items: center;
2431
+ justify-content: space-between;
2432
+ margin-bottom: 4px;
2433
+ }
2434
+
2435
+ .config-field-label {
2436
+ font-size: 13px;
2437
+ font-weight: 500;
2438
+ color: var(--text);
2439
+ }
2440
+
2441
+ .config-field-desc {
2442
+ font-size: 11px;
2443
+ color: var(--text-muted);
2444
+ margin-bottom: 6px;
2445
+ }
2446
+
2447
+ .config-field-value {
2448
+ display: flex;
2449
+ align-items: center;
2450
+ gap: 8px;
2451
+ }
2452
+
2453
+ /* Toggle switch */
2454
+ .config-toggle {
2455
+ position: relative;
2456
+ width: 36px;
2457
+ height: 20px;
2458
+ flex-shrink: 0;
2459
+ }
2460
+
2461
+ .config-toggle input {
2462
+ opacity: 0;
2463
+ width: 0;
2464
+ height: 0;
2465
+ position: absolute;
2466
+ }
2467
+
2468
+ .config-toggle-slider {
2469
+ position: absolute;
2470
+ inset: 0;
2471
+ background: var(--border);
2472
+ border-radius: 10px;
2473
+ cursor: pointer;
2474
+ transition: background 0.2s;
2475
+ }
2476
+
2477
+ .config-toggle-slider::before {
2478
+ content: '';
2479
+ position: absolute;
2480
+ width: 14px;
2481
+ height: 14px;
2482
+ left: 3px;
2483
+ top: 3px;
2484
+ background: var(--text);
2485
+ border-radius: 50%;
2486
+ transition: transform 0.2s;
2487
+ }
2488
+
2489
+ .config-toggle input:checked + .config-toggle-slider {
2490
+ background: var(--accent);
2491
+ }
2492
+
2493
+ .config-toggle input:checked + .config-toggle-slider::before {
2494
+ transform: translateX(16px);
2495
+ }
2496
+
2497
+ /* Number input */
2498
+ .config-number-input {
2499
+ width: 80px;
2500
+ padding: 4px 8px;
2501
+ background: var(--bg);
2502
+ border: 1px solid var(--border);
2503
+ border-radius: 4px;
2504
+ color: var(--text);
2505
+ font-size: 13px;
2506
+ font-family: inherit;
2507
+ text-align: right;
2508
+ }
2509
+
2510
+ .config-number-input:focus {
2511
+ border-color: var(--accent);
2512
+ outline: none;
2513
+ }
2514
+
2515
+ /* Range slider */
2516
+ .config-slider {
2517
+ -webkit-appearance: none;
2518
+ appearance: none;
2519
+ width: 100%;
2520
+ height: 4px;
2521
+ background: var(--border);
2522
+ border-radius: 2px;
2523
+ outline: none;
2524
+ flex: 1;
2525
+ min-width: 100px;
2526
+ }
2527
+
2528
+ .config-slider::-webkit-slider-thumb {
2529
+ -webkit-appearance: none;
2530
+ appearance: none;
2531
+ width: 14px;
2532
+ height: 14px;
2533
+ border-radius: 50%;
2534
+ background: var(--accent);
2535
+ cursor: pointer;
2536
+ border: none;
2537
+ }
2538
+
2539
+ .config-slider::-moz-range-thumb {
2540
+ width: 14px;
2541
+ height: 14px;
2542
+ border-radius: 50%;
2543
+ background: var(--accent);
2544
+ cursor: pointer;
2545
+ border: none;
2546
+ }
2547
+
2548
+ .config-slider-value {
2549
+ font-size: 12px;
2550
+ color: var(--accent);
2551
+ font-variant-numeric: tabular-nums;
2552
+ min-width: 36px;
2553
+ text-align: right;
2554
+ flex-shrink: 0;
2555
+ }
2556
+
2557
+ /* Radio group (segmented) */
2558
+ .config-radio-group {
2559
+ display: flex;
2560
+ gap: 0;
2561
+ border: 1px solid var(--border);
2562
+ border-radius: var(--radius);
2563
+ overflow: hidden;
2564
+ }
2565
+
2566
+ .config-radio {
2567
+ padding: 5px 14px;
2568
+ background: transparent;
2569
+ border: none;
2570
+ border-right: 1px solid var(--border);
2571
+ color: var(--text-muted);
2572
+ font-size: 12px;
2573
+ cursor: pointer;
2574
+ white-space: nowrap;
2575
+ transition: background 0.15s, color 0.15s;
2576
+ }
2577
+
2578
+ .config-radio:last-child {
2579
+ border-right: none;
2580
+ }
2581
+
2582
+ .config-radio:hover {
2583
+ color: var(--text);
2584
+ background: rgba(255, 255, 255, 0.04);
2585
+ }
2586
+
2587
+ .config-radio.active {
2588
+ color: var(--accent);
2589
+ background: rgba(88, 166, 255, 0.12);
2590
+ }
2591
+
2592
+ /* Field groups */
2593
+ .config-field-group {
2594
+ margin-top: 8px;
2595
+ }
2596
+
2597
+ .config-field-group-label {
2598
+ font-size: 11px;
2599
+ font-weight: 600;
2600
+ text-transform: uppercase;
2601
+ letter-spacing: 0.04em;
2602
+ color: var(--text-muted);
2603
+ margin-bottom: 8px;
2604
+ margin-top: 16px;
2605
+ }
2606
+
2607
+ .config-field-row {
2608
+ display: flex;
2609
+ align-items: center;
2610
+ gap: 12px;
2611
+ margin-bottom: 6px;
2612
+ }
2613
+
2614
+ .config-field-inline {
2615
+ display: flex;
2616
+ align-items: center;
2617
+ gap: 6px;
2618
+ font-size: 12px;
2619
+ color: var(--text-muted);
2620
+ }
2621
+
2622
+ /* Threshold grid */
2623
+ .config-threshold-grid {
2624
+ display: grid;
2625
+ grid-template-columns: 1fr 1fr;
2626
+ gap: 6px 16px;
2627
+ margin-top: 6px;
2628
+ }
2629
+
2630
+ .config-threshold-row {
2631
+ display: flex;
2632
+ align-items: center;
2633
+ gap: 8px;
2634
+ }
2635
+
2636
+ .config-threshold-label {
2637
+ font-size: 12px;
2638
+ color: var(--text);
2639
+ min-width: 70px;
2640
+ }
2641
+
2642
+ .config-threshold-row .config-slider {
2643
+ flex: 1;
2644
+ }
2645
+
2646
+ .config-threshold-row .config-slider-value {
2647
+ min-width: 32px;
2648
+ }
2649
+
2650
+ /* Action buttons */
2651
+ .config-actions {
2652
+ display: flex;
2653
+ gap: 8px;
2654
+ margin-top: 16px;
2655
+ padding-top: 12px;
2656
+ border-top: 1px solid var(--border);
2657
+ }
2658
+
2659
+ .btn-config-save {
2660
+ padding: 6px 16px;
2661
+ background: var(--accent);
2662
+ color: var(--bg);
2663
+ border: none;
2664
+ border-radius: var(--radius);
2665
+ font-size: 12px;
2666
+ font-weight: 600;
2667
+ cursor: pointer;
2668
+ transition: background 0.15s;
2669
+ }
2670
+
2671
+ .btn-config-save:hover {
2672
+ background: var(--accent-hover);
2673
+ }
2674
+
2675
+ .btn-config-defaults {
2676
+ padding: 6px 16px;
2677
+ background: transparent;
2678
+ border: 1px solid var(--border);
2679
+ border-radius: var(--radius);
2680
+ color: var(--text-muted);
2681
+ font-size: 12px;
2682
+ font-weight: 500;
2683
+ cursor: pointer;
2684
+ transition: background 0.15s, border-color 0.15s, color 0.15s;
2685
+ }
2686
+
2687
+ .btn-config-defaults:hover {
2688
+ background: rgba(255, 255, 255, 0.04);
2689
+ border-color: var(--text-muted);
2690
+ color: var(--text);
2691
+ }
2692
+
2693
+ .btn-config-defaults.confirming {
2694
+ border-color: var(--warning);
2695
+ color: var(--warning);
2696
+ }
2697
+
2698
+ /* Cross-Project Access dual-list widget */
2699
+ .cross-access-lists {
2700
+ display: flex;
2701
+ gap: 16px;
2702
+ margin-bottom: 16px;
2703
+ }
2704
+
2705
+ .cross-access-list {
2706
+ flex: 1;
2707
+ border: 1px solid var(--border);
2708
+ border-radius: var(--radius);
2709
+ overflow: hidden;
2710
+ display: flex;
2711
+ flex-direction: column;
2712
+ }
2713
+
2714
+ .cross-access-list-header {
2715
+ background: var(--surface);
2716
+ border-bottom: 1px solid var(--border);
2717
+ padding: 8px 12px;
2718
+ font-size: 12px;
2719
+ font-weight: 600;
2720
+ color: var(--text-muted);
2721
+ text-transform: uppercase;
2722
+ letter-spacing: 0.5px;
2723
+ }
2724
+
2725
+ .cross-access-items {
2726
+ list-style: none;
2727
+ max-height: 200px;
2728
+ overflow-y: auto;
2729
+ min-height: 60px;
2730
+ }
2731
+
2732
+ .cross-access-items:empty::after {
2733
+ content: '(none)';
2734
+ display: block;
2735
+ padding: 12px;
2736
+ color: var(--text-muted);
2737
+ font-style: italic;
2738
+ font-size: 13px;
2739
+ }
2740
+
2741
+ .cross-access-item {
2742
+ display: flex;
2743
+ align-items: center;
2744
+ justify-content: space-between;
2745
+ padding: 6px 12px;
2746
+ border-bottom: 1px solid var(--border);
2747
+ transition: background var(--transition);
2748
+ }
2749
+
2750
+ .cross-access-item:last-child {
2751
+ border-bottom: none;
2752
+ }
2753
+
2754
+ .cross-access-item:hover {
2755
+ background: rgba(88, 166, 255, 0.06);
2756
+ }
2757
+
2758
+ .cross-access-item-name {
2759
+ font-size: 13px;
2760
+ color: var(--text);
2761
+ overflow: hidden;
2762
+ text-overflow: ellipsis;
2763
+ white-space: nowrap;
2764
+ }
2765
+
2766
+ .cross-access-add-btn,
2767
+ .cross-access-remove-btn {
2768
+ background: none;
2769
+ border: 1px solid var(--border);
2770
+ border-radius: 4px;
2771
+ color: var(--text-muted);
2772
+ cursor: pointer;
2773
+ font-size: 14px;
2774
+ width: 26px;
2775
+ height: 26px;
2776
+ display: flex;
2777
+ align-items: center;
2778
+ justify-content: center;
2779
+ flex-shrink: 0;
2780
+ transition: all var(--transition);
2781
+ }
2782
+
2783
+ .cross-access-add-btn:hover {
2784
+ border-color: var(--accent);
2785
+ color: var(--accent);
2786
+ background: rgba(88, 166, 255, 0.1);
2787
+ }
2788
+
2789
+ .cross-access-remove-btn:hover {
2790
+ border-color: var(--danger);
2791
+ color: var(--danger);
2792
+ background: rgba(248, 81, 73, 0.1);
2793
+ }
2794
+
2795
+ /* =========================================================================
2796
+ * D3.js Graph SVG Styles
2797
+ * ========================================================================= */
2798
+
2799
+ .graph-svg {
2800
+ background: var(--bg);
2801
+ cursor: grab;
2802
+ }
2803
+
2804
+ .graph-svg:active {
2805
+ cursor: grabbing;
2806
+ }
2807
+
2808
+ /* Node shapes */
2809
+ g.node-group path.node-shape {
2810
+ stroke: none;
2811
+ cursor: pointer;
2812
+ transition: filter 0.15s;
2813
+ }
2814
+
2815
+ g.node-group:hover path.node-shape {
2816
+ filter: brightness(1.3);
2817
+ stroke: rgba(255, 255, 255, 0.3);
2818
+ stroke-width: 1.5;
2819
+ }
2820
+
2821
+ g.node-group.selected path.node-shape {
2822
+ stroke: #f0883e;
2823
+ stroke-width: 3;
2824
+ }
2825
+
2826
+ g.node-group.focus-root path.node-shape {
2827
+ stroke: #58a6ff;
2828
+ stroke-width: 4;
2829
+ animation: focus-pulse 2s ease-in-out infinite;
2830
+ }
2831
+
2832
+ /* Node labels */
2833
+ text.node-label {
2834
+ font-size: 11px;
2835
+ fill: var(--text);
2836
+ text-anchor: middle;
2837
+ pointer-events: none;
2838
+ paint-order: stroke fill;
2839
+ stroke: var(--bg);
2840
+ stroke-width: 3px;
2841
+ stroke-linecap: round;
2842
+ stroke-linejoin: round;
2843
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
2844
+ }
2845
+
2846
+ /* Edges */
2847
+ line.edge {
2848
+ stroke-width: 1.5;
2849
+ opacity: 0.5;
2850
+ }
2851
+
2852
+ /* Edge labels */
2853
+ text.edge-label {
2854
+ font-size: 9px;
2855
+ fill: var(--text-muted);
2856
+ text-anchor: middle;
2857
+ pointer-events: none;
2858
+ paint-order: stroke fill;
2859
+ stroke: var(--bg);
2860
+ stroke-width: 2px;
2861
+ stroke-linecap: round;
2862
+ stroke-linejoin: round;
2863
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Helvetica, Arial, sans-serif;
2864
+ }
2865
+
2866
+ /* Search/highlight states on SVG elements */
2867
+ g.node-group.search-dimmed,
2868
+ text.node-label.search-dimmed,
2869
+ line.edge.search-dimmed,
2870
+ text.edge-label.search-dimmed {
2871
+ opacity: 0.1;
2872
+ }
2873
+
2874
+ g.node-group.search-match path.node-shape {
2875
+ stroke: #d29922;
2876
+ stroke-width: 3;
2877
+ filter: brightness(1.2) drop-shadow(0 0 4px #d29922);
2878
+ }
2879
+
2880
+ /* Focus root pulsing animation */
2881
+ @keyframes focus-pulse {
2882
+ 0%, 100% { filter: drop-shadow(0 0 6px rgba(88, 166, 255, 0.6)); }
2883
+ 50% { filter: drop-shadow(0 0 14px rgba(88, 166, 255, 0.9)); }
2884
+ }
2885
+
2886
+ /* Node degree label (centered in node) */
2887
+ .node-degree-label {
2888
+ font-family: var(--font-mono, 'SF Mono', 'Fira Code', monospace);
2889
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.7);
2890
+ user-select: none;
2891
+ }
2892
+
2893
+ /* Graph tooltip */
2894
+ .graph-tooltip {
2895
+ position: fixed;
2896
+ z-index: 1000;
2897
+ max-width: 280px;
2898
+ padding: 10px 12px;
2899
+ background: var(--bg-secondary, #161b22);
2900
+ border: 1px solid var(--border, #30363d);
2901
+ border-radius: 8px;
2902
+ box-shadow: 0 4px 16px rgba(0, 0, 0, 0.4);
2903
+ pointer-events: none;
2904
+ font-size: 12px;
2905
+ line-height: 1.4;
2906
+ color: var(--text, #c9d1d9);
2907
+ }
2908
+
2909
+ .graph-tooltip.hidden {
2910
+ display: none;
2911
+ }
2912
+
2913
+ .graph-tooltip .tooltip-header {
2914
+ margin-bottom: 4px;
2915
+ }
2916
+
2917
+ .graph-tooltip .tooltip-type {
2918
+ font-size: 10px;
2919
+ font-weight: 600;
2920
+ text-transform: uppercase;
2921
+ letter-spacing: 0.5px;
2922
+ }
2923
+
2924
+ .graph-tooltip .tooltip-name {
2925
+ font-size: 13px;
2926
+ font-weight: 600;
2927
+ color: var(--text-bright, #f0f6fc);
2928
+ margin-bottom: 4px;
2929
+ word-break: break-word;
2930
+ }
2931
+
2932
+ .graph-tooltip .tooltip-stat {
2933
+ color: var(--text-muted, #8b949e);
2934
+ font-size: 11px;
2935
+ margin-bottom: 6px;
2936
+ }
2937
+
2938
+ .graph-tooltip .tooltip-connections {
2939
+ border-top: 1px solid var(--border, #30363d);
2940
+ padding-top: 6px;
2941
+ margin-top: 2px;
2942
+ }
2943
+
2944
+ .graph-tooltip .tooltip-rel {
2945
+ font-size: 11px;
2946
+ margin-bottom: 3px;
2947
+ color: var(--text-muted, #8b949e);
2948
+ }
2949
+
2950
+ .graph-tooltip .tooltip-rel-type {
2951
+ color: var(--text, #c9d1d9);
2952
+ font-weight: 500;
2953
+ }
2954
+
2955
+ /* ====================================================================
2956
+ Path Detail Panel
2957
+ ==================================================================== */
2958
+
2959
+ .path-detail-panel {
2960
+ position: fixed;
2961
+ top: var(--nav-height);
2962
+ right: 0;
2963
+ width: var(--panel-width);
2964
+ height: calc(100vh - var(--nav-height));
2965
+ background: var(--surface);
2966
+ border-left: 1px solid var(--border);
2967
+ z-index: 20;
2968
+ display: flex;
2969
+ flex-direction: column;
2970
+ overflow: hidden;
2971
+ transition: transform var(--transition);
2972
+ }
2973
+
2974
+ .path-detail-panel.hidden {
2975
+ display: none;
2976
+ }
2977
+
2978
+ .path-detail-body {
2979
+ flex: 1;
2980
+ overflow-y: auto;
2981
+ padding: 12px;
2982
+ }
2983
+
2984
+ /* Path status badge */
2985
+ .path-status-badge {
2986
+ display: inline-block;
2987
+ padding: 2px 8px;
2988
+ border-radius: 10px;
2989
+ font-size: 11px;
2990
+ font-weight: 600;
2991
+ text-transform: uppercase;
2992
+ letter-spacing: 0.5px;
2993
+ }
2994
+
2995
+ .path-status-badge.active {
2996
+ background: rgba(210, 153, 34, 0.2);
2997
+ color: var(--warning);
2998
+ }
2999
+
3000
+ .path-status-badge.resolved {
3001
+ background: rgba(63, 185, 80, 0.2);
3002
+ color: var(--success);
3003
+ }
3004
+
3005
+ .path-status-badge.abandoned {
3006
+ background: rgba(139, 148, 158, 0.2);
3007
+ color: var(--text-muted);
3008
+ }
3009
+
3010
+ /* Path info section */
3011
+ .path-info-section {
3012
+ margin-bottom: 16px;
3013
+ padding-bottom: 12px;
3014
+ border-bottom: 1px solid var(--border);
3015
+ }
3016
+
3017
+ .path-info-label {
3018
+ font-size: 11px;
3019
+ color: var(--text-muted);
3020
+ text-transform: uppercase;
3021
+ letter-spacing: 0.5px;
3022
+ margin-bottom: 4px;
3023
+ }
3024
+
3025
+ .path-info-value {
3026
+ color: var(--text);
3027
+ font-size: 13px;
3028
+ line-height: 1.4;
3029
+ }
3030
+
3031
+ /* KISS Summary section */
3032
+ .kiss-summary-section {
3033
+ margin-bottom: 16px;
3034
+ padding: 10px;
3035
+ background: rgba(63, 185, 80, 0.08);
3036
+ border: 1px solid rgba(63, 185, 80, 0.2);
3037
+ border-radius: var(--radius);
3038
+ }
3039
+
3040
+ .kiss-summary-title {
3041
+ font-size: 12px;
3042
+ font-weight: 600;
3043
+ color: var(--success);
3044
+ margin-bottom: 6px;
3045
+ }
3046
+
3047
+ .kiss-summary-field {
3048
+ margin-bottom: 6px;
3049
+ }
3050
+
3051
+ .kiss-summary-field-label {
3052
+ font-size: 11px;
3053
+ color: var(--text-muted);
3054
+ font-weight: 600;
3055
+ }
3056
+
3057
+ .kiss-summary-field-value {
3058
+ font-size: 12px;
3059
+ color: var(--text);
3060
+ line-height: 1.4;
3061
+ }
3062
+
3063
+ /* Waypoint timeline */
3064
+ .waypoint-timeline {
3065
+ position: relative;
3066
+ padding-left: 20px;
3067
+ }
3068
+
3069
+ .waypoint-timeline::before {
3070
+ content: '';
3071
+ position: absolute;
3072
+ left: 7px;
3073
+ top: 0;
3074
+ bottom: 0;
3075
+ width: 2px;
3076
+ background: var(--border);
3077
+ }
3078
+
3079
+ .waypoint-item {
3080
+ position: relative;
3081
+ padding: 8px 0 8px 12px;
3082
+ margin-bottom: 4px;
3083
+ }
3084
+
3085
+ .waypoint-item::before {
3086
+ content: '';
3087
+ position: absolute;
3088
+ left: -17px;
3089
+ top: 14px;
3090
+ width: 10px;
3091
+ height: 10px;
3092
+ border-radius: 50%;
3093
+ border: 2px solid var(--bg);
3094
+ }
3095
+
3096
+ .waypoint-item[data-type="error"]::before { background: #f85149; }
3097
+ .waypoint-item[data-type="attempt"]::before { background: #d29922; }
3098
+ .waypoint-item[data-type="failure"]::before { background: #f0883e; }
3099
+ .waypoint-item[data-type="success"]::before { background: #3fb950; }
3100
+ .waypoint-item[data-type="pivot"]::before { background: #a371f7; }
3101
+ .waypoint-item[data-type="revert"]::before { background: #79c0ff; }
3102
+ .waypoint-item[data-type="discovery"]::before { background: #58a6ff; }
3103
+ .waypoint-item[data-type="resolution"]::before { background: #3fb950; }
3104
+
3105
+ .waypoint-header {
3106
+ display: flex;
3107
+ align-items: center;
3108
+ gap: 6px;
3109
+ margin-bottom: 2px;
3110
+ }
3111
+
3112
+ .waypoint-seq {
3113
+ font-size: 10px;
3114
+ color: var(--text-muted);
3115
+ font-weight: 600;
3116
+ min-width: 16px;
3117
+ }
3118
+
3119
+ .waypoint-type-label {
3120
+ font-size: 11px;
3121
+ font-weight: 600;
3122
+ text-transform: uppercase;
3123
+ letter-spacing: 0.3px;
3124
+ }
3125
+
3126
+ .waypoint-time {
3127
+ font-size: 10px;
3128
+ color: var(--text-muted);
3129
+ margin-left: auto;
3130
+ }
3131
+
3132
+ .waypoint-summary {
3133
+ font-size: 12px;
3134
+ color: var(--text);
3135
+ line-height: 1.4;
3136
+ word-break: break-word;
3137
+ }
3138
+
3139
+ /* Waypoint timeline section title */
3140
+ .waypoint-section-title {
3141
+ font-size: 12px;
3142
+ font-weight: 600;
3143
+ color: var(--text);
3144
+ margin-bottom: 8px;
3145
+ padding-bottom: 4px;
3146
+ border-bottom: 1px solid var(--border);
3147
+ }
3148
+
3149
+ /* ====================================================================
3150
+ Graph Freeze Button (pause/resume live updates)
3151
+ ==================================================================== */
3152
+
3153
+ .graph-freeze-btn {
3154
+ width: 32px;
3155
+ height: 32px;
3156
+ background: rgba(13, 17, 23, 0.85);
3157
+ border: 1px solid var(--border);
3158
+ border-radius: var(--radius);
3159
+ color: var(--text-muted);
3160
+ cursor: pointer;
3161
+ display: flex;
3162
+ align-items: center;
3163
+ justify-content: center;
3164
+ backdrop-filter: blur(8px);
3165
+ -webkit-backdrop-filter: blur(8px);
3166
+ transition: color var(--transition), border-color var(--transition), background var(--transition);
3167
+ }
3168
+
3169
+ .graph-freeze-btn:hover {
3170
+ color: var(--text);
3171
+ border-color: var(--text-muted);
3172
+ }
3173
+
3174
+ .graph-freeze-btn.active {
3175
+ color: var(--warning);
3176
+ border-color: var(--warning);
3177
+ background: rgba(210, 153, 34, 0.12);
3178
+ }
3179
+
3180
+ /* ====================================================================
3181
+ Graph Sync Button (stale data indicator)
3182
+ ==================================================================== */
3183
+
3184
+ .graph-sync-btn {
3185
+ position: absolute;
3186
+ top: 16px;
3187
+ left: 50%;
3188
+ transform: translateX(-50%);
3189
+ background: rgba(13, 17, 23, 0.85);
3190
+ border: 1px solid var(--border);
3191
+ border-radius: var(--radius);
3192
+ color: var(--text-muted);
3193
+ padding: 4px 12px;
3194
+ font-size: 12px;
3195
+ cursor: pointer;
3196
+ z-index: 6;
3197
+ display: flex;
3198
+ align-items: center;
3199
+ gap: 6px;
3200
+ backdrop-filter: blur(8px);
3201
+ -webkit-backdrop-filter: blur(8px);
3202
+ transition: all 200ms ease;
3203
+ }
3204
+
3205
+ .graph-sync-btn.hidden { display: none; }
3206
+
3207
+ .graph-sync-btn.stale {
3208
+ border-color: var(--warning);
3209
+ color: var(--warning);
3210
+ animation: pulse 2s infinite;
3211
+ }
3212
+
3213
+ .graph-sync-btn:hover {
3214
+ color: var(--text);
3215
+ border-color: var(--text-muted);
3216
+ }
3217
+
3218
+ .graph-sync-btn.stale:hover {
3219
+ border-color: var(--warning);
3220
+ color: var(--text);
3221
+ }
3222
+
3223
+ /* ====================================================================
3224
+ Pathfinder Styles
3225
+ ==================================================================== */
3226
+
3227
+ .paths-toggle-btn {
3228
+ background: transparent;
3229
+ border: 1px solid var(--border);
3230
+ color: var(--text-muted);
3231
+ padding: 4px 6px;
3232
+ border-radius: var(--radius);
3233
+ cursor: pointer;
3234
+ display: flex;
3235
+ align-items: center;
3236
+ justify-content: center;
3237
+ transition: all var(--transition);
3238
+ }
3239
+
3240
+ .paths-toggle-btn:hover {
3241
+ color: var(--text);
3242
+ border-color: var(--text-muted);
3243
+ }
3244
+
3245
+ .paths-toggle-btn.active {
3246
+ color: var(--color-reference);
3247
+ border-color: var(--color-reference);
3248
+ background: rgba(240, 136, 62, 0.1);
3249
+ }
3250
+
3251
+ /* Pathfinder start/end node indicators */
3252
+ g.node-group.pathfinder-start path.node-shape {
3253
+ stroke: #3fb950;
3254
+ stroke-width: 3.5;
3255
+ filter: drop-shadow(0 0 6px rgba(63, 185, 80, 0.7));
3256
+ }
3257
+
3258
+ g.node-group.pathfinder-end path.node-shape {
3259
+ stroke: #f85149;
3260
+ stroke-width: 3.5;
3261
+ filter: drop-shadow(0 0 6px rgba(248, 81, 73, 0.7));
3262
+ }
3263
+
3264
+ /* Path-highlighted edges */
3265
+ line.edge.path-highlight {
3266
+ stroke: #f0883e !important;
3267
+ stroke-width: 3.5 !important;
3268
+ opacity: 1 !important;
3269
+ filter: drop-shadow(0 0 3px rgba(240, 136, 62, 0.6));
3270
+ }
3271
+
3272
+ /* Pathfinder info bar */
3273
+ .pathfinder-info {
3274
+ position: absolute;
3275
+ bottom: 16px;
3276
+ left: 50%;
3277
+ transform: translateX(-50%);
3278
+ background: rgba(13, 17, 23, 0.9);
3279
+ border: 1px solid var(--border);
3280
+ border-radius: 20px;
3281
+ padding: 6px 16px;
3282
+ font-size: 12px;
3283
+ color: var(--text);
3284
+ white-space: nowrap;
3285
+ z-index: 6;
3286
+ backdrop-filter: blur(8px);
3287
+ -webkit-backdrop-filter: blur(8px);
3288
+ pointer-events: none;
3289
+ }
3290
+
3291
+ /* =========================================================================
3292
+ * Help View — Enhanced Documentation
3293
+ * ========================================================================= */
3294
+
3295
+ /* Help sidebar search input */
3296
+ .help-search-input {
3297
+ width: 100%;
3298
+ padding: 6px 10px;
3299
+ background: var(--bg);
3300
+ border: 1px solid var(--border);
3301
+ border-radius: 14px;
3302
+ color: var(--text);
3303
+ font-size: 12px;
3304
+ font-family: inherit;
3305
+ transition: border-color var(--transition);
3306
+ }
3307
+
3308
+ .help-search-input:focus {
3309
+ border-color: var(--accent);
3310
+ outline: none;
3311
+ }
3312
+
3313
+ .help-search-input::placeholder {
3314
+ color: var(--text-muted);
3315
+ }
3316
+
3317
+ /* Subsection titles (h3-level) */
3318
+ .help-subsection-title {
3319
+ font-size: 14px;
3320
+ font-weight: 600;
3321
+ color: var(--text);
3322
+ margin: 16px 0 8px;
3323
+ }
3324
+
3325
+ /* Styled bullet list */
3326
+ .help-list {
3327
+ list-style: none;
3328
+ margin: 8px 0 16px;
3329
+ }
3330
+
3331
+ .help-list li {
3332
+ position: relative;
3333
+ padding-left: 16px;
3334
+ font-size: 13px;
3335
+ color: var(--text);
3336
+ line-height: 1.6;
3337
+ margin-bottom: 4px;
3338
+ }
3339
+
3340
+ .help-list li::before {
3341
+ content: '\2022';
3342
+ position: absolute;
3343
+ left: 0;
3344
+ color: var(--accent);
3345
+ }
3346
+
3347
+ /* Tip / note callout box */
3348
+ .help-tip {
3349
+ padding: 10px 14px;
3350
+ margin: 12px 0;
3351
+ background: rgba(88, 166, 255, 0.06);
3352
+ border-left: 3px solid var(--accent);
3353
+ border-radius: 0 var(--radius) var(--radius) 0;
3354
+ font-size: 13px;
3355
+ color: var(--text);
3356
+ line-height: 1.5;
3357
+ }
3358
+
3359
+ .help-tip strong {
3360
+ color: var(--accent);
3361
+ }
3362
+
3363
+ /* Screenshot containers */
3364
+ .help-screenshot {
3365
+ margin: 12px 0;
3366
+ border: 1px solid var(--border);
3367
+ border-radius: var(--radius);
3368
+ overflow: hidden;
3369
+ max-width: 100%;
3370
+ }
3371
+
3372
+ .help-screenshot img {
3373
+ display: block;
3374
+ width: 100%;
3375
+ height: auto;
3376
+ }
3377
+
3378
+ .help-screenshot-caption {
3379
+ padding: 6px 12px;
3380
+ font-size: 11px;
3381
+ color: var(--text-muted);
3382
+ background: var(--surface);
3383
+ text-align: center;
3384
+ }
3385
+
3386
+ /* Cross-links */
3387
+ .help-crosslinks {
3388
+ margin-top: 16px;
3389
+ padding-top: 8px;
3390
+ border-top: 1px solid var(--border);
3391
+ font-size: 12px;
3392
+ color: var(--text-muted);
3393
+ }
3394
+
3395
+ .help-crosslink {
3396
+ color: var(--accent);
3397
+ cursor: pointer;
3398
+ text-decoration: none;
3399
+ margin-left: 4px;
3400
+ transition: color var(--transition);
3401
+ }
3402
+
3403
+ .help-crosslink:hover {
3404
+ color: var(--accent-hover);
3405
+ text-decoration: underline;
3406
+ }
3407
+
3408
+ /* No results state for search */
3409
+ .help-no-results {
3410
+ text-align: center;
3411
+ color: var(--text-muted);
3412
+ padding: 48px 16px;
3413
+ font-size: 14px;
3414
+ }
3415
+
3416
+ /* Help table (key-value, shortcuts) */
3417
+ .help-table {
3418
+ width: 100%;
3419
+ border-collapse: collapse;
3420
+ margin: 8px 0;
3421
+ }
3422
+
3423
+ .help-table td {
3424
+ padding: 6px 8px;
3425
+ font-size: 13px;
3426
+ border-bottom: 1px solid rgba(48, 54, 61, 0.5);
3427
+ vertical-align: top;
3428
+ }
3429
+
3430
+ .help-table td:first-child {
3431
+ white-space: nowrap;
3432
+ width: 180px;
3433
+ color: var(--text);
3434
+ }
3435
+
3436
+ .help-table td:last-child {
3437
+ color: var(--text-muted);
3438
+ }
3439
+
3440
+ /* =========================================================================
3441
+ Tool Topology View
3442
+ ========================================================================= */
3443
+
3444
+ /* Toolbar */
3445
+ .tools-toolbar {
3446
+ display: flex;
3447
+ align-items: center;
3448
+ justify-content: space-between;
3449
+ gap: 12px;
3450
+ padding: 6px 16px;
3451
+ background: var(--surface);
3452
+ border-bottom: 1px solid var(--border);
3453
+ flex-shrink: 0;
3454
+ }
3455
+
3456
+ .tools-toolbar-left,
3457
+ .tools-toolbar-right {
3458
+ display: flex;
3459
+ align-items: center;
3460
+ gap: 8px;
3461
+ }
3462
+
3463
+ .tools-layout-btn {
3464
+ padding: 4px 12px;
3465
+ background: transparent;
3466
+ border: 1px solid var(--border);
3467
+ border-radius: var(--radius);
3468
+ color: var(--text-muted);
3469
+ font-size: 12px;
3470
+ cursor: pointer;
3471
+ transition: all var(--transition);
3472
+ }
3473
+
3474
+ .tools-layout-btn:hover {
3475
+ border-color: var(--text-muted);
3476
+ color: var(--text);
3477
+ }
3478
+
3479
+ .tools-layout-btn.active {
3480
+ border-color: var(--accent);
3481
+ color: var(--accent);
3482
+ background: rgba(88, 166, 255, 0.08);
3483
+ }
3484
+
3485
+ .tools-separator {
3486
+ color: var(--border);
3487
+ font-size: 14px;
3488
+ }
3489
+
3490
+ .tools-toggle-label {
3491
+ display: flex;
3492
+ align-items: center;
3493
+ gap: 6px;
3494
+ color: var(--text-muted);
3495
+ font-size: 12px;
3496
+ cursor: pointer;
3497
+ }
3498
+
3499
+ .tools-toggle-label input[type="checkbox"] {
3500
+ accent-color: var(--accent);
3501
+ }
3502
+
3503
+ .tools-filter-select {
3504
+ padding: 4px 8px;
3505
+ background: var(--bg);
3506
+ border: 1px solid var(--border);
3507
+ border-radius: var(--radius);
3508
+ color: var(--text);
3509
+ font-size: 12px;
3510
+ cursor: pointer;
3511
+ }
3512
+
3513
+ .tools-filter-select:focus {
3514
+ border-color: var(--accent);
3515
+ outline: none;
3516
+ }
3517
+
3518
+ /* Content area */
3519
+ #tools-view.active {
3520
+ display: flex;
3521
+ flex-direction: column;
3522
+ }
3523
+
3524
+ .tools-content-row {
3525
+ display: flex;
3526
+ flex: 1;
3527
+ min-height: 0;
3528
+ position: relative;
3529
+ }
3530
+
3531
+ .tools-graph-area {
3532
+ flex: 1;
3533
+ position: relative;
3534
+ overflow: hidden;
3535
+ }
3536
+
3537
+ #tools-svg {
3538
+ width: 100%;
3539
+ height: 100%;
3540
+ display: block;
3541
+ background: var(--bg);
3542
+ }
3543
+
3544
+ .tools-graph-stats {
3545
+ position: absolute;
3546
+ bottom: 8px;
3547
+ left: 12px;
3548
+ font-size: 11px;
3549
+ color: var(--text-muted);
3550
+ pointer-events: none;
3551
+ }
3552
+
3553
+ /* Tool nodes */
3554
+ .tool-node {
3555
+ transition: opacity 0.15s;
3556
+ }
3557
+
3558
+ .tool-node.selected {
3559
+ stroke: #ffffff !important;
3560
+ stroke-width: 3 !important;
3561
+ filter: drop-shadow(0 0 6px rgba(88, 166, 255, 0.5));
3562
+ }
3563
+
3564
+ /* Tool edges */
3565
+ .tool-edge {
3566
+ pointer-events: none;
3567
+ }
3568
+
3569
+ /* Tool labels */
3570
+ .tool-label {
3571
+ user-select: none;
3572
+ }
3573
+
3574
+ /* Detail panel */
3575
+ .tools-detail-panel {
3576
+ width: var(--panel-width);
3577
+ background: var(--surface);
3578
+ border-left: 1px solid var(--border);
3579
+ overflow-y: auto;
3580
+ transition: transform var(--transition);
3581
+ flex-shrink: 0;
3582
+ }
3583
+
3584
+ .tools-detail-panel.hidden {
3585
+ display: none;
3586
+ }
3587
+
3588
+ .tool-status-badge {
3589
+ display: inline-block;
3590
+ padding: 1px 8px;
3591
+ border-radius: 10px;
3592
+ font-size: 11px;
3593
+ font-weight: 500;
3594
+ }
3595
+
3596
+ .tool-status-badge.active {
3597
+ background: rgba(63, 185, 80, 0.15);
3598
+ color: var(--success);
3599
+ }
3600
+
3601
+ .tool-status-badge.stale {
3602
+ background: rgba(210, 153, 34, 0.15);
3603
+ color: var(--warning);
3604
+ }
3605
+
3606
+ .tool-status-badge.demoted {
3607
+ background: rgba(248, 81, 73, 0.15);
3608
+ color: var(--danger);
3609
+ }
3610
+
3611
+ .tool-description {
3612
+ color: var(--text-muted);
3613
+ font-size: 12px;
3614
+ line-height: 1.5;
3615
+ margin: 4px 0;
3616
+ }
3617
+
3618
+ .tool-co-occurring-item {
3619
+ display: flex;
3620
+ justify-content: space-between;
3621
+ align-items: center;
3622
+ padding: 4px 0;
3623
+ color: var(--text);
3624
+ font-size: 12px;
3625
+ transition: color var(--transition);
3626
+ }
3627
+
3628
+ .tool-co-occurring-item:hover {
3629
+ color: var(--accent);
3630
+ }
3631
+
3632
+ .tool-co-name {
3633
+ flex: 1;
3634
+ min-width: 0;
3635
+ overflow: hidden;
3636
+ text-overflow: ellipsis;
3637
+ white-space: nowrap;
3638
+ }
3639
+
3640
+ .tool-co-count {
3641
+ color: var(--text-muted);
3642
+ font-size: 11px;
3643
+ margin-left: 8px;
3644
+ flex-shrink: 0;
3645
+ }
3646
+
3647
+ /* Session flow strip */
3648
+ .tools-session-strip {
3649
+ flex-shrink: 0;
3650
+ background: var(--surface);
3651
+ border-top: 1px solid var(--border);
3652
+ padding: 8px 16px;
3653
+ max-height: 140px;
3654
+ overflow-y: auto;
3655
+ }
3656
+
3657
+ .tools-session-strip-label {
3658
+ font-size: 11px;
3659
+ color: var(--text-muted);
3660
+ font-weight: 500;
3661
+ margin-bottom: 6px;
3662
+ text-transform: uppercase;
3663
+ letter-spacing: 0.05em;
3664
+ }
3665
+
3666
+ .tools-session-strip-content {
3667
+ display: flex;
3668
+ flex-direction: column;
3669
+ gap: 4px;
3670
+ }
3671
+
3672
+ .tools-session-item {
3673
+ display: flex;
3674
+ align-items: center;
3675
+ gap: 8px;
3676
+ }
3677
+
3678
+ .tools-session-id {
3679
+ color: var(--text-muted);
3680
+ font-size: 10px;
3681
+ font-family: monospace;
3682
+ flex-shrink: 0;
3683
+ width: 60px;
3684
+ }
3685
+
3686
+ .tools-session-tools {
3687
+ display: flex;
3688
+ align-items: center;
3689
+ gap: 4px;
3690
+ overflow-x: auto;
3691
+ flex: 1;
3692
+ min-width: 0;
3693
+ }
3694
+
3695
+ .tools-session-arrow {
3696
+ color: var(--text-muted);
3697
+ font-size: 10px;
3698
+ flex-shrink: 0;
3699
+ opacity: 0.5;
3700
+ }
3701
+
3702
+ .tools-session-chip {
3703
+ display: inline-block;
3704
+ padding: 1px 6px;
3705
+ border: 1px solid var(--border);
3706
+ border-radius: 3px;
3707
+ font-size: 10px;
3708
+ color: var(--text);
3709
+ white-space: nowrap;
3710
+ flex-shrink: 0;
3711
+ }
3712
+
3713
+ .tools-session-more {
3714
+ color: var(--text-muted);
3715
+ font-size: 10px;
3716
+ flex-shrink: 0;
3717
+ }
3718
+
3719
+ .tools-session-empty {
3720
+ color: var(--text-muted);
3721
+ font-size: 12px;
3722
+ }
3723
+
3724
+ /* =========================================================================
3725
+ Database Hygiene
3726
+ ========================================================================= */
3727
+
3728
+ .hygiene-summary-row {
3729
+ display: flex;
3730
+ gap: 16px;
3731
+ margin-bottom: 12px;
3732
+ flex-wrap: wrap;
3733
+ }
3734
+
3735
+ .hygiene-stat {
3736
+ font-size: 13px;
3737
+ color: var(--text-muted);
3738
+ }
3739
+
3740
+ .hygiene-stat strong {
3741
+ color: var(--text);
3742
+ }
3743
+
3744
+ .hygiene-stat.hy-high strong {
3745
+ color: #f85149;
3746
+ }
3747
+
3748
+ .hygiene-stat.hy-medium strong {
3749
+ color: #d29922;
3750
+ }
3751
+
3752
+ .hygiene-table-wrap {
3753
+ max-height: 400px;
3754
+ overflow-y: auto;
3755
+ border: 1px solid var(--border);
3756
+ border-radius: 6px;
3757
+ }
3758
+
3759
+ .hygiene-table {
3760
+ width: 100%;
3761
+ border-collapse: collapse;
3762
+ font-size: 12px;
3763
+ }
3764
+
3765
+ .hygiene-table th {
3766
+ position: sticky;
3767
+ top: 0;
3768
+ background: var(--bg-secondary);
3769
+ padding: 6px 8px;
3770
+ text-align: left;
3771
+ font-weight: 500;
3772
+ font-size: 11px;
3773
+ color: var(--text-muted);
3774
+ border-bottom: 1px solid var(--border);
3775
+ }
3776
+
3777
+ .hygiene-table td {
3778
+ padding: 5px 8px;
3779
+ border-bottom: 1px solid rgba(48, 54, 61, 0.3);
3780
+ vertical-align: top;
3781
+ }
3782
+
3783
+ .hygiene-table .mono {
3784
+ font-family: var(--font-mono, monospace);
3785
+ font-size: 11px;
3786
+ }
3787
+
3788
+ .hygiene-preview {
3789
+ max-width: 300px;
3790
+ overflow: hidden;
3791
+ text-overflow: ellipsis;
3792
+ white-space: nowrap;
3793
+ color: var(--text-muted);
3794
+ font-size: 11px;
3795
+ }
3796
+
3797
+ .hy-row-high {
3798
+ background: rgba(248, 81, 73, 0.06);
3799
+ }
3800
+
3801
+ .hy-row-medium {
3802
+ background: rgba(210, 153, 34, 0.06);
3803
+ }
3804
+
3805
+ .hy-signal {
3806
+ display: inline-block;
3807
+ font-size: 10px;
3808
+ padding: 1px 5px;
3809
+ border-radius: 3px;
3810
+ background: rgba(110, 118, 129, 0.2);
3811
+ color: var(--text-muted);
3812
+ margin-right: 2px;
3813
+ }
3814
+
3815
+ .hygiene-signals {
3816
+ white-space: nowrap;
3817
+ }
3818
+
3819
+ .hygiene-distribution {
3820
+ margin: 8px 0;
3821
+ }
3822
+
3823
+ .hygiene-histogram {
3824
+ display: flex;
3825
+ align-items: flex-end;
3826
+ gap: 3px;
3827
+ height: 100px;
3828
+ padding: 4px 0;
3829
+ }
3830
+
3831
+ .hygiene-histogram-bar-wrap {
3832
+ flex: 1;
3833
+ display: flex;
3834
+ flex-direction: column;
3835
+ align-items: center;
3836
+ height: 100%;
3837
+ justify-content: flex-end;
3838
+ }
3839
+
3840
+ .hygiene-histogram-bar {
3841
+ width: 100%;
3842
+ min-height: 2px;
3843
+ background: var(--accent, #58a6ff);
3844
+ border-radius: 2px 2px 0 0;
3845
+ transition: height 0.2s ease;
3846
+ }
3847
+
3848
+ .hygiene-histogram-bar:hover {
3849
+ background: var(--accent-hover, #79b8ff);
3850
+ }
3851
+
3852
+ .hygiene-histogram-label {
3853
+ font-size: 10px;
3854
+ color: var(--text-muted, #8b949e);
3855
+ margin-top: 2px;
3856
+ }