@flanksource/clicky-ui 0.3.40 → 0.3.41

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 (342) hide show
  1. package/README.md +24 -0
  2. package/dist/ai.cjs +10 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +10 -0
  5. package/dist/ai.js.map +1 -1
  6. package/dist/components/AccordionList.cjs +5 -1
  7. package/dist/components/AccordionList.cjs.map +1 -1
  8. package/dist/components/AccordionList.d.ts +3 -1
  9. package/dist/components/AccordionList.d.ts.map +1 -1
  10. package/dist/components/AccordionList.js +5 -1
  11. package/dist/components/AccordionList.js.map +1 -1
  12. package/dist/components/JsonSchemaForm.cjs +9 -4
  13. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  14. package/dist/components/JsonSchemaForm.d.ts +1 -1
  15. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  16. package/dist/components/JsonSchemaForm.js +8 -3
  17. package/dist/components/JsonSchemaForm.js.map +1 -1
  18. package/dist/components/json-schema-form-accordion-array.cjs +3 -1
  19. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  20. package/dist/components/json-schema-form-accordion-array.d.ts +4 -1
  21. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  22. package/dist/components/json-schema-form-accordion-array.js +3 -1
  23. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  24. package/dist/components/json-schema-form-array-view.cjs +63 -0
  25. package/dist/components/json-schema-form-array-view.cjs.map +1 -0
  26. package/dist/components/json-schema-form-array-view.d.ts +21 -0
  27. package/dist/components/json-schema-form-array-view.d.ts.map +1 -0
  28. package/dist/components/json-schema-form-array-view.js +63 -0
  29. package/dist/components/json-schema-form-array-view.js.map +1 -0
  30. package/dist/components/json-schema-form-array.cjs +3 -7
  31. package/dist/components/json-schema-form-array.cjs.map +1 -1
  32. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  33. package/dist/components/json-schema-form-array.js +3 -7
  34. package/dist/components/json-schema-form-array.js.map +1 -1
  35. package/dist/components/json-schema-form-conditionals.cjs +67 -0
  36. package/dist/components/json-schema-form-conditionals.cjs.map +1 -0
  37. package/dist/components/json-schema-form-conditionals.d.ts +9 -0
  38. package/dist/components/json-schema-form-conditionals.d.ts.map +1 -0
  39. package/dist/components/json-schema-form-conditionals.js +67 -0
  40. package/dist/components/json-schema-form-conditionals.js.map +1 -0
  41. package/dist/components/json-schema-form-defaults.cjs +68 -0
  42. package/dist/components/json-schema-form-defaults.cjs.map +1 -0
  43. package/dist/components/json-schema-form-defaults.d.ts +4 -0
  44. package/dist/components/json-schema-form-defaults.d.ts.map +1 -0
  45. package/dist/components/json-schema-form-defaults.js +68 -0
  46. package/dist/components/json-schema-form-defaults.js.map +1 -0
  47. package/dist/components/json-schema-form-errors.cjs +49 -31
  48. package/dist/components/json-schema-form-errors.cjs.map +1 -1
  49. package/dist/components/json-schema-form-errors.d.ts +4 -2
  50. package/dist/components/json-schema-form-errors.d.ts.map +1 -1
  51. package/dist/components/json-schema-form-errors.js +51 -33
  52. package/dist/components/json-schema-form-errors.js.map +1 -1
  53. package/dist/components/json-schema-form-filter.cjs +2 -1
  54. package/dist/components/json-schema-form-filter.cjs.map +1 -1
  55. package/dist/components/json-schema-form-filter.js +2 -1
  56. package/dist/components/json-schema-form-filter.js.map +1 -1
  57. package/dist/components/json-schema-form-item-summary.cjs +6 -2
  58. package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
  59. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
  60. package/dist/components/json-schema-form-item-summary.js +6 -2
  61. package/dist/components/json-schema-form-item-summary.js.map +1 -1
  62. package/dist/components/json-schema-form-layout.cjs +28 -19
  63. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  64. package/dist/components/json-schema-form-layout.d.ts +8 -6
  65. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  66. package/dist/components/json-schema-form-layout.js +29 -20
  67. package/dist/components/json-schema-form-layout.js.map +1 -1
  68. package/dist/components/json-schema-form-listener-paths.cjs +52 -0
  69. package/dist/components/json-schema-form-listener-paths.cjs.map +1 -0
  70. package/dist/components/json-schema-form-listener-paths.d.ts +10 -0
  71. package/dist/components/json-schema-form-listener-paths.d.ts.map +1 -0
  72. package/dist/components/json-schema-form-listener-paths.js +52 -0
  73. package/dist/components/json-schema-form-listener-paths.js.map +1 -0
  74. package/dist/components/json-schema-form-listener-types.d.ts +22 -0
  75. package/dist/components/json-schema-form-listener-types.d.ts.map +1 -0
  76. package/dist/components/json-schema-form-listeners.cjs +250 -0
  77. package/dist/components/json-schema-form-listeners.cjs.map +1 -0
  78. package/dist/components/json-schema-form-listeners.d.ts +13 -0
  79. package/dist/components/json-schema-form-listeners.d.ts.map +1 -0
  80. package/dist/components/json-schema-form-listeners.js +250 -0
  81. package/dist/components/json-schema-form-listeners.js.map +1 -0
  82. package/dist/components/json-schema-form-object-array-view.cjs +62 -0
  83. package/dist/components/json-schema-form-object-array-view.cjs.map +1 -0
  84. package/dist/components/json-schema-form-object-array-view.d.ts +14 -0
  85. package/dist/components/json-schema-form-object-array-view.d.ts.map +1 -0
  86. package/dist/components/json-schema-form-object-array-view.js +62 -0
  87. package/dist/components/json-schema-form-object-array-view.js.map +1 -0
  88. package/dist/components/json-schema-form-object.cjs +3 -0
  89. package/dist/components/json-schema-form-object.cjs.map +1 -1
  90. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  91. package/dist/components/json-schema-form-object.js +3 -0
  92. package/dist/components/json-schema-form-object.js.map +1 -1
  93. package/dist/components/json-schema-form-render.cjs +17 -9
  94. package/dist/components/json-schema-form-render.cjs.map +1 -1
  95. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  96. package/dist/components/json-schema-form-render.js +19 -11
  97. package/dist/components/json-schema-form-render.js.map +1 -1
  98. package/dist/components/json-schema-form-resolve.cjs +6 -99
  99. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  100. package/dist/components/json-schema-form-resolve.d.ts +1 -8
  101. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  102. package/dist/components/json-schema-form-resolve.js +5 -98
  103. package/dist/components/json-schema-form-resolve.js.map +1 -1
  104. package/dist/components/json-schema-form-runtime-types.d.ts +15 -0
  105. package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
  106. package/dist/components/json-schema-form-table-array.cjs +67 -16
  107. package/dist/components/json-schema-form-table-array.cjs.map +1 -1
  108. package/dist/components/json-schema-form-table-array.d.ts +4 -1
  109. package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
  110. package/dist/components/json-schema-form-table-array.js +70 -19
  111. package/dist/components/json-schema-form-table-array.js.map +1 -1
  112. package/dist/components/json-schema-form-types.d.ts +16 -0
  113. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  114. package/dist/components/json-schema-form-utils.cjs +7 -1
  115. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  116. package/dist/components/json-schema-form-utils.d.ts +2 -1
  117. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  118. package/dist/components/json-schema-form-utils.js +7 -1
  119. package/dist/components/json-schema-form-utils.js.map +1 -1
  120. package/dist/components.cjs +3 -2
  121. package/dist/components.cjs.map +1 -1
  122. package/dist/components.d.ts +3 -2
  123. package/dist/components.d.ts.map +1 -1
  124. package/dist/components.js +2 -1
  125. package/dist/components.js.map +1 -1
  126. package/dist/data/DataTable.cjs +9 -3
  127. package/dist/data/DataTable.cjs.map +1 -1
  128. package/dist/data/DataTable.d.ts +6 -0
  129. package/dist/data/DataTable.d.ts.map +1 -1
  130. package/dist/data/DataTable.js +9 -3
  131. package/dist/data/DataTable.js.map +1 -1
  132. package/dist/data/FixtureEditor/FixtureEditor.cjs +43 -24
  133. package/dist/data/FixtureEditor/FixtureEditor.cjs.map +1 -1
  134. package/dist/data/FixtureEditor/FixtureEditor.d.ts.map +1 -1
  135. package/dist/data/FixtureEditor/FixtureEditor.js +43 -24
  136. package/dist/data/FixtureEditor/FixtureEditor.js.map +1 -1
  137. package/dist/data/Tree.cjs +10 -2
  138. package/dist/data/Tree.cjs.map +1 -1
  139. package/dist/data/Tree.d.ts +6 -1
  140. package/dist/data/Tree.d.ts.map +1 -1
  141. package/dist/data/Tree.js +10 -2
  142. package/dist/data/Tree.js.map +1 -1
  143. package/dist/data/ai/SessionInspector.cjs +143 -167
  144. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  145. package/dist/data/ai/SessionInspector.collection-types.d.ts +5 -0
  146. package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
  147. package/dist/data/ai/SessionInspector.collection.cjs +18 -5
  148. package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
  149. package/dist/data/ai/SessionInspector.collection.d.ts +2 -0
  150. package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -1
  151. package/dist/data/ai/SessionInspector.collection.fixtures.d.ts +6 -0
  152. package/dist/data/ai/SessionInspector.collection.fixtures.d.ts.map +1 -0
  153. package/dist/data/ai/SessionInspector.collection.js +18 -5
  154. package/dist/data/ai/SessionInspector.collection.js.map +1 -1
  155. package/dist/data/ai/SessionInspector.d.ts +24 -2
  156. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  157. package/dist/data/ai/SessionInspector.hierarchy-state.cjs +105 -7
  158. package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -1
  159. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +12 -1
  160. package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -1
  161. package/dist/data/ai/SessionInspector.hierarchy-state.js +107 -9
  162. package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -1
  163. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  164. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  165. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  166. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  167. package/dist/data/ai/SessionInspector.js +144 -168
  168. package/dist/data/ai/SessionInspector.js.map +1 -1
  169. package/dist/data/ai/SessionInspector.legacy.cjs +116 -0
  170. package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -0
  171. package/dist/data/ai/SessionInspector.legacy.d.ts +19 -0
  172. package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -0
  173. package/dist/data/ai/SessionInspector.legacy.js +116 -0
  174. package/dist/data/ai/SessionInspector.legacy.js.map +1 -0
  175. package/dist/data/ai/SessionInspector.panels.cjs +3 -0
  176. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
  177. package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
  178. package/dist/data/ai/SessionInspector.panels.js +3 -0
  179. package/dist/data/ai/SessionInspector.panels.js.map +1 -1
  180. package/dist/data/ai/SessionInspector.plan.cjs +29 -12
  181. package/dist/data/ai/SessionInspector.plan.cjs.map +1 -1
  182. package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -1
  183. package/dist/data/ai/SessionInspector.plan.js +30 -13
  184. package/dist/data/ai/SessionInspector.plan.js.map +1 -1
  185. package/dist/data/ai/SessionInspector.remote-view.cjs +44 -0
  186. package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -0
  187. package/dist/data/ai/SessionInspector.remote-view.d.ts +11 -0
  188. package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -0
  189. package/dist/data/ai/SessionInspector.remote-view.js +44 -0
  190. package/dist/data/ai/SessionInspector.remote-view.js.map +1 -0
  191. package/dist/data/ai/SessionInspector.remote.cjs +275 -0
  192. package/dist/data/ai/SessionInspector.remote.cjs.map +1 -0
  193. package/dist/data/ai/SessionInspector.remote.d.ts +57 -0
  194. package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -0
  195. package/dist/data/ai/SessionInspector.remote.js +275 -0
  196. package/dist/data/ai/SessionInspector.remote.js.map +1 -0
  197. package/dist/data/ai/SessionInspector.summary.cjs +0 -156
  198. package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
  199. package/dist/data/ai/SessionInspector.summary.d.ts +0 -3
  200. package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
  201. package/dist/data/ai/SessionInspector.summary.js +2 -158
  202. package/dist/data/ai/SessionInspector.summary.js.map +1 -1
  203. package/dist/data/ai/SessionInspector.tab-state.cjs +15 -0
  204. package/dist/data/ai/SessionInspector.tab-state.cjs.map +1 -0
  205. package/dist/data/ai/SessionInspector.tab-state.d.ts +3 -0
  206. package/dist/data/ai/SessionInspector.tab-state.d.ts.map +1 -0
  207. package/dist/data/ai/SessionInspector.tab-state.js +15 -0
  208. package/dist/data/ai/SessionInspector.tab-state.js.map +1 -0
  209. package/dist/data/ai/SessionInspector.tabs.model.cjs +31 -18
  210. package/dist/data/ai/SessionInspector.tabs.model.cjs.map +1 -1
  211. package/dist/data/ai/SessionInspector.tabs.model.d.ts +3 -1
  212. package/dist/data/ai/SessionInspector.tabs.model.d.ts.map +1 -1
  213. package/dist/data/ai/SessionInspector.tabs.model.js +32 -19
  214. package/dist/data/ai/SessionInspector.tabs.model.js.map +1 -1
  215. package/dist/data/ai/SessionInspector.verification.cjs +53 -0
  216. package/dist/data/ai/SessionInspector.verification.cjs.map +1 -0
  217. package/dist/data/ai/SessionInspector.verification.d.ts +7 -0
  218. package/dist/data/ai/SessionInspector.verification.d.ts.map +1 -0
  219. package/dist/data/ai/SessionInspector.verification.js +53 -0
  220. package/dist/data/ai/SessionInspector.verification.js.map +1 -0
  221. package/dist/data/ai/SessionViewer.model.cjs +7 -1
  222. package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
  223. package/dist/data/ai/SessionViewer.model.d.ts +21 -3
  224. package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
  225. package/dist/data/ai/SessionViewer.model.js +7 -1
  226. package/dist/data/ai/SessionViewer.model.js.map +1 -1
  227. package/dist/data/ai/SessionViewer.unified.d.ts +13 -0
  228. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  229. package/dist/data/ai/index.d.ts +3 -1
  230. package/dist/data/ai/index.d.ts.map +1 -1
  231. package/dist/data/version-info.cjs +3 -3
  232. package/dist/data/version-info.js +3 -3
  233. package/dist/devtools/useDebugStream.cjs +5 -1
  234. package/dist/devtools/useDebugStream.cjs.map +1 -1
  235. package/dist/devtools/useDebugStream.d.ts.map +1 -1
  236. package/dist/devtools/useDebugStream.js +6 -2
  237. package/dist/devtools/useDebugStream.js.map +1 -1
  238. package/dist/hooks/event-source-provider.cjs +9 -0
  239. package/dist/hooks/event-source-provider.cjs.map +1 -0
  240. package/dist/hooks/event-source-provider.d.ts +15 -0
  241. package/dist/hooks/event-source-provider.d.ts.map +1 -0
  242. package/dist/hooks/event-source-provider.js +9 -0
  243. package/dist/hooks/event-source-provider.js.map +1 -0
  244. package/dist/hooks/event-source.cjs +11 -0
  245. package/dist/hooks/event-source.cjs.map +1 -0
  246. package/dist/hooks/event-source.d.ts +22 -0
  247. package/dist/hooks/event-source.d.ts.map +1 -0
  248. package/dist/hooks/event-source.js +11 -0
  249. package/dist/hooks/event-source.js.map +1 -0
  250. package/dist/hooks/use-log-tail.cjs +5 -1
  251. package/dist/hooks/use-log-tail.cjs.map +1 -1
  252. package/dist/hooks/use-log-tail.d.ts.map +1 -1
  253. package/dist/hooks/use-log-tail.js +5 -1
  254. package/dist/hooks/use-log-tail.js.map +1 -1
  255. package/dist/hooks/use-prompts.cjs +5 -1
  256. package/dist/hooks/use-prompts.cjs.map +1 -1
  257. package/dist/hooks/use-prompts.d.ts.map +1 -1
  258. package/dist/hooks/use-prompts.js +6 -2
  259. package/dist/hooks/use-prompts.js.map +1 -1
  260. package/dist/hooks/use-task-run.cjs +9 -2
  261. package/dist/hooks/use-task-run.cjs.map +1 -1
  262. package/dist/hooks/use-task-run.d.ts.map +1 -1
  263. package/dist/hooks/use-task-run.js +10 -3
  264. package/dist/hooks/use-task-run.js.map +1 -1
  265. package/dist/hooks.cjs +4 -0
  266. package/dist/hooks.cjs.map +1 -1
  267. package/dist/hooks.d.ts +2 -0
  268. package/dist/hooks.d.ts.map +1 -1
  269. package/dist/hooks.js +4 -0
  270. package/dist/hooks.js.map +1 -1
  271. package/dist/icons/programmingCatalog.cjs +34 -34
  272. package/dist/icons/programmingCatalog.cjs.map +1 -1
  273. package/dist/icons/programmingCatalog.js +34 -34
  274. package/dist/icons/programmingCatalog.js.map +1 -1
  275. package/dist/index.cjs +9 -2
  276. package/dist/index.cjs.map +1 -1
  277. package/dist/index.js +8 -1
  278. package/dist/index.js.map +1 -1
  279. package/dist/monaco/MonacoEditor.cjs +4 -1
  280. package/dist/monaco/MonacoEditor.cjs.map +1 -1
  281. package/dist/monaco/MonacoEditor.d.ts +1 -1
  282. package/dist/monaco/MonacoEditor.d.ts.map +1 -1
  283. package/dist/monaco/MonacoEditor.js +4 -1
  284. package/dist/monaco/MonacoEditor.js.map +1 -1
  285. package/dist/monaco/types.d.ts +2 -1
  286. package/dist/monaco/types.d.ts.map +1 -1
  287. package/dist/overlay/CommandPalette.cjs +14 -4
  288. package/dist/overlay/CommandPalette.cjs.map +1 -1
  289. package/dist/overlay/CommandPalette.d.ts +5 -1
  290. package/dist/overlay/CommandPalette.d.ts.map +1 -1
  291. package/dist/overlay/CommandPalette.js +14 -4
  292. package/dist/overlay/CommandPalette.js.map +1 -1
  293. package/dist/overlay/CommandPaletteList.cjs +5 -0
  294. package/dist/overlay/CommandPaletteList.cjs.map +1 -1
  295. package/dist/overlay/CommandPaletteList.d.ts +4 -2
  296. package/dist/overlay/CommandPaletteList.d.ts.map +1 -1
  297. package/dist/overlay/CommandPaletteList.js +5 -0
  298. package/dist/overlay/CommandPaletteList.js.map +1 -1
  299. package/dist/overlay/DropdownMenu.cjs +1 -0
  300. package/dist/overlay/DropdownMenu.cjs.map +1 -1
  301. package/dist/overlay/DropdownMenu.js +1 -0
  302. package/dist/overlay/DropdownMenu.js.map +1 -1
  303. package/dist/rpc/OperationCatalog.cjs +29 -26
  304. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  305. package/dist/rpc/OperationCatalog.d.ts +9 -1
  306. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  307. package/dist/rpc/OperationCatalog.js +29 -26
  308. package/dist/rpc/OperationCatalog.js.map +1 -1
  309. package/dist/rpc/OperationEntityContextPicker.cjs +62 -256
  310. package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
  311. package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
  312. package/dist/rpc/OperationEntityContextPicker.js +64 -258
  313. package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
  314. package/dist/rpc/OperationEntityPicker.cjs +185 -0
  315. package/dist/rpc/OperationEntityPicker.cjs.map +1 -0
  316. package/dist/rpc/OperationEntityPicker.d.ts +51 -0
  317. package/dist/rpc/OperationEntityPicker.d.ts.map +1 -0
  318. package/dist/rpc/OperationEntityPicker.js +185 -0
  319. package/dist/rpc/OperationEntityPicker.js.map +1 -0
  320. package/dist/rpc/OperationEntityPicker.model.cjs +39 -0
  321. package/dist/rpc/OperationEntityPicker.model.cjs.map +1 -0
  322. package/dist/rpc/OperationEntityPicker.model.d.ts +27 -0
  323. package/dist/rpc/OperationEntityPicker.model.d.ts.map +1 -0
  324. package/dist/rpc/OperationEntityPicker.model.js +39 -0
  325. package/dist/rpc/OperationEntityPicker.model.js.map +1 -0
  326. package/dist/rpc/operationCatalogRowSelection.cjs +85 -0
  327. package/dist/rpc/operationCatalogRowSelection.cjs.map +1 -0
  328. package/dist/rpc/operationCatalogRowSelection.d.ts +57 -0
  329. package/dist/rpc/operationCatalogRowSelection.d.ts.map +1 -0
  330. package/dist/rpc/operationCatalogRowSelection.js +85 -0
  331. package/dist/rpc/operationCatalogRowSelection.js.map +1 -0
  332. package/dist/rpc/operationEntityPicker.fixtures.d.ts +13 -0
  333. package/dist/rpc/operationEntityPicker.fixtures.d.ts.map +1 -0
  334. package/dist/rpc.cjs +2 -0
  335. package/dist/rpc.cjs.map +1 -1
  336. package/dist/rpc.d.ts +2 -0
  337. package/dist/rpc.d.ts.map +1 -1
  338. package/dist/rpc.js +2 -0
  339. package/dist/rpc.js.map +1 -1
  340. package/dist/styles.css +1 -1
  341. package/package.json +4 -1
  342. package/schemas/json-schema-form.schema.json +566 -0
@@ -0,0 +1,250 @@
1
+ import { isPlainObject } from "../lib/collections.js";
2
+ import { effectiveProperties, matchesIf, evaluatePredicate } from "./json-schema-form-conditionals.js";
3
+ import { cloneSchemaDefault } from "./json-schema-form-defaults.js";
4
+ import { patchTarget, isPathTarget, targetSegments } from "./json-schema-form-listener-paths.js";
5
+ const LOCAL_ACTIONS = ["require", "optional", "reset", "set"];
6
+ const STATE_FLAGS = [
7
+ ["hide", "x-hidden", true],
8
+ ["show", "x-hidden", false],
9
+ ["disable", "x-disabled", true],
10
+ ["enable", "x-disabled", false]
11
+ ];
12
+ const CONTRADICTIONS = [
13
+ ["hide", "show"],
14
+ ["enable", "disable"],
15
+ ["require", "optional"]
16
+ ];
17
+ const LIST_NAMES = ["hide", "show", "enable", "disable", "require", "optional", "reset"];
18
+ const PATCH_DENIED = {
19
+ ...Object.fromEntries(
20
+ ["type", "properties", "items", "additionalProperties", "patternProperties", "allOf", "anyOf", "oneOf", "if", "then", "else", "not", "$ref", "$defs"].map(
21
+ (keyword) => [keyword, "it changes the field's shape; use an allOf branch"]
22
+ )
23
+ ),
24
+ required: "use require/optional",
25
+ default: "a patch changes presentation, not values; use set/reset",
26
+ const: "a patch changes presentation, not values; use set/reset",
27
+ "x-on-change": "listeners cannot be patched in",
28
+ "x-on-load": "listeners cannot be patched in"
29
+ };
30
+ function applyListenerState(schema, value, options) {
31
+ const { properties, required } = effectiveProperties(schema, value);
32
+ const requiredSet = new Set(required);
33
+ const known = declaredKeys(schema);
34
+ const bound = [
35
+ ...loadListenersOf(schema, value),
36
+ ...Object.entries(properties).flatMap(
37
+ ([key, prop]) => listenersOf(key, prop).map((listener) => ({ listener, source: changeSource(key) }))
38
+ )
39
+ ];
40
+ for (const { listener, source } of bound) {
41
+ const actions = selectActions({ listener, source, self: value, known, options });
42
+ for (const [name, keyword, flag] of STATE_FLAGS) {
43
+ for (const target of list(actions, name)) {
44
+ patchTarget({ properties, value, target, apply: (leaf) => ({ ...leaf, [keyword]: flag }) });
45
+ }
46
+ }
47
+ for (const target of list(actions, "require")) {
48
+ if (properties[target]) requiredSet.add(target);
49
+ }
50
+ for (const target of list(actions, "optional")) requiredSet.delete(target);
51
+ for (const [target, keywords] of Object.entries(actions.patch ?? {})) {
52
+ patchTarget({ properties, value, target, apply: (leaf) => ({ ...leaf, ...keywords }) });
53
+ }
54
+ }
55
+ return { properties, required: [...requiredSet] };
56
+ }
57
+ function loadListenersOf(schema, value) {
58
+ var _a;
59
+ const bound = loadListenersAt(schema["x-on-load"], "#/x-on-load");
60
+ for (const [index, clause] of (schema.allOf ?? []).entries()) {
61
+ if (clause.if === void 0 && clause.then === void 0) {
62
+ bound.push(...loadListenersAt(clause["x-on-load"], `#/allOf/${index}/x-on-load`));
63
+ continue;
64
+ }
65
+ const branch = matchesIf(clause.if, value) ? "then" : "else";
66
+ bound.push(...loadListenersAt((_a = clause[branch]) == null ? void 0 : _a["x-on-load"], `#/allOf/${index}/${branch}/x-on-load`));
67
+ }
68
+ return bound;
69
+ }
70
+ function loadListenersAt(listeners, pointer) {
71
+ if (listeners === void 0) return [];
72
+ if (!Array.isArray(listeners)) {
73
+ throw new Error(`x-on-load at ${pointer} must be an array of listeners, got ${typeof listeners}`);
74
+ }
75
+ return listeners.map((listener, index) => ({
76
+ listener,
77
+ source: { label: `x-on-load at ${pointer}/${index}`, key: "", load: true }
78
+ }));
79
+ }
80
+ function changeSource(key) {
81
+ return { label: `x-on-change on "${key}"`, key, load: false };
82
+ }
83
+ function applyChangeEffects(schema, edit) {
84
+ let current = { ...edit.value, [edit.key]: edit.next };
85
+ const known = declaredKeys(schema);
86
+ const fired = /* @__PURE__ */ new Set();
87
+ const queue = [edit.key];
88
+ for (let source = queue.shift(); source !== void 0; source = queue.shift()) {
89
+ if (fired.has(source)) continue;
90
+ fired.add(source);
91
+ const { properties } = effectiveProperties(schema, current);
92
+ const options = {
93
+ root: edit.root === edit.value ? current : edit.root,
94
+ ...edit.evaluate ? { evaluate: edit.evaluate } : {}
95
+ };
96
+ for (const listener of listenersOf(source, properties[source])) {
97
+ const actions = selectActions({ listener, source: changeSource(source), self: current, known, options });
98
+ for (const [target, nextValue] of valueChanges(actions, properties)) {
99
+ if (Object.is(current[target], nextValue)) continue;
100
+ current = { ...current };
101
+ if (nextValue === void 0) delete current[target];
102
+ else current[target] = nextValue;
103
+ queue.push(target);
104
+ }
105
+ }
106
+ }
107
+ return current;
108
+ }
109
+ function valueChanges(actions, properties) {
110
+ return [
111
+ ...list(actions, "reset").map((target) => {
112
+ var _a;
113
+ const fallback = (_a = properties[target]) == null ? void 0 : _a.default;
114
+ return [target, fallback === void 0 ? void 0 : cloneSchemaDefault(fallback)];
115
+ }),
116
+ ...Object.entries(actions.set ?? {}).map(([target, v]) => [target, cloneSchemaDefault(v)])
117
+ ];
118
+ }
119
+ function listenersOf(key, prop) {
120
+ const listeners = prop == null ? void 0 : prop["x-on-change"];
121
+ if (listeners === void 0) return [];
122
+ if (!Array.isArray(listeners)) {
123
+ throw new Error(`"${key}": x-on-change must be an array of listeners, got ${typeof listeners}`);
124
+ }
125
+ return listeners;
126
+ }
127
+ function selectActions({
128
+ listener,
129
+ source,
130
+ self,
131
+ known,
132
+ options
133
+ }) {
134
+ validateActions(source, listener, known);
135
+ if (listener.else) validateActions(source, listener.else, known);
136
+ return listenerHolds(listener, source, self, options) ? listener : listener.else ?? {};
137
+ }
138
+ function listenerHolds(listener, { label, key, load }, self, options) {
139
+ if (listener.when === void 0) return true;
140
+ const { expr, ...predicate } = listener.when;
141
+ const hasPredicate = Object.keys(predicate).length > 0;
142
+ const subject = load ? self : self[key];
143
+ if (!hasPredicate && expr === void 0) {
144
+ throw new Error(`${label}: when states nothing it can evaluate`);
145
+ }
146
+ if (expr !== void 0 && typeof expr !== "string") {
147
+ throw new Error(`${label}: when.expr must be a string, got ${typeof expr}`);
148
+ }
149
+ if (expr !== void 0 && !options.evaluate) {
150
+ throw new Error(`${label}: when.expr "${expr}" needs the form's expressionEvaluator`);
151
+ }
152
+ if (hasPredicate) {
153
+ const holds = evaluatePredicate(predicate, subject);
154
+ if (holds === void 0) {
155
+ throw new Error(`${label}: when states nothing it can evaluate (${JSON.stringify(predicate)})`);
156
+ }
157
+ if (!holds) return false;
158
+ }
159
+ if (expr === void 0 || !options.evaluate) return true;
160
+ const result = options.evaluate({ expr, key, value: subject, self, root: options.root });
161
+ if (typeof result !== "boolean") {
162
+ throw new Error(`${label}: expressionEvaluator returned ${typeof result} for "${expr}", expected boolean`);
163
+ }
164
+ return result;
165
+ }
166
+ function validateActions(source, actions, known) {
167
+ const { label } = source;
168
+ if (actions.set !== void 0 && !isPlainObject(actions.set)) {
169
+ throw new Error(`${label}: set must be an object of target → value`);
170
+ }
171
+ if (source.load) {
172
+ const local = LOCAL_ACTIONS.find((name) => actions[name] !== void 0);
173
+ if (local) {
174
+ throw new Error(`${label}: ${local} is not allowed in x-on-load, which only derives state (hide/show/enable/disable/patch)`);
175
+ }
176
+ }
177
+ const setKeys = Object.keys(actions.set ?? {});
178
+ for (const name of LOCAL_ACTIONS) {
179
+ const targets = name === "set" ? setKeys : list(actions, name);
180
+ const path = targets.find(isPathTarget);
181
+ if (path !== void 0) {
182
+ throw new Error(`${label}: ${name} "${path}" cannot take a path; value and required actions act on sibling keys only`);
183
+ }
184
+ }
185
+ for (const target of [...LIST_NAMES.flatMap((name) => list(actions, name)), ...setKeys]) {
186
+ validateTarget(label, target, known);
187
+ }
188
+ const pairs = [
189
+ ...CONTRADICTIONS.map(([a, b]) => [a, list(actions, a), b, list(actions, b)]),
190
+ ["reset", list(actions, "reset"), "set", setKeys]
191
+ ];
192
+ for (const [a, left, b, right] of pairs) {
193
+ const clash = left.find((target) => right.includes(target));
194
+ if (clash !== void 0) {
195
+ throw new Error(`${label}: both ${a} and ${b} "${clash}"`);
196
+ }
197
+ }
198
+ validatePatch(label, actions, known);
199
+ }
200
+ function validateTarget(label, target, known) {
201
+ if (isPathTarget(target) && known.has(target)) {
202
+ throw new Error(`${label}: target "${target}" is both a declared key and a path`);
203
+ }
204
+ const [first = ""] = targetSegments(label, target);
205
+ if (!known.has(first)) throw new Error(`${label}: unknown target "${target}"`);
206
+ }
207
+ function validatePatch(label, actions, known) {
208
+ const patch = actions.patch;
209
+ if (patch === void 0) return;
210
+ if (!isPlainObject(patch)) {
211
+ throw new Error(`${label}: patch must be an object of target → keywords`);
212
+ }
213
+ for (const [target, keywords] of Object.entries(patch)) {
214
+ validateTarget(label, target, known);
215
+ if (!isPlainObject(keywords)) {
216
+ throw new Error(`${label}: patch "${target}" must be an object of keywords`);
217
+ }
218
+ for (const keyword of Object.keys(keywords)) {
219
+ const denied = PATCH_DENIED[keyword];
220
+ if (denied) throw new Error(`${label}: patch "${target}" may not set ${keyword} (${denied})`);
221
+ }
222
+ for (const [verb, keyword] of STATE_FLAGS) {
223
+ if (keyword in keywords && list(actions, verb).includes(target)) {
224
+ throw new Error(`${label}: both ${verb} and patch ${keyword} on "${target}"`);
225
+ }
226
+ }
227
+ }
228
+ }
229
+ function list(actions, name) {
230
+ const targets = actions[name];
231
+ if (targets === void 0) return [];
232
+ if (!Array.isArray(targets)) {
233
+ throw new Error(`x-on-change: ${name} must be an array of property keys, got ${typeof targets}`);
234
+ }
235
+ return targets;
236
+ }
237
+ function declaredKeys(schema) {
238
+ const keys = new Set(Object.keys(schema.properties ?? {}));
239
+ for (const clause of schema.allOf ?? []) {
240
+ for (const branch of [clause, clause.then, clause.else]) {
241
+ for (const key of Object.keys((branch == null ? void 0 : branch.properties) ?? {})) keys.add(key);
242
+ }
243
+ }
244
+ return keys;
245
+ }
246
+ export {
247
+ applyChangeEffects,
248
+ applyListenerState
249
+ };
250
+ //# sourceMappingURL=json-schema-form-listeners.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-listeners.js","sources":["../../src/components/json-schema-form-listeners.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport {\n effectiveProperties,\n evaluatePredicate,\n matchesIf,\n type EffectiveProperties,\n} from \"./json-schema-form-conditionals\";\nimport { cloneSchemaDefault } from \"./json-schema-form-defaults\";\nimport { isPathTarget, patchTarget, targetSegments } from \"./json-schema-form-listener-paths\";\nimport type {\n ChangeActions,\n ChangeListener,\n ExpressionEvaluator,\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\n// `x-on-change` listeners: a property names what happens to its siblings when\n// its value is, or becomes, something. `x-on-load` listeners: an object names\n// the state its properties start in. See ChangeActions for the split between\n// derived state actions and transitional value actions.\n\nexport interface ListenerOptions {\n root: Record<string, unknown>;\n evaluate?: ExpressionEvaluator;\n}\n\n// ListenerSource says where a listener came from. `label` prefixes every error\n// it raises; `key` is the property whose value `when` reads (and the\n// evaluator's `key`) — for x-on-load, \"\" and the object itself.\ninterface ListenerSource {\n label: string;\n key: string;\n load: boolean;\n}\n\ninterface BoundListener {\n listener: ChangeListener;\n source: ListenerSource;\n}\n\ntype ListName = \"hide\" | \"show\" | \"enable\" | \"disable\" | \"require\" | \"optional\" | \"reset\";\n\n// Actions that write values or required-ness: they act on sibling keys only\n// (never a path), and have no place in x-on-load, which only derives state.\nconst LOCAL_ACTIONS: (\"require\" | \"optional\" | \"reset\" | \"set\")[] = [\"require\", \"optional\", \"reset\", \"set\"];\n\nconst STATE_FLAGS: [ListName, \"x-hidden\" | \"x-disabled\", boolean][] = [\n [\"hide\", \"x-hidden\", true],\n [\"show\", \"x-hidden\", false],\n [\"disable\", \"x-disabled\", true],\n [\"enable\", \"x-disabled\", false],\n];\n\nconst CONTRADICTIONS: [ListName, ListName][] = [\n [\"hide\", \"show\"],\n [\"enable\", \"disable\"],\n [\"require\", \"optional\"],\n];\n\nconst LIST_NAMES: ListName[] = [\"hide\", \"show\", \"enable\", \"disable\", \"require\", \"optional\", \"reset\"];\n\n// Keywords a `patch` may not set, with the tool that does the job instead.\nconst PATCH_DENIED: Record<string, string> = {\n ...Object.fromEntries(\n [\"type\", \"properties\", \"items\", \"additionalProperties\", \"patternProperties\", \"allOf\", \"anyOf\", \"oneOf\", \"if\", \"then\", \"else\", \"not\", \"$ref\", \"$defs\"].map(\n (keyword) => [keyword, \"it changes the field's shape; use an allOf branch\"],\n ),\n ),\n required: \"use require/optional\",\n default: \"a patch changes presentation, not values; use set/reset\",\n const: \"a patch changes presentation, not values; use set/reset\",\n \"x-on-change\": \"listeners cannot be patched in\",\n \"x-on-load\": \"listeners cannot be patched in\",\n};\n\n// applyListenerState is effectiveProperties plus the state actions of every\n// listener, evaluated against the current value: first the object's\n// `x-on-load` listeners, then each property's `x-on-change` listeners — load,\n// then change, the order the events happen in. A listener is applied after\n// `allOf`, so it wins over a branch; later listeners win over earlier ones. A\n// target the current shape does not declare stays absent. Property schemas are\n// cloned, never mutated.\nexport function applyListenerState(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n options: ListenerOptions,\n): EffectiveProperties {\n const { properties, required } = effectiveProperties(schema, value);\n const requiredSet = new Set(required);\n const known = declaredKeys(schema);\n const bound: BoundListener[] = [\n ...loadListenersOf(schema, value),\n ...Object.entries(properties).flatMap(([key, prop]) =>\n listenersOf(key, prop).map((listener) => ({ listener, source: changeSource(key) })),\n ),\n ];\n for (const { listener, source } of bound) {\n const actions = selectActions({ listener, source, self: value, known, options });\n for (const [name, keyword, flag] of STATE_FLAGS) {\n for (const target of list(actions, name)) {\n patchTarget({ properties, value, target, apply: (leaf) => ({ ...leaf, [keyword]: flag }) });\n }\n }\n for (const target of list(actions, \"require\")) {\n if (properties[target]) requiredSet.add(target);\n }\n for (const target of list(actions, \"optional\")) requiredSet.delete(target);\n for (const [target, keywords] of Object.entries(actions.patch ?? {})) {\n patchTarget({ properties, value, target, apply: (leaf) => ({ ...leaf, ...keywords }) });\n }\n }\n return { properties, required: [...requiredSet] };\n}\n\n// loadListenersOf collects an object's `x-on-load` listeners in order: the\n// schema's own, then each `allOf` member's — an unconditional member's own, or\n// those of the `then`/`else` branch that applies, selected exactly as\n// effectiveProperties selects the branch it merges.\nfunction loadListenersOf(schema: JsonSchemaObject, value: Record<string, unknown>): BoundListener[] {\n const bound = loadListenersAt(schema[\"x-on-load\"], \"#/x-on-load\");\n for (const [index, clause] of (schema.allOf ?? []).entries()) {\n if (clause.if === undefined && clause.then === undefined) {\n bound.push(...loadListenersAt(clause[\"x-on-load\"], `#/allOf/${index}/x-on-load`));\n continue;\n }\n const branch = matchesIf(clause.if, value) ? \"then\" : \"else\";\n bound.push(...loadListenersAt(clause[branch]?.[\"x-on-load\"], `#/allOf/${index}/${branch}/x-on-load`));\n }\n return bound;\n}\n\nfunction loadListenersAt(listeners: unknown, pointer: string): BoundListener[] {\n if (listeners === undefined) return [];\n if (!Array.isArray(listeners)) {\n throw new Error(`x-on-load at ${pointer} must be an array of listeners, got ${typeof listeners}`);\n }\n return listeners.map((listener: ChangeListener, index) => ({\n listener,\n source: { label: `x-on-load at ${pointer}/${index}`, key: \"\", load: true },\n }));\n}\n\nfunction changeSource(key: string): ListenerSource {\n return { label: `x-on-change on \"${key}\"`, key, load: false };\n}\n\n// applyChangeEffects commits `next` at `key` and runs the value actions\n// (reset/set) of that key's listeners against the post-edit object. A target\n// whose value actually changes fires its own listeners in turn; each key fires\n// at most once per commit, so a cycle ends. When `root` is the edited object\n// itself (the top level), expressions see the post-edit value as root too.\nexport function applyChangeEffects(\n schema: JsonSchemaObject,\n edit: ListenerOptions & { value: Record<string, unknown>; key: string; next: unknown },\n): Record<string, unknown> {\n let current: Record<string, unknown> = { ...edit.value, [edit.key]: edit.next };\n const known = declaredKeys(schema);\n const fired = new Set<string>();\n const queue = [edit.key];\n for (let source = queue.shift(); source !== undefined; source = queue.shift()) {\n if (fired.has(source)) continue;\n fired.add(source);\n const { properties } = effectiveProperties(schema, current);\n const options: ListenerOptions = {\n root: edit.root === edit.value ? current : edit.root,\n ...(edit.evaluate ? { evaluate: edit.evaluate } : {}),\n };\n for (const listener of listenersOf(source, properties[source])) {\n const actions = selectActions({ listener, source: changeSource(source), self: current, known, options });\n for (const [target, nextValue] of valueChanges(actions, properties)) {\n if (Object.is(current[target], nextValue)) continue;\n current = { ...current };\n if (nextValue === undefined) delete current[target];\n else current[target] = nextValue;\n queue.push(target);\n }\n }\n }\n return current;\n}\n\nfunction valueChanges(\n actions: ChangeActions,\n properties: Record<string, JsonSchemaProperty>,\n): [string, unknown][] {\n return [\n ...list(actions, \"reset\").map((target): [string, unknown] => {\n const fallback = properties[target]?.default;\n return [target, fallback === undefined ? undefined : cloneSchemaDefault(fallback)];\n }),\n ...Object.entries(actions.set ?? {}).map(([target, v]): [string, unknown] => [target, cloneSchemaDefault(v)]),\n ];\n}\n\nfunction listenersOf(key: string, prop: JsonSchemaProperty | undefined): ChangeListener[] {\n const listeners = prop?.[\"x-on-change\"];\n if (listeners === undefined) return [];\n if (!Array.isArray(listeners)) {\n throw new Error(`\"${key}\": x-on-change must be an array of listeners, got ${typeof listeners}`);\n }\n return listeners;\n}\n\n// selectActions validates both branches of a listener (so a schema error\n// surfaces whichever branch is live) and returns the one that applies now.\nfunction selectActions({\n listener,\n source,\n self,\n known,\n options,\n}: {\n listener: ChangeListener;\n source: ListenerSource;\n self: Record<string, unknown>;\n known: Set<string>;\n options: ListenerOptions;\n}): ChangeActions {\n validateActions(source, listener, known);\n if (listener.else) validateActions(source, listener.else, known);\n return listenerHolds(listener, source, self, options) ? listener : (listener.else ?? {});\n}\n\n// listenerHolds evaluates `when` against the source's subject: the property's\n// value for x-on-change, the object itself for x-on-load.\nfunction listenerHolds(\n listener: ChangeListener,\n { label, key, load }: ListenerSource,\n self: Record<string, unknown>,\n options: ListenerOptions,\n): boolean {\n if (listener.when === undefined) return true;\n const { expr, ...predicate } = listener.when;\n const hasPredicate = Object.keys(predicate).length > 0;\n const subject = load ? self : self[key];\n if (!hasPredicate && expr === undefined) {\n throw new Error(`${label}: when states nothing it can evaluate`);\n }\n if (expr !== undefined && typeof expr !== \"string\") {\n throw new Error(`${label}: when.expr must be a string, got ${typeof expr}`);\n }\n if (expr !== undefined && !options.evaluate) {\n throw new Error(`${label}: when.expr \"${expr}\" needs the form's expressionEvaluator`);\n }\n if (hasPredicate) {\n const holds = evaluatePredicate(predicate, subject);\n if (holds === undefined) {\n throw new Error(`${label}: when states nothing it can evaluate (${JSON.stringify(predicate)})`);\n }\n if (!holds) return false;\n }\n if (expr === undefined || !options.evaluate) return true;\n const result: unknown = options.evaluate({ expr, key, value: subject, self, root: options.root });\n if (typeof result !== \"boolean\") {\n throw new Error(`${label}: expressionEvaluator returned ${typeof result} for \"${expr}\", expected boolean`);\n }\n return result;\n}\n\nfunction validateActions(source: ListenerSource, actions: ChangeActions, known: Set<string>): void {\n const { label } = source;\n if (actions.set !== undefined && !isPlainObject(actions.set)) {\n throw new Error(`${label}: set must be an object of target → value`);\n }\n if (source.load) {\n const local = LOCAL_ACTIONS.find((name) => actions[name] !== undefined);\n if (local) {\n throw new Error(`${label}: ${local} is not allowed in x-on-load, which only derives state (hide/show/enable/disable/patch)`);\n }\n }\n const setKeys = Object.keys(actions.set ?? {});\n for (const name of LOCAL_ACTIONS) {\n const targets = name === \"set\" ? setKeys : list(actions, name);\n const path = targets.find(isPathTarget);\n if (path !== undefined) {\n throw new Error(`${label}: ${name} \"${path}\" cannot take a path; value and required actions act on sibling keys only`);\n }\n }\n for (const target of [...LIST_NAMES.flatMap((name) => list(actions, name)), ...setKeys]) {\n validateTarget(label, target, known);\n }\n const pairs: [string, string[], string, string[]][] = [\n ...CONTRADICTIONS.map(([a, b]): [string, string[], string, string[]] => [a, list(actions, a), b, list(actions, b)]),\n [\"reset\", list(actions, \"reset\"), \"set\", setKeys],\n ];\n for (const [a, left, b, right] of pairs) {\n const clash = left.find((target) => right.includes(target));\n if (clash !== undefined) {\n throw new Error(`${label}: both ${a} and ${b} \"${clash}\"`);\n }\n }\n validatePatch(label, actions, known);\n}\n\n// validateTarget checks a target's grammar and that its first segment is a key\n// the schema declares in some branch.\nfunction validateTarget(label: string, target: string, known: Set<string>): void {\n if (isPathTarget(target) && known.has(target)) {\n throw new Error(`${label}: target \"${target}\" is both a declared key and a path`);\n }\n const [first = \"\"] = targetSegments(label, target);\n if (!known.has(first)) throw new Error(`${label}: unknown target \"${target}\"`);\n}\n\n// validatePatch checks a `patch`: an object of keyword objects on known\n// targets, no denied keyword, and no keyword a verb in the same actions sets.\nfunction validatePatch(label: string, actions: ChangeActions, known: Set<string>): void {\n const patch: unknown = actions.patch;\n if (patch === undefined) return;\n if (!isPlainObject(patch)) {\n throw new Error(`${label}: patch must be an object of target → keywords`);\n }\n for (const [target, keywords] of Object.entries(patch)) {\n validateTarget(label, target, known);\n if (!isPlainObject(keywords)) {\n throw new Error(`${label}: patch \"${target}\" must be an object of keywords`);\n }\n for (const keyword of Object.keys(keywords)) {\n const denied = PATCH_DENIED[keyword];\n if (denied) throw new Error(`${label}: patch \"${target}\" may not set ${keyword} (${denied})`);\n }\n for (const [verb, keyword] of STATE_FLAGS) {\n if (keyword in keywords && list(actions, verb).includes(target)) {\n throw new Error(`${label}: both ${verb} and patch ${keyword} on \"${target}\"`);\n }\n }\n }\n}\n\nfunction list(actions: ChangeActions, name: ListName): string[] {\n const targets = actions[name];\n if (targets === undefined) return [];\n if (!Array.isArray(targets)) {\n throw new Error(`x-on-change: ${name} must be an array of property keys, got ${typeof targets}`);\n }\n return targets;\n}\n\n// Every key the schema can declare in any branch — a listener may target a\n// field that only exists while some `allOf` branch is live.\nfunction declaredKeys(schema: JsonSchemaObject): Set<string> {\n const keys = new Set(Object.keys(schema.properties ?? {}));\n for (const clause of schema.allOf ?? []) {\n for (const branch of [clause, clause.then, clause.else]) {\n for (const key of Object.keys(branch?.properties ?? {})) keys.add(key);\n }\n }\n return keys;\n}\n"],"names":[],"mappings":";;;;AA6CA,MAAM,gBAA8D,CAAC,WAAW,YAAY,SAAS,KAAK;AAE1G,MAAM,cAAgE;AAAA,EACpE,CAAC,QAAQ,YAAY,IAAI;AAAA,EACzB,CAAC,QAAQ,YAAY,KAAK;AAAA,EAC1B,CAAC,WAAW,cAAc,IAAI;AAAA,EAC9B,CAAC,UAAU,cAAc,KAAK;AAChC;AAEA,MAAM,iBAAyC;AAAA,EAC7C,CAAC,QAAQ,MAAM;AAAA,EACf,CAAC,UAAU,SAAS;AAAA,EACpB,CAAC,WAAW,UAAU;AACxB;AAEA,MAAM,aAAyB,CAAC,QAAQ,QAAQ,UAAU,WAAW,WAAW,YAAY,OAAO;AAGnG,MAAM,eAAuC;AAAA,EAC3C,GAAG,OAAO;AAAA,IACR,CAAC,QAAQ,cAAc,SAAS,wBAAwB,qBAAqB,SAAS,SAAS,SAAS,MAAM,QAAQ,QAAQ,OAAO,QAAQ,OAAO,EAAE;AAAA,MACpJ,CAAC,YAAY,CAAC,SAAS,mDAAmD;AAAA,IAAA;AAAA,EAC5E;AAAA,EAEF,UAAU;AAAA,EACV,SAAS;AAAA,EACT,OAAO;AAAA,EACP,eAAe;AAAA,EACf,aAAa;AACf;AASO,SAAS,mBACd,QACA,OACA,SACqB;AACrB,QAAM,EAAE,YAAY,SAAA,IAAa,oBAAoB,QAAQ,KAAK;AAClE,QAAM,cAAc,IAAI,IAAI,QAAQ;AACpC,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,QAAyB;AAAA,IAC7B,GAAG,gBAAgB,QAAQ,KAAK;AAAA,IAChC,GAAG,OAAO,QAAQ,UAAU,EAAE;AAAA,MAAQ,CAAC,CAAC,KAAK,IAAI,MAC/C,YAAY,KAAK,IAAI,EAAE,IAAI,CAAC,cAAc,EAAE,UAAU,QAAQ,aAAa,GAAG,IAAI;AAAA,IAAA;AAAA,EACpF;AAEF,aAAW,EAAE,UAAU,OAAA,KAAY,OAAO;AACxC,UAAM,UAAU,cAAc,EAAE,UAAU,QAAQ,MAAM,OAAO,OAAO,SAAS;AAC/E,eAAW,CAAC,MAAM,SAAS,IAAI,KAAK,aAAa;AAC/C,iBAAW,UAAU,KAAK,SAAS,IAAI,GAAG;AACxC,oBAAY,EAAE,YAAY,OAAO,QAAQ,OAAO,CAAC,UAAU,EAAE,GAAG,MAAM,CAAC,OAAO,GAAG,KAAA,IAAS;AAAA,MAC5F;AAAA,IACF;AACA,eAAW,UAAU,KAAK,SAAS,SAAS,GAAG;AAC7C,UAAI,WAAW,MAAM,EAAG,aAAY,IAAI,MAAM;AAAA,IAChD;AACA,eAAW,UAAU,KAAK,SAAS,UAAU,EAAG,aAAY,OAAO,MAAM;AACzE,eAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,QAAQ,QAAQ,SAAS,CAAA,CAAE,GAAG;AACpE,kBAAY,EAAE,YAAY,OAAO,QAAQ,OAAO,CAAC,UAAU,EAAE,GAAG,MAAM,GAAG,SAAA,IAAa;AAAA,IACxF;AAAA,EACF;AACA,SAAO,EAAE,YAAY,UAAU,CAAC,GAAG,WAAW,EAAA;AAChD;AAMA,SAAS,gBAAgB,QAA0B,OAAiD;;AAClG,QAAM,QAAQ,gBAAgB,OAAO,WAAW,GAAG,aAAa;AAChE,aAAW,CAAC,OAAO,MAAM,MAAM,OAAO,SAAS,IAAI,WAAW;AAC5D,QAAI,OAAO,OAAO,UAAa,OAAO,SAAS,QAAW;AACxD,YAAM,KAAK,GAAG,gBAAgB,OAAO,WAAW,GAAG,WAAW,KAAK,YAAY,CAAC;AAChF;AAAA,IACF;AACA,UAAM,SAAS,UAAU,OAAO,IAAI,KAAK,IAAI,SAAS;AACtD,UAAM,KAAK,GAAG,iBAAgB,YAAO,MAAM,MAAb,mBAAiB,cAAc,WAAW,KAAK,IAAI,MAAM,YAAY,CAAC;AAAA,EACtG;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,WAAoB,SAAkC;AAC7E,MAAI,cAAc,OAAW,QAAO,CAAA;AACpC,MAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,UAAM,IAAI,MAAM,gBAAgB,OAAO,uCAAuC,OAAO,SAAS,EAAE;AAAA,EAClG;AACA,SAAO,UAAU,IAAI,CAAC,UAA0B,WAAW;AAAA,IACzD;AAAA,IACA,QAAQ,EAAE,OAAO,gBAAgB,OAAO,IAAI,KAAK,IAAI,KAAK,IAAI,MAAM,KAAA;AAAA,EAAK,EACzE;AACJ;AAEA,SAAS,aAAa,KAA6B;AACjD,SAAO,EAAE,OAAO,mBAAmB,GAAG,KAAK,KAAK,MAAM,MAAA;AACxD;AAOO,SAAS,mBACd,QACA,MACyB;AACzB,MAAI,UAAmC,EAAE,GAAG,KAAK,OAAO,CAAC,KAAK,GAAG,GAAG,KAAK,KAAA;AACzE,QAAM,QAAQ,aAAa,MAAM;AACjC,QAAM,4BAAY,IAAA;AAClB,QAAM,QAAQ,CAAC,KAAK,GAAG;AACvB,WAAS,SAAS,MAAM,MAAA,GAAS,WAAW,QAAW,SAAS,MAAM,SAAS;AAC7E,QAAI,MAAM,IAAI,MAAM,EAAG;AACvB,UAAM,IAAI,MAAM;AAChB,UAAM,EAAE,WAAA,IAAe,oBAAoB,QAAQ,OAAO;AAC1D,UAAM,UAA2B;AAAA,MAC/B,MAAM,KAAK,SAAS,KAAK,QAAQ,UAAU,KAAK;AAAA,MAChD,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAA,IAAa,CAAA;AAAA,IAAC;AAErD,eAAW,YAAY,YAAY,QAAQ,WAAW,MAAM,CAAC,GAAG;AAC9D,YAAM,UAAU,cAAc,EAAE,UAAU,QAAQ,aAAa,MAAM,GAAG,MAAM,SAAS,OAAO,QAAA,CAAS;AACvG,iBAAW,CAAC,QAAQ,SAAS,KAAK,aAAa,SAAS,UAAU,GAAG;AACnE,YAAI,OAAO,GAAG,QAAQ,MAAM,GAAG,SAAS,EAAG;AAC3C,kBAAU,EAAE,GAAG,QAAA;AACf,YAAI,cAAc,OAAW,QAAO,QAAQ,MAAM;AAAA,YAC7C,SAAQ,MAAM,IAAI;AACvB,cAAM,KAAK,MAAM;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,aACP,SACA,YACqB;AACrB,SAAO;AAAA,IACL,GAAG,KAAK,SAAS,OAAO,EAAE,IAAI,CAAC,WAA8B;;AAC3D,YAAM,YAAW,gBAAW,MAAM,MAAjB,mBAAoB;AACrC,aAAO,CAAC,QAAQ,aAAa,SAAY,SAAY,mBAAmB,QAAQ,CAAC;AAAA,IACnF,CAAC;AAAA,IACD,GAAG,OAAO,QAAQ,QAAQ,OAAO,CAAA,CAAE,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,MAAyB,CAAC,QAAQ,mBAAmB,CAAC,CAAC,CAAC;AAAA,EAAA;AAEhH;AAEA,SAAS,YAAY,KAAa,MAAwD;AACxF,QAAM,YAAY,6BAAO;AACzB,MAAI,cAAc,OAAW,QAAO,CAAA;AACpC,MAAI,CAAC,MAAM,QAAQ,SAAS,GAAG;AAC7B,UAAM,IAAI,MAAM,IAAI,GAAG,qDAAqD,OAAO,SAAS,EAAE;AAAA,EAChG;AACA,SAAO;AACT;AAIA,SAAS,cAAc;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAMkB;AAChB,kBAAgB,QAAQ,UAAU,KAAK;AACvC,MAAI,SAAS,KAAM,iBAAgB,QAAQ,SAAS,MAAM,KAAK;AAC/D,SAAO,cAAc,UAAU,QAAQ,MAAM,OAAO,IAAI,WAAY,SAAS,QAAQ,CAAA;AACvF;AAIA,SAAS,cACP,UACA,EAAE,OAAO,KAAK,KAAA,GACd,MACA,SACS;AACT,MAAI,SAAS,SAAS,OAAW,QAAO;AACxC,QAAM,EAAE,MAAM,GAAG,UAAA,IAAc,SAAS;AACxC,QAAM,eAAe,OAAO,KAAK,SAAS,EAAE,SAAS;AACrD,QAAM,UAAU,OAAO,OAAO,KAAK,GAAG;AACtC,MAAI,CAAC,gBAAgB,SAAS,QAAW;AACvC,UAAM,IAAI,MAAM,GAAG,KAAK,uCAAuC;AAAA,EACjE;AACA,MAAI,SAAS,UAAa,OAAO,SAAS,UAAU;AAClD,UAAM,IAAI,MAAM,GAAG,KAAK,qCAAqC,OAAO,IAAI,EAAE;AAAA,EAC5E;AACA,MAAI,SAAS,UAAa,CAAC,QAAQ,UAAU;AAC3C,UAAM,IAAI,MAAM,GAAG,KAAK,gBAAgB,IAAI,wCAAwC;AAAA,EACtF;AACA,MAAI,cAAc;AAChB,UAAM,QAAQ,kBAAkB,WAAW,OAAO;AAClD,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,MAAM,GAAG,KAAK,0CAA0C,KAAK,UAAU,SAAS,CAAC,GAAG;AAAA,IAChG;AACA,QAAI,CAAC,MAAO,QAAO;AAAA,EACrB;AACA,MAAI,SAAS,UAAa,CAAC,QAAQ,SAAU,QAAO;AACpD,QAAM,SAAkB,QAAQ,SAAS,EAAE,MAAM,KAAK,OAAO,SAAS,MAAM,MAAM,QAAQ,KAAA,CAAM;AAChG,MAAI,OAAO,WAAW,WAAW;AAC/B,UAAM,IAAI,MAAM,GAAG,KAAK,kCAAkC,OAAO,MAAM,SAAS,IAAI,qBAAqB;AAAA,EAC3G;AACA,SAAO;AACT;AAEA,SAAS,gBAAgB,QAAwB,SAAwB,OAA0B;AACjG,QAAM,EAAE,UAAU;AAClB,MAAI,QAAQ,QAAQ,UAAa,CAAC,cAAc,QAAQ,GAAG,GAAG;AAC5D,UAAM,IAAI,MAAM,GAAG,KAAK,2CAA2C;AAAA,EACrE;AACA,MAAI,OAAO,MAAM;AACf,UAAM,QAAQ,cAAc,KAAK,CAAC,SAAS,QAAQ,IAAI,MAAM,MAAS;AACtE,QAAI,OAAO;AACT,YAAM,IAAI,MAAM,GAAG,KAAK,KAAK,KAAK,yFAAyF;AAAA,IAC7H;AAAA,EACF;AACA,QAAM,UAAU,OAAO,KAAK,QAAQ,OAAO,CAAA,CAAE;AAC7C,aAAW,QAAQ,eAAe;AAChC,UAAM,UAAU,SAAS,QAAQ,UAAU,KAAK,SAAS,IAAI;AAC7D,UAAM,OAAO,QAAQ,KAAK,YAAY;AACtC,QAAI,SAAS,QAAW;AACtB,YAAM,IAAI,MAAM,GAAG,KAAK,KAAK,IAAI,KAAK,IAAI,2EAA2E;AAAA,IACvH;AAAA,EACF;AACA,aAAW,UAAU,CAAC,GAAG,WAAW,QAAQ,CAAC,SAAS,KAAK,SAAS,IAAI,CAAC,GAAG,GAAG,OAAO,GAAG;AACvF,mBAAe,OAAO,QAAQ,KAAK;AAAA,EACrC;AACA,QAAM,QAAgD;AAAA,IACpD,GAAG,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,MAA4C,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC;AAAA,IAClH,CAAC,SAAS,KAAK,SAAS,OAAO,GAAG,OAAO,OAAO;AAAA,EAAA;AAElD,aAAW,CAAC,GAAG,MAAM,GAAG,KAAK,KAAK,OAAO;AACvC,UAAM,QAAQ,KAAK,KAAK,CAAC,WAAW,MAAM,SAAS,MAAM,CAAC;AAC1D,QAAI,UAAU,QAAW;AACvB,YAAM,IAAI,MAAM,GAAG,KAAK,UAAU,CAAC,QAAQ,CAAC,KAAK,KAAK,GAAG;AAAA,IAC3D;AAAA,EACF;AACA,gBAAc,OAAO,SAAS,KAAK;AACrC;AAIA,SAAS,eAAe,OAAe,QAAgB,OAA0B;AAC/E,MAAI,aAAa,MAAM,KAAK,MAAM,IAAI,MAAM,GAAG;AAC7C,UAAM,IAAI,MAAM,GAAG,KAAK,aAAa,MAAM,qCAAqC;AAAA,EAClF;AACA,QAAM,CAAC,QAAQ,EAAE,IAAI,eAAe,OAAO,MAAM;AACjD,MAAI,CAAC,MAAM,IAAI,KAAK,EAAG,OAAM,IAAI,MAAM,GAAG,KAAK,qBAAqB,MAAM,GAAG;AAC/E;AAIA,SAAS,cAAc,OAAe,SAAwB,OAA0B;AACtF,QAAM,QAAiB,QAAQ;AAC/B,MAAI,UAAU,OAAW;AACzB,MAAI,CAAC,cAAc,KAAK,GAAG;AACzB,UAAM,IAAI,MAAM,GAAG,KAAK,gDAAgD;AAAA,EAC1E;AACA,aAAW,CAAC,QAAQ,QAAQ,KAAK,OAAO,QAAQ,KAAK,GAAG;AACtD,mBAAe,OAAO,QAAQ,KAAK;AACnC,QAAI,CAAC,cAAc,QAAQ,GAAG;AAC5B,YAAM,IAAI,MAAM,GAAG,KAAK,YAAY,MAAM,iCAAiC;AAAA,IAC7E;AACA,eAAW,WAAW,OAAO,KAAK,QAAQ,GAAG;AAC3C,YAAM,SAAS,aAAa,OAAO;AACnC,UAAI,OAAQ,OAAM,IAAI,MAAM,GAAG,KAAK,YAAY,MAAM,iBAAiB,OAAO,KAAK,MAAM,GAAG;AAAA,IAC9F;AACA,eAAW,CAAC,MAAM,OAAO,KAAK,aAAa;AACzC,UAAI,WAAW,YAAY,KAAK,SAAS,IAAI,EAAE,SAAS,MAAM,GAAG;AAC/D,cAAM,IAAI,MAAM,GAAG,KAAK,UAAU,IAAI,cAAc,OAAO,QAAQ,MAAM,GAAG;AAAA,MAC9E;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,KAAK,SAAwB,MAA0B;AAC9D,QAAM,UAAU,QAAQ,IAAI;AAC5B,MAAI,YAAY,OAAW,QAAO,CAAA;AAClC,MAAI,CAAC,MAAM,QAAQ,OAAO,GAAG;AAC3B,UAAM,IAAI,MAAM,gBAAgB,IAAI,2CAA2C,OAAO,OAAO,EAAE;AAAA,EACjG;AACA,SAAO;AACT;AAIA,SAAS,aAAa,QAAuC;AAC3D,QAAM,OAAO,IAAI,IAAI,OAAO,KAAK,OAAO,cAAc,CAAA,CAAE,CAAC;AACzD,aAAW,UAAU,OAAO,SAAS,CAAA,GAAI;AACvC,eAAW,UAAU,CAAC,QAAQ,OAAO,MAAM,OAAO,IAAI,GAAG;AACvD,iBAAW,OAAO,OAAO,MAAK,iCAAQ,eAAc,CAAA,CAAE,EAAG,MAAK,IAAI,GAAG;AAAA,IACvE;AAAA,EACF;AACA,SAAO;AACT;"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsxRuntime = require("react/jsx-runtime");
4
+ const react = require("react");
5
+ const DropdownMenu = require("../overlay/DropdownMenu.cjs");
6
+ const jsonSchemaFormAccordionArray = require("./json-schema-form-accordion-array.cjs");
7
+ const jsonSchemaFormArrayView = require("./json-schema-form-array-view.cjs");
8
+ const jsonSchemaFormTableArray = require("./json-schema-form-table-array.cjs");
9
+ const UiDotsVertical = require("../icons/components/UiDotsVertical.cjs");
10
+ const UiCheck = require("../icons/components/UiCheck.cjs");
11
+ const VIEW_LABELS = {
12
+ grid: "Grid",
13
+ stack: "Stack form",
14
+ inline: "Inline form"
15
+ };
16
+ const VIEWS = ["grid", "stack", "inline"];
17
+ function ObjectArrayView({
18
+ field,
19
+ ctx,
20
+ readOnly
21
+ }) {
22
+ const [view, setView] = react.useState(() => jsonSchemaFormArrayView.defaultArrayView(field, jsonSchemaFormArrayView.arrayViewOptions(field, ctx)));
23
+ const toolbar = ctx.presentation ? void 0 : /* @__PURE__ */ jsxRuntime.jsx(ArrayViewMenu, { label: field.label || field.key, view, onChange: setView });
24
+ if (view === "grid") {
25
+ return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormTableArray.TableArray, { field, ctx, readOnly, ...toolbar ? { toolbar } : {} });
26
+ }
27
+ const itemCtx = {
28
+ ...ctx,
29
+ layout: { ...ctx.layout, mode: view === "stack" ? "stacked" : "inline" }
30
+ };
31
+ return /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormAccordionArray.AccordionArray, { field, ctx: itemCtx, readOnly, ...toolbar ? { toolbar } : {} });
32
+ }
33
+ function ArrayViewMenu({
34
+ label,
35
+ view,
36
+ onChange
37
+ }) {
38
+ const title = `View options for ${label}`;
39
+ return /* @__PURE__ */ jsxRuntime.jsx(
40
+ DropdownMenu.DropdownMenu,
41
+ {
42
+ icon: UiDotsVertical.UiDotsVertical,
43
+ hideChevron: true,
44
+ variant: "ghost",
45
+ size: "icon",
46
+ align: "right",
47
+ title,
48
+ menuLabel: title,
49
+ items: VIEWS.map((option) => ({
50
+ label: option === view ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
51
+ VIEW_LABELS[option],
52
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "sr-only", children: " (current view)" })
53
+ ] }) : VIEW_LABELS[option],
54
+ onSelect: () => onChange(option),
55
+ ...option === view ? { icon: UiCheck.UiCheck } : {}
56
+ }))
57
+ }
58
+ );
59
+ }
60
+ exports.ArrayViewMenu = ArrayViewMenu;
61
+ exports.ObjectArrayView = ObjectArrayView;
62
+ //# sourceMappingURL=json-schema-form-object-array-view.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-object-array-view.cjs","sources":["../../src/components/json-schema-form-object-array-view.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { UiCheck, UiDotsVertical } from \"../icons\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { arrayViewOptions, defaultArrayView, type ArrayView } from \"./json-schema-form-array-view\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport type { FieldControl, RenderContext } from \"./json-schema-form-types\";\n\nconst VIEW_LABELS: Record<ArrayView, string> = {\n grid: \"Grid\",\n stack: \"Stack form\",\n inline: \"Inline form\",\n};\n\nconst VIEWS: ArrayView[] = [\"grid\", \"stack\", \"inline\"];\n\n// ObjectArrayView renders an object-item array in the view it opens in (see\n// defaultArrayView) and lets the author switch it: the grid is TableArray, and\n// both item forms are AccordionArray, with each item's fields stacked under\n// their labels or labelled inline. The value is the array's own, so an edit\n// made in one view is there in the next. A presentation preview keeps the\n// default view and shows no menu: it is a read-only summary, not an editor.\nexport function ObjectArrayView({\n field,\n ctx,\n readOnly,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n}) {\n const [view, setView] = useState<ArrayView>(() => defaultArrayView(field, arrayViewOptions(field, ctx)));\n const toolbar = ctx.presentation ? undefined : (\n <ArrayViewMenu label={field.label || field.key} view={view} onChange={setView} />\n );\n if (view === \"grid\") {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} {...(toolbar ? { toolbar } : {})} />;\n }\n const itemCtx: RenderContext = {\n ...ctx,\n layout: { ...ctx.layout, mode: view === \"stack\" ? \"stacked\" : \"inline\" },\n };\n return <AccordionArray field={field} ctx={itemCtx} readOnly={readOnly} {...(toolbar ? { toolbar } : {})} />;\n}\n\n// ArrayViewMenu is the ⋮ view switch on an object array's summary line.\nexport function ArrayViewMenu({\n label,\n view,\n onChange,\n}: {\n /** Names the array in the trigger's accessible label. */\n label: string;\n view: ArrayView;\n onChange: (next: ArrayView) => void;\n}) {\n const title = `View options for ${label}`;\n return (\n <DropdownMenu\n icon={UiDotsVertical}\n hideChevron\n variant=\"ghost\"\n size=\"icon\"\n align=\"right\"\n title={title}\n menuLabel={title}\n items={VIEWS.map((option) => ({\n label:\n option === view ? (\n <>\n {VIEW_LABELS[option]}\n <span className=\"sr-only\"> (current view)</span>\n </>\n ) : (\n VIEW_LABELS[option]\n ),\n onSelect: () => onChange(option),\n ...(option === view ? { icon: UiCheck } : {}),\n }))}\n />\n );\n}\n"],"names":["useState","defaultArrayView","arrayViewOptions","jsx","TableArray","AccordionArray","DropdownMenu","UiDotsVertical","jsxs","Fragment","UiCheck"],"mappings":";;;;;;;;;;AAQA,MAAM,cAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,MAAM,QAAqB,CAAC,QAAQ,SAAS,QAAQ;AAQ9C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,CAAC,MAAM,OAAO,IAAIA,eAAoB,MAAMC,yCAAiB,OAAOC,wBAAAA,iBAAiB,OAAO,GAAG,CAAC,CAAC;AACvG,QAAM,UAAU,IAAI,eAAe,SACjCC,2BAAAA,IAAC,eAAA,EAAc,OAAO,MAAM,SAAS,MAAM,KAAK,MAAY,UAAU,SAAS;AAEjF,MAAI,SAAS,QAAQ;AACnB,WAAOA,+BAACC,yBAAAA,YAAA,EAAW,OAAc,KAAU,UAAqB,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA,EAAC,CAAI;AAAA,EACnG;AACA,QAAM,UAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,IAAI,QAAQ,MAAM,SAAS,UAAU,YAAY,SAAA;AAAA,EAAS;AAEzE,SAAOD,+BAACE,6BAAAA,gBAAA,EAAe,OAAc,KAAK,SAAS,UAAqB,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA,EAAC,CAAI;AAC3G;AAGO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,QAAQ,oBAAoB,KAAK;AACvC,SACEF,2BAAAA;AAAAA,IAACG,aAAAA;AAAAA,IAAA;AAAA,MACC,MAAMC,eAAAA;AAAAA,MACN,aAAW;AAAA,MACX,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN;AAAA,MACA,WAAW;AAAA,MACX,OAAO,MAAM,IAAI,CAAC,YAAY;AAAA,QAC5B,OACE,WAAW,OACTC,2BAAAA,KAAAC,WAAAA,UAAA,EACG,UAAA;AAAA,UAAA,YAAY,MAAM;AAAA,UACnBN,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAU,UAAA,kBAAA,CAAe;AAAA,QAAA,GAC3C,IAEA,YAAY,MAAM;AAAA,QAEtB,UAAU,MAAM,SAAS,MAAM;AAAA,QAC/B,GAAI,WAAW,OAAO,EAAE,MAAMO,QAAAA,QAAA,IAAY,CAAA;AAAA,MAAC,EAC3C;AAAA,IAAA;AAAA,EAAA;AAGR;;;"}
@@ -0,0 +1,14 @@
1
+ import { ArrayView } from './json-schema-form-array-view.js';
2
+ import { FieldControl, RenderContext } from './json-schema-form-types.js';
3
+ export declare function ObjectArrayView({ field, ctx, readOnly, }: {
4
+ field: FieldControl;
5
+ ctx: RenderContext;
6
+ readOnly: boolean;
7
+ }): import("react").JSX.Element;
8
+ export declare function ArrayViewMenu({ label, view, onChange, }: {
9
+ /** Names the array in the trigger's accessible label. */
10
+ label: string;
11
+ view: ArrayView;
12
+ onChange: (next: ArrayView) => void;
13
+ }): import("react").JSX.Element;
14
+ //# sourceMappingURL=json-schema-form-object-array-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-object-array-view.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-object-array-view.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAsC,KAAK,SAAS,EAAE,MAAM,+BAA+B,CAAC;AAEnG,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAgB5E,wBAAgB,eAAe,CAAC,EAC9B,KAAK,EACL,GAAG,EACH,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB,+BAaA;AAGD,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE,SAAS,KAAK,IAAI,CAAC;CACrC,+BA0BA"}
@@ -0,0 +1,62 @@
1
+ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
+ import { useState } from "react";
3
+ import { DropdownMenu } from "../overlay/DropdownMenu.js";
4
+ import { AccordionArray } from "./json-schema-form-accordion-array.js";
5
+ import { defaultArrayView, arrayViewOptions } from "./json-schema-form-array-view.js";
6
+ import { TableArray } from "./json-schema-form-table-array.js";
7
+ import { UiDotsVertical } from "../icons/components/UiDotsVertical.js";
8
+ import { UiCheck } from "../icons/components/UiCheck.js";
9
+ const VIEW_LABELS = {
10
+ grid: "Grid",
11
+ stack: "Stack form",
12
+ inline: "Inline form"
13
+ };
14
+ const VIEWS = ["grid", "stack", "inline"];
15
+ function ObjectArrayView({
16
+ field,
17
+ ctx,
18
+ readOnly
19
+ }) {
20
+ const [view, setView] = useState(() => defaultArrayView(field, arrayViewOptions(field, ctx)));
21
+ const toolbar = ctx.presentation ? void 0 : /* @__PURE__ */ jsx(ArrayViewMenu, { label: field.label || field.key, view, onChange: setView });
22
+ if (view === "grid") {
23
+ return /* @__PURE__ */ jsx(TableArray, { field, ctx, readOnly, ...toolbar ? { toolbar } : {} });
24
+ }
25
+ const itemCtx = {
26
+ ...ctx,
27
+ layout: { ...ctx.layout, mode: view === "stack" ? "stacked" : "inline" }
28
+ };
29
+ return /* @__PURE__ */ jsx(AccordionArray, { field, ctx: itemCtx, readOnly, ...toolbar ? { toolbar } : {} });
30
+ }
31
+ function ArrayViewMenu({
32
+ label,
33
+ view,
34
+ onChange
35
+ }) {
36
+ const title = `View options for ${label}`;
37
+ return /* @__PURE__ */ jsx(
38
+ DropdownMenu,
39
+ {
40
+ icon: UiDotsVertical,
41
+ hideChevron: true,
42
+ variant: "ghost",
43
+ size: "icon",
44
+ align: "right",
45
+ title,
46
+ menuLabel: title,
47
+ items: VIEWS.map((option) => ({
48
+ label: option === view ? /* @__PURE__ */ jsxs(Fragment, { children: [
49
+ VIEW_LABELS[option],
50
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: " (current view)" })
51
+ ] }) : VIEW_LABELS[option],
52
+ onSelect: () => onChange(option),
53
+ ...option === view ? { icon: UiCheck } : {}
54
+ }))
55
+ }
56
+ );
57
+ }
58
+ export {
59
+ ArrayViewMenu,
60
+ ObjectArrayView
61
+ };
62
+ //# sourceMappingURL=json-schema-form-object-array-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-object-array-view.js","sources":["../../src/components/json-schema-form-object-array-view.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { UiCheck, UiDotsVertical } from \"../icons\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { arrayViewOptions, defaultArrayView, type ArrayView } from \"./json-schema-form-array-view\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport type { FieldControl, RenderContext } from \"./json-schema-form-types\";\n\nconst VIEW_LABELS: Record<ArrayView, string> = {\n grid: \"Grid\",\n stack: \"Stack form\",\n inline: \"Inline form\",\n};\n\nconst VIEWS: ArrayView[] = [\"grid\", \"stack\", \"inline\"];\n\n// ObjectArrayView renders an object-item array in the view it opens in (see\n// defaultArrayView) and lets the author switch it: the grid is TableArray, and\n// both item forms are AccordionArray, with each item's fields stacked under\n// their labels or labelled inline. The value is the array's own, so an edit\n// made in one view is there in the next. A presentation preview keeps the\n// default view and shows no menu: it is a read-only summary, not an editor.\nexport function ObjectArrayView({\n field,\n ctx,\n readOnly,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n}) {\n const [view, setView] = useState<ArrayView>(() => defaultArrayView(field, arrayViewOptions(field, ctx)));\n const toolbar = ctx.presentation ? undefined : (\n <ArrayViewMenu label={field.label || field.key} view={view} onChange={setView} />\n );\n if (view === \"grid\") {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} {...(toolbar ? { toolbar } : {})} />;\n }\n const itemCtx: RenderContext = {\n ...ctx,\n layout: { ...ctx.layout, mode: view === \"stack\" ? \"stacked\" : \"inline\" },\n };\n return <AccordionArray field={field} ctx={itemCtx} readOnly={readOnly} {...(toolbar ? { toolbar } : {})} />;\n}\n\n// ArrayViewMenu is the ⋮ view switch on an object array's summary line.\nexport function ArrayViewMenu({\n label,\n view,\n onChange,\n}: {\n /** Names the array in the trigger's accessible label. */\n label: string;\n view: ArrayView;\n onChange: (next: ArrayView) => void;\n}) {\n const title = `View options for ${label}`;\n return (\n <DropdownMenu\n icon={UiDotsVertical}\n hideChevron\n variant=\"ghost\"\n size=\"icon\"\n align=\"right\"\n title={title}\n menuLabel={title}\n items={VIEWS.map((option) => ({\n label:\n option === view ? (\n <>\n {VIEW_LABELS[option]}\n <span className=\"sr-only\"> (current view)</span>\n </>\n ) : (\n VIEW_LABELS[option]\n ),\n onSelect: () => onChange(option),\n ...(option === view ? { icon: UiCheck } : {}),\n }))}\n />\n );\n}\n"],"names":[],"mappings":";;;;;;;;AAQA,MAAM,cAAyC;AAAA,EAC7C,MAAM;AAAA,EACN,OAAO;AAAA,EACP,QAAQ;AACV;AAEA,MAAM,QAAqB,CAAC,QAAQ,SAAS,QAAQ;AAQ9C,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AACF,GAIG;AACD,QAAM,CAAC,MAAM,OAAO,IAAI,SAAoB,MAAM,iBAAiB,OAAO,iBAAiB,OAAO,GAAG,CAAC,CAAC;AACvG,QAAM,UAAU,IAAI,eAAe,SACjC,oBAAC,eAAA,EAAc,OAAO,MAAM,SAAS,MAAM,KAAK,MAAY,UAAU,SAAS;AAEjF,MAAI,SAAS,QAAQ;AACnB,WAAO,oBAAC,YAAA,EAAW,OAAc,KAAU,UAAqB,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA,EAAC,CAAI;AAAA,EACnG;AACA,QAAM,UAAyB;AAAA,IAC7B,GAAG;AAAA,IACH,QAAQ,EAAE,GAAG,IAAI,QAAQ,MAAM,SAAS,UAAU,YAAY,SAAA;AAAA,EAAS;AAEzE,SAAO,oBAAC,gBAAA,EAAe,OAAc,KAAK,SAAS,UAAqB,GAAI,UAAU,EAAE,QAAA,IAAY,CAAA,EAAC,CAAI;AAC3G;AAGO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AACF,GAKG;AACD,QAAM,QAAQ,oBAAoB,KAAK;AACvC,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,MAAM;AAAA,MACN,aAAW;AAAA,MACX,SAAQ;AAAA,MACR,MAAK;AAAA,MACL,OAAM;AAAA,MACN;AAAA,MACA,WAAW;AAAA,MACX,OAAO,MAAM,IAAI,CAAC,YAAY;AAAA,QAC5B,OACE,WAAW,OACT,qBAAA,UAAA,EACG,UAAA;AAAA,UAAA,YAAY,MAAM;AAAA,UACnB,oBAAC,QAAA,EAAK,WAAU,WAAU,UAAA,kBAAA,CAAe;AAAA,QAAA,GAC3C,IAEA,YAAY,MAAM;AAAA,QAEtB,UAAU,MAAM,SAAS,MAAM;AAAA,QAC/B,GAAI,WAAW,OAAO,EAAE,MAAM,QAAA,IAAY,CAAA;AAAA,MAAC,EAC3C;AAAA,IAAA;AAAA,EAAA;AAGR;"}
@@ -25,6 +25,9 @@ function ObjectControl({
25
25
  properties: field.objectProperties ?? {},
26
26
  ...field.objectRequired ? { required: field.objectRequired } : {},
27
27
  ...Array.isArray(field.schema.allOf) ? { allOf: field.schema.allOf } : {},
28
+ // Copied whatever its shape, so a malformed value fails loudly in the
29
+ // listener collector rather than vanishing here.
30
+ ...field.schema["x-on-load"] !== void 0 ? { "x-on-load": field.schema["x-on-load"] } : {},
28
31
  ...Array.isArray(field.schema["x-order"]) ? { "x-order": field.schema["x-order"] } : {},
29
32
  // Every object-level layout keyword must be copied here or it works at the
30
33
  // top level and silently dies one level down — which is exactly where these
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-object.cjs","sources":["../../src/components/json-schema-form-object.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport { Combobox } from \"./Combobox\";\nimport type {\n FieldControl,\n JsonSchemaObject,\n JsonSchemaProperty,\n RenderContext,\n} from \"./json-schema-form-types\";\nimport {\n cssLength,\n DEFAULT_COLUMN_MIN_WIDTH,\n fieldInputId,\n inputClass,\n keyPickerOptions,\n normalizeColumns,\n} from \"./json-schema-form-utils\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { PropertyValueEditor } from \"./json-schema-form-properties\";\nimport { propertyControlSize } from \"./json-schema-form-properties-size\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n controlHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n} from \"./json-schema-form-size\";\n\n// ObjectControl renders a nested structured object as a sub-form: its own\n// properties, required markers, if/then, soft errors — all via the shared\n// recursive renderer (ctx.render), so pre/post extensions apply at this depth too.\nexport function ObjectControl({\n field,\n ctx,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n}) {\n const obj = isPlainObject(field.value)\n ? (field.value as Record<string, unknown>)\n : {};\n const subSchema: JsonSchemaObject = {\n type: \"object\",\n properties: field.objectProperties ?? {},\n ...(field.objectRequired ? { required: field.objectRequired } : {}),\n ...(Array.isArray(field.schema.allOf) ? { allOf: field.schema.allOf } : {}),\n ...(Array.isArray(field.schema[\"x-order\"])\n ? { \"x-order\": field.schema[\"x-order\"] }\n : {}),\n // Every object-level layout keyword must be copied here or it works at the\n // top level and silently dies one level down — which is exactly where these\n // matter (an array item's body is a nested object).\n ...(typeof field.schema[\"x-columns\"] === \"number\" ||\n field.schema[\"x-columns\"] === \"auto\"\n ? { \"x-columns\": field.schema[\"x-columns\"] }\n : {}),\n ...(typeof field.schema[\"x-column-min-width\"] === \"string\"\n ? { \"x-column-min-width\": field.schema[\"x-column-min-width\"] }\n : {}),\n ...(typeof field.schema[\"x-columns-max-width\"] === \"string\"\n ? { \"x-columns-max-width\": field.schema[\"x-columns-max-width\"] }\n : {}),\n ...(typeof field.schema[\"x-classes\"] === \"string\"\n ? { \"x-classes\": field.schema[\"x-classes\"] }\n : {}),\n };\n // No border/box: nested objects render as flat headed sections (see\n // ObjectSection in renderFieldRow) rather than progressively indented\n // sub-forms, so deep schemas stay readable as a single column.\n // A read-only object marks its whole subtree non-editable: recurse with\n // form-level readOnly on so child inputs are disabled (and any child the\n // schema marks readOnly still renders as a value span).\n return (\n <FieldsGrid\n layout={ctx.layout}\n size={ctx.size}\n columns={normalizeColumns(subSchema[\"x-columns\"])}\n columnMinWidth={cssLength(\n subSchema[\"x-column-min-width\"],\n DEFAULT_COLUMN_MIN_WIDTH,\n )}\n {...(typeof subSchema[\"x-columns-max-width\"] === \"string\"\n ? { columnsMaxWidth: subSchema[\"x-columns-max-width\"] }\n : {})}\n {...(typeof subSchema[\"x-classes\"] === \"string\"\n ? { className: subSchema[\"x-classes\"] }\n : {})}\n >\n {ctx.render.renderObjectFields(\n subSchema,\n obj,\n (next) => field.onChange(next),\n {\n ...ctx,\n readOnly: ctx.readOnly || field.readOnly === true,\n depth: ctx.depth + 1,\n },\n )}\n </FieldsGrid>\n );\n}\n\n// StringMapControl edits an object as key/value rows. Known properties (from the\n// schema) render first with derived value controls; unknown keys render as\n// editable key/value pairs. \"Add field\" appears when extra keys are allowed.\n// Values recurse through the shared pipeline, so a value that is itself an object\n// or array renders structurally and pre/post extensions apply to it.\nexport function StringMapControl({\n field,\n ctx,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n}) {\n // A read-only map marks its whole subtree non-editable: no rename/remove/add\n // and value inputs disabled.\n const readOnly = ctx.readOnly || field.readOnly === true;\n const map = isPlainObject(field.value)\n ? (field.value as Record<string, unknown>)\n : {};\n const known = field.knownProperties ?? {};\n const knownKeys = Object.keys(known);\n const extraKeys = Object.keys(map).filter((k) => !(k in known));\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n const properties = ctx.layout.mode === \"properties\";\n // What the map key IS (e.g. \"Address Role\"), from the key-constraint schema.\n const pn = field.schema.propertyNames as JsonSchemaProperty | undefined;\n const keyTitle =\n typeof pn?.title === \"string\" && pn.title ? pn.title : undefined;\n\n // valueSchemaForKey picks an entry's value schema: the first patternProperties\n // entry whose regex matches the key, else the `additionalProperties` schema,\n // else a bare string. Lets the value form vary by key (e.g. House vs Apartment).\n function valueSchemaForKey(key: string): JsonSchemaProperty {\n for (const { pattern, schema } of field.valuePatternSchemas ?? []) {\n let re: RegExp | undefined;\n try {\n re = new RegExp(pattern);\n } catch {\n re = undefined; // a malformed pattern simply never matches\n }\n if (re?.test(key)) return schema;\n }\n return field.valueSchema ?? { type: \"string\" };\n }\n\n // When the entry value opts into a stacked layout (`x-layout: \"stack\"`), the\n // key+value render as one full-width stacked unit instead of a key column\n // beside the value. Resolved per key, since pattern schemas may differ.\n function entryIsStacked(key: string): boolean {\n return valueSchemaForKey(key)[\"x-layout\"] === \"stack\";\n }\n\n function setEntry(key: string, next: unknown) {\n field.onChange({ ...map, [key]: next });\n }\n function renameEntry(oldKey: string, newKey: string) {\n if (newKey === oldKey) return;\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(map))\n next[k === oldKey ? newKey : k] = v;\n field.onChange(next);\n }\n function removeEntry(key: string) {\n const next = { ...map };\n delete next[key];\n field.onChange(next);\n }\n function addEntry() {\n if (\"\" in map) return;\n field.onChange({ ...map, \"\": \"\" });\n }\n\n function valueControlFor(\n key: string,\n valueSchema: JsonSchemaProperty,\n ): ReactNode {\n const nodes = ctx.render.renderFieldNodes(\n {\n key,\n prop: valueSchema,\n required: false,\n value: map[key] ?? \"\",\n onChange: (next) => setEntry(key, next),\n instancePath: appendInstancePath(ctx.instancePath, key),\n },\n childCtx,\n );\n return nodes?.value ?? null;\n }\n\n // valueControlForKey resolves the per-key value schema (patternProperties /\n // additionalProperties) before rendering, so the form varies by key.\n function valueControlForKey(key: string): ReactNode {\n return valueControlFor(key, valueSchemaForKey(key));\n }\n\n function keyEditor({\n key,\n value,\n onChange,\n }: {\n key: string;\n value: string;\n onChange: (next: string) => void;\n }) {\n const size = properties ? propertyControlSize[ctx.size] : ctx.size;\n return field.keyOptions ? (\n <Combobox\n options={keyPickerOptions(\n field.keyOptions,\n [...knownKeys, ...extraKeys],\n key,\n )}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue={false}\n onChange={onChange}\n placeholder=\"Select…\"\n />\n ) : (\n <input\n type=\"text\"\n aria-label=\"Field name\"\n className={cn(inputClass(size), \"font-mono\")}\n value={value}\n disabled={readOnly}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n }\n\n return (\n <div\n className={cn(\n properties ? \"col-span-full grid grid-cols-subgrid\" : \"flex flex-col\",\n !properties &&\n !ctx.presentation &&\n \"rounded-md border border-input p-2\",\n !properties && fieldInnerGapClass[childCtx.size],\n )}\n >\n {knownKeys.map((key) =>\n properties ? (\n <div key={`known-${key}`} className=\"contents\">\n {ctx.render.renderFieldRow(\n {\n key,\n prop: known[key]!,\n required:\n Array.isArray(field.schema.required) &&\n field.schema.required.includes(key),\n value: map[key],\n onChange: (next) => setEntry(key, next),\n instancePath: appendInstancePath(ctx.instancePath, key),\n },\n childCtx,\n )}\n </div>\n ) : (\n <div\n key={`known-${key}`}\n className=\"grid grid-cols-[10rem_1fr] items-center gap-2\"\n >\n <label\n htmlFor={fieldInputId(\n appendInstancePath(ctx.instancePath, key),\n childCtx.idPrefix,\n )}\n className=\"truncate text-xs text-muted-foreground\"\n title={key}\n >\n {key}\n </label>\n <div className=\"min-w-0\">\n {valueControlFor(key, known[key] ?? { type: \"string\" })}\n </div>\n </div>\n ),\n )}\n {extraKeys.map((key) => {\n const keyControl = ctx.presentation ? (\n <span\n className={cn(\n \"flex min-w-0 items-center break-words text-xs\",\n controlHeightClass[childCtx.size],\n field.keyOptions\n ? \"text-foreground\"\n : \"font-mono text-muted-foreground\",\n )}\n >\n {field.keyOptions?.find((option) => option.value === key)?.label ??\n key}\n </span>\n ) : (\n keyEditor({\n key,\n value: key,\n onChange: (next) => renameEntry(key, next),\n })\n );\n const removeButton = !readOnly ? (\n <button\n type=\"button\"\n aria-label={`Remove ${key}`}\n className={cn(\n \"inline-flex aspect-square shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\",\n controlHeightClass[childCtx.size],\n )}\n onClick={() => removeEntry(key)}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n ) : null;\n if (properties) {\n const instancePath = appendInstancePath(ctx.instancePath, key);\n const keyLabel =\n field.keyOptions?.find((option) => option.value === key)?.label ??\n (key || \"New field\");\n return (\n <div key={`extra-${key}`} className=\"contents\">\n {ctx.render.renderFieldRow(\n {\n key,\n prop: { ...valueSchemaForKey(key), title: keyLabel },\n required: false,\n value: map[key],\n onChange: (next) => setEntry(key, next),\n instancePath,\n },\n {\n ...childCtx,\n post: [\n ...childCtx.post,\n (entry, nodes, postCtx) =>\n postCtx?.instancePath !== instancePath\n ? nodes\n : {\n ...nodes,\n label: (\n <>\n <span className=\"sr-only\">{nodes.label}</span>\n <PropertyValueEditor\n actionsPlacement=\"row\"\n field={{\n ...entry,\n kind: \"string\",\n label: `${keyLabel} key`,\n value: key,\n onChange: (next) =>\n renameEntry(key, String(next)),\n }}\n fieldId={`${fieldInputId(instancePath, ctx.idPrefix)}-key`}\n ctx={{\n ...childCtx,\n size: propertyControlSize[ctx.size],\n }}\n renderPreview={(previewField) => (\n <span>{String(previewField.value)}</span>\n )}\n renderEditor={(draft) => (\n <div className=\"flex min-w-0 items-center gap-1\">\n {keyEditor({\n key,\n value: String(draft.value),\n onChange: draft.onChange,\n })}\n {removeButton}\n </div>\n )}\n />\n </>\n ),\n },\n ],\n },\n )}\n </div>\n );\n }\n // When the value is stacked (`x-layout: \"stack\"` on the entry schema),\n // the key joins the stack: it sits full-width above its value as one\n // unit, rather than cramped in a fixed key column beside it. The key\n // picker is labelled from `propertyNames.title` so a constrained key\n // (e.g. an AsCode role) says what it is.\n if (entryIsStacked(key)) {\n return (\n <div\n key={`extra-${key}`}\n className={cn(\n \"space-y-1.5\",\n !ctx.presentation && \"rounded-md border border-input p-2\",\n )}\n >\n {keyTitle && (\n <span className=\"block text-xs font-medium text-muted-foreground\">\n {keyTitle}\n </span>\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0 flex-1\">{keyControl}</div>\n {removeButton}\n </div>\n <div className=\"min-w-0\">{valueControlForKey(key)}</div>\n </div>\n );\n }\n return (\n <div\n key={`extra-${key}`}\n className={cn(\n \"grid items-center gap-2\",\n ctx.presentation\n ? \"grid-cols-[minmax(0,10rem)_minmax(0,1fr)]\"\n : \"grid-cols-[10rem_1fr_auto]\",\n )}\n >\n {keyControl}\n <div className=\"min-w-0\">{valueControlForKey(key)}</div>\n {removeButton}\n </div>\n );\n })}\n {!readOnly && field.allowExtraKeys !== false && (\n <Button\n type=\"button\"\n variant={properties ? \"ghost\" : \"outline\"}\n onClick={addEntry}\n className={cn(\n \"gap-1.5\",\n properties && \"col-span-full justify-self-start m-1\",\n inputSizeClass[\n properties ? propertyControlSize[ctx.size] : childCtx.size\n ],\n )}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add field\n </Button>\n )}\n </div>\n );\n}\n"],"names":["isPlainObject","jsx","FieldsGrid","normalizeColumns","cssLength","DEFAULT_COLUMN_MIN_WIDTH","appendInstancePath","propertyControlSize","Combobox","keyPickerOptions","cn","inputClass","jsxs","fieldInnerGapClass","fieldInputId","controlHeightClass","Icon","UiTrash","Fragment","PropertyValueEditor","Button","inputSizeClass","UiAdd"],"mappings":";;;;;;;;;;;;;;;;;AAkCO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA;AACF,GAGG;AACD,QAAM,MAAMA,YAAAA,cAAc,MAAM,KAAK,IAChC,MAAM,QACP,CAAA;AACJ,QAAM,YAA8B;AAAA,IAClC,MAAM;AAAA,IACN,YAAY,MAAM,oBAAoB,CAAA;AAAA,IACtC,GAAI,MAAM,iBAAiB,EAAE,UAAU,MAAM,eAAA,IAAmB,CAAA;AAAA,IAChE,GAAI,MAAM,QAAQ,MAAM,OAAO,KAAK,IAAI,EAAE,OAAO,MAAM,OAAO,MAAA,IAAU,CAAA;AAAA,IACxE,GAAI,MAAM,QAAQ,MAAM,OAAO,SAAS,CAAC,IACrC,EAAE,WAAW,MAAM,OAAO,SAAS,EAAA,IACnC,CAAA;AAAA;AAAA;AAAA;AAAA,IAIJ,GAAI,OAAO,MAAM,OAAO,WAAW,MAAM,YACzC,MAAM,OAAO,WAAW,MAAM,SAC1B,EAAE,aAAa,MAAM,OAAO,WAAW,EAAA,IACvC,CAAA;AAAA,IACJ,GAAI,OAAO,MAAM,OAAO,oBAAoB,MAAM,WAC9C,EAAE,sBAAsB,MAAM,OAAO,oBAAoB,EAAA,IACzD,CAAA;AAAA,IACJ,GAAI,OAAO,MAAM,OAAO,qBAAqB,MAAM,WAC/C,EAAE,uBAAuB,MAAM,OAAO,qBAAqB,EAAA,IAC3D,CAAA;AAAA,IACJ,GAAI,OAAO,MAAM,OAAO,WAAW,MAAM,WACrC,EAAE,aAAa,MAAM,OAAO,WAAW,EAAA,IACvC,CAAA;AAAA,EAAC;AAQP,SACEC,2BAAAA;AAAAA,IAACC,qBAAAA;AAAAA,IAAA;AAAA,MACC,QAAQ,IAAI;AAAA,MACZ,MAAM,IAAI;AAAA,MACV,SAASC,oBAAAA,iBAAiB,UAAU,WAAW,CAAC;AAAA,MAChD,gBAAgBC,oBAAAA;AAAAA,QACd,UAAU,oBAAoB;AAAA,QAC9BC,oBAAAA;AAAAA,MAAA;AAAA,MAED,GAAI,OAAO,UAAU,qBAAqB,MAAM,WAC7C,EAAE,iBAAiB,UAAU,qBAAqB,EAAA,IAClD,CAAA;AAAA,MACH,GAAI,OAAO,UAAU,WAAW,MAAM,WACnC,EAAE,WAAW,UAAU,WAAW,EAAA,IAClC,CAAA;AAAA,MAEH,cAAI,OAAO;AAAA,QACV;AAAA,QACA;AAAA,QACA,CAAC,SAAS,MAAM,SAAS,IAAI;AAAA,QAC7B;AAAA,UACE,GAAG;AAAA,UACH,UAAU,IAAI,YAAY,MAAM,aAAa;AAAA,UAC7C,OAAO,IAAI,QAAQ;AAAA,QAAA;AAAA,MACrB;AAAA,IACF;AAAA,EAAA;AAGN;AAOO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA;AACF,GAGG;AAGD,QAAM,WAAW,IAAI,YAAY,MAAM,aAAa;AACpD,QAAM,MAAML,YAAAA,cAAc,MAAM,KAAK,IAChC,MAAM,QACP,CAAA;AACJ,QAAM,QAAQ,MAAM,mBAAmB,CAAA;AACvC,QAAM,YAAY,OAAO,KAAK,KAAK;AACnC,QAAM,YAAY,OAAO,KAAK,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,KAAK,MAAM;AAC9D,QAAM,WAA0B,EAAE,GAAG,KAAK,UAAU,OAAO,IAAI,QAAQ,EAAA;AACvE,QAAM,aAAa,IAAI,OAAO,SAAS;AAEvC,QAAM,KAAK,MAAM,OAAO;AACxB,QAAM,WACJ,QAAO,yBAAI,WAAU,YAAY,GAAG,QAAQ,GAAG,QAAQ;AAKzD,WAAS,kBAAkB,KAAiC;AAC1D,eAAW,EAAE,SAAS,OAAA,KAAY,MAAM,uBAAuB,IAAI;AACjE,UAAI;AACJ,UAAI;AACF,aAAK,IAAI,OAAO,OAAO;AAAA,MACzB,QAAQ;AACN,aAAK;AAAA,MACP;AACA,UAAI,yBAAI,KAAK,KAAM,QAAO;AAAA,IAC5B;AACA,WAAO,MAAM,eAAe,EAAE,MAAM,SAAA;AAAA,EACtC;AAKA,WAAS,eAAe,KAAsB;AAC5C,WAAO,kBAAkB,GAAG,EAAE,UAAU,MAAM;AAAA,EAChD;AAEA,WAAS,SAAS,KAAa,MAAe;AAC5C,UAAM,SAAS,EAAE,GAAG,KAAK,CAAC,GAAG,GAAG,MAAM;AAAA,EACxC;AACA,WAAS,YAAY,QAAgB,QAAgB;AACnD,QAAI,WAAW,OAAQ;AACvB,UAAM,OAAgC,CAAA;AACtC,eAAW,CAAC,GAAG,CAAC,KAAK,OAAO,QAAQ,GAAG;AACrC,WAAK,MAAM,SAAS,SAAS,CAAC,IAAI;AACpC,UAAM,SAAS,IAAI;AAAA,EACrB;AACA,WAAS,YAAY,KAAa;AAChC,UAAM,OAAO,EAAE,GAAG,IAAA;AAClB,WAAO,KAAK,GAAG;AACf,UAAM,SAAS,IAAI;AAAA,EACrB;AACA,WAAS,WAAW;AAClB,QAAI,MAAM,IAAK;AACf,UAAM,SAAS,EAAE,GAAG,KAAK,IAAI,IAAI;AAAA,EACnC;AAEA,WAAS,gBACP,KACA,aACW;AACX,UAAM,QAAQ,IAAI,OAAO;AAAA,MACvB;AAAA,QACE;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,QACV,OAAO,IAAI,GAAG,KAAK;AAAA,QACnB,UAAU,CAAC,SAAS,SAAS,KAAK,IAAI;AAAA,QACtC,cAAcM,qBAAAA,mBAAmB,IAAI,cAAc,GAAG;AAAA,MAAA;AAAA,MAExD;AAAA,IAAA;AAEF,YAAO,+BAAO,UAAS;AAAA,EACzB;AAIA,WAAS,mBAAmB,KAAwB;AAClD,WAAO,gBAAgB,KAAK,kBAAkB,GAAG,CAAC;AAAA,EACpD;AAEA,WAAS,UAAU;AAAA,IACjB;AAAA,IACA;AAAA,IACA;AAAA,EAAA,GAKC;AACD,UAAM,OAAO,aAAaC,6BAAAA,oBAAoB,IAAI,IAAI,IAAI,IAAI;AAC9D,WAAO,MAAM,aACXN,2BAAAA;AAAAA,MAACO,SAAAA;AAAAA,MAAA;AAAA,QACC,SAASC,oBAAAA;AAAAA,UACP,MAAM;AAAA,UACN,CAAC,GAAG,WAAW,GAAG,SAAS;AAAA,UAC3B;AAAA,QAAA;AAAA,QAEF;AAAA,QACA,UAAU;AAAA,QACV;AAAA,QACA,kBAAkB;AAAA,QAClB;AAAA,QACA,aAAY;AAAA,MAAA;AAAA,IAAA,IAGdR,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAK;AAAA,QACL,cAAW;AAAA,QACX,WAAWS,MAAAA,GAAGC,oBAAAA,WAAW,IAAI,GAAG,WAAW;AAAA,QAC3C;AAAA,QACA,UAAU;AAAA,QACV,UAAU,CAAC,UAAU,SAAS,MAAM,OAAO,KAAK;AAAA,MAAA;AAAA,IAAA;AAAA,EAGtD;AAEA,SACEC,2BAAAA;AAAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAWF,MAAAA;AAAAA,QACT,aAAa,yCAAyC;AAAA,QACtD,CAAC,cACC,CAAC,IAAI,gBACL;AAAA,QACF,CAAC,cAAcG,sCAAmB,SAAS,IAAI;AAAA,MAAA;AAAA,MAGhD,UAAA;AAAA,QAAA,UAAU;AAAA,UAAI,CAAC,QACd,aACEZ,2BAAAA,IAAC,SAAyB,WAAU,YACjC,cAAI,OAAO;AAAA,YACV;AAAA,cACE;AAAA,cACA,MAAM,MAAM,GAAG;AAAA,cACf,UACE,MAAM,QAAQ,MAAM,OAAO,QAAQ,KACnC,MAAM,OAAO,SAAS,SAAS,GAAG;AAAA,cACpC,OAAO,IAAI,GAAG;AAAA,cACd,UAAU,CAAC,SAAS,SAAS,KAAK,IAAI;AAAA,cACtC,cAAcK,qBAAAA,mBAAmB,IAAI,cAAc,GAAG;AAAA,YAAA;AAAA,YAExD;AAAA,UAAA,EACF,GAbQ,SAAS,GAAG,EActB,IAEAM,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAU;AAAA,cAEV,UAAA;AAAA,gBAAAX,2BAAAA;AAAAA,kBAAC;AAAA,kBAAA;AAAA,oBACC,SAASa,oBAAAA;AAAAA,sBACPR,wCAAmB,IAAI,cAAc,GAAG;AAAA,sBACxC,SAAS;AAAA,oBAAA;AAAA,oBAEX,WAAU;AAAA,oBACV,OAAO;AAAA,oBAEN,UAAA;AAAA,kBAAA;AAAA,gBAAA;AAAA,gBAEHL,2BAAAA,IAAC,OAAA,EAAI,WAAU,WACZ,UAAA,gBAAgB,KAAK,MAAM,GAAG,KAAK,EAAE,MAAM,SAAA,CAAU,EAAA,CACxD;AAAA,cAAA;AAAA,YAAA;AAAA,YAfK,SAAS,GAAG;AAAA,UAAA;AAAA,QAgBnB;AAAA,QAGH,UAAU,IAAI,CAAC,QAAQ;;AACtB,gBAAM,aAAa,IAAI,eACrBA,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,WAAWS,MAAAA;AAAAA,gBACT;AAAA,gBACAK,mBAAAA,mBAAmB,SAAS,IAAI;AAAA,gBAChC,MAAM,aACF,oBACA;AAAA,cAAA;AAAA,cAGL,YAAA,iBAAM,eAAN,mBAAkB,KAAK,CAAC,WAAW,OAAO,UAAU,SAApD,mBAA0D,UACzD;AAAA,YAAA;AAAA,UAAA,IAGJ,UAAU;AAAA,YACR;AAAA,YACA,OAAO;AAAA,YACP,UAAU,CAAC,SAAS,YAAY,KAAK,IAAI;AAAA,UAAA,CAC1C;AAEH,gBAAM,eAAe,CAAC,WACpBd,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cACC,MAAK;AAAA,cACL,cAAY,UAAU,GAAG;AAAA,cACzB,WAAWS,MAAAA;AAAAA,gBACT;AAAA,gBACAK,mBAAAA,mBAAmB,SAAS,IAAI;AAAA,cAAA;AAAA,cAElC,SAAS,MAAM,YAAY,GAAG;AAAA,cAE9B,UAAAd,2BAAAA,IAACe,WAAA,EAAK,MAAMC,QAAAA,SAAS,WAAU,UAAA,CAAU;AAAA,YAAA;AAAA,UAAA,IAEzC;AACJ,cAAI,YAAY;AACd,kBAAM,eAAeX,qBAAAA,mBAAmB,IAAI,cAAc,GAAG;AAC7D,kBAAM,aACJ,iBAAM,eAAN,mBAAkB,KAAK,CAAC,WAAW,OAAO,UAAU,SAApD,mBAA0D,WACzD,OAAO;AACV,mBACEL,2BAAAA,IAAC,OAAA,EAAyB,WAAU,YACjC,cAAI,OAAO;AAAA,cACV;AAAA,gBACE;AAAA,gBACA,MAAM,EAAE,GAAG,kBAAkB,GAAG,GAAG,OAAO,SAAA;AAAA,gBAC1C,UAAU;AAAA,gBACV,OAAO,IAAI,GAAG;AAAA,gBACd,UAAU,CAAC,SAAS,SAAS,KAAK,IAAI;AAAA,gBACtC;AAAA,cAAA;AAAA,cAEF;AAAA,gBACE,GAAG;AAAA,gBACH,MAAM;AAAA,kBACJ,GAAG,SAAS;AAAA,kBACZ,CAAC,OAAO,OAAO,aACb,mCAAS,kBAAiB,eACtB,QACA;AAAA,oBACE,GAAG;AAAA,oBACH,OACEW,2BAAAA,KAAAM,qBAAA,EACE,UAAA;AAAA,sBAAAjB,2BAAAA,IAAC,QAAA,EAAK,WAAU,WAAW,UAAA,MAAM,OAAM;AAAA,sBACvCA,2BAAAA;AAAAA,wBAACkB,yBAAAA;AAAAA,wBAAA;AAAA,0BACC,kBAAiB;AAAA,0BACjB,OAAO;AAAA,4BACL,GAAG;AAAA,4BACH,MAAM;AAAA,4BACN,OAAO,GAAG,QAAQ;AAAA,4BAClB,OAAO;AAAA,4BACP,UAAU,CAAC,SACT,YAAY,KAAK,OAAO,IAAI,CAAC;AAAA,0BAAA;AAAA,0BAEjC,SAAS,GAAGL,iCAAa,cAAc,IAAI,QAAQ,CAAC;AAAA,0BACpD,KAAK;AAAA,4BACH,GAAG;AAAA,4BACH,MAAMP,6BAAAA,oBAAoB,IAAI,IAAI;AAAA,0BAAA;AAAA,0BAEpC,eAAe,CAAC,iBACdN,2BAAAA,IAAC,UAAM,UAAA,OAAO,aAAa,KAAK,GAAE;AAAA,0BAEpC,cAAc,CAAC,UACbW,2BAAAA,KAAC,OAAA,EAAI,WAAU,mCACZ,UAAA;AAAA,4BAAA,UAAU;AAAA,8BACT;AAAA,8BACA,OAAO,OAAO,MAAM,KAAK;AAAA,8BACzB,UAAU,MAAM;AAAA,4BAAA,CACjB;AAAA,4BACA;AAAA,0BAAA,EAAA,CACH;AAAA,wBAAA;AAAA,sBAAA;AAAA,oBAEJ,EAAA,CACF;AAAA,kBAAA;AAAA,gBAEJ;AAAA,cACR;AAAA,YACF,EACF,GAxDQ,SAAS,GAAG,EAyDtB;AAAA,UAEJ;AAMA,cAAI,eAAe,GAAG,GAAG;AACvB,mBACEA,2BAAAA;AAAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,WAAWF,MAAAA;AAAAA,kBACT;AAAA,kBACA,CAAC,IAAI,gBAAgB;AAAA,gBAAA;AAAA,gBAGtB,UAAA;AAAA,kBAAA,YACCT,2BAAAA,IAAC,QAAA,EAAK,WAAU,mDACb,UAAA,UACH;AAAA,kBAEFW,2BAAAA,KAAC,OAAA,EAAI,WAAU,2BACb,UAAA;AAAA,oBAAAX,2BAAAA,IAAC,OAAA,EAAI,WAAU,kBAAkB,UAAA,YAAW;AAAA,oBAC3C;AAAA,kBAAA,GACH;AAAA,iDACC,OAAA,EAAI,WAAU,WAAW,UAAA,mBAAmB,GAAG,EAAA,CAAE;AAAA,gBAAA;AAAA,cAAA;AAAA,cAf7C,SAAS,GAAG;AAAA,YAAA;AAAA,UAkBvB;AACA,iBACEW,2BAAAA;AAAAA,YAAC;AAAA,YAAA;AAAA,cAEC,WAAWF,MAAAA;AAAAA,gBACT;AAAA,gBACA,IAAI,eACA,8CACA;AAAA,cAAA;AAAA,cAGL,UAAA;AAAA,gBAAA;AAAA,+CACA,OAAA,EAAI,WAAU,WAAW,UAAA,mBAAmB,GAAG,GAAE;AAAA,gBACjD;AAAA,cAAA;AAAA,YAAA;AAAA,YAVI,SAAS,GAAG;AAAA,UAAA;AAAA,QAavB,CAAC;AAAA,QACA,CAAC,YAAY,MAAM,mBAAmB,SACrCE,2BAAAA;AAAAA,UAACQ,OAAAA;AAAAA,UAAA;AAAA,YACC,MAAK;AAAA,YACL,SAAS,aAAa,UAAU;AAAA,YAChC,SAAS;AAAA,YACT,WAAWV,MAAAA;AAAAA,cACT;AAAA,cACA,cAAc;AAAA,cACdW,mBAAAA,eACE,aAAad,6BAAAA,oBAAoB,IAAI,IAAI,IAAI,SAAS,IACxD;AAAA,YAAA;AAAA,YAGF,UAAA;AAAA,cAAAN,2BAAAA,IAACe,KAAAA,MAAA,EAAK,MAAMM,MAAAA,OAAO,WAAU,WAAU;AAAA,cAAE;AAAA,YAAA;AAAA,UAAA;AAAA,QAAA;AAAA,MAE3C;AAAA,IAAA;AAAA,EAAA;AAIR;;;"}
1
+ {"version":3,"file":"json-schema-form-object.cjs","sources":["../../src/components/json-schema-form-object.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiTrash } from \"../icons\";\nimport { Button } from \"./button\";\nimport { Combobox } from \"./Combobox\";\nimport type {\n FieldControl,\n JsonSchemaObject,\n JsonSchemaProperty,\n RenderContext,\n} from \"./json-schema-form-types\";\nimport {\n cssLength,\n DEFAULT_COLUMN_MIN_WIDTH,\n fieldInputId,\n inputClass,\n keyPickerOptions,\n normalizeColumns,\n} from \"./json-schema-form-utils\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { PropertyValueEditor } from \"./json-schema-form-properties\";\nimport { propertyControlSize } from \"./json-schema-form-properties-size\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n controlHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n} from \"./json-schema-form-size\";\n\n// ObjectControl renders a nested structured object as a sub-form: its own\n// properties, required markers, if/then, soft errors — all via the shared\n// recursive renderer (ctx.render), so pre/post extensions apply at this depth too.\nexport function ObjectControl({\n field,\n ctx,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n}) {\n const obj = isPlainObject(field.value)\n ? (field.value as Record<string, unknown>)\n : {};\n const subSchema: JsonSchemaObject = {\n type: \"object\",\n properties: field.objectProperties ?? {},\n ...(field.objectRequired ? { required: field.objectRequired } : {}),\n ...(Array.isArray(field.schema.allOf) ? { allOf: field.schema.allOf } : {}),\n // Copied whatever its shape, so a malformed value fails loudly in the\n // listener collector rather than vanishing here.\n ...(field.schema[\"x-on-load\"] !== undefined ? { \"x-on-load\": field.schema[\"x-on-load\"] } : {}),\n ...(Array.isArray(field.schema[\"x-order\"])\n ? { \"x-order\": field.schema[\"x-order\"] }\n : {}),\n // Every object-level layout keyword must be copied here or it works at the\n // top level and silently dies one level down — which is exactly where these\n // matter (an array item's body is a nested object).\n ...(typeof field.schema[\"x-columns\"] === \"number\" ||\n field.schema[\"x-columns\"] === \"auto\"\n ? { \"x-columns\": field.schema[\"x-columns\"] }\n : {}),\n ...(typeof field.schema[\"x-column-min-width\"] === \"string\"\n ? { \"x-column-min-width\": field.schema[\"x-column-min-width\"] }\n : {}),\n ...(typeof field.schema[\"x-columns-max-width\"] === \"string\"\n ? { \"x-columns-max-width\": field.schema[\"x-columns-max-width\"] }\n : {}),\n ...(typeof field.schema[\"x-classes\"] === \"string\"\n ? { \"x-classes\": field.schema[\"x-classes\"] }\n : {}),\n };\n // No border/box: nested objects render as flat headed sections (see\n // ObjectSection in renderFieldRow) rather than progressively indented\n // sub-forms, so deep schemas stay readable as a single column.\n // A read-only object marks its whole subtree non-editable: recurse with\n // form-level readOnly on so child inputs are disabled (and any child the\n // schema marks readOnly still renders as a value span).\n return (\n <FieldsGrid\n layout={ctx.layout}\n size={ctx.size}\n columns={normalizeColumns(subSchema[\"x-columns\"])}\n columnMinWidth={cssLength(\n subSchema[\"x-column-min-width\"],\n DEFAULT_COLUMN_MIN_WIDTH,\n )}\n {...(typeof subSchema[\"x-columns-max-width\"] === \"string\"\n ? { columnsMaxWidth: subSchema[\"x-columns-max-width\"] }\n : {})}\n {...(typeof subSchema[\"x-classes\"] === \"string\"\n ? { className: subSchema[\"x-classes\"] }\n : {})}\n >\n {ctx.render.renderObjectFields(\n subSchema,\n obj,\n (next) => field.onChange(next),\n {\n ...ctx,\n readOnly: ctx.readOnly || field.readOnly === true,\n depth: ctx.depth + 1,\n },\n )}\n </FieldsGrid>\n );\n}\n\n// StringMapControl edits an object as key/value rows. Known properties (from the\n// schema) render first with derived value controls; unknown keys render as\n// editable key/value pairs. \"Add field\" appears when extra keys are allowed.\n// Values recurse through the shared pipeline, so a value that is itself an object\n// or array renders structurally and pre/post extensions apply to it.\nexport function StringMapControl({\n field,\n ctx,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n}) {\n // A read-only map marks its whole subtree non-editable: no rename/remove/add\n // and value inputs disabled.\n const readOnly = ctx.readOnly || field.readOnly === true;\n const map = isPlainObject(field.value)\n ? (field.value as Record<string, unknown>)\n : {};\n const known = field.knownProperties ?? {};\n const knownKeys = Object.keys(known);\n const extraKeys = Object.keys(map).filter((k) => !(k in known));\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n const properties = ctx.layout.mode === \"properties\";\n // What the map key IS (e.g. \"Address Role\"), from the key-constraint schema.\n const pn = field.schema.propertyNames as JsonSchemaProperty | undefined;\n const keyTitle =\n typeof pn?.title === \"string\" && pn.title ? pn.title : undefined;\n\n // valueSchemaForKey picks an entry's value schema: the first patternProperties\n // entry whose regex matches the key, else the `additionalProperties` schema,\n // else a bare string. Lets the value form vary by key (e.g. House vs Apartment).\n function valueSchemaForKey(key: string): JsonSchemaProperty {\n for (const { pattern, schema } of field.valuePatternSchemas ?? []) {\n let re: RegExp | undefined;\n try {\n re = new RegExp(pattern);\n } catch {\n re = undefined; // a malformed pattern simply never matches\n }\n if (re?.test(key)) return schema;\n }\n return field.valueSchema ?? { type: \"string\" };\n }\n\n // When the entry value opts into a stacked layout (`x-layout: \"stack\"`), the\n // key+value render as one full-width stacked unit instead of a key column\n // beside the value. Resolved per key, since pattern schemas may differ.\n function entryIsStacked(key: string): boolean {\n return valueSchemaForKey(key)[\"x-layout\"] === \"stack\";\n }\n\n function setEntry(key: string, next: unknown) {\n field.onChange({ ...map, [key]: next });\n }\n function renameEntry(oldKey: string, newKey: string) {\n if (newKey === oldKey) return;\n const next: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(map))\n next[k === oldKey ? newKey : k] = v;\n field.onChange(next);\n }\n function removeEntry(key: string) {\n const next = { ...map };\n delete next[key];\n field.onChange(next);\n }\n function addEntry() {\n if (\"\" in map) return;\n field.onChange({ ...map, \"\": \"\" });\n }\n\n function valueControlFor(\n key: string,\n valueSchema: JsonSchemaProperty,\n ): ReactNode {\n const nodes = ctx.render.renderFieldNodes(\n {\n key,\n prop: valueSchema,\n required: false,\n value: map[key] ?? \"\",\n onChange: (next) => setEntry(key, next),\n instancePath: appendInstancePath(ctx.instancePath, key),\n },\n childCtx,\n );\n return nodes?.value ?? null;\n }\n\n // valueControlForKey resolves the per-key value schema (patternProperties /\n // additionalProperties) before rendering, so the form varies by key.\n function valueControlForKey(key: string): ReactNode {\n return valueControlFor(key, valueSchemaForKey(key));\n }\n\n function keyEditor({\n key,\n value,\n onChange,\n }: {\n key: string;\n value: string;\n onChange: (next: string) => void;\n }) {\n const size = properties ? propertyControlSize[ctx.size] : ctx.size;\n return field.keyOptions ? (\n <Combobox\n options={keyPickerOptions(\n field.keyOptions,\n [...knownKeys, ...extraKeys],\n key,\n )}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue={false}\n onChange={onChange}\n placeholder=\"Select…\"\n />\n ) : (\n <input\n type=\"text\"\n aria-label=\"Field name\"\n className={cn(inputClass(size), \"font-mono\")}\n value={value}\n disabled={readOnly}\n onChange={(event) => onChange(event.target.value)}\n />\n );\n }\n\n return (\n <div\n className={cn(\n properties ? \"col-span-full grid grid-cols-subgrid\" : \"flex flex-col\",\n !properties &&\n !ctx.presentation &&\n \"rounded-md border border-input p-2\",\n !properties && fieldInnerGapClass[childCtx.size],\n )}\n >\n {knownKeys.map((key) =>\n properties ? (\n <div key={`known-${key}`} className=\"contents\">\n {ctx.render.renderFieldRow(\n {\n key,\n prop: known[key]!,\n required:\n Array.isArray(field.schema.required) &&\n field.schema.required.includes(key),\n value: map[key],\n onChange: (next) => setEntry(key, next),\n instancePath: appendInstancePath(ctx.instancePath, key),\n },\n childCtx,\n )}\n </div>\n ) : (\n <div\n key={`known-${key}`}\n className=\"grid grid-cols-[10rem_1fr] items-center gap-2\"\n >\n <label\n htmlFor={fieldInputId(\n appendInstancePath(ctx.instancePath, key),\n childCtx.idPrefix,\n )}\n className=\"truncate text-xs text-muted-foreground\"\n title={key}\n >\n {key}\n </label>\n <div className=\"min-w-0\">\n {valueControlFor(key, known[key] ?? { type: \"string\" })}\n </div>\n </div>\n ),\n )}\n {extraKeys.map((key) => {\n const keyControl = ctx.presentation ? (\n <span\n className={cn(\n \"flex min-w-0 items-center break-words text-xs\",\n controlHeightClass[childCtx.size],\n field.keyOptions\n ? \"text-foreground\"\n : \"font-mono text-muted-foreground\",\n )}\n >\n {field.keyOptions?.find((option) => option.value === key)?.label ??\n key}\n </span>\n ) : (\n keyEditor({\n key,\n value: key,\n onChange: (next) => renameEntry(key, next),\n })\n );\n const removeButton = !readOnly ? (\n <button\n type=\"button\"\n aria-label={`Remove ${key}`}\n className={cn(\n \"inline-flex aspect-square shrink-0 items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\",\n controlHeightClass[childCtx.size],\n )}\n onClick={() => removeEntry(key)}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n ) : null;\n if (properties) {\n const instancePath = appendInstancePath(ctx.instancePath, key);\n const keyLabel =\n field.keyOptions?.find((option) => option.value === key)?.label ??\n (key || \"New field\");\n return (\n <div key={`extra-${key}`} className=\"contents\">\n {ctx.render.renderFieldRow(\n {\n key,\n prop: { ...valueSchemaForKey(key), title: keyLabel },\n required: false,\n value: map[key],\n onChange: (next) => setEntry(key, next),\n instancePath,\n },\n {\n ...childCtx,\n post: [\n ...childCtx.post,\n (entry, nodes, postCtx) =>\n postCtx?.instancePath !== instancePath\n ? nodes\n : {\n ...nodes,\n label: (\n <>\n <span className=\"sr-only\">{nodes.label}</span>\n <PropertyValueEditor\n actionsPlacement=\"row\"\n field={{\n ...entry,\n kind: \"string\",\n label: `${keyLabel} key`,\n value: key,\n onChange: (next) =>\n renameEntry(key, String(next)),\n }}\n fieldId={`${fieldInputId(instancePath, ctx.idPrefix)}-key`}\n ctx={{\n ...childCtx,\n size: propertyControlSize[ctx.size],\n }}\n renderPreview={(previewField) => (\n <span>{String(previewField.value)}</span>\n )}\n renderEditor={(draft) => (\n <div className=\"flex min-w-0 items-center gap-1\">\n {keyEditor({\n key,\n value: String(draft.value),\n onChange: draft.onChange,\n })}\n {removeButton}\n </div>\n )}\n />\n </>\n ),\n },\n ],\n },\n )}\n </div>\n );\n }\n // When the value is stacked (`x-layout: \"stack\"` on the entry schema),\n // the key joins the stack: it sits full-width above its value as one\n // unit, rather than cramped in a fixed key column beside it. The key\n // picker is labelled from `propertyNames.title` so a constrained key\n // (e.g. an AsCode role) says what it is.\n if (entryIsStacked(key)) {\n return (\n <div\n key={`extra-${key}`}\n className={cn(\n \"space-y-1.5\",\n !ctx.presentation && \"rounded-md border border-input p-2\",\n )}\n >\n {keyTitle && (\n <span className=\"block text-xs font-medium text-muted-foreground\">\n {keyTitle}\n </span>\n )}\n <div className=\"flex items-center gap-2\">\n <div className=\"min-w-0 flex-1\">{keyControl}</div>\n {removeButton}\n </div>\n <div className=\"min-w-0\">{valueControlForKey(key)}</div>\n </div>\n );\n }\n return (\n <div\n key={`extra-${key}`}\n className={cn(\n \"grid items-center gap-2\",\n ctx.presentation\n ? \"grid-cols-[minmax(0,10rem)_minmax(0,1fr)]\"\n : \"grid-cols-[10rem_1fr_auto]\",\n )}\n >\n {keyControl}\n <div className=\"min-w-0\">{valueControlForKey(key)}</div>\n {removeButton}\n </div>\n );\n })}\n {!readOnly && field.allowExtraKeys !== false && (\n <Button\n type=\"button\"\n variant={properties ? \"ghost\" : \"outline\"}\n onClick={addEntry}\n className={cn(\n \"gap-1.5\",\n properties && \"col-span-full justify-self-start m-1\",\n inputSizeClass[\n properties ? propertyControlSize[ctx.size] : childCtx.size\n ],\n )}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add field\n </Button>\n )}\n </div>\n );\n}\n"],"names":["isPlainObject","jsx","FieldsGrid","normalizeColumns","cssLength","DEFAULT_COLUMN_MIN_WIDTH","appendInstancePath","propertyControlSize","Combobox","keyPickerOptions","cn","inputClass","jsxs","fieldInnerGapClass","fieldInputId","controlHeightClass","Icon","UiTrash","Fragment","PropertyValueEditor","Button","inputSizeClass","UiAdd"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-object.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-object.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EAGZ,aAAa,EACd,MAAM,0BAA0B,CAAC;AAsBlC,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;CACpB,+BA+DA;AAOD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;CACpB,+BA0UA"}
1
+ {"version":3,"file":"json-schema-form-object.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-object.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,YAAY,EAGZ,aAAa,EACd,MAAM,0BAA0B,CAAC;AAsBlC,wBAAgB,aAAa,CAAC,EAC5B,KAAK,EACL,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;CACpB,+BAkEA;AAOD,wBAAgB,gBAAgB,CAAC,EAC/B,KAAK,EACL,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;CACpB,+BA0UA"}
@@ -23,6 +23,9 @@ function ObjectControl({
23
23
  properties: field.objectProperties ?? {},
24
24
  ...field.objectRequired ? { required: field.objectRequired } : {},
25
25
  ...Array.isArray(field.schema.allOf) ? { allOf: field.schema.allOf } : {},
26
+ // Copied whatever its shape, so a malformed value fails loudly in the
27
+ // listener collector rather than vanishing here.
28
+ ...field.schema["x-on-load"] !== void 0 ? { "x-on-load": field.schema["x-on-load"] } : {},
26
29
  ...Array.isArray(field.schema["x-order"]) ? { "x-order": field.schema["x-order"] } : {},
27
30
  // Every object-level layout keyword must be copied here or it works at the
28
31
  // top level and silently dies one level down — which is exactly where these