@opensip-cli/dashboard 0.1.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 (309) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +8 -0
  3. package/README.md +31 -0
  4. package/dist/__tests__/catalog-provenance.test.d.ts +11 -0
  5. package/dist/__tests__/catalog-provenance.test.d.ts.map +1 -0
  6. package/dist/__tests__/catalog-provenance.test.js +130 -0
  7. package/dist/__tests__/catalog-provenance.test.js.map +1 -0
  8. package/dist/__tests__/coupling-attribution.test.d.ts +9 -0
  9. package/dist/__tests__/coupling-attribution.test.d.ts.map +1 -0
  10. package/dist/__tests__/coupling-attribution.test.js +99 -0
  11. package/dist/__tests__/coupling-attribution.test.js.map +1 -0
  12. package/dist/__tests__/dashboard-bundle-weight.test.d.ts +16 -0
  13. package/dist/__tests__/dashboard-bundle-weight.test.d.ts.map +1 -0
  14. package/dist/__tests__/dashboard-bundle-weight.test.js +73 -0
  15. package/dist/__tests__/dashboard-bundle-weight.test.js.map +1 -0
  16. package/dist/__tests__/dashboard-cell-containment.test.d.ts +2 -0
  17. package/dist/__tests__/dashboard-cell-containment.test.d.ts.map +1 -0
  18. package/dist/__tests__/dashboard-cell-containment.test.js +49 -0
  19. package/dist/__tests__/dashboard-cell-containment.test.js.map +1 -0
  20. package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts +10 -0
  21. package/dist/__tests__/dashboard-cytoscape-vendor.test.d.ts.map +1 -0
  22. package/dist/__tests__/dashboard-cytoscape-vendor.test.js +40 -0
  23. package/dist/__tests__/dashboard-cytoscape-vendor.test.js.map +1 -0
  24. package/dist/__tests__/dashboard-editor-link.test.d.ts +5 -0
  25. package/dist/__tests__/dashboard-editor-link.test.d.ts.map +1 -0
  26. package/dist/__tests__/dashboard-editor-link.test.js +36 -0
  27. package/dist/__tests__/dashboard-editor-link.test.js.map +1 -0
  28. package/dist/__tests__/dashboard-filters.test.d.ts +9 -0
  29. package/dist/__tests__/dashboard-filters.test.d.ts.map +1 -0
  30. package/dist/__tests__/dashboard-filters.test.js +95 -0
  31. package/dist/__tests__/dashboard-filters.test.js.map +1 -0
  32. package/dist/__tests__/dashboard-function-card-singleton.test.d.ts +9 -0
  33. package/dist/__tests__/dashboard-function-card-singleton.test.d.ts.map +1 -0
  34. package/dist/__tests__/dashboard-function-card-singleton.test.js +87 -0
  35. package/dist/__tests__/dashboard-function-card-singleton.test.js.map +1 -0
  36. package/dist/__tests__/dashboard-function-card.test.d.ts +10 -0
  37. package/dist/__tests__/dashboard-function-card.test.d.ts.map +1 -0
  38. package/dist/__tests__/dashboard-function-card.test.js +403 -0
  39. package/dist/__tests__/dashboard-function-card.test.js.map +1 -0
  40. package/dist/__tests__/dashboard-function-row.test.d.ts +11 -0
  41. package/dist/__tests__/dashboard-function-row.test.d.ts.map +1 -0
  42. package/dist/__tests__/dashboard-function-row.test.js +101 -0
  43. package/dist/__tests__/dashboard-function-row.test.js.map +1 -0
  44. package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts +9 -0
  45. package/dist/__tests__/dashboard-generator-graph-catalog.test.d.ts.map +1 -0
  46. package/dist/__tests__/dashboard-generator-graph-catalog.test.js +75 -0
  47. package/dist/__tests__/dashboard-generator-graph-catalog.test.js.map +1 -0
  48. package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts +13 -0
  49. package/dist/__tests__/dashboard-graph-offline.integration.test.d.ts.map +1 -0
  50. package/dist/__tests__/dashboard-graph-offline.integration.test.js +55 -0
  51. package/dist/__tests__/dashboard-graph-offline.integration.test.js.map +1 -0
  52. package/dist/__tests__/dashboard-graph-scc.test.d.ts +17 -0
  53. package/dist/__tests__/dashboard-graph-scc.test.d.ts.map +1 -0
  54. package/dist/__tests__/dashboard-graph-scc.test.js +89 -0
  55. package/dist/__tests__/dashboard-graph-scc.test.js.map +1 -0
  56. package/dist/__tests__/dashboard-graph-view-model.test.d.ts +12 -0
  57. package/dist/__tests__/dashboard-graph-view-model.test.d.ts.map +1 -0
  58. package/dist/__tests__/dashboard-graph-view-model.test.js +331 -0
  59. package/dist/__tests__/dashboard-graph-view-model.test.js.map +1 -0
  60. package/dist/__tests__/dashboard-help-drawer.test.d.ts +9 -0
  61. package/dist/__tests__/dashboard-help-drawer.test.d.ts.map +1 -0
  62. package/dist/__tests__/dashboard-help-drawer.test.js +101 -0
  63. package/dist/__tests__/dashboard-help-drawer.test.js.map +1 -0
  64. package/dist/__tests__/dashboard-html.test.d.ts +2 -0
  65. package/dist/__tests__/dashboard-html.test.d.ts.map +1 -0
  66. package/dist/__tests__/dashboard-html.test.js +169 -0
  67. package/dist/__tests__/dashboard-html.test.js.map +1 -0
  68. package/dist/__tests__/dashboard-indexes.test.d.ts +9 -0
  69. package/dist/__tests__/dashboard-indexes.test.d.ts.map +1 -0
  70. package/dist/__tests__/dashboard-indexes.test.js +211 -0
  71. package/dist/__tests__/dashboard-indexes.test.js.map +1 -0
  72. package/dist/__tests__/dashboard-path-utils.test.d.ts +6 -0
  73. package/dist/__tests__/dashboard-path-utils.test.d.ts.map +1 -0
  74. package/dist/__tests__/dashboard-path-utils.test.js +54 -0
  75. package/dist/__tests__/dashboard-path-utils.test.js.map +1 -0
  76. package/dist/__tests__/dashboard-search.test.d.ts +5 -0
  77. package/dist/__tests__/dashboard-search.test.d.ts.map +1 -0
  78. package/dist/__tests__/dashboard-search.test.js +46 -0
  79. package/dist/__tests__/dashboard-search.test.js.map +1 -0
  80. package/dist/__tests__/dashboard-sessions.test.d.ts +14 -0
  81. package/dist/__tests__/dashboard-sessions.test.d.ts.map +1 -0
  82. package/dist/__tests__/dashboard-sessions.test.js +330 -0
  83. package/dist/__tests__/dashboard-sessions.test.js.map +1 -0
  84. package/dist/__tests__/dashboard-trace.test.d.ts +5 -0
  85. package/dist/__tests__/dashboard-trace.test.d.ts.map +1 -0
  86. package/dist/__tests__/dashboard-trace.test.js +147 -0
  87. package/dist/__tests__/dashboard-trace.test.js.map +1 -0
  88. package/dist/__tests__/dashboard-validation.integration.test.d.ts +14 -0
  89. package/dist/__tests__/dashboard-validation.integration.test.d.ts.map +1 -0
  90. package/dist/__tests__/dashboard-validation.integration.test.js +221 -0
  91. package/dist/__tests__/dashboard-validation.integration.test.js.map +1 -0
  92. package/dist/__tests__/dashboard-view-conformance.test.d.ts +12 -0
  93. package/dist/__tests__/dashboard-view-conformance.test.d.ts.map +1 -0
  94. package/dist/__tests__/dashboard-view-conformance.test.js +58 -0
  95. package/dist/__tests__/dashboard-view-conformance.test.js.map +1 -0
  96. package/dist/__tests__/dashboard-view-coupling.test.d.ts +7 -0
  97. package/dist/__tests__/dashboard-view-coupling.test.d.ts.map +1 -0
  98. package/dist/__tests__/dashboard-view-coupling.test.js +381 -0
  99. package/dist/__tests__/dashboard-view-coupling.test.js.map +1 -0
  100. package/dist/__tests__/dashboard-view-distribution.test.d.ts +10 -0
  101. package/dist/__tests__/dashboard-view-distribution.test.d.ts.map +1 -0
  102. package/dist/__tests__/dashboard-view-distribution.test.js +272 -0
  103. package/dist/__tests__/dashboard-view-distribution.test.js.map +1 -0
  104. package/dist/__tests__/dashboard-view-graph.test.d.ts +13 -0
  105. package/dist/__tests__/dashboard-view-graph.test.d.ts.map +1 -0
  106. package/dist/__tests__/dashboard-view-graph.test.js +332 -0
  107. package/dist/__tests__/dashboard-view-graph.test.js.map +1 -0
  108. package/dist/__tests__/dashboard-view-template.test.d.ts +21 -0
  109. package/dist/__tests__/dashboard-view-template.test.d.ts.map +1 -0
  110. package/dist/__tests__/dashboard-view-template.test.js +153 -0
  111. package/dist/__tests__/dashboard-view-template.test.js.map +1 -0
  112. package/dist/__tests__/dashboard.test.d.ts +2 -0
  113. package/dist/__tests__/dashboard.test.d.ts.map +1 -0
  114. package/dist/__tests__/dashboard.test.js +129 -0
  115. package/dist/__tests__/dashboard.test.js.map +1 -0
  116. package/dist/__tests__/graph-tab.test.d.ts +10 -0
  117. package/dist/__tests__/graph-tab.test.d.ts.map +1 -0
  118. package/dist/__tests__/graph-tab.test.js +76 -0
  119. package/dist/__tests__/graph-tab.test.js.map +1 -0
  120. package/dist/checks.d.ts +7 -0
  121. package/dist/checks.d.ts.map +1 -0
  122. package/dist/checks.js +283 -0
  123. package/dist/checks.js.map +1 -0
  124. package/dist/code-paths/__tests__/views-registry.test.d.ts +13 -0
  125. package/dist/code-paths/__tests__/views-registry.test.d.ts.map +1 -0
  126. package/dist/code-paths/__tests__/views-registry.test.js +39 -0
  127. package/dist/code-paths/__tests__/views-registry.test.js.map +1 -0
  128. package/dist/code-paths/catalog-provenance.d.ts +22 -0
  129. package/dist/code-paths/catalog-provenance.d.ts.map +1 -0
  130. package/dist/code-paths/catalog-provenance.js +108 -0
  131. package/dist/code-paths/catalog-provenance.js.map +1 -0
  132. package/dist/code-paths/catalog-recipes-tables.d.ts +11 -0
  133. package/dist/code-paths/catalog-recipes-tables.d.ts.map +1 -0
  134. package/dist/code-paths/catalog-recipes-tables.js +86 -0
  135. package/dist/code-paths/catalog-recipes-tables.js.map +1 -0
  136. package/dist/code-paths/cytoscape-vendor.d.ts +27 -0
  137. package/dist/code-paths/cytoscape-vendor.d.ts.map +1 -0
  138. package/dist/code-paths/cytoscape-vendor.js +68 -0
  139. package/dist/code-paths/cytoscape-vendor.js.map +1 -0
  140. package/dist/code-paths/editor-link.d.ts +10 -0
  141. package/dist/code-paths/editor-link.d.ts.map +1 -0
  142. package/dist/code-paths/editor-link.js +20 -0
  143. package/dist/code-paths/editor-link.js.map +1 -0
  144. package/dist/code-paths/filters.d.ts +19 -0
  145. package/dist/code-paths/filters.d.ts.map +1 -0
  146. package/dist/code-paths/filters.js +47 -0
  147. package/dist/code-paths/filters.js.map +1 -0
  148. package/dist/code-paths/function-card.d.ts +15 -0
  149. package/dist/code-paths/function-card.d.ts.map +1 -0
  150. package/dist/code-paths/function-card.js +169 -0
  151. package/dist/code-paths/function-card.js.map +1 -0
  152. package/dist/code-paths/function-row.d.ts +17 -0
  153. package/dist/code-paths/function-row.d.ts.map +1 -0
  154. package/dist/code-paths/function-row.js +77 -0
  155. package/dist/code-paths/function-row.js.map +1 -0
  156. package/dist/code-paths/graph-controls.d.ts +27 -0
  157. package/dist/code-paths/graph-controls.d.ts.map +1 -0
  158. package/dist/code-paths/graph-controls.js +257 -0
  159. package/dist/code-paths/graph-controls.js.map +1 -0
  160. package/dist/code-paths/graph-scc.d.ts +32 -0
  161. package/dist/code-paths/graph-scc.d.ts.map +1 -0
  162. package/dist/code-paths/graph-scc.js +136 -0
  163. package/dist/code-paths/graph-scc.js.map +1 -0
  164. package/dist/code-paths/graph-stylesheet.d.ts +22 -0
  165. package/dist/code-paths/graph-stylesheet.d.ts.map +1 -0
  166. package/dist/code-paths/graph-stylesheet.js +121 -0
  167. package/dist/code-paths/graph-stylesheet.js.map +1 -0
  168. package/dist/code-paths/graph-view-model.d.ts +120 -0
  169. package/dist/code-paths/graph-view-model.d.ts.map +1 -0
  170. package/dist/code-paths/graph-view-model.js +199 -0
  171. package/dist/code-paths/graph-view-model.js.map +1 -0
  172. package/dist/code-paths/help-drawer.d.ts +18 -0
  173. package/dist/code-paths/help-drawer.d.ts.map +1 -0
  174. package/dist/code-paths/help-drawer.js +54 -0
  175. package/dist/code-paths/help-drawer.js.map +1 -0
  176. package/dist/code-paths/indexes.d.ts +28 -0
  177. package/dist/code-paths/indexes.d.ts.map +1 -0
  178. package/dist/code-paths/indexes.js +97 -0
  179. package/dist/code-paths/indexes.js.map +1 -0
  180. package/dist/code-paths/path-utils.d.ts +15 -0
  181. package/dist/code-paths/path-utils.d.ts.map +1 -0
  182. package/dist/code-paths/path-utils.js +47 -0
  183. package/dist/code-paths/path-utils.js.map +1 -0
  184. package/dist/code-paths/search.d.ts +14 -0
  185. package/dist/code-paths/search.d.ts.map +1 -0
  186. package/dist/code-paths/search.js +54 -0
  187. package/dist/code-paths/search.js.map +1 -0
  188. package/dist/code-paths/trace.d.ts +11 -0
  189. package/dist/code-paths/trace.d.ts.map +1 -0
  190. package/dist/code-paths/trace.js +60 -0
  191. package/dist/code-paths/trace.js.map +1 -0
  192. package/dist/code-paths/view-coupling.d.ts +22 -0
  193. package/dist/code-paths/view-coupling.d.ts.map +1 -0
  194. package/dist/code-paths/view-coupling.js +218 -0
  195. package/dist/code-paths/view-coupling.js.map +1 -0
  196. package/dist/code-paths/view-distribution.d.ts +20 -0
  197. package/dist/code-paths/view-distribution.d.ts.map +1 -0
  198. package/dist/code-paths/view-distribution.js +82 -0
  199. package/dist/code-paths/view-distribution.js.map +1 -0
  200. package/dist/code-paths/view-graph.d.ts +35 -0
  201. package/dist/code-paths/view-graph.d.ts.map +1 -0
  202. package/dist/code-paths/view-graph.js +379 -0
  203. package/dist/code-paths/view-graph.js.map +1 -0
  204. package/dist/code-paths/view-template.d.ts +154 -0
  205. package/dist/code-paths/view-template.d.ts.map +1 -0
  206. package/dist/code-paths/view-template.js +218 -0
  207. package/dist/code-paths/view-template.js.map +1 -0
  208. package/dist/code-paths/views-registry.d.ts +13 -0
  209. package/dist/code-paths/views-registry.d.ts.map +1 -0
  210. package/dist/code-paths/views-registry.js +53 -0
  211. package/dist/code-paths/views-registry.js.map +1 -0
  212. package/dist/code-paths.d.ts +69 -0
  213. package/dist/code-paths.d.ts.map +1 -0
  214. package/dist/code-paths.js +356 -0
  215. package/dist/code-paths.js.map +1 -0
  216. package/dist/css/cards.d.ts +9 -0
  217. package/dist/css/cards.d.ts.map +1 -0
  218. package/dist/css/cards.js +36 -0
  219. package/dist/css/cards.js.map +1 -0
  220. package/dist/css/code-paths.d.ts +9 -0
  221. package/dist/css/code-paths.d.ts.map +1 -0
  222. package/dist/css/code-paths.js +111 -0
  223. package/dist/css/code-paths.js.map +1 -0
  224. package/dist/css/data-table.d.ts +12 -0
  225. package/dist/css/data-table.d.ts.map +1 -0
  226. package/dist/css/data-table.js +103 -0
  227. package/dist/css/data-table.js.map +1 -0
  228. package/dist/css/function-card.d.ts +6 -0
  229. package/dist/css/function-card.d.ts.map +1 -0
  230. package/dist/css/function-card.js +26 -0
  231. package/dist/css/function-card.js.map +1 -0
  232. package/dist/css/help-drawer.d.ts +6 -0
  233. package/dist/css/help-drawer.d.ts.map +1 -0
  234. package/dist/css/help-drawer.js +22 -0
  235. package/dist/css/help-drawer.js.map +1 -0
  236. package/dist/css/tabs.d.ts +9 -0
  237. package/dist/css/tabs.d.ts.map +1 -0
  238. package/dist/css/tabs.js +28 -0
  239. package/dist/css/tabs.js.map +1 -0
  240. package/dist/css/theme.d.ts +8 -0
  241. package/dist/css/theme.d.ts.map +1 -0
  242. package/dist/css/theme.js +34 -0
  243. package/dist/css/theme.js.map +1 -0
  244. package/dist/css.d.ts +13 -0
  245. package/dist/css.d.ts.map +1 -0
  246. package/dist/css.js +30 -0
  247. package/dist/css.js.map +1 -0
  248. package/dist/generator.d.ts +33 -0
  249. package/dist/generator.d.ts.map +1 -0
  250. package/dist/generator.js +161 -0
  251. package/dist/generator.js.map +1 -0
  252. package/dist/index.d.ts +21 -0
  253. package/dist/index.d.ts.map +1 -0
  254. package/dist/index.js +20 -0
  255. package/dist/index.js.map +1 -0
  256. package/dist/overview.d.ts +13 -0
  257. package/dist/overview.d.ts.map +1 -0
  258. package/dist/overview.js +91 -0
  259. package/dist/overview.js.map +1 -0
  260. package/dist/recipes.d.ts +6 -0
  261. package/dist/recipes.d.ts.map +1 -0
  262. package/dist/recipes.js +68 -0
  263. package/dist/recipes.js.map +1 -0
  264. package/dist/sessions.d.ts +6 -0
  265. package/dist/sessions.d.ts.map +1 -0
  266. package/dist/sessions.js +288 -0
  267. package/dist/sessions.js.map +1 -0
  268. package/dist/shared/el.d.ts +13 -0
  269. package/dist/shared/el.d.ts.map +1 -0
  270. package/dist/shared/el.js +27 -0
  271. package/dist/shared/el.js.map +1 -0
  272. package/dist/shared/pagination.d.ts +15 -0
  273. package/dist/shared/pagination.d.ts.map +1 -0
  274. package/dist/shared/pagination.js +113 -0
  275. package/dist/shared/pagination.js.map +1 -0
  276. package/dist/shared/sortable.d.ts +14 -0
  277. package/dist/shared/sortable.d.ts.map +1 -0
  278. package/dist/shared/sortable.js +101 -0
  279. package/dist/shared/sortable.js.map +1 -0
  280. package/dist/shared/tab-activators.d.ts +16 -0
  281. package/dist/shared/tab-activators.d.ts.map +1 -0
  282. package/dist/shared/tab-activators.js +33 -0
  283. package/dist/shared/tab-activators.js.map +1 -0
  284. package/dist/shared/tab-bar.d.ts +8 -0
  285. package/dist/shared/tab-bar.d.ts.map +1 -0
  286. package/dist/shared/tab-bar.js +20 -0
  287. package/dist/shared/tab-bar.js.map +1 -0
  288. package/dist/shared.d.ts +26 -0
  289. package/dist/shared.d.ts.map +1 -0
  290. package/dist/shared.js +39 -0
  291. package/dist/shared.js.map +1 -0
  292. package/dist/subtab-bar.d.ts +23 -0
  293. package/dist/subtab-bar.d.ts.map +1 -0
  294. package/dist/subtab-bar.js +77 -0
  295. package/dist/subtab-bar.js.map +1 -0
  296. package/dist/tool-tab-registry.d.ts +76 -0
  297. package/dist/tool-tab-registry.d.ts.map +1 -0
  298. package/dist/tool-tab-registry.js +44 -0
  299. package/dist/tool-tab-registry.js.map +1 -0
  300. package/dist/tool-tabs-registrations.d.ts +19 -0
  301. package/dist/tool-tabs-registrations.d.ts.map +1 -0
  302. package/dist/tool-tabs-registrations.js +46 -0
  303. package/dist/tool-tabs-registrations.js.map +1 -0
  304. package/dist/tool-tabs.d.ts +12 -0
  305. package/dist/tool-tabs.d.ts.map +1 -0
  306. package/dist/tool-tabs.js +80 -0
  307. package/dist/tool-tabs.js.map +1 -0
  308. package/dist/vendor/cytoscape-bundle.js +600 -0
  309. package/package.json +52 -0
@@ -0,0 +1,356 @@
1
+ // @fitness-ignore-file module-coupling-fan-out -- Panel aggregator: composes JS-string emitters from sibling view-*.ts modules; fan-out is intrinsic to its role as the entry point
2
+ /**
3
+ * Dashboard Code Paths panel — graph-tool surface with two subtabs:
4
+ * 1. Sessions — recent graph runs and their per-rule findings
5
+ * (uses the shared renderSessionTable from sessions.ts).
6
+ * 2. Explore — interactive catalog browser with three views
7
+ * (Graph, Coupling, Functions/distribution). The Graph view
8
+ * carries the SCC cycle highlight that the standalone SCCs view
9
+ * used to own. The Functions view absorbs the former standalone
10
+ * Search subtab via an in-table name filter.
11
+ *
12
+ * Architecture: vanilla DOM, no framework. Each view-*.ts emits a
13
+ * JS string that pushes a `View` literal into the singleton `views`
14
+ * registry. The Explore subtab renders the view tab bar + one
15
+ * container per view; Sessions subtab renders the standard session
16
+ * table.
17
+ *
18
+ * The file imports JS-string emitters from sibling modules under
19
+ * `code-paths/`. It MUST NOT import from `@opensip-cli/graph` —
20
+ * the catalog is consumed by JSON shape only (the structural shape
21
+ * lives in @opensip-cli/contracts to keep this panel decoupled
22
+ * from the graph engine's runtime types).
23
+ */
24
+ import { dashboardCatalogProvenanceJs } from './code-paths/catalog-provenance.js';
25
+ import { dashboardCatalogRecipesTablesJs } from './code-paths/catalog-recipes-tables.js';
26
+ import { dashboardCytoscapeVendorJs } from './code-paths/cytoscape-vendor.js';
27
+ import { dashboardEditorLinkJs } from './code-paths/editor-link.js';
28
+ import { dashboardFiltersJs } from './code-paths/filters.js';
29
+ import { dashboardFunctionCardJs } from './code-paths/function-card.js';
30
+ import { dashboardFunctionRowJs } from './code-paths/function-row.js';
31
+ import { dashboardHelpDrawerJs } from './code-paths/help-drawer.js';
32
+ import { dashboardIndexesJs } from './code-paths/indexes.js';
33
+ import { dashboardPathUtilsJs } from './code-paths/path-utils.js';
34
+ import { dashboardSearchJs } from './code-paths/search.js';
35
+ import { dashboardTraceJs } from './code-paths/trace.js';
36
+ import { dashboardViewCouplingJs } from './code-paths/view-coupling.js';
37
+ import { dashboardViewDistributionJs } from './code-paths/view-distribution.js';
38
+ import { dashboardViewGraphJs } from './code-paths/view-graph.js';
39
+ import { dashboardViewsRegistryJs } from './code-paths/views-registry.js';
40
+ /**
41
+ * Build flag for the Code Paths explore-tab restructure.
42
+ *
43
+ * `true` (Plan D default, current): the restructured set — graph (with the
44
+ * SCC-highlight fold) / coupling + the ranked-distribution "Functions"
45
+ * affordance (which hosts the in-table name filter that replaced the
46
+ * former standalone Search subtab). The legacy single-metric views
47
+ * (`view-big/hot/wide/untested/sccs`) were deleted in Plan D once their
48
+ * signal moved into the engine gate rules (`graph:large-function`,
49
+ * `graph:wide-function`, `graph:high-blast-untested`, `graph:cycle`); the
50
+ * standalone SCCs view's signal lives on as the graph view's cycle highlight.
51
+ *
52
+ * `false`: there is no legacy branch anymore — the constant is retained only
53
+ * as the default for the `dashboardCodePathsJs(restructured)` test seam, which
54
+ * always exercises the restructured set.
55
+ *
56
+ * This is a build-time, server-side seam — no runtime toggle in the page.
57
+ */
58
+ const RESTRUCTURED_EXPLORE_TABS = true;
59
+ /**
60
+ * Concatenation order is load-bearing — each emitter declares
61
+ * top-level names that later emitters reference. The order below is
62
+ * the topological sort; reordering will silently break the page with
63
+ * `<name> is not defined`. Free-identifier dependencies of each
64
+ * emitter, listed against the emitter that supplies them:
65
+ *
66
+ * 1. path-utils — declares `displayName`, `packageOfPath`, `pkgOf`,
67
+ * `shortPkg`.
68
+ * 2. indexes — declares `buildIndexes`, `resolveCalleeOcc`. Uses
69
+ * `pkgOf` (path-utils, above).
70
+ * 3. filters — declares `filterState` (default, non-interactive),
71
+ * `passesFilter`, `packagesInCatalog`, `KIND_LIST`.
72
+ * Uses `pkgOf` (path-utils, above).
73
+ * 4. editor-link — declares `editorLink`. Reads `EDITOR_PROTOCOL`
74
+ * (declared in generator.ts before the script
75
+ * block).
76
+ * 5. trace — declares `findUpstreamTrace`. Uses `indexes`.
77
+ * 6. search — declares `searchFunctions`. Uses `indexes`,
78
+ * `displayName`.
79
+ * 7. function-row — declares `renderFunctionRows` and the empty
80
+ * states it uses. Calls `el`, `displayName`,
81
+ * `packageOfPath`, `passesFilter`.
82
+ * 8. function-card — declares `openFunctionCard`, `closeFunctionCard`.
83
+ * Uses `editorLink`, `findUpstreamTrace`, `el`.
84
+ * 9. views-registry — declares the singleton `views = []` array.
85
+ * Must come before any view emitter.
86
+ * 10. help-drawer — declares `openHelpDrawer`. No external deps
87
+ * beyond `el`.
88
+ * 11-13. view-* — push View descriptors into `views` in TAB order:
89
+ * coupling / distribution / graph (alphabetical:
90
+ * Coupling, Functions, Visualization — the first is the
91
+ * default view). Each renderer closes over `el`,
92
+ * `passesFilter`, `displayName`, `packageOfPath`,
93
+ * `renderFunctionRows`, plus its own utilities; the
94
+ * Visualization renderer also uses `resolveCalleeOcc`
95
+ * (prelude) for its function-level projection.
96
+ * 15. panelOrchestrator — top-level `renderCodePathsTab`,
97
+ * `renderCodePathsExplore`, `openCodePathsSession`.
98
+ * Uses every name above plus `renderSubtabBar`
99
+ * (from shared/) and `registerTabActivator`.
100
+ *
101
+ * If the list grows past ~30 entries, replace this manual order with
102
+ * a `{ id, deps, emit }` topological sort.
103
+ */
104
+ export function dashboardCodePathsJs(_restructured = RESTRUCTURED_EXPLORE_TABS) {
105
+ // The explore-tab restructure has shipped: there is one view set (coupling /
106
+ // distribution / graph). The `_restructured` parameter is kept
107
+ // for the test seam's call-shape compatibility but no longer selects a
108
+ // legacy branch (the single-metric view emitters were deleted in Plan D).
109
+ // Shared prelude — utilities + the views registry + help drawer. Every view
110
+ // emitter depends on these top-level names.
111
+ const prelude = [
112
+ // 0. cytoscape vendor — defines the `cytoscape` / `cytoscapeDagre`
113
+ // browser globals the Graph view consumes. MUST precede any view
114
+ // emitter that references them. No deps of its own.
115
+ dashboardCytoscapeVendorJs(),
116
+ dashboardPathUtilsJs(),
117
+ dashboardIndexesJs(),
118
+ dashboardFiltersJs(),
119
+ // Depends on `packagesInCatalog` (filters, above) + `el`; declares
120
+ // `renderCatalogProvenance`, called at the top of the Explore body.
121
+ dashboardCatalogProvenanceJs(),
122
+ // Declares `renderGraphRuleCatalog` / `renderGraphRecipeCatalog` (the
123
+ // Catalog/Recipes subtab tables); only needs `el`.
124
+ dashboardCatalogRecipesTablesJs(),
125
+ dashboardEditorLinkJs(),
126
+ dashboardTraceJs(),
127
+ dashboardSearchJs(),
128
+ dashboardFunctionRowJs(),
129
+ dashboardFunctionCardJs(),
130
+ dashboardViewsRegistryJs(),
131
+ dashboardHelpDrawerJs(),
132
+ ];
133
+ // The kept visualizations + the ranked-distribution affordance, in TAB
134
+ // order (alphabetical): Coupling, Functions, Visualization. `views[0]` is
135
+ // the default view, so Coupling opens first. SCCs fold into the graph view's
136
+ // cycle highlight; the single-metric tabs were dropped (their signal moved
137
+ // into the engine gate rules). `renderCodePathsExplore` iterates `views` to
138
+ // build the tab bar. Emission order here is also the runtime registry order;
139
+ // the three view emitters have no cross-dependencies (each only references
140
+ // prelude names), so this order is free to match the desired tab order.
141
+ const views = [dashboardViewCouplingJs(), dashboardViewDistributionJs(), dashboardViewGraphJs()];
142
+ return [...prelude, ...views, panelOrchestratorJs()].join('\n');
143
+ }
144
+ /**
145
+ * Top-level orchestrator emitter for the Code Paths tab. Concerns,
146
+ * with the section delimiters that mark them in the emitted JS:
147
+ *
148
+ * 1. CATALOG STATE — singleton `graphCatalog` and `graphIndexes`.
149
+ * 2. CATALOG LOAD — `loadGraphCatalogFromBlob` reads the inline
150
+ * `<script id="graph-catalog">` blob.
151
+ * 3. PANEL ENTRY — `renderCodePathsTab` mounts the Sessions /
152
+ * Explore subtabs via `renderSubtabBar` (F2).
153
+ * 4. EXPLORE BODY — `renderCodePathsExplore` builds the view tab
154
+ * bar, view containers, row-click delegation, escape handler,
155
+ * and runs each view's initial render.
156
+ * 5. HASH ROUTE — `readViewIdFromHash` parses `#code-paths/<id>`
157
+ * for deep-link initial view.
158
+ * 6. CROSS-TAB NAV — `openCodePathsSession` is the activator
159
+ * Overview's row-click handler invokes via
160
+ * `activateTabForSession` for graph sessions.
161
+ * 7. ACTIVATOR REGISTRATION — registers `openCodePathsSession`
162
+ * under key `'graph'` in the shared `tabActivators` registry.
163
+ *
164
+ * The escape handler in EXPLORE BODY is attached to `document`; if
165
+ * `renderCodePathsTab` runs more than once (it does not today) the
166
+ * handler would leak.
167
+ */
168
+ function panelOrchestratorJs() {
169
+ return String.raw `
170
+ // =======================================================
171
+ // CODE PATHS — CATALOG STATE
172
+ // =======================================================
173
+ let graphCatalog = null;
174
+ let graphIndexes = { byBodyHash: new Map(), occurrencesByHash: new Map(), bySimpleName: new Map(), callees: new Map(), callers: new Map() };
175
+
176
+ // =======================================================
177
+ // CODE PATHS — CATALOG LOAD
178
+ // =======================================================
179
+ function loadGraphCatalogFromBlob() {
180
+ const blob = document.getElementById('graph-catalog');
181
+ if (!blob || !blob.textContent) return null;
182
+ try {
183
+ return JSON.parse(blob.textContent);
184
+ } catch (err) {
185
+ return null;
186
+ }
187
+ }
188
+
189
+ // =======================================================
190
+ // CODE PATHS — PANEL ENTRY (Sessions | Explore subtabs)
191
+ // =======================================================
192
+ function renderCodePathsTab() {
193
+ const panel = document.getElementById('panel-code-paths');
194
+ if (!panel) return;
195
+ while (panel.firstChild) panel.removeChild(panel.firstChild);
196
+
197
+ const graphSessions = sessions.filter(s => s.tool === 'graph');
198
+ graphCatalog = loadGraphCatalogFromBlob();
199
+
200
+ // Code Paths uses the shared renderSubtabBar Strategy (F2). The
201
+ // two-subtab Sessions/Explore shape is a config; the DOM-and-click
202
+ // boilerplate now lives in subtab-bar.ts and is shared with
203
+ // renderToolTab's three-subtab shape. The subtabs render even when
204
+ // empty so the tab matches the visual pattern used by Fitness and
205
+ // Simulation (subtab bar + italic-centered .empty placeholder).
206
+ renderSubtabBar(panel, [
207
+ {
208
+ id: 'sessions',
209
+ label: 'Sessions',
210
+ render: function(p) {
211
+ if (graphSessions.length > 0) {
212
+ renderSessionTable(p, graphSessions, 'var(--accent)');
213
+ } else {
214
+ p.appendChild(el('div', { class: 'empty', text: 'No sessions yet.' }));
215
+ }
216
+ },
217
+ },
218
+ {
219
+ id: 'catalog',
220
+ label: 'Catalog',
221
+ render: function(p) {
222
+ renderGraphRuleCatalog(p, typeof graphRuleCatalog !== 'undefined' ? graphRuleCatalog : []);
223
+ },
224
+ },
225
+ {
226
+ id: 'recipes',
227
+ label: 'Recipes',
228
+ render: function(p) {
229
+ renderGraphRecipeCatalog(p, typeof graphRecipeCatalog !== 'undefined' ? graphRecipeCatalog : []);
230
+ },
231
+ },
232
+ {
233
+ id: 'explore',
234
+ label: 'Explore',
235
+ render: function(p) {
236
+ if (graphCatalog) {
237
+ renderCodePathsExplore(p);
238
+ } else {
239
+ p.appendChild(el('div', { class: 'empty', text: 'No catalog yet.' }));
240
+ }
241
+ },
242
+ },
243
+ ]);
244
+ }
245
+
246
+ // =======================================================
247
+ // CODE PATHS — EXPLORE BODY (view tab bar + view stack)
248
+ // =======================================================
249
+ function renderCodePathsExplore(host) {
250
+ graphIndexes = buildIndexes(graphCatalog);
251
+
252
+ // Provenance bar — what this Explore view is built from (package scope,
253
+ // function count, build time, engine). Shown above the view tabs so a SCOPED
254
+ // or stale catalog (e.g. a 'graph packages/contracts' run) reads as "1
255
+ // package, built 8 min ago", not as a broken/empty graph. Covers all three
256
+ // views since they share the one cached catalog.
257
+ renderCatalogProvenance(host, graphCatalog);
258
+
259
+ // (No shared filter chip bar — the Visualization view owns its own controls;
260
+ // the Functions table reads the default filterState via passesFilter.)
261
+
262
+ // View tab bar — built from the registered views.
263
+ const tabBar = el('div', { class: 'code-paths-tabs', id: 'code-paths-tabs' });
264
+ for (const view of views) {
265
+ const tab = el('div', {
266
+ class: 'code-paths-tab',
267
+ 'data-view': view.id,
268
+ text: view.label,
269
+ onclick: () => activateView(view.id),
270
+ });
271
+ tabBar.appendChild(tab);
272
+ }
273
+ host.appendChild(tabBar);
274
+
275
+ // One container per view; only one is .active at a time.
276
+ const stack = el('div', { class: 'code-paths-view-container', id: 'code-paths-view-container' });
277
+ for (const view of views) {
278
+ const c = el('div', { class: 'code-paths-view', id: 'code-paths-view-' + view.id });
279
+ stack.appendChild(c);
280
+ }
281
+ host.appendChild(stack);
282
+
283
+ // Delegate row clicks to the function card.
284
+ stack.addEventListener('click', e => {
285
+ const row = e.target.closest && e.target.closest('[data-body-hash]');
286
+ if (!row) return;
287
+ openFunctionCard(row.dataset.bodyHash);
288
+ });
289
+
290
+ // Escape closes the function card.
291
+ document.addEventListener('keydown', e => {
292
+ if (e.key === 'Escape') closeFunctionCard();
293
+ });
294
+
295
+ // Render every view once on init.
296
+ for (const view of views) {
297
+ const container = document.getElementById('code-paths-view-' + view.id);
298
+ if (container) view.render(container, graphCatalog, graphIndexes, filterState);
299
+ }
300
+ const initialId = readViewIdFromHash() || (views[0] && views[0].id);
301
+ if (initialId) activateView(initialId);
302
+ }
303
+
304
+ // =======================================================
305
+ // CODE PATHS — HASH ROUTE (deep-link initial view)
306
+ // =======================================================
307
+ function readViewIdFromHash() {
308
+ const m = /^#code-paths\/([a-z]+)/.exec(window.location.hash || '');
309
+ return m ? m[1] : null;
310
+ }
311
+
312
+ // =======================================================
313
+ // CODE PATHS — CROSS-TAB NAV (graph sessions deep-link)
314
+ // =======================================================
315
+ /**
316
+ * Open the Code Paths tab on the Sessions subtab, scrolling to and
317
+ * selecting the row matching the given session id. Used by the
318
+ * Overview row-click handler so a graph row in Recent Activity opens
319
+ * the same per-session detail view that fit/sim rows open.
320
+ *
321
+ * Registered into the shared tabActivators registry under the key
322
+ * 'graph' (the StoredSession.tool value for graph runs); the Overview
323
+ * row-click handler invokes it through activateTabForSession() rather
324
+ * than naming this function directly.
325
+ */
326
+ function openCodePathsSession(sessionId) {
327
+ const tab = document.querySelector('.tab[data-tab="code-paths"]');
328
+ const panel = document.getElementById('panel-code-paths');
329
+ if (!tab || !panel) return;
330
+ document.querySelectorAll('.tab').forEach(t => t.classList.remove('active'));
331
+ document.querySelectorAll('.tab-panel').forEach(p => p.classList.remove('active'));
332
+ tab.classList.add('active');
333
+ panel.classList.add('active');
334
+ // Force the Sessions subtab.
335
+ const sessionsSub = panel.querySelector('.subtab[data-subtab="sessions"]');
336
+ const exploreSub = panel.querySelector('.subtab[data-subtab="explore"]');
337
+ const sessionsPanel = document.getElementById('panel-code-paths-sessions');
338
+ const explorePanel = document.getElementById('panel-code-paths-explore');
339
+ if (sessionsSub) sessionsSub.classList.add('active');
340
+ if (exploreSub) exploreSub.classList.remove('active');
341
+ if (sessionsPanel) sessionsPanel.classList.add('active');
342
+ if (explorePanel) explorePanel.classList.remove('active');
343
+ // Click the matching row to trigger the standard renderDetail flow.
344
+ const row = sessionsPanel && sessionsPanel.querySelector('tr[data-session-id="' + sessionId + '"]');
345
+ if (row) row.click();
346
+ }
347
+
348
+ // =======================================================
349
+ // CODE PATHS — ACTIVATOR REGISTRATION
350
+ // =======================================================
351
+ if (typeof registerTabActivator === 'function') {
352
+ registerTabActivator('graph', openCodePathsSession);
353
+ }
354
+ `;
355
+ }
356
+ //# sourceMappingURL=code-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-paths.js","sourceRoot":"","sources":["../src/code-paths.ts"],"names":[],"mappings":"AAAA,oLAAoL;AACpL;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,OAAO,EAAE,4BAA4B,EAAE,MAAM,oCAAoC,CAAC;AAClF,OAAO,EAAE,+BAA+B,EAAE,MAAM,wCAAwC,CAAC;AACzF,OAAO,EAAE,0BAA0B,EAAE,MAAM,kCAAkC,CAAC;AAC9E,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,sBAAsB,EAAE,MAAM,8BAA8B,CAAC;AACtE,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AACpE,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,+BAA+B,CAAC;AACxE,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,oBAAoB,EAAE,MAAM,4BAA4B,CAAC;AAClE,OAAO,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAE1E;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,yBAAyB,GAAG,IAAI,CAAC;AAEvC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4CG;AACH,MAAM,UAAU,oBAAoB,CAAC,gBAAyB,yBAAyB;IACrF,6EAA6E;IAC7E,+DAA+D;IAC/D,uEAAuE;IACvE,0EAA0E;IAC1E,4EAA4E;IAC5E,4CAA4C;IAC5C,MAAM,OAAO,GAAG;QACd,mEAAmE;QACnE,oEAAoE;QACpE,uDAAuD;QACvD,0BAA0B,EAAE;QAC5B,oBAAoB,EAAE;QACtB,kBAAkB,EAAE;QACpB,kBAAkB,EAAE;QACpB,mEAAmE;QACnE,oEAAoE;QACpE,4BAA4B,EAAE;QAC9B,sEAAsE;QACtE,mDAAmD;QACnD,+BAA+B,EAAE;QACjC,qBAAqB,EAAE;QACvB,gBAAgB,EAAE;QAClB,iBAAiB,EAAE;QACnB,sBAAsB,EAAE;QACxB,uBAAuB,EAAE;QACzB,wBAAwB,EAAE;QAC1B,qBAAqB,EAAE;KACxB,CAAC;IAEF,uEAAuE;IACvE,0EAA0E;IAC1E,6EAA6E;IAC7E,2EAA2E;IAC3E,4EAA4E;IAC5E,6EAA6E;IAC7E,2EAA2E;IAC3E,wEAAwE;IACxE,MAAM,KAAK,GAAG,CAAC,uBAAuB,EAAE,EAAE,2BAA2B,EAAE,EAAE,oBAAoB,EAAE,CAAC,CAAC;IAEjG,OAAO,CAAC,GAAG,OAAO,EAAE,GAAG,KAAK,EAAE,mBAAmB,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,SAAS,mBAAmB;IAC1B,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyLlB,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Cards, stats grid, sections, empty states, and the trend chart.
3
+ *
4
+ * Container shells used by every panel — score cards, the
5
+ * `.section + .card` shell that wraps every tabular view, and the
6
+ * empty-state placeholder.
7
+ */
8
+ export declare function dashboardCssCards(): string;
9
+ //# sourceMappingURL=cards.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.d.ts","sourceRoot":"","sources":["../../src/css/cards.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,iBAAiB,IAAI,MAAM,CA2B1C"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Cards, stats grid, sections, empty states, and the trend chart.
3
+ *
4
+ * Container shells used by every panel — score cards, the
5
+ * `.section + .card` shell that wraps every tabular view, and the
6
+ * empty-state placeholder.
7
+ */
8
+ export function dashboardCssCards() {
9
+ return String.raw `
10
+ /* Cards and stats */
11
+ .stat-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr)); gap: 12px; margin-bottom: 24px; }
12
+ .stat-card { background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; }
13
+ .stat-label { font-size: 12px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.05em; margin-bottom: 4px; }
14
+ .stat-value { font-size: 28px; font-weight: 700; }
15
+ .score-good { color: var(--success); } .score-warn { color: var(--warning); } .score-bad { color: var(--error); }
16
+ .card { background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; margin-bottom: 16px; }
17
+ .section { margin-bottom: 32px; }
18
+ .empty { color: var(--text-dim); font-style: italic; padding: 24px; text-align: center; }
19
+
20
+ /* Contributed per-run tabs (host-owned-run-timing Phase 5) — generic
21
+ declarative views rendered without any tool import. */
22
+ .panel-title { font-size: 18px; font-weight: 600; margin: 0 0 16px; }
23
+ .chart-title { font-size: 14px; font-weight: 600; color: var(--text-dim); margin-bottom: 8px; }
24
+ .timeline { display: flex; flex-direction: column; gap: 8px; }
25
+ .timeline-row { display: flex; gap: 12px; align-items: baseline; padding: 8px 12px; background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius-sm); }
26
+ .timeline-time { font-variant-numeric: tabular-nums; color: var(--text-dim); font-size: 12px; white-space: nowrap; }
27
+ .timeline-detail { font-size: 13px; }
28
+ .contributed-html { white-space: pre-wrap; word-break: break-word; background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); padding: 16px; font-size: 12px; overflow-x: auto; }
29
+
30
+ /* Trend chart */
31
+ .trend-chart { display: flex; align-items: flex-end; gap: 4px; height: 80px; padding: 16px; background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius); margin-bottom: 24px; }
32
+ .trend-bar { flex: 1; border-radius: 2px 2px 0 0; min-width: 8px; max-width: 40px; position: relative; cursor: pointer; }
33
+ .trend-bar:hover::after { content: attr(data-tooltip); position: absolute; bottom: calc(100% + 4px); left: 50%; transform: translateX(-50%); background: var(--bg-hover); color: var(--text); padding: 4px 8px; border-radius: var(--radius-sm); font-size: 11px; white-space: nowrap; border: 1px solid var(--border); }
34
+ `;
35
+ }
36
+ //# sourceMappingURL=cards.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cards.js","sourceRoot":"","sources":["../../src/css/cards.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;CAyBlB,CAAC;AACF,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Code Paths panel styling — search/chip bar, filter drawer, view tab
3
+ * bar, info button, view containers, and the Coupling heat-map.
4
+ *
5
+ * All selectors here are scoped to `.code-paths-*` so they cannot
6
+ * accidentally style the fit/sim panels.
7
+ */
8
+ export declare function dashboardCssCodePaths(): string;
9
+ //# sourceMappingURL=code-paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-paths.d.ts","sourceRoot":"","sources":["../../src/css/code-paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CAsG9C"}
@@ -0,0 +1,111 @@
1
+ /**
2
+ * Code Paths panel styling — search/chip bar, filter drawer, view tab
3
+ * bar, info button, view containers, and the Coupling heat-map.
4
+ *
5
+ * All selectors here are scoped to `.code-paths-*` so they cannot
6
+ * accidentally style the fit/sim panels.
7
+ */
8
+ export function dashboardCssCodePaths() {
9
+ return String.raw `
10
+ /* ====== Code Paths panel (v0.3) ====== */
11
+ .code-paths-search { width: 320px; margin-bottom: 12px; display: block; }
12
+ /* (The shared filter chip bar / collapsible filter drawer was removed — the
13
+ Visualization view owns its own controls and the other views don't need it.) */
14
+ .code-paths-tabs { display: flex; gap: 0; border-bottom: 1px solid var(--border); margin-bottom: 16px; flex-wrap: wrap; }
15
+ .code-paths-tab { padding: 8px 16px; cursor: pointer; color: var(--text-dim); font-size: 13px; font-weight: 500; border-bottom: 2px solid transparent; transition: color 0.15s, border-color 0.15s; user-select: none; }
16
+ .code-paths-tab:hover { color: var(--text-secondary); }
17
+ .code-paths-tab.active { color: var(--text); border-bottom-color: var(--accent); }
18
+
19
+ /* Inline ⓘ button next to a section heading; opens the help drawer. */
20
+ .section-info { background: var(--bg-surface); border: 1px solid var(--border); color: var(--text-dim); width: 18px; height: 18px; border-radius: 50%; font-size: 11px; font-style: italic; font-weight: 700; line-height: 16px; padding: 0; margin-left: 8px; cursor: pointer; display: inline-flex; align-items: center; justify-content: center; vertical-align: middle; transition: color 0.15s, border-color 0.15s; }
21
+ .section-info:hover { color: var(--accent); border-color: var(--accent); }
22
+ .code-paths-view { display: none; }
23
+ .code-paths-view.active { display: block; }
24
+
25
+ /* Code Paths tables can hold long file paths and synthetic function
26
+ names; allow cells to wrap rather than overflow the card width. */
27
+ .code-paths-view .data-table { table-layout: fixed; width: 100%; }
28
+ .code-paths-view .data-table td,
29
+ .code-paths-view .data-table th { white-space: normal; word-break: break-all; overflow-wrap: anywhere; vertical-align: top; }
30
+
31
+ /* ====== Code Paths Graph view (Cytoscape) ====== */
32
+ .code-paths-graph-toolbar { display: flex; align-items: center; gap: 8px; margin-bottom: 10px; flex-wrap: wrap; }
33
+ .code-paths-graph-toolbar-label { font-size: 11px; color: var(--text-dim); text-transform: uppercase; letter-spacing: 0.05em; font-weight: 600; }
34
+ /* Visualization controls — a 2-row × 4-column grid; each cell is a labeled
35
+ control (label + control flex pair). Auto-flow fills 4 cells per row:
36
+ Row 1: Layout · Scope · Search · Highlight cycles
37
+ Row 2: Level · Package · Kind · Edges
38
+ Each label has a fixed width so the controls line up within a column, and
39
+ the columns are content-sized so the rows read like a table. Package, Kind,
40
+ and Edges are disabled at package level (they only apply at function level),
41
+ so they fade rather than vanish. */
42
+ .code-paths-graph-grid { display: grid; grid-template-columns: repeat(4, max-content); gap: 12px 24px; align-items: center; margin-bottom: 12px; }
43
+ .code-paths-graph-cell { display: flex; align-items: center; gap: 8px; }
44
+ .code-paths-graph-cell .code-paths-graph-toolbar-label { min-width: 56px; text-align: right; }
45
+ .code-paths-graph-cell .code-paths-graph-select { width: 190px; min-width: 0; }
46
+ .code-paths-graph-cell .code-paths-graph-ms { width: 190px; }
47
+ .code-paths-graph-cell .code-paths-graph-ms-trigger { width: 100%; }
48
+ .code-paths-graph-cell-search .code-paths-graph-search { width: 220px; margin-bottom: 0; }
49
+ .code-paths-graph-checkbox { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; color: var(--text-muted); cursor: pointer; user-select: none; height: 30px; }
50
+ .code-paths-graph-checkbox input { cursor: pointer; }
51
+ /* Functions view controls row (Kind · Package · search). */
52
+ .code-paths-ranked-controls { display: flex; align-items: center; flex-wrap: wrap; gap: 8px 10px; margin-bottom: 12px; }
53
+ .code-paths-ranked-controls .code-paths-search { margin-bottom: 0; }
54
+ .code-paths-graph-select { font-size: 12px; padding: 4px 8px; border-radius: var(--radius-sm); background: var(--bg-surface); border: 1px solid var(--border); color: var(--text-muted); font-family: var(--font); min-width: 150px; height: 30px; box-sizing: border-box; }
55
+ .code-paths-graph-select:disabled { opacity: 0.4; cursor: not-allowed; }
56
+ /* Kind multi-select: a trigger button + a checkbox popover (native
57
+ <select multiple> renders an always-open listbox, which looked wrong). */
58
+ .code-paths-graph-ms { position: relative; display: inline-block; }
59
+ .code-paths-graph-ms-trigger { cursor: pointer; text-align: left; }
60
+ .code-paths-graph-ms-panel { position: absolute; z-index: 30; top: calc(100% + 4px); left: 0; min-width: 190px; max-height: 230px; overflow-y: auto; background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 4px; box-shadow: 0 6px 18px rgba(0,0,0,0.45); }
61
+ .code-paths-graph-ms-item { display: flex; align-items: center; gap: 6px; padding: 4px 6px; font-size: 12px; color: var(--text-muted); cursor: pointer; white-space: nowrap; border-radius: 3px; }
62
+ .code-paths-graph-ms-item:hover { background: var(--bg-hover); color: var(--text); }
63
+ .code-paths-graph-banner { font-size: 12px; color: var(--text-muted); background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 6px 10px; margin-bottom: 10px; }
64
+ .code-paths-graph-search { width: 320px; margin-bottom: 10px; display: block; }
65
+ .code-paths-graph-canvas { width: 100%; height: 640px; background: var(--bg); border: 1px solid var(--border); border-radius: var(--radius-sm); }
66
+ /* Node highlight + impact states live on the Cytoscape canvas (set via cy
67
+ classes gv-search-hit / gv-search-fade / gv-selected / gv-upstream /
68
+ gv-downstream / gv-dimmed). The canvas can't read CSS custom properties,
69
+ so the authoritative colors are inline in view-graph.ts's stylesheet;
70
+ these DOM classes mirror the naming for any future DOM overlay. */
71
+ .search-hit { outline: 2px solid var(--accent); }
72
+ .search-fade { opacity: 0.3; }
73
+ .gv-selected { outline: 2px solid var(--accent); }
74
+ .gv-upstream { color: var(--accent-sim); }
75
+ .gv-downstream { color: var(--accent-fitness); }
76
+ .gv-dimmed { opacity: 0.1; }
77
+
78
+ /* Coupling toolbar (Export CSV) — sits between the heading and the matrix. */
79
+ .coupling-toolbar { display: flex; justify-content: flex-start; margin-bottom: 8px; }
80
+ .coupling-export-btn { background: var(--bg-surface); border: 1px solid var(--border); border-radius: var(--radius-sm); padding: 4px 12px; color: var(--text-muted); font-size: 12px; cursor: pointer; font-family: var(--font); }
81
+ .coupling-export-btn:hover { background: var(--bg-hover); color: var(--text); }
82
+
83
+ /* Coupling heat map cell shading — set --coupling-density per cell */
84
+ .coupling-cell { background: color-mix(in srgb, var(--bg-surface), var(--accent) calc(var(--coupling-density, 0) * 60%)); cursor: pointer; }
85
+ .coupling-cell.empty { color: var(--text-dim); cursor: default; }
86
+
87
+ /* Bounded, scrollable viewport so a large N×N matrix stays on the page —
88
+ gives both a vertical and a horizontal scrollbar instead of overflowing. */
89
+ .coupling-scroll { overflow: auto; max-height: 70vh; max-width: 100%; }
90
+
91
+ /* border-collapse:separate (not collapse) so sticky cells keep their borders
92
+ while scrolling — collapsed borders detach from sticky elements. Cells carry
93
+ only right+bottom borders to avoid doubling; the first row/column add the
94
+ top/left outer edges. */
95
+ .coupling-table { width: auto; border-collapse: separate; border-spacing: 0; font-size: 12px; }
96
+ .coupling-table th, .coupling-table td { border-right: 1px solid var(--border); border-bottom: 1px solid var(--border); padding: 4px 8px; text-align: center; min-width: 36px; }
97
+ .coupling-table thead th { border-top: 1px solid var(--border); }
98
+ .coupling-table tr > :first-child { border-left: 1px solid var(--border); }
99
+ .coupling-table th { color: var(--text-muted); background: var(--bg-surface); }
100
+ .coupling-table th.row-label { text-align: right; padding-right: 10px; }
101
+
102
+ /* Pin the header row (survives vertical scroll) and the label column (survives
103
+ horizontal scroll); the top-left corner is pinned on both axes and layered
104
+ above both. Sticky cells need an opaque background — the th rule above
105
+ supplies one — so scrolling content doesn't bleed through. */
106
+ .coupling-table thead th { position: sticky; top: 0; z-index: 2; }
107
+ .coupling-table th.row-label { position: sticky; left: 0; z-index: 1; }
108
+ .coupling-table thead th.row-label { z-index: 3; }
109
+ `;
110
+ }
111
+ //# sourceMappingURL=code-paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"code-paths.js","sourceRoot":"","sources":["../../src/css/code-paths.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,qBAAqB;IACnC,OAAO,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoGlB,CAAC;AACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Data tables — the `.data-table` shell used by every list view —
3
+ * plus check rows, findings, expander rows, badges, pagination, the
4
+ * search/filter bar, the long-description block, and the pass-rate
5
+ * progress bar.
6
+ *
7
+ * One file because all of these only ever appear inside a card body
8
+ * around a `.data-table`; splitting further would just create a pile
9
+ * of two-rule files.
10
+ */
11
+ export declare function dashboardCssDataTable(): string;
12
+ //# sourceMappingURL=data-table.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"data-table.d.ts","sourceRoot":"","sources":["../../src/css/data-table.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,wBAAgB,qBAAqB,IAAI,MAAM,CA2F9C"}