memor-code-cli 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (418) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +109 -0
  3. package/dist/IntentionalStructure/index.d.ts +13 -0
  4. package/dist/IntentionalStructure/index.d.ts.map +1 -0
  5. package/dist/IntentionalStructure/index.js +46 -0
  6. package/dist/IntentionalStructure/index.js.map +1 -0
  7. package/dist/IntentionalStructure/parseCompose.d.ts +13 -0
  8. package/dist/IntentionalStructure/parseCompose.d.ts.map +1 -0
  9. package/dist/IntentionalStructure/parseCompose.js +234 -0
  10. package/dist/IntentionalStructure/parseCompose.js.map +1 -0
  11. package/dist/IntentionalStructure/parseDeployConfigs.d.ts +7 -0
  12. package/dist/IntentionalStructure/parseDeployConfigs.d.ts.map +1 -0
  13. package/dist/IntentionalStructure/parseDeployConfigs.js +168 -0
  14. package/dist/IntentionalStructure/parseDeployConfigs.js.map +1 -0
  15. package/dist/IntentionalStructure/parseEnvWiring.d.ts +7 -0
  16. package/dist/IntentionalStructure/parseEnvWiring.d.ts.map +1 -0
  17. package/dist/IntentionalStructure/parseEnvWiring.js +159 -0
  18. package/dist/IntentionalStructure/parseEnvWiring.js.map +1 -0
  19. package/dist/IntentionalStructure/parseWorkspaces.d.ts +8 -0
  20. package/dist/IntentionalStructure/parseWorkspaces.d.ts.map +1 -0
  21. package/dist/IntentionalStructure/parseWorkspaces.js +179 -0
  22. package/dist/IntentionalStructure/parseWorkspaces.js.map +1 -0
  23. package/dist/IntentionalStructure/types.d.ts +34 -0
  24. package/dist/IntentionalStructure/types.d.ts.map +1 -0
  25. package/dist/IntentionalStructure/types.js +8 -0
  26. package/dist/IntentionalStructure/types.js.map +1 -0
  27. package/dist/RepoTypeDetection/applyRepoModeConsistency.d.ts +11 -0
  28. package/dist/RepoTypeDetection/applyRepoModeConsistency.d.ts.map +1 -0
  29. package/dist/RepoTypeDetection/applyRepoModeConsistency.js +53 -0
  30. package/dist/RepoTypeDetection/applyRepoModeConsistency.js.map +1 -0
  31. package/dist/RepoTypeDetection/detectAppArchetype.d.ts +12 -0
  32. package/dist/RepoTypeDetection/detectAppArchetype.d.ts.map +1 -0
  33. package/dist/RepoTypeDetection/detectAppArchetype.js +162 -0
  34. package/dist/RepoTypeDetection/detectAppArchetype.js.map +1 -0
  35. package/dist/RepoTypeDetection/detectPackageArchetype.d.ts +10 -0
  36. package/dist/RepoTypeDetection/detectPackageArchetype.d.ts.map +1 -0
  37. package/dist/RepoTypeDetection/detectPackageArchetype.js +149 -0
  38. package/dist/RepoTypeDetection/detectPackageArchetype.js.map +1 -0
  39. package/dist/RepoTypeDetection/detectRepoCenterSystems.d.ts +11 -0
  40. package/dist/RepoTypeDetection/detectRepoCenterSystems.d.ts.map +1 -0
  41. package/dist/RepoTypeDetection/detectRepoCenterSystems.js +123 -0
  42. package/dist/RepoTypeDetection/detectRepoCenterSystems.js.map +1 -0
  43. package/dist/RepoTypeDetection/detectRepoMode.d.ts +16 -0
  44. package/dist/RepoTypeDetection/detectRepoMode.d.ts.map +1 -0
  45. package/dist/RepoTypeDetection/detectRepoMode.js +338 -0
  46. package/dist/RepoTypeDetection/detectRepoMode.js.map +1 -0
  47. package/dist/RepoTypeDetection/detectRepoSignals.d.ts +13 -0
  48. package/dist/RepoTypeDetection/detectRepoSignals.d.ts.map +1 -0
  49. package/dist/RepoTypeDetection/detectRepoSignals.js +451 -0
  50. package/dist/RepoTypeDetection/detectRepoSignals.js.map +1 -0
  51. package/dist/RepoTypeDetection/inferSupportRole.d.ts +8 -0
  52. package/dist/RepoTypeDetection/inferSupportRole.d.ts.map +1 -0
  53. package/dist/RepoTypeDetection/inferSupportRole.js +177 -0
  54. package/dist/RepoTypeDetection/inferSupportRole.js.map +1 -0
  55. package/dist/RuntimeInference/detectEnvConsumers.d.ts +7 -0
  56. package/dist/RuntimeInference/detectEnvConsumers.d.ts.map +1 -0
  57. package/dist/RuntimeInference/detectEnvConsumers.js +108 -0
  58. package/dist/RuntimeInference/detectEnvConsumers.js.map +1 -0
  59. package/dist/RuntimeInference/detectHttpEdges.d.ts +4 -0
  60. package/dist/RuntimeInference/detectHttpEdges.d.ts.map +1 -0
  61. package/dist/RuntimeInference/detectHttpEdges.js +146 -0
  62. package/dist/RuntimeInference/detectHttpEdges.js.map +1 -0
  63. package/dist/RuntimeInference/detectOrmConsumers.d.ts +5 -0
  64. package/dist/RuntimeInference/detectOrmConsumers.d.ts.map +1 -0
  65. package/dist/RuntimeInference/detectOrmConsumers.js +117 -0
  66. package/dist/RuntimeInference/detectOrmConsumers.js.map +1 -0
  67. package/dist/RuntimeInference/detectProxyRewrites.d.ts +5 -0
  68. package/dist/RuntimeInference/detectProxyRewrites.d.ts.map +1 -0
  69. package/dist/RuntimeInference/detectProxyRewrites.js +137 -0
  70. package/dist/RuntimeInference/detectProxyRewrites.js.map +1 -0
  71. package/dist/RuntimeInference/detectTrpcEdges.d.ts +4 -0
  72. package/dist/RuntimeInference/detectTrpcEdges.d.ts.map +1 -0
  73. package/dist/RuntimeInference/detectTrpcEdges.js +137 -0
  74. package/dist/RuntimeInference/detectTrpcEdges.js.map +1 -0
  75. package/dist/RuntimeInference/index.d.ts +17 -0
  76. package/dist/RuntimeInference/index.d.ts.map +1 -0
  77. package/dist/RuntimeInference/index.js +32 -0
  78. package/dist/RuntimeInference/index.js.map +1 -0
  79. package/dist/RuntimeInference/types.d.ts +8 -0
  80. package/dist/RuntimeInference/types.d.ts.map +1 -0
  81. package/dist/RuntimeInference/types.js +3 -0
  82. package/dist/RuntimeInference/types.js.map +1 -0
  83. package/dist/SystemSynthesis/index.d.ts +27 -0
  84. package/dist/SystemSynthesis/index.d.ts.map +1 -0
  85. package/dist/SystemSynthesis/index.js +31 -0
  86. package/dist/SystemSynthesis/index.js.map +1 -0
  87. package/dist/SystemSynthesis/mergeLayerOutputs.d.ts +13 -0
  88. package/dist/SystemSynthesis/mergeLayerOutputs.d.ts.map +1 -0
  89. package/dist/SystemSynthesis/mergeLayerOutputs.js +220 -0
  90. package/dist/SystemSynthesis/mergeLayerOutputs.js.map +1 -0
  91. package/dist/SystemSynthesis/stampDeterministic.d.ts +11 -0
  92. package/dist/SystemSynthesis/stampDeterministic.d.ts.map +1 -0
  93. package/dist/SystemSynthesis/stampDeterministic.js +177 -0
  94. package/dist/SystemSynthesis/stampDeterministic.js.map +1 -0
  95. package/dist/SystemSynthesis/synthesize.d.ts +15 -0
  96. package/dist/SystemSynthesis/synthesize.d.ts.map +1 -0
  97. package/dist/SystemSynthesis/synthesize.js +258 -0
  98. package/dist/SystemSynthesis/synthesize.js.map +1 -0
  99. package/dist/SystemSynthesis/types.d.ts +110 -0
  100. package/dist/SystemSynthesis/types.d.ts.map +1 -0
  101. package/dist/SystemSynthesis/types.js +12 -0
  102. package/dist/SystemSynthesis/types.js.map +1 -0
  103. package/dist/amGeneration/buildFlowGraph.d.ts +39 -0
  104. package/dist/amGeneration/buildFlowGraph.d.ts.map +1 -0
  105. package/dist/amGeneration/buildFlowGraph.js +643 -0
  106. package/dist/amGeneration/buildFlowGraph.js.map +1 -0
  107. package/dist/amGeneration/enrichAMEdges.d.ts +16 -0
  108. package/dist/amGeneration/enrichAMEdges.d.ts.map +1 -0
  109. package/dist/amGeneration/enrichAMEdges.js +291 -0
  110. package/dist/amGeneration/enrichAMEdges.js.map +1 -0
  111. package/dist/amGeneration/generateAM.d.ts +23 -0
  112. package/dist/amGeneration/generateAM.d.ts.map +1 -0
  113. package/dist/amGeneration/generateAM.js +131 -0
  114. package/dist/amGeneration/generateAM.js.map +1 -0
  115. package/dist/amGeneration/generateAMForRepo.d.ts +6 -0
  116. package/dist/amGeneration/generateAMForRepo.d.ts.map +1 -0
  117. package/dist/amGeneration/generateAMForRepo.js +130 -0
  118. package/dist/amGeneration/generateAMForRepo.js.map +1 -0
  119. package/dist/amGeneration/generateFlows.d.ts +27 -0
  120. package/dist/amGeneration/generateFlows.d.ts.map +1 -0
  121. package/dist/amGeneration/generateFlows.js +320 -0
  122. package/dist/amGeneration/generateFlows.js.map +1 -0
  123. package/dist/amGeneration/promptBuilder.d.ts +24 -0
  124. package/dist/amGeneration/promptBuilder.d.ts.map +1 -0
  125. package/dist/amGeneration/promptBuilder.js +299 -0
  126. package/dist/amGeneration/promptBuilder.js.map +1 -0
  127. package/dist/amGeneration/selectStrategicFiles.d.ts +42 -0
  128. package/dist/amGeneration/selectStrategicFiles.d.ts.map +1 -0
  129. package/dist/amGeneration/selectStrategicFiles.js +672 -0
  130. package/dist/amGeneration/selectStrategicFiles.js.map +1 -0
  131. package/dist/amGeneration/types.d.ts +83 -0
  132. package/dist/amGeneration/types.d.ts.map +1 -0
  133. package/dist/amGeneration/types.js +9 -0
  134. package/dist/amGeneration/types.js.map +1 -0
  135. package/dist/amSections.d.ts +29 -0
  136. package/dist/amSections.d.ts.map +1 -0
  137. package/dist/amSections.js +424 -0
  138. package/dist/amSections.js.map +1 -0
  139. package/dist/analysis/analysisCache.d.ts +4 -0
  140. package/dist/analysis/analysisCache.d.ts.map +1 -0
  141. package/dist/analysis/analysisCache.js +92 -0
  142. package/dist/analysis/analysisCache.js.map +1 -0
  143. package/dist/analysis/buildBranchStory.d.ts +95 -0
  144. package/dist/analysis/buildBranchStory.d.ts.map +1 -0
  145. package/dist/analysis/buildBranchStory.js +1264 -0
  146. package/dist/analysis/buildBranchStory.js.map +1 -0
  147. package/dist/analysis/buildDetailedFileXRay.d.ts +49 -0
  148. package/dist/analysis/buildDetailedFileXRay.d.ts.map +1 -0
  149. package/dist/analysis/buildDetailedFileXRay.js +607 -0
  150. package/dist/analysis/buildDetailedFileXRay.js.map +1 -0
  151. package/dist/analysis/buildFileXRay.d.ts +35 -0
  152. package/dist/analysis/buildFileXRay.d.ts.map +1 -0
  153. package/dist/analysis/buildFileXRay.js +305 -0
  154. package/dist/analysis/buildFileXRay.js.map +1 -0
  155. package/dist/analysis/classifySilentKiller.d.ts +14 -0
  156. package/dist/analysis/classifySilentKiller.d.ts.map +1 -0
  157. package/dist/analysis/classifySilentKiller.js +235 -0
  158. package/dist/analysis/classifySilentKiller.js.map +1 -0
  159. package/dist/analysis/diffChunks.d.ts +21 -0
  160. package/dist/analysis/diffChunks.d.ts.map +1 -0
  161. package/dist/analysis/diffChunks.js +302 -0
  162. package/dist/analysis/diffChunks.js.map +1 -0
  163. package/dist/analysis/extractRouteMap.d.ts +49 -0
  164. package/dist/analysis/extractRouteMap.d.ts.map +1 -0
  165. package/dist/analysis/extractRouteMap.js +354 -0
  166. package/dist/analysis/extractRouteMap.js.map +1 -0
  167. package/dist/analysis/generateFileInsight.d.ts +19 -0
  168. package/dist/analysis/generateFileInsight.d.ts.map +1 -0
  169. package/dist/analysis/generateFileInsight.js +103 -0
  170. package/dist/analysis/generateFileInsight.js.map +1 -0
  171. package/dist/analysis/llmXRay.d.ts +39 -0
  172. package/dist/analysis/llmXRay.d.ts.map +1 -0
  173. package/dist/analysis/llmXRay.js +208 -0
  174. package/dist/analysis/llmXRay.js.map +1 -0
  175. package/dist/analysis/simulateFailure.d.ts +44 -0
  176. package/dist/analysis/simulateFailure.d.ts.map +1 -0
  177. package/dist/analysis/simulateFailure.js +407 -0
  178. package/dist/analysis/simulateFailure.js.map +1 -0
  179. package/dist/anthropic.d.ts +3 -0
  180. package/dist/anthropic.d.ts.map +1 -0
  181. package/dist/anthropic.js +16 -0
  182. package/dist/anthropic.js.map +1 -0
  183. package/dist/app/buildAppPage.d.ts +34 -0
  184. package/dist/app/buildAppPage.d.ts.map +1 -0
  185. package/dist/app/buildAppPage.js +3085 -0
  186. package/dist/app/buildAppPage.js.map +1 -0
  187. package/dist/app-bundle.js +122 -0
  188. package/dist/buildAppData.d.ts +3 -0
  189. package/dist/buildAppData.d.ts.map +1 -0
  190. package/dist/buildAppData.js +207 -0
  191. package/dist/buildAppData.js.map +1 -0
  192. package/dist/builders/analyzeRepo.d.ts +25 -0
  193. package/dist/builders/analyzeRepo.d.ts.map +1 -0
  194. package/dist/builders/analyzeRepo.js +873 -0
  195. package/dist/builders/analyzeRepo.js.map +1 -0
  196. package/dist/builders/buildSystemConnections.d.ts +3 -0
  197. package/dist/builders/buildSystemConnections.d.ts.map +1 -0
  198. package/dist/builders/buildSystemConnections.js +388 -0
  199. package/dist/builders/buildSystemConnections.js.map +1 -0
  200. package/dist/builders/buildTextSummary.d.ts +61 -0
  201. package/dist/builders/buildTextSummary.d.ts.map +1 -0
  202. package/dist/builders/buildTextSummary.js +178 -0
  203. package/dist/builders/buildTextSummary.js.map +1 -0
  204. package/dist/builders/deriveRecommendedStartPath.d.ts +11 -0
  205. package/dist/builders/deriveRecommendedStartPath.d.ts.map +1 -0
  206. package/dist/builders/deriveRecommendedStartPath.js +140 -0
  207. package/dist/builders/deriveRecommendedStartPath.js.map +1 -0
  208. package/dist/builders/deriveRuntimeRole.d.ts +4 -0
  209. package/dist/builders/deriveRuntimeRole.d.ts.map +1 -0
  210. package/dist/builders/deriveRuntimeRole.js +30 -0
  211. package/dist/builders/deriveRuntimeRole.js.map +1 -0
  212. package/dist/builders/detectRunCommands.d.ts +16 -0
  213. package/dist/builders/detectRunCommands.d.ts.map +1 -0
  214. package/dist/builders/detectRunCommands.js +285 -0
  215. package/dist/builders/detectRunCommands.js.map +1 -0
  216. package/dist/builders/generateSystemNarrative.d.ts +12 -0
  217. package/dist/builders/generateSystemNarrative.d.ts.map +1 -0
  218. package/dist/builders/generateSystemNarrative.js +474 -0
  219. package/dist/builders/generateSystemNarrative.js.map +1 -0
  220. package/dist/builders/gitLogParser.d.ts +15 -0
  221. package/dist/builders/gitLogParser.d.ts.map +1 -0
  222. package/dist/builders/gitLogParser.js +116 -0
  223. package/dist/builders/gitLogParser.js.map +1 -0
  224. package/dist/builders/readRepoContext.d.ts +30 -0
  225. package/dist/builders/readRepoContext.d.ts.map +1 -0
  226. package/dist/builders/readRepoContext.js +323 -0
  227. package/dist/builders/readRepoContext.js.map +1 -0
  228. package/dist/builders/readSystemReadme.d.ts +39 -0
  229. package/dist/builders/readSystemReadme.d.ts.map +1 -0
  230. package/dist/builders/readSystemReadme.js +133 -0
  231. package/dist/builders/readSystemReadme.js.map +1 -0
  232. package/dist/builders/systemRanking.d.ts +24 -0
  233. package/dist/builders/systemRanking.d.ts.map +1 -0
  234. package/dist/builders/systemRanking.js +153 -0
  235. package/dist/builders/systemRanking.js.map +1 -0
  236. package/dist/cli.d.ts +3 -0
  237. package/dist/cli.d.ts.map +1 -0
  238. package/dist/cli.js +170 -0
  239. package/dist/cli.js.map +1 -0
  240. package/dist/detectors/applyRunnableConfidenceGate.d.ts +8 -0
  241. package/dist/detectors/applyRunnableConfidenceGate.d.ts.map +1 -0
  242. package/dist/detectors/applyRunnableConfidenceGate.js +166 -0
  243. package/dist/detectors/applyRunnableConfidenceGate.js.map +1 -0
  244. package/dist/detectors/classifySystemType.d.ts +17 -0
  245. package/dist/detectors/classifySystemType.d.ts.map +1 -0
  246. package/dist/detectors/classifySystemType.js +460 -0
  247. package/dist/detectors/classifySystemType.js.map +1 -0
  248. package/dist/detectors/detectAppInternalUnits.d.ts +20 -0
  249. package/dist/detectors/detectAppInternalUnits.d.ts.map +1 -0
  250. package/dist/detectors/detectAppInternalUnits.js +454 -0
  251. package/dist/detectors/detectAppInternalUnits.js.map +1 -0
  252. package/dist/detectors/detectBlocks.d.ts +6 -0
  253. package/dist/detectors/detectBlocks.d.ts.map +1 -0
  254. package/dist/detectors/detectBlocks.js +354 -0
  255. package/dist/detectors/detectBlocks.js.map +1 -0
  256. package/dist/detectors/detectComposeServices.d.ts +23 -0
  257. package/dist/detectors/detectComposeServices.d.ts.map +1 -0
  258. package/dist/detectors/detectComposeServices.js +255 -0
  259. package/dist/detectors/detectComposeServices.js.map +1 -0
  260. package/dist/detectors/detectEntryPoints.d.ts +6 -0
  261. package/dist/detectors/detectEntryPoints.d.ts.map +1 -0
  262. package/dist/detectors/detectEntryPoints.js +376 -0
  263. package/dist/detectors/detectEntryPoints.js.map +1 -0
  264. package/dist/detectors/detectSubsystems.d.ts +6 -0
  265. package/dist/detectors/detectSubsystems.d.ts.map +1 -0
  266. package/dist/detectors/detectSubsystems.js +376 -0
  267. package/dist/detectors/detectSubsystems.js.map +1 -0
  268. package/dist/detectors/detectSystemCandidates.d.ts +3 -0
  269. package/dist/detectors/detectSystemCandidates.d.ts.map +1 -0
  270. package/dist/detectors/detectSystemCandidates.js +577 -0
  271. package/dist/detectors/detectSystemCandidates.js.map +1 -0
  272. package/dist/devWatcher.d.ts +14 -0
  273. package/dist/devWatcher.d.ts.map +1 -0
  274. package/dist/devWatcher.js +96 -0
  275. package/dist/devWatcher.js.map +1 -0
  276. package/dist/graph/buildCodebaseGraph.d.ts +3 -0
  277. package/dist/graph/buildCodebaseGraph.d.ts.map +1 -0
  278. package/dist/graph/buildCodebaseGraph.js +602 -0
  279. package/dist/graph/buildCodebaseGraph.js.map +1 -0
  280. package/dist/graph/buildLLMPayload.d.ts +89 -0
  281. package/dist/graph/buildLLMPayload.d.ts.map +1 -0
  282. package/dist/graph/buildLLMPayload.js +715 -0
  283. package/dist/graph/buildLLMPayload.js.map +1 -0
  284. package/dist/graph/callLLM.d.ts +16 -0
  285. package/dist/graph/callLLM.d.ts.map +1 -0
  286. package/dist/graph/callLLM.js +274 -0
  287. package/dist/graph/callLLM.js.map +1 -0
  288. package/dist/graph/types.d.ts +76 -0
  289. package/dist/graph/types.d.ts.map +1 -0
  290. package/dist/graph/types.js +5 -0
  291. package/dist/graph/types.js.map +1 -0
  292. package/dist/graph/walkExports.d.ts +2 -0
  293. package/dist/graph/walkExports.d.ts.map +1 -0
  294. package/dist/graph/walkExports.js +172 -0
  295. package/dist/graph/walkExports.js.map +1 -0
  296. package/dist/heuristics/file-patterns.json +325 -0
  297. package/dist/heuristics/known-packages.json +1022 -0
  298. package/dist/heuristics/loader.d.ts +121 -0
  299. package/dist/heuristics/loader.d.ts.map +1 -0
  300. package/dist/heuristics/loader.js +196 -0
  301. package/dist/heuristics/loader.js.map +1 -0
  302. package/dist/heuristics/repo-mode-signals.json +248 -0
  303. package/dist/index.d.ts +3 -0
  304. package/dist/index.d.ts.map +1 -0
  305. package/dist/index.js +93 -0
  306. package/dist/index.js.map +1 -0
  307. package/dist/mcp.d.ts +3 -0
  308. package/dist/mcp.d.ts.map +1 -0
  309. package/dist/mcp.js +356 -0
  310. package/dist/mcp.js.map +1 -0
  311. package/dist/scanner/buildImportGraph.d.ts +23 -0
  312. package/dist/scanner/buildImportGraph.d.ts.map +1 -0
  313. package/dist/scanner/buildImportGraph.js +186 -0
  314. package/dist/scanner/buildImportGraph.js.map +1 -0
  315. package/dist/scanner/detectDBOps.d.ts +21 -0
  316. package/dist/scanner/detectDBOps.d.ts.map +1 -0
  317. package/dist/scanner/detectDBOps.js +346 -0
  318. package/dist/scanner/detectDBOps.js.map +1 -0
  319. package/dist/scanner/detectOutbound.d.ts +6 -0
  320. package/dist/scanner/detectOutbound.d.ts.map +1 -0
  321. package/dist/scanner/detectOutbound.js +101 -0
  322. package/dist/scanner/detectOutbound.js.map +1 -0
  323. package/dist/scanner/detectRepoPurpose.d.ts +19 -0
  324. package/dist/scanner/detectRepoPurpose.d.ts.map +1 -0
  325. package/dist/scanner/detectRepoPurpose.js +335 -0
  326. package/dist/scanner/detectRepoPurpose.js.map +1 -0
  327. package/dist/scanner/detectRoutes.d.ts +22 -0
  328. package/dist/scanner/detectRoutes.d.ts.map +1 -0
  329. package/dist/scanner/detectRoutes.js +406 -0
  330. package/dist/scanner/detectRoutes.js.map +1 -0
  331. package/dist/scanner/filterNoise.d.ts +4 -0
  332. package/dist/scanner/filterNoise.d.ts.map +1 -0
  333. package/dist/scanner/filterNoise.js +95 -0
  334. package/dist/scanner/filterNoise.js.map +1 -0
  335. package/dist/scanner/loadTsAliases.d.ts +20 -0
  336. package/dist/scanner/loadTsAliases.d.ts.map +1 -0
  337. package/dist/scanner/loadTsAliases.js +135 -0
  338. package/dist/scanner/loadTsAliases.js.map +1 -0
  339. package/dist/scanner/routeHandlers.d.ts +15 -0
  340. package/dist/scanner/routeHandlers.d.ts.map +1 -0
  341. package/dist/scanner/routeHandlers.js +154 -0
  342. package/dist/scanner/routeHandlers.js.map +1 -0
  343. package/dist/scanner/scanRepo.d.ts +10 -0
  344. package/dist/scanner/scanRepo.d.ts.map +1 -0
  345. package/dist/scanner/scanRepo.js +165 -0
  346. package/dist/scanner/scanRepo.js.map +1 -0
  347. package/dist/scanner/walkImports.d.ts +14 -0
  348. package/dist/scanner/walkImports.d.ts.map +1 -0
  349. package/dist/scanner/walkImports.js +162 -0
  350. package/dist/scanner/walkImports.js.map +1 -0
  351. package/dist/server.d.ts +2 -0
  352. package/dist/server.d.ts.map +1 -0
  353. package/dist/server.js +956 -0
  354. package/dist/server.js.map +1 -0
  355. package/dist/session/diff.d.ts +4 -0
  356. package/dist/session/diff.d.ts.map +1 -0
  357. package/dist/session/diff.js +150 -0
  358. package/dist/session/diff.js.map +1 -0
  359. package/dist/session/snapshot.d.ts +5 -0
  360. package/dist/session/snapshot.d.ts.map +1 -0
  361. package/dist/session/snapshot.js +114 -0
  362. package/dist/session/snapshot.js.map +1 -0
  363. package/dist/session/store.d.ts +8 -0
  364. package/dist/session/store.d.ts.map +1 -0
  365. package/dist/session/store.js +101 -0
  366. package/dist/session/store.js.map +1 -0
  367. package/dist/session/types.d.ts +46 -0
  368. package/dist/session/types.d.ts.map +1 -0
  369. package/dist/session/types.js +4 -0
  370. package/dist/session/types.js.map +1 -0
  371. package/dist/types.d.ts +350 -0
  372. package/dist/types.d.ts.map +1 -0
  373. package/dist/types.js +4 -0
  374. package/dist/types.js.map +1 -0
  375. package/dist/utils/file.d.ts +5 -0
  376. package/dist/utils/file.d.ts.map +1 -0
  377. package/dist/utils/file.js +76 -0
  378. package/dist/utils/file.js.map +1 -0
  379. package/dist/utils/path.d.ts +7 -0
  380. package/dist/utils/path.d.ts.map +1 -0
  381. package/dist/utils/path.js +62 -0
  382. package/dist/utils/path.js.map +1 -0
  383. package/dist/utils/text.d.ts +5 -0
  384. package/dist/utils/text.d.ts.map +1 -0
  385. package/dist/utils/text.js +29 -0
  386. package/dist/utils/text.js.map +1 -0
  387. package/dist/viewBuilders/buildSystemFolders.d.ts +39 -0
  388. package/dist/viewBuilders/buildSystemFolders.d.ts.map +1 -0
  389. package/dist/viewBuilders/buildSystemFolders.js +198 -0
  390. package/dist/viewBuilders/buildSystemFolders.js.map +1 -0
  391. package/dist/watcher/repoWatcher.d.ts +17 -0
  392. package/dist/watcher/repoWatcher.d.ts.map +1 -0
  393. package/dist/watcher/repoWatcher.js +87 -0
  394. package/dist/watcher/repoWatcher.js.map +1 -0
  395. package/package.json +102 -0
  396. package/public/memor_logo.svg +18 -0
  397. package/public/memor_transparent_logo.svg +25 -0
  398. package/public/tIcons/bun.svg +1 -0
  399. package/public/tIcons/css.svg +1 -0
  400. package/public/tIcons/docker.svg +3 -0
  401. package/public/tIcons/expressjs.svg +1 -0
  402. package/public/tIcons/html5.svg +6 -0
  403. package/public/tIcons/javascript.svg +1 -0
  404. package/public/tIcons/jest.svg +4 -0
  405. package/public/tIcons/json.svg +1 -0
  406. package/public/tIcons/markdown-light.svg +1 -0
  407. package/public/tIcons/nestjs.svg +1 -0
  408. package/public/tIcons/nextjs_icon_dark.svg +1 -0
  409. package/public/tIcons/npm.svg +1 -0
  410. package/public/tIcons/pnpm.svg +1 -0
  411. package/public/tIcons/prisma.svg +1 -0
  412. package/public/tIcons/react_dark.svg +11 -0
  413. package/public/tIcons/supabase.svg +15 -0
  414. package/public/tIcons/tailwindcss.svg +1 -0
  415. package/public/tIcons/turborepo-icon-light.svg +1 -0
  416. package/public/tIcons/typescript.svg +1 -0
  417. package/public/tIcons/vite.svg +1 -0
  418. package/public/tIcons/yarn.svg +1 -0
@@ -0,0 +1,3085 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.appCss = appCss;
37
+ exports.buildAppPage = buildAppPage;
38
+ const fs = __importStar(require("fs"));
39
+ const path = __importStar(require("path"));
40
+ function esc(s) {
41
+ return s
42
+ .replace(/&/g, "&amp;")
43
+ .replace(/</g, "&lt;")
44
+ .replace(/>/g, "&gt;")
45
+ .replace(/"/g, "&quot;");
46
+ }
47
+ function readBundle(filename) {
48
+ const candidates = [
49
+ path.join(__dirname, "..", filename),
50
+ path.join(__dirname, filename),
51
+ path.join(__dirname, "..", "..", "dist", filename),
52
+ path.join(process.cwd(), "dist", filename),
53
+ ];
54
+ for (const p of candidates) {
55
+ try {
56
+ return fs.readFileSync(p, "utf-8");
57
+ }
58
+ catch { }
59
+ }
60
+ console.error(` Warning: could not read ${filename}`);
61
+ return "";
62
+ }
63
+ function appCss() {
64
+ // Prepend @xyflow/react base styles (esbuild drops them due to sideEffects:false in package.json)
65
+ let xyflowCss = "";
66
+ try {
67
+ const cssPath = require.resolve("@xyflow/react/dist/style.css");
68
+ xyflowCss = fs.readFileSync(cssPath, "utf8");
69
+ }
70
+ catch {
71
+ // ignore if not found
72
+ }
73
+ return (xyflowCss +
74
+ `
75
+ *{box-sizing:border-box;margin:0;padding:0}
76
+ html,body{height:100%;overflow:hidden}
77
+
78
+ :root{
79
+ --bg-page:#f0f0f0;
80
+ --bg-surface:#ffffff;
81
+ --bg-elevated:#f8fafc;
82
+ --bg-inset:rgba(0,0,0,.04);
83
+ --bg-topbar:rgba(255,255,255,.72);
84
+ --bg-dock:#ffffff;
85
+ --text-primary:#1a1a1a;
86
+ --text-secondary:#334155;
87
+ --text-muted:#64748b;
88
+ --text-faint:#94a3b8;
89
+ --text-on-surface:#27272a;
90
+ --border-primary:rgba(0,0,0,.06);
91
+ --border-secondary:rgba(0,0,0,.08);
92
+ --border-strong:#e2e8f0;
93
+ --shadow-card:0 2px 12px rgba(0,0,0,.08);
94
+ --shadow-heavy:0 4px 24px rgba(0,0,0,.10);
95
+ --dot-color:rgba(0,0,0,.10);
96
+ --hover-bg:#f5f5f5;
97
+ --active-bg:#f0f0f0;
98
+ --chip-bg:rgba(0,0,0,.04);
99
+ --chip-border:rgba(0,0,0,.08);
100
+ --chip-text:#3f3f46;
101
+ --qa-moderate-bg:rgba(59,130,246,.06);
102
+ --qa-moderate-border:rgba(59,130,246,.15);
103
+ --qa-moderate-text:#2563eb;
104
+ --qa-low-bg:rgba(234,179,8,.07);
105
+ --qa-low-border:rgba(234,179,8,.2);
106
+ --qa-low-text:#b45309;
107
+ --signals-bg:linear-gradient(135deg,#fffbeb 0%,#fef3c7 100%);
108
+ --signals-border:rgba(217,119,6,.1);
109
+ --signals-shadow:0 2px 12px rgba(0,0,0,.06);
110
+ }
111
+
112
+ [data-theme="dark"]{
113
+ --bg-page:#1e1e1e;
114
+ --bg-surface:#252526;
115
+ --bg-elevated:#2d2d30;
116
+ --bg-inset:rgba(255,255,255,.05);
117
+ --bg-topbar:rgba(37,37,38,.85);
118
+ --bg-dock:#252526;
119
+ --text-primary:#d4d4d4;
120
+ --text-secondary:#b0b0b0;
121
+ --text-muted:#969696;
122
+ --text-faint:#6a6a6a;
123
+ --text-on-surface:#e4e4e7;
124
+ --border-primary:rgba(255,255,255,.06);
125
+ --border-secondary:rgba(255,255,255,.08);
126
+ --border-strong:#3c3c3c;
127
+ --shadow-card:0 2px 12px rgba(0,0,0,.3);
128
+ --shadow-heavy:0 4px 24px rgba(0,0,0,.4);
129
+ --dot-color:rgba(255,255,255,.06);
130
+ --hover-bg:#2d2d30;
131
+ --active-bg:#37373d;
132
+ --chip-bg:rgba(255,255,255,.06);
133
+ --chip-border:rgba(255,255,255,.08);
134
+ --chip-text:#b0b0b0;
135
+ --qa-moderate-bg:rgba(59,130,246,.1);
136
+ --qa-moderate-border:rgba(59,130,246,.25);
137
+ --qa-moderate-text:#93b4f8;
138
+ --qa-low-bg:rgba(234,179,8,.1);
139
+ --qa-low-border:rgba(234,179,8,.25);
140
+ --qa-low-text:#fbbf24;
141
+ --signals-bg:linear-gradient(135deg,#1a1a1f 0%,#1c1b18 100%);
142
+ --signals-border:rgba(251,191,36,.08);
143
+ --signals-shadow:0 4px 20px rgba(0,0,0,.3);
144
+ }
145
+
146
+ body{
147
+ font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,Helvetica,Arial,sans-serif;
148
+ background:var(--bg-page);color:var(--text-primary);font-size:13px;line-height:1.5;
149
+ -webkit-font-smoothing:antialiased;
150
+ }
151
+
152
+ /* ═══ App shell ═══ */
153
+ #app{display:flex;flex-direction:column;height:100vh}
154
+
155
+ /* ── Load animations ── */
156
+ .topbar,.dock,.seed-galaxy{
157
+ opacity:0;transform:translateY(6px);
158
+ transition:opacity .5s ease,transform .5s ease;
159
+ }
160
+ .app-loaded .topbar{
161
+ opacity:1;transform:translateY(0);transition-delay:.05s;
162
+ }
163
+ .app-loaded .seed-galaxy{
164
+ opacity:1;transform:translate(-50%,-50%) scale(1);
165
+ }
166
+ .app-loaded .dock{
167
+ opacity:1;transform:translateY(-50%) translateX(0);transition-delay:.35s;
168
+ }
169
+
170
+ /* ── Top bar ── */
171
+ .topbar{
172
+ height:48px;background:var(--bg-topbar);
173
+ backdrop-filter:blur(16px);-webkit-backdrop-filter:blur(16px);
174
+ display:flex;align-items:center;padding:0 24px;flex-shrink:0;
175
+ border-bottom:1px solid var(--border-primary);
176
+ z-index:10;position:relative;
177
+ }
178
+ .topbar-brand{
179
+ font-weight:700;font-size:15px;color:var(--text-primary);
180
+ letter-spacing:-.03em;
181
+ }
182
+ .topbar-theme-toggle{
183
+ margin-left:auto;background:none;border:none;cursor:pointer;
184
+ padding:6px;border-radius:6px;color:var(--text-muted);
185
+ display:flex;align-items:center;justify-content:center;
186
+ transition:color .2s,background .2s;
187
+ }
188
+ .topbar-theme-toggle:hover{color:var(--text-primary);background:var(--hover-bg)}
189
+
190
+ /* ── Desktop workspace ── */
191
+ .desktop{
192
+ flex:1;position:relative;overflow:hidden;
193
+ }
194
+
195
+ /* ── Dotted grid background ── */
196
+ .dotgrid{
197
+ position:absolute;inset:0;
198
+ background-image:radial-gradient(circle, var(--dot-color) 1px, transparent 1px);
199
+ background-size:24px 24px;
200
+ background-position:12px 12px;
201
+ }
202
+
203
+ /* ═══ Center Seed Card ═══ */
204
+ /* ── Galaxy layout (multi-card overview) ── */
205
+ .seed-galaxy{
206
+ position:absolute;top:48%;left:50%;
207
+ transform:translate(-50%,-50%);
208
+ z-index:15;
209
+ display:grid;
210
+ grid-template-columns:1fr 1fr;
211
+ gap:12px;
212
+ width:720px;max-width:calc(100vw - 48px);
213
+ color:var(--text-on-surface);font-family:inherit;
214
+ }
215
+ .seed-connectors{display:none}
216
+
217
+ .seed-card{
218
+ background:var(--bg-surface);
219
+ border-radius:14px;padding:18px 20px 16px;
220
+ box-shadow:0 0 0 1px var(--border-primary),var(--shadow-card);
221
+ color:var(--text-on-surface);font-family:inherit;
222
+ opacity:0;transform:translateY(6px);
223
+ animation:cardIn .4s ease forwards;
224
+ }
225
+ @keyframes cardIn{
226
+ to{opacity:1;transform:translateY(0)}
227
+ }
228
+
229
+ .seed-card-identity{
230
+ grid-column:1 / -1;
231
+ animation-delay:.1s;
232
+ border-top:2px solid rgba(99,102,241,.5);
233
+ }
234
+ .seed-card-flow{
235
+ animation-delay:.18s;
236
+ border-left:2px solid rgba(168,85,247,.45);
237
+ }
238
+ .seed-card-flow .seed-label{color:rgba(168,85,247,.75)}
239
+ .seed-card-flow .seed-label-entry{color:rgba(34,197,94,.7)}
240
+ .seed-entry-section{
241
+ margin-top:14px;padding-top:12px;
242
+ border-top:1px solid var(--border-primary);
243
+ }
244
+ .seed-card-zones{
245
+ animation-delay:.2s;
246
+ border-left:2px solid rgba(59,130,246,.5);
247
+ }
248
+ .seed-card-zones .seed-label{color:rgba(59,130,246,.75)}
249
+ .seed-card-signals{
250
+ grid-column:1 / -1;
251
+ animation-delay:.3s;
252
+ margin-top:4px;
253
+ border-left:2px solid rgba(217,119,6,.5);
254
+ background:var(--signals-bg);
255
+ box-shadow:0 0 0 1px var(--signals-border),var(--signals-shadow);
256
+ }
257
+ .seed-card-signals .seed-label{color:rgba(217,119,6,.85);letter-spacing:.14em}
258
+ .seed-card-purpose{
259
+ grid-column:1 / -1;
260
+ animation-delay:.35s;
261
+ margin-top:4px;
262
+ border-left:2px solid rgba(16,185,129,.5);
263
+ background:rgba(16,185,129,.04);
264
+ box-shadow:0 0 0 1px rgba(16,185,129,.12);
265
+ }
266
+ .seed-card-purpose .seed-label{color:rgba(16,185,129,.85);letter-spacing:.14em}
267
+ .seed-purpose-label{font-size:13px;font-weight:600;color:var(--text-primary);margin:6px 0 2px}
268
+ .seed-purpose-confidence{font-size:10px;color:var(--text-muted);text-transform:uppercase;letter-spacing:.1em;margin-bottom:8px}
269
+ .seed-purpose-signals{display:flex;flex-direction:column;gap:4px}
270
+ .seed-purpose-signal{display:flex;align-items:baseline;gap:6px;font-size:11px}
271
+ .seed-purpose-signal-dot{color:rgba(16,185,129,.6);flex-shrink:0}
272
+ .seed-purpose-signal-text{color:var(--text-secondary);flex:1}
273
+ .seed-purpose-signal-ev{font-size:10px;color:var(--text-muted);background:rgba(0,0,0,.06);padding:1px 4px;border-radius:3px;font-family:monospace;max-width:180px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
274
+ .seed-card-sparse{
275
+ grid-column:1 / -1;
276
+ animation-delay:.2s;
277
+ }
278
+
279
+ .seed-header{
280
+ display:flex;align-items:center;gap:10px;
281
+ margin-bottom:4px;
282
+ }
283
+ .seed-logo{
284
+ width:28px;height:28px;
285
+ border-radius:6px;
286
+ object-fit:contain;
287
+ flex-shrink:0;
288
+ }
289
+ .seed-name{
290
+ font-size:22px;font-weight:700;color:var(--text-primary);
291
+ letter-spacing:-.04em;line-height:1.2;
292
+ }
293
+
294
+ .seed-chips{
295
+ display:flex;gap:6px;flex-wrap:wrap;
296
+ margin-top:6px;margin-bottom:10px;
297
+ }
298
+ .seed-chip{
299
+ font-size:11px;font-weight:500;
300
+ padding:3px 9px;border-radius:999px;
301
+ background:var(--chip-bg);
302
+ border:1px solid var(--chip-border);
303
+ color:var(--chip-text);
304
+ letter-spacing:.01em;
305
+ line-height:1.3;
306
+ display:inline-flex;align-items:center;gap:4px;
307
+ }
308
+ .seed-chip-icon{
309
+ width:13px;height:13px;opacity:.8;flex-shrink:0;
310
+ }
311
+
312
+ .seed-description{
313
+ font-size:14px;color:var(--text-on-surface);
314
+ line-height:1.5;margin-bottom:4px;font-style:italic;
315
+ }
316
+ .seed-identity{
317
+ font-size:13px;color:var(--text-muted);
318
+ line-height:1.4;margin-bottom:6px;
319
+ letter-spacing:.005em;
320
+ }
321
+
322
+ .seed-stats{
323
+ font-size:11px;color:var(--text-faint);
324
+ display:flex;align-items:center;gap:4px;
325
+ margin-bottom:14px;flex-wrap:wrap;
326
+ }
327
+ .seed-stats-detail{
328
+ opacity:.7;
329
+ }
330
+ .seed-stats-sep{
331
+ opacity:.3;
332
+ }
333
+
334
+ .seed-signals{
335
+ margin-top:0;padding-top:0;
336
+ }
337
+ .seed-signal-list{
338
+ display:flex;flex-direction:column;gap:3px;margin-top:4px;
339
+ }
340
+ .seed-signal{
341
+ font-size:11px;color:var(--text-muted);
342
+ display:flex;align-items:center;gap:6px;
343
+ line-height:1.4;
344
+ }
345
+ .seed-signal-icon{
346
+ flex-shrink:0;font-size:11px;opacity:.7;width:14px;text-align:center;
347
+ }
348
+ .seed-signal strong{
349
+ color:var(--text-primary);font-weight:600;
350
+ }
351
+ .seed-signal-strength{
352
+ opacity:.5;font-size:10px;font-weight:400;
353
+ }
354
+
355
+ .seed-section{
356
+ margin-top:0;
357
+ }
358
+ .seed-label{
359
+ display:block;
360
+ font-size:10px;font-weight:700;text-transform:uppercase;
361
+ color:var(--text-faint);
362
+ letter-spacing:.12em;
363
+ margin-bottom:6px;
364
+ }
365
+
366
+ .seed-flow{
367
+ display:flex;flex-direction:column;
368
+ gap:3px;
369
+ }
370
+ .seed-flow-row{
371
+ display:flex;align-items:center;gap:6px;
372
+ }
373
+ .seed-flow-step{
374
+ color:var(--text-muted);
375
+ font-family:"SF Mono","Fira Code","Cascadia Code",monospace;
376
+ font-size:12px;letter-spacing:.01em;
377
+ }
378
+ .seed-flow-end .seed-flow-step{
379
+ color:var(--text-primary);font-weight:600;font-size:12.5px;
380
+ }
381
+ .seed-flow-arrow{
382
+ color:#818cf8;
383
+ font-size:12px;font-weight:700;
384
+ display:inline-block;
385
+ animation:arrow-drift 3s ease-in-out infinite;
386
+ }
387
+ .seed-flow-row:nth-child(2) .seed-flow-arrow{animation-delay:0s}
388
+ .seed-flow-row:nth-child(3) .seed-flow-arrow{animation-delay:.6s}
389
+ .seed-flow-row:nth-child(4) .seed-flow-arrow{animation-delay:1.2s}
390
+ .seed-flow-row:nth-child(5) .seed-flow-arrow{animation-delay:1.8s}
391
+ @keyframes arrow-drift{
392
+ 0%,100%{color:#6366f1;opacity:.4;transform:translateX(0)}
393
+ 50%{color:#a5b4fc;opacity:1;transform:translateX(3px)}
394
+ }
395
+
396
+ .seed-entry{
397
+ display:flex;flex-direction:column;gap:4px;
398
+ }
399
+ .seed-entry-path{
400
+ display:inline-block;max-width:100%;
401
+ overflow:hidden;text-overflow:ellipsis;word-break:break-all;
402
+ background:var(--bg-inset);
403
+ padding:4px 10px;border-radius:6px;
404
+ font-size:12px;color:var(--text-on-surface);
405
+ font-family:"SF Mono","Fira Code","Cascadia Code",monospace;
406
+ letter-spacing:.01em;
407
+ border:1px solid var(--border-primary);
408
+ width:fit-content;
409
+ }
410
+ .seed-entry-hint{
411
+ font-size:11px;color:var(--text-faint);
412
+ letter-spacing:.01em;
413
+ }
414
+
415
+ .seed-warning-text{
416
+ margin:0;margin-top:8px;
417
+ font-size:11.5px;color:rgba(234,179,8,.7);
418
+ line-height:1.4;letter-spacing:.005em;
419
+ }
420
+
421
+ .seed-sparse{
422
+ font-size:11px;color:var(--text-faint);
423
+ }
424
+
425
+ .qa-banner{
426
+ margin:10px 0 6px;padding:8px 12px;border-radius:8px;font-size:12px;
427
+ animation:fadeIn .3s ease;
428
+ }
429
+ .qa-moderate{background:var(--qa-moderate-bg);border:1px solid var(--qa-moderate-border);color:var(--qa-moderate-text)}
430
+ .qa-low{background:var(--qa-low-bg);border:1px solid var(--qa-low-border);color:var(--qa-low-text)}
431
+ .qa-banner-row{display:flex;align-items:center;gap:8px;flex-wrap:wrap}
432
+ .qa-icon{font-size:14px}
433
+ .qa-label{font-weight:600;font-size:12px}
434
+ .qa-metric{font-size:11px;opacity:.7;margin-left:auto}
435
+ .qa-toggle{
436
+ background:none;border:none;color:inherit;font-size:11px;cursor:pointer;
437
+ text-decoration:underline;opacity:.7;padding:0;
438
+ }
439
+ .qa-toggle:hover{opacity:1}
440
+ .qa-concerns{margin-top:8px;padding-top:6px;border-top:1px solid var(--border-primary)}
441
+ .qa-concern{display:flex;gap:6px;font-size:11px;line-height:1.5;margin-bottom:2px;opacity:.85}
442
+ .qa-concern-dot{color:inherit;opacity:.4;flex-shrink:0}
443
+ .qa-suggestion{
444
+ margin-top:6px;font-size:11px;font-style:italic;opacity:.7;
445
+ padding:6px 8px;background:var(--bg-inset);border-radius:4px;
446
+ }
447
+ .seed-zones{
448
+ display:flex;flex-wrap:wrap;gap:6px;
449
+ }
450
+ .seed-zone{
451
+ display:flex;align-items:center;gap:5px;
452
+ padding:4px 10px;border-radius:6px;
453
+ background:var(--bg-inset);
454
+ border:1px solid var(--border-primary);
455
+ }
456
+ .seed-zone-name{
457
+ font-size:11px;color:var(--text-muted);
458
+ font-weight:500;letter-spacing:.01em;
459
+ }
460
+ .seed-zone-count{
461
+ font-size:10px;color:var(--text-faint);
462
+ font-weight:600;
463
+ min-width:14px;text-align:center;
464
+ background:var(--bg-inset);
465
+ padding:1px 5px;border-radius:4px;
466
+ }
467
+
468
+ /* ═══ Structure View ═══ */
469
+
470
+ /* -- canvas entrance zoom -- */
471
+ .str-canvas{
472
+ position:absolute;inset:0;z-index:14;
473
+ overflow:hidden;
474
+ opacity:0;transform:scale(.94);
475
+ transition:opacity .4s ease,transform .55s cubic-bezier(.22,1,.36,1);
476
+ }
477
+ .str-canvas.str-canvas-in{
478
+ opacity:1;transform:scale(1);
479
+ }
480
+
481
+ /* -- top bar: back + breadcrumb -- */
482
+ .str-top{
483
+ position:absolute;top:16px;left:20px;z-index:20;
484
+ display:flex;align-items:center;gap:14px;
485
+ }
486
+ .str-back{
487
+ display:inline-flex;align-items:center;gap:4px;
488
+ padding:6px 14px;border-radius:8px;
489
+ background:var(--bg-topbar);
490
+ backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
491
+ border:1px solid var(--border-secondary);
492
+ color:var(--text-secondary);font-size:12px;font-weight:600;
493
+ cursor:pointer;font-family:inherit;
494
+ transition:all .15s;
495
+ box-shadow:0 1px 4px rgba(0,0,0,.06);
496
+ }
497
+ .str-back:hover{
498
+ background:var(--bg-surface);color:var(--text-primary);
499
+ box-shadow:0 2px 8px rgba(0,0,0,.1);
500
+ }
501
+ .str-breadcrumb{
502
+ display:flex;align-items:center;gap:6px;
503
+ background:var(--bg-topbar);
504
+ backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
505
+ padding:5px 12px;border-radius:8px;
506
+ border:1px solid var(--border-primary);
507
+ box-shadow:0 1px 3px rgba(0,0,0,.04);
508
+ }
509
+ .str-bc-item{
510
+ font-size:12px;font-weight:500;color:var(--text-muted);
511
+ cursor:pointer;transition:color .15s;
512
+ }
513
+ .str-bc-item:hover{color:var(--text-primary)}
514
+ .str-bc-active{
515
+ color:var(--text-primary);font-weight:600;cursor:default;
516
+ }
517
+ .str-bc-active:hover{color:var(--text-primary)}
518
+ .str-bc-sep{
519
+ color:var(--text-faint);font-size:11px;
520
+ }
521
+ .str-bc-level{
522
+ font-size:10px;font-weight:600;color:var(--text-faint);
523
+ text-transform:uppercase;letter-spacing:.06em;
524
+ }
525
+
526
+ /* -- SVG edges -- */
527
+ .str-svg{
528
+ position:absolute;top:0;left:0;
529
+ pointer-events:none;z-index:1;
530
+ }
531
+ .str-edge{
532
+ stroke:var(--border-secondary);
533
+ stroke-width:1.5;
534
+ stroke-dasharray:6 4;
535
+ opacity:0;
536
+ animation:str-edge-in .5s ease forwards;
537
+ transition:stroke .2s,stroke-width .2s,stroke-dasharray .2s;
538
+ }
539
+ .str-edge-hot{
540
+ stroke:rgba(99,102,241,.35);
541
+ stroke-width:2;
542
+ stroke-dasharray:none;
543
+ }
544
+ @keyframes str-edge-in{
545
+ from{opacity:0;stroke-dashoffset:40}
546
+ to{opacity:1;stroke-dashoffset:0}
547
+ }
548
+
549
+ /* -- center node (the "brain") -- */
550
+ .str-center-node{
551
+ position:absolute;z-index:10;
552
+ transform:translate(-50%,-50%);
553
+ background:var(--bg-elevated);
554
+ border-radius:14px;
555
+ padding:20px 24px;
556
+ min-width:190px;max-width:300px;
557
+ text-align:center;
558
+ box-shadow:0 0 0 1px var(--border-primary),var(--shadow-heavy),0 0 60px rgba(99,102,241,.12);
559
+ color:var(--text-on-surface);
560
+ opacity:0;transform:translate(-50%,-50%) scale(.85);
561
+ transition:opacity .4s ease, transform .4s ease;
562
+ }
563
+ .str-center-node.str-node-in{
564
+ opacity:1;transform:translate(-50%,-50%) scale(1);
565
+ animation:str-breathe 4.5s ease-in-out .6s infinite;
566
+ }
567
+ @keyframes str-breathe{
568
+ 0%,100%{box-shadow:0 0 0 1px var(--border-primary),0 8px 32px rgba(0,0,0,.2),0 0 60px rgba(99,102,241,.12)}
569
+ 50%{box-shadow:0 0 0 1px var(--border-secondary),0 10px 40px rgba(0,0,0,.25),0 0 90px rgba(99,102,241,.22)}
570
+ }
571
+ .str-center-logo{
572
+ width:24px;height:24px;
573
+ border-radius:5px;object-fit:contain;
574
+ margin:0 auto 6px;display:block;
575
+ }
576
+ .str-center-name{
577
+ display:block;
578
+ font-size:16px;font-weight:700;color:var(--text-primary);
579
+ letter-spacing:-.03em;line-height:1.2;
580
+ }
581
+ .str-center-chip{
582
+ display:inline-block;
583
+ margin-top:6px;
584
+ font-size:10px;font-weight:500;
585
+ padding:2px 8px;border-radius:999px;
586
+ background:var(--chip-bg);
587
+ color:var(--chip-text);
588
+ text-transform:capitalize;
589
+ letter-spacing:.02em;
590
+ }
591
+ .str-center-sub{
592
+ display:block;margin-top:6px;
593
+ font-size:11px;color:var(--text-secondary);
594
+ line-height:1.4;
595
+ }
596
+
597
+ /* -- ring nodes -- */
598
+ .str-ring-node{
599
+ position:absolute;z-index:10;
600
+ transform:translate(-50%,-50%);
601
+ background:var(--bg-surface);
602
+ border:1.5px solid var(--border-strong);
603
+ border-radius:10px;
604
+ padding:12px 16px;
605
+ min-width:130px;max-width:210px;
606
+ text-align:center;
607
+ box-shadow:var(--shadow-card);
608
+ transition:border-color .2s,box-shadow .25s,transform .2s;
609
+ opacity:0;transform:translate(-50%,-50%) scale(.8);
610
+ }
611
+ .str-ring-node.str-node-in{
612
+ animation:str-ring-in .4s ease forwards;
613
+ }
614
+ @keyframes str-ring-in{
615
+ from{opacity:0;transform:translate(-50%,-50%) scale(.8)}
616
+ to{opacity:1;transform:translate(-50%,-50%) scale(1)}
617
+ }
618
+
619
+ /* size variation */
620
+ .str-ring-md{
621
+ padding:14px 18px;min-width:140px;max-width:220px;
622
+ }
623
+ .str-ring-lg{
624
+ padding:16px 20px;min-width:150px;max-width:230px;
625
+ }
626
+ .str-ring-lg .str-ring-name{font-size:13px}
627
+
628
+ /* hover affordance */
629
+ .str-clickable{cursor:pointer}
630
+ .str-clickable:hover{
631
+ border-color:#6366f1;
632
+ box-shadow:0 6px 20px rgba(99,102,241,.14),0 2px 8px rgba(0,0,0,.06);
633
+ transform:translate(-50%,-50%) scale(1.05);
634
+ }
635
+ .str-selectable{cursor:pointer}
636
+ .str-selectable:hover{
637
+ border-color:var(--text-faint);
638
+ box-shadow:0 4px 14px rgba(0,0,0,.08);
639
+ transform:translate(-50%,-50%) scale(1.03);
640
+ }
641
+ .str-ring-selected{
642
+ border-color:#6366f1!important;
643
+ box-shadow:0 0 0 3px rgba(99,102,241,.15),0 4px 16px rgba(99,102,241,.1)!important;
644
+ transform:translate(-50%,-50%) scale(1.04)!important;
645
+ }
646
+
647
+ /* entry-point zone accent + pulse */
648
+ .str-ring-entry{
649
+ border-left:3px solid #22c55e;
650
+ }
651
+ .str-ring-entry.str-node-in{
652
+ animation:str-ring-in .4s ease forwards, str-entry-glow 3.5s ease-in-out 1.2s infinite;
653
+ }
654
+ @keyframes str-entry-glow{
655
+ 0%,100%{box-shadow:0 2px 8px rgba(0,0,0,.05)}
656
+ 50%{box-shadow:0 2px 8px rgba(0,0,0,.05),0 0 24px rgba(34,197,94,.12)}
657
+ }
658
+
659
+ /* system tier via opacity (implicit hierarchy) */
660
+ .str-tier-primary{opacity:1}
661
+ .str-tier-secondary{opacity:.78}
662
+ .str-tier-support{opacity:.55}
663
+
664
+ /* narrative strip */
665
+ .str-narrative{
666
+ position:absolute;top:16px;right:20px;z-index:20;
667
+ background:var(--bg-topbar);
668
+ backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
669
+ padding:6px 14px;border-radius:8px;
670
+ border:1px solid var(--border-primary);
671
+ box-shadow:0 1px 3px rgba(0,0,0,.04);
672
+ font-size:11px;color:var(--text-muted);
673
+ letter-spacing:.01em;
674
+ max-width:280px;
675
+ line-height:1.45;
676
+ }
677
+
678
+ /* edge hover tooltip */
679
+ .str-tooltip{
680
+ position:absolute;z-index:25;
681
+ transform:translate(-50%,-50%);
682
+ background:rgba(15,23,42,.88);
683
+ color:#e2e8f0;
684
+ padding:4px 10px;border-radius:6px;
685
+ font-size:10px;font-weight:500;
686
+ white-space:nowrap;
687
+ pointer-events:none;
688
+ box-shadow:0 2px 8px rgba(0,0,0,.15);
689
+ letter-spacing:.01em;
690
+ }
691
+
692
+ /* floating detail panel */
693
+ .str-detail{
694
+ position:absolute;z-index:30;
695
+ width:260px;
696
+ background:var(--bg-surface);
697
+ border:1px solid var(--border-strong);
698
+ border-radius:12px;
699
+ padding:14px 16px;
700
+ box-shadow:var(--shadow-heavy);
701
+ animation:str-detail-in .25s ease;
702
+ }
703
+ @keyframes str-detail-in{
704
+ from{opacity:0;transform:scale(.95)}
705
+ to{opacity:1;transform:scale(1)}
706
+ }
707
+ .str-detail-head{
708
+ display:flex;align-items:center;justify-content:space-between;
709
+ margin-bottom:6px;
710
+ }
711
+ .str-detail-name{
712
+ font-size:14px;font-weight:700;color:var(--text-primary);
713
+ letter-spacing:-.02em;
714
+ }
715
+ .str-detail-close{
716
+ background:none;border:none;color:var(--text-faint);
717
+ font-size:16px;cursor:pointer;padding:0 2px;
718
+ line-height:1;transition:color .15s;
719
+ }
720
+ .str-detail-close:hover{color:var(--text-primary)}
721
+ .str-detail-chips{
722
+ display:flex;gap:4px;margin-bottom:8px;
723
+ }
724
+ .str-detail-chip{
725
+ font-size:9px;font-weight:600;text-transform:uppercase;
726
+ letter-spacing:.04em;
727
+ padding:2px 7px;border-radius:4px;
728
+ background:var(--bg-inset);color:var(--text-muted);
729
+ }
730
+ .str-detail-desc{
731
+ font-size:11px;color:var(--text-secondary);line-height:1.5;
732
+ margin:0 0 8px;
733
+ }
734
+ .str-detail-why{
735
+ margin-bottom:8px;
736
+ }
737
+ .str-detail-why-label{
738
+ display:block;
739
+ font-size:9px;font-weight:700;text-transform:uppercase;
740
+ letter-spacing:.06em;color:#6366f1;
741
+ margin-bottom:2px;
742
+ }
743
+ .str-detail-why-text{
744
+ display:block;
745
+ font-size:10.5px;color:var(--text-secondary);line-height:1.4;
746
+ }
747
+ .str-detail-when{
748
+ margin-bottom:8px;
749
+ }
750
+ .str-detail-when-label{
751
+ display:block;
752
+ font-size:9px;font-weight:700;text-transform:uppercase;
753
+ letter-spacing:.06em;color:#059669;
754
+ margin-bottom:2px;
755
+ }
756
+ .str-detail-when-text{
757
+ display:block;
758
+ font-size:10.5px;color:var(--text-secondary);line-height:1.4;
759
+ font-style:italic;
760
+ }
761
+ .str-detail-flow{
762
+ margin-bottom:8px;
763
+ padding:6px 8px;
764
+ background:var(--bg-elevated);
765
+ border:1px solid var(--border-primary);
766
+ border-radius:6px;
767
+ }
768
+ .str-detail-flow-label{
769
+ display:block;
770
+ font-size:9px;font-weight:700;text-transform:uppercase;
771
+ letter-spacing:.06em;color:#7c3aed;
772
+ margin-bottom:3px;
773
+ }
774
+ .str-detail-flow-text{
775
+ display:block;
776
+ font-size:10px;color:var(--text-muted);line-height:1.4;
777
+ font-family:"SF Mono","Fira Code","Cascadia Code",monospace;
778
+ }
779
+ .str-detail-conns{
780
+ border-top:1px solid var(--border-primary);
781
+ padding-top:6px;
782
+ display:flex;flex-direction:column;gap:3px;
783
+ }
784
+ .str-detail-conn{
785
+ display:flex;align-items:center;gap:5px;
786
+ font-size:10px;
787
+ }
788
+ .str-conn-arrow{
789
+ color:var(--text-faint);font-weight:700;font-size:11px;
790
+ width:14px;text-align:center;flex-shrink:0;
791
+ }
792
+ .str-conn-name{
793
+ color:var(--text-primary);font-weight:500;
794
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
795
+ flex:1;
796
+ }
797
+ .str-conn-rel{
798
+ color:var(--text-faint);font-size:9px;
799
+ text-transform:uppercase;letter-spacing:.03em;
800
+ flex-shrink:0;
801
+ }
802
+
803
+ .str-ring-name{
804
+ display:block;
805
+ font-size:12px;font-weight:700;color:var(--text-primary);
806
+ letter-spacing:-.01em;line-height:1.2;
807
+ }
808
+ .str-ring-count{
809
+ display:inline-block;margin-top:4px;
810
+ font-size:10px;font-weight:600;
811
+ color:var(--text-muted);background:var(--bg-inset);
812
+ padding:1px 7px;border-radius:4px;
813
+ }
814
+ .str-ring-sub{
815
+ display:block;margin-top:5px;
816
+ font-size:10.5px;color:var(--text-muted);
817
+ line-height:1.35;
818
+ }
819
+ .str-ring-tech{
820
+ display:flex;flex-wrap:wrap;gap:3px;
821
+ margin-top:6px;justify-content:center;
822
+ }
823
+ .str-ring-tech-icon{
824
+ width:16px;height:16px;
825
+ object-fit:contain;
826
+ border-radius:3px;
827
+ opacity:.75;
828
+ transition:opacity .15s,transform .15s;
829
+ }
830
+ .str-ring-tech-icon:hover{
831
+ opacity:1;transform:scale(1.2);
832
+ }
833
+ .str-ring-tech-chip{
834
+ font-size:9px;font-weight:500;
835
+ padding:1px 6px;border-radius:4px;
836
+ background:var(--bg-inset);color:#6366f1;
837
+ letter-spacing:.01em;
838
+ white-space:nowrap;
839
+ }
840
+ .str-ring-explore{
841
+ display:block;margin-top:6px;
842
+ font-size:9px;font-weight:500;
843
+ color:#6366f1;
844
+ letter-spacing:.02em;
845
+ opacity:0;
846
+ transition:opacity .15s;
847
+ }
848
+ .str-clickable:hover .str-ring-explore{
849
+ opacity:1;
850
+ }
851
+ .str-more-hint{
852
+ position:absolute;z-index:20;
853
+ bottom:60px;left:50%;transform:translateX(-50%);
854
+ background:var(--bg-topbar);
855
+ backdrop-filter:blur(10px);-webkit-backdrop-filter:blur(10px);
856
+ padding:6px 16px;border-radius:8px;
857
+ border:1px solid var(--border-primary);
858
+ font-size:11px;font-weight:500;color:#6366f1;
859
+ box-shadow:0 1px 3px rgba(0,0,0,.04);
860
+ cursor:pointer;transition:all .15s;
861
+ opacity:0;animation:str-more-in .3s ease 1s forwards;
862
+ }
863
+ @keyframes str-more-in{from{opacity:0}to{opacity:1}}
864
+ .str-more-hint:hover{
865
+ background:var(--bg-surface);color:#4f46e5;
866
+ box-shadow:0 2px 8px rgba(99,102,241,.12);
867
+ }
868
+ /* modal for hidden systems */
869
+ .str-modal-overlay{
870
+ position:absolute;inset:0;z-index:40;
871
+ background:rgba(0,0,0,.25);
872
+ backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
873
+ display:flex;align-items:center;justify-content:center;
874
+ animation:str-detail-in .2s ease;
875
+ }
876
+ .str-modal{
877
+ background:var(--bg-surface);
878
+ border-radius:14px;
879
+ border:1px solid var(--border-secondary);
880
+ box-shadow:var(--shadow-heavy);
881
+ width:380px;max-height:70vh;
882
+ display:flex;flex-direction:column;
883
+ overflow:hidden;
884
+ }
885
+ .str-modal-head{
886
+ display:flex;align-items:center;justify-content:space-between;
887
+ padding:14px 18px 10px;
888
+ border-bottom:1px solid var(--border-primary);
889
+ }
890
+ .str-modal-bc{
891
+ display:flex;align-items:center;gap:10px;
892
+ }
893
+ .str-modal-bc-back{
894
+ font-size:11px;font-weight:600;color:#6366f1;
895
+ cursor:pointer;transition:color .15s;
896
+ }
897
+ .str-modal-bc-back:hover{color:#4f46e5}
898
+ .str-modal-title{
899
+ font-size:14px;font-weight:700;color:var(--text-primary);
900
+ letter-spacing:-.02em;
901
+ }
902
+ .str-modal-list{
903
+ overflow-y:auto;padding:8px 12px 14px;
904
+ display:flex;flex-direction:column;gap:8px;
905
+ }
906
+ .str-modal-item{
907
+ padding:10px 14px;
908
+ border:1px solid var(--border-strong);
909
+ border-radius:10px;
910
+ background:var(--bg-elevated);
911
+ transition:border-color .15s,box-shadow .15s;
912
+ }
913
+ .str-modal-clickable{cursor:pointer}
914
+ .str-modal-clickable:hover{
915
+ border-color:#6366f1;
916
+ box-shadow:0 2px 10px rgba(99,102,241,.1);
917
+ }
918
+ .str-modal-item-top{
919
+ display:flex;align-items:center;gap:8px;
920
+ flex-wrap:wrap;
921
+ }
922
+ .str-modal-explore{
923
+ display:block;margin-top:4px;
924
+ font-size:9px;font-weight:500;color:#6366f1;
925
+ letter-spacing:.02em;
926
+ }
927
+ .str-modal-name{
928
+ display:block;
929
+ font-size:13px;font-weight:700;color:var(--text-primary);
930
+ letter-spacing:-.01em;
931
+ }
932
+ .str-modal-count{
933
+ display:inline-block;margin-top:3px;
934
+ font-size:10px;font-weight:600;
935
+ color:var(--text-muted);background:var(--bg-inset);
936
+ padding:1px 7px;border-radius:4px;
937
+ }
938
+ .str-modal-sub{
939
+ display:block;margin-top:4px;
940
+ font-size:11px;color:var(--text-muted);line-height:1.4;
941
+ }
942
+ .str-modal-tech{
943
+ display:flex;flex-wrap:wrap;gap:3px;margin-top:6px;
944
+ }
945
+ .str-ring-start{
946
+ display:block;margin-top:5px;
947
+ font-size:9px;font-weight:600;
948
+ color:#22c55e;
949
+ letter-spacing:.04em;
950
+ opacity:0;
951
+ animation:str-start-in .4s ease 1.5s forwards;
952
+ }
953
+ @keyframes str-start-in{
954
+ from{opacity:0}to{opacity:.6}
955
+ }
956
+
957
+ .str-empty-state{
958
+ position:absolute;left:50%;top:55%;transform:translate(-50%,-50%);
959
+ display:flex;flex-direction:column;align-items:center;gap:6px;
960
+ text-align:center;max-width:300px;z-index:5;
961
+ }
962
+ .str-empty-title{font-size:14px;font-weight:600;color:var(--text-faint);}
963
+ .str-empty-sub{font-size:12px;color:var(--text-faint);line-height:1.5;}
964
+
965
+ /* ── Flow View (light theme) ── */
966
+ .fv-screen{
967
+ position:absolute;inset:0;z-index:14;
968
+ display:flex;flex-direction:column;
969
+ overflow:hidden;
970
+ }
971
+
972
+ /* Top bar */
973
+ .fv-topbar{
974
+ display:flex;align-items:center;gap:12px;
975
+ padding:14px 24px 10px;flex-shrink:0;
976
+ border-bottom:1px solid var(--border-primary);
977
+ padding-left:140px;
978
+ }
979
+ .fv-back,.iv-back{
980
+ background:none;border:1px solid var(--border-strong);border-radius:8px;
981
+ padding:5px 12px;font-size:12px;font-weight:500;color:var(--text-muted);
982
+ cursor:pointer;transition:all .15s;flex-shrink:0;
983
+ margin-right:4px;
984
+ }
985
+ .fv-back:hover,.iv-back:hover{background:var(--bg-elevated);color:var(--text-secondary);}
986
+
987
+ /* Flow list column */
988
+ .fv-flows-col{
989
+ width:180px;flex-shrink:0;
990
+ display:flex;flex-direction:column;gap:3px;
991
+ align-self:flex-start;
992
+ position:sticky;top:0;
993
+ }
994
+ .fv-flows-label{
995
+ font-size:11px;font-weight:700;color:var(--text-faint);
996
+ letter-spacing:.12em;text-transform:uppercase;
997
+ margin-bottom:6px;
998
+ }
999
+ .fv-flow-tab{
1000
+ display:flex;flex-direction:column;gap:3px;
1001
+ padding:8px 10px;border-radius:8px;
1002
+ border:1px solid transparent;
1003
+ background:transparent;cursor:pointer;
1004
+ transition:all .15s;
1005
+ font-family:inherit;
1006
+ text-align:left;width:100%;
1007
+ }
1008
+ .fv-flow-tab:hover{background:var(--hover-bg)}
1009
+ .fv-flow-tab-active{
1010
+ background:var(--bg-inset);border-color:rgba(99,102,241,.3);
1011
+ }
1012
+ .fv-flow-tab-row{display:flex;align-items:center;gap:6px}
1013
+ .fv-flow-tab-title{
1014
+ font-size:13px;font-weight:600;color:var(--text-primary);
1015
+ line-height:1.3;flex:1;
1016
+ }
1017
+ .fv-flow-tab-active .fv-flow-tab-title{color:#4f46e5}
1018
+ .fv-flow-tab-type{
1019
+ font-size:9px;font-weight:600;
1020
+ padding:2px 6px;border-radius:3px;
1021
+ background:var(--bg-inset);color:var(--text-faint);
1022
+ text-transform:uppercase;letter-spacing:.04em;
1023
+ flex-shrink:0;
1024
+ }
1025
+ .fv-flow-tab-active .fv-flow-tab-type{
1026
+ background:rgba(99,102,241,.1);color:#6366f1;
1027
+ }
1028
+ /* Flow origin tags — evidence vs inferred */
1029
+ .fv-flow-origin-tag{
1030
+ font-size:8px;font-weight:800;letter-spacing:.1em;
1031
+ padding:2px 5px;border-radius:3px;flex-shrink:0;
1032
+ text-transform:uppercase;
1033
+ }
1034
+ .fv-origin-evidence{
1035
+ background:rgba(16,185,129,.15);color:rgba(5,150,105,1);
1036
+ border:1px solid rgba(16,185,129,.3);
1037
+ }
1038
+ .fv-origin-inferred{
1039
+ background:rgba(148,163,184,.1);color:var(--text-faint);
1040
+ border:1px solid rgba(148,163,184,.2);
1041
+ position:relative;
1042
+ }
1043
+ /* Tooltip on INFERRED tag — shows structuralReason on hover, no click needed */
1044
+ .fv-origin-inferred[data-reason]{cursor:help}
1045
+ .fv-origin-inferred[data-reason]::before{
1046
+ content:"";
1047
+ position:absolute;
1048
+ top:calc(100% + 2px);left:4px;
1049
+ border:5px solid transparent;
1050
+ border-bottom-color:#1e293b;
1051
+ pointer-events:none;
1052
+ opacity:0;transition:opacity .12s;
1053
+ z-index:200;
1054
+ }
1055
+ .fv-origin-inferred[data-reason]::after{
1056
+ content:attr(data-reason);
1057
+ position:absolute;
1058
+ top:calc(100% + 12px);left:0;
1059
+ z-index:200;
1060
+ background:#1e293b;color:#94a3b8;
1061
+ font-size:10px;font-weight:400;letter-spacing:0;text-transform:none;
1062
+ font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
1063
+ line-height:1.6;
1064
+ padding:7px 10px;
1065
+ border-radius:6px;
1066
+ max-width:300px;
1067
+ min-width:160px;
1068
+ white-space:normal;
1069
+ word-break:break-word;
1070
+ box-shadow:0 4px 16px rgba(0,0,0,.35);
1071
+ pointer-events:none;
1072
+ opacity:0;transition:opacity .12s;
1073
+ }
1074
+ .fv-origin-inferred[data-reason]:hover::before,
1075
+ .fv-origin-inferred[data-reason]:hover::after{opacity:1}
1076
+ /* Evidence-tab left border */
1077
+ .fv-flow-tab-evidence{border-left:2px solid rgba(16,185,129,.4)}
1078
+ .fv-flow-tab-inferred{border-left:2px solid rgba(148,163,184,.2)}
1079
+
1080
+ /* Body: three-column layout */
1081
+ .fv-body{
1082
+ flex:1;
1083
+ display:flex;
1084
+ justify-content:center;
1085
+ gap:32px;
1086
+ padding:24px 28px 80px 140px;
1087
+ overflow-y:auto;
1088
+ }
1089
+ .fv-timeline-col{
1090
+ width:420px;flex-shrink:0;
1091
+ display:flex;flex-direction:column;
1092
+ }
1093
+ .fv-context-col{
1094
+ width:340px;flex-shrink:0;
1095
+ position:sticky;top:0;
1096
+ align-self:flex-start;
1097
+ }
1098
+
1099
+ /* Timeline steps */
1100
+ .fv-step{
1101
+ display:flex;align-items:flex-start;gap:14px;
1102
+ cursor:pointer;
1103
+ opacity:0;
1104
+ transition:transform .2s;
1105
+ }
1106
+ .fv-step-in{
1107
+ animation:fv-step-in .35s ease forwards;
1108
+ }
1109
+ @keyframes fv-step-in{
1110
+ from{opacity:0;transform:translateY(10px)}
1111
+ to{opacity:1;transform:translateY(0)}
1112
+ }
1113
+ .fv-step:hover{transform:scale(1.012)}
1114
+ .fv-step:hover .fv-dot{
1115
+ box-shadow:0 0 0 5px rgba(99,102,241,.12);
1116
+ }
1117
+
1118
+ /* Dot */
1119
+ .fv-dot{
1120
+ width:10px;height:10px;flex-shrink:0;
1121
+ border-radius:50%;
1122
+ background:var(--text-faint);
1123
+ margin-top:6px;
1124
+ transition:all .25s;
1125
+ position:relative;
1126
+ }
1127
+ .fv-dot-active{
1128
+ background:#6366f1;
1129
+ box-shadow:0 0 0 6px rgba(99,102,241,.1);
1130
+ }
1131
+ .fv-dot-past{background:#a5b4fc}
1132
+ .fv-dot-entry{
1133
+ background:#22c55e;
1134
+ width:12px;height:12px;
1135
+ margin-top:5px;
1136
+ box-shadow:0 0 0 5px rgba(34,197,94,.12);
1137
+ }
1138
+
1139
+ /* Step body */
1140
+ .fv-step-body{
1141
+ flex:1;
1142
+ background:var(--bg-surface);
1143
+ border:1px solid var(--border-strong);
1144
+ border-radius:12px;
1145
+ padding:14px 18px;
1146
+ transition:all .2s;
1147
+ box-shadow:0 1px 3px rgba(0,0,0,.03);
1148
+ }
1149
+ .fv-step:hover .fv-step-body{
1150
+ border-color:var(--text-faint);
1151
+ box-shadow:0 2px 8px rgba(0,0,0,.06);
1152
+ }
1153
+ .fv-step-active .fv-step-body{
1154
+ background:var(--bg-elevated);
1155
+ border-color:rgba(99,102,241,.3);
1156
+ border-left:2px solid #6366f1;
1157
+ box-shadow:0 2px 12px rgba(99,102,241,.08);
1158
+ transform:scale(1.012);
1159
+ }
1160
+ .fv-step-past .fv-step-body{
1161
+ opacity:.5;
1162
+ }
1163
+ .fv-step-title{
1164
+ display:block;
1165
+ font-size:14px;font-weight:600;
1166
+ color:var(--text-primary);
1167
+ letter-spacing:-.01em;
1168
+ }
1169
+ /* Evidence anchor on steps — file:line from real code */
1170
+ .fv-step-evidence-anchor{
1171
+ display:flex;align-items:center;gap:5px;
1172
+ margin-top:4px;margin-bottom:2px;
1173
+ }
1174
+ .fv-evidence-dot{
1175
+ font-size:9px;color:rgba(16,185,129,.9);flex-shrink:0;
1176
+ }
1177
+ .fv-evidence-loc{
1178
+ font-size:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
1179
+ color:rgba(5,150,105,1);
1180
+ background:rgba(16,185,129,.08);
1181
+ border:1px solid rgba(16,185,129,.2);
1182
+ padding:1px 5px;border-radius:3px;
1183
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;max-width:260px;
1184
+ }
1185
+ .fv-evidence-label{
1186
+ font-size:9px;font-weight:700;letter-spacing:.08em;text-transform:uppercase;
1187
+ color:rgba(16,185,129,.7);
1188
+ }
1189
+ .fv-step-desc{
1190
+ display:block;margin-top:4px;
1191
+ font-size:12px;line-height:1.45;
1192
+ color:var(--text-muted);
1193
+ }
1194
+ .fv-step-systems{
1195
+ display:flex;flex-wrap:wrap;gap:4px;
1196
+ margin-top:8px;
1197
+ }
1198
+ .fv-step-sys{
1199
+ display:inline-block;
1200
+ padding:2px 8px;border-radius:5px;
1201
+ font-size:10px;font-weight:600;
1202
+ background:var(--bg-inset);color:var(--text-secondary);
1203
+ border:1px solid var(--border-primary);
1204
+ letter-spacing:.01em;
1205
+ }
1206
+ .fv-step-files{
1207
+ display:flex;flex-direction:column;gap:2px;
1208
+ margin-top:6px;
1209
+ }
1210
+ .fv-step-file{
1211
+ font-size:11px;
1212
+ font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
1213
+ color:var(--text-faint);
1214
+ line-height:1.3;
1215
+ display:flex;align-items:center;gap:6px;
1216
+ }
1217
+ .fv-step-file .fv-file-path{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
1218
+ .fv-step-file .fv-file-path::before{content:"📄 ";font-size:10px}
1219
+
1220
+ /* Connector arrow */
1221
+ .fv-connector{
1222
+ display:flex;align-items:center;justify-content:center;
1223
+ height:36px;
1224
+ }
1225
+ .fv-connector-arrow{
1226
+ font-size:20px;font-weight:700;
1227
+ color:var(--text-faint);
1228
+ transition:color .3s;
1229
+ line-height:1;
1230
+ }
1231
+ .fv-connector-past .fv-connector-arrow{
1232
+ color:#818cf8;
1233
+ }
1234
+ /* Context panel */
1235
+ .fv-ctx{
1236
+ background:var(--bg-surface);
1237
+ border:1px solid var(--border-strong);
1238
+ border-radius:16px;
1239
+ padding:20px 22px;
1240
+ box-shadow:var(--shadow-card);
1241
+ opacity:0;
1242
+ animation:fv-ctx-enter .3s ease forwards;
1243
+ }
1244
+ @keyframes fv-ctx-enter{
1245
+ from{opacity:0;transform:translateX(8px)}
1246
+ to{opacity:1;transform:translateX(0)}
1247
+ }
1248
+ .fv-ctx-title{
1249
+ font-size:16px;font-weight:700;color:var(--text-primary);
1250
+ margin:0 0 10px;letter-spacing:-.02em;
1251
+ line-height:1.3;
1252
+ }
1253
+ /* Derivation source block — always shown first in context panel */
1254
+ .fv-ctx-derivation{
1255
+ display:flex;align-items:flex-start;gap:8px;
1256
+ padding:8px 10px;border-radius:8px;
1257
+ margin-bottom:12px;
1258
+ }
1259
+ .fv-ctx-derivation-evidence{
1260
+ background:rgba(16,185,129,.07);
1261
+ border:1px solid rgba(16,185,129,.25);
1262
+ }
1263
+ .fv-ctx-derivation-inferred{
1264
+ background:rgba(148,163,184,.07);
1265
+ border:1px solid rgba(148,163,184,.2);
1266
+ }
1267
+ .fv-ctx-deriv-icon{
1268
+ font-size:12px;flex-shrink:0;margin-top:1px;
1269
+ color:rgba(16,185,129,.9);
1270
+ }
1271
+ .fv-ctx-derivation-inferred .fv-ctx-deriv-icon{
1272
+ color:var(--text-faint);
1273
+ }
1274
+ .fv-ctx-deriv-body{
1275
+ display:flex;flex-direction:column;gap:3px;flex:1;min-width:0;
1276
+ }
1277
+ .fv-ctx-deriv-label{
1278
+ font-size:10px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;
1279
+ color:rgba(5,150,105,1);
1280
+ }
1281
+ .fv-ctx-derivation-inferred .fv-ctx-deriv-label{
1282
+ color:var(--text-faint);
1283
+ }
1284
+ .fv-ctx-deriv-loc{
1285
+ font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
1286
+ color:rgba(5,150,105,1);
1287
+ overflow:hidden;text-overflow:ellipsis;white-space:nowrap;
1288
+ cursor:pointer;
1289
+ }
1290
+ .fv-ctx-deriv-loc:hover{text-decoration:underline}
1291
+ .fv-ctx-deriv-handler{
1292
+ font-size:11px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
1293
+ color:var(--text-muted);
1294
+ }
1295
+ .fv-ctx-deriv-reason{
1296
+ font-size:10px;font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
1297
+ color:var(--text-faint);
1298
+ line-height:1.5;
1299
+ word-break:break-word;
1300
+ }
1301
+ .fv-ctx-label{
1302
+ font-size:10px;font-weight:700;
1303
+ letter-spacing:.12em;text-transform:uppercase;
1304
+ color:var(--text-faint);
1305
+ margin-top:16px;margin-bottom:6px;
1306
+ }
1307
+ .fv-ctx-text{
1308
+ margin:0;font-size:13px;line-height:1.5;
1309
+ color:var(--text-secondary);
1310
+ }
1311
+ .fv-ctx-chips{
1312
+ display:flex;flex-wrap:wrap;gap:5px;
1313
+ }
1314
+ .fv-ctx-chip{
1315
+ display:inline-block;
1316
+ padding:3px 10px;border-radius:6px;
1317
+ font-size:11px;font-weight:600;
1318
+ background:var(--bg-inset);
1319
+ color:var(--text-secondary);
1320
+ }
1321
+ .fv-ctx-files{
1322
+ display:flex;flex-direction:column;gap:3px;
1323
+ }
1324
+ .fv-ctx-file{
1325
+ font-size:12px;
1326
+ font-family:ui-monospace,SFMono-Regular,Menlo,monospace;
1327
+ color:var(--text-secondary);line-height:1.4;
1328
+ background:var(--bg-elevated);
1329
+ border:1px solid var(--border-strong);
1330
+ border-radius:6px;
1331
+ cursor:pointer;
1332
+ transition:all .15s;
1333
+ text-decoration:none;display:block;
1334
+ padding:4px 10px;
1335
+ }
1336
+ .fv-ctx-file{
1337
+ display:flex;align-items:center;gap:8px;
1338
+ }
1339
+ .fv-ctx-file .fv-file-path{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
1340
+ .fv-ctx-file:hover{
1341
+ border-color:rgba(99,102,241,.35);color:#6366f1;
1342
+ background:var(--bg-inset);
1343
+ }
1344
+
1345
+ /* Copy button (shared) */
1346
+ .fv-file-copy{
1347
+ flex-shrink:0;
1348
+ font-size:11px;font-weight:600;
1349
+ color:var(--text-faint);cursor:pointer;
1350
+ padding:1px 6px;border-radius:4px;
1351
+ transition:all .15s;
1352
+ font-family:inherit;
1353
+ white-space:nowrap;
1354
+ }
1355
+ .fv-file-copy:hover{color:#6366f1;background:rgba(99,102,241,.08)}
1356
+
1357
+ /* Empty state */
1358
+ .fv-empty{
1359
+ flex:1;display:flex;flex-direction:column;
1360
+ align-items:center;justify-content:center;gap:10px;
1361
+ }
1362
+ .fv-empty-title{
1363
+ font-size:16px;font-weight:700;color:var(--text-faint);
1364
+ }
1365
+ .fv-empty-sub{
1366
+ font-size:12px;color:var(--text-faint);max-width:280px;text-align:center;
1367
+ }
1368
+
1369
+ /* ── Flow + Impact fusion ── */
1370
+ .fv-summary-item{
1371
+ font-size:10px;font-weight:600;
1372
+ color:var(--text-faint);letter-spacing:.02em;
1373
+ }
1374
+ .fv-summary-hot{color:#f59e0b}
1375
+ .fv-critical-toggle{
1376
+ font-size:9px;font-weight:700;
1377
+ letter-spacing:.06em;text-transform:uppercase;
1378
+ color:var(--text-faint);cursor:pointer;
1379
+ background:none;border:1px solid var(--border-strong);
1380
+ border-radius:5px;padding:3px 8px;
1381
+ transition:all .15s;margin-top:2px;
1382
+ }
1383
+ .fv-critical-toggle:hover{border-color:rgba(99,102,241,.35);color:#6366f1}
1384
+ .fv-critical-on{border-color:#f59e0b;color:#f59e0b;background:rgba(245,158,11,.06)}
1385
+
1386
+ .fv-step-header-row{
1387
+ display:flex;align-items:center;gap:8px;
1388
+ }
1389
+ .fv-step-header-row .fv-step-title{flex:1}
1390
+
1391
+ .fv-impact-badge{
1392
+ flex-shrink:0;
1393
+ font-size:9px;font-weight:700;
1394
+ letter-spacing:.08em;text-transform:uppercase;
1395
+ padding:2px 8px;border-radius:4px;
1396
+ white-space:nowrap;
1397
+ }
1398
+ .fv-impact-high{
1399
+ background:rgba(245,158,11,.08);color:#b45309;
1400
+ border:1px solid rgba(245,158,11,.18);
1401
+ }
1402
+ .fv-impact-medium{
1403
+ background:rgba(245,158,11,.08);color:#d97706;
1404
+ border:1px solid rgba(245,158,11,.18);
1405
+ }
1406
+ .fv-impact-low{
1407
+ background:rgba(148,163,184,.08);color:var(--text-faint);
1408
+ border:1px solid rgba(148,163,184,.15);
1409
+ }
1410
+ .fv-impact-unknown{
1411
+ background:rgba(148,163,184,.05);color:var(--text-faint);
1412
+ border:1px solid rgba(148,163,184,.1);
1413
+ }
1414
+
1415
+ /* Impact whisper inside step card */
1416
+ .fv-step-whisper{
1417
+ display:block;
1418
+ font-size:11px;font-weight:500;
1419
+ margin-top:4px;
1420
+ line-height:1.3;
1421
+ }
1422
+ .fv-step-whisper-high{color:#b45309}
1423
+ .fv-step-whisper-medium{color:#d97706}
1424
+ .fv-step-whisper-low{color:var(--text-faint)}
1425
+ .fv-step-whisper-unknown{color:var(--text-faint)}
1426
+
1427
+ /* Critical path emphasis — subtle, not alarming */
1428
+ .fv-dot-critical{
1429
+ background:#f59e0b!important;
1430
+ width:11px;height:11px;
1431
+ margin-top:5px;
1432
+ box-shadow:0 0 0 4px rgba(245,158,11,.1);
1433
+ }
1434
+ .fv-dot-critical.fv-dot-active{
1435
+ box-shadow:0 0 0 6px rgba(245,158,11,.12);
1436
+ }
1437
+
1438
+ .fv-step-dimmed{
1439
+ opacity:.3;pointer-events:auto;
1440
+ transition:opacity .3s;
1441
+ }
1442
+ .fv-step-dimmed:hover{opacity:.65}
1443
+
1444
+ /* Visual accent linking — left border on context panel */
1445
+ .fv-ctx-accent-high{border-left:3px solid #f59e0b!important}
1446
+ .fv-ctx-accent-medium{border-left:3px solid var(--border-strong)!important}
1447
+ .fv-ctx-accent-low{border-left:3px solid var(--border-strong)!important}
1448
+ .fv-ctx-accent-unknown{border-left:3px solid var(--border-strong)!important}
1449
+
1450
+ /* Context panel hero block */
1451
+ .fv-ctx-hero{
1452
+ display:flex;align-items:center;gap:8px;
1453
+ margin-bottom:6px;
1454
+ }
1455
+ .fv-ctx-semantic{
1456
+ font-size:11px;font-weight:600;
1457
+ color:var(--text-muted);letter-spacing:.02em;
1458
+ }
1459
+ .fv-ctx-importance{
1460
+ font-size:13px;line-height:1.5;
1461
+ color:var(--text-secondary);font-weight:500;
1462
+ margin:0 0 8px;
1463
+ }
1464
+ .fv-ctx-reach{
1465
+ font-size:12px;font-weight:600;
1466
+ padding:6px 10px;border-radius:6px;
1467
+ margin-bottom:10px;
1468
+ }
1469
+ .fv-ctx-accent-high .fv-ctx-reach{
1470
+ background:rgba(245,158,11,.06);color:#92400e;
1471
+ }
1472
+ .fv-ctx-accent-medium .fv-ctx-reach{
1473
+ background:var(--bg-elevated);color:var(--text-muted);
1474
+ }
1475
+ .fv-ctx-accent-low .fv-ctx-reach,
1476
+ .fv-ctx-accent-unknown .fv-ctx-reach{
1477
+ background:var(--bg-elevated);color:var(--text-muted);
1478
+ }
1479
+
1480
+ /* Impact list */
1481
+ .fv-ctx-impact-list{
1482
+ margin:0;padding-left:16px;
1483
+ font-size:12px;line-height:1.6;color:var(--text-secondary);
1484
+ }
1485
+ .fv-ctx-impact-list li{margin-bottom:2px}
1486
+
1487
+ .fv-ctx-impact-systems{
1488
+ display:flex;flex-wrap:wrap;gap:5px;
1489
+ }
1490
+ .fv-ctx-impact-sys{
1491
+ display:inline-block;
1492
+ padding:2px 8px;border-radius:5px;
1493
+ font-size:10px;font-weight:600;
1494
+ }
1495
+ .fv-ctx-impact-sys-high{
1496
+ background:rgba(239,68,68,.08);color:#ef4444;
1497
+ border:1px solid rgba(239,68,68,.15);
1498
+ }
1499
+ .fv-ctx-impact-sys-medium{
1500
+ background:rgba(245,158,11,.06);color:#d97706;
1501
+ border:1px solid rgba(245,158,11,.12);
1502
+ }
1503
+ .fv-ctx-impact-sys-low{
1504
+ background:var(--bg-elevated);color:var(--text-faint);
1505
+ border:1px solid var(--border-strong);
1506
+ }
1507
+ .fv-ctx-text-muted{color:var(--text-faint);font-style:italic;font-size:12px}
1508
+
1509
+ /* ── Impact View ── */
1510
+ .iv-screen{
1511
+ position:absolute;inset:0;z-index:14;
1512
+ display:flex;flex-direction:column;
1513
+ overflow:hidden;
1514
+ }
1515
+
1516
+ .iv-card-in{animation:iv-fade-in .3s ease forwards;}
1517
+ @keyframes iv-fade-in{to{opacity:1;transform:translateY(0);}}
1518
+
1519
+ .iv-cat-tag{
1520
+ font-size:9px;font-weight:600;letter-spacing:.3px;
1521
+ padding:2px 8px;border-radius:4px;white-space:nowrap;
1522
+ }
1523
+ .iv-cat-tag.iv-cat-runtime{color:#818cf8;background:rgba(99,102,241,.1);}
1524
+ .iv-cat-tag.iv-cat-build{color:#fbbf24;background:rgba(251,191,36,.1);}
1525
+ .iv-cat-tag.iv-cat-api{color:#34d399;background:rgba(52,211,153,.1);}
1526
+ .iv-cat-tag.iv-cat-integration{color:#a78bfa;background:rgba(167,139,250,.1);}
1527
+ .iv-cat-tag.iv-cat-tooling{color:var(--text-muted);background:var(--bg-inset);}
1528
+
1529
+ /* Body: 3-column layout */
1530
+ .iv-body{
1531
+ display:flex;flex:1;min-height:0;
1532
+ padding-left:140px;
1533
+ justify-content:center;
1534
+ }
1535
+
1536
+ /* Left column: systems list */
1537
+ .iv-systems-col{
1538
+ width:200px;flex-shrink:0;
1539
+ display:flex;flex-direction:column;gap:4px;
1540
+ padding:24px 16px;
1541
+ margin-left:32px;
1542
+ overflow-y:auto;
1543
+ background:var(--bg-surface);
1544
+ border-radius:14px;
1545
+ border:1px solid var(--border-strong);
1546
+ box-shadow:var(--shadow-card);
1547
+ align-self:center;
1548
+ }
1549
+ .iv-back{
1550
+ background:none;border:1px solid var(--border-strong);border-radius:8px;
1551
+ padding:6px 14px;font-size:12px;font-weight:500;color:var(--text-muted);
1552
+ cursor:pointer;transition:all .15s;text-align:left;margin-bottom:12px;
1553
+ }
1554
+ .iv-back:hover{background:var(--bg-elevated);color:var(--text-secondary);}
1555
+ .iv-systems-label{
1556
+ font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.6px;
1557
+ color:var(--text-faint);margin-bottom:8px;padding-left:2px;
1558
+ }
1559
+ .iv-sys-tab{
1560
+ display:flex;align-items:center;justify-content:space-between;
1561
+ gap:6px;padding:8px 10px;border-radius:8px;
1562
+ background:none;border:1px solid transparent;
1563
+ cursor:pointer;transition:all .15s;text-align:left;
1564
+ width:100%;
1565
+ }
1566
+ .iv-sys-tab:hover{background:var(--hover-bg);border-color:var(--border-strong);}
1567
+ .iv-sys-tab-active{
1568
+ background:var(--bg-inset);border-color:rgba(99,102,241,.3);
1569
+ }
1570
+ .iv-sys-tab-name{
1571
+ font-size:14px;font-weight:500;color:var(--text-secondary);
1572
+ white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
1573
+ }
1574
+ .iv-sys-tab-active .iv-sys-tab-name{font-weight:700;color:#4f46e5;}
1575
+ .iv-sys-tab-level{
1576
+ font-size:9px;font-weight:700;letter-spacing:.4px;
1577
+ padding:2px 6px;border-radius:3px;flex-shrink:0;
1578
+ }
1579
+ .iv-sys-tab-high{color:#f87171;background:rgba(239,68,68,.1);}
1580
+ .iv-sys-tab-med{color:#fbbf24;background:rgba(251,191,36,.1);}
1581
+ .iv-sys-tab-low{color:#4ade80;background:rgba(74,222,128,.1);}
1582
+
1583
+ /* Impact graph (center column) */
1584
+ .iv-graph-col{
1585
+ flex:1;display:flex;align-items:center;justify-content:center;
1586
+ min-width:0;padding:24px 16px;
1587
+ }
1588
+ .iv-graph{
1589
+ position:relative;width:100%;max-width:640px;min-height:280px;
1590
+ display:flex;align-items:center;gap:0;
1591
+ opacity:0;
1592
+ }
1593
+ .iv-graph-in{animation:iv-fade-in .4s .1s ease forwards;}
1594
+ .iv-edges{
1595
+ position:absolute;inset:0;width:100%;height:100%;pointer-events:none;z-index:0;
1596
+ overflow:visible;
1597
+ }
1598
+ .iv-edge{
1599
+ stroke:var(--text-faint);stroke-width:1.5;stroke-dasharray:6 4;
1600
+ transition:stroke .2s, stroke-width .2s;
1601
+ }
1602
+ .iv-edge-ind{stroke-dasharray:4 6;}
1603
+ .iv-edge-hl{stroke:#6366f1;stroke-width:2.5;stroke-dasharray:none;}
1604
+
1605
+ .iv-tier{
1606
+ display:flex;flex-direction:column;align-items:center;justify-content:center;
1607
+ gap:16px;z-index:1;position:relative;
1608
+ }
1609
+ .iv-tier-source{
1610
+ width:80px;flex-shrink:0;padding:0 10px;
1611
+ }
1612
+ .iv-source-dot{
1613
+ width:16px;height:16px;border-radius:50%;background:#4f46e5;
1614
+ box-shadow:0 0 0 5px rgba(79,70,229,.15);margin-bottom:8px;
1615
+ }
1616
+ .iv-source-label{
1617
+ font-size:11px;font-weight:600;color:var(--text-secondary);text-align:center;
1618
+ max-width:80px;word-break:break-word;line-height:1.3;
1619
+ }
1620
+ .iv-tier-1{flex:1;padding:10px 0;}
1621
+ .iv-tier-2{flex:1;padding:10px 0;}
1622
+
1623
+ .iv-node{
1624
+ background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:10px;
1625
+ padding:10px 14px;display:flex;align-items:center;gap:8px;
1626
+ cursor:pointer;transition:all .18s;
1627
+ opacity:0;transform:translateX(-8px);
1628
+ min-width:130px;max-width:210px;
1629
+ box-shadow:var(--shadow-card);
1630
+ }
1631
+ .iv-node-in{animation:iv-node-enter .3s ease forwards;}
1632
+ @keyframes iv-node-enter{to{opacity:1;transform:translateX(0);}}
1633
+ .iv-node:hover{transform:scale(1.04);box-shadow:0 2px 12px rgba(0,0,0,.08);}
1634
+ .iv-node-selected{border-color:#6366f1;box-shadow:0 0 0 2px rgba(99,102,241,.2);}
1635
+ .iv-node-high{opacity:1;}
1636
+ .iv-node-medium{opacity:.8;}
1637
+ .iv-node-low{opacity:.55;}
1638
+ .iv-node-name{
1639
+ font-size:12px;font-weight:600;color:var(--text-secondary);
1640
+ white-space:nowrap;overflow:hidden;text-overflow:ellipsis;flex:1;
1641
+ }
1642
+ .iv-node-risk{
1643
+ font-size:9px;font-weight:700;letter-spacing:.5px;
1644
+ padding:2px 6px;border-radius:4px;flex-shrink:0;
1645
+ }
1646
+ .iv-risk-high{background:rgba(239,68,68,.1);color:#f87171;}
1647
+ .iv-risk-medium{background:rgba(251,191,36,.1);color:#fbbf24;}
1648
+ .iv-risk-low{background:rgba(74,222,128,.1);color:#4ade80;}
1649
+
1650
+ .iv-graph-empty-wrap{
1651
+ display:flex;flex-direction:column;align-items:center;justify-content:center;
1652
+ flex:1;padding:60px 20px;
1653
+ }
1654
+ .iv-graph-empty-title{
1655
+ font-size:14px;font-weight:600;color:var(--text-muted);margin-bottom:6px;
1656
+ }
1657
+ .iv-graph-empty{
1658
+ font-size:12px;color:var(--text-faint);text-align:center;max-width:260px;line-height:1.5;
1659
+ }
1660
+
1661
+ /* Detail panel (right column) */
1662
+ .iv-detail-col{
1663
+ width:320px;flex-shrink:0;
1664
+ padding:24px 16px 24px 0;
1665
+ overflow-y:auto;
1666
+ align-self:center;
1667
+ }
1668
+ .iv-detail{
1669
+ background:var(--bg-surface);border:1px solid var(--border-strong);border-radius:14px;
1670
+ padding:22px;box-shadow:var(--shadow-card);
1671
+ animation:iv-fade-in .3s ease forwards;
1672
+ }
1673
+ .iv-detail-default{color:var(--text-secondary);}
1674
+ .iv-detail-title{
1675
+ font-size:16px;font-weight:700;color:var(--text-primary);margin:0 0 4px;
1676
+ }
1677
+ .iv-detail-sys-type{
1678
+ font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;
1679
+ color:var(--text-faint);display:block;margin-bottom:8px;
1680
+ }
1681
+ .iv-detail-desc{
1682
+ font-size:13px;color:var(--text-muted);line-height:1.5;margin:0 0 12px;
1683
+ }
1684
+ .iv-detail-meta-row{
1685
+ display:flex;align-items:center;gap:8px;margin-bottom:8px;flex-wrap:wrap;
1686
+ }
1687
+ .iv-detail-impact-level{
1688
+ font-size:10px;font-weight:700;letter-spacing:.5px;
1689
+ }
1690
+ .iv-detail-impact-level.iv-blast-high{color:#dc2626;}
1691
+ .iv-detail-impact-level.iv-blast-med{color:#d97706;}
1692
+ .iv-detail-impact-level.iv-blast-low{color:#16a34a;}
1693
+ .iv-detail-meta-count{
1694
+ font-size:11px;color:var(--text-muted);
1695
+ }
1696
+ .iv-detail-cats{
1697
+ display:flex;gap:5px;flex-wrap:wrap;margin-bottom:10px;
1698
+ }
1699
+ .iv-detail-hint{
1700
+ font-size:11px;color:var(--text-faint);font-style:italic;
1701
+ }
1702
+ .iv-detail-label{
1703
+ font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.5px;
1704
+ color:var(--text-faint);margin:12px 0 4px;
1705
+ }
1706
+ .iv-detail-label:first-of-type{margin-top:0;}
1707
+ .iv-detail-text{
1708
+ font-size:13px;color:var(--text-secondary);line-height:1.55;margin:0 0 4px;
1709
+ }
1710
+ .iv-detail-type-chip{
1711
+ display:inline-block;font-size:11px;font-weight:500;
1712
+ padding:3px 10px;border-radius:6px;
1713
+ background:var(--bg-elevated);color:var(--text-faint);border:1px solid var(--border-primary);
1714
+ }
1715
+ .iv-detail-type-chip.iv-cat-runtime{color:#818cf8;background:rgba(99,102,241,.1);border-color:rgba(99,102,241,.2);}
1716
+ .iv-detail-type-chip.iv-cat-build{color:#fbbf24;background:rgba(251,191,36,.1);border-color:rgba(251,191,36,.2);}
1717
+ .iv-detail-type-chip.iv-cat-api{color:#34d399;background:rgba(52,211,153,.1);border-color:rgba(52,211,153,.2);}
1718
+ .iv-detail-type-chip.iv-cat-integration{color:#a78bfa;background:rgba(167,139,250,.1);border-color:rgba(167,139,250,.2);}
1719
+ .iv-detail-type-chip.iv-cat-tooling{color:var(--text-muted);background:var(--bg-elevated);border-color:var(--border-primary);}
1720
+ .iv-detail-risk{
1721
+ display:inline-block;font-size:11px;font-weight:700;
1722
+ padding:3px 10px;border-radius:6px;letter-spacing:.3px;
1723
+ }
1724
+ .iv-detail-row{
1725
+ display:flex;gap:20px;margin:4px 0;
1726
+ }
1727
+ .iv-detail-break{
1728
+ color:#b45309;background:#fffbeb;border-radius:6px;padding:8px 10px;
1729
+ border-left:3px solid #f59e0b;font-size:12px;
1730
+ }
1731
+ .iv-detail-rec{
1732
+ color:#047857;background:#ecfdf5;border-radius:6px;padding:8px 10px;
1733
+ border-left:3px solid #10b981;font-size:12px;
1734
+ }
1735
+ .iv-detail-path{
1736
+ display:flex;align-items:center;gap:4px;flex-wrap:wrap;margin-top:4px;
1737
+ }
1738
+ .iv-path-chip{
1739
+ font-size:11px;font-weight:500;color:var(--text-secondary);
1740
+ background:var(--bg-inset);padding:3px 8px;border-radius:5px;
1741
+ }
1742
+ .iv-path-current{background:#eef2ff;color:#4f46e5;font-weight:600;}
1743
+ .iv-path-arrow{font-size:12px;color:var(--text-faint);}
1744
+ .iv-detail-zone{
1745
+ font-size:12px;color:var(--text-muted);
1746
+ }
1747
+ .iv-detail-files{
1748
+ display:flex;flex-direction:column;gap:4px;margin-top:4px;
1749
+ }
1750
+ .iv-detail-file{
1751
+ display:flex;align-items:center;gap:6px;
1752
+ font-size:11px;font-family:'SF Mono',monospace;color:var(--text-muted);
1753
+ padding:4px 8px;background:var(--bg-elevated);border-radius:5px;
1754
+ word-break:break-all;line-height:1.3;
1755
+ }
1756
+ .iv-file-path{
1757
+ flex:1;overflow:hidden;text-overflow:ellipsis;
1758
+ }
1759
+ .iv-file-copy{
1760
+ cursor:pointer;font-size:11px;color:var(--text-faint);
1761
+ flex-shrink:0;padding:1px 4px;border-radius:3px;
1762
+ transition:color .15s,background .15s;user-select:none;
1763
+ }
1764
+ .iv-file-copy:hover{color:#6366f1;background:var(--bg-inset);}
1765
+ .iv-detail-blast-bar{
1766
+ width:100%;height:6px;background:var(--bg-inset);border-radius:3px;
1767
+ margin:6px 0 4px;overflow:hidden;
1768
+ }
1769
+ .iv-detail-blast-fill{
1770
+ height:100%;border-radius:3px;
1771
+ background:linear-gradient(90deg,#34d399,#fbbf24,#f87171);
1772
+ transition:width .4s ease;
1773
+ }
1774
+ .iv-detail-blast-score{
1775
+ font-size:11px;color:var(--text-faint);
1776
+ }
1777
+
1778
+ /* ── Dock toolbar (left side) ── */
1779
+ .dock{
1780
+ position:absolute;left:20px;top:50%;
1781
+ transform:translateY(-50%) translateX(-6px);
1782
+ z-index:20;
1783
+ display:flex;flex-direction:column;align-items:stretch;gap:4px;
1784
+ background:var(--bg-dock);
1785
+ border-radius:14px;padding:6px;
1786
+ box-shadow:var(--shadow-heavy);
1787
+ border:1px solid var(--border-primary);
1788
+ }
1789
+
1790
+ .dock-item{
1791
+ display:flex;align-items:center;gap:7px;
1792
+ padding:8px 16px;border-radius:9px;
1793
+ border:none;background:transparent;cursor:pointer;
1794
+ color:var(--text-muted);
1795
+ transition:all .18s ease;
1796
+ font-family:inherit;font-size:12px;font-weight:500;
1797
+ letter-spacing:.01em;
1798
+ white-space:nowrap;
1799
+ }
1800
+ .dock-item:hover{
1801
+ background:var(--hover-bg);
1802
+ color:var(--text-primary);
1803
+ box-shadow:0 2px 8px rgba(0,0,0,.06);
1804
+ }
1805
+ .dock-active{
1806
+ background:var(--active-bg)!important;
1807
+ color:var(--text-primary)!important;
1808
+ font-weight:600;
1809
+ box-shadow:0 1px 4px rgba(0,0,0,.05);
1810
+ }
1811
+
1812
+ .dock-icon{
1813
+ width:16px;height:16px;
1814
+ display:flex;align-items:center;justify-content:center;
1815
+ flex-shrink:0;
1816
+ }
1817
+ .dock-label{
1818
+ white-space:nowrap;
1819
+ color:inherit;
1820
+ }
1821
+ .dock-sep{
1822
+ width:100%;height:1px;background:var(--border-secondary);
1823
+ flex-shrink:0;
1824
+ }
1825
+
1826
+ /* ═══ Memor SEE — Zoom Canvas UI ═══════════════════════════════════ */
1827
+
1828
+ /* App shell */
1829
+ .memor-app{display:flex;flex-direction:column;height:100vh;background:#0d0d0d;color:#d8d8d8;font-family:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;overflow:hidden}
1830
+
1831
+ /* Top bar */
1832
+ .memor-topbar{height:44px;position:relative;display:flex;align-items:center;padding:0 20px;background:#0d0d0d;border-bottom:1px solid #1a1a1a;flex-shrink:0;z-index:10}
1833
+ .memor-topbar-brand{display:flex;align-items:center;gap:10px;flex-shrink:0;flex:1}
1834
+ .memor-logo{font-weight:800;font-size:14px;letter-spacing:-.03em;color:#fff;font-family:"JetBrains Mono",monospace}
1835
+ .memor-repo-name{font-size:12px;color:#555;font-weight:500;font-family:"JetBrains Mono",monospace}
1836
+ .memor-mode-badge{font-size:9px;padding:2px 7px;border-radius:3px;border:1px solid #222;color:#484848;font-weight:600;letter-spacing:.05em;text-transform:uppercase;font-family:"JetBrains Mono",monospace}
1837
+ .memor-topbar-right{flex:1;flex-shrink:0;display:flex;align-items:center;gap:10px;position:relative;z-index:1;justify-content:flex-end}
1838
+ .memor-sys-count{font-size:10px;color:#383838;font-family:"JetBrains Mono",monospace}
1839
+
1840
+ /* Breadcrumb */
1841
+ .breadcrumb{display:flex;align-items:center;gap:3px;flex:1;overflow:hidden;padding:0 8px}
1842
+ .bc-sep{color:#282828;font-size:12px;padding:0 1px;flex-shrink:0}
1843
+ .bc-crumb{background:none;border:none;font-size:11px;color:#484848;cursor:pointer;padding:3px 5px;border-radius:4px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:160px;transition:color .15s;font-family:"JetBrains Mono",monospace}
1844
+ .bc-crumb:hover{color:#888}
1845
+ .bc-crumb-active{color:#888;cursor:default;font-weight:600}
1846
+ .bc-crumb-active:hover{color:#888}
1847
+
1848
+ /* Body */
1849
+ .memor-topbar-sep{width:1px;height:16px;background:#1e1e1e;flex-shrink:0}
1850
+ .memor-body{display:flex;flex:1;overflow:hidden;position:relative}
1851
+
1852
+ /* ── Sidebar ── */
1853
+ .memor-sidebar{width:220px;flex-shrink:0;border-right:1px solid #1a1a1a;overflow-y:auto;padding:16px 10px 60px;display:flex;flex-direction:column;gap:1px;scrollbar-width:none}
1854
+ .memor-sidebar::-webkit-scrollbar{display:none}
1855
+ .nav-section-label{font-size:9px;font-weight:600;letter-spacing:1.5px;text-transform:uppercase;color:#484848;padding:14px 12px 5px;font-family:"JetBrains Mono",monospace}
1856
+ .nav-item{display:flex;align-items:center;gap:10px;padding:7px 12px;border-radius:5px;cursor:pointer;transition:background .1s,color .1s;user-select:none;text-decoration:none}
1857
+ .nav-item:hover{background:#161616}
1858
+ .nav-item.active{background:#1a1a1a}
1859
+ .nav-icon{width:16px;height:16px;flex-shrink:0;display:flex;align-items:center;justify-content:center;opacity:.45;color:#aaa}
1860
+ .nav-item.active .nav-icon{opacity:.75}
1861
+ .nav-item:hover .nav-icon{opacity:.6}
1862
+ .nav-label{font-size:12px;font-weight:400;color:#555;flex:1}
1863
+ .nav-item.active .nav-label{color:#888;font-weight:500}
1864
+ .nav-item:hover .nav-label{color:#666}
1865
+ .nav-badge{font-size:9px;color:#2a2a2a;font-family:"JetBrains Mono",monospace;background:#161616;border:1px solid #1e1e1e;border-radius:20px;padding:1px 6px}
1866
+ .nav-soon{font-size:9px;color:#2a2a2a;font-family:"JetBrains Mono",monospace;letter-spacing:.5px}
1867
+ .nav-divider{height:1px;background:#161616;margin:8px 12px}
1868
+
1869
+ /* ── L1 split layout ── */
1870
+ .memor-split{flex:1;display:flex;overflow:hidden}
1871
+ .memor-overview-pane{width:42%;flex-shrink:0;border-right:1px solid #1a1a1a;overflow-y:auto;padding:32px 36px 60px;display:flex;flex-direction:column;gap:18px;scrollbar-width:none}
1872
+ .memor-overview-pane::-webkit-scrollbar{display:none}
1873
+ .memor-graph-pane{flex:1;background:#000000;display:flex;flex-direction:column;position:relative;overflow:hidden}
1874
+ .graph-pane-header{padding:18px 24px 14px;border-bottom:1px solid #161616;display:flex;align-items:center;gap:14px;flex-shrink:0}
1875
+ .graph-pane-title{font-size:10px;font-weight:600;letter-spacing:1.8px;text-transform:uppercase;color:#565656;font-family:"JetBrains Mono",monospace;flex:1}
1876
+ .graph-pane-legend{display:flex;align-items:center;gap:14px}
1877
+ .health-legend-dot{width:7px;height:7px;border-radius:50%;display:inline-block;margin-right:3px;position:relative;top:1px}
1878
+ .graph-pane-legend-item{display:flex;align-items:center;font-size:9px;color:#adadad;font-family:"JetBrains Mono",monospace}
1879
+ .graph-pane-svg-wrap{flex:1;overflow:hidden;display:flex;align-items:center;justify-content:center;padding:24px 20px}
1880
+ .memor-systems-scroll{flex:1;overflow-y:auto;padding:24px 32px}
1881
+ .memor-systems-view{max-width:860px}
1882
+
1883
+ /* ── New hero ── */
1884
+ .l1-identity{display:flex;flex-direction:column;gap:6px;margin-bottom:4px}
1885
+ .l1-identity-name{font-size:30px;font-weight:800;color:#aaaaaa;letter-spacing:-1.5px;line-height:1;font-family:"JetBrains Mono",monospace}
1886
+ .l1-identity-desc{font-size:13px;font-weight:300;color:#555;line-height:1.5;display:flex;align-items:center;gap:8px;flex-wrap:wrap}
1887
+ .l1-source-badge{font-size:9px;color:#555;background:#161616;border:1px solid #2a2a2a;border-radius:3px;padding:1px 6px;letter-spacing:.3px;cursor:default}
1888
+ .l1-source-badge:hover{border-color:#444}
1889
+ .l1-pulse-row{display:flex;align-items:center;gap:10px;flex-wrap:wrap;font-size:10px;color:#3d3d3d}
1890
+ .l1-pulse-stat{color:#4a4a4a;font-family:"JetBrains Mono",monospace}
1891
+ .l1-pulse-sep{color:#2a2a2a}
1892
+ .l1-pulse-dot{width:5px;height:5px;border-radius:50%;background:#3ddc84;display:inline-block;margin-right:2px;position:relative;top:-0.5px}
1893
+ .l1-pulse-conf{font-family:"JetBrains Mono",monospace}
1894
+
1895
+ /* ── Tech groups ── */
1896
+ .l1-tech-groups{display:flex;flex-direction:column;gap:5px}
1897
+ .l1-tech-group-row{display:flex;align-items:center;gap:8px}
1898
+ .l1-tech-group-label{font-size:9px;font-weight:600;letter-spacing:1.2px;text-transform:uppercase;color:#484848;width:70px;flex-shrink:0;font-family:"JetBrains Mono",monospace}
1899
+ .l1-tech-chips{display:flex;flex-wrap:wrap;gap:4px;align-items:center}
1900
+ .l1-tech-chip-pill{display:inline-flex;align-items:center;gap:4px;padding:2px 8px;background:transparent;border:1px solid #1e1e1e;border-radius:20px;font-size:10px;font-weight:400;color:#666;cursor:default;user-select:none;transition:border-color .12s,color .12s}
1901
+ .l1-tech-chip-pill:hover{border-color:#3a3a3a;color:#888}
1902
+
1903
+ /* ── Layer 5: Orientation strip (domain models + route families) ── */
1904
+ .l5-orientation-strip{display:flex;flex-direction:column;gap:5px;margin-top:4px;padding-top:8px;border-top:1px solid #181818}
1905
+ .l5-domain-row{display:flex;align-items:center;gap:8px}
1906
+ .l5-domain-label{font-size:9px;font-weight:600;letter-spacing:1.2px;text-transform:uppercase;color:#484848;width:70px;flex-shrink:0;font-family:"JetBrains Mono",monospace}
1907
+ .l5-domain-chips{display:flex;flex-wrap:wrap;gap:4px;align-items:center}
1908
+ .l5-entity-chip{display:inline-flex;align-items:center;padding:2px 7px;background:#0e1a2a;border:1px solid #1a3a5c;border-radius:4px;font-size:10px;font-weight:500;color:#4a90d9;cursor:default;user-select:none;font-family:"JetBrains Mono",monospace;letter-spacing:.2px}
1909
+ .l5-entity-chip--more{background:transparent;border-color:#1e1e1e;color:#484848}
1910
+ .l5-route-chip{display:inline-flex;align-items:center;gap:5px;padding:2px 7px;background:#0e1e15;border:1px solid #1a3d28;border-radius:4px;font-size:10px;font-weight:400;color:#4aaa72;cursor:default;user-select:none;font-family:"JetBrains Mono",monospace}
1911
+ .l5-route-count{font-size:9px;color:#2d7a4a;background:#0a1910;border-radius:3px;padding:0 4px;min-width:16px;text-align:center}
1912
+
1913
+ /* ── Archetype badge (system cards) ── */
1914
+ .l1-badge-arch{font-size:8px;font-weight:600;letter-spacing:.8px;text-transform:uppercase;padding:2px 6px;border-radius:3px;background:#1a1428;border:1px solid #2d1f4a;color:#8b5cf6;font-family:"JetBrains Mono",monospace}
1915
+ .l1-srow-arch{font-size:8px;font-weight:600;letter-spacing:.8px;text-transform:uppercase;padding:1px 5px;border-radius:3px;background:#1a1428;border:1px solid #2d1f4a;color:#8b5cf6;font-family:"JetBrains Mono",monospace}
1916
+
1917
+ /* ── Sec divider ── */
1918
+ .l1-sec-divider{height:1px;min-height:1px;flex-shrink:0;background:#1a1a1a;width:100%}
1919
+
1920
+ /* ── New section label (replaces l1-section-label inside overview pane) ── */
1921
+ .l1-sec-label{font-size:10px;font-weight:600;letter-spacing:1.8px;text-transform:uppercase;color:#555;margin-bottom:10px;font-family:"JetBrains Mono",monospace}
1922
+
1923
+ /* ── High impact list (replaces danger section in overview pane) ── */
1924
+ .l1-impact-list{display:flex;flex-direction:column;gap:0}
1925
+ .l1-impact-line{display:flex;flex-direction:column;gap:3px;padding:7px 0;border-bottom:1px solid #141414}
1926
+ .l1-impact-line:last-child{border-bottom:none}
1927
+ .l1-il-top{display:flex;align-items:center;gap:14px}
1928
+ .l1-il-name{font-family:"JetBrains Mono",monospace;font-size:11px;font-weight:600;color:#666;min-width:140px;flex-shrink:0}
1929
+ .l1-il-bar{font-family:"JetBrains Mono",monospace;font-size:12px;letter-spacing:1px}
1930
+ .l1-il-meta{font-size:10px;color:#3a3a3a;font-family:"JetBrains Mono",monospace;white-space:nowrap}
1931
+ .l1-il-desc{font-size:11px;color:#2e2e2e;line-height:1.4}
1932
+ .l1-il-red .l1-il-name{color:#b84848}
1933
+ .l1-il-red .l1-il-bar{color:#7a2828}
1934
+ .l1-il-orange .l1-il-name{color:#a86828}
1935
+ .l1-il-orange .l1-il-bar{color:#7a4a18}
1936
+ .l1-il-dim .l1-il-name{color:#404040}
1937
+ .l1-il-dim .l1-il-bar{color:#2e2e2e}
1938
+
1939
+ /* Canvas */
1940
+ .memor-canvas{flex:1;position:relative;overflow:hidden}
1941
+ .memor-canvas .react-flow{background:#0d0d0d}
1942
+ .memor-canvas .react-flow__controls{left:12px;bottom:12px}
1943
+ .memor-canvas .react-flow__controls button{background:#141414;border:1px solid #1e1e1e;color:#666}
1944
+ .memor-canvas .react-flow__controls button:hover{background:#1e1e1e;color:#aaa}
1945
+
1946
+ /* Back button */
1947
+ .memor-back-btn{position:absolute;top:12px;left:12px;z-index:20;background:#141414;border:1px solid #1e1e1e;color:#666;font-size:11px;padding:5px 10px;border-radius:5px;cursor:pointer;transition:all .15s;font-family:"JetBrains Mono",monospace}
1948
+ .memor-back-btn:hover{background:#1e1e1e;color:#aaa}
1949
+
1950
+ /* ── L3 file list ── */
1951
+ .l3-container{height:100%;overflow-y:auto;padding:16px 20px}
1952
+ .l3-header{display:flex;align-items:center;gap:10px;margin-bottom:16px;padding-bottom:12px;border-bottom:1px solid rgba(255,255,255,.06)}
1953
+ .l3-path{font-size:12px;color:#555;font-family:"JetBrains Mono",monospace}
1954
+ .l3-count{font-size:11px;color:#333;margin-left:auto;font-family:"JetBrains Mono",monospace}
1955
+ .l3-grid{display:flex;flex-wrap:wrap;gap:20px;align-content:flex-start}
1956
+ .l3-group{min-width:160px;max-width:220px}
1957
+ .l3-group-label{font-size:9px;font-weight:700;letter-spacing:.07em;text-transform:uppercase;margin-bottom:6px;padding-left:2px;font-family:"JetBrains Mono",monospace}
1958
+ .l3-file{display:flex;align-items:center;gap:6px;padding:5px 8px;border-radius:5px;cursor:pointer;background:rgba(255,255,255,.02);border:1px solid rgba(255,255,255,.04);margin-bottom:3px;transition:background .12s,border-color .12s}
1959
+ .l3-file:hover{background:rgba(255,255,255,.04);border-color:rgba(255,255,255,.08)}
1960
+ .l3-file-selected{background:rgba(255,255,255,.06)!important;border-color:rgba(255,255,255,.12)!important}
1961
+ .l3-file-entry{border-left:2px solid #444}
1962
+ .l3-file-ext{font-size:8px;font-weight:700;padding:1px 4px;border-radius:3px;color:#fff;text-transform:uppercase;flex-shrink:0;min-width:22px;text-align:center;letter-spacing:.03em}
1963
+ .l3-file-name{font-size:11px;color:#aaa;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-family:"JetBrains Mono",monospace}
1964
+ .l3-empty{color:#333;font-size:12px;padding:20px}
1965
+
1966
+ /* ── Detail panel ── */
1967
+ .memor-detail{width:300px;flex-shrink:0;background:#111;border-left:1px solid #1a1a1a;overflow-y:auto;display:flex;flex-direction:column}
1968
+ .detail-header{display:flex;align-items:center;gap:8px;padding:12px 14px;border-bottom:1px solid #1a1a1a;flex-shrink:0}
1969
+ .detail-title{font-size:13px;font-weight:600;color:#c0c0c0;flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-family:"JetBrains Mono",monospace}
1970
+ .detail-close{background:none;border:none;color:#555;cursor:pointer;font-size:16px;padding:0 4px;line-height:1;transition:color .15s}
1971
+ .detail-close:hover{color:#aaa}
1972
+ .detail-body{padding:12px 14px;display:flex;flex-direction:column;gap:10px}
1973
+ .detail-type-row{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
1974
+ .detail-type-badge{font-size:9px;padding:2px 6px;border-radius:4px;background:rgba(255,255,255,.07);color:#888;font-weight:600;text-transform:uppercase;letter-spacing:.04em;font-family:"JetBrains Mono",monospace}
1975
+ .detail-tier-badge{font-size:9px;padding:2px 6px;border-radius:4px;background:rgba(255,255,255,.05);color:#555;font-weight:600;text-transform:uppercase;letter-spacing:.04em;font-family:"JetBrains Mono",monospace}
1976
+ .detail-tech-badge{font-size:9px;padding:2px 6px;border-radius:4px;background:rgba(255,255,255,.04);color:#444;font-family:"JetBrains Mono",monospace}
1977
+ .detail-desc{font-size:11px;color:#555;line-height:1.5}
1978
+ .detail-section{display:flex;flex-direction:column;gap:5px}
1979
+ .detail-section-title{font-size:10px;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:.05em;display:flex;align-items:center;gap:6px;font-family:"JetBrains Mono",monospace}
1980
+ .detail-derive-label{font-size:9px;color:#333;font-weight:400;text-transform:none;letter-spacing:0}
1981
+ .detail-entry{display:flex;flex-direction:column;gap:2px;padding:5px 8px;background:rgba(255,255,255,.02);border-radius:4px;border-left:2px solid #2a2a2a}
1982
+ .detail-entry-path{font-size:10px;color:#888;font-family:"JetBrains Mono",monospace}
1983
+ .detail-entry-reason{font-size:10px;color:#555}
1984
+ .detail-impact{display:flex;flex-direction:column;gap:6px}
1985
+ .detail-impact-bar-row{display:flex;align-items:center;gap:8px}
1986
+ .detail-impact-bar{flex:1;height:4px;background:rgba(255,255,255,.06);border-radius:2px;overflow:hidden}
1987
+ .detail-impact-fill{height:100%;border-radius:2px;transition:width .4s ease}
1988
+ .detail-impact-score{font-size:10px;font-weight:600;text-transform:capitalize;font-family:"JetBrains Mono",monospace}
1989
+ .detail-impact-summary{font-size:10px;color:#555;line-height:1.5}
1990
+ .detail-impact-item{display:flex;align-items:flex-start;gap:6px;padding:4px 0}
1991
+ .detail-risk-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0;margin-top:2px}
1992
+ .detail-risk-high{background:#ef4444}
1993
+ .detail-risk-medium{background:#f97316}
1994
+ .detail-risk-low{background:#22c55e}
1995
+ .detail-impact-name{font-size:10px;color:#aaa;font-weight:500;min-width:80px;font-family:"JetBrains Mono",monospace}
1996
+ .detail-impact-reason{font-size:10px;color:#555;flex:1}
1997
+
1998
+ /* ── L4 File X-Ray ── */
1999
+ .xray-container{height:100%;overflow-y:auto;padding:20px 24px;display:flex;flex-direction:column;gap:16px}
2000
+ .xray-loading{display:flex;align-items:center;gap:10px;color:#555;font-size:12px;padding:40px 0}
2001
+ .xray-spinner{width:16px;height:16px;border:2px solid rgba(255,255,255,.1);border-top-color:#888;border-radius:50%;animation:spin .7s linear infinite}
2002
+ @keyframes spin{to{transform:rotate(360deg)}}
2003
+ .xray-empty{color:#333;font-size:12px;padding:40px 0}
2004
+ .xray-header{display:flex;flex-direction:column;gap:5px;padding-bottom:14px;border-bottom:1px solid #1a1a1a}
2005
+ .xray-title-row{display:flex;align-items:center;gap:8px}
2006
+ .xray-ext-badge{font-size:9px;font-weight:700;padding:2px 6px;border-radius:4px;color:#fff;text-transform:uppercase;letter-spacing:.04em;flex-shrink:0}
2007
+ .xray-filename{font-size:15px;font-weight:700;color:#c0c0c0;letter-spacing:-.01em;font-family:"JetBrains Mono",monospace}
2008
+ .xray-linecount{font-size:10px;color:#555;margin-left:auto;font-family:"JetBrains Mono",monospace}
2009
+ .xray-path{font-size:10px;color:#333;font-family:"JetBrains Mono",monospace}
2010
+ .xray-error{font-size:10px;color:#f87171;padding:4px 8px;background:rgba(239,68,68,.08);border-radius:4px;border:1px solid rgba(239,68,68,.2)}
2011
+ .xray-cols{display:grid;grid-template-columns:1fr 1fr;gap:16px}
2012
+ .xray-col{display:flex;flex-direction:column;gap:5px}
2013
+ .xray-col-title{font-size:10px;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:.06em;display:flex;align-items:center;gap:5px;margin-bottom:3px;font-family:"JetBrains Mono",monospace}
2014
+ .xray-derive{font-size:9px;color:#333;font-weight:400;text-transform:none;letter-spacing:0}
2015
+ .xray-empty-col{font-size:10px;color:#333}
2016
+ .xray-import{display:flex;align-items:center;gap:5px;padding:3px 0}
2017
+ .xray-import-dot{width:5px;height:5px;border-radius:50%;flex-shrink:0}
2018
+ .xray-import-name{font-size:11px;color:#888;font-family:"JetBrains Mono",monospace;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
2019
+ .xray-import-local .xray-import-name{color:#aaa}
2020
+ .xray-import-names{font-size:9px;color:#555;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
2021
+ .xray-type-tag{font-size:8px;padding:1px 4px;border-radius:3px;background:rgba(255,255,255,.06);color:#888;font-weight:600;flex-shrink:0}
2022
+ .xray-export{display:flex;align-items:center;gap:6px;padding:3px 0}
2023
+ .xray-export-kind{font-size:8px;padding:1px 5px;border-radius:3px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;flex-shrink:0;min-width:44px;text-align:center}
2024
+ .xray-kind-function{background:rgba(255,255,255,.07);color:#999}
2025
+ .xray-kind-class{background:rgba(255,255,255,.06);color:#888}
2026
+ .xray-kind-type,.xray-kind-interface{background:rgba(20,184,166,.12);color:#5eead4}
2027
+ .xray-kind-const{background:rgba(234,179,8,.1);color:#fbbf24}
2028
+ .xray-kind-default{background:rgba(249,115,22,.1);color:#fb923c}
2029
+ .xray-kind-other{background:rgba(255,255,255,.04);color:#555}
2030
+ .xray-export-name{font-size:11px;color:#aaa;font-family:"JetBrains Mono",monospace}
2031
+ .xray-section{display:flex;flex-direction:column;gap:6px;padding-top:14px;border-top:1px solid #1a1a1a}
2032
+ .xray-section-title{font-size:10px;font-weight:600;color:#555;text-transform:uppercase;letter-spacing:.06em;display:flex;align-items:center;gap:5px;font-family:"JetBrains Mono",monospace}
2033
+ .xray-fn{padding:6px 10px;background:rgba(255,255,255,.02);border-radius:5px;border-left:2px solid #2a2a2a;display:flex;flex-direction:column;gap:3px}
2034
+ .xray-fn-sig{display:flex;align-items:center;gap:5px;flex-wrap:wrap}
2035
+ .xray-async{font-size:9px;color:#888;font-weight:600;font-family:"JetBrains Mono",monospace}
2036
+ .xray-fn-name{font-size:12px;font-weight:600;color:#c0ccd8;font-family:"JetBrains Mono",monospace}
2037
+ .xray-fn-params{font-size:11px;color:#555;font-family:"JetBrains Mono",monospace}
2038
+ .xray-exported{font-size:10px;color:#22c55e;margin-left:auto}
2039
+ .xray-fn-calls{font-size:10px;color:#333;font-family:"JetBrains Mono",monospace;padding-left:2px}
2040
+ .xray-types-row{display:flex;flex-wrap:wrap;gap:5px}
2041
+ .xray-type-chip{font-size:10px;padding:2px 8px;border-radius:4px;background:rgba(255,255,255,.05);color:#888;font-family:"JetBrains Mono",monospace;border:1px solid #222}
2042
+ .xray-footer{display:flex;align-items:center;gap:12px;padding-top:14px;border-top:1px solid #1a1a1a;margin-top:4px}
2043
+ .xray-vscode-btn{display:flex;align-items:center;gap:6px;padding:7px 14px;background:#141414;border:1px solid #1e1e1e;border-radius:6px;color:#666;font-size:11px;font-weight:600;cursor:pointer;transition:all .15s;font-family:"JetBrains Mono",monospace}
2044
+ .xray-vscode-btn:hover{background:#1e1e1e;color:#aaa;border-color:#2a2a2a}
2045
+ .xray-derive-footer{font-size:9px;color:#282828;margin-left:auto}
2046
+
2047
+ /* ── ReactFlow overrides ── */
2048
+ .react-flow__node{cursor:default}
2049
+ .react-flow__edge-path{cursor:default}
2050
+
2051
+ /* ── L1 Repo Map ──────────────────────────────────────────────────── */
2052
+ .l1-view{padding:28px 32px 60px;overflow-y:auto;height:100%;display:flex;flex-direction:column;gap:24px;scrollbar-width:none}
2053
+ .l1-view::-webkit-scrollbar{display:none}
2054
+
2055
+ /* Hero panel */
2056
+ .l1-hero{background:#111;border:1px solid #1a1a1a;border-radius:8px;padding:20px 24px;display:flex;flex-direction:column;gap:10px}
2057
+ .l1-hero-top{display:flex;align-items:baseline;gap:14px;flex-wrap:wrap}
2058
+ .l1-hero-name{font-size:22px;font-weight:800;color:#e0e0e0;letter-spacing:-0.03em;font-family:"JetBrains Mono",monospace}
2059
+ .l1-hero-meta{display:flex;gap:5px;font-size:11px;color:#484848;align-items:center;font-family:"JetBrains Mono",monospace}
2060
+ .l1-hero-headline{font-size:12px;color:#555;line-height:1.55;max-width:680px;font-style:italic}
2061
+ .l1-tech-row{display:flex;flex-wrap:wrap;gap:5px;align-items:center}
2062
+ .l1-tech-icon{border-radius:3px;display:block;flex-shrink:0}
2063
+ .l1-tech-icon-text{font-size:9px;font-weight:700;padding:2px 5px;border-radius:3px;border:1px solid;white-space:nowrap;flex-shrink:0;letter-spacing:.03em}
2064
+ .l1-hero-entries{display:flex;flex-direction:column;gap:4px;padding:10px 12px;background:rgba(255,255,255,.02);border-radius:6px;border:1px solid #1e1e1e}
2065
+ .l1-hero-entries-label{font-size:9px;font-weight:700;color:#484848;text-transform:uppercase;letter-spacing:.1em;margin-bottom:2px;font-family:"JetBrains Mono",monospace}
2066
+ .l1-hero-entry-row{display:flex;align-items:center;gap:6px;min-width:0}
2067
+ .l1-hero-entry-sys{font-size:11px;font-weight:600;color:#888;white-space:nowrap;font-family:"JetBrains Mono",monospace}
2068
+ .l1-hero-entry-arrow{font-size:11px;color:#333;flex-shrink:0}
2069
+ .l1-hero-entry-path{font-size:11px;font-family:"JetBrains Mono",monospace;color:#666;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
2070
+ .l1-hero-entry-why{font-size:10px;color:#555;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}
2071
+ .l1-hero-health{display:flex;align-items:center;gap:6px}
2072
+ .l1-health-dot{width:6px;height:6px;border-radius:50%;flex-shrink:0}
2073
+ .l1-health-label{font-size:10px;font-weight:600}
2074
+ .l1-health-warn{font-size:10px;color:#eab308}
2075
+
2076
+ /* Section labels */
2077
+ .l1-section{display:flex;flex-direction:column;gap:8px}
2078
+ .l1-section-label{font-size:9px;font-weight:700;letter-spacing:.14em;text-transform:uppercase;font-family:"JetBrains Mono",monospace}
2079
+ .l1-tier-primary{color:#565656}
2080
+ .l1-tier-secondary{color:#484848}
2081
+ .l1-tier-support{color:#3a3a3a}
2082
+
2083
+ /* Shared */
2084
+ .l1-badge-type{font-size:9px;padding:2px 6px;border-radius:3px;border:1px solid #222;color:#484848;font-weight:600;text-transform:uppercase;letter-spacing:.06em;font-family:"JetBrains Mono",monospace}
2085
+ .l1-badge-arch{font-size:9px;padding:2px 6px;border-radius:3px;border:1px solid #1e1e1e;color:#3a3a3a;font-weight:500;text-transform:capitalize;font-family:"JetBrains Mono",monospace}
2086
+ .l1-tech-chip{font-size:9px;padding:1px 5px;border-radius:3px;background:rgba(255,255,255,.04);color:#484848;border:1px solid #1e1e1e}
2087
+ .l1-explore-hint{margin-left:auto;font-size:9px;color:#282828;transition:color .12s;white-space:nowrap}
2088
+ .l1-blast-chip{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;padding:1px 5px;border-radius:3px;border:1px solid;font-family:"JetBrains Mono",monospace}
2089
+
2090
+ /* Primary cards */
2091
+ .l1-pcards{display:grid;grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:8px}
2092
+ .l1-pcard{background:#141414;border-radius:6px;border:1px solid #1e1e1e;border-left:3px solid #333;padding:14px 16px;cursor:pointer;transition:background .1s;display:flex;flex-direction:column;gap:7px}
2093
+ .l1-pcard:hover{background:#161616}
2094
+ .l1-pcard:hover .l1-explore-hint{color:#888}
2095
+ .l1-pcard-name{font-size:14px;font-weight:700;color:#c0ccd8;letter-spacing:-0.015em;font-family:"JetBrains Mono",monospace}
2096
+ .l1-pcard-badges{display:flex;gap:5px;flex-wrap:wrap}
2097
+ .l1-pcard-tech{display:flex;gap:4px;flex-wrap:wrap}
2098
+ .l1-pcard-desc{font-size:11px;color:#555;line-height:1.45;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;overflow:hidden}
2099
+ .l1-pcard-entry{display:flex;align-items:center;gap:6px;padding:5px 8px;background:rgba(255,255,255,.02);border-radius:4px;border:1px solid #1a1a1a;min-width:0}
2100
+ .l1-pcard-entry-label{font-size:8px;font-weight:700;color:#484848;text-transform:uppercase;letter-spacing:.1em;white-space:nowrap;flex-shrink:0;font-family:"JetBrains Mono",monospace}
2101
+ .l1-pcard-entry-path{font-size:10px;font-family:"JetBrains Mono",monospace;color:#666;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
2102
+ .l1-pcard-footer{display:flex;align-items:center;gap:6px;padding-top:4px;border-top:1px solid #1a1a1a}
2103
+
2104
+ /* Secondary rows — compact, scannable */
2105
+ .l1-srows{display:flex;flex-direction:column;gap:2px}
2106
+ .l1-srow{display:flex;align-items:center;gap:8px;padding:7px 12px;border-radius:5px;background:#111;border:1px solid #1a1a1a;border-left:2px solid #282828;cursor:pointer;transition:background .1s;min-width:0}
2107
+ .l1-srow:hover{background:#161616}
2108
+ .l1-srow:hover .l1-srow-explore{opacity:1}
2109
+ .l1-srow-name{font-size:12px;font-weight:600;color:#888;white-space:nowrap;min-width:90px;font-family:"JetBrains Mono",monospace}
2110
+ .l1-srow-arch{font-size:9px;color:#3a3a3a;white-space:nowrap;flex-shrink:0;font-family:"JetBrains Mono",monospace}
2111
+ .l1-srow-tech{display:flex;gap:3px;flex-wrap:nowrap;overflow:hidden}
2112
+ .l1-srow-chip{font-size:9px;padding:1px 5px;border-radius:3px;background:rgba(255,255,255,.04);color:#3a3a3a;white-space:nowrap}
2113
+ .l1-srow-blast{font-size:9px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;white-space:nowrap;margin-left:auto;flex-shrink:0}
2114
+ .l1-srow-explore{font-size:10px;color:#2a2a2a;opacity:0;transition:opacity .1s;flex-shrink:0}
2115
+
2116
+ /* Support chips — just names */
2117
+ .l1-support-chips{display:flex;flex-wrap:wrap;gap:5px}
2118
+ .l1-support-chip{background:transparent;border:1px solid #1e1e1e;border-radius:20px;padding:3px 10px;font-size:10px;color:#3a3a3a;cursor:pointer;transition:all .1s;white-space:nowrap;font-family:"JetBrains Mono",monospace}
2119
+ .l1-support-chip:hover{background:#161616;color:#666;border-color:#282828}
2120
+ .l1-chip-more{color:#282828;border-style:dashed}
2121
+ .l1-chip-more:hover{color:#3a3a3a}
2122
+
2123
+ .l1-empty-state{color:#282828;font-size:13px;padding:60px 0;text-align:center}
2124
+
2125
+ /* Source label */
2126
+ .l1-src{font-size:9px;color:#2a2a2a;font-weight:400;letter-spacing:.02em;margin-left:4px;font-family:"JetBrains Mono",monospace}
2127
+
2128
+ /* How to run */
2129
+ .l1-run-list{display:flex;flex-direction:column;gap:0}
2130
+ .l1-run-row{display:flex;align-items:baseline;gap:12px;padding:5px 0;border-bottom:1px solid #161616}
2131
+ .l1-run-row:last-child{border-bottom:none}
2132
+ .l1-run-label{font-family:"JetBrains Mono",monospace;font-size:10px;color:#484848;min-width:140px;text-align:left;flex-shrink:0;white-space:nowrap}
2133
+ .l1-run-cmd{font-family:"JetBrains Mono",monospace;font-size:11px;color:#888;cursor:pointer;transition:color .1s;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;font-weight:600}
2134
+ .l1-run-cmd:hover{color:#bbb}
2135
+ .l1-run-src{font-size:9px;color:#2a2a2a;white-space:nowrap;flex-shrink:0;font-family:"JetBrains Mono",monospace}
2136
+
2137
+ /* Open this first */
2138
+ .l1-open-first{display:flex;flex-direction:column;gap:0}
2139
+ .l1-of-row{display:flex;align-items:flex-start;gap:16px;padding:9px 0;border-bottom:1px solid #141414}
2140
+ .l1-of-row:last-child{border-bottom:none}
2141
+ .l1-of-context{font-size:12px;color:#666;font-weight:600;white-space:nowrap;min-width:180px;flex-shrink:0;font-family:"JetBrains Mono",monospace;padding-top:1px}
2142
+ .l1-of-entries{display:flex;flex-direction:column;gap:4px}
2143
+ .l1-of-path{display:inline-flex;align-items:center;gap:5px;font-size:11px;font-family:"JetBrains Mono",monospace;color:#888;cursor:pointer;padding:3px 8px;border-radius:3px;background:#141414;border:1px solid #222;transition:border-color .1s,color .1s;white-space:nowrap;width:fit-content}
2144
+ .l1-of-path:hover{border-color:#444;color:#aaa}
2145
+ .l1-of-ext-icon{font-size:13px;line-height:1;opacity:.75;flex-shrink:0}
2146
+ .l1-of-ext-folder{display:inline-flex;align-items:center;opacity:.75}
2147
+ /* ── System detail modal ── */
2148
+ .sdm-backdrop{position:fixed;inset:0;z-index:50;background:rgba(0,0,0,0.75);display:flex;align-items:center;justify-content:center;padding:16px}
2149
+ .sdm-modal{display:flex;flex-direction:column;width:96vw;max-width:1100px;height:88vh;background:#0d0d0d;border:1px solid #1e1e1e;border-radius:8px;overflow:hidden;animation:sdm-in 0.18s ease-out}
2150
+ @keyframes sdm-in{from{opacity:0;transform:scale(0.97)}to{opacity:1;transform:scale(1)}}
2151
+ /* Header strip */
2152
+ .sdm-header{display:flex;align-items:flex-start;justify-content:space-between;gap:32px;padding:20px 24px 16px;border-bottom:1px solid #161616;flex-shrink:0}
2153
+ .sdm-header-left{flex:1;min-width:0}
2154
+ .sdm-header-top-row{display:flex;flex-wrap:wrap;align-items:center;gap:5px;margin-bottom:8px}
2155
+ .sdm-tier-badge{font-size:9px;font-weight:700;letter-spacing:1.4px;color:#484848;font-family:"JetBrains Mono",monospace;text-transform:uppercase;margin-right:4px}
2156
+ .sdm-badge{font-size:9px;font-weight:600;padding:2px 8px;border-radius:3px;border:1px solid #222;color:#555;font-family:"JetBrains Mono",monospace;text-transform:uppercase;letter-spacing:.5px}
2157
+ .sdm-name{font-size:22px;font-weight:700;color:#c8c8c8;font-family:"JetBrains Mono",monospace;margin-bottom:7px;line-height:1.1}
2158
+ .sdm-desc{font-size:14px;color:#555;line-height:1.6;max-width:480px}
2159
+ /* Blast radius panel */
2160
+ .sdm-blast-panel{display:flex;flex-direction:column;align-items:flex-end;gap:5px;flex-shrink:0;min-width:180px}
2161
+ .sdm-blast-panel-label{font-size:8px;font-weight:700;letter-spacing:1.8px;color:#555;font-family:"JetBrains Mono",monospace;text-transform:uppercase}
2162
+ .sdm-blast-bar-wrap{width:160px;height:2px;background:#222;border-radius:1px}
2163
+ .sdm-blast-bar{height:100%;border-radius:1px;transition:width .3s}
2164
+ .sdm-blast-level-name{font-size:18px;font-weight:700;font-family:"JetBrains Mono",monospace;line-height:1}
2165
+ .sdm-blast-counts-row{display:flex;align-items:center;gap:6px}
2166
+ .sdm-blast-count-chip{font-size:11px;color:#888;font-family:"JetBrains Mono",monospace}
2167
+ .sdm-blast-sep{font-size:11px;color:#555}
2168
+ .sdm-blast-explain{font-size:9.5px;color:#555;font-family:"JetBrains Mono",monospace;text-align:right;max-width:180px;line-height:1.4}
2169
+ /* Entry point strip */
2170
+ .sdm-ep-strip{display:flex;flex-direction:column;gap:6px}
2171
+ .sdm-ep-chip{display:flex;align-items:center;gap:6px;padding:5px 10px;border:1px solid #1e1e1e;border-radius:4px;background:#0d0d0d;cursor:default;transition:border-color .1s;width:fit-content}
2172
+ .sdm-ep-chip:hover{border-color:#333}
2173
+ .sdm-ep-path{font-size:11px;color:#666;font-family:"JetBrains Mono",monospace;font-weight:600}
2174
+ /* Graph area */
2175
+ .sdm-graph{flex:1;overflow:hidden;display:flex;align-items:center;justify-content:center;padding:16px 24px;min-height:0;background-color:#000;background-image:radial-gradient(rgba(255,255,255,0.10) 1px,transparent 1px),radial-gradient(rgba(255,255,255,0.06) 1px,transparent 1px);background-size:22px 22px,13px 13px;background-position:0 0,8px 11px}
2176
+ /* Footer */
2177
+ .sdm-modal-footer{padding:12px 24px;border-top:1px solid #161616;flex-shrink:0}
2178
+ .sdm-drill-btn{background:#111;border:1px solid #1e1e1e;color:#484848;font-size:11px;font-family:"JetBrains Mono",monospace;padding:8px 14px;border-radius:4px;cursor:pointer;transition:all .1s}.sdm-drill-btn:hover{border-color:#333;color:#777}
2179
+
2180
+ /* Primary card top row */
2181
+ .l1-pcard-top{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
2182
+
2183
+ /* Dep chip on primary card */
2184
+ .l1-dep-chip{font-size:9px;color:#3a3a3a;background:rgba(255,255,255,.03);padding:1px 5px;border-radius:3px;border:1px solid #1e1e1e}
2185
+
2186
+ /* Secondary row dep count */
2187
+ .l1-srow-dep{font-size:9px;color:#3a3a3a;margin-left:auto;flex-shrink:0;white-space:nowrap;font-family:"JetBrains Mono",monospace}
2188
+
2189
+ /* Support hint */
2190
+ .l1-support-hint{font-weight:400;text-transform:none;letter-spacing:0;color:#333}
2191
+
2192
+ /* Dependencies section */
2193
+ .l1-dep-list{display:flex;flex-direction:column;gap:4px}
2194
+ .l1-dep-row{display:flex;align-items:baseline;gap:8px;font-size:11px;padding:4px 0;border-bottom:1px solid #161616}
2195
+ .l1-dep-row:last-child{border-bottom:none}
2196
+ .l1-dep-name{font-weight:600;color:#888;min-width:120px;white-space:nowrap;font-family:"JetBrains Mono",monospace}
2197
+ .l1-dep-arrow{color:#282828;flex-shrink:0}
2198
+ .l1-dep-count{color:#484848;white-space:nowrap;flex-shrink:0}
2199
+ .l1-dep-names{color:#383838;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
2200
+
2201
+ /* Danger zones */
2202
+ .l1-danger-list{display:flex;flex-direction:column;gap:4px}
2203
+ .l1-danger-row{display:flex;align-items:center;gap:10px;font-size:11px;padding:4px 0;border-bottom:1px solid #161616}
2204
+ .l1-danger-row:last-child{border-bottom:none}
2205
+ .l1-danger-name{font-weight:600;color:#888;min-width:120px;white-space:nowrap;font-family:"JetBrains Mono",monospace}
2206
+ .l1-danger-bar{font-family:"JetBrains Mono",monospace;font-size:12px;letter-spacing:-.5px;flex-shrink:0}
2207
+ .l1-danger-level{font-size:9px;font-weight:700;letter-spacing:.08em;white-space:nowrap;flex-shrink:0;font-family:"JetBrains Mono",monospace}
2208
+ .l1-danger-count{font-size:10px;color:#484848;white-space:nowrap}
2209
+
2210
+ /* Gaps */
2211
+ .l1-section-label-warn{color:#b45309}
2212
+ .l1-gaps{display:flex;flex-direction:column;gap:8px}
2213
+ .l1-gap-row{display:flex;gap:8px;align-items:flex-start}
2214
+ .l1-gap-mark{color:#5c2020;font-size:11px;flex-shrink:0;margin-top:1px}
2215
+ .l1-gap-what{font-size:11px;color:#666;font-weight:600;line-height:1.4}
2216
+ .l1-gap-why{font-size:10px;color:#484848;line-height:1.45;margin-top:2px}
2217
+
2218
+ /* Safe to skip */
2219
+ .l1-safe-skip{font-size:11px;color:#2a2a2a;letter-spacing:.02em;font-family:"JetBrains Mono",monospace}
2220
+ `);
2221
+ }
2222
+ /* OLD CSS removed — the styles above are all that's needed for the desktop shell */
2223
+ const _OLD_LAYOUT = `
2224
+ .layout{display:flex;flex:1;overflow:hidden;position:relative}
2225
+
2226
+ /* ═══ Sidebar ═══ */
2227
+ .sidebar{
2228
+ width:200px;background:#0f172a;overflow-y:auto;flex-shrink:0;
2229
+ display:flex;flex-direction:column;
2230
+ }
2231
+ .sidebar::-webkit-scrollbar{width:3px}
2232
+ .sidebar::-webkit-scrollbar-track{background:transparent}
2233
+ .sidebar::-webkit-scrollbar-thumb{background:#334155;border-radius:2px}
2234
+ .sidebar-search{padding:8px 10px 4px}
2235
+ .sidebar-search input{
2236
+ width:100%;padding:5px 8px;border-radius:5px;border:1px solid #1e293b;
2237
+ background:#1e293b;color:#e2e8f0;font-size:11px;outline:none;
2238
+ font-family:inherit;
2239
+ }
2240
+ .sidebar-search input:focus{border-color:#3b82f6}
2241
+ .sidebar-search input::placeholder{color:#475569}
2242
+ .sidebar-group{padding-bottom:2px}
2243
+ .sidebar-header{
2244
+ padding:10px 12px 3px;font-size:9px;font-weight:600;
2245
+ text-transform:uppercase;letter-spacing:.07em;color:#475569;
2246
+ }
2247
+ .sidebar-item{
2248
+ display:flex;align-items:center;gap:7px;padding:4px 12px;
2249
+ cursor:pointer;color:#94a3b8;font-size:12px;
2250
+ transition:all .1s;border-left:2px solid transparent;
2251
+ }
2252
+ .sidebar-item:hover{background:#1e293b;color:#e2e8f0}
2253
+ .sidebar-item.active{background:#172554;color:#ffffff;border-left-color:#3b82f6}
2254
+ .sidebar-overview-item{padding:6px 12px;margin-bottom:2px;border-bottom:1px solid #1e293b}
2255
+ .sidebar-dot{width:5px;height:5px;border-radius:50%;flex-shrink:0}
2256
+ .sidebar-name{flex:1;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
2257
+ .sidebar-center{font-size:9px;color:#eab308}
2258
+
2259
+ /* ═══ Main panel — graph is the hero ═══ */
2260
+ .main-panel{
2261
+ flex:1;display:flex;flex-direction:column;overflow:hidden;
2262
+ background:#fafbfc;
2263
+ }
2264
+ .top-bar{
2265
+ display:flex;align-items:center;gap:10px;padding:8px 16px;
2266
+ flex-shrink:0;flex-wrap:wrap;background:#ffffff;border-bottom:1px solid #f1f5f9;
2267
+ }
2268
+ .top-bar-name{font-size:14px;font-weight:600;color:#0f172a}
2269
+ .back-btn{
2270
+ display:inline-flex;align-items:center;gap:3px;padding:4px 10px;
2271
+ background:none;border:1px solid #e2e8f0;border-radius:6px;
2272
+ color:#3b82f6;font-size:12px;cursor:pointer;font-family:inherit;
2273
+ }
2274
+ .back-btn:hover{background:#f8fafc;border-color:#3b82f6}
2275
+ .view-toggle{display:flex;gap:2px;margin-left:auto}
2276
+ .toggle-btn{
2277
+ padding:3px 10px;background:none;border:1px solid #e2e8f0;
2278
+ border-radius:5px;font-size:11px;cursor:pointer;color:#64748b;
2279
+ font-family:inherit;transition:all .15s;
2280
+ }
2281
+ .toggle-btn:hover{border-color:#94a3b8}
2282
+ .toggle-btn.active{background:#0f172a;color:#ffffff;border-color:#0f172a}
2283
+
2284
+ /* Graph fills all remaining space */
2285
+ .graph-hero{
2286
+ flex:1;min-height:0;position:relative;
2287
+ }
2288
+ .graph-hero .react-flow{height:100%!important}
2289
+
2290
+ /* Floating context card */
2291
+ .graph-context-card{
2292
+ position:absolute;top:12px;left:12px;z-index:5;
2293
+ background:rgba(255,255,255,.92);backdrop-filter:blur(8px);
2294
+ border:1px solid #f1f5f9;border-radius:8px;
2295
+ padding:8px 14px;font-size:12px;color:#475569;
2296
+ max-width:360px;line-height:1.5;
2297
+ box-shadow:0 1px 4px rgba(0,0,0,.04);
2298
+ pointer-events:none;
2299
+ }
2300
+
2301
+ /* Edge legend */
2302
+ .graph-legend{
2303
+ position:absolute;bottom:14px;left:14px;z-index:5;
2304
+ background:rgba(255,255,255,.92);backdrop-filter:blur(8px);
2305
+ border:1px solid #f1f5f9;border-radius:8px;
2306
+ padding:8px 12px;display:flex;gap:14px;
2307
+ box-shadow:0 1px 4px rgba(0,0,0,.04);
2308
+ pointer-events:none;
2309
+ }
2310
+ .legend-item{display:flex;align-items:center;gap:5px;font-size:11px;color:#64748b}
2311
+
2312
+ /* ═══ Detail drawer (slide-over from right) ═══ */
2313
+ .drawer-backdrop{
2314
+ position:fixed;inset:0;z-index:40;
2315
+ background:rgba(15,23,42,.12);
2316
+ animation:fadeIn .15s ease;
2317
+ }
2318
+ .detail-drawer{
2319
+ position:fixed;top:0;right:0;bottom:0;z-index:50;
2320
+ width:360px;max-width:90vw;background:#ffffff;
2321
+ box-shadow:-4px 0 24px rgba(0,0,0,.08);
2322
+ overflow-y:auto;
2323
+ animation:slideIn .2s ease;
2324
+ }
2325
+ .drawer-close{
2326
+ position:sticky;top:0;right:0;z-index:1;float:right;
2327
+ margin:12px 12px 0 0;
2328
+ background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;
2329
+ width:28px;height:28px;display:flex;align-items:center;justify-content:center;
2330
+ font-size:14px;color:#64748b;cursor:pointer;
2331
+ }
2332
+ .drawer-close:hover{background:#f1f5f9;color:#0f172a}
2333
+ .drawer-body{padding-top:8px}
2334
+ .drawer-header{padding:16px 20px 10px}
2335
+ .drawer-header h2{font-size:17px;font-weight:700;color:#0f172a;margin-bottom:6px;letter-spacing:-.02em}
2336
+
2337
+ @keyframes slideIn{from{transform:translateX(100%)}to{transform:translateX(0)}}
2338
+ @keyframes fadeIn{from{opacity:0}to{opacity:1}}
2339
+
2340
+ /* ═══ Detail sections ═══ */
2341
+ .detail-badges{display:flex;gap:5px;flex-wrap:wrap}
2342
+ .detail-section{padding:12px 20px;border-top:1px solid #f8fafc}
2343
+ .detail-section h3{
2344
+ font-size:10px;font-weight:600;text-transform:uppercase;
2345
+ letter-spacing:.05em;color:#94a3b8;margin-bottom:5px;
2346
+ }
2347
+ .detail-section p{font-size:13px;color:#334155;line-height:1.55}
2348
+ .detail-hint{font-size:11px;color:#94a3b8;margin-top:3px}
2349
+
2350
+ /* ═══ Badges ═══ */
2351
+ .badge{
2352
+ display:inline-flex;align-items:center;padding:2px 7px;
2353
+ border-radius:4px;font-size:10px;font-weight:500;line-height:1.4;
2354
+ }
2355
+ .badge.tier-primary{background:#0f172a;color:#f8fafc}
2356
+ .badge.tier-secondary{background:#475569;color:#f1f5f9}
2357
+ .badge.tier-support{background:#e2e8f0;color:#475569}
2358
+ .badge.mode{background:#eff6ff;color:#1d4ed8}
2359
+ .badge.type{background:#f8fafc;color:#64748b;border:1px solid #f1f5f9}
2360
+
2361
+ /* ═══ Start path ═══ */
2362
+ .start-path{
2363
+ display:block;padding:6px 10px;background:#f8fafc;border:1px solid #f1f5f9;
2364
+ border-radius:6px;font-family:"SF Mono","Fira Code","Cascadia Code",monospace;
2365
+ font-size:11px;color:#1e293b;word-break:break-all;
2366
+ }
2367
+
2368
+ /* ═══ Connection items ═══ */
2369
+ .conn-item{display:flex;align-items:center;gap:6px;padding:2px 0;font-size:12px}
2370
+ .conn-target{color:#3b82f6;cursor:pointer}
2371
+ .conn-target:hover{text-decoration:underline}
2372
+ .conn-conf{margin-left:auto;font-size:10px;color:#cbd5e1}
2373
+ .conn-group-label{
2374
+ font-size:9px;font-weight:600;color:#94a3b8;
2375
+ text-transform:uppercase;letter-spacing:.04em;padding:6px 0 2px;
2376
+ }
2377
+
2378
+ /* ═══ Tags ═══ */
2379
+ .tag{display:inline-flex;padding:2px 7px;background:#f8fafc;border:1px solid #f1f5f9;border-radius:4px;font-size:10px;color:#64748b}
2380
+ .tag-wrap{display:flex;flex-wrap:wrap;gap:3px}
2381
+
2382
+ /* ═══ Aha Summary ═══ */
2383
+ .aha-panel{
2384
+ background:linear-gradient(135deg,#0f172a 0%,#1e293b 100%);
2385
+ color:#f8fafc;border-radius:14px;padding:28px 32px;margin-bottom:20px;
2386
+ }
2387
+ .aha-headline{
2388
+ font-size:20px;font-weight:800;line-height:1.3;letter-spacing:-.03em;
2389
+ margin-bottom:6px;
2390
+ }
2391
+ .aha-sub{
2392
+ font-size:14px;color:#94a3b8;line-height:1.5;margin-bottom:16px;
2393
+ }
2394
+ .aha-bullets{
2395
+ list-style:none;padding:0;margin:0 0 14px;
2396
+ }
2397
+ .aha-bullets li{
2398
+ font-size:13px;color:#cbd5e1;line-height:1.6;
2399
+ padding-left:16px;position:relative;
2400
+ }
2401
+ .aha-bullets li::before{
2402
+ content:"→";position:absolute;left:0;color:#6366f1;font-weight:700;
2403
+ }
2404
+ .aha-warnings{display:flex;flex-direction:column;gap:6px;margin-top:10px}
2405
+ .aha-warning{
2406
+ font-size:12px;color:#fbbf24;background:rgba(251,191,36,.08);
2407
+ border:1px solid rgba(251,191,36,.15);border-radius:6px;
2408
+ padding:6px 12px;line-height:1.4;
2409
+ }
2410
+
2411
+ /* ═══ At-a-Glance ═══ */
2412
+ .glance-panel{
2413
+ background:#ffffff;border:1px solid #e2e8f0;border-radius:12px;
2414
+ padding:16px 20px;margin-bottom:20px;
2415
+ }
2416
+ .glance-title{
2417
+ font-size:10px;font-weight:700;text-transform:uppercase;letter-spacing:.06em;
2418
+ color:#94a3b8;margin-bottom:10px;
2419
+ }
2420
+ .glance-grid{
2421
+ display:grid;grid-template-columns:repeat(auto-fill,minmax(130px,1fr));gap:8px;
2422
+ }
2423
+ .glance-stat{
2424
+ background:#f8fafc;border-radius:8px;padding:8px 12px;
2425
+ }
2426
+ .glance-stat.glance-warn{background:#fef2f2;border:1px solid #fecaca}
2427
+ .glance-stat-label{font-size:10px;color:#94a3b8;font-weight:500;margin-bottom:2px}
2428
+ .glance-stat-value{font-size:14px;font-weight:700;color:#0f172a}
2429
+ .glance-stat-sub{font-size:10px;color:#64748b;margin-top:1px}
2430
+
2431
+ /* ═══ Quick-focus Chips ═══ */
2432
+ .quick-chips{
2433
+ display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px;
2434
+ }
2435
+ .quick-chip{
2436
+ display:inline-flex;align-items:center;gap:4px;
2437
+ padding:6px 14px;border-radius:20px;font-size:12px;font-weight:600;
2438
+ border:1px solid #e2e8f0;background:#ffffff;color:#334155;
2439
+ cursor:pointer;transition:all .15s;font-family:inherit;
2440
+ }
2441
+ .quick-chip:hover{border-color:#6366f1;color:#6366f1;background:#eef2ff}
2442
+ .chip-start{border-color:#16a34a;color:#166534;background:#f0fdf4}
2443
+ .chip-start:hover{background:#dcfce7}
2444
+ .chip-flow{border-color:#6366f1;color:#4338ca;background:#eef2ff}
2445
+ .chip-flow:hover{background:#e0e7ff}
2446
+ .chip-coupling{border-color:#f59e0b;color:#92400e;background:#fffbeb}
2447
+ .chip-coupling:hover{background:#fef3c7}
2448
+ .chip-risk{border-color:#ef4444;color:#991b1b;background:#fef2f2}
2449
+ .chip-risk:hover{background:#fee2e2}
2450
+
2451
+ /* ═══ Section Headers ═══ */
2452
+ .arch-section-hd{margin-bottom:12px}
2453
+ .arch-section-title{
2454
+ font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.05em;
2455
+ color:#0f172a;
2456
+ }
2457
+ .arch-section-micro{
2458
+ font-size:12px;color:#94a3b8;margin-top:2px;
2459
+ }
2460
+
2461
+ /* ═══ Show More Button ═══ */
2462
+ .show-more-btn{
2463
+ display:block;width:100%;padding:8px;margin-top:8px;
2464
+ background:#f8fafc;border:1px solid #e2e8f0;border-radius:8px;
2465
+ font-size:12px;font-weight:500;color:#6366f1;cursor:pointer;
2466
+ font-family:inherit;transition:all .15s;
2467
+ }
2468
+ .show-more-btn:hover{background:#eef2ff;border-color:#6366f1}
2469
+
2470
+ /* ═══ Risk Badges ═══ */
2471
+ .risk-badge{
2472
+ display:inline-flex;align-items:center;padding:1px 6px;
2473
+ border-radius:4px;font-size:9px;font-weight:700;
2474
+ text-transform:uppercase;letter-spacing:.03em;
2475
+ }
2476
+ .risk-contained{background:#fffbeb;color:#d97706}
2477
+ .risk-broad{background:#fff1f2;color:#e11d48}
2478
+ .risk-architectural{background:#fef2f2;color:#dc2626}
2479
+
2480
+ /* ═══ Reading name row ═══ */
2481
+ .arch-reading-name-row{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
2482
+
2483
+ /* ═══ System card header ═══ */
2484
+ .arch-item-header{display:flex;align-items:center;justify-content:space-between;gap:6px}
2485
+
2486
+ /* ═══ Section spacing ═══ */
2487
+ .arch-map section{margin-bottom:28px}
2488
+
2489
+ /* ═══ Architecture Map (structured overview) ═══ */
2490
+ .arch-map-container{
2491
+ flex:1;overflow-y:auto;padding:28px 32px 60px;
2492
+ scroll-behavior:smooth;
2493
+ }
2494
+ .arch-map{
2495
+ max-width:820px;margin:0 auto;
2496
+ }
2497
+
2498
+ .arch-repo-header{
2499
+ display:flex;align-items:center;gap:10px;margin-bottom:20px;
2500
+ }
2501
+ .arch-repo-type{
2502
+ font-size:12px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;
2503
+ color:#6366f1;background:#eef2ff;padding:3px 10px;border-radius:6px;
2504
+ }
2505
+ .arch-repo-count{
2506
+ font-size:12px;color:#94a3b8;
2507
+ }
2508
+
2509
+ .arch-center{
2510
+ background:#0f172a;color:#f8fafc;border-radius:12px;
2511
+ padding:20px 28px;text-align:center;cursor:pointer;
2512
+ box-shadow:0 4px 20px rgba(15,23,42,.15);
2513
+ transition:box-shadow .2s;margin-bottom:16px;
2514
+ }
2515
+ .arch-center:hover{box-shadow:0 6px 28px rgba(15,23,42,.22)}
2516
+ .arch-center-star{font-size:11px;color:#eab308;margin-bottom:4px}
2517
+ .arch-center-name{font-size:20px;font-weight:700;letter-spacing:-.02em}
2518
+ .arch-center-sub{font-size:12px;color:#94a3b8;margin-top:4px;line-height:1.4}
2519
+ .arch-tech-row{display:flex;gap:5px;justify-content:center;flex-wrap:wrap;margin-top:8px}
2520
+ .arch-tech-pill{
2521
+ font-size:10px;padding:2px 8px;border-radius:10px;
2522
+ background:rgba(255,255,255,.12);color:rgba(255,255,255,.7);
2523
+ }
2524
+ .arch-tech-sm .arch-tech-pill{
2525
+ background:#f1f5f9;color:#64748b;
2526
+ }
2527
+
2528
+ .arch-start{
2529
+ background:#f0fdf4;border:1px solid #bbf7d0;border-radius:8px;
2530
+ padding:10px 16px;margin-bottom:24px;
2531
+ display:flex;align-items:center;gap:10px;flex-wrap:wrap;
2532
+ }
2533
+ .arch-start-label{
2534
+ font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;
2535
+ color:#166534;
2536
+ }
2537
+ .arch-start-path{
2538
+ font-family:"SF Mono","Fira Code",monospace;font-size:12px;
2539
+ color:#166534;background:rgba(22,101,52,.08);padding:2px 8px;border-radius:4px;
2540
+ }
2541
+ .arch-start-reason{font-size:11px;color:#4ade80;margin-left:auto}
2542
+
2543
+ /* ═══ Flows ═══ */
2544
+ .arch-flows-section{margin-bottom:28px}
2545
+ .arch-flows-header{
2546
+ font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;
2547
+ color:#94a3b8;padding:0 4px 10px;
2548
+ }
2549
+ .arch-flow-card{
2550
+ background:#ffffff;border:1px solid #f1f5f9;border-radius:10px;
2551
+ padding:14px 18px;margin-bottom:10px;
2552
+ }
2553
+ .arch-flow-title{
2554
+ font-size:13px;font-weight:600;color:#0f172a;
2555
+ display:flex;align-items:center;gap:8px;margin-bottom:10px;
2556
+ }
2557
+ .arch-flow-type-badge{
2558
+ font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;
2559
+ padding:2px 7px;border-radius:4px;
2560
+ background:#f1f5f9;color:#64748b;
2561
+ }
2562
+ .arch-flow-confidence{font-size:10px;color:#94a3b8;margin-left:auto}
2563
+ .arch-conf-high{color:#16a34a}
2564
+ .arch-conf-medium{color:#ca8a04}
2565
+ .arch-conf-low{color:#94a3b8}
2566
+ .arch-flow-steps{display:flex;flex-wrap:wrap;align-items:flex-start;gap:4px}
2567
+ .arch-flow-step{display:flex;align-items:flex-start;gap:4px}
2568
+ .arch-flow-arrow{
2569
+ color:#cbd5e1;font-size:14px;line-height:1;padding-top:3px;flex-shrink:0;
2570
+ }
2571
+ .arch-flow-step-inner{
2572
+ background:#f8fafc;border:1px solid #e2e8f0;border-radius:6px;
2573
+ padding:6px 10px;min-width:0;
2574
+ }
2575
+ .arch-flow-step-label{
2576
+ display:block;font-size:12px;font-weight:600;color:#334155;
2577
+ }
2578
+ .arch-flow-step-desc{
2579
+ display:block;font-size:11px;color:#64748b;line-height:1.4;margin-top:2px;
2580
+ }
2581
+
2582
+ .arch-group{margin-bottom:20px}
2583
+ .arch-group-label{
2584
+ font-size:11px;font-weight:600;text-transform:uppercase;
2585
+ letter-spacing:.05em;color:#94a3b8;
2586
+ padding:0 4px 4px;display:flex;align-items:center;gap:6px;
2587
+ }
2588
+ .arch-zone-icon{font-size:12px;flex-shrink:0}
2589
+ .arch-zone-desc{
2590
+ font-size:12px;color:#64748b;line-height:1.5;
2591
+ padding:0 4px 8px;
2592
+ }
2593
+ .arch-group-count{
2594
+ font-size:10px;color:#cbd5e1;font-weight:400;
2595
+ margin-left:2px;
2596
+ }
2597
+
2598
+ .arch-items{
2599
+ display:grid;
2600
+ grid-template-columns:repeat(auto-fill, minmax(200px, 1fr));
2601
+ gap:8px;
2602
+ }
2603
+
2604
+ .arch-item-card{
2605
+ background:#ffffff;border:1px solid #f1f5f9;border-radius:8px;
2606
+ padding:12px 16px;cursor:pointer;
2607
+ transition:border-color .15s, box-shadow .15s;
2608
+ }
2609
+ .arch-item-card:hover{border-color:#cbd5e1;box-shadow:0 2px 8px rgba(0,0,0,.04)}
2610
+ .arch-item-name{font-size:13px;font-weight:600;color:#0f172a}
2611
+ .arch-item-sub{font-size:11px;color:#64748b;margin-top:3px;line-height:1.4}
2612
+
2613
+ .arch-compact-list{
2614
+ display:flex;flex-wrap:wrap;gap:4px;padding:0 4px;
2615
+ }
2616
+ .arch-member{
2617
+ font-size:12px;font-weight:500;color:#334155;
2618
+ background:#ffffff;border:1px solid #e2e8f0;border-radius:5px;
2619
+ padding:3px 10px;
2620
+ }
2621
+
2622
+ /* ═══ Reading Order ═══ */
2623
+ .arch-reading-section{margin-bottom:28px}
2624
+ .arch-section-header{
2625
+ font-size:11px;font-weight:600;text-transform:uppercase;letter-spacing:.05em;
2626
+ color:#94a3b8;padding:0 4px 10px;
2627
+ }
2628
+ .arch-reading-list{display:flex;flex-direction:column;gap:6px}
2629
+ .arch-reading-step{
2630
+ display:flex;align-items:flex-start;gap:12px;
2631
+ background:#fff;border:1px solid #f1f5f9;border-radius:8px;
2632
+ padding:10px 16px;transition:border-color .15s, box-shadow .15s;
2633
+ }
2634
+ .arch-reading-step:hover{border-color:#cbd5e1;box-shadow:0 2px 8px rgba(0,0,0,.04)}
2635
+ .arch-reading-num{
2636
+ flex-shrink:0;width:24px;height:24px;
2637
+ display:flex;align-items:center;justify-content:center;
2638
+ background:#0f172a;color:#f8fafc;border-radius:50%;
2639
+ font-size:11px;font-weight:700;margin-top:2px;
2640
+ }
2641
+ .arch-reading-body{min-width:0}
2642
+ .arch-reading-name{font-size:13px;font-weight:600;color:#0f172a}
2643
+ .arch-reading-zone{
2644
+ font-size:10px;font-weight:500;color:#6366f1;
2645
+ background:#eef2ff;padding:1px 7px;border-radius:4px;
2646
+ margin-left:8px;
2647
+ }
2648
+ .arch-reading-reason{font-size:12px;color:#64748b;line-height:1.4;margin-top:3px}
2649
+
2650
+ /* ═══ Couplings ═══ */
2651
+ .arch-couplings-section{margin-bottom:28px}
2652
+ .arch-coupling-list{display:flex;flex-direction:column;gap:6px}
2653
+ .arch-coupling-card{
2654
+ background:#fff;border:1px solid #f1f5f9;border-radius:8px;
2655
+ padding:10px 16px;transition:border-color .15s;
2656
+ }
2657
+ .arch-coupling-high{border-left:3px solid #ef4444}
2658
+ .arch-coupling-medium{border-left:3px solid #f59e0b}
2659
+ .arch-coupling-low{border-left:3px solid #94a3b8}
2660
+ .arch-coupling-header{
2661
+ display:flex;align-items:center;gap:6px;flex-wrap:wrap;
2662
+ }
2663
+ .arch-coupling-from,.arch-coupling-to{
2664
+ font-size:13px;font-weight:600;color:#0f172a;
2665
+ }
2666
+ .arch-coupling-arrow{color:#cbd5e1;font-size:13px}
2667
+ .arch-coupling-badge{
2668
+ font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.03em;
2669
+ padding:2px 7px;border-radius:4px;margin-left:auto;
2670
+ }
2671
+ .arch-badge-high{background:#fef2f2;color:#dc2626}
2672
+ .arch-badge-medium{background:#fffbeb;color:#d97706}
2673
+ .arch-badge-low{background:#f8fafc;color:#94a3b8}
2674
+ .arch-coupling-type-badge{
2675
+ font-size:9px;font-weight:500;text-transform:uppercase;letter-spacing:.03em;
2676
+ padding:2px 7px;border-radius:4px;
2677
+ background:#f1f5f9;color:#64748b;
2678
+ }
2679
+ .arch-coupling-reason{font-size:12px;color:#64748b;line-height:1.4;margin-top:4px}
2680
+
2681
+ /* ═══ Change Impact ═══ */
2682
+ .impact-section{border-top:1px solid #f1f5f9;padding-top:16px;margin-top:8px}
2683
+ .impact-blast-badge{
2684
+ display:flex;align-items:center;gap:12px;
2685
+ border:1px solid;border-radius:10px;padding:12px 16px;margin:8px 0 12px;
2686
+ }
2687
+ .impact-blast-score{display:flex;align-items:baseline;gap:2px}
2688
+ .impact-blast-num{font-size:28px;font-weight:800;line-height:1}
2689
+ .impact-blast-max{font-size:12px;color:#94a3b8;font-weight:500}
2690
+ .impact-blast-label{display:flex;flex-direction:column;gap:2px}
2691
+ .impact-blast-level{
2692
+ font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.04em;
2693
+ }
2694
+ .impact-blast-conf{font-size:10px;color:#94a3b8}
2695
+ .impact-summary{font-size:12px;color:#475569;line-height:1.5;margin-bottom:14px}
2696
+ .impact-group{margin-bottom:12px}
2697
+ .impact-group-label{
2698
+ font-size:10px;font-weight:600;text-transform:uppercase;letter-spacing:.04em;
2699
+ color:#94a3b8;padding:0 0 6px;display:flex;align-items:center;gap:6px;
2700
+ }
2701
+ .impact-group-count{
2702
+ font-size:9px;background:#f1f5f9;color:#64748b;padding:1px 6px;border-radius:8px;
2703
+ }
2704
+ .impact-row{
2705
+ padding:8px 10px;border:1px solid #f1f5f9;border-radius:6px;
2706
+ margin-bottom:4px;cursor:pointer;transition:border-color .15s;
2707
+ }
2708
+ .impact-row:hover{border-color:#cbd5e1}
2709
+ .impact-row-header{display:flex;align-items:center;gap:6px;flex-wrap:wrap}
2710
+ .impact-row-name{font-size:12px;font-weight:600;color:#0f172a}
2711
+ .impact-risk-badge{
2712
+ font-size:9px;font-weight:600;text-transform:uppercase;letter-spacing:.03em;
2713
+ padding:1px 6px;border-radius:4px;margin-left:auto;
2714
+ }
2715
+ .impact-type-badge{
2716
+ font-size:9px;font-weight:500;text-transform:uppercase;letter-spacing:.03em;
2717
+ padding:1px 6px;border-radius:4px;background:#f1f5f9;color:#64748b;
2718
+ }
2719
+ .impact-row-reason{font-size:11px;color:#64748b;line-height:1.4;margin-top:3px}
2720
+ .impact-row-via{font-size:10px;color:#a78bfa;margin-top:2px;font-style:italic}
2721
+
2722
+ /* ═══ React Flow overrides ═══ */
2723
+ .react-flow__panel{font-family:inherit!important}
2724
+ .react-flow__controls{opacity:.5;transition:opacity .2s}
2725
+ .react-flow__controls:hover{opacity:1}
2726
+ .react-flow__edge-textbg{rx:4}
2727
+ .react-flow__edge:hover .react-flow__edge-path{stroke-opacity:1!important;stroke-width:2.5px!important}
2728
+
2729
+ /* ═══════════════════════════════════════════════════════════════════
2730
+ ARCHITECTURE CANVAS
2731
+ ═══════════════════════════════════════════════════════════════════ */
2732
+
2733
+ /* -- header view toggle -- */
2734
+ .header-view-toggle{display:flex;gap:2px;margin-left:auto;background:#f1f5f9;border-radius:8px;padding:2px}
2735
+ .hv-btn{
2736
+ border:none;background:transparent;color:#64748b;font-size:11px;font-weight:600;
2737
+ padding:4px 12px;border-radius:6px;cursor:pointer;transition:all .15s;
2738
+ font-family:inherit;letter-spacing:.01em;
2739
+ }
2740
+ .hv-btn:hover{color:#0f172a;background:rgba(15,23,42,.04)}
2741
+ .hv-active{background:#ffffff!important;color:#0f172a!important;box-shadow:0 1px 3px rgba(0,0,0,.08)}
2742
+ .cmd-trigger{
2743
+ border:1px solid #e2e8f0;background:#f8fafc;color:#94a3b8;width:28px;height:28px;
2744
+ border-radius:6px;cursor:pointer;display:flex;align-items:center;justify-content:center;
2745
+ font-size:13px;font-weight:600;transition:all .15s;font-family:inherit;
2746
+ }
2747
+ .cmd-trigger:hover{border-color:#cbd5e1;color:#64748b}
2748
+ .cmd-trigger-slash{font-size:13px}
2749
+
2750
+ /* -- canvas container -- */
2751
+ .canvas-container{flex:1;overflow:hidden;display:flex;flex-direction:column}
2752
+
2753
+ /* -- canvas root -- */
2754
+ .cv-root{display:flex;flex-direction:column;height:100%;background:#fafbfc}
2755
+ .cv-empty{display:flex;align-items:center;justify-content:center;height:100%;color:#64748b;font-size:14px;background:#fafbfc}
2756
+
2757
+ /* -- aha strip -- */
2758
+ .cv-aha-strip{
2759
+ padding:8px 20px;background:#ffffff;
2760
+ border-bottom:1px solid #e2e8f0;display:flex;align-items:center;gap:16px;flex-shrink:0;
2761
+ }
2762
+ .cv-aha-headline{color:#0f172a;font-weight:700;font-size:14px;letter-spacing:-.02em}
2763
+ .cv-aha-sub{color:#64748b;font-size:12px}
2764
+
2765
+ /* -- toolbar -- */
2766
+ .cv-toolbar{
2767
+ display:flex;align-items:center;gap:12px;padding:6px 16px;
2768
+ background:#ffffff;border-bottom:1px solid #e2e8f0;flex-shrink:0;flex-wrap:wrap;
2769
+ }
2770
+
2771
+ /* -- breadcrumbs -- */
2772
+ .cv-breadcrumbs{display:flex;align-items:center;gap:4px}
2773
+ .cv-crumb{
2774
+ color:#94a3b8;font-size:12px;cursor:pointer;padding:3px 8px;border-radius:4px;
2775
+ transition:all .15s;font-weight:500;
2776
+ }
2777
+ .cv-crumb:hover{color:#0f172a;background:rgba(15,23,42,.04)}
2778
+ .cv-crumb-active{color:#0f172a;font-weight:600;cursor:default}
2779
+ .cv-crumb-active:hover{background:transparent}
2780
+ .cv-crumb-sep{color:#cbd5e1;font-size:12px}
2781
+
2782
+ /* -- mode toggle -- */
2783
+ .cv-mode-toggle{display:flex;gap:2px;background:#f1f5f9;border-radius:8px;padding:2px}
2784
+ .cv-mode-btn{
2785
+ border:none;background:transparent;color:#64748b;font-size:11px;font-weight:600;
2786
+ padding:5px 14px;border-radius:6px;cursor:pointer;transition:all .15s;
2787
+ font-family:inherit;display:flex;align-items:center;gap:5px;
2788
+ }
2789
+ .cv-mode-btn:hover{color:#0f172a;background:rgba(15,23,42,.04)}
2790
+ .cv-mode-active{background:#ffffff!important;color:#0f172a!important;box-shadow:0 1px 3px rgba(0,0,0,.08)}
2791
+ .cv-mode-icon{font-size:12px}
2792
+
2793
+ /* -- flow selector -- */
2794
+ .cv-flow-selector{display:flex;align-items:center;gap:8px}
2795
+ .cv-flow-select{
2796
+ background:#ffffff;border:1px solid #e2e8f0;color:#0f172a;font-size:11px;
2797
+ padding:4px 10px;border-radius:6px;font-family:inherit;cursor:pointer;
2798
+ }
2799
+ .cv-flow-progress{color:#7c3aed;font-size:11px;font-weight:600}
2800
+
2801
+ /* -- impact selector -- */
2802
+ .cv-impact-selector{display:flex;align-items:center;gap:8px}
2803
+ .cv-impact-select{
2804
+ background:#ffffff;border:1px solid #e2e8f0;color:#0f172a;font-size:11px;
2805
+ padding:4px 10px;border-radius:6px;font-family:inherit;cursor:pointer;
2806
+ }
2807
+ .cv-impact-badge{font-size:11px;font-weight:600;padding:3px 10px;border-radius:6px}
2808
+
2809
+ /* -- body layout -- */
2810
+ .cv-body{display:flex;flex:1;overflow:hidden}
2811
+ .cv-canvas{flex:1;position:relative;background:#fafbfc}
2812
+ .cv-canvas .react-flow{background:#fafbfc!important}
2813
+ .cv-canvas .react-flow__controls{
2814
+ background:#ffffff!important;border:1px solid #e2e8f0!important;
2815
+ border-radius:8px!important;box-shadow:0 1px 4px rgba(0,0,0,.06)!important;
2816
+ }
2817
+ .cv-canvas .react-flow__controls button{
2818
+ background:#ffffff!important;color:#64748b!important;border-color:#e2e8f0!important;
2819
+ }
2820
+ .cv-canvas .react-flow__controls button:hover{background:#f1f5f9!important;color:#0f172a!important}
2821
+ .cv-canvas .react-flow__controls svg{fill:#64748b!important}
2822
+ .cv-canvas .react-flow__controls button:hover svg{fill:#0f172a!important}
2823
+ .cv-canvas .react-flow__minimap{
2824
+ background:#ffffff!important;border:1px solid #e2e8f0!important;border-radius:8px!important;
2825
+ box-shadow:0 1px 4px rgba(0,0,0,.06)!important;
2826
+ }
2827
+
2828
+ /* -- detail pane (right side) -- */
2829
+ .cv-detail-pane{
2830
+ width:380px;overflow-y:auto;background:#ffffff;border-left:1px solid #e2e8f0;
2831
+ flex-shrink:0;
2832
+ }
2833
+ .cv-detail{padding:16px}
2834
+ .cv-detail-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:8px}
2835
+ .cv-detail-name{color:#0f172a;font-size:16px;font-weight:700;letter-spacing:-.02em;margin:0}
2836
+ .cv-detail-close{
2837
+ background:transparent;border:none;color:#94a3b8;font-size:16px;cursor:pointer;
2838
+ padding:4px;border-radius:4px;transition:color .15s;
2839
+ }
2840
+ .cv-detail-close:hover{color:#0f172a}
2841
+ .cv-detail-badges{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:12px}
2842
+ .cv-badge{
2843
+ font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px;letter-spacing:.02em;
2844
+ text-transform:uppercase;
2845
+ }
2846
+ .cv-tier-primary{background:rgba(59,130,246,.1);color:#2563eb}
2847
+ .cv-tier-secondary{background:rgba(99,102,241,.1);color:#4f46e5}
2848
+ .cv-tier-support{background:#f1f5f9;color:#64748b}
2849
+ .cv-type{background:#f1f5f9;color:#64748b}
2850
+ .cv-center{background:rgba(234,179,8,.1);color:#a16207}
2851
+ .cv-zone-badge{background:rgba(99,102,241,.08);color:#4f46e5}
2852
+
2853
+ /* -- detail tabs -- */
2854
+ .cv-detail-tabs{display:flex;gap:2px;margin-bottom:12px;background:#f1f5f9;border-radius:6px;padding:2px}
2855
+ .cv-tab-btn{
2856
+ border:none;background:transparent;color:#64748b;font-size:11px;font-weight:600;
2857
+ padding:5px 10px;border-radius:4px;cursor:pointer;transition:all .15s;
2858
+ font-family:inherit;display:flex;align-items:center;gap:4px;
2859
+ }
2860
+ .cv-tab-btn:hover{color:#0f172a}
2861
+ .cv-tab-active{background:#ffffff!important;color:#0f172a!important;box-shadow:0 1px 2px rgba(0,0,0,.06)}
2862
+ .cv-tab-count{
2863
+ font-size:9px;background:rgba(15,23,42,.06);padding:1px 5px;border-radius:3px;
2864
+ }
2865
+
2866
+ /* -- detail body -- */
2867
+ .cv-detail-body{color:#334155}
2868
+ .cv-detail-section{margin-bottom:16px}
2869
+ .cv-detail-section h4{color:#94a3b8;font-size:10px;text-transform:uppercase;letter-spacing:.05em;margin-bottom:6px;font-weight:600}
2870
+ .cv-path{
2871
+ display:block;font-size:11px;color:#2563eb;background:rgba(59,130,246,.06);
2872
+ padding:6px 10px;border-radius:6px;font-family:"SF Mono",Monaco,Consolas,monospace;
2873
+ }
2874
+ .cv-hint{font-size:12px;color:#64748b;line-height:1.5}
2875
+ .cv-desc{font-size:12px;color:#334155;line-height:1.6}
2876
+ .cv-tags{display:flex;flex-wrap:wrap;gap:4px}
2877
+ .cv-tag{
2878
+ font-size:10px;padding:2px 8px;border-radius:4px;background:#f1f5f9;
2879
+ color:#64748b;
2880
+ }
2881
+ .cv-conn-item{
2882
+ display:flex;align-items:center;gap:8px;padding:5px 8px;border-radius:4px;
2883
+ cursor:pointer;transition:background .15s;margin-bottom:2px;
2884
+ }
2885
+ .cv-conn-item:hover{background:#f8fafc}
2886
+ .cv-conn-name{color:#0f172a;font-size:12px;font-weight:500}
2887
+ .cv-conn-rel{color:#94a3b8;font-size:10px}
2888
+
2889
+ /* -- couplings tab -- */
2890
+ .cv-coupling{padding:10px;border-radius:8px;margin-bottom:8px;background:#fafbfc;border:1px solid #e2e8f0}
2891
+ .cv-coupling-high{border-color:rgba(239,68,68,.3)}
2892
+ .cv-coupling-medium{border-color:rgba(234,179,8,.3)}
2893
+ .cv-coupling-pair{display:flex;align-items:center;gap:6px;font-size:13px;color:#0f172a;font-weight:600}
2894
+ .cv-coupling-arrow{color:#94a3b8;font-size:12px}
2895
+ .cv-coupling-meta{display:flex;gap:6px;margin-top:4px}
2896
+ .cv-coupling-str{font-size:10px;font-weight:600;padding:1px 6px;border-radius:3px}
2897
+ .cv-str-high{color:#dc2626;background:rgba(239,68,68,.08)}
2898
+ .cv-str-medium{color:#ca8a04;background:rgba(234,179,8,.08)}
2899
+ .cv-str-low{color:#64748b;background:#f1f5f9}
2900
+ .cv-coupling-type{font-size:10px;color:#94a3b8}
2901
+ .cv-coupling-reason{font-size:11px;color:#64748b;margin-top:4px;line-height:1.5}
2902
+
2903
+ /* -- impact tab -- */
2904
+ .cv-blast-badge{
2905
+ display:flex;align-items:baseline;gap:4px;padding:10px 14px;border-radius:8px;
2906
+ border:1px solid;margin-bottom:10px;
2907
+ }
2908
+ .cv-blast-score{font-size:28px;font-weight:800;letter-spacing:-.03em}
2909
+ .cv-blast-max{font-size:14px;opacity:.5}
2910
+ .cv-blast-level{font-size:12px;font-weight:700;text-transform:uppercase;letter-spacing:.03em;margin-left:8px}
2911
+ .cv-impact-summary{font-size:12px;color:#64748b;line-height:1.5;margin-bottom:12px}
2912
+ .cv-impact-row{
2913
+ padding:8px 10px;border-radius:6px;cursor:pointer;margin-bottom:4px;
2914
+ border:1px solid #e2e8f0;transition:background .15s;
2915
+ }
2916
+ .cv-impact-row:hover{background:#f8fafc}
2917
+ .cv-impact-name{color:#0f172a;font-size:12px;font-weight:600}
2918
+ .cv-impact-risk{font-size:10px;font-weight:600;margin-left:6px}
2919
+ .cv-impact-reason{font-size:11px;color:#64748b;line-height:1.4;margin-top:3px}
2920
+ .cv-impact-via{font-size:10px;color:#7c3aed;font-style:italic;display:block;margin-top:2px}
2921
+
2922
+ /* -- flows tab -- */
2923
+ .cv-flow-card{padding:10px;background:#fafbfc;border-radius:8px;border:1px solid #e2e8f0;margin-bottom:8px}
2924
+ .cv-flow-title{color:#0f172a;font-size:13px;font-weight:600;margin-bottom:6px}
2925
+ .cv-flow-steps{display:flex;flex-wrap:wrap;align-items:center;gap:2px}
2926
+ .cv-flow-step{color:#334155;font-size:12px}
2927
+ .cv-flow-arrow{color:#7c3aed;margin:0 4px;font-size:12px}
2928
+
2929
+ /* ═══ ZONE NODE ═══ */
2930
+ .cv-zone{
2931
+ background:#ffffff;
2932
+ border:1.5px solid #e2e8f0;border-radius:16px;
2933
+ padding:18px 24px;min-width:240px;max-width:320px;cursor:pointer;
2934
+ transition:all .25s;box-shadow:0 2px 8px rgba(0,0,0,.05);
2935
+ }
2936
+ .cv-zone:hover{border-color:#cbd5e1;box-shadow:0 4px 16px rgba(0,0,0,.08)}
2937
+ .cv-zone-start{border-color:#22c55e!important;box-shadow:0 0 0 3px rgba(34,197,94,.12),0 2px 8px rgba(0,0,0,.05)!important}
2938
+ .cv-zone-top{display:flex;align-items:center;gap:8px;margin-bottom:8px}
2939
+ .cv-zone-icon{font-size:16px;color:#64748b}
2940
+ .cv-zone-name{color:#0f172a;font-size:15px;font-weight:700;letter-spacing:-.02em;flex:1}
2941
+ .cv-zone-count{
2942
+ font-size:11px;color:#64748b;background:#f1f5f9;
2943
+ padding:2px 8px;border-radius:10px;font-weight:600;
2944
+ }
2945
+ .cv-zone-desc{color:#64748b;font-size:11px;line-height:1.5;max-height:36px;overflow:hidden}
2946
+ .cv-zone-bottom{display:flex;gap:8px;margin-top:8px}
2947
+ .cv-zone-risk{font-size:10px;font-weight:600;padding:2px 8px;border-radius:4px}
2948
+ .cv-zone-fstep{
2949
+ font-size:10px;font-weight:600;color:#7c3aed;
2950
+ background:rgba(124,58,237,.08);padding:2px 8px;border-radius:4px;
2951
+ }
2952
+
2953
+ /* ═══ SYSTEM NODE ═══ */
2954
+ .cv-sys{
2955
+ background:#ffffff;border:1.5px solid #e2e8f0;border-left:3px solid #94a3b8;
2956
+ border-radius:10px;padding:12px 18px;min-width:160px;max-width:240px;
2957
+ cursor:pointer;transition:all .2s;box-shadow:0 1px 4px rgba(0,0,0,.04);
2958
+ }
2959
+ .cv-sys:hover{border-color:#cbd5e1;box-shadow:0 4px 12px rgba(0,0,0,.08)}
2960
+ .cv-sys-selected{border-color:#6366f1!important;box-shadow:0 0 0 3px rgba(99,102,241,.15),0 2px 8px rgba(0,0,0,.06)!important}
2961
+ .cv-sys-name{color:#0f172a;font-size:13px;font-weight:700;letter-spacing:-.01em}
2962
+ .cv-sys-meta{display:flex;align-items:center;gap:6px;margin-top:4px}
2963
+ .cv-sys-type{color:#94a3b8;font-size:10px;text-transform:uppercase;letter-spacing:.02em}
2964
+ .cv-sys-risk{font-size:9px;font-weight:600;padding:1px 6px;border-radius:3px}
2965
+ .cv-sys-desc{color:#64748b;font-size:10px;margin-top:4px;line-height:1.4;max-height:28px;overflow:hidden}
2966
+
2967
+ /* ═══ ADJACENT ZONE NODE ═══ */
2968
+ .cv-adj-zone{
2969
+ background:#f8fafc;border:1px dashed #cbd5e1;border-radius:10px;
2970
+ padding:10px 16px;display:flex;align-items:center;gap:6px;cursor:pointer;
2971
+ transition:border-color .2s;min-width:120px;
2972
+ }
2973
+ .cv-adj-zone:hover{border-color:#6366f1}
2974
+ .cv-adj-icon{color:#94a3b8;font-size:14px}
2975
+ .cv-adj-name{color:#64748b;font-size:12px;font-weight:600}
2976
+
2977
+ /* ═══ DIM + IMPACT STATES ═══ */
2978
+ .cv-dimmed{opacity:.18!important;filter:grayscale(.5);pointer-events:none}
2979
+ .cv-impact-center{
2980
+ border-color:#ef4444!important;
2981
+ box-shadow:0 0 0 4px rgba(239,68,68,.15),0 2px 12px rgba(239,68,68,.1)!important;
2982
+ animation:cv-ripple 2s ease-out infinite;
2983
+ }
2984
+ .cv-impact-direct{
2985
+ border-color:#f97316!important;
2986
+ box-shadow:0 0 0 3px rgba(249,115,22,.15),0 2px 8px rgba(249,115,22,.08)!important;
2987
+ }
2988
+ .cv-impact-indirect{
2989
+ border-color:#eab308!important;
2990
+ box-shadow:0 0 0 2px rgba(234,179,8,.12)!important;
2991
+ }
2992
+ .cv-flow-active{
2993
+ border-color:#7c3aed!important;
2994
+ box-shadow:0 0 0 3px rgba(124,58,237,.15),0 2px 12px rgba(124,58,237,.08)!important;
2995
+ }
2996
+
2997
+ @keyframes cv-ripple{
2998
+ 0%{box-shadow:0 0 0 4px rgba(239,68,68,.15),0 2px 12px rgba(239,68,68,.1)}
2999
+ 50%{box-shadow:0 0 0 8px rgba(239,68,68,.08),0 4px 20px rgba(239,68,68,.06)}
3000
+ 100%{box-shadow:0 0 0 4px rgba(239,68,68,.15),0 2px 12px rgba(239,68,68,.1)}
3001
+ }
3002
+
3003
+ /* ═══ COMMAND BAR ═══ */
3004
+ .cmd-backdrop{
3005
+ position:fixed;inset:0;background:rgba(15,23,42,.3);z-index:9998;
3006
+ backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);
3007
+ }
3008
+ .cmd-bar{
3009
+ position:fixed;top:15%;left:50%;transform:translateX(-50%);
3010
+ width:560px;max-width:90vw;background:#ffffff;border:1px solid #e2e8f0;
3011
+ border-radius:16px;box-shadow:0 24px 64px rgba(0,0,0,.15);z-index:9999;
3012
+ overflow:hidden;
3013
+ }
3014
+ .cmd-input-row{display:flex;align-items:center;padding:12px 16px;border-bottom:1px solid #f1f5f9}
3015
+ .cmd-slash{color:#94a3b8;font-size:16px;font-weight:700;margin-right:10px}
3016
+ .cmd-input{
3017
+ flex:1;background:transparent;border:none;outline:none;color:#0f172a;
3018
+ font-size:15px;font-family:inherit;
3019
+ }
3020
+ .cmd-input::placeholder{color:#cbd5e1}
3021
+ .cmd-suggestions{max-height:360px;overflow-y:auto;padding:4px}
3022
+ .cmd-item{
3023
+ display:flex;align-items:center;gap:10px;padding:10px 14px;
3024
+ border-radius:8px;cursor:pointer;transition:background .1s;
3025
+ }
3026
+ .cmd-item:hover,.cmd-item-active{background:#f8fafc}
3027
+ .cmd-item-icon{color:#94a3b8;font-size:14px;width:20px;text-align:center}
3028
+ .cmd-item-text{flex:1;display:flex;flex-direction:column}
3029
+ .cmd-item-label{color:#0f172a;font-size:13px;font-weight:500}
3030
+ .cmd-item-sub{color:#94a3b8;font-size:11px}
3031
+ .cmd-item-type{
3032
+ color:#94a3b8;font-size:9px;text-transform:uppercase;font-weight:600;
3033
+ letter-spacing:.05em;padding:2px 6px;background:#f1f5f9;border-radius:3px;
3034
+ }
3035
+ .cmd-footer{
3036
+ display:flex;gap:16px;padding:8px 16px;border-top:1px solid #f1f5f9;
3037
+ color:#cbd5e1;font-size:10px;justify-content:center;
3038
+ }
3039
+ `;
3040
+ function buildAppPage(data) {
3041
+ const css = appCss();
3042
+ const xyflowCssCandidates = [
3043
+ path.join(__dirname, "..", "..", "node_modules", "@xyflow", "react", "dist", "style.css"),
3044
+ path.join(__dirname, "xyflow-style.css"),
3045
+ ];
3046
+ let xyflowCss = "";
3047
+ for (const candidate of xyflowCssCandidates) {
3048
+ try {
3049
+ xyflowCss = fs.readFileSync(candidate, "utf-8");
3050
+ break;
3051
+ }
3052
+ catch { }
3053
+ }
3054
+ if (!xyflowCss) {
3055
+ try {
3056
+ const alt = require.resolve("@xyflow/react/dist/style.css");
3057
+ xyflowCss = fs.readFileSync(alt, "utf-8");
3058
+ }
3059
+ catch {
3060
+ console.error(" Warning: could not read @xyflow/react CSS");
3061
+ }
3062
+ }
3063
+ const dataJson = JSON.stringify(data).replace(/<\//g, "<\\/");
3064
+ const a = data.analysis;
3065
+ return `<!DOCTYPE html>
3066
+ <html lang="en">
3067
+ <head>
3068
+ <meta charset="utf-8" />
3069
+ <meta name="viewport" content="width=device-width, initial-scale=1" />
3070
+ <title>Memor \u2014 ${esc(a.repoName)}</title>
3071
+ <link rel="icon" type="image/svg+xml" href="data:image/svg+xml,%3Csvg width='179' height='179' viewBox='0 0 179 179' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg clip-path='url(%23c)'%3E%3Cmask id='a' fill='%23fff'%3E%3Crect x='1' width='179' height='179' rx='6'/%3E%3C/mask%3E%3Crect x='1' width='179' height='179' rx='6' stroke='%23000' stroke-width='20' mask='url(%23a)'/%3E%3Cmask id='b' fill='%23fff'%3E%3Crect x='1' width='135' height='135' rx='6'/%3E%3C/mask%3E%3Crect x='1' width='135' height='135' rx='6' stroke='%23000' stroke-width='20' mask='url(%23b)'/%3E%3Cmask id='d' fill='%23fff'%3E%3Crect x='1' width='94' height='94' rx='6'/%3E%3C/mask%3E%3Crect x='1' width='94' height='94' rx='6' stroke='%23000' stroke-width='20' mask='url(%23d)'/%3E%3Cmask id='e' fill='%23fff'%3E%3Crect x='1' width='54' height='54' rx='6'/%3E%3C/mask%3E%3Crect x='1' width='54' height='54' rx='6' stroke='%23000' stroke-width='20' mask='url(%23e)'/%3E%3C/g%3E%3Cdefs%3E%3CclipPath id='c'%3E%3Crect width='179' height='179' rx='17' fill='%23fff'/%3E%3C/clipPath%3E%3C/defs%3E%3C/svg%3E" />
3072
+ <link rel="preconnect" href="https://fonts.googleapis.com" />
3073
+ <link href="https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600;700&display=swap" rel="stylesheet" />
3074
+ <link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/devicons/devicon@v2.15.1/devicon.min.css" />
3075
+ <style>${xyflowCss}</style>
3076
+ <style>${css}</style>
3077
+ </head>
3078
+ <body>
3079
+ <div id="root"></div>
3080
+ <script>window.__MEMOR__=${dataJson};</script>
3081
+ <script src="/app-bundle.js"></script>
3082
+ </body>
3083
+ </html>`;
3084
+ }
3085
+ //# sourceMappingURL=buildAppPage.js.map