@flanksource/clicky-ui 0.3.44 → 0.3.46

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 (537) hide show
  1. package/README.md +24 -0
  2. package/dist/ai.cjs +4 -2
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -1
  5. package/dist/components/MdxEditorField.cjs +40 -22
  6. package/dist/components/MdxEditorField.cjs.map +1 -1
  7. package/dist/components/MdxEditorField.d.ts.map +1 -1
  8. package/dist/components/MdxEditorField.js +41 -23
  9. package/dist/components/MdxEditorField.js.map +1 -1
  10. package/dist/components/json-schema-form-item-summary.cjs +6 -1
  11. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  12. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  13. package/dist/components/json-schema-form-item-summary.js +6 -1
  14. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  15. package/dist/data/AccessMark.cjs +23 -0
  16. package/dist/data/AccessMark.cjs.map +1 -0
  17. package/dist/data/AccessMark.d.ts +11 -0
  18. package/dist/data/AccessMark.d.ts.map +1 -0
  19. package/dist/data/AccessMark.js +23 -0
  20. package/dist/data/AccessMark.js.map +1 -0
  21. package/dist/data/CodeBlock.cjs +3 -2
  22. package/dist/data/CodeBlock.cjs.map +1 -1
  23. package/dist/data/CodeBlock.d.ts +3 -1
  24. package/dist/data/CodeBlock.d.ts.map +1 -1
  25. package/dist/data/CodeBlock.js +3 -2
  26. package/dist/data/CodeBlock.js.map +1 -1
  27. package/dist/data/CodeDiff.cjs +116 -23
  28. package/dist/data/CodeDiff.cjs.map +1 -1
  29. package/dist/data/CodeDiff.d.ts +26 -0
  30. package/dist/data/CodeDiff.d.ts.map +1 -1
  31. package/dist/data/CodeDiff.js +116 -23
  32. package/dist/data/CodeDiff.js.map +1 -1
  33. package/dist/data/GraphDiagram.cjs +75 -11
  34. package/dist/data/GraphDiagram.cjs.map +1 -1
  35. package/dist/data/GraphDiagram.d.ts +17 -2
  36. package/dist/data/GraphDiagram.d.ts.map +1 -1
  37. package/dist/data/GraphDiagram.js +76 -12
  38. package/dist/data/GraphDiagram.js.map +1 -1
  39. package/dist/data/GraphDiagramGroups.cjs +100 -0
  40. package/dist/data/GraphDiagramGroups.cjs.map +1 -0
  41. package/dist/data/GraphDiagramGroups.d.ts +24 -0
  42. package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
  43. package/dist/data/GraphDiagramGroups.js +100 -0
  44. package/dist/data/GraphDiagramGroups.js.map +1 -0
  45. package/dist/data/GraphDiagramNodes.cjs +46 -51
  46. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  47. package/dist/data/GraphDiagramNodes.d.ts +8 -9
  48. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  49. package/dist/data/GraphDiagramNodes.js +46 -51
  50. package/dist/data/GraphDiagramNodes.js.map +1 -1
  51. package/dist/data/JsonView.cjs +118 -49
  52. package/dist/data/JsonView.cjs.map +1 -1
  53. package/dist/data/JsonView.d.ts +13 -10
  54. package/dist/data/JsonView.d.ts.map +1 -1
  55. package/dist/data/JsonView.js +118 -49
  56. package/dist/data/JsonView.js.map +1 -1
  57. package/dist/data/MarkdownEditor.cjs +2 -2
  58. package/dist/data/MarkdownEditor.cjs.map +1 -1
  59. package/dist/data/MarkdownEditor.js +2 -2
  60. package/dist/data/MarkdownEditor.js.map +1 -1
  61. package/dist/data/TreeNode.cjs +1 -1
  62. package/dist/data/TreeNode.cjs.map +1 -1
  63. package/dist/data/TreeNode.d.ts.map +1 -1
  64. package/dist/data/TreeNode.js +1 -1
  65. package/dist/data/TreeNode.js.map +1 -1
  66. package/dist/data/ai/AdvancedChatConfig.cjs +90 -249
  67. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -1
  68. package/dist/data/ai/AdvancedChatConfig.d.ts +2 -5
  69. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -1
  70. package/dist/data/ai/AdvancedChatConfig.js +91 -250
  71. package/dist/data/ai/AdvancedChatConfig.js.map +1 -1
  72. package/dist/data/ai/ChatButton.cjs +2 -0
  73. package/dist/data/ai/ChatButton.cjs.map +1 -1
  74. package/dist/data/ai/ChatButton.d.ts +1 -1
  75. package/dist/data/ai/ChatButton.d.ts.map +1 -1
  76. package/dist/data/ai/ChatButton.js +2 -0
  77. package/dist/data/ai/ChatButton.js.map +1 -1
  78. package/dist/data/ai/ChatFab.cjs +5 -1
  79. package/dist/data/ai/ChatFab.cjs.map +1 -1
  80. package/dist/data/ai/ChatFab.d.ts +5 -1
  81. package/dist/data/ai/ChatFab.d.ts.map +1 -1
  82. package/dist/data/ai/ChatFab.js +5 -1
  83. package/dist/data/ai/ChatFab.js.map +1 -1
  84. package/dist/data/ai/ChatWindow.cjs +2 -8
  85. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  86. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  87. package/dist/data/ai/ChatWindow.js +2 -8
  88. package/dist/data/ai/ChatWindow.js.map +1 -1
  89. package/dist/data/ai/ChatWindow.runtime.cjs +0 -5
  90. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  91. package/dist/data/ai/ChatWindow.runtime.d.ts +0 -2
  92. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  93. package/dist/data/ai/ChatWindow.runtime.js +0 -5
  94. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  95. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs +2 -2
  96. package/dist/data/ai/PromptRunEditor/runtimeActions.cjs.map +1 -1
  97. package/dist/data/ai/PromptRunEditor/runtimeActions.d.ts.map +1 -1
  98. package/dist/data/ai/PromptRunEditor/runtimeActions.js +2 -2
  99. package/dist/data/ai/PromptRunEditor/runtimeActions.js.map +1 -1
  100. package/dist/data/ai/SessionInspector.approvals.cjs +3 -6
  101. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -1
  102. package/dist/data/ai/SessionInspector.approvals.js +3 -6
  103. package/dist/data/ai/SessionInspector.approvals.js.map +1 -1
  104. package/dist/data/ai/SessionViewer.cjs +13 -4
  105. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  106. package/dist/data/ai/SessionViewer.d.ts +5 -1
  107. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  108. package/dist/data/ai/SessionViewer.header.cjs +1 -1
  109. package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
  110. package/dist/data/ai/SessionViewer.header.js +1 -1
  111. package/dist/data/ai/SessionViewer.header.js.map +1 -1
  112. package/dist/data/ai/SessionViewer.js +13 -4
  113. package/dist/data/ai/SessionViewer.js.map +1 -1
  114. package/dist/data/ai/SessionViewer.model.cjs +2 -0
  115. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  116. package/dist/data/ai/SessionViewer.model.d.ts +1 -0
  117. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  118. package/dist/data/ai/SessionViewer.model.js +2 -0
  119. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  120. package/dist/data/ai/SessionViewer.rows.cjs +41 -27
  121. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  122. package/dist/data/ai/SessionViewer.rows.d.ts +4 -2
  123. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  124. package/dist/data/ai/SessionViewer.rows.js +41 -27
  125. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  126. package/dist/data/ai/SessionViewer.tokens.cjs +35 -0
  127. package/dist/data/ai/SessionViewer.tokens.cjs.map +1 -0
  128. package/dist/data/ai/SessionViewer.tokens.d.ts +5 -0
  129. package/dist/data/ai/SessionViewer.tokens.d.ts.map +1 -0
  130. package/dist/data/ai/SessionViewer.tokens.js +35 -0
  131. package/dist/data/ai/SessionViewer.tokens.js.map +1 -0
  132. package/dist/data/ai/SessionViewer.tool-cost.cjs +128 -0
  133. package/dist/data/ai/SessionViewer.tool-cost.cjs.map +1 -0
  134. package/dist/data/ai/SessionViewer.tool-cost.d.ts +6 -0
  135. package/dist/data/ai/SessionViewer.tool-cost.d.ts.map +1 -0
  136. package/dist/data/ai/SessionViewer.tool-cost.js +128 -0
  137. package/dist/data/ai/SessionViewer.tool-cost.js.map +1 -0
  138. package/dist/data/ai/SessionViewer.tool-details.cjs +3 -1
  139. package/dist/data/ai/SessionViewer.tool-details.cjs.map +1 -1
  140. package/dist/data/ai/SessionViewer.tool-details.d.ts.map +1 -1
  141. package/dist/data/ai/SessionViewer.tool-details.js +3 -1
  142. package/dist/data/ai/SessionViewer.tool-details.js.map +1 -1
  143. package/dist/data/ai/SessionViewer.tool-row.cjs +55 -35
  144. package/dist/data/ai/SessionViewer.tool-row.cjs.map +1 -1
  145. package/dist/data/ai/SessionViewer.tool-row.d.ts +2 -1
  146. package/dist/data/ai/SessionViewer.tool-row.d.ts.map +1 -1
  147. package/dist/data/ai/SessionViewer.tool-row.js +55 -35
  148. package/dist/data/ai/SessionViewer.tool-row.js.map +1 -1
  149. package/dist/data/ai/SessionViewer.unified.d.ts +4 -0
  150. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  151. package/dist/data/ai/SessionViewerMenu.cjs +18 -1
  152. package/dist/data/ai/SessionViewerMenu.cjs.map +1 -1
  153. package/dist/data/ai/SessionViewerMenu.d.ts +6 -1
  154. package/dist/data/ai/SessionViewerMenu.d.ts.map +1 -1
  155. package/dist/data/ai/SessionViewerMenu.js +18 -1
  156. package/dist/data/ai/SessionViewerMenu.js.map +1 -1
  157. package/dist/data/ai/ToolPreferences.cjs +149 -143
  158. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  159. package/dist/data/ai/ToolPreferences.d.ts +20 -6
  160. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  161. package/dist/data/ai/ToolPreferences.js +151 -146
  162. package/dist/data/ai/ToolPreferences.js.map +1 -1
  163. package/dist/data/ai/ToolPreferences.model.cjs +14 -10
  164. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  165. package/dist/data/ai/ToolPreferences.model.d.ts +1 -0
  166. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  167. package/dist/data/ai/ToolPreferences.model.js +15 -11
  168. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  169. package/dist/data/ai/ToolPreferencesList.cjs +1 -0
  170. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  171. package/dist/data/ai/ToolPreferencesList.d.ts +4 -1
  172. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  173. package/dist/data/ai/ToolPreferencesList.js +2 -1
  174. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  175. package/dist/data/ai/ToolSchemaBrowser.cjs +52 -53
  176. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  177. package/dist/data/ai/ToolSchemaBrowser.d.ts +6 -3
  178. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  179. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +9 -13
  180. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -1
  181. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +5 -2
  182. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -1
  183. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +9 -13
  184. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -1
  185. package/dist/data/ai/ToolSchemaBrowser.js +53 -54
  186. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  187. package/dist/data/ai/ToolSchemaBrowser.model.cjs +19 -27
  188. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -1
  189. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +9 -6
  190. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -1
  191. package/dist/data/ai/ToolSchemaBrowser.model.js +20 -28
  192. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -1
  193. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +12 -213
  194. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -1
  195. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +1 -3
  196. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -1
  197. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +13 -214
  198. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -1
  199. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs +54 -0
  200. package/dist/data/ai/ToolSchemaBrowser.strategies.cjs.map +1 -0
  201. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts +9 -0
  202. package/dist/data/ai/ToolSchemaBrowser.strategies.d.ts.map +1 -0
  203. package/dist/data/ai/ToolSchemaBrowser.strategies.js +54 -0
  204. package/dist/data/ai/ToolSchemaBrowser.strategies.js.map +1 -0
  205. package/dist/data/ai/ToolSchemaBrowser.tree.cjs +179 -0
  206. package/dist/data/ai/ToolSchemaBrowser.tree.cjs.map +1 -0
  207. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts +20 -0
  208. package/dist/data/ai/ToolSchemaBrowser.tree.d.ts.map +1 -0
  209. package/dist/data/ai/ToolSchemaBrowser.tree.js +179 -0
  210. package/dist/data/ai/ToolSchemaBrowser.tree.js.map +1 -0
  211. package/dist/data/ai/index.d.ts +2 -2
  212. package/dist/data/ai/index.d.ts.map +1 -1
  213. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs +8 -28
  214. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.cjs.map +1 -1
  215. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.d.ts.map +1 -1
  216. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js +9 -29
  217. package/dist/data/ai/runtime-profiles/PermissionStrategiesEditor.js.map +1 -1
  218. package/dist/data/ai/session-token-sizing.d.ts +32 -0
  219. package/dist/data/ai/session-token-sizing.d.ts.map +1 -0
  220. package/dist/data/ai/use-session-token-sizing.cjs +73 -0
  221. package/dist/data/ai/use-session-token-sizing.cjs.map +1 -0
  222. package/dist/data/ai/use-session-token-sizing.d.ts +21 -0
  223. package/dist/data/ai/use-session-token-sizing.d.ts.map +1 -0
  224. package/dist/data/ai/use-session-token-sizing.js +73 -0
  225. package/dist/data/ai/use-session-token-sizing.js.map +1 -0
  226. package/dist/data/call-graph/CallGraph.cjs +269 -0
  227. package/dist/data/call-graph/CallGraph.cjs.map +1 -0
  228. package/dist/data/call-graph/CallGraph.d.ts +78 -0
  229. package/dist/data/call-graph/CallGraph.d.ts.map +1 -0
  230. package/dist/data/call-graph/CallGraph.js +269 -0
  231. package/dist/data/call-graph/CallGraph.js.map +1 -0
  232. package/dist/data/call-graph/CallGraphGlyphs.cjs +39 -0
  233. package/dist/data/call-graph/CallGraphGlyphs.cjs.map +1 -0
  234. package/dist/data/call-graph/CallGraphGlyphs.d.ts +19 -0
  235. package/dist/data/call-graph/CallGraphGlyphs.d.ts.map +1 -0
  236. package/dist/data/call-graph/CallGraphGlyphs.js +39 -0
  237. package/dist/data/call-graph/CallGraphGlyphs.js.map +1 -0
  238. package/dist/data/call-graph/CallGraphMembers.cjs +51 -0
  239. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -0
  240. package/dist/data/call-graph/CallGraphMembers.d.ts +22 -0
  241. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -0
  242. package/dist/data/call-graph/CallGraphMembers.js +51 -0
  243. package/dist/data/call-graph/CallGraphMembers.js.map +1 -0
  244. package/dist/data/call-graph/CallGraphParts.cjs +204 -0
  245. package/dist/data/call-graph/CallGraphParts.cjs.map +1 -0
  246. package/dist/data/call-graph/CallGraphParts.d.ts +44 -0
  247. package/dist/data/call-graph/CallGraphParts.d.ts.map +1 -0
  248. package/dist/data/call-graph/CallGraphParts.js +204 -0
  249. package/dist/data/call-graph/CallGraphParts.js.map +1 -0
  250. package/dist/data/call-graph/CallGraphToolbar.cjs +198 -0
  251. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -0
  252. package/dist/data/call-graph/CallGraphToolbar.d.ts +55 -0
  253. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -0
  254. package/dist/data/call-graph/CallGraphToolbar.js +198 -0
  255. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -0
  256. package/dist/data/call-graph/call-graph-exclude.cjs +75 -0
  257. package/dist/data/call-graph/call-graph-exclude.cjs.map +1 -0
  258. package/dist/data/call-graph/call-graph-exclude.d.ts +31 -0
  259. package/dist/data/call-graph/call-graph-exclude.d.ts.map +1 -0
  260. package/dist/data/call-graph/call-graph-exclude.js +75 -0
  261. package/dist/data/call-graph/call-graph-exclude.js.map +1 -0
  262. package/dist/data/call-graph/call-graph-labels.cjs +96 -0
  263. package/dist/data/call-graph/call-graph-labels.cjs.map +1 -0
  264. package/dist/data/call-graph/call-graph-labels.d.ts +53 -0
  265. package/dist/data/call-graph/call-graph-labels.d.ts.map +1 -0
  266. package/dist/data/call-graph/call-graph-labels.js +96 -0
  267. package/dist/data/call-graph/call-graph-labels.js.map +1 -0
  268. package/dist/data/call-graph/call-graph-model.cjs +312 -0
  269. package/dist/data/call-graph/call-graph-model.cjs.map +1 -0
  270. package/dist/data/call-graph/call-graph-model.d.ts +138 -0
  271. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -0
  272. package/dist/data/call-graph/call-graph-model.js +312 -0
  273. package/dist/data/call-graph/call-graph-model.js.map +1 -0
  274. package/dist/data/call-graph/call-graph-vocabulary.cjs +195 -0
  275. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -0
  276. package/dist/data/call-graph/call-graph-vocabulary.d.ts +76 -0
  277. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -0
  278. package/dist/data/call-graph/call-graph-vocabulary.js +195 -0
  279. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -0
  280. package/dist/data/call-graph/call-graph.fixtures.d.ts +63 -0
  281. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -0
  282. package/dist/data/call-graph/index.d.ts +7 -0
  283. package/dist/data/call-graph/index.d.ts.map +1 -0
  284. package/dist/data/call-graph/types.cjs +5 -0
  285. package/dist/data/call-graph/types.cjs.map +1 -0
  286. package/dist/data/call-graph/types.d.ts +140 -0
  287. package/dist/data/call-graph/types.d.ts.map +1 -0
  288. package/dist/data/call-graph/types.js +5 -0
  289. package/dist/data/call-graph/types.js.map +1 -0
  290. package/dist/data/call-graph/use-call-graph.cjs +93 -0
  291. package/dist/data/call-graph/use-call-graph.cjs.map +1 -0
  292. package/dist/data/call-graph/use-call-graph.d.ts +24 -0
  293. package/dist/data/call-graph/use-call-graph.d.ts.map +1 -0
  294. package/dist/data/call-graph/use-call-graph.js +93 -0
  295. package/dist/data/call-graph/use-call-graph.js.map +1 -0
  296. package/dist/data/chat/Chat.cjs +39 -15
  297. package/dist/data/chat/Chat.cjs.map +1 -1
  298. package/dist/data/chat/Chat.d.ts.map +1 -1
  299. package/dist/data/chat/Chat.fixtures.cjs +2 -2
  300. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  301. package/dist/data/chat/Chat.fixtures.js +2 -2
  302. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  303. package/dist/data/chat/Chat.js +40 -16
  304. package/dist/data/chat/Chat.js.map +1 -1
  305. package/dist/data/chat/ChatRuntimeToolbar.cjs +3 -6
  306. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  307. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  308. package/dist/data/chat/ChatRuntimeToolbar.js +3 -6
  309. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  310. package/dist/data/chat/ContextMeter.bar.cjs +5 -8
  311. package/dist/data/chat/ContextMeter.bar.cjs.map +1 -1
  312. package/dist/data/chat/ContextMeter.bar.d.ts +1 -1
  313. package/dist/data/chat/ContextMeter.bar.d.ts.map +1 -1
  314. package/dist/data/chat/ContextMeter.bar.js +5 -8
  315. package/dist/data/chat/ContextMeter.bar.js.map +1 -1
  316. package/dist/data/chat/ContextMeter.cjs +18 -19
  317. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  318. package/dist/data/chat/ContextMeter.d.ts +1 -1
  319. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  320. package/dist/data/chat/ContextMeter.js +18 -19
  321. package/dist/data/chat/ContextMeter.js.map +1 -1
  322. package/dist/data/chat/Conversation.cjs +2 -1
  323. package/dist/data/chat/Conversation.cjs.map +1 -1
  324. package/dist/data/chat/Conversation.d.ts +4 -1
  325. package/dist/data/chat/Conversation.d.ts.map +1 -1
  326. package/dist/data/chat/Conversation.js +2 -1
  327. package/dist/data/chat/Conversation.js.map +1 -1
  328. package/dist/data/chat/Message.cjs +39 -12
  329. package/dist/data/chat/Message.cjs.map +1 -1
  330. package/dist/data/chat/Message.d.ts +1 -1
  331. package/dist/data/chat/Message.d.ts.map +1 -1
  332. package/dist/data/chat/Message.js +40 -13
  333. package/dist/data/chat/Message.js.map +1 -1
  334. package/dist/data/chat/ToolCall.cjs +60 -5
  335. package/dist/data/chat/ToolCall.cjs.map +1 -1
  336. package/dist/data/chat/ToolCall.d.ts +7 -2
  337. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  338. package/dist/data/chat/ToolCall.js +60 -5
  339. package/dist/data/chat/ToolCall.js.map +1 -1
  340. package/dist/data/chat/approval.cjs.map +1 -1
  341. package/dist/data/chat/approval.d.ts +2 -2
  342. package/dist/data/chat/approval.d.ts.map +1 -1
  343. package/dist/data/chat/approval.js.map +1 -1
  344. package/dist/data/chat/tool-policy.cjs +59 -2
  345. package/dist/data/chat/tool-policy.cjs.map +1 -1
  346. package/dist/data/chat/tool-policy.d.ts +9 -0
  347. package/dist/data/chat/tool-policy.d.ts.map +1 -1
  348. package/dist/data/chat/tool-policy.js +59 -2
  349. package/dist/data/chat/tool-policy.js.map +1 -1
  350. package/dist/data/chat/types.cjs +6 -0
  351. package/dist/data/chat/types.cjs.map +1 -1
  352. package/dist/data/chat/types.d.ts +13 -4
  353. package/dist/data/chat/types.d.ts.map +1 -1
  354. package/dist/data/chat/types.js +7 -1
  355. package/dist/data/chat/types.js.map +1 -1
  356. package/dist/data/chat/usage-snapshot.cjs +11 -6
  357. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  358. package/dist/data/chat/usage-snapshot.d.ts +0 -1
  359. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  360. package/dist/data/chat/usage-snapshot.js +11 -6
  361. package/dist/data/chat/usage-snapshot.js.map +1 -1
  362. package/dist/data/data-access.cjs +8 -0
  363. package/dist/data/data-access.cjs.map +1 -0
  364. package/dist/data/data-access.d.ts +5 -0
  365. package/dist/data/data-access.d.ts.map +1 -0
  366. package/dist/data/data-access.js +8 -0
  367. package/dist/data/data-access.js.map +1 -0
  368. package/dist/data/diagnostics/StackFrameRow.cjs +3 -3
  369. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  370. package/dist/data/diagnostics/StackFrameRow.js +3 -3
  371. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  372. package/dist/data/git/GitChangeList.cjs +6 -2
  373. package/dist/data/git/GitChangeList.cjs.map +1 -1
  374. package/dist/data/git/GitChangeList.d.ts +6 -1
  375. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  376. package/dist/data/git/GitChangeList.js +6 -2
  377. package/dist/data/git/GitChangeList.js.map +1 -1
  378. package/dist/data/graph-columns-layout.cjs +61 -14
  379. package/dist/data/graph-columns-layout.cjs.map +1 -1
  380. package/dist/data/graph-columns-layout.d.ts +42 -0
  381. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  382. package/dist/data/graph-columns-layout.js +61 -14
  383. package/dist/data/graph-columns-layout.js.map +1 -1
  384. package/dist/data/graph-diagram-model.cjs +5 -0
  385. package/dist/data/graph-diagram-model.cjs.map +1 -1
  386. package/dist/data/graph-diagram-model.d.ts +24 -0
  387. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  388. package/dist/data/graph-diagram-model.js +5 -0
  389. package/dist/data/graph-diagram-model.js.map +1 -1
  390. package/dist/data/graph-edge-routing.cjs +9 -3
  391. package/dist/data/graph-edge-routing.cjs.map +1 -1
  392. package/dist/data/graph-edge-routing.d.ts +2 -0
  393. package/dist/data/graph-edge-routing.d.ts.map +1 -1
  394. package/dist/data/graph-edge-routing.js +9 -3
  395. package/dist/data/graph-edge-routing.js.map +1 -1
  396. package/dist/data/graph-group-window.cjs +60 -0
  397. package/dist/data/graph-group-window.cjs.map +1 -0
  398. package/dist/data/graph-group-window.d.ts +33 -0
  399. package/dist/data/graph-group-window.d.ts.map +1 -0
  400. package/dist/data/graph-group-window.js +60 -0
  401. package/dist/data/graph-group-window.js.map +1 -0
  402. package/dist/data/json-view/JsonSource.cjs +84 -0
  403. package/dist/data/json-view/JsonSource.cjs.map +1 -0
  404. package/dist/data/json-view/JsonSource.d.ts +7 -0
  405. package/dist/data/json-view/JsonSource.d.ts.map +1 -0
  406. package/dist/data/json-view/JsonSource.js +84 -0
  407. package/dist/data/json-view/JsonSource.js.map +1 -0
  408. package/dist/data/json-view/parse-prefix.cjs +132 -0
  409. package/dist/data/json-view/parse-prefix.cjs.map +1 -0
  410. package/dist/data/json-view/parse-prefix.d.ts +11 -0
  411. package/dist/data/json-view/parse-prefix.d.ts.map +1 -0
  412. package/dist/data/json-view/parse-prefix.js +132 -0
  413. package/dist/data/json-view/parse-prefix.js.map +1 -0
  414. package/dist/data/json-view/parse-source.cjs +62 -0
  415. package/dist/data/json-view/parse-source.cjs.map +1 -0
  416. package/dist/data/json-view/parse-source.d.ts +16 -0
  417. package/dist/data/json-view/parse-source.d.ts.map +1 -0
  418. package/dist/data/json-view/parse-source.js +62 -0
  419. package/dist/data/json-view/parse-source.js.map +1 -0
  420. package/dist/data/json-view/story-fixtures.d.ts +6 -0
  421. package/dist/data/json-view/story-fixtures.d.ts.map +1 -0
  422. package/dist/data/json-view/types.d.ts +14 -0
  423. package/dist/data/json-view/types.d.ts.map +1 -0
  424. package/dist/data/runtime/RuntimeBar.cjs +2 -5
  425. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  426. package/dist/data/runtime/RuntimeBar.d.ts +2 -4
  427. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  428. package/dist/data/runtime/RuntimeBar.fields.cjs +2 -2
  429. package/dist/data/runtime/RuntimeBar.fields.cjs.map +1 -1
  430. package/dist/data/runtime/RuntimeBar.fields.js +2 -2
  431. package/dist/data/runtime/RuntimeBar.fields.js.map +1 -1
  432. package/dist/data/runtime/RuntimeBar.js +2 -5
  433. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  434. package/dist/data/runtime/RuntimeBar.selection.cjs +4 -1
  435. package/dist/data/runtime/RuntimeBar.selection.cjs.map +1 -1
  436. package/dist/data/runtime/RuntimeBar.selection.d.ts.map +1 -1
  437. package/dist/data/runtime/RuntimeBar.selection.js +5 -2
  438. package/dist/data/runtime/RuntimeBar.selection.js.map +1 -1
  439. package/dist/data/runtime/RuntimeBarActions.cjs +1 -5
  440. package/dist/data/runtime/RuntimeBarActions.cjs.map +1 -1
  441. package/dist/data/runtime/RuntimeBarActions.d.ts +1 -1
  442. package/dist/data/runtime/RuntimeBarActions.d.ts.map +1 -1
  443. package/dist/data/runtime/RuntimeBarActions.js +1 -5
  444. package/dist/data/runtime/RuntimeBarActions.js.map +1 -1
  445. package/dist/data/runtime/RuntimeBarIdentity.cjs +6 -14
  446. package/dist/data/runtime/RuntimeBarIdentity.cjs.map +1 -1
  447. package/dist/data/runtime/RuntimeBarIdentity.d.ts +0 -1
  448. package/dist/data/runtime/RuntimeBarIdentity.d.ts.map +1 -1
  449. package/dist/data/runtime/RuntimeBarIdentity.js +6 -14
  450. package/dist/data/runtime/RuntimeBarIdentity.js.map +1 -1
  451. package/dist/data/runtime/RuntimeBarLayout.cjs +8 -27
  452. package/dist/data/runtime/RuntimeBarLayout.cjs.map +1 -1
  453. package/dist/data/runtime/RuntimeBarLayout.d.ts.map +1 -1
  454. package/dist/data/runtime/RuntimeBarLayout.js +8 -27
  455. package/dist/data/runtime/RuntimeBarLayout.js.map +1 -1
  456. package/dist/data/runtime/RuntimeBarSegment.cjs +1 -5
  457. package/dist/data/runtime/RuntimeBarSegment.cjs.map +1 -1
  458. package/dist/data/runtime/RuntimeBarSegment.d.ts.map +1 -1
  459. package/dist/data/runtime/RuntimeBarSegment.js +1 -5
  460. package/dist/data/runtime/RuntimeBarSegment.js.map +1 -1
  461. package/dist/data/runtime/use-runtime-bar-overflow.cjs +4 -10
  462. package/dist/data/runtime/use-runtime-bar-overflow.cjs.map +1 -1
  463. package/dist/data/runtime/use-runtime-bar-overflow.d.ts +1 -2
  464. package/dist/data/runtime/use-runtime-bar-overflow.d.ts.map +1 -1
  465. package/dist/data/runtime/use-runtime-bar-overflow.js +4 -10
  466. package/dist/data/runtime/use-runtime-bar-overflow.js.map +1 -1
  467. package/dist/data/test-runner/TestRunner.fixtures.d.ts +0 -20
  468. package/dist/data/test-runner/TestRunner.fixtures.d.ts.map +1 -1
  469. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts +22 -0
  470. package/dist/data/test-runner/TestRunner.large-fixtures.d.ts.map +1 -0
  471. package/dist/data/use-group-windows.cjs +50 -0
  472. package/dist/data/use-group-windows.cjs.map +1 -0
  473. package/dist/data/use-group-windows.d.ts +27 -0
  474. package/dist/data/use-group-windows.d.ts.map +1 -0
  475. package/dist/data/use-group-windows.js +50 -0
  476. package/dist/data/use-group-windows.js.map +1 -0
  477. package/dist/data/use-pan-zoom.cjs +23 -10
  478. package/dist/data/use-pan-zoom.cjs.map +1 -1
  479. package/dist/data/use-pan-zoom.d.ts +16 -2
  480. package/dist/data/use-pan-zoom.d.ts.map +1 -1
  481. package/dist/data/use-pan-zoom.js +23 -10
  482. package/dist/data/use-pan-zoom.js.map +1 -1
  483. package/dist/data/version-info.cjs +3 -3
  484. package/dist/data/version-info.js +3 -3
  485. package/dist/data.cjs +36 -2
  486. package/dist/data.cjs.map +1 -1
  487. package/dist/data.d.ts +5 -2
  488. package/dist/data.d.ts.map +1 -1
  489. package/dist/data.js +35 -1
  490. package/dist/data.js.map +1 -1
  491. package/dist/hooks/event-hub.cjs +229 -0
  492. package/dist/hooks/event-hub.cjs.map +1 -0
  493. package/dist/hooks/event-hub.d.ts +26 -0
  494. package/dist/hooks/event-hub.d.ts.map +1 -0
  495. package/dist/hooks/event-hub.js +229 -0
  496. package/dist/hooks/event-hub.js.map +1 -0
  497. package/dist/hooks.cjs +2 -0
  498. package/dist/hooks.cjs.map +1 -1
  499. package/dist/hooks.d.ts +1 -0
  500. package/dist/hooks.d.ts.map +1 -1
  501. package/dist/hooks.js +2 -0
  502. package/dist/hooks.js.map +1 -1
  503. package/dist/index.cjs +40 -4
  504. package/dist/index.cjs.map +1 -1
  505. package/dist/index.js +37 -1
  506. package/dist/index.js.map +1 -1
  507. package/dist/layout/Workspace.cjs +13 -4
  508. package/dist/layout/Workspace.cjs.map +1 -1
  509. package/dist/layout/Workspace.d.ts +7 -2
  510. package/dist/layout/Workspace.d.ts.map +1 -1
  511. package/dist/layout/Workspace.js +13 -4
  512. package/dist/layout/Workspace.js.map +1 -1
  513. package/dist/lib/permission-strategies.cjs +71 -11
  514. package/dist/lib/permission-strategies.cjs.map +1 -1
  515. package/dist/lib/permission-strategies.d.ts +3 -0
  516. package/dist/lib/permission-strategies.d.ts.map +1 -1
  517. package/dist/lib/permission-strategies.js +71 -11
  518. package/dist/lib/permission-strategies.js.map +1 -1
  519. package/dist/overlay/modalStack.cjs +13 -6
  520. package/dist/overlay/modalStack.cjs.map +1 -1
  521. package/dist/overlay/modalStack.d.ts.map +1 -1
  522. package/dist/overlay/modalStack.js +13 -6
  523. package/dist/overlay/modalStack.js.map +1 -1
  524. package/dist/styles.css +1 -1
  525. package/package.json +5 -3
  526. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +0 -57
  527. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +0 -1
  528. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +0 -7
  529. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +0 -1
  530. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +0 -57
  531. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +0 -1
  532. package/dist/data/runtime/RuntimeBar.context.cjs +0 -8
  533. package/dist/data/runtime/RuntimeBar.context.cjs.map +0 -1
  534. package/dist/data/runtime/RuntimeBar.context.d.ts +0 -2
  535. package/dist/data/runtime/RuntimeBar.context.d.ts.map +0 -1
  536. package/dist/data/runtime/RuntimeBar.context.js +0 -8
  537. package/dist/data/runtime/RuntimeBar.context.js.map +0 -1
@@ -0,0 +1,198 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const button = require("../../components/button.cjs");
6
+ const IconButton = require("../../components/IconButton.cjs");
7
+ const InputField = require("../../components/InputField.cjs");
8
+ const SegmentedControl = require("../../components/SegmentedControl.cjs");
9
+ const Switch = require("../../components/Switch.cjs");
10
+ const DropdownMenu = require("../../overlay/DropdownMenu.cjs");
11
+ const Badge = require("../Badge.cjs");
12
+ const callGraphExclude = require("./call-graph-exclude.cjs");
13
+ const callGraphLabels = require("./call-graph-labels.cjs");
14
+ const callGraphModel = require("./call-graph-model.cjs");
15
+ const types = require("./types.cjs");
16
+ const UiHome = require("../../icons/components/UiHome.cjs");
17
+ const UiFilter = require("../../icons/components/UiFilter.cjs");
18
+ const UiExpandAll = require("../../icons/components/UiExpandAll.cjs");
19
+ const UiCollapseAll = require("../../icons/components/UiCollapseAll.cjs");
20
+ const UiWarningTriangle = require("../../icons/components/UiWarningTriangle.cjs");
21
+ const DIRECTIONS = [
22
+ { id: "callers", label: "Callers" },
23
+ { id: "both", label: "Both" },
24
+ { id: "callees", label: "Callees" }
25
+ ];
26
+ function DepthStepper({ depth, maxDepth, onChange }) {
27
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Depth", children: [
28
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Depth" }),
29
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Decrease depth", disabled: depth <= 1, onClick: () => onChange(depth - 1), children: "−" }),
30
+ /* @__PURE__ */ jsxRuntime.jsx("output", { className: "w-5 text-center text-sm font-medium tabular-nums", "aria-live": "polite", "aria-label": "Graph depth", children: depth }),
31
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Increase depth", disabled: depth >= maxDepth, onClick: () => onChange(depth + 1), children: "+" })
32
+ ] });
33
+ }
34
+ function OmittedChip({ omitted, noun }) {
35
+ const parts = callGraphLabels.omittedParts(omitted);
36
+ if (parts.length === 0) return null;
37
+ const tally = callGraphLabels.excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);
38
+ const title = [`Not drawn: ${parts.join(", ")}`, ...tally.length ? [`Excluded per ${noun}:`, ...tally] : []].join("\n");
39
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { title, "data-testid": "graph-omitted", children: /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { tone: "warning", size: "md", icon: UiWarningTriangle.UiWarningTriangle, clickToCopy: false, children: parts.join(" · ") }) });
40
+ }
41
+ function GroupRow({ group, onToggle }) {
42
+ const name = group.label ?? group.name;
43
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex items-center gap-2 py-1", children: [
44
+ /* @__PURE__ */ jsxRuntime.jsx(Switch.Switch, { checked: !group.excluded, onChange: onToggle, "aria-label": `Show ${name}` }),
45
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-xs", title: group.name, children: name }),
46
+ group.external && /* @__PURE__ */ jsxRuntime.jsx(Badge.Badge, { variant: "outline", size: "sm", clickToCopy: false, children: "external" }),
47
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground", title: `${group.nodes} nodes`, children: group.nodes })
48
+ ] });
49
+ }
50
+ function GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }) {
51
+ const [filter, setFilter] = react.useState("");
52
+ const [pattern, setPattern] = react.useState("");
53
+ const [error, setError] = react.useState();
54
+ const { plural, patternHint } = vocabulary.group;
55
+ const needle = filter.trim().toLowerCase();
56
+ const shown = groups.filter((group) => `${group.name} ${group.label ?? ""}`.toLowerCase().includes(needle));
57
+ const submit = (event) => {
58
+ event.preventDefault();
59
+ const typed = pattern.trim();
60
+ const problem = callGraphExclude.excludePatternError(exclude, typed);
61
+ setError(problem);
62
+ if (problem) return;
63
+ setPattern("");
64
+ onExclude(callGraphExclude.addExcludePattern(exclude, typed));
65
+ };
66
+ return /* @__PURE__ */ jsxRuntime.jsxs("fieldset", { disabled: busy, "aria-busy": busy, className: "flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm", children: [
67
+ /* @__PURE__ */ jsxRuntime.jsx(InputField.InputField, { "aria-label": `Filter ${plural}`, placeholder: `Filter ${plural}`, value: filter, onChange: setFilter }),
68
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1", "aria-label": "Exclusion patterns", children: [
69
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "Excluding" }),
70
+ exclude.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: "nothing" }),
71
+ exclude.map((entry) => /* @__PURE__ */ jsxRuntime.jsxs(
72
+ "button",
73
+ {
74
+ type: "button",
75
+ className: "rounded border border-border px-1.5 font-mono text-xs hover:bg-muted",
76
+ "aria-label": `Stop excluding ${entry}`,
77
+ title: `Stop excluding ${entry}`,
78
+ onClick: () => onExclude(callGraphExclude.removeExcludePattern(exclude, entry)),
79
+ children: [
80
+ entry,
81
+ " ×"
82
+ ]
83
+ },
84
+ entry
85
+ ))
86
+ ] }),
87
+ /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "max-h-72 overflow-y-auto pr-1", "aria-label": plural, children: [
88
+ shown.map((group) => /* @__PURE__ */ jsxRuntime.jsx(
89
+ GroupRow,
90
+ {
91
+ group,
92
+ onToggle: () => onExclude(group.excluded ? callGraphExclude.includeGroup(exclude, group, groups, matches) : callGraphExclude.excludeGroup(exclude, group.name))
93
+ },
94
+ group.name
95
+ )),
96
+ shown.length === 0 && /* @__PURE__ */ jsxRuntime.jsx("li", { className: "py-1 text-xs text-muted-foreground", children: groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.` })
97
+ ] }),
98
+ /* @__PURE__ */ jsxRuntime.jsxs("form", { className: "flex items-start gap-2", onSubmit: submit, children: [
99
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
100
+ /* @__PURE__ */ jsxRuntime.jsx(InputField.InputField, { "aria-label": "Exclude pattern", placeholder: patternHint, value: pattern, onChange: setPattern }),
101
+ error && /* @__PURE__ */ jsxRuntime.jsx("span", { role: "alert", className: "text-xs text-destructive", children: error })
102
+ ] }),
103
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "submit", size: "sm", variant: "outline", children: "Exclude" })
104
+ ] }),
105
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-between gap-2 border-t border-border pt-2", children: [
106
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "ghost", onClick: onDefaults, children: "Reset to defaults" }),
107
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", size: "sm", variant: "ghost", onClick: () => onExclude([]), children: "Show all" })
108
+ ] })
109
+ ] });
110
+ }
111
+ const ACCESS_LABELS = { call: "Calls", read: "Reads", write: "Writes", variable: "Variables" };
112
+ function DataAccessControls({ access, onAccess, columns, onColumns, variables }) {
113
+ const lastOn = callGraphModel.baseAccess(access).length === 1;
114
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
115
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Access", children: (variables ? [...types.CALL_GRAPH_ACCESS, "variable"] : types.CALL_GRAPH_ACCESS).map((type) => {
116
+ const on = access.includes(type);
117
+ const kept = on && lastOn && type !== "variable";
118
+ return /* @__PURE__ */ jsxRuntime.jsx(
119
+ button.Button,
120
+ {
121
+ type: "button",
122
+ size: "sm",
123
+ variant: on ? "secondary" : "outline",
124
+ "aria-pressed": on,
125
+ disabled: kept,
126
+ title: kept ? "At least one kind of access stays on" : void 0,
127
+ onClick: () => onAccess(callGraphModel.toggleAccess(access, type)),
128
+ children: ACCESS_LABELS[type]
129
+ },
130
+ type
131
+ );
132
+ }) }),
133
+ /* @__PURE__ */ jsxRuntime.jsx(Switch.Switch, { checked: columns, label: "Columns", onChange: onColumns })
134
+ ] });
135
+ }
136
+ function GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }) {
137
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-0.5", role: "group", "aria-label": "Groups", children: [
138
+ /* @__PURE__ */ jsxRuntime.jsx(IconButton.IconButton, { icon: UiExpandAll.UiExpandAll, label: "Expand all groups", className: "size-7", disabled: !anyCollapsed, onClick: onExpandAll }),
139
+ /* @__PURE__ */ jsxRuntime.jsx(IconButton.IconButton, { icon: UiCollapseAll.UiCollapseAll, label: "Collapse all groups", className: "size-7", disabled: !anyExpanded, onClick: onCollapseAll })
140
+ ] });
141
+ }
142
+ function CallGraphToolbar(props) {
143
+ const { exclusions, pin, vocabulary } = props;
144
+ const excludedCount = (exclusions == null ? void 0 : exclusions.groups.filter((group) => group.excluded).length) ?? 0;
145
+ const hasExternal = (exclusions == null ? void 0 : exclusions.groups.some((group) => group.external)) ?? false;
146
+ const { noun, plural } = vocabulary.group;
147
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
148
+ /* @__PURE__ */ jsxRuntime.jsx(SegmentedControl.SegmentedControl, { value: props.direction, options: DIRECTIONS, onChange: props.onDirection, size: "sm", "aria-label": "Direction" }),
149
+ /* @__PURE__ */ jsxRuntime.jsx(DepthStepper, { depth: props.depth, maxDepth: props.maxDepth, onChange: props.onDepth }),
150
+ props.data && /* @__PURE__ */ jsxRuntime.jsx(DataAccessControls, { ...props.data }),
151
+ pin && /* @__PURE__ */ jsxRuntime.jsx(
152
+ button.Button,
153
+ {
154
+ type: "button",
155
+ variant: pin.pinned ? "secondary" : "outline",
156
+ size: "sm",
157
+ disabled: !pin.pinned && !pin.canPin,
158
+ "aria-pressed": pin.pinned,
159
+ title: pin.pinned ? "The graph keeps this root while the selection changes" : "Keep this root while the selection changes",
160
+ onClick: () => pin.onPin(!pin.pinned),
161
+ children: pin.pinned ? "Unpin root" : "Pin root"
162
+ }
163
+ ),
164
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", onClick: props.onFit, children: "Fit" }),
165
+ /* @__PURE__ */ jsxRuntime.jsxs(button.Button, { type: "button", variant: "outline", size: "sm", onClick: props.onReset, children: [
166
+ /* @__PURE__ */ jsxRuntime.jsx(UiHome.UiHome, {}),
167
+ "Reset"
168
+ ] }),
169
+ props.groupCollapse && /* @__PURE__ */ jsxRuntime.jsx(GroupCollapseControls, { ...props.groupCollapse }),
170
+ exclusions && hasExternal && /* @__PURE__ */ jsxRuntime.jsx(
171
+ Switch.Switch,
172
+ {
173
+ checked: exclusions.exclude.includes(callGraphExclude.EXCLUDE_EXTERNAL),
174
+ disabled: exclusions.busy,
175
+ label: "Hide all external",
176
+ onChange: (hidden) => exclusions.onExclude(callGraphExclude.setExternalHidden(exclusions.exclude, hidden))
177
+ }
178
+ ),
179
+ exclusions && /* @__PURE__ */ jsxRuntime.jsx(
180
+ DropdownMenu.DropdownMenu,
181
+ {
182
+ icon: UiFilter.UiFilter,
183
+ label: `${callGraphLabels.capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : ""}`,
184
+ variant: "outline",
185
+ size: "sm",
186
+ menuLabel: `${callGraphLabels.capitalize(noun)} exclusions`,
187
+ title: `Choose the ${plural} the graph leaves out`,
188
+ children: () => /* @__PURE__ */ jsxRuntime.jsx(GroupFacets, { ...exclusions })
189
+ }
190
+ ),
191
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
192
+ props.omitted && /* @__PURE__ */ jsxRuntime.jsx(OmittedChip, { omitted: props.omitted, noun }),
193
+ props.end
194
+ ] })
195
+ ] });
196
+ }
197
+ exports.CallGraphToolbar = CallGraphToolbar;
198
+ //# sourceMappingURL=CallGraphToolbar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallGraphToolbar.cjs","sources":["../../../src/data/call-graph/CallGraphToolbar.tsx"],"sourcesContent":["import { useState, type FormEvent, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InputField } from \"../../components/InputField\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Switch } from \"../../components/Switch\";\nimport { UiCollapseAll, UiExpandAll, UiFilter, UiHome, UiWarningTriangle } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Badge } from \"../Badge\";\nimport {\n addExcludePattern,\n EXCLUDE_EXTERNAL,\n excludeGroup,\n excludePatternError,\n includeGroup,\n removeExcludePattern,\n setExternalHidden,\n type ExcludeMatcher,\n} from \"./call-graph-exclude\";\nimport { capitalize, excludedTally, omittedParts } from \"./call-graph-labels\";\nimport { baseAccess, toggleAccess } from \"./call-graph-model\";\nimport type { CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { CALL_GRAPH_ACCESS, type CallGraphAccess, type CallGraphDirection, type CallGraphGroupFact, type CallGraphOmitted } from \"./types\";\n\nconst DIRECTIONS: { id: CallGraphDirection; label: string }[] = [\n { id: \"callers\", label: \"Callers\" },\n { id: \"both\", label: \"Both\" },\n { id: \"callees\", label: \"Callees\" },\n];\n\nfunction DepthStepper({ depth, maxDepth, onChange }: { depth: number; maxDepth: number; onChange: (depth: number) => void }) {\n return (\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Depth\">\n <span className=\"text-xs text-muted-foreground\">Depth</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Decrease depth\" disabled={depth <= 1} onClick={() => onChange(depth - 1)}>−</Button>\n <output className=\"w-5 text-center text-sm font-medium tabular-nums\" aria-live=\"polite\" aria-label=\"Graph depth\">{depth}</output>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Increase depth\" disabled={depth >= maxDepth} onClick={() => onChange(depth + 1)}>+</Button>\n </div>\n );\n}\n\nfunction OmittedChip({ omitted, noun }: { omitted: CallGraphOmitted; noun: string }) {\n const parts = omittedParts(omitted);\n if (parts.length === 0) return null;\n const tally = excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);\n const title = [`Not drawn: ${parts.join(\", \")}`, ...(tally.length ? [`Excluded per ${noun}:`, ...tally] : [])].join(\"\\n\");\n return (\n <span title={title} data-testid=\"graph-omitted\">\n <Badge tone=\"warning\" size=\"md\" icon={UiWarningTriangle} clickToCopy={false}>{parts.join(\" · \")}</Badge>\n </span>\n );\n}\n\nexport interface ExclusionsProps {\n /** The patterns in force. */\n exclude: string[];\n groups: CallGraphGroupFact[];\n matches: ExcludeMatcher;\n onExclude: (patterns: string[]) => void;\n onDefaults: () => void;\n /** A graph for the last edit is loading: the facts describe the one before it, so editing waits. */\n busy: boolean;\n vocabulary: CallGraphVocabulary;\n}\n\nfunction GroupRow({ group, onToggle }: { group: CallGraphGroupFact; onToggle: () => void }) {\n const name = group.label ?? group.name;\n return (\n <li className=\"flex items-center gap-2 py-1\">\n <Switch checked={!group.excluded} onChange={onToggle} aria-label={`Show ${name}`} />\n <span className=\"min-w-0 flex-1 truncate font-mono text-xs\" title={group.name}>{name}</span>\n {group.external && <Badge variant=\"outline\" size=\"sm\" clickToCopy={false}>external</Badge>}\n <span className=\"w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground\" title={`${group.nodes} nodes`}>{group.nodes}</span>\n </li>\n );\n}\n\n/** The group facets: one switch per group the walk reached, the patterns in force, and free-text patterns. */\nfunction GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }: ExclusionsProps) {\n const [filter, setFilter] = useState(\"\");\n const [pattern, setPattern] = useState(\"\");\n const [error, setError] = useState<string>();\n const { plural, patternHint } = vocabulary.group;\n const needle = filter.trim().toLowerCase();\n const shown = groups.filter((group) => `${group.name} ${group.label ?? \"\"}`.toLowerCase().includes(needle));\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const typed = pattern.trim();\n const problem = excludePatternError(exclude, typed);\n setError(problem);\n if (problem) return;\n setPattern(\"\");\n onExclude(addExcludePattern(exclude, typed));\n };\n // The filter box comes first: the menu focuses its first control on opening, which must not be one that drops an exclusion.\n return (\n <fieldset disabled={busy} aria-busy={busy} className=\"flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm\">\n <InputField aria-label={`Filter ${plural}`} placeholder={`Filter ${plural}`} value={filter} onChange={setFilter} />\n <div className=\"flex flex-wrap items-center gap-1\" aria-label=\"Exclusion patterns\">\n <span className=\"text-xs text-muted-foreground\">Excluding</span>\n {exclude.length === 0 && <span className=\"text-xs text-muted-foreground\">nothing</span>}\n {exclude.map((entry) => (\n <button key={entry} type=\"button\" className=\"rounded border border-border px-1.5 font-mono text-xs hover:bg-muted\"\n aria-label={`Stop excluding ${entry}`} title={`Stop excluding ${entry}`} onClick={() => onExclude(removeExcludePattern(exclude, entry))}>\n {entry} ×\n </button>\n ))}\n </div>\n <ul className=\"max-h-72 overflow-y-auto pr-1\" aria-label={plural}>\n {shown.map((group) => (\n <GroupRow key={group.name} group={group}\n onToggle={() => onExclude(group.excluded ? includeGroup(exclude, group, groups, matches) : excludeGroup(exclude, group.name))} />\n ))}\n {shown.length === 0 && (\n <li className=\"py-1 text-xs text-muted-foreground\">{groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.`}</li>\n )}\n </ul>\n <form className=\"flex items-start gap-2\" onSubmit={submit}>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <InputField aria-label=\"Exclude pattern\" placeholder={patternHint} value={pattern} onChange={setPattern} />\n {error && <span role=\"alert\" className=\"text-xs text-destructive\">{error}</span>}\n </div>\n <Button type=\"submit\" size=\"sm\" variant=\"outline\">Exclude</Button>\n </form>\n <div className=\"flex justify-between gap-2 border-t border-border pt-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onDefaults}>Reset to defaults</Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => onExclude([])}>Show all</Button>\n </div>\n </fieldset>\n );\n}\n\nconst ACCESS_LABELS: Record<CallGraphAccess, string> = { call: \"Calls\", read: \"Reads\", write: \"Writes\", variable: \"Variables\" };\n\nexport interface DataAccessProps {\n access: CallGraphAccess[];\n onAccess: (access: CallGraphAccess[]) => void;\n columns: boolean;\n onColumns: (columns: boolean) => void;\n /** Offers the Variables toggle, on top of the access types. */\n variables?: boolean;\n}\n\n/** Which edge types the graph follows, at least one of calls, reads and writes, and whether columns and fields are nodes of their own. */\nfunction DataAccessControls({ access, onAccess, columns, onColumns, variables }: DataAccessProps) {\n const lastOn = baseAccess(access).length === 1;\n return (\n <>\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Access\">\n {(variables ? [...CALL_GRAPH_ACCESS, \"variable\" as const] : CALL_GRAPH_ACCESS).map((type) => {\n const on = access.includes(type);\n const kept = on && lastOn && type !== \"variable\";\n return (\n <Button key={type} type=\"button\" size=\"sm\" variant={on ? \"secondary\" : \"outline\"} aria-pressed={on} disabled={kept}\n title={kept ? \"At least one kind of access stays on\" : undefined} onClick={() => onAccess(toggleAccess(access, type))}>\n {ACCESS_LABELS[type]}\n </Button>\n );\n })}\n </div>\n <Switch checked={columns} label=\"Columns\" onChange={onColumns} />\n </>\n );\n}\n\nexport interface GroupCollapseProps {\n anyCollapsed: boolean;\n anyExpanded: boolean;\n onExpandAll: () => void;\n onCollapseAll: () => void;\n}\n\n/** Expand or collapse every group the graph draws at once. */\nfunction GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }: GroupCollapseProps) {\n return (\n <div className=\"flex items-center gap-0.5\" role=\"group\" aria-label=\"Groups\">\n <IconButton icon={UiExpandAll} label=\"Expand all groups\" className=\"size-7\" disabled={!anyCollapsed} onClick={onExpandAll} />\n <IconButton icon={UiCollapseAll} label=\"Collapse all groups\" className=\"size-7\" disabled={!anyExpanded} onClick={onCollapseAll} />\n </div>\n );\n}\n\nexport interface CallGraphToolbarProps {\n /** Shown only when the host's graph has reads and writes. */\n data?: DataAccessProps | undefined;\n /** Shown only when the graph draws a group that can collapse. */\n groupCollapse?: GroupCollapseProps | undefined;\n direction: CallGraphDirection;\n depth: number;\n maxDepth: number;\n /** Shown only when the host keeps a root across selection changes. */\n pin?: { pinned: boolean; canPin: boolean; onPin: (pinned: boolean) => void } | undefined;\n exclusions?: ExclusionsProps | undefined;\n omitted?: CallGraphOmitted | undefined;\n /** Host content at the toolbar's end, such as server timing. */\n end?: ReactNode;\n onDirection: (direction: CallGraphDirection) => void;\n onDepth: (depth: number) => void;\n onFit: () => void;\n onReset: () => void;\n vocabulary: CallGraphVocabulary;\n}\n\nexport function CallGraphToolbar(props: CallGraphToolbarProps) {\n const { exclusions, pin, vocabulary } = props;\n const excludedCount = exclusions?.groups.filter((group) => group.excluded).length ?? 0;\n const hasExternal = exclusions?.groups.some((group) => group.external) ?? false;\n const { noun, plural } = vocabulary.group;\n return (\n <div className=\"flex flex-wrap items-center gap-3\">\n <SegmentedControl value={props.direction} options={DIRECTIONS} onChange={props.onDirection} size=\"sm\" aria-label=\"Direction\" />\n <DepthStepper depth={props.depth} maxDepth={props.maxDepth} onChange={props.onDepth} />\n {props.data && <DataAccessControls {...props.data} />}\n {pin && (\n <Button type=\"button\" variant={pin.pinned ? \"secondary\" : \"outline\"} size=\"sm\" disabled={!pin.pinned && !pin.canPin} aria-pressed={pin.pinned}\n title={pin.pinned ? \"The graph keeps this root while the selection changes\" : \"Keep this root while the selection changes\"} onClick={() => pin.onPin(!pin.pinned)}>\n {pin.pinned ? \"Unpin root\" : \"Pin root\"}\n </Button>\n )}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onFit}>Fit</Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onReset}><UiHome />Reset</Button>\n {props.groupCollapse && <GroupCollapseControls {...props.groupCollapse} />}\n {exclusions && hasExternal && (\n <Switch checked={exclusions.exclude.includes(EXCLUDE_EXTERNAL)} disabled={exclusions.busy} label=\"Hide all external\"\n onChange={(hidden) => exclusions.onExclude(setExternalHidden(exclusions.exclude, hidden))} />\n )}\n {exclusions && (\n <DropdownMenu icon={UiFilter} label={`${capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : \"\"}`} variant=\"outline\" size=\"sm\"\n menuLabel={`${capitalize(noun)} exclusions`} title={`Choose the ${plural} the graph leaves out`}>\n {() => <GroupFacets {...exclusions} />}\n </DropdownMenu>\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {props.omitted && <OmittedChip omitted={props.omitted} noun={noun} />}\n {props.end}\n </div>\n </div>\n );\n}\n"],"names":["jsx","Button","omittedParts","excludedTally","Badge","UiWarningTriangle","jsxs","Switch","useState","excludePatternError","addExcludePattern","InputField","removeExcludePattern","includeGroup","excludeGroup","baseAccess","Fragment","CALL_GRAPH_ACCESS","toggleAccess","IconButton","UiExpandAll","UiCollapseAll","SegmentedControl","UiHome","EXCLUDE_EXTERNAL","setExternalHidden","DropdownMenu","UiFilter","capitalize"],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import { ReactNode } from 'react';
2
+ import { ExcludeMatcher } from './call-graph-exclude.js';
3
+ import { CallGraphVocabulary } from './call-graph-vocabulary.js';
4
+ import { CallGraphAccess, CallGraphDirection, CallGraphGroupFact, CallGraphOmitted } from './types.js';
5
+ export interface ExclusionsProps {
6
+ /** The patterns in force. */
7
+ exclude: string[];
8
+ groups: CallGraphGroupFact[];
9
+ matches: ExcludeMatcher;
10
+ onExclude: (patterns: string[]) => void;
11
+ onDefaults: () => void;
12
+ /** A graph for the last edit is loading: the facts describe the one before it, so editing waits. */
13
+ busy: boolean;
14
+ vocabulary: CallGraphVocabulary;
15
+ }
16
+ export interface DataAccessProps {
17
+ access: CallGraphAccess[];
18
+ onAccess: (access: CallGraphAccess[]) => void;
19
+ columns: boolean;
20
+ onColumns: (columns: boolean) => void;
21
+ /** Offers the Variables toggle, on top of the access types. */
22
+ variables?: boolean;
23
+ }
24
+ export interface GroupCollapseProps {
25
+ anyCollapsed: boolean;
26
+ anyExpanded: boolean;
27
+ onExpandAll: () => void;
28
+ onCollapseAll: () => void;
29
+ }
30
+ export interface CallGraphToolbarProps {
31
+ /** Shown only when the host's graph has reads and writes. */
32
+ data?: DataAccessProps | undefined;
33
+ /** Shown only when the graph draws a group that can collapse. */
34
+ groupCollapse?: GroupCollapseProps | undefined;
35
+ direction: CallGraphDirection;
36
+ depth: number;
37
+ maxDepth: number;
38
+ /** Shown only when the host keeps a root across selection changes. */
39
+ pin?: {
40
+ pinned: boolean;
41
+ canPin: boolean;
42
+ onPin: (pinned: boolean) => void;
43
+ } | undefined;
44
+ exclusions?: ExclusionsProps | undefined;
45
+ omitted?: CallGraphOmitted | undefined;
46
+ /** Host content at the toolbar's end, such as server timing. */
47
+ end?: ReactNode;
48
+ onDirection: (direction: CallGraphDirection) => void;
49
+ onDepth: (depth: number) => void;
50
+ onFit: () => void;
51
+ onReset: () => void;
52
+ vocabulary: CallGraphVocabulary;
53
+ }
54
+ export declare function CallGraphToolbar(props: CallGraphToolbarProps): import("react").JSX.Element;
55
+ //# sourceMappingURL=CallGraphToolbar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallGraphToolbar.d.ts","sourceRoot":"","sources":["../../../src/data/call-graph/CallGraphToolbar.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA4B,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AASjE,OAAO,EAQL,KAAK,cAAc,EACpB,MAAM,sBAAsB,CAAC;AAG9B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AACnE,OAAO,EAAqB,KAAK,eAAe,EAAE,KAAK,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,SAAS,CAAC;AA+B3I,MAAM,WAAW,eAAe;IAC9B,6BAA6B;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,kBAAkB,EAAE,CAAC;IAC7B,OAAO,EAAE,cAAc,CAAC;IACxB,SAAS,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACxC,UAAU,EAAE,MAAM,IAAI,CAAC;IACvB,oGAAoG;IACpG,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAuED,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,eAAe,EAAE,CAAC;IAC1B,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,EAAE,KAAK,IAAI,CAAC;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,IAAI,CAAC;IACtC,+DAA+D;IAC/D,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAwBD,MAAM,WAAW,kBAAkB;IACjC,YAAY,EAAE,OAAO,CAAC;IACtB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,IAAI,CAAC;IACxB,aAAa,EAAE,MAAM,IAAI,CAAC;CAC3B;AAYD,MAAM,WAAW,qBAAqB;IACpC,6DAA6D;IAC7D,IAAI,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACnC,iEAAiE;IACjE,aAAa,CAAC,EAAE,kBAAkB,GAAG,SAAS,CAAC;IAC/C,SAAS,EAAE,kBAAkB,CAAC;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,sEAAsE;IACtE,GAAG,CAAC,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAA;KAAE,GAAG,SAAS,CAAC;IACzF,UAAU,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IACzC,OAAO,CAAC,EAAE,gBAAgB,GAAG,SAAS,CAAC;IACvC,gEAAgE;IAChE,GAAG,CAAC,EAAE,SAAS,CAAC;IAChB,WAAW,EAAE,CAAC,SAAS,EAAE,kBAAkB,KAAK,IAAI,CAAC;IACrD,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,UAAU,EAAE,mBAAmB,CAAC;CACjC;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,+BAmC5D"}
@@ -0,0 +1,198 @@
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { Button } from "../../components/button.js";
4
+ import { IconButton } from "../../components/IconButton.js";
5
+ import { InputField } from "../../components/InputField.js";
6
+ import { SegmentedControl } from "../../components/SegmentedControl.js";
7
+ import { Switch } from "../../components/Switch.js";
8
+ import { DropdownMenu } from "../../overlay/DropdownMenu.js";
9
+ import { Badge } from "../Badge.js";
10
+ import { setExternalHidden, EXCLUDE_EXTERNAL, removeExcludePattern, includeGroup, excludeGroup, excludePatternError, addExcludePattern } from "./call-graph-exclude.js";
11
+ import { capitalize, omittedParts, excludedTally } from "./call-graph-labels.js";
12
+ import { baseAccess, toggleAccess } from "./call-graph-model.js";
13
+ import { CALL_GRAPH_ACCESS } from "./types.js";
14
+ import { UiHome } from "../../icons/components/UiHome.js";
15
+ import { UiFilter } from "../../icons/components/UiFilter.js";
16
+ import { UiExpandAll } from "../../icons/components/UiExpandAll.js";
17
+ import { UiCollapseAll } from "../../icons/components/UiCollapseAll.js";
18
+ import { UiWarningTriangle } from "../../icons/components/UiWarningTriangle.js";
19
+ const DIRECTIONS = [
20
+ { id: "callers", label: "Callers" },
21
+ { id: "both", label: "Both" },
22
+ { id: "callees", label: "Callees" }
23
+ ];
24
+ function DepthStepper({ depth, maxDepth, onChange }) {
25
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Depth", children: [
26
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Depth" }),
27
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Decrease depth", disabled: depth <= 1, onClick: () => onChange(depth - 1), children: "−" }),
28
+ /* @__PURE__ */ jsx("output", { className: "w-5 text-center text-sm font-medium tabular-nums", "aria-live": "polite", "aria-label": "Graph depth", children: depth }),
29
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", className: "size-8 px-0", "aria-label": "Increase depth", disabled: depth >= maxDepth, onClick: () => onChange(depth + 1), children: "+" })
30
+ ] });
31
+ }
32
+ function OmittedChip({ omitted, noun }) {
33
+ const parts = omittedParts(omitted);
34
+ if (parts.length === 0) return null;
35
+ const tally = excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);
36
+ const title = [`Not drawn: ${parts.join(", ")}`, ...tally.length ? [`Excluded per ${noun}:`, ...tally] : []].join("\n");
37
+ return /* @__PURE__ */ jsx("span", { title, "data-testid": "graph-omitted", children: /* @__PURE__ */ jsx(Badge, { tone: "warning", size: "md", icon: UiWarningTriangle, clickToCopy: false, children: parts.join(" · ") }) });
38
+ }
39
+ function GroupRow({ group, onToggle }) {
40
+ const name = group.label ?? group.name;
41
+ return /* @__PURE__ */ jsxs("li", { className: "flex items-center gap-2 py-1", children: [
42
+ /* @__PURE__ */ jsx(Switch, { checked: !group.excluded, onChange: onToggle, "aria-label": `Show ${name}` }),
43
+ /* @__PURE__ */ jsx("span", { className: "min-w-0 flex-1 truncate font-mono text-xs", title: group.name, children: name }),
44
+ group.external && /* @__PURE__ */ jsx(Badge, { variant: "outline", size: "sm", clickToCopy: false, children: "external" }),
45
+ /* @__PURE__ */ jsx("span", { className: "w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground", title: `${group.nodes} nodes`, children: group.nodes })
46
+ ] });
47
+ }
48
+ function GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }) {
49
+ const [filter, setFilter] = useState("");
50
+ const [pattern, setPattern] = useState("");
51
+ const [error, setError] = useState();
52
+ const { plural, patternHint } = vocabulary.group;
53
+ const needle = filter.trim().toLowerCase();
54
+ const shown = groups.filter((group) => `${group.name} ${group.label ?? ""}`.toLowerCase().includes(needle));
55
+ const submit = (event) => {
56
+ event.preventDefault();
57
+ const typed = pattern.trim();
58
+ const problem = excludePatternError(exclude, typed);
59
+ setError(problem);
60
+ if (problem) return;
61
+ setPattern("");
62
+ onExclude(addExcludePattern(exclude, typed));
63
+ };
64
+ return /* @__PURE__ */ jsxs("fieldset", { disabled: busy, "aria-busy": busy, className: "flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm", children: [
65
+ /* @__PURE__ */ jsx(InputField, { "aria-label": `Filter ${plural}`, placeholder: `Filter ${plural}`, value: filter, onChange: setFilter }),
66
+ /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-1", "aria-label": "Exclusion patterns", children: [
67
+ /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "Excluding" }),
68
+ exclude.length === 0 && /* @__PURE__ */ jsx("span", { className: "text-xs text-muted-foreground", children: "nothing" }),
69
+ exclude.map((entry) => /* @__PURE__ */ jsxs(
70
+ "button",
71
+ {
72
+ type: "button",
73
+ className: "rounded border border-border px-1.5 font-mono text-xs hover:bg-muted",
74
+ "aria-label": `Stop excluding ${entry}`,
75
+ title: `Stop excluding ${entry}`,
76
+ onClick: () => onExclude(removeExcludePattern(exclude, entry)),
77
+ children: [
78
+ entry,
79
+ " ×"
80
+ ]
81
+ },
82
+ entry
83
+ ))
84
+ ] }),
85
+ /* @__PURE__ */ jsxs("ul", { className: "max-h-72 overflow-y-auto pr-1", "aria-label": plural, children: [
86
+ shown.map((group) => /* @__PURE__ */ jsx(
87
+ GroupRow,
88
+ {
89
+ group,
90
+ onToggle: () => onExclude(group.excluded ? includeGroup(exclude, group, groups, matches) : excludeGroup(exclude, group.name))
91
+ },
92
+ group.name
93
+ )),
94
+ shown.length === 0 && /* @__PURE__ */ jsx("li", { className: "py-1 text-xs text-muted-foreground", children: groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.` })
95
+ ] }),
96
+ /* @__PURE__ */ jsxs("form", { className: "flex items-start gap-2", onSubmit: submit, children: [
97
+ /* @__PURE__ */ jsxs("div", { className: "flex min-w-0 flex-1 flex-col gap-1", children: [
98
+ /* @__PURE__ */ jsx(InputField, { "aria-label": "Exclude pattern", placeholder: patternHint, value: pattern, onChange: setPattern }),
99
+ error && /* @__PURE__ */ jsx("span", { role: "alert", className: "text-xs text-destructive", children: error })
100
+ ] }),
101
+ /* @__PURE__ */ jsx(Button, { type: "submit", size: "sm", variant: "outline", children: "Exclude" })
102
+ ] }),
103
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between gap-2 border-t border-border pt-2", children: [
104
+ /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: onDefaults, children: "Reset to defaults" }),
105
+ /* @__PURE__ */ jsx(Button, { type: "button", size: "sm", variant: "ghost", onClick: () => onExclude([]), children: "Show all" })
106
+ ] })
107
+ ] });
108
+ }
109
+ const ACCESS_LABELS = { call: "Calls", read: "Reads", write: "Writes", variable: "Variables" };
110
+ function DataAccessControls({ access, onAccess, columns, onColumns, variables }) {
111
+ const lastOn = baseAccess(access).length === 1;
112
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
113
+ /* @__PURE__ */ jsx("div", { className: "flex items-center gap-1", role: "group", "aria-label": "Access", children: (variables ? [...CALL_GRAPH_ACCESS, "variable"] : CALL_GRAPH_ACCESS).map((type) => {
114
+ const on = access.includes(type);
115
+ const kept = on && lastOn && type !== "variable";
116
+ return /* @__PURE__ */ jsx(
117
+ Button,
118
+ {
119
+ type: "button",
120
+ size: "sm",
121
+ variant: on ? "secondary" : "outline",
122
+ "aria-pressed": on,
123
+ disabled: kept,
124
+ title: kept ? "At least one kind of access stays on" : void 0,
125
+ onClick: () => onAccess(toggleAccess(access, type)),
126
+ children: ACCESS_LABELS[type]
127
+ },
128
+ type
129
+ );
130
+ }) }),
131
+ /* @__PURE__ */ jsx(Switch, { checked: columns, label: "Columns", onChange: onColumns })
132
+ ] });
133
+ }
134
+ function GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }) {
135
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-0.5", role: "group", "aria-label": "Groups", children: [
136
+ /* @__PURE__ */ jsx(IconButton, { icon: UiExpandAll, label: "Expand all groups", className: "size-7", disabled: !anyCollapsed, onClick: onExpandAll }),
137
+ /* @__PURE__ */ jsx(IconButton, { icon: UiCollapseAll, label: "Collapse all groups", className: "size-7", disabled: !anyExpanded, onClick: onCollapseAll })
138
+ ] });
139
+ }
140
+ function CallGraphToolbar(props) {
141
+ const { exclusions, pin, vocabulary } = props;
142
+ const excludedCount = (exclusions == null ? void 0 : exclusions.groups.filter((group) => group.excluded).length) ?? 0;
143
+ const hasExternal = (exclusions == null ? void 0 : exclusions.groups.some((group) => group.external)) ?? false;
144
+ const { noun, plural } = vocabulary.group;
145
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-wrap items-center gap-3", children: [
146
+ /* @__PURE__ */ jsx(SegmentedControl, { value: props.direction, options: DIRECTIONS, onChange: props.onDirection, size: "sm", "aria-label": "Direction" }),
147
+ /* @__PURE__ */ jsx(DepthStepper, { depth: props.depth, maxDepth: props.maxDepth, onChange: props.onDepth }),
148
+ props.data && /* @__PURE__ */ jsx(DataAccessControls, { ...props.data }),
149
+ pin && /* @__PURE__ */ jsx(
150
+ Button,
151
+ {
152
+ type: "button",
153
+ variant: pin.pinned ? "secondary" : "outline",
154
+ size: "sm",
155
+ disabled: !pin.pinned && !pin.canPin,
156
+ "aria-pressed": pin.pinned,
157
+ title: pin.pinned ? "The graph keeps this root while the selection changes" : "Keep this root while the selection changes",
158
+ onClick: () => pin.onPin(!pin.pinned),
159
+ children: pin.pinned ? "Unpin root" : "Pin root"
160
+ }
161
+ ),
162
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: props.onFit, children: "Fit" }),
163
+ /* @__PURE__ */ jsxs(Button, { type: "button", variant: "outline", size: "sm", onClick: props.onReset, children: [
164
+ /* @__PURE__ */ jsx(UiHome, {}),
165
+ "Reset"
166
+ ] }),
167
+ props.groupCollapse && /* @__PURE__ */ jsx(GroupCollapseControls, { ...props.groupCollapse }),
168
+ exclusions && hasExternal && /* @__PURE__ */ jsx(
169
+ Switch,
170
+ {
171
+ checked: exclusions.exclude.includes(EXCLUDE_EXTERNAL),
172
+ disabled: exclusions.busy,
173
+ label: "Hide all external",
174
+ onChange: (hidden) => exclusions.onExclude(setExternalHidden(exclusions.exclude, hidden))
175
+ }
176
+ ),
177
+ exclusions && /* @__PURE__ */ jsx(
178
+ DropdownMenu,
179
+ {
180
+ icon: UiFilter,
181
+ label: `${capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : ""}`,
182
+ variant: "outline",
183
+ size: "sm",
184
+ menuLabel: `${capitalize(noun)} exclusions`,
185
+ title: `Choose the ${plural} the graph leaves out`,
186
+ children: () => /* @__PURE__ */ jsx(GroupFacets, { ...exclusions })
187
+ }
188
+ ),
189
+ /* @__PURE__ */ jsxs("div", { className: "ml-auto flex items-center gap-2", children: [
190
+ props.omitted && /* @__PURE__ */ jsx(OmittedChip, { omitted: props.omitted, noun }),
191
+ props.end
192
+ ] })
193
+ ] });
194
+ }
195
+ export {
196
+ CallGraphToolbar
197
+ };
198
+ //# sourceMappingURL=CallGraphToolbar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CallGraphToolbar.js","sources":["../../../src/data/call-graph/CallGraphToolbar.tsx"],"sourcesContent":["import { useState, type FormEvent, type ReactNode } from \"react\";\nimport { Button } from \"../../components/button\";\nimport { IconButton } from \"../../components/IconButton\";\nimport { InputField } from \"../../components/InputField\";\nimport { SegmentedControl } from \"../../components/SegmentedControl\";\nimport { Switch } from \"../../components/Switch\";\nimport { UiCollapseAll, UiExpandAll, UiFilter, UiHome, UiWarningTriangle } from \"../../icons\";\nimport { DropdownMenu } from \"../../overlay/DropdownMenu\";\nimport { Badge } from \"../Badge\";\nimport {\n addExcludePattern,\n EXCLUDE_EXTERNAL,\n excludeGroup,\n excludePatternError,\n includeGroup,\n removeExcludePattern,\n setExternalHidden,\n type ExcludeMatcher,\n} from \"./call-graph-exclude\";\nimport { capitalize, excludedTally, omittedParts } from \"./call-graph-labels\";\nimport { baseAccess, toggleAccess } from \"./call-graph-model\";\nimport type { CallGraphVocabulary } from \"./call-graph-vocabulary\";\nimport { CALL_GRAPH_ACCESS, type CallGraphAccess, type CallGraphDirection, type CallGraphGroupFact, type CallGraphOmitted } from \"./types\";\n\nconst DIRECTIONS: { id: CallGraphDirection; label: string }[] = [\n { id: \"callers\", label: \"Callers\" },\n { id: \"both\", label: \"Both\" },\n { id: \"callees\", label: \"Callees\" },\n];\n\nfunction DepthStepper({ depth, maxDepth, onChange }: { depth: number; maxDepth: number; onChange: (depth: number) => void }) {\n return (\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Depth\">\n <span className=\"text-xs text-muted-foreground\">Depth</span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Decrease depth\" disabled={depth <= 1} onClick={() => onChange(depth - 1)}>−</Button>\n <output className=\"w-5 text-center text-sm font-medium tabular-nums\" aria-live=\"polite\" aria-label=\"Graph depth\">{depth}</output>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" className=\"size-8 px-0\" aria-label=\"Increase depth\" disabled={depth >= maxDepth} onClick={() => onChange(depth + 1)}>+</Button>\n </div>\n );\n}\n\nfunction OmittedChip({ omitted, noun }: { omitted: CallGraphOmitted; noun: string }) {\n const parts = omittedParts(omitted);\n if (parts.length === 0) return null;\n const tally = excludedTally(omitted).map(({ group, count }) => `${group}: ${count}`);\n const title = [`Not drawn: ${parts.join(\", \")}`, ...(tally.length ? [`Excluded per ${noun}:`, ...tally] : [])].join(\"\\n\");\n return (\n <span title={title} data-testid=\"graph-omitted\">\n <Badge tone=\"warning\" size=\"md\" icon={UiWarningTriangle} clickToCopy={false}>{parts.join(\" · \")}</Badge>\n </span>\n );\n}\n\nexport interface ExclusionsProps {\n /** The patterns in force. */\n exclude: string[];\n groups: CallGraphGroupFact[];\n matches: ExcludeMatcher;\n onExclude: (patterns: string[]) => void;\n onDefaults: () => void;\n /** A graph for the last edit is loading: the facts describe the one before it, so editing waits. */\n busy: boolean;\n vocabulary: CallGraphVocabulary;\n}\n\nfunction GroupRow({ group, onToggle }: { group: CallGraphGroupFact; onToggle: () => void }) {\n const name = group.label ?? group.name;\n return (\n <li className=\"flex items-center gap-2 py-1\">\n <Switch checked={!group.excluded} onChange={onToggle} aria-label={`Show ${name}`} />\n <span className=\"min-w-0 flex-1 truncate font-mono text-xs\" title={group.name}>{name}</span>\n {group.external && <Badge variant=\"outline\" size=\"sm\" clickToCopy={false}>external</Badge>}\n <span className=\"w-8 shrink-0 text-right text-xs tabular-nums text-muted-foreground\" title={`${group.nodes} nodes`}>{group.nodes}</span>\n </li>\n );\n}\n\n/** The group facets: one switch per group the walk reached, the patterns in force, and free-text patterns. */\nfunction GroupFacets({ exclude, groups, matches, onExclude, onDefaults, busy, vocabulary }: ExclusionsProps) {\n const [filter, setFilter] = useState(\"\");\n const [pattern, setPattern] = useState(\"\");\n const [error, setError] = useState<string>();\n const { plural, patternHint } = vocabulary.group;\n const needle = filter.trim().toLowerCase();\n const shown = groups.filter((group) => `${group.name} ${group.label ?? \"\"}`.toLowerCase().includes(needle));\n const submit = (event: FormEvent) => {\n event.preventDefault();\n const typed = pattern.trim();\n const problem = excludePatternError(exclude, typed);\n setError(problem);\n if (problem) return;\n setPattern(\"\");\n onExclude(addExcludePattern(exclude, typed));\n };\n // The filter box comes first: the menu focuses its first control on opening, which must not be one that drops an exclusion.\n return (\n <fieldset disabled={busy} aria-busy={busy} className=\"flex w-96 min-w-0 max-w-[90vw] flex-col gap-2 p-2 text-sm\">\n <InputField aria-label={`Filter ${plural}`} placeholder={`Filter ${plural}`} value={filter} onChange={setFilter} />\n <div className=\"flex flex-wrap items-center gap-1\" aria-label=\"Exclusion patterns\">\n <span className=\"text-xs text-muted-foreground\">Excluding</span>\n {exclude.length === 0 && <span className=\"text-xs text-muted-foreground\">nothing</span>}\n {exclude.map((entry) => (\n <button key={entry} type=\"button\" className=\"rounded border border-border px-1.5 font-mono text-xs hover:bg-muted\"\n aria-label={`Stop excluding ${entry}`} title={`Stop excluding ${entry}`} onClick={() => onExclude(removeExcludePattern(exclude, entry))}>\n {entry} ×\n </button>\n ))}\n </div>\n <ul className=\"max-h-72 overflow-y-auto pr-1\" aria-label={plural}>\n {shown.map((group) => (\n <GroupRow key={group.name} group={group}\n onToggle={() => onExclude(group.excluded ? includeGroup(exclude, group, groups, matches) : excludeGroup(exclude, group.name))} />\n ))}\n {shown.length === 0 && (\n <li className=\"py-1 text-xs text-muted-foreground\">{groups.length ? `No ${vocabulary.group.noun} matches the filter.` : `The graph reached no ${vocabulary.group.noun}.`}</li>\n )}\n </ul>\n <form className=\"flex items-start gap-2\" onSubmit={submit}>\n <div className=\"flex min-w-0 flex-1 flex-col gap-1\">\n <InputField aria-label=\"Exclude pattern\" placeholder={patternHint} value={pattern} onChange={setPattern} />\n {error && <span role=\"alert\" className=\"text-xs text-destructive\">{error}</span>}\n </div>\n <Button type=\"submit\" size=\"sm\" variant=\"outline\">Exclude</Button>\n </form>\n <div className=\"flex justify-between gap-2 border-t border-border pt-2\">\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={onDefaults}>Reset to defaults</Button>\n <Button type=\"button\" size=\"sm\" variant=\"ghost\" onClick={() => onExclude([])}>Show all</Button>\n </div>\n </fieldset>\n );\n}\n\nconst ACCESS_LABELS: Record<CallGraphAccess, string> = { call: \"Calls\", read: \"Reads\", write: \"Writes\", variable: \"Variables\" };\n\nexport interface DataAccessProps {\n access: CallGraphAccess[];\n onAccess: (access: CallGraphAccess[]) => void;\n columns: boolean;\n onColumns: (columns: boolean) => void;\n /** Offers the Variables toggle, on top of the access types. */\n variables?: boolean;\n}\n\n/** Which edge types the graph follows, at least one of calls, reads and writes, and whether columns and fields are nodes of their own. */\nfunction DataAccessControls({ access, onAccess, columns, onColumns, variables }: DataAccessProps) {\n const lastOn = baseAccess(access).length === 1;\n return (\n <>\n <div className=\"flex items-center gap-1\" role=\"group\" aria-label=\"Access\">\n {(variables ? [...CALL_GRAPH_ACCESS, \"variable\" as const] : CALL_GRAPH_ACCESS).map((type) => {\n const on = access.includes(type);\n const kept = on && lastOn && type !== \"variable\";\n return (\n <Button key={type} type=\"button\" size=\"sm\" variant={on ? \"secondary\" : \"outline\"} aria-pressed={on} disabled={kept}\n title={kept ? \"At least one kind of access stays on\" : undefined} onClick={() => onAccess(toggleAccess(access, type))}>\n {ACCESS_LABELS[type]}\n </Button>\n );\n })}\n </div>\n <Switch checked={columns} label=\"Columns\" onChange={onColumns} />\n </>\n );\n}\n\nexport interface GroupCollapseProps {\n anyCollapsed: boolean;\n anyExpanded: boolean;\n onExpandAll: () => void;\n onCollapseAll: () => void;\n}\n\n/** Expand or collapse every group the graph draws at once. */\nfunction GroupCollapseControls({ anyCollapsed, anyExpanded, onExpandAll, onCollapseAll }: GroupCollapseProps) {\n return (\n <div className=\"flex items-center gap-0.5\" role=\"group\" aria-label=\"Groups\">\n <IconButton icon={UiExpandAll} label=\"Expand all groups\" className=\"size-7\" disabled={!anyCollapsed} onClick={onExpandAll} />\n <IconButton icon={UiCollapseAll} label=\"Collapse all groups\" className=\"size-7\" disabled={!anyExpanded} onClick={onCollapseAll} />\n </div>\n );\n}\n\nexport interface CallGraphToolbarProps {\n /** Shown only when the host's graph has reads and writes. */\n data?: DataAccessProps | undefined;\n /** Shown only when the graph draws a group that can collapse. */\n groupCollapse?: GroupCollapseProps | undefined;\n direction: CallGraphDirection;\n depth: number;\n maxDepth: number;\n /** Shown only when the host keeps a root across selection changes. */\n pin?: { pinned: boolean; canPin: boolean; onPin: (pinned: boolean) => void } | undefined;\n exclusions?: ExclusionsProps | undefined;\n omitted?: CallGraphOmitted | undefined;\n /** Host content at the toolbar's end, such as server timing. */\n end?: ReactNode;\n onDirection: (direction: CallGraphDirection) => void;\n onDepth: (depth: number) => void;\n onFit: () => void;\n onReset: () => void;\n vocabulary: CallGraphVocabulary;\n}\n\nexport function CallGraphToolbar(props: CallGraphToolbarProps) {\n const { exclusions, pin, vocabulary } = props;\n const excludedCount = exclusions?.groups.filter((group) => group.excluded).length ?? 0;\n const hasExternal = exclusions?.groups.some((group) => group.external) ?? false;\n const { noun, plural } = vocabulary.group;\n return (\n <div className=\"flex flex-wrap items-center gap-3\">\n <SegmentedControl value={props.direction} options={DIRECTIONS} onChange={props.onDirection} size=\"sm\" aria-label=\"Direction\" />\n <DepthStepper depth={props.depth} maxDepth={props.maxDepth} onChange={props.onDepth} />\n {props.data && <DataAccessControls {...props.data} />}\n {pin && (\n <Button type=\"button\" variant={pin.pinned ? \"secondary\" : \"outline\"} size=\"sm\" disabled={!pin.pinned && !pin.canPin} aria-pressed={pin.pinned}\n title={pin.pinned ? \"The graph keeps this root while the selection changes\" : \"Keep this root while the selection changes\"} onClick={() => pin.onPin(!pin.pinned)}>\n {pin.pinned ? \"Unpin root\" : \"Pin root\"}\n </Button>\n )}\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onFit}>Fit</Button>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={props.onReset}><UiHome />Reset</Button>\n {props.groupCollapse && <GroupCollapseControls {...props.groupCollapse} />}\n {exclusions && hasExternal && (\n <Switch checked={exclusions.exclude.includes(EXCLUDE_EXTERNAL)} disabled={exclusions.busy} label=\"Hide all external\"\n onChange={(hidden) => exclusions.onExclude(setExternalHidden(exclusions.exclude, hidden))} />\n )}\n {exclusions && (\n <DropdownMenu icon={UiFilter} label={`${capitalize(plural)}${excludedCount ? ` (${excludedCount} excluded)` : \"\"}`} variant=\"outline\" size=\"sm\"\n menuLabel={`${capitalize(noun)} exclusions`} title={`Choose the ${plural} the graph leaves out`}>\n {() => <GroupFacets {...exclusions} />}\n </DropdownMenu>\n )}\n <div className=\"ml-auto flex items-center gap-2\">\n {props.omitted && <OmittedChip omitted={props.omitted} noun={noun} />}\n {props.end}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}