codeui-python 0.1.0__py3-none-any.whl → 0.1.1__py3-none-any.whl

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 (49) hide show
  1. codeui/__init__.py +1 -1
  2. codeui/agent/context.py +19 -3
  3. codeui/analysis/dead_code.py +13 -2
  4. codeui/analysis/undefined.py +70 -0
  5. codeui/analysis/unresolved_import.py +34 -4
  6. codeui/cli/main.py +101 -7
  7. codeui/core/cache.py +54 -0
  8. codeui/core/graph.py +233 -3
  9. codeui/core/override.py +1 -0
  10. codeui/core/resolver.py +51 -37
  11. codeui/errors.py +10 -0
  12. codeui/lang/base.py +5 -2
  13. codeui/lang/cpp.py +271 -0
  14. codeui/lang/csharp.py +262 -0
  15. codeui/lang/dart.py +278 -0
  16. codeui/lang/generic.py +6 -4
  17. codeui/lang/go.py +5 -2
  18. codeui/lang/java.py +320 -0
  19. codeui/lang/kotlin.py +303 -0
  20. codeui/lang/php.py +275 -0
  21. codeui/lang/python.py +49 -7
  22. codeui/lang/registry.py +22 -2
  23. codeui/lang/ruby.py +270 -0
  24. codeui/lang/rust.py +5 -2
  25. codeui/lang/scala.py +290 -0
  26. codeui/lang/swift.py +276 -0
  27. codeui/lang/ts.py +99 -8
  28. codeui/report/sarif_emitter.py +2 -1
  29. codeui/server/server.py +156 -85
  30. codeui/server/static/css/styles.css +1609 -0
  31. codeui/server/static/index.html +199 -0
  32. codeui/server/static/js/api.js +485 -0
  33. codeui/server/static/js/app.js +1044 -0
  34. codeui/server/static/js/graph_canvas.js +1485 -0
  35. codeui/server/static/js/minimap.js +383 -0
  36. codeui/server/static/js/sidebar.js +268 -0
  37. codeui/server/static/js/state.js +83 -0
  38. codeui/server/static/js/subgraph_window.js +1208 -0
  39. codeui/server/static/js/theme.js +332 -0
  40. codeui/tracer/__init__.py +4 -1
  41. codeui/tracer/tracer.py +109 -118
  42. codeui_python-0.1.1.dist-info/METADATA +171 -0
  43. codeui_python-0.1.1.dist-info/RECORD +71 -0
  44. {codeui_python-0.1.0.dist-info → codeui_python-0.1.1.dist-info}/licenses/LICENSE +1 -1
  45. codeui_python-0.1.0.dist-info/METADATA +0 -191
  46. codeui_python-0.1.0.dist-info/RECORD +0 -52
  47. {codeui_python-0.1.0.dist-info → codeui_python-0.1.1.dist-info}/WHEEL +0 -0
  48. {codeui_python-0.1.0.dist-info → codeui_python-0.1.1.dist-info}/entry_points.txt +0 -0
  49. {codeui_python-0.1.0.dist-info → codeui_python-0.1.1.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,1609 @@
1
+ :root {
2
+ --bg-base: #0f172a;
3
+ --bg-surface: #1e293b;
4
+ --bg-elevated: #334155;
5
+ --border-subtle: #334155;
6
+ --border-strong: #475569;
7
+ --text-main: #f8fafc;
8
+ --text-muted: #94a3b8;
9
+ --text-dim: #64748b;
10
+ --primary: #2563eb;
11
+ --primary-hover: #1d4ed8;
12
+ --accent: #38bdf8;
13
+ --danger: #ef4444;
14
+ --warning: #f59e0b;
15
+ --success: #10b981;
16
+ --purple: #a855f7;
17
+ --pink: #ec4899;
18
+ --panel-overlay-bg: rgba(15, 23, 42, 0.88);
19
+ --panel-header-bg: #1e293b;
20
+ --minimap-bg: rgba(15, 23, 42, 0.40);
21
+ --editor-bg: #070a12;
22
+ --editor-text: #f8fafc;
23
+ --editor-line-bg: #0b0f19;
24
+ --editor-line-text: #475569;
25
+ --subgraph-bg: rgba(19, 27, 46, 0.98);
26
+ --subgraph-bar-bg: rgba(15, 23, 42, 0.94);
27
+ --subgraph-bar-text: #cbd5e1;
28
+ --chip-bg: rgba(30, 41, 59, 0.8);
29
+ --chip-text: #cbd5e1;
30
+ --card-hover-bg: #1e293b;
31
+ }
32
+
33
+ [data-theme="cyber"] {
34
+ --bg-base: #030712;
35
+ --bg-surface: #0b132b;
36
+ --bg-elevated: #1c2541;
37
+ --border-subtle: #1f293d;
38
+ --border-strong: #00f0ff;
39
+ --text-main: #f0fdfa;
40
+ --text-muted: #5eead4;
41
+ --text-dim: #2dd4bf;
42
+ --primary: #00f0ff;
43
+ --primary-hover: #38bdf8;
44
+ --accent: #00f0ff;
45
+ --editor-bg: #020617;
46
+ --editor-text: #f0fdfa;
47
+ --editor-line-bg: #090e1a;
48
+ --editor-line-text: #2dd4bf;
49
+ --subgraph-bg: rgba(11, 19, 43, 0.98);
50
+ --subgraph-bar-bg: rgba(11, 19, 43, 0.94);
51
+ --subgraph-bar-text: #5eead4;
52
+ --card-hover-bg: #1c2541;
53
+ }
54
+
55
+ [data-theme="light"] {
56
+ --bg-base: #f8fafc;
57
+ --bg-surface: #ffffff;
58
+ --bg-elevated: #f1f5f9;
59
+ --border-subtle: #e2e8f0;
60
+ --border-strong: #cbd5e1;
61
+ --text-main: #0f172a;
62
+ --text-muted: #475569;
63
+ --text-dim: #64748b;
64
+ --primary: #2563eb;
65
+ --primary-hover: #1d4ed8;
66
+ --accent: #0284c7;
67
+ --editor-bg: #ffffff;
68
+ --editor-text: #0f172a;
69
+ --editor-line-bg: #f8fafc;
70
+ --editor-line-text: #64748b;
71
+ --subgraph-bg: rgba(255, 255, 255, 0.98);
72
+ --subgraph-bar-bg: rgba(241, 245, 249, 0.94);
73
+ --subgraph-bar-text: #0f172a;
74
+ --card-hover-bg: #f1f5f9;
75
+ }
76
+
77
+ [data-theme="forest"] {
78
+ --bg-base: #061a14;
79
+ --bg-surface: #0d2820;
80
+ --bg-elevated: #173d32;
81
+ --border-subtle: #173d32;
82
+ --border-strong: #10b981;
83
+ --text-main: #ecfdf5;
84
+ --text-muted: #6ee7b7;
85
+ --text-dim: #34d399;
86
+ --primary: #059669;
87
+ --primary-hover: #047857;
88
+ --accent: #10b981;
89
+ --editor-bg: #03110d;
90
+ --editor-text: #ecfdf5;
91
+ --editor-line-bg: #061a14;
92
+ --editor-line-text: #34d399;
93
+ --subgraph-bg: rgba(13, 40, 32, 0.98);
94
+ --subgraph-bar-bg: rgba(13, 40, 32, 0.94);
95
+ --subgraph-bar-text: #6ee7b7;
96
+ --card-hover-bg: #173d32;
97
+ }
98
+
99
+ [data-theme="monokai"] {
100
+ --bg-base: #272822;
101
+ --bg-surface: #383830;
102
+ --bg-elevated: #49483e;
103
+ --border-subtle: #49483e;
104
+ --border-strong: #f92672;
105
+ --text-main: #f8f8f2;
106
+ --text-muted: #a6e22e;
107
+ --text-dim: #75715e;
108
+ --primary: #f92672;
109
+ --primary-hover: #fd5c63;
110
+ --accent: #66d9ef;
111
+ --editor-bg: #1e1f1c;
112
+ --editor-text: #f8f8f2;
113
+ --editor-line-bg: #272822;
114
+ --editor-line-text: #75715e;
115
+ --subgraph-bg: rgba(56, 56, 48, 0.98);
116
+ --subgraph-bar-bg: rgba(56, 56, 48, 0.94);
117
+ --subgraph-bar-text: #a6e22e;
118
+ --card-hover-bg: #49483e;
119
+ }
120
+
121
+ * {
122
+ box-sizing: border-box;
123
+ margin: 0;
124
+ padding: 0;
125
+ font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, monospace;
126
+ }
127
+
128
+ html, body {
129
+ width: 100%;
130
+ height: 100%;
131
+ height: 100dvh;
132
+ margin: 0;
133
+ padding: 0;
134
+ overflow: hidden;
135
+ position: fixed;
136
+ top: 0;
137
+ left: 0;
138
+ }
139
+
140
+ body {
141
+ background: var(--bg-base);
142
+ color: var(--text-main);
143
+ display: flex;
144
+ flex-direction: column;
145
+ }
146
+
147
+ header {
148
+ background: var(--bg-surface);
149
+ padding: 8px 16px;
150
+ border-bottom: 1px solid var(--border-subtle);
151
+ display: flex;
152
+ justify-content: space-between;
153
+ align-items: center;
154
+ z-index: 120;
155
+ position: sticky;
156
+ top: 0;
157
+ flex-shrink: 0;
158
+ flex-wrap: wrap;
159
+ gap: 8px;
160
+ transition: padding 0.2s ease, min-height 0.2s ease;
161
+ }
162
+
163
+ header.compact-header {
164
+ padding: 4px 16px;
165
+ min-height: 34px;
166
+ }
167
+
168
+ header.compact-header .nav-actions {
169
+ display: none !important;
170
+ }
171
+
172
+ .header-toggle-btn {
173
+ background: var(--bg-base);
174
+ border: 1px solid var(--border-subtle);
175
+ color: var(--text-muted);
176
+ border-radius: 4px;
177
+ padding: 2px 6px;
178
+ margin-left: 8px;
179
+ cursor: pointer;
180
+ display: inline-flex;
181
+ align-items: center;
182
+ justify-content: center;
183
+ transition: all 0.2s ease;
184
+ height: 24px;
185
+ }
186
+
187
+ .header-toggle-btn:hover, .header-toggle-btn.active {
188
+ background: var(--bg-elevated);
189
+ color: var(--accent);
190
+ border-color: var(--accent);
191
+ }
192
+
193
+ .logo {
194
+ font-weight: 700;
195
+ font-size: 1.05rem;
196
+ color: var(--accent);
197
+ display: flex;
198
+ align-items: center;
199
+ gap: 8px;
200
+ white-space: nowrap;
201
+ }
202
+
203
+ .nav-actions {
204
+ display: flex;
205
+ gap: 6px;
206
+ align-items: center;
207
+ flex-wrap: wrap;
208
+ }
209
+
210
+ button, .btn {
211
+ background: var(--primary);
212
+ color: white;
213
+ border: 1px solid transparent;
214
+ padding: 5px 10px;
215
+ border-radius: 6px;
216
+ font-size: 0.78rem;
217
+ font-weight: 600;
218
+ cursor: pointer;
219
+ transition: all 0.15s ease;
220
+ display: inline-flex;
221
+ align-items: center;
222
+ gap: 5px;
223
+ user-select: none;
224
+ }
225
+
226
+ button:hover { background: var(--primary-hover); }
227
+ button.secondary { background: var(--bg-elevated); color: var(--text-muted); border-color: var(--border-subtle); }
228
+ button.secondary:hover { background: var(--border-strong); color: var(--text-main); }
229
+ button.secondary.active { background: var(--primary); color: white; border-color: var(--primary); }
230
+ button.danger { background: #b91c1c; color: white; }
231
+ button.danger:hover { background: #991b1b; }
232
+ button.success { background: #065f46; color: #6ee7b7; }
233
+ button.success:hover { background: #047857; }
234
+
235
+ #btn-toggle-direct-disk.active {
236
+ background: #065f46;
237
+ color: #6ee7b7;
238
+ border-color: #10b981;
239
+ box-shadow: 0 0 10px rgba(16, 185, 129, 0.35);
240
+ }
241
+
242
+ .btn-group {
243
+ display: flex;
244
+ background: var(--bg-base);
245
+ padding: 2px;
246
+ border-radius: 6px;
247
+ border: 1px solid var(--border-subtle);
248
+ }
249
+
250
+ .btn-group button {
251
+ background: transparent;
252
+ border-radius: 4px;
253
+ padding: 4px 8px;
254
+ font-size: 0.72rem;
255
+ color: var(--text-muted);
256
+ border: none;
257
+ }
258
+
259
+ .btn-group button.active {
260
+ background: var(--primary);
261
+ color: white;
262
+ }
263
+
264
+ .select-control {
265
+ background: var(--bg-base);
266
+ color: var(--text-main);
267
+ border: 1px solid var(--border-subtle);
268
+ padding: 4px 8px;
269
+ border-radius: 6px;
270
+ font-size: 0.75rem;
271
+ outline: none;
272
+ }
273
+ .select-control:focus { border-color: var(--accent); }
274
+
275
+ .main-layout {
276
+ display: flex;
277
+ flex: 1;
278
+ overflow: hidden;
279
+ position: relative;
280
+ }
281
+
282
+ .sidebar {
283
+ width: 320px;
284
+ background: var(--bg-surface);
285
+ border-right: 1px solid var(--border-subtle);
286
+ display: flex;
287
+ flex-direction: column;
288
+ z-index: 15;
289
+ transition: transform 0.25s cubic-bezier(0.4, 0, 0.2, 1), margin-left 0.25s ease;
290
+ position: relative;
291
+ }
292
+
293
+ .sidebar.collapsed { margin-left: -320px; }
294
+
295
+ .sidebar-header {
296
+ display: flex;
297
+ justify-content: space-between;
298
+ align-items: center;
299
+ padding: 8px 12px;
300
+ border-bottom: 1px solid var(--border-subtle);
301
+ background: var(--bg-base);
302
+ }
303
+
304
+ .sidebar-tabs {
305
+ display: flex;
306
+ border-bottom: 1px solid var(--border-subtle);
307
+ background: var(--bg-base);
308
+ }
309
+
310
+ .tab-btn {
311
+ flex: 1;
312
+ padding: 8px 4px;
313
+ font-size: 0.75rem;
314
+ font-weight: 600;
315
+ background: transparent;
316
+ color: var(--text-muted);
317
+ border: none;
318
+ border-bottom: 2px solid transparent;
319
+ border-radius: 0;
320
+ cursor: pointer;
321
+ text-align: center;
322
+ }
323
+
324
+ .tab-btn.active {
325
+ color: var(--accent);
326
+ border-bottom-color: var(--accent);
327
+ background: var(--bg-surface);
328
+ }
329
+
330
+ .sidebar-search {
331
+ padding: 8px;
332
+ border-bottom: 1px solid var(--border-subtle);
333
+ }
334
+
335
+ .search-input {
336
+ width: 100%;
337
+ background: var(--bg-base);
338
+ border: 1px solid var(--border-subtle);
339
+ border-radius: 6px;
340
+ padding: 6px 10px;
341
+ font-size: 0.78rem;
342
+ color: var(--text-main);
343
+ outline: none;
344
+ }
345
+ .search-input:focus { border-color: var(--accent); }
346
+
347
+ .sidebar-content {
348
+ flex: 1;
349
+ overflow-y: auto;
350
+ padding: 8px;
351
+ }
352
+
353
+ .canvas-container {
354
+ flex: 1;
355
+ position: relative;
356
+ background: var(--bg-base);
357
+ overflow: hidden;
358
+ display: flex;
359
+ flex-direction: column;
360
+ }
361
+
362
+ canvas {
363
+ width: 100%;
364
+ height: 100%;
365
+ display: block;
366
+ cursor: grab;
367
+ touch-action: none;
368
+ }
369
+ canvas:active { cursor: grabbing; }
370
+
371
+ .floating-dock-btn {
372
+ position: absolute;
373
+ z-index: 12;
374
+ background: var(--panel-overlay-bg, rgba(19, 27, 46, 0.92));
375
+ backdrop-filter: blur(8px);
376
+ border: 1px solid var(--border-subtle);
377
+ color: var(--text-main);
378
+ padding: 6px 12px;
379
+ border-radius: 8px;
380
+ font-size: 0.75rem;
381
+ font-weight: 600;
382
+ cursor: pointer;
383
+ box-shadow: 0 4px 12px rgba(0,0,0,0.4);
384
+ display: flex;
385
+ align-items: center;
386
+ gap: 6px;
387
+ }
388
+ .floating-dock-btn:hover {
389
+ border-color: var(--accent);
390
+ color: var(--accent);
391
+ }
392
+
393
+ #btn-dock-sidebar { top: 12px; left: 12px; }
394
+
395
+ .sim-controls {
396
+ position: absolute;
397
+ bottom: 12px;
398
+ left: 12px;
399
+ background: var(--panel-overlay-bg, rgba(19, 27, 46, 0.92));
400
+ backdrop-filter: blur(8px);
401
+ border: 1px solid var(--border-subtle);
402
+ border-radius: 8px;
403
+ padding: 6px 10px;
404
+ display: flex;
405
+ align-items: center;
406
+ gap: 8px;
407
+ z-index: 12;
408
+ font-size: 0.72rem;
409
+ flex-wrap: wrap;
410
+ color: var(--text-main);
411
+ }
412
+
413
+ .sim-controls input[type="range"] {
414
+ width: 60px;
415
+ accent-color: var(--accent);
416
+ }
417
+
418
+ .legend {
419
+ position: absolute;
420
+ top: 195px;
421
+ right: 14px;
422
+ background: var(--panel-overlay-bg, rgba(19, 27, 46, 0.92));
423
+ backdrop-filter: blur(8px);
424
+ border: 1px solid var(--border-subtle);
425
+ border-radius: 8px;
426
+ padding: 8px 12px;
427
+ z-index: 10;
428
+ font-size: 0.72rem;
429
+ display: flex;
430
+ flex-direction: column;
431
+ gap: 4px;
432
+ pointer-events: none;
433
+ color: var(--text-main);
434
+ }
435
+
436
+ .legend-item { display: flex; align-items: center; gap: 6px; }
437
+ .legend-shape { width: 9px; height: 9px; border-radius: 2px; display: inline-block; }
438
+
439
+ .tooltip {
440
+ position: absolute;
441
+ pointer-events: none;
442
+ background: var(--panel-overlay-bg, rgba(15, 23, 42, 0.95));
443
+ border: 1px solid var(--border-strong);
444
+ border-radius: 6px;
445
+ padding: 6px 10px;
446
+ font-size: 0.72rem;
447
+ color: var(--text-main);
448
+ z-index: 100;
449
+ display: none;
450
+ max-width: 280px;
451
+ box-shadow: 0 4px 12px rgba(0,0,0,0.5);
452
+ }
453
+
454
+ .item-card {
455
+ background: var(--bg-base);
456
+ border: 1px solid var(--border-subtle);
457
+ border-radius: 6px;
458
+ padding: 8px;
459
+ margin-bottom: 6px;
460
+ cursor: pointer;
461
+ transition: all 0.15s;
462
+ }
463
+
464
+ .item-card:hover, .item-card.active {
465
+ border-color: var(--accent);
466
+ background: var(--card-hover-bg, var(--bg-elevated));
467
+ }
468
+
469
+ .item-header {
470
+ display: flex;
471
+ justify-content: space-between;
472
+ align-items: flex-start;
473
+ gap: 6px;
474
+ }
475
+
476
+ .item-title {
477
+ font-weight: 600;
478
+ font-size: 0.78rem;
479
+ color: var(--text-main);
480
+ word-break: break-all;
481
+ }
482
+
483
+ .item-sub {
484
+ font-size: 0.7rem;
485
+ color: var(--text-dim);
486
+ margin-top: 2px;
487
+ }
488
+
489
+ .badge {
490
+ display: inline-block;
491
+ padding: 2px 5px;
492
+ border-radius: 4px;
493
+ font-size: 0.65rem;
494
+ font-weight: 600;
495
+ text-transform: uppercase;
496
+ }
497
+
498
+ .badge.entry { background: #581c87; color: #d8b4fe; }
499
+ .badge.frontend { background: #1e3a8a; color: #93c5fd; }
500
+ .badge.backend { background: #14532d; color: #86efac; }
501
+ .badge.shared { background: #164e63; color: #a5f3fc; }
502
+ .badge.test { background: #713f12; color: #fde047; }
503
+ .badge.config { background: #334155; color: #cbd5e1; }
504
+ .badge.error { background: #7f1d1d; color: #fca5a5; }
505
+ .badge.warning { background: #78350f; color: #fde68a; }
506
+
507
+ .layer-filters { display: flex; flex-wrap: wrap; gap: 4px; margin-bottom: 8px; }
508
+ .filter-chip { font-size: 0.68rem; padding: 2px 6px; border-radius: 10px; border: 1px solid var(--border-subtle); background: var(--bg-base); color: var(--text-muted); cursor: pointer; }
509
+ .filter-chip.active { background: var(--primary); color: white; border-color: var(--primary); }
510
+
511
+ .stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 10px; }
512
+ .stat-card { background: var(--bg-base); border: 1px solid var(--border-subtle); border-radius: 6px; padding: 6px; text-align: center; }
513
+ .stat-val { font-size: 1.1rem; font-weight: 700; color: var(--accent); }
514
+ .stat-lbl { font-size: 0.65rem; color: var(--text-muted); text-transform: uppercase; margin-top: 2px; }
515
+
516
+ .subgraph-window {
517
+ position: absolute;
518
+ width: 560px;
519
+ height: 440px;
520
+ min-width: 300px;
521
+ min-height: 200px;
522
+ background: var(--subgraph-bg, var(--panel-overlay-bg, rgba(19, 27, 46, 0.98)));
523
+ backdrop-filter: blur(14px);
524
+ border: 1px solid var(--border-strong);
525
+ border-radius: 10px;
526
+ z-index: 300;
527
+ display: flex;
528
+ flex-direction: column;
529
+ box-shadow: 0 16px 48px rgba(0,0,0,0.5);
530
+ overflow: hidden;
531
+ transition: left 0.25s cubic-bezier(0.16, 1, 0.3, 1), top 0.25s cubic-bezier(0.16, 1, 0.3, 1), width 0.25s cubic-bezier(0.16, 1, 0.3, 1), height 0.25s cubic-bezier(0.16, 1, 0.3, 1);
532
+ }
533
+
534
+ .subgraph-resize-handle {
535
+ position: absolute;
536
+ z-index: 45;
537
+ user-select: none;
538
+ touch-action: none;
539
+ }
540
+
541
+ .subgraph-resize-n {
542
+ top: 0;
543
+ left: 8px;
544
+ right: 8px;
545
+ height: 6px;
546
+ cursor: ns-resize;
547
+ }
548
+
549
+ .subgraph-resize-s {
550
+ bottom: 0;
551
+ left: 8px;
552
+ right: 8px;
553
+ height: 6px;
554
+ cursor: ns-resize;
555
+ }
556
+
557
+ .subgraph-resize-w {
558
+ left: 0;
559
+ top: 8px;
560
+ bottom: 8px;
561
+ width: 6px;
562
+ cursor: ew-resize;
563
+ }
564
+
565
+ .subgraph-resize-e {
566
+ right: 0;
567
+ top: 8px;
568
+ bottom: 8px;
569
+ width: 6px;
570
+ cursor: ew-resize;
571
+ }
572
+
573
+ .subgraph-resize-nw {
574
+ top: 0;
575
+ left: 0;
576
+ width: 12px;
577
+ height: 12px;
578
+ cursor: nwse-resize;
579
+ }
580
+
581
+ .subgraph-resize-ne {
582
+ top: 0;
583
+ right: 0;
584
+ width: 12px;
585
+ height: 12px;
586
+ cursor: nesw-resize;
587
+ }
588
+
589
+ .subgraph-resize-sw {
590
+ bottom: 0;
591
+ left: 0;
592
+ width: 12px;
593
+ height: 12px;
594
+ cursor: nesw-resize;
595
+ }
596
+
597
+ .subgraph-resize-se {
598
+ right: 0;
599
+ bottom: 0;
600
+ width: 16px;
601
+ height: 16px;
602
+ cursor: nwse-resize;
603
+ background: linear-gradient(135deg, transparent 50%, var(--accent) 50%);
604
+ border-bottom-right-radius: 9px;
605
+ opacity: 0.75;
606
+ transition: opacity 0.2s;
607
+ }
608
+
609
+ .subgraph-resize-se:hover, .subgraph-resize-se.active {
610
+ opacity: 1.0;
611
+ background: linear-gradient(135deg, transparent 40%, var(--accent) 40%);
612
+ }
613
+
614
+ .btn-move-window {
615
+ cursor: grab !important;
616
+ user-select: none;
617
+ touch-action: none;
618
+ }
619
+ .btn-move-window:active {
620
+ cursor: grabbing !important;
621
+ }
622
+
623
+ .subgraph-window.minimized {
624
+ display: none !important;
625
+ }
626
+
627
+ .subgraph-window.maximized {
628
+ top: 10px !important;
629
+ left: 10px !important;
630
+ width: calc(100% - 20px) !important;
631
+ height: calc(100% - 20px) !important;
632
+ z-index: 50 !important;
633
+ }
634
+
635
+ .subgraph-window-header {
636
+ padding: 6px 12px;
637
+ background: var(--bg-surface);
638
+ border-bottom: 1px solid var(--border-subtle);
639
+ cursor: move;
640
+ display: flex;
641
+ justify-content: space-between;
642
+ align-items: center;
643
+ user-select: none;
644
+ gap: 8px;
645
+ flex-wrap: wrap;
646
+ }
647
+
648
+ .subgraph-window-title {
649
+ font-size: 0.78rem;
650
+ font-weight: 700;
651
+ color: var(--accent);
652
+ display: flex;
653
+ align-items: center;
654
+ gap: 6px;
655
+ overflow: hidden;
656
+ white-space: nowrap;
657
+ text-overflow: ellipsis;
658
+ max-width: 240px;
659
+ flex-shrink: 1;
660
+ }
661
+
662
+ .subgraph-header-path {
663
+ overflow: hidden;
664
+ white-space: nowrap;
665
+ text-overflow: ellipsis;
666
+ display: inline-block;
667
+ }
668
+
669
+ .subgraph-nav {
670
+ display: flex;
671
+ gap: 2px;
672
+ background: var(--bg-base);
673
+ padding: 2px;
674
+ border-radius: 6px;
675
+ border: 1px solid var(--border-subtle);
676
+ }
677
+
678
+ .subtab-btn {
679
+ background: transparent;
680
+ border: none;
681
+ padding: 3px 8px;
682
+ font-size: 0.7rem;
683
+ font-weight: 600;
684
+ color: var(--text-muted);
685
+ border-radius: 4px;
686
+ cursor: pointer;
687
+ }
688
+ .subtab-btn.active { background: var(--primary); color: white; }
689
+
690
+ .subgraph-window-actions { display: flex; gap: 4px; }
691
+ .subgraph-window-actions button { padding: 2px 6px; font-size: 0.7rem; border-radius: 4px; }
692
+
693
+ .subgraph-panel {
694
+ flex: 1;
695
+ position: relative;
696
+ display: none;
697
+ flex-direction: column;
698
+ overflow: hidden;
699
+ background: var(--bg-base);
700
+ }
701
+
702
+ .subgraph-panel.active { display: flex; }
703
+ .subgraph-panel canvas { width: 100%; height: 100%; display: block; }
704
+
705
+ .subgraph-canvas-bar {
706
+ position: absolute;
707
+ bottom: 8px;
708
+ left: 8px;
709
+ right: 8px;
710
+ background: var(--subgraph-bar-bg, var(--bg-surface));
711
+ border: 1px solid var(--border-subtle);
712
+ padding: 4px 10px;
713
+ border-radius: 6px;
714
+ font-size: 0.7rem;
715
+ color: var(--subgraph-bar-text, var(--text-main));
716
+ display: flex;
717
+ justify-content: space-between;
718
+ align-items: center;
719
+ backdrop-filter: blur(8px);
720
+ z-index: 10;
721
+ gap: 8px;
722
+ }
723
+
724
+ .subgraph-canvas-left {
725
+ display: flex;
726
+ align-items: center;
727
+ gap: 6px;
728
+ overflow: hidden;
729
+ white-space: nowrap;
730
+ text-overflow: ellipsis;
731
+ flex: 1;
732
+ }
733
+
734
+ .subgraph-canvas-right {
735
+ display: flex;
736
+ align-items: center;
737
+ gap: 8px;
738
+ flex-shrink: 0;
739
+ }
740
+
741
+ .subgraph-toggle-label {
742
+ display: flex;
743
+ align-items: center;
744
+ gap: 6px;
745
+ font-size: 0.68rem;
746
+ font-weight: 600;
747
+ color: var(--chip-text, var(--text-main));
748
+ cursor: pointer;
749
+ user-select: none;
750
+ padding: 2px 7px;
751
+ background: var(--chip-bg, var(--bg-elevated));
752
+ border: 1px solid var(--border-subtle);
753
+ border-radius: 4px;
754
+ transition: all 0.15s ease;
755
+ }
756
+
757
+ .subgraph-toggle-label:hover {
758
+ border-color: var(--accent);
759
+ color: var(--accent);
760
+ }
761
+
762
+ .subgraph-toggle-label input[type="checkbox"] {
763
+ accent-color: var(--accent);
764
+ cursor: pointer;
765
+ margin: 0;
766
+ width: 13px;
767
+ height: 13px;
768
+ }
769
+
770
+ .subgraph-toggle-label.active {
771
+ background: var(--chip-bg, var(--bg-elevated));
772
+ border-color: var(--accent);
773
+ color: var(--accent);
774
+ }
775
+
776
+ .usage-analysis-box {
777
+ flex: 1;
778
+ overflow-y: auto;
779
+ padding: 10px;
780
+ font-size: 0.78rem;
781
+ display: flex;
782
+ flex-direction: column;
783
+ gap: 8px;
784
+ }
785
+
786
+ .usage-card {
787
+ background: var(--bg-surface);
788
+ border: 1px solid var(--border-subtle);
789
+ border-radius: 6px;
790
+ padding: 8px;
791
+ }
792
+
793
+ .usage-card-title {
794
+ font-weight: 700;
795
+ color: var(--accent);
796
+ margin-bottom: 4px;
797
+ display: flex;
798
+ justify-content: space-between;
799
+ }
800
+
801
+ .usage-item {
802
+ padding: 4px 6px;
803
+ background: var(--bg-base);
804
+ border-radius: 4px;
805
+ border: 1px solid var(--border-subtle);
806
+ margin-top: 4px;
807
+ display: flex;
808
+ justify-content: space-between;
809
+ align-items: center;
810
+ cursor: pointer;
811
+ }
812
+ .usage-item:hover { border-color: var(--accent); background: var(--card-hover-bg, var(--bg-elevated)); }
813
+
814
+ .subgraph-editor-bar {
815
+ padding: 6px 10px;
816
+ background: var(--bg-surface);
817
+ border-bottom: 1px solid var(--border-subtle);
818
+ display: flex;
819
+ justify-content: flex-end;
820
+ align-items: center;
821
+ }
822
+
823
+ .editor-wrapper {
824
+ flex: 1;
825
+ display: flex;
826
+ position: relative;
827
+ overflow: hidden;
828
+ background: var(--editor-bg, var(--bg-base));
829
+ }
830
+
831
+ .line-numbers {
832
+ width: 48px;
833
+ min-width: 48px;
834
+ padding: 8px 6px;
835
+ background: var(--editor-line-bg, var(--bg-surface));
836
+ border-right: 1px solid var(--border-subtle);
837
+ color: var(--editor-line-text, var(--text-muted));
838
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
839
+ font-size: 12px;
840
+ text-align: right;
841
+ user-select: none;
842
+ overflow-y: hidden;
843
+ line-height: 20px;
844
+ box-sizing: border-box;
845
+ }
846
+
847
+ .subgraph-textarea {
848
+ flex: 1;
849
+ width: calc(100% - 48px);
850
+ height: 100%;
851
+ background: var(--editor-bg, var(--bg-base));
852
+ color: var(--editor-text, var(--text-main));
853
+ font-family: 'SFMono-Regular', Consolas, 'Liberation Mono', Menlo, Courier, monospace;
854
+ font-size: 12px;
855
+ padding: 8px 8px;
856
+ border: none;
857
+ outline: none;
858
+ resize: none;
859
+ line-height: 20px;
860
+ white-space: pre;
861
+ overflow-x: auto;
862
+ overflow-y: auto;
863
+ box-sizing: border-box;
864
+ }
865
+
866
+ .symbol-highlight-overlay {
867
+ position: absolute;
868
+ left: 48px;
869
+ right: 0;
870
+ width: calc(100% - 48px);
871
+ pointer-events: none;
872
+ background: linear-gradient(90deg, rgba(56, 189, 248, 0.22) 0%, rgba(56, 189, 248, 0.06) 100%);
873
+ border-left: 3.5px solid var(--accent);
874
+ border-top: 1px dashed rgba(56, 189, 248, 0.45);
875
+ border-bottom: 1px dashed rgba(56, 189, 248, 0.45);
876
+ box-shadow: inset 0 0 24px rgba(56, 189, 248, 0.12);
877
+ z-index: 5;
878
+ transition: top 0.12s ease-out, height 0.12s ease-out;
879
+ box-sizing: border-box;
880
+ animation: symbolHighlightGlow 2.5s infinite ease-in-out;
881
+ }
882
+
883
+ @keyframes symbolHighlightGlow {
884
+ 0%, 100% { border-left-color: var(--accent); box-shadow: inset 0 0 24px rgba(56, 189, 248, 0.12); }
885
+ 50% { border-left-color: #38bdf8; box-shadow: inset 0 0 32px rgba(56, 189, 248, 0.22); }
886
+ }
887
+
888
+ .symbol-highlight-badge {
889
+ position: absolute;
890
+ top: -20px;
891
+ right: 8px;
892
+ font-size: 0.62rem;
893
+ font-weight: 700;
894
+ color: var(--accent);
895
+ background: var(--panel-overlay-bg, var(--bg-surface));
896
+ border: 1px solid var(--accent);
897
+ padding: 1px 6px;
898
+ border-radius: 4px;
899
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.4);
900
+ pointer-events: none;
901
+ user-select: none;
902
+ white-space: nowrap;
903
+ z-index: 6;
904
+ }
905
+
906
+ .error-highlight-overlay {
907
+ position: absolute;
908
+ left: 48px;
909
+ right: 0;
910
+ width: calc(100% - 48px);
911
+ pointer-events: none;
912
+ background: linear-gradient(90deg, rgba(239, 68, 68, 0.2) 0%, rgba(239, 68, 68, 0.05) 100%);
913
+ border-left: 3px solid var(--danger);
914
+ border-top: 1px dashed rgba(239, 68, 68, 0.4);
915
+ border-bottom: 1px dashed rgba(239, 68, 68, 0.4);
916
+ box-shadow: inset 0 0 20px rgba(239, 68, 68, 0.08);
917
+ z-index: 5;
918
+ transition: none;
919
+ }
920
+
921
+ #subgraph-taskbar {
922
+ position: absolute;
923
+ bottom: 12px;
924
+ right: 300px;
925
+ display: flex;
926
+ gap: 6px;
927
+ flex-wrap: wrap-reverse;
928
+ z-index: 25;
929
+ pointer-events: none;
930
+ }
931
+
932
+ .taskbar-pill {
933
+ pointer-events: auto;
934
+ background: var(--bg-surface);
935
+ border: 1px solid var(--border-subtle);
936
+ color: var(--accent);
937
+ padding: 4px 10px;
938
+ border-radius: 16px;
939
+ font-size: 0.72rem;
940
+ font-weight: 600;
941
+ cursor: pointer;
942
+ display: flex;
943
+ align-items: center;
944
+ gap: 6px;
945
+ box-shadow: 0 4px 12px rgba(0,0,0,0.5);
946
+ }
947
+ .taskbar-pill:hover { border-color: var(--accent); background: var(--bg-elevated); }
948
+
949
+ #toast-container {
950
+ position: fixed;
951
+ top: 16px;
952
+ right: 16px;
953
+ z-index: 9999;
954
+ display: flex;
955
+ flex-direction: column;
956
+ gap: 8px;
957
+ pointer-events: none;
958
+ }
959
+
960
+ .toast {
961
+ pointer-events: auto;
962
+ padding: 8px 14px;
963
+ border-radius: 6px;
964
+ font-size: 0.78rem;
965
+ font-weight: 600;
966
+ color: #fff;
967
+ background: rgba(30, 41, 59, 0.95);
968
+ border: 1px solid var(--border-strong);
969
+ box-shadow: 0 8px 24px rgba(0,0,0,0.6);
970
+ backdrop-filter: blur(8px);
971
+ transition: opacity 0.3s ease, transform 0.3s ease;
972
+ }
973
+ .toast.success { border-color: var(--success); color: #6ee7b7; }
974
+ .toast.error { border-color: var(--danger); color: #fca5a5; }
975
+ .toast.info { border-color: var(--accent); color: var(--accent); }
976
+
977
+ .zoom-controls {
978
+ position: absolute;
979
+ bottom: 24px;
980
+ right: 24px;
981
+ display: flex;
982
+ flex-direction: column;
983
+ gap: 6px;
984
+ z-index: 50;
985
+ }
986
+
987
+ .zoom-btn {
988
+ width: 38px;
989
+ height: 38px;
990
+ border-radius: 8px;
991
+ background: var(--panel-overlay-bg, var(--bg-surface));
992
+ border: 1px solid var(--border-subtle);
993
+ color: var(--text-main);
994
+ font-size: 1.1rem;
995
+ font-weight: 700;
996
+ display: flex;
997
+ align-items: center;
998
+ justify-content: center;
999
+ cursor: pointer;
1000
+ box-shadow: 0 4px 12px rgba(0,0,0,0.3);
1001
+ backdrop-filter: blur(8px);
1002
+ transition: all 0.2s ease;
1003
+ user-select: none;
1004
+ -webkit-tap-highlight-color: transparent;
1005
+ }
1006
+ .zoom-btn:hover, .zoom-btn:active {
1007
+ background: var(--bg-elevated);
1008
+ border-color: var(--accent);
1009
+ color: var(--accent);
1010
+ transform: scale(1.05);
1011
+ }
1012
+ .zoom-btn.active {
1013
+ background: var(--primary);
1014
+ border-color: var(--accent);
1015
+ color: white;
1016
+ }
1017
+
1018
+ .symbol-filter-popover {
1019
+ position: absolute;
1020
+ bottom: 24px;
1021
+ right: 70px;
1022
+ width: 240px;
1023
+ background: var(--panel-overlay-bg, var(--bg-surface));
1024
+ border: 1px solid var(--border-strong, var(--border-subtle));
1025
+ border-radius: 10px;
1026
+ padding: 10px;
1027
+ box-shadow: 0 10px 28px rgba(0, 0, 0, 0.5);
1028
+ backdrop-filter: blur(12px);
1029
+ -webkit-backdrop-filter: blur(12px);
1030
+ z-index: 60;
1031
+ user-select: none;
1032
+ animation: fadeInPopover 0.15s ease-out;
1033
+ }
1034
+
1035
+ @keyframes fadeInPopover {
1036
+ from { opacity: 0; transform: translateY(6px); }
1037
+ to { opacity: 1; transform: translateY(0); }
1038
+ }
1039
+
1040
+ .symbol-filter-header {
1041
+ display: flex;
1042
+ justify-content: space-between;
1043
+ align-items: center;
1044
+ margin-bottom: 8px;
1045
+ padding-bottom: 6px;
1046
+ border-bottom: 1px solid var(--border-subtle);
1047
+ }
1048
+
1049
+ .symbol-filter-title {
1050
+ font-size: 0.76rem;
1051
+ font-weight: 700;
1052
+ color: var(--text-main);
1053
+ display: flex;
1054
+ align-items: center;
1055
+ gap: 5px;
1056
+ }
1057
+
1058
+ .symbol-filter-quick-actions {
1059
+ display: flex;
1060
+ gap: 4px;
1061
+ }
1062
+
1063
+ .filter-action-btn {
1064
+ background: var(--bg-elevated);
1065
+ border: 1px solid var(--border-subtle);
1066
+ color: var(--text-muted);
1067
+ font-size: 0.65rem;
1068
+ font-weight: 600;
1069
+ padding: 1px 6px;
1070
+ border-radius: 4px;
1071
+ cursor: pointer;
1072
+ transition: all 0.15s ease;
1073
+ }
1074
+
1075
+ .filter-action-btn:hover {
1076
+ color: var(--text-main);
1077
+ border-color: var(--accent);
1078
+ background: var(--bg-surface);
1079
+ }
1080
+
1081
+ .symbol-filter-items-list {
1082
+ display: flex;
1083
+ flex-direction: column;
1084
+ gap: 3px;
1085
+ max-height: 220px;
1086
+ overflow-y: auto;
1087
+ }
1088
+
1089
+ .symbol-filter-item {
1090
+ display: flex;
1091
+ align-items: center;
1092
+ justify-content: space-between;
1093
+ padding: 4px 6px;
1094
+ border-radius: 5px;
1095
+ cursor: pointer;
1096
+ font-size: 0.74rem;
1097
+ color: var(--text-main);
1098
+ transition: background 0.15s ease;
1099
+ }
1100
+
1101
+ .symbol-filter-item:hover {
1102
+ background: var(--bg-elevated);
1103
+ }
1104
+
1105
+ .symbol-filter-item label {
1106
+ display: flex;
1107
+ align-items: center;
1108
+ gap: 6px;
1109
+ cursor: pointer;
1110
+ flex: 1;
1111
+ overflow: hidden;
1112
+ text-overflow: ellipsis;
1113
+ white-space: nowrap;
1114
+ }
1115
+
1116
+ .symbol-filter-item input[type="checkbox"] {
1117
+ accent-color: var(--accent);
1118
+ cursor: pointer;
1119
+ width: 13px;
1120
+ height: 13px;
1121
+ margin: 0;
1122
+ }
1123
+
1124
+ .symbol-filter-count {
1125
+ font-size: 0.65rem;
1126
+ font-weight: 600;
1127
+ padding: 1px 6px;
1128
+ border-radius: 10px;
1129
+ background: var(--bg-elevated);
1130
+ color: var(--text-muted);
1131
+ }
1132
+
1133
+ canvas#graph-canvas {
1134
+ touch-action: none;
1135
+ }
1136
+
1137
+ canvas#graph-canvas.background-inert {
1138
+ pointer-events: none !important;
1139
+ opacity: 0.88;
1140
+ filter: saturate(0.85);
1141
+ transition: opacity 0.2s ease, filter 0.2s ease;
1142
+ }
1143
+
1144
+ @media (max-width: 768px), (pointer: coarse) {
1145
+ .line-numbers,
1146
+ .subgraph-textarea {
1147
+ font-size: 16px !important;
1148
+ line-height: 24px !important;
1149
+ }
1150
+ }
1151
+
1152
+ .minimap-container {
1153
+ position: absolute;
1154
+ top: 14px;
1155
+ right: 14px;
1156
+ width: 220px;
1157
+ background: transparent;
1158
+ backdrop-filter: blur(4px);
1159
+ -webkit-backdrop-filter: blur(4px);
1160
+ border: 1px solid var(--border-subtle);
1161
+ border-radius: 8px;
1162
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
1163
+ z-index: 100;
1164
+ overflow: hidden;
1165
+ display: flex;
1166
+ flex-direction: column;
1167
+ transition: opacity 0.2s ease, transform 0.2s ease;
1168
+ user-select: none;
1169
+ }
1170
+
1171
+ .minimap-header {
1172
+ height: 28px;
1173
+ background: rgba(15, 23, 42, 0.25);
1174
+ border-bottom: 1px solid var(--border-subtle);
1175
+ display: flex;
1176
+ align-items: center;
1177
+ justify-content: space-between;
1178
+ padding: 0 8px;
1179
+ cursor: pointer;
1180
+ }
1181
+
1182
+ .minimap-title {
1183
+ display: flex;
1184
+ align-items: center;
1185
+ gap: 6px;
1186
+ font-size: 0.72rem;
1187
+ font-weight: 700;
1188
+ color: var(--text-main);
1189
+ }
1190
+ .minimap-title svg {
1191
+ color: var(--accent);
1192
+ }
1193
+
1194
+ .minimap-count {
1195
+ font-size: 0.65rem;
1196
+ font-weight: 600;
1197
+ color: var(--text-muted);
1198
+ background: var(--bg-base);
1199
+ padding: 1px 5px;
1200
+ border-radius: 10px;
1201
+ border: 1px solid var(--border-subtle);
1202
+ }
1203
+
1204
+ .minimap-canvas-wrapper {
1205
+ position: relative;
1206
+ width: 220px;
1207
+ height: 140px;
1208
+ background: transparent;
1209
+ }
1210
+
1211
+ #minimap-canvas {
1212
+ width: 220px;
1213
+ height: 140px;
1214
+ display: block;
1215
+ cursor: crosshair;
1216
+ }
1217
+
1218
+ .minimap-tooltip {
1219
+ position: absolute;
1220
+ background: var(--panel-overlay-bg, rgba(15, 23, 42, 0.96));
1221
+ border: 1px solid var(--border-strong);
1222
+ border-radius: 4px;
1223
+ padding: 2px 6px;
1224
+ font-size: 0.65rem;
1225
+ color: var(--text-main);
1226
+ pointer-events: none;
1227
+ white-space: nowrap;
1228
+ z-index: 105;
1229
+ box-shadow: 0 4px 10px rgba(0,0,0,0.5);
1230
+ max-width: 160px;
1231
+ overflow: hidden;
1232
+ text-overflow: ellipsis;
1233
+ }
1234
+
1235
+ .defect-actions {
1236
+ display: flex;
1237
+ gap: 4px;
1238
+ margin-top: 6px;
1239
+ }
1240
+ .defect-actions button {
1241
+ font-size: 0.68rem;
1242
+ padding: 2px 6px;
1243
+ }
1244
+
1245
+ [data-theme="cyber"] {
1246
+ --bg-base: #030712;
1247
+ --bg-surface: #0b132b;
1248
+ --bg-elevated: #1c2541;
1249
+ --border-subtle: #1f293d;
1250
+ --border-strong: #00f0ff;
1251
+ --text-main: #f0fdfa;
1252
+ --text-muted: #5eead4;
1253
+ --text-dim: #2dd4bf;
1254
+ --primary: #00f0ff;
1255
+ --primary-hover: #38bdf8;
1256
+ --accent: #00f0ff;
1257
+ --minimap-bg: rgba(3, 7, 18, 0.40);
1258
+ --panel-overlay-bg: rgba(3, 7, 18, 0.90);
1259
+ --panel-header-bg: #0b132b;
1260
+ --editor-bg: #020617;
1261
+ --editor-text: #f0fdfa;
1262
+ --editor-line-bg: #090e1a;
1263
+ --editor-line-text: #2dd4bf;
1264
+ --subgraph-bg: rgba(11, 19, 43, 0.98);
1265
+ --subgraph-bar-bg: rgba(11, 19, 43, 0.94);
1266
+ --subgraph-bar-text: "#5eead4";
1267
+ --chip-bg: rgba(28, 37, 65, 0.8);
1268
+ --chip-text: #5eead4;
1269
+ --card-hover-bg: #1c2541;
1270
+ }
1271
+
1272
+ [data-theme="light"] {
1273
+ --bg-base: #f8fafc;
1274
+ --bg-surface: #ffffff;
1275
+ --bg-elevated: #f1f5f9;
1276
+ --border-subtle: #e2e8f0;
1277
+ --border-strong: #cbd5e1;
1278
+ --text-main: #0f172a;
1279
+ --text-muted: #475569;
1280
+ --text-dim: #64748b;
1281
+ --primary: #2563eb;
1282
+ --primary-hover: #1d4ed8;
1283
+ --accent: #0284c7;
1284
+ --minimap-bg: rgba(255, 255, 255, 0.55);
1285
+ --panel-overlay-bg: rgba(255, 255, 255, 0.92);
1286
+ --panel-header-bg: #ffffff;
1287
+ --editor-bg: #ffffff;
1288
+ --editor-text: #0f172a;
1289
+ --editor-line-bg: #f8fafc;
1290
+ --editor-line-text: #64748b;
1291
+ --subgraph-bg: rgba(255, 255, 255, 0.98);
1292
+ --subgraph-bar-bg: rgba(241, 245, 249, 0.94);
1293
+ --subgraph-bar-text: #0f172a;
1294
+ --chip-bg: rgba(226, 232, 240, 0.8);
1295
+ --chip-text: #0f172a;
1296
+ --card-hover-bg: #f1f5f9;
1297
+ }
1298
+
1299
+ .btn-quick-search {
1300
+ display: flex;
1301
+ align-items: center;
1302
+ gap: 6px;
1303
+ background: var(--bg-elevated);
1304
+ border: 1px solid var(--border-subtle);
1305
+ padding: 4px 8px;
1306
+ border-radius: 6px;
1307
+ color: var(--text-muted);
1308
+ }
1309
+ .btn-quick-search:hover {
1310
+ border-color: var(--accent);
1311
+ color: var(--text-main);
1312
+ }
1313
+ .kbd-badge {
1314
+ background: var(--bg-base);
1315
+ border: 1px solid var(--border-subtle);
1316
+ padding: 1px 4px;
1317
+ border-radius: 3px;
1318
+ font-size: 0.65rem;
1319
+ font-family: monospace;
1320
+ color: var(--text-dim);
1321
+ }
1322
+
1323
+ .node-hud-panel {
1324
+ position: absolute;
1325
+ bottom: 24px;
1326
+ left: 24px;
1327
+ background: var(--panel-overlay-bg, rgba(15, 23, 42, 0.95));
1328
+ backdrop-filter: blur(12px);
1329
+ border: 1px solid var(--border-strong);
1330
+ border-radius: 10px;
1331
+ padding: 12px 16px;
1332
+ min-width: 280px;
1333
+ max-width: 420px;
1334
+ box-shadow: 0 12px 32px rgba(0, 0, 0, 0.65);
1335
+ z-index: 100;
1336
+ animation: fadeInSlideUp 0.18s ease-out;
1337
+ color: var(--text-main);
1338
+ }
1339
+ .hud-header {
1340
+ display: flex;
1341
+ justify-content: space-between;
1342
+ align-items: center;
1343
+ margin-bottom: 6px;
1344
+ }
1345
+ .hud-tracer-title {
1346
+ font-size: 0.82rem;
1347
+ font-weight: 700;
1348
+ color: var(--accent);
1349
+ display: flex;
1350
+ align-items: center;
1351
+ gap: 6px;
1352
+ }
1353
+ .btn-close-hud {
1354
+ padding: 2px 7px;
1355
+ font-size: 0.7rem;
1356
+ border-radius: 4px;
1357
+ }
1358
+ .hud-tracer-flow {
1359
+ display: flex;
1360
+ align-items: center;
1361
+ gap: 8px;
1362
+ background: var(--bg-base);
1363
+ padding: 8px 10px;
1364
+ border-radius: 6px;
1365
+ border: 1px solid var(--border-subtle);
1366
+ margin: 8px 0;
1367
+ }
1368
+ .tracer-endpoint {
1369
+ flex: 1;
1370
+ display: flex;
1371
+ flex-direction: column;
1372
+ gap: 2px;
1373
+ overflow: hidden;
1374
+ }
1375
+ .endpoint-label {
1376
+ font-size: 0.62rem;
1377
+ font-weight: 700;
1378
+ color: var(--text-dim);
1379
+ letter-spacing: 0.05em;
1380
+ text-transform: uppercase;
1381
+ }
1382
+ .endpoint-val {
1383
+ font-size: 0.75rem;
1384
+ font-weight: 600;
1385
+ color: var(--text-main);
1386
+ white-space: nowrap;
1387
+ overflow: hidden;
1388
+ text-overflow: ellipsis;
1389
+ }
1390
+ .tracer-arrow {
1391
+ color: var(--accent);
1392
+ font-weight: 700;
1393
+ font-size: 0.85rem;
1394
+ }
1395
+ .hud-tracer-results {
1396
+ background: var(--bg-base);
1397
+ border: 1px dashed var(--border-subtle);
1398
+ border-radius: 6px;
1399
+ padding: 8px;
1400
+ margin: 8px 0;
1401
+ font-size: 0.72rem;
1402
+ }
1403
+ .tracer-hops-count {
1404
+ font-weight: 700;
1405
+ color: #38bdf8;
1406
+ margin-bottom: 4px;
1407
+ }
1408
+ .tracer-hops-list {
1409
+ display: flex;
1410
+ flex-wrap: wrap;
1411
+ align-items: center;
1412
+ gap: 4px;
1413
+ max-height: 80px;
1414
+ overflow-y: auto;
1415
+ }
1416
+ .hop-chip {
1417
+ display: inline-block;
1418
+ padding: 2px 6px;
1419
+ background: var(--bg-elevated);
1420
+ border: 1px solid var(--border-subtle);
1421
+ border-radius: 4px;
1422
+ font-size: 0.68rem;
1423
+ color: var(--text-muted);
1424
+ }
1425
+ .hop-chip.active {
1426
+ background: var(--accent);
1427
+ color: #0f172a;
1428
+ font-weight: 700;
1429
+ border-color: var(--accent);
1430
+ }
1431
+ .hop-arrow {
1432
+ color: var(--accent);
1433
+ font-size: 0.7rem;
1434
+ }
1435
+ .hud-actions {
1436
+ display: flex;
1437
+ gap: 6px;
1438
+ margin-top: 8px;
1439
+ }
1440
+ .hud-actions button {
1441
+ font-size: 0.7rem;
1442
+ padding: 4px 8px;
1443
+ border-radius: 4px;
1444
+ }
1445
+
1446
+ .palette-modal-backdrop {
1447
+ position: fixed;
1448
+ top: 0;
1449
+ left: 0;
1450
+ right: 0;
1451
+ bottom: 0;
1452
+ background: rgba(0, 0, 0, 0.6);
1453
+ backdrop-filter: blur(4px);
1454
+ display: flex;
1455
+ justify-content: center;
1456
+ align-items: flex-start;
1457
+ padding-top: 10vh;
1458
+ z-index: 1000;
1459
+ animation: fadeIn 0.15s ease;
1460
+ }
1461
+ .palette-modal-card {
1462
+ background: var(--bg-surface);
1463
+ border: 1px solid var(--border-strong);
1464
+ border-radius: 10px;
1465
+ width: 90%;
1466
+ max-width: 580px;
1467
+ box-shadow: 0 16px 40px rgba(0, 0, 0, 0.6);
1468
+ overflow: hidden;
1469
+ display: flex;
1470
+ flex-direction: column;
1471
+ }
1472
+ .palette-input-wrapper {
1473
+ display: flex;
1474
+ align-items: center;
1475
+ gap: 10px;
1476
+ padding: 12px 16px;
1477
+ border-bottom: 1px solid var(--border-subtle);
1478
+ background: var(--bg-base);
1479
+ }
1480
+ .palette-input-wrapper input {
1481
+ flex: 1;
1482
+ background: transparent;
1483
+ border: none;
1484
+ outline: none;
1485
+ color: var(--text-main);
1486
+ font-size: 0.95rem;
1487
+ }
1488
+ .palette-results {
1489
+ max-height: 380px;
1490
+ overflow-y: auto;
1491
+ padding: 6px;
1492
+ }
1493
+ .palette-group-title {
1494
+ font-size: 0.68rem;
1495
+ font-weight: 700;
1496
+ color: var(--text-dim);
1497
+ text-transform: uppercase;
1498
+ letter-spacing: 0.05em;
1499
+ padding: 6px 10px 2px;
1500
+ }
1501
+ .palette-item {
1502
+ display: flex;
1503
+ justify-content: space-between;
1504
+ align-items: center;
1505
+ padding: 7px 10px;
1506
+ border-radius: 6px;
1507
+ cursor: pointer;
1508
+ font-size: 0.8rem;
1509
+ color: var(--text-main);
1510
+ transition: background 0.1s;
1511
+ }
1512
+ .palette-item:hover, .palette-item.selected {
1513
+ background: var(--primary);
1514
+ color: white;
1515
+ }
1516
+ .palette-item:hover span, .palette-item.selected span {
1517
+ color: white !important;
1518
+ }
1519
+
1520
+ .shortcuts-grid {
1521
+ display: flex;
1522
+ flex-direction: column;
1523
+ gap: 8px;
1524
+ padding: 8px 0;
1525
+ }
1526
+ .shortcut-row {
1527
+ display: flex;
1528
+ justify-content: space-between;
1529
+ align-items: center;
1530
+ font-size: 0.8rem;
1531
+ color: var(--text-muted);
1532
+ }
1533
+ .shortcut-row kbd {
1534
+ background: var(--bg-base);
1535
+ border: 1px solid var(--border-subtle);
1536
+ padding: 2px 6px;
1537
+ border-radius: 4px;
1538
+ font-family: monospace;
1539
+ font-size: 0.72rem;
1540
+ color: var(--accent);
1541
+ }
1542
+
1543
+ @keyframes fadeInSlideUp {
1544
+ from { opacity: 0; transform: translateY(8px); }
1545
+ to { opacity: 1; transform: translateY(0); }
1546
+ }
1547
+ @keyframes fadeIn {
1548
+ from { opacity: 0; }
1549
+ to { opacity: 1; }
1550
+ }
1551
+
1552
+ .loading-overlay {
1553
+ position: absolute;
1554
+ top: 16px;
1555
+ left: 50%;
1556
+ transform: translateX(-50%);
1557
+ z-index: 500;
1558
+ display: flex;
1559
+ align-items: center;
1560
+ gap: 10px;
1561
+ background: rgba(15, 23, 42, 0.88);
1562
+ backdrop-filter: blur(8px);
1563
+ border: 1px solid var(--border-strong);
1564
+ padding: 6px 16px;
1565
+ border-radius: 20px;
1566
+ box-shadow: 0 8px 24px rgba(0,0,0,0.4);
1567
+ pointer-events: none;
1568
+ animation: fadeIn 0.2s ease;
1569
+ }
1570
+ .loading-spinner {
1571
+ width: 14px;
1572
+ height: 14px;
1573
+ border: 2px solid rgba(56, 189, 248, 0.2);
1574
+ border-top-color: #38bdf8;
1575
+ border-radius: 50%;
1576
+ animation: spin 0.7s linear infinite;
1577
+ }
1578
+ @keyframes spin {
1579
+ to { transform: rotate(360deg); }
1580
+ }
1581
+
1582
+ @media (max-width: 768px) {
1583
+ header { padding: 6px 10px; }
1584
+ .logo { font-size: 0.95rem; }
1585
+ .sidebar { position: absolute; top: 0; bottom: 0; left: 0; width: 280px; box-shadow: 4px 0 20px rgba(0,0,0,0.6); }
1586
+ .sidebar.collapsed { margin-left: -280px; }
1587
+ .legend { display: none; }
1588
+ .minimap-container {
1589
+ width: 170px;
1590
+ right: 12px;
1591
+ top: 12px;
1592
+ }
1593
+ .minimap-canvas-wrapper, #minimap-canvas {
1594
+ width: 170px;
1595
+ height: 110px;
1596
+ }
1597
+ .zoom-controls {
1598
+ bottom: 16px;
1599
+ right: 16px;
1600
+ }
1601
+ .node-hud-panel {
1602
+ left: 12px;
1603
+ right: 12px;
1604
+ bottom: 12px;
1605
+ min-width: auto;
1606
+ max-width: calc(100vw - 24px);
1607
+ padding: 10px 12px;
1608
+ }
1609
+ }