@flanksource/clicky-ui 0.3.25 → 0.3.26

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 (470) hide show
  1. package/NOTICE.md +1 -0
  2. package/dist/ai.cjs +4 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +6 -2
  5. package/dist/ai.js.map +1 -1
  6. package/dist/chat.cjs +8 -0
  7. package/dist/chat.cjs.map +1 -1
  8. package/dist/chat.js +9 -1
  9. package/dist/chat.js.map +1 -1
  10. package/dist/comments/CommentCard.cjs +89 -14
  11. package/dist/comments/CommentCard.cjs.map +1 -1
  12. package/dist/comments/CommentCard.d.ts.map +1 -1
  13. package/dist/comments/CommentCard.js +90 -15
  14. package/dist/comments/CommentCard.js.map +1 -1
  15. package/dist/comments/CommentComposer.cjs +25 -2
  16. package/dist/comments/CommentComposer.cjs.map +1 -1
  17. package/dist/comments/CommentComposer.d.ts.map +1 -1
  18. package/dist/comments/CommentComposer.js +25 -2
  19. package/dist/comments/CommentComposer.js.map +1 -1
  20. package/dist/comments/CommentProvider.cjs +21 -14
  21. package/dist/comments/CommentProvider.cjs.map +1 -1
  22. package/dist/comments/CommentProvider.d.ts +1 -1
  23. package/dist/comments/CommentProvider.d.ts.map +1 -1
  24. package/dist/comments/CommentProvider.js +21 -14
  25. package/dist/comments/CommentProvider.js.map +1 -1
  26. package/dist/comments/CommentSidePanel.cjs +1 -1
  27. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  28. package/dist/comments/CommentSidePanel.js +1 -1
  29. package/dist/comments/CommentSidePanel.js.map +1 -1
  30. package/dist/comments/comment-types.cjs.map +1 -1
  31. package/dist/comments/comment-types.d.ts +6 -0
  32. package/dist/comments/comment-types.d.ts.map +1 -1
  33. package/dist/comments/comment-types.js.map +1 -1
  34. package/dist/components/DimensionField.cjs +56 -0
  35. package/dist/components/DimensionField.cjs.map +1 -0
  36. package/dist/components/DimensionField.d.ts +17 -0
  37. package/dist/components/DimensionField.d.ts.map +1 -0
  38. package/dist/components/DimensionField.js +56 -0
  39. package/dist/components/DimensionField.js.map +1 -0
  40. package/dist/components.cjs +4 -0
  41. package/dist/components.cjs.map +1 -1
  42. package/dist/components.d.ts +2 -0
  43. package/dist/components.d.ts.map +1 -1
  44. package/dist/components.js +4 -0
  45. package/dist/components.js.map +1 -1
  46. package/dist/data/Clicky.cjs +4 -5
  47. package/dist/data/Clicky.cjs.map +1 -1
  48. package/dist/data/Clicky.d.ts.map +1 -1
  49. package/dist/data/Clicky.js +4 -5
  50. package/dist/data/Clicky.js.map +1 -1
  51. package/dist/data/TaskExecDetails.cjs +8 -3
  52. package/dist/data/TaskExecDetails.cjs.map +1 -1
  53. package/dist/data/TaskExecDetails.d.ts +4 -0
  54. package/dist/data/TaskExecDetails.d.ts.map +1 -1
  55. package/dist/data/TaskExecDetails.js +9 -4
  56. package/dist/data/TaskExecDetails.js.map +1 -1
  57. package/dist/data/TaskManagerButton.cjs +101 -7
  58. package/dist/data/TaskManagerButton.cjs.map +1 -1
  59. package/dist/data/TaskManagerButton.d.ts +6 -1
  60. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  61. package/dist/data/TaskManagerButton.js +103 -9
  62. package/dist/data/TaskManagerButton.js.map +1 -1
  63. package/dist/data/TaskProcessDetails.cjs +2 -0
  64. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  65. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  66. package/dist/data/TaskProcessDetails.js +2 -0
  67. package/dist/data/TaskProcessDetails.js.map +1 -1
  68. package/dist/data/TaskProgress.cjs +14 -4
  69. package/dist/data/TaskProgress.cjs.map +1 -1
  70. package/dist/data/TaskProgress.js +14 -4
  71. package/dist/data/TaskProgress.js.map +1 -1
  72. package/dist/data/TaskSnapshot.cjs.map +1 -1
  73. package/dist/data/TaskSnapshot.d.ts +1 -0
  74. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  75. package/dist/data/TaskSnapshot.js.map +1 -1
  76. package/dist/data/ai/ChatWindow.cjs +18 -23
  77. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  78. package/dist/data/ai/ChatWindow.d.ts +1 -1
  79. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  80. package/dist/data/ai/ChatWindow.js +19 -24
  81. package/dist/data/ai/ChatWindow.js.map +1 -1
  82. package/dist/data/ai/ChatWindow.preferences.cjs +12 -21
  83. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  84. package/dist/data/ai/ChatWindow.preferences.d.ts +3 -2
  85. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  86. package/dist/data/ai/ChatWindow.preferences.js +12 -21
  87. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  88. package/dist/data/ai/ChatWindow.tool-catalog.cjs +21 -38
  89. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  90. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +5 -5
  91. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  92. package/dist/data/ai/ChatWindow.tool-catalog.js +21 -38
  93. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  94. package/dist/data/ai/ChatWindow.types.d.ts +2 -2
  95. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  96. package/dist/data/ai/ChatWindowManager.cjs +2 -2
  97. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  98. package/dist/data/ai/ChatWindowManager.js +2 -2
  99. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  100. package/dist/data/ai/ChatWindowRequestBody.cjs +4 -2
  101. package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -1
  102. package/dist/data/ai/ChatWindowRequestBody.d.ts +15 -3
  103. package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -1
  104. package/dist/data/ai/ChatWindowRequestBody.js +4 -2
  105. package/dist/data/ai/ChatWindowRequestBody.js.map +1 -1
  106. package/dist/data/ai/ToolPreferences.cjs +5 -5
  107. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  108. package/dist/data/ai/ToolPreferences.d.ts +6 -5
  109. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  110. package/dist/data/ai/ToolPreferences.js +5 -5
  111. package/dist/data/ai/ToolPreferences.js.map +1 -1
  112. package/dist/data/ai/ToolPreferences.model.cjs +61 -37
  113. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -1
  114. package/dist/data/ai/ToolPreferences.model.d.ts +32 -13
  115. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -1
  116. package/dist/data/ai/ToolPreferences.model.js +62 -38
  117. package/dist/data/ai/ToolPreferences.model.js.map +1 -1
  118. package/dist/data/ai/ToolPreferencesList.cjs +17 -20
  119. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -1
  120. package/dist/data/ai/ToolPreferencesList.d.ts +16 -7
  121. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -1
  122. package/dist/data/ai/ToolPreferencesList.js +18 -21
  123. package/dist/data/ai/ToolPreferencesList.js.map +1 -1
  124. package/dist/data/ai/chat-window-context.cjs +1 -1
  125. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  126. package/dist/data/ai/chat-window-context.d.ts +7 -7
  127. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  128. package/dist/data/ai/chat-window-context.js +1 -1
  129. package/dist/data/ai/chat-window-context.js.map +1 -1
  130. package/dist/data/ai/index.d.ts +3 -1
  131. package/dist/data/ai/index.d.ts.map +1 -1
  132. package/dist/data/chat/clickyOperationsToTools.cjs +2 -1
  133. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -1
  134. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -1
  135. package/dist/data/chat/clickyOperationsToTools.js +2 -1
  136. package/dist/data/chat/clickyOperationsToTools.js.map +1 -1
  137. package/dist/data/chat/index.d.ts +2 -1
  138. package/dist/data/chat/index.d.ts.map +1 -1
  139. package/dist/data/chat/tool-policy.cjs +132 -0
  140. package/dist/data/chat/tool-policy.cjs.map +1 -0
  141. package/dist/data/chat/tool-policy.d.ts +81 -0
  142. package/dist/data/chat/tool-policy.d.ts.map +1 -0
  143. package/dist/data/chat/tool-policy.js +132 -0
  144. package/dist/data/chat/tool-policy.js.map +1 -0
  145. package/dist/data/chat/types.cjs +20 -0
  146. package/dist/data/chat/types.cjs.map +1 -1
  147. package/dist/data/chat/types.d.ts +22 -2
  148. package/dist/data/chat/types.d.ts.map +1 -1
  149. package/dist/data/chat/types.js +20 -0
  150. package/dist/data/chat/types.js.map +1 -1
  151. package/dist/data/debugConsoleSignal.cjs +64 -0
  152. package/dist/data/debugConsoleSignal.cjs.map +1 -0
  153. package/dist/data/debugConsoleSignal.d.ts +83 -0
  154. package/dist/data/debugConsoleSignal.d.ts.map +1 -0
  155. package/dist/data/debugConsoleSignal.js +64 -0
  156. package/dist/data/debugConsoleSignal.js.map +1 -0
  157. package/dist/data/har/HarPanel.cjs +20 -14
  158. package/dist/data/har/HarPanel.cjs.map +1 -1
  159. package/dist/data/har/HarPanel.d.ts.map +1 -1
  160. package/dist/data/har/HarPanel.js +20 -14
  161. package/dist/data/har/HarPanel.js.map +1 -1
  162. package/dist/data/har/types.d.ts +18 -0
  163. package/dist/data/har/types.d.ts.map +1 -1
  164. package/dist/data/query-browser/QueryBrowser.cjs +4 -42
  165. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  166. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  167. package/dist/data/query-browser/QueryBrowser.js +5 -43
  168. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  169. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  170. package/dist/data/query-browser/QueryBrowser.types.d.ts +0 -1
  171. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  172. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  173. package/dist/data/useDebugAction.cjs +29 -0
  174. package/dist/data/useDebugAction.cjs.map +1 -0
  175. package/dist/data/useDebugAction.d.ts +16 -0
  176. package/dist/data/useDebugAction.d.ts.map +1 -0
  177. package/dist/data/useDebugAction.js +29 -0
  178. package/dist/data/useDebugAction.js.map +1 -0
  179. package/dist/data/version-info.cjs +3 -3
  180. package/dist/data/version-info.js +3 -3
  181. package/dist/data.cjs +16 -8
  182. package/dist/data.cjs.map +1 -1
  183. package/dist/data.d.ts +3 -2
  184. package/dist/data.d.ts.map +1 -1
  185. package/dist/data.js +16 -8
  186. package/dist/devtools/DebugConsole.cjs +138 -0
  187. package/dist/devtools/DebugConsole.cjs.map +1 -0
  188. package/dist/devtools/DebugConsole.d.ts +23 -0
  189. package/dist/devtools/DebugConsole.d.ts.map +1 -0
  190. package/dist/devtools/DebugConsole.js +138 -0
  191. package/dist/devtools/DebugConsole.js.map +1 -0
  192. package/dist/devtools/DebugConsoleButton.cjs +59 -0
  193. package/dist/devtools/DebugConsoleButton.cjs.map +1 -0
  194. package/dist/devtools/DebugConsoleButton.d.ts +20 -0
  195. package/dist/devtools/DebugConsoleButton.d.ts.map +1 -0
  196. package/dist/devtools/DebugConsoleButton.js +59 -0
  197. package/dist/devtools/DebugConsoleButton.js.map +1 -0
  198. package/dist/devtools/DebugConsoleDock.cjs +112 -0
  199. package/dist/devtools/DebugConsoleDock.cjs.map +1 -0
  200. package/dist/devtools/DebugConsoleDock.d.ts +26 -0
  201. package/dist/devtools/DebugConsoleDock.d.ts.map +1 -0
  202. package/dist/devtools/DebugConsoleDock.js +112 -0
  203. package/dist/devtools/DebugConsoleDock.js.map +1 -0
  204. package/dist/devtools/ExecutionDetail.cjs +135 -0
  205. package/dist/devtools/ExecutionDetail.cjs.map +1 -0
  206. package/dist/devtools/ExecutionDetail.d.ts +19 -0
  207. package/dist/devtools/ExecutionDetail.d.ts.map +1 -0
  208. package/dist/devtools/ExecutionDetail.js +135 -0
  209. package/dist/devtools/ExecutionDetail.js.map +1 -0
  210. package/dist/devtools/debugClient.cjs +172 -0
  211. package/dist/devtools/debugClient.cjs.map +1 -0
  212. package/dist/devtools/debugClient.d.ts +98 -0
  213. package/dist/devtools/debugClient.d.ts.map +1 -0
  214. package/dist/devtools/debugClient.js +172 -0
  215. package/dist/devtools/debugClient.js.map +1 -0
  216. package/dist/devtools/debugStore.cjs +115 -0
  217. package/dist/devtools/debugStore.cjs.map +1 -0
  218. package/dist/devtools/debugStore.d.ts +83 -0
  219. package/dist/devtools/debugStore.d.ts.map +1 -0
  220. package/dist/devtools/debugStore.js +115 -0
  221. package/dist/devtools/debugStore.js.map +1 -0
  222. package/dist/devtools/dockState.cjs +51 -0
  223. package/dist/devtools/dockState.cjs.map +1 -0
  224. package/dist/devtools/dockState.d.ts +31 -0
  225. package/dist/devtools/dockState.d.ts.map +1 -0
  226. package/dist/devtools/dockState.js +51 -0
  227. package/dist/devtools/dockState.js.map +1 -0
  228. package/dist/devtools/tabs/ConsoleTab.cjs +36 -0
  229. package/dist/devtools/tabs/ConsoleTab.cjs.map +1 -0
  230. package/dist/devtools/tabs/ConsoleTab.d.ts +19 -0
  231. package/dist/devtools/tabs/ConsoleTab.d.ts.map +1 -0
  232. package/dist/devtools/tabs/ConsoleTab.js +36 -0
  233. package/dist/devtools/tabs/ConsoleTab.js.map +1 -0
  234. package/dist/devtools/tabs/InspectionCaches.cjs +150 -0
  235. package/dist/devtools/tabs/InspectionCaches.cjs.map +1 -0
  236. package/dist/devtools/tabs/InspectionCaches.d.ts +23 -0
  237. package/dist/devtools/tabs/InspectionCaches.d.ts.map +1 -0
  238. package/dist/devtools/tabs/InspectionCaches.js +150 -0
  239. package/dist/devtools/tabs/InspectionCaches.js.map +1 -0
  240. package/dist/devtools/tabs/InspectionTab.cjs +316 -0
  241. package/dist/devtools/tabs/InspectionTab.cjs.map +1 -0
  242. package/dist/devtools/tabs/InspectionTab.d.ts +27 -0
  243. package/dist/devtools/tabs/InspectionTab.d.ts.map +1 -0
  244. package/dist/devtools/tabs/InspectionTab.js +316 -0
  245. package/dist/devtools/tabs/InspectionTab.js.map +1 -0
  246. package/dist/devtools/tabs/NetworkTab.cjs +91 -0
  247. package/dist/devtools/tabs/NetworkTab.cjs.map +1 -0
  248. package/dist/devtools/tabs/NetworkTab.d.ts +20 -0
  249. package/dist/devtools/tabs/NetworkTab.d.ts.map +1 -0
  250. package/dist/devtools/tabs/NetworkTab.js +91 -0
  251. package/dist/devtools/tabs/NetworkTab.js.map +1 -0
  252. package/dist/devtools/tabs/QueriesTab.cjs +85 -0
  253. package/dist/devtools/tabs/QueriesTab.cjs.map +1 -0
  254. package/dist/devtools/tabs/QueriesTab.d.ts +24 -0
  255. package/dist/devtools/tabs/QueriesTab.d.ts.map +1 -0
  256. package/dist/devtools/tabs/QueriesTab.js +85 -0
  257. package/dist/devtools/tabs/QueriesTab.js.map +1 -0
  258. package/dist/devtools/types.cjs +26 -0
  259. package/dist/devtools/types.cjs.map +1 -0
  260. package/dist/devtools/types.d.ts +235 -0
  261. package/dist/devtools/types.d.ts.map +1 -0
  262. package/dist/devtools/types.js +26 -0
  263. package/dist/devtools/types.js.map +1 -0
  264. package/dist/devtools/useDebugStream.cjs +46 -0
  265. package/dist/devtools/useDebugStream.cjs.map +1 -0
  266. package/dist/devtools/useDebugStream.d.ts +23 -0
  267. package/dist/devtools/useDebugStream.d.ts.map +1 -0
  268. package/dist/devtools/useDebugStream.js +46 -0
  269. package/dist/devtools/useDebugStream.js.map +1 -0
  270. package/dist/devtools.cjs +51 -0
  271. package/dist/devtools.cjs.map +1 -0
  272. package/dist/devtools.d.ts +37 -0
  273. package/dist/devtools.d.ts.map +1 -0
  274. package/dist/devtools.js +51 -0
  275. package/dist/devtools.js.map +1 -0
  276. package/dist/icons/components/UiOpenScad.cjs +10 -0
  277. package/dist/icons/components/UiOpenScad.cjs.map +1 -0
  278. package/dist/icons/components/UiOpenScad.d.ts +9 -0
  279. package/dist/icons/components/UiOpenScad.d.ts.map +1 -0
  280. package/dist/icons/components/UiOpenScad.js +10 -0
  281. package/dist/icons/components/UiOpenScad.js.map +1 -0
  282. package/dist/icons/index.d.ts +1 -0
  283. package/dist/icons/index.d.ts.map +1 -1
  284. package/dist/icons/registry.cjs +2 -0
  285. package/dist/icons/registry.cjs.map +1 -1
  286. package/dist/icons/registry.d.ts.map +1 -1
  287. package/dist/icons/registry.js +2 -0
  288. package/dist/icons/registry.js.map +1 -1
  289. package/dist/icons.cjs +2 -0
  290. package/dist/icons.cjs.map +1 -1
  291. package/dist/icons.js +2 -0
  292. package/dist/icons.js.map +1 -1
  293. package/dist/index.cjs +20 -8
  294. package/dist/index.cjs.map +1 -1
  295. package/dist/index.js +20 -8
  296. package/dist/index.js.map +1 -1
  297. package/dist/layout/AppShell.cjs +15 -10
  298. package/dist/layout/AppShell.cjs.map +1 -1
  299. package/dist/layout/AppShell.d.ts +11 -0
  300. package/dist/layout/AppShell.d.ts.map +1 -1
  301. package/dist/layout/AppShell.js +15 -10
  302. package/dist/layout/AppShell.js.map +1 -1
  303. package/dist/layout/AppShell.nav.cjs +170 -49
  304. package/dist/layout/AppShell.nav.cjs.map +1 -1
  305. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  306. package/dist/layout/AppShell.nav.js +170 -49
  307. package/dist/layout/AppShell.nav.js.map +1 -1
  308. package/dist/overlay/CellActions.cjs +18 -124
  309. package/dist/overlay/CellActions.cjs.map +1 -1
  310. package/dist/overlay/CellActions.d.ts +1 -1
  311. package/dist/overlay/CellActions.d.ts.map +1 -1
  312. package/dist/overlay/CellActions.js +18 -124
  313. package/dist/overlay/CellActions.js.map +1 -1
  314. package/dist/overlay/ContextMenu.cjs +144 -0
  315. package/dist/overlay/ContextMenu.cjs.map +1 -0
  316. package/dist/overlay/ContextMenu.d.ts +8 -0
  317. package/dist/overlay/ContextMenu.d.ts.map +1 -0
  318. package/dist/overlay/ContextMenu.js +144 -0
  319. package/dist/overlay/ContextMenu.js.map +1 -0
  320. package/dist/profiles/connections/connectionBrowserModel.cjs +14 -65
  321. package/dist/profiles/connections/connectionBrowserModel.cjs.map +1 -1
  322. package/dist/profiles/connections/connectionBrowserModel.d.ts +35 -35
  323. package/dist/profiles/connections/connectionBrowserModel.d.ts.map +1 -1
  324. package/dist/profiles/connections/connectionBrowserModel.js +14 -65
  325. package/dist/profiles/connections/connectionBrowserModel.js.map +1 -1
  326. package/dist/profiles/connections/connectionQueryWorkspace.cjs +29 -9
  327. package/dist/profiles/connections/connectionQueryWorkspace.cjs.map +1 -1
  328. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +3 -2
  329. package/dist/profiles/connections/connectionQueryWorkspace.d.ts.map +1 -1
  330. package/dist/profiles/connections/connectionQueryWorkspace.js +30 -10
  331. package/dist/profiles/connections/connectionQueryWorkspace.js.map +1 -1
  332. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs +15 -0
  333. package/dist/profiles/connections/connectionQueryWorkspaceModel.cjs.map +1 -1
  334. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts +22 -1
  335. package/dist/profiles/connections/connectionQueryWorkspaceModel.d.ts.map +1 -1
  336. package/dist/profiles/connections/connectionQueryWorkspaceModel.js +15 -0
  337. package/dist/profiles/connections/connectionQueryWorkspaceModel.js.map +1 -1
  338. package/dist/profiles/connections/index.d.ts +1 -0
  339. package/dist/profiles/connections/index.d.ts.map +1 -1
  340. package/dist/profiles/connections/inspectionStatus.cjs +44 -0
  341. package/dist/profiles/connections/inspectionStatus.cjs.map +1 -0
  342. package/dist/profiles/connections/inspectionStatus.d.ts +5 -0
  343. package/dist/profiles/connections/inspectionStatus.d.ts.map +1 -0
  344. package/dist/profiles/connections/inspectionStatus.js +44 -0
  345. package/dist/profiles/connections/inspectionStatus.js.map +1 -0
  346. package/dist/profiles/connections/useInspection.cjs +123 -0
  347. package/dist/profiles/connections/useInspection.cjs.map +1 -0
  348. package/dist/profiles/connections/useInspection.d.ts +35 -0
  349. package/dist/profiles/connections/useInspection.d.ts.map +1 -0
  350. package/dist/profiles/connections/useInspection.js +123 -0
  351. package/dist/profiles/connections/useInspection.js.map +1 -0
  352. package/dist/profiles/editor/profileBuilderWorkspace.cjs +55 -23
  353. package/dist/profiles/editor/profileBuilderWorkspace.cjs.map +1 -1
  354. package/dist/profiles/editor/profileBuilderWorkspace.d.ts.map +1 -1
  355. package/dist/profiles/editor/profileBuilderWorkspace.js +56 -24
  356. package/dist/profiles/editor/profileBuilderWorkspace.js.map +1 -1
  357. package/dist/profiles/elasticsearch/esQueryBuilder.cjs +12 -3
  358. package/dist/profiles/elasticsearch/esQueryBuilder.cjs.map +1 -1
  359. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts +2 -2
  360. package/dist/profiles/elasticsearch/esQueryBuilder.d.ts.map +1 -1
  361. package/dist/profiles/elasticsearch/esQueryBuilder.js +12 -3
  362. package/dist/profiles/elasticsearch/esQueryBuilder.js.map +1 -1
  363. package/dist/profiles/fields/profileFieldEditor.cjs +137 -22
  364. package/dist/profiles/fields/profileFieldEditor.cjs.map +1 -1
  365. package/dist/profiles/fields/profileFieldEditor.d.ts.map +1 -1
  366. package/dist/profiles/fields/profileFieldEditor.js +137 -22
  367. package/dist/profiles/fields/profileFieldEditor.js.map +1 -1
  368. package/dist/profiles/fields/profileFieldFilterEditor.cjs +171 -82
  369. package/dist/profiles/fields/profileFieldFilterEditor.cjs.map +1 -1
  370. package/dist/profiles/fields/profileFieldFilterEditor.d.ts +0 -9
  371. package/dist/profiles/fields/profileFieldFilterEditor.d.ts.map +1 -1
  372. package/dist/profiles/fields/profileFieldFilterEditor.js +174 -85
  373. package/dist/profiles/fields/profileFieldFilterEditor.js.map +1 -1
  374. package/dist/profiles/fields/profileFieldIcons.cjs +6 -3
  375. package/dist/profiles/fields/profileFieldIcons.cjs.map +1 -1
  376. package/dist/profiles/fields/profileFieldIcons.js +6 -3
  377. package/dist/profiles/fields/profileFieldIcons.js.map +1 -1
  378. package/dist/profiles/query/profileSampleFilterLookup.cjs +34 -0
  379. package/dist/profiles/query/profileSampleFilterLookup.cjs.map +1 -0
  380. package/dist/profiles/query/profileSampleFilterLookup.d.ts +12 -0
  381. package/dist/profiles/query/profileSampleFilterLookup.d.ts.map +1 -0
  382. package/dist/profiles/query/profileSampleFilterLookup.js +34 -0
  383. package/dist/profiles/query/profileSampleFilterLookup.js.map +1 -0
  384. package/dist/profiles/query/profileSamplePayload.cjs +6 -4
  385. package/dist/profiles/query/profileSamplePayload.cjs.map +1 -1
  386. package/dist/profiles/query/profileSamplePayload.d.ts +11 -4
  387. package/dist/profiles/query/profileSamplePayload.d.ts.map +1 -1
  388. package/dist/profiles/query/profileSamplePayload.js +6 -4
  389. package/dist/profiles/query/profileSamplePayload.js.map +1 -1
  390. package/dist/profiles/query/profileSampleResult.cjs +26 -0
  391. package/dist/profiles/query/profileSampleResult.cjs.map +1 -0
  392. package/dist/profiles/query/profileSampleResult.d.ts +11 -0
  393. package/dist/profiles/query/profileSampleResult.d.ts.map +1 -0
  394. package/dist/profiles/query/profileSampleResult.js +26 -0
  395. package/dist/profiles/query/profileSampleResult.js.map +1 -0
  396. package/dist/profiles/query/queryTargetPicker.cjs +5 -3
  397. package/dist/profiles/query/queryTargetPicker.cjs.map +1 -1
  398. package/dist/profiles/query/queryTargetPicker.d.ts +3 -2
  399. package/dist/profiles/query/queryTargetPicker.d.ts.map +1 -1
  400. package/dist/profiles/query/queryTargetPicker.js +5 -3
  401. package/dist/profiles/query/queryTargetPicker.js.map +1 -1
  402. package/dist/profiles/wizard/profileWizard.cjs +14 -5
  403. package/dist/profiles/wizard/profileWizard.cjs.map +1 -1
  404. package/dist/profiles/wizard/profileWizard.d.ts.map +1 -1
  405. package/dist/profiles/wizard/profileWizard.js +15 -6
  406. package/dist/profiles/wizard/profileWizard.js.map +1 -1
  407. package/dist/profiles/wizard/profileWizardModel.cjs +35 -6
  408. package/dist/profiles/wizard/profileWizardModel.cjs.map +1 -1
  409. package/dist/profiles/wizard/profileWizardModel.d.ts +29 -4
  410. package/dist/profiles/wizard/profileWizardModel.d.ts.map +1 -1
  411. package/dist/profiles/wizard/profileWizardModel.js +35 -6
  412. package/dist/profiles/wizard/profileWizardModel.js.map +1 -1
  413. package/dist/profiles/wizard/profileWizardQueryStep.cjs +44 -11
  414. package/dist/profiles/wizard/profileWizardQueryStep.cjs.map +1 -1
  415. package/dist/profiles/wizard/profileWizardQueryStep.d.ts.map +1 -1
  416. package/dist/profiles/wizard/profileWizardQueryStep.js +46 -13
  417. package/dist/profiles/wizard/profileWizardQueryStep.js.map +1 -1
  418. package/dist/profiles/wizard/profileWizardSteps.cjs +33 -2
  419. package/dist/profiles/wizard/profileWizardSteps.cjs.map +1 -1
  420. package/dist/profiles/wizard/profileWizardSteps.d.ts +11 -2
  421. package/dist/profiles/wizard/profileWizardSteps.d.ts.map +1 -1
  422. package/dist/profiles/wizard/profileWizardSteps.js +33 -2
  423. package/dist/profiles/wizard/profileWizardSteps.js.map +1 -1
  424. package/dist/profiles.cjs +8 -2
  425. package/dist/profiles.cjs.map +1 -1
  426. package/dist/profiles.js +10 -4
  427. package/dist/profiles.js.map +1 -1
  428. package/dist/rpc/FilterForm.cjs +21 -237
  429. package/dist/rpc/FilterForm.cjs.map +1 -1
  430. package/dist/rpc/FilterForm.d.ts +3 -1
  431. package/dist/rpc/FilterForm.d.ts.map +1 -1
  432. package/dist/rpc/FilterForm.js +21 -237
  433. package/dist/rpc/FilterForm.js.map +1 -1
  434. package/dist/rpc/FilterFormFields.cjs +240 -0
  435. package/dist/rpc/FilterFormFields.cjs.map +1 -0
  436. package/dist/rpc/FilterFormFields.d.ts +12 -0
  437. package/dist/rpc/FilterFormFields.d.ts.map +1 -0
  438. package/dist/rpc/FilterFormFields.js +240 -0
  439. package/dist/rpc/FilterFormFields.js.map +1 -0
  440. package/dist/rpc/router.cjs +3 -2
  441. package/dist/rpc/router.cjs.map +1 -1
  442. package/dist/rpc/router.d.ts.map +1 -1
  443. package/dist/rpc/router.js +3 -2
  444. package/dist/rpc/router.js.map +1 -1
  445. package/dist/rpc/types.cjs.map +1 -1
  446. package/dist/rpc/types.d.ts +3 -1
  447. package/dist/rpc/types.d.ts.map +1 -1
  448. package/dist/rpc/types.js.map +1 -1
  449. package/dist/styles.css +1 -1
  450. package/package.json +6 -1
  451. package/dist/data/query-info/QueryInfoDialog.cjs +0 -106
  452. package/dist/data/query-info/QueryInfoDialog.cjs.map +0 -1
  453. package/dist/data/query-info/QueryInfoDialog.d.ts +0 -16
  454. package/dist/data/query-info/QueryInfoDialog.d.ts.map +0 -1
  455. package/dist/data/query-info/QueryInfoDialog.js +0 -106
  456. package/dist/data/query-info/QueryInfoDialog.js.map +0 -1
  457. package/dist/data/query-info/index.d.ts +0 -4
  458. package/dist/data/query-info/index.d.ts.map +0 -1
  459. package/dist/data/query-info/queryInfo.cjs +0 -42
  460. package/dist/data/query-info/queryInfo.cjs.map +0 -1
  461. package/dist/data/query-info/queryInfo.d.ts +0 -45
  462. package/dist/data/query-info/queryInfo.d.ts.map +0 -1
  463. package/dist/data/query-info/queryInfo.js +0 -42
  464. package/dist/data/query-info/queryInfo.js.map +0 -1
  465. package/dist/data/query-info/useQueryInfo.cjs +0 -48
  466. package/dist/data/query-info/useQueryInfo.cjs.map +0 -1
  467. package/dist/data/query-info/useQueryInfo.d.ts +0 -26
  468. package/dist/data/query-info/useQueryInfo.d.ts.map +0 -1
  469. package/dist/data/query-info/useQueryInfo.js +0 -48
  470. package/dist/data/query-info/useQueryInfo.js.map +0 -1
@@ -1,6 +1,8 @@
1
1
  import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
2
3
  import { Icon } from "../data/Icon.js";
3
4
  import { cn } from "../lib/utils.js";
5
+ import { ContextMenu } from "../overlay/ContextMenu.js";
4
6
  import { useRouter } from "../rpc/router.js";
5
7
  function NavSections({
6
8
  sections,
@@ -17,14 +19,14 @@ function NavSections({
17
19
  collapsed ? "px-2" : "px-density-2"
18
20
  ),
19
21
  children: sections.map((section, index) => {
20
- var _a, _b;
22
+ var _a, _b, _c;
21
23
  return /* @__PURE__ */ jsxs(
22
24
  "div",
23
25
  {
24
26
  className: "flex flex-col",
25
27
  children: [
26
28
  section.label && (collapsed ? /* @__PURE__ */ jsx("div", { className: "mx-2 mb-1 mt-3 border-t border-sidebar-border first:mt-1" }) : /* @__PURE__ */ jsx("div", { className: "mb-0.5 mt-3 px-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-sidebar-foreground/55 first:mt-1", children: section.label })),
27
- (_a = section.items) == null ? void 0 : _a.map((item) => /* @__PURE__ */ jsx(
29
+ section.variant !== "tree" && ((_a = section.items) == null ? void 0 : _a.map((item) => /* @__PURE__ */ jsx(
28
30
  NavItemRow,
29
31
  {
30
32
  item,
@@ -33,7 +35,7 @@ function NavSections({
33
35
  ...onNavigate ? { onNavigate } : {}
34
36
  },
35
37
  item.key
36
- )),
38
+ ))),
37
39
  (_b = section.groups) == null ? void 0 : _b.map(
38
40
  (group) => (
39
41
  // A collapsed rail has no room for group headings, so the whole
@@ -60,7 +62,17 @@ function NavSections({
60
62
  group.key
61
63
  )
62
64
  )
63
- )
65
+ ),
66
+ section.variant === "tree" && ((_c = section.items) == null ? void 0 : _c.map((item) => /* @__PURE__ */ jsx(
67
+ NavItemRow,
68
+ {
69
+ item,
70
+ collapsed,
71
+ renderLink,
72
+ ...onNavigate ? { onNavigate } : {}
73
+ },
74
+ item.key
75
+ )))
64
76
  ]
65
77
  },
66
78
  section.label ?? `section-${index}`
@@ -83,7 +95,9 @@ function NavGroupRows({
83
95
  groupState,
84
96
  onNavigate
85
97
  }) {
86
- var _a;
98
+ var _a, _b;
99
+ const [contextTarget, setContextTarget] = useState(null);
100
+ const hasChildren = group.items.length > 0 || (((_a = group.groups) == null ? void 0 : _a.length) ?? 0) > 0;
87
101
  const fallback = group.defaultCollapsed ?? false;
88
102
  const collapsed = !group.forceExpanded && groupState.isCollapsed(group.key, fallback);
89
103
  const toggle = () => groupState.toggle(group.key, fallback);
@@ -94,52 +108,118 @@ function NavGroupRows({
94
108
  ...typeof group.icon === "string" ? { name: group.icon } : { icon: group.icon }
95
109
  }
96
110
  ) });
111
+ if (!hasChildren && !group.item) {
112
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
113
+ /* @__PURE__ */ jsxs(
114
+ "div",
115
+ {
116
+ ref: setContextTarget,
117
+ className: "flex items-center gap-2.5 rounded-md px-density-2 py-1.5 text-[13px] text-sidebar-foreground",
118
+ children: [
119
+ groupIcon,
120
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-left", children: group.label }),
121
+ group.badge
122
+ ]
123
+ }
124
+ ),
125
+ group.contextMenu && /* @__PURE__ */ jsx(
126
+ ContextMenu,
127
+ {
128
+ contextTarget,
129
+ menuLabel: group.contextMenuLabel ?? `${group.label} actions`,
130
+ menuItems: group.contextMenu
131
+ }
132
+ )
133
+ ] });
134
+ }
135
+ if (!hasChildren && group.item) {
136
+ return /* @__PURE__ */ jsxs("div", { className: "flex items-center gap-1", children: [
137
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx(
138
+ NavItemRow,
139
+ {
140
+ item: group.item,
141
+ collapsed: false,
142
+ renderLink,
143
+ ...onNavigate ? { onNavigate } : {}
144
+ }
145
+ ) }),
146
+ group.badge
147
+ ] });
148
+ }
97
149
  return /* @__PURE__ */ jsxs("div", { className: "flex flex-col", children: [
98
150
  group.item ? (
99
151
  // Folder AND leaf: the link and the disclosure are siblings. Nesting a
100
152
  // button inside the anchor would be invalid DOM and would make the
101
153
  // click target ambiguous.
102
- /* @__PURE__ */ jsxs("div", { className: "group/nav flex items-center gap-1", children: [
103
- /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx(
104
- NavItemRow,
105
- {
106
- item: group.item,
107
- collapsed: false,
108
- renderLink,
109
- ...onNavigate ? { onNavigate } : {}
110
- }
111
- ) }),
112
- /* @__PURE__ */ jsx(
113
- "button",
114
- {
115
- type: "button",
116
- onClick: toggle,
117
- "aria-expanded": !collapsed,
118
- "aria-label": `${collapsed ? "Expand" : "Collapse"} ${group.label}`,
119
- className: "shrink-0 rounded-md px-1.5 py-1.5 text-sidebar-foreground/55 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
120
- children: chevron
121
- }
122
- )
123
- ] })
124
- ) : /* @__PURE__ */ jsxs(
125
- "button",
126
- {
127
- type: "button",
128
- onClick: toggle,
129
- "aria-expanded": !collapsed,
130
- className: cn(
131
- "flex items-center gap-2.5 rounded-md px-density-2 py-1.5 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
132
- variant === "tree" ? "text-[13px] text-sidebar-foreground" : "text-[11px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55"
133
- ),
134
- children: [
135
- groupIcon,
136
- /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-left", children: group.label }),
137
- chevron
138
- ]
139
- }
140
- ),
154
+ /* @__PURE__ */ jsxs(
155
+ "div",
156
+ {
157
+ ref: setContextTarget,
158
+ className: "group/nav flex items-center gap-1",
159
+ children: [
160
+ /* @__PURE__ */ jsx("div", { className: "min-w-0 flex-1", children: /* @__PURE__ */ jsx(
161
+ NavItemRow,
162
+ {
163
+ item: group.item,
164
+ collapsed: false,
165
+ renderLink,
166
+ ...onNavigate ? { onNavigate } : {}
167
+ }
168
+ ) }),
169
+ group.badge,
170
+ /* @__PURE__ */ jsx(
171
+ "button",
172
+ {
173
+ type: "button",
174
+ onClick: toggle,
175
+ "aria-expanded": !collapsed,
176
+ "aria-label": `${collapsed ? "Expand" : "Collapse"} ${group.label}`,
177
+ className: "shrink-0 rounded-md px-1.5 py-1.5 text-sidebar-foreground/55 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
178
+ children: chevron
179
+ }
180
+ ),
181
+ group.contextMenu && /* @__PURE__ */ jsx(
182
+ ContextMenu,
183
+ {
184
+ contextTarget,
185
+ menuLabel: group.contextMenuLabel ?? `${group.label} folder actions`,
186
+ menuItems: group.contextMenu
187
+ }
188
+ )
189
+ ]
190
+ }
191
+ )
192
+ ) : /* @__PURE__ */ jsxs(Fragment, { children: [
193
+ /* @__PURE__ */ jsxs(
194
+ "button",
195
+ {
196
+ ref: setContextTarget,
197
+ type: "button",
198
+ onClick: toggle,
199
+ "aria-expanded": !collapsed,
200
+ className: cn(
201
+ "flex items-center gap-2.5 rounded-md px-density-2 py-1.5 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
202
+ variant === "tree" ? "text-[13px] text-sidebar-foreground" : "text-[11px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55"
203
+ ),
204
+ children: [
205
+ groupIcon,
206
+ /* @__PURE__ */ jsx("span", { className: "flex-1 truncate text-left", children: group.label }),
207
+ group.badge,
208
+ chevron
209
+ ]
210
+ }
211
+ ),
212
+ group.contextMenu && /* @__PURE__ */ jsx(
213
+ ContextMenu,
214
+ {
215
+ contextTarget,
216
+ menuLabel: group.contextMenuLabel ?? `${group.label} actions`,
217
+ menuItems: group.contextMenu
218
+ }
219
+ )
220
+ ] }),
141
221
  !collapsed && /* @__PURE__ */ jsxs("div", { className: "ml-2 mt-0.5 flex flex-col gap-0.5 border-l border-sidebar-border pl-2", children: [
142
- group.items.map((item) => /* @__PURE__ */ jsx(
222
+ variant !== "tree" && group.items.map((item) => /* @__PURE__ */ jsx(
143
223
  NavItemRow,
144
224
  {
145
225
  item,
@@ -149,7 +229,7 @@ function NavGroupRows({
149
229
  },
150
230
  item.key
151
231
  )),
152
- (_a = group.groups) == null ? void 0 : _a.map((child) => /* @__PURE__ */ jsx(
232
+ (_b = group.groups) == null ? void 0 : _b.map((child) => /* @__PURE__ */ jsx(
153
233
  NavGroupRows,
154
234
  {
155
235
  group: child,
@@ -159,6 +239,16 @@ function NavGroupRows({
159
239
  ...onNavigate ? { onNavigate } : {}
160
240
  },
161
241
  child.key
242
+ )),
243
+ variant === "tree" && group.items.map((item) => /* @__PURE__ */ jsx(
244
+ NavItemRow,
245
+ {
246
+ item,
247
+ collapsed: false,
248
+ renderLink,
249
+ ...onNavigate ? { onNavigate } : {}
250
+ },
251
+ item.key
162
252
  ))
163
253
  ] })
164
254
  ] });
@@ -169,6 +259,7 @@ function NavItemRow({
169
259
  renderLink,
170
260
  onNavigate
171
261
  }) {
262
+ const [contextTarget, setContextTarget] = useState(null);
172
263
  const className = cn(
173
264
  "flex w-full items-center gap-2.5 rounded-md px-density-2 py-1.5 text-left text-[13px] text-sidebar-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground",
174
265
  collapsed && "justify-center px-0",
@@ -186,7 +277,7 @@ function NavItemRow({
186
277
  ] });
187
278
  const title = collapsed && typeof item.label === "string" ? item.label : void 0;
188
279
  if (item.external) {
189
- return /* @__PURE__ */ jsx(
280
+ const externalLink = /* @__PURE__ */ jsx(
190
281
  "a",
191
282
  {
192
283
  href: item.to,
@@ -198,6 +289,18 @@ function NavItemRow({
198
289
  children
199
290
  }
200
291
  );
292
+ if (!item.contextMenu) return externalLink;
293
+ return /* @__PURE__ */ jsxs("div", { ref: setContextTarget, className: "w-full", children: [
294
+ externalLink,
295
+ /* @__PURE__ */ jsx(
296
+ ContextMenu,
297
+ {
298
+ contextTarget,
299
+ menuLabel: item.contextMenuLabel ?? `${String(item.label)} actions`,
300
+ menuItems: item.contextMenu
301
+ }
302
+ )
303
+ ] });
201
304
  }
202
305
  const link = renderLink({
203
306
  key: item.key,
@@ -206,8 +309,26 @@ function NavItemRow({
206
309
  children,
207
310
  ...title ? { title } : {}
208
311
  });
209
- if (!onNavigate) return link;
210
- return /* @__PURE__ */ jsx("div", { onClick: onNavigate, children: link });
312
+ if (!onNavigate && !item.contextMenu) return link;
313
+ return /* @__PURE__ */ jsxs(
314
+ "div",
315
+ {
316
+ ref: item.contextMenu ? setContextTarget : void 0,
317
+ className: "w-full",
318
+ ...onNavigate ? { onClick: onNavigate } : {},
319
+ children: [
320
+ link,
321
+ item.contextMenu && /* @__PURE__ */ jsx(
322
+ ContextMenu,
323
+ {
324
+ contextTarget,
325
+ menuLabel: item.contextMenuLabel ?? `${String(item.label)} actions`,
326
+ menuItems: item.contextMenu
327
+ }
328
+ )
329
+ ]
330
+ }
331
+ );
211
332
  }
212
333
  export {
213
334
  NavSections
@@ -1 +1 @@
1
- {"version":3,"file":"AppShell.nav.js","sources":["../../src/layout/AppShell.nav.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport { Icon } from \"../data/Icon\";\nimport { cn } from \"../lib/utils\";\nimport type { RenderLink } from \"../rpc/EndpointList\";\nimport { useRouter } from \"../rpc/router\";\nimport type {\n AppShellNavGroup,\n AppShellNavItem,\n AppShellNavSection,\n} from \"./AppShell\";\n\n// Per-group collapsed state. Owned by AppShell (see `useGroupCollapsed` there)\n// and passed down, because AppShell renders NavSections twice — the desktop\n// rail and the mobile drawer — and per-render state behind one storage key\n// would desync: the rail stays mounted while the drawer is open, so a drawer\n// toggle would write localStorage the rail never reads back.\nexport interface GroupState {\n isCollapsed: (key: string, fallback: boolean) => boolean;\n toggle: (key: string, fallback: boolean) => void;\n}\n\nexport function NavSections({\n sections,\n collapsed,\n groupState,\n onNavigate,\n}: {\n sections: AppShellNavSection[];\n collapsed: boolean;\n groupState: GroupState;\n onNavigate?: () => void;\n}) {\n const { renderLink } = useRouter();\n return (\n <nav\n className={cn(\n \"flex flex-col gap-0.5\",\n collapsed ? \"px-2\" : \"px-density-2\",\n )}\n >\n {sections.map((section, index) => (\n <div\n key={section.label ?? `section-${index}`}\n className=\"flex flex-col\"\n >\n {section.label &&\n (collapsed ? (\n <div className=\"mx-2 mb-1 mt-3 border-t border-sidebar-border first:mt-1\" />\n ) : (\n <div className=\"mb-0.5 mt-3 px-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-sidebar-foreground/55 first:mt-1\">\n {section.label}\n </div>\n ))}\n {section.items?.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={collapsed}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n {section.groups?.map((group) =>\n // A collapsed rail has no room for group headings, so the whole\n // subtree flattens into the icon strip rather than hiding behind\n // toggles the user cannot see.\n collapsed\n ? flattenGroup(group).map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))\n : (\n <NavGroupRows\n key={group.key}\n group={group}\n variant={section.variant ?? \"list\"}\n renderLink={renderLink}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ),\n )}\n </div>\n ))}\n </nav>\n );\n}\n\n// flattenGroup collects every destination in a group's subtree — its own row\n// (when it has one), its items, and everything under its nested groups.\nfunction flattenGroup(group: AppShellNavGroup): AppShellNavItem[] {\n return [\n ...(group.item ? [group.item] : []),\n ...group.items,\n ...(group.groups ?? []).flatMap(flattenGroup),\n ];\n}\n\nfunction NavGroupRows({\n group,\n variant,\n renderLink,\n groupState,\n onNavigate,\n}: {\n group: AppShellNavGroup;\n variant: \"list\" | \"tree\";\n renderLink: RenderLink;\n groupState: GroupState;\n onNavigate?: () => void;\n}) {\n const fallback = group.defaultCollapsed ?? false;\n const collapsed =\n !group.forceExpanded && groupState.isCollapsed(group.key, fallback);\n const toggle = () => groupState.toggle(group.key, fallback);\n const chevron = (\n <span aria-hidden className=\"text-[0.65rem] opacity-60\">\n {collapsed ? \"▸\" : \"▾\"}\n </span>\n );\n const groupIcon = group.icon && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <Icon\n {...(typeof group.icon === \"string\"\n ? { name: group.icon }\n : { icon: group.icon })}\n />\n </span>\n );\n return (\n <div className=\"flex flex-col\">\n {group.item ? (\n // Folder AND leaf: the link and the disclosure are siblings. Nesting a\n // button inside the anchor would be invalid DOM and would make the\n // click target ambiguous.\n <div className=\"group/nav flex items-center gap-1\">\n <div className=\"min-w-0 flex-1\">\n <NavItemRow\n item={group.item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n </div>\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group.label}`}\n className=\"shrink-0 rounded-md px-1.5 py-1.5 text-sidebar-foreground/55 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {chevron}\n </button>\n </div>\n ) : (\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n className={cn(\n \"flex items-center gap-2.5 rounded-md px-density-2 py-1.5 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n variant === \"tree\"\n ? \"text-[13px] text-sidebar-foreground\"\n : \"text-[11px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55\",\n )}\n >\n {groupIcon}\n <span className=\"flex-1 truncate text-left\">{group.label}</span>\n {chevron}\n </button>\n )}\n {!collapsed && (\n <div className=\"ml-2 mt-0.5 flex flex-col gap-0.5 border-l border-sidebar-border pl-2\">\n {group.items.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n {group.groups?.map((child) => (\n <NavGroupRows\n key={child.key}\n group={child}\n variant={variant}\n renderLink={renderLink}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction NavItemRow({\n item,\n collapsed,\n renderLink,\n onNavigate,\n}: {\n item: AppShellNavItem;\n collapsed: boolean;\n renderLink: RenderLink;\n onNavigate?: () => void;\n}) {\n const className = cn(\n \"flex w-full items-center gap-2.5 rounded-md px-density-2 py-1.5 text-left text-[13px] text-sidebar-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n collapsed && \"justify-center px-0\",\n item.active && \"bg-sidebar-accent font-medium text-sidebar-primary\",\n );\n const children: ReactNode = (\n <>\n {item.icon && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <Icon\n {...(typeof item.icon === \"string\"\n ? { name: item.icon }\n : { icon: item.icon })}\n />\n </span>\n )}\n {!collapsed && <span className=\"flex-1 truncate\">{item.label}</span>}\n {!collapsed && item.badge}\n </>\n );\n const title =\n collapsed && typeof item.label === \"string\" ? item.label : undefined;\n\n if (item.external) {\n return (\n <a\n href={item.to}\n className={className}\n title={title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onNavigate}\n >\n {children}\n </a>\n );\n }\n const link = renderLink({\n key: item.key,\n to: item.to,\n className,\n children,\n ...(title ? { title } : {}),\n });\n\n if (!onNavigate) return link;\n return <div onClick={onNavigate}>{link}</div>;\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AppShell.nav.js","sources":["../../src/layout/AppShell.nav.tsx"],"sourcesContent":["import { useState, type ReactNode } from \"react\";\nimport { Icon } from \"../data/Icon\";\nimport { cn } from \"../lib/utils\";\nimport { ContextMenu } from \"../overlay/ContextMenu\";\nimport type { RenderLink } from \"../rpc/EndpointList\";\nimport { useRouter } from \"../rpc/router\";\nimport type {\n AppShellNavGroup,\n AppShellNavItem,\n AppShellNavSection,\n} from \"./AppShell\";\n\n// Per-group collapsed state. Owned by AppShell (see `useGroupCollapsed` there)\n// and passed down, because AppShell renders NavSections twice — the desktop\n// rail and the mobile drawer — and per-render state behind one storage key\n// would desync: the rail stays mounted while the drawer is open, so a drawer\n// toggle would write localStorage the rail never reads back.\nexport interface GroupState {\n isCollapsed: (key: string, fallback: boolean) => boolean;\n toggle: (key: string, fallback: boolean) => void;\n}\n\nexport function NavSections({\n sections,\n collapsed,\n groupState,\n onNavigate,\n}: {\n sections: AppShellNavSection[];\n collapsed: boolean;\n groupState: GroupState;\n onNavigate?: () => void;\n}) {\n const { renderLink } = useRouter();\n return (\n <nav\n className={cn(\n \"flex flex-col gap-0.5\",\n collapsed ? \"px-2\" : \"px-density-2\",\n )}\n >\n {sections.map((section, index) => (\n <div\n key={section.label ?? `section-${index}`}\n className=\"flex flex-col\"\n >\n {section.label &&\n (collapsed ? (\n <div className=\"mx-2 mb-1 mt-3 border-t border-sidebar-border first:mt-1\" />\n ) : (\n <div className=\"mb-0.5 mt-3 px-density-2 text-[10px] font-semibold uppercase tracking-[0.18em] text-sidebar-foreground/55 first:mt-1\">\n {section.label}\n </div>\n ))}\n {section.variant !== \"tree\" &&\n section.items?.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={collapsed}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n {section.groups?.map((group) =>\n // A collapsed rail has no room for group headings, so the whole\n // subtree flattens into the icon strip rather than hiding behind\n // toggles the user cannot see.\n collapsed ? (\n flattenGroup(group).map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))\n ) : (\n <NavGroupRows\n key={group.key}\n group={group}\n variant={section.variant ?? \"list\"}\n renderLink={renderLink}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ),\n )}\n {section.variant === \"tree\" &&\n section.items?.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={collapsed}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n </div>\n ))}\n </nav>\n );\n}\n\n// flattenGroup collects every destination in a group's subtree — its own row\n// (when it has one), its items, and everything under its nested groups.\nfunction flattenGroup(group: AppShellNavGroup): AppShellNavItem[] {\n return [\n ...(group.item ? [group.item] : []),\n ...group.items,\n ...(group.groups ?? []).flatMap(flattenGroup),\n ];\n}\n\nfunction NavGroupRows({\n group,\n variant,\n renderLink,\n groupState,\n onNavigate,\n}: {\n group: AppShellNavGroup;\n variant: \"list\" | \"tree\";\n renderLink: RenderLink;\n groupState: GroupState;\n onNavigate?: () => void;\n}) {\n const [contextTarget, setContextTarget] = useState<HTMLElement | null>(null);\n const hasChildren = group.items.length > 0 || (group.groups?.length ?? 0) > 0;\n const fallback = group.defaultCollapsed ?? false;\n const collapsed =\n !group.forceExpanded && groupState.isCollapsed(group.key, fallback);\n const toggle = () => groupState.toggle(group.key, fallback);\n const chevron = (\n <span aria-hidden className=\"text-[0.65rem] opacity-60\">\n {collapsed ? \"▸\" : \"▾\"}\n </span>\n );\n const groupIcon = group.icon && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <Icon\n {...(typeof group.icon === \"string\"\n ? { name: group.icon }\n : { icon: group.icon })}\n />\n </span>\n );\n if (!hasChildren && !group.item) {\n return (\n <>\n <div\n ref={setContextTarget}\n className=\"flex items-center gap-2.5 rounded-md px-density-2 py-1.5 text-[13px] text-sidebar-foreground\"\n >\n {groupIcon}\n <span className=\"flex-1 truncate text-left\">{group.label}</span>\n {group.badge}\n </div>\n {group.contextMenu && (\n <ContextMenu\n contextTarget={contextTarget}\n menuLabel={group.contextMenuLabel ?? `${group.label} actions`}\n menuItems={group.contextMenu}\n />\n )}\n </>\n );\n }\n if (!hasChildren && group.item) {\n return (\n <div className=\"flex items-center gap-1\">\n <div className=\"min-w-0 flex-1\">\n <NavItemRow\n item={group.item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n </div>\n {group.badge}\n </div>\n );\n }\n return (\n <div className=\"flex flex-col\">\n {group.item ? (\n // Folder AND leaf: the link and the disclosure are siblings. Nesting a\n // button inside the anchor would be invalid DOM and would make the\n // click target ambiguous.\n <div\n ref={setContextTarget}\n className=\"group/nav flex items-center gap-1\"\n >\n <div className=\"min-w-0 flex-1\">\n <NavItemRow\n item={group.item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n </div>\n {group.badge}\n <button\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n aria-label={`${collapsed ? \"Expand\" : \"Collapse\"} ${group.label}`}\n className=\"shrink-0 rounded-md px-1.5 py-1.5 text-sidebar-foreground/55 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\"\n >\n {chevron}\n </button>\n {group.contextMenu && (\n <ContextMenu\n contextTarget={contextTarget}\n menuLabel={\n group.contextMenuLabel ?? `${group.label} folder actions`\n }\n menuItems={group.contextMenu}\n />\n )}\n </div>\n ) : (\n <>\n <button\n ref={setContextTarget}\n type=\"button\"\n onClick={toggle}\n aria-expanded={!collapsed}\n className={cn(\n \"flex items-center gap-2.5 rounded-md px-density-2 py-1.5 transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n variant === \"tree\"\n ? \"text-[13px] text-sidebar-foreground\"\n : \"text-[11px] font-semibold uppercase tracking-[0.14em] text-sidebar-foreground/55\",\n )}\n >\n {groupIcon}\n <span className=\"flex-1 truncate text-left\">{group.label}</span>\n {group.badge}\n {chevron}\n </button>\n {group.contextMenu && (\n <ContextMenu\n contextTarget={contextTarget}\n menuLabel={group.contextMenuLabel ?? `${group.label} actions`}\n menuItems={group.contextMenu}\n />\n )}\n </>\n )}\n {!collapsed && (\n <div className=\"ml-2 mt-0.5 flex flex-col gap-0.5 border-l border-sidebar-border pl-2\">\n {variant !== \"tree\" &&\n group.items.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n {group.groups?.map((child) => (\n <NavGroupRows\n key={child.key}\n group={child}\n variant={variant}\n renderLink={renderLink}\n groupState={groupState}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n {variant === \"tree\" &&\n group.items.map((item) => (\n <NavItemRow\n key={item.key}\n item={item}\n collapsed={false}\n renderLink={renderLink}\n {...(onNavigate ? { onNavigate } : {})}\n />\n ))}\n </div>\n )}\n </div>\n );\n}\n\nfunction NavItemRow({\n item,\n collapsed,\n renderLink,\n onNavigate,\n}: {\n item: AppShellNavItem;\n collapsed: boolean;\n renderLink: RenderLink;\n onNavigate?: () => void;\n}) {\n const [contextTarget, setContextTarget] = useState<HTMLElement | null>(null);\n const className = cn(\n \"flex w-full items-center gap-2.5 rounded-md px-density-2 py-1.5 text-left text-[13px] text-sidebar-foreground transition-colors hover:bg-sidebar-accent hover:text-sidebar-accent-foreground\",\n collapsed && \"justify-center px-0\",\n item.active && \"bg-sidebar-accent font-medium text-sidebar-primary\",\n );\n const children: ReactNode = (\n <>\n {item.icon && (\n <span className=\"flex h-4 w-4 shrink-0 items-center justify-center\">\n <Icon\n {...(typeof item.icon === \"string\"\n ? { name: item.icon }\n : { icon: item.icon })}\n />\n </span>\n )}\n {!collapsed && <span className=\"flex-1 truncate\">{item.label}</span>}\n {!collapsed && item.badge}\n </>\n );\n const title =\n collapsed && typeof item.label === \"string\" ? item.label : undefined;\n\n if (item.external) {\n const externalLink = (\n <a\n href={item.to}\n className={className}\n title={title}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n onClick={onNavigate}\n >\n {children}\n </a>\n );\n if (!item.contextMenu) return externalLink;\n return (\n <div ref={setContextTarget} className=\"w-full\">\n {externalLink}\n <ContextMenu\n contextTarget={contextTarget}\n menuLabel={item.contextMenuLabel ?? `${String(item.label)} actions`}\n menuItems={item.contextMenu}\n />\n </div>\n );\n }\n const link = renderLink({\n key: item.key,\n to: item.to,\n className,\n children,\n ...(title ? { title } : {}),\n });\n\n if (!onNavigate && !item.contextMenu) return link;\n return (\n <div\n ref={item.contextMenu ? setContextTarget : undefined}\n className=\"w-full\"\n {...(onNavigate ? { onClick: onNavigate } : {})}\n >\n {link}\n {item.contextMenu && (\n <ContextMenu\n contextTarget={contextTarget}\n menuLabel={item.contextMenuLabel ?? `${String(item.label)} actions`}\n menuItems={item.contextMenu}\n />\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,150 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
- const react = require("@floating-ui/react");
5
- const react$1 = require("react");
4
+ const react = require("react");
6
5
  const Icon = require("../data/Icon.cjs");
7
6
  const utils = require("../lib/utils.cjs");
8
- const DropdownMenuSubmenu = require("./DropdownMenuSubmenu.cjs");
9
- const dropdownMenuContext = require("./dropdownMenuContext.cjs");
10
- const modalStack = require("./modalStack.cjs");
11
- function pointReference(x, y, contextElement) {
12
- return {
13
- contextElement,
14
- getBoundingClientRect: () => ({
15
- x,
16
- y,
17
- top: y,
18
- left: x,
19
- right: x,
20
- bottom: y,
21
- width: 0,
22
- height: 0,
23
- toJSON: () => ({})
24
- })
25
- };
26
- }
27
- function CellActionsRoot({
7
+ const ContextMenu = require("./ContextMenu.cjs");
8
+ function CellActions({
28
9
  contextTarget,
29
10
  menuLabel,
30
11
  menuItems,
31
12
  children,
32
13
  className
33
14
  }) {
34
- const [open, setOpen] = react$1.useState(false);
35
- const [activeIndex, setActiveIndex] = react$1.useState(null);
36
- const returnFocusRef = react$1.useRef(null);
37
- const elementsRef = react$1.useRef([]);
38
- const floatingZ = modalStack.useFloatingZIndex();
39
- const tree = react.useFloatingTree();
40
- const nodeId = react.useFloatingNodeId();
41
- const closeMenu = react$1.useCallback(() => {
42
- setOpen(false);
43
- queueMicrotask(() => {
44
- var _a;
45
- return (_a = returnFocusRef.current) == null ? void 0 : _a.focus({ preventScroll: true });
46
- });
47
- }, []);
48
- const { refs, floatingStyles, context } = react.useFloating({
49
- ...nodeId ? { nodeId } : {},
50
- open,
51
- onOpenChange: (next) => next ? setOpen(true) : closeMenu(),
52
- placement: "right-start",
53
- middleware: [react.offset(4), react.flip({ padding: 8 }), react.shift({ padding: 8 })],
54
- whileElementsMounted: react.autoUpdate
55
- });
56
- const dismiss = react.useDismiss(context, { escapeKey: false });
57
- const role = react.useRole(context, { role: "menu" });
58
- const listNavigation = react.useListNavigation(context, {
59
- listRef: elementsRef,
60
- activeIndex,
61
- onNavigate: setActiveIndex,
62
- loop: true
63
- });
64
- const { getFloatingProps, getItemProps } = react.useInteractions([
65
- dismiss,
66
- role,
67
- listNavigation
68
- ]);
69
- const openAt = react$1.useCallback(
70
- (x, y) => {
71
- if (!contextTarget || menuItems.length === 0) return;
72
- const active = document.activeElement;
73
- returnFocusRef.current = active instanceof HTMLElement ? active : contextTarget;
74
- refs.setPositionReference(pointReference(x, y, contextTarget));
75
- setActiveIndex(null);
76
- setOpen(true);
77
- },
78
- [contextTarget, menuItems.length, refs]
79
- );
80
- react$1.useEffect(() => {
81
- if (!contextTarget || menuItems.length === 0) return;
15
+ react.useEffect(() => {
16
+ if (!contextTarget) return;
82
17
  contextTarget.classList.add("group/cell-actions");
83
- const onContextMenu = (event) => {
84
- event.preventDefault();
85
- event.stopPropagation();
86
- openAt(event.clientX, event.clientY);
87
- };
88
- const onKeyDown = (event) => {
89
- if (event.key !== "ContextMenu" && !(event.key === "F10" && event.shiftKey)) return;
90
- event.preventDefault();
91
- event.stopPropagation();
92
- const rect = contextTarget.getBoundingClientRect();
93
- openAt(rect.left + 8, rect.top + Math.min(rect.height, 24));
94
- };
95
- contextTarget.addEventListener("contextmenu", onContextMenu);
96
- contextTarget.addEventListener("keydown", onKeyDown);
97
- return () => {
98
- contextTarget.classList.remove("group/cell-actions");
99
- contextTarget.removeEventListener("contextmenu", onContextMenu);
100
- contextTarget.removeEventListener("keydown", onKeyDown);
101
- };
102
- }, [contextTarget, menuItems.length, openAt]);
103
- react$1.useEffect(() => {
104
- if (!tree) return;
105
- tree.events.on("click", closeMenu);
106
- return () => tree.events.off("click", closeMenu);
107
- }, [closeMenu, tree]);
108
- modalStack.useEscapeLayer(open, closeMenu);
109
- return /* @__PURE__ */ jsxRuntime.jsxs(react.FloatingNode, { id: nodeId, children: [
18
+ return () => contextTarget.classList.remove("group/cell-actions");
19
+ }, [contextTarget]);
20
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
110
21
  /* @__PURE__ */ jsxRuntime.jsx(
111
22
  "span",
112
23
  {
113
- className: utils.cn("ms-1 inline-flex items-center gap-0.5 align-middle", className),
24
+ className: utils.cn(
25
+ "ms-1 inline-flex items-center gap-0.5 align-middle",
26
+ className
27
+ ),
114
28
  contentEditable: false,
115
29
  children
116
30
  }
117
31
  ),
118
- open && /* @__PURE__ */ jsxRuntime.jsx(react.FloatingPortal, { children: /* @__PURE__ */ jsxRuntime.jsx(react.FloatingFocusManager, { context, modal: false, returnFocus: false, children: /* @__PURE__ */ jsxRuntime.jsx(
119
- "div",
32
+ /* @__PURE__ */ jsxRuntime.jsx(
33
+ ContextMenu.ContextMenu,
120
34
  {
121
- ref: refs.setFloating,
122
- role: "menu",
123
- "aria-label": menuLabel,
124
- style: { ...floatingStyles, zIndex: floatingZ },
125
- className: dropdownMenuContext.MENU_POPOVER_CLASS,
126
- ...getFloatingProps(),
127
- children: /* @__PURE__ */ jsxRuntime.jsx(
128
- dropdownMenuContext.MenuContext.Provider,
129
- {
130
- value: {
131
- getItemProps,
132
- activeIndex,
133
- setActiveIndex,
134
- setHasFocusInside: () => {
135
- },
136
- isOpen: open
137
- },
138
- children: /* @__PURE__ */ jsxRuntime.jsx(react.FloatingList, { elementsRef, children: /* @__PURE__ */ jsxRuntime.jsx(DropdownMenuSubmenu.MenuItemList, { items: menuItems }) })
139
- }
140
- )
35
+ contextTarget,
36
+ menuLabel,
37
+ menuItems
141
38
  }
142
- ) }) })
39
+ )
143
40
  ] });
144
41
  }
145
- function CellActions(props) {
146
- return /* @__PURE__ */ jsxRuntime.jsx(react.FloatingTree, { children: /* @__PURE__ */ jsxRuntime.jsx(CellActionsRoot, { ...props }) });
147
- }
148
42
  function CellActionButton({
149
43
  label,
150
44
  icon,
@@ -1 +1 @@
1
- {"version":3,"file":"CellActions.cjs","sources":["../../src/overlay/CellActions.tsx"],"sourcesContent":["import {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n FloatingTree,\n offset,\n shift,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingTree,\n useInteractions,\n useListNavigation,\n useRole,\n type VirtualElement,\n} from \"@floating-ui/react\";\nimport {\n useCallback,\n useEffect,\n useRef,\n useState,\n type ButtonHTMLAttributes,\n type ReactNode,\n} from \"react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { cn } from \"../lib/utils\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { MenuItemList } from \"./DropdownMenuSubmenu\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\n\nexport type CellActionsProps = {\n contextTarget: HTMLElement | null;\n menuLabel: string;\n menuItems: DropdownMenuItem[];\n children: ReactNode;\n className?: string;\n};\n\nexport type CellActionButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"onClick\"\n> & {\n label: string;\n icon: StaticIconComponent;\n onSelect: () => void;\n};\n\nfunction pointReference(\n x: number,\n y: number,\n contextElement: HTMLElement,\n): VirtualElement {\n return {\n contextElement,\n getBoundingClientRect: () => ({\n x,\n y,\n top: y,\n left: x,\n right: x,\n bottom: y,\n width: 0,\n height: 0,\n toJSON: () => ({}),\n }),\n };\n}\n\nfunction CellActionsRoot({\n contextTarget,\n menuLabel,\n menuItems,\n children,\n className,\n}: CellActionsProps) {\n const [open, setOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const returnFocusRef = useRef<HTMLElement | null>(null);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n\n const closeMenu = useCallback(() => {\n setOpen(false);\n queueMicrotask(() => returnFocusRef.current?.focus({ preventScroll: true }));\n }, []);\n\n const { refs, floatingStyles, context } = useFloating<HTMLDivElement>({\n ...(nodeId ? { nodeId } : {}),\n open,\n onOpenChange: (next) => (next ? setOpen(true) : closeMenu()),\n placement: \"right-start\",\n middleware: [offset(4), flip({ padding: 8 }), shift({ padding: 8 })],\n whileElementsMounted: autoUpdate,\n });\n\n const dismiss = useDismiss(context, { escapeKey: false });\n const role = useRole(context, { role: \"menu\" });\n const listNavigation = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getFloatingProps, getItemProps } = useInteractions([\n dismiss,\n role,\n listNavigation,\n ]);\n\n const openAt = useCallback(\n (x: number, y: number) => {\n if (!contextTarget || menuItems.length === 0) return;\n const active = document.activeElement;\n returnFocusRef.current = active instanceof HTMLElement ? active : contextTarget;\n refs.setPositionReference(pointReference(x, y, contextTarget));\n setActiveIndex(null);\n setOpen(true);\n },\n [contextTarget, menuItems.length, refs],\n );\n\n useEffect(() => {\n if (!contextTarget || menuItems.length === 0) return;\n contextTarget.classList.add(\"group/cell-actions\");\n\n const onContextMenu = (event: MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n openAt(event.clientX, event.clientY);\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== \"ContextMenu\" && !(event.key === \"F10\" && event.shiftKey)) return;\n event.preventDefault();\n event.stopPropagation();\n const rect = contextTarget.getBoundingClientRect();\n openAt(rect.left + 8, rect.top + Math.min(rect.height, 24));\n };\n\n contextTarget.addEventListener(\"contextmenu\", onContextMenu);\n contextTarget.addEventListener(\"keydown\", onKeyDown);\n return () => {\n contextTarget.classList.remove(\"group/cell-actions\");\n contextTarget.removeEventListener(\"contextmenu\", onContextMenu);\n contextTarget.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [contextTarget, menuItems.length, openAt]);\n\n useEffect(() => {\n if (!tree) return;\n tree.events.on(\"click\", closeMenu);\n return () => tree.events.off(\"click\", closeMenu);\n }, [closeMenu, tree]);\n\n useEscapeLayer(open, closeMenu);\n\n return (\n <FloatingNode id={nodeId}>\n <span\n className={cn(\"ms-1 inline-flex items-center gap-0.5 align-middle\", className)}\n contentEditable={false}\n >\n {children}\n </span>\n {open && (\n <FloatingPortal>\n <FloatingFocusManager context={context} modal={false} returnFocus={false}>\n <div\n ref={refs.setFloating}\n role=\"menu\"\n aria-label={menuLabel}\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n >\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside: () => {},\n isOpen: open,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n <MenuItemList items={menuItems} />\n </FloatingList>\n </MenuContext.Provider>\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingNode>\n );\n}\n\nexport function CellActions(props: CellActionsProps) {\n return (\n <FloatingTree>\n <CellActionsRoot {...props} />\n </FloatingTree>\n );\n}\n\nexport function CellActionButton({\n label,\n icon,\n onSelect,\n className,\n title = label,\n onMouseDown,\n ...props\n}: CellActionButtonProps) {\n return (\n <button\n {...props}\n type=\"button\"\n title={title}\n aria-label={label}\n className={cn(\n \"inline-flex size-5 items-center justify-center rounded-full p-1 text-muted-foreground opacity-70 transition-colors transition-opacity hover:bg-primary/10 hover:text-primary hover:opacity-100 focus-visible:bg-primary/10 focus-visible:text-primary focus-visible:opacity-100 focus-visible:outline-none group-hover/cell-actions:opacity-95\",\n className,\n )}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onSelect();\n }}\n >\n <Icon icon={icon} className=\"text-sm\" />\n </button>\n );\n}\n"],"names":["useState","useRef","useFloatingZIndex","useFloatingTree","useFloatingNodeId","useCallback","useFloating","offset","flip","shift","autoUpdate","useDismiss","useRole","useListNavigation","useInteractions","useEffect","useEscapeLayer","jsxs","FloatingNode","jsx","cn","FloatingPortal","FloatingFocusManager","MENU_POPOVER_CLASS","MenuContext","FloatingList","MenuItemList","FloatingTree","Icon"],"mappings":"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"}
1
+ {"version":3,"file":"CellActions.cjs","sources":["../../src/overlay/CellActions.tsx"],"sourcesContent":["import { useEffect, type ButtonHTMLAttributes, type ReactNode } from \"react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { cn } from \"../lib/utils\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { ContextMenu } from \"./ContextMenu\";\n\nexport type CellActionsProps = {\n contextTarget: HTMLElement | null;\n menuLabel: string;\n menuItems: DropdownMenuItem[];\n children: ReactNode;\n className?: string;\n};\n\nexport type CellActionButtonProps = Omit<\n ButtonHTMLAttributes<HTMLButtonElement>,\n \"children\" | \"onClick\"\n> & {\n label: string;\n icon: StaticIconComponent;\n onSelect: () => void;\n};\n\nexport function CellActions({\n contextTarget,\n menuLabel,\n menuItems,\n children,\n className,\n}: CellActionsProps) {\n useEffect(() => {\n if (!contextTarget) return;\n contextTarget.classList.add(\"group/cell-actions\");\n return () => contextTarget.classList.remove(\"group/cell-actions\");\n }, [contextTarget]);\n\n return (\n <>\n <span\n className={cn(\n \"ms-1 inline-flex items-center gap-0.5 align-middle\",\n className,\n )}\n contentEditable={false}\n >\n {children}\n </span>\n <ContextMenu\n contextTarget={contextTarget}\n menuLabel={menuLabel}\n menuItems={menuItems}\n />\n </>\n );\n}\n\nexport function CellActionButton({\n label,\n icon,\n onSelect,\n className,\n title = label,\n onMouseDown,\n ...props\n}: CellActionButtonProps) {\n return (\n <button\n {...props}\n type=\"button\"\n title={title}\n aria-label={label}\n className={cn(\n \"inline-flex size-5 items-center justify-center rounded-full p-1 text-muted-foreground opacity-70 transition-colors transition-opacity hover:bg-primary/10 hover:text-primary hover:opacity-100 focus-visible:bg-primary/10 focus-visible:text-primary focus-visible:opacity-100 focus-visible:outline-none group-hover/cell-actions:opacity-95\",\n className,\n )}\n onMouseDown={(event) => {\n event.preventDefault();\n onMouseDown?.(event);\n }}\n onClick={(event) => {\n event.preventDefault();\n event.stopPropagation();\n onSelect();\n }}\n >\n <Icon icon={icon} className=\"text-sm\" />\n </button>\n );\n}\n"],"names":["useEffect","jsxs","Fragment","jsx","cn","ContextMenu","Icon"],"mappings":";;;;;;;AAuBO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAqB;AACnBA,QAAAA,UAAU,MAAM;AACd,QAAI,CAAC,cAAe;AACpB,kBAAc,UAAU,IAAI,oBAAoB;AAChD,WAAO,MAAM,cAAc,UAAU,OAAO,oBAAoB;AAAA,EAClE,GAAG,CAAC,aAAa,CAAC;AAElB,SACEC,2BAAAA,KAAAC,qBAAA,EACE,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,WAAWC,MAAAA;AAAAA,UACT;AAAA,UACA;AAAA,QAAA;AAAA,QAEF,iBAAiB;AAAA,QAEhB;AAAA,MAAA;AAAA,IAAA;AAAA,IAEHD,2BAAAA;AAAAA,MAACE,YAAAA;AAAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IAAA;AAAA,EACF,GACF;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,QAAQ;AAAA,EACR;AAAA,EACA,GAAG;AACL,GAA0B;AACxB,SACEF,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACE,GAAG;AAAA,MACJ,MAAK;AAAA,MACL;AAAA,MACA,cAAY;AAAA,MACZ,WAAWC,MAAAA;AAAAA,QACT;AAAA,QACA;AAAA,MAAA;AAAA,MAEF,aAAa,CAAC,UAAU;AACtB,cAAM,eAAA;AACN,mDAAc;AAAA,MAChB;AAAA,MACA,SAAS,CAAC,UAAU;AAClB,cAAM,eAAA;AACN,cAAM,gBAAA;AACN,iBAAA;AAAA,MACF;AAAA,MAEA,UAAAD,2BAAAA,IAACG,KAAAA,MAAA,EAAK,MAAY,WAAU,UAAA,CAAU;AAAA,IAAA;AAAA,EAAA;AAG5C;;;"}
@@ -13,6 +13,6 @@ export type CellActionButtonProps = Omit<ButtonHTMLAttributes<HTMLButtonElement>
13
13
  icon: StaticIconComponent;
14
14
  onSelect: () => void;
15
15
  };
16
- export declare function CellActions(props: CellActionsProps): import("react/jsx-runtime").JSX.Element;
16
+ export declare function CellActions({ contextTarget, menuLabel, menuItems, children, className, }: CellActionsProps): import("react/jsx-runtime").JSX.Element;
17
17
  export declare function CellActionButton({ label, icon, onSelect, className, title, onMouseDown, ...props }: CellActionButtonProps): import("react/jsx-runtime").JSX.Element;
18
18
  //# sourceMappingURL=CellActions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"CellActions.d.ts","sourceRoot":"","sources":["../../src/overlay/CellActions.tsx"],"names":[],"mappings":"AAmBA,OAAO,EAKL,KAAK,oBAAoB,EACzB,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AACf,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAKvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,GAAG,SAAS,CACvB,GAAG;IACF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAwJF,wBAAgB,WAAW,CAAC,KAAK,EAAE,gBAAgB,2CAMlD;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,KAAa,EACb,WAAW,EACX,GAAG,KAAK,EACT,EAAE,qBAAqB,2CAwBvB"}
1
+ {"version":3,"file":"CellActions.d.ts","sourceRoot":"","sources":["../../src/overlay/CellActions.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAa,KAAK,oBAAoB,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAE9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,MAAM,MAAM,gBAAgB,GAAG;IAC7B,aAAa,EAAE,WAAW,GAAG,IAAI,CAAC;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,gBAAgB,EAAE,CAAC;IAC9B,QAAQ,EAAE,SAAS,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG,IAAI,CACtC,oBAAoB,CAAC,iBAAiB,CAAC,EACvC,UAAU,GAAG,SAAS,CACvB,GAAG;IACF,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,mBAAmB,CAAC;IAC1B,QAAQ,EAAE,MAAM,IAAI,CAAC;CACtB,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAC1B,aAAa,EACb,SAAS,EACT,SAAS,EACT,QAAQ,EACR,SAAS,GACV,EAAE,gBAAgB,2CAyBlB;AAED,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,IAAI,EACJ,QAAQ,EACR,SAAS,EACT,KAAa,EACb,WAAW,EACX,GAAG,KAAK,EACT,EAAE,qBAAqB,2CAwBvB"}