@tyroneross/navgator 0.2.0 → 0.2.1

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 (338) hide show
  1. package/dist/cli/index.js +1 -1
  2. package/package.json +1 -1
  3. package/web/.next/standalone/web/.next/BUILD_ID +1 -0
  4. package/web/.next/standalone/web/.next/app-path-routes-manifest.json +13 -0
  5. package/web/.next/standalone/web/.next/build-manifest.json +20 -0
  6. package/web/.next/standalone/web/.next/package.json +1 -0
  7. package/web/.next/standalone/web/.next/prerender-manifest.json +88 -0
  8. package/web/.next/standalone/web/.next/required-server-files.json +317 -0
  9. package/web/.next/standalone/web/.next/routes-manifest.json +110 -0
  10. package/web/.next/standalone/web/.next/server/app/_global-error/page/app-paths-manifest.json +3 -0
  11. package/web/.next/standalone/web/.next/server/app/_global-error/page/build-manifest.json +17 -0
  12. package/web/.next/standalone/web/.next/server/app/_global-error/page/next-font-manifest.json +6 -0
  13. package/web/.next/standalone/web/.next/server/app/_global-error/page/react-loadable-manifest.json +1 -0
  14. package/web/.next/standalone/web/.next/server/app/_global-error/page/server-reference-manifest.json +4 -0
  15. package/web/.next/standalone/web/.next/server/app/_global-error/page.js +10 -0
  16. package/web/.next/standalone/web/.next/server/app/_global-error/page.js.map +5 -0
  17. package/web/.next/standalone/web/.next/server/app/_global-error/page.js.nft.json +1 -0
  18. package/web/.next/standalone/web/.next/server/app/_global-error/page_client-reference-manifest.js +2 -0
  19. package/web/.next/standalone/web/.next/server/app/_global-error.html +2 -0
  20. package/web/.next/standalone/web/.next/server/app/_global-error.meta +15 -0
  21. package/web/.next/standalone/web/.next/server/app/_global-error.rsc +12 -0
  22. package/web/.next/standalone/web/.next/server/app/_global-error.segments/__PAGE__.segment.rsc +5 -0
  23. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_full.segment.rsc +12 -0
  24. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_head.segment.rsc +7 -0
  25. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_index.segment.rsc +4 -0
  26. package/web/.next/standalone/web/.next/server/app/_global-error.segments/_tree.segment.rsc +1 -0
  27. package/web/.next/standalone/web/.next/server/app/_not-found/page/app-paths-manifest.json +3 -0
  28. package/web/.next/standalone/web/.next/server/app/_not-found/page/build-manifest.json +17 -0
  29. package/web/.next/standalone/web/.next/server/app/_not-found/page/next-font-manifest.json +11 -0
  30. package/web/.next/standalone/web/.next/server/app/_not-found/page/react-loadable-manifest.json +1 -0
  31. package/web/.next/standalone/web/.next/server/app/_not-found/page/server-reference-manifest.json +4 -0
  32. package/web/.next/standalone/web/.next/server/app/_not-found/page.js +13 -0
  33. package/web/.next/standalone/web/.next/server/app/_not-found/page.js.map +5 -0
  34. package/web/.next/standalone/web/.next/server/app/_not-found/page.js.nft.json +1 -0
  35. package/web/.next/standalone/web/.next/server/app/_not-found/page_client-reference-manifest.js +2 -0
  36. package/web/.next/standalone/web/.next/server/app/_not-found.html +1 -0
  37. package/web/.next/standalone/web/.next/server/app/_not-found.meta +16 -0
  38. package/web/.next/standalone/web/.next/server/app/_not-found.rsc +17 -0
  39. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_full.segment.rsc +17 -0
  40. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_head.segment.rsc +8 -0
  41. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_index.segment.rsc +8 -0
  42. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found/__PAGE__.segment.rsc +5 -0
  43. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_not-found.segment.rsc +4 -0
  44. package/web/.next/standalone/web/.next/server/app/_not-found.segments/_tree.segment.rsc +3 -0
  45. package/web/.next/standalone/web/.next/server/app/api/components/route/app-paths-manifest.json +3 -0
  46. package/web/.next/standalone/web/.next/server/app/api/components/route/build-manifest.json +11 -0
  47. package/web/.next/standalone/web/.next/server/app/api/components/route/server-reference-manifest.json +4 -0
  48. package/web/.next/standalone/web/.next/server/app/api/components/route.js +6 -0
  49. package/web/.next/standalone/web/.next/server/app/api/components/route.js.map +5 -0
  50. package/web/.next/standalone/web/.next/server/app/api/components/route.js.nft.json +1 -0
  51. package/web/.next/standalone/web/.next/server/app/api/components/route_client-reference-manifest.js +2 -0
  52. package/web/.next/standalone/web/.next/server/app/api/connections/route/app-paths-manifest.json +3 -0
  53. package/web/.next/standalone/web/.next/server/app/api/connections/route/build-manifest.json +11 -0
  54. package/web/.next/standalone/web/.next/server/app/api/connections/route/server-reference-manifest.json +4 -0
  55. package/web/.next/standalone/web/.next/server/app/api/connections/route.js +6 -0
  56. package/web/.next/standalone/web/.next/server/app/api/connections/route.js.map +5 -0
  57. package/web/.next/standalone/web/.next/server/app/api/connections/route.js.nft.json +1 -0
  58. package/web/.next/standalone/web/.next/server/app/api/connections/route_client-reference-manifest.js +2 -0
  59. package/web/.next/standalone/web/.next/server/app/api/graph/route/app-paths-manifest.json +3 -0
  60. package/web/.next/standalone/web/.next/server/app/api/graph/route/build-manifest.json +11 -0
  61. package/web/.next/standalone/web/.next/server/app/api/graph/route/server-reference-manifest.json +4 -0
  62. package/web/.next/standalone/web/.next/server/app/api/graph/route.js +6 -0
  63. package/web/.next/standalone/web/.next/server/app/api/graph/route.js.map +5 -0
  64. package/web/.next/standalone/web/.next/server/app/api/graph/route.js.nft.json +1 -0
  65. package/web/.next/standalone/web/.next/server/app/api/graph/route_client-reference-manifest.js +2 -0
  66. package/web/.next/standalone/web/.next/server/app/api/projects/route/app-paths-manifest.json +3 -0
  67. package/web/.next/standalone/web/.next/server/app/api/projects/route/build-manifest.json +11 -0
  68. package/web/.next/standalone/web/.next/server/app/api/projects/route/server-reference-manifest.json +4 -0
  69. package/web/.next/standalone/web/.next/server/app/api/projects/route.js +6 -0
  70. package/web/.next/standalone/web/.next/server/app/api/projects/route.js.map +5 -0
  71. package/web/.next/standalone/web/.next/server/app/api/projects/route.js.nft.json +1 -0
  72. package/web/.next/standalone/web/.next/server/app/api/projects/route_client-reference-manifest.js +2 -0
  73. package/web/.next/standalone/web/.next/server/app/api/prompts/route/app-paths-manifest.json +3 -0
  74. package/web/.next/standalone/web/.next/server/app/api/prompts/route/build-manifest.json +11 -0
  75. package/web/.next/standalone/web/.next/server/app/api/prompts/route/server-reference-manifest.json +4 -0
  76. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js +7 -0
  77. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js.map +5 -0
  78. package/web/.next/standalone/web/.next/server/app/api/prompts/route.js.nft.json +1 -0
  79. package/web/.next/standalone/web/.next/server/app/api/prompts/route_client-reference-manifest.js +2 -0
  80. package/web/.next/standalone/web/.next/server/app/api/scan/route/app-paths-manifest.json +3 -0
  81. package/web/.next/standalone/web/.next/server/app/api/scan/route/build-manifest.json +11 -0
  82. package/web/.next/standalone/web/.next/server/app/api/scan/route/server-reference-manifest.json +4 -0
  83. package/web/.next/standalone/web/.next/server/app/api/scan/route.js +6 -0
  84. package/web/.next/standalone/web/.next/server/app/api/scan/route.js.map +5 -0
  85. package/web/.next/standalone/web/.next/server/app/api/scan/route.js.nft.json +1 -0
  86. package/web/.next/standalone/web/.next/server/app/api/scan/route_client-reference-manifest.js +2 -0
  87. package/web/.next/standalone/web/.next/server/app/api/settings/route/app-paths-manifest.json +3 -0
  88. package/web/.next/standalone/web/.next/server/app/api/settings/route/build-manifest.json +11 -0
  89. package/web/.next/standalone/web/.next/server/app/api/settings/route/server-reference-manifest.json +4 -0
  90. package/web/.next/standalone/web/.next/server/app/api/settings/route.js +6 -0
  91. package/web/.next/standalone/web/.next/server/app/api/settings/route.js.map +5 -0
  92. package/web/.next/standalone/web/.next/server/app/api/settings/route.js.nft.json +1 -0
  93. package/web/.next/standalone/web/.next/server/app/api/settings/route_client-reference-manifest.js +2 -0
  94. package/web/.next/standalone/web/.next/server/app/api/status/route/app-paths-manifest.json +3 -0
  95. package/web/.next/standalone/web/.next/server/app/api/status/route/build-manifest.json +11 -0
  96. package/web/.next/standalone/web/.next/server/app/api/status/route/server-reference-manifest.json +4 -0
  97. package/web/.next/standalone/web/.next/server/app/api/status/route.js +6 -0
  98. package/web/.next/standalone/web/.next/server/app/api/status/route.js.map +5 -0
  99. package/web/.next/standalone/web/.next/server/app/api/status/route.js.nft.json +1 -0
  100. package/web/.next/standalone/web/.next/server/app/api/status/route_client-reference-manifest.js +2 -0
  101. package/web/.next/standalone/web/.next/server/app/index.html +1 -0
  102. package/web/.next/standalone/web/.next/server/app/index.meta +14 -0
  103. package/web/.next/standalone/web/.next/server/app/index.rsc +23 -0
  104. package/web/.next/standalone/web/.next/server/app/index.segments/__PAGE__.segment.rsc +9 -0
  105. package/web/.next/standalone/web/.next/server/app/index.segments/_full.segment.rsc +23 -0
  106. package/web/.next/standalone/web/.next/server/app/index.segments/_head.segment.rsc +8 -0
  107. package/web/.next/standalone/web/.next/server/app/index.segments/_index.segment.rsc +8 -0
  108. package/web/.next/standalone/web/.next/server/app/index.segments/_tree.segment.rsc +5 -0
  109. package/web/.next/standalone/web/.next/server/app/page/app-paths-manifest.json +3 -0
  110. package/web/.next/standalone/web/.next/server/app/page/build-manifest.json +17 -0
  111. package/web/.next/standalone/web/.next/server/app/page/next-font-manifest.json +11 -0
  112. package/web/.next/standalone/web/.next/server/app/page/react-loadable-manifest.json +1 -0
  113. package/web/.next/standalone/web/.next/server/app/page/server-reference-manifest.json +4 -0
  114. package/web/.next/standalone/web/.next/server/app/page.js +15 -0
  115. package/web/.next/standalone/web/.next/server/app/page.js.map +5 -0
  116. package/web/.next/standalone/web/.next/server/app/page.js.nft.json +1 -0
  117. package/web/.next/standalone/web/.next/server/app/page_client-reference-manifest.js +2 -0
  118. package/web/.next/standalone/web/.next/server/app-paths-manifest.json +13 -0
  119. package/web/.next/standalone/web/.next/server/chunks/2374f_next_dist_esm_build_templates_app-route_0bb4e66a.js +19 -0
  120. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__006b837d._.js +3 -0
  121. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__1ab91221._.js +3 -0
  122. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__2e09fec9._.js +3 -0
  123. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__38d0390f._.js +3 -0
  124. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__539ef30d._.js +3 -0
  125. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__594bcf20._.js +3 -0
  126. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__b888fadf._.js +3 -0
  127. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__f3450c22._.js +21 -0
  128. package/web/.next/standalone/web/.next/server/chunks/[root-of-the-server]__fa2ec862._.js +3 -0
  129. package/web/.next/standalone/web/.next/server/chunks/[turbopack]_runtime.js +770 -0
  130. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_e6039567._.js +6 -0
  131. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_09351209._.js +6 -0
  132. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_222be7ae._.js +6 -0
  133. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_2346e1b3._.js +3 -0
  134. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_cec86455._.js +4 -0
  135. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_9c5d1a14._.js +3 -0
  136. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_builtin_forbidden_8eae0c85.js +3 -0
  137. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_builtin_global-error_81159d60.js +3 -0
  138. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_client_components_builtin_unauthorized_7d34a31c.js +3 -0
  139. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_e03afa0e._.js +3 -0
  140. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_esm_build_templates_app-page_2c8d71b9.js +4 -0
  141. package/web/.next/standalone/web/.next/server/chunks/ssr/2374f_next_dist_server_route-modules_app-page_vendored_ssr_react-dom_8910f04c.js +3 -0
  142. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__1a0663e6._.js +3 -0
  143. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__4306eafc._.js +3 -0
  144. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__44903626._.js +3 -0
  145. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__60278e3f._.js +3 -0
  146. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__61942f24._.js +4 -0
  147. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__8c45c3c9._.js +3 -0
  148. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__9a2f110d._.js +3 -0
  149. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__ed07bd88._.js +3 -0
  150. package/web/.next/standalone/web/.next/server/chunks/ssr/[root-of-the-server]__f2db61af._.js +3 -0
  151. package/web/.next/standalone/web/.next/server/chunks/ssr/[turbopack]_runtime.js +770 -0
  152. package/web/.next/standalone/web/.next/server/chunks/ssr/web_0103e631._.js +4 -0
  153. package/web/.next/standalone/web/.next/server/chunks/ssr/web_171de0df._.js +14 -0
  154. package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app__global-error_page_actions_2a1e94d4.js +3 -0
  155. package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app__not-found_page_actions_9eaa9845.js +3 -0
  156. package/web/.next/standalone/web/.next/server/chunks/ssr/web__next-internal_server_app_page_actions_ec26bf28.js +3 -0
  157. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_components_route_actions_c88bf2a6.js +3 -0
  158. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_connections_route_actions_b1d5e95a.js +3 -0
  159. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_graph_route_actions_e2dd052c.js +3 -0
  160. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_projects_route_actions_3f671cbb.js +3 -0
  161. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_prompts_route_actions_85b56166.js +3 -0
  162. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_scan_route_actions_861cde8d.js +3 -0
  163. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_settings_route_actions_e19026ae.js +3 -0
  164. package/web/.next/standalone/web/.next/server/chunks/web__next-internal_server_app_api_status_route_actions_8b8c6c89.js +3 -0
  165. package/web/.next/standalone/web/.next/server/functions-config-manifest.json +4 -0
  166. package/web/.next/standalone/web/.next/server/middleware-build-manifest.js +21 -0
  167. package/web/.next/standalone/web/.next/server/middleware-manifest.json +6 -0
  168. package/web/.next/standalone/web/.next/server/next-font-manifest.js +1 -0
  169. package/web/.next/standalone/web/.next/server/next-font-manifest.json +15 -0
  170. package/web/.next/standalone/web/.next/server/pages/404.html +1 -0
  171. package/web/.next/standalone/web/.next/server/pages/500.html +2 -0
  172. package/web/.next/standalone/web/.next/server/pages-manifest.json +4 -0
  173. package/web/.next/standalone/web/.next/server/server-reference-manifest.js +1 -0
  174. package/web/.next/standalone/web/.next/server/server-reference-manifest.json +5 -0
  175. package/web/.next/standalone/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_buildManifest.js +11 -0
  176. package/web/.next/standalone/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_clientMiddlewareManifest.json +1 -0
  177. package/web/.next/standalone/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_ssgManifest.js +1 -0
  178. package/web/.next/standalone/web/.next/static/chunks/062ae79751df2759.js +1 -0
  179. package/web/.next/standalone/web/.next/static/chunks/159889e17b2cf1f8.js +2 -0
  180. package/web/.next/standalone/web/.next/static/chunks/458d6f37339fc069.js +1 -0
  181. package/web/.next/standalone/web/.next/static/chunks/6d3d39425a878d7f.js +1 -0
  182. package/web/.next/standalone/web/.next/static/chunks/8a80e7184ad3a13f.css +2 -0
  183. package/web/.next/standalone/web/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  184. package/web/.next/standalone/web/.next/static/chunks/c056475f5f4424b6.css +1 -0
  185. package/web/.next/standalone/web/.next/static/chunks/c57fee8cce8d7cb9.js +1 -0
  186. package/web/.next/standalone/web/.next/static/chunks/cb3513192b63e480.js +12 -0
  187. package/web/.next/standalone/web/.next/static/chunks/dd22b5f2beb2cc31.js +1 -0
  188. package/web/.next/standalone/web/.next/static/chunks/e0affeef0ddb9a97.js +4 -0
  189. package/web/.next/standalone/web/.next/static/chunks/f74a6859e1c4d5e3.js +1 -0
  190. package/web/.next/standalone/web/.next/static/chunks/turbopack-c0c89f9e6f0a38c4.js +3 -0
  191. package/web/.next/standalone/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  192. package/web/.next/standalone/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  193. package/web/.next/standalone/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  194. package/web/.next/standalone/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  195. package/web/.next/standalone/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  196. package/web/.next/standalone/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
  197. package/web/.next/standalone/web/app/api/components/route.ts +252 -0
  198. package/web/.next/standalone/web/app/api/connections/route.ts +319 -0
  199. package/web/.next/standalone/web/app/api/graph/route.ts +235 -0
  200. package/web/.next/standalone/web/app/api/projects/route.ts +221 -0
  201. package/web/.next/standalone/web/app/api/prompts/route.ts +328 -0
  202. package/web/.next/standalone/web/app/api/scan/route.ts +108 -0
  203. package/web/.next/standalone/web/app/api/settings/route.ts +198 -0
  204. package/web/.next/standalone/web/app/api/status/route.ts +169 -0
  205. package/web/.next/standalone/web/app/globals.css +99 -0
  206. package/web/.next/standalone/web/app/layout.tsx +49 -0
  207. package/web/.next/standalone/web/app/page.tsx +94 -0
  208. package/web/.next/standalone/web/components/components-panel.tsx +240 -0
  209. package/web/.next/standalone/web/components/connections-panel.tsx +220 -0
  210. package/web/.next/standalone/web/components/diagram-view.tsx +735 -0
  211. package/web/.next/standalone/web/components/header.tsx +225 -0
  212. package/web/.next/standalone/web/components/impact-analysis.tsx +358 -0
  213. package/web/.next/standalone/web/components/llm-tracking-panel.tsx +1483 -0
  214. package/web/.next/standalone/web/components/settings-panel.tsx +671 -0
  215. package/web/.next/standalone/web/components/sidebar.tsx +74 -0
  216. package/web/.next/standalone/web/components/status-overview.tsx +326 -0
  217. package/web/.next/standalone/web/components/theme-provider.tsx +11 -0
  218. package/web/.next/standalone/web/components/ui/accordion.tsx +66 -0
  219. package/web/.next/standalone/web/components/ui/alert-dialog.tsx +157 -0
  220. package/web/.next/standalone/web/components/ui/alert.tsx +66 -0
  221. package/web/.next/standalone/web/components/ui/aspect-ratio.tsx +11 -0
  222. package/web/.next/standalone/web/components/ui/avatar.tsx +53 -0
  223. package/web/.next/standalone/web/components/ui/badge.tsx +46 -0
  224. package/web/.next/standalone/web/components/ui/breadcrumb.tsx +109 -0
  225. package/web/.next/standalone/web/components/ui/button-group.tsx +83 -0
  226. package/web/.next/standalone/web/components/ui/button.tsx +60 -0
  227. package/web/.next/standalone/web/components/ui/calendar.tsx +213 -0
  228. package/web/.next/standalone/web/components/ui/card.tsx +92 -0
  229. package/web/.next/standalone/web/components/ui/carousel.tsx +241 -0
  230. package/web/.next/standalone/web/components/ui/chart.tsx +353 -0
  231. package/web/.next/standalone/web/components/ui/checkbox.tsx +32 -0
  232. package/web/.next/standalone/web/components/ui/collapsible.tsx +33 -0
  233. package/web/.next/standalone/web/components/ui/command.tsx +184 -0
  234. package/web/.next/standalone/web/components/ui/context-menu.tsx +252 -0
  235. package/web/.next/standalone/web/components/ui/dialog.tsx +143 -0
  236. package/web/.next/standalone/web/components/ui/drawer.tsx +135 -0
  237. package/web/.next/standalone/web/components/ui/dropdown-menu.tsx +257 -0
  238. package/web/.next/standalone/web/components/ui/empty.tsx +104 -0
  239. package/web/.next/standalone/web/components/ui/field.tsx +244 -0
  240. package/web/.next/standalone/web/components/ui/form.tsx +167 -0
  241. package/web/.next/standalone/web/components/ui/hover-card.tsx +44 -0
  242. package/web/.next/standalone/web/components/ui/input-group.tsx +169 -0
  243. package/web/.next/standalone/web/components/ui/input-otp.tsx +77 -0
  244. package/web/.next/standalone/web/components/ui/input.tsx +21 -0
  245. package/web/.next/standalone/web/components/ui/item.tsx +193 -0
  246. package/web/.next/standalone/web/components/ui/kbd.tsx +28 -0
  247. package/web/.next/standalone/web/components/ui/label.tsx +24 -0
  248. package/web/.next/standalone/web/components/ui/menubar.tsx +276 -0
  249. package/web/.next/standalone/web/components/ui/navigation-menu.tsx +166 -0
  250. package/web/.next/standalone/web/components/ui/pagination.tsx +127 -0
  251. package/web/.next/standalone/web/components/ui/popover.tsx +48 -0
  252. package/web/.next/standalone/web/components/ui/progress.tsx +31 -0
  253. package/web/.next/standalone/web/components/ui/radio-group.tsx +45 -0
  254. package/web/.next/standalone/web/components/ui/resizable.tsx +56 -0
  255. package/web/.next/standalone/web/components/ui/scroll-area.tsx +58 -0
  256. package/web/.next/standalone/web/components/ui/select.tsx +185 -0
  257. package/web/.next/standalone/web/components/ui/separator.tsx +28 -0
  258. package/web/.next/standalone/web/components/ui/sheet.tsx +139 -0
  259. package/web/.next/standalone/web/components/ui/sidebar.tsx +726 -0
  260. package/web/.next/standalone/web/components/ui/skeleton.tsx +13 -0
  261. package/web/.next/standalone/web/components/ui/slider.tsx +63 -0
  262. package/web/.next/standalone/web/components/ui/sonner.tsx +25 -0
  263. package/web/.next/standalone/web/components/ui/spinner.tsx +16 -0
  264. package/web/.next/standalone/web/components/ui/switch.tsx +31 -0
  265. package/web/.next/standalone/web/components/ui/table.tsx +116 -0
  266. package/web/.next/standalone/web/components/ui/tabs.tsx +66 -0
  267. package/web/.next/standalone/web/components/ui/textarea.tsx +18 -0
  268. package/web/.next/standalone/web/components/ui/toast.tsx +129 -0
  269. package/web/.next/standalone/web/components/ui/toaster.tsx +35 -0
  270. package/web/.next/standalone/web/components/ui/toggle-group.tsx +73 -0
  271. package/web/.next/standalone/web/components/ui/toggle.tsx +47 -0
  272. package/web/.next/standalone/web/components/ui/tooltip.tsx +61 -0
  273. package/web/.next/standalone/web/components/ui/use-mobile.tsx +19 -0
  274. package/web/.next/standalone/web/components/ui/use-toast.ts +191 -0
  275. package/web/.next/standalone/web/components.json +21 -0
  276. package/web/.next/standalone/web/hooks/use-mobile.ts +19 -0
  277. package/web/.next/standalone/web/hooks/use-toast.ts +191 -0
  278. package/web/.next/standalone/web/lib/hooks/index.ts +8 -0
  279. package/web/.next/standalone/web/lib/hooks/use-components.ts +83 -0
  280. package/web/.next/standalone/web/lib/hooks/use-connections.ts +83 -0
  281. package/web/.next/standalone/web/lib/hooks/use-projects.ts +116 -0
  282. package/web/.next/standalone/web/lib/hooks/use-prompts.ts +122 -0
  283. package/web/.next/standalone/web/lib/hooks/use-settings.ts +135 -0
  284. package/web/.next/standalone/web/lib/hooks/use-status.ts +80 -0
  285. package/web/.next/standalone/web/lib/project-context.tsx +46 -0
  286. package/web/.next/standalone/web/lib/transform.ts +625 -0
  287. package/web/.next/standalone/web/lib/types.ts +198 -0
  288. package/web/.next/standalone/web/lib/utils.ts +6 -0
  289. package/web/.next/standalone/web/next.config.mjs +12 -0
  290. package/web/.next/standalone/web/package-lock.json +3987 -0
  291. package/web/.next/standalone/web/package.json +73 -0
  292. package/web/.next/standalone/web/pnpm-lock.yaml +5 -0
  293. package/web/.next/standalone/web/postcss.config.mjs +8 -0
  294. package/web/.next/standalone/web/public/apple-icon.png +0 -0
  295. package/web/.next/standalone/web/public/icon-dark-32x32.png +0 -0
  296. package/web/.next/standalone/web/public/icon-light-32x32.png +0 -0
  297. package/web/.next/standalone/web/public/icon.svg +26 -0
  298. package/web/.next/standalone/web/public/navgator-logo.png +0 -0
  299. package/web/.next/standalone/web/public/placeholder-logo.png +0 -0
  300. package/web/.next/standalone/web/public/placeholder-logo.svg +1 -0
  301. package/web/.next/standalone/web/public/placeholder-user.jpg +0 -0
  302. package/web/.next/standalone/web/public/placeholder.jpg +0 -0
  303. package/web/.next/standalone/web/public/placeholder.svg +1 -0
  304. package/web/.next/standalone/web/public/public/apple-icon.png +0 -0
  305. package/web/.next/standalone/web/public/public/icon-dark-32x32.png +0 -0
  306. package/web/.next/standalone/web/public/public/icon-light-32x32.png +0 -0
  307. package/web/.next/standalone/web/public/public/icon.svg +26 -0
  308. package/web/.next/standalone/web/public/public/navgator-logo.png +0 -0
  309. package/web/.next/standalone/web/public/public/placeholder-logo.png +0 -0
  310. package/web/.next/standalone/web/public/public/placeholder-logo.svg +1 -0
  311. package/web/.next/standalone/web/public/public/placeholder-user.jpg +0 -0
  312. package/web/.next/standalone/web/public/public/placeholder.jpg +0 -0
  313. package/web/.next/standalone/web/public/public/placeholder.svg +1 -0
  314. package/web/.next/standalone/web/server.js +38 -0
  315. package/web/.next/standalone/web/styles/globals.css +125 -0
  316. package/web/.next/standalone/web/tsconfig.json +41 -0
  317. package/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_buildManifest.js +11 -0
  318. package/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_clientMiddlewareManifest.json +1 -0
  319. package/web/.next/static/WH0NvTGUEDs9QVUjcPJKx/_ssgManifest.js +1 -0
  320. package/web/.next/static/chunks/062ae79751df2759.js +1 -0
  321. package/web/.next/static/chunks/159889e17b2cf1f8.js +2 -0
  322. package/web/.next/static/chunks/458d6f37339fc069.js +1 -0
  323. package/web/.next/static/chunks/6d3d39425a878d7f.js +1 -0
  324. package/web/.next/static/chunks/8a80e7184ad3a13f.css +2 -0
  325. package/web/.next/static/chunks/a6dad97d9634a72d.js +1 -0
  326. package/web/.next/static/chunks/c056475f5f4424b6.css +1 -0
  327. package/web/.next/static/chunks/c57fee8cce8d7cb9.js +1 -0
  328. package/web/.next/static/chunks/cb3513192b63e480.js +12 -0
  329. package/web/.next/static/chunks/dd22b5f2beb2cc31.js +1 -0
  330. package/web/.next/static/chunks/e0affeef0ddb9a97.js +4 -0
  331. package/web/.next/static/chunks/f74a6859e1c4d5e3.js +1 -0
  332. package/web/.next/static/chunks/turbopack-c0c89f9e6f0a38c4.js +3 -0
  333. package/web/.next/static/media/4fa387ec64143e14-s.c1fdd6c2.woff2 +0 -0
  334. package/web/.next/static/media/7178b3e590c64307-s.b97b3418.woff2 +0 -0
  335. package/web/.next/static/media/797e433ab948586e-s.p.dbea232f.woff2 +0 -0
  336. package/web/.next/static/media/8a480f0b521d4e75-s.8e0177b5.woff2 +0 -0
  337. package/web/.next/static/media/bbc41e54d2fcbd21-s.799d8ef8.woff2 +0 -0
  338. package/web/.next/static/media/caa3a2e1cccd8315-s.p.853070df.woff2 +0 -0
@@ -0,0 +1,225 @@
1
+ "use client"
2
+
3
+ import Image from "next/image"
4
+ import { Search, RefreshCw, ChevronDown, FolderOpen, Plus, X } from "lucide-react"
5
+ import { Button } from "@/components/ui/button"
6
+ import { Input } from "@/components/ui/input"
7
+ import {
8
+ DropdownMenu,
9
+ DropdownMenuContent,
10
+ DropdownMenuItem,
11
+ DropdownMenuSeparator,
12
+ DropdownMenuTrigger,
13
+ } from "@/components/ui/dropdown-menu"
14
+ import {
15
+ Tooltip,
16
+ TooltipContent,
17
+ TooltipProvider,
18
+ TooltipTrigger,
19
+ } from "@/components/ui/tooltip"
20
+ import { useState, useEffect, useRef } from "react"
21
+
22
+ interface RegisteredProject {
23
+ path: string
24
+ name: string
25
+ hasArchitecture: boolean
26
+ componentCount: number
27
+ connectionCount: number
28
+ lastScanFormatted: string | null
29
+ }
30
+
31
+ interface HeaderProps {
32
+ activeProject: string | null
33
+ projectName: string | null
34
+ projectPath: string | null
35
+ projects: RegisteredProject[]
36
+ onSelectProject: (path: string) => void
37
+ onAddProject: (path: string) => Promise<void>
38
+ onRemoveProject: (path: string) => Promise<void>
39
+ isLoadingProjects: boolean
40
+ }
41
+
42
+ export function Header({
43
+ activeProject,
44
+ projectName,
45
+ projectPath,
46
+ projects,
47
+ onSelectProject,
48
+ onAddProject,
49
+ onRemoveProject,
50
+ isLoadingProjects,
51
+ }: HeaderProps) {
52
+ const [isScanning, setIsScanning] = useState(false)
53
+ const [showAddInput, setShowAddInput] = useState(false)
54
+ const [addPath, setAddPath] = useState("")
55
+ const addInputRef = useRef<HTMLInputElement>(null)
56
+
57
+ useEffect(() => {
58
+ if (showAddInput && addInputRef.current) {
59
+ addInputRef.current.focus()
60
+ }
61
+ }, [showAddInput])
62
+
63
+ const handleScan = async () => {
64
+ setIsScanning(true)
65
+ try {
66
+ await fetch("/api/scan", {
67
+ method: "POST",
68
+ headers: { "Content-Type": "application/json" },
69
+ body: JSON.stringify({ path: activeProject }),
70
+ })
71
+ window.location.reload()
72
+ } catch (error) {
73
+ console.error("Scan failed:", error)
74
+ } finally {
75
+ setIsScanning(false)
76
+ }
77
+ }
78
+
79
+ const handleAddProject = async () => {
80
+ if (!addPath.trim()) return
81
+ await onAddProject(addPath.trim())
82
+ onSelectProject(addPath.trim())
83
+ setAddPath("")
84
+ setShowAddInput(false)
85
+ }
86
+
87
+ const displayName = projectName || "No Project"
88
+
89
+ return (
90
+ <header className="flex h-14 items-center justify-between border-b border-border bg-card px-4">
91
+ <div className="flex items-center gap-4">
92
+ <div className="flex items-center gap-2">
93
+ <Image
94
+ src="/navgator-logo.png"
95
+ alt="NavGator"
96
+ width={36}
97
+ height={36}
98
+ className="rounded-lg"
99
+ />
100
+ <span className="font-semibold text-foreground">NavGator</span>
101
+ </div>
102
+
103
+ <div className="hidden items-center gap-1 text-sm text-muted-foreground md:flex">
104
+ <span>/</span>
105
+ <DropdownMenu>
106
+ <DropdownMenuTrigger asChild>
107
+ <Button variant="ghost" size="sm" className="h-auto gap-1 px-2 py-1 text-foreground">
108
+ {isLoadingProjects ? (
109
+ <span className="animate-pulse">Loading...</span>
110
+ ) : (
111
+ displayName
112
+ )}
113
+ <ChevronDown className="h-3 w-3 text-muted-foreground" />
114
+ </Button>
115
+ </DropdownMenuTrigger>
116
+ <DropdownMenuContent align="start" className="w-72">
117
+ {projects.length === 0 && !showAddInput && (
118
+ <div className="px-3 py-2 text-sm text-muted-foreground">
119
+ No projects registered
120
+ </div>
121
+ )}
122
+
123
+ {projects.map((project) => (
124
+ <DropdownMenuItem
125
+ key={project.path}
126
+ className="flex items-center justify-between gap-2 py-2"
127
+ onSelect={() => onSelectProject(project.path)}
128
+ >
129
+ <div className="flex min-w-0 flex-1 flex-col">
130
+ <span className={`text-sm font-medium truncate ${
131
+ project.path === activeProject ? "text-blue-700 dark:text-blue-400" : ""
132
+ }`}>
133
+ {project.name}
134
+ </span>
135
+ <span className="text-xs text-muted-foreground truncate">
136
+ {project.hasArchitecture
137
+ ? `${project.componentCount} components · ${project.lastScanFormatted || "never scanned"}`
138
+ : "Not scanned yet"}
139
+ </span>
140
+ </div>
141
+ <Button
142
+ variant="ghost"
143
+ size="sm"
144
+ className="h-5 w-5 shrink-0 p-0 text-muted-foreground hover:text-red-600"
145
+ onClick={(e) => {
146
+ e.stopPropagation()
147
+ onRemoveProject(project.path)
148
+ }}
149
+ >
150
+ <X className="h-3 w-3" />
151
+ </Button>
152
+ </DropdownMenuItem>
153
+ ))}
154
+
155
+ {projects.length > 0 && <DropdownMenuSeparator />}
156
+
157
+ {showAddInput ? (
158
+ <div className="flex items-center gap-1 px-2 py-1.5" onClick={(e) => e.stopPropagation()}>
159
+ <Input
160
+ ref={addInputRef}
161
+ value={addPath}
162
+ onChange={(e) => setAddPath(e.target.value)}
163
+ onKeyDown={(e) => {
164
+ if (e.key === "Enter") handleAddProject()
165
+ if (e.key === "Escape") { setShowAddInput(false); setAddPath("") }
166
+ }}
167
+ placeholder="/path/to/project"
168
+ className="h-7 text-xs"
169
+ />
170
+ <Button
171
+ variant="ghost"
172
+ size="sm"
173
+ className="h-7 shrink-0 px-2 text-xs"
174
+ onClick={handleAddProject}
175
+ >
176
+ Add
177
+ </Button>
178
+ </div>
179
+ ) : (
180
+ <DropdownMenuItem onSelect={() => setShowAddInput(true)}>
181
+ <Plus className="mr-2 h-4 w-4" />
182
+ Add project
183
+ </DropdownMenuItem>
184
+ )}
185
+ </DropdownMenuContent>
186
+ </DropdownMenu>
187
+
188
+ {projectPath && (
189
+ <TooltipProvider>
190
+ <Tooltip>
191
+ <TooltipTrigger asChild>
192
+ <FolderOpen className="h-3.5 w-3.5 text-muted-foreground" />
193
+ </TooltipTrigger>
194
+ <TooltipContent side="bottom" className="max-w-md">
195
+ <p className="font-mono text-xs">{projectPath}</p>
196
+ </TooltipContent>
197
+ </Tooltip>
198
+ </TooltipProvider>
199
+ )}
200
+ </div>
201
+ </div>
202
+
203
+ <div className="flex items-center gap-3">
204
+ <div className="relative hidden w-64 md:block">
205
+ <Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
206
+ <Input
207
+ placeholder="Search components..."
208
+ className="h-8 bg-secondary pl-9 text-sm"
209
+ />
210
+ </div>
211
+
212
+ <Button
213
+ variant="outline"
214
+ size="sm"
215
+ onClick={handleScan}
216
+ disabled={isScanning}
217
+ className="gap-2 bg-transparent"
218
+ >
219
+ <RefreshCw className={`h-4 w-4 ${isScanning ? "animate-spin" : ""}`} />
220
+ <span className="hidden sm:inline">{isScanning ? "Scanning..." : "Scan"}</span>
221
+ </Button>
222
+ </div>
223
+ </header>
224
+ )
225
+ }
@@ -0,0 +1,358 @@
1
+ "use client"
2
+
3
+ import { useState, useEffect } from "react"
4
+ import {
5
+ Target,
6
+ ArrowDownToLine,
7
+ ArrowUpFromLine,
8
+ FileCode,
9
+ Code2,
10
+ AlertTriangle,
11
+ CheckCircle2,
12
+ Search,
13
+ Loader2,
14
+ } from "lucide-react"
15
+ import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card"
16
+ import { Input } from "@/components/ui/input"
17
+ import { Badge } from "@/components/ui/badge"
18
+ import { cn } from "@/lib/utils"
19
+ import type { Component, Connection } from "@/lib/types"
20
+
21
+ interface ImpactAnalysisProps {
22
+ componentName: string | null
23
+ onSelectComponent: (name: string) => void
24
+ }
25
+
26
+ interface ComponentWithConnections {
27
+ component: Component
28
+ incoming: Connection[]
29
+ outgoing: Connection[]
30
+ }
31
+
32
+ export function ImpactAnalysis({ componentName, onSelectComponent }: ImpactAnalysisProps) {
33
+ const [search, setSearch] = useState("")
34
+ const [components, setComponents] = useState<Component[]>([])
35
+ const [connections, setConnections] = useState<Connection[]>([])
36
+ const [loading, setLoading] = useState(true)
37
+ const [error, setError] = useState<string | null>(null)
38
+
39
+ // Fetch components and connections from API
40
+ useEffect(() => {
41
+ async function fetchData() {
42
+ setLoading(true)
43
+ setError(null)
44
+ try {
45
+ const [compRes, connRes] = await Promise.all([
46
+ fetch("/api/components?refresh=true"),
47
+ fetch("/api/connections?refresh=true"),
48
+ ])
49
+
50
+ const compData = await compRes.json()
51
+ const connData = await connRes.json()
52
+
53
+ if (compData.success && compData.data?.components) {
54
+ setComponents(compData.data.components)
55
+ }
56
+ if (connData.success && connData.data?.connections) {
57
+ setConnections(connData.data.connections)
58
+ }
59
+
60
+ if (compData.error) {
61
+ setError(compData.error)
62
+ }
63
+ } catch (err) {
64
+ setError(err instanceof Error ? err.message : "Failed to load data")
65
+ } finally {
66
+ setLoading(false)
67
+ }
68
+ }
69
+
70
+ fetchData()
71
+ }, [])
72
+
73
+ // Build component data with connections
74
+ const getComponentData = (name: string): ComponentWithConnections | null => {
75
+ const component = components.find(c => c.name === name)
76
+ if (!component) return null
77
+
78
+ // Find connections TO this component (incoming)
79
+ const incoming = connections.filter(conn =>
80
+ conn.toComponent === name ||
81
+ conn.to?.includes(component.id) ||
82
+ conn.to === name
83
+ )
84
+
85
+ // Find connections FROM this component (outgoing)
86
+ const outgoing = connections.filter(conn =>
87
+ conn.fromComponent === name ||
88
+ conn.from?.includes(component.id) ||
89
+ conn.from === name
90
+ )
91
+
92
+ return { component, incoming, outgoing }
93
+ }
94
+
95
+ const filteredComponents = components.filter((c) =>
96
+ c.name.toLowerCase().includes(search.toLowerCase())
97
+ )
98
+
99
+ // Loading state
100
+ if (loading) {
101
+ return (
102
+ <div className="flex items-center justify-center py-12">
103
+ <Loader2 className="h-8 w-8 animate-spin text-muted-foreground" />
104
+ <span className="ml-3 text-muted-foreground">Loading components...</span>
105
+ </div>
106
+ )
107
+ }
108
+
109
+ // Error state
110
+ if (error && components.length === 0) {
111
+ return (
112
+ <div className="space-y-6">
113
+ <div>
114
+ <h1 className="text-2xl font-semibold text-foreground">Impact Analysis</h1>
115
+ <p className="text-sm text-muted-foreground">
116
+ Select a component to see what would be affected by changes
117
+ </p>
118
+ </div>
119
+ <Card className="bg-card border-warning/50">
120
+ <CardContent className="p-6">
121
+ <div className="flex items-start gap-3">
122
+ <AlertTriangle className="h-5 w-5 text-warning mt-0.5" />
123
+ <div>
124
+ <p className="font-medium text-card-foreground">No scan data found</p>
125
+ <p className="text-sm text-muted-foreground mt-1">{error}</p>
126
+ <p className="text-sm text-muted-foreground mt-2">
127
+ Run <code className="bg-secondary px-1.5 py-0.5 rounded text-xs">navgator scan</code> in your project to generate architecture data.
128
+ </p>
129
+ </div>
130
+ </div>
131
+ </CardContent>
132
+ </Card>
133
+ </div>
134
+ )
135
+ }
136
+
137
+ const data = componentName ? getComponentData(componentName) : null
138
+
139
+ if (!componentName || !data) {
140
+ return (
141
+ <div className="space-y-6">
142
+ <div>
143
+ <h1 className="text-2xl font-semibold text-foreground">Impact Analysis</h1>
144
+ <p className="text-sm text-muted-foreground">
145
+ Select a component to see what would be affected by changes
146
+ </p>
147
+ </div>
148
+
149
+ <div className="relative max-w-md">
150
+ <Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" />
151
+ <Input
152
+ placeholder="Search components..."
153
+ value={search}
154
+ onChange={(e) => setSearch(e.target.value)}
155
+ className="bg-card pl-9"
156
+ />
157
+ </div>
158
+
159
+ {filteredComponents.length === 0 ? (
160
+ <Card className="bg-card">
161
+ <CardContent className="p-6 text-center">
162
+ <p className="text-muted-foreground">No components found</p>
163
+ </CardContent>
164
+ </Card>
165
+ ) : (
166
+ <div className="grid gap-3 sm:grid-cols-2 lg:grid-cols-3">
167
+ {filteredComponents.map((comp) => (
168
+ <button
169
+ key={comp.id}
170
+ onClick={() => onSelectComponent(comp.name)}
171
+ className="flex items-center gap-3 rounded-lg border border-border bg-card p-4 text-left transition-colors hover:bg-secondary"
172
+ >
173
+ <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-primary/10">
174
+ <Target className="h-5 w-5 text-primary" />
175
+ </div>
176
+ <div>
177
+ <p className="font-medium text-card-foreground">{comp.name}</p>
178
+ <p className="text-xs text-muted-foreground">
179
+ {comp.type} · {comp.layer}
180
+ </p>
181
+ </div>
182
+ </button>
183
+ ))}
184
+ </div>
185
+ )}
186
+ </div>
187
+ )
188
+ }
189
+
190
+ const riskLevel =
191
+ data.incoming.length >= 5 ? "high" : data.incoming.length >= 3 ? "medium" : "low"
192
+
193
+ return (
194
+ <div className="space-y-6">
195
+ <div className="flex items-start justify-between">
196
+ <div>
197
+ <div className="flex items-center gap-3">
198
+ <h1 className="text-2xl font-semibold text-foreground">{componentName}</h1>
199
+ <Badge
200
+ variant="outline"
201
+ className={cn(
202
+ "text-xs",
203
+ riskLevel === "high" && "border-destructive/50 bg-destructive/10 text-destructive",
204
+ riskLevel === "medium" && "border-warning/50 bg-warning/10 text-warning",
205
+ riskLevel === "low" && "border-success/50 bg-success/10 text-success"
206
+ )}
207
+ >
208
+ {riskLevel === "high" && <AlertTriangle className="mr-1 h-3 w-3" />}
209
+ {riskLevel === "low" && <CheckCircle2 className="mr-1 h-3 w-3" />}
210
+ {riskLevel} impact risk
211
+ </Badge>
212
+ </div>
213
+ <p className="text-sm text-muted-foreground">
214
+ {data.component.type} · {data.component.layer} · {data.component.purpose || "No description"}
215
+ </p>
216
+ </div>
217
+ <button
218
+ onClick={() => onSelectComponent("")}
219
+ className="text-sm text-muted-foreground hover:text-foreground"
220
+ >
221
+ Clear selection
222
+ </button>
223
+ </div>
224
+
225
+ {/* Summary Cards */}
226
+ <div className="grid gap-4 sm:grid-cols-2">
227
+ <Card className="bg-card">
228
+ <CardContent className="p-4">
229
+ <div className="flex items-center gap-3">
230
+ <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-chart-1/10">
231
+ <ArrowDownToLine className="h-5 w-5 text-chart-1" />
232
+ </div>
233
+ <div>
234
+ <p className="text-2xl font-semibold text-card-foreground">
235
+ {data.incoming.length}
236
+ </p>
237
+ <p className="text-sm text-muted-foreground">Incoming connections</p>
238
+ </div>
239
+ </div>
240
+ </CardContent>
241
+ </Card>
242
+
243
+ <Card className="bg-card">
244
+ <CardContent className="p-4">
245
+ <div className="flex items-center gap-3">
246
+ <div className="flex h-10 w-10 items-center justify-center rounded-lg bg-chart-2/10">
247
+ <ArrowUpFromLine className="h-5 w-5 text-chart-2" />
248
+ </div>
249
+ <div>
250
+ <p className="text-2xl font-semibold text-card-foreground">
251
+ {data.outgoing.length}
252
+ </p>
253
+ <p className="text-sm text-muted-foreground">Outgoing connections</p>
254
+ </div>
255
+ </div>
256
+ </CardContent>
257
+ </Card>
258
+ </div>
259
+
260
+ {/* Incoming Connections */}
261
+ {data.incoming.length > 0 && (
262
+ <Card className="bg-card">
263
+ <CardHeader className="pb-3">
264
+ <CardTitle className="flex items-center gap-2 text-base font-medium">
265
+ <ArrowDownToLine className="h-4 w-4 text-chart-1" />
266
+ Files that USE this component
267
+ <Badge variant="secondary" className="ml-auto">
268
+ {data.incoming.length}
269
+ </Badge>
270
+ </CardTitle>
271
+ <p className="text-xs text-muted-foreground">
272
+ These files may need changes if you modify {componentName}
273
+ </p>
274
+ </CardHeader>
275
+ <CardContent>
276
+ <div className="space-y-3">
277
+ {data.incoming.map((conn, idx) => (
278
+ <div
279
+ key={idx}
280
+ className="rounded-lg border border-border bg-secondary/30 p-3"
281
+ >
282
+ <div className="flex items-center gap-2">
283
+ <FileCode className="h-4 w-4 text-muted-foreground" />
284
+ <span className="font-mono text-sm text-foreground">{conn.from}</span>
285
+ <span className="text-xs text-muted-foreground">:{conn.line}</span>
286
+ </div>
287
+ <div className="mt-2 flex items-center gap-2 text-xs text-muted-foreground">
288
+ <Code2 className="h-3.5 w-3.5" />
289
+ <span className="font-medium text-foreground">{conn.symbol}</span>
290
+ </div>
291
+ {conn.code && (
292
+ <pre className="mt-2 rounded bg-background p-2 font-mono text-xs text-muted-foreground overflow-x-auto">
293
+ {conn.code}
294
+ </pre>
295
+ )}
296
+ </div>
297
+ ))}
298
+ </div>
299
+ </CardContent>
300
+ </Card>
301
+ )}
302
+
303
+ {/* Outgoing Connections */}
304
+ {data.outgoing.length > 0 && (
305
+ <Card className="bg-card">
306
+ <CardHeader className="pb-3">
307
+ <CardTitle className="flex items-center gap-2 text-base font-medium">
308
+ <ArrowUpFromLine className="h-4 w-4 text-chart-2" />
309
+ Components this CALLS
310
+ <Badge variant="secondary" className="ml-auto">
311
+ {data.outgoing.length}
312
+ </Badge>
313
+ </CardTitle>
314
+ <p className="text-xs text-muted-foreground">
315
+ External dependencies of {componentName}
316
+ </p>
317
+ </CardHeader>
318
+ <CardContent>
319
+ <div className="space-y-3">
320
+ {data.outgoing.map((conn, idx) => (
321
+ <button
322
+ key={idx}
323
+ onClick={() => conn.toComponent && onSelectComponent(conn.toComponent)}
324
+ className="w-full rounded-lg border border-border bg-secondary/30 p-3 text-left transition-colors hover:bg-secondary/50"
325
+ >
326
+ <div className="flex items-center gap-2">
327
+ <Badge variant="outline" className="bg-primary/10 text-primary">
328
+ {conn.toComponent || conn.to}
329
+ </Badge>
330
+ <span className="text-xs text-muted-foreground">:{conn.line}</span>
331
+ </div>
332
+ <div className="mt-2 flex items-center gap-2 text-xs text-muted-foreground">
333
+ <Code2 className="h-3.5 w-3.5" />
334
+ <span className="font-medium text-foreground">{conn.symbol}</span>
335
+ </div>
336
+ {conn.code && (
337
+ <pre className="mt-2 rounded bg-background p-2 font-mono text-xs text-muted-foreground overflow-x-auto">
338
+ {conn.code}
339
+ </pre>
340
+ )}
341
+ </button>
342
+ ))}
343
+ </div>
344
+ </CardContent>
345
+ </Card>
346
+ )}
347
+
348
+ {/* No connections */}
349
+ {data.incoming.length === 0 && data.outgoing.length === 0 && (
350
+ <Card className="bg-card">
351
+ <CardContent className="p-6 text-center">
352
+ <p className="text-muted-foreground">No connections found for this component</p>
353
+ </CardContent>
354
+ </Card>
355
+ )}
356
+ </div>
357
+ )
358
+ }