claude-mpm 4.13.2__py3-none-any.whl → 4.18.2__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 (250) hide show
  1. claude_mpm/VERSION +1 -1
  2. claude_mpm/agents/BASE_ENGINEER.md +286 -0
  3. claude_mpm/agents/BASE_PM.md +48 -17
  4. claude_mpm/agents/OUTPUT_STYLE.md +329 -11
  5. claude_mpm/agents/PM_INSTRUCTIONS.md +227 -8
  6. claude_mpm/agents/agent_loader.py +17 -5
  7. claude_mpm/agents/frontmatter_validator.py +284 -253
  8. claude_mpm/agents/templates/agentic-coder-optimizer.json +9 -2
  9. claude_mpm/agents/templates/api_qa.json +7 -1
  10. claude_mpm/agents/templates/clerk-ops.json +8 -1
  11. claude_mpm/agents/templates/code_analyzer.json +4 -1
  12. claude_mpm/agents/templates/dart_engineer.json +11 -1
  13. claude_mpm/agents/templates/data_engineer.json +11 -1
  14. claude_mpm/agents/templates/documentation.json +6 -1
  15. claude_mpm/agents/templates/engineer.json +18 -1
  16. claude_mpm/agents/templates/gcp_ops_agent.json +8 -1
  17. claude_mpm/agents/templates/golang_engineer.json +11 -1
  18. claude_mpm/agents/templates/java_engineer.json +12 -2
  19. claude_mpm/agents/templates/local_ops_agent.json +1217 -6
  20. claude_mpm/agents/templates/nextjs_engineer.json +11 -1
  21. claude_mpm/agents/templates/ops.json +8 -1
  22. claude_mpm/agents/templates/php-engineer.json +11 -1
  23. claude_mpm/agents/templates/project_organizer.json +10 -3
  24. claude_mpm/agents/templates/prompt-engineer.json +5 -1
  25. claude_mpm/agents/templates/python_engineer.json +11 -1
  26. claude_mpm/agents/templates/qa.json +7 -1
  27. claude_mpm/agents/templates/react_engineer.json +11 -1
  28. claude_mpm/agents/templates/refactoring_engineer.json +8 -1
  29. claude_mpm/agents/templates/research.json +4 -1
  30. claude_mpm/agents/templates/ruby-engineer.json +11 -1
  31. claude_mpm/agents/templates/rust_engineer.json +11 -1
  32. claude_mpm/agents/templates/security.json +6 -1
  33. claude_mpm/agents/templates/svelte-engineer.json +225 -0
  34. claude_mpm/agents/templates/ticketing.json +6 -1
  35. claude_mpm/agents/templates/typescript_engineer.json +11 -1
  36. claude_mpm/agents/templates/vercel_ops_agent.json +8 -1
  37. claude_mpm/agents/templates/version_control.json +8 -1
  38. claude_mpm/agents/templates/web_qa.json +7 -1
  39. claude_mpm/agents/templates/web_ui.json +11 -1
  40. claude_mpm/cli/__init__.py +34 -706
  41. claude_mpm/cli/commands/agent_manager.py +25 -12
  42. claude_mpm/cli/commands/agent_state_manager.py +186 -0
  43. claude_mpm/cli/commands/agents.py +204 -148
  44. claude_mpm/cli/commands/aggregate.py +7 -3
  45. claude_mpm/cli/commands/analyze.py +9 -4
  46. claude_mpm/cli/commands/analyze_code.py +7 -2
  47. claude_mpm/cli/commands/auto_configure.py +7 -9
  48. claude_mpm/cli/commands/config.py +47 -13
  49. claude_mpm/cli/commands/configure.py +294 -1788
  50. claude_mpm/cli/commands/configure_agent_display.py +261 -0
  51. claude_mpm/cli/commands/configure_behavior_manager.py +204 -0
  52. claude_mpm/cli/commands/configure_hook_manager.py +225 -0
  53. claude_mpm/cli/commands/configure_models.py +18 -0
  54. claude_mpm/cli/commands/configure_navigation.py +167 -0
  55. claude_mpm/cli/commands/configure_paths.py +104 -0
  56. claude_mpm/cli/commands/configure_persistence.py +254 -0
  57. claude_mpm/cli/commands/configure_startup_manager.py +646 -0
  58. claude_mpm/cli/commands/configure_template_editor.py +497 -0
  59. claude_mpm/cli/commands/configure_validators.py +73 -0
  60. claude_mpm/cli/commands/local_deploy.py +537 -0
  61. claude_mpm/cli/commands/memory.py +54 -20
  62. claude_mpm/cli/commands/mpm_init.py +39 -25
  63. claude_mpm/cli/commands/mpm_init_handler.py +8 -3
  64. claude_mpm/cli/executor.py +202 -0
  65. claude_mpm/cli/helpers.py +105 -0
  66. claude_mpm/cli/interactive/__init__.py +3 -0
  67. claude_mpm/cli/interactive/skills_wizard.py +491 -0
  68. claude_mpm/cli/parsers/__init__.py +7 -1
  69. claude_mpm/cli/parsers/base_parser.py +98 -3
  70. claude_mpm/cli/parsers/local_deploy_parser.py +227 -0
  71. claude_mpm/cli/shared/output_formatters.py +28 -19
  72. claude_mpm/cli/startup.py +481 -0
  73. claude_mpm/cli/utils.py +52 -1
  74. claude_mpm/commands/mpm-help.md +3 -0
  75. claude_mpm/commands/mpm-version.md +113 -0
  76. claude_mpm/commands/mpm.md +1 -0
  77. claude_mpm/config/agent_config.py +2 -2
  78. claude_mpm/config/model_config.py +428 -0
  79. claude_mpm/core/base_service.py +13 -12
  80. claude_mpm/core/enums.py +452 -0
  81. claude_mpm/core/factories.py +1 -1
  82. claude_mpm/core/instruction_reinforcement_hook.py +2 -1
  83. claude_mpm/core/interactive_session.py +9 -3
  84. claude_mpm/core/logging_config.py +6 -2
  85. claude_mpm/core/oneshot_session.py +8 -4
  86. claude_mpm/core/optimized_agent_loader.py +3 -3
  87. claude_mpm/core/output_style_manager.py +12 -192
  88. claude_mpm/core/service_registry.py +5 -1
  89. claude_mpm/core/types.py +2 -9
  90. claude_mpm/core/typing_utils.py +7 -6
  91. claude_mpm/dashboard/static/js/dashboard.js +0 -14
  92. claude_mpm/dashboard/templates/index.html +3 -41
  93. claude_mpm/hooks/claude_hooks/response_tracking.py +35 -1
  94. claude_mpm/hooks/instruction_reinforcement.py +7 -2
  95. claude_mpm/models/resume_log.py +340 -0
  96. claude_mpm/services/agents/auto_config_manager.py +10 -11
  97. claude_mpm/services/agents/deployment/agent_configuration_manager.py +1 -1
  98. claude_mpm/services/agents/deployment/agent_record_service.py +1 -1
  99. claude_mpm/services/agents/deployment/agent_validator.py +17 -1
  100. claude_mpm/services/agents/deployment/async_agent_deployment.py +1 -1
  101. claude_mpm/services/agents/deployment/interface_adapter.py +3 -2
  102. claude_mpm/services/agents/deployment/local_template_deployment.py +1 -1
  103. claude_mpm/services/agents/deployment/pipeline/steps/agent_processing_step.py +7 -6
  104. claude_mpm/services/agents/deployment/pipeline/steps/base_step.py +7 -16
  105. claude_mpm/services/agents/deployment/pipeline/steps/configuration_step.py +4 -3
  106. claude_mpm/services/agents/deployment/pipeline/steps/target_directory_step.py +5 -3
  107. claude_mpm/services/agents/deployment/pipeline/steps/validation_step.py +6 -5
  108. claude_mpm/services/agents/deployment/refactored_agent_deployment_service.py +9 -6
  109. claude_mpm/services/agents/deployment/validation/__init__.py +3 -1
  110. claude_mpm/services/agents/deployment/validation/validation_result.py +1 -9
  111. claude_mpm/services/agents/local_template_manager.py +1 -1
  112. claude_mpm/services/agents/memory/agent_memory_manager.py +5 -2
  113. claude_mpm/services/agents/registry/modification_tracker.py +5 -2
  114. claude_mpm/services/command_handler_service.py +11 -5
  115. claude_mpm/services/core/interfaces/__init__.py +74 -2
  116. claude_mpm/services/core/interfaces/health.py +172 -0
  117. claude_mpm/services/core/interfaces/model.py +281 -0
  118. claude_mpm/services/core/interfaces/process.py +372 -0
  119. claude_mpm/services/core/interfaces/restart.py +307 -0
  120. claude_mpm/services/core/interfaces/stability.py +260 -0
  121. claude_mpm/services/core/models/__init__.py +33 -0
  122. claude_mpm/services/core/models/agent_config.py +12 -28
  123. claude_mpm/services/core/models/health.py +162 -0
  124. claude_mpm/services/core/models/process.py +235 -0
  125. claude_mpm/services/core/models/restart.py +302 -0
  126. claude_mpm/services/core/models/stability.py +264 -0
  127. claude_mpm/services/core/path_resolver.py +23 -7
  128. claude_mpm/services/diagnostics/__init__.py +2 -2
  129. claude_mpm/services/diagnostics/checks/agent_check.py +25 -24
  130. claude_mpm/services/diagnostics/checks/claude_code_check.py +24 -23
  131. claude_mpm/services/diagnostics/checks/common_issues_check.py +25 -24
  132. claude_mpm/services/diagnostics/checks/configuration_check.py +24 -23
  133. claude_mpm/services/diagnostics/checks/filesystem_check.py +18 -17
  134. claude_mpm/services/diagnostics/checks/installation_check.py +30 -29
  135. claude_mpm/services/diagnostics/checks/instructions_check.py +20 -19
  136. claude_mpm/services/diagnostics/checks/mcp_check.py +50 -36
  137. claude_mpm/services/diagnostics/checks/mcp_services_check.py +36 -31
  138. claude_mpm/services/diagnostics/checks/monitor_check.py +23 -22
  139. claude_mpm/services/diagnostics/checks/startup_log_check.py +9 -8
  140. claude_mpm/services/diagnostics/diagnostic_runner.py +6 -5
  141. claude_mpm/services/diagnostics/doctor_reporter.py +28 -25
  142. claude_mpm/services/diagnostics/models.py +19 -24
  143. claude_mpm/services/infrastructure/monitoring/__init__.py +1 -1
  144. claude_mpm/services/infrastructure/monitoring/aggregator.py +12 -12
  145. claude_mpm/services/infrastructure/monitoring/base.py +5 -13
  146. claude_mpm/services/infrastructure/monitoring/network.py +7 -6
  147. claude_mpm/services/infrastructure/monitoring/process.py +13 -12
  148. claude_mpm/services/infrastructure/monitoring/resources.py +7 -6
  149. claude_mpm/services/infrastructure/monitoring/service.py +16 -15
  150. claude_mpm/services/infrastructure/resume_log_generator.py +439 -0
  151. claude_mpm/services/local_ops/__init__.py +163 -0
  152. claude_mpm/services/local_ops/crash_detector.py +257 -0
  153. claude_mpm/services/local_ops/health_checks/__init__.py +28 -0
  154. claude_mpm/services/local_ops/health_checks/http_check.py +224 -0
  155. claude_mpm/services/local_ops/health_checks/process_check.py +236 -0
  156. claude_mpm/services/local_ops/health_checks/resource_check.py +255 -0
  157. claude_mpm/services/local_ops/health_manager.py +430 -0
  158. claude_mpm/services/local_ops/log_monitor.py +396 -0
  159. claude_mpm/services/local_ops/memory_leak_detector.py +294 -0
  160. claude_mpm/services/local_ops/process_manager.py +595 -0
  161. claude_mpm/services/local_ops/resource_monitor.py +331 -0
  162. claude_mpm/services/local_ops/restart_manager.py +401 -0
  163. claude_mpm/services/local_ops/restart_policy.py +387 -0
  164. claude_mpm/services/local_ops/state_manager.py +372 -0
  165. claude_mpm/services/local_ops/unified_manager.py +600 -0
  166. claude_mpm/services/mcp_config_manager.py +9 -4
  167. claude_mpm/services/mcp_gateway/core/__init__.py +1 -2
  168. claude_mpm/services/mcp_gateway/core/base.py +18 -31
  169. claude_mpm/services/mcp_gateway/tools/external_mcp_services.py +71 -24
  170. claude_mpm/services/mcp_gateway/tools/health_check_tool.py +30 -28
  171. claude_mpm/services/memory_hook_service.py +4 -1
  172. claude_mpm/services/model/__init__.py +147 -0
  173. claude_mpm/services/model/base_provider.py +365 -0
  174. claude_mpm/services/model/claude_provider.py +412 -0
  175. claude_mpm/services/model/model_router.py +453 -0
  176. claude_mpm/services/model/ollama_provider.py +415 -0
  177. claude_mpm/services/monitor/daemon_manager.py +3 -2
  178. claude_mpm/services/monitor/handlers/dashboard.py +2 -1
  179. claude_mpm/services/monitor/handlers/hooks.py +2 -1
  180. claude_mpm/services/monitor/management/lifecycle.py +3 -2
  181. claude_mpm/services/monitor/server.py +2 -1
  182. claude_mpm/services/session_management_service.py +3 -2
  183. claude_mpm/services/session_manager.py +205 -1
  184. claude_mpm/services/shared/async_service_base.py +16 -27
  185. claude_mpm/services/shared/lifecycle_service_base.py +1 -14
  186. claude_mpm/services/socketio/handlers/__init__.py +5 -2
  187. claude_mpm/services/socketio/handlers/hook.py +13 -2
  188. claude_mpm/services/socketio/handlers/registry.py +4 -2
  189. claude_mpm/services/socketio/server/main.py +10 -8
  190. claude_mpm/services/subprocess_launcher_service.py +14 -5
  191. claude_mpm/services/unified/analyzer_strategies/code_analyzer.py +8 -7
  192. claude_mpm/services/unified/analyzer_strategies/dependency_analyzer.py +6 -5
  193. claude_mpm/services/unified/analyzer_strategies/performance_analyzer.py +8 -7
  194. claude_mpm/services/unified/analyzer_strategies/security_analyzer.py +7 -6
  195. claude_mpm/services/unified/analyzer_strategies/structure_analyzer.py +5 -4
  196. claude_mpm/services/unified/config_strategies/validation_strategy.py +13 -9
  197. claude_mpm/services/unified/deployment_strategies/cloud_strategies.py +10 -3
  198. claude_mpm/services/unified/deployment_strategies/local.py +6 -5
  199. claude_mpm/services/unified/deployment_strategies/utils.py +6 -5
  200. claude_mpm/services/unified/deployment_strategies/vercel.py +7 -6
  201. claude_mpm/services/unified/interfaces.py +3 -1
  202. claude_mpm/services/unified/unified_analyzer.py +14 -10
  203. claude_mpm/services/unified/unified_config.py +2 -1
  204. claude_mpm/services/unified/unified_deployment.py +9 -4
  205. claude_mpm/services/version_service.py +104 -1
  206. claude_mpm/skills/__init__.py +21 -0
  207. claude_mpm/skills/bundled/__init__.py +6 -0
  208. claude_mpm/skills/bundled/api-documentation.md +393 -0
  209. claude_mpm/skills/bundled/async-testing.md +571 -0
  210. claude_mpm/skills/bundled/code-review.md +143 -0
  211. claude_mpm/skills/bundled/database-migration.md +199 -0
  212. claude_mpm/skills/bundled/docker-containerization.md +194 -0
  213. claude_mpm/skills/bundled/express-local-dev.md +1429 -0
  214. claude_mpm/skills/bundled/fastapi-local-dev.md +1199 -0
  215. claude_mpm/skills/bundled/git-workflow.md +414 -0
  216. claude_mpm/skills/bundled/imagemagick.md +204 -0
  217. claude_mpm/skills/bundled/json-data-handling.md +223 -0
  218. claude_mpm/skills/bundled/nextjs-local-dev.md +807 -0
  219. claude_mpm/skills/bundled/pdf.md +141 -0
  220. claude_mpm/skills/bundled/performance-profiling.md +567 -0
  221. claude_mpm/skills/bundled/refactoring-patterns.md +180 -0
  222. claude_mpm/skills/bundled/security-scanning.md +327 -0
  223. claude_mpm/skills/bundled/systematic-debugging.md +473 -0
  224. claude_mpm/skills/bundled/test-driven-development.md +378 -0
  225. claude_mpm/skills/bundled/vite-local-dev.md +1061 -0
  226. claude_mpm/skills/bundled/web-performance-optimization.md +2305 -0
  227. claude_mpm/skills/bundled/xlsx.md +157 -0
  228. claude_mpm/skills/registry.py +286 -0
  229. claude_mpm/skills/skill_manager.py +310 -0
  230. claude_mpm/tools/code_tree_analyzer.py +177 -141
  231. claude_mpm/tools/code_tree_events.py +4 -2
  232. claude_mpm/utils/agent_dependency_loader.py +2 -2
  233. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/METADATA +117 -8
  234. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/RECORD +238 -174
  235. claude_mpm/dashboard/static/css/code-tree.css +0 -1639
  236. claude_mpm/dashboard/static/js/components/code-tree/tree-breadcrumb.js +0 -353
  237. claude_mpm/dashboard/static/js/components/code-tree/tree-constants.js +0 -235
  238. claude_mpm/dashboard/static/js/components/code-tree/tree-search.js +0 -409
  239. claude_mpm/dashboard/static/js/components/code-tree/tree-utils.js +0 -435
  240. claude_mpm/dashboard/static/js/components/code-tree.js +0 -5869
  241. claude_mpm/dashboard/static/js/components/code-viewer.js +0 -1386
  242. claude_mpm/hooks/claude_hooks/hook_handler_eventbus.py +0 -425
  243. claude_mpm/hooks/claude_hooks/hook_handler_original.py +0 -1041
  244. claude_mpm/hooks/claude_hooks/hook_handler_refactored.py +0 -347
  245. claude_mpm/services/agents/deployment/agent_lifecycle_manager_refactored.py +0 -575
  246. claude_mpm/services/project/analyzer_refactored.py +0 -450
  247. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/WHEEL +0 -0
  248. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/entry_points.txt +0 -0
  249. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/licenses/LICENSE +0 -0
  250. {claude_mpm-4.13.2.dist-info → claude_mpm-4.18.2.dist-info}/top_level.txt +0 -0
@@ -1,1639 +0,0 @@
1
- /* Code Tree Styles */
2
-
3
- .code-container {
4
- height: 100%;
5
- display: flex;
6
- flex-direction: column;
7
- background: #f8f9fa;
8
- }
9
-
10
- /* Container for Code Tree - Now full width */
11
- .code-split-container {
12
- display: flex;
13
- flex: 1;
14
- padding: 10px;
15
- overflow: hidden;
16
- }
17
-
18
- /* Advanced Options - Always Visible */
19
- .code-advanced-options-visible {
20
- background: white;
21
- border-bottom: 1px solid #e2e8f0;
22
- padding: 8px 12px;
23
- }
24
-
25
- .code-advanced-options-visible .advanced-content {
26
- display: flex;
27
- justify-content: space-between;
28
- align-items: center;
29
- gap: 20px;
30
- }
31
-
32
- .code-advanced-options-visible .option-group {
33
- display: flex;
34
- align-items: center;
35
- gap: 10px;
36
- }
37
-
38
- .code-advanced-options-visible .option-group label {
39
- display: inline-flex;
40
- align-items: center;
41
- gap: 4px;
42
- font-size: 13px;
43
- color: #4a5568;
44
- }
45
-
46
- .code-advanced-options-visible .option-group input[type="checkbox"] {
47
- margin: 0;
48
- }
49
-
50
- /* Compact Header Layout */
51
- .code-header-compact {
52
- display: flex;
53
- justify-content: space-between;
54
- align-items: center;
55
- padding: 8px 12px;
56
- background: white;
57
- border-bottom: 1px solid #e2e8f0;
58
- gap: 15px;
59
- min-height: 40px;
60
- }
61
-
62
- .header-left,
63
- .header-center,
64
- .header-right {
65
- display: flex;
66
- align-items: center;
67
- gap: 8px;
68
- }
69
-
70
- .header-left {
71
- flex: 0 1 auto;
72
- }
73
-
74
- .header-center {
75
- flex: 0 0 auto;
76
- }
77
-
78
- .header-right {
79
- flex: 0 1 auto;
80
- justify-content: flex-end;
81
- }
82
-
83
- /* Compact Input Elements */
84
- .path-input-compact {
85
- width: 150px;
86
- padding: 4px 8px;
87
- border: 1px solid #e2e8f0;
88
- border-radius: 4px;
89
- font-size: 13px;
90
- }
91
-
92
- .btn-compact {
93
- padding: 4px 8px;
94
- border: 1px solid #e2e8f0;
95
- background: white;
96
- border-radius: 4px;
97
- cursor: pointer;
98
- font-size: 14px;
99
- transition: all 0.2s;
100
- min-width: 28px;
101
- height: 28px;
102
- display: inline-flex;
103
- align-items: center;
104
- justify-content: center;
105
- }
106
-
107
- .btn-compact:hover {
108
- background: #f8f9fa;
109
- border-color: #94a3b8;
110
- }
111
-
112
- .btn-compact.btn-primary {
113
- background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
114
- color: white;
115
- border-color: #3b82f6;
116
- font-weight: 500;
117
- }
118
-
119
- .btn-compact.btn-primary:hover {
120
- background: linear-gradient(135deg, #2563eb 0%, #1d4ed8 100%);
121
- transform: translateY(-1px);
122
- box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);
123
- }
124
-
125
- .btn-compact.btn-primary:disabled {
126
- background: #94a3b8;
127
- border-color: #94a3b8;
128
- cursor: not-allowed;
129
- opacity: 0.7;
130
- }
131
-
132
- .btn-compact.btn-primary.analyzing {
133
- background: linear-gradient(135deg, #f59e0b 0%, #f97316 100%);
134
- border-color: #f59e0b;
135
- animation: pulse 1.5s infinite;
136
- position: relative;
137
- }
138
-
139
- .btn-compact.btn-primary.analyzing::after {
140
- content: '';
141
- position: absolute;
142
- top: 0;
143
- left: 0;
144
- right: 0;
145
- bottom: 0;
146
- background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.3) 50%, transparent 100%);
147
- animation: shimmer 2s infinite;
148
- }
149
-
150
- @keyframes shimmer {
151
- 0% { transform: translateX(-100%); }
152
- 100% { transform: translateX(100%); }
153
- }
154
-
155
- .btn-compact.btn-danger {
156
- background: #ef4444;
157
- color: white;
158
- border-color: #ef4444;
159
- }
160
-
161
- .btn-compact.btn-danger:hover {
162
- background: #dc2626;
163
- transform: translateY(-1px);
164
- box-shadow: 0 2px 4px rgba(239, 68, 68, 0.3);
165
- }
166
-
167
- .stat-compact {
168
- font-size: 13px;
169
- color: #64748b;
170
- white-space: nowrap;
171
- }
172
-
173
- .stat-compact span {
174
- font-weight: 600;
175
- color: #1e293b;
176
- }
177
-
178
- .select-compact {
179
- padding: 4px 8px;
180
- border: 1px solid #e2e8f0;
181
- border-radius: 4px;
182
- font-size: 13px;
183
- background: white;
184
- }
185
-
186
- .search-compact {
187
- width: 120px;
188
- padding: 4px 8px;
189
- border: 1px solid #e2e8f0;
190
- border-radius: 4px;
191
- font-size: 13px;
192
- }
193
-
194
- /* Advanced Options (collapsible) */
195
- .code-advanced-options {
196
- background: #f8f9fa;
197
- border-bottom: 1px solid #e2e8f0;
198
- font-size: 13px;
199
- }
200
-
201
- .code-advanced-options summary {
202
- padding: 6px 12px;
203
- cursor: pointer;
204
- user-select: none;
205
- color: #64748b;
206
- font-size: 12px;
207
- }
208
-
209
- .code-advanced-options summary:hover {
210
- color: #1e293b;
211
- }
212
-
213
- .advanced-content {
214
- padding: 8px 12px;
215
- display: flex;
216
- gap: 20px;
217
- }
218
-
219
- .option-group {
220
- display: flex;
221
- align-items: center;
222
- gap: 10px;
223
- }
224
-
225
- .option-group label {
226
- display: flex;
227
- align-items: center;
228
- gap: 4px;
229
- font-size: 12px;
230
- color: #475569;
231
- }
232
-
233
- .input-compact {
234
- width: 60px;
235
- padding: 2px 6px;
236
- border: 1px solid #e2e8f0;
237
- border-radius: 3px;
238
- font-size: 12px;
239
- }
240
-
241
- /* Analysis Options Panel - OLD STYLES DEPRECATED */
242
- .code-analysis-options {
243
- padding: 15px;
244
- background: white;
245
- border-bottom: 1px solid #e2e8f0;
246
- }
247
-
248
- .analysis-row {
249
- display: flex;
250
- align-items: center;
251
- gap: 15px;
252
- margin-bottom: 10px;
253
- }
254
-
255
- .analysis-row:last-child {
256
- margin-bottom: 0;
257
- }
258
-
259
- .analysis-row label {
260
- font-weight: 500;
261
- color: #64748b;
262
- min-width: 100px;
263
- }
264
-
265
- .analysis-row input[type="text"],
266
- .analysis-row input[type="number"] {
267
- flex: 1;
268
- padding: 6px 10px;
269
- background: #f8f9fa;
270
- border: 1px solid #cbd5e0;
271
- border-radius: 4px;
272
- color: #1e293b;
273
- }
274
-
275
- .language-selection {
276
- display: flex;
277
- align-items: center;
278
- gap: 15px;
279
- flex: 1;
280
- }
281
-
282
- .language-selection label {
283
- display: flex;
284
- align-items: center;
285
- gap: 5px;
286
- min-width: auto;
287
- cursor: pointer;
288
- }
289
-
290
- .language-checkbox {
291
- cursor: pointer;
292
- }
293
-
294
- .analysis-options {
295
- display: flex;
296
- align-items: center;
297
- gap: 10px;
298
- }
299
-
300
- .analysis-options input[type="number"] {
301
- width: 80px;
302
- }
303
-
304
- #cancel-analysis {
305
- margin-left: 10px;
306
- }
307
-
308
- .btn-danger {
309
- background: #ef4444;
310
- color: white;
311
- border: none;
312
- padding: 8px 16px;
313
- border-radius: 6px;
314
- cursor: pointer;
315
- font-weight: 600;
316
- transition: all 0.3s ease;
317
- }
318
-
319
- .btn-danger:hover {
320
- background: #dc2626;
321
- }
322
-
323
- /* Notification Styles */
324
- .code-notification {
325
- position: fixed;
326
- top: 20px;
327
- right: 20px;
328
- padding: 12px 20px;
329
- border-radius: 4px;
330
- background: #475569;
331
- color: white;
332
- box-shadow: 0 2px 10px rgba(0, 0, 0, 0.2);
333
- z-index: 1000;
334
- display: none;
335
- animation: slideIn 0.3s ease;
336
- }
337
-
338
- .code-notification.success {
339
- background: #10b981;
340
- }
341
-
342
- .code-notification.error {
343
- background: #ef4444;
344
- }
345
-
346
- .code-notification.warning {
347
- background: #f59e0b;
348
- }
349
-
350
- .code-notification.info {
351
- background: #3b82f6;
352
- }
353
-
354
- @keyframes slideIn {
355
- from {
356
- transform: translateX(100%);
357
- opacity: 0;
358
- }
359
- to {
360
- transform: translateX(0);
361
- opacity: 1;
362
- }
363
- }
364
-
365
- .code-header {
366
- display: flex;
367
- justify-content: space-between;
368
- align-items: center;
369
- padding: 10px 15px;
370
- background: white;
371
- border-radius: 8px;
372
- margin-bottom: 15px;
373
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
374
- }
375
-
376
- .code-controls {
377
- display: flex;
378
- gap: 10px;
379
- align-items: center;
380
- }
381
-
382
- .code-controls .btn-primary {
383
- background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
384
- color: white;
385
- border: none;
386
- padding: 8px 16px;
387
- border-radius: 6px;
388
- cursor: pointer;
389
- font-weight: 600;
390
- transition: all 0.3s ease;
391
- }
392
-
393
- .code-controls .btn-primary:hover {
394
- transform: translateY(-1px);
395
- box-shadow: 0 4px 8px rgba(102, 126, 234, 0.3);
396
- }
397
-
398
- .code-controls .btn-primary.analyzing {
399
- background: linear-gradient(135deg, #94a3b8 0%, #64748b 100%);
400
- animation: pulse 2s infinite;
401
- }
402
-
403
- @keyframes pulse {
404
- 0% { opacity: 1; }
405
- 50% { opacity: 0.7; }
406
- 100% { opacity: 1; }
407
- }
408
-
409
- .code-controls .btn-sm {
410
- padding: 6px 12px;
411
- font-size: 12px;
412
- background: #e2e8f0;
413
- border: 1px solid #cbd5e0;
414
- border-radius: 4px;
415
- cursor: pointer;
416
- transition: all 0.2s;
417
- }
418
-
419
- .code-controls .btn-sm:hover {
420
- background: #cbd5e0;
421
- }
422
-
423
- .code-controls select {
424
- padding: 6px 10px;
425
- border: 1px solid #cbd5e0;
426
- border-radius: 4px;
427
- background: white;
428
- cursor: pointer;
429
- font-size: 13px;
430
- }
431
-
432
- .code-controls input[type="text"] {
433
- padding: 6px 10px;
434
- border: 1px solid #cbd5e0;
435
- border-radius: 4px;
436
- width: 200px;
437
- font-size: 13px;
438
- }
439
-
440
- .code-stats {
441
- display: flex;
442
- gap: 20px;
443
- }
444
-
445
- .code-stats .stat-item {
446
- display: flex;
447
- align-items: center;
448
- gap: 5px;
449
- }
450
-
451
- .code-stats .stat-label {
452
- font-size: 12px;
453
- color: #718096;
454
- font-weight: 500;
455
- }
456
-
457
- .code-stats .stat-value {
458
- font-size: 16px;
459
- font-weight: bold;
460
- color: #2d3748;
461
- }
462
-
463
- /* Code Tree Container - Full Width */
464
- .code-tree-container {
465
- flex: 1;
466
- background: white;
467
- border-radius: 8px;
468
- padding: 20px;
469
- position: relative;
470
- overflow: auto;
471
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
472
- border: 1px solid #e2e8f0;
473
- }
474
-
475
- /* Code Content Area - DEPRECATED (Removed duplicate pane) */
476
- /* Content now displayed in main Structured Data section */
477
- /* .code-module-data-content class removed */
478
-
479
- /* Visual hierarchy improvements */
480
- .code-tree-container:focus-within {
481
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1);
482
- border-color: #3b82f6;
483
- }
484
-
485
- /* Loading indicator */
486
- #code-tree-loading {
487
- position: absolute;
488
- top: 50%;
489
- left: 50%;
490
- transform: translate(-50%, -50%);
491
- text-align: center;
492
- z-index: 100;
493
- }
494
-
495
- #code-tree-loading.hidden {
496
- display: none;
497
- }
498
-
499
- .code-tree-spinner {
500
- width: 50px;
501
- height: 50px;
502
- border: 5px solid #e2e8f0;
503
- border-top: 5px solid #3b82f6;
504
- border-radius: 50%;
505
- animation: spin 1s linear infinite;
506
- margin: 0 auto 15px;
507
- }
508
-
509
- @keyframes spin {
510
- 0% { transform: rotate(0deg); }
511
- 100% { transform: rotate(360deg); }
512
- }
513
-
514
- .code-tree-loading-text {
515
- font-size: 14px;
516
- color: #64748b;
517
- font-weight: 500;
518
- }
519
-
520
- #code-tree {
521
- width: 100%;
522
- height: 100%;
523
- min-height: 500px;
524
- }
525
-
526
- /* Progress Bar */
527
- .code-progress {
528
- position: absolute;
529
- top: 50%;
530
- left: 50%;
531
- transform: translate(-50%, -50%);
532
- width: 300px;
533
- text-align: center;
534
- background: white;
535
- padding: 20px;
536
- border-radius: 8px;
537
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
538
- }
539
-
540
- .progress-bar {
541
- width: 100%;
542
- height: 8px;
543
- background: #e2e8f0;
544
- border-radius: 4px;
545
- overflow: hidden;
546
- margin-bottom: 10px;
547
- }
548
-
549
- .progress-fill {
550
- height: 100%;
551
- background: linear-gradient(90deg, #667eea, #764ba2);
552
- transition: width 0.3s ease;
553
- width: 0%;
554
- }
555
-
556
- .progress-text {
557
- font-size: 14px;
558
- color: #4a5568;
559
- font-weight: 500;
560
- }
561
-
562
- /* Tree Legend - Collapsible and Compact */
563
- .tree-legend {
564
- position: fixed;
565
- bottom: 20px;
566
- right: 20px;
567
- background: rgba(255, 255, 255, 0.98);
568
- border: 1px solid #e2e8f0;
569
- border-radius: 6px;
570
- padding: 8px;
571
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
572
- z-index: 1000;
573
- max-width: 200px;
574
- font-size: 12px;
575
- }
576
-
577
- .tree-legend.collapsed {
578
- display: none;
579
- }
580
-
581
- .legend-close {
582
- position: absolute;
583
- top: 4px;
584
- right: 4px;
585
- background: none;
586
- border: none;
587
- color: #94a3b8;
588
- cursor: pointer;
589
- font-size: 14px;
590
- padding: 2px 6px;
591
- line-height: 1;
592
- }
593
-
594
- .legend-close:hover {
595
- color: #475569;
596
- }
597
-
598
- .legend-content {
599
- display: flex;
600
- gap: 20px;
601
- }
602
-
603
- .legend-column {
604
- display: flex;
605
- flex-direction: column;
606
- gap: 4px;
607
- }
608
-
609
- .legend-item {
610
- display: flex;
611
- align-items: center;
612
- gap: 4px;
613
- font-size: 11px;
614
- color: #4a5568;
615
- white-space: nowrap;
616
- }
617
-
618
- .legend-icon {
619
- font-size: 14px;
620
- }
621
-
622
- .legend-icon.module {
623
- color: #8b5cf6;
624
- }
625
-
626
- .legend-icon.class {
627
- color: #3b82f6;
628
- }
629
-
630
- .legend-icon.function {
631
- color: #f59e0b;
632
- }
633
-
634
- .legend-icon.method {
635
- color: #10b981;
636
- }
637
-
638
- .legend-icon.complexity-low {
639
- color: #10b981;
640
- }
641
-
642
- .legend-icon.complexity-medium {
643
- color: #f59e0b;
644
- }
645
-
646
- .legend-icon.complexity-high {
647
- color: #ef4444;
648
- }
649
-
650
- /* Breadcrumb */
651
- /* Breadcrumb Ticker */
652
- .code-breadcrumb {
653
- padding: 8px 12px;
654
- background: linear-gradient(90deg, #f8f9fa, white);
655
- border-radius: 6px;
656
- margin-top: 15px;
657
- font-size: 12px;
658
- color: #4a5568;
659
- font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
660
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
661
- overflow: hidden;
662
- position: relative;
663
- min-height: 32px;
664
- }
665
-
666
- .breadcrumb-ticker {
667
- display: flex;
668
- align-items: center;
669
- white-space: nowrap;
670
- transition: all 0.3s ease-out;
671
- }
672
-
673
- #breadcrumb-content {
674
- display: inline-block;
675
- font-size: 11px;
676
- color: #475569;
677
- transition: opacity 0.3s;
678
- }
679
-
680
- /* Event type styling in ticker */
681
- .ticker-event {
682
- animation: slideIn 0.3s ease-in;
683
- }
684
-
685
- .ticker-file {
686
- color: #3b82f6;
687
- }
688
-
689
- .ticker-node {
690
- color: #10b981;
691
- }
692
-
693
- .ticker-progress {
694
- color: #8b5cf6;
695
- }
696
-
697
- .ticker-success {
698
- color: #10b981;
699
- font-weight: 500;
700
- }
701
-
702
- .ticker-error {
703
- color: #ef4444;
704
- }
705
-
706
- @keyframes slideIn {
707
- from {
708
- opacity: 0;
709
- transform: translateX(-10px);
710
- }
711
- to {
712
- opacity: 1;
713
- transform: translateX(0);
714
- }
715
- }
716
-
717
- /* D3 Tree Styles */
718
- .code-node {
719
- cursor: pointer;
720
- }
721
-
722
- .code-node circle {
723
- stroke-width: 2px;
724
- transition: all 0.3s ease;
725
- }
726
-
727
- .code-node circle:hover {
728
- stroke-width: 3px;
729
- filter: brightness(1.1);
730
- }
731
-
732
- /* Directory node styling - make expandable directories obvious */
733
- .code-node.directory circle {
734
- fill: #f8fafc;
735
- stroke: #3b82f6;
736
- stroke-width: 2px;
737
- }
738
-
739
- .code-node.directory:hover circle {
740
- fill: #eef2ff;
741
- stroke: #2563eb;
742
- stroke-width: 3px;
743
- filter: drop-shadow(0 2px 4px rgba(59, 130, 246, 0.3));
744
- }
745
-
746
- /* Expanded directory styling */
747
- .code-node.directory.expanded circle {
748
- fill: #dbeafe;
749
- stroke: #1d4ed8;
750
- }
751
-
752
- /* File node styling */
753
- .code-node.file circle {
754
- fill: #f9fafb;
755
- stroke: #6b7280;
756
- stroke-width: 1.5px;
757
- }
758
-
759
- .code-node.file:hover circle {
760
- fill: #f3f4f6;
761
- stroke: #4b5563;
762
- stroke-width: 2px;
763
- }
764
-
765
- /* Empty directory styling */
766
- .code-node.directory.empty circle {
767
- fill: #f9fafb;
768
- stroke: #9ca3af;
769
- stroke-dasharray: 3,3;
770
- opacity: 0.7;
771
- }
772
-
773
- /* Directory expand/collapse icons */
774
- .expand-icon {
775
- font-family: monospace;
776
- font-size: 12px;
777
- font-weight: bold;
778
- text-anchor: middle;
779
- dominant-baseline: central;
780
- fill: #374151;
781
- pointer-events: none;
782
- transition: all 0.2s ease;
783
- }
784
-
785
- .code-node.directory .expand-icon {
786
- fill: #3b82f6;
787
- }
788
-
789
- .code-node.directory.expanded .expand-icon {
790
- fill: #1d4ed8;
791
- transform: rotate(90deg);
792
- }
793
-
794
- .code-node.directory.loading .expand-icon {
795
- fill: #f59e0b;
796
- animation: spin 1s linear infinite;
797
- }
798
-
799
- @keyframes spin {
800
- from { transform: rotate(0deg); }
801
- to { transform: rotate(360deg); }
802
- }
803
-
804
- /* Visualization Controls */
805
- .viz-controls {
806
- position: absolute;
807
- top: 10px;
808
- left: 10px;
809
- z-index: 100;
810
- }
811
-
812
- .layout-toggle {
813
- cursor: pointer;
814
- transition: all 0.2s;
815
- }
816
-
817
- .layout-toggle:hover rect {
818
- opacity: 1;
819
- filter: brightness(1.1);
820
- }
821
-
822
- /* Radial layout specific styles */
823
- .radial-layout .link {
824
- fill: none;
825
- stroke: #cbd5e0;
826
- stroke-width: 1.5px;
827
- opacity: 0.6;
828
- }
829
-
830
- .radial-layout .node text {
831
- font: 11px sans-serif;
832
- text-anchor: middle;
833
- }
834
-
835
- .radial-layout .node.root text {
836
- font-size: 14px;
837
- font-weight: bold;
838
- }
839
-
840
- .code-node text {
841
- font: 12px sans-serif;
842
- pointer-events: none;
843
- /* Smooth transitions for zoom-based text scaling */
844
- transition: font-size 0.2s ease;
845
- }
846
-
847
- .code-node.module circle {
848
- fill: #8b5cf6;
849
- stroke: #7c3aed;
850
- }
851
-
852
- .code-node.class circle {
853
- fill: #3b82f6;
854
- stroke: #2563eb;
855
- }
856
-
857
- .code-node.function circle {
858
- fill: #f59e0b;
859
- stroke: #d97706;
860
- }
861
-
862
- .code-node.method circle {
863
- fill: #10b981;
864
- stroke: #059669;
865
- }
866
-
867
- .code-link {
868
- fill: none;
869
- stroke: #cbd5e0;
870
- stroke-width: 1.5px;
871
- }
872
-
873
- /* Complexity-based coloring */
874
- .code-node.complexity-low circle {
875
- stroke: #10b981 !important;
876
- }
877
-
878
- .code-node.complexity-medium circle {
879
- stroke: #f59e0b !important;
880
- }
881
-
882
- .code-node.complexity-high circle {
883
- stroke: #ef4444 !important;
884
- }
885
-
886
- /* Highlighted nodes (search results) */
887
- .code-node.highlighted circle {
888
- stroke: #ec4899 !important;
889
- stroke-width: 3px;
890
- filter: drop-shadow(0 0 8px rgba(236, 72, 153, 0.5));
891
- }
892
-
893
- .code-node.highlighted text {
894
- font-weight: bold;
895
- fill: #ec4899;
896
- }
897
-
898
- /* Search match highlighting */
899
- .code-node.search-match circle {
900
- stroke: #fbbf24 !important;
901
- stroke-width: 3px;
902
- fill: #fef3c7 !important;
903
- filter: drop-shadow(0 0 8px rgba(251, 191, 36, 0.6));
904
- animation: searchPulse 2s ease-in-out infinite;
905
- }
906
-
907
- .code-node.search-match text {
908
- font-weight: bold;
909
- fill: #92400e;
910
- }
911
-
912
- @keyframes searchPulse {
913
- 0%, 100% {
914
- stroke-width: 3px;
915
- opacity: 1;
916
- }
917
- 50% {
918
- stroke-width: 4px;
919
- opacity: 0.8;
920
- }
921
- }
922
-
923
- /* Collapsed node indicator */
924
- .code-node.collapsed circle {
925
- fill: #e2e8f0 !important;
926
- }
927
-
928
- /* Active/selected node */
929
- .code-node.selected circle {
930
- stroke: #9333ea !important;
931
- stroke-width: 3px;
932
- filter: drop-shadow(0 0 12px rgba(147, 51, 234, 0.5));
933
- }
934
-
935
- /* Active node styling (larger icon) */
936
- .node-circle.active {
937
- stroke: #3b82f6 !important;
938
- stroke-width: 3px;
939
- filter: drop-shadow(0 0 8px rgba(59, 130, 246, 0.5));
940
- transition: all 0.3s ease;
941
- }
942
-
943
- /* Parent context styling */
944
- .node-circle.parent-context {
945
- stroke: #10b981 !important;
946
- stroke-width: 2px;
947
- opacity: 0.8;
948
- }
949
-
950
- /* Loading pulse animation */
951
- @keyframes nodePulse {
952
- 0% {
953
- transform: scale(1);
954
- opacity: 1;
955
- }
956
- 50% {
957
- transform: scale(1.3);
958
- opacity: 0.6;
959
- }
960
- 100% {
961
- transform: scale(1);
962
- opacity: 1;
963
- }
964
- }
965
-
966
- .node-circle.loading-pulse {
967
- animation: nodePulse 1.2s ease-in-out infinite;
968
- stroke: #f59e0b !important;
969
- fill: #fef3c7 !important;
970
- }
971
-
972
- /* Enhanced loading states */
973
- .code-node.loading circle {
974
- stroke: #f59e0b !important;
975
- fill: #fef3c7 !important;
976
- animation: nodePulse 1.5s ease-in-out infinite;
977
- }
978
-
979
- .code-node.loading text {
980
- fill: #92400e;
981
- font-weight: 600;
982
- }
983
-
984
- /* Directory item count badge */
985
- .item-count-badge {
986
- font-size: 10px;
987
- fill: #6b7280;
988
- text-anchor: middle;
989
- dominant-baseline: central;
990
- font-weight: 500;
991
- /* Smooth transitions for zoom-based scaling */
992
- transition: font-size 0.2s ease;
993
- }
994
-
995
- .code-node.directory:hover .item-count-badge {
996
- fill: #374151;
997
- }
998
-
999
- /* Tooltips */
1000
- .code-tooltip {
1001
- position: absolute;
1002
- padding: 8px 12px;
1003
- background: rgba(45, 55, 72, 0.95);
1004
- color: white;
1005
- font-size: 12px;
1006
- border-radius: 4px;
1007
- pointer-events: none;
1008
- white-space: nowrap;
1009
- z-index: 1000;
1010
- }
1011
-
1012
- /* Tree control toolbar */
1013
- .tree-controls-toolbar {
1014
- position: absolute;
1015
- top: 15px;
1016
- right: 15px;
1017
- display: flex;
1018
- gap: 8px;
1019
- z-index: 100;
1020
- background: rgba(255, 255, 255, 0.95);
1021
- backdrop-filter: blur(4px);
1022
- border: 1px solid #e5e7eb;
1023
- border-radius: 8px;
1024
- padding: 6px;
1025
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
1026
- }
1027
-
1028
- .tree-control-btn {
1029
- padding: 6px 10px;
1030
- font-size: 12px;
1031
- font-weight: 500;
1032
- border: 1px solid #d1d5db;
1033
- background: white;
1034
- color: #374151;
1035
- border-radius: 4px;
1036
- cursor: pointer;
1037
- transition: all 0.2s ease;
1038
- display: flex;
1039
- align-items: center;
1040
- gap: 4px;
1041
- min-width: 32px;
1042
- justify-content: center;
1043
- }
1044
-
1045
- .tree-control-btn:hover {
1046
- background: #f3f4f6;
1047
- border-color: #9ca3af;
1048
- transform: translateY(-1px);
1049
- }
1050
-
1051
- .tree-control-btn:active {
1052
- transform: translateY(0);
1053
- }
1054
-
1055
- .tree-control-btn.active {
1056
- background: linear-gradient(135deg, #3b82f6 0%, #2563eb 100%);
1057
- color: white;
1058
- border-color: #2563eb;
1059
- box-shadow: 0 2px 4px rgba(59, 130, 246, 0.3);
1060
- }
1061
-
1062
- .tree-control-btn:disabled {
1063
- opacity: 0.5;
1064
- cursor: not-allowed;
1065
- transform: none;
1066
- }
1067
-
1068
- /* Breadcrumb navigation */
1069
- .tree-breadcrumb {
1070
- position: absolute;
1071
- top: 15px;
1072
- left: 15px;
1073
- background: rgba(255, 255, 255, 0.95);
1074
- backdrop-filter: blur(4px);
1075
- border: 1px solid #e5e7eb;
1076
- border-radius: 8px;
1077
- padding: 6px 12px;
1078
- font-size: 12px;
1079
- color: #4b5563;
1080
- font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
1081
- max-width: 400px;
1082
- z-index: 100;
1083
- box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
1084
- }
1085
-
1086
- .breadcrumb-path {
1087
- display: flex;
1088
- align-items: center;
1089
- gap: 4px;
1090
- font-weight: 500;
1091
- }
1092
-
1093
- .breadcrumb-separator {
1094
- color: #9ca3af;
1095
- margin: 0 2px;
1096
- }
1097
-
1098
- .breadcrumb-segment {
1099
- color: #374151;
1100
- cursor: pointer;
1101
- padding: 2px 4px;
1102
- border-radius: 3px;
1103
- transition: background 0.2s ease;
1104
- }
1105
-
1106
- .breadcrumb-segment:hover {
1107
- background: rgba(59, 130, 246, 0.1);
1108
- color: #3b82f6;
1109
- }
1110
-
1111
- .breadcrumb-segment.current {
1112
- color: #3b82f6;
1113
- font-weight: 600;
1114
- }
1115
-
1116
- /* Code tree notifications */
1117
- .code-tree-notification {
1118
- position: absolute;
1119
- top: 70px;
1120
- right: 15px;
1121
- padding: 12px 20px;
1122
- border-radius: 6px;
1123
- background: white;
1124
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
1125
- font-size: 14px;
1126
- font-weight: 500;
1127
- z-index: 1000;
1128
- animation: slideInRight 0.3s ease;
1129
- max-width: 300px;
1130
- }
1131
-
1132
- .code-tree-notification.info {
1133
- background: #3b82f6;
1134
- color: white;
1135
- }
1136
-
1137
- .code-tree-notification.success {
1138
- background: #10b981;
1139
- color: white;
1140
- }
1141
-
1142
- .code-tree-notification.warning {
1143
- background: #f59e0b;
1144
- color: white;
1145
- }
1146
-
1147
- .code-tree-notification.error {
1148
- background: #ef4444;
1149
- color: white;
1150
- }
1151
-
1152
- @keyframes slideInRight {
1153
- from {
1154
- transform: translateX(100%);
1155
- opacity: 0;
1156
- }
1157
- to {
1158
- transform: translateX(0);
1159
- opacity: 1;
1160
- }
1161
- }
1162
-
1163
- @keyframes slideOutRight {
1164
- from {
1165
- transform: translateX(0);
1166
- opacity: 1;
1167
- }
1168
- to {
1169
- transform: translateX(100%);
1170
- opacity: 0;
1171
- }
1172
- }
1173
-
1174
- /* Ensure container has relative positioning for notifications */
1175
- #code-tree-container {
1176
- position: relative;
1177
- }
1178
-
1179
- /* Code Viewer Modal Styles */
1180
- .code-viewer-modal {
1181
- display: none;
1182
- position: fixed;
1183
- top: 0;
1184
- left: 0;
1185
- width: 100%;
1186
- height: 100%;
1187
- background: rgba(0, 0, 0, 0.5);
1188
- z-index: 10000;
1189
- animation: fadeIn 0.3s ease;
1190
- }
1191
-
1192
- .code-viewer-modal.show {
1193
- display: flex;
1194
- align-items: center;
1195
- justify-content: center;
1196
- }
1197
-
1198
- .code-viewer-content {
1199
- background: white;
1200
- width: 90%;
1201
- max-width: 1200px;
1202
- height: 80%;
1203
- border-radius: 12px;
1204
- display: flex;
1205
- flex-direction: column;
1206
- box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3);
1207
- animation: slideUp 0.3s ease;
1208
- }
1209
-
1210
- .code-viewer-header {
1211
- padding: 20px;
1212
- border-bottom: 1px solid #e2e8f0;
1213
- display: flex;
1214
- justify-content: space-between;
1215
- align-items: center;
1216
- }
1217
-
1218
- .code-viewer-title {
1219
- font-size: 16px;
1220
- font-weight: 600;
1221
- color: #2d3748;
1222
- font-family: 'SF Mono', Monaco, 'Cascadia Code', monospace;
1223
- }
1224
-
1225
- .code-viewer-info {
1226
- display: flex;
1227
- gap: 20px;
1228
- font-size: 12px;
1229
- color: #718096;
1230
- }
1231
-
1232
- .code-viewer-close {
1233
- background: none;
1234
- border: none;
1235
- font-size: 24px;
1236
- color: #718096;
1237
- cursor: pointer;
1238
- padding: 0;
1239
- width: 30px;
1240
- height: 30px;
1241
- display: flex;
1242
- align-items: center;
1243
- justify-content: center;
1244
- border-radius: 4px;
1245
- transition: all 0.2s;
1246
- }
1247
-
1248
- .code-viewer-close:hover {
1249
- background: #f7fafc;
1250
- color: #2d3748;
1251
- }
1252
-
1253
- .code-viewer-body {
1254
- flex: 1;
1255
- overflow: auto;
1256
- padding: 20px;
1257
- background: #282c34;
1258
- }
1259
-
1260
- .code-viewer-code {
1261
- margin: 0;
1262
- min-height: 100%;
1263
- }
1264
-
1265
- .code-viewer-navigation {
1266
- padding: 15px 20px;
1267
- border-top: 1px solid #e2e8f0;
1268
- display: flex;
1269
- justify-content: space-between;
1270
- background: #f8f9fa;
1271
- }
1272
-
1273
- .code-nav-button {
1274
- padding: 8px 16px;
1275
- background: white;
1276
- border: 1px solid #cbd5e0;
1277
- border-radius: 4px;
1278
- cursor: pointer;
1279
- font-size: 13px;
1280
- transition: all 0.2s;
1281
- display: flex;
1282
- align-items: center;
1283
- gap: 5px;
1284
- }
1285
-
1286
- .code-nav-button:hover:not(:disabled) {
1287
- background: #667eea;
1288
- color: white;
1289
- border-color: #667eea;
1290
- }
1291
-
1292
- .code-nav-button:disabled {
1293
- opacity: 0.5;
1294
- cursor: not-allowed;
1295
- }
1296
-
1297
- /* Animations */
1298
- @keyframes fadeIn {
1299
- from {
1300
- opacity: 0;
1301
- }
1302
- to {
1303
- opacity: 1;
1304
- }
1305
- }
1306
-
1307
- @keyframes slideUp {
1308
- from {
1309
- transform: translateY(20px);
1310
- opacity: 0;
1311
- }
1312
- to {
1313
- transform: translateY(0);
1314
- opacity: 1;
1315
- }
1316
- }
1317
-
1318
- /* Responsive adjustments */
1319
- @media (max-width: 768px) {
1320
- .code-header {
1321
- flex-direction: column;
1322
- gap: 15px;
1323
- }
1324
-
1325
- .code-controls {
1326
- width: 100%;
1327
- justify-content: space-between;
1328
- flex-wrap: wrap;
1329
- }
1330
-
1331
- .code-stats {
1332
- width: 100%;
1333
- justify-content: space-around;
1334
- }
1335
-
1336
- .tree-legend {
1337
- position: static;
1338
- margin-top: 20px;
1339
- max-width: 100%;
1340
- }
1341
-
1342
- .code-viewer-content {
1343
- width: 95%;
1344
- height: 90%;
1345
- }
1346
- }
1347
-
1348
- /* Analyze button states */
1349
- #analyze-code {
1350
- transition: all 0.3s ease;
1351
- min-width: 80px;
1352
- }
1353
-
1354
- #analyze-code.analyzing {
1355
- background: #f59e0b;
1356
- border-color: #f59e0b;
1357
- color: white;
1358
- animation: pulse 1.5s infinite;
1359
- }
1360
-
1361
- #analyze-code.analyzing:before {
1362
- content: '⏳ ';
1363
- }
1364
-
1365
- #analyze-code:disabled {
1366
- opacity: 0.6;
1367
- cursor: not-allowed;
1368
- }
1369
-
1370
- @keyframes pulse {
1371
- 0% {
1372
- box-shadow: 0 0 0 0 rgba(245, 158, 11, 0.7);
1373
- }
1374
- 70% {
1375
- box-shadow: 0 0 0 10px rgba(245, 158, 11, 0);
1376
- }
1377
- 100% {
1378
- box-shadow: 0 0 0 0 rgba(245, 158, 11, 0);
1379
- }
1380
- }
1381
-
1382
- /* Analysis events display */
1383
- .analysis-events {
1384
- border-top: 2px solid #e2e8f0;
1385
- margin-top: 15px;
1386
- padding-top: 10px;
1387
- max-height: 250px;
1388
- overflow-y: auto;
1389
- font-family: 'SF Mono', Monaco, monospace;
1390
- font-size: 12px;
1391
- background: linear-gradient(to bottom, #f8f9fa, #ffffff);
1392
- border-radius: 6px;
1393
- padding: 12px;
1394
- box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05);
1395
- }
1396
-
1397
- .analysis-event {
1398
- padding: 6px 10px;
1399
- margin: 3px 0;
1400
- border-left: 3px solid #3b82f6;
1401
- background: white;
1402
- border-radius: 3px;
1403
- animation: slideIn 0.3s ease;
1404
- transition: all 0.2s ease;
1405
- display: flex;
1406
- align-items: center;
1407
- gap: 8px;
1408
- }
1409
-
1410
- .analysis-event:hover {
1411
- background: #f0f9ff;
1412
- transform: translateX(2px);
1413
- }
1414
-
1415
- @keyframes slideIn {
1416
- from {
1417
- transform: translateX(-10px);
1418
- opacity: 0;
1419
- }
1420
- to {
1421
- transform: translateX(0);
1422
- opacity: 1;
1423
- }
1424
- }
1425
-
1426
- /* Back Button for Focused Directory View */
1427
- .tree-control-btn.back-btn {
1428
- background: #3182ce !important;
1429
- color: white !important;
1430
- border: 1px solid #2c5aa0 !important;
1431
- font-weight: 600;
1432
- margin-right: 10px;
1433
- }
1434
-
1435
- .tree-control-btn.back-btn:hover {
1436
- background: #2c5aa0 !important;
1437
- transform: translateY(-1px);
1438
- box-shadow: 0 4px 8px rgba(49, 130, 206, 0.3);
1439
- }
1440
-
1441
- /* Focused Directory View Styling */
1442
- .code-tree-container.focused {
1443
- border: 2px solid #3182ce;
1444
- border-radius: 8px;
1445
- background: linear-gradient(135deg, #f7fafc 0%, #edf2f7 100%);
1446
- }
1447
-
1448
- .code-tree-container.focused .tree-controls-toolbar {
1449
- background: #e6fffa;
1450
- border-bottom: 1px solid #81e6d9;
1451
- }
1452
-
1453
- /* Corner Controls Styling */
1454
- .tree-corner-controls {
1455
- position: absolute;
1456
- z-index: 1000;
1457
- background: rgba(255, 255, 255, 0.95);
1458
- border: 1px solid #e2e8f0;
1459
- border-radius: 6px;
1460
- padding: 8px 12px;
1461
- box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
1462
- backdrop-filter: blur(4px);
1463
- font-size: 12px;
1464
- }
1465
-
1466
- .tree-corner-controls.top-left {
1467
- top: 10px;
1468
- left: 10px;
1469
- }
1470
-
1471
- .tree-corner-controls.top-right {
1472
- top: 10px;
1473
- right: 10px;
1474
- }
1475
-
1476
- .tree-corner-controls.bottom-left {
1477
- bottom: 10px;
1478
- left: 10px;
1479
- display: flex;
1480
- flex-direction: column;
1481
- align-items: flex-start;
1482
- gap: 4px;
1483
- }
1484
-
1485
- .tree-corner-controls.bottom-right {
1486
- bottom: 10px;
1487
- right: 10px;
1488
- }
1489
-
1490
- .tree-corner-controls .control-group {
1491
- display: flex;
1492
- align-items: center;
1493
- gap: 8px;
1494
- flex-wrap: wrap;
1495
- }
1496
-
1497
- .tree-corner-controls .control-label {
1498
- font-weight: 600;
1499
- color: #4a5568;
1500
- white-space: nowrap;
1501
- }
1502
-
1503
- .tree-corner-controls .checkbox-group {
1504
- display: flex;
1505
- gap: 12px;
1506
- flex-wrap: wrap;
1507
- }
1508
-
1509
- .tree-corner-controls .checkbox-label {
1510
- display: flex;
1511
- align-items: center;
1512
- gap: 4px;
1513
- font-size: 11px;
1514
- color: #4a5568;
1515
- cursor: pointer;
1516
- white-space: nowrap;
1517
- }
1518
-
1519
- .tree-corner-controls .checkbox-label input[type="checkbox"] {
1520
- margin: 0;
1521
- transform: scale(0.9);
1522
- }
1523
-
1524
- .tree-corner-controls .select-compact,
1525
- .tree-corner-controls .search-compact,
1526
- .tree-corner-controls .input-compact {
1527
- font-size: 11px;
1528
- padding: 4px 8px;
1529
- border: 1px solid #d1d5db;
1530
- border-radius: 4px;
1531
- background: white;
1532
- }
1533
-
1534
- .tree-corner-controls .search-compact {
1535
- width: 120px;
1536
- }
1537
-
1538
- .tree-corner-controls .input-compact {
1539
- width: 140px;
1540
- }
1541
-
1542
- .tree-corner-controls .stats-display {
1543
- font-size: 11px;
1544
- color: #6b7280;
1545
- font-weight: 500;
1546
- margin-bottom: 4px;
1547
- }
1548
-
1549
- .tree-corner-controls .status-display {
1550
- font-size: 10px;
1551
- color: #4b5563;
1552
- font-style: italic;
1553
- opacity: 0.8;
1554
- max-width: 200px;
1555
- overflow: hidden;
1556
- text-overflow: ellipsis;
1557
- white-space: nowrap;
1558
- }
1559
-
1560
- .tree-corner-controls .status-display .breadcrumb-ticker {
1561
- display: block;
1562
- }
1563
-
1564
- .tree-corner-controls .status-display #breadcrumb-content {
1565
- display: inline-block;
1566
- animation: none; /* Disable any existing animations for corner display */
1567
- }
1568
-
1569
- /* Hide corner controls when in focused mode to avoid clutter */
1570
- .code-tree-container.focused .tree-corner-controls {
1571
- opacity: 0.7;
1572
- }
1573
-
1574
- .code-tree-container.focused .tree-corner-controls:hover {
1575
- opacity: 1;
1576
- }
1577
-
1578
- /* Force horizontal text for specific nodes */
1579
- .node-label.horizontal-text {
1580
- writing-mode: horizontal-tb !important;
1581
- text-orientation: mixed !important;
1582
- transform: rotate(0deg) !important;
1583
- }
1584
-
1585
- /* Zoom controls styling */
1586
- .zoom-level-display {
1587
- display: inline-block;
1588
- padding: 2px 6px;
1589
- background: rgba(0, 0, 0, 0.05);
1590
- border-radius: 3px;
1591
- font-family: 'Monaco', 'Menlo', 'Ubuntu Mono', monospace;
1592
- font-size: 11px !important;
1593
- color: #718096 !important;
1594
- margin-left: 8px !important;
1595
- vertical-align: middle;
1596
- min-width: 35px;
1597
- text-align: center;
1598
- }
1599
-
1600
- /* Enhanced tree control buttons for zoom */
1601
- .tree-control-btn {
1602
- background: #f8f9fa;
1603
- border: 1px solid #e2e8f0;
1604
- border-radius: 4px;
1605
- padding: 6px 8px;
1606
- margin: 0 2px;
1607
- cursor: pointer;
1608
- font-size: 12px;
1609
- color: #4a5568;
1610
- transition: all 0.2s;
1611
- display: inline-block;
1612
- vertical-align: middle;
1613
- }
1614
-
1615
- .tree-control-btn:hover {
1616
- background: #e2e8f0;
1617
- border-color: #cbd5e0;
1618
- color: #2d3748;
1619
- }
1620
-
1621
- .tree-control-btn:active {
1622
- background: #cbd5e0;
1623
- transform: translateY(1px);
1624
- }
1625
-
1626
- /* Zoom-specific button styling */
1627
- .tree-control-btn[title*="Zoom"] {
1628
- font-family: system-ui, -apple-system, sans-serif;
1629
- font-weight: 500;
1630
- }
1631
-
1632
- /* Pan cursor when dragging */
1633
- .code-tree-container svg {
1634
- cursor: grab;
1635
- }
1636
-
1637
- .code-tree-container svg:active {
1638
- cursor: grabbing;
1639
- }