mcp-vector-search 0.15.7__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.
Potentially problematic release.
This version of mcp-vector-search might be problematic. Click here for more details.
- mcp_vector_search/__init__.py +10 -0
- mcp_vector_search/cli/__init__.py +1 -0
- mcp_vector_search/cli/commands/__init__.py +1 -0
- mcp_vector_search/cli/commands/auto_index.py +397 -0
- mcp_vector_search/cli/commands/chat.py +534 -0
- mcp_vector_search/cli/commands/config.py +393 -0
- mcp_vector_search/cli/commands/demo.py +358 -0
- mcp_vector_search/cli/commands/index.py +762 -0
- mcp_vector_search/cli/commands/init.py +658 -0
- mcp_vector_search/cli/commands/install.py +869 -0
- mcp_vector_search/cli/commands/install_old.py +700 -0
- mcp_vector_search/cli/commands/mcp.py +1254 -0
- mcp_vector_search/cli/commands/reset.py +393 -0
- mcp_vector_search/cli/commands/search.py +796 -0
- mcp_vector_search/cli/commands/setup.py +1133 -0
- mcp_vector_search/cli/commands/status.py +584 -0
- mcp_vector_search/cli/commands/uninstall.py +404 -0
- mcp_vector_search/cli/commands/visualize/__init__.py +39 -0
- mcp_vector_search/cli/commands/visualize/cli.py +265 -0
- mcp_vector_search/cli/commands/visualize/exporters/__init__.py +12 -0
- mcp_vector_search/cli/commands/visualize/exporters/html_exporter.py +33 -0
- mcp_vector_search/cli/commands/visualize/exporters/json_exporter.py +29 -0
- mcp_vector_search/cli/commands/visualize/graph_builder.py +709 -0
- mcp_vector_search/cli/commands/visualize/layout_engine.py +469 -0
- mcp_vector_search/cli/commands/visualize/server.py +201 -0
- mcp_vector_search/cli/commands/visualize/state_manager.py +428 -0
- mcp_vector_search/cli/commands/visualize/templates/__init__.py +16 -0
- mcp_vector_search/cli/commands/visualize/templates/base.py +218 -0
- mcp_vector_search/cli/commands/visualize/templates/scripts.py +3670 -0
- mcp_vector_search/cli/commands/visualize/templates/styles.py +779 -0
- mcp_vector_search/cli/commands/visualize.py.original +2536 -0
- mcp_vector_search/cli/commands/watch.py +287 -0
- mcp_vector_search/cli/didyoumean.py +520 -0
- mcp_vector_search/cli/export.py +320 -0
- mcp_vector_search/cli/history.py +295 -0
- mcp_vector_search/cli/interactive.py +342 -0
- mcp_vector_search/cli/main.py +484 -0
- mcp_vector_search/cli/output.py +414 -0
- mcp_vector_search/cli/suggestions.py +375 -0
- mcp_vector_search/config/__init__.py +1 -0
- mcp_vector_search/config/constants.py +24 -0
- mcp_vector_search/config/defaults.py +200 -0
- mcp_vector_search/config/settings.py +146 -0
- mcp_vector_search/core/__init__.py +1 -0
- mcp_vector_search/core/auto_indexer.py +298 -0
- mcp_vector_search/core/config_utils.py +394 -0
- mcp_vector_search/core/connection_pool.py +360 -0
- mcp_vector_search/core/database.py +1237 -0
- mcp_vector_search/core/directory_index.py +318 -0
- mcp_vector_search/core/embeddings.py +294 -0
- mcp_vector_search/core/exceptions.py +89 -0
- mcp_vector_search/core/factory.py +318 -0
- mcp_vector_search/core/git_hooks.py +345 -0
- mcp_vector_search/core/indexer.py +1002 -0
- mcp_vector_search/core/llm_client.py +453 -0
- mcp_vector_search/core/models.py +294 -0
- mcp_vector_search/core/project.py +350 -0
- mcp_vector_search/core/scheduler.py +330 -0
- mcp_vector_search/core/search.py +952 -0
- mcp_vector_search/core/watcher.py +322 -0
- mcp_vector_search/mcp/__init__.py +5 -0
- mcp_vector_search/mcp/__main__.py +25 -0
- mcp_vector_search/mcp/server.py +752 -0
- mcp_vector_search/parsers/__init__.py +8 -0
- mcp_vector_search/parsers/base.py +296 -0
- mcp_vector_search/parsers/dart.py +605 -0
- mcp_vector_search/parsers/html.py +413 -0
- mcp_vector_search/parsers/javascript.py +643 -0
- mcp_vector_search/parsers/php.py +694 -0
- mcp_vector_search/parsers/python.py +502 -0
- mcp_vector_search/parsers/registry.py +223 -0
- mcp_vector_search/parsers/ruby.py +678 -0
- mcp_vector_search/parsers/text.py +186 -0
- mcp_vector_search/parsers/utils.py +265 -0
- mcp_vector_search/py.typed +1 -0
- mcp_vector_search/utils/__init__.py +42 -0
- mcp_vector_search/utils/gitignore.py +250 -0
- mcp_vector_search/utils/gitignore_updater.py +212 -0
- mcp_vector_search/utils/monorepo.py +339 -0
- mcp_vector_search/utils/timing.py +338 -0
- mcp_vector_search/utils/version.py +47 -0
- mcp_vector_search-0.15.7.dist-info/METADATA +884 -0
- mcp_vector_search-0.15.7.dist-info/RECORD +86 -0
- mcp_vector_search-0.15.7.dist-info/WHEEL +4 -0
- mcp_vector_search-0.15.7.dist-info/entry_points.txt +3 -0
- mcp_vector_search-0.15.7.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,779 @@
|
|
|
1
|
+
"""CSS styles for the visualization interface.
|
|
2
|
+
|
|
3
|
+
This module contains all CSS styling for the D3.js code graph visualization,
|
|
4
|
+
organized into logical sections for maintainability.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
def get_base_styles() -> str:
|
|
9
|
+
"""Get base styles for body and core layout.
|
|
10
|
+
|
|
11
|
+
Returns:
|
|
12
|
+
CSS string for base styling
|
|
13
|
+
"""
|
|
14
|
+
return """
|
|
15
|
+
body {
|
|
16
|
+
margin: 0;
|
|
17
|
+
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
|
|
18
|
+
background: #0d1117;
|
|
19
|
+
color: #c9d1d9;
|
|
20
|
+
overflow: hidden;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
h1 { margin: 0 0 16px 0; font-size: 18px; }
|
|
24
|
+
h3 { margin: 16px 0 8px 0; font-size: 14px; color: #8b949e; }
|
|
25
|
+
"""
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
def get_controls_styles() -> str:
|
|
29
|
+
"""Get styles for the control panel.
|
|
30
|
+
|
|
31
|
+
Returns:
|
|
32
|
+
CSS string for control panel styling
|
|
33
|
+
"""
|
|
34
|
+
return """
|
|
35
|
+
#controls {
|
|
36
|
+
position: absolute;
|
|
37
|
+
top: 20px;
|
|
38
|
+
left: 20px;
|
|
39
|
+
background: rgba(13, 17, 23, 0.95);
|
|
40
|
+
border: 1px solid #30363d;
|
|
41
|
+
border-radius: 6px;
|
|
42
|
+
padding: 16px;
|
|
43
|
+
min-width: 250px;
|
|
44
|
+
max-height: 80vh;
|
|
45
|
+
overflow-y: auto;
|
|
46
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.control-group {
|
|
50
|
+
margin-bottom: 12px;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
label {
|
|
54
|
+
display: block;
|
|
55
|
+
margin-bottom: 4px;
|
|
56
|
+
font-size: 12px;
|
|
57
|
+
color: #8b949e;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
input[type="file"] {
|
|
61
|
+
width: 100%;
|
|
62
|
+
padding: 6px;
|
|
63
|
+
background: #161b22;
|
|
64
|
+
border: 1px solid #30363d;
|
|
65
|
+
border-radius: 6px;
|
|
66
|
+
color: #c9d1d9;
|
|
67
|
+
font-size: 12px;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
.legend {
|
|
71
|
+
background: #161b22;
|
|
72
|
+
border: 1px solid #30363d;
|
|
73
|
+
border-radius: 6px;
|
|
74
|
+
padding: 12px;
|
|
75
|
+
font-size: 13px;
|
|
76
|
+
max-width: 300px;
|
|
77
|
+
margin-top: 16px;
|
|
78
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.legend-category {
|
|
82
|
+
margin-bottom: 12px;
|
|
83
|
+
padding-bottom: 8px;
|
|
84
|
+
border-bottom: 1px solid #21262d;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.legend-category:last-child {
|
|
88
|
+
margin-bottom: 0;
|
|
89
|
+
padding-bottom: 0;
|
|
90
|
+
border-bottom: none;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
.legend-title {
|
|
94
|
+
font-weight: 600;
|
|
95
|
+
color: #c9d1d9;
|
|
96
|
+
margin-bottom: 8px;
|
|
97
|
+
font-size: 12px;
|
|
98
|
+
text-transform: uppercase;
|
|
99
|
+
letter-spacing: 0.5px;
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.legend-item {
|
|
103
|
+
display: flex;
|
|
104
|
+
align-items: center;
|
|
105
|
+
margin-bottom: 6px;
|
|
106
|
+
padding-left: 8px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.legend-item:last-child {
|
|
110
|
+
margin-bottom: 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.legend-color {
|
|
114
|
+
width: 12px;
|
|
115
|
+
height: 12px;
|
|
116
|
+
border-radius: 50%;
|
|
117
|
+
margin-right: 8px;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
.stats {
|
|
121
|
+
margin-top: 16px;
|
|
122
|
+
padding-top: 16px;
|
|
123
|
+
border-top: 1px solid #30363d;
|
|
124
|
+
font-size: 12px;
|
|
125
|
+
color: #8b949e;
|
|
126
|
+
}
|
|
127
|
+
"""
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
def get_graph_styles() -> str:
|
|
131
|
+
"""Get styles for the graph SVG element.
|
|
132
|
+
|
|
133
|
+
Returns:
|
|
134
|
+
CSS string for graph styling
|
|
135
|
+
"""
|
|
136
|
+
return """
|
|
137
|
+
#graph {
|
|
138
|
+
width: 100vw;
|
|
139
|
+
height: 100vh;
|
|
140
|
+
}
|
|
141
|
+
"""
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def get_node_styles() -> str:
|
|
145
|
+
"""Get styles for graph nodes.
|
|
146
|
+
|
|
147
|
+
Returns:
|
|
148
|
+
CSS string for node styling including different node types
|
|
149
|
+
"""
|
|
150
|
+
return """
|
|
151
|
+
.node circle {
|
|
152
|
+
cursor: pointer;
|
|
153
|
+
stroke: #c9d1d9;
|
|
154
|
+
stroke-width: 2px;
|
|
155
|
+
pointer-events: all;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.node.module circle { fill: #238636; }
|
|
159
|
+
.node.class circle { fill: #1f6feb; }
|
|
160
|
+
.node.function circle { fill: #d29922; }
|
|
161
|
+
.node.method circle { fill: #8957e5; }
|
|
162
|
+
.node.code circle { fill: #6e7681; }
|
|
163
|
+
.node.file circle {
|
|
164
|
+
fill: none;
|
|
165
|
+
stroke: #58a6ff;
|
|
166
|
+
stroke-width: 2px;
|
|
167
|
+
stroke-dasharray: 5,3;
|
|
168
|
+
opacity: 0.6;
|
|
169
|
+
}
|
|
170
|
+
.node.directory circle {
|
|
171
|
+
fill: none;
|
|
172
|
+
stroke: #79c0ff;
|
|
173
|
+
stroke-width: 2px;
|
|
174
|
+
stroke-dasharray: 3,3;
|
|
175
|
+
opacity: 0.5;
|
|
176
|
+
}
|
|
177
|
+
.node.subproject circle { fill: #da3633; stroke-width: 3px; }
|
|
178
|
+
|
|
179
|
+
/* Non-code document nodes - squares */
|
|
180
|
+
.node.docstring rect { fill: #8b949e; }
|
|
181
|
+
.node.comment rect { fill: #6e7681; }
|
|
182
|
+
.node rect {
|
|
183
|
+
cursor: pointer;
|
|
184
|
+
stroke: #c9d1d9;
|
|
185
|
+
stroke-width: 2px;
|
|
186
|
+
pointer-events: all;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* File type icon styling */
|
|
190
|
+
.node path.file-icon {
|
|
191
|
+
fill: currentColor;
|
|
192
|
+
stroke: none;
|
|
193
|
+
pointer-events: all;
|
|
194
|
+
cursor: pointer;
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.node text {
|
|
198
|
+
font-size: 14px;
|
|
199
|
+
fill: #c9d1d9;
|
|
200
|
+
text-anchor: middle;
|
|
201
|
+
pointer-events: none;
|
|
202
|
+
user-select: none;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
.node.highlighted circle,
|
|
206
|
+
.node.highlighted rect {
|
|
207
|
+
stroke: #f0e68c;
|
|
208
|
+
stroke-width: 3px;
|
|
209
|
+
filter: drop-shadow(0 0 8px #f0e68c);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/* Node loading spinner */
|
|
213
|
+
.node-loading {
|
|
214
|
+
stroke: #2196F3;
|
|
215
|
+
stroke-width: 3;
|
|
216
|
+
fill: none;
|
|
217
|
+
animation: spin 1s linear infinite;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
.node-loading-overlay {
|
|
221
|
+
fill: rgba(255, 255, 255, 0.8);
|
|
222
|
+
pointer-events: none;
|
|
223
|
+
}
|
|
224
|
+
"""
|
|
225
|
+
|
|
226
|
+
|
|
227
|
+
def get_link_styles() -> str:
|
|
228
|
+
"""Get styles for graph links (edges).
|
|
229
|
+
|
|
230
|
+
Returns:
|
|
231
|
+
CSS string for link styling including semantic similarity and cycles
|
|
232
|
+
"""
|
|
233
|
+
return """
|
|
234
|
+
.link {
|
|
235
|
+
stroke: #30363d;
|
|
236
|
+
stroke-opacity: 0.6;
|
|
237
|
+
stroke-width: 1.5px;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.link.dependency {
|
|
241
|
+
stroke: #d29922;
|
|
242
|
+
stroke-opacity: 0.8;
|
|
243
|
+
stroke-width: 2px;
|
|
244
|
+
stroke-dasharray: 5,5;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
/* Semantic relationship links - colored by similarity */
|
|
248
|
+
.link.semantic {
|
|
249
|
+
stroke-opacity: 0.7;
|
|
250
|
+
stroke-dasharray: 4,4;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.link.semantic.sim-high { stroke: #00ff00; stroke-width: 4px; }
|
|
254
|
+
.link.semantic.sim-medium-high { stroke: #88ff00; stroke-width: 3px; }
|
|
255
|
+
.link.semantic.sim-medium { stroke: #ffff00; stroke-width: 2.5px; }
|
|
256
|
+
.link.semantic.sim-low { stroke: #ffaa00; stroke-width: 2px; }
|
|
257
|
+
.link.semantic.sim-very-low { stroke: #ff0000; stroke-width: 1.5px; }
|
|
258
|
+
|
|
259
|
+
/* Circular dependency links - highest visual priority */
|
|
260
|
+
.link.cycle {
|
|
261
|
+
stroke: #ff4444 !important;
|
|
262
|
+
stroke-width: 3px !important;
|
|
263
|
+
stroke-dasharray: 8, 4;
|
|
264
|
+
stroke-opacity: 0.8;
|
|
265
|
+
animation: pulse-cycle 2s infinite;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
@keyframes pulse-cycle {
|
|
269
|
+
0%, 100% { stroke-opacity: 0.8; }
|
|
270
|
+
50% { stroke-opacity: 1.0; }
|
|
271
|
+
}
|
|
272
|
+
"""
|
|
273
|
+
|
|
274
|
+
|
|
275
|
+
def get_tooltip_styles() -> str:
|
|
276
|
+
"""Get styles for tooltips.
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
CSS string for tooltip styling
|
|
280
|
+
"""
|
|
281
|
+
return """
|
|
282
|
+
.tooltip {
|
|
283
|
+
position: absolute;
|
|
284
|
+
padding: 12px;
|
|
285
|
+
background: rgba(13, 17, 23, 0.95);
|
|
286
|
+
border: 1px solid #30363d;
|
|
287
|
+
border-radius: 6px;
|
|
288
|
+
pointer-events: none;
|
|
289
|
+
display: none;
|
|
290
|
+
font-size: 12px;
|
|
291
|
+
max-width: 300px;
|
|
292
|
+
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4);
|
|
293
|
+
}
|
|
294
|
+
|
|
295
|
+
.caller-link {
|
|
296
|
+
color: #58a6ff;
|
|
297
|
+
text-decoration: none;
|
|
298
|
+
cursor: pointer;
|
|
299
|
+
transition: color 0.2s;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
.caller-link:hover {
|
|
303
|
+
color: #79c0ff;
|
|
304
|
+
text-decoration: underline;
|
|
305
|
+
}
|
|
306
|
+
"""
|
|
307
|
+
|
|
308
|
+
|
|
309
|
+
def get_breadcrumb_styles() -> str:
|
|
310
|
+
"""Get styles for breadcrumb navigation.
|
|
311
|
+
|
|
312
|
+
Returns:
|
|
313
|
+
CSS string for breadcrumb styling
|
|
314
|
+
"""
|
|
315
|
+
return """
|
|
316
|
+
/* Breadcrumb navigation */
|
|
317
|
+
.breadcrumb-nav {
|
|
318
|
+
margin: 0 0 10px 0;
|
|
319
|
+
padding: 8px 12px;
|
|
320
|
+
background: #161b22;
|
|
321
|
+
border: 1px solid #30363d;
|
|
322
|
+
border-radius: 4px;
|
|
323
|
+
font-size: 12px;
|
|
324
|
+
line-height: 1.6;
|
|
325
|
+
overflow-x: auto;
|
|
326
|
+
white-space: nowrap;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
.breadcrumb-root {
|
|
330
|
+
color: #58a6ff;
|
|
331
|
+
cursor: pointer;
|
|
332
|
+
font-weight: 500;
|
|
333
|
+
transition: color 0.2s;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.breadcrumb-root:hover {
|
|
337
|
+
color: #79c0ff;
|
|
338
|
+
text-decoration: underline;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
.breadcrumb-link {
|
|
342
|
+
color: #58a6ff;
|
|
343
|
+
cursor: pointer;
|
|
344
|
+
transition: color 0.2s;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.breadcrumb-link:hover {
|
|
348
|
+
color: #79c0ff;
|
|
349
|
+
text-decoration: underline;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
.breadcrumb-separator {
|
|
353
|
+
color: #6e7681;
|
|
354
|
+
margin: 0 6px;
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
.breadcrumb-current {
|
|
358
|
+
color: #c9d1d9;
|
|
359
|
+
font-weight: 600;
|
|
360
|
+
}
|
|
361
|
+
"""
|
|
362
|
+
|
|
363
|
+
|
|
364
|
+
def get_content_pane_styles() -> str:
|
|
365
|
+
"""Get styles for the content pane (code viewer).
|
|
366
|
+
|
|
367
|
+
Returns:
|
|
368
|
+
CSS string for content pane styling
|
|
369
|
+
"""
|
|
370
|
+
return """
|
|
371
|
+
#content-pane {
|
|
372
|
+
position: fixed;
|
|
373
|
+
top: 0;
|
|
374
|
+
right: 0;
|
|
375
|
+
width: 600px;
|
|
376
|
+
height: 100vh;
|
|
377
|
+
background: rgba(13, 17, 23, 0.98);
|
|
378
|
+
border-left: 1px solid #30363d;
|
|
379
|
+
overflow-y: auto;
|
|
380
|
+
box-shadow: -4px 0 24px rgba(0, 0, 0, 0.5);
|
|
381
|
+
transform: translateX(100%);
|
|
382
|
+
transition: transform 0.3s ease-in-out;
|
|
383
|
+
z-index: 1000;
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
#content-pane.visible {
|
|
387
|
+
transform: translateX(0);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
#content-pane .pane-header {
|
|
391
|
+
position: sticky;
|
|
392
|
+
top: 0;
|
|
393
|
+
background: rgba(13, 17, 23, 0.98);
|
|
394
|
+
padding: 20px;
|
|
395
|
+
border-bottom: 1px solid #30363d;
|
|
396
|
+
z-index: 1;
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
#content-pane .pane-title {
|
|
400
|
+
font-size: 16px;
|
|
401
|
+
font-weight: bold;
|
|
402
|
+
color: #58a6ff;
|
|
403
|
+
margin-bottom: 8px;
|
|
404
|
+
padding-right: 30px;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
#content-pane .pane-meta {
|
|
408
|
+
font-size: 12px;
|
|
409
|
+
color: #8b949e;
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
#content-pane .pane-footer {
|
|
413
|
+
position: sticky;
|
|
414
|
+
bottom: 0;
|
|
415
|
+
background: rgba(13, 17, 23, 0.98);
|
|
416
|
+
padding: 16px 20px;
|
|
417
|
+
border-top: 1px solid #30363d;
|
|
418
|
+
font-size: 11px;
|
|
419
|
+
color: #8b949e;
|
|
420
|
+
z-index: 1;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
#content-pane .pane-footer .footer-item {
|
|
424
|
+
display: block;
|
|
425
|
+
margin-bottom: 8px;
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
#content-pane .pane-footer .footer-label {
|
|
429
|
+
color: #c9d1d9;
|
|
430
|
+
font-weight: 600;
|
|
431
|
+
margin-right: 4px;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
#content-pane .pane-footer .footer-value {
|
|
435
|
+
color: #8b949e;
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
#content-pane .collapse-btn {
|
|
439
|
+
position: absolute;
|
|
440
|
+
top: 20px;
|
|
441
|
+
right: 20px;
|
|
442
|
+
cursor: pointer;
|
|
443
|
+
color: #8b949e;
|
|
444
|
+
font-size: 24px;
|
|
445
|
+
line-height: 1;
|
|
446
|
+
background: none;
|
|
447
|
+
border: none;
|
|
448
|
+
padding: 0;
|
|
449
|
+
transition: color 0.2s;
|
|
450
|
+
}
|
|
451
|
+
|
|
452
|
+
#content-pane .collapse-btn:hover {
|
|
453
|
+
color: #c9d1d9;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
#content-pane .code-viewer-nav {
|
|
457
|
+
display: flex;
|
|
458
|
+
align-items: center;
|
|
459
|
+
gap: 8px;
|
|
460
|
+
margin-bottom: 12px;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
#content-pane .code-viewer-nav button {
|
|
464
|
+
display: flex;
|
|
465
|
+
align-items: center;
|
|
466
|
+
justify-content: center;
|
|
467
|
+
width: 32px;
|
|
468
|
+
height: 32px;
|
|
469
|
+
background: #21262d;
|
|
470
|
+
border: 1px solid #30363d;
|
|
471
|
+
border-radius: 6px;
|
|
472
|
+
color: #c9d1d9;
|
|
473
|
+
cursor: pointer;
|
|
474
|
+
transition: all 0.2s;
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
#content-pane .code-viewer-nav button:hover:not(:disabled) {
|
|
478
|
+
background: #30363d;
|
|
479
|
+
border-color: #58a6ff;
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
#content-pane .code-viewer-nav button:disabled {
|
|
483
|
+
opacity: 0.4;
|
|
484
|
+
cursor: not-allowed;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
#content-pane .code-viewer-nav #navPosition {
|
|
488
|
+
font-size: 11px;
|
|
489
|
+
color: #8b949e;
|
|
490
|
+
margin-left: 4px;
|
|
491
|
+
}
|
|
492
|
+
|
|
493
|
+
#content-pane .pane-content {
|
|
494
|
+
padding: 20px;
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
#content-pane pre {
|
|
498
|
+
margin: 0;
|
|
499
|
+
padding: 16px;
|
|
500
|
+
background: #0d1117;
|
|
501
|
+
border: 1px solid #30363d;
|
|
502
|
+
border-radius: 6px;
|
|
503
|
+
overflow-x: auto;
|
|
504
|
+
font-size: 12px;
|
|
505
|
+
line-height: 1.6;
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
#content-pane code {
|
|
509
|
+
color: #c9d1d9;
|
|
510
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
/* Code links for jumping to function/class definitions */
|
|
514
|
+
#content-pane .code-link {
|
|
515
|
+
color: #58a6ff;
|
|
516
|
+
cursor: pointer;
|
|
517
|
+
text-decoration: underline;
|
|
518
|
+
text-decoration-style: dotted;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
#content-pane .code-link:hover {
|
|
522
|
+
color: #79c0ff;
|
|
523
|
+
text-decoration-style: solid;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
/* Bold primitives styling */
|
|
527
|
+
#content-pane pre code strong {
|
|
528
|
+
color: #ff7b72;
|
|
529
|
+
font-weight: 600;
|
|
530
|
+
}
|
|
531
|
+
|
|
532
|
+
#content-pane .directory-list {
|
|
533
|
+
list-style: none;
|
|
534
|
+
padding: 0;
|
|
535
|
+
margin: 0;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
#content-pane .directory-list li {
|
|
539
|
+
padding: 8px 12px;
|
|
540
|
+
margin: 4px 0;
|
|
541
|
+
background: #161b22;
|
|
542
|
+
border: 1px solid #30363d;
|
|
543
|
+
border-radius: 4px;
|
|
544
|
+
font-size: 12px;
|
|
545
|
+
display: flex;
|
|
546
|
+
align-items: center;
|
|
547
|
+
cursor: pointer;
|
|
548
|
+
transition: background-color 0.2s;
|
|
549
|
+
}
|
|
550
|
+
|
|
551
|
+
#content-pane .directory-list li:hover {
|
|
552
|
+
background-color: rgba(255, 255, 255, 0.1);
|
|
553
|
+
}
|
|
554
|
+
|
|
555
|
+
#content-pane .directory-list .item-icon {
|
|
556
|
+
margin-right: 8px;
|
|
557
|
+
font-size: 14px;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
#content-pane .directory-list .item-type {
|
|
561
|
+
margin-left: auto;
|
|
562
|
+
padding-left: 12px;
|
|
563
|
+
font-size: 10px;
|
|
564
|
+
color: #8b949e;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
#content-pane .import-details {
|
|
568
|
+
background: #161b22;
|
|
569
|
+
border: 1px solid #30363d;
|
|
570
|
+
border-radius: 6px;
|
|
571
|
+
padding: 16px;
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
#content-pane .import-details .import-statement {
|
|
575
|
+
font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
|
|
576
|
+
font-size: 12px;
|
|
577
|
+
color: #79c0ff;
|
|
578
|
+
margin-bottom: 12px;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
#content-pane .import-details .detail-row {
|
|
582
|
+
font-size: 11px;
|
|
583
|
+
color: #8b949e;
|
|
584
|
+
margin: 4px 0;
|
|
585
|
+
}
|
|
586
|
+
|
|
587
|
+
#content-pane .import-details .detail-label {
|
|
588
|
+
color: #c9d1d9;
|
|
589
|
+
font-weight: 600;
|
|
590
|
+
}
|
|
591
|
+
"""
|
|
592
|
+
|
|
593
|
+
|
|
594
|
+
def get_code_chunks_styles() -> str:
|
|
595
|
+
"""Get styles for code chunks section in file viewer.
|
|
596
|
+
|
|
597
|
+
Returns:
|
|
598
|
+
CSS string for code chunks styling
|
|
599
|
+
"""
|
|
600
|
+
return """
|
|
601
|
+
/* Code chunks section */
|
|
602
|
+
.code-chunks-section {
|
|
603
|
+
margin: 0 0 20px 0;
|
|
604
|
+
padding: 15px;
|
|
605
|
+
background: #161b22;
|
|
606
|
+
border-radius: 6px;
|
|
607
|
+
border: 1px solid #30363d;
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
.section-header {
|
|
611
|
+
margin: 0 0 12px 0;
|
|
612
|
+
font-size: 13px;
|
|
613
|
+
font-weight: 600;
|
|
614
|
+
color: #c9d1d9;
|
|
615
|
+
text-transform: uppercase;
|
|
616
|
+
letter-spacing: 0.5px;
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
.code-chunks-list {
|
|
620
|
+
display: flex;
|
|
621
|
+
flex-direction: column;
|
|
622
|
+
gap: 6px;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
.code-chunk-item {
|
|
626
|
+
display: flex;
|
|
627
|
+
align-items: center;
|
|
628
|
+
gap: 8px;
|
|
629
|
+
padding: 8px 12px;
|
|
630
|
+
background: #0d1117;
|
|
631
|
+
border: 1px solid #30363d;
|
|
632
|
+
border-radius: 4px;
|
|
633
|
+
cursor: pointer;
|
|
634
|
+
transition: all 0.2s ease;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
.code-chunk-item:hover {
|
|
638
|
+
background: #21262d;
|
|
639
|
+
border-color: #58a6ff;
|
|
640
|
+
box-shadow: 0 2px 4px rgba(0,0,0,0.2);
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
.chunk-icon {
|
|
644
|
+
font-size: 16px;
|
|
645
|
+
flex-shrink: 0;
|
|
646
|
+
}
|
|
647
|
+
|
|
648
|
+
.chunk-name {
|
|
649
|
+
flex: 1;
|
|
650
|
+
font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
|
|
651
|
+
font-size: 13px;
|
|
652
|
+
color: #c9d1d9;
|
|
653
|
+
font-weight: 500;
|
|
654
|
+
overflow: hidden;
|
|
655
|
+
text-overflow: ellipsis;
|
|
656
|
+
white-space: nowrap;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
.line-range {
|
|
660
|
+
font-size: 11px;
|
|
661
|
+
color: #8b949e;
|
|
662
|
+
font-family: 'Monaco', 'Menlo', 'Consolas', monospace;
|
|
663
|
+
background: #161b22;
|
|
664
|
+
padding: 2px 6px;
|
|
665
|
+
border-radius: 3px;
|
|
666
|
+
flex-shrink: 0;
|
|
667
|
+
}
|
|
668
|
+
|
|
669
|
+
.chunk-type {
|
|
670
|
+
font-size: 11px;
|
|
671
|
+
color: #ffffff;
|
|
672
|
+
background: #6e7681;
|
|
673
|
+
padding: 2px 8px;
|
|
674
|
+
border-radius: 12px;
|
|
675
|
+
text-transform: lowercase;
|
|
676
|
+
flex-shrink: 0;
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
/* Type-specific colors for chunk badges */
|
|
680
|
+
.code-chunk-item[data-type="function"] .chunk-type {
|
|
681
|
+
background: #d29922;
|
|
682
|
+
}
|
|
683
|
+
|
|
684
|
+
.code-chunk-item[data-type="class"] .chunk-type {
|
|
685
|
+
background: #1f6feb;
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
.code-chunk-item[data-type="method"] .chunk-type {
|
|
689
|
+
background: #8957e5;
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
.code-chunk-item[data-type="code"] .chunk-type {
|
|
693
|
+
background: #6e7681;
|
|
694
|
+
}
|
|
695
|
+
"""
|
|
696
|
+
|
|
697
|
+
|
|
698
|
+
def get_reset_button_styles() -> str:
|
|
699
|
+
"""Get styles for the reset view button.
|
|
700
|
+
|
|
701
|
+
Returns:
|
|
702
|
+
CSS string for reset button styling
|
|
703
|
+
"""
|
|
704
|
+
return """
|
|
705
|
+
#reset-view-btn {
|
|
706
|
+
position: fixed;
|
|
707
|
+
top: 20px;
|
|
708
|
+
right: 460px;
|
|
709
|
+
padding: 8px 16px;
|
|
710
|
+
background: #21262d;
|
|
711
|
+
border: 1px solid #30363d;
|
|
712
|
+
border-radius: 6px;
|
|
713
|
+
color: #c9d1d9;
|
|
714
|
+
font-size: 14px;
|
|
715
|
+
cursor: pointer;
|
|
716
|
+
display: flex;
|
|
717
|
+
align-items: center;
|
|
718
|
+
gap: 8px;
|
|
719
|
+
z-index: 100;
|
|
720
|
+
transition: all 0.2s;
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
#reset-view-btn:hover {
|
|
724
|
+
background: #30363d;
|
|
725
|
+
border-color: #58a6ff;
|
|
726
|
+
transform: translateY(-1px);
|
|
727
|
+
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
|
|
728
|
+
}
|
|
729
|
+
"""
|
|
730
|
+
|
|
731
|
+
|
|
732
|
+
def get_spinner_styles() -> str:
|
|
733
|
+
"""Get styles for the loading spinner animation.
|
|
734
|
+
|
|
735
|
+
Returns:
|
|
736
|
+
CSS string for spinner styling and animation
|
|
737
|
+
"""
|
|
738
|
+
return """
|
|
739
|
+
/* Loading spinner animation */
|
|
740
|
+
@keyframes spin {
|
|
741
|
+
0% { transform: rotate(0deg); }
|
|
742
|
+
100% { transform: rotate(360deg); }
|
|
743
|
+
}
|
|
744
|
+
|
|
745
|
+
.spinner {
|
|
746
|
+
display: inline-block;
|
|
747
|
+
width: 20px;
|
|
748
|
+
height: 20px;
|
|
749
|
+
border: 3px solid #30363d;
|
|
750
|
+
border-top-color: #58a6ff;
|
|
751
|
+
border-radius: 50%;
|
|
752
|
+
animation: spin 0.8s linear infinite;
|
|
753
|
+
margin-right: 8px;
|
|
754
|
+
vertical-align: middle;
|
|
755
|
+
}
|
|
756
|
+
"""
|
|
757
|
+
|
|
758
|
+
|
|
759
|
+
def get_all_styles() -> str:
|
|
760
|
+
"""Get all CSS styles combined.
|
|
761
|
+
|
|
762
|
+
Returns:
|
|
763
|
+
Complete CSS string for the visualization
|
|
764
|
+
"""
|
|
765
|
+
return "".join(
|
|
766
|
+
[
|
|
767
|
+
get_base_styles(),
|
|
768
|
+
get_controls_styles(),
|
|
769
|
+
get_graph_styles(),
|
|
770
|
+
get_node_styles(),
|
|
771
|
+
get_link_styles(),
|
|
772
|
+
get_tooltip_styles(),
|
|
773
|
+
get_breadcrumb_styles(),
|
|
774
|
+
get_content_pane_styles(),
|
|
775
|
+
get_code_chunks_styles(),
|
|
776
|
+
get_reset_button_styles(),
|
|
777
|
+
get_spinner_styles(),
|
|
778
|
+
]
|
|
779
|
+
)
|