@flanksource/clicky-ui 0.3.45 → 0.3.47

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 (505) hide show
  1. package/NOTICE.md +11 -0
  2. package/README.md +22 -0
  3. package/dist/ai.cjs +13 -8
  4. package/dist/ai.cjs.map +1 -1
  5. package/dist/ai.js +7 -2
  6. package/dist/ai.js.map +1 -1
  7. package/dist/components/ErrorWrapper.cjs +2 -3
  8. package/dist/components/ErrorWrapper.cjs.map +1 -1
  9. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  10. package/dist/components/ErrorWrapper.js +3 -4
  11. package/dist/components/ErrorWrapper.js.map +1 -1
  12. package/dist/data/AccessMark.cjs +23 -0
  13. package/dist/data/AccessMark.cjs.map +1 -0
  14. package/dist/data/AccessMark.d.ts +11 -0
  15. package/dist/data/AccessMark.d.ts.map +1 -0
  16. package/dist/data/AccessMark.js +23 -0
  17. package/dist/data/AccessMark.js.map +1 -0
  18. package/dist/data/Clicky.cjs +3 -0
  19. package/dist/data/Clicky.cjs.map +1 -1
  20. package/dist/data/Clicky.js +3 -0
  21. package/dist/data/Clicky.js.map +1 -1
  22. package/dist/data/CodeDiff.cjs +116 -23
  23. package/dist/data/CodeDiff.cjs.map +1 -1
  24. package/dist/data/CodeDiff.d.ts +26 -0
  25. package/dist/data/CodeDiff.d.ts.map +1 -1
  26. package/dist/data/CodeDiff.js +116 -23
  27. package/dist/data/CodeDiff.js.map +1 -1
  28. package/dist/data/FilterPill.cjs +15 -2
  29. package/dist/data/FilterPill.cjs.map +1 -1
  30. package/dist/data/FilterPill.d.ts +1 -1
  31. package/dist/data/FilterPill.d.ts.map +1 -1
  32. package/dist/data/FilterPill.js +15 -2
  33. package/dist/data/FilterPill.js.map +1 -1
  34. package/dist/data/GraphDiagram.cjs +65 -13
  35. package/dist/data/GraphDiagram.cjs.map +1 -1
  36. package/dist/data/GraphDiagram.d.ts +9 -2
  37. package/dist/data/GraphDiagram.d.ts.map +1 -1
  38. package/dist/data/GraphDiagram.js +66 -14
  39. package/dist/data/GraphDiagram.js.map +1 -1
  40. package/dist/data/GraphDiagramGroups.cjs +100 -0
  41. package/dist/data/GraphDiagramGroups.cjs.map +1 -0
  42. package/dist/data/GraphDiagramGroups.d.ts +24 -0
  43. package/dist/data/GraphDiagramGroups.d.ts.map +1 -0
  44. package/dist/data/GraphDiagramGroups.js +100 -0
  45. package/dist/data/GraphDiagramGroups.js.map +1 -0
  46. package/dist/data/GraphDiagramNodes.cjs +17 -31
  47. package/dist/data/GraphDiagramNodes.cjs.map +1 -1
  48. package/dist/data/GraphDiagramNodes.d.ts +6 -13
  49. package/dist/data/GraphDiagramNodes.d.ts.map +1 -1
  50. package/dist/data/GraphDiagramNodes.js +17 -31
  51. package/dist/data/GraphDiagramNodes.js.map +1 -1
  52. package/dist/data/LogViewer.cjs +27 -8
  53. package/dist/data/LogViewer.cjs.map +1 -1
  54. package/dist/data/LogViewer.d.ts +11 -3
  55. package/dist/data/LogViewer.d.ts.map +1 -1
  56. package/dist/data/LogViewer.js +27 -8
  57. package/dist/data/LogViewer.js.map +1 -1
  58. package/dist/data/Properties.cjs +2 -15
  59. package/dist/data/Properties.cjs.map +1 -1
  60. package/dist/data/Properties.d.ts +4 -0
  61. package/dist/data/Properties.d.ts.map +1 -1
  62. package/dist/data/Properties.js +2 -15
  63. package/dist/data/Properties.js.map +1 -1
  64. package/dist/data/PropertyValue.cjs +37 -0
  65. package/dist/data/PropertyValue.cjs.map +1 -0
  66. package/dist/data/PropertyValue.d.ts +6 -0
  67. package/dist/data/PropertyValue.d.ts.map +1 -0
  68. package/dist/data/PropertyValue.js +37 -0
  69. package/dist/data/PropertyValue.js.map +1 -0
  70. package/dist/data/Tree.cjs +4 -3
  71. package/dist/data/Tree.cjs.map +1 -1
  72. package/dist/data/Tree.d.ts +3 -1
  73. package/dist/data/Tree.d.ts.map +1 -1
  74. package/dist/data/Tree.js +4 -3
  75. package/dist/data/Tree.js.map +1 -1
  76. package/dist/data/TreeNode.cjs +1 -1
  77. package/dist/data/TreeNode.cjs.map +1 -1
  78. package/dist/data/TreeNode.d.ts.map +1 -1
  79. package/dist/data/TreeNode.js +1 -1
  80. package/dist/data/TreeNode.js.map +1 -1
  81. package/dist/data/ai/ChatFab.cjs +1 -1
  82. package/dist/data/ai/ChatFab.cjs.map +1 -1
  83. package/dist/data/ai/ChatFab.js +1 -1
  84. package/dist/data/ai/ChatFab.js.map +1 -1
  85. package/dist/data/ai/ChatWindow.cjs +106 -171
  86. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  87. package/dist/data/ai/ChatWindow.d.ts +6 -2
  88. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  89. package/dist/data/ai/ChatWindow.header.cjs +104 -0
  90. package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
  91. package/dist/data/ai/ChatWindow.header.d.ts +29 -0
  92. package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
  93. package/dist/data/ai/ChatWindow.header.js +104 -0
  94. package/dist/data/ai/ChatWindow.header.js.map +1 -0
  95. package/dist/data/ai/ChatWindow.js +107 -172
  96. package/dist/data/ai/ChatWindow.js.map +1 -1
  97. package/dist/data/ai/ChatWindow.placement.cjs +95 -0
  98. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
  99. package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
  100. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
  101. package/dist/data/ai/ChatWindow.placement.js +95 -0
  102. package/dist/data/ai/ChatWindow.placement.js.map +1 -0
  103. package/dist/data/ai/SessionChatComposer.cjs +3 -1
  104. package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
  105. package/dist/data/ai/SessionChatComposer.d.ts +4 -1
  106. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
  107. package/dist/data/ai/SessionChatComposer.js +3 -1
  108. package/dist/data/ai/SessionChatComposer.js.map +1 -1
  109. package/dist/data/ai/SessionInspector.cjs +68 -72
  110. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  111. package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
  112. package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
  113. package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
  114. package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
  115. package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
  116. package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
  117. package/dist/data/ai/SessionInspector.d.ts +6 -1
  118. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  119. package/dist/data/ai/SessionInspector.js +69 -73
  120. package/dist/data/ai/SessionInspector.js.map +1 -1
  121. package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
  122. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
  123. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
  124. package/dist/data/ai/SessionInspector.legacy.js +41 -42
  125. package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
  126. package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
  127. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
  128. package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
  129. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
  130. package/dist/data/ai/SessionInspector.remote-view.js +14 -9
  131. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
  132. package/dist/data/ai/SessionInspector.remote.cjs +84 -16
  133. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
  134. package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
  135. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
  136. package/dist/data/ai/SessionInspector.remote.js +86 -18
  137. package/dist/data/ai/SessionInspector.remote.js.map +1 -1
  138. package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
  139. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  140. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  141. package/dist/data/ai/SessionInspector.transcript.js +5 -0
  142. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  143. package/dist/data/ai/SessionTail.cjs +63 -0
  144. package/dist/data/ai/SessionTail.cjs.map +1 -0
  145. package/dist/data/ai/SessionTail.d.ts +14 -0
  146. package/dist/data/ai/SessionTail.d.ts.map +1 -0
  147. package/dist/data/ai/SessionTail.js +63 -0
  148. package/dist/data/ai/SessionTail.js.map +1 -0
  149. package/dist/data/ai/SessionViewer.cjs +10 -3
  150. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  151. package/dist/data/ai/SessionViewer.d.ts +7 -1
  152. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  153. package/dist/data/ai/SessionViewer.js +10 -3
  154. package/dist/data/ai/SessionViewer.js.map +1 -1
  155. package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
  156. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  157. package/dist/data/ai/index.d.ts +4 -3
  158. package/dist/data/ai/index.d.ts.map +1 -1
  159. package/dist/data/ai/use-session-scroll.cjs +30 -6
  160. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  161. package/dist/data/ai/use-session-scroll.d.ts +7 -0
  162. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  163. package/dist/data/ai/use-session-scroll.js +30 -6
  164. package/dist/data/ai/use-session-scroll.js.map +1 -1
  165. package/dist/data/call-graph/CallGraph.cjs +50 -31
  166. package/dist/data/call-graph/CallGraph.cjs.map +1 -1
  167. package/dist/data/call-graph/CallGraph.d.ts +10 -1
  168. package/dist/data/call-graph/CallGraph.d.ts.map +1 -1
  169. package/dist/data/call-graph/CallGraph.js +52 -33
  170. package/dist/data/call-graph/CallGraph.js.map +1 -1
  171. package/dist/data/call-graph/CallGraphMembers.cjs +5 -4
  172. package/dist/data/call-graph/CallGraphMembers.cjs.map +1 -1
  173. package/dist/data/call-graph/CallGraphMembers.d.ts +1 -1
  174. package/dist/data/call-graph/CallGraphMembers.d.ts.map +1 -1
  175. package/dist/data/call-graph/CallGraphMembers.js +5 -4
  176. package/dist/data/call-graph/CallGraphMembers.js.map +1 -1
  177. package/dist/data/call-graph/CallGraphToolbar.cjs +17 -5
  178. package/dist/data/call-graph/CallGraphToolbar.cjs.map +1 -1
  179. package/dist/data/call-graph/CallGraphToolbar.d.ts +10 -0
  180. package/dist/data/call-graph/CallGraphToolbar.d.ts.map +1 -1
  181. package/dist/data/call-graph/CallGraphToolbar.js +18 -6
  182. package/dist/data/call-graph/CallGraphToolbar.js.map +1 -1
  183. package/dist/data/call-graph/call-graph-model.cjs +169 -18
  184. package/dist/data/call-graph/call-graph-model.cjs.map +1 -1
  185. package/dist/data/call-graph/call-graph-model.d.ts +40 -4
  186. package/dist/data/call-graph/call-graph-model.d.ts.map +1 -1
  187. package/dist/data/call-graph/call-graph-model.js +170 -19
  188. package/dist/data/call-graph/call-graph-model.js.map +1 -1
  189. package/dist/data/call-graph/call-graph-vocabulary.cjs +19 -1
  190. package/dist/data/call-graph/call-graph-vocabulary.cjs.map +1 -1
  191. package/dist/data/call-graph/call-graph-vocabulary.d.ts +4 -0
  192. package/dist/data/call-graph/call-graph-vocabulary.d.ts.map +1 -1
  193. package/dist/data/call-graph/call-graph-vocabulary.js +19 -1
  194. package/dist/data/call-graph/call-graph-vocabulary.js.map +1 -1
  195. package/dist/data/call-graph/call-graph.fixtures.d.ts.map +1 -1
  196. package/dist/data/call-graph/index.d.ts +2 -2
  197. package/dist/data/call-graph/index.d.ts.map +1 -1
  198. package/dist/data/call-graph/types.cjs.map +1 -1
  199. package/dist/data/call-graph/types.d.ts +7 -2
  200. package/dist/data/call-graph/types.d.ts.map +1 -1
  201. package/dist/data/call-graph/types.js.map +1 -1
  202. package/dist/data/chat/Chat.cjs +1 -1
  203. package/dist/data/chat/Chat.cjs.map +1 -1
  204. package/dist/data/chat/Chat.js +1 -1
  205. package/dist/data/chat/Chat.js.map +1 -1
  206. package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
  207. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  208. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  209. package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
  210. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  211. package/dist/data/chat/PromptInput.cjs +4 -2
  212. package/dist/data/chat/PromptInput.cjs.map +1 -1
  213. package/dist/data/chat/PromptInput.d.ts +5 -1
  214. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  215. package/dist/data/chat/PromptInput.js +4 -2
  216. package/dist/data/chat/PromptInput.js.map +1 -1
  217. package/dist/data/data-access.cjs +8 -0
  218. package/dist/data/data-access.cjs.map +1 -0
  219. package/dist/data/data-access.d.ts +5 -0
  220. package/dist/data/data-access.d.ts.map +1 -0
  221. package/dist/data/data-access.js +8 -0
  222. package/dist/data/data-access.js.map +1 -0
  223. package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
  224. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  225. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  226. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  227. package/dist/data/diagnostics/ErrorDetails.js +14 -3
  228. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  229. package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
  230. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  231. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  232. package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
  233. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  234. package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
  235. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  236. package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
  237. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  238. package/dist/data/diagnostics/error-diagnostics.js +6 -1
  239. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  240. package/dist/data/git/GitChangeList.cjs +6 -2
  241. package/dist/data/git/GitChangeList.cjs.map +1 -1
  242. package/dist/data/git/GitChangeList.d.ts +6 -1
  243. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  244. package/dist/data/git/GitChangeList.js +6 -2
  245. package/dist/data/git/GitChangeList.js.map +1 -1
  246. package/dist/data/graph-columns-layout.cjs +47 -16
  247. package/dist/data/graph-columns-layout.cjs.map +1 -1
  248. package/dist/data/graph-columns-layout.d.ts +34 -0
  249. package/dist/data/graph-columns-layout.d.ts.map +1 -1
  250. package/dist/data/graph-columns-layout.js +47 -16
  251. package/dist/data/graph-columns-layout.js.map +1 -1
  252. package/dist/data/graph-diagram-model.cjs +5 -0
  253. package/dist/data/graph-diagram-model.cjs.map +1 -1
  254. package/dist/data/graph-diagram-model.d.ts +19 -0
  255. package/dist/data/graph-diagram-model.d.ts.map +1 -1
  256. package/dist/data/graph-diagram-model.js +5 -0
  257. package/dist/data/graph-diagram-model.js.map +1 -1
  258. package/dist/data/graph-group-window.cjs +60 -0
  259. package/dist/data/graph-group-window.cjs.map +1 -0
  260. package/dist/data/graph-group-window.d.ts +33 -0
  261. package/dist/data/graph-group-window.d.ts.map +1 -0
  262. package/dist/data/graph-group-window.js +60 -0
  263. package/dist/data/graph-group-window.js.map +1 -0
  264. package/dist/data/har/HarPanel.cjs +3 -1
  265. package/dist/data/har/HarPanel.cjs.map +1 -1
  266. package/dist/data/har/HarPanel.d.ts +4 -1
  267. package/dist/data/har/HarPanel.d.ts.map +1 -1
  268. package/dist/data/har/HarPanel.js +3 -1
  269. package/dist/data/har/HarPanel.js.map +1 -1
  270. package/dist/data/test-runner/Expectation.cjs +57 -0
  271. package/dist/data/test-runner/Expectation.cjs.map +1 -0
  272. package/dist/data/test-runner/Expectation.d.ts +19 -0
  273. package/dist/data/test-runner/Expectation.d.ts.map +1 -0
  274. package/dist/data/test-runner/Expectation.js +57 -0
  275. package/dist/data/test-runner/Expectation.js.map +1 -0
  276. package/dist/data/test-runner/MarkIcons.cjs +38 -0
  277. package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
  278. package/dist/data/test-runner/MarkIcons.d.ts +15 -0
  279. package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
  280. package/dist/data/test-runner/MarkIcons.js +38 -0
  281. package/dist/data/test-runner/MarkIcons.js.map +1 -0
  282. package/dist/data/test-runner/TestDetailPanel.cjs +74 -42
  283. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  284. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  285. package/dist/data/test-runner/TestDetailPanel.js +76 -44
  286. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  287. package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
  288. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  289. package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
  290. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  291. package/dist/data/test-runner/TestFailureDetail.js +23 -27
  292. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  293. package/dist/data/test-runner/TestFilterBar.cjs +87 -93
  294. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  295. package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
  296. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  297. package/dist/data/test-runner/TestFilterBar.js +89 -95
  298. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  299. package/dist/data/test-runner/TestRunSummary.cjs +35 -21
  300. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  301. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  302. package/dist/data/test-runner/TestRunSummary.js +35 -21
  303. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  304. package/dist/data/test-runner/TestRunner.cjs +52 -30
  305. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  306. package/dist/data/test-runner/TestRunner.d.ts +3 -2
  307. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  308. package/dist/data/test-runner/TestRunner.js +52 -30
  309. package/dist/data/test-runner/TestRunner.js.map +1 -1
  310. package/dist/data/test-runner/TestTree.cjs +5 -2
  311. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  312. package/dist/data/test-runner/TestTree.d.ts +5 -2
  313. package/dist/data/test-runner/TestTree.d.ts.map +1 -1
  314. package/dist/data/test-runner/TestTree.js +5 -2
  315. package/dist/data/test-runner/TestTree.js.map +1 -1
  316. package/dist/data/test-runner/TestTreeNode.cjs +27 -19
  317. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  318. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  319. package/dist/data/test-runner/TestTreeNode.js +28 -20
  320. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  321. package/dist/data/test-runner/adapter.cjs +11 -0
  322. package/dist/data/test-runner/adapter.cjs.map +1 -1
  323. package/dist/data/test-runner/adapter.d.ts +18 -7
  324. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  325. package/dist/data/test-runner/adapter.js +11 -0
  326. package/dist/data/test-runner/adapter.js.map +1 -1
  327. package/dist/data/test-runner/copy.cjs +114 -0
  328. package/dist/data/test-runner/copy.cjs.map +1 -0
  329. package/dist/data/test-runner/copy.d.ts +47 -0
  330. package/dist/data/test-runner/copy.d.ts.map +1 -0
  331. package/dist/data/test-runner/copy.js +114 -0
  332. package/dist/data/test-runner/copy.js.map +1 -0
  333. package/dist/data/test-runner/index.d.ts +5 -2
  334. package/dist/data/test-runner/index.d.ts.map +1 -1
  335. package/dist/data/test-runner/marks.cjs +143 -0
  336. package/dist/data/test-runner/marks.cjs.map +1 -0
  337. package/dist/data/test-runner/marks.d.ts +30 -0
  338. package/dist/data/test-runner/marks.d.ts.map +1 -0
  339. package/dist/data/test-runner/marks.js +143 -0
  340. package/dist/data/test-runner/marks.js.map +1 -0
  341. package/dist/data/test-runner/status.cjs +27 -44
  342. package/dist/data/test-runner/status.cjs.map +1 -1
  343. package/dist/data/test-runner/status.d.ts +12 -3
  344. package/dist/data/test-runner/status.d.ts.map +1 -1
  345. package/dist/data/test-runner/status.js +27 -44
  346. package/dist/data/test-runner/status.js.map +1 -1
  347. package/dist/data/use-group-windows.cjs +50 -0
  348. package/dist/data/use-group-windows.cjs.map +1 -0
  349. package/dist/data/use-group-windows.d.ts +27 -0
  350. package/dist/data/use-group-windows.d.ts.map +1 -0
  351. package/dist/data/use-group-windows.js +50 -0
  352. package/dist/data/use-group-windows.js.map +1 -0
  353. package/dist/data/verification/adapterViews.cjs +16 -41
  354. package/dist/data/verification/adapterViews.cjs.map +1 -1
  355. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  356. package/dist/data/verification/adapterViews.js +16 -41
  357. package/dist/data/verification/adapterViews.js.map +1 -1
  358. package/dist/data/verification/adapters.cjs +115 -3
  359. package/dist/data/verification/adapters.cjs.map +1 -1
  360. package/dist/data/verification/adapters.d.ts.map +1 -1
  361. package/dist/data/verification/adapters.js +115 -3
  362. package/dist/data/verification/adapters.js.map +1 -1
  363. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  364. package/dist/data/verification/verifyReportTests.js.map +1 -1
  365. package/dist/data/version-info.cjs +3 -3
  366. package/dist/data/version-info.js +3 -3
  367. package/dist/data.cjs +54 -3
  368. package/dist/data.cjs.map +1 -1
  369. package/dist/data.d.ts +6 -2
  370. package/dist/data.d.ts.map +1 -1
  371. package/dist/data.js +58 -7
  372. package/dist/data.js.map +1 -1
  373. package/dist/hooks/event-hub.cjs +229 -0
  374. package/dist/hooks/event-hub.cjs.map +1 -0
  375. package/dist/hooks/event-hub.d.ts +26 -0
  376. package/dist/hooks/event-hub.d.ts.map +1 -0
  377. package/dist/hooks/event-hub.js +229 -0
  378. package/dist/hooks/event-hub.js.map +1 -0
  379. package/dist/hooks.cjs +2 -0
  380. package/dist/hooks.cjs.map +1 -1
  381. package/dist/hooks.d.ts +1 -0
  382. package/dist/hooks.d.ts.map +1 -1
  383. package/dist/hooks.js +2 -0
  384. package/dist/hooks.js.map +1 -1
  385. package/dist/icons/components/UiLogoEslint.cjs +10 -0
  386. package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
  387. package/dist/icons/components/UiLogoEslint.d.ts +9 -0
  388. package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
  389. package/dist/icons/components/UiLogoEslint.js +10 -0
  390. package/dist/icons/components/UiLogoEslint.js.map +1 -0
  391. package/dist/icons/components/UiLogoGo.cjs +10 -0
  392. package/dist/icons/components/UiLogoGo.cjs.map +1 -0
  393. package/dist/icons/components/UiLogoGo.d.ts +9 -0
  394. package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
  395. package/dist/icons/components/UiLogoGo.js +10 -0
  396. package/dist/icons/components/UiLogoGo.js.map +1 -0
  397. package/dist/icons/components/UiLogoJest.cjs +10 -0
  398. package/dist/icons/components/UiLogoJest.cjs.map +1 -0
  399. package/dist/icons/components/UiLogoJest.d.ts +9 -0
  400. package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
  401. package/dist/icons/components/UiLogoJest.js +10 -0
  402. package/dist/icons/components/UiLogoJest.js.map +1 -0
  403. package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
  404. package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
  405. package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
  406. package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
  407. package/dist/icons/components/UiLogoMarkdown.js +10 -0
  408. package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
  409. package/dist/icons/components/UiLogoOxc.cjs +10 -0
  410. package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
  411. package/dist/icons/components/UiLogoOxc.d.ts +9 -0
  412. package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
  413. package/dist/icons/components/UiLogoOxc.js +10 -0
  414. package/dist/icons/components/UiLogoOxc.js.map +1 -0
  415. package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
  416. package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
  417. package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
  418. package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
  419. package/dist/icons/components/UiLogoPlaywright.js +10 -0
  420. package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
  421. package/dist/icons/components/UiLogoPython.cjs +10 -0
  422. package/dist/icons/components/UiLogoPython.cjs.map +1 -0
  423. package/dist/icons/components/UiLogoPython.d.ts +9 -0
  424. package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
  425. package/dist/icons/components/UiLogoPython.js +10 -0
  426. package/dist/icons/components/UiLogoPython.js.map +1 -0
  427. package/dist/icons/components/UiLogoReact.cjs +10 -0
  428. package/dist/icons/components/UiLogoReact.cjs.map +1 -0
  429. package/dist/icons/components/UiLogoReact.d.ts +9 -0
  430. package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
  431. package/dist/icons/components/UiLogoReact.js +10 -0
  432. package/dist/icons/components/UiLogoReact.js.map +1 -0
  433. package/dist/icons/components/UiLogoRuff.cjs +10 -0
  434. package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
  435. package/dist/icons/components/UiLogoRuff.d.ts +9 -0
  436. package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
  437. package/dist/icons/components/UiLogoRuff.js +10 -0
  438. package/dist/icons/components/UiLogoRuff.js.map +1 -0
  439. package/dist/icons/components/UiLogoTypescript.cjs +10 -0
  440. package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
  441. package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
  442. package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
  443. package/dist/icons/components/UiLogoTypescript.js +10 -0
  444. package/dist/icons/components/UiLogoTypescript.js.map +1 -0
  445. package/dist/icons/components/UiLogoVitest.cjs +10 -0
  446. package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
  447. package/dist/icons/components/UiLogoVitest.d.ts +9 -0
  448. package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
  449. package/dist/icons/components/UiLogoVitest.js +10 -0
  450. package/dist/icons/components/UiLogoVitest.js.map +1 -0
  451. package/dist/icons/index.d.ts +11 -0
  452. package/dist/icons/index.d.ts.map +1 -1
  453. package/dist/icons/registry.cjs +22 -0
  454. package/dist/icons/registry.cjs.map +1 -1
  455. package/dist/icons/registry.d.ts.map +1 -1
  456. package/dist/icons/registry.js +22 -0
  457. package/dist/icons/registry.js.map +1 -1
  458. package/dist/icons.cjs +22 -0
  459. package/dist/icons.cjs.map +1 -1
  460. package/dist/icons.js +22 -0
  461. package/dist/icons.js.map +1 -1
  462. package/dist/index.cjs +56 -3
  463. package/dist/index.cjs.map +1 -1
  464. package/dist/index.js +60 -7
  465. package/dist/index.js.map +1 -1
  466. package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
  467. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  468. package/dist/overlay/DropdownMenuSubmenu.js +4 -4
  469. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  470. package/dist/overlay/modalStack.cjs +13 -6
  471. package/dist/overlay/modalStack.cjs.map +1 -1
  472. package/dist/overlay/modalStack.d.ts.map +1 -1
  473. package/dist/overlay/modalStack.js +13 -6
  474. package/dist/overlay/modalStack.js.map +1 -1
  475. package/dist/rpc/InlineError.cjs +12 -43
  476. package/dist/rpc/InlineError.cjs.map +1 -1
  477. package/dist/rpc/InlineError.d.ts.map +1 -1
  478. package/dist/rpc/InlineError.js +13 -44
  479. package/dist/rpc/InlineError.js.map +1 -1
  480. package/dist/rpc/OperationScheduleDialog.cjs +63 -10
  481. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  482. package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
  483. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  484. package/dist/rpc/OperationScheduleDialog.js +63 -10
  485. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  486. package/dist/rpc/OperationSchedules.cjs +12 -2
  487. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  488. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  489. package/dist/rpc/OperationSchedules.js +12 -2
  490. package/dist/rpc/OperationSchedules.js.map +1 -1
  491. package/dist/rpc/operation-schedule-model.cjs +2 -0
  492. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  493. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  494. package/dist/rpc/operation-schedule-model.js +2 -0
  495. package/dist/rpc/operation-schedule-model.js.map +1 -1
  496. package/dist/rpc/operation-schedule-types.d.ts +7 -1
  497. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  498. package/dist/styles.css +1 -1
  499. package/package.json +1 -1
  500. package/dist/data/test-runner/frameworkIcon.cjs +0 -27
  501. package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
  502. package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
  503. package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
  504. package/dist/data/test-runner/frameworkIcon.js +0 -27
  505. package/dist/data/test-runner/frameworkIcon.js.map +0 -1
@@ -39,7 +39,7 @@ function NodeLabel({ node, oneLine }) {
39
39
  }
40
40
  );
41
41
  if (node.icon == null) return label;
42
- return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex max-w-full items-center gap-1.5", children: [
42
+ return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 max-w-full items-center gap-1.5", children: [
43
43
  /* @__PURE__ */ jsxRuntime.jsx("span", { "data-graph-node-icon": "", className: "flex shrink-0 text-base leading-none", children: node.icon }),
44
44
  label
45
45
  ] });
@@ -48,6 +48,7 @@ function NodeBody({
48
48
  node,
49
49
  oneLine,
50
50
  compact,
51
+ row,
51
52
  selected,
52
53
  onSelect
53
54
  }) {
@@ -56,13 +57,14 @@ function NodeBody({
56
57
  "div",
57
58
  {
58
59
  className: utils.cn(
59
- "flex h-full w-full border text-xs shadow-sm",
60
+ "flex h-full w-full text-xs",
61
+ row ? "border-t border-border/60 hover:bg-accent" : "border shadow-sm",
60
62
  compact ? "items-center px-2 text-left text-[11px]" : "flex-col items-center justify-center gap-0.5 px-3 py-1.5 text-center",
61
- node.shape === "pill" ? "rounded-full" : compact ? "rounded-md" : "rounded-lg",
62
- graphDiagramModel.TONE_NODE_CLASS[tone],
63
- node.muted && "border-dashed text-muted-foreground shadow-none",
64
- node.muted && tone === "neutral" && "bg-muted",
65
- selected && "ring-2 ring-primary ring-offset-2 ring-offset-background",
63
+ !row && (node.shape === "pill" ? "rounded-full" : compact ? "rounded-md" : "rounded-lg"),
64
+ row ? tone === "info" ? "bg-sky-500/10 text-foreground" : "text-foreground" : graphDiagramModel.TONE_NODE_CLASS[tone],
65
+ node.muted && (row ? "text-muted-foreground" : "border-dashed text-muted-foreground shadow-none"),
66
+ !row && node.muted && tone === "neutral" && "bg-muted",
67
+ selected && (row ? "bg-primary/10 ring-2 ring-inset ring-primary" : "ring-2 ring-primary ring-offset-2 ring-offset-background"),
66
68
  onSelect && "cursor-pointer"
67
69
  ),
68
70
  ...onSelect ? {
@@ -76,6 +78,9 @@ function NodeBody({
76
78
  title: node.title,
77
79
  children: [
78
80
  /* @__PURE__ */ jsxRuntime.jsx(NodeLabel, { node, oneLine: oneLine || compact }),
81
+ row && node.aside != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "ml-auto min-w-0 truncate pl-2 font-mono text-[10px] text-muted-foreground", children: node.aside }),
82
+ node.mark != null && // Kept out of the node's accessible name, which stays the node's own; the mark is its tooltip.
83
+ /* @__PURE__ */ jsxRuntime.jsx("span", { "data-graph-node-mark": "", "aria-hidden": true, className: utils.cn("flex shrink-0 items-center", compact ? row && node.aside != null ? "pl-1" : "ml-auto pl-1" : "absolute right-1 top-1"), children: node.mark }),
79
84
  !compact && node.detail != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "line-clamp-1 text-[10px] leading-tight text-muted-foreground", children: node.detail }),
80
85
  !compact && node.badge != null && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "mt-0.5", children: node.badge })
81
86
  ]
@@ -85,10 +90,12 @@ function NodeBody({
85
90
  function GraphDiagramNodes({
86
91
  nodes,
87
92
  positions,
93
+ windowOf,
88
94
  place,
89
95
  nodeWidth,
90
96
  nodeHeight,
91
97
  nodeHeights,
98
+ recordNodes,
92
99
  selectedId,
93
100
  onNodeSelect,
94
101
  onNodeExpand,
@@ -97,11 +104,13 @@ function GraphDiagramNodes({
97
104
  return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: nodes.map((node) => {
98
105
  const height = nodeHeights[node.id] ?? nodeHeight;
99
106
  const compact = node.id in nodeHeights;
107
+ const windowBox = windowOf.get(node.id);
100
108
  return /* @__PURE__ */ jsxRuntime.jsxs(
101
109
  "div",
102
110
  {
103
111
  "data-graph-node": node.id,
104
112
  "data-graph-node-size": compact ? "compact" : "regular",
113
+ ...windowBox !== void 0 ? { "data-graph-window": windowBox } : {},
105
114
  className: "pointer-events-auto absolute -translate-x-1/2 -translate-y-1/2",
106
115
  style: { ...place(graphDiagramModel.requireEntry(positions, node.id, "layout position")), width: nodeWidth, height },
107
116
  ...onNodeHover ? graphDiagramModel.hoverHandlers(node.id, onNodeHover) : {},
@@ -112,6 +121,7 @@ function GraphDiagramNodes({
112
121
  node,
113
122
  oneLine: height < TWO_LINE_HEIGHT,
114
123
  compact,
124
+ row: recordNodes.has(node.id),
115
125
  selected: selectedId != null && node.id === selectedId,
116
126
  onSelect: onNodeSelect ? () => onNodeSelect(node.id) : void 0
117
127
  }
@@ -123,29 +133,5 @@ function GraphDiagramNodes({
123
133
  );
124
134
  }) });
125
135
  }
126
- function GraphDiagramGroupBoxes({ boxes, groups }) {
127
- const captions = new Map(groups == null ? void 0 : groups.map((group) => [group.id, group]));
128
- return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: boxes.map((box) => {
129
- const caption = captions.get(box.group);
130
- return /* @__PURE__ */ jsxRuntime.jsx(
131
- "div",
132
- {
133
- "data-graph-group": box.id,
134
- className: "pointer-events-none absolute rounded-xl border border-dashed border-border bg-muted/30",
135
- style: { left: box.x, top: box.y, width: box.width, height: box.height },
136
- children: /* @__PURE__ */ jsxRuntime.jsx(
137
- "span",
138
- {
139
- title: caption == null ? void 0 : caption.title,
140
- className: "pointer-events-auto absolute left-2 top-0 max-w-[calc(100%-1rem)] -translate-y-1/2 truncate rounded border border-border bg-background px-1.5 text-[10px] font-medium leading-4 text-muted-foreground",
141
- children: caption ? caption.label : box.group
142
- }
143
- )
144
- },
145
- box.id
146
- );
147
- }) });
148
- }
149
- exports.GraphDiagramGroupBoxes = GraphDiagramGroupBoxes;
150
136
  exports.GraphDiagramNodes = GraphDiagramNodes;
151
137
  //# sourceMappingURL=GraphDiagramNodes.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"GraphDiagramNodes.cjs","sources":["../../src/data/GraphDiagramNodes.tsx"],"sourcesContent":["import type { KeyboardEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { GraphLayoutPosition } from \"./graph-layout\";\nimport type { GraphLayoutGroupBox } from \"./graph-columns-layout\";\nimport {\n activateOnKey,\n hoverHandlers,\n nodeName,\n requireEntry,\n TONE_NODE_CLASS,\n type GraphDiagramGroup,\n type GraphDiagramNode,\n type GraphPlacer,\n} from \"./graph-diagram-model\";\n\nexport interface GraphDiagramNodesProps {\n nodes: GraphDiagramNode[];\n positions: Record<string, GraphLayoutPosition>;\n place: GraphPlacer;\n nodeWidth: number;\n nodeHeight: number;\n /** Heights of the nodes not drawn at `nodeHeight`, by id: the compact ones. */\n nodeHeights: Readonly<Record<string, number>>;\n selectedId: string | undefined;\n onNodeSelect: ((id: string) => void) | undefined;\n onNodeExpand: ((id: string) => void) | undefined;\n onNodeHover: ((id: string | undefined) => void) | undefined;\n}\n\nconst EXPAND_CLASS =\n \"absolute bottom-0 translate-y-1/2 rounded-full border border-border bg-background px-1.5 text-[10px] font-semibold leading-4 text-muted-foreground shadow-sm\";\n\n/**\n * The `+N` control. It hangs off the node's bottom edge at its outer end —\n * the left for a node left of level 0, the right otherwise — which keeps it\n * clear of the side middles where edges attach. It is a sibling of the node,\n * not a child, so activating it never also selects the node.\n */\nfunction ExpandControl({ node, onExpand }: { node: GraphDiagramNode; onExpand: (() => void) | undefined }) {\n const side = (node.level ?? 0) < 0 ? \"left-2\" : \"right-2\";\n const text = `+${node.expandCount}`;\n if (!onExpand) {\n return <span className={cn(EXPAND_CLASS, side)}>{text}</span>;\n }\n return (\n <button\n type=\"button\"\n aria-label={`Expand ${node.expandCount} more from ${nodeName(node)}`}\n className={cn(\n EXPAND_CLASS,\n side,\n \"cursor-pointer hover:border-primary hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n onClick={onExpand}\n >\n {text}\n </button>\n );\n}\n\n// Two 15px label lines, the body's vertical padding and its border.\nconst TWO_LINE_HEIGHT = 44;\n\n/** The label, behind the node's icon when it has one. `oneLine` cuts it with an ellipsis instead of wrapping. */\nfunction NodeLabel({ node, oneLine }: { node: GraphDiagramNode; oneLine: boolean }) {\n const label = (\n <span\n className={cn(\n oneLine ? \"max-w-full truncate\" : \"line-clamp-2\",\n \"font-medium leading-tight\",\n node.icon != null && \"min-w-0\",\n )}\n >\n {node.label}\n </span>\n );\n if (node.icon == null) return label;\n return (\n <span className=\"flex max-w-full items-center gap-1.5\">\n <span data-graph-node-icon=\"\" className=\"flex shrink-0 text-base leading-none\">\n {node.icon}\n </span>\n {label}\n </span>\n );\n}\n\nfunction NodeBody({\n node,\n oneLine,\n compact,\n selected,\n onSelect,\n}: {\n node: GraphDiagramNode;\n /** The node is too short for two label lines. */\n oneLine: boolean;\n /** Its icon and label on one short line, left-aligned, without its detail or badge. */\n compact: boolean;\n selected: boolean;\n onSelect: (() => void) | undefined;\n}) {\n const tone = node.tone ?? \"neutral\";\n return (\n <div\n className={cn(\n \"flex h-full w-full border text-xs shadow-sm\",\n compact\n ? \"items-center px-2 text-left text-[11px]\"\n : \"flex-col items-center justify-center gap-0.5 px-3 py-1.5 text-center\",\n node.shape === \"pill\" ? \"rounded-full\" : compact ? \"rounded-md\" : \"rounded-lg\",\n TONE_NODE_CLASS[tone],\n node.muted && \"border-dashed text-muted-foreground shadow-none\",\n node.muted && tone === \"neutral\" && \"bg-muted\",\n selected && \"ring-2 ring-primary ring-offset-2 ring-offset-background\",\n onSelect && \"cursor-pointer\",\n )}\n {...(onSelect\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n \"aria-pressed\": selected,\n onClick: onSelect,\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => activateOnKey(event, onSelect),\n }\n : {})}\n aria-label={node.ariaLabel}\n title={node.title}\n >\n <NodeLabel node={node} oneLine={oneLine || compact} />\n {!compact && node.detail != null && (\n <span className=\"line-clamp-1 text-[10px] leading-tight text-muted-foreground\">{node.detail}</span>\n )}\n {!compact && node.badge != null && <span className=\"mt-0.5\">{node.badge}</span>}\n </div>\n );\n}\n\nexport function GraphDiagramNodes({\n nodes,\n positions,\n place,\n nodeWidth,\n nodeHeight,\n nodeHeights,\n selectedId,\n onNodeSelect,\n onNodeExpand,\n onNodeHover,\n}: GraphDiagramNodesProps) {\n return (\n <>\n {nodes.map((node) => {\n const height = nodeHeights[node.id] ?? nodeHeight;\n const compact = node.id in nodeHeights;\n return (\n <div\n key={node.id}\n data-graph-node={node.id}\n data-graph-node-size={compact ? \"compact\" : \"regular\"}\n className=\"pointer-events-auto absolute -translate-x-1/2 -translate-y-1/2\"\n style={{ ...place(requireEntry(positions, node.id, \"layout position\")), width: nodeWidth, height }}\n {...(onNodeHover ? hoverHandlers(node.id, onNodeHover) : {})}\n >\n <NodeBody\n node={node}\n oneLine={height < TWO_LINE_HEIGHT}\n compact={compact}\n selected={selectedId != null && node.id === selectedId}\n onSelect={onNodeSelect ? () => onNodeSelect(node.id) : undefined}\n />\n {node.expandCount != null && node.expandCount > 0 && (\n <ExpandControl node={node} onExpand={onNodeExpand ? () => onNodeExpand(node.id) : undefined} />\n )}\n </div>\n );\n })}\n </>\n );\n}\n\nexport interface GraphDiagramGroupBoxesProps {\n boxes: GraphLayoutGroupBox[];\n groups: GraphDiagramGroup[] | undefined;\n}\n\n/**\n * Group rectangles, drawn behind the edges and nodes, each captioned on its top border. A box lets the\n * pointer through to the stage, so a click inside it never lands on the box; only its caption takes\n * the pointer, for its tooltip.\n */\nexport function GraphDiagramGroupBoxes({ boxes, groups }: GraphDiagramGroupBoxesProps) {\n const captions = new Map(groups?.map((group) => [group.id, group]));\n return (\n <>\n {boxes.map((box) => {\n const caption = captions.get(box.group);\n return (\n <div\n key={box.id}\n data-graph-group={box.id}\n className=\"pointer-events-none absolute rounded-xl border border-dashed border-border bg-muted/30\"\n style={{ left: box.x, top: box.y, width: box.width, height: box.height }}\n >\n <span\n title={caption?.title}\n className=\"pointer-events-auto absolute left-2 top-0 max-w-[calc(100%-1rem)] -translate-y-1/2 truncate rounded border border-border bg-background px-1.5 text-[10px] font-medium leading-4 text-muted-foreground\"\n >\n {caption ? caption.label : box.group}\n </span>\n </div>\n );\n })}\n </>\n );\n}\n"],"names":["cn","jsx","nodeName","jsxs","TONE_NODE_CLASS","activateOnKey","Fragment","requireEntry","hoverHandlers"],"mappings":"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"}
1
+ {"version":3,"file":"GraphDiagramNodes.cjs","sources":["../../src/data/GraphDiagramNodes.tsx"],"sourcesContent":["import type { KeyboardEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { GraphLayoutPosition } from \"./graph-layout\";\nimport {\n activateOnKey,\n hoverHandlers,\n nodeName,\n requireEntry,\n TONE_NODE_CLASS,\n type GraphDiagramNode,\n type GraphPlacer,\n} from \"./graph-diagram-model\";\n\nexport interface GraphDiagramNodesProps {\n /** The nodes to draw: members scrolled out of their window and collapsed groups' stand-ins are left out. */\n nodes: GraphDiagramNode[];\n positions: Record<string, GraphLayoutPosition>;\n /** The windowed group box each scrolling member belongs to, by node id: a wheel over the member scrolls it. */\n windowOf: ReadonlyMap<string, string>;\n place: GraphPlacer;\n nodeWidth: number;\n nodeHeight: number;\n /** Heights of the nodes not drawn at `nodeHeight`, by id: the compact ones. */\n nodeHeights: Readonly<Record<string, number>>;\n recordNodes: ReadonlySet<string>;\n selectedId: string | undefined;\n onNodeSelect: ((id: string) => void) | undefined;\n onNodeExpand: ((id: string) => void) | undefined;\n onNodeHover: ((id: string | undefined) => void) | undefined;\n}\n\nconst EXPAND_CLASS =\n \"absolute bottom-0 translate-y-1/2 rounded-full border border-border bg-background px-1.5 text-[10px] font-semibold leading-4 text-muted-foreground shadow-sm\";\n\n/**\n * The `+N` control. It hangs off the node's bottom edge at its outer end —\n * the left for a node left of level 0, the right otherwise — which keeps it\n * clear of the side middles where edges attach. It is a sibling of the node,\n * not a child, so activating it never also selects the node.\n */\nfunction ExpandControl({ node, onExpand }: { node: GraphDiagramNode; onExpand: (() => void) | undefined }) {\n const side = (node.level ?? 0) < 0 ? \"left-2\" : \"right-2\";\n const text = `+${node.expandCount}`;\n if (!onExpand) {\n return <span className={cn(EXPAND_CLASS, side)}>{text}</span>;\n }\n return (\n <button\n type=\"button\"\n aria-label={`Expand ${node.expandCount} more from ${nodeName(node)}`}\n className={cn(\n EXPAND_CLASS,\n side,\n \"cursor-pointer hover:border-primary hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n onClick={onExpand}\n >\n {text}\n </button>\n );\n}\n\n// Two 15px label lines, the body's vertical padding and its border.\nconst TWO_LINE_HEIGHT = 44;\n\n/** The label, behind the node's icon when it has one. `oneLine` cuts it with an ellipsis instead of wrapping. */\nfunction NodeLabel({ node, oneLine }: { node: GraphDiagramNode; oneLine: boolean }) {\n const label = (\n <span\n className={cn(\n oneLine ? \"max-w-full truncate\" : \"line-clamp-2\",\n \"font-medium leading-tight\",\n node.icon != null && \"min-w-0\",\n )}\n >\n {node.label}\n </span>\n );\n if (node.icon == null) return label;\n return (\n <span className=\"flex min-w-0 max-w-full items-center gap-1.5\">\n <span data-graph-node-icon=\"\" className=\"flex shrink-0 text-base leading-none\">\n {node.icon}\n </span>\n {label}\n </span>\n );\n}\n\nfunction NodeBody({\n node,\n oneLine,\n compact,\n row,\n selected,\n onSelect,\n}: {\n node: GraphDiagramNode;\n /** The node is too short for two label lines. */\n oneLine: boolean;\n /** Its icon and label on one short line, left-aligned, without its detail or badge. */\n compact: boolean;\n row: boolean;\n selected: boolean;\n onSelect: (() => void) | undefined;\n}) {\n const tone = node.tone ?? \"neutral\";\n return (\n <div\n className={cn(\n \"flex h-full w-full text-xs\",\n row ? \"border-t border-border/60 hover:bg-accent\" : \"border shadow-sm\",\n compact\n ? \"items-center px-2 text-left text-[11px]\"\n : \"flex-col items-center justify-center gap-0.5 px-3 py-1.5 text-center\",\n !row && (node.shape === \"pill\" ? \"rounded-full\" : compact ? \"rounded-md\" : \"rounded-lg\"),\n row ? (tone === \"info\" ? \"bg-sky-500/10 text-foreground\" : \"text-foreground\") : TONE_NODE_CLASS[tone],\n node.muted && (row ? \"text-muted-foreground\" : \"border-dashed text-muted-foreground shadow-none\"),\n !row && node.muted && tone === \"neutral\" && \"bg-muted\",\n selected && (row ? \"bg-primary/10 ring-2 ring-inset ring-primary\" : \"ring-2 ring-primary ring-offset-2 ring-offset-background\"),\n onSelect && \"cursor-pointer\",\n )}\n {...(onSelect\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n \"aria-pressed\": selected,\n onClick: onSelect,\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => activateOnKey(event, onSelect),\n }\n : {})}\n aria-label={node.ariaLabel}\n title={node.title}\n >\n <NodeLabel node={node} oneLine={oneLine || compact} />\n {row && node.aside != null && <span className=\"ml-auto min-w-0 truncate pl-2 font-mono text-[10px] text-muted-foreground\">{node.aside}</span>}\n {node.mark != null && (\n // Kept out of the node's accessible name, which stays the node's own; the mark is its tooltip.\n <span data-graph-node-mark=\"\" aria-hidden className={cn(\"flex shrink-0 items-center\", compact ? (row && node.aside != null ? \"pl-1\" : \"ml-auto pl-1\") : \"absolute right-1 top-1\")}>\n {node.mark}\n </span>\n )}\n {!compact && node.detail != null && (\n <span className=\"line-clamp-1 text-[10px] leading-tight text-muted-foreground\">{node.detail}</span>\n )}\n {!compact && node.badge != null && <span className=\"mt-0.5\">{node.badge}</span>}\n </div>\n );\n}\n\nexport function GraphDiagramNodes({\n nodes,\n positions,\n windowOf,\n place,\n nodeWidth,\n nodeHeight,\n nodeHeights,\n recordNodes,\n selectedId,\n onNodeSelect,\n onNodeExpand,\n onNodeHover,\n}: GraphDiagramNodesProps) {\n return (\n <>\n {nodes.map((node) => {\n const height = nodeHeights[node.id] ?? nodeHeight;\n const compact = node.id in nodeHeights;\n const windowBox = windowOf.get(node.id);\n return (\n <div\n key={node.id}\n data-graph-node={node.id}\n data-graph-node-size={compact ? \"compact\" : \"regular\"}\n {...(windowBox !== undefined ? { \"data-graph-window\": windowBox } : {})}\n className=\"pointer-events-auto absolute -translate-x-1/2 -translate-y-1/2\"\n style={{ ...place(requireEntry(positions, node.id, \"layout position\")), width: nodeWidth, height }}\n {...(onNodeHover ? hoverHandlers(node.id, onNodeHover) : {})}\n >\n <NodeBody\n node={node}\n oneLine={height < TWO_LINE_HEIGHT}\n compact={compact}\n row={recordNodes.has(node.id)}\n selected={selectedId != null && node.id === selectedId}\n onSelect={onNodeSelect ? () => onNodeSelect(node.id) : undefined}\n />\n {node.expandCount != null && node.expandCount > 0 && (\n <ExpandControl node={node} onExpand={onNodeExpand ? () => onNodeExpand(node.id) : undefined} />\n )}\n </div>\n );\n })}\n </>\n );\n}\n"],"names":["cn","jsx","nodeName","jsxs","TONE_NODE_CLASS","activateOnKey","Fragment","requireEntry","hoverHandlers"],"mappings":"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"}
@@ -1,28 +1,21 @@
1
1
  import { GraphLayoutPosition } from './graph-layout.js';
2
- import { GraphLayoutGroupBox } from './graph-columns-layout.js';
3
- import { GraphDiagramGroup, GraphDiagramNode, GraphPlacer } from './graph-diagram-model.js';
2
+ import { GraphDiagramNode, GraphPlacer } from './graph-diagram-model.js';
4
3
  export interface GraphDiagramNodesProps {
4
+ /** The nodes to draw: members scrolled out of their window and collapsed groups' stand-ins are left out. */
5
5
  nodes: GraphDiagramNode[];
6
6
  positions: Record<string, GraphLayoutPosition>;
7
+ /** The windowed group box each scrolling member belongs to, by node id: a wheel over the member scrolls it. */
8
+ windowOf: ReadonlyMap<string, string>;
7
9
  place: GraphPlacer;
8
10
  nodeWidth: number;
9
11
  nodeHeight: number;
10
12
  /** Heights of the nodes not drawn at `nodeHeight`, by id: the compact ones. */
11
13
  nodeHeights: Readonly<Record<string, number>>;
14
+ recordNodes: ReadonlySet<string>;
12
15
  selectedId: string | undefined;
13
16
  onNodeSelect: ((id: string) => void) | undefined;
14
17
  onNodeExpand: ((id: string) => void) | undefined;
15
18
  onNodeHover: ((id: string | undefined) => void) | undefined;
16
19
  }
17
- export declare function GraphDiagramNodes({ nodes, positions, place, nodeWidth, nodeHeight, nodeHeights, selectedId, onNodeSelect, onNodeExpand, onNodeHover, }: GraphDiagramNodesProps): import("react").JSX.Element;
18
- export interface GraphDiagramGroupBoxesProps {
19
- boxes: GraphLayoutGroupBox[];
20
- groups: GraphDiagramGroup[] | undefined;
21
- }
22
- /**
23
- * Group rectangles, drawn behind the edges and nodes, each captioned on its top border. A box lets the
24
- * pointer through to the stage, so a click inside it never lands on the box; only its caption takes
25
- * the pointer, for its tooltip.
26
- */
27
- export declare function GraphDiagramGroupBoxes({ boxes, groups }: GraphDiagramGroupBoxesProps): import("react").JSX.Element;
20
+ export declare function GraphDiagramNodes({ nodes, positions, windowOf, place, nodeWidth, nodeHeight, nodeHeights, recordNodes, selectedId, onNodeSelect, onNodeExpand, onNodeHover, }: GraphDiagramNodesProps): import("react").JSX.Element;
28
21
  //# sourceMappingURL=GraphDiagramNodes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GraphDiagramNodes.d.ts","sourceRoot":"","sources":["../../src/data/GraphDiagramNodes.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AAClE,OAAO,EAML,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,sBAAsB;IACrC,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/C,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC7D;AA+GD,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,SAAS,EACT,KAAK,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,EAAE,sBAAsB,+BA8BxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,mBAAmB,EAAE,CAAC;IAC7B,MAAM,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;CACzC;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,2BAA2B,+BAwBpF"}
1
+ {"version":3,"file":"GraphDiagramNodes.d.ts","sourceRoot":"","sources":["../../src/data/GraphDiagramNodes.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAML,KAAK,gBAAgB,EACrB,KAAK,WAAW,EACjB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,WAAW,sBAAsB;IACrC,4GAA4G;IAC5G,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC;IAC/C,+GAA+G;IAC/G,QAAQ,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,KAAK,EAAE,WAAW,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,+EAA+E;IAC/E,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAC9C,WAAW,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjD,YAAY,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACjD,WAAW,EAAE,CAAC,CAAC,EAAE,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC7D;AAyHD,wBAAgB,iBAAiB,CAAC,EAChC,KAAK,EACL,SAAS,EACT,QAAQ,EACR,KAAK,EACL,SAAS,EACT,UAAU,EACV,WAAW,EACX,WAAW,EACX,UAAU,EACV,YAAY,EACZ,YAAY,EACZ,WAAW,GACZ,EAAE,sBAAsB,+BAiCxB"}
@@ -37,7 +37,7 @@ function NodeLabel({ node, oneLine }) {
37
37
  }
38
38
  );
39
39
  if (node.icon == null) return label;
40
- return /* @__PURE__ */ jsxs("span", { className: "flex max-w-full items-center gap-1.5", children: [
40
+ return /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 max-w-full items-center gap-1.5", children: [
41
41
  /* @__PURE__ */ jsx("span", { "data-graph-node-icon": "", className: "flex shrink-0 text-base leading-none", children: node.icon }),
42
42
  label
43
43
  ] });
@@ -46,6 +46,7 @@ function NodeBody({
46
46
  node,
47
47
  oneLine,
48
48
  compact,
49
+ row,
49
50
  selected,
50
51
  onSelect
51
52
  }) {
@@ -54,13 +55,14 @@ function NodeBody({
54
55
  "div",
55
56
  {
56
57
  className: cn(
57
- "flex h-full w-full border text-xs shadow-sm",
58
+ "flex h-full w-full text-xs",
59
+ row ? "border-t border-border/60 hover:bg-accent" : "border shadow-sm",
58
60
  compact ? "items-center px-2 text-left text-[11px]" : "flex-col items-center justify-center gap-0.5 px-3 py-1.5 text-center",
59
- node.shape === "pill" ? "rounded-full" : compact ? "rounded-md" : "rounded-lg",
60
- TONE_NODE_CLASS[tone],
61
- node.muted && "border-dashed text-muted-foreground shadow-none",
62
- node.muted && tone === "neutral" && "bg-muted",
63
- selected && "ring-2 ring-primary ring-offset-2 ring-offset-background",
61
+ !row && (node.shape === "pill" ? "rounded-full" : compact ? "rounded-md" : "rounded-lg"),
62
+ row ? tone === "info" ? "bg-sky-500/10 text-foreground" : "text-foreground" : TONE_NODE_CLASS[tone],
63
+ node.muted && (row ? "text-muted-foreground" : "border-dashed text-muted-foreground shadow-none"),
64
+ !row && node.muted && tone === "neutral" && "bg-muted",
65
+ selected && (row ? "bg-primary/10 ring-2 ring-inset ring-primary" : "ring-2 ring-primary ring-offset-2 ring-offset-background"),
64
66
  onSelect && "cursor-pointer"
65
67
  ),
66
68
  ...onSelect ? {
@@ -74,6 +76,9 @@ function NodeBody({
74
76
  title: node.title,
75
77
  children: [
76
78
  /* @__PURE__ */ jsx(NodeLabel, { node, oneLine: oneLine || compact }),
79
+ row && node.aside != null && /* @__PURE__ */ jsx("span", { className: "ml-auto min-w-0 truncate pl-2 font-mono text-[10px] text-muted-foreground", children: node.aside }),
80
+ node.mark != null && // Kept out of the node's accessible name, which stays the node's own; the mark is its tooltip.
81
+ /* @__PURE__ */ jsx("span", { "data-graph-node-mark": "", "aria-hidden": true, className: cn("flex shrink-0 items-center", compact ? row && node.aside != null ? "pl-1" : "ml-auto pl-1" : "absolute right-1 top-1"), children: node.mark }),
77
82
  !compact && node.detail != null && /* @__PURE__ */ jsx("span", { className: "line-clamp-1 text-[10px] leading-tight text-muted-foreground", children: node.detail }),
78
83
  !compact && node.badge != null && /* @__PURE__ */ jsx("span", { className: "mt-0.5", children: node.badge })
79
84
  ]
@@ -83,10 +88,12 @@ function NodeBody({
83
88
  function GraphDiagramNodes({
84
89
  nodes,
85
90
  positions,
91
+ windowOf,
86
92
  place,
87
93
  nodeWidth,
88
94
  nodeHeight,
89
95
  nodeHeights,
96
+ recordNodes,
90
97
  selectedId,
91
98
  onNodeSelect,
92
99
  onNodeExpand,
@@ -95,11 +102,13 @@ function GraphDiagramNodes({
95
102
  return /* @__PURE__ */ jsx(Fragment, { children: nodes.map((node) => {
96
103
  const height = nodeHeights[node.id] ?? nodeHeight;
97
104
  const compact = node.id in nodeHeights;
105
+ const windowBox = windowOf.get(node.id);
98
106
  return /* @__PURE__ */ jsxs(
99
107
  "div",
100
108
  {
101
109
  "data-graph-node": node.id,
102
110
  "data-graph-node-size": compact ? "compact" : "regular",
111
+ ...windowBox !== void 0 ? { "data-graph-window": windowBox } : {},
103
112
  className: "pointer-events-auto absolute -translate-x-1/2 -translate-y-1/2",
104
113
  style: { ...place(requireEntry(positions, node.id, "layout position")), width: nodeWidth, height },
105
114
  ...onNodeHover ? hoverHandlers(node.id, onNodeHover) : {},
@@ -110,6 +119,7 @@ function GraphDiagramNodes({
110
119
  node,
111
120
  oneLine: height < TWO_LINE_HEIGHT,
112
121
  compact,
122
+ row: recordNodes.has(node.id),
113
123
  selected: selectedId != null && node.id === selectedId,
114
124
  onSelect: onNodeSelect ? () => onNodeSelect(node.id) : void 0
115
125
  }
@@ -121,31 +131,7 @@ function GraphDiagramNodes({
121
131
  );
122
132
  }) });
123
133
  }
124
- function GraphDiagramGroupBoxes({ boxes, groups }) {
125
- const captions = new Map(groups == null ? void 0 : groups.map((group) => [group.id, group]));
126
- return /* @__PURE__ */ jsx(Fragment, { children: boxes.map((box) => {
127
- const caption = captions.get(box.group);
128
- return /* @__PURE__ */ jsx(
129
- "div",
130
- {
131
- "data-graph-group": box.id,
132
- className: "pointer-events-none absolute rounded-xl border border-dashed border-border bg-muted/30",
133
- style: { left: box.x, top: box.y, width: box.width, height: box.height },
134
- children: /* @__PURE__ */ jsx(
135
- "span",
136
- {
137
- title: caption == null ? void 0 : caption.title,
138
- className: "pointer-events-auto absolute left-2 top-0 max-w-[calc(100%-1rem)] -translate-y-1/2 truncate rounded border border-border bg-background px-1.5 text-[10px] font-medium leading-4 text-muted-foreground",
139
- children: caption ? caption.label : box.group
140
- }
141
- )
142
- },
143
- box.id
144
- );
145
- }) });
146
- }
147
134
  export {
148
- GraphDiagramGroupBoxes,
149
135
  GraphDiagramNodes
150
136
  };
151
137
  //# sourceMappingURL=GraphDiagramNodes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GraphDiagramNodes.js","sources":["../../src/data/GraphDiagramNodes.tsx"],"sourcesContent":["import type { KeyboardEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { GraphLayoutPosition } from \"./graph-layout\";\nimport type { GraphLayoutGroupBox } from \"./graph-columns-layout\";\nimport {\n activateOnKey,\n hoverHandlers,\n nodeName,\n requireEntry,\n TONE_NODE_CLASS,\n type GraphDiagramGroup,\n type GraphDiagramNode,\n type GraphPlacer,\n} from \"./graph-diagram-model\";\n\nexport interface GraphDiagramNodesProps {\n nodes: GraphDiagramNode[];\n positions: Record<string, GraphLayoutPosition>;\n place: GraphPlacer;\n nodeWidth: number;\n nodeHeight: number;\n /** Heights of the nodes not drawn at `nodeHeight`, by id: the compact ones. */\n nodeHeights: Readonly<Record<string, number>>;\n selectedId: string | undefined;\n onNodeSelect: ((id: string) => void) | undefined;\n onNodeExpand: ((id: string) => void) | undefined;\n onNodeHover: ((id: string | undefined) => void) | undefined;\n}\n\nconst EXPAND_CLASS =\n \"absolute bottom-0 translate-y-1/2 rounded-full border border-border bg-background px-1.5 text-[10px] font-semibold leading-4 text-muted-foreground shadow-sm\";\n\n/**\n * The `+N` control. It hangs off the node's bottom edge at its outer end —\n * the left for a node left of level 0, the right otherwise — which keeps it\n * clear of the side middles where edges attach. It is a sibling of the node,\n * not a child, so activating it never also selects the node.\n */\nfunction ExpandControl({ node, onExpand }: { node: GraphDiagramNode; onExpand: (() => void) | undefined }) {\n const side = (node.level ?? 0) < 0 ? \"left-2\" : \"right-2\";\n const text = `+${node.expandCount}`;\n if (!onExpand) {\n return <span className={cn(EXPAND_CLASS, side)}>{text}</span>;\n }\n return (\n <button\n type=\"button\"\n aria-label={`Expand ${node.expandCount} more from ${nodeName(node)}`}\n className={cn(\n EXPAND_CLASS,\n side,\n \"cursor-pointer hover:border-primary hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n onClick={onExpand}\n >\n {text}\n </button>\n );\n}\n\n// Two 15px label lines, the body's vertical padding and its border.\nconst TWO_LINE_HEIGHT = 44;\n\n/** The label, behind the node's icon when it has one. `oneLine` cuts it with an ellipsis instead of wrapping. */\nfunction NodeLabel({ node, oneLine }: { node: GraphDiagramNode; oneLine: boolean }) {\n const label = (\n <span\n className={cn(\n oneLine ? \"max-w-full truncate\" : \"line-clamp-2\",\n \"font-medium leading-tight\",\n node.icon != null && \"min-w-0\",\n )}\n >\n {node.label}\n </span>\n );\n if (node.icon == null) return label;\n return (\n <span className=\"flex max-w-full items-center gap-1.5\">\n <span data-graph-node-icon=\"\" className=\"flex shrink-0 text-base leading-none\">\n {node.icon}\n </span>\n {label}\n </span>\n );\n}\n\nfunction NodeBody({\n node,\n oneLine,\n compact,\n selected,\n onSelect,\n}: {\n node: GraphDiagramNode;\n /** The node is too short for two label lines. */\n oneLine: boolean;\n /** Its icon and label on one short line, left-aligned, without its detail or badge. */\n compact: boolean;\n selected: boolean;\n onSelect: (() => void) | undefined;\n}) {\n const tone = node.tone ?? \"neutral\";\n return (\n <div\n className={cn(\n \"flex h-full w-full border text-xs shadow-sm\",\n compact\n ? \"items-center px-2 text-left text-[11px]\"\n : \"flex-col items-center justify-center gap-0.5 px-3 py-1.5 text-center\",\n node.shape === \"pill\" ? \"rounded-full\" : compact ? \"rounded-md\" : \"rounded-lg\",\n TONE_NODE_CLASS[tone],\n node.muted && \"border-dashed text-muted-foreground shadow-none\",\n node.muted && tone === \"neutral\" && \"bg-muted\",\n selected && \"ring-2 ring-primary ring-offset-2 ring-offset-background\",\n onSelect && \"cursor-pointer\",\n )}\n {...(onSelect\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n \"aria-pressed\": selected,\n onClick: onSelect,\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => activateOnKey(event, onSelect),\n }\n : {})}\n aria-label={node.ariaLabel}\n title={node.title}\n >\n <NodeLabel node={node} oneLine={oneLine || compact} />\n {!compact && node.detail != null && (\n <span className=\"line-clamp-1 text-[10px] leading-tight text-muted-foreground\">{node.detail}</span>\n )}\n {!compact && node.badge != null && <span className=\"mt-0.5\">{node.badge}</span>}\n </div>\n );\n}\n\nexport function GraphDiagramNodes({\n nodes,\n positions,\n place,\n nodeWidth,\n nodeHeight,\n nodeHeights,\n selectedId,\n onNodeSelect,\n onNodeExpand,\n onNodeHover,\n}: GraphDiagramNodesProps) {\n return (\n <>\n {nodes.map((node) => {\n const height = nodeHeights[node.id] ?? nodeHeight;\n const compact = node.id in nodeHeights;\n return (\n <div\n key={node.id}\n data-graph-node={node.id}\n data-graph-node-size={compact ? \"compact\" : \"regular\"}\n className=\"pointer-events-auto absolute -translate-x-1/2 -translate-y-1/2\"\n style={{ ...place(requireEntry(positions, node.id, \"layout position\")), width: nodeWidth, height }}\n {...(onNodeHover ? hoverHandlers(node.id, onNodeHover) : {})}\n >\n <NodeBody\n node={node}\n oneLine={height < TWO_LINE_HEIGHT}\n compact={compact}\n selected={selectedId != null && node.id === selectedId}\n onSelect={onNodeSelect ? () => onNodeSelect(node.id) : undefined}\n />\n {node.expandCount != null && node.expandCount > 0 && (\n <ExpandControl node={node} onExpand={onNodeExpand ? () => onNodeExpand(node.id) : undefined} />\n )}\n </div>\n );\n })}\n </>\n );\n}\n\nexport interface GraphDiagramGroupBoxesProps {\n boxes: GraphLayoutGroupBox[];\n groups: GraphDiagramGroup[] | undefined;\n}\n\n/**\n * Group rectangles, drawn behind the edges and nodes, each captioned on its top border. A box lets the\n * pointer through to the stage, so a click inside it never lands on the box; only its caption takes\n * the pointer, for its tooltip.\n */\nexport function GraphDiagramGroupBoxes({ boxes, groups }: GraphDiagramGroupBoxesProps) {\n const captions = new Map(groups?.map((group) => [group.id, group]));\n return (\n <>\n {boxes.map((box) => {\n const caption = captions.get(box.group);\n return (\n <div\n key={box.id}\n data-graph-group={box.id}\n className=\"pointer-events-none absolute rounded-xl border border-dashed border-border bg-muted/30\"\n style={{ left: box.x, top: box.y, width: box.width, height: box.height }}\n >\n <span\n title={caption?.title}\n className=\"pointer-events-auto absolute left-2 top-0 max-w-[calc(100%-1rem)] -translate-y-1/2 truncate rounded border border-border bg-background px-1.5 text-[10px] font-medium leading-4 text-muted-foreground\"\n >\n {caption ? caption.label : box.group}\n </span>\n </div>\n );\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GraphDiagramNodes.js","sources":["../../src/data/GraphDiagramNodes.tsx"],"sourcesContent":["import type { KeyboardEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport type { GraphLayoutPosition } from \"./graph-layout\";\nimport {\n activateOnKey,\n hoverHandlers,\n nodeName,\n requireEntry,\n TONE_NODE_CLASS,\n type GraphDiagramNode,\n type GraphPlacer,\n} from \"./graph-diagram-model\";\n\nexport interface GraphDiagramNodesProps {\n /** The nodes to draw: members scrolled out of their window and collapsed groups' stand-ins are left out. */\n nodes: GraphDiagramNode[];\n positions: Record<string, GraphLayoutPosition>;\n /** The windowed group box each scrolling member belongs to, by node id: a wheel over the member scrolls it. */\n windowOf: ReadonlyMap<string, string>;\n place: GraphPlacer;\n nodeWidth: number;\n nodeHeight: number;\n /** Heights of the nodes not drawn at `nodeHeight`, by id: the compact ones. */\n nodeHeights: Readonly<Record<string, number>>;\n recordNodes: ReadonlySet<string>;\n selectedId: string | undefined;\n onNodeSelect: ((id: string) => void) | undefined;\n onNodeExpand: ((id: string) => void) | undefined;\n onNodeHover: ((id: string | undefined) => void) | undefined;\n}\n\nconst EXPAND_CLASS =\n \"absolute bottom-0 translate-y-1/2 rounded-full border border-border bg-background px-1.5 text-[10px] font-semibold leading-4 text-muted-foreground shadow-sm\";\n\n/**\n * The `+N` control. It hangs off the node's bottom edge at its outer end —\n * the left for a node left of level 0, the right otherwise — which keeps it\n * clear of the side middles where edges attach. It is a sibling of the node,\n * not a child, so activating it never also selects the node.\n */\nfunction ExpandControl({ node, onExpand }: { node: GraphDiagramNode; onExpand: (() => void) | undefined }) {\n const side = (node.level ?? 0) < 0 ? \"left-2\" : \"right-2\";\n const text = `+${node.expandCount}`;\n if (!onExpand) {\n return <span className={cn(EXPAND_CLASS, side)}>{text}</span>;\n }\n return (\n <button\n type=\"button\"\n aria-label={`Expand ${node.expandCount} more from ${nodeName(node)}`}\n className={cn(\n EXPAND_CLASS,\n side,\n \"cursor-pointer hover:border-primary hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n )}\n onClick={onExpand}\n >\n {text}\n </button>\n );\n}\n\n// Two 15px label lines, the body's vertical padding and its border.\nconst TWO_LINE_HEIGHT = 44;\n\n/** The label, behind the node's icon when it has one. `oneLine` cuts it with an ellipsis instead of wrapping. */\nfunction NodeLabel({ node, oneLine }: { node: GraphDiagramNode; oneLine: boolean }) {\n const label = (\n <span\n className={cn(\n oneLine ? \"max-w-full truncate\" : \"line-clamp-2\",\n \"font-medium leading-tight\",\n node.icon != null && \"min-w-0\",\n )}\n >\n {node.label}\n </span>\n );\n if (node.icon == null) return label;\n return (\n <span className=\"flex min-w-0 max-w-full items-center gap-1.5\">\n <span data-graph-node-icon=\"\" className=\"flex shrink-0 text-base leading-none\">\n {node.icon}\n </span>\n {label}\n </span>\n );\n}\n\nfunction NodeBody({\n node,\n oneLine,\n compact,\n row,\n selected,\n onSelect,\n}: {\n node: GraphDiagramNode;\n /** The node is too short for two label lines. */\n oneLine: boolean;\n /** Its icon and label on one short line, left-aligned, without its detail or badge. */\n compact: boolean;\n row: boolean;\n selected: boolean;\n onSelect: (() => void) | undefined;\n}) {\n const tone = node.tone ?? \"neutral\";\n return (\n <div\n className={cn(\n \"flex h-full w-full text-xs\",\n row ? \"border-t border-border/60 hover:bg-accent\" : \"border shadow-sm\",\n compact\n ? \"items-center px-2 text-left text-[11px]\"\n : \"flex-col items-center justify-center gap-0.5 px-3 py-1.5 text-center\",\n !row && (node.shape === \"pill\" ? \"rounded-full\" : compact ? \"rounded-md\" : \"rounded-lg\"),\n row ? (tone === \"info\" ? \"bg-sky-500/10 text-foreground\" : \"text-foreground\") : TONE_NODE_CLASS[tone],\n node.muted && (row ? \"text-muted-foreground\" : \"border-dashed text-muted-foreground shadow-none\"),\n !row && node.muted && tone === \"neutral\" && \"bg-muted\",\n selected && (row ? \"bg-primary/10 ring-2 ring-inset ring-primary\" : \"ring-2 ring-primary ring-offset-2 ring-offset-background\"),\n onSelect && \"cursor-pointer\",\n )}\n {...(onSelect\n ? {\n role: \"button\" as const,\n tabIndex: 0,\n \"aria-pressed\": selected,\n onClick: onSelect,\n onKeyDown: (event: KeyboardEvent<HTMLDivElement>) => activateOnKey(event, onSelect),\n }\n : {})}\n aria-label={node.ariaLabel}\n title={node.title}\n >\n <NodeLabel node={node} oneLine={oneLine || compact} />\n {row && node.aside != null && <span className=\"ml-auto min-w-0 truncate pl-2 font-mono text-[10px] text-muted-foreground\">{node.aside}</span>}\n {node.mark != null && (\n // Kept out of the node's accessible name, which stays the node's own; the mark is its tooltip.\n <span data-graph-node-mark=\"\" aria-hidden className={cn(\"flex shrink-0 items-center\", compact ? (row && node.aside != null ? \"pl-1\" : \"ml-auto pl-1\") : \"absolute right-1 top-1\")}>\n {node.mark}\n </span>\n )}\n {!compact && node.detail != null && (\n <span className=\"line-clamp-1 text-[10px] leading-tight text-muted-foreground\">{node.detail}</span>\n )}\n {!compact && node.badge != null && <span className=\"mt-0.5\">{node.badge}</span>}\n </div>\n );\n}\n\nexport function GraphDiagramNodes({\n nodes,\n positions,\n windowOf,\n place,\n nodeWidth,\n nodeHeight,\n nodeHeights,\n recordNodes,\n selectedId,\n onNodeSelect,\n onNodeExpand,\n onNodeHover,\n}: GraphDiagramNodesProps) {\n return (\n <>\n {nodes.map((node) => {\n const height = nodeHeights[node.id] ?? nodeHeight;\n const compact = node.id in nodeHeights;\n const windowBox = windowOf.get(node.id);\n return (\n <div\n key={node.id}\n data-graph-node={node.id}\n data-graph-node-size={compact ? \"compact\" : \"regular\"}\n {...(windowBox !== undefined ? { \"data-graph-window\": windowBox } : {})}\n className=\"pointer-events-auto absolute -translate-x-1/2 -translate-y-1/2\"\n style={{ ...place(requireEntry(positions, node.id, \"layout position\")), width: nodeWidth, height }}\n {...(onNodeHover ? hoverHandlers(node.id, onNodeHover) : {})}\n >\n <NodeBody\n node={node}\n oneLine={height < TWO_LINE_HEIGHT}\n compact={compact}\n row={recordNodes.has(node.id)}\n selected={selectedId != null && node.id === selectedId}\n onSelect={onNodeSelect ? () => onNodeSelect(node.id) : undefined}\n />\n {node.expandCount != null && node.expandCount > 0 && (\n <ExpandControl node={node} onExpand={onNodeExpand ? () => onNodeExpand(node.id) : undefined} />\n )}\n </div>\n );\n })}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -3,29 +3,48 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const utils = require("../lib/utils.cjs");
6
+ const AnsiHtml = require("./AnsiHtml.cjs");
7
+ const VARIANTS = {
8
+ muted: {
9
+ bg: "bg-muted",
10
+ border: "border-border",
11
+ text: "text-muted-foreground"
12
+ },
13
+ terminal: {
14
+ bg: "bg-zinc-950",
15
+ border: "border-zinc-800",
16
+ text: "text-zinc-100"
17
+ }
18
+ };
6
19
  function LogViewer({
7
20
  logs,
8
21
  collapsedLines = 5,
22
+ maxHeight,
9
23
  maxExpandedVh = 70,
10
- bgClass = "bg-muted",
11
- borderClass = "border-border",
24
+ variant = "muted",
25
+ bgClass,
26
+ borderClass,
12
27
  className
13
28
  }) {
14
29
  const [expanded, setExpanded] = react.useState(false);
15
30
  const lines = react.useMemo(() => logs.split("\n"), [logs]);
16
31
  const hasMore = lines.length > collapsedLines;
17
- const maxHeight = expanded ? `${maxExpandedVh}vh` : `${collapsedLines * 1.4}em`;
32
+ const tone = VARIANTS[variant];
33
+ const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;
34
+ const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join("\n");
18
35
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("relative", className), children: [
19
36
  /* @__PURE__ */ jsxRuntime.jsx(
20
37
  "pre",
21
38
  {
22
39
  className: utils.cn(
23
- "mt-0.5 text-[11px] text-muted-foreground rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200",
24
- bgClass,
25
- borderClass
40
+ "mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200",
41
+ tone.text,
42
+ bgClass ?? tone.bg,
43
+ borderClass ?? tone.border
26
44
  ),
27
- style: { maxHeight },
28
- children: expanded ? logs : lines.slice(0, collapsedLines).join("\n")
45
+ style: { maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight },
46
+ "data-log-variant": variant,
47
+ children: /* @__PURE__ */ jsxRuntime.jsx(AnsiHtml.AnsiHtml, { as: "span", text: shown })
29
48
  }
30
49
  ),
31
50
  hasMore && /* @__PURE__ */ jsxRuntime.jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.cjs","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. */\n collapsedLines?: number;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxExpandedVh = 70,\n bgClass = \"bg-muted\",\n borderClass = \"border-border\",\n className,\n}: LogViewerProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = useMemo(() => logs.split(\"\\n\"), [logs]);\n const hasMore = lines.length > collapsedLines;\n\n const maxHeight = expanded ? `${maxExpandedVh}vh` : `${collapsedLines * 1.4}em`;\n\n return (\n <div className={cn(\"relative\", className)}>\n <pre\n className={cn(\n \"mt-0.5 text-[11px] text-muted-foreground rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200\",\n bgClass,\n borderClass,\n )}\n style={{ maxHeight }}\n >\n {expanded ? logs : lines.slice(0, collapsedLines).join(\"\\n\")}\n </pre>\n {hasMore && (\n <button\n type=\"button\"\n className={cn(\n \"text-[10px] mt-0.5\",\n expanded ? \"text-muted-foreground\" : \"text-primary hover:opacity-80\",\n )}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? `▲ Collapse (${lines.length} lines)` : `▼ Show more (${lines.length} lines)`}\n </button>\n )}\n </div>\n );\n}\n"],"names":["useState","useMemo","cn","jsx"],"mappings":";;;;;AAkBO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,cAAc;AAAA,EACd;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,KAAK;AAC9C,QAAM,QAAQC,MAAAA,QAAQ,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;AACpD,QAAM,UAAU,MAAM,SAAS;AAE/B,QAAM,YAAY,WAAW,GAAG,aAAa,OAAO,GAAG,iBAAiB,GAAG;AAE3E,yCACG,OAAA,EAAI,WAAWC,MAAAA,GAAG,YAAY,SAAS,GACtC,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,MAAAA;AAAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,OAAO,EAAE,UAAA;AAAA,QAER,UAAA,WAAW,OAAO,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5D,WACCC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,MAAAA;AAAAA,UACT;AAAA,UACA,WAAW,0BAA0B;AAAA,QAAA;AAAA,QAEvC,SAAS,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,QAEnC,qBAAW,eAAe,MAAM,MAAM,YAAY,gBAAgB,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EACjF,GAEJ;AAEJ;;"}
1
+ {"version":3,"file":"LogViewer.cjs","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines; ANSI SGR escapes are styled. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. Ignored when `maxHeight` is set. */\n collapsedLines?: number;\n /**\n * Collapsed height as a CSS length (e.g. `25cqh` for a quarter of the\n * enclosing size container). Every line is rendered and the block scrolls,\n * instead of cutting the text at `collapsedLines`.\n */\n maxHeight?: string;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** `terminal` renders light text on black, like the console it came from. */\n variant?: \"muted\" | \"terminal\";\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nconst VARIANTS = {\n muted: {\n bg: \"bg-muted\",\n border: \"border-border\",\n text: \"text-muted-foreground\",\n },\n terminal: {\n bg: \"bg-zinc-950\",\n border: \"border-zinc-800\",\n text: \"text-zinc-100\",\n },\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxHeight,\n maxExpandedVh = 70,\n variant = \"muted\",\n bgClass,\n borderClass,\n className,\n}: LogViewerProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = useMemo(() => logs.split(\"\\n\"), [logs]);\n const hasMore = lines.length > collapsedLines;\n const tone = VARIANTS[variant];\n\n const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;\n const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join(\"\\n\");\n\n return (\n <div className={cn(\"relative\", className)}>\n <pre\n className={cn(\n \"mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200\",\n tone.text,\n bgClass ?? tone.bg,\n borderClass ?? tone.border,\n )}\n style={{ maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight }}\n data-log-variant={variant}\n >\n <AnsiHtml as=\"span\" text={shown} />\n </pre>\n {hasMore && (\n <button\n type=\"button\"\n className={cn(\n \"text-[10px] mt-0.5\",\n expanded ? \"text-muted-foreground\" : \"text-primary hover:opacity-80\",\n )}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? `▲ Collapse (${lines.length} lines)` : `▼ Show more (${lines.length} lines)`}\n </button>\n )}\n </div>\n );\n}\n"],"names":["useState","useMemo","cn","jsx","AnsiHtml"],"mappings":";;;;;;AA2BA,MAAM,WAAW;AAAA,EACf,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,IAAIA,MAAAA,SAAS,KAAK;AAC9C,QAAM,QAAQC,MAAAA,QAAQ,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;AACpD,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,OAAO,SAAS,OAAO;AAE7B,QAAM,kBAAkB,aAAa,GAAG,iBAAiB,GAAG;AAC5D,QAAM,QAAQ,YAAY,YAAY,OAAO,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI;AAErF,yCACG,OAAA,EAAI,WAAWC,MAAAA,GAAG,YAAY,SAAS,GACtC,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWD,MAAAA;AAAAA,UACT;AAAA,UACA,KAAK;AAAA,UACL,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,QAAA;AAAA,QAEtB,OAAO,EAAE,WAAW,WAAW,GAAG,aAAa,OAAO,gBAAA;AAAA,QACtD,oBAAkB;AAAA,QAElB,UAAAC,2BAAAA,IAACC,mBAAA,EAAS,IAAG,QAAO,MAAM,MAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,WACCD,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAWD,MAAAA;AAAAA,UACT;AAAA,UACA,WAAW,0BAA0B;AAAA,QAAA;AAAA,QAEvC,SAAS,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,QAEnC,qBAAW,eAAe,MAAM,MAAM,YAAY,gBAAgB,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EACjF,GAEJ;AAEJ;;"}
@@ -1,10 +1,18 @@
1
1
  export type LogViewerProps = {
2
- /** Raw log text separated by newlines. */
2
+ /** Raw log text separated by newlines; ANSI SGR escapes are styled. */
3
3
  logs: string;
4
- /** Number of lines shown before the viewer is expanded. */
4
+ /** Number of lines shown before the viewer is expanded. Ignored when `maxHeight` is set. */
5
5
  collapsedLines?: number;
6
+ /**
7
+ * Collapsed height as a CSS length (e.g. `25cqh` for a quarter of the
8
+ * enclosing size container). Every line is rendered and the block scrolls,
9
+ * instead of cutting the text at `collapsedLines`.
10
+ */
11
+ maxHeight?: string;
6
12
  /** Maximum expanded height in viewport-height units. */
7
13
  maxExpandedVh?: number;
14
+ /** `terminal` renders light text on black, like the console it came from. */
15
+ variant?: "muted" | "terminal";
8
16
  /** Background utility class for the log container. */
9
17
  bgClass?: string;
10
18
  /** Border utility class for the log container. */
@@ -12,5 +20,5 @@ export type LogViewerProps = {
12
20
  /** Classes applied to the root wrapper. */
13
21
  className?: string;
14
22
  };
15
- export declare function LogViewer({ logs, collapsedLines, maxExpandedVh, bgClass, borderClass, className, }: LogViewerProps): import("react").JSX.Element;
23
+ export declare function LogViewer({ logs, collapsedLines, maxHeight, maxExpandedVh, variant, bgClass, borderClass, className, }: LogViewerProps): import("react").JSX.Element;
16
24
  //# sourceMappingURL=LogViewer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../../src/data/LogViewer.tsx"],"names":[],"mappings":"AAGA,MAAM,MAAM,cAAc,GAAG;IAC3B,0CAA0C;IAC1C,IAAI,EAAE,MAAM,CAAC;IACb,2DAA2D;IAC3D,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,cAAkB,EAClB,aAAkB,EAClB,OAAoB,EACpB,WAA6B,EAC7B,SAAS,GACV,EAAE,cAAc,+BAiChB"}
1
+ {"version":3,"file":"LogViewer.d.ts","sourceRoot":"","sources":["../../src/data/LogViewer.tsx"],"names":[],"mappings":"AAIA,MAAM,MAAM,cAAc,GAAG;IAC3B,uEAAuE;IACvE,IAAI,EAAE,MAAM,CAAC;IACb,4FAA4F;IAC5F,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,wDAAwD;IACxD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,6EAA6E;IAC7E,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAAC;IAC/B,sDAAsD;IACtD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,kDAAkD;IAClD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAeF,wBAAgB,SAAS,CAAC,EACxB,IAAI,EACJ,cAAkB,EAClB,SAAS,EACT,aAAkB,EAClB,OAAiB,EACjB,OAAO,EACP,WAAW,EACX,SAAS,GACV,EAAE,cAAc,+BAqChB"}
@@ -1,29 +1,48 @@
1
1
  import { jsxs, jsx } from "react/jsx-runtime";
2
2
  import { useState, useMemo } from "react";
3
3
  import { cn } from "../lib/utils.js";
4
+ import { AnsiHtml } from "./AnsiHtml.js";
5
+ const VARIANTS = {
6
+ muted: {
7
+ bg: "bg-muted",
8
+ border: "border-border",
9
+ text: "text-muted-foreground"
10
+ },
11
+ terminal: {
12
+ bg: "bg-zinc-950",
13
+ border: "border-zinc-800",
14
+ text: "text-zinc-100"
15
+ }
16
+ };
4
17
  function LogViewer({
5
18
  logs,
6
19
  collapsedLines = 5,
20
+ maxHeight,
7
21
  maxExpandedVh = 70,
8
- bgClass = "bg-muted",
9
- borderClass = "border-border",
22
+ variant = "muted",
23
+ bgClass,
24
+ borderClass,
10
25
  className
11
26
  }) {
12
27
  const [expanded, setExpanded] = useState(false);
13
28
  const lines = useMemo(() => logs.split("\n"), [logs]);
14
29
  const hasMore = lines.length > collapsedLines;
15
- const maxHeight = expanded ? `${maxExpandedVh}vh` : `${collapsedLines * 1.4}em`;
30
+ const tone = VARIANTS[variant];
31
+ const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;
32
+ const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join("\n");
16
33
  return /* @__PURE__ */ jsxs("div", { className: cn("relative", className), children: [
17
34
  /* @__PURE__ */ jsx(
18
35
  "pre",
19
36
  {
20
37
  className: cn(
21
- "mt-0.5 text-[11px] text-muted-foreground rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200",
22
- bgClass,
23
- borderClass
38
+ "mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200",
39
+ tone.text,
40
+ bgClass ?? tone.bg,
41
+ borderClass ?? tone.border
24
42
  ),
25
- style: { maxHeight },
26
- children: expanded ? logs : lines.slice(0, collapsedLines).join("\n")
43
+ style: { maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight },
44
+ "data-log-variant": variant,
45
+ children: /* @__PURE__ */ jsx(AnsiHtml, { as: "span", text: shown })
27
46
  }
28
47
  ),
29
48
  hasMore && /* @__PURE__ */ jsx(
@@ -1 +1 @@
1
- {"version":3,"file":"LogViewer.js","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. */\n collapsedLines?: number;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxExpandedVh = 70,\n bgClass = \"bg-muted\",\n borderClass = \"border-border\",\n className,\n}: LogViewerProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = useMemo(() => logs.split(\"\\n\"), [logs]);\n const hasMore = lines.length > collapsedLines;\n\n const maxHeight = expanded ? `${maxExpandedVh}vh` : `${collapsedLines * 1.4}em`;\n\n return (\n <div className={cn(\"relative\", className)}>\n <pre\n className={cn(\n \"mt-0.5 text-[11px] text-muted-foreground rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200\",\n bgClass,\n borderClass,\n )}\n style={{ maxHeight }}\n >\n {expanded ? logs : lines.slice(0, collapsedLines).join(\"\\n\")}\n </pre>\n {hasMore && (\n <button\n type=\"button\"\n className={cn(\n \"text-[10px] mt-0.5\",\n expanded ? \"text-muted-foreground\" : \"text-primary hover:opacity-80\",\n )}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? `▲ Collapse (${lines.length} lines)` : `▼ Show more (${lines.length} lines)`}\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAkBO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,iBAAiB;AAAA,EACjB,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV,cAAc;AAAA,EACd;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,QAAQ,QAAQ,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;AACpD,QAAM,UAAU,MAAM,SAAS;AAE/B,QAAM,YAAY,WAAW,GAAG,aAAa,OAAO,GAAG,iBAAiB,GAAG;AAE3E,8BACG,OAAA,EAAI,WAAW,GAAG,YAAY,SAAS,GACtC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,OAAO,EAAE,UAAA;AAAA,QAER,UAAA,WAAW,OAAO,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,IAE5D,WACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,WAAW,0BAA0B;AAAA,QAAA;AAAA,QAEvC,SAAS,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,QAEnC,qBAAW,eAAe,MAAM,MAAM,YAAY,gBAAgB,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EACjF,GAEJ;AAEJ;"}
1
+ {"version":3,"file":"LogViewer.js","sources":["../../src/data/LogViewer.tsx"],"sourcesContent":["import { useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { AnsiHtml } from \"./AnsiHtml\";\n\nexport type LogViewerProps = {\n /** Raw log text separated by newlines; ANSI SGR escapes are styled. */\n logs: string;\n /** Number of lines shown before the viewer is expanded. Ignored when `maxHeight` is set. */\n collapsedLines?: number;\n /**\n * Collapsed height as a CSS length (e.g. `25cqh` for a quarter of the\n * enclosing size container). Every line is rendered and the block scrolls,\n * instead of cutting the text at `collapsedLines`.\n */\n maxHeight?: string;\n /** Maximum expanded height in viewport-height units. */\n maxExpandedVh?: number;\n /** `terminal` renders light text on black, like the console it came from. */\n variant?: \"muted\" | \"terminal\";\n /** Background utility class for the log container. */\n bgClass?: string;\n /** Border utility class for the log container. */\n borderClass?: string;\n /** Classes applied to the root wrapper. */\n className?: string;\n};\n\nconst VARIANTS = {\n muted: {\n bg: \"bg-muted\",\n border: \"border-border\",\n text: \"text-muted-foreground\",\n },\n terminal: {\n bg: \"bg-zinc-950\",\n border: \"border-zinc-800\",\n text: \"text-zinc-100\",\n },\n};\n\nexport function LogViewer({\n logs,\n collapsedLines = 5,\n maxHeight,\n maxExpandedVh = 70,\n variant = \"muted\",\n bgClass,\n borderClass,\n className,\n}: LogViewerProps) {\n const [expanded, setExpanded] = useState(false);\n const lines = useMemo(() => logs.split(\"\\n\"), [logs]);\n const hasMore = lines.length > collapsedLines;\n const tone = VARIANTS[variant];\n\n const collapsedHeight = maxHeight ?? `${collapsedLines * 1.4}em`;\n const shown = expanded || maxHeight ? logs : lines.slice(0, collapsedLines).join(\"\\n\");\n\n return (\n <div className={cn(\"relative\", className)}>\n <pre\n className={cn(\n \"mt-0.5 text-[11px] rounded p-1.5 whitespace-pre-wrap overflow-y-auto border transition-all duration-200\",\n tone.text,\n bgClass ?? tone.bg,\n borderClass ?? tone.border,\n )}\n style={{ maxHeight: expanded ? `${maxExpandedVh}vh` : collapsedHeight }}\n data-log-variant={variant}\n >\n <AnsiHtml as=\"span\" text={shown} />\n </pre>\n {hasMore && (\n <button\n type=\"button\"\n className={cn(\n \"text-[10px] mt-0.5\",\n expanded ? \"text-muted-foreground\" : \"text-primary hover:opacity-80\",\n )}\n onClick={() => setExpanded((e) => !e)}\n >\n {expanded ? `▲ Collapse (${lines.length} lines)` : `▼ Show more (${lines.length} lines)`}\n </button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AA2BA,MAAM,WAAW;AAAA,EACf,OAAO;AAAA,IACL,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAAA,EAER,UAAU;AAAA,IACR,IAAI;AAAA,IACJ,QAAQ;AAAA,IACR,MAAM;AAAA,EAAA;AAEV;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA,gBAAgB;AAAA,EAChB,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AACF,GAAmB;AACjB,QAAM,CAAC,UAAU,WAAW,IAAI,SAAS,KAAK;AAC9C,QAAM,QAAQ,QAAQ,MAAM,KAAK,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;AACpD,QAAM,UAAU,MAAM,SAAS;AAC/B,QAAM,OAAO,SAAS,OAAO;AAE7B,QAAM,kBAAkB,aAAa,GAAG,iBAAiB,GAAG;AAC5D,QAAM,QAAQ,YAAY,YAAY,OAAO,MAAM,MAAM,GAAG,cAAc,EAAE,KAAK,IAAI;AAErF,8BACG,OAAA,EAAI,WAAW,GAAG,YAAY,SAAS,GACtC,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,UACA,KAAK;AAAA,UACL,WAAW,KAAK;AAAA,UAChB,eAAe,KAAK;AAAA,QAAA;AAAA,QAEtB,OAAO,EAAE,WAAW,WAAW,GAAG,aAAa,OAAO,gBAAA;AAAA,QACtD,oBAAkB;AAAA,QAElB,UAAA,oBAAC,UAAA,EAAS,IAAG,QAAO,MAAM,MAAA,CAAO;AAAA,MAAA;AAAA,IAAA;AAAA,IAElC,WACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,WAAW;AAAA,UACT;AAAA,UACA,WAAW,0BAA0B;AAAA,QAAA;AAAA,QAEvC,SAAS,MAAM,YAAY,CAAC,MAAM,CAAC,CAAC;AAAA,QAEnC,qBAAW,eAAe,MAAM,MAAM,YAAY,gBAAgB,MAAM,MAAM;AAAA,MAAA;AAAA,IAAA;AAAA,EACjF,GAEJ;AAEJ;"}
@@ -8,6 +8,7 @@ const DropdownMenu = require("../overlay/DropdownMenu.cjs");
8
8
  const Icon = require("./Icon.cjs");
9
9
  const propertiesUtils = require("./properties-utils.cjs");
10
10
  const propertiesContext = require("./properties-context.cjs");
11
+ const PropertyValue = require("./PropertyValue.cjs");
11
12
  const UiRows = require("../icons/components/UiRows.cjs");
12
13
  const UiListFlat = require("../icons/components/UiListFlat.cjs");
13
14
  const UiListDashes = require("../icons/components/UiListDashes.cjs");
@@ -133,7 +134,7 @@ function Properties({
133
134
  "div",
134
135
  {
135
136
  className: utils.cn("min-w-0 max-w-full flex-1", styles.value),
136
- children: renderValue ? renderValue(item.key, item.value, item) : defaultRenderValue(item.value)
137
+ children: renderValue ? renderValue(item.key, item.value, item) : /* @__PURE__ */ jsxRuntime.jsx(PropertyValue.PropertyValue, { item, density: activeDensity })
137
138
  }
138
139
  ),
139
140
  /* @__PURE__ */ jsxRuntime.jsx(
@@ -299,19 +300,5 @@ function PropertiesActionButton({
299
300
  }
300
301
  );
301
302
  }
302
- function defaultRenderValue(value) {
303
- if (value === null || value === void 0) {
304
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono italic text-muted-foreground", children: "null" });
305
- }
306
- if (typeof value === "string") return value;
307
- if (typeof value === "number" || typeof value === "boolean") {
308
- return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "font-mono", children: String(value) });
309
- }
310
- try {
311
- return /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "max-h-48 overflow-auto whitespace-pre-wrap break-words font-mono text-[11px] leading-relaxed", children: JSON.stringify(value, null, 2) });
312
- } catch {
313
- return String(value);
314
- }
315
- }
316
303
  exports.Properties = Properties;
317
304
  //# sourceMappingURL=Properties.cjs.map