@flanksource/clicky-ui 0.2.14 → 0.2.16

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 (489) 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 +19 -9
  8. package/dist/components/Combobox.cjs.map +1 -1
  9. package/dist/components/Combobox.d.ts +10 -0
  10. package/dist/components/Combobox.d.ts.map +1 -1
  11. package/dist/components/Combobox.js +19 -9
  12. package/dist/components/Combobox.js.map +1 -1
  13. package/dist/components/DateTimePicker.cjs +6 -1
  14. package/dist/components/DateTimePicker.cjs.map +1 -1
  15. package/dist/components/DateTimePicker.d.ts +11 -3
  16. package/dist/components/DateTimePicker.d.ts.map +1 -1
  17. package/dist/components/DateTimePicker.js +6 -1
  18. package/dist/components/DateTimePicker.js.map +1 -1
  19. package/dist/components/Field.cjs +33 -0
  20. package/dist/components/Field.cjs.map +1 -0
  21. package/dist/components/Field.d.ts +27 -0
  22. package/dist/components/Field.d.ts.map +1 -0
  23. package/dist/components/Field.js +33 -0
  24. package/dist/components/Field.js.map +1 -0
  25. package/dist/components/FilterBar.cjs +49 -55
  26. package/dist/components/FilterBar.cjs.map +1 -1
  27. package/dist/components/FilterBar.d.ts +2 -2
  28. package/dist/components/FilterBar.d.ts.map +1 -1
  29. package/dist/components/FilterBar.js +44 -50
  30. package/dist/components/FilterBar.js.map +1 -1
  31. package/dist/components/FormatOptionsDropdown.cjs +2 -18
  32. package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
  33. package/dist/components/FormatOptionsDropdown.d.ts +1 -17
  34. package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
  35. package/dist/components/FormatOptionsDropdown.js +1 -17
  36. package/dist/components/FormatOptionsDropdown.js.map +1 -1
  37. package/dist/components/JsonSchemaForm.cjs +128 -12
  38. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  39. package/dist/components/JsonSchemaForm.d.ts +1 -1
  40. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  41. package/dist/components/JsonSchemaForm.js +131 -15
  42. package/dist/components/JsonSchemaForm.js.map +1 -1
  43. package/dist/components/MultiSelect.cjs +2 -1
  44. package/dist/components/MultiSelect.cjs.map +1 -1
  45. package/dist/components/MultiSelect.d.ts +5 -1
  46. package/dist/components/MultiSelect.d.ts.map +1 -1
  47. package/dist/components/MultiSelect.js +2 -1
  48. package/dist/components/MultiSelect.js.map +1 -1
  49. package/dist/components/SecretKeySelector.cjs +0 -1
  50. package/dist/components/SecretKeySelector.cjs.map +1 -1
  51. package/dist/components/SecretKeySelector.d.ts +0 -2
  52. package/dist/components/SecretKeySelector.d.ts.map +1 -1
  53. package/dist/components/SecretKeySelector.js +1 -2
  54. package/dist/components/SecretKeySelector.js.map +1 -1
  55. package/dist/components/TreePickerField.cjs +137 -0
  56. package/dist/components/TreePickerField.cjs.map +1 -0
  57. package/dist/components/TreePickerField.d.ts +30 -0
  58. package/dist/components/TreePickerField.d.ts.map +1 -0
  59. package/dist/components/TreePickerField.js +137 -0
  60. package/dist/components/TreePickerField.js.map +1 -0
  61. package/dist/components/WorkloadPicker.cjs +6 -81
  62. package/dist/components/WorkloadPicker.cjs.map +1 -1
  63. package/dist/components/WorkloadPicker.d.ts +1 -20
  64. package/dist/components/WorkloadPicker.d.ts.map +1 -1
  65. package/dist/components/WorkloadPicker.js +3 -78
  66. package/dist/components/WorkloadPicker.js.map +1 -1
  67. package/dist/components/button-variants.cjs +30 -0
  68. package/dist/components/button-variants.cjs.map +1 -0
  69. package/dist/components/button-variants.d.ts +5 -0
  70. package/dist/components/button-variants.d.ts.map +1 -0
  71. package/dist/components/button-variants.js +30 -0
  72. package/dist/components/button-variants.js.map +1 -0
  73. package/dist/components/button.cjs +11 -82
  74. package/dist/components/button.cjs.map +1 -1
  75. package/dist/components/button.d.ts +1 -5
  76. package/dist/components/button.d.ts.map +1 -1
  77. package/dist/components/button.js +5 -76
  78. package/dist/components/button.js.map +1 -1
  79. package/dist/components/filter-bar-utils.cjs +37 -0
  80. package/dist/components/filter-bar-utils.cjs.map +1 -0
  81. package/dist/components/filter-bar-utils.d.ts +4 -0
  82. package/dist/components/filter-bar-utils.d.ts.map +1 -0
  83. package/dist/components/filter-bar-utils.js +37 -0
  84. package/dist/components/filter-bar-utils.js.map +1 -0
  85. package/dist/components/format-options.cjs +20 -0
  86. package/dist/components/format-options.cjs.map +1 -0
  87. package/dist/components/format-options.d.ts +18 -0
  88. package/dist/components/format-options.d.ts.map +1 -0
  89. package/dist/components/format-options.js +20 -0
  90. package/dist/components/format-options.js.map +1 -0
  91. package/dist/components/json-schema-form-array.cjs +13 -17
  92. package/dist/components/json-schema-form-array.cjs.map +1 -1
  93. package/dist/components/json-schema-form-array.d.ts +1 -2
  94. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  95. package/dist/components/json-schema-form-array.js +3 -7
  96. package/dist/components/json-schema-form-array.js.map +1 -1
  97. package/dist/components/json-schema-form-fields.cjs +97 -232
  98. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  99. package/dist/components/json-schema-form-fields.d.ts +51 -6
  100. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  101. package/dist/components/json-schema-form-fields.js +89 -224
  102. package/dist/components/json-schema-form-fields.js.map +1 -1
  103. package/dist/components/json-schema-form-object.cjs +149 -0
  104. package/dist/components/json-schema-form-object.cjs.map +1 -0
  105. package/dist/components/json-schema-form-object.d.ts +10 -0
  106. package/dist/components/json-schema-form-object.d.ts.map +1 -0
  107. package/dist/components/json-schema-form-object.js +149 -0
  108. package/dist/components/json-schema-form-object.js.map +1 -0
  109. package/dist/components/json-schema-form-preferences.cjs +41 -0
  110. package/dist/components/json-schema-form-preferences.cjs.map +1 -0
  111. package/dist/components/json-schema-form-preferences.d.ts +10 -0
  112. package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
  113. package/dist/components/json-schema-form-preferences.js +41 -0
  114. package/dist/components/json-schema-form-preferences.js.map +1 -0
  115. package/dist/components/json-schema-form-render.cjs +43 -72
  116. package/dist/components/json-schema-form-render.cjs.map +1 -1
  117. package/dist/components/json-schema-form-render.d.ts +5 -33
  118. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  119. package/dist/components/json-schema-form-render.js +41 -70
  120. package/dist/components/json-schema-form-render.js.map +1 -1
  121. package/dist/components/json-schema-form-resolve.cjs +9 -1
  122. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  123. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  124. package/dist/components/json-schema-form-resolve.js +9 -1
  125. package/dist/components/json-schema-form-resolve.js.map +1 -1
  126. package/dist/components/json-schema-form-types.d.ts +59 -1
  127. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  128. package/dist/components/json-schema-form-utils.cjs +96 -0
  129. package/dist/components/json-schema-form-utils.cjs.map +1 -0
  130. package/dist/components/json-schema-form-utils.d.ts +17 -0
  131. package/dist/components/json-schema-form-utils.d.ts.map +1 -0
  132. package/dist/components/json-schema-form-utils.js +96 -0
  133. package/dist/components/json-schema-form-utils.js.map +1 -0
  134. package/dist/components/loading.cjs +109 -0
  135. package/dist/components/loading.cjs.map +1 -0
  136. package/dist/components/loading.d.ts +29 -0
  137. package/dist/components/loading.d.ts.map +1 -0
  138. package/dist/components/loading.js +109 -0
  139. package/dist/components/loading.js.map +1 -0
  140. package/dist/components/use-form.cjs +27 -0
  141. package/dist/components/use-form.cjs.map +1 -0
  142. package/dist/components/use-form.d.ts +30 -0
  143. package/dist/components/use-form.d.ts.map +1 -0
  144. package/dist/components/use-form.js +27 -0
  145. package/dist/components/use-form.js.map +1 -0
  146. package/dist/components/workload-picker-utils.cjs +88 -0
  147. package/dist/components/workload-picker-utils.cjs.map +1 -0
  148. package/dist/components/workload-picker-utils.d.ts +34 -0
  149. package/dist/components/workload-picker-utils.d.ts.map +1 -0
  150. package/dist/components/workload-picker-utils.js +88 -0
  151. package/dist/components/workload-picker-utils.js.map +1 -0
  152. package/dist/components.cjs +25 -6
  153. package/dist/components.cjs.map +1 -1
  154. package/dist/components.d.ts +14 -4
  155. package/dist/components.d.ts.map +1 -1
  156. package/dist/components.js +24 -5
  157. package/dist/components.js.map +1 -1
  158. package/dist/data/Badge.cjs +11 -91
  159. package/dist/data/Badge.cjs.map +1 -1
  160. package/dist/data/Badge.d.ts +1 -5
  161. package/dist/data/Badge.d.ts.map +1 -1
  162. package/dist/data/Badge.js +11 -91
  163. package/dist/data/Badge.js.map +1 -1
  164. package/dist/data/Clicky.cjs +4 -3
  165. package/dist/data/Clicky.cjs.map +1 -1
  166. package/dist/data/Clicky.d.ts.map +1 -1
  167. package/dist/data/Clicky.js +4 -3
  168. package/dist/data/Clicky.js.map +1 -1
  169. package/dist/data/DataTable.cjs +161 -156
  170. package/dist/data/DataTable.cjs.map +1 -1
  171. package/dist/data/DataTable.d.ts +25 -4
  172. package/dist/data/DataTable.d.ts.map +1 -1
  173. package/dist/data/DataTable.js +140 -135
  174. package/dist/data/DataTable.js.map +1 -1
  175. package/dist/data/FilterPill.cjs +3 -0
  176. package/dist/data/FilterPill.cjs.map +1 -1
  177. package/dist/data/FilterPill.d.ts.map +1 -1
  178. package/dist/data/FilterPill.js +3 -0
  179. package/dist/data/FilterPill.js.map +1 -1
  180. package/dist/data/Icon.cjs +7 -7
  181. package/dist/data/Icon.cjs.map +1 -1
  182. package/dist/data/Icon.js +7 -7
  183. package/dist/data/Icon.js.map +1 -1
  184. package/dist/data/LogDetails.cjs +5 -14
  185. package/dist/data/LogDetails.cjs.map +1 -1
  186. package/dist/data/LogDetails.d.ts +8 -4
  187. package/dist/data/LogDetails.d.ts.map +1 -1
  188. package/dist/data/LogDetails.js +4 -13
  189. package/dist/data/LogDetails.js.map +1 -1
  190. package/dist/data/LogsTable.cjs +6 -165
  191. package/dist/data/LogsTable.cjs.map +1 -1
  192. package/dist/data/LogsTable.d.ts +2 -15
  193. package/dist/data/LogsTable.d.ts.map +1 -1
  194. package/dist/data/LogsTable.js +6 -165
  195. package/dist/data/LogsTable.js.map +1 -1
  196. package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
  197. package/dist/data/TimeseriesPanel.axes.js.map +1 -1
  198. package/dist/data/TreeNode.cjs +13 -7
  199. package/dist/data/TreeNode.cjs.map +1 -1
  200. package/dist/data/TreeNode.d.ts.map +1 -1
  201. package/dist/data/TreeNode.js +13 -7
  202. package/dist/data/TreeNode.js.map +1 -1
  203. package/dist/data/badge-variants.cjs +85 -0
  204. package/dist/data/badge-variants.cjs.map +1 -0
  205. package/dist/data/badge-variants.d.ts +6 -0
  206. package/dist/data/badge-variants.d.ts.map +1 -0
  207. package/dist/data/badge-variants.js +85 -0
  208. package/dist/data/badge-variants.js.map +1 -0
  209. package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
  210. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
  211. package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
  212. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
  213. package/dist/data/cache-browser/CacheBrowser.js +59 -0
  214. package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
  215. package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
  216. package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
  217. package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
  218. package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
  219. package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
  220. package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
  221. package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
  222. package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
  223. package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
  224. package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
  225. package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
  226. package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
  227. package/dist/data/cache-browser/CacheTree.cjs +189 -0
  228. package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
  229. package/dist/data/cache-browser/CacheTree.d.ts +27 -0
  230. package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
  231. package/dist/data/cache-browser/CacheTree.js +189 -0
  232. package/dist/data/cache-browser/CacheTree.js.map +1 -0
  233. package/dist/data/cache-browser/CacheValue.cjs +86 -0
  234. package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
  235. package/dist/data/cache-browser/CacheValue.d.ts +11 -0
  236. package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
  237. package/dist/data/cache-browser/CacheValue.js +86 -0
  238. package/dist/data/cache-browser/CacheValue.js.map +1 -0
  239. package/dist/data/cache-browser/adapter.cjs +52 -0
  240. package/dist/data/cache-browser/adapter.cjs.map +1 -0
  241. package/dist/data/cache-browser/adapter.d.ts +48 -0
  242. package/dist/data/cache-browser/adapter.d.ts.map +1 -0
  243. package/dist/data/cache-browser/adapter.js +52 -0
  244. package/dist/data/cache-browser/adapter.js.map +1 -0
  245. package/dist/data/cache-browser/api.cjs +42 -0
  246. package/dist/data/cache-browser/api.cjs.map +1 -0
  247. package/dist/data/cache-browser/api.d.ts +33 -0
  248. package/dist/data/cache-browser/api.d.ts.map +1 -0
  249. package/dist/data/cache-browser/api.js +42 -0
  250. package/dist/data/cache-browser/api.js.map +1 -0
  251. package/dist/data/cache-browser/index.d.ts +9 -0
  252. package/dist/data/cache-browser/index.d.ts.map +1 -0
  253. package/dist/data/cache-browser/types.cjs +7 -0
  254. package/dist/data/cache-browser/types.cjs.map +1 -0
  255. package/dist/data/cache-browser/types.d.ts +78 -0
  256. package/dist/data/cache-browser/types.d.ts.map +1 -0
  257. package/dist/data/cache-browser/types.js +7 -0
  258. package/dist/data/cache-browser/types.js.map +1 -0
  259. package/dist/data/cells/TagList.cjs +4 -101
  260. package/dist/data/cells/TagList.cjs.map +1 -1
  261. package/dist/data/cells/TagList.d.ts +1 -49
  262. package/dist/data/cells/TagList.d.ts.map +1 -1
  263. package/dist/data/cells/TagList.js +3 -100
  264. package/dist/data/cells/TagList.js.map +1 -1
  265. package/dist/data/cells/Timestamp.cjs +3 -192
  266. package/dist/data/cells/Timestamp.cjs.map +1 -1
  267. package/dist/data/cells/Timestamp.d.ts +1 -50
  268. package/dist/data/cells/Timestamp.d.ts.map +1 -1
  269. package/dist/data/cells/Timestamp.js +2 -191
  270. package/dist/data/cells/Timestamp.js.map +1 -1
  271. package/dist/data/cells/tag-utils.cjs +103 -0
  272. package/dist/data/cells/tag-utils.cjs.map +1 -0
  273. package/dist/data/cells/tag-utils.d.ts +51 -0
  274. package/dist/data/cells/tag-utils.d.ts.map +1 -0
  275. package/dist/data/cells/tag-utils.js +103 -0
  276. package/dist/data/cells/tag-utils.js.map +1 -0
  277. package/dist/data/cells/timestamp-format.cjs +193 -0
  278. package/dist/data/cells/timestamp-format.cjs.map +1 -0
  279. package/dist/data/cells/timestamp-format.d.ts +51 -0
  280. package/dist/data/cells/timestamp-format.d.ts.map +1 -0
  281. package/dist/data/cells/timestamp-format.js +193 -0
  282. package/dist/data/cells/timestamp-format.js.map +1 -0
  283. package/dist/data/chat/Chat.cjs +48 -0
  284. package/dist/data/chat/Chat.cjs.map +1 -0
  285. package/dist/data/chat/Chat.d.ts +26 -0
  286. package/dist/data/chat/Chat.d.ts.map +1 -0
  287. package/dist/data/chat/Chat.fixtures.d.ts +6 -0
  288. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
  289. package/dist/data/chat/Chat.js +48 -0
  290. package/dist/data/chat/Chat.js.map +1 -0
  291. package/dist/data/chat/Conversation.cjs +34 -0
  292. package/dist/data/chat/Conversation.cjs.map +1 -0
  293. package/dist/data/chat/Conversation.d.ts +11 -0
  294. package/dist/data/chat/Conversation.d.ts.map +1 -0
  295. package/dist/data/chat/Conversation.js +34 -0
  296. package/dist/data/chat/Conversation.js.map +1 -0
  297. package/dist/data/chat/Message.cjs +44 -0
  298. package/dist/data/chat/Message.cjs.map +1 -0
  299. package/dist/data/chat/Message.d.ts +10 -0
  300. package/dist/data/chat/Message.d.ts.map +1 -0
  301. package/dist/data/chat/Message.js +44 -0
  302. package/dist/data/chat/Message.js.map +1 -0
  303. package/dist/data/chat/PromptInput.cjs +61 -0
  304. package/dist/data/chat/PromptInput.cjs.map +1 -0
  305. package/dist/data/chat/PromptInput.d.ts +16 -0
  306. package/dist/data/chat/PromptInput.d.ts.map +1 -0
  307. package/dist/data/chat/PromptInput.js +61 -0
  308. package/dist/data/chat/PromptInput.js.map +1 -0
  309. package/dist/data/chat/ToolCall.cjs +92 -0
  310. package/dist/data/chat/ToolCall.cjs.map +1 -0
  311. package/dist/data/chat/ToolCall.d.ts +14 -0
  312. package/dist/data/chat/ToolCall.d.ts.map +1 -0
  313. package/dist/data/chat/ToolCall.js +92 -0
  314. package/dist/data/chat/ToolCall.js.map +1 -0
  315. package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
  316. package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
  317. package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
  318. package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
  319. package/dist/data/chat/clickyOperationsToTools.js +73 -0
  320. package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
  321. package/dist/data/chat/index.d.ts +8 -0
  322. package/dist/data/chat/index.d.ts.map +1 -0
  323. package/dist/data/chat/types.cjs +18 -0
  324. package/dist/data/chat/types.cjs.map +1 -0
  325. package/dist/data/chat/types.d.ts +41 -0
  326. package/dist/data/chat/types.d.ts.map +1 -0
  327. package/dist/data/chat/types.js +18 -0
  328. package/dist/data/chat/types.js.map +1 -0
  329. package/dist/data/data-table-utils.cjs +55 -0
  330. package/dist/data/data-table-utils.cjs.map +1 -0
  331. package/dist/data/data-table-utils.d.ts +24 -0
  332. package/dist/data/data-table-utils.d.ts.map +1 -0
  333. package/dist/data/data-table-utils.js +55 -0
  334. package/dist/data/data-table-utils.js.map +1 -0
  335. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
  336. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
  337. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
  338. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
  339. package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
  340. package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
  341. package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
  342. package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
  343. package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
  344. package/dist/data/diagnostics/GoroutineCard.js +2 -21
  345. package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
  346. package/dist/data/diagnostics/ThreadCard.cjs +3 -38
  347. package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
  348. package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
  349. package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
  350. package/dist/data/diagnostics/ThreadCard.js +2 -37
  351. package/dist/data/diagnostics/ThreadCard.js.map +1 -1
  352. package/dist/data/diagnostics/state-styles.cjs +59 -0
  353. package/dist/data/diagnostics/state-styles.cjs.map +1 -0
  354. package/dist/data/diagnostics/state-styles.d.ts +5 -0
  355. package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
  356. package/dist/data/diagnostics/state-styles.js +59 -0
  357. package/dist/data/diagnostics/state-styles.js.map +1 -0
  358. package/dist/data/logs-normalize.cjs +166 -0
  359. package/dist/data/logs-normalize.cjs.map +1 -0
  360. package/dist/data/logs-normalize.d.ts +16 -0
  361. package/dist/data/logs-normalize.d.ts.map +1 -0
  362. package/dist/data/logs-normalize.js +166 -0
  363. package/dist/data/logs-normalize.js.map +1 -0
  364. package/dist/data/task-status.cjs +19 -19
  365. package/dist/data/task-status.cjs.map +1 -1
  366. package/dist/data/task-status.js +19 -19
  367. package/dist/data/task-status.js.map +1 -1
  368. package/dist/data/version-info.cjs +3 -3
  369. package/dist/data/version-info.js +3 -3
  370. package/dist/data.cjs +43 -18
  371. package/dist/data.cjs.map +1 -1
  372. package/dist/data.d.ts +11 -5
  373. package/dist/data.d.ts.map +1 -1
  374. package/dist/data.js +30 -5
  375. package/dist/data.js.map +1 -1
  376. package/dist/hooks/density-provider.cjs +38 -0
  377. package/dist/hooks/density-provider.cjs.map +1 -0
  378. package/dist/hooks/density-provider.d.ts +20 -0
  379. package/dist/hooks/density-provider.d.ts.map +1 -0
  380. package/dist/hooks/density-provider.js +38 -0
  381. package/dist/hooks/density-provider.js.map +1 -0
  382. package/dist/hooks/theme-provider.cjs +43 -0
  383. package/dist/hooks/theme-provider.cjs.map +1 -0
  384. package/dist/hooks/theme-provider.d.ts +9 -0
  385. package/dist/hooks/theme-provider.d.ts.map +1 -0
  386. package/dist/hooks/theme-provider.js +43 -0
  387. package/dist/hooks/theme-provider.js.map +1 -0
  388. package/dist/hooks/use-density.cjs +8 -37
  389. package/dist/hooks/use-density.cjs.map +1 -1
  390. package/dist/hooks/use-density.d.ts +5 -20
  391. package/dist/hooks/use-density.d.ts.map +1 -1
  392. package/dist/hooks/use-density.js +9 -38
  393. package/dist/hooks/use-density.js.map +1 -1
  394. package/dist/hooks/use-theme.cjs +10 -43
  395. package/dist/hooks/use-theme.cjs.map +1 -1
  396. package/dist/hooks/use-theme.d.ts +6 -9
  397. package/dist/hooks/use-theme.d.ts.map +1 -1
  398. package/dist/hooks/use-theme.js +11 -44
  399. package/dist/hooks/use-theme.js.map +1 -1
  400. package/dist/hooks.cjs +5 -2
  401. package/dist/hooks.cjs.map +1 -1
  402. package/dist/hooks.d.ts +4 -2
  403. package/dist/hooks.d.ts.map +1 -1
  404. package/dist/hooks.js +5 -2
  405. package/dist/hooks.js.map +1 -1
  406. package/dist/icons/changeIconAliases.cjs +13 -13
  407. package/dist/icons/changeIconAliases.cjs.map +1 -1
  408. package/dist/icons/changeIconAliases.d.ts.map +1 -1
  409. package/dist/icons/changeIconAliases.js +13 -13
  410. package/dist/icons/changeIconAliases.js.map +1 -1
  411. package/dist/index.cjs +78 -30
  412. package/dist/index.cjs.map +1 -1
  413. package/dist/index.js +61 -13
  414. package/dist/index.js.map +1 -1
  415. package/dist/overlay/DropdownMenu.cjs +2 -0
  416. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  417. package/dist/overlay/DropdownMenu.d.ts +3 -1
  418. package/dist/overlay/DropdownMenu.d.ts.map +1 -1
  419. package/dist/overlay/DropdownMenu.js +2 -0
  420. package/dist/overlay/DropdownMenu.js.map +1 -1
  421. package/dist/overlay/Modal.cjs +38 -27
  422. package/dist/overlay/Modal.cjs.map +1 -1
  423. package/dist/overlay/Modal.d.ts +8 -2
  424. package/dist/overlay/Modal.d.ts.map +1 -1
  425. package/dist/overlay/Modal.js +38 -27
  426. package/dist/overlay/Modal.js.map +1 -1
  427. package/dist/overlay/modalStack.cjs +35 -0
  428. package/dist/overlay/modalStack.cjs.map +1 -0
  429. package/dist/overlay/modalStack.d.ts +13 -0
  430. package/dist/overlay/modalStack.d.ts.map +1 -0
  431. package/dist/overlay/modalStack.js +35 -0
  432. package/dist/overlay/modalStack.js.map +1 -0
  433. package/dist/rpc/AcceptPicker.cjs +2 -18
  434. package/dist/rpc/AcceptPicker.cjs.map +1 -1
  435. package/dist/rpc/AcceptPicker.d.ts +1 -41
  436. package/dist/rpc/AcceptPicker.d.ts.map +1 -1
  437. package/dist/rpc/AcceptPicker.js +2 -18
  438. package/dist/rpc/AcceptPicker.js.map +1 -1
  439. package/dist/rpc/CommandOutput.cjs +1 -1
  440. package/dist/rpc/CommandOutput.cjs.map +1 -1
  441. package/dist/rpc/CommandOutput.js +1 -1
  442. package/dist/rpc/CommandOutput.js.map +1 -1
  443. package/dist/rpc/EndpointList.cjs +1 -1
  444. package/dist/rpc/EndpointList.cjs.map +1 -1
  445. package/dist/rpc/EndpointList.js +1 -1
  446. package/dist/rpc/EndpointList.js.map +1 -1
  447. package/dist/rpc/FilterForm.cjs +4 -4
  448. package/dist/rpc/FilterForm.cjs.map +1 -1
  449. package/dist/rpc/FilterForm.js +4 -4
  450. package/dist/rpc/FilterForm.js.map +1 -1
  451. package/dist/rpc/OperationCatalog.cjs +38 -60
  452. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  453. package/dist/rpc/OperationCatalog.d.ts +3 -3
  454. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  455. package/dist/rpc/OperationCatalog.js +40 -62
  456. package/dist/rpc/OperationCatalog.js.map +1 -1
  457. package/dist/rpc/OperationCommandPage.cjs.map +1 -1
  458. package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
  459. package/dist/rpc/OperationCommandPage.js.map +1 -1
  460. package/dist/rpc/accept-options.cjs +20 -0
  461. package/dist/rpc/accept-options.cjs.map +1 -0
  462. package/dist/rpc/accept-options.d.ts +42 -0
  463. package/dist/rpc/accept-options.d.ts.map +1 -0
  464. package/dist/rpc/accept-options.js +20 -0
  465. package/dist/rpc/accept-options.js.map +1 -0
  466. package/dist/rpc/classify.cjs +15 -4
  467. package/dist/rpc/classify.cjs.map +1 -1
  468. package/dist/rpc/classify.d.ts.map +1 -1
  469. package/dist/rpc/classify.js +15 -4
  470. package/dist/rpc/classify.js.map +1 -1
  471. package/dist/rpc/clickyMetadata.cjs +13 -3
  472. package/dist/rpc/clickyMetadata.cjs.map +1 -1
  473. package/dist/rpc/clickyMetadata.d.ts +2 -0
  474. package/dist/rpc/clickyMetadata.d.ts.map +1 -1
  475. package/dist/rpc/clickyMetadata.js +14 -4
  476. package/dist/rpc/clickyMetadata.js.map +1 -1
  477. package/dist/rpc/formMetadata.cjs +5 -3
  478. package/dist/rpc/formMetadata.cjs.map +1 -1
  479. package/dist/rpc/formMetadata.d.ts.map +1 -1
  480. package/dist/rpc/formMetadata.js +5 -3
  481. package/dist/rpc/formMetadata.js.map +1 -1
  482. package/dist/rpc.cjs +3 -2
  483. package/dist/rpc.cjs.map +1 -1
  484. package/dist/rpc.d.ts +2 -1
  485. package/dist/rpc.d.ts.map +1 -1
  486. package/dist/rpc.js +2 -1
  487. package/dist/rpc.js.map +1 -1
  488. package/dist/styles.css +1 -1
  489. package/package.json +16 -1
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-array.cjs","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport { defaultPlaceholder } from \"./json-schema-form-fields\";\nimport { controlMinHeightClass, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport {\n moveItem,\n removeIndex,\n renderFieldNodes,\n renderFieldRow,\n seedFromSchema,\n setIndex,\n type RenderContext,\n} from \"./json-schema-form-render\";\nimport type { FieldControl, JsonSchemaProperty } from \"./json-schema-form-types\";\n\n// ArrayControl is a hybrid: plain string-item arrays keep the compact tag UI;\n// anything richer (objects, numbers, enums, nested arrays) renders one recursive\n// control per item with add / remove / reorder.\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n if (isScalarStringItems(field.itemSchema)) {\n return <TagArray field={field} fieldId={fieldId} readOnly={readOnly} size={ctx.size} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one column\n // per item property — a denser alternative to the per-item stacked sub-form.\n if (field.layout === \"table\" && hasObjectItemProperties(field.itemSchema)) {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div className={cn(\"flex flex-col rounded-md border border-input p-2\", fieldInnerGapClass[ctx.size])}>\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n <div className=\"min-w-0\">\n {renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </div>\n {!readOnly && (\n <ItemControls\n onUp={i > 0 ? () => field.onChange(moveItem(items, i, i - 1)) : undefined}\n onDown={i < items.length - 1 ? () => field.onChange(moveItem(items, i, i + 1)) : undefined}\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// hasObjectItemProperties reports whether the array's items are objects with a\n// fixed `properties` set — the precondition for a column-per-property table.\nfunction hasObjectItemProperties(items: JsonSchemaProperty | undefined): boolean {\n return !!items && !!items.properties && Object.keys(items.properties).length > 0;\n}\n\n// TableArray renders an object-item array as a table: a header row of the item's\n// property names and one row per item with value-only controls, plus per-row\n// remove and an add button. Driven by `x-layout: table`.\nfunction TableArray({\n field,\n ctx,\n readOnly,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n}) {\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"object\" };\n const columns = Object.entries(itemSchema.properties ?? {});\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n function cell(item: unknown, rowIndex: number, col: string, prop: JsonSchemaProperty): ReactNode {\n const obj = isPlainObject(item) ? item : {};\n const nodes = renderFieldNodes(\n {\n key: `${field.key}[${rowIndex}].${col}`,\n prop,\n required: false,\n value: obj[col],\n onChange: (next) => field.onChange(setIndex(items, rowIndex, { ...obj, [col]: next })),\n },\n childCtx,\n );\n return nodes?.value ?? null;\n }\n\n return (\n <div className=\"overflow-x-auto rounded-md border border-input\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-input bg-muted/40 text-left\">\n {columns.map(([col, prop]) => (\n <th key={col} className=\"px-2 py-1 text-xs font-medium text-muted-foreground\">\n {typeof prop.title === \"string\" && prop.title ? prop.title : col}\n </th>\n ))}\n {!readOnly && <th className=\"w-10 px-2 py-1\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, i) => (\n <tr key={i} className=\"border-b border-input last:border-b-0 align-top\">\n {columns.map(([col, prop]) => (\n <td key={col} className=\"px-2 py-1\">\n {cell(item, i, col, prop)}\n </td>\n ))}\n {!readOnly && (\n <td className=\"px-2 py-1\">\n <button\n type=\"button\"\n aria-label={`Remove item ${i + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={() => field.onChange(removeIndex(items, i))}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n {!readOnly && (\n <div className=\"p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n}) {\n return (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} up`}\n disabled={!onUp}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onUp}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} down`}\n disabled={!onDown}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onDown}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Remove item ${index + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={onRemove}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </div>\n );\n}\n\n// TagArray is the compact tag editor for plain string-item arrays.\nfunction TagArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const tags = toStringArray(field.value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n field.onChange([...tags, ...next]);\n input.value = \"\";\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget;\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n commit(input.value, input);\n return;\n }\n if (e.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n field.onChange(tags.slice(0, -1));\n }\n }\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {tags.map((tag, i) => (\n <span\n key={`${tag}-${i}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n {!readOnly && (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => field.onChange(tags.filter((_, idx) => idx !== i))}\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </span>\n ))}\n {!readOnly && (\n <input\n id={fieldId}\n data-jsf-input\n className={cn(\"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\", labelSizeClass[size])}\n placeholder={tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(e) => commit(e.currentTarget.value, e.currentTarget)}\n />\n )}\n </div>\n );\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String);\n return [];\n}\n"],"names":["isScalarStringItems","jsx","jsxs","cn","fieldInnerGapClass","renderFieldRow","setIndex","moveItem","removeIndex","Button","seedFromSchema","Icon","UiAdd","renderFieldNodes","UiTrash","UiChevronUp","UiChevronDown","controlMinHeightClass","UiClose","labelSizeClass","defaultPlaceholder"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema-form-array.cjs","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport { controlMinHeightClass, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport {\n defaultPlaceholder,\n isPlainObject,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, JsonSchemaProperty, RenderContext } from \"./json-schema-form-types\";\n\n// ArrayControl is a hybrid: plain string-item arrays keep the compact tag UI;\n// anything richer (objects, numbers, enums, nested arrays) renders one recursive\n// control per item with add / remove / reorder. Recursion goes through\n// ctx.render so this module never imports the renderer (no import cycle).\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n if (isScalarStringItems(field.itemSchema)) {\n return <TagArray field={field} fieldId={fieldId} readOnly={readOnly} size={ctx.size} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one column\n // per item property — a denser alternative to the per-item stacked sub-form.\n if (field.layout === \"table\" && hasObjectItemProperties(field.itemSchema)) {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div className={cn(\"flex flex-col rounded-md border border-input p-2\", fieldInnerGapClass[ctx.size])}>\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n <div className=\"min-w-0\">\n {ctx.render.renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </div>\n {!readOnly && (\n <ItemControls\n onUp={i > 0 ? () => field.onChange(moveItem(items, i, i - 1)) : undefined}\n onDown={i < items.length - 1 ? () => field.onChange(moveItem(items, i, i + 1)) : undefined}\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// hasObjectItemProperties reports whether the array's items are objects with a\n// fixed `properties` set — the precondition for a column-per-property table.\nfunction hasObjectItemProperties(items: JsonSchemaProperty | undefined): boolean {\n return !!items && !!items.properties && Object.keys(items.properties).length > 0;\n}\n\n// TableArray renders an object-item array as a table: a header row of the item's\n// property names and one row per item with value-only controls, plus per-row\n// remove and an add button. Driven by `x-layout: table`.\nfunction TableArray({\n field,\n ctx,\n readOnly,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n}) {\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"object\" };\n const columns = Object.entries(itemSchema.properties ?? {});\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n function cell(item: unknown, rowIndex: number, col: string, prop: JsonSchemaProperty): ReactNode {\n const obj = isPlainObject(item) ? item : {};\n const nodes = ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${rowIndex}].${col}`,\n prop,\n required: false,\n value: obj[col],\n onChange: (next) => field.onChange(setIndex(items, rowIndex, { ...obj, [col]: next })),\n },\n childCtx,\n );\n return nodes?.value ?? null;\n }\n\n return (\n <div className=\"overflow-x-auto rounded-md border border-input\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-input bg-muted/40 text-left\">\n {columns.map(([col, prop]) => (\n <th key={col} className=\"px-2 py-1 text-xs font-medium text-muted-foreground\">\n {typeof prop.title === \"string\" && prop.title ? prop.title : col}\n </th>\n ))}\n {!readOnly && <th className=\"w-10 px-2 py-1\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, i) => (\n <tr key={i} className=\"border-b border-input last:border-b-0 align-top\">\n {columns.map(([col, prop]) => (\n <td key={col} className=\"px-2 py-1\">\n {cell(item, i, col, prop)}\n </td>\n ))}\n {!readOnly && (\n <td className=\"px-2 py-1\">\n <button\n type=\"button\"\n aria-label={`Remove item ${i + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={() => field.onChange(removeIndex(items, i))}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n {!readOnly && (\n <div className=\"p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n}) {\n return (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} up`}\n disabled={!onUp}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onUp}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} down`}\n disabled={!onDown}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onDown}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Remove item ${index + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={onRemove}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </div>\n );\n}\n\n// TagArray is the compact tag editor for plain string-item arrays.\nfunction TagArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const tags = toStringArray(field.value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n field.onChange([...tags, ...next]);\n input.value = \"\";\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget;\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n commit(input.value, input);\n return;\n }\n if (e.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n field.onChange(tags.slice(0, -1));\n }\n }\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {tags.map((tag, i) => (\n <span\n key={`${tag}-${i}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n {!readOnly && (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => field.onChange(tags.filter((_, idx) => idx !== i))}\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </span>\n ))}\n {!readOnly && (\n <input\n id={fieldId}\n data-jsf-input\n className={cn(\"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\", labelSizeClass[size])}\n placeholder={tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(e) => commit(e.currentTarget.value, e.currentTarget)}\n />\n )}\n </div>\n );\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String);\n return [];\n}\n"],"names":["isScalarStringItems","jsx","jsxs","cn","fieldInnerGapClass","setIndex","moveItem","removeIndex","Button","seedFromSchema","Icon","UiAdd","isPlainObject","UiTrash","UiChevronUp","UiChevronDown","controlMinHeightClass","UiClose","labelSizeClass","defaultPlaceholder"],"mappings":"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"}
@@ -1,5 +1,4 @@
1
- import { RenderContext } from './json-schema-form-render';
2
- import { FieldControl } from './json-schema-form-types';
1
+ import { FieldControl, RenderContext } from './json-schema-form-types';
3
2
  export declare function ArrayControl({ field, fieldId, ctx, }: {
4
3
  field: FieldControl;
5
4
  fieldId: string;
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-array.tsx"],"names":[],"mappings":"AAQA,OAAO,EAOL,KAAK,aAAa,EACnB,MAAM,2BAA2B,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAsB,MAAM,0BAA0B,CAAC;AAKjF,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,aAAa,CAAC;CACpB,2CA0DA"}
1
+ {"version":3,"file":"json-schema-form-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-array.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,YAAY,EAAsB,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAMhG,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,aAAa,CAAC;CACpB,2CA0DA"}
@@ -3,10 +3,9 @@ import "react";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { Icon } from "../data/Icon.js";
5
5
  import { Button } from "./button.js";
6
- import { defaultPlaceholder } from "./json-schema-form-fields.js";
7
6
  import { fieldInnerGapClass, labelSizeClass, controlMinHeightClass } from "./json-schema-form-size.js";
8
7
  import { isScalarStringItems } from "./json-schema-form-resolve.js";
9
- import { renderFieldRow, setIndex, removeIndex, moveItem, seedFromSchema, renderFieldNodes } from "./json-schema-form-render.js";
8
+ import { setIndex, removeIndex, moveItem, seedFromSchema, defaultPlaceholder, isPlainObject } from "./json-schema-form-utils.js";
10
9
  import { UiAdd } from "../icons/components/UiAdd.js";
11
10
  import { UiClose } from "../icons/components/UiClose.js";
12
11
  import { UiTrash } from "../icons/components/UiTrash.js";
@@ -29,7 +28,7 @@ function ArrayControl({
29
28
  const childCtx = { ...ctx, readOnly, depth: ctx.depth + 1 };
30
29
  return /* @__PURE__ */ jsxs("div", { className: cn("flex flex-col rounded-md border border-input p-2", fieldInnerGapClass[ctx.size]), children: [
31
30
  items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[1fr_auto] items-start gap-2", children: [
32
- /* @__PURE__ */ jsx("div", { className: "min-w-0", children: renderFieldRow(
31
+ /* @__PURE__ */ jsx("div", { className: "min-w-0", children: ctx.render.renderFieldRow(
33
32
  {
34
33
  key: `${field.key}[${i}]`,
35
34
  prop: itemSchema,
@@ -80,7 +79,7 @@ function TableArray({
80
79
  const childCtx = { ...ctx, readOnly, depth: ctx.depth + 1 };
81
80
  function cell(item, rowIndex, col, prop) {
82
81
  const obj = isPlainObject(item) ? item : {};
83
- const nodes = renderFieldNodes(
82
+ const nodes = ctx.render.renderFieldNodes(
84
83
  {
85
84
  key: `${field.key}[${rowIndex}].${col}`,
86
85
  prop,
@@ -128,9 +127,6 @@ function TableArray({
128
127
  ) })
129
128
  ] });
130
129
  }
131
- function isPlainObject(value) {
132
- return typeof value === "object" && value !== null && !Array.isArray(value);
133
- }
134
130
  function ItemControls({
135
131
  onUp,
136
132
  onDown,
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-array.js","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport { defaultPlaceholder } from \"./json-schema-form-fields\";\nimport { controlMinHeightClass, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport {\n moveItem,\n removeIndex,\n renderFieldNodes,\n renderFieldRow,\n seedFromSchema,\n setIndex,\n type RenderContext,\n} from \"./json-schema-form-render\";\nimport type { FieldControl, JsonSchemaProperty } from \"./json-schema-form-types\";\n\n// ArrayControl is a hybrid: plain string-item arrays keep the compact tag UI;\n// anything richer (objects, numbers, enums, nested arrays) renders one recursive\n// control per item with add / remove / reorder.\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n if (isScalarStringItems(field.itemSchema)) {\n return <TagArray field={field} fieldId={fieldId} readOnly={readOnly} size={ctx.size} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one column\n // per item property — a denser alternative to the per-item stacked sub-form.\n if (field.layout === \"table\" && hasObjectItemProperties(field.itemSchema)) {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div className={cn(\"flex flex-col rounded-md border border-input p-2\", fieldInnerGapClass[ctx.size])}>\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n <div className=\"min-w-0\">\n {renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </div>\n {!readOnly && (\n <ItemControls\n onUp={i > 0 ? () => field.onChange(moveItem(items, i, i - 1)) : undefined}\n onDown={i < items.length - 1 ? () => field.onChange(moveItem(items, i, i + 1)) : undefined}\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// hasObjectItemProperties reports whether the array's items are objects with a\n// fixed `properties` set — the precondition for a column-per-property table.\nfunction hasObjectItemProperties(items: JsonSchemaProperty | undefined): boolean {\n return !!items && !!items.properties && Object.keys(items.properties).length > 0;\n}\n\n// TableArray renders an object-item array as a table: a header row of the item's\n// property names and one row per item with value-only controls, plus per-row\n// remove and an add button. Driven by `x-layout: table`.\nfunction TableArray({\n field,\n ctx,\n readOnly,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n}) {\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"object\" };\n const columns = Object.entries(itemSchema.properties ?? {});\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n function cell(item: unknown, rowIndex: number, col: string, prop: JsonSchemaProperty): ReactNode {\n const obj = isPlainObject(item) ? item : {};\n const nodes = renderFieldNodes(\n {\n key: `${field.key}[${rowIndex}].${col}`,\n prop,\n required: false,\n value: obj[col],\n onChange: (next) => field.onChange(setIndex(items, rowIndex, { ...obj, [col]: next })),\n },\n childCtx,\n );\n return nodes?.value ?? null;\n }\n\n return (\n <div className=\"overflow-x-auto rounded-md border border-input\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-input bg-muted/40 text-left\">\n {columns.map(([col, prop]) => (\n <th key={col} className=\"px-2 py-1 text-xs font-medium text-muted-foreground\">\n {typeof prop.title === \"string\" && prop.title ? prop.title : col}\n </th>\n ))}\n {!readOnly && <th className=\"w-10 px-2 py-1\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, i) => (\n <tr key={i} className=\"border-b border-input last:border-b-0 align-top\">\n {columns.map(([col, prop]) => (\n <td key={col} className=\"px-2 py-1\">\n {cell(item, i, col, prop)}\n </td>\n ))}\n {!readOnly && (\n <td className=\"px-2 py-1\">\n <button\n type=\"button\"\n aria-label={`Remove item ${i + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={() => field.onChange(removeIndex(items, i))}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n {!readOnly && (\n <div className=\"p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n}) {\n return (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} up`}\n disabled={!onUp}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onUp}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} down`}\n disabled={!onDown}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onDown}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Remove item ${index + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={onRemove}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </div>\n );\n}\n\n// TagArray is the compact tag editor for plain string-item arrays.\nfunction TagArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const tags = toStringArray(field.value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n field.onChange([...tags, ...next]);\n input.value = \"\";\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget;\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n commit(input.value, input);\n return;\n }\n if (e.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n field.onChange(tags.slice(0, -1));\n }\n }\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {tags.map((tag, i) => (\n <span\n key={`${tag}-${i}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n {!readOnly && (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => field.onChange(tags.filter((_, idx) => idx !== i))}\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </span>\n ))}\n {!readOnly && (\n <input\n id={fieldId}\n data-jsf-input\n className={cn(\"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\", labelSizeClass[size])}\n placeholder={tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(e) => commit(e.currentTarget.value, e.currentTarget)}\n />\n )}\n </div>\n );\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String);\n return [];\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-schema-form-array.js","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport { controlMinHeightClass, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport {\n defaultPlaceholder,\n isPlainObject,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, JsonSchemaProperty, RenderContext } from \"./json-schema-form-types\";\n\n// ArrayControl is a hybrid: plain string-item arrays keep the compact tag UI;\n// anything richer (objects, numbers, enums, nested arrays) renders one recursive\n// control per item with add / remove / reorder. Recursion goes through\n// ctx.render so this module never imports the renderer (no import cycle).\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n if (isScalarStringItems(field.itemSchema)) {\n return <TagArray field={field} fieldId={fieldId} readOnly={readOnly} size={ctx.size} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one column\n // per item property — a denser alternative to the per-item stacked sub-form.\n if (field.layout === \"table\" && hasObjectItemProperties(field.itemSchema)) {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div className={cn(\"flex flex-col rounded-md border border-input p-2\", fieldInnerGapClass[ctx.size])}>\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n <div className=\"min-w-0\">\n {ctx.render.renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </div>\n {!readOnly && (\n <ItemControls\n onUp={i > 0 ? () => field.onChange(moveItem(items, i, i - 1)) : undefined}\n onDown={i < items.length - 1 ? () => field.onChange(moveItem(items, i, i + 1)) : undefined}\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// hasObjectItemProperties reports whether the array's items are objects with a\n// fixed `properties` set — the precondition for a column-per-property table.\nfunction hasObjectItemProperties(items: JsonSchemaProperty | undefined): boolean {\n return !!items && !!items.properties && Object.keys(items.properties).length > 0;\n}\n\n// TableArray renders an object-item array as a table: a header row of the item's\n// property names and one row per item with value-only controls, plus per-row\n// remove and an add button. Driven by `x-layout: table`.\nfunction TableArray({\n field,\n ctx,\n readOnly,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n}) {\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"object\" };\n const columns = Object.entries(itemSchema.properties ?? {});\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n function cell(item: unknown, rowIndex: number, col: string, prop: JsonSchemaProperty): ReactNode {\n const obj = isPlainObject(item) ? item : {};\n const nodes = ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${rowIndex}].${col}`,\n prop,\n required: false,\n value: obj[col],\n onChange: (next) => field.onChange(setIndex(items, rowIndex, { ...obj, [col]: next })),\n },\n childCtx,\n );\n return nodes?.value ?? null;\n }\n\n return (\n <div className=\"overflow-x-auto rounded-md border border-input\">\n <table className=\"w-full text-sm\">\n <thead>\n <tr className=\"border-b border-input bg-muted/40 text-left\">\n {columns.map(([col, prop]) => (\n <th key={col} className=\"px-2 py-1 text-xs font-medium text-muted-foreground\">\n {typeof prop.title === \"string\" && prop.title ? prop.title : col}\n </th>\n ))}\n {!readOnly && <th className=\"w-10 px-2 py-1\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, i) => (\n <tr key={i} className=\"border-b border-input last:border-b-0 align-top\">\n {columns.map(([col, prop]) => (\n <td key={col} className=\"px-2 py-1\">\n {cell(item, i, col, prop)}\n </td>\n ))}\n {!readOnly && (\n <td className=\"px-2 py-1\">\n <button\n type=\"button\"\n aria-label={`Remove item ${i + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={() => field.onChange(removeIndex(items, i))}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n {!readOnly && (\n <div className=\"p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"gap-1.5\"\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n}) {\n return (\n <div className=\"flex items-center gap-1\">\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} up`}\n disabled={!onUp}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onUp}\n >\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move item ${index + 1} down`}\n disabled={!onDown}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\"\n onClick={onDown}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Remove item ${index + 1}`}\n className=\"inline-flex h-8 w-8 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\"\n onClick={onRemove}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </div>\n );\n}\n\n// TagArray is the compact tag editor for plain string-item arrays.\nfunction TagArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const tags = toStringArray(field.value);\n\n function commit(raw: string, input: HTMLInputElement) {\n const next = raw\n .split(\",\")\n .map((p) => p.trim())\n .filter(Boolean);\n if (next.length === 0) return;\n field.onChange([...tags, ...next]);\n input.value = \"\";\n }\n\n function handleKeyDown(e: KeyboardEvent<HTMLInputElement>) {\n const input = e.currentTarget;\n if (e.key === \"Enter\" || e.key === \",\") {\n e.preventDefault();\n commit(input.value, input);\n return;\n }\n if (e.key === \"Backspace\" && input.value === \"\" && tags.length > 0) {\n field.onChange(tags.slice(0, -1));\n }\n }\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {tags.map((tag, i) => (\n <span\n key={`${tag}-${i}`}\n className=\"inline-flex h-6 max-w-full items-center gap-1 rounded-md bg-muted px-2 text-xs\"\n >\n <span className=\"truncate\">{tag}</span>\n {!readOnly && (\n <button\n type=\"button\"\n className=\"text-muted-foreground hover:text-foreground\"\n aria-label={`Remove ${tag}`}\n onClick={() => field.onChange(tags.filter((_, idx) => idx !== i))}\n >\n <Icon icon={UiClose} />\n </button>\n )}\n </span>\n ))}\n {!readOnly && (\n <input\n id={fieldId}\n data-jsf-input\n className={cn(\"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\", labelSizeClass[size])}\n placeholder={tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"}\n onKeyDown={handleKeyDown}\n onBlur={(e) => commit(e.currentTarget.value, e.currentTarget)}\n />\n )}\n </div>\n );\n}\n\nfunction toStringArray(value: unknown): string[] {\n if (Array.isArray(value)) return value.map(String);\n return [];\n}\n"],"names":[],"mappings":"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"}