@flanksource/clicky-ui 0.2.13 → 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 (466) 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 +1 -2
  38. package/dist/components/SecretKeySelector.cjs.map +1 -1
  39. package/dist/components/SecretKeySelector.d.ts +5 -3
  40. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  41. package/dist/components/SecretKeySelector.js +2 -3
  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/TimeseriesCoreBars.cjs +8 -1
  179. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  180. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  181. package/dist/data/TimeseriesCoreBars.js +8 -1
  182. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  183. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
  184. package/dist/data/TimeseriesPanel.axes.js.map +1 -1
  185. package/dist/data/TreeNode.cjs +13 -7
  186. package/dist/data/TreeNode.cjs.map +1 -1
  187. package/dist/data/TreeNode.d.ts.map +1 -1
  188. package/dist/data/TreeNode.js +13 -7
  189. package/dist/data/TreeNode.js.map +1 -1
  190. package/dist/data/badge-variants.cjs +85 -0
  191. package/dist/data/badge-variants.cjs.map +1 -0
  192. package/dist/data/badge-variants.d.ts +6 -0
  193. package/dist/data/badge-variants.d.ts.map +1 -0
  194. package/dist/data/badge-variants.js +85 -0
  195. package/dist/data/badge-variants.js.map +1 -0
  196. package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
  197. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
  198. package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
  199. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
  200. package/dist/data/cache-browser/CacheBrowser.js +59 -0
  201. package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
  202. package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
  203. package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
  204. package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
  205. package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
  206. package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
  207. package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
  208. package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
  209. package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
  210. package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
  211. package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
  212. package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
  213. package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
  214. package/dist/data/cache-browser/CacheTree.cjs +189 -0
  215. package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
  216. package/dist/data/cache-browser/CacheTree.d.ts +27 -0
  217. package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
  218. package/dist/data/cache-browser/CacheTree.js +189 -0
  219. package/dist/data/cache-browser/CacheTree.js.map +1 -0
  220. package/dist/data/cache-browser/CacheValue.cjs +86 -0
  221. package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
  222. package/dist/data/cache-browser/CacheValue.d.ts +11 -0
  223. package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
  224. package/dist/data/cache-browser/CacheValue.js +86 -0
  225. package/dist/data/cache-browser/CacheValue.js.map +1 -0
  226. package/dist/data/cache-browser/adapter.cjs +52 -0
  227. package/dist/data/cache-browser/adapter.cjs.map +1 -0
  228. package/dist/data/cache-browser/adapter.d.ts +48 -0
  229. package/dist/data/cache-browser/adapter.d.ts.map +1 -0
  230. package/dist/data/cache-browser/adapter.js +52 -0
  231. package/dist/data/cache-browser/adapter.js.map +1 -0
  232. package/dist/data/cache-browser/api.cjs +42 -0
  233. package/dist/data/cache-browser/api.cjs.map +1 -0
  234. package/dist/data/cache-browser/api.d.ts +33 -0
  235. package/dist/data/cache-browser/api.d.ts.map +1 -0
  236. package/dist/data/cache-browser/api.js +42 -0
  237. package/dist/data/cache-browser/api.js.map +1 -0
  238. package/dist/data/cache-browser/index.d.ts +9 -0
  239. package/dist/data/cache-browser/index.d.ts.map +1 -0
  240. package/dist/data/cache-browser/types.cjs +7 -0
  241. package/dist/data/cache-browser/types.cjs.map +1 -0
  242. package/dist/data/cache-browser/types.d.ts +78 -0
  243. package/dist/data/cache-browser/types.d.ts.map +1 -0
  244. package/dist/data/cache-browser/types.js +7 -0
  245. package/dist/data/cache-browser/types.js.map +1 -0
  246. package/dist/data/cells/TagList.cjs +4 -101
  247. package/dist/data/cells/TagList.cjs.map +1 -1
  248. package/dist/data/cells/TagList.d.ts +1 -49
  249. package/dist/data/cells/TagList.d.ts.map +1 -1
  250. package/dist/data/cells/TagList.js +3 -100
  251. package/dist/data/cells/TagList.js.map +1 -1
  252. package/dist/data/cells/Timestamp.cjs +3 -192
  253. package/dist/data/cells/Timestamp.cjs.map +1 -1
  254. package/dist/data/cells/Timestamp.d.ts +1 -50
  255. package/dist/data/cells/Timestamp.d.ts.map +1 -1
  256. package/dist/data/cells/Timestamp.js +2 -191
  257. package/dist/data/cells/Timestamp.js.map +1 -1
  258. package/dist/data/cells/tag-utils.cjs +103 -0
  259. package/dist/data/cells/tag-utils.cjs.map +1 -0
  260. package/dist/data/cells/tag-utils.d.ts +51 -0
  261. package/dist/data/cells/tag-utils.d.ts.map +1 -0
  262. package/dist/data/cells/tag-utils.js +103 -0
  263. package/dist/data/cells/tag-utils.js.map +1 -0
  264. package/dist/data/cells/timestamp-format.cjs +193 -0
  265. package/dist/data/cells/timestamp-format.cjs.map +1 -0
  266. package/dist/data/cells/timestamp-format.d.ts +51 -0
  267. package/dist/data/cells/timestamp-format.d.ts.map +1 -0
  268. package/dist/data/cells/timestamp-format.js +193 -0
  269. package/dist/data/cells/timestamp-format.js.map +1 -0
  270. package/dist/data/chat/Chat.cjs +48 -0
  271. package/dist/data/chat/Chat.cjs.map +1 -0
  272. package/dist/data/chat/Chat.d.ts +26 -0
  273. package/dist/data/chat/Chat.d.ts.map +1 -0
  274. package/dist/data/chat/Chat.fixtures.d.ts +6 -0
  275. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
  276. package/dist/data/chat/Chat.js +48 -0
  277. package/dist/data/chat/Chat.js.map +1 -0
  278. package/dist/data/chat/Conversation.cjs +34 -0
  279. package/dist/data/chat/Conversation.cjs.map +1 -0
  280. package/dist/data/chat/Conversation.d.ts +11 -0
  281. package/dist/data/chat/Conversation.d.ts.map +1 -0
  282. package/dist/data/chat/Conversation.js +34 -0
  283. package/dist/data/chat/Conversation.js.map +1 -0
  284. package/dist/data/chat/Message.cjs +44 -0
  285. package/dist/data/chat/Message.cjs.map +1 -0
  286. package/dist/data/chat/Message.d.ts +10 -0
  287. package/dist/data/chat/Message.d.ts.map +1 -0
  288. package/dist/data/chat/Message.js +44 -0
  289. package/dist/data/chat/Message.js.map +1 -0
  290. package/dist/data/chat/PromptInput.cjs +61 -0
  291. package/dist/data/chat/PromptInput.cjs.map +1 -0
  292. package/dist/data/chat/PromptInput.d.ts +16 -0
  293. package/dist/data/chat/PromptInput.d.ts.map +1 -0
  294. package/dist/data/chat/PromptInput.js +61 -0
  295. package/dist/data/chat/PromptInput.js.map +1 -0
  296. package/dist/data/chat/ToolCall.cjs +92 -0
  297. package/dist/data/chat/ToolCall.cjs.map +1 -0
  298. package/dist/data/chat/ToolCall.d.ts +14 -0
  299. package/dist/data/chat/ToolCall.d.ts.map +1 -0
  300. package/dist/data/chat/ToolCall.js +92 -0
  301. package/dist/data/chat/ToolCall.js.map +1 -0
  302. package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
  303. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
  304. package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
  305. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
  306. package/dist/data/chat/clickyOperationsToTools.js +73 -0
  307. package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
  308. package/dist/data/chat/index.d.ts +8 -0
  309. package/dist/data/chat/index.d.ts.map +1 -0
  310. package/dist/data/chat/types.cjs +18 -0
  311. package/dist/data/chat/types.cjs.map +1 -0
  312. package/dist/data/chat/types.d.ts +41 -0
  313. package/dist/data/chat/types.d.ts.map +1 -0
  314. package/dist/data/chat/types.js +18 -0
  315. package/dist/data/chat/types.js.map +1 -0
  316. package/dist/data/data-table-utils.cjs +55 -0
  317. package/dist/data/data-table-utils.cjs.map +1 -0
  318. package/dist/data/data-table-utils.d.ts +24 -0
  319. package/dist/data/data-table-utils.d.ts.map +1 -0
  320. package/dist/data/data-table-utils.js +55 -0
  321. package/dist/data/data-table-utils.js.map +1 -0
  322. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
  323. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  324. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  325. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
  326. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  327. package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
  328. package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
  329. package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
  330. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
  331. package/dist/data/diagnostics/GoroutineCard.js +2 -21
  332. package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
  333. package/dist/data/diagnostics/ThreadCard.cjs +3 -38
  334. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  335. package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
  336. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  337. package/dist/data/diagnostics/ThreadCard.js +2 -37
  338. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  339. package/dist/data/diagnostics/state-styles.cjs +59 -0
  340. package/dist/data/diagnostics/state-styles.cjs.map +1 -0
  341. package/dist/data/diagnostics/state-styles.d.ts +5 -0
  342. package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
  343. package/dist/data/diagnostics/state-styles.js +59 -0
  344. package/dist/data/diagnostics/state-styles.js.map +1 -0
  345. package/dist/data/logs-normalize.cjs +166 -0
  346. package/dist/data/logs-normalize.cjs.map +1 -0
  347. package/dist/data/logs-normalize.d.ts +16 -0
  348. package/dist/data/logs-normalize.d.ts.map +1 -0
  349. package/dist/data/logs-normalize.js +166 -0
  350. package/dist/data/logs-normalize.js.map +1 -0
  351. package/dist/data/task-status.cjs +19 -19
  352. package/dist/data/task-status.cjs.map +1 -1
  353. package/dist/data/task-status.js +19 -19
  354. package/dist/data/task-status.js.map +1 -1
  355. package/dist/data/version-info.cjs +3 -3
  356. package/dist/data/version-info.js +3 -3
  357. package/dist/data.cjs +43 -18
  358. package/dist/data.cjs.map +1 -1
  359. package/dist/data.d.ts +11 -5
  360. package/dist/data.d.ts.map +1 -1
  361. package/dist/data.js +30 -5
  362. package/dist/data.js.map +1 -1
  363. package/dist/hooks/density-provider.cjs +38 -0
  364. package/dist/hooks/density-provider.cjs.map +1 -0
  365. package/dist/hooks/density-provider.d.ts +20 -0
  366. package/dist/hooks/density-provider.d.ts.map +1 -0
  367. package/dist/hooks/density-provider.js +38 -0
  368. package/dist/hooks/density-provider.js.map +1 -0
  369. package/dist/hooks/theme-provider.cjs +43 -0
  370. package/dist/hooks/theme-provider.cjs.map +1 -0
  371. package/dist/hooks/theme-provider.d.ts +9 -0
  372. package/dist/hooks/theme-provider.d.ts.map +1 -0
  373. package/dist/hooks/theme-provider.js +43 -0
  374. package/dist/hooks/theme-provider.js.map +1 -0
  375. package/dist/hooks/use-density.cjs +8 -37
  376. package/dist/hooks/use-density.cjs.map +1 -1
  377. package/dist/hooks/use-density.d.ts +5 -20
  378. package/dist/hooks/use-density.d.ts.map +1 -1
  379. package/dist/hooks/use-density.js +9 -38
  380. package/dist/hooks/use-density.js.map +1 -1
  381. package/dist/hooks/use-theme.cjs +10 -43
  382. package/dist/hooks/use-theme.cjs.map +1 -1
  383. package/dist/hooks/use-theme.d.ts +6 -9
  384. package/dist/hooks/use-theme.d.ts.map +1 -1
  385. package/dist/hooks/use-theme.js +11 -44
  386. package/dist/hooks/use-theme.js.map +1 -1
  387. package/dist/hooks.cjs +5 -2
  388. package/dist/hooks.cjs.map +1 -1
  389. package/dist/hooks.d.ts +4 -2
  390. package/dist/hooks.d.ts.map +1 -1
  391. package/dist/hooks.js +5 -2
  392. package/dist/hooks.js.map +1 -1
  393. package/dist/icons/changeIconAliases.cjs +13 -13
  394. package/dist/icons/changeIconAliases.cjs.map +1 -1
  395. package/dist/icons/changeIconAliases.d.ts.map +1 -1
  396. package/dist/icons/changeIconAliases.js +13 -13
  397. package/dist/icons/changeIconAliases.js.map +1 -1
  398. package/dist/index.cjs +71 -30
  399. package/dist/index.cjs.map +1 -1
  400. package/dist/index.js +53 -12
  401. package/dist/index.js.map +1 -1
  402. package/dist/overlay/DropdownMenu.cjs +2 -0
  403. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  404. package/dist/overlay/DropdownMenu.d.ts +3 -1
  405. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  406. package/dist/overlay/DropdownMenu.js +2 -0
  407. package/dist/overlay/DropdownMenu.js.map +1 -1
  408. package/dist/overlay/Modal.cjs +11 -4
  409. package/dist/overlay/Modal.cjs.map +1 -1
  410. package/dist/overlay/Modal.d.ts +1 -1
  411. package/dist/overlay/Modal.d.ts.map +1 -1
  412. package/dist/overlay/Modal.js +11 -4
  413. package/dist/overlay/Modal.js.map +1 -1
  414. package/dist/overlay/modalStack.cjs +35 -0
  415. package/dist/overlay/modalStack.cjs.map +1 -0
  416. package/dist/overlay/modalStack.d.ts +13 -0
  417. package/dist/overlay/modalStack.d.ts.map +1 -0
  418. package/dist/overlay/modalStack.js +35 -0
  419. package/dist/overlay/modalStack.js.map +1 -0
  420. package/dist/rpc/AcceptPicker.cjs +2 -18
  421. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  422. package/dist/rpc/AcceptPicker.d.ts +1 -41
  423. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  424. package/dist/rpc/AcceptPicker.js +2 -18
  425. package/dist/rpc/AcceptPicker.js.map +1 -1
  426. package/dist/rpc/CommandOutput.cjs +1 -1
  427. package/dist/rpc/CommandOutput.cjs.map +1 -1
  428. package/dist/rpc/CommandOutput.js +1 -1
  429. package/dist/rpc/CommandOutput.js.map +1 -1
  430. package/dist/rpc/EndpointList.cjs +1 -1
  431. package/dist/rpc/EndpointList.cjs.map +1 -1
  432. package/dist/rpc/EndpointList.js +1 -1
  433. package/dist/rpc/EndpointList.js.map +1 -1
  434. package/dist/rpc/OperationCatalog.cjs +23 -41
  435. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  436. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  437. package/dist/rpc/OperationCatalog.js +24 -42
  438. package/dist/rpc/OperationCatalog.js.map +1 -1
  439. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  440. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  441. package/dist/rpc/OperationCommandPage.js.map +1 -1
  442. package/dist/rpc/accept-options.cjs +20 -0
  443. package/dist/rpc/accept-options.cjs.map +1 -0
  444. package/dist/rpc/accept-options.d.ts +42 -0
  445. package/dist/rpc/accept-options.d.ts.map +1 -0
  446. package/dist/rpc/accept-options.js +20 -0
  447. package/dist/rpc/accept-options.js.map +1 -0
  448. package/dist/rpc/classify.cjs +15 -4
  449. package/dist/rpc/classify.cjs.map +1 -1
  450. package/dist/rpc/classify.d.ts.map +1 -1
  451. package/dist/rpc/classify.js +15 -4
  452. package/dist/rpc/classify.js.map +1 -1
  453. package/dist/rpc/clickyMetadata.cjs +13 -3
  454. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  455. package/dist/rpc/clickyMetadata.d.ts +2 -0
  456. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  457. package/dist/rpc/clickyMetadata.js +14 -4
  458. package/dist/rpc/clickyMetadata.js.map +1 -1
  459. package/dist/rpc.cjs +3 -2
  460. package/dist/rpc.cjs.map +1 -1
  461. package/dist/rpc.d.ts +2 -1
  462. package/dist/rpc.d.ts.map +1 -1
  463. package/dist/rpc.js +2 -1
  464. package/dist/rpc.js.map +1 -1
  465. package/dist/styles.css +1 -1
  466. package/package.json +16 -1
@@ -4,27 +4,12 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  require("react");
5
5
  const Icon = require("../data/Icon.cjs");
6
6
  const SplitButton = require("./SplitButton.cjs");
7
- const UiEye = require("../icons/components/UiEye.cjs");
8
- const UiFileCode = require("../icons/components/UiFileCode.cjs");
9
- const UiTable = require("../icons/components/UiTable.cjs");
10
- const UiComment = require("../icons/components/UiComment.cjs");
7
+ const formatOptions = require("./format-options.cjs");
11
8
  const UiCheck = require("../icons/components/UiCheck.cjs");
12
- const CLICKY_FORMAT_OPTIONS = [
13
- { value: "clicky", label: "Clicky", description: "Rendered Clicky JSON with the rich Clicky viewer", icon: UiEye.UiEye },
14
- { value: "json", label: "JSON", description: "Plain JSON for inspecting the raw response body", icon: UiFileCode.UiFileCode },
15
- { value: "yaml", label: "YAML", description: "YAML for config-friendly inspection and export", icon: UiFileCode.UiFileCode },
16
- { value: "csv", label: "CSV", description: "Comma-separated values for spreadsheets and imports", icon: UiTable.UiTable },
17
- { value: "markdown", label: "Markdown", description: "Markdown formatted for docs, comments, and chat", icon: UiFileCode.UiFileCode },
18
- { value: "html", label: "HTML", description: "Browser-ready HTML preview of the formatted output", icon: UiFileCode.UiFileCode },
19
- { value: "pdf", label: "PDF", description: "Portable document for sharing and printing", icon: UiFileCode.UiFileCode },
20
- { value: "pretty", label: "Pretty", description: "Human-readable plain text output from the formatter", icon: UiFileCode.UiFileCode },
21
- { value: "excel", label: "Excel", description: "Spreadsheet workbook for offline analysis", icon: UiTable.UiTable },
22
- { value: "slack", label: "Slack", description: "Slack Block Kit JSON for chat-native output", icon: UiComment.UiComment }
23
- ];
24
9
  function FormatOptionsDropdown({
25
10
  value,
26
11
  onChange,
27
- options = CLICKY_FORMAT_OPTIONS,
12
+ options = formatOptions.CLICKY_FORMAT_OPTIONS,
28
13
  label,
29
14
  variant = "outline",
30
15
  size = "default",
@@ -57,6 +42,5 @@ function FormatOptionsDropdown({
57
42
  }
58
43
  );
59
44
  }
60
- exports.CLICKY_FORMAT_OPTIONS = CLICKY_FORMAT_OPTIONS;
61
45
  exports.FormatOptionsDropdown = FormatOptionsDropdown;
62
46
  //# sourceMappingURL=FormatOptionsDropdown.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormatOptionsDropdown.cjs","sources":["../../src/components/FormatOptionsDropdown.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { type ButtonProps } from \"./button\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiCheck, UiComment, UiEye, UiFileCode, UiTable } from \"../icons\";\nimport { SplitButton } from \"./SplitButton\";\n\nexport type FormatOption = {\n /** Stable identifier emitted by `onChange`. */\n value: string;\n /** Visible label. */\n label: string;\n /** Secondary description shown in the menu. */\n description?: string;\n /** Icon rendered before the label. */\n icon?: StaticIconComponent;\n};\n\n/**\n * Clicky output formats with their label, description, and icon. Mirrors the\n * metadata in `Clicky.tsx`'s `getRemoteFormatMeta` so the format picker can live\n * as a standalone component.\n */\nexport const CLICKY_FORMAT_OPTIONS: FormatOption[] = [\n { value: \"clicky\", label: \"Clicky\", description: \"Rendered Clicky JSON with the rich Clicky viewer\", icon: UiEye },\n { value: \"json\", label: \"JSON\", description: \"Plain JSON for inspecting the raw response body\", icon: UiFileCode },\n { value: \"yaml\", label: \"YAML\", description: \"YAML for config-friendly inspection and export\", icon: UiFileCode },\n { value: \"csv\", label: \"CSV\", description: \"Comma-separated values for spreadsheets and imports\", icon: UiTable },\n { value: \"markdown\", label: \"Markdown\", description: \"Markdown formatted for docs, comments, and chat\", icon: UiFileCode },\n { value: \"html\", label: \"HTML\", description: \"Browser-ready HTML preview of the formatted output\", icon: UiFileCode },\n { value: \"pdf\", label: \"PDF\", description: \"Portable document for sharing and printing\", icon: UiFileCode },\n { value: \"pretty\", label: \"Pretty\", description: \"Human-readable plain text output from the formatter\", icon: UiFileCode },\n { value: \"excel\", label: \"Excel\", description: \"Spreadsheet workbook for offline analysis\", icon: UiTable },\n { value: \"slack\", label: \"Slack\", description: \"Slack Block Kit JSON for chat-native output\", icon: UiComment },\n];\n\nexport type FormatOptionsDropdownProps = {\n /** Active format value. */\n value: string;\n /** Called with the chosen format value. */\n onChange: (value: string) => void;\n /** Available formats. Defaults to the clicky output formats. */\n options?: FormatOption[];\n /** Override the primary button label. Defaults to the active option's label. */\n label?: ReactNode;\n /** Variant forwarded to the split button. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the split button. */\n size?: ButtonProps[\"size\"];\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\nexport function FormatOptionsDropdown({\n value,\n onChange,\n options = CLICKY_FORMAT_OPTIONS,\n label,\n variant = \"outline\",\n size = \"default\",\n className,\n}: FormatOptionsDropdownProps) {\n const active = options.find((option) => option.value === value);\n\n return (\n <SplitButton\n label={label ?? active?.label ?? value}\n {...(active?.icon ? { icon: active.icon } : {})}\n onClick={() => onChange(value)}\n variant={variant}\n size={size}\n title=\"Choose format\"\n {...(className ? { className } : {})}\n menuClassName=\"min-w-[18rem]\"\n items={options.map((option) => ({\n ...(option.icon ? { icon: option.icon } : {}),\n ...(option.description ? { title: option.description } : {}),\n label: (\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"flex items-center gap-2 font-medium\">\n {option.label}\n {option.value === value && <Icon icon={UiCheck} className=\"text-xs text-muted-foreground\" />}\n </span>\n {option.description && (\n <span className=\"text-xs text-muted-foreground\">{option.description}</span>\n )}\n </span>\n ),\n onSelect: () => onChange(option.value),\n }))}\n />\n );\n}\n"],"names":["UiEye","UiFileCode","UiTable","UiComment","jsx","SplitButton","jsxs","Icon","UiCheck"],"mappings":";;;;;;;;;;;AAsBO,MAAM,wBAAwC;AAAA,EACnD,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,oDAAoD,MAAMA,YAAA;AAAA,EAC3G,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,mDAAmD,MAAMC,sBAAA;AAAA,EACtG,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,kDAAkD,MAAMA,sBAAA;AAAA,EACrG,EAAE,OAAO,OAAO,OAAO,OAAO,aAAa,uDAAuD,MAAMC,gBAAA;AAAA,EACxG,EAAE,OAAO,YAAY,OAAO,YAAY,aAAa,mDAAmD,MAAMD,sBAAA;AAAA,EAC9G,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,sDAAsD,MAAMA,sBAAA;AAAA,EACzG,EAAE,OAAO,OAAO,OAAO,OAAO,aAAa,8CAA8C,MAAMA,sBAAA;AAAA,EAC/F,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,uDAAuD,MAAMA,sBAAA;AAAA,EAC9G,EAAE,OAAO,SAAS,OAAO,SAAS,aAAa,6CAA6C,MAAMC,gBAAA;AAAA,EAClG,EAAE,OAAO,SAAS,OAAO,SAAS,aAAa,+CAA+C,MAAMC,UAAAA,UAAA;AACtG;AAmBO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,GAA+B;AAC7B,QAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK;AAE9D,SACEC,2BAAAA;AAAAA,IAACC,YAAAA;AAAAA,IAAA;AAAA,MACC,OAAO,UAAS,iCAAQ,UAAS;AAAA,MAChC,IAAI,iCAAQ,QAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,MAC5C,SAAS,MAAM,SAAS,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,OAAM;AAAA,MACL,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,eAAc;AAAA,MACd,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC9B,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,QAC1C,GAAI,OAAO,cAAc,EAAE,OAAO,OAAO,YAAA,IAAgB,CAAA;AAAA,QACzD,OACEC,2BAAAA,KAAC,QAAA,EAAK,WAAU,yBACd,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,uCACb,UAAA;AAAA,YAAA,OAAO;AAAA,YACP,OAAO,UAAU,SAASF,+BAACG,KAAAA,QAAK,MAAMC,QAAAA,SAAS,WAAU,gCAAA,CAAgC;AAAA,UAAA,GAC5F;AAAA,UACC,OAAO,eACNJ,2BAAAA,IAAC,UAAK,WAAU,iCAAiC,iBAAO,YAAA,CAAY;AAAA,QAAA,GAExE;AAAA,QAEF,UAAU,MAAM,SAAS,OAAO,KAAK;AAAA,MAAA,EACrC;AAAA,IAAA;AAAA,EAAA;AAGR;;;"}
1
+ {"version":3,"file":"FormatOptionsDropdown.cjs","sources":["../../src/components/FormatOptionsDropdown.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { type ButtonProps } from \"./button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck } from \"../icons\";\nimport { SplitButton } from \"./SplitButton\";\nimport { CLICKY_FORMAT_OPTIONS, type FormatOption } from \"./format-options\";\n\nexport type FormatOptionsDropdownProps = {\n /** Active format value. */\n value: string;\n /** Called with the chosen format value. */\n onChange: (value: string) => void;\n /** Available formats. Defaults to the clicky output formats. */\n options?: FormatOption[];\n /** Override the primary button label. Defaults to the active option's label. */\n label?: ReactNode;\n /** Variant forwarded to the split button. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the split button. */\n size?: ButtonProps[\"size\"];\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\nexport function FormatOptionsDropdown({\n value,\n onChange,\n options = CLICKY_FORMAT_OPTIONS,\n label,\n variant = \"outline\",\n size = \"default\",\n className,\n}: FormatOptionsDropdownProps) {\n const active = options.find((option) => option.value === value);\n\n return (\n <SplitButton\n label={label ?? active?.label ?? value}\n {...(active?.icon ? { icon: active.icon } : {})}\n onClick={() => onChange(value)}\n variant={variant}\n size={size}\n title=\"Choose format\"\n {...(className ? { className } : {})}\n menuClassName=\"min-w-[18rem]\"\n items={options.map((option) => ({\n ...(option.icon ? { icon: option.icon } : {}),\n ...(option.description ? { title: option.description } : {}),\n label: (\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"flex items-center gap-2 font-medium\">\n {option.label}\n {option.value === value && <Icon icon={UiCheck} className=\"text-xs text-muted-foreground\" />}\n </span>\n {option.description && (\n <span className=\"text-xs text-muted-foreground\">{option.description}</span>\n )}\n </span>\n ),\n onSelect: () => onChange(option.value),\n }))}\n />\n );\n}\n"],"names":["CLICKY_FORMAT_OPTIONS","jsx","SplitButton","jsxs","Icon","UiCheck"],"mappings":";;;;;;;;AAwBO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,UAAUA,cAAAA;AAAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,GAA+B;AAC7B,QAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK;AAE9D,SACEC,2BAAAA;AAAAA,IAACC,YAAAA;AAAAA,IAAA;AAAA,MACC,OAAO,UAAS,iCAAQ,UAAS;AAAA,MAChC,IAAI,iCAAQ,QAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,MAC5C,SAAS,MAAM,SAAS,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,OAAM;AAAA,MACL,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,eAAc;AAAA,MACd,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC9B,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,QAC1C,GAAI,OAAO,cAAc,EAAE,OAAO,OAAO,YAAA,IAAgB,CAAA;AAAA,QACzD,OACEC,2BAAAA,KAAC,QAAA,EAAK,WAAU,yBACd,UAAA;AAAA,UAAAA,2BAAAA,KAAC,QAAA,EAAK,WAAU,uCACb,UAAA;AAAA,YAAA,OAAO;AAAA,YACP,OAAO,UAAU,SAASF,+BAACG,KAAAA,QAAK,MAAMC,QAAAA,SAAS,WAAU,gCAAA,CAAgC;AAAA,UAAA,GAC5F;AAAA,UACC,OAAO,eACNJ,2BAAAA,IAAC,UAAK,WAAU,iCAAiC,iBAAO,YAAA,CAAY;AAAA,QAAA,GAExE;AAAA,QAEF,UAAU,MAAM,SAAS,OAAO,KAAK;AAAA,MAAA,EACrC;AAAA,IAAA;AAAA,EAAA;AAGR;;"}
@@ -1,22 +1,6 @@
1
1
  import { ReactNode } from 'react';
2
2
  import { ButtonProps } from './button';
3
- import { StaticIconComponent } from '../data/Icon';
4
- export type FormatOption = {
5
- /** Stable identifier emitted by `onChange`. */
6
- value: string;
7
- /** Visible label. */
8
- label: string;
9
- /** Secondary description shown in the menu. */
10
- description?: string;
11
- /** Icon rendered before the label. */
12
- icon?: StaticIconComponent;
13
- };
14
- /**
15
- * Clicky output formats with their label, description, and icon. Mirrors the
16
- * metadata in `Clicky.tsx`'s `getRemoteFormatMeta` so the format picker can live
17
- * as a standalone component.
18
- */
19
- export declare const CLICKY_FORMAT_OPTIONS: FormatOption[];
3
+ import { FormatOption } from './format-options';
20
4
  export type FormatOptionsDropdownProps = {
21
5
  /** Active format value. */
22
6
  value: string;
@@ -1 +1 @@
1
- {"version":3,"file":"FormatOptionsDropdown.d.ts","sourceRoot":"","sources":["../../src/components/FormatOptionsDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,EAAQ,KAAK,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAI9D,MAAM,MAAM,YAAY,GAAG;IACzB,+CAA+C;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,+CAA+C;IAC/C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sCAAsC;IACtC,IAAI,CAAC,EAAE,mBAAmB,CAAC;CAC5B,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,EAAE,YAAY,EAW/C,CAAC;AAEF,MAAM,MAAM,0BAA0B,GAAG;IACvC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gEAAgE;IAChE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,gFAAgF;IAChF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,QAAQ,EACR,OAA+B,EAC/B,KAAK,EACL,OAAmB,EACnB,IAAgB,EAChB,SAAS,GACV,EAAE,0BAA0B,2CA+B5B"}
1
+ {"version":3,"file":"FormatOptionsDropdown.d.ts","sourceRoot":"","sources":["../../src/components/FormatOptionsDropdown.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAC;AAI5C,OAAO,EAAyB,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAE5E,MAAM,MAAM,0BAA0B,GAAG;IACvC,2BAA2B;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,2CAA2C;IAC3C,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClC,gEAAgE;IAChE,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,gFAAgF;IAChF,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,6CAA6C;IAC7C,OAAO,CAAC,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IACjC,0CAA0C;IAC1C,IAAI,CAAC,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;IAC3B,sCAAsC;IACtC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAEF,wBAAgB,qBAAqB,CAAC,EACpC,KAAK,EACL,QAAQ,EACR,OAA+B,EAC/B,KAAK,EACL,OAAmB,EACnB,IAAgB,EAChB,SAAS,GACV,EAAE,0BAA0B,2CA+B5B"}
@@ -2,23 +2,8 @@ import { jsx, jsxs } from "react/jsx-runtime";
2
2
  import "react";
3
3
  import { Icon } from "../data/Icon.js";
4
4
  import { SplitButton } from "./SplitButton.js";
5
- import { UiEye } from "../icons/components/UiEye.js";
6
- import { UiFileCode } from "../icons/components/UiFileCode.js";
7
- import { UiTable } from "../icons/components/UiTable.js";
8
- import { UiComment } from "../icons/components/UiComment.js";
5
+ import { CLICKY_FORMAT_OPTIONS } from "./format-options.js";
9
6
  import { UiCheck } from "../icons/components/UiCheck.js";
10
- const CLICKY_FORMAT_OPTIONS = [
11
- { value: "clicky", label: "Clicky", description: "Rendered Clicky JSON with the rich Clicky viewer", icon: UiEye },
12
- { value: "json", label: "JSON", description: "Plain JSON for inspecting the raw response body", icon: UiFileCode },
13
- { value: "yaml", label: "YAML", description: "YAML for config-friendly inspection and export", icon: UiFileCode },
14
- { value: "csv", label: "CSV", description: "Comma-separated values for spreadsheets and imports", icon: UiTable },
15
- { value: "markdown", label: "Markdown", description: "Markdown formatted for docs, comments, and chat", icon: UiFileCode },
16
- { value: "html", label: "HTML", description: "Browser-ready HTML preview of the formatted output", icon: UiFileCode },
17
- { value: "pdf", label: "PDF", description: "Portable document for sharing and printing", icon: UiFileCode },
18
- { value: "pretty", label: "Pretty", description: "Human-readable plain text output from the formatter", icon: UiFileCode },
19
- { value: "excel", label: "Excel", description: "Spreadsheet workbook for offline analysis", icon: UiTable },
20
- { value: "slack", label: "Slack", description: "Slack Block Kit JSON for chat-native output", icon: UiComment }
21
- ];
22
7
  function FormatOptionsDropdown({
23
8
  value,
24
9
  onChange,
@@ -56,7 +41,6 @@ function FormatOptionsDropdown({
56
41
  );
57
42
  }
58
43
  export {
59
- CLICKY_FORMAT_OPTIONS,
60
44
  FormatOptionsDropdown
61
45
  };
62
46
  //# sourceMappingURL=FormatOptionsDropdown.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"FormatOptionsDropdown.js","sources":["../../src/components/FormatOptionsDropdown.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { type ButtonProps } from \"./button\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiCheck, UiComment, UiEye, UiFileCode, UiTable } from \"../icons\";\nimport { SplitButton } from \"./SplitButton\";\n\nexport type FormatOption = {\n /** Stable identifier emitted by `onChange`. */\n value: string;\n /** Visible label. */\n label: string;\n /** Secondary description shown in the menu. */\n description?: string;\n /** Icon rendered before the label. */\n icon?: StaticIconComponent;\n};\n\n/**\n * Clicky output formats with their label, description, and icon. Mirrors the\n * metadata in `Clicky.tsx`'s `getRemoteFormatMeta` so the format picker can live\n * as a standalone component.\n */\nexport const CLICKY_FORMAT_OPTIONS: FormatOption[] = [\n { value: \"clicky\", label: \"Clicky\", description: \"Rendered Clicky JSON with the rich Clicky viewer\", icon: UiEye },\n { value: \"json\", label: \"JSON\", description: \"Plain JSON for inspecting the raw response body\", icon: UiFileCode },\n { value: \"yaml\", label: \"YAML\", description: \"YAML for config-friendly inspection and export\", icon: UiFileCode },\n { value: \"csv\", label: \"CSV\", description: \"Comma-separated values for spreadsheets and imports\", icon: UiTable },\n { value: \"markdown\", label: \"Markdown\", description: \"Markdown formatted for docs, comments, and chat\", icon: UiFileCode },\n { value: \"html\", label: \"HTML\", description: \"Browser-ready HTML preview of the formatted output\", icon: UiFileCode },\n { value: \"pdf\", label: \"PDF\", description: \"Portable document for sharing and printing\", icon: UiFileCode },\n { value: \"pretty\", label: \"Pretty\", description: \"Human-readable plain text output from the formatter\", icon: UiFileCode },\n { value: \"excel\", label: \"Excel\", description: \"Spreadsheet workbook for offline analysis\", icon: UiTable },\n { value: \"slack\", label: \"Slack\", description: \"Slack Block Kit JSON for chat-native output\", icon: UiComment },\n];\n\nexport type FormatOptionsDropdownProps = {\n /** Active format value. */\n value: string;\n /** Called with the chosen format value. */\n onChange: (value: string) => void;\n /** Available formats. Defaults to the clicky output formats. */\n options?: FormatOption[];\n /** Override the primary button label. Defaults to the active option's label. */\n label?: ReactNode;\n /** Variant forwarded to the split button. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the split button. */\n size?: ButtonProps[\"size\"];\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\nexport function FormatOptionsDropdown({\n value,\n onChange,\n options = CLICKY_FORMAT_OPTIONS,\n label,\n variant = \"outline\",\n size = \"default\",\n className,\n}: FormatOptionsDropdownProps) {\n const active = options.find((option) => option.value === value);\n\n return (\n <SplitButton\n label={label ?? active?.label ?? value}\n {...(active?.icon ? { icon: active.icon } : {})}\n onClick={() => onChange(value)}\n variant={variant}\n size={size}\n title=\"Choose format\"\n {...(className ? { className } : {})}\n menuClassName=\"min-w-[18rem]\"\n items={options.map((option) => ({\n ...(option.icon ? { icon: option.icon } : {}),\n ...(option.description ? { title: option.description } : {}),\n label: (\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"flex items-center gap-2 font-medium\">\n {option.label}\n {option.value === value && <Icon icon={UiCheck} className=\"text-xs text-muted-foreground\" />}\n </span>\n {option.description && (\n <span className=\"text-xs text-muted-foreground\">{option.description}</span>\n )}\n </span>\n ),\n onSelect: () => onChange(option.value),\n }))}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;;AAsBO,MAAM,wBAAwC;AAAA,EACnD,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,oDAAoD,MAAM,MAAA;AAAA,EAC3G,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,mDAAmD,MAAM,WAAA;AAAA,EACtG,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,kDAAkD,MAAM,WAAA;AAAA,EACrG,EAAE,OAAO,OAAO,OAAO,OAAO,aAAa,uDAAuD,MAAM,QAAA;AAAA,EACxG,EAAE,OAAO,YAAY,OAAO,YAAY,aAAa,mDAAmD,MAAM,WAAA;AAAA,EAC9G,EAAE,OAAO,QAAQ,OAAO,QAAQ,aAAa,sDAAsD,MAAM,WAAA;AAAA,EACzG,EAAE,OAAO,OAAO,OAAO,OAAO,aAAa,8CAA8C,MAAM,WAAA;AAAA,EAC/F,EAAE,OAAO,UAAU,OAAO,UAAU,aAAa,uDAAuD,MAAM,WAAA;AAAA,EAC9G,EAAE,OAAO,SAAS,OAAO,SAAS,aAAa,6CAA6C,MAAM,QAAA;AAAA,EAClG,EAAE,OAAO,SAAS,OAAO,SAAS,aAAa,+CAA+C,MAAM,UAAA;AACtG;AAmBO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,GAA+B;AAC7B,QAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK;AAE9D,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO,UAAS,iCAAQ,UAAS;AAAA,MAChC,IAAI,iCAAQ,QAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,MAC5C,SAAS,MAAM,SAAS,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,OAAM;AAAA,MACL,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,eAAc;AAAA,MACd,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC9B,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,QAC1C,GAAI,OAAO,cAAc,EAAE,OAAO,OAAO,YAAA,IAAgB,CAAA;AAAA,QACzD,OACE,qBAAC,QAAA,EAAK,WAAU,yBACd,UAAA;AAAA,UAAA,qBAAC,QAAA,EAAK,WAAU,uCACb,UAAA;AAAA,YAAA,OAAO;AAAA,YACP,OAAO,UAAU,SAAS,oBAAC,QAAK,MAAM,SAAS,WAAU,gCAAA,CAAgC;AAAA,UAAA,GAC5F;AAAA,UACC,OAAO,eACN,oBAAC,UAAK,WAAU,iCAAiC,iBAAO,YAAA,CAAY;AAAA,QAAA,GAExE;AAAA,QAEF,UAAU,MAAM,SAAS,OAAO,KAAK;AAAA,MAAA,EACrC;AAAA,IAAA;AAAA,EAAA;AAGR;"}
1
+ {"version":3,"file":"FormatOptionsDropdown.js","sources":["../../src/components/FormatOptionsDropdown.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { type ButtonProps } from \"./button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck } from \"../icons\";\nimport { SplitButton } from \"./SplitButton\";\nimport { CLICKY_FORMAT_OPTIONS, type FormatOption } from \"./format-options\";\n\nexport type FormatOptionsDropdownProps = {\n /** Active format value. */\n value: string;\n /** Called with the chosen format value. */\n onChange: (value: string) => void;\n /** Available formats. Defaults to the clicky output formats. */\n options?: FormatOption[];\n /** Override the primary button label. Defaults to the active option's label. */\n label?: ReactNode;\n /** Variant forwarded to the split button. */\n variant?: ButtonProps[\"variant\"];\n /** Size forwarded to the split button. */\n size?: ButtonProps[\"size\"];\n /** Classes applied to the wrapper. */\n className?: string;\n};\n\nexport function FormatOptionsDropdown({\n value,\n onChange,\n options = CLICKY_FORMAT_OPTIONS,\n label,\n variant = \"outline\",\n size = \"default\",\n className,\n}: FormatOptionsDropdownProps) {\n const active = options.find((option) => option.value === value);\n\n return (\n <SplitButton\n label={label ?? active?.label ?? value}\n {...(active?.icon ? { icon: active.icon } : {})}\n onClick={() => onChange(value)}\n variant={variant}\n size={size}\n title=\"Choose format\"\n {...(className ? { className } : {})}\n menuClassName=\"min-w-[18rem]\"\n items={options.map((option) => ({\n ...(option.icon ? { icon: option.icon } : {}),\n ...(option.description ? { title: option.description } : {}),\n label: (\n <span className=\"flex min-w-0 flex-col\">\n <span className=\"flex items-center gap-2 font-medium\">\n {option.label}\n {option.value === value && <Icon icon={UiCheck} className=\"text-xs text-muted-foreground\" />}\n </span>\n {option.description && (\n <span className=\"text-xs text-muted-foreground\">{option.description}</span>\n )}\n </span>\n ),\n onSelect: () => onChange(option.value),\n }))}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;AAwBO,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA,UAAU;AAAA,EACV;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,GAA+B;AAC7B,QAAM,SAAS,QAAQ,KAAK,CAAC,WAAW,OAAO,UAAU,KAAK;AAE9D,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO,UAAS,iCAAQ,UAAS;AAAA,MAChC,IAAI,iCAAQ,QAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,MAC5C,SAAS,MAAM,SAAS,KAAK;AAAA,MAC7B;AAAA,MACA;AAAA,MACA,OAAM;AAAA,MACL,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,eAAc;AAAA,MACd,OAAO,QAAQ,IAAI,CAAC,YAAY;AAAA,QAC9B,GAAI,OAAO,OAAO,EAAE,MAAM,OAAO,KAAA,IAAS,CAAA;AAAA,QAC1C,GAAI,OAAO,cAAc,EAAE,OAAO,OAAO,YAAA,IAAgB,CAAA;AAAA,QACzD,OACE,qBAAC,QAAA,EAAK,WAAU,yBACd,UAAA;AAAA,UAAA,qBAAC,QAAA,EAAK,WAAU,uCACb,UAAA;AAAA,YAAA,OAAO;AAAA,YACP,OAAO,UAAU,SAAS,oBAAC,QAAK,MAAM,SAAS,WAAU,gCAAA,CAAgC;AAAA,UAAA,GAC5F;AAAA,UACC,OAAO,eACN,oBAAC,UAAK,WAAU,iCAAiC,iBAAO,YAAA,CAAY;AAAA,QAAA,GAExE;AAAA,QAEF,UAAU,MAAM,SAAS,OAAO,KAAK;AAAA,MAAA,EACrC;AAAA,IAAA;AAAA,EAAA;AAGR;"}
@@ -1,18 +1,27 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
3
  const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
4
5
  const utils = require("../lib/utils.cjs");
6
+ const Icon = require("../data/Icon.cjs");
7
+ const DropdownMenu = require("../overlay/DropdownMenu.cjs");
8
+ const jsonSchemaFormFields = require("./json-schema-form-fields.cjs");
5
9
  const jsonSchemaFormRender = require("./json-schema-form-render.cjs");
6
10
  const jsonSchemaFormSize = require("./json-schema-form-size.cjs");
11
+ const jsonSchemaFormPreferences = require("./json-schema-form-preferences.cjs");
12
+ const UiEllipsis = require("../icons/components/UiEllipsis.cjs");
13
+ const UiCheck = require("../icons/components/UiCheck.cjs");
7
14
  const DEFAULT_LABEL_MAX_WIDTH = "40ch";
8
15
  const DEFAULT_VALUE_MAX_WIDTH = "600px";
9
- function resolveFormLayout(layout, inline) {
10
- const base = layout ?? { mode: inline ? "inline" : "stacked" };
11
- if (base.mode !== "inline") return { mode: "stacked" };
16
+ function resolveFormLayout(layout, inline, modeOverride) {
17
+ const baseMode = (layout == null ? void 0 : layout.mode) ?? (inline ? "inline" : "stacked");
18
+ const mode = modeOverride ?? baseMode;
19
+ const valueMaxWidth = (layout == null ? void 0 : layout.valueMaxWidth) ?? DEFAULT_VALUE_MAX_WIDTH;
20
+ if (mode !== "inline") return { mode: "stacked", valueMaxWidth };
12
21
  return {
13
22
  mode: "inline",
14
- labelMaxWidth: base.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,
15
- valueMaxWidth: base.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH
23
+ labelMaxWidth: (layout == null ? void 0 : layout.labelMaxWidth) ?? DEFAULT_LABEL_MAX_WIDTH,
24
+ valueMaxWidth
16
25
  };
17
26
  }
18
27
  function JsonSchemaForm({
@@ -29,26 +38,133 @@ function JsonSchemaForm({
29
38
  requiredFirst = false,
30
39
  title,
31
40
  pre,
32
- post
41
+ post,
42
+ showPreferencesMenu = true,
43
+ persistPreferences = true,
44
+ preferencesStorageKey = jsonSchemaFormPreferences.DEFAULT_PREFERENCES_STORAGE_KEY
33
45
  }) {
34
- const resolvedLayout = resolveFormLayout(layout, inline);
46
+ const [prefs, setPrefs] = react.useState(
47
+ () => showPreferencesMenu && persistPreferences ? jsonSchemaFormPreferences.readPreferences(preferencesStorageKey) : {}
48
+ );
49
+ const effectiveSize = prefs.size ?? size;
50
+ const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);
51
+ const applyPrefs = (next) => {
52
+ setPrefs(next);
53
+ if (persistPreferences) jsonSchemaFormPreferences.writePreferences(preferencesStorageKey, next);
54
+ };
35
55
  const ctx = {
36
56
  readOnly,
37
57
  hideReadOnlyFields,
38
58
  layout: resolvedLayout,
39
- size,
59
+ size: effectiveSize,
40
60
  requiredFirst,
41
61
  pre: pre ?? [],
42
62
  post: post ?? [],
43
63
  depth: 0,
64
+ render: jsonSchemaFormRender.renderApi,
44
65
  ...idPrefix ? { idPrefix } : {}
45
66
  };
46
67
  const rows = jsonSchemaFormRender.renderObjectFields(schema, value, onChange, ctx, hiddenKeys ? { hiddenKeys } : void 0);
47
- const rowGap = resolvedLayout.mode === "inline" ? jsonSchemaFormSize.inlineRowGapClass[size] : jsonSchemaFormSize.stackedRowGapClass[size];
48
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("flex flex-col", jsonSchemaFormSize.fieldInnerGapClass[size]), children: [
49
- title && /* @__PURE__ */ jsxRuntime.jsx("h3", { className: utils.cn("font-semibold", jsonSchemaFormSize.labelSizeClass[size]), children: title }),
50
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: utils.cn("grid", rowGap), children: rows })
68
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("relative flex flex-col", jsonSchemaFormSize.fieldInnerGapClass[effectiveSize]), children: [
69
+ showPreferencesMenu && /* @__PURE__ */ jsxRuntime.jsx(
70
+ PreferencesMenu,
71
+ {
72
+ size: effectiveSize,
73
+ layoutMode: resolvedLayout.mode,
74
+ onSelectSize: (next) => applyPrefs({ ...prefs, size: next }),
75
+ onSelectLayout: (next) => applyPrefs({ ...prefs, layoutMode: next })
76
+ }
77
+ ),
78
+ title && /* @__PURE__ */ jsxRuntime.jsx("h3", { className: utils.cn("font-semibold", jsonSchemaFormSize.labelSizeClass[effectiveSize]), children: title }),
79
+ /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormFields.FieldsGrid, { layout: resolvedLayout, size: effectiveSize, children: rows })
51
80
  ] });
52
81
  }
82
+ const SIZE_OPTIONS = [
83
+ { value: "xs", label: "Extra small" },
84
+ { value: "sm", label: "Small" },
85
+ { value: "md", label: "Medium" },
86
+ { value: "lg", label: "Large" },
87
+ { value: "xl", label: "Extra large" }
88
+ ];
89
+ const LAYOUT_OPTIONS = [
90
+ { value: "stacked", label: "Stacked" },
91
+ { value: "inline", label: "Inline" }
92
+ ];
93
+ function PreferencesMenu({
94
+ size,
95
+ layoutMode,
96
+ onSelectSize,
97
+ onSelectLayout
98
+ }) {
99
+ return /* @__PURE__ */ jsxRuntime.jsx(
100
+ DropdownMenu.DropdownMenu,
101
+ {
102
+ align: "right",
103
+ menuLabel: "Form display options",
104
+ className: "absolute right-0 top-0 z-10",
105
+ trigger: /* @__PURE__ */ jsxRuntime.jsx(
106
+ "button",
107
+ {
108
+ type: "button",
109
+ "aria-label": "Form display options",
110
+ "aria-haspopup": "menu",
111
+ className: "inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
112
+ children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiEllipsis.UiEllipsis, className: "text-sm" })
113
+ }
114
+ ),
115
+ children: (closeMenu) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
116
+ /* @__PURE__ */ jsxRuntime.jsx(PreferenceSection, { title: "Size" }),
117
+ SIZE_OPTIONS.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(
118
+ PreferenceItem,
119
+ {
120
+ label: opt.label,
121
+ selected: opt.value === size,
122
+ onSelect: () => {
123
+ onSelectSize(opt.value);
124
+ closeMenu();
125
+ }
126
+ },
127
+ opt.value
128
+ )),
129
+ /* @__PURE__ */ jsxRuntime.jsx(PreferenceSection, { title: "Layout" }),
130
+ LAYOUT_OPTIONS.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(
131
+ PreferenceItem,
132
+ {
133
+ label: opt.label,
134
+ selected: opt.value === layoutMode,
135
+ onSelect: () => {
136
+ onSelectLayout(opt.value);
137
+ closeMenu();
138
+ }
139
+ },
140
+ opt.value
141
+ ))
142
+ ] })
143
+ }
144
+ );
145
+ }
146
+ function PreferenceSection({ title }) {
147
+ return /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground", children: title });
148
+ }
149
+ function PreferenceItem({
150
+ label,
151
+ selected,
152
+ onSelect
153
+ }) {
154
+ return /* @__PURE__ */ jsxRuntime.jsxs(
155
+ "button",
156
+ {
157
+ type: "button",
158
+ role: "menuitemradio",
159
+ "aria-checked": selected,
160
+ className: "flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground",
161
+ onClick: onSelect,
162
+ children: [
163
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex w-3.5 shrink-0 justify-center", children: selected && /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiCheck.UiCheck, className: "text-xs" }) }),
164
+ label
165
+ ]
166
+ }
167
+ );
168
+ }
53
169
  exports.JsonSchemaForm = JsonSchemaForm;
54
170
  //# sourceMappingURL=JsonSchemaForm.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSchemaForm.cjs","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { renderObjectFields, type RenderContext } from \"./json-schema-form-render\";\nimport {\n DEFAULT_FORM_SIZE,\n fieldInnerGapClass,\n inlineRowGapClass,\n labelSizeClass,\n stackedRowGapClass,\n} from \"./json-schema-form-size\";\nimport type { FormLayout, JsonSchemaFormProps } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props to a single resolved\n// FormLayout. An explicit `layout` wins; otherwise `inline` selects the inline\n// preset. Width caps are only filled for inline mode.\nfunction resolveFormLayout(layout: FormLayout | undefined, inline: boolean): FormLayout {\n const base = layout ?? { mode: inline ? \"inline\" : \"stacked\" };\n if (base.mode !== \"inline\") return { mode: \"stacked\" };\n return {\n mode: \"inline\",\n labelMaxWidth: base.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth: base.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n}: JsonSchemaFormProps) {\n const resolvedLayout = resolveFormLayout(layout, inline);\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n layout: resolvedLayout,\n size,\n requiredFirst,\n pre: pre ?? [],\n post: post ?? [],\n depth: 0,\n ...(idPrefix ? { idPrefix } : {}),\n };\n const rows = renderObjectFields(schema, value, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n\n const rowGap = resolvedLayout.mode === \"inline\" ? inlineRowGapClass[size] : stackedRowGapClass[size];\n return (\n <div className={cn(\"flex flex-col\", fieldInnerGapClass[size])}>\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[size])}>{title}</h3>}\n <div className={cn(\"grid\", rowGap)}>{rows}</div>\n </div>\n );\n}\n"],"names":["DEFAULT_FORM_SIZE","renderObjectFields","inlineRowGapClass","stackedRowGapClass","jsxs","cn","fieldInnerGapClass","jsx","labelSizeClass"],"mappings":";;;;;;AAWA,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAKhC,SAAS,kBAAkB,QAAgC,QAA6B;AACtF,QAAM,OAAO,UAAU,EAAE,MAAM,SAAS,WAAW,UAAA;AACnD,MAAI,KAAK,SAAS,SAAU,QAAO,EAAE,MAAM,UAAA;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe,KAAK,iBAAiB;AAAA,IACrC,eAAe,KAAK,iBAAiB;AAAA,EAAA;AAEzC;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT;AAAA,EACA,OAAOA,mBAAAA;AAAAA,EACP;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,iBAAiB,kBAAkB,QAAQ,MAAM;AACvD,QAAM,MAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,KAAK,OAAO,CAAA;AAAA,IACZ,MAAM,QAAQ,CAAA;AAAA,IACd,OAAO;AAAA,IACP,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,EAAC;AAEjC,QAAM,OAAOC,qBAAAA,mBAAmB,QAAQ,OAAO,UAAU,KAAK,aAAa,EAAE,WAAA,IAAe,MAAS;AAErG,QAAM,SAAS,eAAe,SAAS,WAAWC,mBAAAA,kBAAkB,IAAI,IAAIC,mBAAAA,mBAAmB,IAAI;AACnG,SACEC,2BAAAA,KAAC,SAAI,WAAWC,MAAAA,GAAG,iBAAiBC,sCAAmB,IAAI,CAAC,GACzD,UAAA;AAAA,IAAA,SAASC,2BAAAA,IAAC,QAAG,WAAWF,MAAAA,GAAG,iBAAiBG,mBAAAA,eAAe,IAAI,CAAC,GAAI,UAAA,MAAA,CAAM;AAAA,mCAC1E,OAAA,EAAI,WAAWH,MAAAA,GAAG,QAAQ,MAAM,GAAI,UAAA,KAAA,CAAK;AAAA,EAAA,GAC5C;AAEJ;;"}
1
+ {"version":3,"file":"JsonSchemaForm.cjs","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiEllipsis } from \"../icons\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { FieldsGrid } from \"./json-schema-form-fields\";\nimport { renderApi, renderObjectFields } from \"./json-schema-form-render\";\nimport {\n DEFAULT_FORM_SIZE,\n fieldInnerGapClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport {\n DEFAULT_PREFERENCES_STORAGE_KEY,\n readPreferences,\n writePreferences,\n type FormPreferences,\n type LayoutMode,\n} from \"./json-schema-form-preferences\";\nimport type { FormLayout, JsonSchemaFormProps, RenderContext } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props plus an optional menu-driven\n// `modeOverride` to a single resolved FormLayout. An explicit `layout` sets the\n// base; `inline` is the shorthand for it; `modeOverride` (from the preferences\n// menu) wins over both but only flips the mode — width caps from `layout` are\n// preserved. Both modes fill valueMaxWidth (inline value column / stacked\n// label+value stack); the label cap only applies inline.\nfunction resolveFormLayout(\n layout: FormLayout | undefined,\n inline: boolean,\n modeOverride: LayoutMode | undefined,\n): FormLayout {\n const baseMode = layout?.mode ?? (inline ? \"inline\" : \"stacked\");\n const mode = modeOverride ?? baseMode;\n const valueMaxWidth = layout?.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH;\n if (mode !== \"inline\") return { mode: \"stacked\", valueMaxWidth };\n return {\n mode: \"inline\",\n labelMaxWidth: layout?.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n showPreferencesMenu = true,\n persistPreferences = true,\n preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY,\n}: JsonSchemaFormProps) {\n // When the menu is hidden, never touch localStorage and start from an empty\n // override so behaviour is identical to before this feature existed.\n const [prefs, setPrefs] = useState<FormPreferences>(() =>\n showPreferencesMenu && persistPreferences ? readPreferences(preferencesStorageKey) : {},\n );\n\n const effectiveSize = prefs.size ?? size;\n const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);\n\n const applyPrefs = (next: FormPreferences) => {\n setPrefs(next);\n if (persistPreferences) writePreferences(preferencesStorageKey, next);\n };\n\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n layout: resolvedLayout,\n size: effectiveSize,\n requiredFirst,\n pre: pre ?? [],\n post: post ?? [],\n depth: 0,\n render: renderApi,\n ...(idPrefix ? { idPrefix } : {}),\n };\n const rows = renderObjectFields(schema, value, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n\n return (\n <div className={cn(\"relative flex flex-col\", fieldInnerGapClass[effectiveSize])}>\n {showPreferencesMenu && (\n <PreferencesMenu\n size={effectiveSize}\n layoutMode={resolvedLayout.mode}\n onSelectSize={(next) => applyPrefs({ ...prefs, size: next })}\n onSelectLayout={(next) => applyPrefs({ ...prefs, layoutMode: next })}\n />\n )}\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[effectiveSize])}>{title}</h3>}\n <FieldsGrid layout={resolvedLayout} size={effectiveSize}>\n {rows}\n </FieldsGrid>\n </div>\n );\n}\n\nconst SIZE_OPTIONS: { value: FormSize; label: string }[] = [\n { value: \"xs\", label: \"Extra small\" },\n { value: \"sm\", label: \"Small\" },\n { value: \"md\", label: \"Medium\" },\n { value: \"lg\", label: \"Large\" },\n { value: \"xl\", label: \"Extra large\" },\n];\n\nconst LAYOUT_OPTIONS: { value: LayoutMode; label: string }[] = [\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"inline\", label: \"Inline\" },\n];\n\n// PreferencesMenu is the compact top-right ellipsis menu controlling this form's\n// size and layout mode. Selecting an item fires the matching callback and closes\n// the menu; the parent decides whether to persist.\nfunction PreferencesMenu({\n size,\n layoutMode,\n onSelectSize,\n onSelectLayout,\n}: {\n size: FormSize;\n layoutMode: LayoutMode;\n onSelectSize: (size: FormSize) => void;\n onSelectLayout: (mode: LayoutMode) => void;\n}) {\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Form display options\"\n className=\"absolute right-0 top-0 z-10\"\n trigger={\n <button\n type=\"button\"\n aria-label=\"Form display options\"\n aria-haspopup=\"menu\"\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiEllipsis} className=\"text-sm\" />\n </button>\n }\n >\n {(closeMenu) => (\n <>\n <PreferenceSection title=\"Size\" />\n {SIZE_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === size}\n onSelect={() => {\n onSelectSize(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Layout\" />\n {LAYOUT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === layoutMode}\n onSelect={() => {\n onSelectLayout(opt.value);\n closeMenu();\n }}\n />\n ))}\n </>\n )}\n </DropdownMenu>\n );\n}\n\nfunction PreferenceSection({ title }: { title: string }) {\n return (\n <div className=\"px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n );\n}\n\nfunction PreferenceItem({\n label,\n selected,\n onSelect,\n}: {\n label: string;\n selected: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n onClick={onSelect}\n >\n <span className=\"flex w-3.5 shrink-0 justify-center\">\n {selected && <Icon icon={UiCheck} className=\"text-xs\" />}\n </span>\n {label}\n </button>\n );\n}\n"],"names":["DEFAULT_FORM_SIZE","DEFAULT_PREFERENCES_STORAGE_KEY","useState","readPreferences","writePreferences","renderApi","renderObjectFields","jsxs","cn","fieldInnerGapClass","jsx","labelSizeClass","FieldsGrid","DropdownMenu","Icon","UiEllipsis","Fragment","UiCheck"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { JsonSchemaFormProps } from './json-schema-form-types';
2
- export declare function JsonSchemaForm({ schema, value, onChange, readOnly, inline, layout, size, idPrefix, hideReadOnlyFields, hiddenKeys, requiredFirst, title, pre, post, }: JsonSchemaFormProps): import("react/jsx-runtime").JSX.Element;
2
+ export declare function JsonSchemaForm({ schema, value, onChange, readOnly, inline, layout, size, idPrefix, hideReadOnlyFields, hiddenKeys, requiredFirst, title, pre, post, showPreferencesMenu, persistPreferences, preferencesStorageKey, }: JsonSchemaFormProps): import("react/jsx-runtime").JSX.Element;
3
3
  //# sourceMappingURL=JsonSchemaForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSchemaForm.d.ts","sourceRoot":"","sources":["../../src/components/JsonSchemaForm.tsx"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAc,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAuBhF,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,MAAc,EACd,MAAM,EACN,IAAwB,EACxB,QAAQ,EACR,kBAA0B,EAC1B,UAAU,EACV,aAAqB,EACrB,KAAK,EACL,GAAG,EACH,IAAI,GACL,EAAE,mBAAmB,2CAsBrB"}
1
+ {"version":3,"file":"JsonSchemaForm.d.ts","sourceRoot":"","sources":["../../src/components/JsonSchemaForm.tsx"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAc,mBAAmB,EAAiB,MAAM,0BAA0B,CAAC;AAgC/F,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,QAAgB,EAChB,MAAc,EACd,MAAM,EACN,IAAwB,EACxB,QAAQ,EACR,kBAA0B,EAC1B,UAAU,EACV,aAAqB,EACrB,KAAK,EACL,GAAG,EACH,IAAI,EACJ,mBAA0B,EAC1B,kBAAyB,EACzB,qBAAuD,GACxD,EAAE,mBAAmB,2CA6CrB"}
@@ -1,16 +1,25 @@
1
- import { jsxs, jsx } from "react/jsx-runtime";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
2
3
  import { cn } from "../lib/utils.js";
3
- import { renderObjectFields } from "./json-schema-form-render.js";
4
- import { inlineRowGapClass, DEFAULT_FORM_SIZE, stackedRowGapClass, labelSizeClass, fieldInnerGapClass } from "./json-schema-form-size.js";
4
+ import { Icon } from "../data/Icon.js";
5
+ import { DropdownMenu } from "../overlay/DropdownMenu.js";
6
+ import { FieldsGrid } from "./json-schema-form-fields.js";
7
+ import { renderObjectFields, renderApi } from "./json-schema-form-render.js";
8
+ import { DEFAULT_FORM_SIZE, labelSizeClass, fieldInnerGapClass } from "./json-schema-form-size.js";
9
+ import { readPreferences, DEFAULT_PREFERENCES_STORAGE_KEY, writePreferences } from "./json-schema-form-preferences.js";
10
+ import { UiEllipsis } from "../icons/components/UiEllipsis.js";
11
+ import { UiCheck } from "../icons/components/UiCheck.js";
5
12
  const DEFAULT_LABEL_MAX_WIDTH = "40ch";
6
13
  const DEFAULT_VALUE_MAX_WIDTH = "600px";
7
- function resolveFormLayout(layout, inline) {
8
- const base = layout ?? { mode: inline ? "inline" : "stacked" };
9
- if (base.mode !== "inline") return { mode: "stacked" };
14
+ function resolveFormLayout(layout, inline, modeOverride) {
15
+ const baseMode = (layout == null ? void 0 : layout.mode) ?? (inline ? "inline" : "stacked");
16
+ const mode = modeOverride ?? baseMode;
17
+ const valueMaxWidth = (layout == null ? void 0 : layout.valueMaxWidth) ?? DEFAULT_VALUE_MAX_WIDTH;
18
+ if (mode !== "inline") return { mode: "stacked", valueMaxWidth };
10
19
  return {
11
20
  mode: "inline",
12
- labelMaxWidth: base.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,
13
- valueMaxWidth: base.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH
21
+ labelMaxWidth: (layout == null ? void 0 : layout.labelMaxWidth) ?? DEFAULT_LABEL_MAX_WIDTH,
22
+ valueMaxWidth
14
23
  };
15
24
  }
16
25
  function JsonSchemaForm({
@@ -27,27 +36,134 @@ function JsonSchemaForm({
27
36
  requiredFirst = false,
28
37
  title,
29
38
  pre,
30
- post
39
+ post,
40
+ showPreferencesMenu = true,
41
+ persistPreferences = true,
42
+ preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY
31
43
  }) {
32
- const resolvedLayout = resolveFormLayout(layout, inline);
44
+ const [prefs, setPrefs] = useState(
45
+ () => showPreferencesMenu && persistPreferences ? readPreferences(preferencesStorageKey) : {}
46
+ );
47
+ const effectiveSize = prefs.size ?? size;
48
+ const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);
49
+ const applyPrefs = (next) => {
50
+ setPrefs(next);
51
+ if (persistPreferences) writePreferences(preferencesStorageKey, next);
52
+ };
33
53
  const ctx = {
34
54
  readOnly,
35
55
  hideReadOnlyFields,
36
56
  layout: resolvedLayout,
37
- size,
57
+ size: effectiveSize,
38
58
  requiredFirst,
39
59
  pre: pre ?? [],
40
60
  post: post ?? [],
41
61
  depth: 0,
62
+ render: renderApi,
42
63
  ...idPrefix ? { idPrefix } : {}
43
64
  };
44
65
  const rows = renderObjectFields(schema, value, onChange, ctx, hiddenKeys ? { hiddenKeys } : void 0);
45
- const rowGap = resolvedLayout.mode === "inline" ? inlineRowGapClass[size] : stackedRowGapClass[size];
46
- return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col", fieldInnerGapClass[size]), children: [
47
- title && /* @__PURE__ */ jsx("h3", { className: cn("font-semibold", labelSizeClass[size]), children: title }),
48
- /* @__PURE__ */ jsx("div", { className: cn("grid", rowGap), children: rows })
66
+ return /* @__PURE__ */ jsxs("div", { className: cn("relative flex flex-col", fieldInnerGapClass[effectiveSize]), children: [
67
+ showPreferencesMenu && /* @__PURE__ */ jsx(
68
+ PreferencesMenu,
69
+ {
70
+ size: effectiveSize,
71
+ layoutMode: resolvedLayout.mode,
72
+ onSelectSize: (next) => applyPrefs({ ...prefs, size: next }),
73
+ onSelectLayout: (next) => applyPrefs({ ...prefs, layoutMode: next })
74
+ }
75
+ ),
76
+ title && /* @__PURE__ */ jsx("h3", { className: cn("font-semibold", labelSizeClass[effectiveSize]), children: title }),
77
+ /* @__PURE__ */ jsx(FieldsGrid, { layout: resolvedLayout, size: effectiveSize, children: rows })
49
78
  ] });
50
79
  }
80
+ const SIZE_OPTIONS = [
81
+ { value: "xs", label: "Extra small" },
82
+ { value: "sm", label: "Small" },
83
+ { value: "md", label: "Medium" },
84
+ { value: "lg", label: "Large" },
85
+ { value: "xl", label: "Extra large" }
86
+ ];
87
+ const LAYOUT_OPTIONS = [
88
+ { value: "stacked", label: "Stacked" },
89
+ { value: "inline", label: "Inline" }
90
+ ];
91
+ function PreferencesMenu({
92
+ size,
93
+ layoutMode,
94
+ onSelectSize,
95
+ onSelectLayout
96
+ }) {
97
+ return /* @__PURE__ */ jsx(
98
+ DropdownMenu,
99
+ {
100
+ align: "right",
101
+ menuLabel: "Form display options",
102
+ className: "absolute right-0 top-0 z-10",
103
+ trigger: /* @__PURE__ */ jsx(
104
+ "button",
105
+ {
106
+ type: "button",
107
+ "aria-label": "Form display options",
108
+ "aria-haspopup": "menu",
109
+ className: "inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
110
+ children: /* @__PURE__ */ jsx(Icon, { icon: UiEllipsis, className: "text-sm" })
111
+ }
112
+ ),
113
+ children: (closeMenu) => /* @__PURE__ */ jsxs(Fragment, { children: [
114
+ /* @__PURE__ */ jsx(PreferenceSection, { title: "Size" }),
115
+ SIZE_OPTIONS.map((opt) => /* @__PURE__ */ jsx(
116
+ PreferenceItem,
117
+ {
118
+ label: opt.label,
119
+ selected: opt.value === size,
120
+ onSelect: () => {
121
+ onSelectSize(opt.value);
122
+ closeMenu();
123
+ }
124
+ },
125
+ opt.value
126
+ )),
127
+ /* @__PURE__ */ jsx(PreferenceSection, { title: "Layout" }),
128
+ LAYOUT_OPTIONS.map((opt) => /* @__PURE__ */ jsx(
129
+ PreferenceItem,
130
+ {
131
+ label: opt.label,
132
+ selected: opt.value === layoutMode,
133
+ onSelect: () => {
134
+ onSelectLayout(opt.value);
135
+ closeMenu();
136
+ }
137
+ },
138
+ opt.value
139
+ ))
140
+ ] })
141
+ }
142
+ );
143
+ }
144
+ function PreferenceSection({ title }) {
145
+ return /* @__PURE__ */ jsx("div", { className: "px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground", children: title });
146
+ }
147
+ function PreferenceItem({
148
+ label,
149
+ selected,
150
+ onSelect
151
+ }) {
152
+ return /* @__PURE__ */ jsxs(
153
+ "button",
154
+ {
155
+ type: "button",
156
+ role: "menuitemradio",
157
+ "aria-checked": selected,
158
+ className: "flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground",
159
+ onClick: onSelect,
160
+ children: [
161
+ /* @__PURE__ */ jsx("span", { className: "flex w-3.5 shrink-0 justify-center", children: selected && /* @__PURE__ */ jsx(Icon, { icon: UiCheck, className: "text-xs" }) }),
162
+ label
163
+ ]
164
+ }
165
+ );
166
+ }
51
167
  export {
52
168
  JsonSchemaForm
53
169
  };
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSchemaForm.js","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { renderObjectFields, type RenderContext } from \"./json-schema-form-render\";\nimport {\n DEFAULT_FORM_SIZE,\n fieldInnerGapClass,\n inlineRowGapClass,\n labelSizeClass,\n stackedRowGapClass,\n} from \"./json-schema-form-size\";\nimport type { FormLayout, JsonSchemaFormProps } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props to a single resolved\n// FormLayout. An explicit `layout` wins; otherwise `inline` selects the inline\n// preset. Width caps are only filled for inline mode.\nfunction resolveFormLayout(layout: FormLayout | undefined, inline: boolean): FormLayout {\n const base = layout ?? { mode: inline ? \"inline\" : \"stacked\" };\n if (base.mode !== \"inline\") return { mode: \"stacked\" };\n return {\n mode: \"inline\",\n labelMaxWidth: base.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth: base.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n}: JsonSchemaFormProps) {\n const resolvedLayout = resolveFormLayout(layout, inline);\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n layout: resolvedLayout,\n size,\n requiredFirst,\n pre: pre ?? [],\n post: post ?? [],\n depth: 0,\n ...(idPrefix ? { idPrefix } : {}),\n };\n const rows = renderObjectFields(schema, value, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n\n const rowGap = resolvedLayout.mode === \"inline\" ? inlineRowGapClass[size] : stackedRowGapClass[size];\n return (\n <div className={cn(\"flex flex-col\", fieldInnerGapClass[size])}>\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[size])}>{title}</h3>}\n <div className={cn(\"grid\", rowGap)}>{rows}</div>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;AAWA,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAKhC,SAAS,kBAAkB,QAAgC,QAA6B;AACtF,QAAM,OAAO,UAAU,EAAE,MAAM,SAAS,WAAW,UAAA;AACnD,MAAI,KAAK,SAAS,SAAU,QAAO,EAAE,MAAM,UAAA;AAC3C,SAAO;AAAA,IACL,MAAM;AAAA,IACN,eAAe,KAAK,iBAAiB;AAAA,IACrC,eAAe,KAAK,iBAAiB;AAAA,EAAA;AAEzC;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AACF,GAAwB;AACtB,QAAM,iBAAiB,kBAAkB,QAAQ,MAAM;AACvD,QAAM,MAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,IACA;AAAA,IACA,KAAK,OAAO,CAAA;AAAA,IACZ,MAAM,QAAQ,CAAA;AAAA,IACd,OAAO;AAAA,IACP,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,EAAC;AAEjC,QAAM,OAAO,mBAAmB,QAAQ,OAAO,UAAU,KAAK,aAAa,EAAE,WAAA,IAAe,MAAS;AAErG,QAAM,SAAS,eAAe,SAAS,WAAW,kBAAkB,IAAI,IAAI,mBAAmB,IAAI;AACnG,SACE,qBAAC,SAAI,WAAW,GAAG,iBAAiB,mBAAmB,IAAI,CAAC,GACzD,UAAA;AAAA,IAAA,SAAS,oBAAC,QAAG,WAAW,GAAG,iBAAiB,eAAe,IAAI,CAAC,GAAI,UAAA,MAAA,CAAM;AAAA,wBAC1E,OAAA,EAAI,WAAW,GAAG,QAAQ,MAAM,GAAI,UAAA,KAAA,CAAK;AAAA,EAAA,GAC5C;AAEJ;"}
1
+ {"version":3,"file":"JsonSchemaForm.js","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiEllipsis } from \"../icons\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { FieldsGrid } from \"./json-schema-form-fields\";\nimport { renderApi, renderObjectFields } from \"./json-schema-form-render\";\nimport {\n DEFAULT_FORM_SIZE,\n fieldInnerGapClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport {\n DEFAULT_PREFERENCES_STORAGE_KEY,\n readPreferences,\n writePreferences,\n type FormPreferences,\n type LayoutMode,\n} from \"./json-schema-form-preferences\";\nimport type { FormLayout, JsonSchemaFormProps, RenderContext } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props plus an optional menu-driven\n// `modeOverride` to a single resolved FormLayout. An explicit `layout` sets the\n// base; `inline` is the shorthand for it; `modeOverride` (from the preferences\n// menu) wins over both but only flips the mode — width caps from `layout` are\n// preserved. Both modes fill valueMaxWidth (inline value column / stacked\n// label+value stack); the label cap only applies inline.\nfunction resolveFormLayout(\n layout: FormLayout | undefined,\n inline: boolean,\n modeOverride: LayoutMode | undefined,\n): FormLayout {\n const baseMode = layout?.mode ?? (inline ? \"inline\" : \"stacked\");\n const mode = modeOverride ?? baseMode;\n const valueMaxWidth = layout?.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH;\n if (mode !== \"inline\") return { mode: \"stacked\", valueMaxWidth };\n return {\n mode: \"inline\",\n labelMaxWidth: layout?.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n showPreferencesMenu = true,\n persistPreferences = true,\n preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY,\n}: JsonSchemaFormProps) {\n // When the menu is hidden, never touch localStorage and start from an empty\n // override so behaviour is identical to before this feature existed.\n const [prefs, setPrefs] = useState<FormPreferences>(() =>\n showPreferencesMenu && persistPreferences ? readPreferences(preferencesStorageKey) : {},\n );\n\n const effectiveSize = prefs.size ?? size;\n const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);\n\n const applyPrefs = (next: FormPreferences) => {\n setPrefs(next);\n if (persistPreferences) writePreferences(preferencesStorageKey, next);\n };\n\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n layout: resolvedLayout,\n size: effectiveSize,\n requiredFirst,\n pre: pre ?? [],\n post: post ?? [],\n depth: 0,\n render: renderApi,\n ...(idPrefix ? { idPrefix } : {}),\n };\n const rows = renderObjectFields(schema, value, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n\n return (\n <div className={cn(\"relative flex flex-col\", fieldInnerGapClass[effectiveSize])}>\n {showPreferencesMenu && (\n <PreferencesMenu\n size={effectiveSize}\n layoutMode={resolvedLayout.mode}\n onSelectSize={(next) => applyPrefs({ ...prefs, size: next })}\n onSelectLayout={(next) => applyPrefs({ ...prefs, layoutMode: next })}\n />\n )}\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[effectiveSize])}>{title}</h3>}\n <FieldsGrid layout={resolvedLayout} size={effectiveSize}>\n {rows}\n </FieldsGrid>\n </div>\n );\n}\n\nconst SIZE_OPTIONS: { value: FormSize; label: string }[] = [\n { value: \"xs\", label: \"Extra small\" },\n { value: \"sm\", label: \"Small\" },\n { value: \"md\", label: \"Medium\" },\n { value: \"lg\", label: \"Large\" },\n { value: \"xl\", label: \"Extra large\" },\n];\n\nconst LAYOUT_OPTIONS: { value: LayoutMode; label: string }[] = [\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"inline\", label: \"Inline\" },\n];\n\n// PreferencesMenu is the compact top-right ellipsis menu controlling this form's\n// size and layout mode. Selecting an item fires the matching callback and closes\n// the menu; the parent decides whether to persist.\nfunction PreferencesMenu({\n size,\n layoutMode,\n onSelectSize,\n onSelectLayout,\n}: {\n size: FormSize;\n layoutMode: LayoutMode;\n onSelectSize: (size: FormSize) => void;\n onSelectLayout: (mode: LayoutMode) => void;\n}) {\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Form display options\"\n className=\"absolute right-0 top-0 z-10\"\n trigger={\n <button\n type=\"button\"\n aria-label=\"Form display options\"\n aria-haspopup=\"menu\"\n className=\"inline-flex h-7 w-7 items-center justify-center rounded-md text-muted-foreground transition-colors hover:bg-accent hover:text-accent-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon icon={UiEllipsis} className=\"text-sm\" />\n </button>\n }\n >\n {(closeMenu) => (\n <>\n <PreferenceSection title=\"Size\" />\n {SIZE_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === size}\n onSelect={() => {\n onSelectSize(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Layout\" />\n {LAYOUT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === layoutMode}\n onSelect={() => {\n onSelectLayout(opt.value);\n closeMenu();\n }}\n />\n ))}\n </>\n )}\n </DropdownMenu>\n );\n}\n\nfunction PreferenceSection({ title }: { title: string }) {\n return (\n <div className=\"px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n );\n}\n\nfunction PreferenceItem({\n label,\n selected,\n onSelect,\n}: {\n label: string;\n selected: boolean;\n onSelect: () => void;\n}) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n onClick={onSelect}\n >\n <span className=\"flex w-3.5 shrink-0 justify-center\">\n {selected && <Icon icon={UiCheck} className=\"text-xs\" />}\n </span>\n {label}\n </button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;AAsBA,MAAM,0BAA0B;AAChC,MAAM,0BAA0B;AAQhC,SAAS,kBACP,QACA,QACA,cACY;AACZ,QAAM,YAAW,iCAAQ,UAAS,SAAS,WAAW;AACtD,QAAM,OAAO,gBAAgB;AAC7B,QAAM,iBAAgB,iCAAQ,kBAAiB;AAC/C,MAAI,SAAS,SAAU,QAAO,EAAE,MAAM,WAAW,cAAA;AACjD,SAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAe,iCAAQ,kBAAiB;AAAA,IACxC;AAAA,EAAA;AAEJ;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA,WAAW;AAAA,EACX,SAAS;AAAA,EACT;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA,qBAAqB;AAAA,EACrB;AAAA,EACA,gBAAgB;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA,sBAAsB;AAAA,EACtB,qBAAqB;AAAA,EACrB,wBAAwB;AAC1B,GAAwB;AAGtB,QAAM,CAAC,OAAO,QAAQ,IAAI;AAAA,IAA0B,MAClD,uBAAuB,qBAAqB,gBAAgB,qBAAqB,IAAI,CAAA;AAAA,EAAC;AAGxF,QAAM,gBAAgB,MAAM,QAAQ;AACpC,QAAM,iBAAiB,kBAAkB,QAAQ,QAAQ,MAAM,UAAU;AAEzE,QAAM,aAAa,CAAC,SAA0B;AAC5C,aAAS,IAAI;AACb,QAAI,mBAAoB,kBAAiB,uBAAuB,IAAI;AAAA,EACtE;AAEA,QAAM,MAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR,MAAM;AAAA,IACN;AAAA,IACA,KAAK,OAAO,CAAA;AAAA,IACZ,MAAM,QAAQ,CAAA;AAAA,IACd,OAAO;AAAA,IACP,QAAQ;AAAA,IACR,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,EAAC;AAEjC,QAAM,OAAO,mBAAmB,QAAQ,OAAO,UAAU,KAAK,aAAa,EAAE,WAAA,IAAe,MAAS;AAErG,SACE,qBAAC,SAAI,WAAW,GAAG,0BAA0B,mBAAmB,aAAa,CAAC,GAC3E,UAAA;AAAA,IAAA,uBACC;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM;AAAA,QACN,YAAY,eAAe;AAAA,QAC3B,cAAc,CAAC,SAAS,WAAW,EAAE,GAAG,OAAO,MAAM,MAAM;AAAA,QAC3D,gBAAgB,CAAC,SAAS,WAAW,EAAE,GAAG,OAAO,YAAY,KAAA,CAAM;AAAA,MAAA;AAAA,IAAA;AAAA,IAGtE,SAAS,oBAAC,MAAA,EAAG,WAAW,GAAG,iBAAiB,eAAe,aAAa,CAAC,GAAI,UAAA,MAAA,CAAM;AAAA,wBACnF,YAAA,EAAW,QAAQ,gBAAgB,MAAM,eACvC,UAAA,KAAA,CACH;AAAA,EAAA,GACF;AAEJ;AAEA,MAAM,eAAqD;AAAA,EACzD,EAAE,OAAO,MAAM,OAAO,cAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,QAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,SAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,QAAA;AAAA,EACtB,EAAE,OAAO,MAAM,OAAO,cAAA;AACxB;AAEA,MAAM,iBAAyD;AAAA,EAC7D,EAAE,OAAO,WAAW,OAAO,UAAA;AAAA,EAC3B,EAAE,OAAO,UAAU,OAAO,SAAA;AAC5B;AAKA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAM;AAAA,MACN,WAAU;AAAA,MACV,WAAU;AAAA,MACV,SACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,cAAW;AAAA,UACX,iBAAc;AAAA,UACd,WAAU;AAAA,UAEV,UAAA,oBAAC,MAAA,EAAK,MAAM,YAAY,WAAU,UAAA,CAAU;AAAA,QAAA;AAAA,MAAA;AAAA,MAI/C,UAAA,CAAC,cACA,qBAAA,UAAA,EACE,UAAA;AAAA,QAAA,oBAAC,mBAAA,EAAkB,OAAM,OAAA,CAAO;AAAA,QAC/B,aAAa,IAAI,CAAC,QACjB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO,IAAI;AAAA,YACX,UAAU,IAAI,UAAU;AAAA,YACxB,UAAU,MAAM;AACd,2BAAa,IAAI,KAAK;AACtB,wBAAA;AAAA,YACF;AAAA,UAAA;AAAA,UANK,IAAI;AAAA,QAAA,CAQZ;AAAA,QACD,oBAAC,mBAAA,EAAkB,OAAM,SAAA,CAAS;AAAA,QACjC,eAAe,IAAI,CAAC,QACnB;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,OAAO,IAAI;AAAA,YACX,UAAU,IAAI,UAAU;AAAA,YACxB,UAAU,MAAM;AACd,6BAAe,IAAI,KAAK;AACxB,wBAAA;AAAA,YACF;AAAA,UAAA;AAAA,UANK,IAAI;AAAA,QAAA,CAQZ;AAAA,MAAA,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,SAAS,kBAAkB,EAAE,SAA4B;AACvD,SACE,oBAAC,OAAA,EAAI,WAAU,0FACZ,UAAA,OACH;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,MAAK;AAAA,MACL,gBAAc;AAAA,MACd,WAAU;AAAA,MACV,SAAS;AAAA,MAET,UAAA;AAAA,QAAA,oBAAC,QAAA,EAAK,WAAU,sCACb,UAAA,YAAY,oBAAC,QAAK,MAAM,SAAS,WAAU,UAAA,CAAU,EAAA,CACxD;AAAA,QACC;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGP;"}
@@ -11,7 +11,7 @@ function SecretKeySelector({
11
11
  onChange,
12
12
  loadResources,
13
13
  loadKeyPreview,
14
- allowLiteral = false,
14
+ allowLiteral = true,
15
15
  strict = false,
16
16
  className
17
17
  }) {
@@ -147,5 +147,4 @@ function buildKeyOptions(keys, previews, selectedKey) {
147
147
  return base;
148
148
  }
149
149
  exports.SecretKeySelector = SecretKeySelector;
150
- exports.buildKeyOptions = buildKeyOptions;
151
150
  //# sourceMappingURL=SecretKeySelector.cjs.map