@flanksource/clicky-ui 0.3.27 → 0.3.28

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 (725) hide show
  1. package/NOTICE.md +14 -0
  2. package/dist/ai.cjs +52 -6
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +53 -7
  5. package/dist/ai.js.map +1 -1
  6. package/dist/comments/CommentCard.cjs +24 -39
  7. package/dist/comments/CommentCard.cjs.map +1 -1
  8. package/dist/comments/CommentCard.d.ts +9 -2
  9. package/dist/comments/CommentCard.d.ts.map +1 -1
  10. package/dist/comments/CommentCard.js +24 -39
  11. package/dist/comments/CommentCard.js.map +1 -1
  12. package/dist/comments/CommentProvider.cjs +4 -3
  13. package/dist/comments/CommentProvider.cjs.map +1 -1
  14. package/dist/comments/CommentProvider.d.ts +6 -1
  15. package/dist/comments/CommentProvider.d.ts.map +1 -1
  16. package/dist/comments/CommentProvider.js +4 -3
  17. package/dist/comments/CommentProvider.js.map +1 -1
  18. package/dist/comments/CommentSidePanel.cjs +65 -52
  19. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  20. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  21. package/dist/comments/CommentSidePanel.js +67 -54
  22. package/dist/comments/CommentSidePanel.js.map +1 -1
  23. package/dist/comments/CommentThread.cjs +2 -2
  24. package/dist/comments/CommentThread.cjs.map +1 -1
  25. package/dist/comments/CommentThread.d.ts +3 -3
  26. package/dist/comments/CommentThread.d.ts.map +1 -1
  27. package/dist/comments/CommentThread.js +2 -2
  28. package/dist/comments/CommentThread.js.map +1 -1
  29. package/dist/comments/CommentThreadList.cjs +85 -37
  30. package/dist/comments/CommentThreadList.cjs.map +1 -1
  31. package/dist/comments/CommentThreadList.d.ts +3 -3
  32. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  33. package/dist/comments/CommentThreadList.js +86 -38
  34. package/dist/comments/CommentThreadList.js.map +1 -1
  35. package/dist/comments/comment-utils.cjs +26 -0
  36. package/dist/comments/comment-utils.cjs.map +1 -1
  37. package/dist/comments/comment-utils.d.ts +11 -0
  38. package/dist/comments/comment-utils.d.ts.map +1 -1
  39. package/dist/comments/comment-utils.js +26 -0
  40. package/dist/comments/comment-utils.js.map +1 -1
  41. package/dist/comments.cjs +2 -0
  42. package/dist/comments.cjs.map +1 -1
  43. package/dist/comments.js +3 -1
  44. package/dist/components/AccordionList.cjs +3 -0
  45. package/dist/components/AccordionList.cjs.map +1 -1
  46. package/dist/components/AccordionList.d.ts +3 -1
  47. package/dist/components/AccordionList.d.ts.map +1 -1
  48. package/dist/components/AccordionList.js +3 -0
  49. package/dist/components/AccordionList.js.map +1 -1
  50. package/dist/components/CopyButton.cjs +35 -0
  51. package/dist/components/CopyButton.cjs.map +1 -0
  52. package/dist/components/CopyButton.d.ts +20 -0
  53. package/dist/components/CopyButton.d.ts.map +1 -0
  54. package/dist/components/CopyButton.js +35 -0
  55. package/dist/components/CopyButton.js.map +1 -0
  56. package/dist/components/FilterBar.cjs +29 -6
  57. package/dist/components/FilterBar.cjs.map +1 -1
  58. package/dist/components/FilterBar.d.ts +10 -1
  59. package/dist/components/FilterBar.d.ts.map +1 -1
  60. package/dist/components/FilterBar.js +29 -6
  61. package/dist/components/FilterBar.js.map +1 -1
  62. package/dist/components/ListMenu.cjs +4 -1
  63. package/dist/components/ListMenu.cjs.map +1 -1
  64. package/dist/components/ListMenu.d.ts +5 -1
  65. package/dist/components/ListMenu.d.ts.map +1 -1
  66. package/dist/components/ListMenu.js +4 -1
  67. package/dist/components/ListMenu.js.map +1 -1
  68. package/dist/components/SegmentedControl.cjs +4 -2
  69. package/dist/components/SegmentedControl.cjs.map +1 -1
  70. package/dist/components/SegmentedControl.d.ts +4 -0
  71. package/dist/components/SegmentedControl.d.ts.map +1 -1
  72. package/dist/components/SegmentedControl.js +4 -2
  73. package/dist/components/SegmentedControl.js.map +1 -1
  74. package/dist/components/clipboard.cjs +60 -0
  75. package/dist/components/clipboard.cjs.map +1 -0
  76. package/dist/components/clipboard.d.ts +13 -0
  77. package/dist/components/clipboard.d.ts.map +1 -0
  78. package/dist/components/clipboard.js +60 -0
  79. package/dist/components/clipboard.js.map +1 -0
  80. package/dist/components/json-schema-form-array.cjs +15 -1
  81. package/dist/components/json-schema-form-array.cjs.map +1 -1
  82. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  83. package/dist/components/json-schema-form-array.js +15 -1
  84. package/dist/components/json-schema-form-array.js.map +1 -1
  85. package/dist/components/json-schema-form-list-array.cjs +113 -0
  86. package/dist/components/json-schema-form-list-array.cjs.map +1 -0
  87. package/dist/components/json-schema-form-list-array.d.ts +7 -0
  88. package/dist/components/json-schema-form-list-array.d.ts.map +1 -0
  89. package/dist/components/json-schema-form-list-array.js +113 -0
  90. package/dist/components/json-schema-form-list-array.js.map +1 -0
  91. package/dist/components/json-schema-form-resolve.cjs +1 -1
  92. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  93. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  94. package/dist/components/json-schema-form-resolve.js +1 -1
  95. package/dist/components/json-schema-form-resolve.js.map +1 -1
  96. package/dist/components/json-schema-form-types.d.ts +1 -1
  97. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  98. package/dist/components.cjs +5 -0
  99. package/dist/components.cjs.map +1 -1
  100. package/dist/components.d.ts +2 -0
  101. package/dist/components.d.ts.map +1 -1
  102. package/dist/components.js +5 -0
  103. package/dist/components.js.map +1 -1
  104. package/dist/data/Clicky.cjs +4 -1
  105. package/dist/data/Clicky.cjs.map +1 -1
  106. package/dist/data/Clicky.js +4 -1
  107. package/dist/data/Clicky.js.map +1 -1
  108. package/dist/data/DataTable.cjs +202 -40
  109. package/dist/data/DataTable.cjs.map +1 -1
  110. package/dist/data/DataTable.d.ts +163 -3
  111. package/dist/data/DataTable.d.ts.map +1 -1
  112. package/dist/data/DataTable.js +202 -40
  113. package/dist/data/DataTable.js.map +1 -1
  114. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.cjs +1 -1
  115. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.cjs.map +1 -1
  116. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.js +1 -1
  117. package/dist/data/FixtureEditor/FixtureFrontmatterDialog.js.map +1 -1
  118. package/dist/data/FixtureEditor/fixture-frontmatter.cjs +8 -10
  119. package/dist/data/FixtureEditor/fixture-frontmatter.cjs.map +1 -1
  120. package/dist/data/FixtureEditor/fixture-frontmatter.d.ts.map +1 -1
  121. package/dist/data/FixtureEditor/fixture-frontmatter.js +8 -10
  122. package/dist/data/FixtureEditor/fixture-frontmatter.js.map +1 -1
  123. package/dist/data/SelectionActionBar.cjs +242 -0
  124. package/dist/data/SelectionActionBar.cjs.map +1 -0
  125. package/dist/data/SelectionActionBar.d.ts +28 -0
  126. package/dist/data/SelectionActionBar.d.ts.map +1 -0
  127. package/dist/data/SelectionActionBar.js +242 -0
  128. package/dist/data/SelectionActionBar.js.map +1 -0
  129. package/dist/data/TaskManager.cjs +34 -12
  130. package/dist/data/TaskManager.cjs.map +1 -1
  131. package/dist/data/TaskManager.d.ts.map +1 -1
  132. package/dist/data/TaskManager.js +34 -12
  133. package/dist/data/TaskManager.js.map +1 -1
  134. package/dist/data/TaskManagerButton.cjs +11 -7
  135. package/dist/data/TaskManagerButton.cjs.map +1 -1
  136. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  137. package/dist/data/TaskManagerButton.js +11 -7
  138. package/dist/data/TaskManagerButton.js.map +1 -1
  139. package/dist/data/TaskProgress.cjs +55 -11
  140. package/dist/data/TaskProgress.cjs.map +1 -1
  141. package/dist/data/TaskProgress.d.ts.map +1 -1
  142. package/dist/data/TaskProgress.js +53 -9
  143. package/dist/data/TaskProgress.js.map +1 -1
  144. package/dist/data/ai/ChatWindow.cjs +2 -4
  145. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  146. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  147. package/dist/data/ai/ChatWindow.js +2 -4
  148. package/dist/data/ai/ChatWindow.js.map +1 -1
  149. package/dist/data/ai/ChatWindow.runtime.cjs +1 -2
  150. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -1
  151. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -1
  152. package/dist/data/ai/ChatWindow.runtime.js +1 -2
  153. package/dist/data/ai/ChatWindow.runtime.js.map +1 -1
  154. package/dist/data/ai/PromptCatalog/PromptCatalogTable.cjs +262 -0
  155. package/dist/data/ai/PromptCatalog/PromptCatalogTable.cjs.map +1 -0
  156. package/dist/data/ai/PromptCatalog/PromptCatalogTable.d.ts +16 -0
  157. package/dist/data/ai/PromptCatalog/PromptCatalogTable.d.ts.map +1 -0
  158. package/dist/data/ai/PromptCatalog/PromptCatalogTable.js +262 -0
  159. package/dist/data/ai/PromptCatalog/PromptCatalogTable.js.map +1 -0
  160. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs +77 -0
  161. package/dist/data/ai/PromptCatalog/PromptLayerStrip.cjs.map +1 -0
  162. package/dist/data/ai/PromptCatalog/PromptLayerStrip.d.ts +8 -0
  163. package/dist/data/ai/PromptCatalog/PromptLayerStrip.d.ts.map +1 -0
  164. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js +77 -0
  165. package/dist/data/ai/PromptCatalog/PromptLayerStrip.js.map +1 -0
  166. package/dist/data/ai/PromptCatalog/PromptPage.cjs +332 -0
  167. package/dist/data/ai/PromptCatalog/PromptPage.cjs.map +1 -0
  168. package/dist/data/ai/PromptCatalog/PromptPage.d.ts +17 -0
  169. package/dist/data/ai/PromptCatalog/PromptPage.d.ts.map +1 -0
  170. package/dist/data/ai/PromptCatalog/PromptPage.js +332 -0
  171. package/dist/data/ai/PromptCatalog/PromptPage.js.map +1 -0
  172. package/dist/data/ai/PromptCatalog/PromptPageEditor.cjs +102 -0
  173. package/dist/data/ai/PromptCatalog/PromptPageEditor.cjs.map +1 -0
  174. package/dist/data/ai/PromptCatalog/PromptPageEditor.d.ts +16 -0
  175. package/dist/data/ai/PromptCatalog/PromptPageEditor.d.ts.map +1 -0
  176. package/dist/data/ai/PromptCatalog/PromptPageEditor.js +102 -0
  177. package/dist/data/ai/PromptCatalog/PromptPageEditor.js.map +1 -0
  178. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs +102 -0
  179. package/dist/data/ai/PromptCatalog/PromptPageHeader.cjs.map +1 -0
  180. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +10 -0
  181. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts.map +1 -0
  182. package/dist/data/ai/PromptCatalog/PromptPageHeader.js +102 -0
  183. package/dist/data/ai/PromptCatalog/PromptPageHeader.js.map +1 -0
  184. package/dist/data/ai/PromptCatalog/PromptPagePreview.cjs +90 -0
  185. package/dist/data/ai/PromptCatalog/PromptPagePreview.cjs.map +1 -0
  186. package/dist/data/ai/PromptCatalog/PromptPagePreview.d.ts +8 -0
  187. package/dist/data/ai/PromptCatalog/PromptPagePreview.d.ts.map +1 -0
  188. package/dist/data/ai/PromptCatalog/PromptPagePreview.js +90 -0
  189. package/dist/data/ai/PromptCatalog/PromptPagePreview.js.map +1 -0
  190. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs +168 -0
  191. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.cjs.map +1 -0
  192. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts +17 -0
  193. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.d.ts.map +1 -0
  194. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js +168 -0
  195. package/dist/data/ai/PromptCatalog/PromptPageSaveBar.js.map +1 -0
  196. package/dist/data/ai/PromptCatalog/PromptSourceBadge.cjs +36 -0
  197. package/dist/data/ai/PromptCatalog/PromptSourceBadge.cjs.map +1 -0
  198. package/dist/data/ai/PromptCatalog/PromptSourceBadge.d.ts +7 -0
  199. package/dist/data/ai/PromptCatalog/PromptSourceBadge.d.ts.map +1 -0
  200. package/dist/data/ai/PromptCatalog/PromptSourceBadge.js +36 -0
  201. package/dist/data/ai/PromptCatalog/PromptSourceBadge.js.map +1 -0
  202. package/dist/data/ai/PromptCatalog/index.d.ts +9 -0
  203. package/dist/data/ai/PromptCatalog/index.d.ts.map +1 -0
  204. package/dist/data/ai/PromptCatalog/prompt-catalog-model.cjs +137 -0
  205. package/dist/data/ai/PromptCatalog/prompt-catalog-model.cjs.map +1 -0
  206. package/dist/data/ai/PromptCatalog/prompt-catalog-model.d.ts +28 -0
  207. package/dist/data/ai/PromptCatalog/prompt-catalog-model.d.ts.map +1 -0
  208. package/dist/data/ai/PromptCatalog/prompt-catalog-model.js +137 -0
  209. package/dist/data/ai/PromptCatalog/prompt-catalog-model.js.map +1 -0
  210. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs +114 -0
  211. package/dist/data/ai/PromptCatalog/prompt-page-model.cjs.map +1 -0
  212. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts +45 -0
  213. package/dist/data/ai/PromptCatalog/prompt-page-model.d.ts.map +1 -0
  214. package/dist/data/ai/PromptCatalog/prompt-page-model.js +114 -0
  215. package/dist/data/ai/PromptCatalog/prompt-page-model.js.map +1 -0
  216. package/dist/data/ai/PromptCatalog/types.d.ts +70 -0
  217. package/dist/data/ai/PromptCatalog/types.d.ts.map +1 -0
  218. package/dist/data/ai/PromptPicker/PromptPicker.cjs +9 -12
  219. package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
  220. package/dist/data/ai/PromptPicker/PromptPicker.js +9 -12
  221. package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
  222. package/dist/data/ai/PromptPicker/index.d.ts +1 -1
  223. package/dist/data/ai/PromptPicker/index.d.ts.map +1 -1
  224. package/dist/data/ai/PromptPicker/types.cjs.map +1 -1
  225. package/dist/data/ai/PromptPicker/types.d.ts +9 -0
  226. package/dist/data/ai/PromptPicker/types.d.ts.map +1 -1
  227. package/dist/data/ai/PromptPicker/types.js.map +1 -1
  228. package/dist/data/ai/PromptRunEditor/index.cjs +2 -2
  229. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  230. package/dist/data/ai/PromptRunEditor/index.js +3 -3
  231. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  232. package/dist/data/ai/PromptRunEditor/model.cjs +0 -1
  233. package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -1
  234. package/dist/data/ai/PromptRunEditor/model.d.ts +1 -1
  235. package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -1
  236. package/dist/data/ai/PromptRunEditor/model.js +0 -1
  237. package/dist/data/ai/PromptRunEditor/model.js.map +1 -1
  238. package/dist/data/ai/RuntimeModePicker.cjs +15 -6
  239. package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
  240. package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
  241. package/dist/data/ai/RuntimeModePicker.js +17 -8
  242. package/dist/data/ai/RuntimeModePicker.js.map +1 -1
  243. package/dist/data/ai/SessionInspector.collection-types.d.ts +1 -1
  244. package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
  245. package/dist/data/ai/SessionInspector.collection.cjs +3 -3
  246. package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
  247. package/dist/data/ai/SessionInspector.collection.js +3 -3
  248. package/dist/data/ai/SessionInspector.collection.js.map +1 -1
  249. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  250. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  251. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  252. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  253. package/dist/data/ai/SessionInspector.model.cjs +3 -3
  254. package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
  255. package/dist/data/ai/SessionInspector.model.d.ts +1 -1
  256. package/dist/data/ai/SessionInspector.model.d.ts.map +1 -1
  257. package/dist/data/ai/SessionInspector.model.js +3 -3
  258. package/dist/data/ai/SessionInspector.model.js.map +1 -1
  259. package/dist/data/ai/SessionInspector.panels.cjs +1 -1
  260. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
  261. package/dist/data/ai/SessionInspector.panels.js +1 -1
  262. package/dist/data/ai/SessionInspector.panels.js.map +1 -1
  263. package/dist/data/ai/SessionInspector.summary.cjs +3 -3
  264. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
  265. package/dist/data/ai/SessionInspector.summary.js +3 -3
  266. package/dist/data/ai/SessionInspector.summary.js.map +1 -1
  267. package/dist/data/ai/SessionViewer.fixtures.d.ts.map +1 -1
  268. package/dist/data/ai/SessionViewer.unified.d.ts +3 -2
  269. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  270. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs +18 -30
  271. package/dist/data/ai/SpecRuntimeEditor/CommitSection.cjs.map +1 -1
  272. package/dist/data/ai/SpecRuntimeEditor/CommitSection.d.ts.map +1 -1
  273. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js +19 -31
  274. package/dist/data/ai/SpecRuntimeEditor/CommitSection.js.map +1 -1
  275. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.cjs +71 -86
  276. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.cjs.map +1 -1
  277. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.d.ts.map +1 -1
  278. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.js +72 -87
  279. package/dist/data/ai/SpecRuntimeEditor/EnvironmentSection.js.map +1 -1
  280. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.cjs +99 -0
  281. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.cjs.map +1 -0
  282. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.d.ts +13 -0
  283. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.d.ts.map +1 -0
  284. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.js +99 -0
  285. package/dist/data/ai/SpecRuntimeEditor/ModelContextAdvanced.js.map +1 -0
  286. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +34 -23
  287. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  288. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +6 -2
  289. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  290. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +35 -24
  291. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  292. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs +114 -0
  293. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.cjs.map +1 -0
  294. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.d.ts +10 -0
  295. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.d.ts.map +1 -0
  296. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js +114 -0
  297. package/dist/data/ai/SpecRuntimeEditor/PermissionModeField.js.map +1 -0
  298. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.cjs +160 -0
  299. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.cjs.map +1 -0
  300. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.d.ts +9 -0
  301. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.d.ts.map +1 -0
  302. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.js +160 -0
  303. package/dist/data/ai/SpecRuntimeEditor/PermissionPolicyList.js.map +1 -0
  304. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.cjs +27 -241
  305. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.cjs.map +1 -1
  306. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.d.ts +5 -6
  307. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.d.ts.map +1 -1
  308. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.js +25 -239
  309. package/dist/data/ai/SpecRuntimeEditor/PermissionsSection.js.map +1 -1
  310. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +21 -8
  311. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
  312. package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts +4 -1
  313. package/dist/data/ai/SpecRuntimeEditor/PromptSection.d.ts.map +1 -1
  314. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +22 -9
  315. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
  316. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.cjs +207 -164
  317. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.cjs.map +1 -1
  318. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.d.ts +4 -3
  319. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.d.ts.map +1 -1
  320. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.js +210 -167
  321. package/dist/data/ai/SpecRuntimeEditor/SandboxSection.js.map +1 -1
  322. package/dist/data/ai/SpecRuntimeEditor/SectionCard.cjs +15 -15
  323. package/dist/data/ai/SpecRuntimeEditor/SectionCard.cjs.map +1 -1
  324. package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts.map +1 -1
  325. package/dist/data/ai/SpecRuntimeEditor/SectionCard.js +15 -15
  326. package/dist/data/ai/SpecRuntimeEditor/SectionCard.js.map +1 -1
  327. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs +120 -42
  328. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.cjs.map +1 -1
  329. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts +4 -1
  330. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.d.ts.map +1 -1
  331. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js +123 -45
  332. package/dist/data/ai/SpecRuntimeEditor/WorkspaceSection.js.map +1 -1
  333. package/dist/data/ai/SpecRuntimeEditor/env-model.cjs.map +1 -1
  334. package/dist/data/ai/SpecRuntimeEditor/env-model.d.ts.map +1 -1
  335. package/dist/data/ai/SpecRuntimeEditor/env-model.js.map +1 -1
  336. package/dist/data/ai/SpecRuntimeEditor/index.cjs +136 -48
  337. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  338. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +13 -3
  339. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  340. package/dist/data/ai/SpecRuntimeEditor/index.js +137 -49
  341. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  342. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs +93 -0
  343. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.cjs.map +1 -0
  344. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.d.ts +6 -0
  345. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.d.ts.map +1 -0
  346. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js +93 -0
  347. package/dist/data/ai/SpecRuntimeEditor/permission-mode-visuals.js.map +1 -0
  348. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.cjs +35 -0
  349. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.cjs.map +1 -0
  350. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.d.ts +5 -0
  351. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.d.ts.map +1 -0
  352. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.js +35 -0
  353. package/dist/data/ai/SpecRuntimeEditor/permission-preset-storage.js.map +1 -0
  354. package/dist/data/ai/SpecRuntimeEditor/presets.cjs +2 -9
  355. package/dist/data/ai/SpecRuntimeEditor/presets.cjs.map +1 -1
  356. package/dist/data/ai/SpecRuntimeEditor/presets.d.ts +1 -2
  357. package/dist/data/ai/SpecRuntimeEditor/presets.d.ts.map +1 -1
  358. package/dist/data/ai/SpecRuntimeEditor/presets.js +2 -9
  359. package/dist/data/ai/SpecRuntimeEditor/presets.js.map +1 -1
  360. package/dist/data/ai/SpecRuntimeEditor/summaries.cjs.map +1 -1
  361. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts +1 -1
  362. package/dist/data/ai/SpecRuntimeEditor/summaries.d.ts.map +1 -1
  363. package/dist/data/ai/SpecRuntimeEditor/summaries.js.map +1 -1
  364. package/dist/data/ai/SpecRuntimeEditor/types.cjs +2 -7
  365. package/dist/data/ai/SpecRuntimeEditor/types.cjs.map +1 -1
  366. package/dist/data/ai/SpecRuntimeEditor/types.d.ts +0 -1
  367. package/dist/data/ai/SpecRuntimeEditor/types.d.ts.map +1 -1
  368. package/dist/data/ai/SpecRuntimeEditor/types.js +3 -8
  369. package/dist/data/ai/SpecRuntimeEditor/types.js.map +1 -1
  370. package/dist/data/ai/SpecRuntimeEditor/update.cjs +43 -33
  371. package/dist/data/ai/SpecRuntimeEditor/update.cjs.map +1 -1
  372. package/dist/data/ai/SpecRuntimeEditor/update.d.ts +7 -13
  373. package/dist/data/ai/SpecRuntimeEditor/update.d.ts.map +1 -1
  374. package/dist/data/ai/SpecRuntimeEditor/update.js +43 -33
  375. package/dist/data/ai/SpecRuntimeEditor/update.js.map +1 -1
  376. package/dist/data/ai/SpecRuntimeEditor.model.cjs +33 -49
  377. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  378. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +52 -29
  379. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  380. package/dist/data/ai/SpecRuntimeEditor.model.js +33 -48
  381. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  382. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.cjs +276 -0
  383. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.cjs.map +1 -0
  384. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.d.ts +58 -0
  385. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.d.ts.map +1 -0
  386. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.js +276 -0
  387. package/dist/data/ai/SpecRuntimeEditor.sandbox-model.js.map +1 -0
  388. package/dist/data/ai/ThreadPicker.cjs +55 -42
  389. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  390. package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
  391. package/dist/data/ai/ThreadPicker.js +56 -43
  392. package/dist/data/ai/ThreadPicker.js.map +1 -1
  393. package/dist/data/ai/ToolPreferences.cjs +9 -1
  394. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  395. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  396. package/dist/data/ai/ToolPreferences.js +9 -1
  397. package/dist/data/ai/ToolPreferences.js.map +1 -1
  398. package/dist/data/ai/ToolSchemaBrowser.cjs +41 -487
  399. package/dist/data/ai/ToolSchemaBrowser.cjs.map +1 -1
  400. package/dist/data/ai/ToolSchemaBrowser.d.ts +7 -2
  401. package/dist/data/ai/ToolSchemaBrowser.d.ts.map +1 -1
  402. package/dist/data/ai/ToolSchemaBrowser.detail.cjs +238 -0
  403. package/dist/data/ai/ToolSchemaBrowser.detail.cjs.map +1 -0
  404. package/dist/data/ai/ToolSchemaBrowser.detail.d.ts +8 -0
  405. package/dist/data/ai/ToolSchemaBrowser.detail.d.ts.map +1 -0
  406. package/dist/data/ai/ToolSchemaBrowser.detail.js +238 -0
  407. package/dist/data/ai/ToolSchemaBrowser.detail.js.map +1 -0
  408. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs +57 -0
  409. package/dist/data/ai/ToolSchemaBrowser.directory-header.cjs.map +1 -0
  410. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts +9 -0
  411. package/dist/data/ai/ToolSchemaBrowser.directory-header.d.ts.map +1 -0
  412. package/dist/data/ai/ToolSchemaBrowser.directory-header.js +57 -0
  413. package/dist/data/ai/ToolSchemaBrowser.directory-header.js.map +1 -0
  414. package/dist/data/ai/ToolSchemaBrowser.js +42 -488
  415. package/dist/data/ai/ToolSchemaBrowser.js.map +1 -1
  416. package/dist/data/ai/ToolSchemaBrowser.model.cjs +130 -0
  417. package/dist/data/ai/ToolSchemaBrowser.model.cjs.map +1 -0
  418. package/dist/data/ai/ToolSchemaBrowser.model.d.ts +35 -0
  419. package/dist/data/ai/ToolSchemaBrowser.model.d.ts.map +1 -0
  420. package/dist/data/ai/ToolSchemaBrowser.model.js +130 -0
  421. package/dist/data/ai/ToolSchemaBrowser.model.js.map +1 -0
  422. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs +57 -0
  423. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.cjs.map +1 -0
  424. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts +7 -0
  425. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.d.ts.map +1 -0
  426. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js +57 -0
  427. package/dist/data/ai/ToolSchemaBrowser.selection-toolbar.js.map +1 -0
  428. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs +389 -0
  429. package/dist/data/ai/ToolSchemaBrowser.sidebar.cjs.map +1 -0
  430. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts +23 -0
  431. package/dist/data/ai/ToolSchemaBrowser.sidebar.d.ts.map +1 -0
  432. package/dist/data/ai/ToolSchemaBrowser.sidebar.js +389 -0
  433. package/dist/data/ai/ToolSchemaBrowser.sidebar.js.map +1 -0
  434. package/dist/data/ai/agent-action-icons.cjs +14 -6
  435. package/dist/data/ai/agent-action-icons.cjs.map +1 -1
  436. package/dist/data/ai/agent-action-icons.d.ts.map +1 -1
  437. package/dist/data/ai/agent-action-icons.js +14 -6
  438. package/dist/data/ai/agent-action-icons.js.map +1 -1
  439. package/dist/data/ai/examples/sessions/claude-complete.cjs +17 -9
  440. package/dist/data/ai/examples/sessions/claude-complete.cjs.map +1 -1
  441. package/dist/data/ai/examples/sessions/claude-complete.d.ts.map +1 -1
  442. package/dist/data/ai/examples/sessions/claude-complete.js +17 -9
  443. package/dist/data/ai/examples/sessions/claude-complete.js.map +1 -1
  444. package/dist/data/ai/examples/sessions/claude.cjs +7 -4
  445. package/dist/data/ai/examples/sessions/claude.cjs.map +1 -1
  446. package/dist/data/ai/examples/sessions/claude.d.ts.map +1 -1
  447. package/dist/data/ai/examples/sessions/claude.js +7 -4
  448. package/dist/data/ai/examples/sessions/claude.js.map +1 -1
  449. package/dist/data/ai/examples/sessions/codex-complete.cjs +17 -10
  450. package/dist/data/ai/examples/sessions/codex-complete.cjs.map +1 -1
  451. package/dist/data/ai/examples/sessions/codex-complete.d.ts.map +1 -1
  452. package/dist/data/ai/examples/sessions/codex-complete.js +17 -10
  453. package/dist/data/ai/examples/sessions/codex-complete.js.map +1 -1
  454. package/dist/data/ai/examples/sessions/codex.cjs +7 -4
  455. package/dist/data/ai/examples/sessions/codex.cjs.map +1 -1
  456. package/dist/data/ai/examples/sessions/codex.d.ts.map +1 -1
  457. package/dist/data/ai/examples/sessions/codex.js +7 -4
  458. package/dist/data/ai/examples/sessions/codex.js.map +1 -1
  459. package/dist/data/ai/index.d.ts +6 -3
  460. package/dist/data/ai/index.d.ts.map +1 -1
  461. package/dist/data/ai/runtime-profile.cjs +93 -0
  462. package/dist/data/ai/runtime-profile.cjs.map +1 -0
  463. package/dist/data/ai/runtime-profile.d.ts +73 -0
  464. package/dist/data/ai/runtime-profile.d.ts.map +1 -0
  465. package/dist/data/ai/runtime-profile.js +93 -0
  466. package/dist/data/ai/runtime-profile.js.map +1 -0
  467. package/dist/data/ai/sandbox-kind-meta.cjs +38 -4
  468. package/dist/data/ai/sandbox-kind-meta.cjs.map +1 -1
  469. package/dist/data/ai/sandbox-kind-meta.d.ts +3 -0
  470. package/dist/data/ai/sandbox-kind-meta.d.ts.map +1 -1
  471. package/dist/data/ai/sandbox-kind-meta.js +38 -4
  472. package/dist/data/ai/sandbox-kind-meta.js.map +1 -1
  473. package/dist/data/chat/Chat.cjs +13 -3
  474. package/dist/data/chat/Chat.cjs.map +1 -1
  475. package/dist/data/chat/Chat.d.ts.map +1 -1
  476. package/dist/data/chat/Chat.fixtures.cjs +3 -3
  477. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  478. package/dist/data/chat/Chat.fixtures.js +3 -3
  479. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  480. package/dist/data/chat/Chat.js +14 -4
  481. package/dist/data/chat/Chat.js.map +1 -1
  482. package/dist/data/chat/Chat.runtime.cjs +4 -9
  483. package/dist/data/chat/Chat.runtime.cjs.map +1 -1
  484. package/dist/data/chat/Chat.runtime.d.ts.map +1 -1
  485. package/dist/data/chat/Chat.runtime.js +4 -9
  486. package/dist/data/chat/Chat.runtime.js.map +1 -1
  487. package/dist/data/chat/ChatRuntimeToolbar.cjs +5 -5
  488. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
  489. package/dist/data/chat/ChatRuntimeToolbar.js +5 -5
  490. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
  491. package/dist/data/chat/ContextMeter.cjs +3 -3
  492. package/dist/data/chat/ContextMeter.cjs.map +1 -1
  493. package/dist/data/chat/ContextMeter.d.ts +3 -3
  494. package/dist/data/chat/ContextMeter.d.ts.map +1 -1
  495. package/dist/data/chat/ContextMeter.js +3 -3
  496. package/dist/data/chat/ContextMeter.js.map +1 -1
  497. package/dist/data/chat/approval.cjs.map +1 -1
  498. package/dist/data/chat/approval.d.ts +21 -1
  499. package/dist/data/chat/approval.d.ts.map +1 -1
  500. package/dist/data/chat/approval.js.map +1 -1
  501. package/dist/data/chat/clickyOperationsToTools.cjs +5 -0
  502. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  503. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  504. package/dist/data/chat/clickyOperationsToTools.js +5 -0
  505. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  506. package/dist/data/chat/types.cjs.map +1 -1
  507. package/dist/data/chat/types.d.ts +7 -5
  508. package/dist/data/chat/types.d.ts.map +1 -1
  509. package/dist/data/chat/types.js.map +1 -1
  510. package/dist/data/chat/usage-snapshot.cjs +21 -1
  511. package/dist/data/chat/usage-snapshot.cjs.map +1 -1
  512. package/dist/data/chat/usage-snapshot.d.ts +2 -0
  513. package/dist/data/chat/usage-snapshot.d.ts.map +1 -1
  514. package/dist/data/chat/usage-snapshot.js +22 -2
  515. package/dist/data/chat/usage-snapshot.js.map +1 -1
  516. package/dist/data/runtime/RuntimeBar.cjs +29 -16
  517. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  518. package/dist/data/runtime/RuntimeBar.d.ts +10 -2
  519. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  520. package/dist/data/runtime/RuntimeBar.js +31 -18
  521. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  522. package/dist/data/runtime/RuntimeBar.model.cjs +10 -20
  523. package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -1
  524. package/dist/data/runtime/RuntimeBar.model.d.ts +2 -2
  525. package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -1
  526. package/dist/data/runtime/RuntimeBar.model.js +11 -21
  527. package/dist/data/runtime/RuntimeBar.model.js.map +1 -1
  528. package/dist/data/runtime/RuntimeBarCombo.cjs +11 -6
  529. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -1
  530. package/dist/data/runtime/RuntimeBarCombo.d.ts +3 -1
  531. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -1
  532. package/dist/data/runtime/RuntimeBarCombo.js +11 -6
  533. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -1
  534. package/dist/data/runtime/RuntimeBarSegments.cjs +7 -5
  535. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -1
  536. package/dist/data/runtime/RuntimeBarSegments.d.ts +4 -2
  537. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -1
  538. package/dist/data/runtime/RuntimeBarSegments.js +7 -5
  539. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -1
  540. package/dist/data/runtime/model-capabilities.cjs +0 -3
  541. package/dist/data/runtime/model-capabilities.cjs.map +1 -1
  542. package/dist/data/runtime/model-capabilities.d.ts +0 -1
  543. package/dist/data/runtime/model-capabilities.d.ts.map +1 -1
  544. package/dist/data/runtime/model-capabilities.js +0 -3
  545. package/dist/data/runtime/model-capabilities.js.map +1 -1
  546. package/dist/data/runtime/provider-status.cjs +1 -1
  547. package/dist/data/runtime/provider-status.cjs.map +1 -1
  548. package/dist/data/runtime/provider-status.js +1 -1
  549. package/dist/data/runtime/provider-status.js.map +1 -1
  550. package/dist/data/runtime/runtime-field-support.cjs +63 -0
  551. package/dist/data/runtime/runtime-field-support.cjs.map +1 -0
  552. package/dist/data/runtime/runtime-field-support.d.ts +13 -0
  553. package/dist/data/runtime/runtime-field-support.d.ts.map +1 -0
  554. package/dist/data/runtime/runtime-field-support.js +63 -0
  555. package/dist/data/runtime/runtime-field-support.js.map +1 -0
  556. package/dist/data/runtime/runtime-mode.cjs +158 -116
  557. package/dist/data/runtime/runtime-mode.cjs.map +1 -1
  558. package/dist/data/runtime/runtime-mode.d.ts +57 -19
  559. package/dist/data/runtime/runtime-mode.d.ts.map +1 -1
  560. package/dist/data/runtime/runtime-mode.js +158 -116
  561. package/dist/data/runtime/runtime-mode.js.map +1 -1
  562. package/dist/data/selectionActionSplit.cjs +33 -0
  563. package/dist/data/selectionActionSplit.cjs.map +1 -0
  564. package/dist/data/selectionActionSplit.d.ts +36 -0
  565. package/dist/data/selectionActionSplit.d.ts.map +1 -0
  566. package/dist/data/selectionActionSplit.js +33 -0
  567. package/dist/data/selectionActionSplit.js.map +1 -0
  568. package/dist/data/task-copy.cjs +76 -0
  569. package/dist/data/task-copy.cjs.map +1 -0
  570. package/dist/data/task-copy.d.ts +12 -0
  571. package/dist/data/task-copy.d.ts.map +1 -0
  572. package/dist/data/task-copy.js +76 -0
  573. package/dist/data/task-copy.js.map +1 -0
  574. package/dist/data/version-info.cjs +3 -3
  575. package/dist/data/version-info.js +3 -3
  576. package/dist/data.cjs +34 -0
  577. package/dist/data.cjs.map +1 -1
  578. package/dist/data.d.ts +4 -1
  579. package/dist/data.d.ts.map +1 -1
  580. package/dist/data.js +34 -0
  581. package/dist/data.js.map +1 -1
  582. package/dist/hooks/use-task-run.cjs +24 -17
  583. package/dist/hooks/use-task-run.cjs.map +1 -1
  584. package/dist/hooks/use-task-run.d.ts +3 -1
  585. package/dist/hooks/use-task-run.d.ts.map +1 -1
  586. package/dist/hooks/use-task-run.js +25 -18
  587. package/dist/hooks/use-task-run.js.map +1 -1
  588. package/dist/icons/components/UiCalendarCheck.cjs +15 -0
  589. package/dist/icons/components/UiCalendarCheck.cjs.map +1 -0
  590. package/dist/icons/components/UiCalendarCheck.d.ts +15 -0
  591. package/dist/icons/components/UiCalendarCheck.d.ts.map +1 -0
  592. package/dist/icons/components/UiCalendarCheck.js +15 -0
  593. package/dist/icons/components/UiCalendarCheck.js.map +1 -0
  594. package/dist/icons/components/UiChartLineUp.cjs +15 -0
  595. package/dist/icons/components/UiChartLineUp.cjs.map +1 -0
  596. package/dist/icons/components/UiChartLineUp.d.ts +15 -0
  597. package/dist/icons/components/UiChartLineUp.d.ts.map +1 -0
  598. package/dist/icons/components/UiChartLineUp.js +15 -0
  599. package/dist/icons/components/UiChartLineUp.js.map +1 -0
  600. package/dist/icons/components/UiClockCountdown.cjs +15 -0
  601. package/dist/icons/components/UiClockCountdown.cjs.map +1 -0
  602. package/dist/icons/components/UiClockCountdown.d.ts +15 -0
  603. package/dist/icons/components/UiClockCountdown.d.ts.map +1 -0
  604. package/dist/icons/components/UiClockCountdown.js +15 -0
  605. package/dist/icons/components/UiClockCountdown.js.map +1 -0
  606. package/dist/icons/components/UiFactory.cjs +15 -0
  607. package/dist/icons/components/UiFactory.cjs.map +1 -0
  608. package/dist/icons/components/UiFactory.d.ts +15 -0
  609. package/dist/icons/components/UiFactory.d.ts.map +1 -0
  610. package/dist/icons/components/UiFactory.js +15 -0
  611. package/dist/icons/components/UiFactory.js.map +1 -0
  612. package/dist/icons/components/UiHandCoins.cjs +15 -0
  613. package/dist/icons/components/UiHandCoins.cjs.map +1 -0
  614. package/dist/icons/components/UiHandCoins.d.ts +15 -0
  615. package/dist/icons/components/UiHandCoins.d.ts.map +1 -0
  616. package/dist/icons/components/UiHandCoins.js +15 -0
  617. package/dist/icons/components/UiHandCoins.js.map +1 -0
  618. package/dist/icons/components/UiInvoice.cjs +15 -0
  619. package/dist/icons/components/UiInvoice.cjs.map +1 -0
  620. package/dist/icons/components/UiInvoice.d.ts +15 -0
  621. package/dist/icons/components/UiInvoice.d.ts.map +1 -0
  622. package/dist/icons/components/UiInvoice.js +15 -0
  623. package/dist/icons/components/UiInvoice.js.map +1 -0
  624. package/dist/icons/components/UiTax.cjs +15 -0
  625. package/dist/icons/components/UiTax.cjs.map +1 -0
  626. package/dist/icons/components/UiTax.d.ts +15 -0
  627. package/dist/icons/components/UiTax.d.ts.map +1 -0
  628. package/dist/icons/components/UiTax.js +15 -0
  629. package/dist/icons/components/UiTax.js.map +1 -0
  630. package/dist/icons/index.d.ts +14 -0
  631. package/dist/icons/index.d.ts.map +1 -1
  632. package/dist/icons/registry.cjs +14 -0
  633. package/dist/icons/registry.cjs.map +1 -1
  634. package/dist/icons/registry.d.ts.map +1 -1
  635. package/dist/icons/registry.js +14 -0
  636. package/dist/icons/registry.js.map +1 -1
  637. package/dist/icons.cjs +21 -0
  638. package/dist/icons.cjs.map +1 -1
  639. package/dist/icons.js +21 -0
  640. package/dist/icons.js.map +1 -1
  641. package/dist/index.cjs +43 -0
  642. package/dist/index.cjs.map +1 -1
  643. package/dist/index.js +44 -1
  644. package/dist/index.js.map +1 -1
  645. package/dist/layout/AppShell.cjs +17 -3
  646. package/dist/layout/AppShell.cjs.map +1 -1
  647. package/dist/layout/AppShell.d.ts.map +1 -1
  648. package/dist/layout/AppShell.js +17 -3
  649. package/dist/layout/AppShell.js.map +1 -1
  650. package/dist/overlay/DropdownMenu.cjs +46 -35
  651. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  652. package/dist/overlay/DropdownMenu.js +46 -35
  653. package/dist/overlay/DropdownMenu.js.map +1 -1
  654. package/dist/rpc/FilterForm.cjs +26 -11
  655. package/dist/rpc/FilterForm.cjs.map +1 -1
  656. package/dist/rpc/FilterForm.d.ts +4 -1
  657. package/dist/rpc/FilterForm.d.ts.map +1 -1
  658. package/dist/rpc/FilterForm.js +26 -11
  659. package/dist/rpc/FilterForm.js.map +1 -1
  660. package/dist/rpc/FilterFormFields.cjs +3 -2
  661. package/dist/rpc/FilterFormFields.cjs.map +1 -1
  662. package/dist/rpc/FilterFormFields.d.ts +2 -1
  663. package/dist/rpc/FilterFormFields.d.ts.map +1 -1
  664. package/dist/rpc/FilterFormFields.js +3 -2
  665. package/dist/rpc/FilterFormFields.js.map +1 -1
  666. package/dist/rpc/OperationActionBar.cjs +67 -15
  667. package/dist/rpc/OperationActionBar.cjs.map +1 -1
  668. package/dist/rpc/OperationActionBar.d.ts +11 -3
  669. package/dist/rpc/OperationActionBar.d.ts.map +1 -1
  670. package/dist/rpc/OperationActionBar.js +68 -16
  671. package/dist/rpc/OperationActionBar.js.map +1 -1
  672. package/dist/rpc/OperationCatalog.cjs +69 -76
  673. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  674. package/dist/rpc/OperationCatalog.d.ts +3 -1
  675. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  676. package/dist/rpc/OperationCatalog.js +69 -76
  677. package/dist/rpc/OperationCatalog.js.map +1 -1
  678. package/dist/rpc/OperationCatalogActions.cjs +69 -0
  679. package/dist/rpc/OperationCatalogActions.cjs.map +1 -0
  680. package/dist/rpc/OperationCatalogActions.d.ts +17 -0
  681. package/dist/rpc/OperationCatalogActions.d.ts.map +1 -0
  682. package/dist/rpc/OperationCatalogActions.js +69 -0
  683. package/dist/rpc/OperationCatalogActions.js.map +1 -0
  684. package/dist/rpc/OperationEntityContextPicker.cjs +129 -116
  685. package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
  686. package/dist/rpc/OperationEntityContextPicker.d.ts +18 -1
  687. package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
  688. package/dist/rpc/OperationEntityContextPicker.js +130 -117
  689. package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
  690. package/dist/rpc/OperationResultView.cjs +7 -4
  691. package/dist/rpc/OperationResultView.cjs.map +1 -1
  692. package/dist/rpc/OperationResultView.d.ts +4 -2
  693. package/dist/rpc/OperationResultView.d.ts.map +1 -1
  694. package/dist/rpc/OperationResultView.js +7 -4
  695. package/dist/rpc/OperationResultView.js.map +1 -1
  696. package/dist/rpc/operationCatalogUrl.cjs +28 -0
  697. package/dist/rpc/operationCatalogUrl.cjs.map +1 -0
  698. package/dist/rpc/operationCatalogUrl.d.ts +3 -0
  699. package/dist/rpc/operationCatalogUrl.d.ts.map +1 -0
  700. package/dist/rpc/operationCatalogUrl.js +28 -0
  701. package/dist/rpc/operationCatalogUrl.js.map +1 -0
  702. package/dist/rpc/rowNavigation.cjs +4 -3
  703. package/dist/rpc/rowNavigation.cjs.map +1 -1
  704. package/dist/rpc/rowNavigation.d.ts +1 -1
  705. package/dist/rpc/rowNavigation.d.ts.map +1 -1
  706. package/dist/rpc/rowNavigation.js +4 -3
  707. package/dist/rpc/rowNavigation.js.map +1 -1
  708. package/dist/rpc/types.cjs.map +1 -1
  709. package/dist/rpc/types.d.ts +2 -2
  710. package/dist/rpc/types.d.ts.map +1 -1
  711. package/dist/rpc/types.js.map +1 -1
  712. package/dist/rpc.cjs +2 -0
  713. package/dist/rpc.cjs.map +1 -1
  714. package/dist/rpc.d.ts +2 -1
  715. package/dist/rpc.d.ts.map +1 -1
  716. package/dist/rpc.js +2 -0
  717. package/dist/rpc.js.map +1 -1
  718. package/dist/runtime-profile.cjs +7 -0
  719. package/dist/runtime-profile.cjs.map +1 -0
  720. package/dist/runtime-profile.d.ts +2 -0
  721. package/dist/runtime-profile.d.ts.map +1 -0
  722. package/dist/runtime-profile.js +7 -0
  723. package/dist/runtime-profile.js.map +1 -0
  724. package/dist/styles.css +1 -1
  725. package/package.json +6 -1
@@ -0,0 +1,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const button = require("../components/button.cjs");
6
+ const DropdownMenu = require("../overlay/DropdownMenu.cjs");
7
+ const Modal = require("../overlay/Modal.cjs");
8
+ const Icon = require("./Icon.cjs");
9
+ const selectionActionSplit = require("./selectionActionSplit.cjs");
10
+ const UiChevronDown = require("../icons/components/UiChevronDown.cjs");
11
+ const UiEllipsis = require("../icons/components/UiEllipsis.cjs");
12
+ function SelectionCountNotice({
13
+ count,
14
+ onClear
15
+ }) {
16
+ return /* @__PURE__ */ jsxRuntime.jsxs(
17
+ "div",
18
+ {
19
+ role: "status",
20
+ "data-testid": "data-table-selection-count",
21
+ className: "flex flex-wrap items-center gap-density-2 text-xs text-muted-foreground",
22
+ children: [
23
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "font-medium text-foreground", children: [
24
+ count.toLocaleString(),
25
+ " selected"
26
+ ] }),
27
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "outline", size: "sm", onClick: onClear, children: "Clear selection" })
28
+ ]
29
+ }
30
+ );
31
+ }
32
+ const DEFAULT_CANCEL_LABEL = "Cancel";
33
+ function SelectionConfirmModal({
34
+ action,
35
+ context,
36
+ onCancel,
37
+ onConfirm
38
+ }) {
39
+ const options = typeof action.confirm === "object" ? action.confirm : {};
40
+ const count = context.selectedRowIds.length;
41
+ const message = typeof options.message === "function" ? options.message(context) : options.message ?? `This will apply to ${count.toLocaleString()} selected ${count === 1 ? "row" : "rows"}.`;
42
+ const confirmLabel = options.confirmLabel ?? (typeof action.label === "string" ? action.label : "Confirm");
43
+ return /* @__PURE__ */ jsxRuntime.jsx(
44
+ Modal.Modal,
45
+ {
46
+ open: true,
47
+ size: "sm",
48
+ expandable: false,
49
+ onClose: onCancel,
50
+ title: options.title ?? action.label,
51
+ footer: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex justify-end gap-density-2", children: [
52
+ /* @__PURE__ */ jsxRuntime.jsx(button.Button, { type: "button", variant: "ghost", size: "sm", onClick: onCancel, children: options.cancelLabel ?? DEFAULT_CANCEL_LABEL }),
53
+ /* @__PURE__ */ jsxRuntime.jsx(
54
+ button.Button,
55
+ {
56
+ type: "button",
57
+ size: "sm",
58
+ variant: action.variant === "destructive" ? "destructive" : "default",
59
+ onClick: onConfirm,
60
+ children: confirmLabel
61
+ }
62
+ )
63
+ ] }),
64
+ children: /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: message })
65
+ }
66
+ );
67
+ }
68
+ function SelectionActionBar({
69
+ actions,
70
+ context,
71
+ showCount = true,
72
+ maxButtons,
73
+ className
74
+ }) {
75
+ const [pendingActionId, setPendingActionId] = react.useState(null);
76
+ const [confirming, setConfirming] = react.useState(
77
+ null
78
+ );
79
+ const running = react.useRef(false);
80
+ const run = react.useCallback(
81
+ (action) => {
82
+ if (running.current || action.disabled) return;
83
+ running.current = true;
84
+ setPendingActionId(action.id);
85
+ const settle = () => {
86
+ running.current = false;
87
+ setPendingActionId(null);
88
+ };
89
+ let result;
90
+ try {
91
+ result = action.onSelect(context);
92
+ } catch (error) {
93
+ settle();
94
+ throw error;
95
+ }
96
+ if (result instanceof Promise) void result.finally(settle);
97
+ else settle();
98
+ },
99
+ [context]
100
+ );
101
+ const begin = react.useCallback(
102
+ (action) => {
103
+ if (action.confirm) setConfirming(action);
104
+ else run(action);
105
+ },
106
+ [run]
107
+ );
108
+ const { menus, buttons, overflow } = selectionActionSplit.splitSelectionActions(actions, {
109
+ maxButtons
110
+ });
111
+ const inline = [...menus, ...buttons];
112
+ const busy = pendingActionId !== null;
113
+ const pendingOverflow = overflow.find(
114
+ (action) => action.id === pendingActionId
115
+ );
116
+ const toMenuItem = (action) => {
117
+ var _a;
118
+ return {
119
+ label: action.label,
120
+ onSelect: () => begin(action),
121
+ disabled: action.disabled || busy,
122
+ ...action.icon ? { icon: action.icon } : {},
123
+ ...action.section !== void 0 ? { group: action.section } : {},
124
+ ...((_a = action.children) == null ? void 0 : _a.length) ? { children: action.children.map(toMenuItem) } : {}
125
+ };
126
+ };
127
+ const bySection = /* @__PURE__ */ new Map();
128
+ for (const action of overflow) {
129
+ const key = action.section ?? "";
130
+ const existing = bySection.get(key);
131
+ if (existing) existing.push(action);
132
+ else bySection.set(key, [action]);
133
+ }
134
+ const overflowItems = [...bySection.values()].flat().map(toMenuItem);
135
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
136
+ showCount ? /* @__PURE__ */ jsxRuntime.jsx(
137
+ SelectionCountNotice,
138
+ {
139
+ count: context.selectedRowIds.length,
140
+ onClear: context.clearSelection
141
+ }
142
+ ) : null,
143
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className, children: [
144
+ inline.map((action) => {
145
+ const pending = pendingActionId === action.id;
146
+ const isMenu = menus.includes(action);
147
+ const trigger = /* @__PURE__ */ jsxRuntime.jsxs(
148
+ button.Button,
149
+ {
150
+ type: "button",
151
+ size: "sm",
152
+ variant: action.variant ?? "outline",
153
+ disabled: action.disabled || busy && !pending,
154
+ loading: pending,
155
+ ...isMenu ? { "aria-haspopup": "menu" } : { onClick: () => begin(action) },
156
+ children: [
157
+ action.icon && !pending ? /* @__PURE__ */ jsxRuntime.jsx(
158
+ Icon.Icon,
159
+ {
160
+ icon: action.icon,
161
+ ...action.iconClassName ? { className: action.iconClassName } : {}
162
+ }
163
+ ) : null,
164
+ pending && action.pendingLabel !== void 0 ? action.pendingLabel : action.label,
165
+ isMenu ? /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiChevronDown.UiChevronDown }) : null
166
+ ]
167
+ }
168
+ );
169
+ if (!isMenu) {
170
+ return /* @__PURE__ */ jsxRuntime.jsx("span", { children: trigger }, action.id);
171
+ }
172
+ const body = action.menu ? {
173
+ children: (closeMenu) => action.menu({
174
+ context,
175
+ close: closeMenu,
176
+ busy,
177
+ // Work started inside a custom body is still this action's
178
+ // work: routing it through `run` is what puts the spinner
179
+ // on this trigger and locks the siblings, instead of the
180
+ // bar sitting idle while a bulk call is in flight.
181
+ run: (task) => begin({
182
+ ...action,
183
+ ...task.pendingLabel !== void 0 ? { pendingLabel: task.pendingLabel } : {},
184
+ ...task.confirm !== void 0 ? { confirm: task.confirm } : {},
185
+ onSelect: task.onSelect
186
+ })
187
+ })
188
+ } : { items: (action.children ?? []).map(toMenuItem) };
189
+ return /* @__PURE__ */ jsxRuntime.jsx(
190
+ DropdownMenu.DropdownMenu,
191
+ {
192
+ align: "left",
193
+ menuLabel: typeof action.label === "string" ? action.label : action.id,
194
+ trigger,
195
+ ...body
196
+ },
197
+ action.id
198
+ );
199
+ }),
200
+ overflow.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx(
201
+ DropdownMenu.DropdownMenu,
202
+ {
203
+ align: "right",
204
+ menuLabel: "Selection actions",
205
+ items: overflowItems,
206
+ trigger: /* @__PURE__ */ jsxRuntime.jsxs(
207
+ button.Button,
208
+ {
209
+ type: "button",
210
+ size: "sm",
211
+ variant: "outline",
212
+ "aria-haspopup": "menu",
213
+ "aria-label": "More selection actions",
214
+ disabled: busy && !pendingOverflow,
215
+ loading: !!pendingOverflow,
216
+ children: [
217
+ pendingOverflow ? null : /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiEllipsis.UiEllipsis }),
218
+ "More",
219
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiChevronDown.UiChevronDown })
220
+ ]
221
+ }
222
+ )
223
+ }
224
+ ) : null
225
+ ] }),
226
+ confirming ? /* @__PURE__ */ jsxRuntime.jsx(
227
+ SelectionConfirmModal,
228
+ {
229
+ action: confirming,
230
+ context,
231
+ onCancel: () => setConfirming(null),
232
+ onConfirm: () => {
233
+ const action = confirming;
234
+ setConfirming(null);
235
+ run(action);
236
+ }
237
+ }
238
+ ) : null
239
+ ] });
240
+ }
241
+ exports.SelectionActionBar = SelectionActionBar;
242
+ //# sourceMappingURL=SelectionActionBar.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionActionBar.cjs","sources":["../../src/data/SelectionActionBar.tsx"],"sourcesContent":["import { useCallback, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { DropdownMenu, type DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { Modal } from \"../overlay/Modal\";\nimport { UiChevronDown, UiEllipsis } from \"../icons\";\nimport { Icon } from \"./Icon\";\nimport type {\n DataTableSelectionAction,\n DataTableSelectionConfirm,\n DataTableSelectionContext,\n} from \"./DataTable\";\n// The placement rules live beside this file rather than in it: they are pure\n// functions over descriptors, and a module that exports both components and\n// helpers loses fast refresh for the component.\nimport { splitSelectionActions } from \"./selectionActionSplit\";\n\n/**\n * The count and the way out of it. `SelectionScopeNotice` says the same thing\n * in more words once a cross-page scope is in play, so exactly one of the two\n * ever renders — a toolbar that states the count twice reads as two selections.\n */\nfunction SelectionCountNotice({\n count,\n onClear,\n}: {\n count: number;\n onClear: () => void;\n}) {\n return (\n <div\n role=\"status\"\n data-testid=\"data-table-selection-count\"\n className=\"flex flex-wrap items-center gap-density-2 text-xs text-muted-foreground\"\n >\n <span className=\"font-medium text-foreground\">\n {count.toLocaleString()} selected\n </span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClear}>\n Clear selection\n </Button>\n </div>\n );\n}\n\nconst DEFAULT_CANCEL_LABEL = \"Cancel\";\n\n/**\n * Confirmation goes through Modal rather than a popover of its own: Modal owns\n * focus trapping, the escape layer and the overlay z-index stack, and this\n * library should have one answer to \"are you sure\".\n */\nfunction SelectionConfirmModal<T extends Record<string, unknown>>({\n action,\n context,\n onCancel,\n onConfirm,\n}: {\n action: DataTableSelectionAction<T>;\n context: DataTableSelectionContext<T>;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n // `confirm: true` and `confirm: false` both mean \"no copy supplied\"; only an\n // object customises the prompt.\n const options: DataTableSelectionConfirm<T> =\n typeof action.confirm === \"object\" ? action.confirm : {};\n const count = context.selectedRowIds.length;\n const message =\n typeof options.message === \"function\"\n ? options.message(context)\n : (options.message ??\n `This will apply to ${count.toLocaleString()} selected ${\n count === 1 ? \"row\" : \"rows\"\n }.`);\n const confirmLabel =\n options.confirmLabel ??\n (typeof action.label === \"string\" ? action.label : \"Confirm\");\n\n return (\n <Modal\n open\n size=\"sm\"\n expandable={false}\n onClose={onCancel}\n title={options.title ?? action.label}\n footer={\n <div className=\"flex justify-end gap-density-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {options.cancelLabel ?? DEFAULT_CANCEL_LABEL}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={\n action.variant === \"destructive\" ? \"destructive\" : \"default\"\n }\n onClick={onConfirm}\n >\n {confirmLabel}\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </Modal>\n );\n}\n\nexport type SelectionActionBarProps<T extends Record<string, unknown>> = {\n actions: DataTableSelectionAction<T>[];\n context: DataTableSelectionContext<T>;\n /**\n * Render the `{n} selected` count and Clear. False when something else is\n * already stating them — DataTable's cross-page scope notice, say.\n */\n showCount?: boolean;\n /**\n * How many plain buttons stay on the row before the rest collapse. Named\n * dropdowns are never capped — they are what the bar is for.\n */\n maxButtons?: number;\n className?: string;\n};\n\n/**\n * The bulk-action cluster a table renders for itself when `selectionActions` is\n * a list. It owns the three things every caller was otherwise re-deriving: what\n * the selection is, which actions are worth a button, and the fact that a bulk\n * call is a request that can still be in flight.\n *\n * It takes only a descriptor list and a selection context, so a list that is\n * not a table — a hand-rolled sidebar of rows, say — can render the identical\n * toolbar rather than growing a second one that drifts.\n */\nexport function SelectionActionBar<T extends Record<string, unknown>>({\n actions,\n context,\n showCount = true,\n maxButtons,\n className,\n}: SelectionActionBarProps<T>) {\n const [pendingActionId, setPendingActionId] = useState<string | null>(null);\n const [confirming, setConfirming] = useState<DataTableSelectionAction<T> | null>(\n null,\n );\n const running = useRef(false);\n\n // A bulk action is a request: it can be slow, it can fail, and it must not be\n // sent twice. Failure is the caller's to report — this component's only\n // obligation is to stop claiming the action is still running.\n const run = useCallback(\n (action: DataTableSelectionAction<T>) => {\n if (running.current || action.disabled) return;\n running.current = true;\n setPendingActionId(action.id);\n const settle = () => {\n running.current = false;\n setPendingActionId(null);\n };\n let result: void | Promise<void>;\n try {\n result = action.onSelect(context);\n } catch (error) {\n settle();\n throw error;\n }\n // A synchronous action settles in the same batch it started, so it never\n // paints a spinner — which is right: there was nothing to wait for.\n if (result instanceof Promise) void result.finally(settle);\n else settle();\n },\n [context],\n );\n\n const begin = useCallback(\n (action: DataTableSelectionAction<T>) => {\n // Confirm first, run second. The prompt is modal rather than a popover\n // because the click that opens it is the last one the reader gets back.\n if (action.confirm) setConfirming(action);\n else run(action);\n },\n [run],\n );\n\n const { menus, buttons, overflow } = splitSelectionActions(actions, {\n maxButtons,\n });\n const inline = [...menus, ...buttons];\n const busy = pendingActionId !== null;\n const pendingOverflow = overflow.find(\n (action) => action.id === pendingActionId,\n );\n\n // Every sibling locks while one action runs. The rows underneath are already\n // being rewritten, and a second bulk call against a selection that is halfway\n // through changing is the one nobody can put back.\n const toMenuItem = (action: DataTableSelectionAction<T>): DropdownMenuItem => ({\n label: action.label,\n onSelect: () => begin(action),\n disabled: action.disabled || busy,\n ...(action.icon ? { icon: action.icon } : {}),\n ...(action.section !== undefined ? { group: action.section } : {}),\n ...(action.children?.length\n ? { children: action.children.map(toMenuItem) }\n : {}),\n });\n\n // Grouped so DropdownMenu's contiguous-group headings land on the right rows:\n // it renders a heading above the first item of each run and expects the\n // caller to have grouped them.\n //\n // Sections keep the order they first appear in, and items keep theirs within\n // a section. Sorting alphabetically would also make the groups contiguous,\n // but it would silently reorder the caller's list — and a caller that put its\n // destructive action last would find a section named \"Danger\" sorted to the\n // top of the menu, directly under the cursor.\n const bySection = new Map<string, DataTableSelectionAction<T>[]>();\n for (const action of overflow) {\n const key = action.section ?? \"\";\n const existing = bySection.get(key);\n if (existing) existing.push(action);\n else bySection.set(key, [action]);\n }\n const overflowItems = [...bySection.values()].flat().map(toMenuItem);\n\n return (\n <>\n {showCount ? (\n <SelectionCountNotice\n count={context.selectedRowIds.length}\n onClear={context.clearSelection}\n />\n ) : null}\n <span className={className}>\n {inline.map((action) => {\n const pending = pendingActionId === action.id;\n const isMenu = menus.includes(action);\n const trigger = (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? \"outline\"}\n disabled={action.disabled || (busy && !pending)}\n loading={pending}\n {...(isMenu\n ? { \"aria-haspopup\": \"menu\" as const }\n : { onClick: () => begin(action) })}\n >\n {/* The spinner takes the icon's place rather than sitting beside it. */}\n {action.icon && !pending ? (\n <Icon\n icon={action.icon}\n {...(action.iconClassName\n ? { className: action.iconClassName }\n : {})}\n />\n ) : null}\n {pending && action.pendingLabel !== undefined\n ? action.pendingLabel\n : action.label}\n {isMenu ? <Icon icon={UiChevronDown} /> : null}\n </Button>\n );\n\n if (!isMenu) {\n return <span key={action.id}>{trigger}</span>;\n }\n\n // The trigger only opens the menu; the write is whichever value the\n // reader picks inside it. `menu` and `children` are the two bodies a\n // caller can supply, and DropdownMenu already renders both — one as\n // items, one as its own render prop — so nothing here re-implements a\n // menu.\n const body = action.menu\n ? {\n children: (closeMenu: () => void) =>\n action.menu!({\n context,\n close: closeMenu,\n busy,\n // Work started inside a custom body is still this action's\n // work: routing it through `run` is what puts the spinner\n // on this trigger and locks the siblings, instead of the\n // bar sitting idle while a bulk call is in flight.\n run: (task) =>\n begin({\n ...action,\n ...(task.pendingLabel !== undefined\n ? { pendingLabel: task.pendingLabel }\n : {}),\n ...(task.confirm !== undefined\n ? { confirm: task.confirm }\n : {}),\n onSelect: task.onSelect,\n }),\n }),\n }\n : { items: (action.children ?? []).map(toMenuItem) };\n\n return (\n <DropdownMenu\n key={action.id}\n align=\"left\"\n menuLabel={\n typeof action.label === \"string\" ? action.label : action.id\n }\n trigger={trigger}\n {...body}\n />\n );\n })}\n {overflow.length > 0 ? (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Selection actions\"\n items={overflowItems}\n trigger={\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n aria-haspopup=\"menu\"\n aria-label=\"More selection actions\"\n // A menu action that is running has no row of its own to report\n // from, so the trigger it came out of reports for it.\n disabled={busy && !pendingOverflow}\n loading={!!pendingOverflow}\n >\n {pendingOverflow ? null : <Icon icon={UiEllipsis} />}\n More\n <Icon icon={UiChevronDown} />\n </Button>\n }\n />\n ) : null}\n </span>\n {confirming ? (\n <SelectionConfirmModal\n action={confirming}\n context={context}\n onCancel={() => setConfirming(null)}\n onConfirm={() => {\n const action = confirming;\n setConfirming(null);\n run(action);\n }}\n />\n ) : null}\n </>\n );\n}\n"],"names":["jsxs","jsx","Button","Modal","useState","useRef","useCallback","splitSelectionActions","Fragment","Icon","UiChevronDown","DropdownMenu","UiEllipsis"],"mappings":"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"}
@@ -0,0 +1,28 @@
1
+ import { DataTableSelectionAction, DataTableSelectionContext } from './DataTable';
2
+ export type SelectionActionBarProps<T extends Record<string, unknown>> = {
3
+ actions: DataTableSelectionAction<T>[];
4
+ context: DataTableSelectionContext<T>;
5
+ /**
6
+ * Render the `{n} selected` count and Clear. False when something else is
7
+ * already stating them — DataTable's cross-page scope notice, say.
8
+ */
9
+ showCount?: boolean;
10
+ /**
11
+ * How many plain buttons stay on the row before the rest collapse. Named
12
+ * dropdowns are never capped — they are what the bar is for.
13
+ */
14
+ maxButtons?: number;
15
+ className?: string;
16
+ };
17
+ /**
18
+ * The bulk-action cluster a table renders for itself when `selectionActions` is
19
+ * a list. It owns the three things every caller was otherwise re-deriving: what
20
+ * the selection is, which actions are worth a button, and the fact that a bulk
21
+ * call is a request that can still be in flight.
22
+ *
23
+ * It takes only a descriptor list and a selection context, so a list that is
24
+ * not a table — a hand-rolled sidebar of rows, say — can render the identical
25
+ * toolbar rather than growing a second one that drifts.
26
+ */
27
+ export declare function SelectionActionBar<T extends Record<string, unknown>>({ actions, context, showCount, maxButtons, className, }: SelectionActionBarProps<T>): import("react/jsx-runtime").JSX.Element;
28
+ //# sourceMappingURL=SelectionActionBar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionActionBar.d.ts","sourceRoot":"","sources":["../../src/data/SelectionActionBar.tsx"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,wBAAwB,EAExB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAkGrB,MAAM,MAAM,uBAAuB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI;IACvE,OAAO,EAAE,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC;IACvC,OAAO,EAAE,yBAAyB,CAAC,CAAC,CAAC,CAAC;IACtC;;;OAGG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EACpE,OAAO,EACP,OAAO,EACP,SAAgB,EAChB,UAAU,EACV,SAAS,GACV,EAAE,uBAAuB,CAAC,CAAC,CAAC,2CAkN5B"}
@@ -0,0 +1,242 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { useState, useRef, useCallback } from "react";
3
+ import { Button } from "../components/button.js";
4
+ import { DropdownMenu } from "../overlay/DropdownMenu.js";
5
+ import { Modal } from "../overlay/Modal.js";
6
+ import { Icon } from "./Icon.js";
7
+ import { splitSelectionActions } from "./selectionActionSplit.js";
8
+ import { UiChevronDown } from "../icons/components/UiChevronDown.js";
9
+ import { UiEllipsis } from "../icons/components/UiEllipsis.js";
10
+ function SelectionCountNotice({
11
+ count,
12
+ onClear
13
+ }) {
14
+ return /* @__PURE__ */ jsxs(
15
+ "div",
16
+ {
17
+ role: "status",
18
+ "data-testid": "data-table-selection-count",
19
+ className: "flex flex-wrap items-center gap-density-2 text-xs text-muted-foreground",
20
+ children: [
21
+ /* @__PURE__ */ jsxs("span", { className: "font-medium text-foreground", children: [
22
+ count.toLocaleString(),
23
+ " selected"
24
+ ] }),
25
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "outline", size: "sm", onClick: onClear, children: "Clear selection" })
26
+ ]
27
+ }
28
+ );
29
+ }
30
+ const DEFAULT_CANCEL_LABEL = "Cancel";
31
+ function SelectionConfirmModal({
32
+ action,
33
+ context,
34
+ onCancel,
35
+ onConfirm
36
+ }) {
37
+ const options = typeof action.confirm === "object" ? action.confirm : {};
38
+ const count = context.selectedRowIds.length;
39
+ const message = typeof options.message === "function" ? options.message(context) : options.message ?? `This will apply to ${count.toLocaleString()} selected ${count === 1 ? "row" : "rows"}.`;
40
+ const confirmLabel = options.confirmLabel ?? (typeof action.label === "string" ? action.label : "Confirm");
41
+ return /* @__PURE__ */ jsx(
42
+ Modal,
43
+ {
44
+ open: true,
45
+ size: "sm",
46
+ expandable: false,
47
+ onClose: onCancel,
48
+ title: options.title ?? action.label,
49
+ footer: /* @__PURE__ */ jsxs("div", { className: "flex justify-end gap-density-2", children: [
50
+ /* @__PURE__ */ jsx(Button, { type: "button", variant: "ghost", size: "sm", onClick: onCancel, children: options.cancelLabel ?? DEFAULT_CANCEL_LABEL }),
51
+ /* @__PURE__ */ jsx(
52
+ Button,
53
+ {
54
+ type: "button",
55
+ size: "sm",
56
+ variant: action.variant === "destructive" ? "destructive" : "default",
57
+ onClick: onConfirm,
58
+ children: confirmLabel
59
+ }
60
+ )
61
+ ] }),
62
+ children: /* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: message })
63
+ }
64
+ );
65
+ }
66
+ function SelectionActionBar({
67
+ actions,
68
+ context,
69
+ showCount = true,
70
+ maxButtons,
71
+ className
72
+ }) {
73
+ const [pendingActionId, setPendingActionId] = useState(null);
74
+ const [confirming, setConfirming] = useState(
75
+ null
76
+ );
77
+ const running = useRef(false);
78
+ const run = useCallback(
79
+ (action) => {
80
+ if (running.current || action.disabled) return;
81
+ running.current = true;
82
+ setPendingActionId(action.id);
83
+ const settle = () => {
84
+ running.current = false;
85
+ setPendingActionId(null);
86
+ };
87
+ let result;
88
+ try {
89
+ result = action.onSelect(context);
90
+ } catch (error) {
91
+ settle();
92
+ throw error;
93
+ }
94
+ if (result instanceof Promise) void result.finally(settle);
95
+ else settle();
96
+ },
97
+ [context]
98
+ );
99
+ const begin = useCallback(
100
+ (action) => {
101
+ if (action.confirm) setConfirming(action);
102
+ else run(action);
103
+ },
104
+ [run]
105
+ );
106
+ const { menus, buttons, overflow } = splitSelectionActions(actions, {
107
+ maxButtons
108
+ });
109
+ const inline = [...menus, ...buttons];
110
+ const busy = pendingActionId !== null;
111
+ const pendingOverflow = overflow.find(
112
+ (action) => action.id === pendingActionId
113
+ );
114
+ const toMenuItem = (action) => {
115
+ var _a;
116
+ return {
117
+ label: action.label,
118
+ onSelect: () => begin(action),
119
+ disabled: action.disabled || busy,
120
+ ...action.icon ? { icon: action.icon } : {},
121
+ ...action.section !== void 0 ? { group: action.section } : {},
122
+ ...((_a = action.children) == null ? void 0 : _a.length) ? { children: action.children.map(toMenuItem) } : {}
123
+ };
124
+ };
125
+ const bySection = /* @__PURE__ */ new Map();
126
+ for (const action of overflow) {
127
+ const key = action.section ?? "";
128
+ const existing = bySection.get(key);
129
+ if (existing) existing.push(action);
130
+ else bySection.set(key, [action]);
131
+ }
132
+ const overflowItems = [...bySection.values()].flat().map(toMenuItem);
133
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
134
+ showCount ? /* @__PURE__ */ jsx(
135
+ SelectionCountNotice,
136
+ {
137
+ count: context.selectedRowIds.length,
138
+ onClear: context.clearSelection
139
+ }
140
+ ) : null,
141
+ /* @__PURE__ */ jsxs("span", { className, children: [
142
+ inline.map((action) => {
143
+ const pending = pendingActionId === action.id;
144
+ const isMenu = menus.includes(action);
145
+ const trigger = /* @__PURE__ */ jsxs(
146
+ Button,
147
+ {
148
+ type: "button",
149
+ size: "sm",
150
+ variant: action.variant ?? "outline",
151
+ disabled: action.disabled || busy && !pending,
152
+ loading: pending,
153
+ ...isMenu ? { "aria-haspopup": "menu" } : { onClick: () => begin(action) },
154
+ children: [
155
+ action.icon && !pending ? /* @__PURE__ */ jsx(
156
+ Icon,
157
+ {
158
+ icon: action.icon,
159
+ ...action.iconClassName ? { className: action.iconClassName } : {}
160
+ }
161
+ ) : null,
162
+ pending && action.pendingLabel !== void 0 ? action.pendingLabel : action.label,
163
+ isMenu ? /* @__PURE__ */ jsx(Icon, { icon: UiChevronDown }) : null
164
+ ]
165
+ }
166
+ );
167
+ if (!isMenu) {
168
+ return /* @__PURE__ */ jsx("span", { children: trigger }, action.id);
169
+ }
170
+ const body = action.menu ? {
171
+ children: (closeMenu) => action.menu({
172
+ context,
173
+ close: closeMenu,
174
+ busy,
175
+ // Work started inside a custom body is still this action's
176
+ // work: routing it through `run` is what puts the spinner
177
+ // on this trigger and locks the siblings, instead of the
178
+ // bar sitting idle while a bulk call is in flight.
179
+ run: (task) => begin({
180
+ ...action,
181
+ ...task.pendingLabel !== void 0 ? { pendingLabel: task.pendingLabel } : {},
182
+ ...task.confirm !== void 0 ? { confirm: task.confirm } : {},
183
+ onSelect: task.onSelect
184
+ })
185
+ })
186
+ } : { items: (action.children ?? []).map(toMenuItem) };
187
+ return /* @__PURE__ */ jsx(
188
+ DropdownMenu,
189
+ {
190
+ align: "left",
191
+ menuLabel: typeof action.label === "string" ? action.label : action.id,
192
+ trigger,
193
+ ...body
194
+ },
195
+ action.id
196
+ );
197
+ }),
198
+ overflow.length > 0 ? /* @__PURE__ */ jsx(
199
+ DropdownMenu,
200
+ {
201
+ align: "right",
202
+ menuLabel: "Selection actions",
203
+ items: overflowItems,
204
+ trigger: /* @__PURE__ */ jsxs(
205
+ Button,
206
+ {
207
+ type: "button",
208
+ size: "sm",
209
+ variant: "outline",
210
+ "aria-haspopup": "menu",
211
+ "aria-label": "More selection actions",
212
+ disabled: busy && !pendingOverflow,
213
+ loading: !!pendingOverflow,
214
+ children: [
215
+ pendingOverflow ? null : /* @__PURE__ */ jsx(Icon, { icon: UiEllipsis }),
216
+ "More",
217
+ /* @__PURE__ */ jsx(Icon, { icon: UiChevronDown })
218
+ ]
219
+ }
220
+ )
221
+ }
222
+ ) : null
223
+ ] }),
224
+ confirming ? /* @__PURE__ */ jsx(
225
+ SelectionConfirmModal,
226
+ {
227
+ action: confirming,
228
+ context,
229
+ onCancel: () => setConfirming(null),
230
+ onConfirm: () => {
231
+ const action = confirming;
232
+ setConfirming(null);
233
+ run(action);
234
+ }
235
+ }
236
+ ) : null
237
+ ] });
238
+ }
239
+ export {
240
+ SelectionActionBar
241
+ };
242
+ //# sourceMappingURL=SelectionActionBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionActionBar.js","sources":["../../src/data/SelectionActionBar.tsx"],"sourcesContent":["import { useCallback, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { DropdownMenu, type DropdownMenuItem } from \"../overlay/DropdownMenu\";\nimport { Modal } from \"../overlay/Modal\";\nimport { UiChevronDown, UiEllipsis } from \"../icons\";\nimport { Icon } from \"./Icon\";\nimport type {\n DataTableSelectionAction,\n DataTableSelectionConfirm,\n DataTableSelectionContext,\n} from \"./DataTable\";\n// The placement rules live beside this file rather than in it: they are pure\n// functions over descriptors, and a module that exports both components and\n// helpers loses fast refresh for the component.\nimport { splitSelectionActions } from \"./selectionActionSplit\";\n\n/**\n * The count and the way out of it. `SelectionScopeNotice` says the same thing\n * in more words once a cross-page scope is in play, so exactly one of the two\n * ever renders — a toolbar that states the count twice reads as two selections.\n */\nfunction SelectionCountNotice({\n count,\n onClear,\n}: {\n count: number;\n onClear: () => void;\n}) {\n return (\n <div\n role=\"status\"\n data-testid=\"data-table-selection-count\"\n className=\"flex flex-wrap items-center gap-density-2 text-xs text-muted-foreground\"\n >\n <span className=\"font-medium text-foreground\">\n {count.toLocaleString()} selected\n </span>\n <Button type=\"button\" variant=\"outline\" size=\"sm\" onClick={onClear}>\n Clear selection\n </Button>\n </div>\n );\n}\n\nconst DEFAULT_CANCEL_LABEL = \"Cancel\";\n\n/**\n * Confirmation goes through Modal rather than a popover of its own: Modal owns\n * focus trapping, the escape layer and the overlay z-index stack, and this\n * library should have one answer to \"are you sure\".\n */\nfunction SelectionConfirmModal<T extends Record<string, unknown>>({\n action,\n context,\n onCancel,\n onConfirm,\n}: {\n action: DataTableSelectionAction<T>;\n context: DataTableSelectionContext<T>;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n // `confirm: true` and `confirm: false` both mean \"no copy supplied\"; only an\n // object customises the prompt.\n const options: DataTableSelectionConfirm<T> =\n typeof action.confirm === \"object\" ? action.confirm : {};\n const count = context.selectedRowIds.length;\n const message =\n typeof options.message === \"function\"\n ? options.message(context)\n : (options.message ??\n `This will apply to ${count.toLocaleString()} selected ${\n count === 1 ? \"row\" : \"rows\"\n }.`);\n const confirmLabel =\n options.confirmLabel ??\n (typeof action.label === \"string\" ? action.label : \"Confirm\");\n\n return (\n <Modal\n open\n size=\"sm\"\n expandable={false}\n onClose={onCancel}\n title={options.title ?? action.label}\n footer={\n <div className=\"flex justify-end gap-density-2\">\n <Button type=\"button\" variant=\"ghost\" size=\"sm\" onClick={onCancel}>\n {options.cancelLabel ?? DEFAULT_CANCEL_LABEL}\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant={\n action.variant === \"destructive\" ? \"destructive\" : \"default\"\n }\n onClick={onConfirm}\n >\n {confirmLabel}\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">{message}</p>\n </Modal>\n );\n}\n\nexport type SelectionActionBarProps<T extends Record<string, unknown>> = {\n actions: DataTableSelectionAction<T>[];\n context: DataTableSelectionContext<T>;\n /**\n * Render the `{n} selected` count and Clear. False when something else is\n * already stating them — DataTable's cross-page scope notice, say.\n */\n showCount?: boolean;\n /**\n * How many plain buttons stay on the row before the rest collapse. Named\n * dropdowns are never capped — they are what the bar is for.\n */\n maxButtons?: number;\n className?: string;\n};\n\n/**\n * The bulk-action cluster a table renders for itself when `selectionActions` is\n * a list. It owns the three things every caller was otherwise re-deriving: what\n * the selection is, which actions are worth a button, and the fact that a bulk\n * call is a request that can still be in flight.\n *\n * It takes only a descriptor list and a selection context, so a list that is\n * not a table — a hand-rolled sidebar of rows, say — can render the identical\n * toolbar rather than growing a second one that drifts.\n */\nexport function SelectionActionBar<T extends Record<string, unknown>>({\n actions,\n context,\n showCount = true,\n maxButtons,\n className,\n}: SelectionActionBarProps<T>) {\n const [pendingActionId, setPendingActionId] = useState<string | null>(null);\n const [confirming, setConfirming] = useState<DataTableSelectionAction<T> | null>(\n null,\n );\n const running = useRef(false);\n\n // A bulk action is a request: it can be slow, it can fail, and it must not be\n // sent twice. Failure is the caller's to report — this component's only\n // obligation is to stop claiming the action is still running.\n const run = useCallback(\n (action: DataTableSelectionAction<T>) => {\n if (running.current || action.disabled) return;\n running.current = true;\n setPendingActionId(action.id);\n const settle = () => {\n running.current = false;\n setPendingActionId(null);\n };\n let result: void | Promise<void>;\n try {\n result = action.onSelect(context);\n } catch (error) {\n settle();\n throw error;\n }\n // A synchronous action settles in the same batch it started, so it never\n // paints a spinner — which is right: there was nothing to wait for.\n if (result instanceof Promise) void result.finally(settle);\n else settle();\n },\n [context],\n );\n\n const begin = useCallback(\n (action: DataTableSelectionAction<T>) => {\n // Confirm first, run second. The prompt is modal rather than a popover\n // because the click that opens it is the last one the reader gets back.\n if (action.confirm) setConfirming(action);\n else run(action);\n },\n [run],\n );\n\n const { menus, buttons, overflow } = splitSelectionActions(actions, {\n maxButtons,\n });\n const inline = [...menus, ...buttons];\n const busy = pendingActionId !== null;\n const pendingOverflow = overflow.find(\n (action) => action.id === pendingActionId,\n );\n\n // Every sibling locks while one action runs. The rows underneath are already\n // being rewritten, and a second bulk call against a selection that is halfway\n // through changing is the one nobody can put back.\n const toMenuItem = (action: DataTableSelectionAction<T>): DropdownMenuItem => ({\n label: action.label,\n onSelect: () => begin(action),\n disabled: action.disabled || busy,\n ...(action.icon ? { icon: action.icon } : {}),\n ...(action.section !== undefined ? { group: action.section } : {}),\n ...(action.children?.length\n ? { children: action.children.map(toMenuItem) }\n : {}),\n });\n\n // Grouped so DropdownMenu's contiguous-group headings land on the right rows:\n // it renders a heading above the first item of each run and expects the\n // caller to have grouped them.\n //\n // Sections keep the order they first appear in, and items keep theirs within\n // a section. Sorting alphabetically would also make the groups contiguous,\n // but it would silently reorder the caller's list — and a caller that put its\n // destructive action last would find a section named \"Danger\" sorted to the\n // top of the menu, directly under the cursor.\n const bySection = new Map<string, DataTableSelectionAction<T>[]>();\n for (const action of overflow) {\n const key = action.section ?? \"\";\n const existing = bySection.get(key);\n if (existing) existing.push(action);\n else bySection.set(key, [action]);\n }\n const overflowItems = [...bySection.values()].flat().map(toMenuItem);\n\n return (\n <>\n {showCount ? (\n <SelectionCountNotice\n count={context.selectedRowIds.length}\n onClear={context.clearSelection}\n />\n ) : null}\n <span className={className}>\n {inline.map((action) => {\n const pending = pendingActionId === action.id;\n const isMenu = menus.includes(action);\n const trigger = (\n <Button\n type=\"button\"\n size=\"sm\"\n variant={action.variant ?? \"outline\"}\n disabled={action.disabled || (busy && !pending)}\n loading={pending}\n {...(isMenu\n ? { \"aria-haspopup\": \"menu\" as const }\n : { onClick: () => begin(action) })}\n >\n {/* The spinner takes the icon's place rather than sitting beside it. */}\n {action.icon && !pending ? (\n <Icon\n icon={action.icon}\n {...(action.iconClassName\n ? { className: action.iconClassName }\n : {})}\n />\n ) : null}\n {pending && action.pendingLabel !== undefined\n ? action.pendingLabel\n : action.label}\n {isMenu ? <Icon icon={UiChevronDown} /> : null}\n </Button>\n );\n\n if (!isMenu) {\n return <span key={action.id}>{trigger}</span>;\n }\n\n // The trigger only opens the menu; the write is whichever value the\n // reader picks inside it. `menu` and `children` are the two bodies a\n // caller can supply, and DropdownMenu already renders both — one as\n // items, one as its own render prop — so nothing here re-implements a\n // menu.\n const body = action.menu\n ? {\n children: (closeMenu: () => void) =>\n action.menu!({\n context,\n close: closeMenu,\n busy,\n // Work started inside a custom body is still this action's\n // work: routing it through `run` is what puts the spinner\n // on this trigger and locks the siblings, instead of the\n // bar sitting idle while a bulk call is in flight.\n run: (task) =>\n begin({\n ...action,\n ...(task.pendingLabel !== undefined\n ? { pendingLabel: task.pendingLabel }\n : {}),\n ...(task.confirm !== undefined\n ? { confirm: task.confirm }\n : {}),\n onSelect: task.onSelect,\n }),\n }),\n }\n : { items: (action.children ?? []).map(toMenuItem) };\n\n return (\n <DropdownMenu\n key={action.id}\n align=\"left\"\n menuLabel={\n typeof action.label === \"string\" ? action.label : action.id\n }\n trigger={trigger}\n {...body}\n />\n );\n })}\n {overflow.length > 0 ? (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Selection actions\"\n items={overflowItems}\n trigger={\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n aria-haspopup=\"menu\"\n aria-label=\"More selection actions\"\n // A menu action that is running has no row of its own to report\n // from, so the trigger it came out of reports for it.\n disabled={busy && !pendingOverflow}\n loading={!!pendingOverflow}\n >\n {pendingOverflow ? null : <Icon icon={UiEllipsis} />}\n More\n <Icon icon={UiChevronDown} />\n </Button>\n }\n />\n ) : null}\n </span>\n {confirming ? (\n <SelectionConfirmModal\n action={confirming}\n context={context}\n onCancel={() => setConfirming(null)}\n onConfirm={() => {\n const action = confirming;\n setConfirming(null);\n run(action);\n }}\n />\n ) : null}\n </>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -50,6 +50,7 @@ function TaskManager({
50
50
  for (const r of runs) if (r.kind) set.add(r.kind);
51
51
  return [...set].sort();
52
52
  }, [runs]);
53
+ const applications = react.useMemo(() => groupRunsByApplication(runs), [runs]);
53
54
  return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("space-y-3", className), children: [
54
55
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
55
56
  !kind && /* @__PURE__ */ jsxRuntime.jsxs(
@@ -82,20 +83,41 @@ function TaskManager({
82
83
  ),
83
84
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-xs text-muted-foreground", children: status })
84
85
  ] }),
85
- runs.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-dashed p-6 text-center text-sm text-muted-foreground", children: "No background tasks." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-lg border bg-card", children: runs.map((run) => /* @__PURE__ */ jsxRuntime.jsx(
86
- RunRow,
87
- {
88
- run,
89
- basePath,
90
- pollMs,
91
- selectedId,
92
- onSelectRun,
93
- runsQueryKey
94
- },
95
- run.id
96
- )) })
86
+ runs.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "rounded-lg border border-dashed p-6 text-center text-sm text-muted-foreground", children: "No background tasks." }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: "space-y-3", children: applications.map((application) => /* @__PURE__ */ jsxRuntime.jsxs("section", { children: [
87
+ /* @__PURE__ */ jsxRuntime.jsx("h3", { className: "mb-1 px-1 text-xs font-semibold text-muted-foreground", children: applicationLabel(application.kind) }),
88
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "overflow-hidden rounded-lg border bg-card", children: application.runs.map((run) => /* @__PURE__ */ jsxRuntime.jsx(
89
+ RunRow,
90
+ {
91
+ run,
92
+ basePath,
93
+ pollMs,
94
+ selectedId,
95
+ onSelectRun,
96
+ runsQueryKey
97
+ },
98
+ run.id
99
+ )) })
100
+ ] }, application.kind)) })
97
101
  ] });
98
102
  }
103
+ function groupRunsByApplication(runs) {
104
+ const grouped = /* @__PURE__ */ new Map();
105
+ for (const run of runs) {
106
+ const application = run.kind || "other";
107
+ grouped.set(application, [...grouped.get(application) ?? [], run]);
108
+ }
109
+ return [...grouped].map(([kind, applicationRuns]) => ({ kind, runs: applicationRuns }));
110
+ }
111
+ function applicationLabel(kind) {
112
+ const names = {
113
+ makerprint: "MakerPrint",
114
+ openscad: "OpenSCAD",
115
+ orca: "Orca",
116
+ snapmaker: "Snapmaker",
117
+ other: "Other"
118
+ };
119
+ return names[kind] ?? kind;
120
+ }
99
121
  function RunRow({
100
122
  run,
101
123
  basePath,