@flanksource/clicky-ui 0.3.46 → 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 (379) hide show
  1. package/NOTICE.md +11 -0
  2. package/dist/ai.cjs +13 -8
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +7 -2
  5. package/dist/ai.js.map +1 -1
  6. package/dist/components/ErrorWrapper.cjs +2 -3
  7. package/dist/components/ErrorWrapper.cjs.map +1 -1
  8. package/dist/components/ErrorWrapper.d.ts.map +1 -1
  9. package/dist/components/ErrorWrapper.js +3 -4
  10. package/dist/components/ErrorWrapper.js.map +1 -1
  11. package/dist/data/Clicky.cjs +3 -0
  12. package/dist/data/Clicky.cjs.map +1 -1
  13. package/dist/data/Clicky.js +3 -0
  14. package/dist/data/Clicky.js.map +1 -1
  15. package/dist/data/FilterPill.cjs +15 -2
  16. package/dist/data/FilterPill.cjs.map +1 -1
  17. package/dist/data/FilterPill.d.ts +1 -1
  18. package/dist/data/FilterPill.d.ts.map +1 -1
  19. package/dist/data/FilterPill.js +15 -2
  20. package/dist/data/FilterPill.js.map +1 -1
  21. package/dist/data/LogViewer.cjs +27 -8
  22. package/dist/data/LogViewer.cjs.map +1 -1
  23. package/dist/data/LogViewer.d.ts +11 -3
  24. package/dist/data/LogViewer.d.ts.map +1 -1
  25. package/dist/data/LogViewer.js +27 -8
  26. package/dist/data/LogViewer.js.map +1 -1
  27. package/dist/data/Properties.cjs +2 -15
  28. package/dist/data/Properties.cjs.map +1 -1
  29. package/dist/data/Properties.d.ts +4 -0
  30. package/dist/data/Properties.d.ts.map +1 -1
  31. package/dist/data/Properties.js +2 -15
  32. package/dist/data/Properties.js.map +1 -1
  33. package/dist/data/PropertyValue.cjs +37 -0
  34. package/dist/data/PropertyValue.cjs.map +1 -0
  35. package/dist/data/PropertyValue.d.ts +6 -0
  36. package/dist/data/PropertyValue.d.ts.map +1 -0
  37. package/dist/data/PropertyValue.js +37 -0
  38. package/dist/data/PropertyValue.js.map +1 -0
  39. package/dist/data/Tree.cjs +4 -3
  40. package/dist/data/Tree.cjs.map +1 -1
  41. package/dist/data/Tree.d.ts +3 -1
  42. package/dist/data/Tree.d.ts.map +1 -1
  43. package/dist/data/Tree.js +4 -3
  44. package/dist/data/Tree.js.map +1 -1
  45. package/dist/data/ai/ChatFab.cjs +1 -1
  46. package/dist/data/ai/ChatFab.cjs.map +1 -1
  47. package/dist/data/ai/ChatFab.js +1 -1
  48. package/dist/data/ai/ChatFab.js.map +1 -1
  49. package/dist/data/ai/ChatWindow.cjs +106 -171
  50. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  51. package/dist/data/ai/ChatWindow.d.ts +6 -2
  52. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  53. package/dist/data/ai/ChatWindow.header.cjs +104 -0
  54. package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
  55. package/dist/data/ai/ChatWindow.header.d.ts +29 -0
  56. package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
  57. package/dist/data/ai/ChatWindow.header.js +104 -0
  58. package/dist/data/ai/ChatWindow.header.js.map +1 -0
  59. package/dist/data/ai/ChatWindow.js +107 -172
  60. package/dist/data/ai/ChatWindow.js.map +1 -1
  61. package/dist/data/ai/ChatWindow.placement.cjs +95 -0
  62. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
  63. package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
  64. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
  65. package/dist/data/ai/ChatWindow.placement.js +95 -0
  66. package/dist/data/ai/ChatWindow.placement.js.map +1 -0
  67. package/dist/data/ai/SessionChatComposer.cjs +3 -1
  68. package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
  69. package/dist/data/ai/SessionChatComposer.d.ts +4 -1
  70. package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
  71. package/dist/data/ai/SessionChatComposer.js +3 -1
  72. package/dist/data/ai/SessionChatComposer.js.map +1 -1
  73. package/dist/data/ai/SessionInspector.cjs +68 -72
  74. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  75. package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
  76. package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
  77. package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
  78. package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
  79. package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
  80. package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
  81. package/dist/data/ai/SessionInspector.d.ts +6 -1
  82. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  83. package/dist/data/ai/SessionInspector.js +69 -73
  84. package/dist/data/ai/SessionInspector.js.map +1 -1
  85. package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
  86. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
  87. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
  88. package/dist/data/ai/SessionInspector.legacy.js +41 -42
  89. package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
  90. package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
  91. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
  92. package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
  93. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
  94. package/dist/data/ai/SessionInspector.remote-view.js +14 -9
  95. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
  96. package/dist/data/ai/SessionInspector.remote.cjs +84 -16
  97. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
  98. package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
  99. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
  100. package/dist/data/ai/SessionInspector.remote.js +86 -18
  101. package/dist/data/ai/SessionInspector.remote.js.map +1 -1
  102. package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
  103. package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
  104. package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
  105. package/dist/data/ai/SessionInspector.transcript.js +5 -0
  106. package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
  107. package/dist/data/ai/SessionTail.cjs +63 -0
  108. package/dist/data/ai/SessionTail.cjs.map +1 -0
  109. package/dist/data/ai/SessionTail.d.ts +14 -0
  110. package/dist/data/ai/SessionTail.d.ts.map +1 -0
  111. package/dist/data/ai/SessionTail.js +63 -0
  112. package/dist/data/ai/SessionTail.js.map +1 -0
  113. package/dist/data/ai/SessionViewer.cjs +10 -3
  114. package/dist/data/ai/SessionViewer.cjs.map +1 -1
  115. package/dist/data/ai/SessionViewer.d.ts +7 -1
  116. package/dist/data/ai/SessionViewer.d.ts.map +1 -1
  117. package/dist/data/ai/SessionViewer.js +10 -3
  118. package/dist/data/ai/SessionViewer.js.map +1 -1
  119. package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
  120. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  121. package/dist/data/ai/index.d.ts +4 -3
  122. package/dist/data/ai/index.d.ts.map +1 -1
  123. package/dist/data/ai/use-session-scroll.cjs +30 -6
  124. package/dist/data/ai/use-session-scroll.cjs.map +1 -1
  125. package/dist/data/ai/use-session-scroll.d.ts +7 -0
  126. package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
  127. package/dist/data/ai/use-session-scroll.js +30 -6
  128. package/dist/data/ai/use-session-scroll.js.map +1 -1
  129. package/dist/data/chat/Chat.cjs +1 -1
  130. package/dist/data/chat/Chat.cjs.map +1 -1
  131. package/dist/data/chat/Chat.js +1 -1
  132. package/dist/data/chat/Chat.js.map +1 -1
  133. package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
  134. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  135. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
  136. package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
  137. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  138. package/dist/data/chat/PromptInput.cjs +4 -2
  139. package/dist/data/chat/PromptInput.cjs.map +1 -1
  140. package/dist/data/chat/PromptInput.d.ts +5 -1
  141. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  142. package/dist/data/chat/PromptInput.js +4 -2
  143. package/dist/data/chat/PromptInput.js.map +1 -1
  144. package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
  145. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  146. package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
  147. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  148. package/dist/data/diagnostics/ErrorDetails.js +14 -3
  149. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  150. package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
  151. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  152. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  153. package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
  154. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  155. package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
  156. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  157. package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
  158. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  159. package/dist/data/diagnostics/error-diagnostics.js +6 -1
  160. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  161. package/dist/data/har/HarPanel.cjs +3 -1
  162. package/dist/data/har/HarPanel.cjs.map +1 -1
  163. package/dist/data/har/HarPanel.d.ts +4 -1
  164. package/dist/data/har/HarPanel.d.ts.map +1 -1
  165. package/dist/data/har/HarPanel.js +3 -1
  166. package/dist/data/har/HarPanel.js.map +1 -1
  167. package/dist/data/test-runner/Expectation.cjs +57 -0
  168. package/dist/data/test-runner/Expectation.cjs.map +1 -0
  169. package/dist/data/test-runner/Expectation.d.ts +19 -0
  170. package/dist/data/test-runner/Expectation.d.ts.map +1 -0
  171. package/dist/data/test-runner/Expectation.js +57 -0
  172. package/dist/data/test-runner/Expectation.js.map +1 -0
  173. package/dist/data/test-runner/MarkIcons.cjs +38 -0
  174. package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
  175. package/dist/data/test-runner/MarkIcons.d.ts +15 -0
  176. package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
  177. package/dist/data/test-runner/MarkIcons.js +38 -0
  178. package/dist/data/test-runner/MarkIcons.js.map +1 -0
  179. package/dist/data/test-runner/TestDetailPanel.cjs +74 -42
  180. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  181. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  182. package/dist/data/test-runner/TestDetailPanel.js +76 -44
  183. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  184. package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
  185. package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
  186. package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
  187. package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
  188. package/dist/data/test-runner/TestFailureDetail.js +23 -27
  189. package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
  190. package/dist/data/test-runner/TestFilterBar.cjs +87 -93
  191. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  192. package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
  193. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  194. package/dist/data/test-runner/TestFilterBar.js +89 -95
  195. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  196. package/dist/data/test-runner/TestRunSummary.cjs +35 -21
  197. package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
  198. package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
  199. package/dist/data/test-runner/TestRunSummary.js +35 -21
  200. package/dist/data/test-runner/TestRunSummary.js.map +1 -1
  201. package/dist/data/test-runner/TestRunner.cjs +52 -30
  202. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  203. package/dist/data/test-runner/TestRunner.d.ts +3 -2
  204. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  205. package/dist/data/test-runner/TestRunner.js +52 -30
  206. package/dist/data/test-runner/TestRunner.js.map +1 -1
  207. package/dist/data/test-runner/TestTree.cjs +5 -2
  208. package/dist/data/test-runner/TestTree.cjs.map +1 -1
  209. package/dist/data/test-runner/TestTree.d.ts +5 -2
  210. package/dist/data/test-runner/TestTree.d.ts.map +1 -1
  211. package/dist/data/test-runner/TestTree.js +5 -2
  212. package/dist/data/test-runner/TestTree.js.map +1 -1
  213. package/dist/data/test-runner/TestTreeNode.cjs +27 -19
  214. package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
  215. package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
  216. package/dist/data/test-runner/TestTreeNode.js +28 -20
  217. package/dist/data/test-runner/TestTreeNode.js.map +1 -1
  218. package/dist/data/test-runner/adapter.cjs +11 -0
  219. package/dist/data/test-runner/adapter.cjs.map +1 -1
  220. package/dist/data/test-runner/adapter.d.ts +18 -7
  221. package/dist/data/test-runner/adapter.d.ts.map +1 -1
  222. package/dist/data/test-runner/adapter.js +11 -0
  223. package/dist/data/test-runner/adapter.js.map +1 -1
  224. package/dist/data/test-runner/copy.cjs +114 -0
  225. package/dist/data/test-runner/copy.cjs.map +1 -0
  226. package/dist/data/test-runner/copy.d.ts +47 -0
  227. package/dist/data/test-runner/copy.d.ts.map +1 -0
  228. package/dist/data/test-runner/copy.js +114 -0
  229. package/dist/data/test-runner/copy.js.map +1 -0
  230. package/dist/data/test-runner/index.d.ts +5 -2
  231. package/dist/data/test-runner/index.d.ts.map +1 -1
  232. package/dist/data/test-runner/marks.cjs +143 -0
  233. package/dist/data/test-runner/marks.cjs.map +1 -0
  234. package/dist/data/test-runner/marks.d.ts +30 -0
  235. package/dist/data/test-runner/marks.d.ts.map +1 -0
  236. package/dist/data/test-runner/marks.js +143 -0
  237. package/dist/data/test-runner/marks.js.map +1 -0
  238. package/dist/data/test-runner/status.cjs +27 -44
  239. package/dist/data/test-runner/status.cjs.map +1 -1
  240. package/dist/data/test-runner/status.d.ts +12 -3
  241. package/dist/data/test-runner/status.d.ts.map +1 -1
  242. package/dist/data/test-runner/status.js +27 -44
  243. package/dist/data/test-runner/status.js.map +1 -1
  244. package/dist/data/verification/adapterViews.cjs +16 -41
  245. package/dist/data/verification/adapterViews.cjs.map +1 -1
  246. package/dist/data/verification/adapterViews.d.ts.map +1 -1
  247. package/dist/data/verification/adapterViews.js +16 -41
  248. package/dist/data/verification/adapterViews.js.map +1 -1
  249. package/dist/data/verification/adapters.cjs +115 -3
  250. package/dist/data/verification/adapters.cjs.map +1 -1
  251. package/dist/data/verification/adapters.d.ts.map +1 -1
  252. package/dist/data/verification/adapters.js +115 -3
  253. package/dist/data/verification/adapters.js.map +1 -1
  254. package/dist/data/verification/verifyReportTests.cjs.map +1 -1
  255. package/dist/data/verification/verifyReportTests.js.map +1 -1
  256. package/dist/data/version-info.cjs +3 -3
  257. package/dist/data/version-info.js +3 -3
  258. package/dist/data.cjs +44 -3
  259. package/dist/data.cjs.map +1 -1
  260. package/dist/data.d.ts +2 -0
  261. package/dist/data.d.ts.map +1 -1
  262. package/dist/data.js +45 -4
  263. package/dist/data.js.map +1 -1
  264. package/dist/icons/components/UiLogoEslint.cjs +10 -0
  265. package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
  266. package/dist/icons/components/UiLogoEslint.d.ts +9 -0
  267. package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
  268. package/dist/icons/components/UiLogoEslint.js +10 -0
  269. package/dist/icons/components/UiLogoEslint.js.map +1 -0
  270. package/dist/icons/components/UiLogoGo.cjs +10 -0
  271. package/dist/icons/components/UiLogoGo.cjs.map +1 -0
  272. package/dist/icons/components/UiLogoGo.d.ts +9 -0
  273. package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
  274. package/dist/icons/components/UiLogoGo.js +10 -0
  275. package/dist/icons/components/UiLogoGo.js.map +1 -0
  276. package/dist/icons/components/UiLogoJest.cjs +10 -0
  277. package/dist/icons/components/UiLogoJest.cjs.map +1 -0
  278. package/dist/icons/components/UiLogoJest.d.ts +9 -0
  279. package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
  280. package/dist/icons/components/UiLogoJest.js +10 -0
  281. package/dist/icons/components/UiLogoJest.js.map +1 -0
  282. package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
  283. package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
  284. package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
  285. package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
  286. package/dist/icons/components/UiLogoMarkdown.js +10 -0
  287. package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
  288. package/dist/icons/components/UiLogoOxc.cjs +10 -0
  289. package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
  290. package/dist/icons/components/UiLogoOxc.d.ts +9 -0
  291. package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
  292. package/dist/icons/components/UiLogoOxc.js +10 -0
  293. package/dist/icons/components/UiLogoOxc.js.map +1 -0
  294. package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
  295. package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
  296. package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
  297. package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
  298. package/dist/icons/components/UiLogoPlaywright.js +10 -0
  299. package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
  300. package/dist/icons/components/UiLogoPython.cjs +10 -0
  301. package/dist/icons/components/UiLogoPython.cjs.map +1 -0
  302. package/dist/icons/components/UiLogoPython.d.ts +9 -0
  303. package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
  304. package/dist/icons/components/UiLogoPython.js +10 -0
  305. package/dist/icons/components/UiLogoPython.js.map +1 -0
  306. package/dist/icons/components/UiLogoReact.cjs +10 -0
  307. package/dist/icons/components/UiLogoReact.cjs.map +1 -0
  308. package/dist/icons/components/UiLogoReact.d.ts +9 -0
  309. package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
  310. package/dist/icons/components/UiLogoReact.js +10 -0
  311. package/dist/icons/components/UiLogoReact.js.map +1 -0
  312. package/dist/icons/components/UiLogoRuff.cjs +10 -0
  313. package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
  314. package/dist/icons/components/UiLogoRuff.d.ts +9 -0
  315. package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
  316. package/dist/icons/components/UiLogoRuff.js +10 -0
  317. package/dist/icons/components/UiLogoRuff.js.map +1 -0
  318. package/dist/icons/components/UiLogoTypescript.cjs +10 -0
  319. package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
  320. package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
  321. package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
  322. package/dist/icons/components/UiLogoTypescript.js +10 -0
  323. package/dist/icons/components/UiLogoTypescript.js.map +1 -0
  324. package/dist/icons/components/UiLogoVitest.cjs +10 -0
  325. package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
  326. package/dist/icons/components/UiLogoVitest.d.ts +9 -0
  327. package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
  328. package/dist/icons/components/UiLogoVitest.js +10 -0
  329. package/dist/icons/components/UiLogoVitest.js.map +1 -0
  330. package/dist/icons/index.d.ts +11 -0
  331. package/dist/icons/index.d.ts.map +1 -1
  332. package/dist/icons/registry.cjs +22 -0
  333. package/dist/icons/registry.cjs.map +1 -1
  334. package/dist/icons/registry.d.ts.map +1 -1
  335. package/dist/icons/registry.js +22 -0
  336. package/dist/icons/registry.js.map +1 -1
  337. package/dist/icons.cjs +22 -0
  338. package/dist/icons.cjs.map +1 -1
  339. package/dist/icons.js +22 -0
  340. package/dist/icons.js.map +1 -1
  341. package/dist/index.cjs +44 -3
  342. package/dist/index.cjs.map +1 -1
  343. package/dist/index.js +45 -4
  344. package/dist/index.js.map +1 -1
  345. package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
  346. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  347. package/dist/overlay/DropdownMenuSubmenu.js +4 -4
  348. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  349. package/dist/rpc/InlineError.cjs +12 -43
  350. package/dist/rpc/InlineError.cjs.map +1 -1
  351. package/dist/rpc/InlineError.d.ts.map +1 -1
  352. package/dist/rpc/InlineError.js +13 -44
  353. package/dist/rpc/InlineError.js.map +1 -1
  354. package/dist/rpc/OperationScheduleDialog.cjs +63 -10
  355. package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
  356. package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
  357. package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
  358. package/dist/rpc/OperationScheduleDialog.js +63 -10
  359. package/dist/rpc/OperationScheduleDialog.js.map +1 -1
  360. package/dist/rpc/OperationSchedules.cjs +12 -2
  361. package/dist/rpc/OperationSchedules.cjs.map +1 -1
  362. package/dist/rpc/OperationSchedules.d.ts.map +1 -1
  363. package/dist/rpc/OperationSchedules.js +12 -2
  364. package/dist/rpc/OperationSchedules.js.map +1 -1
  365. package/dist/rpc/operation-schedule-model.cjs +2 -0
  366. package/dist/rpc/operation-schedule-model.cjs.map +1 -1
  367. package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
  368. package/dist/rpc/operation-schedule-model.js +2 -0
  369. package/dist/rpc/operation-schedule-model.js.map +1 -1
  370. package/dist/rpc/operation-schedule-types.d.ts +7 -1
  371. package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
  372. package/dist/styles.css +1 -1
  373. package/package.json +1 -1
  374. package/dist/data/test-runner/frameworkIcon.cjs +0 -27
  375. package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
  376. package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
  377. package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
  378. package/dist/data/test-runner/frameworkIcon.js +0 -27
  379. package/dist/data/test-runner/frameworkIcon.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
package/dist/index.js CHANGED
@@ -222,6 +222,8 @@ import { PromptBanner } from "./data/PromptBanner.js";
222
222
  import { DiagnosticsTree } from "./data/diagnostics/DiagnosticsTree.js";
223
223
  import { DiagnosticsDetailPanel } from "./data/diagnostics/DiagnosticsDetailPanel.js";
224
224
  import { countProcesses, findProcessByPID, processLabel, processStateColor, processStateIcon } from "./data/diagnostics/utils.js";
225
+ import { GoroutineCard } from "./data/diagnostics/GoroutineCard.js";
226
+ import { ThreadCard } from "./data/diagnostics/ThreadCard.js";
225
227
  import { countGoroutinesByState, countStackByState, detectDumpFormat, parseGoroutineDump, parseStackDump } from "./data/diagnostics/stacktrace.js";
226
228
  import { countThreadsByState, parseJvmThreadDump } from "./data/diagnostics/jvm-stacktrace.js";
227
229
  import { JvmStackTrace } from "./data/diagnostics/JvmStackTrace.js";
@@ -300,11 +302,14 @@ import { CacheStatsOverview } from "./data/cache-browser/CacheStatsOverview.js";
300
302
  import { CacheValue } from "./data/cache-browser/CacheValue.js";
301
303
  import { CallGraph } from "./data/call-graph/CallGraph.js";
302
304
  import { ClickyExportDialog } from "./data/clicky-export/ClickyExportDialog.js";
305
+ import { Expectation } from "./data/test-runner/Expectation.js";
303
306
  import { FixtureEditor } from "./data/FixtureEditor/FixtureEditor.js";
304
307
  import { GitChangedFilesSummary, GitCommitList, GitDiffPanel, GitFileList } from "./data/git/GitChangeList.js";
308
+ import { LINT_SEVERITIES, TEST_OUTCOMES, TEST_TOOLS, toolMark } from "./data/test-runner/marks.js";
309
+ import { LintSeverityIcon, OutcomeIcon, ToolIcon } from "./data/test-runner/MarkIcons.js";
305
310
  import { QueryBrowser } from "./data/query-browser/QueryBrowser.js";
306
311
  import { QueryBrowserExecutionError } from "./data/query-browser/QueryBrowser.types.js";
307
- import { STATUS_LABELS, aggregateStatusCounts, collapseSingleChildChains, collectFrameworks, filterTests, formatCount, formatTestDuration, hasFailed, hasPending, humanizeName, statusIconFor, statusToneFor, sum, sumNonTaskTests, testStatus, totalDuration } from "./data/test-runner/status.js";
312
+ import { STATUS_LABELS, aggregateStatusCounts, collapseSingleChildChains, collectFrameworks, filterTests, formatCount, formatTestDuration, hasFailed, hasPending, humanizeName, outcomeFor, statusToneFor, sum, sumNonTaskTests, testStatus, totalDuration } from "./data/test-runner/status.js";
308
313
  import { TestAttempts, TestFailureDetail, TestOutput } from "./data/test-runner/TestFailureDetail.js";
309
314
  import { TestDetailPanel } from "./data/test-runner/TestDetailPanel.js";
310
315
  import { TestFilterBar } from "./data/test-runner/TestFilterBar.js";
@@ -609,14 +614,25 @@ import { UiLockOpen, UiLockOpenFilled } from "./icons/components/UiLockOpen.js";
609
614
  import { UiLogoAnthropic } from "./icons/components/UiLogoAnthropic.js";
610
615
  import { UiLogoClaude } from "./icons/components/UiLogoClaude.js";
611
616
  import { UiLogoDeepseek } from "./icons/components/UiLogoDeepseek.js";
617
+ import { UiLogoEslint } from "./icons/components/UiLogoEslint.js";
612
618
  import { UiLogoGemini } from "./icons/components/UiLogoGemini.js";
619
+ import { UiLogoGo } from "./icons/components/UiLogoGo.js";
613
620
  import { UiLogoGoogle } from "./icons/components/UiLogoGoogle.js";
614
621
  import { UiLogoHuggingface } from "./icons/components/UiLogoHuggingface.js";
622
+ import { UiLogoJest } from "./icons/components/UiLogoJest.js";
623
+ import { UiLogoMarkdown } from "./icons/components/UiLogoMarkdown.js";
615
624
  import { UiLogoMeta } from "./icons/components/UiLogoMeta.js";
616
625
  import { UiLogoMistral } from "./icons/components/UiLogoMistral.js";
617
626
  import { UiLogoOllama } from "./icons/components/UiLogoOllama.js";
618
627
  import { UiLogoOpenai } from "./icons/components/UiLogoOpenai.js";
628
+ import { UiLogoOxc } from "./icons/components/UiLogoOxc.js";
619
629
  import { UiLogoPerplexity } from "./icons/components/UiLogoPerplexity.js";
630
+ import { UiLogoPlaywright } from "./icons/components/UiLogoPlaywright.js";
631
+ import { UiLogoPython } from "./icons/components/UiLogoPython.js";
632
+ import { UiLogoReact } from "./icons/components/UiLogoReact.js";
633
+ import { UiLogoRuff } from "./icons/components/UiLogoRuff.js";
634
+ import { UiLogoTypescript } from "./icons/components/UiLogoTypescript.js";
635
+ import { UiLogoVitest } from "./icons/components/UiLogoVitest.js";
620
636
  import { UiMagicWand, UiMagicWandFilled } from "./icons/components/UiMagicWand.js";
621
637
  import { UiMarkdown } from "./icons/components/UiMarkdown.js";
622
638
  import { UiMaterializedLog, UiMaterializedLogDark } from "./icons/components/UiMaterializedLog.js";
@@ -888,6 +904,7 @@ import { UiZoomOut, UiZoomOutFilled } from "./icons/components/UiZoomOut.js";
888
904
  import { VerificationResults } from "./data/verification/VerificationResults.js";
889
905
  import { annotateRoutePaths, findNodeByRoutePath, slugify } from "./data/test-runner/routePath.js";
890
906
  import { applyFixtureFrontmatterRaw, applyFixtureFrontmatterState, fixtureFrontmatterState, parseFixtureFrontmatter } from "./data/FixtureEditor/fixture-frontmatter.js";
907
+ import { buildBrief, buildNodeBrief, buildNodeJson, genericCopySections, mergeCopySections } from "./data/test-runner/copy.js";
891
908
  import { cacheQueryKeys, createCacheClient } from "./data/cache-browser/api.js";
892
909
  import { changeIconAliases, getChangeIcon } from "./icons/changeIconAliases.js";
893
910
  import { clickyIconProvider, iconsByConsumerName } from "./icons/registry.js";
@@ -895,7 +912,6 @@ import { createChecklistMarkdown, createFenceMarkdown, fixtureFenceKind, fixture
895
912
  import { cycleFilterState, decodeFilterState, emptyTestFilters, encodeFilterState, filterStateToRecord, matchesFilterState, recordToFilterState } from "./data/test-runner/filterState.js";
896
913
  import { emptyVerifySummary, summarizeVerifyNodes } from "./data/verification/verify-report.js";
897
914
  import { formatGitCommitDateHeader } from "./data/git/git-dates.js";
898
- import { frameworkIcon } from "./data/test-runner/frameworkIcon.js";
899
915
  import { isLeaf } from "./data/cache-browser/types.js";
900
916
  import { programmingIconCatalog } from "./icons/programmingCatalog.js";
901
917
  import { routeEdges } from "./data/graph-edge-routing.js";
@@ -1007,6 +1023,7 @@ export {
1007
1023
  ErrorWrapper,
1008
1024
  EventSourceProvider,
1009
1025
  ExecutionTree,
1026
+ Expectation,
1010
1027
  Field,
1011
1028
  FieldErrorText,
1012
1029
  FilterBar,
@@ -1027,6 +1044,7 @@ export {
1027
1044
  GitCommitList,
1028
1045
  GitDiffPanel,
1029
1046
  GitFileList,
1047
+ GoroutineCard,
1030
1048
  GraphDiagram,
1031
1049
  GroupedComments,
1032
1050
  HINT_FIELDS,
@@ -1047,7 +1065,9 @@ export {
1047
1065
  JsonView,
1048
1066
  JvmStackTrace,
1049
1067
  KeyValueList,
1068
+ LINT_SEVERITIES,
1050
1069
  LabelIcon,
1070
+ LintSeverityIcon,
1051
1071
  ListMenu,
1052
1072
  ListMenuActionBar,
1053
1073
  ListMenuHeader,
@@ -1086,6 +1106,7 @@ export {
1086
1106
  OperationScheduleDialog,
1087
1107
  OperationSchedules,
1088
1108
  OperationsApiClientError,
1109
+ OutcomeIcon,
1089
1110
  PATH_SEPARATOR,
1090
1111
  PATTERN_FIELDS,
1091
1112
  Panel,
@@ -1137,6 +1158,8 @@ export {
1137
1158
  StatusDot,
1138
1159
  StatusRows,
1139
1160
  Switch,
1161
+ TEST_OUTCOMES,
1162
+ TEST_TOOLS,
1140
1163
  TabButton,
1141
1164
  Tabs,
1142
1165
  TagActionsProvider,
@@ -1160,6 +1183,7 @@ export {
1160
1183
  TestTreeNode,
1161
1184
  ThemeProvider,
1162
1185
  ThemeSwitcher,
1186
+ ThreadCard,
1163
1187
  TimeRange,
1164
1188
  Timeline,
1165
1189
  TimeseriesCoreBars,
@@ -1167,6 +1191,7 @@ export {
1167
1191
  TimeseriesPanel,
1168
1192
  Timestamp,
1169
1193
  ToastProvider,
1194
+ ToolIcon,
1170
1195
  Tour,
1171
1196
  TourProvider,
1172
1197
  Tree,
@@ -1709,14 +1734,25 @@ export {
1709
1734
  UiLogoAnthropic,
1710
1735
  UiLogoClaude,
1711
1736
  UiLogoDeepseek,
1737
+ UiLogoEslint,
1712
1738
  UiLogoGemini,
1739
+ UiLogoGo,
1713
1740
  UiLogoGoogle,
1714
1741
  UiLogoHuggingface,
1742
+ UiLogoJest,
1743
+ UiLogoMarkdown,
1715
1744
  UiLogoMeta,
1716
1745
  UiLogoMistral,
1717
1746
  UiLogoOllama,
1718
1747
  UiLogoOpenai,
1748
+ UiLogoOxc,
1719
1749
  UiLogoPerplexity,
1750
+ UiLogoPlaywright,
1751
+ UiLogoPython,
1752
+ UiLogoReact,
1753
+ UiLogoRuff,
1754
+ UiLogoTypescript,
1755
+ UiLogoVitest,
1720
1756
  UiMagicWand,
1721
1757
  UiMagicWandFilled,
1722
1758
  UiMarkdown,
@@ -2264,9 +2300,12 @@ export {
2264
2300
  badgeVariants,
2265
2301
  baseAccess as baseCallGraphAccess,
2266
2302
  bucketTasks,
2303
+ buildBrief,
2267
2304
  buildCommandHref,
2268
2305
  buildJSONPathNode,
2269
2306
  buildMarkdownPreviewUrl,
2307
+ buildNodeBrief,
2308
+ buildNodeJson,
2270
2309
  buildOnePasswordReference,
2271
2310
  buildPathTree,
2272
2311
  buildReplyMap,
@@ -2377,7 +2416,7 @@ export {
2377
2416
  formatUnitAwareValue,
2378
2417
  frameHasSource,
2379
2418
  frameLocation,
2380
- frameworkIcon,
2419
+ genericCopySections,
2381
2420
  getChangeIcon,
2382
2421
  getClickySurfaces,
2383
2422
  getCountryOption,
@@ -2434,6 +2473,7 @@ export {
2434
2473
  memoryTourStorage,
2435
2474
  mergeAccess,
2436
2475
  mergeGraph as mergeCallGraph,
2476
+ mergeCopySections,
2437
2477
  mergeRuntimeSpec,
2438
2478
  mergeSeries,
2439
2479
  metadataEntries,
@@ -2454,6 +2494,7 @@ export {
2454
2494
  normalizeStatus,
2455
2495
  normalizeTags,
2456
2496
  onMediaChange,
2497
+ outcomeFor,
2457
2498
  paletteClass,
2458
2499
  parseBoundsValue,
2459
2500
  parseExclude as parseCallGraphExclude,
@@ -2550,7 +2591,6 @@ export {
2550
2591
  splitSelectionActions,
2551
2592
  splitTagToken,
2552
2593
  statusForCommentStage,
2553
- statusIconFor,
2554
2594
  statusToneFor,
2555
2595
  strategyPreset,
2556
2596
  strictAnchorResolver,
@@ -2577,6 +2617,7 @@ export {
2577
2617
  toggleAccess as toggleCallGraphAccess,
2578
2618
  toneToBadgeTone,
2579
2619
  toolFieldSuggestions,
2620
+ toolMark,
2580
2621
  totalDuration,
2581
2622
  truncatePlain,
2582
2623
  uniqueName,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
@@ -116,13 +116,13 @@ function MenuSubmenu({ item }) {
116
116
  const { getReferenceProps, getFloatingProps, getItemProps } = react$1.useInteractions(
117
117
  [hover, click, role, dismiss, listNav]
118
118
  );
119
- modalStack.useEscapeLayer(isOpen, () => setIsOpen(false));
119
+ modalStack.useEscapeLayer(isOpen, () => context.onOpenChange(false));
120
120
  react.useEffect(() => {
121
121
  if (!tree) return;
122
- const closeAll = () => setIsOpen(false);
122
+ const closeAll = () => context.onOpenChange(false);
123
123
  const closeSiblings = (event) => {
124
124
  if (event.nodeId !== nodeId && event.parentId === parentId) {
125
- setIsOpen(false);
125
+ context.onOpenChange(false);
126
126
  }
127
127
  };
128
128
  tree.events.on("click", closeAll);
@@ -131,7 +131,7 @@ function MenuSubmenu({ item }) {
131
131
  tree.events.off("click", closeAll);
132
132
  tree.events.off("menuopen", closeSiblings);
133
133
  };
134
- }, [tree, nodeId, parentId]);
134
+ }, [tree, nodeId, parentId, context.onOpenChange]);
135
135
  react.useEffect(() => {
136
136
  if (isOpen && tree) tree.events.emit("menuopen", { parentId, nodeId });
137
137
  }, [isOpen, tree, nodeId, parentId]);
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenuSubmenu.cjs","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => setIsOpen(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => setIsOpen(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n setIsOpen(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["jsx","cn","Icon","useContext","MenuContext","useFloatingTree","useListItem","jsxs","useFloatingNodeId","useFloatingParentNodeId","useState","useRef","useFloatingZIndex","useFloating","offset","flip","shift","autoUpdate","useHover","safePolygon","useClick","useRole","useDismiss","useListNavigation","useInteractions","useEscapeLayer","useEffect","useMergeRefs","FloatingNode","UiChevronRight","FloatingList","FloatingPortal","FloatingFocusManager","MENU_POPOVER_CLASS","Fragment"],"mappings":"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"}
1
+ {"version":3,"file":"DropdownMenuSubmenu.cjs","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => context.onOpenChange(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => context.onOpenChange(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n context.onOpenChange(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId, context.onOpenChange]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["jsx","cn","Icon","useContext","MenuContext","useFloatingTree","useListItem","jsxs","useFloatingNodeId","useFloatingParentNodeId","useState","useRef","useFloatingZIndex","useFloating","offset","flip","shift","autoUpdate","useHover","safePolygon","useClick","useRole","useDismiss","useListNavigation","useInteractions","useEscapeLayer","useEffect","useMergeRefs","FloatingNode","UiChevronRight","FloatingList","FloatingPortal","FloatingFocusManager","MENU_POPOVER_CLASS","Fragment"],"mappings":"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"}
@@ -114,13 +114,13 @@ function MenuSubmenu({ item }) {
114
114
  const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(
115
115
  [hover, click, role, dismiss, listNav]
116
116
  );
117
- useEscapeLayer(isOpen, () => setIsOpen(false));
117
+ useEscapeLayer(isOpen, () => context.onOpenChange(false));
118
118
  useEffect(() => {
119
119
  if (!tree) return;
120
- const closeAll = () => setIsOpen(false);
120
+ const closeAll = () => context.onOpenChange(false);
121
121
  const closeSiblings = (event) => {
122
122
  if (event.nodeId !== nodeId && event.parentId === parentId) {
123
- setIsOpen(false);
123
+ context.onOpenChange(false);
124
124
  }
125
125
  };
126
126
  tree.events.on("click", closeAll);
@@ -129,7 +129,7 @@ function MenuSubmenu({ item }) {
129
129
  tree.events.off("click", closeAll);
130
130
  tree.events.off("menuopen", closeSiblings);
131
131
  };
132
- }, [tree, nodeId, parentId]);
132
+ }, [tree, nodeId, parentId, context.onOpenChange]);
133
133
  useEffect(() => {
134
134
  if (isOpen && tree) tree.events.emit("menuopen", { parentId, nodeId });
135
135
  }, [isOpen, tree, nodeId, parentId]);
@@ -1 +1 @@
1
- {"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => setIsOpen(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => setIsOpen(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n setIsOpen(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":";;;;;;;;AAkCA,MAAM,kBACJ;AACF,MAAM,oBACJ;AAEF,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,MAAI,CAAC,KAAM,QAAO;AAClB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAW,GAAG,kCAAkC,aAAa;AAAA,QAC7D,OAAO,YAAY,EAAE,OAAO,cAAc;AAAA,QAE1C,UAAA,oBAAC,MAAA,EAAM,GAAI,OAAO,SAAS,WAAW,EAAE,MAAM,SAAS,EAAE,KAAA,EAAK,CAAI;AAAA,MAAA;AAAA,IAAA;AAAA;AAGxE;AAEA,SAAS,SAAS,EAAE,QAAoC;AACtD,QAAM,OAAO,WAAW,WAAW;AACnC,QAAM,OAAO,gBAAA;AACb,QAAM,WAAW,YAAA;AACjB,QAAM,WAAW,SAAS,UAAU,KAAK;AAEzC,QAAM,WAAW,MAAM;AACrB,QAAI,KAAK,SAAU;AACnB,SAAK,SAAA;AAEL,iCAAM,OAAO,KAAK;AAAA,EACpB;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAK,SAAS;AAAA,MACd,MAAK;AAAA,MACL,MAAK;AAAA,MACL,UAAU,WAAW,IAAI;AAAA,MACzB,UAAU,KAAK;AAAA,MACf,OAAO,KAAK;AAAA,MACZ,WAAW;AAAA,MACV,GAAG,KAAK,aAAa;AAAA,QACpB,SAAS;AAAA,QACT,SAAS,MAAM,KAAK,kBAAkB,IAAI;AAAA,QAC1C,WAAW,CAAC,UAAU;AACpB,cAAI,MAAM,QAAQ,WAAW,MAAM,QAAQ,KAAK;AAC9C,kBAAM,eAAA;AACN,qBAAA;AAAA,UACF;AAAA,QACF;AAAA,MAAA,CACD;AAAA,MAED,UAAA;AAAA,QAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,KAAK;AAAA,YACX,WAAW,KAAK;AAAA,YAChB,eAAe,KAAK;AAAA,UAAA;AAAA,QAAA;AAAA,QAErB,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGZ;AAEA,SAAS,YAAY,EAAE,QAAoC;AACzD,QAAM,SAAS,WAAW,WAAW;AACrC,QAAM,OAAO,gBAAA;AACb,QAAM,SAAS,kBAAA;AACf,QAAM,WAAW,wBAAA;AACjB,QAAM,WAAW,YAAA;AAEjB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,KAAK;AAC1C,QAAM,CAAC,aAAa,cAAc,IAAI,SAAwB,IAAI;AAClE,QAAM,CAAC,gBAAgB,iBAAiB,IAAI,SAAS,KAAK;AAC1D,QAAM,cAAc,OAAkC,EAAE;AACxD,QAAM,YAAY,kBAAA;AAElB,QAAM,EAAE,MAAM,gBAAgB,QAAA,IAAY,YAA+B;AAAA;AAAA,IAEvE,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,IAC1B,MAAM;AAAA,IACN,cAAc;AAAA,IACd,WAAW;AAAA,IACX,YAAY;AAAA,MACV,OAAO,EAAE,UAAU,GAAG,eAAe,IAAI;AAAA,MACzC,KAAK,EAAE,SAAS,GAAG;AAAA,MACnB,MAAM,EAAE,SAAS,GAAG,WAAW,MAAM;AAAA,IAAA;AAAA,IAEvC,sBAAsB;AAAA,EAAA,CACvB;AAED,QAAM,QAAQ,SAAS,SAAS;AAAA,IAC9B,OAAO,EAAE,MAAM,GAAA;AAAA,IACf,aAAa,YAAA;AAAA,EAAY,CAC1B;AAID,QAAM,QAAQ,SAAS,SAAS,EAAE,QAAQ,OAAO;AACjD,QAAM,OAAO,QAAQ,SAAS,EAAE,MAAM,QAAQ;AAG9C,QAAM,UAAU,WAAW,SAAS,EAAE,WAAW,OAAO,SAAS,MAAM;AACvE,QAAM,UAAU,kBAAkB,SAAS;AAAA,IACzC,SAAS;AAAA,IACT;AAAA,IACA,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAM;AAAA,EAAA,CACP;AACD,QAAM,EAAE,mBAAmB,kBAAkB,aAAA,IAAiB;AAAA,IAC5D,CAAC,OAAO,OAAO,MAAM,SAAS,OAAO;AAAA,EAAA;AAGvC,iBAAe,QAAQ,MAAM,UAAU,KAAK,CAAC;AAE7C,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,WAAW,MAAM,UAAU,KAAK;AACtC,UAAM,gBAAgB,CAAC,UAGjB;AACJ,UAAI,MAAM,WAAW,UAAU,MAAM,aAAa,UAAU;AAC1D,kBAAU,KAAK;AAAA,MACjB;AAAA,IACF;AACA,SAAK,OAAO,GAAG,SAAS,QAAQ;AAChC,SAAK,OAAO,GAAG,YAAY,aAAa;AACxC,WAAO,MAAM;AACX,WAAK,OAAO,IAAI,SAAS,QAAQ;AACjC,WAAK,OAAO,IAAI,YAAY,aAAa;AAAA,IAC3C;AAAA,EACF,GAAG,CAAC,MAAM,QAAQ,QAAQ,CAAC;AAE3B,YAAU,MAAM;AACd,QAAI,UAAU,KAAM,MAAK,OAAO,KAAK,YAAY,EAAE,UAAU,QAAQ;AAAA,EACvE,GAAG,CAAC,QAAQ,MAAM,QAAQ,QAAQ,CAAC;AAEnC,QAAM,WAAW,SAAS,UAAU,OAAO;AAC3C,QAAM,eAAe,aAAa,CAAC,KAAK,cAAc,SAAS,GAAG,CAAC;AACnE,QAAM,YAAY,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;AAEhE,SACE,qBAAC,cAAA,EAAa,IAAI,QAChB,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,KAAK;AAAA,QACL,MAAK;AAAA,QACL,MAAK;AAAA,QACL,UAAU,WAAW,IAAI;AAAA,QACzB,UAAU,KAAK;AAAA,QACf,OAAO,KAAK;AAAA,QACZ,iBAAc;AAAA,QACd,iBAAe;AAAA,QACf,qBAAmB,iBAAiB,KAAK;AAAA,QACzC,WAAW;AAAA,QACV,GAAG,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA,UAKT,kBAAkB;AAAA,YAChB,SAAS,MAAM;AACb,gCAAkB,KAAK;AACvB,qBAAO,kBAAkB,IAAI;AAAA,YAC/B;AAAA,UAAA,CACD;AAAA,QAAA;AAAA,QAGH,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAM,KAAK;AAAA,cACX,WAAW,KAAK;AAAA,cAChB,eAAe,KAAK;AAAA,YAAA;AAAA,UAAA;AAAA,UAEtB,oBAAC,QAAA,EAAK,WAAU,2BAA2B,eAAK,OAAM;AAAA,UACtD,oBAAC,MAAA,EAAK,MAAM,gBAAgB,WAAU,8BAAA,CAA8B;AAAA,QAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAEtE;AAAA,MAAC,YAAY;AAAA,MAAZ;AAAA,QACC,OAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAAA,QAGF,UAAA,oBAAC,cAAA,EAAa,aACX,UAAA,8BACE,gBAAA,EACC,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC;AAAA,YACA,OAAO;AAAA,YACP,cAAc;AAAA,YACd,aAAa;AAAA,YAEb,UAAA;AAAA,cAAC;AAAA,cAAA;AAAA,gBACC,KAAK,KAAK;AAAA,gBACV,MAAK;AAAA,gBACL,OAAO,EAAE,GAAG,gBAAgB,QAAQ,UAAA;AAAA,gBACpC,WAAW;AAAA,gBACV,GAAG,iBAAA;AAAA,gBACJ,cAAY;AAAA,gBACX,GAAI,YAAY,EAAE,mBAAmB,OAAA,IAAc,CAAA;AAAA,gBAEnD,UAAA;AAAA,kBAAA,KAAK,UAAU,QACd,oBAAC,SAAI,WAAU,sCACZ,eAAK,OAAA,CACR;AAAA,sCAED,cAAA,EAAa,OAAO,KAAK,YAAY,CAAA,EAAC,CAAG;AAAA,gBAAA;AAAA,cAAA;AAAA,YAAA;AAAA,UAC5C;AAAA,QAAA,GAEJ,EAAA,CAEJ;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AASO,SAAS,aAAa,EAAE,SAAwC;AACrE,SACE,oBAAA,UAAA,EACG,UAAA,MAAM,IAAI,CAAC,MAAM,UAAU;;AAC1B,UAAM,aACJ,KAAK,SAAS,QAAQ,KAAK,YAAU,WAAM,QAAQ,CAAC,MAAf,mBAAkB;AACzD,UAAM,cAAc,CAAC,CAAC,KAAK,YAAY,KAAK,SAAS,SAAS;AAC9D,WACE,qBAACA,YAAA,EACE,UAAA;AAAA,MAAA,kCACE,OAAA,EAAI,MAAK,gBAAe,WAAW,mBACjC,eAAK,MAAA,CACR;AAAA,MAED,cACC,oBAAC,aAAA,EAAY,MAAY,IAEzB,oBAAC,YAAS,KAAA,CAAY;AAAA,IAAA,EAAA,GATX,KAWf;AAAA,EAEJ,CAAC,EAAA,CACH;AAEJ;"}
1
+ {"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => context.onOpenChange(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => context.onOpenChange(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n context.onOpenChange(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId, context.onOpenChange]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
@@ -2,19 +2,18 @@
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
4
  const button = require("../components/button.cjs");
5
+ const ErrorDetails = require("../data/diagnostics/ErrorDetails.cjs");
5
6
  const Icon = require("../data/Icon.cjs");
6
- const utils = require("../lib/utils.cjs");
7
+ const operationErrorDiagnostics = require("./operationErrorDiagnostics.cjs");
7
8
  const UiPlay = require("../icons/components/UiPlay.cjs");
8
- const UiChevronRight = require("../icons/components/UiChevronRight.cjs");
9
9
  function InlineError({ title, error, className, runNow }) {
10
- const message = error instanceof Error ? error.message : String(error ?? "");
11
- const details = getErrorDetails(error);
12
- const hasDetails = Boolean(details.responseBody || details.status || details.url);
13
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("rounded-xl border border-dashed border-red-300 p-6 text-sm", className), children: [
14
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-center", children: [
15
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "font-medium text-red-600", children: title }),
16
- message && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-1 text-muted-foreground", children: message }),
17
- runNow && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs(
10
+ return /* @__PURE__ */ jsxRuntime.jsx(
11
+ ErrorDetails.ErrorDetails,
12
+ {
13
+ title,
14
+ diagnostics: operationErrorDiagnostics.operationErrorDiagnostics(error),
15
+ ...className ? { className } : {},
16
+ actions: runNow && /* @__PURE__ */ jsxRuntime.jsxs(
18
17
  button.Button,
19
18
  {
20
19
  type: "button",
@@ -28,39 +27,9 @@ function InlineError({ title, error, className, runNow }) {
28
27
  "Run now"
29
28
  ]
30
29
  }
31
- ) })
32
- ] }),
33
- hasDetails && /* @__PURE__ */ jsxRuntime.jsxs("details", { className: "group mt-3", children: [
34
- /* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex cursor-pointer items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground", children: [
35
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiChevronRight.UiChevronRight, className: "transition-transform group-open:rotate-90" }),
36
- "More details"
37
- ] }),
38
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 space-y-2 text-left font-mono text-xs", children: [
39
- (details.method || details.url || details.status) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-muted-foreground", children: [
40
- details.method && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
41
- details.method,
42
- " "
43
- ] }),
44
- details.url,
45
- details.status != null && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
46
- " - ",
47
- details.status
48
- ] })
49
- ] }),
50
- details.responseBody && /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "max-h-64 overflow-auto rounded-md bg-muted p-2 text-xs", children: details.responseBody })
51
- ] })
52
- ] })
53
- ] });
54
- }
55
- function getErrorDetails(error) {
56
- if (error == null || typeof error !== "object") return {};
57
- const record = error;
58
- const details = {};
59
- if (typeof record.method === "string") details.method = record.method;
60
- if (typeof record.url === "string") details.url = record.url;
61
- if (typeof record.status === "number") details.status = record.status;
62
- if (typeof record.responseBody === "string") details.responseBody = record.responseBody;
63
- return details;
30
+ )
31
+ }
32
+ );
64
33
  }
65
34
  exports.InlineError = InlineError;
66
35
  //# sourceMappingURL=InlineError.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"InlineError.cjs","sources":["../../src/rpc/InlineError.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiChevronRight, UiPlay } from \"../icons\";\nimport { cn } from \"../lib/utils\";\n\nexport type InlineErrorProps = {\n title: string;\n error: unknown;\n className?: string;\n runNow?: {\n onClick: () => void;\n loading?: boolean;\n };\n};\n\ntype ErrorDetails = {\n method?: string;\n url?: string;\n status?: number;\n responseBody?: string;\n};\n\nexport function InlineError({ title, error, className, runNow }: InlineErrorProps) {\n const message = error instanceof Error ? error.message : String(error ?? \"\");\n const details = getErrorDetails(error);\n const hasDetails = Boolean(details.responseBody || details.status || details.url);\n\n return (\n <div className={cn(\"rounded-xl border border-dashed border-red-300 p-6 text-sm\", className)}>\n <div className=\"text-center\">\n <div className=\"font-medium text-red-600\">{title}</div>\n {message && <div className=\"mt-1 text-muted-foreground\">{message}</div>}\n {runNow && (\n <div className=\"mt-3 flex justify-center\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={runNow.onClick}\n loading={runNow.loading ?? false}\n loadingLabel={runNow.loading ? \"Running…\" : undefined}\n >\n <Icon icon={UiPlay} />\n Run now\n </Button>\n </div>\n )}\n </div>\n {hasDetails && (\n <details className=\"group mt-3\">\n <summary className=\"flex cursor-pointer items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground\">\n <Icon icon={UiChevronRight} className=\"transition-transform group-open:rotate-90\" />\n More details\n </summary>\n <div className=\"mt-2 space-y-2 text-left font-mono text-xs\">\n {(details.method || details.url || details.status) && (\n <div className=\"text-muted-foreground\">\n {details.method && <span>{details.method} </span>}\n {details.url}\n {details.status != null && <span> - {details.status}</span>}\n </div>\n )}\n {details.responseBody && (\n <pre className=\"max-h-64 overflow-auto rounded-md bg-muted p-2 text-xs\">\n {details.responseBody}\n </pre>\n )}\n </div>\n </details>\n )}\n </div>\n );\n}\n\nfunction getErrorDetails(error: unknown): ErrorDetails {\n if (error == null || typeof error !== \"object\") return {};\n const record = error as Record<string, unknown>;\n const details: ErrorDetails = {};\n if (typeof record.method === \"string\") details.method = record.method;\n if (typeof record.url === \"string\") details.url = record.url;\n if (typeof record.status === \"number\") details.status = record.status;\n if (typeof record.responseBody === \"string\") details.responseBody = record.responseBody;\n return details;\n}\n"],"names":["cn","jsxs","jsx","Button","Icon","UiPlay","UiChevronRight"],"mappings":";;;;;;;;AAsBO,SAAS,YAAY,EAAE,OAAO,OAAO,WAAW,UAA4B;AACjF,QAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,SAAS,EAAE;AAC3E,QAAM,UAAU,gBAAgB,KAAK;AACrC,QAAM,aAAa,QAAQ,QAAQ,gBAAgB,QAAQ,UAAU,QAAQ,GAAG;AAEhF,yCACG,OAAA,EAAI,WAAWA,MAAAA,GAAG,8DAA8D,SAAS,GACxF,UAAA;AAAA,IAAAC,2BAAAA,KAAC,OAAA,EAAI,WAAU,eACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,OAAA,EAAI,WAAU,4BAA4B,UAAA,OAAM;AAAA,MAChD,WAAWA,2BAAAA,IAAC,OAAA,EAAI,WAAU,8BAA8B,UAAA,SAAQ;AAAA,MAChE,UACCA,2BAAAA,IAAC,OAAA,EAAI,WAAU,4BACb,UAAAD,2BAAAA;AAAAA,QAACE,OAAAA;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO,WAAW;AAAA,UAC3B,cAAc,OAAO,UAAU,aAAa;AAAA,UAE5C,UAAA;AAAA,YAAAD,2BAAAA,IAACE,KAAAA,MAAA,EAAK,MAAMC,OAAAA,OAAA,CAAQ;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA,EAExB,CACF;AAAA,IAAA,GAEJ;AAAA,IACC,cACCJ,2BAAAA,KAAC,WAAA,EAAQ,WAAU,cACjB,UAAA;AAAA,MAAAA,2BAAAA,KAAC,WAAA,EAAQ,WAAU,6GACjB,UAAA;AAAA,QAAAC,2BAAAA,IAACE,KAAAA,MAAA,EAAK,MAAME,eAAAA,gBAAgB,WAAU,6CAA4C;AAAA,QAAE;AAAA,MAAA,GAEtF;AAAA,MACAL,2BAAAA,KAAC,OAAA,EAAI,WAAU,8CACX,UAAA;AAAA,SAAA,QAAQ,UAAU,QAAQ,OAAO,QAAQ,WACzCA,2BAAAA,KAAC,OAAA,EAAI,WAAU,yBACZ,UAAA;AAAA,UAAA,QAAQ,0CAAW,QAAA,EAAM,UAAA;AAAA,YAAA,QAAQ;AAAA,YAAO;AAAA,UAAA,GAAC;AAAA,UACzC,QAAQ;AAAA,UACR,QAAQ,UAAU,QAAQA,2BAAAA,KAAC,QAAA,EAAK,UAAA;AAAA,YAAA;AAAA,YAAI,QAAQ;AAAA,UAAA,EAAA,CAAO;AAAA,QAAA,GACtD;AAAA,QAED,QAAQ,gBACPC,2BAAAA,IAAC,SAAI,WAAU,0DACZ,kBAAQ,aAAA,CACX;AAAA,MAAA,EAAA,CAEJ;AAAA,IAAA,EAAA,CACF;AAAA,EAAA,GAEJ;AAEJ;AAEA,SAAS,gBAAgB,OAA8B;AACrD,MAAI,SAAS,QAAQ,OAAO,UAAU,iBAAiB,CAAA;AACvD,QAAM,SAAS;AACf,QAAM,UAAwB,CAAA;AAC9B,MAAI,OAAO,OAAO,WAAW,SAAU,SAAQ,SAAS,OAAO;AAC/D,MAAI,OAAO,OAAO,QAAQ,SAAU,SAAQ,MAAM,OAAO;AACzD,MAAI,OAAO,OAAO,WAAW,SAAU,SAAQ,SAAS,OAAO;AAC/D,MAAI,OAAO,OAAO,iBAAiB,SAAU,SAAQ,eAAe,OAAO;AAC3E,SAAO;AACT;;"}
1
+ {"version":3,"file":"InlineError.cjs","sources":["../../src/rpc/InlineError.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { ErrorDetails } from \"../data/diagnostics/ErrorDetails\";\nimport { Icon } from \"../data/Icon\";\nimport { UiPlay } from \"../icons\";\nimport { operationErrorDiagnostics } from \"./operationErrorDiagnostics\";\n\nexport type InlineErrorProps = {\n title: string;\n error: unknown;\n className?: string;\n runNow?: {\n onClick: () => void;\n loading?: boolean;\n };\n};\n\nexport function InlineError({ title, error, className, runNow }: InlineErrorProps) {\n return (\n <ErrorDetails\n title={title}\n diagnostics={operationErrorDiagnostics(error)}\n {...(className ? { className } : {})}\n actions={\n runNow && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={runNow.onClick}\n loading={runNow.loading ?? false}\n loadingLabel={runNow.loading ? \"Running…\" : undefined}\n >\n <Icon icon={UiPlay} />\n Run now\n </Button>\n )\n }\n />\n );\n}\n"],"names":["jsx","ErrorDetails","operationErrorDiagnostics","jsxs","Button","Icon","UiPlay"],"mappings":";;;;;;;;AAgBO,SAAS,YAAY,EAAE,OAAO,OAAO,WAAW,UAA4B;AACjF,SACEA,2BAAAA;AAAAA,IAACC,aAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA,aAAaC,0BAAAA,0BAA0B,KAAK;AAAA,MAC3C,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,SACE,UACEC,2BAAAA;AAAAA,QAACC,OAAAA;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO,WAAW;AAAA,UAC3B,cAAc,OAAO,UAAU,aAAa;AAAA,UAE5C,UAAA;AAAA,YAAAJ,2BAAAA,IAACK,KAAAA,MAAA,EAAK,MAAMC,OAAAA,OAAA,CAAQ;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAExB;AAAA,EAAA;AAKV;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"InlineError.d.ts","sourceRoot":"","sources":["../../src/rpc/InlineError.tsx"],"names":[],"mappings":"AAKA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AASF,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,gBAAgB,+BAkDhF"}
1
+ {"version":3,"file":"InlineError.d.ts","sourceRoot":"","sources":["../../src/rpc/InlineError.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,gBAAgB,+BAuBhF"}
@@ -1,18 +1,17 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import { Button } from "../components/button.js";
3
+ import { ErrorDetails } from "../data/diagnostics/ErrorDetails.js";
3
4
  import { Icon } from "../data/Icon.js";
4
- import { cn } from "../lib/utils.js";
5
+ import { operationErrorDiagnostics } from "./operationErrorDiagnostics.js";
5
6
  import { UiPlay } from "../icons/components/UiPlay.js";
6
- import { UiChevronRight } from "../icons/components/UiChevronRight.js";
7
7
  function InlineError({ title, error, className, runNow }) {
8
- const message = error instanceof Error ? error.message : String(error ?? "");
9
- const details = getErrorDetails(error);
10
- const hasDetails = Boolean(details.responseBody || details.status || details.url);
11
- return /* @__PURE__ */ jsxs("div", { className: cn("rounded-xl border border-dashed border-red-300 p-6 text-sm", className), children: [
12
- /* @__PURE__ */ jsxs("div", { className: "text-center", children: [
13
- /* @__PURE__ */ jsx("div", { className: "font-medium text-red-600", children: title }),
14
- message && /* @__PURE__ */ jsx("div", { className: "mt-1 text-muted-foreground", children: message }),
15
- runNow && /* @__PURE__ */ jsx("div", { className: "mt-3 flex justify-center", children: /* @__PURE__ */ jsxs(
8
+ return /* @__PURE__ */ jsx(
9
+ ErrorDetails,
10
+ {
11
+ title,
12
+ diagnostics: operationErrorDiagnostics(error),
13
+ ...className ? { className } : {},
14
+ actions: runNow && /* @__PURE__ */ jsxs(
16
15
  Button,
17
16
  {
18
17
  type: "button",
@@ -26,39 +25,9 @@ function InlineError({ title, error, className, runNow }) {
26
25
  "Run now"
27
26
  ]
28
27
  }
29
- ) })
30
- ] }),
31
- hasDetails && /* @__PURE__ */ jsxs("details", { className: "group mt-3", children: [
32
- /* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground", children: [
33
- /* @__PURE__ */ jsx(Icon, { icon: UiChevronRight, className: "transition-transform group-open:rotate-90" }),
34
- "More details"
35
- ] }),
36
- /* @__PURE__ */ jsxs("div", { className: "mt-2 space-y-2 text-left font-mono text-xs", children: [
37
- (details.method || details.url || details.status) && /* @__PURE__ */ jsxs("div", { className: "text-muted-foreground", children: [
38
- details.method && /* @__PURE__ */ jsxs("span", { children: [
39
- details.method,
40
- " "
41
- ] }),
42
- details.url,
43
- details.status != null && /* @__PURE__ */ jsxs("span", { children: [
44
- " - ",
45
- details.status
46
- ] })
47
- ] }),
48
- details.responseBody && /* @__PURE__ */ jsx("pre", { className: "max-h-64 overflow-auto rounded-md bg-muted p-2 text-xs", children: details.responseBody })
49
- ] })
50
- ] })
51
- ] });
52
- }
53
- function getErrorDetails(error) {
54
- if (error == null || typeof error !== "object") return {};
55
- const record = error;
56
- const details = {};
57
- if (typeof record.method === "string") details.method = record.method;
58
- if (typeof record.url === "string") details.url = record.url;
59
- if (typeof record.status === "number") details.status = record.status;
60
- if (typeof record.responseBody === "string") details.responseBody = record.responseBody;
61
- return details;
28
+ )
29
+ }
30
+ );
62
31
  }
63
32
  export {
64
33
  InlineError