@flanksource/clicky-ui 0.3.19 → 0.3.21

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 (450) hide show
  1. package/dist/components/ErrorWrapper.cjs +1 -1
  2. package/dist/components/ErrorWrapper.cjs.map +1 -1
  3. package/dist/components/ErrorWrapper.js +1 -1
  4. package/dist/components/ErrorWrapper.js.map +1 -1
  5. package/dist/components/UnitStepControls.cjs +55 -0
  6. package/dist/components/UnitStepControls.cjs.map +1 -0
  7. package/dist/components/UnitStepControls.d.ts +10 -0
  8. package/dist/components/UnitStepControls.d.ts.map +1 -0
  9. package/dist/components/UnitStepControls.js +55 -0
  10. package/dist/components/UnitStepControls.js.map +1 -0
  11. package/dist/components/json-schema-form-accordion-array.cjs +5 -73
  12. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  13. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  14. package/dist/components/json-schema-form-accordion-array.js +3 -71
  15. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  16. package/dist/components/json-schema-form-array.cjs +6 -1
  17. package/dist/components/json-schema-form-array.cjs.map +1 -1
  18. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  19. package/dist/components/json-schema-form-array.js +6 -1
  20. package/dist/components/json-schema-form-array.js.map +1 -1
  21. package/dist/components/json-schema-form-cards-array.cjs +96 -0
  22. package/dist/components/json-schema-form-cards-array.cjs.map +1 -0
  23. package/dist/components/json-schema-form-cards-array.d.ts +7 -0
  24. package/dist/components/json-schema-form-cards-array.d.ts.map +1 -0
  25. package/dist/components/json-schema-form-cards-array.js +96 -0
  26. package/dist/components/json-schema-form-cards-array.js.map +1 -0
  27. package/dist/components/json-schema-form-item-row.cjs +81 -0
  28. package/dist/components/json-schema-form-item-row.cjs.map +1 -0
  29. package/dist/components/json-schema-form-item-row.d.ts +19 -0
  30. package/dist/components/json-schema-form-item-row.d.ts.map +1 -0
  31. package/dist/components/json-schema-form-item-row.js +81 -0
  32. package/dist/components/json-schema-form-item-row.js.map +1 -0
  33. package/dist/components/json-schema-form-render.cjs +2 -2
  34. package/dist/components/json-schema-form-render.cjs.map +1 -1
  35. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  36. package/dist/components/json-schema-form-render.js +2 -2
  37. package/dist/components/json-schema-form-render.js.map +1 -1
  38. package/dist/components/json-schema-form-resolve.cjs +1 -1
  39. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  40. package/dist/components/json-schema-form-resolve.js +1 -1
  41. package/dist/components/json-schema-form-resolve.js.map +1 -1
  42. package/dist/components/json-schema-form-tone.cjs +12 -0
  43. package/dist/components/json-schema-form-tone.cjs.map +1 -1
  44. package/dist/components/json-schema-form-tone.js +12 -0
  45. package/dist/components/json-schema-form-tone.js.map +1 -1
  46. package/dist/components/json-schema-form-types.d.ts +1 -1
  47. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  48. package/dist/components/unit-form-extension.cjs +126 -0
  49. package/dist/components/unit-form-extension.cjs.map +1 -0
  50. package/dist/components/unit-form-extension.d.ts +8 -0
  51. package/dist/components/unit-form-extension.d.ts.map +1 -0
  52. package/dist/components/unit-form-extension.js +126 -0
  53. package/dist/components/unit-form-extension.js.map +1 -0
  54. package/dist/components.cjs +4 -0
  55. package/dist/components.cjs.map +1 -1
  56. package/dist/components.d.ts +1 -0
  57. package/dist/components.d.ts.map +1 -1
  58. package/dist/components.js +4 -0
  59. package/dist/components.js.map +1 -1
  60. package/dist/data/diagnostics/ErrorDetails.cjs +61 -8
  61. package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
  62. package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
  63. package/dist/data/diagnostics/ErrorDetails.js +61 -8
  64. package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
  65. package/dist/data/diagnostics/error-diagnostics.cjs +10 -4
  66. package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
  67. package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
  68. package/dist/data/diagnostics/error-diagnostics.js +10 -4
  69. package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
  70. package/dist/data/query-browser/QueryBrowser.cjs +12 -6
  71. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  72. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  73. package/dist/data/query-browser/QueryBrowser.js +12 -6
  74. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  75. package/dist/data/query-browser/QueryBrowser.types.cjs +2 -1
  76. package/dist/data/query-browser/QueryBrowser.types.cjs.map +1 -1
  77. package/dist/data/query-browser/QueryBrowser.types.d.ts +16 -14
  78. package/dist/data/query-browser/QueryBrowser.types.d.ts.map +1 -1
  79. package/dist/data/query-browser/QueryBrowser.types.js +2 -1
  80. package/dist/data/query-browser/QueryBrowser.types.js.map +1 -1
  81. package/dist/data/version-info.cjs +3 -3
  82. package/dist/data/version-info.js +3 -3
  83. package/dist/index.cjs +4 -0
  84. package/dist/index.cjs.map +1 -1
  85. package/dist/index.js +4 -0
  86. package/dist/index.js.map +1 -1
  87. package/dist/lib/string.cjs +8 -0
  88. package/dist/lib/string.cjs.map +1 -1
  89. package/dist/lib/string.d.ts +1 -0
  90. package/dist/lib/string.d.ts.map +1 -1
  91. package/dist/lib/string.js +8 -0
  92. package/dist/lib/string.js.map +1 -1
  93. package/dist/profiles/catalogTree.cjs +133 -0
  94. package/dist/profiles/catalogTree.cjs.map +1 -0
  95. package/dist/profiles/catalogTree.d.ts +11 -0
  96. package/dist/profiles/catalogTree.d.ts.map +1 -0
  97. package/dist/profiles/catalogTree.js +133 -0
  98. package/dist/profiles/catalogTree.js.map +1 -0
  99. package/dist/profiles/connectionBrowserModel.cjs +185 -0
  100. package/dist/profiles/connectionBrowserModel.cjs.map +1 -0
  101. package/dist/profiles/connectionBrowserModel.d.ts +169 -0
  102. package/dist/profiles/connectionBrowserModel.d.ts.map +1 -0
  103. package/dist/profiles/connectionBrowserModel.js +185 -0
  104. package/dist/profiles/connectionBrowserModel.js.map +1 -0
  105. package/dist/profiles/connectionQueryWorkspace.cjs +185 -0
  106. package/dist/profiles/connectionQueryWorkspace.cjs.map +1 -0
  107. package/dist/profiles/connectionQueryWorkspace.d.ts +63 -0
  108. package/dist/profiles/connectionQueryWorkspace.d.ts.map +1 -0
  109. package/dist/profiles/connectionQueryWorkspace.js +185 -0
  110. package/dist/profiles/connectionQueryWorkspace.js.map +1 -0
  111. package/dist/profiles/connectionQueryWorkspaceModel.cjs +28 -0
  112. package/dist/profiles/connectionQueryWorkspaceModel.cjs.map +1 -0
  113. package/dist/profiles/connectionQueryWorkspaceModel.d.ts +38 -0
  114. package/dist/profiles/connectionQueryWorkspaceModel.d.ts.map +1 -0
  115. package/dist/profiles/connectionQueryWorkspaceModel.js +28 -0
  116. package/dist/profiles/connectionQueryWorkspaceModel.js.map +1 -0
  117. package/dist/profiles/esFieldValues.cjs +64 -0
  118. package/dist/profiles/esFieldValues.cjs.map +1 -0
  119. package/dist/profiles/esFieldValues.d.ts +48 -0
  120. package/dist/profiles/esFieldValues.d.ts.map +1 -0
  121. package/dist/profiles/esFieldValues.js +64 -0
  122. package/dist/profiles/esFieldValues.js.map +1 -0
  123. package/dist/profiles/esParamMappingModel.cjs +301 -0
  124. package/dist/profiles/esParamMappingModel.cjs.map +1 -0
  125. package/dist/profiles/esParamMappingModel.d.ts +37 -0
  126. package/dist/profiles/esParamMappingModel.d.ts.map +1 -0
  127. package/dist/profiles/esParamMappingModel.js +301 -0
  128. package/dist/profiles/esParamMappingModel.js.map +1 -0
  129. package/dist/profiles/esParamMappingPill.cjs +24 -0
  130. package/dist/profiles/esParamMappingPill.cjs.map +1 -0
  131. package/dist/profiles/esParamMappingPill.d.ts +13 -0
  132. package/dist/profiles/esParamMappingPill.d.ts.map +1 -0
  133. package/dist/profiles/esParamMappingPill.js +24 -0
  134. package/dist/profiles/esParamMappingPill.js.map +1 -0
  135. package/dist/profiles/esParamOperandExtension.cjs +75 -0
  136. package/dist/profiles/esParamOperandExtension.cjs.map +1 -0
  137. package/dist/profiles/esParamOperandExtension.d.ts +11 -0
  138. package/dist/profiles/esParamOperandExtension.d.ts.map +1 -0
  139. package/dist/profiles/esParamOperandExtension.js +75 -0
  140. package/dist/profiles/esParamOperandExtension.js.map +1 -0
  141. package/dist/profiles/esQueryBuilder.cjs +205 -0
  142. package/dist/profiles/esQueryBuilder.cjs.map +1 -0
  143. package/dist/profiles/esQueryBuilder.d.ts +35 -0
  144. package/dist/profiles/esQueryBuilder.d.ts.map +1 -0
  145. package/dist/profiles/esQueryBuilder.js +205 -0
  146. package/dist/profiles/esQueryBuilder.js.map +1 -0
  147. package/dist/profiles/esQueryBuilderExtension.cjs +23 -0
  148. package/dist/profiles/esQueryBuilderExtension.cjs.map +1 -0
  149. package/dist/profiles/esQueryBuilderExtension.d.ts +5 -0
  150. package/dist/profiles/esQueryBuilderExtension.d.ts.map +1 -0
  151. package/dist/profiles/esQueryBuilderExtension.js +23 -0
  152. package/dist/profiles/esQueryBuilderExtension.js.map +1 -0
  153. package/dist/profiles/esQueryBuilderForm.cjs +26 -0
  154. package/dist/profiles/esQueryBuilderForm.cjs.map +1 -0
  155. package/dist/profiles/esQueryBuilderForm.d.ts +18 -0
  156. package/dist/profiles/esQueryBuilderForm.d.ts.map +1 -0
  157. package/dist/profiles/esQueryBuilderForm.js +26 -0
  158. package/dist/profiles/esQueryBuilderForm.js.map +1 -0
  159. package/dist/profiles/esQueryBuilderModel.cjs +131 -0
  160. package/dist/profiles/esQueryBuilderModel.cjs.map +1 -0
  161. package/dist/profiles/esQueryBuilderModel.d.ts +108 -0
  162. package/dist/profiles/esQueryBuilderModel.d.ts.map +1 -0
  163. package/dist/profiles/esQueryBuilderModel.js +131 -0
  164. package/dist/profiles/esQueryBuilderModel.js.map +1 -0
  165. package/dist/profiles/esQueryClauseGroup.cjs +144 -0
  166. package/dist/profiles/esQueryClauseGroup.cjs.map +1 -0
  167. package/dist/profiles/esQueryClauseGroup.d.ts +10 -0
  168. package/dist/profiles/esQueryClauseGroup.d.ts.map +1 -0
  169. package/dist/profiles/esQueryClauseGroup.js +144 -0
  170. package/dist/profiles/esQueryClauseGroup.js.map +1 -0
  171. package/dist/profiles/esQueryCompile.cjs +47 -0
  172. package/dist/profiles/esQueryCompile.cjs.map +1 -0
  173. package/dist/profiles/esQueryCompile.d.ts +39 -0
  174. package/dist/profiles/esQueryCompile.d.ts.map +1 -0
  175. package/dist/profiles/esQueryCompile.js +47 -0
  176. package/dist/profiles/esQueryCompile.js.map +1 -0
  177. package/dist/profiles/esQueryConditionRow.cjs +168 -0
  178. package/dist/profiles/esQueryConditionRow.cjs.map +1 -0
  179. package/dist/profiles/esQueryConditionRow.d.ts +37 -0
  180. package/dist/profiles/esQueryConditionRow.d.ts.map +1 -0
  181. package/dist/profiles/esQueryConditionRow.js +168 -0
  182. package/dist/profiles/esQueryConditionRow.js.map +1 -0
  183. package/dist/profiles/esQueryGroupModel.cjs +12 -0
  184. package/dist/profiles/esQueryGroupModel.cjs.map +1 -0
  185. package/dist/profiles/esQueryGroupModel.d.ts +9 -0
  186. package/dist/profiles/esQueryGroupModel.d.ts.map +1 -0
  187. package/dist/profiles/esQueryGroupModel.js +12 -0
  188. package/dist/profiles/esQueryGroupModel.js.map +1 -0
  189. package/dist/profiles/esQueryOccur.cjs +16 -0
  190. package/dist/profiles/esQueryOccur.cjs.map +1 -0
  191. package/dist/profiles/esQueryOccur.d.ts +11 -0
  192. package/dist/profiles/esQueryOccur.d.ts.map +1 -0
  193. package/dist/profiles/esQueryOccur.js +16 -0
  194. package/dist/profiles/esQueryOccur.js.map +1 -0
  195. package/dist/profiles/esQueryOperandEditors.cjs +279 -0
  196. package/dist/profiles/esQueryOperandEditors.cjs.map +1 -0
  197. package/dist/profiles/esQueryOperandEditors.d.ts +24 -0
  198. package/dist/profiles/esQueryOperandEditors.d.ts.map +1 -0
  199. package/dist/profiles/esQueryOperandEditors.js +279 -0
  200. package/dist/profiles/esQueryOperandEditors.js.map +1 -0
  201. package/dist/profiles/esQueryOperandModel.cjs +28 -0
  202. package/dist/profiles/esQueryOperandModel.cjs.map +1 -0
  203. package/dist/profiles/esQueryOperandModel.d.ts +17 -0
  204. package/dist/profiles/esQueryOperandModel.d.ts.map +1 -0
  205. package/dist/profiles/esQueryOperandModel.js +28 -0
  206. package/dist/profiles/esQueryOperandModel.js.map +1 -0
  207. package/dist/profiles/esQueryOperators.cjs +165 -0
  208. package/dist/profiles/esQueryOperators.cjs.map +1 -0
  209. package/dist/profiles/esQueryOperators.d.ts +83 -0
  210. package/dist/profiles/esQueryOperators.d.ts.map +1 -0
  211. package/dist/profiles/esQueryOperators.js +165 -0
  212. package/dist/profiles/esQueryOperators.js.map +1 -0
  213. package/dist/profiles/esQueryOutputEditor.cjs +138 -0
  214. package/dist/profiles/esQueryOutputEditor.cjs.map +1 -0
  215. package/dist/profiles/esQueryOutputEditor.d.ts +7 -0
  216. package/dist/profiles/esQueryOutputEditor.d.ts.map +1 -0
  217. package/dist/profiles/esQueryOutputEditor.js +138 -0
  218. package/dist/profiles/esQueryOutputEditor.js.map +1 -0
  219. package/dist/profiles/esQueryOutputModel.cjs +16 -0
  220. package/dist/profiles/esQueryOutputModel.cjs.map +1 -0
  221. package/dist/profiles/esQueryOutputModel.d.ts +14 -0
  222. package/dist/profiles/esQueryOutputModel.d.ts.map +1 -0
  223. package/dist/profiles/esQueryOutputModel.js +16 -0
  224. package/dist/profiles/esQueryOutputModel.js.map +1 -0
  225. package/dist/profiles/esQueryPreview.cjs +30 -0
  226. package/dist/profiles/esQueryPreview.cjs.map +1 -0
  227. package/dist/profiles/esQueryPreview.d.ts +6 -0
  228. package/dist/profiles/esQueryPreview.d.ts.map +1 -0
  229. package/dist/profiles/esQueryPreview.js +30 -0
  230. package/dist/profiles/esQueryPreview.js.map +1 -0
  231. package/dist/profiles/esQuerySortEditor.cjs +143 -0
  232. package/dist/profiles/esQuerySortEditor.cjs.map +1 -0
  233. package/dist/profiles/esQuerySortEditor.d.ts +9 -0
  234. package/dist/profiles/esQuerySortEditor.d.ts.map +1 -0
  235. package/dist/profiles/esQuerySortEditor.js +143 -0
  236. package/dist/profiles/esQuerySortEditor.js.map +1 -0
  237. package/dist/profiles/esQuerySortModel.cjs +13 -0
  238. package/dist/profiles/esQuerySortModel.cjs.map +1 -0
  239. package/dist/profiles/esQuerySortModel.d.ts +4 -0
  240. package/dist/profiles/esQuerySortModel.d.ts.map +1 -0
  241. package/dist/profiles/esQuerySortModel.js +13 -0
  242. package/dist/profiles/esQuerySortModel.js.map +1 -0
  243. package/dist/profiles/esValueCombobox.cjs +86 -0
  244. package/dist/profiles/esValueCombobox.cjs.map +1 -0
  245. package/dist/profiles/esValueCombobox.d.ts +15 -0
  246. package/dist/profiles/esValueCombobox.d.ts.map +1 -0
  247. package/dist/profiles/esValueCombobox.js +86 -0
  248. package/dist/profiles/esValueCombobox.js.map +1 -0
  249. package/dist/profiles/jsonPathSample.cjs +75 -0
  250. package/dist/profiles/jsonPathSample.cjs.map +1 -0
  251. package/dist/profiles/jsonPathSample.d.ts +27 -0
  252. package/dist/profiles/jsonPathSample.d.ts.map +1 -0
  253. package/dist/profiles/jsonPathSample.js +75 -0
  254. package/dist/profiles/jsonPathSample.js.map +1 -0
  255. package/dist/profiles/jsonPathSampleRow.cjs +14 -0
  256. package/dist/profiles/jsonPathSampleRow.cjs.map +1 -0
  257. package/dist/profiles/jsonPathSampleRow.d.ts +6 -0
  258. package/dist/profiles/jsonPathSampleRow.d.ts.map +1 -0
  259. package/dist/profiles/jsonPathSampleRow.js +14 -0
  260. package/dist/profiles/jsonPathSampleRow.js.map +1 -0
  261. package/dist/profiles/profileApi.cjs +37 -0
  262. package/dist/profiles/profileApi.cjs.map +1 -0
  263. package/dist/profiles/profileApi.d.ts +32 -0
  264. package/dist/profiles/profileApi.d.ts.map +1 -0
  265. package/dist/profiles/profileApi.js +37 -0
  266. package/dist/profiles/profileApi.js.map +1 -0
  267. package/dist/profiles/profileBuilder.cjs +65 -0
  268. package/dist/profiles/profileBuilder.cjs.map +1 -0
  269. package/dist/profiles/profileBuilder.d.ts +11 -0
  270. package/dist/profiles/profileBuilder.d.ts.map +1 -0
  271. package/dist/profiles/profileBuilder.js +65 -0
  272. package/dist/profiles/profileBuilder.js.map +1 -0
  273. package/dist/profiles/profileBuilderExtension.cjs +25 -0
  274. package/dist/profiles/profileBuilderExtension.cjs.map +1 -0
  275. package/dist/profiles/profileBuilderExtension.d.ts +5 -0
  276. package/dist/profiles/profileBuilderExtension.d.ts.map +1 -0
  277. package/dist/profiles/profileBuilderExtension.js +25 -0
  278. package/dist/profiles/profileBuilderExtension.js.map +1 -0
  279. package/dist/profiles/profileBuilderWorkspace.cjs +368 -0
  280. package/dist/profiles/profileBuilderWorkspace.cjs.map +1 -0
  281. package/dist/profiles/profileBuilderWorkspace.d.ts +21 -0
  282. package/dist/profiles/profileBuilderWorkspace.d.ts.map +1 -0
  283. package/dist/profiles/profileBuilderWorkspace.js +368 -0
  284. package/dist/profiles/profileBuilderWorkspace.js.map +1 -0
  285. package/dist/profiles/profileColumnModel.cjs +23 -0
  286. package/dist/profiles/profileColumnModel.cjs.map +1 -0
  287. package/dist/profiles/profileColumnModel.d.ts +8 -0
  288. package/dist/profiles/profileColumnModel.d.ts.map +1 -0
  289. package/dist/profiles/profileColumnModel.js +23 -0
  290. package/dist/profiles/profileColumnModel.js.map +1 -0
  291. package/dist/profiles/profileColumnPicker.cjs +68 -0
  292. package/dist/profiles/profileColumnPicker.cjs.map +1 -0
  293. package/dist/profiles/profileColumnPicker.d.ts +11 -0
  294. package/dist/profiles/profileColumnPicker.d.ts.map +1 -0
  295. package/dist/profiles/profileColumnPicker.js +68 -0
  296. package/dist/profiles/profileColumnPicker.js.map +1 -0
  297. package/dist/profiles/profileEditor.cjs +386 -0
  298. package/dist/profiles/profileEditor.cjs.map +1 -0
  299. package/dist/profiles/profileEditor.d.ts +19 -0
  300. package/dist/profiles/profileEditor.d.ts.map +1 -0
  301. package/dist/profiles/profileEditor.js +386 -0
  302. package/dist/profiles/profileEditor.js.map +1 -0
  303. package/dist/profiles/profileEditorModel.cjs +181 -0
  304. package/dist/profiles/profileEditorModel.cjs.map +1 -0
  305. package/dist/profiles/profileEditorModel.d.ts +74 -0
  306. package/dist/profiles/profileEditorModel.d.ts.map +1 -0
  307. package/dist/profiles/profileEditorModel.js +181 -0
  308. package/dist/profiles/profileEditorModel.js.map +1 -0
  309. package/dist/profiles/profileEditorPreview.cjs +38 -0
  310. package/dist/profiles/profileEditorPreview.cjs.map +1 -0
  311. package/dist/profiles/profileEditorPreview.d.ts +12 -0
  312. package/dist/profiles/profileEditorPreview.d.ts.map +1 -0
  313. package/dist/profiles/profileEditorPreview.js +38 -0
  314. package/dist/profiles/profileEditorPreview.js.map +1 -0
  315. package/dist/profiles/profileEditorRail.cjs +46 -0
  316. package/dist/profiles/profileEditorRail.cjs.map +1 -0
  317. package/dist/profiles/profileEditorRail.d.ts +8 -0
  318. package/dist/profiles/profileEditorRail.d.ts.map +1 -0
  319. package/dist/profiles/profileEditorRail.js +46 -0
  320. package/dist/profiles/profileEditorRail.js.map +1 -0
  321. package/dist/profiles/profileEditorRaw.cjs +118 -0
  322. package/dist/profiles/profileEditorRaw.cjs.map +1 -0
  323. package/dist/profiles/profileEditorRaw.d.ts +7 -0
  324. package/dist/profiles/profileEditorRaw.d.ts.map +1 -0
  325. package/dist/profiles/profileEditorRaw.js +118 -0
  326. package/dist/profiles/profileEditorRaw.js.map +1 -0
  327. package/dist/profiles/profileEditorRoutes.cjs +7 -0
  328. package/dist/profiles/profileEditorRoutes.cjs.map +1 -0
  329. package/dist/profiles/profileEditorRoutes.d.ts +2 -0
  330. package/dist/profiles/profileEditorRoutes.d.ts.map +1 -0
  331. package/dist/profiles/profileEditorRoutes.js +7 -0
  332. package/dist/profiles/profileEditorRoutes.js.map +1 -0
  333. package/dist/profiles/profileEditorSections.cjs +213 -0
  334. package/dist/profiles/profileEditorSections.cjs.map +1 -0
  335. package/dist/profiles/profileEditorSections.d.ts +23 -0
  336. package/dist/profiles/profileEditorSections.d.ts.map +1 -0
  337. package/dist/profiles/profileEditorSections.js +213 -0
  338. package/dist/profiles/profileEditorSections.js.map +1 -0
  339. package/dist/profiles/profileFieldEditor.cjs +200 -0
  340. package/dist/profiles/profileFieldEditor.cjs.map +1 -0
  341. package/dist/profiles/profileFieldEditor.d.ts +34 -0
  342. package/dist/profiles/profileFieldEditor.d.ts.map +1 -0
  343. package/dist/profiles/profileFieldEditor.js +200 -0
  344. package/dist/profiles/profileFieldEditor.js.map +1 -0
  345. package/dist/profiles/profileFieldGrid.cjs +250 -0
  346. package/dist/profiles/profileFieldGrid.cjs.map +1 -0
  347. package/dist/profiles/profileFieldGrid.d.ts +20 -0
  348. package/dist/profiles/profileFieldGrid.d.ts.map +1 -0
  349. package/dist/profiles/profileFieldGrid.js +250 -0
  350. package/dist/profiles/profileFieldGrid.js.map +1 -0
  351. package/dist/profiles/profileFieldManager.cjs +103 -0
  352. package/dist/profiles/profileFieldManager.cjs.map +1 -0
  353. package/dist/profiles/profileFieldManager.d.ts +9 -0
  354. package/dist/profiles/profileFieldManager.d.ts.map +1 -0
  355. package/dist/profiles/profileFieldManager.js +103 -0
  356. package/dist/profiles/profileFieldManager.js.map +1 -0
  357. package/dist/profiles/profileFieldState.cjs +136 -0
  358. package/dist/profiles/profileFieldState.cjs.map +1 -0
  359. package/dist/profiles/profileFieldState.d.ts +41 -0
  360. package/dist/profiles/profileFieldState.d.ts.map +1 -0
  361. package/dist/profiles/profileFieldState.js +136 -0
  362. package/dist/profiles/profileFieldState.js.map +1 -0
  363. package/dist/profiles/profileFieldTypes.cjs +17 -0
  364. package/dist/profiles/profileFieldTypes.cjs.map +1 -0
  365. package/dist/profiles/profileFieldTypes.d.ts +8 -0
  366. package/dist/profiles/profileFieldTypes.d.ts.map +1 -0
  367. package/dist/profiles/profileFieldTypes.js +17 -0
  368. package/dist/profiles/profileFieldTypes.js.map +1 -0
  369. package/dist/profiles/profileParamModel.cjs +78 -0
  370. package/dist/profiles/profileParamModel.cjs.map +1 -0
  371. package/dist/profiles/profileParamModel.d.ts +3 -0
  372. package/dist/profiles/profileParamModel.d.ts.map +1 -0
  373. package/dist/profiles/profileParamModel.js +78 -0
  374. package/dist/profiles/profileParamModel.js.map +1 -0
  375. package/dist/profiles/profileSamplePayload.cjs +15 -0
  376. package/dist/profiles/profileSamplePayload.cjs.map +1 -0
  377. package/dist/profiles/profileSamplePayload.d.ts +13 -0
  378. package/dist/profiles/profileSamplePayload.d.ts.map +1 -0
  379. package/dist/profiles/profileSamplePayload.js +15 -0
  380. package/dist/profiles/profileSamplePayload.js.map +1 -0
  381. package/dist/profiles/profileWizard.cjs +257 -0
  382. package/dist/profiles/profileWizard.cjs.map +1 -0
  383. package/dist/profiles/profileWizard.d.ts +12 -0
  384. package/dist/profiles/profileWizard.d.ts.map +1 -0
  385. package/dist/profiles/profileWizard.js +257 -0
  386. package/dist/profiles/profileWizard.js.map +1 -0
  387. package/dist/profiles/profileWizardHelp.cjs +10 -0
  388. package/dist/profiles/profileWizardHelp.cjs.map +1 -0
  389. package/dist/profiles/profileWizardHelp.d.ts +13 -0
  390. package/dist/profiles/profileWizardHelp.d.ts.map +1 -0
  391. package/dist/profiles/profileWizardHelp.js +10 -0
  392. package/dist/profiles/profileWizardHelp.js.map +1 -0
  393. package/dist/profiles/profileWizardModel.cjs +198 -0
  394. package/dist/profiles/profileWizardModel.cjs.map +1 -0
  395. package/dist/profiles/profileWizardModel.d.ts +255 -0
  396. package/dist/profiles/profileWizardModel.d.ts.map +1 -0
  397. package/dist/profiles/profileWizardModel.js +198 -0
  398. package/dist/profiles/profileWizardModel.js.map +1 -0
  399. package/dist/profiles/profileWizardQueryStep.cjs +215 -0
  400. package/dist/profiles/profileWizardQueryStep.cjs.map +1 -0
  401. package/dist/profiles/profileWizardQueryStep.d.ts +18 -0
  402. package/dist/profiles/profileWizardQueryStep.d.ts.map +1 -0
  403. package/dist/profiles/profileWizardQueryStep.js +215 -0
  404. package/dist/profiles/profileWizardQueryStep.js.map +1 -0
  405. package/dist/profiles/profileWizardSteps.cjs +214 -0
  406. package/dist/profiles/profileWizardSteps.cjs.map +1 -0
  407. package/dist/profiles/profileWizardSteps.d.ts +35 -0
  408. package/dist/profiles/profileWizardSteps.d.ts.map +1 -0
  409. package/dist/profiles/profileWizardSteps.js +214 -0
  410. package/dist/profiles/profileWizardSteps.js.map +1 -0
  411. package/dist/profiles/profileYaml.cjs +19 -0
  412. package/dist/profiles/profileYaml.cjs.map +1 -0
  413. package/dist/profiles/profileYaml.d.ts +4 -0
  414. package/dist/profiles/profileYaml.d.ts.map +1 -0
  415. package/dist/profiles/profileYaml.js +19 -0
  416. package/dist/profiles/profileYaml.js.map +1 -0
  417. package/dist/profiles/prometheusResults.cjs +60 -0
  418. package/dist/profiles/prometheusResults.cjs.map +1 -0
  419. package/dist/profiles/prometheusResults.d.ts +7 -0
  420. package/dist/profiles/prometheusResults.d.ts.map +1 -0
  421. package/dist/profiles/prometheusResults.js +60 -0
  422. package/dist/profiles/prometheusResults.js.map +1 -0
  423. package/dist/profiles/queryRowLimits.cjs +82 -0
  424. package/dist/profiles/queryRowLimits.cjs.map +1 -0
  425. package/dist/profiles/queryRowLimits.d.ts +9 -0
  426. package/dist/profiles/queryRowLimits.d.ts.map +1 -0
  427. package/dist/profiles/queryRowLimits.js +82 -0
  428. package/dist/profiles/queryRowLimits.js.map +1 -0
  429. package/dist/profiles/queryRowLimitsModel.cjs +10 -0
  430. package/dist/profiles/queryRowLimitsModel.cjs.map +1 -0
  431. package/dist/profiles/queryRowLimitsModel.d.ts +9 -0
  432. package/dist/profiles/queryRowLimitsModel.d.ts.map +1 -0
  433. package/dist/profiles/queryRowLimitsModel.js +10 -0
  434. package/dist/profiles/queryRowLimitsModel.js.map +1 -0
  435. package/dist/profiles/queryTargetPicker.cjs +42 -0
  436. package/dist/profiles/queryTargetPicker.cjs.map +1 -0
  437. package/dist/profiles/queryTargetPicker.d.ts +8 -0
  438. package/dist/profiles/queryTargetPicker.d.ts.map +1 -0
  439. package/dist/profiles/queryTargetPicker.js +42 -0
  440. package/dist/profiles/queryTargetPicker.js.map +1 -0
  441. package/dist/profiles/testSchema.d.ts +3 -0
  442. package/dist/profiles/testSchema.d.ts.map +1 -0
  443. package/dist/profiles.cjs +223 -0
  444. package/dist/profiles.cjs.map +1 -0
  445. package/dist/profiles.d.ts +68 -0
  446. package/dist/profiles.d.ts.map +1 -0
  447. package/dist/profiles.js +223 -0
  448. package/dist/profiles.js.map +1 -0
  449. package/dist/styles.css +1 -1
  450. package/package.json +6 -1
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-accordion-array.js","sources":["../../src/components/json-schema-form-accordion-array.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon, LabelIcon } from \"../data/Icon\";\nimport {\n UiAdd,\n UiAsterisk,\n UiChevronDown,\n UiChevronRight,\n UiChevronUp,\n UiCopy,\n UiTrash,\n} from \"../icons\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n addItemLabel,\n emptyItemsCopy,\n itemCountLabel,\n itemSummaryFor,\n noItemsLabel,\n resolveItemSpec,\n} from \"./json-schema-form-item-summary\";\nimport { controlHeightClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport { TONE_GLYPH_CLASS } from \"./json-schema-form-tone\";\nimport {\n duplicateIndex,\n fieldInputId,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type {\n ArrayItemSummary,\n FieldControl,\n RenderContext,\n} from \"./json-schema-form-types\";\n\n// AccordionArray renders an object-item array as a list of one-line summary\n// rows, expanding one at a time into the item's own sub-form. It exists because\n// a ten-property item stacked in full costs ~700px of screen each, and a list of\n// them says nothing about which item is which.\n//\n// \"Add\" is the list's own last row rather than a button beside it: the\n// affordance sits exactly where the next item will appear, and at zero items\n// that same row IS the empty state — one control, no separate screen.\nexport function AccordionArray({\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 spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);\n const emptyCopy = emptyItemsCopy(spec, field.schema);\n // The array's help mode governs its whole subtree. Without this the fields\n // inside an expanded row keep the form-level default, so an accordion that\n // resolved to \"hover\" would still stack a two-line paragraph under every\n // control — the exact height the summary rows exist to reclaim.\n const childCtx: RenderContext = {\n ...ctx,\n readOnly,\n depth: ctx.depth + 1,\n ...(field.helpDisplay\n ? { layout: { ...ctx.layout, help: field.helpDisplay } }\n : {}),\n };\n\n // Which row is open is transient view state, like the form's field filter —\n // it is deliberately local and never persisted. The INDEX is the key, not the\n // item: every keystroke replaces the item object (setIndex returns a fresh\n // one), so any identity-based map would die on the first character typed.\n // That makes it the mutators' job to keep this pointing at the same row.\n const [expanded, setExpanded] = useState<number | null>(null);\n const rowRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const addRef = useRef<HTMLButtonElement | null>(null);\n const pendingFocus = useRef<{ kind: \"panel\" | \"row\" | \"add\"; index: number } | null>(null);\n\n useEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n if (pending.kind === \"add\") {\n addRef.current?.focus();\n return;\n }\n const row = rowRefs.current[pending.index];\n if (pending.kind === \"row\") {\n row?.focus();\n return;\n }\n // Land in the new item's first editable control, so adding an item leaves\n // the caret where the author is about to type.\n const panel = document.getElementById(panelId(pending.index));\n const input = panel?.querySelector<HTMLElement>(\"[data-jsf-input]\");\n (input ?? row)?.focus();\n });\n\n function panelId(index: number): string {\n return `${fieldInputId(appendInstancePath(ctx.instancePath, index), ctx.idPrefix)}-panel`;\n }\n function headerId(index: number): string {\n return `${fieldInputId(appendInstancePath(ctx.instancePath, index), ctx.idPrefix)}-header`;\n }\n\n function commit(next: unknown[]) {\n field.onChange(next);\n }\n\n function add() {\n pendingFocus.current = { kind: \"panel\", index: items.length };\n setExpanded(items.length);\n commit([...items, seedFromSchema(itemSchema)]);\n }\n\n function remove(index: number) {\n setExpanded((open) => (open === index ? null : open !== null && open > index ? open - 1 : open));\n pendingFocus.current =\n items.length === 1 ? { kind: \"add\", index: 0 } : { kind: \"row\", index: Math.max(index - 1, 0) };\n commit(removeIndex(items, index));\n }\n\n function duplicate(index: number) {\n setExpanded((open) => (open !== null && open > index ? open + 1 : open));\n pendingFocus.current = { kind: \"row\", index: index + 1 };\n commit(duplicateIndex(items, index));\n }\n\n function move(index: number, to: number) {\n // Follow the item, not the slot — otherwise moving an open row silently\n // expands whichever row took its place.\n setExpanded((open) => (open === index ? to : open === to ? index : open));\n pendingFocus.current = { kind: \"row\", index: to };\n commit(moveItem(items, index, to));\n }\n\n // Roving focus across the headers, with the add row as the final stop.\n function handleKeyDown(e: KeyboardEvent<HTMLButtonElement>, index: number) {\n const stops = rowRefs.current.length;\n const focusAt = (i: number) => {\n e.preventDefault();\n (i >= stops ? addRef.current : rowRefs.current[i])?.focus();\n };\n if (e.key === \"ArrowDown\") focusAt(Math.min(index + 1, stops));\n else if (e.key === \"ArrowUp\" && index > 0) focusAt(index - 1);\n else if (e.key === \"Home\") focusAt(0);\n else if (e.key === \"End\") focusAt(stops);\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <p className={cn(\"text-muted-foreground\", labelSizeClass[ctx.size])}>\n {items.length === 0 ? noItemsLabel(spec) : itemCountLabel(spec, items.length)}\n </p>\n <div className=\"divide-y divide-border rounded-lg border border-border\">\n {items.map((item, i) => {\n const open = expanded === i;\n const summary =\n field.itemSummary?.({ item, index: i }) ??\n itemSummaryFor({ item, index: i, spec, itemSchema });\n return (\n <div key={i} className=\"group\">\n {/* The row is a plain element, NOT a button: the actions beside it\n are buttons, and nesting interactive content is invalid DOM\n with undefined click targeting. Only the disclosure toggles. */}\n <div\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2 hover:bg-accent/40\",\n open && \"bg-accent/30\",\n )}\n >\n <button\n type=\"button\"\n id={headerId(i)}\n aria-expanded={open}\n aria-controls={panelId(i)}\n ref={(el) => {\n rowRefs.current[i] = el;\n }}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onClick={() => setExpanded(open ? null : i)}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon\n icon={open ? UiChevronDown : UiChevronRight}\n className=\"shrink-0 text-sm text-muted-foreground\"\n />\n <ItemGlyph glyph={summary.glyph} />\n <span className=\"shrink-0 text-sm font-medium\">{summary.title}</span>\n <ItemBadge badge={summary.badge} />\n {summary.flagged && <RequiredMark />}\n {summary.summary && (\n <code className=\"truncate font-mono text-xs text-muted-foreground\">\n {summary.summary}\n </code>\n )}\n </button>\n {!readOnly && (\n <ItemRowActions\n index={i}\n title={summary.title}\n size={ctx.size}\n {...(i > 0 ? { onUp: () => move(i, i - 1) } : {})}\n {...(i < items.length - 1 ? { onDown: () => move(i, i + 1) } : {})}\n onDuplicate={() => duplicate(i)}\n onRemove={() => remove(i)}\n />\n )}\n </div>\n {open && (\n <div\n id={panelId(i)}\n role=\"region\"\n aria-labelledby={headerId(i)}\n className=\"border-t border-border bg-muted/20 p-3\"\n >\n {/* Recurse through the shared pipeline so consumer pre/post\n extensions still apply to the item and its properties. */}\n {ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => commit(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n )?.value ?? null}\n </div>\n )}\n </div>\n );\n })}\n {!readOnly && (\n <AddItemRow\n buttonRef={addRef}\n label={addItemLabel(spec)}\n empty={items.length === 0}\n onAdd={add}\n onKeyDown={(e) => handleKeyDown(e, items.length)}\n {...(emptyCopy ? { copy: emptyCopy } : {})}\n />\n )}\n </div>\n </div>\n );\n}\n\n// AddItemRow is the list's own final row. At zero items it grows to carry the\n// schema's explanation of what an item is — so the empty state is the same\n// control the author will use, not a separate screen they have to leave.\nfunction AddItemRow({\n label,\n copy,\n empty,\n onAdd,\n onKeyDown,\n buttonRef,\n}: {\n label: string;\n copy?: string;\n empty: boolean;\n onAdd: () => void;\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\n buttonRef: MutableRefObject<HTMLButtonElement | null>;\n}) {\n return (\n <button\n type=\"button\"\n ref={(el) => {\n buttonRef.current = el;\n }}\n onClick={onAdd}\n onKeyDown={onKeyDown}\n className={cn(\n \"group/add flex w-full items-center gap-2 px-3 py-2 text-left text-muted-foreground hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n empty && \"items-start py-5\",\n )}\n >\n {/* Holds the chevron column, so this row lines up with the ones above it. */}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-sm opacity-0\" />\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md border border-dashed border-border text-foreground/60 group-hover/add:border-primary group-hover/add:text-primary\">\n <Icon icon={UiAdd} className=\"text-[13px]\" />\n </span>\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n {copy && (\n <span className={cn(\"text-xs\", empty ? \"max-w-xl leading-snug\" : \"truncate\")}>{copy}</span>\n )}\n </span>\n </button>\n );\n}\n\nfunction ItemGlyph({ glyph }: { glyph?: ArrayItemSummary[\"glyph\"] }) {\n if (!glyph) return null;\n return (\n <span\n title={glyph.label}\n className={cn(\n \"inline-flex size-6 shrink-0 items-center justify-center rounded-md ring-1 ring-inset\",\n TONE_GLYPH_CLASS[glyph.tone],\n )}\n >\n {glyph.icon != null && <LabelIcon icon={glyph.icon} className=\"text-[13px]\" />}\n </span>\n );\n}\n\nfunction ItemBadge({ badge }: { badge?: ArrayItemSummary[\"badge\"] }) {\n if (!badge) return null;\n return (\n <span className=\"inline-flex shrink-0 items-center gap-1 rounded-full border border-border px-2 py-0.5 text-[11px] text-muted-foreground\">\n {badge.icon != null && <LabelIcon icon={badge.icon} className=\"text-[13px]\" />}\n {badge.label}\n </span>\n );\n}\n\nfunction RequiredMark() {\n return (\n <span title=\"Required\" className=\"inline-flex shrink-0 items-center text-destructive\">\n <Icon icon={UiAsterisk} className=\"text-[11px]\" />\n </span>\n );\n}\n\nfunction ItemRowActions({\n index,\n title,\n size,\n onUp,\n onDown,\n onDuplicate,\n onRemove,\n}: {\n index: number;\n title: string;\n size: FormSize;\n onUp?: () => void;\n onDown?: () => void;\n onDuplicate: () => void;\n onRemove: () => void;\n}) {\n // Hidden until the row is hovered or something inside it takes focus, so a\n // long list is not a wall of permanently dim icons — but keyboard users see\n // them the moment they arrive.\n const action = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\n return (\n <div className=\"ml-auto flex shrink-0 items-center gap-0.5 opacity-0 transition-opacity focus-within:opacity-100 group-hover:opacity-100\">\n <button type=\"button\" aria-label={`Move ${title} up`} disabled={!onUp} className={action} onClick={onUp}>\n <Icon icon={UiChevronUp} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Move ${title} down`}\n disabled={!onDown}\n className={action}\n onClick={onDown}\n >\n <Icon icon={UiChevronDown} className=\"text-sm\" />\n </button>\n <button type=\"button\" aria-label={`Duplicate ${title}`} className={action} onClick={onDuplicate}>\n <Icon icon={UiCopy} className=\"text-sm\" />\n </button>\n <button\n type=\"button\"\n aria-label={`Remove ${title}`}\n className={cn(action, \"hover:bg-destructive/10 hover:text-destructive\")}\n onClick={onRemove}\n data-item-index={index}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </div>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAmDO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAA;AACzD,QAAM,aAAa,MAAM,cAAc,EAAE,MAAM,SAAA;AAC/C,QAAM,OAAO,MAAM,YAAY,gBAAgB,MAAM,QAAQ,UAAU;AACvE,QAAM,YAAY,eAAe,MAAM,MAAM,MAAM;AAKnD,QAAM,WAA0B;AAAA,IAC9B,GAAG;AAAA,IACH;AAAA,IACA,OAAO,IAAI,QAAQ;AAAA,IACnB,GAAI,MAAM,cACN,EAAE,QAAQ,EAAE,GAAG,IAAI,QAAQ,MAAM,MAAM,YAAA,EAAY,IACnD,CAAA;AAAA,EAAC;AAQP,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwB,IAAI;AAC5D,QAAM,UAAU,OAAwC,EAAE;AAC1D,QAAM,SAAS,OAAiC,IAAI;AACpD,QAAM,eAAe,OAAgE,IAAI;AAEzF,YAAU,MAAM;;AACd,UAAM,UAAU,aAAa;AAC7B,QAAI,CAAC,QAAS;AACd,iBAAa,UAAU;AACvB,QAAI,QAAQ,SAAS,OAAO;AAC1B,mBAAO,YAAP,mBAAgB;AAChB;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,QAAQ,QAAQ,KAAK;AACzC,QAAI,QAAQ,SAAS,OAAO;AAC1B,iCAAK;AACL;AAAA,IACF;AAGA,UAAM,QAAQ,SAAS,eAAe,QAAQ,QAAQ,KAAK,CAAC;AAC5D,UAAM,QAAQ,+BAAO,cAA2B;AAChD,KAAC,cAAS,QAAT,mBAAe;AAAA,EAClB,CAAC;AAED,WAAS,QAAQ,OAAuB;AACtC,WAAO,GAAG,aAAa,mBAAmB,IAAI,cAAc,KAAK,GAAG,IAAI,QAAQ,CAAC;AAAA,EACnF;AACA,WAAS,SAAS,OAAuB;AACvC,WAAO,GAAG,aAAa,mBAAmB,IAAI,cAAc,KAAK,GAAG,IAAI,QAAQ,CAAC;AAAA,EACnF;AAEA,WAAS,OAAO,MAAiB;AAC/B,UAAM,SAAS,IAAI;AAAA,EACrB;AAEA,WAAS,MAAM;AACb,iBAAa,UAAU,EAAE,MAAM,SAAS,OAAO,MAAM,OAAA;AACrD,gBAAY,MAAM,MAAM;AACxB,WAAO,CAAC,GAAG,OAAO,eAAe,UAAU,CAAC,CAAC;AAAA,EAC/C;AAEA,WAAS,OAAO,OAAe;AAC7B,gBAAY,CAAC,SAAU,SAAS,QAAQ,OAAO,SAAS,QAAQ,OAAO,QAAQ,OAAO,IAAI,IAAK;AAC/F,iBAAa,UACX,MAAM,WAAW,IAAI,EAAE,MAAM,OAAO,OAAO,EAAA,IAAM,EAAE,MAAM,OAAO,OAAO,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAA;AAC9F,WAAO,YAAY,OAAO,KAAK,CAAC;AAAA,EAClC;AAEA,WAAS,UAAU,OAAe;AAChC,gBAAY,CAAC,SAAU,SAAS,QAAQ,OAAO,QAAQ,OAAO,IAAI,IAAK;AACvE,iBAAa,UAAU,EAAE,MAAM,OAAO,OAAO,QAAQ,EAAA;AACrD,WAAO,eAAe,OAAO,KAAK,CAAC;AAAA,EACrC;AAEA,WAAS,KAAK,OAAe,IAAY;AAGvC,gBAAY,CAAC,SAAU,SAAS,QAAQ,KAAK,SAAS,KAAK,QAAQ,IAAK;AACxE,iBAAa,UAAU,EAAE,MAAM,OAAO,OAAO,GAAA;AAC7C,WAAO,SAAS,OAAO,OAAO,EAAE,CAAC;AAAA,EACnC;AAGA,WAAS,cAAc,GAAqC,OAAe;AACzE,UAAM,QAAQ,QAAQ,QAAQ;AAC9B,UAAM,UAAU,CAAC,MAAc;;AAC7B,QAAE,eAAA;AACF,OAAC,UAAK,QAAQ,OAAO,UAAU,QAAQ,QAAQ,CAAC,MAA/C,mBAAmD;AAAA,IACtD;AACA,QAAI,EAAE,QAAQ,YAAa,SAAQ,KAAK,IAAI,QAAQ,GAAG,KAAK,CAAC;AAAA,aACpD,EAAE,QAAQ,aAAa,QAAQ,EAAG,SAAQ,QAAQ,CAAC;AAAA,aACnD,EAAE,QAAQ,OAAQ,SAAQ,CAAC;AAAA,aAC3B,EAAE,QAAQ,MAAO,SAAQ,KAAK;AAAA,EACzC;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,oBAAC,OAAE,WAAW,GAAG,yBAAyB,eAAe,IAAI,IAAI,CAAC,GAC/D,gBAAM,WAAW,IAAI,aAAa,IAAI,IAAI,eAAe,MAAM,MAAM,MAAM,GAC9E;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,0DACZ,UAAA;AAAA,MAAA,MAAM,IAAI,CAAC,MAAM,MAAM;;AACtB,cAAM,OAAO,aAAa;AAC1B,cAAM,YACJ,WAAM,gBAAN,+BAAoB,EAAE,MAAM,OAAO,EAAA,OACnC,eAAe,EAAE,MAAM,OAAO,GAAG,MAAM,YAAY;AACrD,eACE,qBAAC,OAAA,EAAY,WAAU,SAIrB,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cAAA;AAAA,cAGV,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,IAAI,SAAS,CAAC;AAAA,oBACd,iBAAe;AAAA,oBACf,iBAAe,QAAQ,CAAC;AAAA,oBACxB,KAAK,CAAC,OAAO;AACX,8BAAQ,QAAQ,CAAC,IAAI;AAAA,oBACvB;AAAA,oBACA,WAAW,CAAC,MAAM,cAAc,GAAG,CAAC;AAAA,oBACpC,SAAS,MAAM,YAAY,OAAO,OAAO,CAAC;AAAA,oBAC1C,WAAU;AAAA,oBAEV,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAM,OAAO,gBAAgB;AAAA,0BAC7B,WAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEZ,oBAAC,WAAA,EAAU,OAAO,QAAQ,MAAA,CAAO;AAAA,sBACjC,oBAAC,QAAA,EAAK,WAAU,gCAAgC,kBAAQ,OAAM;AAAA,sBAC9D,oBAAC,WAAA,EAAU,OAAO,QAAQ,MAAA,CAAO;AAAA,sBAChC,QAAQ,WAAW,oBAAC,cAAA,CAAA,CAAa;AAAA,sBACjC,QAAQ,WACP,oBAAC,UAAK,WAAU,oDACb,kBAAQ,QAAA,CACX;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGH,CAAC,YACA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,oBACP,OAAO,QAAQ;AAAA,oBACf,MAAM,IAAI;AAAA,oBACT,GAAI,IAAI,IAAI,EAAE,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,EAAA,IAAM,CAAA;AAAA,oBAC7C,GAAI,IAAI,MAAM,SAAS,IAAI,EAAE,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,EAAA,IAAM,CAAA;AAAA,oBAC/D,aAAa,MAAM,UAAU,CAAC;AAAA,oBAC9B,UAAU,MAAM,OAAO,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC1B;AAAA,YAAA;AAAA,UAAA;AAAA,UAGH,QACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI,QAAQ,CAAC;AAAA,cACb,MAAK;AAAA,cACL,mBAAiB,SAAS,CAAC;AAAA,cAC3B,WAAU;AAAA,cAIT,qBAAI,OAAO;AAAA,gBACV;AAAA,kBACE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;AAAA,kBACtB,MAAM;AAAA,kBACN,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,UAAU,CAAC,SAAS,OAAO,SAAS,OAAO,GAAG,IAAI,CAAC;AAAA,kBACnD,cAAc,mBAAmB,IAAI,cAAc,CAAC;AAAA,gBAAA;AAAA,gBAEtD;AAAA,cAAA,yBACC,UAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QACd,EAAA,GApEM,CAsEV;AAAA,MAEJ,CAAC;AAAA,MACA,CAAC,YACA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,OAAO,aAAa,IAAI;AAAA,UACxB,OAAO,MAAM,WAAW;AAAA,UACxB,OAAO;AAAA,UACP,WAAW,CAAC,MAAM,cAAc,GAAG,MAAM,MAAM;AAAA,UAC9C,GAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AAAA,QAAC;AAAA,MAAA;AAAA,IAC1C,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAKA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,KAAK,CAAC,OAAO;AACX,kBAAU,UAAU;AAAA,MACtB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,SAAS;AAAA,MAAA;AAAA,MAIX,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAM,gBAAgB,WAAU,8BAA6B;AAAA,QACnE,oBAAC,QAAA,EAAK,WAAU,wLACd,UAAA,oBAAC,QAAK,MAAM,OAAO,WAAU,cAAA,CAAc,EAAA,CAC7C;AAAA,QACA,qBAAC,QAAA,EAAK,WAAU,iCACd,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,uCAAuC,UAAA,OAAM;AAAA,UAC5D,QACC,oBAAC,QAAA,EAAK,WAAW,GAAG,WAAW,QAAQ,0BAA0B,UAAU,GAAI,UAAA,KAAA,CAAK;AAAA,QAAA,EAAA,CAExF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAAS,UAAU,EAAE,SAAgD;AACnE,MAAI,CAAC,MAAO,QAAO;AACnB,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,OAAO,MAAM;AAAA,MACb,WAAW;AAAA,QACT;AAAA,QACA,iBAAiB,MAAM,IAAI;AAAA,MAAA;AAAA,MAG5B,UAAA,MAAM,QAAQ,QAAQ,oBAAC,aAAU,MAAM,MAAM,MAAM,WAAU,cAAA,CAAc;AAAA,IAAA;AAAA,EAAA;AAGlF;AAEA,SAAS,UAAU,EAAE,SAAgD;AACnE,MAAI,CAAC,MAAO,QAAO;AACnB,SACE,qBAAC,QAAA,EAAK,WAAU,2HACb,UAAA;AAAA,IAAA,MAAM,QAAQ,QAAQ,oBAAC,WAAA,EAAU,MAAM,MAAM,MAAM,WAAU,cAAA,CAAc;AAAA,IAC3E,MAAM;AAAA,EAAA,GACT;AAEJ;AAEA,SAAS,eAAe;AACtB,SACE,oBAAC,QAAA,EAAK,OAAM,YAAW,WAAU,sDAC/B,UAAA,oBAAC,MAAA,EAAK,MAAM,YAAY,WAAU,cAAA,CAAc,GAClD;AAEJ;AAEA,SAAS,eAAe;AAAA,EACtB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAQG;AAID,QAAM,SAAS;AAAA,IACb;AAAA,IACA,mBAAmB,IAAI;AAAA,EAAA;AAEzB,SACE,qBAAC,OAAA,EAAI,WAAU,4HACb,UAAA;AAAA,IAAA,oBAAC,UAAA,EAAO,MAAK,UAAS,cAAY,QAAQ,KAAK,OAAO,UAAU,CAAC,MAAM,WAAW,QAAQ,SAAS,MACjG,UAAA,oBAAC,MAAA,EAAK,MAAM,aAAa,WAAU,WAAU,EAAA,CAC/C;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,QAAQ,KAAK;AAAA,QACzB,UAAU,CAAC;AAAA,QACX,WAAW;AAAA,QACX,SAAS;AAAA,QAET,UAAA,oBAAC,MAAA,EAAK,MAAM,eAAe,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,wBAEhD,UAAA,EAAO,MAAK,UAAS,cAAY,aAAa,KAAK,IAAI,WAAW,QAAQ,SAAS,aAClF,UAAA,oBAAC,MAAA,EAAK,MAAM,QAAQ,WAAU,WAAU,GAC1C;AAAA,IACA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,UAAU,KAAK;AAAA,QAC3B,WAAW,GAAG,QAAQ,gDAAgD;AAAA,QACtE,SAAS;AAAA,QACT,mBAAiB;AAAA,QAEjB,UAAA,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAC3C,GACF;AAEJ;"}
1
+ {"version":3,"file":"json-schema-form-accordion-array.js","sources":["../../src/components/json-schema-form-accordion-array.tsx"],"sourcesContent":["import {\n useEffect,\n useRef,\n useState,\n type KeyboardEvent,\n type MutableRefObject,\n} from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiChevronDown, UiChevronRight } from \"../icons\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n ItemBadge,\n ItemGlyph,\n ItemRowActions,\n RequiredMark,\n} from \"./json-schema-form-item-row\";\nimport {\n addItemLabel,\n emptyItemsCopy,\n itemCountLabel,\n itemSummaryFor,\n noItemsLabel,\n resolveItemSpec,\n} from \"./json-schema-form-item-summary\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\nimport {\n duplicateIndex,\n fieldInputId,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, RenderContext } from \"./json-schema-form-types\";\n\n// AccordionArray renders an object-item array as a list of one-line summary\n// rows, expanding one at a time into the item's own sub-form. It exists because\n// a ten-property item stacked in full costs ~700px of screen each, and a list of\n// them says nothing about which item is which.\n//\n// \"Add\" is the list's own last row rather than a button beside it: the\n// affordance sits exactly where the next item will appear, and at zero items\n// that same row IS the empty state — one control, no separate screen.\nexport function AccordionArray({\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 spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);\n const emptyCopy = emptyItemsCopy(spec, field.schema);\n // The array's help mode governs its whole subtree. Without this the fields\n // inside an expanded row keep the form-level default, so an accordion that\n // resolved to \"hover\" would still stack a two-line paragraph under every\n // control — the exact height the summary rows exist to reclaim.\n const childCtx: RenderContext = {\n ...ctx,\n readOnly,\n depth: ctx.depth + 1,\n ...(field.helpDisplay\n ? { layout: { ...ctx.layout, help: field.helpDisplay } }\n : {}),\n };\n\n // Which row is open is transient view state, like the form's field filter —\n // it is deliberately local and never persisted. The INDEX is the key, not the\n // item: every keystroke replaces the item object (setIndex returns a fresh\n // one), so any identity-based map would die on the first character typed.\n // That makes it the mutators' job to keep this pointing at the same row.\n const [expanded, setExpanded] = useState<number | null>(null);\n const rowRefs = useRef<Array<HTMLButtonElement | null>>([]);\n const addRef = useRef<HTMLButtonElement | null>(null);\n const pendingFocus = useRef<{ kind: \"panel\" | \"row\" | \"add\"; index: number } | null>(null);\n\n useEffect(() => {\n const pending = pendingFocus.current;\n if (!pending) return;\n pendingFocus.current = null;\n if (pending.kind === \"add\") {\n addRef.current?.focus();\n return;\n }\n const row = rowRefs.current[pending.index];\n if (pending.kind === \"row\") {\n row?.focus();\n return;\n }\n // Land in the new item's first editable control, so adding an item leaves\n // the caret where the author is about to type.\n const panel = document.getElementById(panelId(pending.index));\n const input = panel?.querySelector<HTMLElement>(\"[data-jsf-input]\");\n (input ?? row)?.focus();\n });\n\n function panelId(index: number): string {\n return `${fieldInputId(appendInstancePath(ctx.instancePath, index), ctx.idPrefix)}-panel`;\n }\n function headerId(index: number): string {\n return `${fieldInputId(appendInstancePath(ctx.instancePath, index), ctx.idPrefix)}-header`;\n }\n\n function commit(next: unknown[]) {\n field.onChange(next);\n }\n\n function add() {\n pendingFocus.current = { kind: \"panel\", index: items.length };\n setExpanded(items.length);\n commit([...items, seedFromSchema(itemSchema)]);\n }\n\n function remove(index: number) {\n setExpanded((open) => (open === index ? null : open !== null && open > index ? open - 1 : open));\n pendingFocus.current =\n items.length === 1 ? { kind: \"add\", index: 0 } : { kind: \"row\", index: Math.max(index - 1, 0) };\n commit(removeIndex(items, index));\n }\n\n function duplicate(index: number) {\n setExpanded((open) => (open !== null && open > index ? open + 1 : open));\n pendingFocus.current = { kind: \"row\", index: index + 1 };\n commit(duplicateIndex(items, index));\n }\n\n function move(index: number, to: number) {\n // Follow the item, not the slot — otherwise moving an open row silently\n // expands whichever row took its place.\n setExpanded((open) => (open === index ? to : open === to ? index : open));\n pendingFocus.current = { kind: \"row\", index: to };\n commit(moveItem(items, index, to));\n }\n\n // Roving focus across the headers, with the add row as the final stop.\n function handleKeyDown(e: KeyboardEvent<HTMLButtonElement>, index: number) {\n const stops = rowRefs.current.length;\n const focusAt = (i: number) => {\n e.preventDefault();\n (i >= stops ? addRef.current : rowRefs.current[i])?.focus();\n };\n if (e.key === \"ArrowDown\") focusAt(Math.min(index + 1, stops));\n else if (e.key === \"ArrowUp\" && index > 0) focusAt(index - 1);\n else if (e.key === \"Home\") focusAt(0);\n else if (e.key === \"End\") focusAt(stops);\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n <p className={cn(\"text-muted-foreground\", labelSizeClass[ctx.size])}>\n {items.length === 0 ? noItemsLabel(spec) : itemCountLabel(spec, items.length)}\n </p>\n <div className=\"divide-y divide-border rounded-lg border border-border\">\n {items.map((item, i) => {\n const open = expanded === i;\n const summary =\n field.itemSummary?.({ item, index: i }) ??\n itemSummaryFor({ item, index: i, spec, itemSchema });\n return (\n <div key={i} className=\"group\">\n {/* The row is a plain element, NOT a button: the actions beside it\n are buttons, and nesting interactive content is invalid DOM\n with undefined click targeting. Only the disclosure toggles. */}\n <div\n className={cn(\n \"flex w-full items-center gap-2 px-3 py-2 hover:bg-accent/40\",\n open && \"bg-accent/30\",\n )}\n >\n <button\n type=\"button\"\n id={headerId(i)}\n aria-expanded={open}\n aria-controls={panelId(i)}\n ref={(el) => {\n rowRefs.current[i] = el;\n }}\n onKeyDown={(e) => handleKeyDown(e, i)}\n onClick={() => setExpanded(open ? null : i)}\n className=\"flex min-w-0 flex-1 items-center gap-2 text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n <Icon\n icon={open ? UiChevronDown : UiChevronRight}\n className=\"shrink-0 text-sm text-muted-foreground\"\n />\n <ItemGlyph glyph={summary.glyph} />\n <span className=\"shrink-0 text-sm font-medium\">{summary.title}</span>\n <ItemBadge badge={summary.badge} />\n {summary.flagged && <RequiredMark />}\n {summary.summary && (\n <code className=\"truncate font-mono text-xs text-muted-foreground\">\n {summary.summary}\n </code>\n )}\n </button>\n {!readOnly && (\n <ItemRowActions\n index={i}\n title={summary.title}\n size={ctx.size}\n {...(i > 0 ? { onUp: () => move(i, i - 1) } : {})}\n {...(i < items.length - 1 ? { onDown: () => move(i, i + 1) } : {})}\n onDuplicate={() => duplicate(i)}\n onRemove={() => remove(i)}\n />\n )}\n </div>\n {open && (\n <div\n id={panelId(i)}\n role=\"region\"\n aria-labelledby={headerId(i)}\n className=\"border-t border-border bg-muted/20 p-3\"\n >\n {/* Recurse through the shared pipeline so consumer pre/post\n extensions still apply to the item and its properties. */}\n {ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => commit(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n )?.value ?? null}\n </div>\n )}\n </div>\n );\n })}\n {!readOnly && (\n <AddItemRow\n buttonRef={addRef}\n label={addItemLabel(spec)}\n empty={items.length === 0}\n onAdd={add}\n onKeyDown={(e) => handleKeyDown(e, items.length)}\n {...(emptyCopy ? { copy: emptyCopy } : {})}\n />\n )}\n </div>\n </div>\n );\n}\n\n// AddItemRow is the list's own final row. At zero items it grows to carry the\n// schema's explanation of what an item is — so the empty state is the same\n// control the author will use, not a separate screen they have to leave.\nfunction AddItemRow({\n label,\n copy,\n empty,\n onAdd,\n onKeyDown,\n buttonRef,\n}: {\n label: string;\n copy?: string;\n empty: boolean;\n onAdd: () => void;\n onKeyDown: (e: KeyboardEvent<HTMLButtonElement>) => void;\n buttonRef: MutableRefObject<HTMLButtonElement | null>;\n}) {\n return (\n <button\n type=\"button\"\n ref={(el) => {\n buttonRef.current = el;\n }}\n onClick={onAdd}\n onKeyDown={onKeyDown}\n className={cn(\n \"group/add flex w-full items-center gap-2 px-3 py-2 text-left text-muted-foreground hover:bg-accent/40 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-inset focus-visible:ring-ring\",\n empty && \"items-start py-5\",\n )}\n >\n {/* Holds the chevron column, so this row lines up with the ones above it. */}\n <Icon icon={UiChevronRight} className=\"shrink-0 text-sm opacity-0\" />\n <span className=\"inline-flex size-6 shrink-0 items-center justify-center rounded-md border border-dashed border-border text-foreground/60 group-hover/add:border-primary group-hover/add:text-primary\">\n <Icon icon={UiAdd} className=\"text-[13px]\" />\n </span>\n <span className=\"flex min-w-0 flex-col gap-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n {copy && (\n <span className={cn(\"text-xs\", empty ? \"max-w-xl leading-snug\" : \"truncate\")}>{copy}</span>\n )}\n </span>\n </button>\n );\n}\n"],"names":[],"mappings":";;;;;;;;;;;;AA4CO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAA;AACzD,QAAM,aAAa,MAAM,cAAc,EAAE,MAAM,SAAA;AAC/C,QAAM,OAAO,MAAM,YAAY,gBAAgB,MAAM,QAAQ,UAAU;AACvE,QAAM,YAAY,eAAe,MAAM,MAAM,MAAM;AAKnD,QAAM,WAA0B;AAAA,IAC9B,GAAG;AAAA,IACH;AAAA,IACA,OAAO,IAAI,QAAQ;AAAA,IACnB,GAAI,MAAM,cACN,EAAE,QAAQ,EAAE,GAAG,IAAI,QAAQ,MAAM,MAAM,YAAA,EAAY,IACnD,CAAA;AAAA,EAAC;AAQP,QAAM,CAAC,UAAU,WAAW,IAAI,SAAwB,IAAI;AAC5D,QAAM,UAAU,OAAwC,EAAE;AAC1D,QAAM,SAAS,OAAiC,IAAI;AACpD,QAAM,eAAe,OAAgE,IAAI;AAEzF,YAAU,MAAM;;AACd,UAAM,UAAU,aAAa;AAC7B,QAAI,CAAC,QAAS;AACd,iBAAa,UAAU;AACvB,QAAI,QAAQ,SAAS,OAAO;AAC1B,mBAAO,YAAP,mBAAgB;AAChB;AAAA,IACF;AACA,UAAM,MAAM,QAAQ,QAAQ,QAAQ,KAAK;AACzC,QAAI,QAAQ,SAAS,OAAO;AAC1B,iCAAK;AACL;AAAA,IACF;AAGA,UAAM,QAAQ,SAAS,eAAe,QAAQ,QAAQ,KAAK,CAAC;AAC5D,UAAM,QAAQ,+BAAO,cAA2B;AAChD,KAAC,cAAS,QAAT,mBAAe;AAAA,EAClB,CAAC;AAED,WAAS,QAAQ,OAAuB;AACtC,WAAO,GAAG,aAAa,mBAAmB,IAAI,cAAc,KAAK,GAAG,IAAI,QAAQ,CAAC;AAAA,EACnF;AACA,WAAS,SAAS,OAAuB;AACvC,WAAO,GAAG,aAAa,mBAAmB,IAAI,cAAc,KAAK,GAAG,IAAI,QAAQ,CAAC;AAAA,EACnF;AAEA,WAAS,OAAO,MAAiB;AAC/B,UAAM,SAAS,IAAI;AAAA,EACrB;AAEA,WAAS,MAAM;AACb,iBAAa,UAAU,EAAE,MAAM,SAAS,OAAO,MAAM,OAAA;AACrD,gBAAY,MAAM,MAAM;AACxB,WAAO,CAAC,GAAG,OAAO,eAAe,UAAU,CAAC,CAAC;AAAA,EAC/C;AAEA,WAAS,OAAO,OAAe;AAC7B,gBAAY,CAAC,SAAU,SAAS,QAAQ,OAAO,SAAS,QAAQ,OAAO,QAAQ,OAAO,IAAI,IAAK;AAC/F,iBAAa,UACX,MAAM,WAAW,IAAI,EAAE,MAAM,OAAO,OAAO,EAAA,IAAM,EAAE,MAAM,OAAO,OAAO,KAAK,IAAI,QAAQ,GAAG,CAAC,EAAA;AAC9F,WAAO,YAAY,OAAO,KAAK,CAAC;AAAA,EAClC;AAEA,WAAS,UAAU,OAAe;AAChC,gBAAY,CAAC,SAAU,SAAS,QAAQ,OAAO,QAAQ,OAAO,IAAI,IAAK;AACvE,iBAAa,UAAU,EAAE,MAAM,OAAO,OAAO,QAAQ,EAAA;AACrD,WAAO,eAAe,OAAO,KAAK,CAAC;AAAA,EACrC;AAEA,WAAS,KAAK,OAAe,IAAY;AAGvC,gBAAY,CAAC,SAAU,SAAS,QAAQ,KAAK,SAAS,KAAK,QAAQ,IAAK;AACxE,iBAAa,UAAU,EAAE,MAAM,OAAO,OAAO,GAAA;AAC7C,WAAO,SAAS,OAAO,OAAO,EAAE,CAAC;AAAA,EACnC;AAGA,WAAS,cAAc,GAAqC,OAAe;AACzE,UAAM,QAAQ,QAAQ,QAAQ;AAC9B,UAAM,UAAU,CAAC,MAAc;;AAC7B,QAAE,eAAA;AACF,OAAC,UAAK,QAAQ,OAAO,UAAU,QAAQ,QAAQ,CAAC,MAA/C,mBAAmD;AAAA,IACtD;AACA,QAAI,EAAE,QAAQ,YAAa,SAAQ,KAAK,IAAI,QAAQ,GAAG,KAAK,CAAC;AAAA,aACpD,EAAE,QAAQ,aAAa,QAAQ,EAAG,SAAQ,QAAQ,CAAC;AAAA,aACnD,EAAE,QAAQ,OAAQ,SAAQ,CAAC;AAAA,aAC3B,EAAE,QAAQ,MAAO,SAAQ,KAAK;AAAA,EACzC;AAEA,SACE,qBAAC,OAAA,EAAI,WAAU,uBACb,UAAA;AAAA,IAAA,oBAAC,OAAE,WAAW,GAAG,yBAAyB,eAAe,IAAI,IAAI,CAAC,GAC/D,gBAAM,WAAW,IAAI,aAAa,IAAI,IAAI,eAAe,MAAM,MAAM,MAAM,GAC9E;AAAA,IACA,qBAAC,OAAA,EAAI,WAAU,0DACZ,UAAA;AAAA,MAAA,MAAM,IAAI,CAAC,MAAM,MAAM;;AACtB,cAAM,OAAO,aAAa;AAC1B,cAAM,YACJ,WAAM,gBAAN,+BAAoB,EAAE,MAAM,OAAO,EAAA,OACnC,eAAe,EAAE,MAAM,OAAO,GAAG,MAAM,YAAY;AACrD,eACE,qBAAC,OAAA,EAAY,WAAU,SAIrB,UAAA;AAAA,UAAA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA,QAAQ;AAAA,cAAA;AAAA,cAGV,UAAA;AAAA,gBAAA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,MAAK;AAAA,oBACL,IAAI,SAAS,CAAC;AAAA,oBACd,iBAAe;AAAA,oBACf,iBAAe,QAAQ,CAAC;AAAA,oBACxB,KAAK,CAAC,OAAO;AACX,8BAAQ,QAAQ,CAAC,IAAI;AAAA,oBACvB;AAAA,oBACA,WAAW,CAAC,MAAM,cAAc,GAAG,CAAC;AAAA,oBACpC,SAAS,MAAM,YAAY,OAAO,OAAO,CAAC;AAAA,oBAC1C,WAAU;AAAA,oBAEV,UAAA;AAAA,sBAAA;AAAA,wBAAC;AAAA,wBAAA;AAAA,0BACC,MAAM,OAAO,gBAAgB;AAAA,0BAC7B,WAAU;AAAA,wBAAA;AAAA,sBAAA;AAAA,sBAEZ,oBAAC,WAAA,EAAU,OAAO,QAAQ,MAAA,CAAO;AAAA,sBACjC,oBAAC,QAAA,EAAK,WAAU,gCAAgC,kBAAQ,OAAM;AAAA,sBAC9D,oBAAC,WAAA,EAAU,OAAO,QAAQ,MAAA,CAAO;AAAA,sBAChC,QAAQ,WAAW,oBAAC,cAAA,CAAA,CAAa;AAAA,sBACjC,QAAQ,WACP,oBAAC,UAAK,WAAU,oDACb,kBAAQ,QAAA,CACX;AAAA,oBAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAGH,CAAC,YACA;AAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,OAAO;AAAA,oBACP,OAAO,QAAQ;AAAA,oBACf,MAAM,IAAI;AAAA,oBACT,GAAI,IAAI,IAAI,EAAE,MAAM,MAAM,KAAK,GAAG,IAAI,CAAC,EAAA,IAAM,CAAA;AAAA,oBAC7C,GAAI,IAAI,MAAM,SAAS,IAAI,EAAE,QAAQ,MAAM,KAAK,GAAG,IAAI,CAAC,EAAA,IAAM,CAAA;AAAA,oBAC/D,aAAa,MAAM,UAAU,CAAC;AAAA,oBAC9B,UAAU,MAAM,OAAO,CAAC;AAAA,kBAAA;AAAA,gBAAA;AAAA,cAC1B;AAAA,YAAA;AAAA,UAAA;AAAA,UAGH,QACC;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,IAAI,QAAQ,CAAC;AAAA,cACb,MAAK;AAAA,cACL,mBAAiB,SAAS,CAAC;AAAA,cAC3B,WAAU;AAAA,cAIT,qBAAI,OAAO;AAAA,gBACV;AAAA,kBACE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;AAAA,kBACtB,MAAM;AAAA,kBACN,UAAU;AAAA,kBACV,OAAO;AAAA,kBACP,UAAU,CAAC,SAAS,OAAO,SAAS,OAAO,GAAG,IAAI,CAAC;AAAA,kBACnD,cAAc,mBAAmB,IAAI,cAAc,CAAC;AAAA,gBAAA;AAAA,gBAEtD;AAAA,cAAA,yBACC,UAAS;AAAA,YAAA;AAAA,UAAA;AAAA,QACd,EAAA,GApEM,CAsEV;AAAA,MAEJ,CAAC;AAAA,MACA,CAAC,YACA;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,WAAW;AAAA,UACX,OAAO,aAAa,IAAI;AAAA,UACxB,OAAO,MAAM,WAAW;AAAA,UACxB,OAAO;AAAA,UACP,WAAW,CAAC,MAAM,cAAc,GAAG,MAAM,MAAM;AAAA,UAC9C,GAAI,YAAY,EAAE,MAAM,cAAc,CAAA;AAAA,QAAC;AAAA,MAAA;AAAA,IAC1C,EAAA,CAEJ;AAAA,EAAA,GACF;AAEJ;AAKA,SAAS,WAAW;AAAA,EAClB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAOG;AACD,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAK;AAAA,MACL,KAAK,CAAC,OAAO;AACX,kBAAU,UAAU;AAAA,MACtB;AAAA,MACA,SAAS;AAAA,MACT;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,SAAS;AAAA,MAAA;AAAA,MAIX,UAAA;AAAA,QAAA,oBAAC,MAAA,EAAK,MAAM,gBAAgB,WAAU,8BAA6B;AAAA,QACnE,oBAAC,QAAA,EAAK,WAAU,wLACd,UAAA,oBAAC,QAAK,MAAM,OAAO,WAAU,cAAA,CAAc,EAAA,CAC7C;AAAA,QACA,qBAAC,QAAA,EAAK,WAAU,iCACd,UAAA;AAAA,UAAA,oBAAC,QAAA,EAAK,WAAU,uCAAuC,UAAA,OAAM;AAAA,UAC5D,QACC,oBAAC,QAAA,EAAK,WAAW,GAAG,WAAW,QAAQ,0BAA0B,UAAU,GAAI,UAAA,KAAA,CAAK;AAAA,QAAA,EAAA,CAExF;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAGN;"}
@@ -8,6 +8,8 @@ const FilterPill = require("../data/FilterPill.cjs");
8
8
  const button = require("./button.cjs");
9
9
  const jsonSchemaFormSize = require("./json-schema-form-size.cjs");
10
10
  const jsonSchemaFormAccordionArray = require("./json-schema-form-accordion-array.cjs");
11
+ const jsonSchemaFormCardsArray = require("./json-schema-form-cards-array.cjs");
12
+ const jsonSchemaFormLayout = require("./json-schema-form-layout.cjs");
11
13
  const jsonSchemaFormResolve = require("./json-schema-form-resolve.cjs");
12
14
  const jsonSchemaFormErrors = require("./json-schema-form-errors.cjs");
13
15
  const jsonSchemaFormTableArray = require("./json-schema-form-table-array.cjs");
@@ -37,6 +39,9 @@ function ArrayControl({
37
39
  if (field.arrayDisplay === "accordion" && jsonSchemaFormUtils.hasObjectItemProperties(field.itemSchema)) {
38
40
  return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormAccordionArray.AccordionArray, { field, ctx, readOnly });
39
41
  }
42
+ if (field.arrayDisplay === "cards" && jsonSchemaFormUtils.hasObjectItemProperties(field.itemSchema)) {
43
+ return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormCardsArray.CardsArray, { field, ctx, readOnly });
44
+ }
40
45
  if (jsonSchemaFormResolve.isScalarStringItems(field.itemSchema)) {
41
46
  return /* @__PURE__ */ jsxRuntime.jsx(
42
47
  TagArray,
@@ -63,7 +68,7 @@ function ArrayControl({
63
68
  ),
64
69
  children: [
65
70
  items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-[1fr_auto] items-start gap-2", children: [
66
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "min-w-0", children: ctx.render.renderFieldRow(
71
+ /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormLayout.FieldsGrid, { layout: ctx.layout, size: ctx.size, columns: 1, className: "min-w-0", children: ctx.render.renderFieldRow(
67
72
  {
68
73
  key: `${field.key}[${i}]`,
69
74
  prop: itemSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-array.cjs","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { type KeyboardEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport {\n controlHeightClass,\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport {\n defaultPlaceholder,\n hasObjectItemProperties,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, 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 (\n field.arrayDisplay === \"filter-pills\" &&\n enumItemOptions(field).length > 0\n ) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // Placed before the scalar-string branch: an array of plain strings has no\n // properties to summarize, so it falls through to the compact tag editor even\n // if the schema asks for an accordion.\n if (\n field.arrayDisplay === \"accordion\" &&\n hasObjectItemProperties(field.itemSchema)\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n if (isScalarStringItems(field.itemSchema)) {\n return (\n <TagArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\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\n className={cn(\n \"flex flex-col rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\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 instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </div>\n {!readOnly && (\n <ItemControls\n onUp={\n i > 0\n ? () => field.onChange(moveItem(items, i, i - 1))\n : undefined\n }\n onDown={\n i < items.length - 1\n ? () => field.onChange(moveItem(items, i, i + 1))\n : undefined\n }\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n size={ctx.size}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\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\nfunction enumItemOptions(\n field: FieldControl,\n): Array<{ value: string; label: string }> {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.flatMap((option) => {\n if (seen.has(option.value)) return [];\n seen.add(option.value);\n return [{ value: option.value, label: option.label }];\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\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 {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n size,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n size: FormSize;\n}) {\n const actionClassName = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\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={actionClassName}\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={actionClassName}\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={actionClassName}\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(\n \"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\",\n labelSizeClass[size],\n )}\n placeholder={\n tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"\n }\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":["jsx","hasObjectItemProperties","AccordionArray","isScalarStringItems","TableArray","jsxs","cn","fieldInnerGapClass","setIndex","appendInstancePath","moveItem","removeIndex","Button","inputSizeClass","seedFromSchema","Icon","UiAdd","controlMinHeightClass","FilterPill","controlHeightClass","UiChevronUp","UiChevronDown","UiTrash","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 } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport {\n controlHeightClass,\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { CardsArray } from \"./json-schema-form-cards-array\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport {\n defaultPlaceholder,\n hasObjectItemProperties,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, 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 (\n field.arrayDisplay === \"filter-pills\" &&\n enumItemOptions(field).length > 0\n ) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // Placed before the scalar-string branch: an array of plain strings has no\n // properties to summarize, so it falls through to the compact tag editor even\n // if the schema asks for an accordion.\n if (\n field.arrayDisplay === \"accordion\" &&\n hasObjectItemProperties(field.itemSchema)\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // Same guard as the accordion, and for the same reason: a card is headed by\n // the item's own summary, which a list of bare strings cannot supply.\n if (field.arrayDisplay === \"cards\" && hasObjectItemProperties(field.itemSchema)) {\n return <CardsArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n if (isScalarStringItems(field.itemSchema)) {\n return (\n <TagArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\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\n className={cn(\n \"flex flex-col rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n {/* The item's row is a FieldWrapper (or a full-width ObjectSection),\n both of which are grid children of a FieldsGrid — inline mode's\n `grid-cols-subgrid` resolves to `none` without one, collapsing\n every item into a stacked column while the rest of the form stays\n aligned. Fixed at one column: an item is a single row, and any\n multi-column layout belongs to the item's own object body. */}\n <FieldsGrid layout={ctx.layout} size={ctx.size} columns={1} 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 instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </FieldsGrid>\n {!readOnly && (\n <ItemControls\n onUp={\n i > 0\n ? () => field.onChange(moveItem(items, i, i - 1))\n : undefined\n }\n onDown={\n i < items.length - 1\n ? () => field.onChange(moveItem(items, i, i + 1))\n : undefined\n }\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n size={ctx.size}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\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\nfunction enumItemOptions(\n field: FieldControl,\n): Array<{ value: string; label: string }> {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.flatMap((option) => {\n if (seen.has(option.value)) return [];\n seen.add(option.value);\n return [{ value: option.value, label: option.label }];\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\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 {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n size,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n size: FormSize;\n}) {\n const actionClassName = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\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={actionClassName}\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={actionClassName}\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={actionClassName}\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(\n \"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\",\n labelSizeClass[size],\n )}\n placeholder={\n tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"\n }\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":["jsx","hasObjectItemProperties","AccordionArray","CardsArray","isScalarStringItems","TableArray","jsxs","cn","fieldInnerGapClass","FieldsGrid","setIndex","appendInstancePath","moveItem","removeIndex","Button","inputSizeClass","seedFromSchema","Icon","UiAdd","controlMinHeightClass","FilterPill","controlHeightClass","UiChevronUp","UiChevronDown","UiTrash","UiClose","labelSizeClass","defaultPlaceholder"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-array.tsx"],"names":[],"mappings":"AA0BA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAM5E,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,2CAqGA"}
1
+ {"version":3,"file":"json-schema-form-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-array.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAM5E,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,2CAgHA"}
@@ -6,6 +6,8 @@ import { FilterPill } from "../data/FilterPill.js";
6
6
  import { Button } from "./button.js";
7
7
  import { inputSizeClass, fieldInnerGapClass, controlMinHeightClass, labelSizeClass, controlHeightClass } from "./json-schema-form-size.js";
8
8
  import { AccordionArray } from "./json-schema-form-accordion-array.js";
9
+ import { CardsArray } from "./json-schema-form-cards-array.js";
10
+ import { FieldsGrid } from "./json-schema-form-layout.js";
9
11
  import { isScalarStringItems } from "./json-schema-form-resolve.js";
10
12
  import { appendInstancePath } from "./json-schema-form-errors.js";
11
13
  import { TableArray } from "./json-schema-form-table-array.js";
@@ -35,6 +37,9 @@ function ArrayControl({
35
37
  if (field.arrayDisplay === "accordion" && hasObjectItemProperties(field.itemSchema)) {
36
38
  return /* @__PURE__ */ jsx(AccordionArray, { field, ctx, readOnly });
37
39
  }
40
+ if (field.arrayDisplay === "cards" && hasObjectItemProperties(field.itemSchema)) {
41
+ return /* @__PURE__ */ jsx(CardsArray, { field, ctx, readOnly });
42
+ }
38
43
  if (isScalarStringItems(field.itemSchema)) {
39
44
  return /* @__PURE__ */ jsx(
40
45
  TagArray,
@@ -61,7 +66,7 @@ function ArrayControl({
61
66
  ),
62
67
  children: [
63
68
  items.map((item, i) => /* @__PURE__ */ jsxs("div", { className: "grid grid-cols-[1fr_auto] items-start gap-2", children: [
64
- /* @__PURE__ */ jsx("div", { className: "min-w-0", children: ctx.render.renderFieldRow(
69
+ /* @__PURE__ */ jsx(FieldsGrid, { layout: ctx.layout, size: ctx.size, columns: 1, className: "min-w-0", children: ctx.render.renderFieldRow(
65
70
  {
66
71
  key: `${field.key}[${i}]`,
67
72
  prop: itemSchema,
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-array.js","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { type KeyboardEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport {\n controlHeightClass,\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport {\n defaultPlaceholder,\n hasObjectItemProperties,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, 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 (\n field.arrayDisplay === \"filter-pills\" &&\n enumItemOptions(field).length > 0\n ) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // Placed before the scalar-string branch: an array of plain strings has no\n // properties to summarize, so it falls through to the compact tag editor even\n // if the schema asks for an accordion.\n if (\n field.arrayDisplay === \"accordion\" &&\n hasObjectItemProperties(field.itemSchema)\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n if (isScalarStringItems(field.itemSchema)) {\n return (\n <TagArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\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\n className={cn(\n \"flex flex-col rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\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 instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </div>\n {!readOnly && (\n <ItemControls\n onUp={\n i > 0\n ? () => field.onChange(moveItem(items, i, i - 1))\n : undefined\n }\n onDown={\n i < items.length - 1\n ? () => field.onChange(moveItem(items, i, i + 1))\n : undefined\n }\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n size={ctx.size}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\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\nfunction enumItemOptions(\n field: FieldControl,\n): Array<{ value: string; label: string }> {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.flatMap((option) => {\n if (seen.has(option.value)) return [];\n seen.add(option.value);\n return [{ value: option.value, label: option.label }];\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\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 {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n size,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n size: FormSize;\n}) {\n const actionClassName = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\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={actionClassName}\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={actionClassName}\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={actionClassName}\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(\n \"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\",\n labelSizeClass[size],\n )}\n placeholder={\n tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"\n }\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":";;;;;;;;;;;;;;;;;AAgCO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AAID,QAAM,WAAW,IAAI,YAAY,MAAM,aAAa;AACpD,MACE,MAAM,iBAAiB,kBACvB,gBAAgB,KAAK,EAAE,SAAS,GAChC;AACA,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AAIA,MACE,MAAM,iBAAiB,eACvB,wBAAwB,MAAM,UAAU,GACxC;AACA,WAAO,oBAAC,gBAAA,EAAe,OAAc,KAAU,SAAA,CAAoB;AAAA,EACrE;AACA,MAAI,oBAAoB,MAAM,UAAU,GAAG;AACzC,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA,MAAM,IAAI;AAAA,MAAA;AAAA,IAAA;AAAA,EAGhB;AAGA,MAAI,MAAM,WAAW,WAAW,wBAAwB,MAAM,UAAU,GAAG;AACzE,WAAO,oBAAC,YAAA,EAAW,OAAc,KAAU,SAAA,CAAoB;AAAA,EACjE;AACA,QAAM,QAAQ,MAAM,QAAQ,MAAM,KAAK,IAAI,MAAM,QAAQ,CAAA;AACzD,QAAM,aAAa,MAAM,cAAc,EAAE,MAAM,SAAA;AAC/C,QAAM,WAA0B,EAAE,GAAG,KAAK,UAAU,OAAO,IAAI,QAAQ,EAAA;AAEvE,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,mBAAmB,IAAI,IAAI;AAAA,MAAA;AAAA,MAG5B,UAAA;AAAA,QAAA,MAAM,IAAI,CAAC,MAAM,MAChB,qBAAC,OAAA,EAAY,WAAU,+CACrB,UAAA;AAAA,UAAA,oBAAC,OAAA,EAAI,WAAU,WACZ,UAAA,IAAI,OAAO;AAAA,YACV;AAAA,cACE,KAAK,GAAG,MAAM,GAAG,IAAI,CAAC;AAAA,cACtB,MAAM;AAAA,cACN,UAAU;AAAA,cACV,OAAO;AAAA,cACP,UAAU,CAAC,SAAS,MAAM,SAAS,SAAS,OAAO,GAAG,IAAI,CAAC;AAAA,cAC3D,cAAc,mBAAmB,IAAI,cAAc,CAAC;AAAA,YAAA;AAAA,YAEtD;AAAA,YACA,EAAE,eAAe,QAAQ,IAAI,CAAC,GAAA;AAAA,UAAG,GAErC;AAAA,UACC,CAAC,YACA;AAAA,YAAC;AAAA,YAAA;AAAA,cACC,MACE,IAAI,IACA,MAAM,MAAM,SAAS,SAAS,OAAO,GAAG,IAAI,CAAC,CAAC,IAC9C;AAAA,cAEN,QACE,IAAI,MAAM,SAAS,IACf,MAAM,MAAM,SAAS,SAAS,OAAO,GAAG,IAAI,CAAC,CAAC,IAC9C;AAAA,cAEN,UAAU,MAAM,MAAM,SAAS,YAAY,OAAO,CAAC,CAAC;AAAA,cACpD,OAAO;AAAA,cACP,MAAM,IAAI;AAAA,YAAA;AAAA,UAAA;AAAA,QACZ,EAAA,GA9BM,CAgCV,CACD;AAAA,QACA,CAAC,YACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAQ;AAAA,YACR,WAAW,GAAG,WAAW,eAAe,IAAI,IAAI,CAAC;AAAA,YACjD,SAAS,MAAM,MAAM,SAAS,CAAC,GAAG,OAAO,eAAe,UAAU,CAAC,CAAC;AAAA,YAEpE,UAAA;AAAA,cAAA,oBAAC,MAAA,EAAK,MAAM,OAAO,WAAU,WAAU;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAE3C;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,SAAS,gBACP,OACyC;;AACzC,QAAM,aACJ,MAAM,YACL,MAAM,SAAQ,WAAM,eAAN,mBAAkB,IAAI,IACjC,MAAM,WAAW,KAAK,IAAI,CAAC,WAAW;AAAA,IACpC,OAAO,OAAO,KAAK;AAAA,IACnB,OAAO,OAAO,KAAK;AAAA,EAAA,EACnB,IACF,CAAA;AACN,QAAM,2BAAW,IAAA;AACjB,SAAO,WAAW,QAAQ,CAAC,WAAW;AACpC,QAAI,KAAK,IAAI,OAAO,KAAK,UAAU,CAAA;AACnC,SAAK,IAAI,OAAO,KAAK;AACrB,WAAO,CAAC,EAAE,OAAO,OAAO,OAAO,OAAO,OAAO,OAAO;AAAA,EACtD,CAAC;AACH;AAEA,SAAS,gBAAgB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,UAAU,gBAAgB,KAAK;AACrC,QAAM,cAAc,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK,CAAC;AACjE,QAAM,iBAAiB,cAAc,MAAM,KAAK,EAAE;AAAA,IAAO,CAAC,UACxD,YAAY,IAAI,KAAK;AAAA,EAAA;AAEvB,QAAM,cAAc,eAAe,WAAW;AAC9C,QAAM,WAAW,IAAI;AAAA,IACnB,cAAc,QAAQ,IAAI,CAAC,WAAW,OAAO,KAAK,IAAI;AAAA,EAAA;AAGxD,WAAS,OAAO,cAA2B;AACzC,UAAM,OAAO,QACV,IAAI,CAAC,WAAW,OAAO,KAAK,EAC5B,OAAO,CAAC,UAAU,aAAa,IAAI,KAAK,CAAC;AAC5C,UAAM,SAAS,KAAK,WAAW,QAAQ,SAAS,CAAA,IAAK,IAAI;AAAA,EAC3D;AAEA,WAAS,OAAO,OAAe;AAC7B,QAAI,SAAU;AACd,UAAM,OAAO,IAAI,IAAI,QAAQ;AAC7B,QAAI,KAAK,IAAI,KAAK,GAAG;AACnB,WAAK,OAAO,KAAK;AAAA,IACnB,OAAO;AACL,WAAK,IAAI,KAAK;AAAA,IAChB;AACA,WAAO,IAAI;AAAA,EACb;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,IAAI;AAAA,MACJ,kBAAc;AAAA,MACd,MAAK;AAAA,MACL,cAAY,MAAM;AAAA,MAClB,WAAW;AAAA,QACT;AAAA,QACA,sBAAsB,IAAI;AAAA,MAAA;AAAA,MAG3B,UAAA,QAAQ,IAAI,CAAC,WACZ;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,OAAO,OAAO;AAAA,UACd,MAAM,SAAS,IAAI,OAAO,KAAK,IAAI,WAAW;AAAA,UAC9C,OACE,cAAc,GAAG,OAAO,KAAK,wBAAwB,OAAO;AAAA,UAE7D,GAAI,CAAC,WAAW,EAAE,SAAS,MAAM,OAAO,OAAO,KAAK,EAAA,IAAM,CAAA;AAAA,UAC3D,WAAU;AAAA,QAAA;AAAA,QAPL,OAAO;AAAA,MAAA,CASf;AAAA,IAAA;AAAA,EAAA;AAGP;AAEA,SAAS,aAAa;AAAA,EACpB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMG;AACD,QAAM,kBAAkB;AAAA,IACtB;AAAA,IACA,mBAAmB,IAAI;AAAA,EAAA;AAGzB,SACE,qBAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,IAAA;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,aAAa,QAAQ,CAAC;AAAA,QAClC,UAAU,CAAC;AAAA,QACX,WAAW;AAAA,QACX,SAAS;AAAA,QAET,UAAA,oBAAC,MAAA,EAAK,MAAM,aAAa,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAE/C;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,aAAa,QAAQ,CAAC;AAAA,QAClC,UAAU,CAAC;AAAA,QACX,WAAW;AAAA,QACX,SAAS;AAAA,QAET,UAAA,oBAAC,MAAA,EAAK,MAAM,eAAe,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,IAEjD;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAY,eAAe,QAAQ,CAAC;AAAA,QACpC,WAAW;AAAA,QACX,SAAS;AAAA,QAET,UAAA,oBAAC,MAAA,EAAK,MAAM,SAAS,WAAU,UAAA,CAAU;AAAA,MAAA;AAAA,IAAA;AAAA,EAC3C,GACF;AAEJ;AAGA,SAAS,SAAS;AAAA,EAChB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,OAAO,cAAc,MAAM,KAAK;AAEtC,WAAS,OAAO,KAAa,OAAyB;AACpD,UAAM,OAAO,IACV,MAAM,GAAG,EACT,IAAI,CAAC,MAAM,EAAE,KAAA,CAAM,EACnB,OAAO,OAAO;AACjB,QAAI,KAAK,WAAW,EAAG;AACvB,UAAM,SAAS,CAAC,GAAG,MAAM,GAAG,IAAI,CAAC;AACjC,UAAM,QAAQ;AAAA,EAChB;AAEA,WAAS,cAAc,GAAoC;AACzD,UAAM,QAAQ,EAAE;AAChB,QAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,KAAK;AACtC,QAAE,eAAA;AACF,aAAO,MAAM,OAAO,KAAK;AACzB;AAAA,IACF;AACA,QAAI,EAAE,QAAQ,eAAe,MAAM,UAAU,MAAM,KAAK,SAAS,GAAG;AAClE,YAAM,SAAS,KAAK,MAAM,GAAG,EAAE,CAAC;AAAA,IAClC;AAAA,EACF;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,sBAAsB,IAAI;AAAA,MAAA;AAAA,MAG3B,UAAA;AAAA,QAAA,KAAK,IAAI,CAAC,KAAK,MACd;AAAA,UAAC;AAAA,UAAA;AAAA,YAEC,WAAU;AAAA,YAEV,UAAA;AAAA,cAAA,oBAAC,QAAA,EAAK,WAAU,YAAY,UAAA,KAAI;AAAA,cAC/B,CAAC,YACA;AAAA,gBAAC;AAAA,gBAAA;AAAA,kBACC,MAAK;AAAA,kBACL,WAAU;AAAA,kBACV,cAAY,UAAU,GAAG;AAAA,kBACzB,SAAS,MAAM,MAAM,SAAS,KAAK,OAAO,CAAC,GAAG,QAAQ,QAAQ,CAAC,CAAC;AAAA,kBAEhE,UAAA,oBAAC,MAAA,EAAK,MAAM,QAAA,CAAS;AAAA,gBAAA;AAAA,cAAA;AAAA,YACvB;AAAA,UAAA;AAAA,UAZG,GAAG,GAAG,IAAI,CAAC;AAAA,QAAA,CAenB;AAAA,QACA,CAAC,YACA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,IAAI;AAAA,YACJ,kBAAc;AAAA,YACd,WAAW;AAAA,cACT;AAAA,cACA,eAAe,IAAI;AAAA,YAAA;AAAA,YAErB,aACE,KAAK,WAAW,IAAI,mBAAmB,MAAM,MAAM,IAAI;AAAA,YAEzD,WAAW;AAAA,YACX,QAAQ,CAAC,MAAM,OAAO,EAAE,cAAc,OAAO,EAAE,aAAa;AAAA,UAAA;AAAA,QAAA;AAAA,MAC9D;AAAA,IAAA;AAAA,EAAA;AAIR;AAEA,SAAS,cAAc,OAA0B;AAC/C,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,MAAM;AACjD,SAAO,CAAA;AACT;"}
1
+ {"version":3,"file":"json-schema-form-array.js","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { type KeyboardEvent } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd, UiChevronDown, UiChevronUp, UiClose, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport {\n controlHeightClass,\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { CardsArray } from \"./json-schema-form-cards-array\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { isScalarStringItems } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport {\n defaultPlaceholder,\n hasObjectItemProperties,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, 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 (\n field.arrayDisplay === \"filter-pills\" &&\n enumItemOptions(field).length > 0\n ) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // Placed before the scalar-string branch: an array of plain strings has no\n // properties to summarize, so it falls through to the compact tag editor even\n // if the schema asks for an accordion.\n if (\n field.arrayDisplay === \"accordion\" &&\n hasObjectItemProperties(field.itemSchema)\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // Same guard as the accordion, and for the same reason: a card is headed by\n // the item's own summary, which a list of bare strings cannot supply.\n if (field.arrayDisplay === \"cards\" && hasObjectItemProperties(field.itemSchema)) {\n return <CardsArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n if (isScalarStringItems(field.itemSchema)) {\n return (\n <TagArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\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\n className={cn(\n \"flex flex-col rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n {/* The item's row is a FieldWrapper (or a full-width ObjectSection),\n both of which are grid children of a FieldsGrid — inline mode's\n `grid-cols-subgrid` resolves to `none` without one, collapsing\n every item into a stacked column while the rest of the form stays\n aligned. Fixed at one column: an item is a single row, and any\n multi-column layout belongs to the item's own object body. */}\n <FieldsGrid layout={ctx.layout} size={ctx.size} columns={1} 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 instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </FieldsGrid>\n {!readOnly && (\n <ItemControls\n onUp={\n i > 0\n ? () => field.onChange(moveItem(items, i, i - 1))\n : undefined\n }\n onDown={\n i < items.length - 1\n ? () => field.onChange(moveItem(items, i, i + 1))\n : undefined\n }\n onRemove={() => field.onChange(removeIndex(items, i))}\n index={i}\n size={ctx.size}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\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\nfunction enumItemOptions(\n field: FieldControl,\n): Array<{ value: string; label: string }> {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.flatMap((option) => {\n if (seen.has(option.value)) return [];\n seen.add(option.value);\n return [{ value: option.value, label: option.label }];\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\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 {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n\nfunction ItemControls({\n onUp,\n onDown,\n onRemove,\n index,\n size,\n}: {\n onUp: (() => void) | undefined;\n onDown: (() => void) | undefined;\n onRemove: () => void;\n index: number;\n size: FormSize;\n}) {\n const actionClassName = cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground disabled:opacity-30\",\n controlHeightClass[size],\n );\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={actionClassName}\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={actionClassName}\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={actionClassName}\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(\n \"min-w-32 flex-1 bg-transparent px-1 py-1 outline-none\",\n labelSizeClass[size],\n )}\n placeholder={\n tags.length === 0 ? defaultPlaceholder(field.schema) : \"\"\n }\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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"}
@@ -0,0 +1,96 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const utils = require("../lib/utils.cjs");
5
+ const Icon = require("../data/Icon.cjs");
6
+ const button = require("./button.cjs");
7
+ const jsonSchemaFormErrors = require("./json-schema-form-errors.cjs");
8
+ const jsonSchemaFormItemSummary = require("./json-schema-form-item-summary.cjs");
9
+ const jsonSchemaFormItemRow = require("./json-schema-form-item-row.cjs");
10
+ const jsonSchemaFormSize = require("./json-schema-form-size.cjs");
11
+ const jsonSchemaFormTone = require("./json-schema-form-tone.cjs");
12
+ const jsonSchemaFormUtils = require("./json-schema-form-utils.cjs");
13
+ const UiAdd = require("../icons/components/UiAdd.cjs");
14
+ function CardsArray({
15
+ field,
16
+ ctx,
17
+ readOnly
18
+ }) {
19
+ const items = Array.isArray(field.value) ? field.value : [];
20
+ const itemSchema = field.itemSchema ?? { type: "object" };
21
+ const spec = field.itemSpec ?? jsonSchemaFormItemSummary.resolveItemSpec(field.schema, itemSchema);
22
+ const emptyCopy = jsonSchemaFormItemSummary.emptyItemsCopy(spec, field.schema);
23
+ const childCtx = {
24
+ ...ctx,
25
+ readOnly,
26
+ depth: ctx.depth + 1,
27
+ ...field.helpDisplay ? { layout: { ...ctx.layout, help: field.helpDisplay } } : {}
28
+ };
29
+ function commit(next) {
30
+ field.onChange(next);
31
+ }
32
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
33
+ items.map((item, i) => {
34
+ var _a, _b;
35
+ const summary = ((_a = field.itemSummary) == null ? void 0 : _a.call(field, { item, index: i })) ?? jsonSchemaFormItemSummary.itemSummaryFor({ item, index: i, spec, itemSchema });
36
+ return /* @__PURE__ */ jsxRuntime.jsxs(
37
+ "article",
38
+ {
39
+ className: utils.cn(
40
+ "group rounded-lg border border-l-4 border-border shadow-sm",
41
+ summary.glyph ? jsonSchemaFormTone.TONE_EDGE_CLASS[summary.glyph.tone] : void 0
42
+ ),
43
+ children: [
44
+ /* @__PURE__ */ jsxRuntime.jsxs("header", { className: "flex items-center gap-2 rounded-tr-md border-b border-border bg-muted/40 px-3 py-2", children: [
45
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-5 shrink-0 text-center font-mono text-xs text-muted-foreground", children: i + 1 }),
46
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-sm font-semibold", children: summary.title }),
47
+ /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormItemRow.ItemBadge, { badge: summary.badge }),
48
+ summary.flagged && /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormItemRow.RequiredMark, {}),
49
+ summary.summary && /* @__PURE__ */ jsxRuntime.jsx("code", { className: "truncate font-mono text-xs text-muted-foreground", children: summary.summary }),
50
+ !readOnly && /* @__PURE__ */ jsxRuntime.jsx(
51
+ jsonSchemaFormItemRow.ItemRowActions,
52
+ {
53
+ index: i,
54
+ title: summary.title,
55
+ size: ctx.size,
56
+ ...i > 0 ? { onUp: () => commit(jsonSchemaFormUtils.moveItem(items, i, i - 1)) } : {},
57
+ ...i < items.length - 1 ? { onDown: () => commit(jsonSchemaFormUtils.moveItem(items, i, i + 1)) } : {},
58
+ onDuplicate: () => commit(jsonSchemaFormUtils.duplicateIndex(items, i)),
59
+ onRemove: () => commit(jsonSchemaFormUtils.removeIndex(items, i))
60
+ }
61
+ )
62
+ ] }),
63
+ /* @__PURE__ */ jsxRuntime.jsx("div", { className: "p-3", children: ((_b = ctx.render.renderFieldNodes(
64
+ {
65
+ key: `${field.key}[${i}]`,
66
+ prop: itemSchema,
67
+ required: false,
68
+ value: item,
69
+ onChange: (next) => commit(jsonSchemaFormUtils.setIndex(items, i, next)),
70
+ instancePath: jsonSchemaFormErrors.appendInstancePath(ctx.instancePath, i)
71
+ },
72
+ childCtx
73
+ )) == null ? void 0 : _b.value) ?? null })
74
+ ]
75
+ },
76
+ i
77
+ );
78
+ }),
79
+ items.length === 0 && emptyCopy && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs leading-snug text-muted-foreground", children: emptyCopy }),
80
+ !readOnly && /* @__PURE__ */ jsxRuntime.jsxs(
81
+ button.Button,
82
+ {
83
+ type: "button",
84
+ variant: "outline",
85
+ className: utils.cn("gap-1.5 self-start", jsonSchemaFormSize.inputSizeClass[ctx.size]),
86
+ onClick: () => commit([...items, jsonSchemaFormUtils.seedFromSchema(itemSchema)]),
87
+ children: [
88
+ /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-sm" }),
89
+ jsonSchemaFormItemSummary.addItemLabel(spec)
90
+ ]
91
+ }
92
+ )
93
+ ] });
94
+ }
95
+ exports.CardsArray = CardsArray;
96
+ //# sourceMappingURL=json-schema-form-cards-array.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-cards-array.cjs","sources":["../../src/components/json-schema-form-cards-array.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd } from \"../icons\";\nimport { Button } from \"./button\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n addItemLabel,\n emptyItemsCopy,\n itemSummaryFor,\n resolveItemSpec,\n} from \"./json-schema-form-item-summary\";\nimport { ItemBadge, ItemRowActions, RequiredMark } from \"./json-schema-form-item-row\";\nimport { inputSizeClass } from \"./json-schema-form-size\";\nimport { TONE_EDGE_CLASS } from \"./json-schema-form-tone\";\nimport {\n duplicateIndex,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, RenderContext } from \"./json-schema-form-types\";\n\n// CardsArray renders an object-item array as a stack of titled cards: every\n// item stays open, but each one is headed by what it actually is rather than\n// \"Item 3\", and carries the item type's hue on its left edge so a long stack is\n// scannable at a glance.\n//\n// It is the everything-visible counterpart to AccordionArray. Both read the\n// same `x-item` summary, so a consumer switches between them by changing\n// `x-array-display` alone — no second vocabulary to learn.\nexport function CardsArray({\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 spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);\n const emptyCopy = emptyItemsCopy(spec, field.schema);\n // The array's help mode governs its whole subtree, exactly as it does for the\n // accordion: a card whose fields each carry a permanent two-line paragraph is\n // back to the height the card layout exists to reclaim.\n const childCtx: RenderContext = {\n ...ctx,\n readOnly,\n depth: ctx.depth + 1,\n ...(field.helpDisplay ? { layout: { ...ctx.layout, help: field.helpDisplay } } : {}),\n };\n\n function commit(next: unknown[]) {\n field.onChange(next);\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {items.map((item, i) => {\n const summary =\n field.itemSummary?.({ item, index: i }) ??\n itemSummaryFor({ item, index: i, spec, itemSchema });\n return (\n <article\n key={i}\n className={cn(\n \"group rounded-lg border border-l-4 border-border shadow-sm\",\n summary.glyph ? TONE_EDGE_CLASS[summary.glyph.tone] : undefined,\n )}\n >\n <header className=\"flex items-center gap-2 rounded-tr-md border-b border-border bg-muted/40 px-3 py-2\">\n <span className=\"w-5 shrink-0 text-center font-mono text-xs text-muted-foreground\">\n {i + 1}\n </span>\n <span className=\"shrink-0 text-sm font-semibold\">{summary.title}</span>\n <ItemBadge badge={summary.badge} />\n {summary.flagged && <RequiredMark />}\n {summary.summary && (\n <code className=\"truncate font-mono text-xs text-muted-foreground\">\n {summary.summary}\n </code>\n )}\n {!readOnly && (\n <ItemRowActions\n index={i}\n title={summary.title}\n size={ctx.size}\n {...(i > 0 ? { onUp: () => commit(moveItem(items, i, i - 1)) } : {})}\n {...(i < items.length - 1\n ? { onDown: () => commit(moveItem(items, i, i + 1)) }\n : {})}\n onDuplicate={() => commit(duplicateIndex(items, i))}\n onRemove={() => commit(removeIndex(items, i))}\n />\n )}\n </header>\n <div className=\"p-3\">\n {/* Recurse through the shared pipeline so consumer pre/post\n extensions still apply to the item and its properties — and so\n the item's own x-columns reaches its ObjectControl. */}\n {ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => commit(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n )?.value ?? null}\n </div>\n </article>\n );\n })}\n {items.length === 0 && emptyCopy && (\n <p className=\"text-xs leading-snug text-muted-foreground\">{emptyCopy}</p>\n )}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5 self-start\", inputSizeClass[ctx.size])}\n onClick={() => commit([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n {addItemLabel(spec)}\n </Button>\n )}\n </div>\n );\n}\n"],"names":["resolveItemSpec","emptyItemsCopy","jsxs","itemSummaryFor","cn","TONE_EDGE_CLASS","jsx","ItemBadge","RequiredMark","ItemRowActions","moveItem","duplicateIndex","removeIndex","setIndex","appendInstancePath","Button","inputSizeClass","seedFromSchema","Icon","UiAdd","addItemLabel"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import { FieldControl, RenderContext } from './json-schema-form-types';
2
+ export declare function CardsArray({ field, ctx, readOnly, }: {
3
+ field: FieldControl;
4
+ ctx: RenderContext;
5
+ readOnly: boolean;
6
+ }): import("react/jsx-runtime").JSX.Element;
7
+ //# sourceMappingURL=json-schema-form-cards-array.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-cards-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-cards-array.tsx"],"names":[],"mappings":"AAqBA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAU5E,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,GAAG,EACH,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB,2CA8FA"}
@@ -0,0 +1,96 @@
1
+ import { jsxs, jsx } from "react/jsx-runtime";
2
+ import { cn } from "../lib/utils.js";
3
+ import { Icon } from "../data/Icon.js";
4
+ import { Button } from "./button.js";
5
+ import { appendInstancePath } from "./json-schema-form-errors.js";
6
+ import { resolveItemSpec, emptyItemsCopy, itemSummaryFor, addItemLabel } from "./json-schema-form-item-summary.js";
7
+ import { ItemBadge, RequiredMark, ItemRowActions } from "./json-schema-form-item-row.js";
8
+ import { inputSizeClass } from "./json-schema-form-size.js";
9
+ import { TONE_EDGE_CLASS } from "./json-schema-form-tone.js";
10
+ import { removeIndex, duplicateIndex, moveItem, setIndex, seedFromSchema } from "./json-schema-form-utils.js";
11
+ import { UiAdd } from "../icons/components/UiAdd.js";
12
+ function CardsArray({
13
+ field,
14
+ ctx,
15
+ readOnly
16
+ }) {
17
+ const items = Array.isArray(field.value) ? field.value : [];
18
+ const itemSchema = field.itemSchema ?? { type: "object" };
19
+ const spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);
20
+ const emptyCopy = emptyItemsCopy(spec, field.schema);
21
+ const childCtx = {
22
+ ...ctx,
23
+ readOnly,
24
+ depth: ctx.depth + 1,
25
+ ...field.helpDisplay ? { layout: { ...ctx.layout, help: field.helpDisplay } } : {}
26
+ };
27
+ function commit(next) {
28
+ field.onChange(next);
29
+ }
30
+ return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
31
+ items.map((item, i) => {
32
+ var _a, _b;
33
+ const summary = ((_a = field.itemSummary) == null ? void 0 : _a.call(field, { item, index: i })) ?? itemSummaryFor({ item, index: i, spec, itemSchema });
34
+ return /* @__PURE__ */ jsxs(
35
+ "article",
36
+ {
37
+ className: cn(
38
+ "group rounded-lg border border-l-4 border-border shadow-sm",
39
+ summary.glyph ? TONE_EDGE_CLASS[summary.glyph.tone] : void 0
40
+ ),
41
+ children: [
42
+ /* @__PURE__ */ jsxs("header", { className: "flex items-center gap-2 rounded-tr-md border-b border-border bg-muted/40 px-3 py-2", children: [
43
+ /* @__PURE__ */ jsx("span", { className: "w-5 shrink-0 text-center font-mono text-xs text-muted-foreground", children: i + 1 }),
44
+ /* @__PURE__ */ jsx("span", { className: "shrink-0 text-sm font-semibold", children: summary.title }),
45
+ /* @__PURE__ */ jsx(ItemBadge, { badge: summary.badge }),
46
+ summary.flagged && /* @__PURE__ */ jsx(RequiredMark, {}),
47
+ summary.summary && /* @__PURE__ */ jsx("code", { className: "truncate font-mono text-xs text-muted-foreground", children: summary.summary }),
48
+ !readOnly && /* @__PURE__ */ jsx(
49
+ ItemRowActions,
50
+ {
51
+ index: i,
52
+ title: summary.title,
53
+ size: ctx.size,
54
+ ...i > 0 ? { onUp: () => commit(moveItem(items, i, i - 1)) } : {},
55
+ ...i < items.length - 1 ? { onDown: () => commit(moveItem(items, i, i + 1)) } : {},
56
+ onDuplicate: () => commit(duplicateIndex(items, i)),
57
+ onRemove: () => commit(removeIndex(items, i))
58
+ }
59
+ )
60
+ ] }),
61
+ /* @__PURE__ */ jsx("div", { className: "p-3", children: ((_b = ctx.render.renderFieldNodes(
62
+ {
63
+ key: `${field.key}[${i}]`,
64
+ prop: itemSchema,
65
+ required: false,
66
+ value: item,
67
+ onChange: (next) => commit(setIndex(items, i, next)),
68
+ instancePath: appendInstancePath(ctx.instancePath, i)
69
+ },
70
+ childCtx
71
+ )) == null ? void 0 : _b.value) ?? null })
72
+ ]
73
+ },
74
+ i
75
+ );
76
+ }),
77
+ items.length === 0 && emptyCopy && /* @__PURE__ */ jsx("p", { className: "text-xs leading-snug text-muted-foreground", children: emptyCopy }),
78
+ !readOnly && /* @__PURE__ */ jsxs(
79
+ Button,
80
+ {
81
+ type: "button",
82
+ variant: "outline",
83
+ className: cn("gap-1.5 self-start", inputSizeClass[ctx.size]),
84
+ onClick: () => commit([...items, seedFromSchema(itemSchema)]),
85
+ children: [
86
+ /* @__PURE__ */ jsx(Icon, { icon: UiAdd, className: "text-sm" }),
87
+ addItemLabel(spec)
88
+ ]
89
+ }
90
+ )
91
+ ] });
92
+ }
93
+ export {
94
+ CardsArray
95
+ };
96
+ //# sourceMappingURL=json-schema-form-cards-array.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-cards-array.js","sources":["../../src/components/json-schema-form-cards-array.tsx"],"sourcesContent":["import { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd } from \"../icons\";\nimport { Button } from \"./button\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n addItemLabel,\n emptyItemsCopy,\n itemSummaryFor,\n resolveItemSpec,\n} from \"./json-schema-form-item-summary\";\nimport { ItemBadge, ItemRowActions, RequiredMark } from \"./json-schema-form-item-row\";\nimport { inputSizeClass } from \"./json-schema-form-size\";\nimport { TONE_EDGE_CLASS } from \"./json-schema-form-tone\";\nimport {\n duplicateIndex,\n moveItem,\n removeIndex,\n seedFromSchema,\n setIndex,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, RenderContext } from \"./json-schema-form-types\";\n\n// CardsArray renders an object-item array as a stack of titled cards: every\n// item stays open, but each one is headed by what it actually is rather than\n// \"Item 3\", and carries the item type's hue on its left edge so a long stack is\n// scannable at a glance.\n//\n// It is the everything-visible counterpart to AccordionArray. Both read the\n// same `x-item` summary, so a consumer switches between them by changing\n// `x-array-display` alone — no second vocabulary to learn.\nexport function CardsArray({\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 spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);\n const emptyCopy = emptyItemsCopy(spec, field.schema);\n // The array's help mode governs its whole subtree, exactly as it does for the\n // accordion: a card whose fields each carry a permanent two-line paragraph is\n // back to the height the card layout exists to reclaim.\n const childCtx: RenderContext = {\n ...ctx,\n readOnly,\n depth: ctx.depth + 1,\n ...(field.helpDisplay ? { layout: { ...ctx.layout, help: field.helpDisplay } } : {}),\n };\n\n function commit(next: unknown[]) {\n field.onChange(next);\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {items.map((item, i) => {\n const summary =\n field.itemSummary?.({ item, index: i }) ??\n itemSummaryFor({ item, index: i, spec, itemSchema });\n return (\n <article\n key={i}\n className={cn(\n \"group rounded-lg border border-l-4 border-border shadow-sm\",\n summary.glyph ? TONE_EDGE_CLASS[summary.glyph.tone] : undefined,\n )}\n >\n <header className=\"flex items-center gap-2 rounded-tr-md border-b border-border bg-muted/40 px-3 py-2\">\n <span className=\"w-5 shrink-0 text-center font-mono text-xs text-muted-foreground\">\n {i + 1}\n </span>\n <span className=\"shrink-0 text-sm font-semibold\">{summary.title}</span>\n <ItemBadge badge={summary.badge} />\n {summary.flagged && <RequiredMark />}\n {summary.summary && (\n <code className=\"truncate font-mono text-xs text-muted-foreground\">\n {summary.summary}\n </code>\n )}\n {!readOnly && (\n <ItemRowActions\n index={i}\n title={summary.title}\n size={ctx.size}\n {...(i > 0 ? { onUp: () => commit(moveItem(items, i, i - 1)) } : {})}\n {...(i < items.length - 1\n ? { onDown: () => commit(moveItem(items, i, i + 1)) }\n : {})}\n onDuplicate={() => commit(duplicateIndex(items, i))}\n onRemove={() => commit(removeIndex(items, i))}\n />\n )}\n </header>\n <div className=\"p-3\">\n {/* Recurse through the shared pipeline so consumer pre/post\n extensions still apply to the item and its properties — and so\n the item's own x-columns reaches its ObjectControl. */}\n {ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => commit(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n )?.value ?? null}\n </div>\n </article>\n );\n })}\n {items.length === 0 && emptyCopy && (\n <p className=\"text-xs leading-snug text-muted-foreground\">{emptyCopy}</p>\n )}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5 self-start\", inputSizeClass[ctx.size])}\n onClick={() => commit([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n {addItemLabel(spec)}\n </Button>\n )}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}