@flanksource/clicky-ui 0.2.14 → 0.2.15

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 (461) hide show
  1. package/dist/chat.cjs +20 -0
  2. package/dist/chat.cjs.map +1 -0
  3. package/dist/chat.d.ts +2 -0
  4. package/dist/chat.d.ts.map +1 -0
  5. package/dist/chat.js +20 -0
  6. package/dist/chat.js.map +1 -0
  7. package/dist/components/Combobox.cjs +5 -3
  8. package/dist/components/Combobox.cjs.map +1 -1
  9. package/dist/components/Combobox.d.ts +2 -0
  10. package/dist/components/Combobox.d.ts.map +1 -1
  11. package/dist/components/Combobox.js +5 -3
  12. package/dist/components/Combobox.js.map +1 -1
  13. package/dist/components/DateTimePicker.cjs +3 -1
  14. package/dist/components/DateTimePicker.cjs.map +1 -1
  15. package/dist/components/DateTimePicker.d.ts +5 -1
  16. package/dist/components/DateTimePicker.d.ts.map +1 -1
  17. package/dist/components/DateTimePicker.js +3 -1
  18. package/dist/components/DateTimePicker.js.map +1 -1
  19. package/dist/components/FilterBar.cjs +8 -41
  20. package/dist/components/FilterBar.cjs.map +1 -1
  21. package/dist/components/FilterBar.d.ts +0 -2
  22. package/dist/components/FilterBar.d.ts.map +1 -1
  23. package/dist/components/FilterBar.js +3 -36
  24. package/dist/components/FilterBar.js.map +1 -1
  25. package/dist/components/FormatOptionsDropdown.cjs +2 -18
  26. package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
  27. package/dist/components/FormatOptionsDropdown.d.ts +1 -17
  28. package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
  29. package/dist/components/FormatOptionsDropdown.js +1 -17
  30. package/dist/components/FormatOptionsDropdown.js.map +1 -1
  31. package/dist/components/JsonSchemaForm.cjs +128 -12
  32. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  33. package/dist/components/JsonSchemaForm.d.ts +1 -1
  34. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  35. package/dist/components/JsonSchemaForm.js +131 -15
  36. package/dist/components/JsonSchemaForm.js.map +1 -1
  37. package/dist/components/SecretKeySelector.cjs +0 -1
  38. package/dist/components/SecretKeySelector.cjs.map +1 -1
  39. package/dist/components/SecretKeySelector.d.ts +0 -2
  40. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  41. package/dist/components/SecretKeySelector.js +1 -2
  42. package/dist/components/SecretKeySelector.js.map +1 -1
  43. package/dist/components/TreePickerField.cjs +137 -0
  44. package/dist/components/TreePickerField.cjs.map +1 -0
  45. package/dist/components/TreePickerField.d.ts +30 -0
  46. package/dist/components/TreePickerField.d.ts.map +1 -0
  47. package/dist/components/TreePickerField.js +137 -0
  48. package/dist/components/TreePickerField.js.map +1 -0
  49. package/dist/components/WorkloadPicker.cjs +6 -81
  50. package/dist/components/WorkloadPicker.cjs.map +1 -1
  51. package/dist/components/WorkloadPicker.d.ts +1 -20
  52. package/dist/components/WorkloadPicker.d.ts.map +1 -1
  53. package/dist/components/WorkloadPicker.js +3 -78
  54. package/dist/components/WorkloadPicker.js.map +1 -1
  55. package/dist/components/button-variants.cjs +30 -0
  56. package/dist/components/button-variants.cjs.map +1 -0
  57. package/dist/components/button-variants.d.ts +5 -0
  58. package/dist/components/button-variants.d.ts.map +1 -0
  59. package/dist/components/button-variants.js +30 -0
  60. package/dist/components/button-variants.js.map +1 -0
  61. package/dist/components/button.cjs +11 -82
  62. package/dist/components/button.cjs.map +1 -1
  63. package/dist/components/button.d.ts +1 -5
  64. package/dist/components/button.d.ts.map +1 -1
  65. package/dist/components/button.js +5 -76
  66. package/dist/components/button.js.map +1 -1
  67. package/dist/components/filter-bar-utils.cjs +37 -0
  68. package/dist/components/filter-bar-utils.cjs.map +1 -0
  69. package/dist/components/filter-bar-utils.d.ts +4 -0
  70. package/dist/components/filter-bar-utils.d.ts.map +1 -0
  71. package/dist/components/filter-bar-utils.js +37 -0
  72. package/dist/components/filter-bar-utils.js.map +1 -0
  73. package/dist/components/format-options.cjs +20 -0
  74. package/dist/components/format-options.cjs.map +1 -0
  75. package/dist/components/format-options.d.ts +18 -0
  76. package/dist/components/format-options.d.ts.map +1 -0
  77. package/dist/components/format-options.js +20 -0
  78. package/dist/components/format-options.js.map +1 -0
  79. package/dist/components/json-schema-form-array.cjs +13 -17
  80. package/dist/components/json-schema-form-array.cjs.map +1 -1
  81. package/dist/components/json-schema-form-array.d.ts +1 -2
  82. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  83. package/dist/components/json-schema-form-array.js +3 -7
  84. package/dist/components/json-schema-form-array.js.map +1 -1
  85. package/dist/components/json-schema-form-fields.cjs +90 -232
  86. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  87. package/dist/components/json-schema-form-fields.d.ts +51 -6
  88. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-fields.js +82 -224
  90. package/dist/components/json-schema-form-fields.js.map +1 -1
  91. package/dist/components/json-schema-form-object.cjs +149 -0
  92. package/dist/components/json-schema-form-object.cjs.map +1 -0
  93. package/dist/components/json-schema-form-object.d.ts +10 -0
  94. package/dist/components/json-schema-form-object.d.ts.map +1 -0
  95. package/dist/components/json-schema-form-object.js +149 -0
  96. package/dist/components/json-schema-form-object.js.map +1 -0
  97. package/dist/components/json-schema-form-preferences.cjs +41 -0
  98. package/dist/components/json-schema-form-preferences.cjs.map +1 -0
  99. package/dist/components/json-schema-form-preferences.d.ts +10 -0
  100. package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-preferences.js +41 -0
  102. package/dist/components/json-schema-form-preferences.js.map +1 -0
  103. package/dist/components/json-schema-form-render.cjs +43 -72
  104. package/dist/components/json-schema-form-render.cjs.map +1 -1
  105. package/dist/components/json-schema-form-render.d.ts +5 -33
  106. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  107. package/dist/components/json-schema-form-render.js +41 -70
  108. package/dist/components/json-schema-form-render.js.map +1 -1
  109. package/dist/components/json-schema-form-resolve.cjs +9 -1
  110. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  111. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  112. package/dist/components/json-schema-form-resolve.js +9 -1
  113. package/dist/components/json-schema-form-resolve.js.map +1 -1
  114. package/dist/components/json-schema-form-types.d.ts +58 -1
  115. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  116. package/dist/components/json-schema-form-utils.cjs +96 -0
  117. package/dist/components/json-schema-form-utils.cjs.map +1 -0
  118. package/dist/components/json-schema-form-utils.d.ts +17 -0
  119. package/dist/components/json-schema-form-utils.d.ts.map +1 -0
  120. package/dist/components/json-schema-form-utils.js +96 -0
  121. package/dist/components/json-schema-form-utils.js.map +1 -0
  122. package/dist/components/loading.cjs +109 -0
  123. package/dist/components/loading.cjs.map +1 -0
  124. package/dist/components/loading.d.ts +27 -0
  125. package/dist/components/loading.d.ts.map +1 -0
  126. package/dist/components/loading.js +109 -0
  127. package/dist/components/loading.js.map +1 -0
  128. package/dist/components/workload-picker-utils.cjs +88 -0
  129. package/dist/components/workload-picker-utils.cjs.map +1 -0
  130. package/dist/components/workload-picker-utils.d.ts +34 -0
  131. package/dist/components/workload-picker-utils.d.ts.map +1 -0
  132. package/dist/components/workload-picker-utils.js +88 -0
  133. package/dist/components/workload-picker-utils.js.map +1 -0
  134. package/dist/components.cjs +18 -6
  135. package/dist/components.cjs.map +1 -1
  136. package/dist/components.d.ts +10 -3
  137. package/dist/components.d.ts.map +1 -1
  138. package/dist/components.js +16 -4
  139. package/dist/components.js.map +1 -1
  140. package/dist/data/Badge.cjs +11 -91
  141. package/dist/data/Badge.cjs.map +1 -1
  142. package/dist/data/Badge.d.ts +1 -5
  143. package/dist/data/Badge.d.ts.map +1 -1
  144. package/dist/data/Badge.js +11 -91
  145. package/dist/data/Badge.js.map +1 -1
  146. package/dist/data/Clicky.cjs +4 -3
  147. package/dist/data/Clicky.cjs.map +1 -1
  148. package/dist/data/Clicky.d.ts.map +1 -1
  149. package/dist/data/Clicky.js +4 -3
  150. package/dist/data/Clicky.js.map +1 -1
  151. package/dist/data/DataTable.cjs +161 -156
  152. package/dist/data/DataTable.cjs.map +1 -1
  153. package/dist/data/DataTable.d.ts +25 -4
  154. package/dist/data/DataTable.d.ts.map +1 -1
  155. package/dist/data/DataTable.js +140 -135
  156. package/dist/data/DataTable.js.map +1 -1
  157. package/dist/data/FilterPill.cjs +3 -0
  158. package/dist/data/FilterPill.cjs.map +1 -1
  159. package/dist/data/FilterPill.d.ts.map +1 -1
  160. package/dist/data/FilterPill.js +3 -0
  161. package/dist/data/FilterPill.js.map +1 -1
  162. package/dist/data/Icon.cjs +7 -7
  163. package/dist/data/Icon.cjs.map +1 -1
  164. package/dist/data/Icon.js +7 -7
  165. package/dist/data/Icon.js.map +1 -1
  166. package/dist/data/LogDetails.cjs +5 -14
  167. package/dist/data/LogDetails.cjs.map +1 -1
  168. package/dist/data/LogDetails.d.ts +8 -4
  169. package/dist/data/LogDetails.d.ts.map +1 -1
  170. package/dist/data/LogDetails.js +4 -13
  171. package/dist/data/LogDetails.js.map +1 -1
  172. package/dist/data/LogsTable.cjs +6 -165
  173. package/dist/data/LogsTable.cjs.map +1 -1
  174. package/dist/data/LogsTable.d.ts +2 -15
  175. package/dist/data/LogsTable.d.ts.map +1 -1
  176. package/dist/data/LogsTable.js +6 -165
  177. package/dist/data/LogsTable.js.map +1 -1
  178. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
  179. package/dist/data/TimeseriesPanel.axes.js.map +1 -1
  180. package/dist/data/TreeNode.cjs +13 -7
  181. package/dist/data/TreeNode.cjs.map +1 -1
  182. package/dist/data/TreeNode.d.ts.map +1 -1
  183. package/dist/data/TreeNode.js +13 -7
  184. package/dist/data/TreeNode.js.map +1 -1
  185. package/dist/data/badge-variants.cjs +85 -0
  186. package/dist/data/badge-variants.cjs.map +1 -0
  187. package/dist/data/badge-variants.d.ts +6 -0
  188. package/dist/data/badge-variants.d.ts.map +1 -0
  189. package/dist/data/badge-variants.js +85 -0
  190. package/dist/data/badge-variants.js.map +1 -0
  191. package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
  192. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
  193. package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
  194. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
  195. package/dist/data/cache-browser/CacheBrowser.js +59 -0
  196. package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
  197. package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
  198. package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
  199. package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
  200. package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
  201. package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
  202. package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
  203. package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
  204. package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
  205. package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
  206. package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
  207. package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
  208. package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
  209. package/dist/data/cache-browser/CacheTree.cjs +189 -0
  210. package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
  211. package/dist/data/cache-browser/CacheTree.d.ts +27 -0
  212. package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
  213. package/dist/data/cache-browser/CacheTree.js +189 -0
  214. package/dist/data/cache-browser/CacheTree.js.map +1 -0
  215. package/dist/data/cache-browser/CacheValue.cjs +86 -0
  216. package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
  217. package/dist/data/cache-browser/CacheValue.d.ts +11 -0
  218. package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
  219. package/dist/data/cache-browser/CacheValue.js +86 -0
  220. package/dist/data/cache-browser/CacheValue.js.map +1 -0
  221. package/dist/data/cache-browser/adapter.cjs +52 -0
  222. package/dist/data/cache-browser/adapter.cjs.map +1 -0
  223. package/dist/data/cache-browser/adapter.d.ts +48 -0
  224. package/dist/data/cache-browser/adapter.d.ts.map +1 -0
  225. package/dist/data/cache-browser/adapter.js +52 -0
  226. package/dist/data/cache-browser/adapter.js.map +1 -0
  227. package/dist/data/cache-browser/api.cjs +42 -0
  228. package/dist/data/cache-browser/api.cjs.map +1 -0
  229. package/dist/data/cache-browser/api.d.ts +33 -0
  230. package/dist/data/cache-browser/api.d.ts.map +1 -0
  231. package/dist/data/cache-browser/api.js +42 -0
  232. package/dist/data/cache-browser/api.js.map +1 -0
  233. package/dist/data/cache-browser/index.d.ts +9 -0
  234. package/dist/data/cache-browser/index.d.ts.map +1 -0
  235. package/dist/data/cache-browser/types.cjs +7 -0
  236. package/dist/data/cache-browser/types.cjs.map +1 -0
  237. package/dist/data/cache-browser/types.d.ts +78 -0
  238. package/dist/data/cache-browser/types.d.ts.map +1 -0
  239. package/dist/data/cache-browser/types.js +7 -0
  240. package/dist/data/cache-browser/types.js.map +1 -0
  241. package/dist/data/cells/TagList.cjs +4 -101
  242. package/dist/data/cells/TagList.cjs.map +1 -1
  243. package/dist/data/cells/TagList.d.ts +1 -49
  244. package/dist/data/cells/TagList.d.ts.map +1 -1
  245. package/dist/data/cells/TagList.js +3 -100
  246. package/dist/data/cells/TagList.js.map +1 -1
  247. package/dist/data/cells/Timestamp.cjs +3 -192
  248. package/dist/data/cells/Timestamp.cjs.map +1 -1
  249. package/dist/data/cells/Timestamp.d.ts +1 -50
  250. package/dist/data/cells/Timestamp.d.ts.map +1 -1
  251. package/dist/data/cells/Timestamp.js +2 -191
  252. package/dist/data/cells/Timestamp.js.map +1 -1
  253. package/dist/data/cells/tag-utils.cjs +103 -0
  254. package/dist/data/cells/tag-utils.cjs.map +1 -0
  255. package/dist/data/cells/tag-utils.d.ts +51 -0
  256. package/dist/data/cells/tag-utils.d.ts.map +1 -0
  257. package/dist/data/cells/tag-utils.js +103 -0
  258. package/dist/data/cells/tag-utils.js.map +1 -0
  259. package/dist/data/cells/timestamp-format.cjs +193 -0
  260. package/dist/data/cells/timestamp-format.cjs.map +1 -0
  261. package/dist/data/cells/timestamp-format.d.ts +51 -0
  262. package/dist/data/cells/timestamp-format.d.ts.map +1 -0
  263. package/dist/data/cells/timestamp-format.js +193 -0
  264. package/dist/data/cells/timestamp-format.js.map +1 -0
  265. package/dist/data/chat/Chat.cjs +48 -0
  266. package/dist/data/chat/Chat.cjs.map +1 -0
  267. package/dist/data/chat/Chat.d.ts +26 -0
  268. package/dist/data/chat/Chat.d.ts.map +1 -0
  269. package/dist/data/chat/Chat.fixtures.d.ts +6 -0
  270. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
  271. package/dist/data/chat/Chat.js +48 -0
  272. package/dist/data/chat/Chat.js.map +1 -0
  273. package/dist/data/chat/Conversation.cjs +34 -0
  274. package/dist/data/chat/Conversation.cjs.map +1 -0
  275. package/dist/data/chat/Conversation.d.ts +11 -0
  276. package/dist/data/chat/Conversation.d.ts.map +1 -0
  277. package/dist/data/chat/Conversation.js +34 -0
  278. package/dist/data/chat/Conversation.js.map +1 -0
  279. package/dist/data/chat/Message.cjs +44 -0
  280. package/dist/data/chat/Message.cjs.map +1 -0
  281. package/dist/data/chat/Message.d.ts +10 -0
  282. package/dist/data/chat/Message.d.ts.map +1 -0
  283. package/dist/data/chat/Message.js +44 -0
  284. package/dist/data/chat/Message.js.map +1 -0
  285. package/dist/data/chat/PromptInput.cjs +61 -0
  286. package/dist/data/chat/PromptInput.cjs.map +1 -0
  287. package/dist/data/chat/PromptInput.d.ts +16 -0
  288. package/dist/data/chat/PromptInput.d.ts.map +1 -0
  289. package/dist/data/chat/PromptInput.js +61 -0
  290. package/dist/data/chat/PromptInput.js.map +1 -0
  291. package/dist/data/chat/ToolCall.cjs +92 -0
  292. package/dist/data/chat/ToolCall.cjs.map +1 -0
  293. package/dist/data/chat/ToolCall.d.ts +14 -0
  294. package/dist/data/chat/ToolCall.d.ts.map +1 -0
  295. package/dist/data/chat/ToolCall.js +92 -0
  296. package/dist/data/chat/ToolCall.js.map +1 -0
  297. package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
  298. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
  299. package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
  300. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
  301. package/dist/data/chat/clickyOperationsToTools.js +73 -0
  302. package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
  303. package/dist/data/chat/index.d.ts +8 -0
  304. package/dist/data/chat/index.d.ts.map +1 -0
  305. package/dist/data/chat/types.cjs +18 -0
  306. package/dist/data/chat/types.cjs.map +1 -0
  307. package/dist/data/chat/types.d.ts +41 -0
  308. package/dist/data/chat/types.d.ts.map +1 -0
  309. package/dist/data/chat/types.js +18 -0
  310. package/dist/data/chat/types.js.map +1 -0
  311. package/dist/data/data-table-utils.cjs +55 -0
  312. package/dist/data/data-table-utils.cjs.map +1 -0
  313. package/dist/data/data-table-utils.d.ts +24 -0
  314. package/dist/data/data-table-utils.d.ts.map +1 -0
  315. package/dist/data/data-table-utils.js +55 -0
  316. package/dist/data/data-table-utils.js.map +1 -0
  317. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
  318. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  319. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  320. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
  321. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  322. package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
  323. package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
  324. package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
  325. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
  326. package/dist/data/diagnostics/GoroutineCard.js +2 -21
  327. package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
  328. package/dist/data/diagnostics/ThreadCard.cjs +3 -38
  329. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  330. package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
  331. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  332. package/dist/data/diagnostics/ThreadCard.js +2 -37
  333. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  334. package/dist/data/diagnostics/state-styles.cjs +59 -0
  335. package/dist/data/diagnostics/state-styles.cjs.map +1 -0
  336. package/dist/data/diagnostics/state-styles.d.ts +5 -0
  337. package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
  338. package/dist/data/diagnostics/state-styles.js +59 -0
  339. package/dist/data/diagnostics/state-styles.js.map +1 -0
  340. package/dist/data/logs-normalize.cjs +166 -0
  341. package/dist/data/logs-normalize.cjs.map +1 -0
  342. package/dist/data/logs-normalize.d.ts +16 -0
  343. package/dist/data/logs-normalize.d.ts.map +1 -0
  344. package/dist/data/logs-normalize.js +166 -0
  345. package/dist/data/logs-normalize.js.map +1 -0
  346. package/dist/data/task-status.cjs +19 -19
  347. package/dist/data/task-status.cjs.map +1 -1
  348. package/dist/data/task-status.js +19 -19
  349. package/dist/data/task-status.js.map +1 -1
  350. package/dist/data/version-info.cjs +3 -3
  351. package/dist/data/version-info.js +3 -3
  352. package/dist/data.cjs +43 -18
  353. package/dist/data.cjs.map +1 -1
  354. package/dist/data.d.ts +11 -5
  355. package/dist/data.d.ts.map +1 -1
  356. package/dist/data.js +30 -5
  357. package/dist/data.js.map +1 -1
  358. package/dist/hooks/density-provider.cjs +38 -0
  359. package/dist/hooks/density-provider.cjs.map +1 -0
  360. package/dist/hooks/density-provider.d.ts +20 -0
  361. package/dist/hooks/density-provider.d.ts.map +1 -0
  362. package/dist/hooks/density-provider.js +38 -0
  363. package/dist/hooks/density-provider.js.map +1 -0
  364. package/dist/hooks/theme-provider.cjs +43 -0
  365. package/dist/hooks/theme-provider.cjs.map +1 -0
  366. package/dist/hooks/theme-provider.d.ts +9 -0
  367. package/dist/hooks/theme-provider.d.ts.map +1 -0
  368. package/dist/hooks/theme-provider.js +43 -0
  369. package/dist/hooks/theme-provider.js.map +1 -0
  370. package/dist/hooks/use-density.cjs +8 -37
  371. package/dist/hooks/use-density.cjs.map +1 -1
  372. package/dist/hooks/use-density.d.ts +5 -20
  373. package/dist/hooks/use-density.d.ts.map +1 -1
  374. package/dist/hooks/use-density.js +9 -38
  375. package/dist/hooks/use-density.js.map +1 -1
  376. package/dist/hooks/use-theme.cjs +10 -43
  377. package/dist/hooks/use-theme.cjs.map +1 -1
  378. package/dist/hooks/use-theme.d.ts +6 -9
  379. package/dist/hooks/use-theme.d.ts.map +1 -1
  380. package/dist/hooks/use-theme.js +11 -44
  381. package/dist/hooks/use-theme.js.map +1 -1
  382. package/dist/hooks.cjs +5 -2
  383. package/dist/hooks.cjs.map +1 -1
  384. package/dist/hooks.d.ts +4 -2
  385. package/dist/hooks.d.ts.map +1 -1
  386. package/dist/hooks.js +5 -2
  387. package/dist/hooks.js.map +1 -1
  388. package/dist/icons/changeIconAliases.cjs +13 -13
  389. package/dist/icons/changeIconAliases.cjs.map +1 -1
  390. package/dist/icons/changeIconAliases.d.ts.map +1 -1
  391. package/dist/icons/changeIconAliases.js +13 -13
  392. package/dist/icons/changeIconAliases.js.map +1 -1
  393. package/dist/index.cjs +71 -30
  394. package/dist/index.cjs.map +1 -1
  395. package/dist/index.js +53 -12
  396. package/dist/index.js.map +1 -1
  397. package/dist/overlay/DropdownMenu.cjs +2 -0
  398. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  399. package/dist/overlay/DropdownMenu.d.ts +3 -1
  400. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  401. package/dist/overlay/DropdownMenu.js +2 -0
  402. package/dist/overlay/DropdownMenu.js.map +1 -1
  403. package/dist/overlay/Modal.cjs +11 -4
  404. package/dist/overlay/Modal.cjs.map +1 -1
  405. package/dist/overlay/Modal.d.ts +1 -1
  406. package/dist/overlay/Modal.d.ts.map +1 -1
  407. package/dist/overlay/Modal.js +11 -4
  408. package/dist/overlay/Modal.js.map +1 -1
  409. package/dist/overlay/modalStack.cjs +35 -0
  410. package/dist/overlay/modalStack.cjs.map +1 -0
  411. package/dist/overlay/modalStack.d.ts +13 -0
  412. package/dist/overlay/modalStack.d.ts.map +1 -0
  413. package/dist/overlay/modalStack.js +35 -0
  414. package/dist/overlay/modalStack.js.map +1 -0
  415. package/dist/rpc/AcceptPicker.cjs +2 -18
  416. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  417. package/dist/rpc/AcceptPicker.d.ts +1 -41
  418. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  419. package/dist/rpc/AcceptPicker.js +2 -18
  420. package/dist/rpc/AcceptPicker.js.map +1 -1
  421. package/dist/rpc/CommandOutput.cjs +1 -1
  422. package/dist/rpc/CommandOutput.cjs.map +1 -1
  423. package/dist/rpc/CommandOutput.js +1 -1
  424. package/dist/rpc/CommandOutput.js.map +1 -1
  425. package/dist/rpc/EndpointList.cjs +1 -1
  426. package/dist/rpc/EndpointList.cjs.map +1 -1
  427. package/dist/rpc/EndpointList.js +1 -1
  428. package/dist/rpc/EndpointList.js.map +1 -1
  429. package/dist/rpc/OperationCatalog.cjs +23 -41
  430. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  431. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  432. package/dist/rpc/OperationCatalog.js +24 -42
  433. package/dist/rpc/OperationCatalog.js.map +1 -1
  434. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  435. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  436. package/dist/rpc/OperationCommandPage.js.map +1 -1
  437. package/dist/rpc/accept-options.cjs +20 -0
  438. package/dist/rpc/accept-options.cjs.map +1 -0
  439. package/dist/rpc/accept-options.d.ts +42 -0
  440. package/dist/rpc/accept-options.d.ts.map +1 -0
  441. package/dist/rpc/accept-options.js +20 -0
  442. package/dist/rpc/accept-options.js.map +1 -0
  443. package/dist/rpc/classify.cjs +15 -4
  444. package/dist/rpc/classify.cjs.map +1 -1
  445. package/dist/rpc/classify.d.ts.map +1 -1
  446. package/dist/rpc/classify.js +15 -4
  447. package/dist/rpc/classify.js.map +1 -1
  448. package/dist/rpc/clickyMetadata.cjs +13 -3
  449. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  450. package/dist/rpc/clickyMetadata.d.ts +2 -0
  451. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  452. package/dist/rpc/clickyMetadata.js +14 -4
  453. package/dist/rpc/clickyMetadata.js.map +1 -1
  454. package/dist/rpc.cjs +3 -2
  455. package/dist/rpc.cjs.map +1 -1
  456. package/dist/rpc.d.ts +2 -1
  457. package/dist/rpc.d.ts.map +1 -1
  458. package/dist/rpc.js +2 -1
  459. package/dist/rpc.js.map +1 -1
  460. package/dist/styles.css +1 -1
  461. package/package.json +16 -1
@@ -1,44 +1,4 @@
1
- export declare const ACCEPT_OPTIONS: readonly [{
2
- readonly value: "application/json";
3
- readonly label: "JSON";
4
- }, {
5
- readonly value: "application/clicky+json";
6
- readonly label: "Clicky";
7
- }, {
8
- readonly value: "text/markdown";
9
- readonly label: "Markdown";
10
- }, {
11
- readonly value: "text/html";
12
- readonly label: "HTML";
13
- }, {
14
- readonly value: "application/x-yaml";
15
- readonly label: "YAML";
16
- }, {
17
- readonly value: "text/csv";
18
- readonly label: "CSV";
19
- }, {
20
- readonly value: "application/pdf";
21
- readonly label: "PDF";
22
- }, {
23
- readonly value: "text/plain";
24
- readonly label: "Pretty";
25
- }];
26
- export declare const VIEW_OPTIONS: readonly [{
27
- readonly value: "application/json";
28
- readonly label: "JSON";
29
- }, {
30
- readonly value: "application/clicky+json";
31
- readonly label: "Clicky";
32
- }, {
33
- readonly value: "application/pdf";
34
- readonly label: "PDF";
35
- }];
36
- export type AcceptOption = {
37
- value: string;
38
- label: string;
39
- };
40
- export type AcceptValue = (typeof ACCEPT_OPTIONS)[number]["value"];
41
- export type OperationPreviewMode = "hidden" | "curl" | "cli";
1
+ import { AcceptOption, OperationPreviewMode } from './accept-options';
42
2
  export type AcceptPickerProps = {
43
3
  value: string;
44
4
  onChange: (value: string) => void;
@@ -1 +1 @@
1
- {"version":3,"file":"AcceptPicker.d.ts","sourceRoot":"","sources":["../../src/rpc/AcceptPicker.tsx"],"names":[],"mappings":"AAMA,eAAO,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;EASjB,CAAC;AAEX,eAAO,MAAM,YAAY;;;;;;;;;EAIf,CAAC;AAEX,MAAM,MAAM,YAAY,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC;AACnE,MAAM,MAAM,oBAAoB,GAAG,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC;AAE7D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,IAAW,EACX,OAAwB,EACxB,WAAsB,EACtB,mBAAmB,EACnB,SAAS,GACV,EAAE,iBAAiB,2CAyFnB"}
1
+ {"version":3,"file":"AcceptPicker.d.ts","sourceRoot":"","sources":["../../src/rpc/AcceptPicker.tsx"],"names":[],"mappings":"AAKA,OAAO,EAEL,KAAK,YAAY,EACjB,KAAK,oBAAoB,EAC1B,MAAM,kBAAkB,CAAC;AAE1B,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACnB,OAAO,CAAC,EAAE,SAAS,YAAY,EAAE,CAAC;IAClC,WAAW,CAAC,EAAE,oBAAoB,CAAC;IACnC,mBAAmB,CAAC,EAAE,CAAC,IAAI,EAAE,oBAAoB,KAAK,IAAI,CAAC;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAQF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,QAAQ,EACR,IAAW,EACX,OAAwB,EACxB,WAAsB,EACtB,mBAAmB,EACnB,SAAS,GACV,EAAE,iBAAiB,2CAyFnB"}
@@ -3,23 +3,9 @@ import { useRef, useState, useEffect } from "react";
3
3
  import { Button } from "../components/button.js";
4
4
  import { Icon } from "../data/Icon.js";
5
5
  import { cn } from "../lib/utils.js";
6
+ import { ACCEPT_OPTIONS } from "./accept-options.js";
6
7
  import { UiEllipsis } from "../icons/components/UiEllipsis.js";
7
8
  import { UiCheck } from "../icons/components/UiCheck.js";
8
- const ACCEPT_OPTIONS = [
9
- { value: "application/json", label: "JSON" },
10
- { value: "application/clicky+json", label: "Clicky" },
11
- { value: "text/markdown", label: "Markdown" },
12
- { value: "text/html", label: "HTML" },
13
- { value: "application/x-yaml", label: "YAML" },
14
- { value: "text/csv", label: "CSV" },
15
- { value: "application/pdf", label: "PDF" },
16
- { value: "text/plain", label: "Pretty" }
17
- ];
18
- const VIEW_OPTIONS = [
19
- { value: "application/json", label: "JSON" },
20
- { value: "application/clicky+json", label: "Clicky" },
21
- { value: "application/pdf", label: "PDF" }
22
- ];
23
9
  const PREVIEW_OPTIONS = [
24
10
  { value: "curl", label: "Show cURL preview" },
25
11
  { value: "cli", label: "Show CLI preview" },
@@ -121,8 +107,6 @@ function AcceptPicker({
121
107
  ] });
122
108
  }
123
109
  export {
124
- ACCEPT_OPTIONS,
125
- AcceptPicker,
126
- VIEW_OPTIONS
110
+ AcceptPicker
127
111
  };
128
112
  //# sourceMappingURL=AcceptPicker.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"AcceptPicker.js","sources":["../../src/rpc/AcceptPicker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiEllipsis, UiCheck } from \"../icons\";\nimport { cn } from \"../lib/utils\";\n\nexport const ACCEPT_OPTIONS = [\n { value: \"application/json\", label: \"JSON\" },\n { value: \"application/clicky+json\", label: \"Clicky\" },\n { value: \"text/markdown\", label: \"Markdown\" },\n { value: \"text/html\", label: \"HTML\" },\n { value: \"application/x-yaml\", label: \"YAML\" },\n { value: \"text/csv\", label: \"CSV\" },\n { value: \"application/pdf\", label: \"PDF\" },\n { value: \"text/plain\", label: \"Pretty\" },\n] as const;\n\nexport const VIEW_OPTIONS = [\n { value: \"application/json\", label: \"JSON\" },\n { value: \"application/clicky+json\", label: \"Clicky\" },\n { value: \"application/pdf\", label: \"PDF\" },\n] as const;\n\nexport type AcceptOption = { value: string; label: string };\nexport type AcceptValue = (typeof ACCEPT_OPTIONS)[number][\"value\"];\nexport type OperationPreviewMode = \"hidden\" | \"curl\" | \"cli\";\n\nexport type AcceptPickerProps = {\n value: string;\n onChange: (value: string) => void;\n size?: \"sm\" | \"md\";\n options?: readonly AcceptOption[];\n previewMode?: OperationPreviewMode;\n onPreviewModeChange?: (mode: OperationPreviewMode) => void;\n className?: string;\n};\n\nconst PREVIEW_OPTIONS: Array<{ value: OperationPreviewMode; label: string }> = [\n { value: \"curl\", label: \"Show cURL preview\" },\n { value: \"cli\", label: \"Show CLI preview\" },\n { value: \"hidden\", label: \"Hide preview\" },\n];\n\nexport function AcceptPicker({\n value,\n onChange,\n size = \"md\",\n options = ACCEPT_OPTIONS,\n previewMode = \"hidden\",\n onPreviewModeChange,\n className,\n}: AcceptPickerProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const pad = size === \"sm\" ? \"px-2 py-0.5\" : \"px-2.5 py-1\";\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={rootRef} className={cn(\"relative flex flex-wrap gap-1\", className)}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"rounded-md border text-xs transition-colors\",\n pad,\n value === opt.value\n ? \"border-emerald-500 bg-emerald-50 font-medium text-emerald-700 dark:border-emerald-600 dark:bg-emerald-950/30 dark:text-emerald-400\"\n : \"text-muted-foreground hover:border-foreground/20 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n {onPreviewModeChange && (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Open preview menu\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className={cn(\"h-auto\", pad)}\n onClick={() => setOpen((current) => !current)}\n >\n <Icon icon={UiEllipsis} />\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label=\"Preview options\"\n className=\"absolute right-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5\"\n >\n {PREVIEW_OPTIONS.map((option) => {\n const active = option.value === previewMode;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors\",\n \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none\",\n )}\n onClick={() => {\n onPreviewModeChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"min-w-0 flex-1\">{option.label}</span>\n {active ? <Icon icon={UiCheck} className=\"shrink-0\" /> : null}\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AcceptPicker.js","sources":["../../src/rpc/AcceptPicker.tsx"],"sourcesContent":["import { useEffect, useRef, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiEllipsis, UiCheck } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport {\n ACCEPT_OPTIONS,\n type AcceptOption,\n type OperationPreviewMode,\n} from \"./accept-options\";\n\nexport type AcceptPickerProps = {\n value: string;\n onChange: (value: string) => void;\n size?: \"sm\" | \"md\";\n options?: readonly AcceptOption[];\n previewMode?: OperationPreviewMode;\n onPreviewModeChange?: (mode: OperationPreviewMode) => void;\n className?: string;\n};\n\nconst PREVIEW_OPTIONS: Array<{ value: OperationPreviewMode; label: string }> = [\n { value: \"curl\", label: \"Show cURL preview\" },\n { value: \"cli\", label: \"Show CLI preview\" },\n { value: \"hidden\", label: \"Hide preview\" },\n];\n\nexport function AcceptPicker({\n value,\n onChange,\n size = \"md\",\n options = ACCEPT_OPTIONS,\n previewMode = \"hidden\",\n onPreviewModeChange,\n className,\n}: AcceptPickerProps) {\n const rootRef = useRef<HTMLDivElement>(null);\n const [open, setOpen] = useState(false);\n const pad = size === \"sm\" ? \"px-2 py-0.5\" : \"px-2.5 py-1\";\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: PointerEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) {\n setOpen(false);\n }\n };\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key === \"Escape\") setOpen(false);\n };\n document.addEventListener(\"pointerdown\", onPointerDown);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n document.removeEventListener(\"pointerdown\", onPointerDown);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [open]);\n\n return (\n <div ref={rootRef} className={cn(\"relative flex flex-wrap gap-1\", className)}>\n {options.map((opt) => (\n <button\n key={opt.value}\n type=\"button\"\n onClick={() => onChange(opt.value)}\n className={cn(\n \"rounded-md border text-xs transition-colors\",\n pad,\n value === opt.value\n ? \"border-emerald-500 bg-emerald-50 font-medium text-emerald-700 dark:border-emerald-600 dark:bg-emerald-950/30 dark:text-emerald-400\"\n : \"text-muted-foreground hover:border-foreground/20 hover:text-foreground\",\n )}\n >\n {opt.label}\n </button>\n ))}\n {onPreviewModeChange && (\n <>\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n aria-label=\"Open preview menu\"\n aria-haspopup=\"menu\"\n aria-expanded={open}\n className={cn(\"h-auto\", pad)}\n onClick={() => setOpen((current) => !current)}\n >\n <Icon icon={UiEllipsis} />\n </Button>\n {open && (\n <div\n role=\"menu\"\n aria-label=\"Preview options\"\n className=\"absolute right-0 top-[calc(100%+0.375rem)] z-50 min-w-[12rem] rounded-md border border-border bg-popover p-1 text-popover-foreground shadow-lg shadow-black/5\"\n >\n {PREVIEW_OPTIONS.map((option) => {\n const active = option.value === previewMode;\n return (\n <button\n key={option.value}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={active}\n className={cn(\n \"flex w-full items-center gap-2 rounded-sm px-2 py-1.5 text-left text-sm transition-colors\",\n \"hover:bg-accent hover:text-accent-foreground focus:bg-accent focus:text-accent-foreground focus:outline-none\",\n )}\n onClick={() => {\n onPreviewModeChange(option.value);\n setOpen(false);\n }}\n >\n <span className=\"min-w-0 flex-1\">{option.label}</span>\n {active ? <Icon icon={UiCheck} className=\"shrink-0\" /> : null}\n </button>\n );\n })}\n </div>\n )}\n </>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAqBA,MAAM,kBAAyE;AAAA,EAC7E,EAAE,OAAO,QAAQ,OAAO,oBAAA;AAAA,EACxB,EAAE,OAAO,OAAO,OAAO,mBAAA;AAAA,EACvB,EAAE,OAAO,UAAU,OAAO,eAAA;AAC5B;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,cAAc;AAAA,EACd;AAAA,EACA;AACF,GAAsB;AACpB,QAAM,UAAU,OAAuB,IAAI;AAC3C,QAAM,CAAC,MAAM,OAAO,IAAI,SAAS,KAAK;AACtC,QAAM,MAAM,SAAS,OAAO,gBAAgB;AAE5C,YAAU,MAAM;AACd,QAAI,CAAC,KAAM;AACX,UAAM,gBAAgB,CAAC,UAAwB;;AAC7C,UAAI,GAAC,aAAQ,YAAR,mBAAiB,SAAS,MAAM,UAAiB;AACpD,gBAAQ,KAAK;AAAA,MACf;AAAA,IACF;AACA,UAAM,YAAY,CAAC,UAAyB;AAC1C,UAAI,MAAM,QAAQ,SAAU,SAAQ,KAAK;AAAA,IAC3C;AACA,aAAS,iBAAiB,eAAe,aAAa;AACtD,aAAS,iBAAiB,WAAW,SAAS;AAC9C,WAAO,MAAM;AACX,eAAS,oBAAoB,eAAe,aAAa;AACzD,eAAS,oBAAoB,WAAW,SAAS;AAAA,IACnD;AAAA,EACF,GAAG,CAAC,IAAI,CAAC;AAET,SACE,qBAAC,SAAI,KAAK,SAAS,WAAW,GAAG,iCAAiC,SAAS,GACxE,UAAA;AAAA,IAAA,QAAQ,IAAI,CAAC,QACZ;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,SAAS,MAAM,SAAS,IAAI,KAAK;AAAA,QACjC,WAAW;AAAA,UACT;AAAA,UACA;AAAA,UACA,UAAU,IAAI,QACV,uIACA;AAAA,QAAA;AAAA,QAGL,UAAA,IAAI;AAAA,MAAA;AAAA,MAXA,IAAI;AAAA,IAAA,CAaZ;AAAA,IACA,uBACC,qBAAA,UAAA,EACE,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,cAAW;AAAA,UACX,iBAAc;AAAA,UACd,iBAAe;AAAA,UACf,WAAW,GAAG,UAAU,GAAG;AAAA,UAC3B,SAAS,MAAM,QAAQ,CAAC,YAAY,CAAC,OAAO;AAAA,UAE5C,UAAA,oBAAC,MAAA,EAAK,MAAM,WAAA,CAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAEzB,QACC;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,WAAU;AAAA,UAET,UAAA,gBAAgB,IAAI,CAAC,WAAW;AAC/B,kBAAM,SAAS,OAAO,UAAU;AAChC,mBACE;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,MAAK;AAAA,gBACL,MAAK;AAAA,gBACL,gBAAc;AAAA,gBACd,WAAW;AAAA,kBACT;AAAA,kBACA;AAAA,gBAAA;AAAA,gBAEF,SAAS,MAAM;AACb,sCAAoB,OAAO,KAAK;AAChC,0BAAQ,KAAK;AAAA,gBACf;AAAA,gBAEA,UAAA;AAAA,kBAAA,oBAAC,QAAA,EAAK,WAAU,kBAAkB,UAAA,OAAO,OAAM;AAAA,kBAC9C,SAAS,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,YAAW,IAAK;AAAA,gBAAA;AAAA,cAAA;AAAA,cAdpD,OAAO;AAAA,YAAA;AAAA,UAiBlB,CAAC;AAAA,QAAA;AAAA,MAAA;AAAA,IACH,EAAA,CAEJ;AAAA,EAAA,GAEJ;AAEJ;"}
@@ -171,7 +171,7 @@ function OutputBody({
171
171
  "iframe",
172
172
  {
173
173
  srcDoc: text,
174
- className: "h-[600px] w-full rounded-md border bg-white",
174
+ className: "h-[600px] w-full rounded-md border bg-background",
175
175
  sandbox: "allow-same-origin"
176
176
  }
177
177
  );
@@ -1 +1 @@
1
- {"version":3,"file":"CommandOutput.cjs","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-white\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":["useMemo","jsx","jsxs","cn","parseClickyData","Clicky","DataTable","useState","useEffect","JsonView"],"mappings":"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"}
1
+ {"version":3,"file":"CommandOutput.cjs","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":["useMemo","jsx","jsxs","cn","parseClickyData","Clicky","DataTable","useState","useEffect","JsonView"],"mappings":"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"}
@@ -169,7 +169,7 @@ function OutputBody({
169
169
  "iframe",
170
170
  {
171
171
  srcDoc: text,
172
- className: "h-[600px] w-full rounded-md border bg-white",
172
+ className: "h-[600px] w-full rounded-md border bg-background",
173
173
  sandbox: "allow-same-origin"
174
174
  }
175
175
  );
@@ -1 +1 @@
1
- {"version":3,"file":"CommandOutput.js","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-white\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;AA8CA,MAAM,yBAA8D;AAAA,EAClE,EAAE,KAAK,UAAU,OAAO,UAAU,MAAM,KAAA;AAAA,EACxC,EAAE,KAAK,UAAU,OAAO,UAAU,QAAQ,KAAA;AAAA,EAC1C,EAAE,KAAK,WAAW,OAAO,WAAW,QAAQ,KAAA;AAAA,EAC5C,EAAE,KAAK,WAAW,OAAO,WAAW,MAAM,KAAA;AAC5C;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,UAAU;AAAA,EACV,iBAAiB;AAAA,EACjB,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAAuB;AACrB,QAAM,QAAO,qCAAU,YAAU,qCAAU,WAAU;AACrD,QAAM,MAAK,qCAAU,gBAAe;AAEpC,QAAM,SAAS,QAAQ,MAAM;AAC3B,QAAI,CAAC,SAAU,QAAO;AACtB,QAAI,SAAS,WAAW,OAAW,QAAO,SAAS;AACnD,QAAI,CAAC,KAAK,KAAA,EAAQ,QAAO;AACzB,QAAI;AACF,aAAO,KAAK,MAAM,KAAK,KAAA,CAAM;AAAA,IAC/B,QAAQ;AACN,aAAO;AAAA,IACT;AAAA,EACF,GAAG,CAAC,UAAU,IAAI,CAAC;AAEnB,MAAI;AACJ,MAAI,UAAU;AACZ,aACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACC,GAAI,SAAS,aAAa,EAAE,KAAK,SAAS,WAAA,IAAe,CAAA;AAAA,QACzD,GAAI,SAAS,OAAO,EAAE,MAAM,SAAS,KAAA,IAAS,CAAA;AAAA,QAC9C,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,QAC1C,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,QAC5C,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,QAC5C,GAAI,sBAAsB,EAAE,oBAAA,IAAwB,CAAA;AAAA,QACpD,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,QAC1B,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,QAChC,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,QAC5C,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,MAAC;AAAA,IAAA;AAAA,EAG1C,WAAW,SAAS;AAClB,aAAS,oBAAC,iBAAc,eAAA,CAAgC;AAAA,EAC1D,OAAO;AACL,aAAS,oBAAC,KAAA,EAAE,WAAU,iCAAiC,UAAA,cAAa;AAAA,EACtE;AAEA,QAAM,UAAU,WAAW,WACzB;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,WAAU;AAAA,MAET,UAAA;AAAA,IAAA;AAAA,EAAA,IAED;AAEJ,QAAM,UAAU,QAAQ,CAAC,WACvB,qBAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA;AAAA,IACA;AAAA,EAAA,EAAA,CACH,IAEA,qBAAC,OAAA,EAAI,WAAU,aACZ,UAAA;AAAA,IAAA;AAAA,IACD,qBAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,MAAA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WACE,SAAS,UACL,0CACA;AAAA,UAGL,UAAA,SAAS,UAAU,YAAY;AAAA,QAAA;AAAA,MAAA;AAAA,MAElC,qBAAC,QAAA,EAAK,WAAU,mDAAkD,UAAA;AAAA,QAAA;AAAA,QAC1D,SAAS;AAAA,MAAA,GACjB;AAAA,MACC,OAAO,sBACN,oBAAC,QAAA,EAAK,WAAU,mFACb,UAAA,GAAG,MAAM,GAAG,EAAE,CAAC,EAAA,CAClB;AAAA,MAED,SAAS,SAAS,oBAAC,UAAK,WAAU,4BAA4B,mBAAS,MAAA,CAAM;AAAA,IAAA,GAChF;AAAA,IAEC,SAAS,OACR,qBAAC,OAAA,EAAI,WAAU,6DAA4D,UAAA;AAAA,MAAA;AAAA,MACtE,SAAS;AAAA,IAAA,GACd;AAAA,IAGD;AAAA,EAAA,GACH;AAGF,MAAI,aAAa,WAAW;AAC1B,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,YAAY,WAAW;AAAA,QAC7B,cAAY;AAAA,QACZ,aAAW,WAAW;AAAA,QACtB,WAAW,GAAG,QAAQ,SAAS;AAAA,QAE9B,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAGP;AAEA,SAAO;AACT;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAeG;AACD,QAAM,MAAM,YAAY,MAAM,GAAG,EAAE,CAAC,KAAK,IAAI,KAAA;AAE7C,MAAI,OAAO,qBAAqB,MAAM;AACpC,WAAO,oBAAC,aAAU,MAAY;AAAA,EAChC;AAEA,QAAM,gBACJ,OAAO,WAAW,YAAa,UAAU,QAAQ,OAAO,WAAW,WAC9D,SACD;AACN,QAAM,eAAe,kBAAkB,KAAK,OAAO,gBAAgB,aAAa;AAEhF,OACE,6CAAc,OACd,OAAO,6BACP,OAAO,2BACP;AACA,UAAM,SACJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,OACE,6CAAc,MACV,aAAa,WACX,UAAmD;AAAA,QAE1D,GAAI,MAAM,EAAE,IAAA,IAAQ,CAAA;AAAA,QACpB,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,QAC1C,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,QAC5C,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,QAC5C,GAAI,sBAAsB,EAAE,oBAAA,IAAwB,CAAA;AAAA,QACpD,GAAI,SAAS,EAAE,OAAA,IAAW,CAAA;AAAA,QAC1B,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,QAChC,GAAI,kBAAkB,EAAE,gBAAA,IAAoB,CAAA;AAAA,QAC5C,GAAI,aAAa,EAAE,eAAe,CAAA;AAAA,MAAC;AAAA,IAAA;AAIxC,UAAM,eAAe,oBAAC,OAAA,EAAI,WAAU,iBAAiB,UAAA,QAAO;AAC5D,QAAI,KAAM,QAAO;AAEjB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAa;AAAA,QACb,MAAM;AAAA,UACJ,EAAE,OAAO,YAAY,OAAO,YAAY,SAAS,aAAA;AAAA,UACjD,EAAE,OAAO,OAAO,OAAO,OAAO,SAAS,oBAAC,YAAA,EAAW,MAAY,EAAA;AAAA,QAAG;AAAA,MACpE;AAAA,IAAA;AAAA,EAGN;AAEA,MAAI,OAAO,aAAa;AACtB,UAAM,SACJ;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,QAAQ;AAAA,QACR,WAAU;AAAA,QACV,SAAQ;AAAA,MAAA;AAAA,IAAA;AAGZ,QAAI,KAAM,QAAO;AACjB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAa;AAAA,QACb,MAAM;AAAA,UACJ,EAAE,OAAO,WAAW,OAAO,WAAW,SAAS,OAAA;AAAA,UAC/C,EAAE,OAAO,UAAU,OAAO,UAAU,SAAS,oBAAC,YAAA,EAAW,MAAY,EAAA;AAAA,QAAG;AAAA,MAC1E;AAAA,IAAA;AAAA,EAGN;AAEA,MAAI,QAAQ;AACV,UAAM,OAAO,oBAAC,YAAA,EAAW,MAAM,OAAA,CAAQ;AACvC,QAAI,KAAM,QAAO;AACjB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,cAAa;AAAA,QACb,MAAM;AAAA,UACJ,EAAE,OAAO,UAAU,OAAO,UAAU,SAAS,KAAA;AAAA,UAC7C,EAAE,OAAO,OAAO,OAAO,OAAO,SAAS,oBAAC,YAAA,EAAW,MAAY,EAAA;AAAA,QAAG;AAAA,MACpE;AAAA,IAAA;AAAA,EAGN;AAEA,MAAI,KAAM,QAAO,oBAAC,YAAA,EAAW,KAAA,CAAY;AAEzC,SAAO,oBAAC,KAAA,EAAE,WAAU,sCAAqC,UAAA,aAAS;AACpE;AAEA,SAAS,cAAc,EAAE,kBAA8C;AACrE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM,CAAA;AAAA,MACN,SAAS;AAAA,MACT,SAAO;AAAA,MACP;AAAA,MACA,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,oBAAoB;AAAA,MACpB,iBAAiB;AAAA,MACjB,kBAAkB;AAAA,MAClB,qBAAqB;AAAA,MACrB,yBAAyB;AAAA,MACzB,gBAAgB;AAAA,IAAA;AAAA,EAAA;AAGtB;AAEA,SAAS,UAAU,EAAE,QAAwB;AAC3C,QAAM,CAAC,KAAK,MAAM,IAAI,SAAS,EAAE;AAEjC,YAAU,MAAM;AACd,UAAM,OAAO,IAAI,gBAAgB,IAAI;AACrC,WAAO,IAAI;AACX,WAAO,MAAM,IAAI,gBAAgB,IAAI;AAAA,EACvC,GAAG,CAAC,IAAI,CAAC;AAET,MAAI,CAAC,IAAK,QAAO;AACjB,SACE,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,UAAS;AAAA,QACT,WAAU;AAAA,QACX,UAAA;AAAA,MAAA;AAAA,IAAA;AAAA,IAGD,oBAAC,UAAA,EAAO,KAAK,KAAK,WAAU,qCAAA,CAAqC;AAAA,EAAA,GACnE;AAEJ;AAEA,SAAS,WAAW,EAAE,QAA2B;AAC/C,SACE,oBAAC,OAAA,EAAI,WAAU,2DACb,UAAA,oBAAC,YAAS,MAAkC,kBAAkB,OAAO,iBAAA,CAAkB,EAAA,CACzF;AAEJ;AAEA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA,UAAU;AACZ,GAGG;AACD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW,+EACT,YAAY,UACR,6DACA,UACN;AAAA,MAEC,UAAA;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,KAAK;AAAA,EACZ;AAAA,EACA;AACF,GAGG;AACD,QAAM,CAAC,OAAO,QAAQ,IAAI,SAAS,YAAY;AAC/C,QAAM,SAAS,KAAK,KAAK,CAAC,QAAQ,IAAI,UAAU,KAAK,KAAK,KAAK,CAAC;AAChE,MAAI,CAAC,OAAQ,QAAO;AACpB,SACE,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA,oBAAC,SAAI,WAAU,8CACZ,UAAA,KAAK,IAAI,CAAC,QACT;AAAA,MAAC;AAAA,MAAA;AAAA,QAEC,MAAK;AAAA,QACL,WAAW,6BACT,IAAI,UAAU,OAAO,QACjB,4CACA,uBACN;AAAA,QACA,SAAS,MAAM,SAAS,IAAI,KAAK;AAAA,QAEhC,UAAA,IAAI;AAAA,MAAA;AAAA,MATA,IAAI;AAAA,IAAA,CAWZ,GACH;AAAA,IACA,oBAAC,OAAA,EAAK,UAAA,OAAO,QAAA,CAAQ;AAAA,EAAA,GACvB;AAEJ;"}
1
+ {"version":3,"file":"CommandOutput.js","sources":["../../src/rpc/CommandOutput.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport { DataTable, type DataTableColumn, type DataTablePagination } from \"../data/DataTable\";\nimport {\n Clicky,\n parseClickyData,\n type ClickyCommandRuntime,\n type ClickyDocument,\n type ClickyNode,\n type ClickyTableRowClick,\n type ClickyTableRowHref,\n type ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { JsonView } from \"../data/JsonView\";\nimport { cn } from \"../lib/utils\";\nimport type { ExecutionResponse } from \"./types\";\n\nexport type CommandOutputProps = {\n response?: ExecutionResponse | null;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n};\n\ntype LoadingResultRow = {\n result: string;\n status: string;\n updated: string;\n details: string;\n};\n\nconst LOADING_RESULT_COLUMNS: DataTableColumn<LoadingResultRow>[] = [\n { key: \"result\", label: \"Result\", grow: true },\n { key: \"status\", label: \"Status\", shrink: true },\n { key: \"updated\", label: \"Updated\", shrink: true },\n { key: \"details\", label: \"Details\", grow: true },\n];\n\nexport function CommandOutput({\n response,\n loading = false,\n loadingMessage = \"Loading execution results…\",\n emptyMessage = \"No response yet.\",\n ariaLabel,\n className,\n bare = false,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: CommandOutputProps) {\n const text = response?.stdout || response?.output || \"\";\n const ct = response?.contentType || \"application/json\";\n\n const parsed = useMemo(() => {\n if (!response) return null;\n if (response.parsed !== undefined) return response.parsed;\n if (!text.trim()) return null;\n try {\n return JSON.parse(text.trim());\n } catch {\n return null;\n }\n }, [response, text]);\n\n let output: ReactNode;\n if (response) {\n output = (\n <OutputBody\n text={text}\n parsed={parsed}\n contentType={ct}\n bare={bare}\n {...(response.requestUrl ? { url: response.requestUrl } : {})}\n {...(response.blob ? { blob: response.blob } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n } else if (loading) {\n output = <LoadingOutput loadingMessage={loadingMessage} />;\n } else {\n output = <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>;\n }\n\n const pending = loading && response ? (\n <div\n role=\"status\"\n className=\"rounded-md border border-border bg-muted/40 px-3 py-1.5 text-xs text-muted-foreground\"\n >\n {loadingMessage}\n </div>\n ) : null;\n\n const content = bare || !response ? (\n <div className=\"space-y-2\">\n {pending}\n {output}\n </div>\n ) : (\n <div className=\"space-y-3\">\n {pending}\n <div className=\"flex items-center gap-2\">\n <span\n className={\n response.success\n ? \"rounded-md border px-2 py-0.5 text-xs\"\n : \"rounded-md bg-destructive px-2 py-0.5 text-xs text-destructive-foreground\"\n }\n >\n {response.success ? \"Success\" : \"Failed\"}\n </span>\n <span className=\"rounded-md border px-2 py-0.5 font-mono text-xs\">\n exit {response.exit_code}\n </span>\n {ct !== \"application/json\" && (\n <span className=\"rounded-md bg-secondary px-2 py-0.5 font-mono text-xs text-secondary-foreground\">\n {ct.split(\";\")[0]}\n </span>\n )}\n {response.error && <span className=\"text-sm text-destructive\">{response.error}</span>}\n </div>\n\n {response.cli && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">\n $ {response.cli}\n </pre>\n )}\n\n {output}\n </div>\n );\n\n if (ariaLabel || className) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n aria-busy={loading || undefined}\n className={cn(\"mt-3\", className)}\n >\n {content}\n </div>\n );\n }\n\n return content;\n}\n\nfunction OutputBody({\n text,\n parsed,\n contentType,\n url,\n blob,\n bare,\n commandRuntime,\n onTableRowClick,\n getTableRowHref,\n isTableRowClickable,\n search,\n timeRange,\n externalFilters,\n pagination,\n}: {\n text: string;\n parsed: unknown;\n contentType: string;\n url?: string;\n blob?: Blob;\n bare?: boolean;\n commandRuntime?: ClickyCommandRuntime;\n onTableRowClick?: ClickyTableRowClick;\n getTableRowHref?: ClickyTableRowHref;\n isTableRowClickable?: ClickyTableRowPredicate;\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n externalFilters?: FilterBarFilter[];\n pagination?: DataTablePagination;\n}) {\n const ct = (contentType.split(\";\")[0] ?? \"\").trim();\n\n if (ct === \"application/pdf\" && blob) {\n return <PdfOutput blob={blob} />;\n }\n\n const clickyPayload: string | ClickyNode | ClickyDocument | undefined =\n typeof parsed === \"string\" || (parsed != null && typeof parsed === \"object\")\n ? (parsed as ClickyNode | ClickyDocument)\n : text;\n const parsedClicky = clickyPayload === \"\" ? null : parseClickyData(clickyPayload);\n\n if (\n parsedClicky?.ok ||\n ct === \"application/clicky+json\" ||\n ct === \"application/json+clicky\"\n ) {\n const clicky = (\n <Clicky\n data={\n parsedClicky?.ok\n ? parsedClicky.document\n : ((parsed as Parameters<typeof Clicky>[0][\"data\"]) ?? text)\n }\n {...(url ? { url } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(onTableRowClick ? { onTableRowClick } : {})}\n {...(getTableRowHref ? { getTableRowHref } : {})}\n {...(isTableRowClickable ? { isTableRowClickable } : {})}\n {...(search ? { search } : {})}\n {...(timeRange ? { timeRange } : {})}\n {...(externalFilters ? { externalFilters } : {})}\n {...(pagination ? { pagination } : {})}\n />\n );\n\n const detailOutput = <div className=\"detail-output\">{clicky}</div>;\n if (bare) return detailOutput;\n\n return (\n <Tabs\n defaultValue=\"rendered\"\n tabs={[\n { value: \"rendered\", label: \"Rendered\", content: detailOutput },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (ct === \"text/html\") {\n const iframe = (\n <iframe\n srcDoc={text}\n className=\"h-[600px] w-full rounded-md border bg-background\"\n sandbox=\"allow-same-origin\"\n />\n );\n if (bare) return iframe;\n return (\n <Tabs\n defaultValue=\"preview\"\n tabs={[\n { value: \"preview\", label: \"Preview\", content: iframe },\n { value: \"source\", label: \"Source\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (parsed) {\n const json = <JsonViewer data={parsed} />;\n if (bare) return json;\n return (\n <Tabs\n defaultValue=\"output\"\n tabs={[\n { value: \"output\", label: \"Output\", content: json },\n { value: \"raw\", label: \"Raw\", content: <TextOutput text={text} /> },\n ]}\n />\n );\n }\n\n if (text) return <TextOutput text={text} />;\n\n return <p className=\"py-4 text-sm text-muted-foreground\">No output</p>;\n}\n\nfunction LoadingOutput({ loadingMessage }: { loadingMessage: string }) {\n return (\n <DataTable<LoadingResultRow>\n data={[]}\n columns={LOADING_RESULT_COLUMNS}\n loading\n loadingMessage={loadingMessage}\n loadingRowCount={8}\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n />\n );\n}\n\nfunction PdfOutput({ blob }: { blob: Blob }) {\n const [url, setURL] = useState(\"\");\n\n useEffect(() => {\n const next = URL.createObjectURL(blob);\n setURL(next);\n return () => URL.revokeObjectURL(next);\n }, [blob]);\n\n if (!url) return null;\n return (\n <div className=\"space-y-2\">\n <a\n href={url}\n download=\"output.pdf\"\n className=\"inline-block rounded-md border px-3 py-1.5 text-sm hover:bg-accent\"\n >\n Download PDF\n </a>\n <iframe src={url} className=\"h-[600px] w-full rounded-md border\" />\n </div>\n );\n}\n\nfunction JsonViewer({ data }: { data: unknown }) {\n return (\n <div className=\"overflow-auto rounded-md bg-muted p-4 font-mono text-xs\">\n <JsonView data={data as object | unknown[]} defaultOpenDepth={Number.MAX_SAFE_INTEGER} />\n </div>\n );\n}\n\nfunction TextOutput({\n text,\n variant = \"default\",\n}: {\n text: string;\n variant?: \"default\" | \"error\";\n}) {\n return (\n <pre\n className={`max-h-96 overflow-auto whitespace-pre-wrap rounded-md p-4 font-mono text-sm ${\n variant === \"error\"\n ? \"bg-red-50 text-red-800 dark:bg-red-950 dark:text-red-200\"\n : \"bg-muted\"\n }`}\n >\n {text}\n </pre>\n );\n}\n\nfunction Tabs({\n defaultValue,\n tabs,\n}: {\n defaultValue: string;\n tabs: Array<{ value: string; label: string; content: ReactNode }>;\n}) {\n const [value, setValue] = useState(defaultValue);\n const active = tabs.find((tab) => tab.value === value) ?? tabs[0];\n if (!active) return null;\n return (\n <div className=\"space-y-3\">\n <div className=\"inline-flex rounded-md border bg-muted p-1\">\n {tabs.map((tab) => (\n <button\n key={tab.value}\n type=\"button\"\n className={`rounded px-2 py-1 text-xs ${\n tab.value === active.value\n ? \"bg-background text-foreground shadow-sm\"\n : \"text-muted-foreground\"\n }`}\n onClick={() => setValue(tab.value)}\n >\n {tab.label}\n </button>\n ))}\n </div>\n <div>{active.content}</div>\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -42,7 +42,7 @@ function EndpointList({
42
42
  return renderLink({
43
43
  key: `${op.method}:${op.path}`,
44
44
  to: getCommandHref(operationId, op),
45
- className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50",
45
+ className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10",
46
46
  children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
47
47
  /* @__PURE__ */ jsxRuntime.jsx(MethodBadge.MethodBadge, { method: op.method }),
48
48
  /* @__PURE__ */ jsxRuntime.jsx("code", { className: "text-sm", children: op.path }),
@@ -1 +1 @@
1
- {"version":3,"file":"EndpointList.cjs","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":["useState","useMemo","jsxs","jsx","Fragment","MethodBadge"],"mappings":";;;;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,EAAE;AAEvC,QAAM,WAAWC,MAAAA,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,qCACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,mCAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACED,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,UAAAD,2BAAAA,IAACE,YAAAA,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChCF,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZA,2BAAAA,IAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;;"}
1
+ {"version":3,"file":"EndpointList.cjs","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":["useState","useMemo","jsxs","jsx","Fragment","MethodBadge"],"mappings":";;;;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAIA,MAAAA,SAAS,EAAE;AAEvC,QAAM,WAAWC,MAAAA,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACEC,2BAAAA,KAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAAC,2BAAAA,IAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,qCACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACED,2BAAAA,KAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAAC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,mCAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACED,2BAAAA,KAAAE,qBAAA,EACE,UAAA;AAAA,UAAAD,2BAAAA,IAACE,YAAAA,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChCF,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZA,2BAAAA,IAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;;"}
@@ -40,7 +40,7 @@ function EndpointList({
40
40
  return renderLink({
41
41
  key: `${op.method}:${op.path}`,
42
42
  to: getCommandHref(operationId, op),
43
- className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50",
43
+ className: "flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10",
44
44
  children: /* @__PURE__ */ jsxs(Fragment, { children: [
45
45
  /* @__PURE__ */ jsx(MethodBadge, { method: op.method }),
46
46
  /* @__PURE__ */ jsx("code", { className: "text-sm", children: op.path }),
@@ -1 +1 @@
1
- {"version":3,"file":"EndpointList.js","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AAEvC,QAAM,WAAW,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACE,qBAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,0BACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,wBAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACE,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA,oBAAC,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChC,oBAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZ,oBAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
1
+ {"version":3,"file":"EndpointList.js","sources":["../../src/rpc/EndpointList.tsx"],"sourcesContent":["import { useMemo, useState, type ReactElement, type ReactNode } from \"react\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport type { DomainDefinition, ResolvedOperation } from \"./types\";\n\nexport type RenderLinkArgs = {\n to: string;\n className?: string;\n children: ReactNode;\n title?: string;\n key?: string;\n};\n\n// Render-prop form lets callers pass react-router's Link, a plain <a>, or\n// any custom navigation component without relying on React type equality\n// across nested type installs.\nexport type RenderLink = (args: RenderLinkArgs) => ReactElement;\n\nexport type EndpointListProps = {\n operations: ResolvedOperation[];\n definition: Pick<DomainDefinition, \"title\" | \"emptyTitle\" | \"emptyDescription\">;\n renderLink: RenderLink;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nexport function EndpointList({\n operations,\n definition,\n renderLink,\n getCommandHref = defaultCommandHref,\n}: EndpointListProps) {\n const [search, setSearch] = useState(\"\");\n\n const filtered = useMemo(() => {\n if (!search) return operations;\n const q = search.toLowerCase();\n return operations.filter(\n (op) =>\n op.path.toLowerCase().includes(q) ||\n op.operation.summary?.toLowerCase().includes(q) ||\n op.operation.operationId?.toLowerCase().includes(q),\n );\n }, [operations, search]);\n\n if (operations.length === 0) {\n return (\n <div className=\"rounded-xl border border-dashed p-8\">\n <h2 className=\"text-lg font-medium\">\n {definition.emptyTitle || `No ${definition.title} endpoints found`}\n </h2>\n <p className=\"mt-2 max-w-2xl text-sm text-muted-foreground\">\n {definition.emptyDescription ||\n \"This area is reserved in the information architecture, but the current OpenAPI surface does not expose matching operations yet.\"}\n </p>\n </div>\n );\n }\n\n return (\n <div className=\"space-y-4\">\n <input\n placeholder={`Search ${definition.title.toLowerCase()}...`}\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"w-full max-w-lg rounded-lg border bg-background px-3 py-2 text-sm outline-none placeholder:text-muted-foreground focus:ring-2 focus:ring-ring\"\n />\n <div className=\"space-y-2\">\n {filtered.map((op) => {\n const operationId = op.operation.operationId ?? `${op.method}:${op.path}`;\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(operationId, op),\n className:\n \"flex items-center gap-3 rounded-xl border bg-card p-3 transition-colors hover:border-emerald-200 hover:bg-emerald-50/50 dark:hover:border-emerald-500/40 dark:hover:bg-emerald-500/10\",\n children: (\n <>\n <MethodBadge method={op.method} />\n <code className=\"text-sm\">{op.path}</code>\n {op.operation.summary && (\n <span className=\"ml-auto text-xs text-muted-foreground\">\n {op.operation.summary}\n </span>\n )}\n </>\n ),\n });\n })}\n </div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;AAwBA,MAAM,qBAAqB,CAAC,gBAAwB,aAAa,WAAW;AAErE,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AAAA,EACA,iBAAiB;AACnB,GAAsB;AACpB,QAAM,CAAC,QAAQ,SAAS,IAAI,SAAS,EAAE;AAEvC,QAAM,WAAW,QAAQ,MAAM;AAC7B,QAAI,CAAC,OAAQ,QAAO;AACpB,UAAM,IAAI,OAAO,YAAA;AACjB,WAAO,WAAW;AAAA,MAChB,CAAC;;AACC,kBAAG,KAAK,cAAc,SAAS,CAAC,OAChC,QAAG,UAAU,YAAb,mBAAsB,cAAc,SAAS,SAC7C,QAAG,UAAU,gBAAb,mBAA0B,cAAc,SAAS;AAAA;AAAA,IAAC;AAAA,EAExD,GAAG,CAAC,YAAY,MAAM,CAAC;AAEvB,MAAI,WAAW,WAAW,GAAG;AAC3B,WACE,qBAAC,OAAA,EAAI,WAAU,uCACb,UAAA;AAAA,MAAA,oBAAC,MAAA,EAAG,WAAU,uBACX,UAAA,WAAW,cAAc,MAAM,WAAW,KAAK,mBAAA,CAClD;AAAA,0BACC,KAAA,EAAE,WAAU,gDACV,UAAA,WAAW,oBACV,kIAAA,CACJ;AAAA,IAAA,GACF;AAAA,EAEJ;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,aACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,aAAa,UAAU,WAAW,MAAM,aAAa;AAAA,QACrD,OAAO;AAAA,QACP,UAAU,CAAC,MAAM,UAAU,EAAE,OAAO,KAAK;AAAA,QACzC,WAAU;AAAA,MAAA;AAAA,IAAA;AAAA,wBAEX,OAAA,EAAI,WAAU,aACZ,UAAA,SAAS,IAAI,CAAC,OAAO;AACpB,YAAM,cAAc,GAAG,UAAU,eAAe,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AACvE,aAAO,WAAW;AAAA,QAChB,KAAK,GAAG,GAAG,MAAM,IAAI,GAAG,IAAI;AAAA,QAC5B,IAAI,eAAe,aAAa,EAAE;AAAA,QAClC,WACE;AAAA,QACF,UACE,qBAAA,UAAA,EACE,UAAA;AAAA,UAAA,oBAAC,aAAA,EAAY,QAAQ,GAAG,OAAA,CAAQ;AAAA,UAChC,oBAAC,QAAA,EAAK,WAAU,WAAW,aAAG,MAAK;AAAA,UAClC,GAAG,UAAU,WACZ,oBAAC,UAAK,WAAU,yCACb,UAAA,GAAG,UAAU,QAAA,CAChB;AAAA,QAAA,EAAA,CAEJ;AAAA,MAAA,CAEH;AAAA,IACH,CAAC,EAAA,CACH;AAAA,EAAA,GACF;AAEJ;"}
@@ -12,7 +12,6 @@ const clickyMetadata = require("./clickyMetadata.cjs");
12
12
  const EndpointList = require("./EndpointList.cjs");
13
13
  const ExecutionResult = require("./ExecutionResult.cjs");
14
14
  const FilterForm = require("./FilterForm.cjs");
15
- const types = require("./types.cjs");
16
15
  const useOperations = require("./useOperations.cjs");
17
16
  const formMetadata = require("./formMetadata.cjs");
18
17
  const UiTable = require("../icons/components/UiTable.cjs");
@@ -103,14 +102,9 @@ function OperationCatalog({
103
102
  });
104
103
  const actionOps = react.useMemo(() => {
105
104
  if (useSurfaceMetadata) {
106
- return clickyMetadata.findSurfaceCollectionActions(domainOps, surfaceKey);
105
+ return clickyMetadata.findSurfaceActions(domainOps, surfaceKey);
107
106
  }
108
- return domainOps.filter(
109
- (op) => {
110
- var _a;
111
- return op.method !== "get" && !op.path.includes("{") && !((_a = op.operation.parameters) == null ? void 0 : _a.some((p) => p.in === "path" || types.isPositionalParam(p)));
112
- }
113
- );
107
+ return domainOps.filter((op) => op.method !== "get" && !op.path.includes("{"));
114
108
  }, [domainOps, surfaceKey, useSurfaceMetadata]);
115
109
  const filterBarConfig = react.useMemo(() => {
116
110
  const options = {
@@ -213,40 +207,28 @@ function OperationCatalog({
213
207
  ] })
214
208
  ] }),
215
209
  actionOps.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: actionOps.map((op) => {
216
- var _a;
217
- const commandName = op.operation.operationId || op.path;
218
- const tooltip = op.operation.description ? `${commandName} — ${op.operation.description}` : commandName;
219
- if (useSurfaceMetadata) {
220
- return /* @__PURE__ */ jsxRuntime.jsxs(
221
- button.Button,
222
- {
223
- type: "button",
224
- variant: "outline",
225
- size: "sm",
226
- title: tooltip,
227
- onClick: () => {
228
- setActiveAction(op);
229
- setActionResult(null);
230
- setActionError("");
231
- },
232
- children: [
233
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-xs" }),
234
- op.operation.summary || ((_a = clickyMetadata.getOperationClickyMeta(op)) == null ? void 0 : _a.actionName) || commandName
235
- ]
210
+ const label = clickyMetadata.surfaceActionLabel(op);
211
+ const summary = op.operation.summary || op.operation.description;
212
+ const tooltip = summary ? `${label} — ${summary}` : label;
213
+ return /* @__PURE__ */ jsxRuntime.jsxs(
214
+ button.Button,
215
+ {
216
+ type: "button",
217
+ variant: "outline",
218
+ size: "sm",
219
+ title: tooltip,
220
+ onClick: () => {
221
+ setActiveAction(op);
222
+ setActionResult(null);
223
+ setActionError("");
236
224
  },
237
- `${op.method}:${op.path}`
238
- );
239
- }
240
- return renderLink({
241
- key: `${op.method}:${op.path}`,
242
- to: getCommandHref(op.operation.operationId ?? commandName, op),
243
- title: tooltip,
244
- className: "inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground",
245
- children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
246
- /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-xs" }),
247
- op.operation.summary || commandName
248
- ] })
249
- });
225
+ children: [
226
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-xs" }),
227
+ label
228
+ ]
229
+ },
230
+ `${op.method}:${op.path}`
231
+ );
250
232
  }) }),
251
233
  showTable ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: listQuery.isError && !listQuery.data ? renderError(listQuery.error, `Failed to load ${(listEndpoint == null ? void 0 : listEndpoint.path) ?? ""}`) : /* @__PURE__ */ jsxRuntime.jsx(
252
234
  ExecutionResult.ExecutionResult,