@flanksource/clicky-ui 0.3.54 → 0.3.56

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 (999) hide show
  1. package/NOTICE.md +6 -0
  2. package/dist/ai.cjs +6 -0
  3. package/dist/ai.js +3 -1
  4. package/dist/chat.cjs +2 -0
  5. package/dist/chat.d.ts +1 -0
  6. package/dist/chat.d.ts.map +1 -1
  7. package/dist/chat.js +2 -1
  8. package/dist/comments/CommentCard.cjs +37 -7
  9. package/dist/comments/CommentCard.cjs.map +1 -1
  10. package/dist/comments/CommentCard.d.ts +11 -1
  11. package/dist/comments/CommentCard.d.ts.map +1 -1
  12. package/dist/comments/CommentCard.js +37 -7
  13. package/dist/comments/CommentCard.js.map +1 -1
  14. package/dist/comments/CommentCardParts.cjs +9 -4
  15. package/dist/comments/CommentCardParts.cjs.map +1 -1
  16. package/dist/comments/CommentCardParts.d.ts.map +1 -1
  17. package/dist/comments/CommentCardParts.js +9 -4
  18. package/dist/comments/CommentCardParts.js.map +1 -1
  19. package/dist/comments/CommentComposer.cjs +8 -8
  20. package/dist/comments/CommentComposer.cjs.map +1 -1
  21. package/dist/comments/CommentComposer.d.ts.map +1 -1
  22. package/dist/comments/CommentComposer.js +8 -8
  23. package/dist/comments/CommentComposer.js.map +1 -1
  24. package/dist/comments/CommentProvider.cjs +5 -1
  25. package/dist/comments/CommentProvider.cjs.map +1 -1
  26. package/dist/comments/CommentProvider.d.ts +1 -1
  27. package/dist/comments/CommentProvider.d.ts.map +1 -1
  28. package/dist/comments/CommentProvider.js +5 -1
  29. package/dist/comments/CommentProvider.js.map +1 -1
  30. package/dist/comments/CommentSidePanel.cjs +17 -11
  31. package/dist/comments/CommentSidePanel.cjs.map +1 -1
  32. package/dist/comments/CommentSidePanel.d.ts +6 -0
  33. package/dist/comments/CommentSidePanel.d.ts.map +1 -1
  34. package/dist/comments/CommentSidePanel.js +17 -11
  35. package/dist/comments/CommentSidePanel.js.map +1 -1
  36. package/dist/comments/CommentThread.cjs +4 -1
  37. package/dist/comments/CommentThread.cjs.map +1 -1
  38. package/dist/comments/CommentThread.d.ts +4 -1
  39. package/dist/comments/CommentThread.d.ts.map +1 -1
  40. package/dist/comments/CommentThread.js +4 -1
  41. package/dist/comments/CommentThread.js.map +1 -1
  42. package/dist/comments/CommentThreadList.cjs +6 -3
  43. package/dist/comments/CommentThreadList.cjs.map +1 -1
  44. package/dist/comments/CommentThreadList.d.ts +7 -2
  45. package/dist/comments/CommentThreadList.d.ts.map +1 -1
  46. package/dist/comments/CommentThreadList.js +6 -3
  47. package/dist/comments/CommentThreadList.js.map +1 -1
  48. package/dist/comments/MentionTextarea.cjs +1 -1
  49. package/dist/comments/MentionTextarea.cjs.map +1 -1
  50. package/dist/comments/MentionTextarea.d.ts.map +1 -1
  51. package/dist/comments/MentionTextarea.js +1 -1
  52. package/dist/comments/MentionTextarea.js.map +1 -1
  53. package/dist/comments/comment-assign.cjs +68 -0
  54. package/dist/comments/comment-assign.cjs.map +1 -0
  55. package/dist/comments/comment-assign.d.ts +31 -0
  56. package/dist/comments/comment-assign.d.ts.map +1 -0
  57. package/dist/comments/comment-assign.js +67 -0
  58. package/dist/comments/comment-assign.js.map +1 -0
  59. package/dist/comments/comment-types.cjs.map +1 -1
  60. package/dist/comments/comment-types.d.ts +39 -0
  61. package/dist/comments/comment-types.d.ts.map +1 -1
  62. package/dist/comments/comment-types.js.map +1 -1
  63. package/dist/comments/comment-utils.cjs +2 -0
  64. package/dist/comments/comment-utils.cjs.map +1 -1
  65. package/dist/comments/comment-utils.d.ts +2 -0
  66. package/dist/comments/comment-utils.d.ts.map +1 -1
  67. package/dist/comments/comment-utils.js +2 -0
  68. package/dist/comments/comment-utils.js.map +1 -1
  69. package/dist/comments.cjs +3 -0
  70. package/dist/comments.d.ts +1 -0
  71. package/dist/comments.d.ts.map +1 -1
  72. package/dist/comments.js +2 -1
  73. package/dist/components/ComboboxMenu.cjs +23 -13
  74. package/dist/components/ComboboxMenu.cjs.map +1 -1
  75. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  76. package/dist/components/ComboboxMenu.js +23 -13
  77. package/dist/components/ComboboxMenu.js.map +1 -1
  78. package/dist/components/FilterBar.cjs +29 -6
  79. package/dist/components/FilterBar.cjs.map +1 -1
  80. package/dist/components/FilterBar.d.ts +3 -1
  81. package/dist/components/FilterBar.d.ts.map +1 -1
  82. package/dist/components/FilterBar.js +29 -6
  83. package/dist/components/FilterBar.js.map +1 -1
  84. package/dist/components/ItemActions.cjs +1 -1
  85. package/dist/components/ItemActions.cjs.map +1 -1
  86. package/dist/components/ItemActions.js +1 -1
  87. package/dist/components/ItemActions.js.map +1 -1
  88. package/dist/components/ListMenu.cjs +33 -3
  89. package/dist/components/ListMenu.cjs.map +1 -1
  90. package/dist/components/ListMenu.d.ts +4 -1
  91. package/dist/components/ListMenu.d.ts.map +1 -1
  92. package/dist/components/ListMenu.js +33 -3
  93. package/dist/components/ListMenu.js.map +1 -1
  94. package/dist/components/ListMenuItems.cjs +80 -0
  95. package/dist/components/ListMenuItems.cjs.map +1 -0
  96. package/dist/components/ListMenuItems.d.ts +8 -0
  97. package/dist/components/ListMenuItems.d.ts.map +1 -0
  98. package/dist/components/ListMenuItems.js +80 -0
  99. package/dist/components/ListMenuItems.js.map +1 -0
  100. package/dist/components/LocalPathPicker.cjs +182 -0
  101. package/dist/components/LocalPathPicker.cjs.map +1 -0
  102. package/dist/components/LocalPathPicker.d.ts +11 -0
  103. package/dist/components/LocalPathPicker.d.ts.map +1 -0
  104. package/dist/components/LocalPathPicker.js +182 -0
  105. package/dist/components/LocalPathPicker.js.map +1 -0
  106. package/dist/components/LocalPathTree.cjs +89 -0
  107. package/dist/components/LocalPathTree.cjs.map +1 -0
  108. package/dist/components/LocalPathTree.d.ts +9 -0
  109. package/dist/components/LocalPathTree.d.ts.map +1 -0
  110. package/dist/components/LocalPathTree.js +89 -0
  111. package/dist/components/LocalPathTree.js.map +1 -0
  112. package/dist/components/RangeSlider.cjs +10 -30
  113. package/dist/components/RangeSlider.cjs.map +1 -1
  114. package/dist/components/RangeSlider.d.ts.map +1 -1
  115. package/dist/components/RangeSlider.js +4 -24
  116. package/dist/components/RangeSlider.js.map +1 -1
  117. package/dist/components/Slider.cjs +79 -0
  118. package/dist/components/Slider.cjs.map +1 -0
  119. package/dist/components/Slider.d.ts +23 -0
  120. package/dist/components/Slider.d.ts.map +1 -0
  121. package/dist/components/Slider.js +79 -0
  122. package/dist/components/Slider.js.map +1 -0
  123. package/dist/components/combobox-types.d.ts +4 -1
  124. package/dist/components/combobox-types.d.ts.map +1 -1
  125. package/dist/components/filter-bar-field-utils.cjs +3 -5
  126. package/dist/components/filter-bar-field-utils.cjs.map +1 -1
  127. package/dist/components/filter-bar-field-utils.d.ts.map +1 -1
  128. package/dist/components/filter-bar-field-utils.js +3 -5
  129. package/dist/components/filter-bar-field-utils.js.map +1 -1
  130. package/dist/components/filter-bar-tree-model.cjs +22 -0
  131. package/dist/components/filter-bar-tree-model.cjs.map +1 -0
  132. package/dist/components/filter-bar-tree-model.d.ts +33 -0
  133. package/dist/components/filter-bar-tree-model.d.ts.map +1 -0
  134. package/dist/components/filter-bar-tree-model.js +21 -0
  135. package/dist/components/filter-bar-tree-model.js.map +1 -0
  136. package/dist/components/filter-bar-tree.cjs +84 -0
  137. package/dist/components/filter-bar-tree.cjs.map +1 -0
  138. package/dist/components/filter-bar-tree.d.ts +7 -0
  139. package/dist/components/filter-bar-tree.d.ts.map +1 -0
  140. package/dist/components/filter-bar-tree.js +84 -0
  141. package/dist/components/filter-bar-tree.js.map +1 -0
  142. package/dist/components/json-schema-form-debug-glyph-map.cjs +2 -0
  143. package/dist/components/json-schema-form-debug-glyph-map.cjs.map +1 -1
  144. package/dist/components/json-schema-form-debug-glyph-map.d.ts.map +1 -1
  145. package/dist/components/json-schema-form-debug-glyph-map.js +2 -0
  146. package/dist/components/json-schema-form-debug-glyph-map.js.map +1 -1
  147. package/dist/components/json-schema-form-help-links.cjs +18 -0
  148. package/dist/components/json-schema-form-help-links.cjs.map +1 -0
  149. package/dist/components/json-schema-form-help-links.d.ts +5 -0
  150. package/dist/components/json-schema-form-help-links.d.ts.map +1 -0
  151. package/dist/components/json-schema-form-help-links.js +18 -0
  152. package/dist/components/json-schema-form-help-links.js.map +1 -0
  153. package/dist/components/json-schema-form-help-model.cjs +7 -0
  154. package/dist/components/json-schema-form-help-model.cjs.map +1 -0
  155. package/dist/components/json-schema-form-help-model.d.ts +3 -0
  156. package/dist/components/json-schema-form-help-model.d.ts.map +1 -0
  157. package/dist/components/json-schema-form-help-model.js +7 -0
  158. package/dist/components/json-schema-form-help-model.js.map +1 -0
  159. package/dist/components/json-schema-form-json.cjs +48 -0
  160. package/dist/components/json-schema-form-json.cjs.map +1 -0
  161. package/dist/components/json-schema-form-json.d.ts +7 -0
  162. package/dist/components/json-schema-form-json.d.ts.map +1 -0
  163. package/dist/components/json-schema-form-json.js +48 -0
  164. package/dist/components/json-schema-form-json.js.map +1 -0
  165. package/dist/components/json-schema-form-layout.cjs +7 -5
  166. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  167. package/dist/components/json-schema-form-layout.d.ts +2 -2
  168. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  169. package/dist/components/json-schema-form-layout.js +7 -5
  170. package/dist/components/json-schema-form-layout.js.map +1 -1
  171. package/dist/components/json-schema-form-object.cjs +2 -13
  172. package/dist/components/json-schema-form-object.cjs.map +1 -1
  173. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  174. package/dist/components/json-schema-form-object.js +2 -13
  175. package/dist/components/json-schema-form-object.js.map +1 -1
  176. package/dist/components/json-schema-form-refs.cjs +1 -1
  177. package/dist/components/json-schema-form-refs.cjs.map +1 -1
  178. package/dist/components/json-schema-form-refs.d.ts.map +1 -1
  179. package/dist/components/json-schema-form-refs.js +1 -1
  180. package/dist/components/json-schema-form-refs.js.map +1 -1
  181. package/dist/components/json-schema-form-render.cjs +20 -6
  182. package/dist/components/json-schema-form-render.cjs.map +1 -1
  183. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  184. package/dist/components/json-schema-form-render.js +20 -6
  185. package/dist/components/json-schema-form-render.js.map +1 -1
  186. package/dist/components/json-schema-form-resolve.cjs +22 -2
  187. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  188. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  189. package/dist/components/json-schema-form-resolve.js +22 -2
  190. package/dist/components/json-schema-form-resolve.js.map +1 -1
  191. package/dist/components/json-schema-form-types.d.ts +5 -1
  192. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  193. package/dist/components/json-schema-form-union-model.cjs +46 -0
  194. package/dist/components/json-schema-form-union-model.cjs.map +1 -0
  195. package/dist/components/json-schema-form-union-model.d.ts +6 -0
  196. package/dist/components/json-schema-form-union-model.d.ts.map +1 -0
  197. package/dist/components/json-schema-form-union-model.js +43 -0
  198. package/dist/components/json-schema-form-union-model.js.map +1 -0
  199. package/dist/components/json-schema-form-union.cjs +52 -0
  200. package/dist/components/json-schema-form-union.cjs.map +1 -0
  201. package/dist/components/json-schema-form-union.d.ts +7 -0
  202. package/dist/components/json-schema-form-union.d.ts.map +1 -0
  203. package/dist/components/json-schema-form-union.js +52 -0
  204. package/dist/components/json-schema-form-union.js.map +1 -0
  205. package/dist/components/list-menu-virtual.cjs +5 -0
  206. package/dist/components/list-menu-virtual.cjs.map +1 -0
  207. package/dist/components/list-menu-virtual.d.ts +12 -0
  208. package/dist/components/list-menu-virtual.d.ts.map +1 -0
  209. package/dist/components/list-menu-virtual.js +6 -0
  210. package/dist/components/list-menu-virtual.js.map +1 -0
  211. package/dist/components/local-path.cjs +12 -0
  212. package/dist/components/local-path.cjs.map +1 -0
  213. package/dist/components/local-path.d.ts +14 -0
  214. package/dist/components/local-path.d.ts.map +1 -0
  215. package/dist/components/local-path.js +12 -0
  216. package/dist/components/local-path.js.map +1 -0
  217. package/dist/components/slider-shared.cjs +32 -0
  218. package/dist/components/slider-shared.cjs.map +1 -0
  219. package/dist/components/slider-shared.d.ts +18 -0
  220. package/dist/components/slider-shared.d.ts.map +1 -0
  221. package/dist/components/slider-shared.js +27 -0
  222. package/dist/components/slider-shared.js.map +1 -0
  223. package/dist/components.cjs +8 -0
  224. package/dist/components.d.ts +6 -1
  225. package/dist/components.d.ts.map +1 -1
  226. package/dist/components.js +5 -1
  227. package/dist/connections/ConnectionsPage.cjs +51 -19
  228. package/dist/connections/ConnectionsPage.cjs.map +1 -1
  229. package/dist/connections/ConnectionsPage.d.ts +9 -1
  230. package/dist/connections/ConnectionsPage.d.ts.map +1 -1
  231. package/dist/connections/ConnectionsPage.js +52 -20
  232. package/dist/connections/ConnectionsPage.js.map +1 -1
  233. package/dist/connections/connectionDashboard.cjs +13 -8
  234. package/dist/connections/connectionDashboard.cjs.map +1 -1
  235. package/dist/connections/connectionDashboard.d.ts +8 -3
  236. package/dist/connections/connectionDashboard.d.ts.map +1 -1
  237. package/dist/connections/connectionDashboard.js +14 -9
  238. package/dist/connections/connectionDashboard.js.map +1 -1
  239. package/dist/connections/connectionDashboardModel.cjs.map +1 -1
  240. package/dist/connections/connectionDashboardModel.d.ts +4 -0
  241. package/dist/connections/connectionDashboardModel.d.ts.map +1 -1
  242. package/dist/connections/connectionDashboardModel.js.map +1 -1
  243. package/dist/connections/connectionDashboardRow.cjs +75 -55
  244. package/dist/connections/connectionDashboardRow.cjs.map +1 -1
  245. package/dist/connections/connectionDashboardRow.d.ts +3 -2
  246. package/dist/connections/connectionDashboardRow.d.ts.map +1 -1
  247. package/dist/connections/connectionDashboardRow.js +75 -55
  248. package/dist/connections/connectionDashboardRow.js.map +1 -1
  249. package/dist/connections/connectionNamespaceField.cjs +17 -0
  250. package/dist/connections/connectionNamespaceField.cjs.map +1 -0
  251. package/dist/connections/connectionNamespaceField.d.ts +10 -0
  252. package/dist/connections/connectionNamespaceField.d.ts.map +1 -0
  253. package/dist/connections/connectionNamespaceField.js +17 -0
  254. package/dist/connections/connectionNamespaceField.js.map +1 -0
  255. package/dist/connections/connectionSchemaFormExtensions.cjs +98 -0
  256. package/dist/connections/connectionSchemaFormExtensions.cjs.map +1 -0
  257. package/dist/connections/connectionSchemaFormExtensions.d.ts +41 -0
  258. package/dist/connections/connectionSchemaFormExtensions.d.ts.map +1 -0
  259. package/dist/connections/connectionSchemaFormExtensions.js +96 -0
  260. package/dist/connections/connectionSchemaFormExtensions.js.map +1 -0
  261. package/dist/connections/connectionsPageModel.cjs +11 -0
  262. package/dist/connections/connectionsPageModel.cjs.map +1 -1
  263. package/dist/connections/connectionsPageModel.d.ts +5 -0
  264. package/dist/connections/connectionsPageModel.d.ts.map +1 -1
  265. package/dist/connections/connectionsPageModel.js +11 -1
  266. package/dist/connections/connectionsPageModel.js.map +1 -1
  267. package/dist/connections.cjs +5 -0
  268. package/dist/connections.d.ts +2 -1
  269. package/dist/connections.d.ts.map +1 -1
  270. package/dist/connections.js +3 -2
  271. package/dist/data/AvatarBadge.cjs +3 -3
  272. package/dist/data/AvatarBadge.cjs.map +1 -1
  273. package/dist/data/AvatarBadge.js +3 -3
  274. package/dist/data/AvatarBadge.js.map +1 -1
  275. package/dist/data/CodeDiff.cjs +2 -0
  276. package/dist/data/CodeDiff.cjs.map +1 -1
  277. package/dist/data/CodeDiff.js +2 -0
  278. package/dist/data/CodeDiff.js.map +1 -1
  279. package/dist/data/DataTable.cjs +3 -2
  280. package/dist/data/DataTable.cjs.map +1 -1
  281. package/dist/data/DataTable.d.ts.map +1 -1
  282. package/dist/data/DataTable.js +3 -2
  283. package/dist/data/DataTable.js.map +1 -1
  284. package/dist/data/Gauge.cjs +1 -1
  285. package/dist/data/Gauge.cjs.map +1 -1
  286. package/dist/data/Gauge.js +1 -1
  287. package/dist/data/Gauge.js.map +1 -1
  288. package/dist/data/HighlightedTokens.cjs +2 -10
  289. package/dist/data/HighlightedTokens.cjs.map +1 -1
  290. package/dist/data/HighlightedTokens.d.ts.map +1 -1
  291. package/dist/data/HighlightedTokens.js +1 -9
  292. package/dist/data/HighlightedTokens.js.map +1 -1
  293. package/dist/data/Markdown.cjs +38 -11
  294. package/dist/data/Markdown.cjs.map +1 -1
  295. package/dist/data/Markdown.d.ts +9 -1
  296. package/dist/data/Markdown.d.ts.map +1 -1
  297. package/dist/data/Markdown.js +39 -12
  298. package/dist/data/Markdown.js.map +1 -1
  299. package/dist/data/MultiGaugeBar.cjs +157 -0
  300. package/dist/data/MultiGaugeBar.cjs.map +1 -0
  301. package/dist/data/MultiGaugeBar.d.ts +29 -0
  302. package/dist/data/MultiGaugeBar.d.ts.map +1 -0
  303. package/dist/data/MultiGaugeBar.js +157 -0
  304. package/dist/data/MultiGaugeBar.js.map +1 -0
  305. package/dist/data/OpenInFilesLink.cjs +27 -0
  306. package/dist/data/OpenInFilesLink.cjs.map +1 -0
  307. package/dist/data/OpenInFilesLink.d.ts +15 -0
  308. package/dist/data/OpenInFilesLink.d.ts.map +1 -0
  309. package/dist/data/OpenInFilesLink.js +27 -0
  310. package/dist/data/OpenInFilesLink.js.map +1 -0
  311. package/dist/data/ProgressBar.cjs +5 -3
  312. package/dist/data/ProgressBar.cjs.map +1 -1
  313. package/dist/data/ProgressBar.d.ts +5 -1
  314. package/dist/data/ProgressBar.d.ts.map +1 -1
  315. package/dist/data/ProgressBar.js +5 -3
  316. package/dist/data/ProgressBar.js.map +1 -1
  317. package/dist/data/ProgressBars.cjs +13 -5
  318. package/dist/data/ProgressBars.cjs.map +1 -1
  319. package/dist/data/ProgressBars.d.ts +6 -1
  320. package/dist/data/ProgressBars.d.ts.map +1 -1
  321. package/dist/data/ProgressBars.js +13 -5
  322. package/dist/data/ProgressBars.js.map +1 -1
  323. package/dist/data/Properties.cjs +3 -3
  324. package/dist/data/Properties.cjs.map +1 -1
  325. package/dist/data/Properties.js +3 -3
  326. package/dist/data/Properties.js.map +1 -1
  327. package/dist/data/TaskProgress.cjs +14 -6
  328. package/dist/data/TaskProgress.cjs.map +1 -1
  329. package/dist/data/TaskProgress.d.ts +3 -1
  330. package/dist/data/TaskProgress.d.ts.map +1 -1
  331. package/dist/data/TaskProgress.js +14 -6
  332. package/dist/data/TaskProgress.js.map +1 -1
  333. package/dist/data/TaskPrompts.cjs +96 -0
  334. package/dist/data/TaskPrompts.cjs.map +1 -0
  335. package/dist/data/TaskPrompts.d.ts +6 -0
  336. package/dist/data/TaskPrompts.d.ts.map +1 -0
  337. package/dist/data/TaskPrompts.js +96 -0
  338. package/dist/data/TaskPrompts.js.map +1 -0
  339. package/dist/data/TaskSnapshot.cjs.map +1 -1
  340. package/dist/data/TaskSnapshot.d.ts +3 -0
  341. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  342. package/dist/data/TaskSnapshot.js.map +1 -1
  343. package/dist/data/TimeseriesCoreBars.cjs +7 -3
  344. package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
  345. package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
  346. package/dist/data/TimeseriesCoreBars.js +8 -4
  347. package/dist/data/TimeseriesCoreBars.js.map +1 -1
  348. package/dist/data/TimeseriesGauge.cjs +12 -5
  349. package/dist/data/TimeseriesGauge.cjs.map +1 -1
  350. package/dist/data/TimeseriesGauge.d.ts.map +1 -1
  351. package/dist/data/TimeseriesGauge.js +13 -6
  352. package/dist/data/TimeseriesGauge.js.map +1 -1
  353. package/dist/data/TimeseriesPanel.cjs +10 -9
  354. package/dist/data/TimeseriesPanel.cjs.map +1 -1
  355. package/dist/data/TimeseriesPanel.d.ts +1 -1
  356. package/dist/data/TimeseriesPanel.d.ts.map +1 -1
  357. package/dist/data/TimeseriesPanel.js +11 -10
  358. package/dist/data/TimeseriesPanel.js.map +1 -1
  359. package/dist/data/TimeseriesPanel.model.cjs +62 -10
  360. package/dist/data/TimeseriesPanel.model.cjs.map +1 -1
  361. package/dist/data/TimeseriesPanel.model.d.ts +40 -1
  362. package/dist/data/TimeseriesPanel.model.d.ts.map +1 -1
  363. package/dist/data/TimeseriesPanel.model.js +62 -11
  364. package/dist/data/TimeseriesPanel.model.js.map +1 -1
  365. package/dist/data/WorkloadCard.cjs +7 -3
  366. package/dist/data/WorkloadCard.cjs.map +1 -1
  367. package/dist/data/WorkloadCard.d.ts +3 -1
  368. package/dist/data/WorkloadCard.d.ts.map +1 -1
  369. package/dist/data/WorkloadCard.js +7 -3
  370. package/dist/data/WorkloadCard.js.map +1 -1
  371. package/dist/data/WorkloadCard.model.cjs.map +1 -1
  372. package/dist/data/WorkloadCard.model.d.ts +2 -0
  373. package/dist/data/WorkloadCard.model.d.ts.map +1 -1
  374. package/dist/data/WorkloadCard.model.js.map +1 -1
  375. package/dist/data/ai/ChatWindow.placement.cjs +2 -1
  376. package/dist/data/ai/ChatWindow.placement.cjs.map +1 -1
  377. package/dist/data/ai/ChatWindow.placement.d.ts +1 -1
  378. package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -1
  379. package/dist/data/ai/ChatWindow.placement.js +2 -1
  380. package/dist/data/ai/ChatWindow.placement.js.map +1 -1
  381. package/dist/data/ai/SpecRuntimeBar.cjs +2 -2
  382. package/dist/data/ai/SpecRuntimeBar.cjs.map +1 -1
  383. package/dist/data/ai/SpecRuntimeBar.d.ts +4 -1
  384. package/dist/data/ai/SpecRuntimeBar.d.ts.map +1 -1
  385. package/dist/data/ai/SpecRuntimeBar.js +2 -2
  386. package/dist/data/ai/SpecRuntimeBar.js.map +1 -1
  387. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs +1 -1
  388. package/dist/data/ai/SpecRuntimeEditor/PromptSection.cjs.map +1 -1
  389. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js +1 -1
  390. package/dist/data/ai/SpecRuntimeEditor/PromptSection.js.map +1 -1
  391. package/dist/data/ai/SpecRuntimeEditor.model.cjs +2 -2
  392. package/dist/data/ai/SpecRuntimeEditor.model.cjs.map +1 -1
  393. package/dist/data/ai/SpecRuntimeEditor.model.d.ts +2 -2
  394. package/dist/data/ai/SpecRuntimeEditor.model.d.ts.map +1 -1
  395. package/dist/data/ai/SpecRuntimeEditor.model.js +2 -2
  396. package/dist/data/ai/SpecRuntimeEditor.model.js.map +1 -1
  397. package/dist/data/ai/ThreadPicker.cjs +2 -2
  398. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  399. package/dist/data/ai/ThreadPicker.js +2 -2
  400. package/dist/data/ai/ThreadPicker.js.map +1 -1
  401. package/dist/data/ai/index.d.ts +2 -0
  402. package/dist/data/ai/index.d.ts.map +1 -1
  403. package/dist/data/ai/use-prompt-run-stream.cjs +126 -0
  404. package/dist/data/ai/use-prompt-run-stream.cjs.map +1 -0
  405. package/dist/data/ai/use-prompt-run-stream.d.ts +52 -0
  406. package/dist/data/ai/use-prompt-run-stream.d.ts.map +1 -0
  407. package/dist/data/ai/use-prompt-run-stream.js +126 -0
  408. package/dist/data/ai/use-prompt-run-stream.js.map +1 -0
  409. package/dist/data/cache-browser/CacheBrowser.cjs +1 -0
  410. package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -1
  411. package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -1
  412. package/dist/data/cache-browser/CacheBrowser.js +1 -0
  413. package/dist/data/cache-browser/CacheBrowser.js.map +1 -1
  414. package/dist/data/charts/BarChart.cjs +194 -0
  415. package/dist/data/charts/BarChart.cjs.map +1 -0
  416. package/dist/data/charts/BarChart.d.ts +19 -0
  417. package/dist/data/charts/BarChart.d.ts.map +1 -0
  418. package/dist/data/charts/BarChart.js +194 -0
  419. package/dist/data/charts/BarChart.js.map +1 -0
  420. package/dist/data/charts/ChartLegend.cjs +54 -0
  421. package/dist/data/charts/ChartLegend.cjs.map +1 -0
  422. package/dist/data/charts/ChartLegend.d.ts +17 -0
  423. package/dist/data/charts/ChartLegend.d.ts.map +1 -0
  424. package/dist/data/charts/ChartLegend.js +54 -0
  425. package/dist/data/charts/ChartLegend.js.map +1 -0
  426. package/dist/data/charts/Sparkline.cjs +56 -0
  427. package/dist/data/charts/Sparkline.cjs.map +1 -0
  428. package/dist/data/charts/Sparkline.d.ts +15 -0
  429. package/dist/data/charts/Sparkline.d.ts.map +1 -0
  430. package/dist/data/charts/Sparkline.js +56 -0
  431. package/dist/data/charts/Sparkline.js.map +1 -0
  432. package/dist/data/charts/StackedBarChart.cjs +241 -0
  433. package/dist/data/charts/StackedBarChart.cjs.map +1 -0
  434. package/dist/data/charts/StackedBarChart.d.ts +20 -0
  435. package/dist/data/charts/StackedBarChart.d.ts.map +1 -0
  436. package/dist/data/charts/StackedBarChart.js +241 -0
  437. package/dist/data/charts/StackedBarChart.js.map +1 -0
  438. package/dist/data/charts/TrendChart.cjs +157 -0
  439. package/dist/data/charts/TrendChart.cjs.map +1 -0
  440. package/dist/data/charts/TrendChart.d.ts +20 -0
  441. package/dist/data/charts/TrendChart.d.ts.map +1 -0
  442. package/dist/data/charts/TrendChart.js +157 -0
  443. package/dist/data/charts/TrendChart.js.map +1 -0
  444. package/dist/data/charts/chart-marks.cjs +115 -0
  445. package/dist/data/charts/chart-marks.cjs.map +1 -0
  446. package/dist/data/charts/chart-marks.d.ts +39 -0
  447. package/dist/data/charts/chart-marks.d.ts.map +1 -0
  448. package/dist/data/charts/chart-marks.js +112 -0
  449. package/dist/data/charts/chart-marks.js.map +1 -0
  450. package/dist/data/charts/chart-palette.cjs +74 -0
  451. package/dist/data/charts/chart-palette.cjs.map +1 -0
  452. package/dist/data/charts/chart-palette.d.ts +58 -0
  453. package/dist/data/charts/chart-palette.d.ts.map +1 -0
  454. package/dist/data/charts/chart-palette.js +72 -0
  455. package/dist/data/charts/chart-palette.js.map +1 -0
  456. package/dist/data/charts/chart-scale.cjs +115 -0
  457. package/dist/data/charts/chart-scale.cjs.map +1 -0
  458. package/dist/data/charts/chart-scale.d.ts +41 -0
  459. package/dist/data/charts/chart-scale.d.ts.map +1 -0
  460. package/dist/data/charts/chart-scale.js +104 -0
  461. package/dist/data/charts/chart-scale.js.map +1 -0
  462. package/dist/data/charts/chart.test-utils.d.ts +7 -0
  463. package/dist/data/charts/chart.test-utils.d.ts.map +1 -0
  464. package/dist/data/charts/index.d.ts +7 -0
  465. package/dist/data/charts/index.d.ts.map +1 -0
  466. package/dist/data/chat/MessageActions.cjs +1 -1
  467. package/dist/data/chat/MessageActions.cjs.map +1 -1
  468. package/dist/data/chat/MessageActions.js +1 -1
  469. package/dist/data/chat/MessageActions.js.map +1 -1
  470. package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +1 -1
  471. package/dist/data/diagnostics/DiagnosticsDetailPanel.js +1 -1
  472. package/dist/data/diagnostics/DiagnosticsTree.cjs +1 -1
  473. package/dist/data/diagnostics/DiagnosticsTree.cjs.map +1 -1
  474. package/dist/data/diagnostics/DiagnosticsTree.js +1 -1
  475. package/dist/data/diagnostics/DiagnosticsTree.js.map +1 -1
  476. package/dist/data/diagnostics/FrameSourceWindow.cjs +9 -2
  477. package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
  478. package/dist/data/diagnostics/FrameSourceWindow.d.ts +1 -1
  479. package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
  480. package/dist/data/diagnostics/FrameSourceWindow.js +9 -2
  481. package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
  482. package/dist/data/diagnostics/ProblemActions.cjs +37 -0
  483. package/dist/data/diagnostics/ProblemActions.cjs.map +1 -0
  484. package/dist/data/diagnostics/ProblemActions.d.ts +6 -0
  485. package/dist/data/diagnostics/ProblemActions.d.ts.map +1 -0
  486. package/dist/data/diagnostics/ProblemActions.js +37 -0
  487. package/dist/data/diagnostics/ProblemActions.js.map +1 -0
  488. package/dist/data/diagnostics/ProblemFacet.cjs +33 -0
  489. package/dist/data/diagnostics/ProblemFacet.cjs.map +1 -0
  490. package/dist/data/diagnostics/ProblemFacet.d.ts +9 -0
  491. package/dist/data/diagnostics/ProblemFacet.d.ts.map +1 -0
  492. package/dist/data/diagnostics/ProblemFacet.js +33 -0
  493. package/dist/data/diagnostics/ProblemFacet.js.map +1 -0
  494. package/dist/data/diagnostics/ProblemRow.cjs +62 -0
  495. package/dist/data/diagnostics/ProblemRow.cjs.map +1 -0
  496. package/dist/data/diagnostics/ProblemRow.d.ts +14 -0
  497. package/dist/data/diagnostics/ProblemRow.d.ts.map +1 -0
  498. package/dist/data/diagnostics/ProblemRow.js +62 -0
  499. package/dist/data/diagnostics/ProblemRow.js.map +1 -0
  500. package/dist/data/diagnostics/ProblemViewOptions.cjs +18 -0
  501. package/dist/data/diagnostics/ProblemViewOptions.cjs.map +1 -0
  502. package/dist/data/diagnostics/ProblemViewOptions.d.ts +6 -0
  503. package/dist/data/diagnostics/ProblemViewOptions.d.ts.map +1 -0
  504. package/dist/data/diagnostics/ProblemViewOptions.js +18 -0
  505. package/dist/data/diagnostics/ProblemViewOptions.js.map +1 -0
  506. package/dist/data/diagnostics/StackFrameRow.cjs +1 -1
  507. package/dist/data/diagnostics/StackFrameRow.cjs.map +1 -1
  508. package/dist/data/diagnostics/StackFrameRow.js +1 -1
  509. package/dist/data/diagnostics/StackFrameRow.js.map +1 -1
  510. package/dist/data/diagnostics/diagnostic-identity.cjs +14 -0
  511. package/dist/data/diagnostics/diagnostic-identity.cjs.map +1 -0
  512. package/dist/data/diagnostics/diagnostic-identity.d.ts +3 -0
  513. package/dist/data/diagnostics/diagnostic-identity.d.ts.map +1 -0
  514. package/dist/data/diagnostics/diagnostic-identity.js +14 -0
  515. package/dist/data/diagnostics/diagnostic-identity.js.map +1 -0
  516. package/dist/data/diagnostics/use-problem-expansion.cjs +16 -0
  517. package/dist/data/diagnostics/use-problem-expansion.cjs.map +1 -0
  518. package/dist/data/diagnostics/use-problem-expansion.d.ts +3 -0
  519. package/dist/data/diagnostics/use-problem-expansion.d.ts.map +1 -0
  520. package/dist/data/diagnostics/use-problem-expansion.js +16 -0
  521. package/dist/data/diagnostics/use-problem-expansion.js.map +1 -0
  522. package/dist/data/git/GitChangeList.cjs +9 -6
  523. package/dist/data/git/GitChangeList.cjs.map +1 -1
  524. package/dist/data/git/GitChangeList.d.ts +6 -0
  525. package/dist/data/git/GitChangeList.d.ts.map +1 -1
  526. package/dist/data/git/GitChangeList.js +9 -6
  527. package/dist/data/git/GitChangeList.js.map +1 -1
  528. package/dist/data/git/pickers/GitPickersDemo.d.ts.map +1 -1
  529. package/dist/data/git/pickers/ReferencePicker.cjs +1 -0
  530. package/dist/data/git/pickers/ReferencePicker.cjs.map +1 -1
  531. package/dist/data/git/pickers/ReferencePicker.js +1 -0
  532. package/dist/data/git/pickers/ReferencePicker.js.map +1 -1
  533. package/dist/data/lint/LintDetail.cjs +230 -189
  534. package/dist/data/lint/LintDetail.cjs.map +1 -1
  535. package/dist/data/lint/LintDetail.d.ts +25 -3
  536. package/dist/data/lint/LintDetail.d.ts.map +1 -1
  537. package/dist/data/lint/LintDetail.js +231 -192
  538. package/dist/data/lint/LintDetail.js.map +1 -1
  539. package/dist/data/lint/LintFilterBar.cjs +78 -83
  540. package/dist/data/lint/LintFilterBar.cjs.map +1 -1
  541. package/dist/data/lint/LintFilterBar.d.ts +23 -6
  542. package/dist/data/lint/LintFilterBar.d.ts.map +1 -1
  543. package/dist/data/lint/LintFilterBar.js +78 -85
  544. package/dist/data/lint/LintFilterBar.js.map +1 -1
  545. package/dist/data/lint/LintIgnoreMenu.cjs +59 -0
  546. package/dist/data/lint/LintIgnoreMenu.cjs.map +1 -0
  547. package/dist/data/lint/LintIgnoreMenu.d.ts +20 -0
  548. package/dist/data/lint/LintIgnoreMenu.d.ts.map +1 -0
  549. package/dist/data/lint/LintIgnoreMenu.js +58 -0
  550. package/dist/data/lint/LintIgnoreMenu.js.map +1 -0
  551. package/dist/data/lint/LintResults.cjs +59 -14
  552. package/dist/data/lint/LintResults.cjs.map +1 -1
  553. package/dist/data/lint/LintResults.d.ts +25 -1
  554. package/dist/data/lint/LintResults.d.ts.map +1 -1
  555. package/dist/data/lint/LintResults.fixtures.d.ts +19 -0
  556. package/dist/data/lint/LintResults.fixtures.d.ts.map +1 -1
  557. package/dist/data/lint/LintResults.js +60 -15
  558. package/dist/data/lint/LintResults.js.map +1 -1
  559. package/dist/data/lint/LintTable.cjs +156 -0
  560. package/dist/data/lint/LintTable.cjs.map +1 -0
  561. package/dist/data/lint/LintTable.d.ts +13 -0
  562. package/dist/data/lint/LintTable.d.ts.map +1 -0
  563. package/dist/data/lint/LintTable.js +156 -0
  564. package/dist/data/lint/LintTable.js.map +1 -0
  565. package/dist/data/lint/LintTreeNode.cjs +42 -19
  566. package/dist/data/lint/LintTreeNode.cjs.map +1 -1
  567. package/dist/data/lint/LintTreeNode.d.ts +7 -2
  568. package/dist/data/lint/LintTreeNode.d.ts.map +1 -1
  569. package/dist/data/lint/LintTreeNode.js +44 -21
  570. package/dist/data/lint/LintTreeNode.js.map +1 -1
  571. package/dist/data/lint/ViolationSnippet.cjs +113 -0
  572. package/dist/data/lint/ViolationSnippet.cjs.map +1 -0
  573. package/dist/data/lint/ViolationSnippet.d.ts +20 -0
  574. package/dist/data/lint/ViolationSnippet.d.ts.map +1 -0
  575. package/dist/data/lint/ViolationSnippet.js +112 -0
  576. package/dist/data/lint/ViolationSnippet.js.map +1 -0
  577. package/dist/data/lint/actions.cjs +44 -16
  578. package/dist/data/lint/actions.cjs.map +1 -1
  579. package/dist/data/lint/actions.d.ts +7 -3
  580. package/dist/data/lint/actions.d.ts.map +1 -1
  581. package/dist/data/lint/actions.js +44 -16
  582. package/dist/data/lint/actions.js.map +1 -1
  583. package/dist/data/lint/grouping.cjs +105 -8
  584. package/dist/data/lint/grouping.cjs.map +1 -1
  585. package/dist/data/lint/grouping.d.ts +21 -1
  586. package/dist/data/lint/grouping.d.ts.map +1 -1
  587. package/dist/data/lint/grouping.js +105 -10
  588. package/dist/data/lint/grouping.js.map +1 -1
  589. package/dist/data/lint/ignore-menu-items.cjs +18 -0
  590. package/dist/data/lint/ignore-menu-items.cjs.map +1 -0
  591. package/dist/data/lint/ignore-menu-items.d.ts +6 -0
  592. package/dist/data/lint/ignore-menu-items.d.ts.map +1 -0
  593. package/dist/data/lint/ignore-menu-items.js +17 -0
  594. package/dist/data/lint/ignore-menu-items.js.map +1 -0
  595. package/dist/data/lint/index.d.ts +7 -5
  596. package/dist/data/lint/index.d.ts.map +1 -1
  597. package/dist/data/lint/stats.cjs +19 -4
  598. package/dist/data/lint/stats.cjs.map +1 -1
  599. package/dist/data/lint/stats.d.ts +13 -3
  600. package/dist/data/lint/stats.d.ts.map +1 -1
  601. package/dist/data/lint/stats.js +17 -5
  602. package/dist/data/lint/stats.js.map +1 -1
  603. package/dist/data/lint/types.cjs +8 -0
  604. package/dist/data/lint/types.cjs.map +1 -1
  605. package/dist/data/lint/types.d.ts +47 -0
  606. package/dist/data/lint/types.d.ts.map +1 -1
  607. package/dist/data/lint/types.js +8 -1
  608. package/dist/data/lint/types.js.map +1 -1
  609. package/dist/data/lint/violation-menu-items.cjs +31 -0
  610. package/dist/data/lint/violation-menu-items.cjs.map +1 -0
  611. package/dist/data/lint/violation-menu-items.d.ts +12 -0
  612. package/dist/data/lint/violation-menu-items.d.ts.map +1 -0
  613. package/dist/data/lint/violation-menu-items.js +31 -0
  614. package/dist/data/lint/violation-menu-items.js.map +1 -0
  615. package/dist/data/markdown-source-blocks.cjs +38 -0
  616. package/dist/data/markdown-source-blocks.cjs.map +1 -0
  617. package/dist/data/markdown-source-blocks.d.ts +32 -0
  618. package/dist/data/markdown-source-blocks.d.ts.map +1 -0
  619. package/dist/data/markdown-source-blocks.js +35 -0
  620. package/dist/data/markdown-source-blocks.js.map +1 -0
  621. package/dist/data/test-runner/FilterFacet.cjs +52 -0
  622. package/dist/data/test-runner/FilterFacet.cjs.map +1 -0
  623. package/dist/data/test-runner/FilterFacet.d.ts +13 -0
  624. package/dist/data/test-runner/FilterFacet.d.ts.map +1 -0
  625. package/dist/data/test-runner/FilterFacet.js +52 -0
  626. package/dist/data/test-runner/FilterFacet.js.map +1 -0
  627. package/dist/data/test-runner/MatrixMarks.cjs +42 -40
  628. package/dist/data/test-runner/MatrixMarks.cjs.map +1 -1
  629. package/dist/data/test-runner/MatrixMarks.d.ts +20 -4
  630. package/dist/data/test-runner/MatrixMarks.d.ts.map +1 -1
  631. package/dist/data/test-runner/MatrixMarks.js +43 -42
  632. package/dist/data/test-runner/MatrixMarks.js.map +1 -1
  633. package/dist/data/test-runner/TestAttemptDetail.cjs +1 -1
  634. package/dist/data/test-runner/TestAttemptDetail.js +1 -1
  635. package/dist/data/test-runner/TestDetailPanel.cjs +11 -0
  636. package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
  637. package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
  638. package/dist/data/test-runner/TestDetailPanel.js +11 -0
  639. package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
  640. package/dist/data/test-runner/TestFilterBar.cjs +3 -44
  641. package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
  642. package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
  643. package/dist/data/test-runner/TestFilterBar.js +3 -44
  644. package/dist/data/test-runner/TestFilterBar.js.map +1 -1
  645. package/dist/data/test-runner/TestRunner.cjs +3 -1
  646. package/dist/data/test-runner/TestRunner.cjs.map +1 -1
  647. package/dist/data/test-runner/TestRunner.d.ts +7 -1
  648. package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
  649. package/dist/data/test-runner/TestRunner.js +3 -1
  650. package/dist/data/test-runner/TestRunner.js.map +1 -1
  651. package/dist/data/test-runner/context.cjs.map +1 -1
  652. package/dist/data/test-runner/context.d.ts +3 -0
  653. package/dist/data/test-runner/context.d.ts.map +1 -1
  654. package/dist/data/test-runner/context.js.map +1 -1
  655. package/dist/data/test-runner/index.d.ts +2 -2
  656. package/dist/data/test-runner/index.d.ts.map +1 -1
  657. package/dist/data/test-runner/matrix-marks.cjs +2 -11
  658. package/dist/data/test-runner/matrix-marks.cjs.map +1 -1
  659. package/dist/data/test-runner/matrix-marks.d.ts +2 -4
  660. package/dist/data/test-runner/matrix-marks.d.ts.map +1 -1
  661. package/dist/data/test-runner/matrix-marks.js +3 -11
  662. package/dist/data/test-runner/matrix-marks.js.map +1 -1
  663. package/dist/data/test-runner/types.d.ts +2 -0
  664. package/dist/data/test-runner/types.d.ts.map +1 -1
  665. package/dist/data/timeseries-query.cjs +98 -2
  666. package/dist/data/timeseries-query.cjs.map +1 -1
  667. package/dist/data/timeseries-query.d.ts +31 -5
  668. package/dist/data/timeseries-query.d.ts.map +1 -1
  669. package/dist/data/timeseries-query.js +98 -3
  670. package/dist/data/timeseries-query.js.map +1 -1
  671. package/dist/data/timeseries-stream-provider.cjs +38 -0
  672. package/dist/data/timeseries-stream-provider.cjs.map +1 -0
  673. package/dist/data/timeseries-stream-provider.d.ts +26 -0
  674. package/dist/data/timeseries-stream-provider.d.ts.map +1 -0
  675. package/dist/data/timeseries-stream-provider.js +38 -0
  676. package/dist/data/timeseries-stream-provider.js.map +1 -0
  677. package/dist/data/timeseries-stream.cjs +304 -0
  678. package/dist/data/timeseries-stream.cjs.map +1 -0
  679. package/dist/data/timeseries-stream.d.ts +81 -0
  680. package/dist/data/timeseries-stream.d.ts.map +1 -0
  681. package/dist/data/timeseries-stream.fixtures.d.ts +36 -0
  682. package/dist/data/timeseries-stream.fixtures.d.ts.map +1 -0
  683. package/dist/data/timeseries-stream.js +296 -0
  684. package/dist/data/timeseries-stream.js.map +1 -0
  685. package/dist/data/token-style.cjs +13 -0
  686. package/dist/data/token-style.cjs.map +1 -0
  687. package/dist/data/token-style.d.ts +4 -0
  688. package/dist/data/token-style.d.ts.map +1 -0
  689. package/dist/data/token-style.js +13 -0
  690. package/dist/data/token-style.js.map +1 -0
  691. package/dist/data/traces/ProcessTraceDetail.cjs +1 -1
  692. package/dist/data/traces/ProcessTraceDetail.js +1 -1
  693. package/dist/data/traces/index.d.ts +1 -1
  694. package/dist/data/traces/index.d.ts.map +1 -1
  695. package/dist/data/use-data-table-virtual.d.ts +1 -1
  696. package/dist/data/version-info.cjs +3 -3
  697. package/dist/data/version-info.js +3 -3
  698. package/dist/data/workload-panel/MemoryStack.cjs +49 -0
  699. package/dist/data/workload-panel/MemoryStack.cjs.map +1 -0
  700. package/dist/data/workload-panel/MemoryStack.d.ts +11 -0
  701. package/dist/data/workload-panel/MemoryStack.d.ts.map +1 -0
  702. package/dist/data/workload-panel/MemoryStack.js +48 -0
  703. package/dist/data/workload-panel/MemoryStack.js.map +1 -0
  704. package/dist/data/workload-panel/Metrics.cjs +197 -0
  705. package/dist/data/workload-panel/Metrics.cjs.map +1 -0
  706. package/dist/data/workload-panel/Metrics.d.ts +11 -0
  707. package/dist/data/workload-panel/Metrics.d.ts.map +1 -0
  708. package/dist/data/workload-panel/Metrics.js +196 -0
  709. package/dist/data/workload-panel/Metrics.js.map +1 -0
  710. package/dist/data/workload-panel/WorkloadPanel.cjs +66 -0
  711. package/dist/data/workload-panel/WorkloadPanel.cjs.map +1 -0
  712. package/dist/data/workload-panel/WorkloadPanel.d.ts +3 -0
  713. package/dist/data/workload-panel/WorkloadPanel.d.ts.map +1 -0
  714. package/dist/data/workload-panel/WorkloadPanel.js +66 -0
  715. package/dist/data/workload-panel/WorkloadPanel.js.map +1 -0
  716. package/dist/data/workload-panel/fixtures.d.ts +60 -0
  717. package/dist/data/workload-panel/fixtures.d.ts.map +1 -0
  718. package/dist/data/workload-panel/model.cjs +137 -0
  719. package/dist/data/workload-panel/model.cjs.map +1 -0
  720. package/dist/data/workload-panel/model.d.ts +53 -0
  721. package/dist/data/workload-panel/model.d.ts.map +1 -0
  722. package/dist/data/workload-panel/model.js +133 -0
  723. package/dist/data/workload-panel/model.js.map +1 -0
  724. package/dist/data/workload-panel/types.d.ts +56 -0
  725. package/dist/data/workload-panel/types.d.ts.map +1 -0
  726. package/dist/data.cjs +58 -7
  727. package/dist/data.d.ts +9 -1
  728. package/dist/data.d.ts.map +1 -1
  729. package/dist/data.js +29 -12
  730. package/dist/file-findings/AnnotatedCode.cjs +243 -0
  731. package/dist/file-findings/AnnotatedCode.cjs.map +1 -0
  732. package/dist/file-findings/AnnotatedCode.d.ts +30 -0
  733. package/dist/file-findings/AnnotatedCode.d.ts.map +1 -0
  734. package/dist/file-findings/AnnotatedCode.js +243 -0
  735. package/dist/file-findings/AnnotatedCode.js.map +1 -0
  736. package/dist/file-findings/FileFindingsView.cjs +213 -0
  737. package/dist/file-findings/FileFindingsView.cjs.map +1 -0
  738. package/dist/file-findings/FileFindingsView.d.ts +35 -0
  739. package/dist/file-findings/FileFindingsView.d.ts.map +1 -0
  740. package/dist/file-findings/FileFindingsView.js +213 -0
  741. package/dist/file-findings/FileFindingsView.js.map +1 -0
  742. package/dist/file-findings/LazyAnnotatedCode.cjs +22 -0
  743. package/dist/file-findings/LazyAnnotatedCode.cjs.map +1 -0
  744. package/dist/file-findings/LazyAnnotatedCode.d.ts +5 -0
  745. package/dist/file-findings/LazyAnnotatedCode.d.ts.map +1 -0
  746. package/dist/file-findings/LazyAnnotatedCode.js +22 -0
  747. package/dist/file-findings/LazyAnnotatedCode.js.map +1 -0
  748. package/dist/file-findings/adapters.cjs +155 -0
  749. package/dist/file-findings/adapters.cjs.map +1 -0
  750. package/dist/file-findings/adapters.d.ts +24 -0
  751. package/dist/file-findings/adapters.d.ts.map +1 -0
  752. package/dist/file-findings/adapters.js +153 -0
  753. package/dist/file-findings/adapters.js.map +1 -0
  754. package/dist/file-findings/file-review/CommentDraft.cjs +97 -0
  755. package/dist/file-findings/file-review/CommentDraft.cjs.map +1 -0
  756. package/dist/file-findings/file-review/CommentDraft.d.ts +25 -0
  757. package/dist/file-findings/file-review/CommentDraft.d.ts.map +1 -0
  758. package/dist/file-findings/file-review/CommentDraft.js +97 -0
  759. package/dist/file-findings/file-review/CommentDraft.js.map +1 -0
  760. package/dist/file-findings/file-review/FileReview.cjs +863 -0
  761. package/dist/file-findings/file-review/FileReview.cjs.map +1 -0
  762. package/dist/file-findings/file-review/FileReview.d.ts +79 -0
  763. package/dist/file-findings/file-review/FileReview.d.ts.map +1 -0
  764. package/dist/file-findings/file-review/FileReview.fixtures.d.ts +25 -0
  765. package/dist/file-findings/file-review/FileReview.fixtures.d.ts.map +1 -0
  766. package/dist/file-findings/file-review/FileReview.js +863 -0
  767. package/dist/file-findings/file-review/FileReview.js.map +1 -0
  768. package/dist/file-findings/file-review/InlineAuthors.cjs +77 -0
  769. package/dist/file-findings/file-review/InlineAuthors.cjs.map +1 -0
  770. package/dist/file-findings/file-review/InlineAuthors.d.ts +9 -0
  771. package/dist/file-findings/file-review/InlineAuthors.d.ts.map +1 -0
  772. package/dist/file-findings/file-review/InlineAuthors.js +77 -0
  773. package/dist/file-findings/file-review/InlineAuthors.js.map +1 -0
  774. package/dist/file-findings/file-review/InlineThread.cjs +77 -0
  775. package/dist/file-findings/file-review/InlineThread.cjs.map +1 -0
  776. package/dist/file-findings/file-review/InlineThread.d.ts +27 -0
  777. package/dist/file-findings/file-review/InlineThread.d.ts.map +1 -0
  778. package/dist/file-findings/file-review/InlineThread.js +77 -0
  779. package/dist/file-findings/file-review/InlineThread.js.map +1 -0
  780. package/dist/file-findings/file-review/ProblemsList.cjs +164 -0
  781. package/dist/file-findings/file-review/ProblemsList.cjs.map +1 -0
  782. package/dist/file-findings/file-review/ProblemsList.d.ts +15 -0
  783. package/dist/file-findings/file-review/ProblemsList.d.ts.map +1 -0
  784. package/dist/file-findings/file-review/ProblemsList.js +164 -0
  785. package/dist/file-findings/file-review/ProblemsList.js.map +1 -0
  786. package/dist/file-findings/file-review/SourceView.cjs +179 -0
  787. package/dist/file-findings/file-review/SourceView.cjs.map +1 -0
  788. package/dist/file-findings/file-review/SourceView.d.ts +29 -0
  789. package/dist/file-findings/file-review/SourceView.d.ts.map +1 -0
  790. package/dist/file-findings/file-review/SourceView.js +179 -0
  791. package/dist/file-findings/file-review/SourceView.js.map +1 -0
  792. package/dist/file-findings/file-review/blame.cjs +35 -0
  793. package/dist/file-findings/file-review/blame.cjs.map +1 -0
  794. package/dist/file-findings/file-review/blame.d.ts +28 -0
  795. package/dist/file-findings/file-review/blame.d.ts.map +1 -0
  796. package/dist/file-findings/file-review/blame.js +33 -0
  797. package/dist/file-findings/file-review/blame.js.map +1 -0
  798. package/dist/file-findings/file-review/geometry.cjs +101 -0
  799. package/dist/file-findings/file-review/geometry.cjs.map +1 -0
  800. package/dist/file-findings/file-review/geometry.d.ts +45 -0
  801. package/dist/file-findings/file-review/geometry.d.ts.map +1 -0
  802. package/dist/file-findings/file-review/geometry.js +98 -0
  803. package/dist/file-findings/file-review/geometry.js.map +1 -0
  804. package/dist/file-findings/file-review/hooks.cjs +101 -0
  805. package/dist/file-findings/file-review/hooks.cjs.map +1 -0
  806. package/dist/file-findings/file-review/hooks.d.ts +22 -0
  807. package/dist/file-findings/file-review/hooks.d.ts.map +1 -0
  808. package/dist/file-findings/file-review/hooks.js +99 -0
  809. package/dist/file-findings/file-review/hooks.js.map +1 -0
  810. package/dist/file-findings/file-review/marks.cjs +52 -0
  811. package/dist/file-findings/file-review/marks.cjs.map +1 -0
  812. package/dist/file-findings/file-review/marks.d.ts +23 -0
  813. package/dist/file-findings/file-review/marks.d.ts.map +1 -0
  814. package/dist/file-findings/file-review/marks.js +47 -0
  815. package/dist/file-findings/file-review/marks.js.map +1 -0
  816. package/dist/file-findings/file-review/problem-filters.cjs +14 -0
  817. package/dist/file-findings/file-review/problem-filters.cjs.map +1 -0
  818. package/dist/file-findings/file-review/problem-filters.d.ts +10 -0
  819. package/dist/file-findings/file-review/problem-filters.d.ts.map +1 -0
  820. package/dist/file-findings/file-review/problem-filters.js +13 -0
  821. package/dist/file-findings/file-review/problem-filters.js.map +1 -0
  822. package/dist/file-findings/file-review/quote-anchor.cjs +234 -0
  823. package/dist/file-findings/file-review/quote-anchor.cjs.map +1 -0
  824. package/dist/file-findings/file-review/quote-anchor.d.ts +54 -0
  825. package/dist/file-findings/file-review/quote-anchor.d.ts.map +1 -0
  826. package/dist/file-findings/file-review/quote-anchor.js +226 -0
  827. package/dist/file-findings/file-review/quote-anchor.js.map +1 -0
  828. package/dist/file-findings/file-review/source-anchor.cjs +104 -0
  829. package/dist/file-findings/file-review/source-anchor.cjs.map +1 -0
  830. package/dist/file-findings/file-review/source-anchor.d.ts +27 -0
  831. package/dist/file-findings/file-review/source-anchor.d.ts.map +1 -0
  832. package/dist/file-findings/file-review/source-anchor.js +99 -0
  833. package/dist/file-findings/file-review/source-anchor.js.map +1 -0
  834. package/dist/file-findings/file-review/source-marks.cjs +71 -0
  835. package/dist/file-findings/file-review/source-marks.cjs.map +1 -0
  836. package/dist/file-findings/file-review/source-marks.d.ts +27 -0
  837. package/dist/file-findings/file-review/source-marks.d.ts.map +1 -0
  838. package/dist/file-findings/file-review/source-marks.js +68 -0
  839. package/dist/file-findings/file-review/source-marks.js.map +1 -0
  840. package/dist/file-findings/findings-comments.cjs +136 -0
  841. package/dist/file-findings/findings-comments.cjs.map +1 -0
  842. package/dist/file-findings/findings-comments.d.ts +28 -0
  843. package/dist/file-findings/findings-comments.d.ts.map +1 -0
  844. package/dist/file-findings/findings-comments.js +131 -0
  845. package/dist/file-findings/findings-comments.js.map +1 -0
  846. package/dist/file-findings/findings-languages.cjs +53 -0
  847. package/dist/file-findings/findings-languages.cjs.map +1 -0
  848. package/dist/file-findings/findings-languages.d.ts +11 -0
  849. package/dist/file-findings/findings-languages.d.ts.map +1 -0
  850. package/dist/file-findings/findings-languages.js +53 -0
  851. package/dist/file-findings/findings-languages.js.map +1 -0
  852. package/dist/file-findings/mdx-source.cjs +48 -0
  853. package/dist/file-findings/mdx-source.cjs.map +1 -0
  854. package/dist/file-findings/mdx-source.d.ts +7 -0
  855. package/dist/file-findings/mdx-source.d.ts.map +1 -0
  856. package/dist/file-findings/mdx-source.js +48 -0
  857. package/dist/file-findings/mdx-source.js.map +1 -0
  858. package/dist/file-findings/monaco-language.cjs +73 -0
  859. package/dist/file-findings/monaco-language.cjs.map +1 -0
  860. package/dist/file-findings/monaco-language.d.ts +11 -0
  861. package/dist/file-findings/monaco-language.d.ts.map +1 -0
  862. package/dist/file-findings/monaco-language.js +72 -0
  863. package/dist/file-findings/monaco-language.js.map +1 -0
  864. package/dist/file-findings/severity-counts.cjs +20 -0
  865. package/dist/file-findings/severity-counts.cjs.map +1 -0
  866. package/dist/file-findings/severity-counts.d.ts +5 -0
  867. package/dist/file-findings/severity-counts.d.ts.map +1 -0
  868. package/dist/file-findings/severity-counts.js +19 -0
  869. package/dist/file-findings/severity-counts.js.map +1 -0
  870. package/dist/file-findings/types.cjs +12 -0
  871. package/dist/file-findings/types.cjs.map +1 -0
  872. package/dist/file-findings/types.d.ts +43 -0
  873. package/dist/file-findings/types.d.ts.map +1 -0
  874. package/dist/file-findings/types.js +11 -0
  875. package/dist/file-findings/types.js.map +1 -0
  876. package/dist/file-findings.cjs +47 -0
  877. package/dist/file-findings.d.ts +15 -0
  878. package/dist/file-findings.d.ts.map +1 -0
  879. package/dist/file-findings.js +15 -0
  880. package/dist/hooks/event-hub.cjs +22 -8
  881. package/dist/hooks/event-hub.cjs.map +1 -1
  882. package/dist/hooks/event-hub.d.ts.map +1 -1
  883. package/dist/hooks/event-hub.js +22 -8
  884. package/dist/hooks/event-hub.js.map +1 -1
  885. package/dist/icons/components/UiBrowser.cjs +51 -0
  886. package/dist/icons/components/UiBrowser.cjs.map +1 -0
  887. package/dist/icons/components/UiBrowser.d.ts +15 -0
  888. package/dist/icons/components/UiBrowser.d.ts.map +1 -0
  889. package/dist/icons/components/UiBrowser.js +48 -0
  890. package/dist/icons/components/UiBrowser.js.map +1 -0
  891. package/dist/icons/components/UiCreditCard.cjs +51 -0
  892. package/dist/icons/components/UiCreditCard.cjs.map +1 -0
  893. package/dist/icons/components/UiCreditCard.d.ts +15 -0
  894. package/dist/icons/components/UiCreditCard.d.ts.map +1 -0
  895. package/dist/icons/components/UiCreditCard.js +48 -0
  896. package/dist/icons/components/UiCreditCard.js.map +1 -0
  897. package/dist/icons/components/UiShoppingCart.cjs +51 -0
  898. package/dist/icons/components/UiShoppingCart.cjs.map +1 -0
  899. package/dist/icons/components/UiShoppingCart.d.ts +15 -0
  900. package/dist/icons/components/UiShoppingCart.d.ts.map +1 -0
  901. package/dist/icons/components/UiShoppingCart.js +48 -0
  902. package/dist/icons/components/UiShoppingCart.js.map +1 -0
  903. package/dist/icons/index.d.ts +6 -0
  904. package/dist/icons/index.d.ts.map +1 -1
  905. package/dist/icons/registry.cjs +6 -0
  906. package/dist/icons/registry.cjs.map +1 -1
  907. package/dist/icons/registry.d.ts.map +1 -1
  908. package/dist/icons/registry.js +6 -0
  909. package/dist/icons/registry.js.map +1 -1
  910. package/dist/icons.cjs +9 -0
  911. package/dist/icons.js +4 -1
  912. package/dist/index.cjs +76 -8
  913. package/dist/index.d.ts +1 -0
  914. package/dist/index.d.ts.map +1 -1
  915. package/dist/index.js +37 -14
  916. package/dist/layout/AppShell.cjs +37 -21
  917. package/dist/layout/AppShell.cjs.map +1 -1
  918. package/dist/layout/AppShell.d.ts +13 -2
  919. package/dist/layout/AppShell.d.ts.map +1 -1
  920. package/dist/layout/AppShell.js +37 -21
  921. package/dist/layout/AppShell.js.map +1 -1
  922. package/dist/layout/AppShell.nav.cjs +7 -6
  923. package/dist/layout/AppShell.nav.cjs.map +1 -1
  924. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  925. package/dist/layout/AppShell.nav.js +7 -6
  926. package/dist/layout/AppShell.nav.js.map +1 -1
  927. package/dist/layout/SplitPane.cjs +16 -6
  928. package/dist/layout/SplitPane.cjs.map +1 -1
  929. package/dist/layout/SplitPane.d.ts +12 -2
  930. package/dist/layout/SplitPane.d.ts.map +1 -1
  931. package/dist/layout/SplitPane.js +16 -6
  932. package/dist/layout/SplitPane.js.map +1 -1
  933. package/dist/layout/Workspace.cjs +37 -33
  934. package/dist/layout/Workspace.cjs.map +1 -1
  935. package/dist/layout/Workspace.d.ts.map +1 -1
  936. package/dist/layout/Workspace.js +37 -33
  937. package/dist/layout/Workspace.js.map +1 -1
  938. package/dist/layout/Workspace.regions.cjs +3 -3
  939. package/dist/layout/Workspace.regions.cjs.map +1 -1
  940. package/dist/layout/Workspace.regions.js +3 -3
  941. package/dist/layout/Workspace.regions.js.map +1 -1
  942. package/dist/lib/breakpoints.cjs +102 -0
  943. package/dist/lib/breakpoints.cjs.map +1 -0
  944. package/dist/lib/breakpoints.d.ts +36 -0
  945. package/dist/lib/breakpoints.d.ts.map +1 -0
  946. package/dist/lib/breakpoints.js +99 -0
  947. package/dist/lib/breakpoints.js.map +1 -0
  948. package/dist/lib/combobox.cjs +2 -1
  949. package/dist/lib/combobox.cjs.map +1 -1
  950. package/dist/lib/combobox.d.ts +1 -1
  951. package/dist/lib/combobox.d.ts.map +1 -1
  952. package/dist/lib/combobox.js +2 -1
  953. package/dist/lib/combobox.js.map +1 -1
  954. package/dist/lib/path-tree.cjs +21 -0
  955. package/dist/lib/path-tree.cjs.map +1 -1
  956. package/dist/lib/path-tree.d.ts +15 -0
  957. package/dist/lib/path-tree.d.ts.map +1 -1
  958. package/dist/lib/path-tree.js +21 -1
  959. package/dist/lib/path-tree.js.map +1 -1
  960. package/dist/overlay/Modal.cjs +2 -1
  961. package/dist/overlay/Modal.cjs.map +1 -1
  962. package/dist/overlay/Modal.d.ts.map +1 -1
  963. package/dist/overlay/Modal.js +2 -1
  964. package/dist/overlay/Modal.js.map +1 -1
  965. package/dist/overlay/dropdownMenuContext.d.ts +1 -1
  966. package/dist/profiles/editor/profileEditor.cjs +1 -1
  967. package/dist/profiles/editor/profileEditor.cjs.map +1 -1
  968. package/dist/profiles/editor/profileEditor.js +1 -1
  969. package/dist/profiles/editor/profileEditor.js.map +1 -1
  970. package/dist/profiles/editor/profileEditorSections.cjs +2 -2
  971. package/dist/profiles/editor/profileEditorSections.cjs.map +1 -1
  972. package/dist/profiles/editor/profileEditorSections.js +2 -2
  973. package/dist/profiles/editor/profileEditorSections.js.map +1 -1
  974. package/dist/profiles/query/prometheusResults.cjs +24 -36
  975. package/dist/profiles/query/prometheusResults.cjs.map +1 -1
  976. package/dist/profiles/query/prometheusResults.d.ts.map +1 -1
  977. package/dist/profiles/query/prometheusResults.js +24 -36
  978. package/dist/profiles/query/prometheusResults.js.map +1 -1
  979. package/dist/rpc/CommandForm.cjs +1 -1
  980. package/dist/rpc/CommandForm.cjs.map +1 -1
  981. package/dist/rpc/CommandForm.js +1 -1
  982. package/dist/rpc/CommandForm.js.map +1 -1
  983. package/dist/rpc/classify.cjs +1 -1
  984. package/dist/rpc/classify.cjs.map +1 -1
  985. package/dist/rpc/classify.d.ts.map +1 -1
  986. package/dist/rpc/classify.js +1 -1
  987. package/dist/rpc/classify.js.map +1 -1
  988. package/dist/rpc/useOperations.d.ts +24 -24
  989. package/dist/rpc.cjs +0 -2
  990. package/dist/rpc.d.ts +0 -1
  991. package/dist/rpc.d.ts.map +1 -1
  992. package/dist/rpc.js +1 -2
  993. package/dist/styles.css +1 -1
  994. package/dist/utils.cjs +6 -0
  995. package/dist/utils.d.ts +2 -1
  996. package/dist/utils.d.ts.map +1 -1
  997. package/dist/utils.js +3 -2
  998. package/package.json +9 -3
  999. package/schemas/json-schema-form.schema.json +9 -1
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-render.js","names":[],"sources":["../../src/components/json-schema-form-render.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { withFieldDebug } from \"./json-schema-form-debug\";\nimport {\n BooleanControl,\n DateControl,\n DisplayControl,\n EnumControl,\n LinkControl,\n LookupControl,\n MarkdownControl,\n NumberControl,\n ReadOnlyValue,\n StringControl,\n TextareaControl,\n} from \"./json-schema-form-fields\";\nimport {\n FieldLabel,\n FieldWrapper,\n HelpHint,\n ObjectSection,\n SectionHeading,\n} from \"./json-schema-form-layout\";\nimport { ArrayControl } from \"./json-schema-form-array\";\nimport { ObjectControl, StringMapControl } from \"./json-schema-form-object\";\nimport { FieldErrorMessages, FieldErrorText } from \"./json-schema-form-error-display\";\nimport { appendInstancePath, errorsAtInstancePath } from \"./json-schema-form-errors\";\nimport type { JsonSchemaFormError } from \"./json-schema-form-error-types\";\nimport { applyPostExtensions } from \"./json-schema-form-extensions\";\nimport { resolveControl, schemaRendersAsObject } from \"./json-schema-form-resolve\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { applyChangeEffects, applyListenerState } from \"./json-schema-form-listeners\";\nimport type {\n FieldArgs,\n FieldControl,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n RenderApi,\n RenderContext,\n} from \"./json-schema-form-types\";\nimport {\n fieldErrorId,\n fieldInputId,\n hasObjectItemProperties,\n rendersAsSection,\n isEmptyValue,\n normalizeColSpan,\n normalizeColumns,\n orderByClickyOrder,\n orderByPriority,\n orderByXOrder,\n orderRequiredFirst,\n seedFromSchema,\n softError,\n} from \"./json-schema-form-utils\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\nimport { PropertiesFieldRow, PropertyValueEditor } from \"./json-schema-form-properties\";\nimport { PropertyValuePreview } from \"./json-schema-form-property-preview\";\nimport { propertyControlSize } from \"./json-schema-form-properties-size\";\nimport { matchesFieldFilter } from \"./json-schema-form-filter\";\nimport { Combobox } from \"./Combobox\";\n\n// This module is the top of the json-schema-form graph: it imports the control\n// components and dispatches into them, while container controls recurse back in\n// only through ctx.render (see RenderApi). Nothing here is a React component,\n// so the component modules stay Fast-Refresh-eligible and cycle-free.\n\n// renderValueControl produces just the value node for a field, dispatching on\n// its resolved kind. The RenderContext carries readOnly + the pre/post stacks so\n// container controls (array/object/map) can recurse with full context.\nexport function renderValueControl(field: FieldControl, ctx: RenderContext): ReactNode {\n // ctx.instancePath is the field's own path here: buildField descends into the\n // child context before rendering the value.\n const fieldId = fieldInputId(ctx.instancePath, ctx.idPrefix);\n if (ctx.presentation && field.kind !== \"display\" && field.kind !== \"link\") {\n return <PropertyValuePreview field={field} fieldId={fieldId} ctx={ctx} />;\n }\n // A field the schema marks `readOnly` is never editable: it shows its current\n // value as plain text, not a disabled input. (The form-level ctx.readOnly,\n // below, instead disables the real controls so the structure stays visible;\n // a table's grid is its structure, so TableArray shows its cells as values.)\n // Containers (array/object/map) still render structurally so nested read-only\n // values surface, and textarea/display/link own their non-editable rendering\n // (multi-line text / static element / hyperlink), so all of these are excluded\n // from the plain ReadOnlyValue fallback.\n if (field.readOnly && !ownsReadOnlyRendering(field.kind)) {\n return <ReadOnlyValue field={field} fieldId={fieldId} size={ctx.size} />;\n }\n const readOnly = ctx.readOnly || field.readOnly === true;\n const size = ctx.size;\n switch (field.kind) {\n case \"enum\":\n return <EnumControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"lookup\":\n return (\n <LookupControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={size}\n {...(ctx.rootValue ? { rootValue: ctx.rootValue } : {})}\n />\n );\n case \"boolean\":\n return <BooleanControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"number\":\n return <NumberControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"date\":\n return <DateControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"textarea\":\n return <TextareaControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"markdown\":\n return <MarkdownControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"display\":\n return <DisplayControl field={field} size={size} />;\n case \"link\":\n return <LinkControl field={field} fieldId={fieldId} size={size} />;\n case \"array\":\n return <ArrayControl field={field} fieldId={fieldId} ctx={ctx} />;\n case \"object\":\n return <ObjectControl field={field} ctx={ctx} />;\n case \"string-map\":\n return <StringMapControl field={field} ctx={ctx} />;\n default:\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n}\n\n// ownsReadOnlyRendering reports whether a control renders its own non-editable\n// form, so the renderer must not pre-empt it with the plain ReadOnlyValue text:\n// containers recurse structurally, and textarea/display/link have bespoke\n// read-only output.\nfunction ownsReadOnlyRendering(kind: FieldControl[\"kind\"]): boolean {\n return (\n kind === \"array\" ||\n kind === \"object\" ||\n kind === \"string-map\" ||\n kind === \"textarea\" ||\n kind === \"markdown\" ||\n kind === \"display\" ||\n kind === \"link\"\n );\n}\n\n// buildField resolves a control, applies the pre-extensions (any returning\n// null drops the field), renders the value node, then applies the\n// post-extensions to the {label, value} node pair.\nfunction buildField(\n args: FieldArgs,\n ctx: RenderContext,\n): {\n field: FieldControl;\n fieldId: string;\n label: ReactNode;\n value: ReactNode;\n messages: JsonSchemaFormError[];\n help: HelpDisplay;\n} | null {\n // `x-hidden` is a property of the schema, not of the resolved control, so no\n // extension can set or clear it — checked before anything is resolved. A\n // matching `allOf` branch that re-declares the property without the flag is\n // what reveals it; see effectiveProperties.\n // hide says whether to drop the field; in debug mode it keeps it and records\n // the first reason it would have gone.\n let hiddenReason: string | undefined;\n const hide = (reason: string) => {\n if (!ctx.debug) return true;\n hiddenReason ??= reason;\n return false;\n };\n const hiddenBy = args.prop[\"x-hidden-by\"];\n if (args.prop[\"x-hidden\"] && hide(hiddenBy ? `hidden by ${hiddenBy}` : \"hidden by the schema (x-hidden)\")) return null;\n const base = resolveControl(args);\n let field: FieldControl | null = base;\n let beforeDrop: FieldControl = base;\n for (const ext of ctx.pre) {\n if (!field) break;\n beforeDrop = field;\n field = ext(field, {\n key: args.key,\n prop: args.prop,\n value: args.value,\n ...(ctx.rootValue ? { rootValue: ctx.rootValue } : {}),\n ...(ctx.onRootChange ? { onRootChange: ctx.onRootChange } : {}),\n });\n }\n if (!field) {\n if (hide(\"dropped by a form extension\")) return null;\n field = beforeDrop;\n }\n // Drop read-only fields entirely when the form opts out of displaying them.\n // Checked after pre-extensions so an extension that sets/clears readOnly wins.\n if (ctx.hideReadOnlyFields && field.readOnly && hide(\"hidden: read-only\")) return null;\n // A writeOnly value is never read back, so a view has nothing to show for it.\n if (field.writeOnly && (ctx.viewOnly || field.readOnly) && hide(\"hidden: write-only\")) return null;\n // Same placement, same reason: an extension that supplies a value decides\n // whether the field has one.\n if (ctx.hideEmpty && isEmptyValue(field.value) && hide(\"hidden: empty\")) return null;\n // A readOnly field's subtree is a view, like a read-only form's. Read before\n // the presentation override, which marks fields readOnly only to show text.\n const view = field.readOnly === true;\n if (ctx.presentation) field = { ...field, readOnly: true };\n\n const instancePath = args.instancePath ?? appendInstancePath(ctx.instancePath, args.key);\n const fieldId = fieldInputId(instancePath, ctx.idPrefix);\n // Resolve this field's errors before rendering its control, so the control can\n // carry aria-invalid / aria-describedby rather than leaving the error text\n // visually adjacent but programmatically unassociated. Host-supplied errors\n // and the locally-derived soft hint (e.g. \"Required\" on an empty required\n // field) are one validation state: either one marks the field invalid and is\n // rendered into the aria-describedby target, so a locally-invalid field is\n // never invalid only to sighted users. softError reads value/required/kind —\n // never `invalid` — so deriving it from `field` here is not circular.\n const errors = errorsAtInstancePath(ctx.errors, instancePath);\n const soft = errors.length === 0 ? softError(field) : undefined;\n const messages: JsonSchemaFormError[] =\n errors.length > 0 ? errors : soft ? [{ instancePath, message: soft }] : [];\n if (messages.length > 0) field = { ...field, invalid: true };\n // A field's own x-help-display wins over the form-level setting; both default\n // to the permanent paragraph every form renders today.\n const help = field.helpDisplay ?? ctx.layout.help ?? \"inline\";\n // A section's label is its header row (none for an empty title), so post\n // extensions decorate it too.\n let label: ReactNode = rendersAsSection(field, ctx.layout.mode) ? (\n field.label === \"\" ? null : <SectionHeading field={field} size={ctx.size} helpDisplay={help} />\n ) : (\n <FieldLabel field={field} fieldId={fieldId} size={ctx.layout.mode === \"properties\" ? propertyControlSize[ctx.size] : ctx.size} helpDisplay={help} />\n );\n // A field's `x-layout: inline|stack` overrides the form-level layout for its\n // own value subtree (the field's own row keeps the parent layout). \"table\" is\n // handled structurally inside the array/string-map controls, not here.\n const overrideMode =\n field.layout === \"inline\" ? \"inline\" : field.layout === \"stack\" ? \"stacked\" : undefined;\n const nestedProperty = ctx.layout.mode === \"properties\" && (field.kind === \"object\" || field.kind === \"string-map\");\n // A disabled field keeps its real control (unlike readOnly's value text), and\n // containers read ctx.readOnly, so a disabled object disables its subtree.\n const valueCtx: RenderContext = {\n ...ctx,\n ...(field.disabled ? { readOnly: true } : {}),\n ...(view ? { viewOnly: true } : {}),\n ...(ctx.layout.mode === \"properties\" && !nestedProperty ? { size: propertyControlSize[ctx.size] } : {}),\n instancePath,\n ...(overrideMode && !nestedProperty ? { layout: { ...ctx.layout, mode: overrideMode } } : {}),\n ...(ctx.layout.mode === \"properties\" && field.kind === \"array\"\n ? { layout: { ...ctx.layout, mode: overrideMode ?? \"stacked\" } } : {}),\n };\n let value: ReactNode = renderValueControl(field, valueCtx);\n const postCtx = {\n ...(ctx.rootValue ? { rootValue: ctx.rootValue } : {}),\n ...(ctx.onRootChange ? { onRootChange: ctx.onRootChange } : {}),\n instancePath,\n };\n ({ label, value } = applyPostExtensions(\n valueCtx.readOnly ? { ...field, readOnly: true } : field,\n { label, value },\n ctx.post,\n postCtx,\n ));\n if (ctx.layout.mode === \"properties\" && !nestedProperty && field.kind !== \"display\" && field.kind !== \"link\") {\n value = <PropertyValueEditor field={field} fieldId={fieldId} ctx={valueCtx}\n renderPreview={(previewField) => applyPostExtensions(\n { ...previewField, readOnly: true },\n { label, value: <PropertyValuePreview field={previewField} fieldId={`${fieldId}-preview`} ctx={{ ...valueCtx, idPrefix: `${ctx.idPrefix ?? \"\"}-preview` }} /> },\n ctx.post,\n postCtx,\n ).value}\n renderEditor={(draftField, draftCtx) => applyPostExtensions(\n draftField,\n { label, value: renderValueControl(draftField, draftCtx) },\n draftCtx.post,\n { ...postCtx, ...(draftCtx.rootValue ? { rootValue: draftCtx.rootValue } : {}), ...(draftCtx.onRootChange ? { onRootChange: draftCtx.onRootChange } : {}) },\n ).value} />;\n }\n if (ctx.debug && field.kind !== \"display\") {\n ({ label, value } = withFieldDebug({ label, value }, { fieldKey: args.key, instancePath, field, prop: args.prop, hiddenReason }));\n }\n return { field, fieldId, label, value, messages, help };\n}\n\n// renderFieldNodes runs the full pipeline and returns the raw {label, value}\n// nodes (no FieldWrapper). Used where the caller arranges layout itself — map\n// rows (value only) and scalar array items.\nexport function renderFieldNodes(\n args: FieldArgs,\n ctx: RenderContext,\n): { label: ReactNode; value: ReactNode } | null {\n const built = buildField(args, ctx);\n if (!built) return null;\n return {\n label: built.label,\n value:\n built.messages.length > 0 ? (\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n {built.value}\n <FieldErrorText id={fieldErrorId(built.fieldId)} errors={built.messages} />\n </div>\n ) : (\n built.value\n ),\n };\n}\n\n// renderFieldRow runs the pipeline and wraps it in a FieldWrapper with the soft\n// validation hint. `labelOverride` lets a container relabel a field that has no\n// natural key (e.g. array items → \"Item 1\").\nexport function renderFieldRow(\n args: FieldArgs,\n ctx: RenderContext,\n opts?: { labelOverride?: string },\n): ReactNode | null {\n const built = buildField(args, ctx);\n if (!built) return null;\n const { field } = built;\n if (ctx.layout.mode === \"properties\" && field.kind !== \"display\") {\n return <PropertiesFieldRow {...built} label={opts?.labelOverride ?? built.label} ctx={ctx} />;\n }\n // Object fields — and table-laid-out arrays/string-maps — render as a flat\n // section: a header followed by their body at full width, rather than an\n // inline label + narrow value column. This keeps deep schemas (e.g. policy →\n // shape, asfile → params) readable as a single column of labelled sections,\n // and gives a `x-layout: \"table\"` array the full width its columns need\n // instead of cramming it into the inline value column.\n // An accordion joins this list: crammed into the 600px inline value column it\n // is unusable, and it needs the ObjectSection header to carry the array's own\n // title, required marker and help. Cards are the same shape of thing — a\n // full-width stack of item panels — so they join it too.\n if (rendersAsSection(field, ctx.layout.mode)) {\n return (\n <ObjectSection\n heading={\n opts?.labelOverride === undefined ? built.label : opts.labelOverride === \"\" ? null : (\n <SectionHeading field={field} label={opts.labelOverride} size={ctx.size} helpDisplay={built.help} />\n )\n }\n size={ctx.size}\n helpDisplay={built.help}\n {...(field.helper ? { helper: field.helper } : {})}\n >\n <FieldErrorText\n id={fieldErrorId(built.fieldId)}\n errors={built.messages}\n className=\"min-w-0 break-words\"\n />\n {built.value}\n </ObjectSection>\n );\n }\n // A display field (heading/divider/info/spacer) is the label — it carries no\n // value column, so it spans the full grid width with no inline label cell.\n if (field.kind === \"display\") {\n return <div className=\"col-span-full\">{built.value}</div>;\n }\n const label = opts?.labelOverride ? (\n <span className={cn(\"flex items-center gap-2 font-medium\", labelSizeClass[ctx.size])}>\n <LabelIcon icon={field.labelIcon} className=\"text-[15px] text-muted-foreground\" />\n <span>{opts.labelOverride}</span>\n {field.required && <span className=\"text-destructive\">*</span>}\n {field.badge && (\n <span className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {field.badge}\n </span>\n )}\n {/* Without this the `?` silently disappears for relabelled rows (array\n items), taking the description with it — FieldWrapper has already\n dropped the paragraph by then. */}\n {built.help === \"hover\" && field.helper && (\n <HelpHint label={opts.labelOverride} helper={field.helper} />\n )}\n </span>\n ) : (\n built.label\n );\n // One rendering path for both sources, so the soft hint lands in the same\n // fieldErrorId element the control's aria-describedby already points at.\n const err =\n built.messages.length > 0 ? (\n <FieldErrorMessages id={fieldErrorId(built.fieldId)} errors={built.messages} />\n ) : undefined;\n return (\n <FieldWrapper\n layout={ctx.layout}\n size={ctx.size}\n label={label}\n value={built.value}\n {...(field.colSpan === \"full\" ? { maxWidth: \"none\" } : {})}\n {...(field.helper && built.help !== \"hover\" ? { helper: field.helper } : {})}\n {...(err ? { error: err } : {})}\n />\n );\n}\n\n// renderObjectFields maps an object subschema's effective properties to field\n// rows. It is the recursive heart, shared by the top-level form and the nested\n// ObjectControl. Edits spread immutably onto the object, carrying the value\n// effects of the edited field's `x-on-change` listeners in the same commit.\nexport function renderObjectFields(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n onChange: (next: Record<string, unknown>) => void,\n ctx: RenderContext,\n opts?: { hiddenKeys?: string[] },\n): ReactNode[] {\n const listenerOptions = {\n root: ctx.rootValue ?? value,\n ...(ctx.expressionEvaluator ? { evaluate: ctx.expressionEvaluator } : {}),\n };\n const { properties, required } = applyListenerState(schema, value, listenerOptions);\n const hidden = new Set(opts?.hiddenKeys ?? []);\n // Per-property `x-clicky-order` wins (composes across merged branches); the\n // object-level `x-order` array is the fallback; document order otherwise.\n const ordered = orderByClickyOrder(orderByXOrder(Object.entries(properties), schema[\"x-order\"]));\n const sorted =\n ctx.sortMode === \"required-first\"\n ? orderRequiredFirst(ordered, required)\n : ctx.sortMode === \"priority\"\n ? orderByPriority(ordered, required, value)\n : ordered;\n // The field filter narrows only the outermost object level (depth 0); nested\n // object subtrees render in full so a matched parent keeps all its children.\n const entries =\n ctx.depth === 0 && ctx.fieldFilter\n ? sorted.filter(([key, prop]) => matchesFieldFilter({ key, prop, filter: ctx.fieldFilter!, value: value[key] }))\n : sorted;\n // Object-level `x-columns` lays the fields out in a multi-column stacked grid;\n // each field spans `x-col-span` columns (object sections/table arrays span the\n // full row). Only takes effect in stacked mode — inline owns its 2-track grid.\n const columns = ctx.layout.mode !== \"stacked\" ? 1 : normalizeColumns(schema[\"x-columns\"]);\n const arrayEntries = entries.filter(([, prop]) => prop.type === \"array\");\n const compactArrays = ctx.layout.mode !== \"properties\" && arrayEntries.length > 3;\n const rows = entries.flatMap(([key, prop]) => {\n if (hidden.has(key)) return [];\n if (compactArrays && prop.type === \"array\" && (!Array.isArray(value[key]) || value[key].length === 0)) return [];\n const row = renderFieldRow(\n {\n key,\n prop,\n required: required.includes(key),\n value: value[key],\n onChange: (next) => onChange(applyChangeEffects(schema, { ...listenerOptions, value, key, next })),\n instancePath: appendInstancePath(ctx.instancePath, key),\n },\n ctx,\n );\n if (!row) return [];\n if (columns === \"auto\" || columns > 1) {\n const span = rendersFullWidth(prop)\n ? \"full\"\n : normalizeColSpan(prop[\"x-col-span\"], columns);\n return [\n <div\n key={key}\n // Under \"auto\" the track count only exists at layout time, so a\n // full-width field must say `1 / -1` rather than span a number.\n style={{\n gridColumn: span === \"full\" ? \"1 / -1\" : `span ${span} / span ${span}`,\n }}\n >\n {row}\n </div>,\n ];\n }\n // `contents` keeps the keyed wrapper out of the box tree so the row's own\n // node (a subgrid FieldWrapper or a full-width ObjectSection) is a direct\n // child of the FieldsGrid and snaps to its label/value tracks.\n return [<div key={key} className=\"contents\">{row}</div>];\n });\n if (compactArrays && !ctx.readOnly && !ctx.presentation) {\n const available = arrayEntries.filter(([key, prop]) =>\n !hidden.has(key) && (!Array.isArray(value[key]) || prop.maxItems === undefined || value[key].length < prop.maxItems),\n );\n if (available.length > 0) {\n rows.push(\n <div key=\"keyed-array-add\" className=\"col-span-full w-full max-w-72\">\n <Combobox\n ariaLabel=\"Add item\"\n placeholder=\"Add item…\"\n options={available.map(([key, prop]) => ({ value: key, label: prop.title || key }))}\n value=\"\"\n allowCustomValue={false}\n onChange={(key) => {\n const prop = properties[key];\n if (!prop || prop.type !== \"array\") throw new Error(`cannot add item to ${key}`);\n const items = value[key];\n if (items !== undefined && !Array.isArray(items)) throw new Error(`${key} is not an array`);\n onChange({ ...value, [key]: [...(items ?? []), seedFromSchema(prop.items ?? { type: \"string\" })] });\n }}\n />\n </div>,\n );\n }\n }\n return rows;\n}\n\n// rendersFullWidth reports whether a property renders as a full-width block\n// (a structured object → ObjectSection, or an `x-layout: \"table\"` array/map) so\n// a multi-column grid gives it the whole row instead of a single column.\nfunction rendersFullWidth(prop: JsonSchemaProperty): boolean {\n const fixedProperties = effectiveProperties(prop as JsonSchemaObject, {}).properties;\n if (schemaRendersAsObject(prop) && (prop.properties !== undefined || Object.keys(fixedProperties).length > 0)) {\n return true;\n }\n // An object-item array is a summary-row list (or cards) unless it opts out,\n // and each of those renderers owns the row — mirrors ArrayControl's own\n // branching, which decides the same thing from the resolved FieldControl.\n if (hasObjectItemProperties(prop.items) && prop[\"x-array-display\"] !== \"stacked\") {\n return true;\n }\n return prop[\"x-layout\"] === \"table\";\n}\n\n// renderApi is the RenderContext injection bundle: the root form stores it on\n// the context so container controls can recurse without importing this module.\nexport const renderApi: RenderApi = {\n renderFieldNodes,\n renderFieldRow,\n renderObjectFields,\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"json-schema-form-render.js","names":[],"sources":["../../src/components/json-schema-form-render.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { withFieldDebug } from \"./json-schema-form-debug\";\nimport {\n BooleanControl,\n DateControl,\n DisplayControl,\n EnumControl,\n LinkControl,\n LookupControl,\n MarkdownControl,\n NumberControl,\n ReadOnlyValue,\n StringControl,\n TextareaControl,\n} from \"./json-schema-form-fields\";\nimport {\n FieldLabel,\n FieldWrapper,\n HelpHint,\n ObjectSection,\n SectionHeading,\n} from \"./json-schema-form-layout\";\nimport { ArrayControl } from \"./json-schema-form-array\";\nimport { ObjectControl, StringMapControl } from \"./json-schema-form-object\";\nimport { FieldErrorMessages, FieldErrorText } from \"./json-schema-form-error-display\";\nimport { appendInstancePath, errorsAtInstancePath } from \"./json-schema-form-errors\";\nimport type { JsonSchemaFormError } from \"./json-schema-form-error-types\";\nimport { applyPostExtensions } from \"./json-schema-form-extensions\";\nimport { resolveControl, schemaRendersAsObject } from \"./json-schema-form-resolve\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { applyChangeEffects, applyListenerState } from \"./json-schema-form-listeners\";\nimport type {\n FieldArgs,\n FieldControl,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n RenderApi,\n RenderContext,\n} from \"./json-schema-form-types\";\nimport {\n fieldErrorId,\n fieldInputId,\n hasObjectItemProperties,\n rendersAsSection,\n isEmptyValue,\n normalizeColSpan,\n normalizeColumns,\n orderByClickyOrder,\n orderByPriority,\n orderByXOrder,\n orderRequiredFirst,\n seedFromSchema,\n softError,\n} from \"./json-schema-form-utils\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\nimport { PropertiesFieldRow, PropertyValueEditor } from \"./json-schema-form-properties\";\nimport { PropertyValuePreview } from \"./json-schema-form-property-preview\";\nimport { propertyControlSize } from \"./json-schema-form-properties-size\";\nimport { matchesFieldFilter } from \"./json-schema-form-filter\";\nimport { Combobox } from \"./Combobox\";\nimport { UnionControl } from \"./json-schema-form-union\";\nimport { JsonControl } from \"./json-schema-form-json\";\nimport { FormHelp } from \"./json-schema-form-help-links\";\nimport { hasFormHelp } from \"./json-schema-form-help-model\";\n\n// This module is the top of the json-schema-form graph: it imports the control\n// components and dispatches into them, while container controls recurse back in\n// only through ctx.render (see RenderApi). Nothing here is a React component,\n// so the component modules stay Fast-Refresh-eligible and cycle-free.\n\n// renderValueControl produces just the value node for a field, dispatching on\n// its resolved kind. The RenderContext carries readOnly + the pre/post stacks so\n// container controls (array/object/map) can recurse with full context.\nexport function renderValueControl(field: FieldControl, ctx: RenderContext): ReactNode {\n // ctx.instancePath is the field's own path here: buildField descends into the\n // child context before rendering the value.\n const fieldId = fieldInputId(ctx.instancePath, ctx.idPrefix);\n if (ctx.presentation && field.kind !== \"display\" && field.kind !== \"link\") {\n return <PropertyValuePreview field={field} fieldId={fieldId} ctx={ctx} />;\n }\n // A field the schema marks `readOnly` is never editable: it shows its current\n // value as plain text, not a disabled input. (The form-level ctx.readOnly,\n // below, instead disables the real controls so the structure stays visible;\n // a table's grid is its structure, so TableArray shows its cells as values.)\n // Containers (array/object/map) still render structurally so nested read-only\n // values surface, and textarea/display/link own their non-editable rendering\n // (multi-line text / static element / hyperlink), so all of these are excluded\n // from the plain ReadOnlyValue fallback.\n if (field.readOnly && !ownsReadOnlyRendering(field.kind)) {\n return <ReadOnlyValue field={field} fieldId={fieldId} size={ctx.size} />;\n }\n const readOnly = ctx.readOnly || field.readOnly === true;\n const size = ctx.size;\n switch (field.kind) {\n case \"union\":\n return <UnionControl field={field} fieldId={fieldId} ctx={ctx} />;\n case \"json\":\n return <JsonControl field={field} fieldId={fieldId} readOnly={readOnly} />;\n case \"enum\":\n return <EnumControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"lookup\":\n return (\n <LookupControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={size}\n {...(ctx.rootValue ? { rootValue: ctx.rootValue } : {})}\n />\n );\n case \"boolean\":\n return <BooleanControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"number\":\n return <NumberControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"date\":\n return <DateControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"textarea\":\n return <TextareaControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"markdown\":\n return <MarkdownControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n case \"display\":\n return <DisplayControl field={field} size={size} />;\n case \"link\":\n return <LinkControl field={field} fieldId={fieldId} size={size} />;\n case \"array\":\n return <ArrayControl field={field} fieldId={fieldId} ctx={ctx} />;\n case \"object\":\n return <ObjectControl field={field} ctx={ctx} />;\n case \"string-map\":\n return <StringMapControl field={field} ctx={ctx} />;\n default:\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n}\n\n// ownsReadOnlyRendering reports whether a control renders its own non-editable\n// form, so the renderer must not pre-empt it with the plain ReadOnlyValue text:\n// containers recurse structurally, and textarea/display/link have bespoke\n// read-only output.\nfunction ownsReadOnlyRendering(kind: FieldControl[\"kind\"]): boolean {\n return (\n kind === \"array\" ||\n kind === \"object\" ||\n kind === \"string-map\" ||\n kind === \"textarea\" ||\n kind === \"markdown\" ||\n kind === \"display\" ||\n kind === \"link\"\n );\n}\n\n// buildField resolves a control, applies the pre-extensions (any returning\n// null drops the field), renders the value node, then applies the\n// post-extensions to the {label, value} node pair.\nfunction buildField(\n args: FieldArgs,\n ctx: RenderContext,\n): {\n field: FieldControl;\n fieldId: string;\n label: ReactNode;\n value: ReactNode;\n messages: JsonSchemaFormError[];\n help: HelpDisplay;\n} | null {\n // `x-hidden` is a property of the schema, not of the resolved control, so no\n // extension can set or clear it — checked before anything is resolved. A\n // matching `allOf` branch that re-declares the property without the flag is\n // what reveals it; see effectiveProperties.\n // hide says whether to drop the field; in debug mode it keeps it and records\n // the first reason it would have gone.\n let hiddenReason: string | undefined;\n const hide = (reason: string) => {\n if (!ctx.debug) return true;\n hiddenReason ??= reason;\n return false;\n };\n const hiddenBy = args.prop[\"x-hidden-by\"];\n if (args.prop[\"x-hidden\"] && hide(hiddenBy ? `hidden by ${hiddenBy}` : \"hidden by the schema (x-hidden)\")) return null;\n const base = resolveControl(args);\n let field: FieldControl | null = base;\n let beforeDrop: FieldControl = base;\n for (const ext of ctx.pre) {\n if (!field) break;\n beforeDrop = field;\n field = ext(field, {\n key: args.key,\n prop: args.prop,\n value: args.value,\n ...(ctx.rootValue ? { rootValue: ctx.rootValue } : {}),\n ...(ctx.onRootChange ? { onRootChange: ctx.onRootChange } : {}),\n });\n }\n if (!field) {\n if (hide(\"dropped by a form extension\")) return null;\n field = beforeDrop;\n }\n // Drop read-only fields entirely when the form opts out of displaying them.\n // Checked after pre-extensions so an extension that sets/clears readOnly wins.\n if (ctx.hideReadOnlyFields && field.readOnly && hide(\"hidden: read-only\")) return null;\n // A writeOnly value is never read back, so a view has nothing to show for it.\n if (field.writeOnly && (ctx.viewOnly || field.readOnly) && hide(\"hidden: write-only\")) return null;\n // Same placement, same reason: an extension that supplies a value decides\n // whether the field has one.\n if (ctx.hideEmpty && isEmptyValue(field.value) && hide(\"hidden: empty\")) return null;\n // A readOnly field's subtree is a view, like a read-only form's. Read before\n // the presentation override, which marks fields readOnly only to show text.\n const view = field.readOnly === true;\n if (ctx.presentation) field = { ...field, readOnly: true };\n\n const instancePath = args.instancePath ?? appendInstancePath(ctx.instancePath, args.key);\n const fieldId = fieldInputId(instancePath, ctx.idPrefix);\n // Resolve this field's errors before rendering its control, so the control can\n // carry aria-invalid / aria-describedby rather than leaving the error text\n // visually adjacent but programmatically unassociated. Host-supplied errors\n // and the locally-derived soft hint (e.g. \"Required\" on an empty required\n // field) are one validation state: either one marks the field invalid and is\n // rendered into the aria-describedby target, so a locally-invalid field is\n // never invalid only to sighted users. softError reads value/required/kind —\n // never `invalid` — so deriving it from `field` here is not circular.\n const errors = errorsAtInstancePath(ctx.errors, instancePath);\n const soft = errors.length === 0 ? softError(field) : undefined;\n const messages: JsonSchemaFormError[] =\n errors.length > 0 ? errors : soft ? [{ instancePath, message: soft }] : [];\n if (messages.length > 0) field = { ...field, invalid: true };\n // A field's own x-help-display wins over the form-level setting; both default\n // to the permanent paragraph every form renders today.\n const help = field.helpDisplay ?? ctx.layout.help ?? \"inline\";\n // A section's label is its header row (none for an empty title), so post\n // extensions decorate it too.\n let label: ReactNode = rendersAsSection(field, ctx.layout.mode) ? (\n field.label === \"\" ? null : <SectionHeading field={field} size={ctx.size} helpDisplay={help} />\n ) : (\n <FieldLabel field={field} fieldId={fieldId} size={ctx.layout.mode === \"properties\" ? propertyControlSize[ctx.size] : ctx.size} helpDisplay={help} />\n );\n // A field's `x-layout: inline|stack` overrides the form-level layout for its\n // own value subtree (the field's own row keeps the parent layout). \"table\" is\n // handled structurally inside the array/string-map controls, not here.\n const overrideMode =\n field.layout === \"inline\" ? \"inline\" : field.layout === \"stack\" ? \"stacked\" : undefined;\n const nestedProperty = ctx.layout.mode === \"properties\" && (field.kind === \"object\" || field.kind === \"string-map\");\n // A disabled field keeps its real control (unlike readOnly's value text), and\n // containers read ctx.readOnly, so a disabled object disables its subtree.\n const valueCtx: RenderContext = {\n ...ctx,\n ...(field.disabled ? { readOnly: true } : {}),\n ...(view ? { viewOnly: true } : {}),\n ...(ctx.layout.mode === \"properties\" && !nestedProperty ? { size: propertyControlSize[ctx.size] } : {}),\n instancePath,\n ...(overrideMode && !nestedProperty ? { layout: { ...ctx.layout, mode: overrideMode } } : {}),\n ...(ctx.layout.mode === \"properties\" && field.kind === \"array\"\n ? { layout: { ...ctx.layout, mode: overrideMode ?? \"stacked\" } } : {}),\n };\n let value: ReactNode = renderValueControl(field, valueCtx);\n const postCtx = {\n ...(ctx.rootValue ? { rootValue: ctx.rootValue } : {}),\n ...(ctx.onRootChange ? { onRootChange: ctx.onRootChange } : {}),\n instancePath,\n };\n ({ label, value } = applyPostExtensions(\n valueCtx.readOnly ? { ...field, readOnly: true } : field,\n { label, value },\n ctx.post,\n postCtx,\n ));\n if (ctx.layout.mode === \"properties\" && !nestedProperty && field.kind !== \"display\" && field.kind !== \"link\") {\n value = <PropertyValueEditor field={field} fieldId={fieldId} ctx={valueCtx}\n renderPreview={(previewField) => applyPostExtensions(\n { ...previewField, readOnly: true },\n { label, value: <PropertyValuePreview field={previewField} fieldId={`${fieldId}-preview`} ctx={{ ...valueCtx, idPrefix: `${ctx.idPrefix ?? \"\"}-preview` }} /> },\n ctx.post,\n postCtx,\n ).value}\n renderEditor={(draftField, draftCtx) => applyPostExtensions(\n draftField,\n { label, value: renderValueControl(draftField, draftCtx) },\n draftCtx.post,\n { ...postCtx, ...(draftCtx.rootValue ? { rootValue: draftCtx.rootValue } : {}), ...(draftCtx.onRootChange ? { onRootChange: draftCtx.onRootChange } : {}) },\n ).value} />;\n }\n if (ctx.debug && field.kind !== \"display\") {\n ({ label, value } = withFieldDebug({ label, value }, { fieldKey: args.key, instancePath, field, prop: args.prop, hiddenReason }));\n }\n return { field, fieldId, label, value, messages, help };\n}\n\n// renderFieldNodes runs the full pipeline and returns the raw {label, value}\n// nodes (no FieldWrapper). Used where the caller arranges layout itself — map\n// rows (value only) and scalar array items.\nexport function renderFieldNodes(\n args: FieldArgs,\n ctx: RenderContext,\n): { label: ReactNode; value: ReactNode } | null {\n const built = buildField(args, ctx);\n if (!built) return null;\n return {\n label: built.label,\n value:\n built.messages.length > 0 ? (\n <div className=\"flex min-w-0 flex-col gap-0.5\">\n {built.value}\n <FieldErrorText id={fieldErrorId(built.fieldId)} errors={built.messages} />\n </div>\n ) : (\n built.value\n ),\n };\n}\n\n// renderFieldRow runs the pipeline and wraps it in a FieldWrapper with the soft\n// validation hint. `labelOverride` lets a container relabel a field that has no\n// natural key (e.g. array items → \"Item 1\").\nexport function renderFieldRow(\n args: FieldArgs,\n ctx: RenderContext,\n opts?: { labelOverride?: string },\n): ReactNode | null {\n const built = buildField(args, ctx);\n if (!built) return null;\n const { field } = built;\n if (ctx.layout.mode === \"properties\" && field.kind !== \"display\") {\n return <PropertiesFieldRow {...built} label={opts?.labelOverride ?? built.label} ctx={ctx} />;\n }\n // Object fields — and table-laid-out arrays/string-maps — render as a flat\n // section: a header followed by their body at full width, rather than an\n // inline label + narrow value column. This keeps deep schemas (e.g. policy →\n // shape, asfile → params) readable as a single column of labelled sections,\n // and gives a `x-layout: \"table\"` array the full width its columns need\n // instead of cramming it into the inline value column.\n // An accordion joins this list: crammed into the 600px inline value column it\n // is unusable, and it needs the ObjectSection header to carry the array's own\n // title, required marker and help. Cards are the same shape of thing — a\n // full-width stack of item panels — so they join it too.\n if (rendersAsSection(field, ctx.layout.mode)) {\n return (\n <ObjectSection\n heading={\n opts?.labelOverride === undefined ? built.label : opts.labelOverride === \"\" ? null : (\n <SectionHeading field={field} label={opts.labelOverride} size={ctx.size} helpDisplay={built.help} />\n )\n }\n size={ctx.size}\n helpDisplay={built.help}\n {...(hasFormHelp(field) ? { helper: <FormHelp field={field} /> } : {})}\n >\n <FieldErrorText\n id={fieldErrorId(built.fieldId)}\n errors={built.messages}\n className=\"min-w-0 break-words\"\n />\n {built.value}\n </ObjectSection>\n );\n }\n // A display field (heading/divider/info/spacer) is the label — it carries no\n // value column, so it spans the full grid width with no inline label cell.\n if (field.kind === \"display\") {\n return <div className=\"col-span-full\">{built.value}</div>;\n }\n const label = opts?.labelOverride ? (\n <span className={cn(\"flex items-center gap-2 font-medium\", labelSizeClass[ctx.size])}>\n <LabelIcon icon={field.labelIcon} className=\"text-[15px] text-muted-foreground\" />\n <span>{opts.labelOverride}</span>\n {field.required && <span className=\"text-destructive\">*</span>}\n {field.badge && (\n <span className=\"rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {field.badge}\n </span>\n )}\n {/* Without this the `?` silently disappears for relabelled rows (array\n items), taking the description with it — FieldWrapper has already\n dropped the paragraph by then. */}\n {built.help === \"hover\" && hasFormHelp(field) && (\n <HelpHint label={opts.labelOverride} helper={<FormHelp field={field} />} />\n )}\n </span>\n ) : (\n built.label\n );\n // One rendering path for both sources, so the soft hint lands in the same\n // fieldErrorId element the control's aria-describedby already points at.\n const err =\n built.messages.length > 0 ? (\n <FieldErrorMessages id={fieldErrorId(built.fieldId)} errors={built.messages} />\n ) : undefined;\n return (\n <FieldWrapper\n layout={ctx.layout}\n size={ctx.size}\n label={label}\n value={built.value}\n {...(field.colSpan === \"full\" ? { maxWidth: \"none\" } : {})}\n {...(hasFormHelp(field) && built.help !== \"hover\" ? { helper: <FormHelp field={field} /> } : {})}\n {...(err ? { error: err } : {})}\n />\n );\n}\n\n// renderObjectFields maps an object subschema's effective properties to field\n// rows. It is the recursive heart, shared by the top-level form and the nested\n// ObjectControl. Edits spread immutably onto the object, carrying the value\n// effects of the edited field's `x-on-change` listeners in the same commit.\nexport function renderObjectFields(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n onChange: (next: Record<string, unknown>) => void,\n ctx: RenderContext,\n opts?: { hiddenKeys?: string[] },\n): ReactNode[] {\n const listenerOptions = {\n root: ctx.rootValue ?? value,\n ...(ctx.expressionEvaluator ? { evaluate: ctx.expressionEvaluator } : {}),\n };\n const { properties, required } = applyListenerState(schema, value, listenerOptions);\n const hidden = new Set(opts?.hiddenKeys ?? []);\n // Per-property `x-clicky-order` wins (composes across merged branches); the\n // object-level `x-order` array is the fallback; document order otherwise.\n const ordered = orderByClickyOrder(orderByXOrder(Object.entries(properties), schema[\"x-order\"]));\n const sorted =\n ctx.sortMode === \"required-first\"\n ? orderRequiredFirst(ordered, required)\n : ctx.sortMode === \"priority\"\n ? orderByPriority(ordered, required, value)\n : ordered;\n // The field filter narrows only the outermost object level (depth 0); nested\n // object subtrees render in full so a matched parent keeps all its children.\n const entries =\n ctx.depth === 0 && ctx.fieldFilter\n ? sorted.filter(([key, prop]) => matchesFieldFilter({ key, prop, filter: ctx.fieldFilter!, value: value[key] }))\n : sorted;\n // Object-level `x-columns` lays the fields out in a multi-column stacked grid;\n // each field spans `x-col-span` columns (object sections/table arrays span the\n // full row). Only takes effect in stacked mode — inline owns its 2-track grid.\n const columns = ctx.layout.mode !== \"stacked\" ? 1 : normalizeColumns(schema[\"x-columns\"]);\n const arrayEntries = entries.filter(([, prop]) => prop.type === \"array\");\n const compactArrays = ctx.layout.mode !== \"properties\" && arrayEntries.length > 3;\n const rows = entries.flatMap(([key, prop]) => {\n if (hidden.has(key)) return [];\n if (compactArrays && prop.type === \"array\" && prop[\"x-hidden\"] !== false && (!Array.isArray(value[key]) || value[key].length === 0)) return [];\n const row = renderFieldRow(\n {\n key,\n prop,\n required: required.includes(key),\n value: value[key],\n onChange: (next) => onChange(applyChangeEffects(schema, { ...listenerOptions, value, key, next })),\n instancePath: appendInstancePath(ctx.instancePath, key),\n },\n ctx,\n );\n if (!row) return [];\n if (columns === \"auto\" || columns > 1) {\n const span = rendersFullWidth(prop)\n ? \"full\"\n : normalizeColSpan(prop[\"x-col-span\"], columns);\n return [\n <div\n key={key}\n // Under \"auto\" the track count only exists at layout time, so a\n // full-width field must say `1 / -1` rather than span a number.\n style={{\n gridColumn: span === \"full\" ? \"1 / -1\" : `span ${span} / span ${span}`,\n }}\n >\n {row}\n </div>,\n ];\n }\n // `contents` keeps the keyed wrapper out of the box tree so the row's own\n // node (a subgrid FieldWrapper or a full-width ObjectSection) is a direct\n // child of the FieldsGrid and snaps to its label/value tracks.\n return [<div key={key} className=\"contents\">{row}</div>];\n });\n if (compactArrays && !ctx.readOnly && !ctx.presentation) {\n const available = arrayEntries.filter(([key, prop]) =>\n !hidden.has(key) && prop[\"x-hidden\"] === undefined && (!Array.isArray(value[key]) || prop.maxItems === undefined || value[key].length < prop.maxItems),\n );\n if (available.length > 0) {\n rows.push(\n <div key=\"keyed-array-add\" className=\"col-span-full w-full max-w-72\">\n <Combobox\n ariaLabel=\"Add item\"\n placeholder=\"Add item…\"\n options={available.map(([key, prop]) => ({ value: key, label: prop.title || key }))}\n value=\"\"\n allowCustomValue={false}\n onChange={(key) => {\n const prop = properties[key];\n if (!prop || prop.type !== \"array\") throw new Error(`cannot add item to ${key}`);\n const items = value[key];\n if (items !== undefined && !Array.isArray(items)) throw new Error(`${key} is not an array`);\n onChange({ ...value, [key]: [...(items ?? []), seedFromSchema(prop.items ?? { type: \"string\" })] });\n }}\n />\n </div>,\n );\n }\n }\n return rows;\n}\n\n// rendersFullWidth reports whether a property renders as a full-width block\n// (a structured object → ObjectSection, or an `x-layout: \"table\"` array/map) so\n// a multi-column grid gives it the whole row instead of a single column.\nfunction rendersFullWidth(prop: JsonSchemaProperty): boolean {\n const fixedProperties = effectiveProperties(prop as JsonSchemaObject, {}).properties;\n if (schemaRendersAsObject(prop) && (prop.properties !== undefined || Object.keys(fixedProperties).length > 0)) {\n return true;\n }\n // An object-item array is a summary-row list (or cards) unless it opts out,\n // and each of those renderers owns the row — mirrors ArrayControl's own\n // branching, which decides the same thing from the resolved FieldControl.\n if (hasObjectItemProperties(prop.items) && prop[\"x-array-display\"] !== \"stacked\") {\n return true;\n }\n return prop[\"x-layout\"] === \"table\";\n}\n\n// renderApi is the RenderContext injection bundle: the root form stores it on\n// the context so container controls can recurse without importing this module.\nexport const renderApi: RenderApi = {\n renderFieldNodes,\n renderFieldRow,\n renderObjectFields,\n};\n"],"mappings":"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"}
@@ -3,6 +3,7 @@ const require_Icon = require("../data/Icon.cjs");
3
3
  const require_json_schema_form_conditionals = require("./json-schema-form-conditionals.cjs");
4
4
  const require_json_schema_form_tone = require("./json-schema-form-tone.cjs");
5
5
  const require_json_schema_form_item_summary = require("./json-schema-form-item-summary.cjs");
6
+ const require_json_schema_form_union_model = require("./json-schema-form-union-model.cjs");
6
7
  let react = require("react");
7
8
  // src/components/json-schema-form-resolve.ts
8
9
  function isOpenStringMap(prop) {
@@ -77,7 +78,18 @@ function adornmentNode(iconName, text) {
77
78
  if (typeof text === "string" && text) return (0, react.createElement)("span", { className: "text-sm text-muted-foreground" }, text);
78
79
  }
79
80
  function enumBranch(prop) {
80
- for (const branch of [...prop.anyOf ?? [], ...prop.oneOf ?? []]) if (Array.isArray(branch.enum) && branch.enum.length > 0) return branch;
81
+ const branches = [...prop.anyOf ?? [], ...prop.oneOf ?? []];
82
+ const literalsOnly = branches.every((branch) => branch.enum?.length || typeof branch.const === "string");
83
+ const choices = branches.filter((branch) => branch.enum?.length || literalsOnly && typeof branch.const === "string");
84
+ const first = choices[0];
85
+ if (!first) return void 0;
86
+ return {
87
+ ...first,
88
+ enum: [...new Set(choices.flatMap((branch) => branch.enum ?? [branch.const]))],
89
+ "x-enum-labels": Object.assign({}, ...choices.map((branch) => branch["x-enum-labels"])),
90
+ "x-enum-icons": Object.assign({}, ...choices.map((branch) => branch["x-enum-icons"])),
91
+ "x-enum-descriptions": Object.assign({}, ...choices.map((branch) => branch["x-enum-descriptions"]))
92
+ };
81
93
  }
82
94
  function lookupDescriptor(prop) {
83
95
  const raw = prop["x-clicky-lookup"];
@@ -130,6 +142,14 @@ function resolveControl(args) {
130
142
  options: [],
131
143
  allowCustomValue: lookup.multi !== true
132
144
  };
145
+ if (prop.format === "json") return {
146
+ ...base,
147
+ kind: "json"
148
+ };
149
+ if (require_json_schema_form_union_model.unionBranches(prop).length > 1) return {
150
+ ...base,
151
+ kind: "union"
152
+ };
133
153
  if (Array.isArray(prop.enum) && prop.enum.length > 0) {
134
154
  const display = enumDisplay(prop);
135
155
  return {
@@ -246,7 +266,7 @@ function keyOptionsFor(prop) {
246
266
  }
247
267
  function scalarItemsType(items) {
248
268
  if (!items) return "string";
249
- if (items.enum !== void 0 || items.const !== void 0 || items.properties !== void 0 || items.items !== void 0 || items.additionalProperties !== void 0 || items.allOf !== void 0) return;
269
+ if (items.enum !== void 0 || items.const !== void 0 || items.properties !== void 0 || items.items !== void 0 || items.additionalProperties !== void 0 || items.allOf !== void 0 || items.oneOf !== void 0 || items.anyOf !== void 0) return;
250
270
  if (items.type === void 0 || schemaHasType(items, "string")) return "string";
251
271
  if (schemaHasType(items, "integer")) return "integer";
252
272
  if (schemaHasType(items, "number")) return "number";
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-resolve.cjs","names":["isFieldTone","isPlainObject","createElement","LabelIcon","resolveItemSpec","effectiveProperties"],"sources":["../../src/components/json-schema-form-resolve.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type {\n ArrayDisplay,\n EnumDisplay,\n FieldControl,\n FieldOption,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n LookupDescriptor,\n ScalarItemType,\n} from \"./json-schema-form-types\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { resolveItemSpec } from \"./json-schema-form-item-summary\";\nimport { isFieldTone } from \"./json-schema-form-tone\";\n\n// isOpenStringMap reports whether a property is an object whose entries are\n// described by a sub-schema in `additionalProperties` (a typed key/value map) or\n// by `patternProperties` (a per-key-pattern value map). Either makes it an\n// editable key/value control rather than a fixed-property sub-form.\nexport function isOpenStringMap(prop: JsonSchemaProperty): boolean {\n if (!schemaRendersAsObject(prop)) return false;\n if (\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ) {\n return true;\n }\n return (\n !!prop.patternProperties && Object.keys(prop.patternProperties).length > 0\n );\n}\n\n// patternSchemasOf compiles a schema's `patternProperties` into the ordered\n// {pattern, schema} list the string-map control matches keys against.\nfunction patternSchemasOf(\n prop: JsonSchemaProperty,\n): { pattern: string; schema: JsonSchemaProperty }[] | undefined {\n const pp = prop.patternProperties;\n if (!pp || Object.keys(pp).length === 0) return undefined;\n return Object.entries(pp).map(([pattern, schema]) => ({ pattern, schema }));\n}\n\nfunction schemaHasType(prop: JsonSchemaProperty, type: string): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(type as never);\n return prop.type === type;\n}\n\n// schemaRendersAsObject accepts schemas that omit `type` but use object-only\n// keywords, including composed schemas whose local refs were rehydrated into\n// unconditional allOf members. An explicit incompatible type always wins.\nexport function schemaRendersAsObject(prop: JsonSchemaProperty): boolean {\n if (schemaHasType(prop, \"object\")) return true;\n if (prop.type !== undefined) return false;\n if (\n prop.properties !== undefined ||\n prop.required !== undefined ||\n prop.additionalProperties !== undefined ||\n prop.patternProperties !== undefined ||\n prop.propertyNames !== undefined ||\n prop.unevaluatedProperties !== undefined\n ) {\n return true;\n }\n return (\n prop.allOf?.some(\n (clause) =>\n clause.if === undefined &&\n clause.then === undefined &&\n schemaRendersAsObject(clause as JsonSchemaProperty),\n ) ?? false\n );\n}\n\nfunction enumOptions(prop: JsonSchemaProperty): FieldOption[] {\n const labels = prop[\"x-enum-labels\"];\n const icons = prop[\"x-enum-icons\"];\n const descriptions = prop[\"x-enum-descriptions\"];\n const tones = prop[\"x-enum-tones\"];\n return (prop.enum ?? []).map((v) => {\n const value = String(v);\n const desc = labels?.[value];\n const icon = icons?.[value];\n const description = descriptions?.[value];\n const tone = tones?.[value];\n return {\n value,\n label:\n typeof desc === \"string\" && desc && desc !== value\n ? `${desc} (${value})`\n : value,\n ...(typeof icon === \"string\" && icon ? { icon } : {}),\n ...(typeof description === \"string\" && description\n ? { description }\n : {}),\n ...(isFieldTone(tone) ? { tone } : {}),\n };\n });\n}\n\n// enumDisplay resolves how an enum should render: an explicit `x-enum-display`\n// wins; otherwise an enum carrying `x-enum-icons` defaults to the icon grid.\n// Returns undefined to keep the combobox default.\nfunction enumDisplay(prop: JsonSchemaProperty): EnumDisplay | undefined {\n const d = prop[\"x-enum-display\"];\n if (d === \"combobox\" || d === \"radio\" || d === \"grid\" || d === \"segmented\")\n return d;\n const icons = prop[\"x-enum-icons\"];\n if (icons && Object.keys(icons).length > 0) return \"grid\";\n return undefined;\n}\n\nfunction arrayDisplay(prop: JsonSchemaProperty): ArrayDisplay | undefined {\n const d = prop[\"x-array-display\"];\n return d === \"filter-pills\" ||\n d === \"accordion\" ||\n d === \"cards\" ||\n d === \"stacked\" ||\n d === \"list\"\n ? d\n : undefined;\n}\n\n// helpDisplay reads the per-field `x-help-display` override. Returns undefined\n// to defer to the form-level FormLayout.help.\nfunction helpDisplay(prop: JsonSchemaProperty): HelpDisplay | undefined {\n const d = prop[\"x-help-display\"];\n return d === \"inline\" || d === \"hover\" ? d : undefined;\n}\n\nexport function schemaHelper(prop: JsonSchemaProperty): string | undefined {\n const description =\n typeof prop.description === \"string\" ? prop.description.trim() : \"\";\n const help = prop[\"x-help\"];\n const helpBody =\n isPlainObject(help) && typeof help.body === \"string\"\n ? help.body.trim()\n : \"\";\n\n if (description && helpBody && helpBody !== description) {\n return `${description} ${helpBody}`;\n }\n return description || helpBody || undefined;\n}\n\n// adornmentNode builds a prefix/suffix node from the x-input-*[-icon] extensions:\n// a runtime icon name wins, else static text. Returns undefined when neither set.\nfunction adornmentNode(iconName: unknown, text: unknown): ReactNode {\n if (typeof iconName === \"string\" && iconName) {\n // Match the library's InputField field-icon convention (16px, muted/70) so a\n // schema-driven field lines up with a hand-built one.\n return createElement(LabelIcon, {\n icon: iconName,\n className: \"size-4 text-muted-foreground/70\",\n });\n }\n if (typeof text === \"string\" && text) {\n return createElement(\n \"span\",\n { className: \"text-sm text-muted-foreground\" },\n text,\n );\n }\n return undefined;\n}\n\n// enumBranch returns the first anyOf/oneOf member carrying a non-empty `enum`,\n// for a union of \"an enum value OR a free-form string\" (e.g. a value-or-token\n// field). It lets such a union render as a dropdown. Returns undefined when no\n// branch enumerates values.\nexport function enumBranch(\n prop: JsonSchemaProperty,\n): JsonSchemaProperty | undefined {\n for (const branch of [...(prop.anyOf ?? []), ...(prop.oneOf ?? [])]) {\n if (Array.isArray(branch.enum) && branch.enum.length > 0) return branch;\n }\n return undefined;\n}\n\n// lookupDescriptor reads the `x-clicky-lookup` extension into a LookupDescriptor,\n// returning undefined when the keyword is absent or lacks its required url/filter.\nfunction lookupDescriptor(\n prop: JsonSchemaProperty,\n): LookupDescriptor | undefined {\n const raw: unknown = prop[\"x-clicky-lookup\"];\n if (!isPlainObject(raw)) return undefined;\n if (typeof raw.url !== \"string\" || typeof raw.filter !== \"string\")\n return undefined;\n return raw as unknown as LookupDescriptor;\n}\n\nexport interface ResolveControlArgs {\n key: string;\n prop: JsonSchemaProperty;\n required: boolean;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\n// resolveControl infers a base, render-ready FieldControl from a property\n// schema. It keys off schema keywords only — never the field name: ascode/token\n// heuristics are layered on by consumer pre-extensions. The one exception is the\n// standard `format: date`/`date-time` keyword, which is a schema-declared signal\n// (not a name guess) and so drives a date control directly. First match wins.\nexport function resolveControl(args: ResolveControlArgs): FieldControl {\n const { key, prop, required, value, onChange } = args;\n const labelIcon = prop[\"x-icon\"];\n const xLayout = prop[\"x-layout\"];\n const explicitLayout =\n xLayout === \"inline\" || xLayout === \"stack\" || xLayout === \"table\"\n ? xLayout\n : undefined;\n // `x-label-position` is a friendlier alias over the same per-field layout knob:\n // \"top\" stacks the label above the value; \"left\" forces inline. `x-layout` wins.\n const labelPosition = prop[\"x-label-position\"];\n const layout =\n explicitLayout ??\n (labelPosition === \"top\"\n ? \"stack\"\n : labelPosition === \"left\"\n ? \"inline\"\n : undefined);\n const prefix = adornmentNode(\n prop[\"x-input-prefix-icon\"],\n prop[\"x-input-prefix\"],\n );\n const suffix = adornmentNode(\n prop[\"x-input-suffix-icon\"],\n prop[\"x-input-suffix\"],\n );\n const labelClassName =\n typeof prop[\"x-label-classes\"] === \"string\"\n ? prop[\"x-label-classes\"]\n : undefined;\n const inputClassName =\n typeof prop[\"x-input-classes\"] === \"string\"\n ? prop[\"x-input-classes\"]\n : undefined;\n const colSpan =\n prop[\"x-col-span\"] === \"full\"\n ? (\"full\" as const)\n : typeof prop[\"x-col-span\"] === \"number\" &&\n Number.isFinite(prop[\"x-col-span\"])\n ? prop[\"x-col-span\"]\n : undefined;\n const keyOptions = keyOptionsFor(prop);\n const helper = schemaHelper(prop);\n const helpMode = helpDisplay(prop);\n const base: FieldControl = {\n key,\n kind: \"string\",\n // An explicit empty title is a field saying it needs no label of its own —\n // its host already named it. Only a MISSING title falls back to the key.\n label: typeof prop.title === \"string\" ? prop.title : key,\n required,\n schema: prop,\n value,\n onChange,\n ...(prop.readOnly === true ? { readOnly: true } : {}),\n ...(prop.writeOnly === true ? { writeOnly: true } : {}),\n ...(prop[\"x-disabled\"] === true ? { disabled: true } : {}),\n ...(typeof prop.description === \"string\"\n ? { description: prop.description }\n : {}),\n ...(helper ? { helper } : {}),\n ...(helpMode ? { helpDisplay: helpMode } : {}),\n ...(labelIcon != null && labelIcon !== \"\"\n ? { labelIcon: labelIcon as FieldControl[\"labelIcon\"] }\n : {}),\n ...(layout ? { layout } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(labelClassName ? { labelClassName } : {}),\n ...(inputClassName ? { inputClassName } : {}),\n ...(colSpan != null ? { colSpan } : {}),\n };\n\n // An `x-clicky-lookup` field is an async entity-reference picker: options load\n // lazily from another entity's list endpoint. Single-select also allows\n // free-form entry so a typed value outside the option set still commits.\n const lookup = lookupDescriptor(prop);\n if (lookup) {\n return {\n ...base,\n kind: \"lookup\",\n lookup,\n options: [],\n allowCustomValue: lookup.multi !== true,\n };\n }\n if (Array.isArray(prop.enum) && prop.enum.length > 0) {\n const display = enumDisplay(prop);\n return {\n ...base,\n kind: \"enum\",\n options: enumOptions(prop),\n ...(display ? { display } : {}),\n };\n }\n // A value-or-template union: the enum lives in an anyOf/oneOf branch alongside\n // free-form branches. Render it as a dropdown using that branch's enum; the\n // free-form branches are honoured via a consumer's allowCustomValue pre-ext.\n const branch = enumBranch(prop);\n if (branch) {\n return { ...base, kind: \"enum\", options: enumOptions(branch) };\n }\n const templateBranch = prop.anyOf?.find((part) => part.type === \"string\" && typeof part.pattern === \"string\");\n if (prop.anyOf?.length === 2 && templateBranch) {\n const nativeBranch = prop.anyOf.find((part) => part !== templateBranch);\n if (nativeBranch && (nativeBranch.type === \"number\" || nativeBranch.type === \"integer\" || nativeBranch.type === \"boolean\" || nativeBranch.format === \"date\" || nativeBranch.format === \"date-time\")) {\n const nativeSchema = { ...prop, ...nativeBranch };\n delete nativeSchema.anyOf;\n return resolveControl({ ...args, prop: nativeSchema });\n }\n }\n // A schema-declared date/date-time string renders as a date control.\n if (prop.format === \"date\" || prop.format === \"date-time\") {\n return { ...base, kind: \"date\", dateFormat: prop.format };\n }\n // A long-form string declares `format: textarea` to render a multi-line box.\n if (prop.format === \"textarea\" && schemaHasType(prop, \"string\")) {\n return { ...base, kind: \"textarea\" };\n }\n // A markdown string declares `format: md` to render the MDXEditor-backed\n // editor. Plugin toggles live under `x-md-editor` so schema authors can keep\n // the format signal standard-sized and the editor behavior explicit.\n if (prop.format === \"md\" && schemaHasType(prop, \"string\")) {\n const markdownOptions = prop[\"x-md-editor\"];\n return {\n ...base,\n kind: \"markdown\",\n ...(isPlainObject(markdownOptions) ? { markdownOptions } : {}),\n };\n }\n if (schemaHasType(prop, \"boolean\")) {\n return { ...base, kind: \"boolean\" };\n }\n if (schemaHasType(prop, \"integer\") || schemaHasType(prop, \"number\")) {\n return {\n ...base,\n kind: \"number\",\n coerceNumber: true,\n // A percent number carries a static \"%\" unit shown inside the input.\n ...(prop.format === \"percent\" ? { unit: \"%\" } : {}),\n ...(typeof prop.minimum === \"number\" ? { minimum: prop.minimum } : {}),\n };\n }\n if (schemaHasType(prop, \"array\")) {\n const display = arrayDisplay(prop);\n const itemSchema = prop.items;\n return {\n ...base,\n kind: \"array\",\n ...(itemSchema ? { itemSchema } : {}),\n ...(typeof prop.minItems === \"number\" ? { minItems: prop.minItems } : {}),\n ...(typeof prop.maxItems === \"number\" ? { maxItems: prop.maxItems } : {}),\n ...(display ? { arrayDisplay: display } : {}),\n ...(display === \"accordion\" ? { itemSpec: resolveItemSpec(prop, itemSchema) } : {}),\n // An accordion reuses the array's description as the zero-item copy in its\n // add row, so a paragraph of the same sentence directly above would be a\n // literal duplicate. The schema can still say otherwise.\n ...(display === \"accordion\" && !helpMode ? { helpDisplay: \"hover\" as const } : {}),\n // An enum item schema makes the whole array a list of choices, whichever\n // display renders it (tags by default, filter pills on request), so the\n // options — labels, icons, tones and all — always resolve.\n ...(itemSchema && Array.isArray(itemSchema.enum)\n ? { options: enumOptions(itemSchema) }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // An open map: object whose entries are described by an additionalProperties\n // sub-schema and/or per-key patternProperties. Renders as editable key/value\n // rows (+ any known properties), with the value form resolved per key.\n if (isOpenStringMap(prop)) {\n const addl =\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ? (prop.additionalProperties as JsonSchemaProperty)\n : undefined;\n const patterns = patternSchemasOf(prop);\n // A constrained picker (propertyNames enum) or patternProperties still lets\n // the author ADD keys — the additions are limited to the allowed set, not\n // free-form — so `additionalProperties: false` doesn't disable \"Add field\"\n // in that case. It only closes a plain open map with no key constraints.\n const allowExtraKeys =\n keyOptions || patterns ? true : prop.additionalProperties !== false;\n return {\n ...base,\n kind: \"string-map\",\n ...(addl ? { valueSchema: addl } : {}),\n ...(patterns ? { valuePatternSchemas: patterns } : {}),\n ...(prop.properties ? { knownProperties: prop.properties } : {}),\n allowExtraKeys,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // A structured object: fixed `properties`, not an open map. Renders as a\n // nested sub-form (labels, required, if/then) — recursed into by the renderer.\n if (schemaRendersAsObject(prop)) {\n const valueObject = isPlainObject(value) ? value : {};\n const objectFields = effectiveProperties(\n prop as JsonSchemaObject,\n valueObject,\n );\n if (Object.keys(objectFields.properties).length > 0 || prop.properties) {\n return {\n ...base,\n kind: \"object\",\n objectProperties: objectFields.properties,\n ...(objectFields.required.length > 0\n ? { objectRequired: objectFields.required }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n }\n // A bare object with neither properties nor an additionalProperties schema:\n // treat as an open string map unless explicitly closed.\n if (schemaRendersAsObject(prop)) {\n return {\n ...base,\n kind: \"string-map\",\n allowExtraKeys: prop.additionalProperties !== false,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n return base;\n}\n\n// keyOptionsFor resolves the strict map-key picker options from a map schema's\n// `propertyNames.enum` (e.g. an AsCode-constrained key set). Returns undefined\n// when the keys are unconstrained, so the key stays free-text.\nfunction keyOptionsFor(prop: JsonSchemaProperty): FieldOption[] | undefined {\n const pn = prop.propertyNames as JsonSchemaProperty | undefined;\n if (!pn || !Array.isArray(pn.enum) || pn.enum.length === 0) return undefined;\n return enumOptions(pn);\n}\n\n// scalarItemsType returns the scalar type an array's items hold — the case the\n// array renders as ONE tag list rather than a control per item — or undefined\n// when the items need a real per-item control. Anything carrying an\n// enum/const/properties/items/additionalProperties/allOf has a richer shape (an\n// enum array is a list of choices, and takes the option-backed branch instead).\nexport function scalarItemsType(\n items: JsonSchemaProperty | undefined,\n): ScalarItemType | undefined {\n if (!items) return \"string\"; // untyped items default to string tags\n if (\n items.enum !== undefined ||\n items.const !== undefined ||\n items.properties !== undefined ||\n items.items !== undefined ||\n items.additionalProperties !== undefined ||\n items.allOf !== undefined\n ) {\n return undefined;\n }\n if (items.type === undefined || schemaHasType(items, \"string\")) return \"string\";\n if (schemaHasType(items, \"integer\")) return \"integer\";\n if (schemaHasType(items, \"number\")) return \"number\";\n return undefined;\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,gBAAgB,MAAmC;CACjE,IAAI,CAAC,sBAAsB,IAAI,GAAG,OAAO;CACzC,IACE,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,MAE9B,OAAO;CAET,OACE,CAAC,CAAC,KAAK,qBAAqB,OAAO,KAAK,KAAK,iBAAiB,CAAC,CAAC,SAAS;AAE7E;AAIA,SAAS,iBACP,MAC+D;CAC/D,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,OAAO,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG,OAAO,KAAA;CAChD,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,aAAa;EAAE;EAAS;CAAO,EAAE;AAC5E;AAEA,SAAS,cAAc,MAA0B,MAAuB;CACtE,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,SAAS,IAAa;CACrE,OAAO,KAAK,SAAS;AACvB;AAKA,SAAgB,sBAAsB,MAAmC;CACvE,IAAI,cAAc,MAAM,QAAQ,GAAG,OAAO;CAC1C,IAAI,KAAK,SAAS,KAAA,GAAW,OAAO;CACpC,IACE,KAAK,eAAe,KAAA,KACpB,KAAK,aAAa,KAAA,KAClB,KAAK,yBAAyB,KAAA,KAC9B,KAAK,sBAAsB,KAAA,KAC3B,KAAK,kBAAkB,KAAA,KACvB,KAAK,0BAA0B,KAAA,GAE/B,OAAO;CAET,OACE,KAAK,OAAO,MACT,WACC,OAAO,OAAO,KAAA,KACd,OAAO,SAAS,KAAA,KAChB,sBAAsB,MAA4B,CACtD,KAAK;AAET;AAEA,SAAS,YAAY,MAAyC;CAC5D,MAAM,SAAS,KAAK;CACpB,MAAM,QAAQ,KAAK;CACnB,MAAM,eAAe,KAAK;CAC1B,MAAM,QAAQ,KAAK;CACnB,QAAQ,KAAK,QAAQ,CAAC,EAAA,CAAG,KAAK,MAAM;EAClC,MAAM,QAAQ,OAAO,CAAC;EACtB,MAAM,OAAO,SAAS;EACtB,MAAM,OAAO,QAAQ;EACrB,MAAM,cAAc,eAAe;EACnC,MAAM,OAAO,QAAQ;EACrB,OAAO;GACL;GACA,OACE,OAAO,SAAS,YAAY,QAAQ,SAAS,QACzC,GAAG,KAAK,IAAI,MAAM,KAClB;GACN,GAAI,OAAO,SAAS,YAAY,OAAO,EAAE,KAAK,IAAI,CAAC;GACnD,GAAI,OAAO,gBAAgB,YAAY,cACnC,EAAE,YAAY,IACd,CAAC;GACL,GAAIA,8BAAAA,YAAY,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;EACtC;CACF,CAAC;AACH;AAKA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,IAAI,MAAM,cAAc,MAAM,WAAW,MAAM,UAAU,MAAM,aAC7D,OAAO;CACT,MAAM,QAAQ,KAAK;CACnB,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO;AAErD;AAEA,SAAS,aAAa,MAAoD;CACxE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,kBACX,MAAM,eACN,MAAM,WACN,MAAM,aACN,MAAM,SACJ,IACA,KAAA;AACN;AAIA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,YAAY,MAAM,UAAU,IAAI,KAAA;AAC/C;AAEA,SAAgB,aAAa,MAA8C;CACzE,MAAM,cACJ,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,KAAK,IAAI;CACnE,MAAM,OAAO,KAAK;CAClB,MAAM,WACJC,oBAAAA,cAAc,IAAI,KAAK,OAAO,KAAK,SAAS,WACxC,KAAK,KAAK,KAAK,IACf;CAEN,IAAI,eAAe,YAAY,aAAa,aAC1C,OAAO,GAAG,YAAY,GAAG;CAE3B,OAAO,eAAe,YAAY,KAAA;AACpC;AAIA,SAAS,cAAc,UAAmB,MAA0B;CAClE,IAAI,OAAO,aAAa,YAAY,UAGlC,QAAA,GAAOC,MAAAA,cAAAA,CAAcC,aAAAA,WAAW;EAC9B,MAAM;EACN,WAAW;CACb,CAAC;CAEH,IAAI,OAAO,SAAS,YAAY,MAC9B,QAAA,GAAOD,MAAAA,cAAAA,CACL,QACA,EAAE,WAAW,gCAAgC,GAC7C,IACF;AAGJ;AAMA,SAAgB,WACd,MACgC;CAChC,KAAK,MAAM,UAAU,CAAC,GAAI,KAAK,SAAS,CAAC,GAAI,GAAI,KAAK,SAAS,CAAC,CAAE,GAChE,IAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG,OAAO;AAGrE;AAIA,SAAS,iBACP,MAC8B;CAC9B,MAAM,MAAe,KAAK;CAC1B,IAAI,CAACD,oBAAAA,cAAc,GAAG,GAAG,OAAO,KAAA;CAChC,IAAI,OAAO,IAAI,QAAQ,YAAY,OAAO,IAAI,WAAW,UACvD,OAAO,KAAA;CACT,OAAO;AACT;AAeA,SAAgB,eAAe,MAAwC;CACrE,MAAM,EAAE,KAAK,MAAM,UAAU,OAAO,aAAa;CACjD,MAAM,YAAY,KAAK;CACvB,MAAM,UAAU,KAAK;CACrB,MAAM,iBACJ,YAAY,YAAY,YAAY,WAAW,YAAY,UACvD,UACA,KAAA;CAGN,MAAM,gBAAgB,KAAK;CAC3B,MAAM,SACJ,mBACC,kBAAkB,QACf,UACA,kBAAkB,SAChB,WACA,KAAA;CACR,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,UACJ,KAAK,kBAAkB,SAClB,SACD,OAAO,KAAK,kBAAkB,YAC5B,OAAO,SAAS,KAAK,aAAa,IAClC,KAAK,gBACL,KAAA;CACR,MAAM,aAAa,cAAc,IAAI;CACrC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,YAAY,IAAI;CACjC,MAAM,OAAqB;EACzB;EACA,MAAM;EAGN,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;EACrD;EACA,QAAQ;EACR;EACA;EACA,GAAI,KAAK,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACnD,GAAI,KAAK,cAAc,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;EACrD,GAAI,KAAK,kBAAkB,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACxD,GAAI,OAAO,KAAK,gBAAgB,WAC5B,EAAE,aAAa,KAAK,YAAY,IAChC,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,WAAW,EAAE,aAAa,SAAS,IAAI,CAAC;EAC5C,GAAI,aAAa,QAAQ,cAAc,KACnC,EAAa,UAAuC,IACpD,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;CACvC;CAKA,MAAM,SAAS,iBAAiB,IAAI;CACpC,IAAI,QACF,OAAO;EACL,GAAG;EACH,MAAM;EACN;EACA,SAAS,CAAC;EACV,kBAAkB,OAAO,UAAU;CACrC;CAEF,IAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;EACpD,MAAM,UAAU,YAAY,IAAI;EAChC,OAAO;GACL,GAAG;GACH,MAAM;GACN,SAAS,YAAY,IAAI;GACzB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC/B;CACF;CAIA,MAAM,SAAS,WAAW,IAAI;CAC9B,IAAI,QACF,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,SAAS,YAAY,MAAM;CAAE;CAE/D,MAAM,iBAAiB,KAAK,OAAO,MAAM,SAAS,KAAK,SAAS,YAAY,OAAO,KAAK,YAAY,QAAQ;CAC5G,IAAI,KAAK,OAAO,WAAW,KAAK,gBAAgB;EAC9C,MAAM,eAAe,KAAK,MAAM,MAAM,SAAS,SAAS,cAAc;EACtE,IAAI,iBAAiB,aAAa,SAAS,YAAY,aAAa,SAAS,aAAa,aAAa,SAAS,aAAa,aAAa,WAAW,UAAU,aAAa,WAAW,cAAc;GACnM,MAAM,eAAe;IAAE,GAAG;IAAM,GAAG;GAAa;GAChD,OAAO,aAAa;GACpB,OAAO,eAAe;IAAE,GAAG;IAAM,MAAM;GAAa,CAAC;EACvD;CACF;CAEA,IAAI,KAAK,WAAW,UAAU,KAAK,WAAW,aAC5C,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,YAAY,KAAK;CAAO;CAG1D,IAAI,KAAK,WAAW,cAAc,cAAc,MAAM,QAAQ,GAC5D,OAAO;EAAE,GAAG;EAAM,MAAM;CAAW;CAKrC,IAAI,KAAK,WAAW,QAAQ,cAAc,MAAM,QAAQ,GAAG;EACzD,MAAM,kBAAkB,KAAK;EAC7B,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAIA,oBAAAA,cAAc,eAAe,IAAI,EAAE,gBAAgB,IAAI,CAAC;EAC9D;CACF;CACA,IAAI,cAAc,MAAM,SAAS,GAC/B,OAAO;EAAE,GAAG;EAAM,MAAM;CAAU;CAEpC,IAAI,cAAc,MAAM,SAAS,KAAK,cAAc,MAAM,QAAQ,GAChE,OAAO;EACL,GAAG;EACH,MAAM;EACN,cAAc;EAEd,GAAI,KAAK,WAAW,YAAY,EAAE,MAAM,IAAI,IAAI,CAAC;EACjD,GAAI,OAAO,KAAK,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CACtE;CAEF,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,MAAM,UAAU,aAAa,IAAI;EACjC,MAAM,aAAa,KAAK;EACxB,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,UAAU,EAAE,cAAc,QAAQ,IAAI,CAAC;GAC3C,GAAI,YAAY,cAAc,EAAE,UAAUG,sCAAAA,gBAAgB,MAAM,UAAU,EAAE,IAAI,CAAC;GAIjF,GAAI,YAAY,eAAe,CAAC,WAAW,EAAE,aAAa,QAAiB,IAAI,CAAC;GAIhF,GAAI,cAAc,MAAM,QAAQ,WAAW,IAAI,IAC3C,EAAE,SAAS,YAAY,UAAU,EAAE,IACnC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAIA,IAAI,gBAAgB,IAAI,GAAG;EACzB,MAAM,OACJ,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,OACzB,KAAK,uBACN,KAAA;EACN,MAAM,WAAW,iBAAiB,IAAI;EAKtC,MAAM,iBACJ,cAAc,WAAW,OAAO,KAAK,yBAAyB;EAChE,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;GACpC,GAAI,WAAW,EAAE,qBAAqB,SAAS,IAAI,CAAC;GACpD,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;GAC9D;GACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAGA,IAAI,sBAAsB,IAAI,GAAG;EAC/B,MAAM,cAAcH,oBAAAA,cAAc,KAAK,IAAI,QAAQ,CAAC;EACpD,MAAM,eAAeI,sCAAAA,oBACnB,MACA,WACF;EACA,IAAI,OAAO,KAAK,aAAa,UAAU,CAAC,CAAC,SAAS,KAAK,KAAK,YAC1D,OAAO;GACL,GAAG;GACH,MAAM;GACN,kBAAkB,aAAa;GAC/B,GAAI,aAAa,SAAS,SAAS,IAC/B,EAAE,gBAAgB,aAAa,SAAS,IACxC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CAEJ;CAGA,IAAI,sBAAsB,IAAI,GAC5B,OAAO;EACL,GAAG;EACH,MAAM;EACN,gBAAgB,KAAK,yBAAyB;EAC9C,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B;CAEF,OAAO;AACT;AAKA,SAAS,cAAc,MAAqD;CAC1E,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,KAAK,WAAW,GAAG,OAAO,KAAA;CACnE,OAAO,YAAY,EAAE;AACvB;AAOA,SAAgB,gBACd,OAC4B;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,IACE,MAAM,SAAS,KAAA,KACf,MAAM,UAAU,KAAA,KAChB,MAAM,eAAe,KAAA,KACrB,MAAM,UAAU,KAAA,KAChB,MAAM,yBAAyB,KAAA,KAC/B,MAAM,UAAU,KAAA,GAEhB;CAEF,IAAI,MAAM,SAAS,KAAA,KAAa,cAAc,OAAO,QAAQ,GAAG,OAAO;CACvE,IAAI,cAAc,OAAO,SAAS,GAAG,OAAO;CAC5C,IAAI,cAAc,OAAO,QAAQ,GAAG,OAAO;AAE7C"}
1
+ {"version":3,"file":"json-schema-form-resolve.cjs","names":["isFieldTone","isPlainObject","createElement","LabelIcon","unionBranches","resolveItemSpec","effectiveProperties"],"sources":["../../src/components/json-schema-form-resolve.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type {\n ArrayDisplay,\n EnumDisplay,\n FieldControl,\n FieldOption,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n LookupDescriptor,\n ScalarItemType,\n} from \"./json-schema-form-types\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { resolveItemSpec } from \"./json-schema-form-item-summary\";\nimport { isFieldTone } from \"./json-schema-form-tone\";\nimport { unionBranches } from \"./json-schema-form-union-model\";\n\n// isOpenStringMap reports whether a property is an object whose entries are\n// described by a sub-schema in `additionalProperties` (a typed key/value map) or\n// by `patternProperties` (a per-key-pattern value map). Either makes it an\n// editable key/value control rather than a fixed-property sub-form.\nexport function isOpenStringMap(prop: JsonSchemaProperty): boolean {\n if (!schemaRendersAsObject(prop)) return false;\n if (\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ) {\n return true;\n }\n return (\n !!prop.patternProperties && Object.keys(prop.patternProperties).length > 0\n );\n}\n\n// patternSchemasOf compiles a schema's `patternProperties` into the ordered\n// {pattern, schema} list the string-map control matches keys against.\nfunction patternSchemasOf(\n prop: JsonSchemaProperty,\n): { pattern: string; schema: JsonSchemaProperty }[] | undefined {\n const pp = prop.patternProperties;\n if (!pp || Object.keys(pp).length === 0) return undefined;\n return Object.entries(pp).map(([pattern, schema]) => ({ pattern, schema }));\n}\n\nfunction schemaHasType(prop: JsonSchemaProperty, type: string): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(type as never);\n return prop.type === type;\n}\n\n// schemaRendersAsObject accepts schemas that omit `type` but use object-only\n// keywords, including composed schemas whose local refs were rehydrated into\n// unconditional allOf members. An explicit incompatible type always wins.\nexport function schemaRendersAsObject(prop: JsonSchemaProperty): boolean {\n if (schemaHasType(prop, \"object\")) return true;\n if (prop.type !== undefined) return false;\n if (\n prop.properties !== undefined ||\n prop.required !== undefined ||\n prop.additionalProperties !== undefined ||\n prop.patternProperties !== undefined ||\n prop.propertyNames !== undefined ||\n prop.unevaluatedProperties !== undefined\n ) {\n return true;\n }\n return (\n prop.allOf?.some(\n (clause) =>\n clause.if === undefined &&\n clause.then === undefined &&\n schemaRendersAsObject(clause as JsonSchemaProperty),\n ) ?? false\n );\n}\n\nfunction enumOptions(prop: JsonSchemaProperty): FieldOption[] {\n const labels = prop[\"x-enum-labels\"];\n const icons = prop[\"x-enum-icons\"];\n const descriptions = prop[\"x-enum-descriptions\"];\n const tones = prop[\"x-enum-tones\"];\n return (prop.enum ?? []).map((v) => {\n const value = String(v);\n const desc = labels?.[value];\n const icon = icons?.[value];\n const description = descriptions?.[value];\n const tone = tones?.[value];\n return {\n value,\n label:\n typeof desc === \"string\" && desc && desc !== value\n ? `${desc} (${value})`\n : value,\n ...(typeof icon === \"string\" && icon ? { icon } : {}),\n ...(typeof description === \"string\" && description\n ? { description }\n : {}),\n ...(isFieldTone(tone) ? { tone } : {}),\n };\n });\n}\n\n// enumDisplay resolves how an enum should render: an explicit `x-enum-display`\n// wins; otherwise an enum carrying `x-enum-icons` defaults to the icon grid.\n// Returns undefined to keep the combobox default.\nfunction enumDisplay(prop: JsonSchemaProperty): EnumDisplay | undefined {\n const d = prop[\"x-enum-display\"];\n if (d === \"combobox\" || d === \"radio\" || d === \"grid\" || d === \"segmented\")\n return d;\n const icons = prop[\"x-enum-icons\"];\n if (icons && Object.keys(icons).length > 0) return \"grid\";\n return undefined;\n}\n\nfunction arrayDisplay(prop: JsonSchemaProperty): ArrayDisplay | undefined {\n const d = prop[\"x-array-display\"];\n return d === \"filter-pills\" ||\n d === \"accordion\" ||\n d === \"cards\" ||\n d === \"stacked\" ||\n d === \"list\"\n ? d\n : undefined;\n}\n\n// helpDisplay reads the per-field `x-help-display` override. Returns undefined\n// to defer to the form-level FormLayout.help.\nfunction helpDisplay(prop: JsonSchemaProperty): HelpDisplay | undefined {\n const d = prop[\"x-help-display\"];\n return d === \"inline\" || d === \"hover\" ? d : undefined;\n}\n\nexport function schemaHelper(prop: JsonSchemaProperty): string | undefined {\n const description =\n typeof prop.description === \"string\" ? prop.description.trim() : \"\";\n const help = prop[\"x-help\"];\n const helpBody =\n isPlainObject(help) && typeof help.body === \"string\"\n ? help.body.trim()\n : \"\";\n\n if (description && helpBody && helpBody !== description) {\n return `${description} ${helpBody}`;\n }\n return description || helpBody || undefined;\n}\n\n// adornmentNode builds a prefix/suffix node from the x-input-*[-icon] extensions:\n// a runtime icon name wins, else static text. Returns undefined when neither set.\nfunction adornmentNode(iconName: unknown, text: unknown): ReactNode {\n if (typeof iconName === \"string\" && iconName) {\n // Match the library's InputField field-icon convention (16px, muted/70) so a\n // schema-driven field lines up with a hand-built one.\n return createElement(LabelIcon, {\n icon: iconName,\n className: \"size-4 text-muted-foreground/70\",\n });\n }\n if (typeof text === \"string\" && text) {\n return createElement(\n \"span\",\n { className: \"text-sm text-muted-foreground\" },\n text,\n );\n }\n return undefined;\n}\n\n// Combine literal choices across scalar branches, including enum-or-template unions.\nexport function enumBranch(\n prop: JsonSchemaProperty,\n): JsonSchemaProperty | undefined {\n const branches = [...(prop.anyOf ?? []), ...(prop.oneOf ?? [])];\n const literalsOnly = branches.every((branch) => branch.enum?.length || typeof branch.const === \"string\");\n const choices = branches.filter((branch) => branch.enum?.length || (literalsOnly && typeof branch.const === \"string\"));\n const first = choices[0];\n if (!first) return undefined;\n return {\n ...first,\n enum: [...new Set(choices.flatMap((branch) => branch.enum ?? [branch.const]))],\n \"x-enum-labels\": Object.assign({}, ...choices.map((branch) => branch[\"x-enum-labels\"])),\n \"x-enum-icons\": Object.assign({}, ...choices.map((branch) => branch[\"x-enum-icons\"])),\n \"x-enum-descriptions\": Object.assign({}, ...choices.map((branch) => branch[\"x-enum-descriptions\"])),\n };\n}\n\n// lookupDescriptor reads the `x-clicky-lookup` extension into a LookupDescriptor,\n// returning undefined when the keyword is absent or lacks its required url/filter.\nfunction lookupDescriptor(\n prop: JsonSchemaProperty,\n): LookupDescriptor | undefined {\n const raw: unknown = prop[\"x-clicky-lookup\"];\n if (!isPlainObject(raw)) return undefined;\n if (typeof raw.url !== \"string\" || typeof raw.filter !== \"string\")\n return undefined;\n return raw as unknown as LookupDescriptor;\n}\n\nexport interface ResolveControlArgs {\n key: string;\n prop: JsonSchemaProperty;\n required: boolean;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\n// resolveControl infers a base, render-ready FieldControl from a property\n// schema. It keys off schema keywords only — never the field name: ascode/token\n// heuristics are layered on by consumer pre-extensions. The one exception is the\n// standard `format: date`/`date-time` keyword, which is a schema-declared signal\n// (not a name guess) and so drives a date control directly. First match wins.\nexport function resolveControl(args: ResolveControlArgs): FieldControl {\n const { key, prop, required, value, onChange } = args;\n const labelIcon = prop[\"x-icon\"];\n const xLayout = prop[\"x-layout\"];\n const explicitLayout =\n xLayout === \"inline\" || xLayout === \"stack\" || xLayout === \"table\"\n ? xLayout\n : undefined;\n // `x-label-position` is a friendlier alias over the same per-field layout knob:\n // \"top\" stacks the label above the value; \"left\" forces inline. `x-layout` wins.\n const labelPosition = prop[\"x-label-position\"];\n const layout =\n explicitLayout ??\n (labelPosition === \"top\"\n ? \"stack\"\n : labelPosition === \"left\"\n ? \"inline\"\n : undefined);\n const prefix = adornmentNode(\n prop[\"x-input-prefix-icon\"],\n prop[\"x-input-prefix\"],\n );\n const suffix = adornmentNode(\n prop[\"x-input-suffix-icon\"],\n prop[\"x-input-suffix\"],\n );\n const labelClassName =\n typeof prop[\"x-label-classes\"] === \"string\"\n ? prop[\"x-label-classes\"]\n : undefined;\n const inputClassName =\n typeof prop[\"x-input-classes\"] === \"string\"\n ? prop[\"x-input-classes\"]\n : undefined;\n const colSpan =\n prop[\"x-col-span\"] === \"full\"\n ? (\"full\" as const)\n : typeof prop[\"x-col-span\"] === \"number\" &&\n Number.isFinite(prop[\"x-col-span\"])\n ? prop[\"x-col-span\"]\n : undefined;\n const keyOptions = keyOptionsFor(prop);\n const helper = schemaHelper(prop);\n const helpMode = helpDisplay(prop);\n const base: FieldControl = {\n key,\n kind: \"string\",\n // An explicit empty title is a field saying it needs no label of its own —\n // its host already named it. Only a MISSING title falls back to the key.\n label: typeof prop.title === \"string\" ? prop.title : key,\n required,\n schema: prop,\n value,\n onChange,\n ...(prop.readOnly === true ? { readOnly: true } : {}),\n ...(prop.writeOnly === true ? { writeOnly: true } : {}),\n ...(prop[\"x-disabled\"] === true ? { disabled: true } : {}),\n ...(typeof prop.description === \"string\"\n ? { description: prop.description }\n : {}),\n ...(helper ? { helper } : {}),\n ...(helpMode ? { helpDisplay: helpMode } : {}),\n ...(labelIcon != null && labelIcon !== \"\"\n ? { labelIcon: labelIcon as FieldControl[\"labelIcon\"] }\n : {}),\n ...(layout ? { layout } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(labelClassName ? { labelClassName } : {}),\n ...(inputClassName ? { inputClassName } : {}),\n ...(colSpan != null ? { colSpan } : {}),\n };\n\n // An `x-clicky-lookup` field is an async entity-reference picker: options load\n // lazily from another entity's list endpoint. Single-select also allows\n // free-form entry so a typed value outside the option set still commits.\n const lookup = lookupDescriptor(prop);\n if (lookup) {\n return {\n ...base,\n kind: \"lookup\",\n lookup,\n options: [],\n allowCustomValue: lookup.multi !== true,\n };\n }\n if (prop.format === \"json\") return { ...base, kind: \"json\" };\n if (unionBranches(prop).length > 1) return { ...base, kind: \"union\" };\n if (Array.isArray(prop.enum) && prop.enum.length > 0) {\n const display = enumDisplay(prop);\n return {\n ...base,\n kind: \"enum\",\n options: enumOptions(prop),\n ...(display ? { display } : {}),\n };\n }\n // A value-or-template union: the enum lives in an anyOf/oneOf branch alongside\n // free-form branches. Render it as a dropdown using that branch's enum; the\n // free-form branches are honoured via a consumer's allowCustomValue pre-ext.\n const branch = enumBranch(prop);\n if (branch) {\n return { ...base, kind: \"enum\", options: enumOptions(branch) };\n }\n const templateBranch = prop.anyOf?.find((part) => part.type === \"string\" && typeof part.pattern === \"string\");\n if (prop.anyOf?.length === 2 && templateBranch) {\n const nativeBranch = prop.anyOf.find((part) => part !== templateBranch);\n if (nativeBranch && (nativeBranch.type === \"number\" || nativeBranch.type === \"integer\" || nativeBranch.type === \"boolean\" || nativeBranch.format === \"date\" || nativeBranch.format === \"date-time\")) {\n const nativeSchema = { ...prop, ...nativeBranch };\n delete nativeSchema.anyOf;\n return resolveControl({ ...args, prop: nativeSchema });\n }\n }\n // A schema-declared date/date-time string renders as a date control.\n if (prop.format === \"date\" || prop.format === \"date-time\") {\n return { ...base, kind: \"date\", dateFormat: prop.format };\n }\n // A long-form string declares `format: textarea` to render a multi-line box.\n if (prop.format === \"textarea\" && schemaHasType(prop, \"string\")) {\n return { ...base, kind: \"textarea\" };\n }\n // A markdown string declares `format: md` to render the MDXEditor-backed\n // editor. Plugin toggles live under `x-md-editor` so schema authors can keep\n // the format signal standard-sized and the editor behavior explicit.\n if (prop.format === \"md\" && schemaHasType(prop, \"string\")) {\n const markdownOptions = prop[\"x-md-editor\"];\n return {\n ...base,\n kind: \"markdown\",\n ...(isPlainObject(markdownOptions) ? { markdownOptions } : {}),\n };\n }\n if (schemaHasType(prop, \"boolean\")) {\n return { ...base, kind: \"boolean\" };\n }\n if (schemaHasType(prop, \"integer\") || schemaHasType(prop, \"number\")) {\n return {\n ...base,\n kind: \"number\",\n coerceNumber: true,\n // A percent number carries a static \"%\" unit shown inside the input.\n ...(prop.format === \"percent\" ? { unit: \"%\" } : {}),\n ...(typeof prop.minimum === \"number\" ? { minimum: prop.minimum } : {}),\n };\n }\n if (schemaHasType(prop, \"array\")) {\n const display = arrayDisplay(prop);\n const itemSchema = prop.items;\n return {\n ...base,\n kind: \"array\",\n ...(itemSchema ? { itemSchema } : {}),\n ...(typeof prop.minItems === \"number\" ? { minItems: prop.minItems } : {}),\n ...(typeof prop.maxItems === \"number\" ? { maxItems: prop.maxItems } : {}),\n ...(display ? { arrayDisplay: display } : {}),\n ...(display === \"accordion\" ? { itemSpec: resolveItemSpec(prop, itemSchema) } : {}),\n // An accordion reuses the array's description as the zero-item copy in its\n // add row, so a paragraph of the same sentence directly above would be a\n // literal duplicate. The schema can still say otherwise.\n ...(display === \"accordion\" && !helpMode ? { helpDisplay: \"hover\" as const } : {}),\n // An enum item schema makes the whole array a list of choices, whichever\n // display renders it (tags by default, filter pills on request), so the\n // options — labels, icons, tones and all — always resolve.\n ...(itemSchema && Array.isArray(itemSchema.enum)\n ? { options: enumOptions(itemSchema) }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // An open map: object whose entries are described by an additionalProperties\n // sub-schema and/or per-key patternProperties. Renders as editable key/value\n // rows (+ any known properties), with the value form resolved per key.\n if (isOpenStringMap(prop)) {\n const addl =\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ? (prop.additionalProperties as JsonSchemaProperty)\n : undefined;\n const patterns = patternSchemasOf(prop);\n // A constrained picker (propertyNames enum) or patternProperties still lets\n // the author ADD keys — the additions are limited to the allowed set, not\n // free-form — so `additionalProperties: false` doesn't disable \"Add field\"\n // in that case. It only closes a plain open map with no key constraints.\n const allowExtraKeys =\n keyOptions || patterns ? true : prop.additionalProperties !== false;\n return {\n ...base,\n kind: \"string-map\",\n ...(addl ? { valueSchema: addl } : {}),\n ...(patterns ? { valuePatternSchemas: patterns } : {}),\n ...(prop.properties ? { knownProperties: prop.properties } : {}),\n allowExtraKeys,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // A structured object: fixed `properties`, not an open map. Renders as a\n // nested sub-form (labels, required, if/then) — recursed into by the renderer.\n if (schemaRendersAsObject(prop)) {\n const valueObject = isPlainObject(value) ? value : {};\n const objectFields = effectiveProperties(\n prop as JsonSchemaObject,\n valueObject,\n );\n if (Object.keys(objectFields.properties).length > 0 || prop.properties) {\n return {\n ...base,\n kind: \"object\",\n objectProperties: objectFields.properties,\n ...(objectFields.required.length > 0\n ? { objectRequired: objectFields.required }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n }\n // A bare object with neither properties nor an additionalProperties schema:\n // treat as an open string map unless explicitly closed.\n if (schemaRendersAsObject(prop)) {\n return {\n ...base,\n kind: \"string-map\",\n allowExtraKeys: prop.additionalProperties !== false,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n return base;\n}\n\n// keyOptionsFor resolves the strict map-key picker options from a map schema's\n// `propertyNames.enum` (e.g. an AsCode-constrained key set). Returns undefined\n// when the keys are unconstrained, so the key stays free-text.\nfunction keyOptionsFor(prop: JsonSchemaProperty): FieldOption[] | undefined {\n const pn = prop.propertyNames as JsonSchemaProperty | undefined;\n if (!pn || !Array.isArray(pn.enum) || pn.enum.length === 0) return undefined;\n return enumOptions(pn);\n}\n\n// scalarItemsType returns the scalar type an array's items hold — the case the\n// array renders as ONE tag list rather than a control per item — or undefined\n// when the items need a real per-item control. Anything carrying an\n// enum/const/properties/items/additionalProperties/allOf has a richer shape (an\n// enum array is a list of choices, and takes the option-backed branch instead).\nexport function scalarItemsType(\n items: JsonSchemaProperty | undefined,\n): ScalarItemType | undefined {\n if (!items) return \"string\"; // untyped items default to string tags\n if (\n items.enum !== undefined ||\n items.const !== undefined ||\n items.properties !== undefined ||\n items.items !== undefined ||\n items.additionalProperties !== undefined ||\n items.allOf !== undefined ||\n items.oneOf !== undefined || items.anyOf !== undefined\n ) {\n return undefined;\n }\n if (items.type === undefined || schemaHasType(items, \"string\")) return \"string\";\n if (schemaHasType(items, \"integer\")) return \"integer\";\n if (schemaHasType(items, \"number\")) return \"number\";\n return undefined;\n}\n"],"mappings":";;;;;;;;AAuBA,SAAgB,gBAAgB,MAAmC;CACjE,IAAI,CAAC,sBAAsB,IAAI,GAAG,OAAO;CACzC,IACE,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,MAE9B,OAAO;CAET,OACE,CAAC,CAAC,KAAK,qBAAqB,OAAO,KAAK,KAAK,iBAAiB,CAAC,CAAC,SAAS;AAE7E;AAIA,SAAS,iBACP,MAC+D;CAC/D,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,OAAO,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG,OAAO,KAAA;CAChD,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,aAAa;EAAE;EAAS;CAAO,EAAE;AAC5E;AAEA,SAAS,cAAc,MAA0B,MAAuB;CACtE,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,SAAS,IAAa;CACrE,OAAO,KAAK,SAAS;AACvB;AAKA,SAAgB,sBAAsB,MAAmC;CACvE,IAAI,cAAc,MAAM,QAAQ,GAAG,OAAO;CAC1C,IAAI,KAAK,SAAS,KAAA,GAAW,OAAO;CACpC,IACE,KAAK,eAAe,KAAA,KACpB,KAAK,aAAa,KAAA,KAClB,KAAK,yBAAyB,KAAA,KAC9B,KAAK,sBAAsB,KAAA,KAC3B,KAAK,kBAAkB,KAAA,KACvB,KAAK,0BAA0B,KAAA,GAE/B,OAAO;CAET,OACE,KAAK,OAAO,MACT,WACC,OAAO,OAAO,KAAA,KACd,OAAO,SAAS,KAAA,KAChB,sBAAsB,MAA4B,CACtD,KAAK;AAET;AAEA,SAAS,YAAY,MAAyC;CAC5D,MAAM,SAAS,KAAK;CACpB,MAAM,QAAQ,KAAK;CACnB,MAAM,eAAe,KAAK;CAC1B,MAAM,QAAQ,KAAK;CACnB,QAAQ,KAAK,QAAQ,CAAC,EAAA,CAAG,KAAK,MAAM;EAClC,MAAM,QAAQ,OAAO,CAAC;EACtB,MAAM,OAAO,SAAS;EACtB,MAAM,OAAO,QAAQ;EACrB,MAAM,cAAc,eAAe;EACnC,MAAM,OAAO,QAAQ;EACrB,OAAO;GACL;GACA,OACE,OAAO,SAAS,YAAY,QAAQ,SAAS,QACzC,GAAG,KAAK,IAAI,MAAM,KAClB;GACN,GAAI,OAAO,SAAS,YAAY,OAAO,EAAE,KAAK,IAAI,CAAC;GACnD,GAAI,OAAO,gBAAgB,YAAY,cACnC,EAAE,YAAY,IACd,CAAC;GACL,GAAIA,8BAAAA,YAAY,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;EACtC;CACF,CAAC;AACH;AAKA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,IAAI,MAAM,cAAc,MAAM,WAAW,MAAM,UAAU,MAAM,aAC7D,OAAO;CACT,MAAM,QAAQ,KAAK;CACnB,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO;AAErD;AAEA,SAAS,aAAa,MAAoD;CACxE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,kBACX,MAAM,eACN,MAAM,WACN,MAAM,aACN,MAAM,SACJ,IACA,KAAA;AACN;AAIA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,YAAY,MAAM,UAAU,IAAI,KAAA;AAC/C;AAEA,SAAgB,aAAa,MAA8C;CACzE,MAAM,cACJ,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,KAAK,IAAI;CACnE,MAAM,OAAO,KAAK;CAClB,MAAM,WACJC,oBAAAA,cAAc,IAAI,KAAK,OAAO,KAAK,SAAS,WACxC,KAAK,KAAK,KAAK,IACf;CAEN,IAAI,eAAe,YAAY,aAAa,aAC1C,OAAO,GAAG,YAAY,GAAG;CAE3B,OAAO,eAAe,YAAY,KAAA;AACpC;AAIA,SAAS,cAAc,UAAmB,MAA0B;CAClE,IAAI,OAAO,aAAa,YAAY,UAGlC,QAAA,GAAOC,MAAAA,cAAAA,CAAcC,aAAAA,WAAW;EAC9B,MAAM;EACN,WAAW;CACb,CAAC;CAEH,IAAI,OAAO,SAAS,YAAY,MAC9B,QAAA,GAAOD,MAAAA,cAAAA,CACL,QACA,EAAE,WAAW,gCAAgC,GAC7C,IACF;AAGJ;AAGA,SAAgB,WACd,MACgC;CAChC,MAAM,WAAW,CAAC,GAAI,KAAK,SAAS,CAAC,GAAI,GAAI,KAAK,SAAS,CAAC,CAAE;CAC9D,MAAM,eAAe,SAAS,OAAO,WAAW,OAAO,MAAM,UAAU,OAAO,OAAO,UAAU,QAAQ;CACvG,MAAM,UAAU,SAAS,QAAQ,WAAW,OAAO,MAAM,UAAW,gBAAgB,OAAO,OAAO,UAAU,QAAS;CACrH,MAAM,QAAQ,QAAQ;CACtB,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,OAAO;EACL,GAAG;EACH,MAAM,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAS,WAAW,OAAO,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;EAC7E,iBAAiB,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,KAAK,WAAW,OAAO,gBAAgB,CAAC;EACtF,gBAAgB,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,KAAK,WAAW,OAAO,eAAe,CAAC;EACpF,uBAAuB,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,KAAK,WAAW,OAAO,sBAAsB,CAAC;CACpG;AACF;AAIA,SAAS,iBACP,MAC8B;CAC9B,MAAM,MAAe,KAAK;CAC1B,IAAI,CAACD,oBAAAA,cAAc,GAAG,GAAG,OAAO,KAAA;CAChC,IAAI,OAAO,IAAI,QAAQ,YAAY,OAAO,IAAI,WAAW,UACvD,OAAO,KAAA;CACT,OAAO;AACT;AAeA,SAAgB,eAAe,MAAwC;CACrE,MAAM,EAAE,KAAK,MAAM,UAAU,OAAO,aAAa;CACjD,MAAM,YAAY,KAAK;CACvB,MAAM,UAAU,KAAK;CACrB,MAAM,iBACJ,YAAY,YAAY,YAAY,WAAW,YAAY,UACvD,UACA,KAAA;CAGN,MAAM,gBAAgB,KAAK;CAC3B,MAAM,SACJ,mBACC,kBAAkB,QACf,UACA,kBAAkB,SAChB,WACA,KAAA;CACR,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,UACJ,KAAK,kBAAkB,SAClB,SACD,OAAO,KAAK,kBAAkB,YAC5B,OAAO,SAAS,KAAK,aAAa,IAClC,KAAK,gBACL,KAAA;CACR,MAAM,aAAa,cAAc,IAAI;CACrC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,YAAY,IAAI;CACjC,MAAM,OAAqB;EACzB;EACA,MAAM;EAGN,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;EACrD;EACA,QAAQ;EACR;EACA;EACA,GAAI,KAAK,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACnD,GAAI,KAAK,cAAc,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;EACrD,GAAI,KAAK,kBAAkB,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACxD,GAAI,OAAO,KAAK,gBAAgB,WAC5B,EAAE,aAAa,KAAK,YAAY,IAChC,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,WAAW,EAAE,aAAa,SAAS,IAAI,CAAC;EAC5C,GAAI,aAAa,QAAQ,cAAc,KACnC,EAAa,UAAuC,IACpD,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;CACvC;CAKA,MAAM,SAAS,iBAAiB,IAAI;CACpC,IAAI,QACF,OAAO;EACL,GAAG;EACH,MAAM;EACN;EACA,SAAS,CAAC;EACV,kBAAkB,OAAO,UAAU;CACrC;CAEF,IAAI,KAAK,WAAW,QAAQ,OAAO;EAAE,GAAG;EAAM,MAAM;CAAO;CAC3D,IAAIG,qCAAAA,cAAc,IAAI,CAAC,CAAC,SAAS,GAAG,OAAO;EAAE,GAAG;EAAM,MAAM;CAAQ;CACpE,IAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;EACpD,MAAM,UAAU,YAAY,IAAI;EAChC,OAAO;GACL,GAAG;GACH,MAAM;GACN,SAAS,YAAY,IAAI;GACzB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC/B;CACF;CAIA,MAAM,SAAS,WAAW,IAAI;CAC9B,IAAI,QACF,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,SAAS,YAAY,MAAM;CAAE;CAE/D,MAAM,iBAAiB,KAAK,OAAO,MAAM,SAAS,KAAK,SAAS,YAAY,OAAO,KAAK,YAAY,QAAQ;CAC5G,IAAI,KAAK,OAAO,WAAW,KAAK,gBAAgB;EAC9C,MAAM,eAAe,KAAK,MAAM,MAAM,SAAS,SAAS,cAAc;EACtE,IAAI,iBAAiB,aAAa,SAAS,YAAY,aAAa,SAAS,aAAa,aAAa,SAAS,aAAa,aAAa,WAAW,UAAU,aAAa,WAAW,cAAc;GACnM,MAAM,eAAe;IAAE,GAAG;IAAM,GAAG;GAAa;GAChD,OAAO,aAAa;GACpB,OAAO,eAAe;IAAE,GAAG;IAAM,MAAM;GAAa,CAAC;EACvD;CACF;CAEA,IAAI,KAAK,WAAW,UAAU,KAAK,WAAW,aAC5C,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,YAAY,KAAK;CAAO;CAG1D,IAAI,KAAK,WAAW,cAAc,cAAc,MAAM,QAAQ,GAC5D,OAAO;EAAE,GAAG;EAAM,MAAM;CAAW;CAKrC,IAAI,KAAK,WAAW,QAAQ,cAAc,MAAM,QAAQ,GAAG;EACzD,MAAM,kBAAkB,KAAK;EAC7B,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAIH,oBAAAA,cAAc,eAAe,IAAI,EAAE,gBAAgB,IAAI,CAAC;EAC9D;CACF;CACA,IAAI,cAAc,MAAM,SAAS,GAC/B,OAAO;EAAE,GAAG;EAAM,MAAM;CAAU;CAEpC,IAAI,cAAc,MAAM,SAAS,KAAK,cAAc,MAAM,QAAQ,GAChE,OAAO;EACL,GAAG;EACH,MAAM;EACN,cAAc;EAEd,GAAI,KAAK,WAAW,YAAY,EAAE,MAAM,IAAI,IAAI,CAAC;EACjD,GAAI,OAAO,KAAK,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CACtE;CAEF,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,MAAM,UAAU,aAAa,IAAI;EACjC,MAAM,aAAa,KAAK;EACxB,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,UAAU,EAAE,cAAc,QAAQ,IAAI,CAAC;GAC3C,GAAI,YAAY,cAAc,EAAE,UAAUI,sCAAAA,gBAAgB,MAAM,UAAU,EAAE,IAAI,CAAC;GAIjF,GAAI,YAAY,eAAe,CAAC,WAAW,EAAE,aAAa,QAAiB,IAAI,CAAC;GAIhF,GAAI,cAAc,MAAM,QAAQ,WAAW,IAAI,IAC3C,EAAE,SAAS,YAAY,UAAU,EAAE,IACnC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAIA,IAAI,gBAAgB,IAAI,GAAG;EACzB,MAAM,OACJ,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,OACzB,KAAK,uBACN,KAAA;EACN,MAAM,WAAW,iBAAiB,IAAI;EAKtC,MAAM,iBACJ,cAAc,WAAW,OAAO,KAAK,yBAAyB;EAChE,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;GACpC,GAAI,WAAW,EAAE,qBAAqB,SAAS,IAAI,CAAC;GACpD,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;GAC9D;GACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAGA,IAAI,sBAAsB,IAAI,GAAG;EAC/B,MAAM,cAAcJ,oBAAAA,cAAc,KAAK,IAAI,QAAQ,CAAC;EACpD,MAAM,eAAeK,sCAAAA,oBACnB,MACA,WACF;EACA,IAAI,OAAO,KAAK,aAAa,UAAU,CAAC,CAAC,SAAS,KAAK,KAAK,YAC1D,OAAO;GACL,GAAG;GACH,MAAM;GACN,kBAAkB,aAAa;GAC/B,GAAI,aAAa,SAAS,SAAS,IAC/B,EAAE,gBAAgB,aAAa,SAAS,IACxC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CAEJ;CAGA,IAAI,sBAAsB,IAAI,GAC5B,OAAO;EACL,GAAG;EACH,MAAM;EACN,gBAAgB,KAAK,yBAAyB;EAC9C,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B;CAEF,OAAO;AACT;AAKA,SAAS,cAAc,MAAqD;CAC1E,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,KAAK,WAAW,GAAG,OAAO,KAAA;CACnE,OAAO,YAAY,EAAE;AACvB;AAOA,SAAgB,gBACd,OAC4B;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,IACE,MAAM,SAAS,KAAA,KACf,MAAM,UAAU,KAAA,KAChB,MAAM,eAAe,KAAA,KACrB,MAAM,UAAU,KAAA,KAChB,MAAM,yBAAyB,KAAA,KAC/B,MAAM,UAAU,KAAA,KAChB,MAAM,UAAU,KAAA,KAAa,MAAM,UAAU,KAAA,GAE7C;CAEF,IAAI,MAAM,SAAS,KAAA,KAAa,cAAc,OAAO,QAAQ,GAAG,OAAO;CACvE,IAAI,cAAc,OAAO,SAAS,GAAG,OAAO;CAC5C,IAAI,cAAc,OAAO,QAAQ,GAAG,OAAO;AAE7C"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-resolve.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,YAAY,EAIZ,kBAAkB,EAElB,cAAc,EACf,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,eAAe,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAWjE;AAoBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAqBvE;AA0DD,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAazE;AA2BD,wBAAgB,UAAU,CACxB,IAAI,EAAE,kBAAkB,GACvB,kBAAkB,GAAG,SAAS,CAKhC;AAcD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,CAkOrE;AAgBD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,cAAc,GAAG,SAAS,CAgB5B"}
1
+ {"version":3,"file":"json-schema-form-resolve.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-resolve.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAGV,YAAY,EAIZ,kBAAkB,EAElB,cAAc,EACf,MAAM,0BAA0B,CAAC;AAYlC,wBAAgB,eAAe,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAWjE;AAoBD,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAqBvE;AA0DD,wBAAgB,YAAY,CAAC,IAAI,EAAE,kBAAkB,GAAG,MAAM,GAAG,SAAS,CAazE;AAwBD,wBAAgB,UAAU,CACxB,IAAI,EAAE,kBAAkB,GACvB,kBAAkB,GAAG,SAAS,CAahC;AAcD,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAOD,wBAAgB,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,YAAY,CAoOrE;AAgBD,wBAAgB,eAAe,CAC7B,KAAK,EAAE,kBAAkB,GAAG,SAAS,GACpC,cAAc,GAAG,SAAS,CAiB5B"}
@@ -3,6 +3,7 @@ import { LabelIcon } from "../data/Icon.js";
3
3
  import { effectiveProperties } from "./json-schema-form-conditionals.js";
4
4
  import { isFieldTone } from "./json-schema-form-tone.js";
5
5
  import { resolveItemSpec } from "./json-schema-form-item-summary.js";
6
+ import { unionBranches } from "./json-schema-form-union-model.js";
6
7
  import { createElement } from "react";
7
8
  // src/components/json-schema-form-resolve.ts
8
9
  function isOpenStringMap(prop) {
@@ -77,7 +78,18 @@ function adornmentNode(iconName, text) {
77
78
  if (typeof text === "string" && text) return createElement("span", { className: "text-sm text-muted-foreground" }, text);
78
79
  }
79
80
  function enumBranch(prop) {
80
- for (const branch of [...prop.anyOf ?? [], ...prop.oneOf ?? []]) if (Array.isArray(branch.enum) && branch.enum.length > 0) return branch;
81
+ const branches = [...prop.anyOf ?? [], ...prop.oneOf ?? []];
82
+ const literalsOnly = branches.every((branch) => branch.enum?.length || typeof branch.const === "string");
83
+ const choices = branches.filter((branch) => branch.enum?.length || literalsOnly && typeof branch.const === "string");
84
+ const first = choices[0];
85
+ if (!first) return void 0;
86
+ return {
87
+ ...first,
88
+ enum: [...new Set(choices.flatMap((branch) => branch.enum ?? [branch.const]))],
89
+ "x-enum-labels": Object.assign({}, ...choices.map((branch) => branch["x-enum-labels"])),
90
+ "x-enum-icons": Object.assign({}, ...choices.map((branch) => branch["x-enum-icons"])),
91
+ "x-enum-descriptions": Object.assign({}, ...choices.map((branch) => branch["x-enum-descriptions"]))
92
+ };
81
93
  }
82
94
  function lookupDescriptor(prop) {
83
95
  const raw = prop["x-clicky-lookup"];
@@ -130,6 +142,14 @@ function resolveControl(args) {
130
142
  options: [],
131
143
  allowCustomValue: lookup.multi !== true
132
144
  };
145
+ if (prop.format === "json") return {
146
+ ...base,
147
+ kind: "json"
148
+ };
149
+ if (unionBranches(prop).length > 1) return {
150
+ ...base,
151
+ kind: "union"
152
+ };
133
153
  if (Array.isArray(prop.enum) && prop.enum.length > 0) {
134
154
  const display = enumDisplay(prop);
135
155
  return {
@@ -246,7 +266,7 @@ function keyOptionsFor(prop) {
246
266
  }
247
267
  function scalarItemsType(items) {
248
268
  if (!items) return "string";
249
- if (items.enum !== void 0 || items.const !== void 0 || items.properties !== void 0 || items.items !== void 0 || items.additionalProperties !== void 0 || items.allOf !== void 0) return;
269
+ if (items.enum !== void 0 || items.const !== void 0 || items.properties !== void 0 || items.items !== void 0 || items.additionalProperties !== void 0 || items.allOf !== void 0 || items.oneOf !== void 0 || items.anyOf !== void 0) return;
250
270
  if (items.type === void 0 || schemaHasType(items, "string")) return "string";
251
271
  if (schemaHasType(items, "integer")) return "integer";
252
272
  if (schemaHasType(items, "number")) return "number";
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-resolve.js","names":[],"sources":["../../src/components/json-schema-form-resolve.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type {\n ArrayDisplay,\n EnumDisplay,\n FieldControl,\n FieldOption,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n LookupDescriptor,\n ScalarItemType,\n} from \"./json-schema-form-types\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { resolveItemSpec } from \"./json-schema-form-item-summary\";\nimport { isFieldTone } from \"./json-schema-form-tone\";\n\n// isOpenStringMap reports whether a property is an object whose entries are\n// described by a sub-schema in `additionalProperties` (a typed key/value map) or\n// by `patternProperties` (a per-key-pattern value map). Either makes it an\n// editable key/value control rather than a fixed-property sub-form.\nexport function isOpenStringMap(prop: JsonSchemaProperty): boolean {\n if (!schemaRendersAsObject(prop)) return false;\n if (\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ) {\n return true;\n }\n return (\n !!prop.patternProperties && Object.keys(prop.patternProperties).length > 0\n );\n}\n\n// patternSchemasOf compiles a schema's `patternProperties` into the ordered\n// {pattern, schema} list the string-map control matches keys against.\nfunction patternSchemasOf(\n prop: JsonSchemaProperty,\n): { pattern: string; schema: JsonSchemaProperty }[] | undefined {\n const pp = prop.patternProperties;\n if (!pp || Object.keys(pp).length === 0) return undefined;\n return Object.entries(pp).map(([pattern, schema]) => ({ pattern, schema }));\n}\n\nfunction schemaHasType(prop: JsonSchemaProperty, type: string): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(type as never);\n return prop.type === type;\n}\n\n// schemaRendersAsObject accepts schemas that omit `type` but use object-only\n// keywords, including composed schemas whose local refs were rehydrated into\n// unconditional allOf members. An explicit incompatible type always wins.\nexport function schemaRendersAsObject(prop: JsonSchemaProperty): boolean {\n if (schemaHasType(prop, \"object\")) return true;\n if (prop.type !== undefined) return false;\n if (\n prop.properties !== undefined ||\n prop.required !== undefined ||\n prop.additionalProperties !== undefined ||\n prop.patternProperties !== undefined ||\n prop.propertyNames !== undefined ||\n prop.unevaluatedProperties !== undefined\n ) {\n return true;\n }\n return (\n prop.allOf?.some(\n (clause) =>\n clause.if === undefined &&\n clause.then === undefined &&\n schemaRendersAsObject(clause as JsonSchemaProperty),\n ) ?? false\n );\n}\n\nfunction enumOptions(prop: JsonSchemaProperty): FieldOption[] {\n const labels = prop[\"x-enum-labels\"];\n const icons = prop[\"x-enum-icons\"];\n const descriptions = prop[\"x-enum-descriptions\"];\n const tones = prop[\"x-enum-tones\"];\n return (prop.enum ?? []).map((v) => {\n const value = String(v);\n const desc = labels?.[value];\n const icon = icons?.[value];\n const description = descriptions?.[value];\n const tone = tones?.[value];\n return {\n value,\n label:\n typeof desc === \"string\" && desc && desc !== value\n ? `${desc} (${value})`\n : value,\n ...(typeof icon === \"string\" && icon ? { icon } : {}),\n ...(typeof description === \"string\" && description\n ? { description }\n : {}),\n ...(isFieldTone(tone) ? { tone } : {}),\n };\n });\n}\n\n// enumDisplay resolves how an enum should render: an explicit `x-enum-display`\n// wins; otherwise an enum carrying `x-enum-icons` defaults to the icon grid.\n// Returns undefined to keep the combobox default.\nfunction enumDisplay(prop: JsonSchemaProperty): EnumDisplay | undefined {\n const d = prop[\"x-enum-display\"];\n if (d === \"combobox\" || d === \"radio\" || d === \"grid\" || d === \"segmented\")\n return d;\n const icons = prop[\"x-enum-icons\"];\n if (icons && Object.keys(icons).length > 0) return \"grid\";\n return undefined;\n}\n\nfunction arrayDisplay(prop: JsonSchemaProperty): ArrayDisplay | undefined {\n const d = prop[\"x-array-display\"];\n return d === \"filter-pills\" ||\n d === \"accordion\" ||\n d === \"cards\" ||\n d === \"stacked\" ||\n d === \"list\"\n ? d\n : undefined;\n}\n\n// helpDisplay reads the per-field `x-help-display` override. Returns undefined\n// to defer to the form-level FormLayout.help.\nfunction helpDisplay(prop: JsonSchemaProperty): HelpDisplay | undefined {\n const d = prop[\"x-help-display\"];\n return d === \"inline\" || d === \"hover\" ? d : undefined;\n}\n\nexport function schemaHelper(prop: JsonSchemaProperty): string | undefined {\n const description =\n typeof prop.description === \"string\" ? prop.description.trim() : \"\";\n const help = prop[\"x-help\"];\n const helpBody =\n isPlainObject(help) && typeof help.body === \"string\"\n ? help.body.trim()\n : \"\";\n\n if (description && helpBody && helpBody !== description) {\n return `${description} ${helpBody}`;\n }\n return description || helpBody || undefined;\n}\n\n// adornmentNode builds a prefix/suffix node from the x-input-*[-icon] extensions:\n// a runtime icon name wins, else static text. Returns undefined when neither set.\nfunction adornmentNode(iconName: unknown, text: unknown): ReactNode {\n if (typeof iconName === \"string\" && iconName) {\n // Match the library's InputField field-icon convention (16px, muted/70) so a\n // schema-driven field lines up with a hand-built one.\n return createElement(LabelIcon, {\n icon: iconName,\n className: \"size-4 text-muted-foreground/70\",\n });\n }\n if (typeof text === \"string\" && text) {\n return createElement(\n \"span\",\n { className: \"text-sm text-muted-foreground\" },\n text,\n );\n }\n return undefined;\n}\n\n// enumBranch returns the first anyOf/oneOf member carrying a non-empty `enum`,\n// for a union of \"an enum value OR a free-form string\" (e.g. a value-or-token\n// field). It lets such a union render as a dropdown. Returns undefined when no\n// branch enumerates values.\nexport function enumBranch(\n prop: JsonSchemaProperty,\n): JsonSchemaProperty | undefined {\n for (const branch of [...(prop.anyOf ?? []), ...(prop.oneOf ?? [])]) {\n if (Array.isArray(branch.enum) && branch.enum.length > 0) return branch;\n }\n return undefined;\n}\n\n// lookupDescriptor reads the `x-clicky-lookup` extension into a LookupDescriptor,\n// returning undefined when the keyword is absent or lacks its required url/filter.\nfunction lookupDescriptor(\n prop: JsonSchemaProperty,\n): LookupDescriptor | undefined {\n const raw: unknown = prop[\"x-clicky-lookup\"];\n if (!isPlainObject(raw)) return undefined;\n if (typeof raw.url !== \"string\" || typeof raw.filter !== \"string\")\n return undefined;\n return raw as unknown as LookupDescriptor;\n}\n\nexport interface ResolveControlArgs {\n key: string;\n prop: JsonSchemaProperty;\n required: boolean;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\n// resolveControl infers a base, render-ready FieldControl from a property\n// schema. It keys off schema keywords only — never the field name: ascode/token\n// heuristics are layered on by consumer pre-extensions. The one exception is the\n// standard `format: date`/`date-time` keyword, which is a schema-declared signal\n// (not a name guess) and so drives a date control directly. First match wins.\nexport function resolveControl(args: ResolveControlArgs): FieldControl {\n const { key, prop, required, value, onChange } = args;\n const labelIcon = prop[\"x-icon\"];\n const xLayout = prop[\"x-layout\"];\n const explicitLayout =\n xLayout === \"inline\" || xLayout === \"stack\" || xLayout === \"table\"\n ? xLayout\n : undefined;\n // `x-label-position` is a friendlier alias over the same per-field layout knob:\n // \"top\" stacks the label above the value; \"left\" forces inline. `x-layout` wins.\n const labelPosition = prop[\"x-label-position\"];\n const layout =\n explicitLayout ??\n (labelPosition === \"top\"\n ? \"stack\"\n : labelPosition === \"left\"\n ? \"inline\"\n : undefined);\n const prefix = adornmentNode(\n prop[\"x-input-prefix-icon\"],\n prop[\"x-input-prefix\"],\n );\n const suffix = adornmentNode(\n prop[\"x-input-suffix-icon\"],\n prop[\"x-input-suffix\"],\n );\n const labelClassName =\n typeof prop[\"x-label-classes\"] === \"string\"\n ? prop[\"x-label-classes\"]\n : undefined;\n const inputClassName =\n typeof prop[\"x-input-classes\"] === \"string\"\n ? prop[\"x-input-classes\"]\n : undefined;\n const colSpan =\n prop[\"x-col-span\"] === \"full\"\n ? (\"full\" as const)\n : typeof prop[\"x-col-span\"] === \"number\" &&\n Number.isFinite(prop[\"x-col-span\"])\n ? prop[\"x-col-span\"]\n : undefined;\n const keyOptions = keyOptionsFor(prop);\n const helper = schemaHelper(prop);\n const helpMode = helpDisplay(prop);\n const base: FieldControl = {\n key,\n kind: \"string\",\n // An explicit empty title is a field saying it needs no label of its own —\n // its host already named it. Only a MISSING title falls back to the key.\n label: typeof prop.title === \"string\" ? prop.title : key,\n required,\n schema: prop,\n value,\n onChange,\n ...(prop.readOnly === true ? { readOnly: true } : {}),\n ...(prop.writeOnly === true ? { writeOnly: true } : {}),\n ...(prop[\"x-disabled\"] === true ? { disabled: true } : {}),\n ...(typeof prop.description === \"string\"\n ? { description: prop.description }\n : {}),\n ...(helper ? { helper } : {}),\n ...(helpMode ? { helpDisplay: helpMode } : {}),\n ...(labelIcon != null && labelIcon !== \"\"\n ? { labelIcon: labelIcon as FieldControl[\"labelIcon\"] }\n : {}),\n ...(layout ? { layout } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(labelClassName ? { labelClassName } : {}),\n ...(inputClassName ? { inputClassName } : {}),\n ...(colSpan != null ? { colSpan } : {}),\n };\n\n // An `x-clicky-lookup` field is an async entity-reference picker: options load\n // lazily from another entity's list endpoint. Single-select also allows\n // free-form entry so a typed value outside the option set still commits.\n const lookup = lookupDescriptor(prop);\n if (lookup) {\n return {\n ...base,\n kind: \"lookup\",\n lookup,\n options: [],\n allowCustomValue: lookup.multi !== true,\n };\n }\n if (Array.isArray(prop.enum) && prop.enum.length > 0) {\n const display = enumDisplay(prop);\n return {\n ...base,\n kind: \"enum\",\n options: enumOptions(prop),\n ...(display ? { display } : {}),\n };\n }\n // A value-or-template union: the enum lives in an anyOf/oneOf branch alongside\n // free-form branches. Render it as a dropdown using that branch's enum; the\n // free-form branches are honoured via a consumer's allowCustomValue pre-ext.\n const branch = enumBranch(prop);\n if (branch) {\n return { ...base, kind: \"enum\", options: enumOptions(branch) };\n }\n const templateBranch = prop.anyOf?.find((part) => part.type === \"string\" && typeof part.pattern === \"string\");\n if (prop.anyOf?.length === 2 && templateBranch) {\n const nativeBranch = prop.anyOf.find((part) => part !== templateBranch);\n if (nativeBranch && (nativeBranch.type === \"number\" || nativeBranch.type === \"integer\" || nativeBranch.type === \"boolean\" || nativeBranch.format === \"date\" || nativeBranch.format === \"date-time\")) {\n const nativeSchema = { ...prop, ...nativeBranch };\n delete nativeSchema.anyOf;\n return resolveControl({ ...args, prop: nativeSchema });\n }\n }\n // A schema-declared date/date-time string renders as a date control.\n if (prop.format === \"date\" || prop.format === \"date-time\") {\n return { ...base, kind: \"date\", dateFormat: prop.format };\n }\n // A long-form string declares `format: textarea` to render a multi-line box.\n if (prop.format === \"textarea\" && schemaHasType(prop, \"string\")) {\n return { ...base, kind: \"textarea\" };\n }\n // A markdown string declares `format: md` to render the MDXEditor-backed\n // editor. Plugin toggles live under `x-md-editor` so schema authors can keep\n // the format signal standard-sized and the editor behavior explicit.\n if (prop.format === \"md\" && schemaHasType(prop, \"string\")) {\n const markdownOptions = prop[\"x-md-editor\"];\n return {\n ...base,\n kind: \"markdown\",\n ...(isPlainObject(markdownOptions) ? { markdownOptions } : {}),\n };\n }\n if (schemaHasType(prop, \"boolean\")) {\n return { ...base, kind: \"boolean\" };\n }\n if (schemaHasType(prop, \"integer\") || schemaHasType(prop, \"number\")) {\n return {\n ...base,\n kind: \"number\",\n coerceNumber: true,\n // A percent number carries a static \"%\" unit shown inside the input.\n ...(prop.format === \"percent\" ? { unit: \"%\" } : {}),\n ...(typeof prop.minimum === \"number\" ? { minimum: prop.minimum } : {}),\n };\n }\n if (schemaHasType(prop, \"array\")) {\n const display = arrayDisplay(prop);\n const itemSchema = prop.items;\n return {\n ...base,\n kind: \"array\",\n ...(itemSchema ? { itemSchema } : {}),\n ...(typeof prop.minItems === \"number\" ? { minItems: prop.minItems } : {}),\n ...(typeof prop.maxItems === \"number\" ? { maxItems: prop.maxItems } : {}),\n ...(display ? { arrayDisplay: display } : {}),\n ...(display === \"accordion\" ? { itemSpec: resolveItemSpec(prop, itemSchema) } : {}),\n // An accordion reuses the array's description as the zero-item copy in its\n // add row, so a paragraph of the same sentence directly above would be a\n // literal duplicate. The schema can still say otherwise.\n ...(display === \"accordion\" && !helpMode ? { helpDisplay: \"hover\" as const } : {}),\n // An enum item schema makes the whole array a list of choices, whichever\n // display renders it (tags by default, filter pills on request), so the\n // options — labels, icons, tones and all — always resolve.\n ...(itemSchema && Array.isArray(itemSchema.enum)\n ? { options: enumOptions(itemSchema) }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // An open map: object whose entries are described by an additionalProperties\n // sub-schema and/or per-key patternProperties. Renders as editable key/value\n // rows (+ any known properties), with the value form resolved per key.\n if (isOpenStringMap(prop)) {\n const addl =\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ? (prop.additionalProperties as JsonSchemaProperty)\n : undefined;\n const patterns = patternSchemasOf(prop);\n // A constrained picker (propertyNames enum) or patternProperties still lets\n // the author ADD keys — the additions are limited to the allowed set, not\n // free-form — so `additionalProperties: false` doesn't disable \"Add field\"\n // in that case. It only closes a plain open map with no key constraints.\n const allowExtraKeys =\n keyOptions || patterns ? true : prop.additionalProperties !== false;\n return {\n ...base,\n kind: \"string-map\",\n ...(addl ? { valueSchema: addl } : {}),\n ...(patterns ? { valuePatternSchemas: patterns } : {}),\n ...(prop.properties ? { knownProperties: prop.properties } : {}),\n allowExtraKeys,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // A structured object: fixed `properties`, not an open map. Renders as a\n // nested sub-form (labels, required, if/then) — recursed into by the renderer.\n if (schemaRendersAsObject(prop)) {\n const valueObject = isPlainObject(value) ? value : {};\n const objectFields = effectiveProperties(\n prop as JsonSchemaObject,\n valueObject,\n );\n if (Object.keys(objectFields.properties).length > 0 || prop.properties) {\n return {\n ...base,\n kind: \"object\",\n objectProperties: objectFields.properties,\n ...(objectFields.required.length > 0\n ? { objectRequired: objectFields.required }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n }\n // A bare object with neither properties nor an additionalProperties schema:\n // treat as an open string map unless explicitly closed.\n if (schemaRendersAsObject(prop)) {\n return {\n ...base,\n kind: \"string-map\",\n allowExtraKeys: prop.additionalProperties !== false,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n return base;\n}\n\n// keyOptionsFor resolves the strict map-key picker options from a map schema's\n// `propertyNames.enum` (e.g. an AsCode-constrained key set). Returns undefined\n// when the keys are unconstrained, so the key stays free-text.\nfunction keyOptionsFor(prop: JsonSchemaProperty): FieldOption[] | undefined {\n const pn = prop.propertyNames as JsonSchemaProperty | undefined;\n if (!pn || !Array.isArray(pn.enum) || pn.enum.length === 0) return undefined;\n return enumOptions(pn);\n}\n\n// scalarItemsType returns the scalar type an array's items hold — the case the\n// array renders as ONE tag list rather than a control per item — or undefined\n// when the items need a real per-item control. Anything carrying an\n// enum/const/properties/items/additionalProperties/allOf has a richer shape (an\n// enum array is a list of choices, and takes the option-backed branch instead).\nexport function scalarItemsType(\n items: JsonSchemaProperty | undefined,\n): ScalarItemType | undefined {\n if (!items) return \"string\"; // untyped items default to string tags\n if (\n items.enum !== undefined ||\n items.const !== undefined ||\n items.properties !== undefined ||\n items.items !== undefined ||\n items.additionalProperties !== undefined ||\n items.allOf !== undefined\n ) {\n return undefined;\n }\n if (items.type === undefined || schemaHasType(items, \"string\")) return \"string\";\n if (schemaHasType(items, \"integer\")) return \"integer\";\n if (schemaHasType(items, \"number\")) return \"number\";\n return undefined;\n}\n"],"mappings":";;;;;;;AAsBA,SAAgB,gBAAgB,MAAmC;CACjE,IAAI,CAAC,sBAAsB,IAAI,GAAG,OAAO;CACzC,IACE,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,MAE9B,OAAO;CAET,OACE,CAAC,CAAC,KAAK,qBAAqB,OAAO,KAAK,KAAK,iBAAiB,CAAC,CAAC,SAAS;AAE7E;AAIA,SAAS,iBACP,MAC+D;CAC/D,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,OAAO,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG,OAAO,KAAA;CAChD,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,aAAa;EAAE;EAAS;CAAO,EAAE;AAC5E;AAEA,SAAS,cAAc,MAA0B,MAAuB;CACtE,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,SAAS,IAAa;CACrE,OAAO,KAAK,SAAS;AACvB;AAKA,SAAgB,sBAAsB,MAAmC;CACvE,IAAI,cAAc,MAAM,QAAQ,GAAG,OAAO;CAC1C,IAAI,KAAK,SAAS,KAAA,GAAW,OAAO;CACpC,IACE,KAAK,eAAe,KAAA,KACpB,KAAK,aAAa,KAAA,KAClB,KAAK,yBAAyB,KAAA,KAC9B,KAAK,sBAAsB,KAAA,KAC3B,KAAK,kBAAkB,KAAA,KACvB,KAAK,0BAA0B,KAAA,GAE/B,OAAO;CAET,OACE,KAAK,OAAO,MACT,WACC,OAAO,OAAO,KAAA,KACd,OAAO,SAAS,KAAA,KAChB,sBAAsB,MAA4B,CACtD,KAAK;AAET;AAEA,SAAS,YAAY,MAAyC;CAC5D,MAAM,SAAS,KAAK;CACpB,MAAM,QAAQ,KAAK;CACnB,MAAM,eAAe,KAAK;CAC1B,MAAM,QAAQ,KAAK;CACnB,QAAQ,KAAK,QAAQ,CAAC,EAAA,CAAG,KAAK,MAAM;EAClC,MAAM,QAAQ,OAAO,CAAC;EACtB,MAAM,OAAO,SAAS;EACtB,MAAM,OAAO,QAAQ;EACrB,MAAM,cAAc,eAAe;EACnC,MAAM,OAAO,QAAQ;EACrB,OAAO;GACL;GACA,OACE,OAAO,SAAS,YAAY,QAAQ,SAAS,QACzC,GAAG,KAAK,IAAI,MAAM,KAClB;GACN,GAAI,OAAO,SAAS,YAAY,OAAO,EAAE,KAAK,IAAI,CAAC;GACnD,GAAI,OAAO,gBAAgB,YAAY,cACnC,EAAE,YAAY,IACd,CAAC;GACL,GAAI,YAAY,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;EACtC;CACF,CAAC;AACH;AAKA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,IAAI,MAAM,cAAc,MAAM,WAAW,MAAM,UAAU,MAAM,aAC7D,OAAO;CACT,MAAM,QAAQ,KAAK;CACnB,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO;AAErD;AAEA,SAAS,aAAa,MAAoD;CACxE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,kBACX,MAAM,eACN,MAAM,WACN,MAAM,aACN,MAAM,SACJ,IACA,KAAA;AACN;AAIA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,YAAY,MAAM,UAAU,IAAI,KAAA;AAC/C;AAEA,SAAgB,aAAa,MAA8C;CACzE,MAAM,cACJ,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,KAAK,IAAI;CACnE,MAAM,OAAO,KAAK;CAClB,MAAM,WACJ,cAAc,IAAI,KAAK,OAAO,KAAK,SAAS,WACxC,KAAK,KAAK,KAAK,IACf;CAEN,IAAI,eAAe,YAAY,aAAa,aAC1C,OAAO,GAAG,YAAY,GAAG;CAE3B,OAAO,eAAe,YAAY,KAAA;AACpC;AAIA,SAAS,cAAc,UAAmB,MAA0B;CAClE,IAAI,OAAO,aAAa,YAAY,UAGlC,OAAO,cAAc,WAAW;EAC9B,MAAM;EACN,WAAW;CACb,CAAC;CAEH,IAAI,OAAO,SAAS,YAAY,MAC9B,OAAO,cACL,QACA,EAAE,WAAW,gCAAgC,GAC7C,IACF;AAGJ;AAMA,SAAgB,WACd,MACgC;CAChC,KAAK,MAAM,UAAU,CAAC,GAAI,KAAK,SAAS,CAAC,GAAI,GAAI,KAAK,SAAS,CAAC,CAAE,GAChE,IAAI,MAAM,QAAQ,OAAO,IAAI,KAAK,OAAO,KAAK,SAAS,GAAG,OAAO;AAGrE;AAIA,SAAS,iBACP,MAC8B;CAC9B,MAAM,MAAe,KAAK;CAC1B,IAAI,CAAC,cAAc,GAAG,GAAG,OAAO,KAAA;CAChC,IAAI,OAAO,IAAI,QAAQ,YAAY,OAAO,IAAI,WAAW,UACvD,OAAO,KAAA;CACT,OAAO;AACT;AAeA,SAAgB,eAAe,MAAwC;CACrE,MAAM,EAAE,KAAK,MAAM,UAAU,OAAO,aAAa;CACjD,MAAM,YAAY,KAAK;CACvB,MAAM,UAAU,KAAK;CACrB,MAAM,iBACJ,YAAY,YAAY,YAAY,WAAW,YAAY,UACvD,UACA,KAAA;CAGN,MAAM,gBAAgB,KAAK;CAC3B,MAAM,SACJ,mBACC,kBAAkB,QACf,UACA,kBAAkB,SAChB,WACA,KAAA;CACR,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,UACJ,KAAK,kBAAkB,SAClB,SACD,OAAO,KAAK,kBAAkB,YAC5B,OAAO,SAAS,KAAK,aAAa,IAClC,KAAK,gBACL,KAAA;CACR,MAAM,aAAa,cAAc,IAAI;CACrC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,YAAY,IAAI;CACjC,MAAM,OAAqB;EACzB;EACA,MAAM;EAGN,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;EACrD;EACA,QAAQ;EACR;EACA;EACA,GAAI,KAAK,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACnD,GAAI,KAAK,cAAc,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;EACrD,GAAI,KAAK,kBAAkB,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACxD,GAAI,OAAO,KAAK,gBAAgB,WAC5B,EAAE,aAAa,KAAK,YAAY,IAChC,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,WAAW,EAAE,aAAa,SAAS,IAAI,CAAC;EAC5C,GAAI,aAAa,QAAQ,cAAc,KACnC,EAAa,UAAuC,IACpD,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;CACvC;CAKA,MAAM,SAAS,iBAAiB,IAAI;CACpC,IAAI,QACF,OAAO;EACL,GAAG;EACH,MAAM;EACN;EACA,SAAS,CAAC;EACV,kBAAkB,OAAO,UAAU;CACrC;CAEF,IAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;EACpD,MAAM,UAAU,YAAY,IAAI;EAChC,OAAO;GACL,GAAG;GACH,MAAM;GACN,SAAS,YAAY,IAAI;GACzB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC/B;CACF;CAIA,MAAM,SAAS,WAAW,IAAI;CAC9B,IAAI,QACF,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,SAAS,YAAY,MAAM;CAAE;CAE/D,MAAM,iBAAiB,KAAK,OAAO,MAAM,SAAS,KAAK,SAAS,YAAY,OAAO,KAAK,YAAY,QAAQ;CAC5G,IAAI,KAAK,OAAO,WAAW,KAAK,gBAAgB;EAC9C,MAAM,eAAe,KAAK,MAAM,MAAM,SAAS,SAAS,cAAc;EACtE,IAAI,iBAAiB,aAAa,SAAS,YAAY,aAAa,SAAS,aAAa,aAAa,SAAS,aAAa,aAAa,WAAW,UAAU,aAAa,WAAW,cAAc;GACnM,MAAM,eAAe;IAAE,GAAG;IAAM,GAAG;GAAa;GAChD,OAAO,aAAa;GACpB,OAAO,eAAe;IAAE,GAAG;IAAM,MAAM;GAAa,CAAC;EACvD;CACF;CAEA,IAAI,KAAK,WAAW,UAAU,KAAK,WAAW,aAC5C,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,YAAY,KAAK;CAAO;CAG1D,IAAI,KAAK,WAAW,cAAc,cAAc,MAAM,QAAQ,GAC5D,OAAO;EAAE,GAAG;EAAM,MAAM;CAAW;CAKrC,IAAI,KAAK,WAAW,QAAQ,cAAc,MAAM,QAAQ,GAAG;EACzD,MAAM,kBAAkB,KAAK;EAC7B,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,cAAc,eAAe,IAAI,EAAE,gBAAgB,IAAI,CAAC;EAC9D;CACF;CACA,IAAI,cAAc,MAAM,SAAS,GAC/B,OAAO;EAAE,GAAG;EAAM,MAAM;CAAU;CAEpC,IAAI,cAAc,MAAM,SAAS,KAAK,cAAc,MAAM,QAAQ,GAChE,OAAO;EACL,GAAG;EACH,MAAM;EACN,cAAc;EAEd,GAAI,KAAK,WAAW,YAAY,EAAE,MAAM,IAAI,IAAI,CAAC;EACjD,GAAI,OAAO,KAAK,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CACtE;CAEF,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,MAAM,UAAU,aAAa,IAAI;EACjC,MAAM,aAAa,KAAK;EACxB,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,UAAU,EAAE,cAAc,QAAQ,IAAI,CAAC;GAC3C,GAAI,YAAY,cAAc,EAAE,UAAU,gBAAgB,MAAM,UAAU,EAAE,IAAI,CAAC;GAIjF,GAAI,YAAY,eAAe,CAAC,WAAW,EAAE,aAAa,QAAiB,IAAI,CAAC;GAIhF,GAAI,cAAc,MAAM,QAAQ,WAAW,IAAI,IAC3C,EAAE,SAAS,YAAY,UAAU,EAAE,IACnC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAIA,IAAI,gBAAgB,IAAI,GAAG;EACzB,MAAM,OACJ,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,OACzB,KAAK,uBACN,KAAA;EACN,MAAM,WAAW,iBAAiB,IAAI;EAKtC,MAAM,iBACJ,cAAc,WAAW,OAAO,KAAK,yBAAyB;EAChE,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;GACpC,GAAI,WAAW,EAAE,qBAAqB,SAAS,IAAI,CAAC;GACpD,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;GAC9D;GACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAGA,IAAI,sBAAsB,IAAI,GAAG;EAC/B,MAAM,cAAc,cAAc,KAAK,IAAI,QAAQ,CAAC;EACpD,MAAM,eAAe,oBACnB,MACA,WACF;EACA,IAAI,OAAO,KAAK,aAAa,UAAU,CAAC,CAAC,SAAS,KAAK,KAAK,YAC1D,OAAO;GACL,GAAG;GACH,MAAM;GACN,kBAAkB,aAAa;GAC/B,GAAI,aAAa,SAAS,SAAS,IAC/B,EAAE,gBAAgB,aAAa,SAAS,IACxC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CAEJ;CAGA,IAAI,sBAAsB,IAAI,GAC5B,OAAO;EACL,GAAG;EACH,MAAM;EACN,gBAAgB,KAAK,yBAAyB;EAC9C,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B;CAEF,OAAO;AACT;AAKA,SAAS,cAAc,MAAqD;CAC1E,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,KAAK,WAAW,GAAG,OAAO,KAAA;CACnE,OAAO,YAAY,EAAE;AACvB;AAOA,SAAgB,gBACd,OAC4B;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,IACE,MAAM,SAAS,KAAA,KACf,MAAM,UAAU,KAAA,KAChB,MAAM,eAAe,KAAA,KACrB,MAAM,UAAU,KAAA,KAChB,MAAM,yBAAyB,KAAA,KAC/B,MAAM,UAAU,KAAA,GAEhB;CAEF,IAAI,MAAM,SAAS,KAAA,KAAa,cAAc,OAAO,QAAQ,GAAG,OAAO;CACvE,IAAI,cAAc,OAAO,SAAS,GAAG,OAAO;CAC5C,IAAI,cAAc,OAAO,QAAQ,GAAG,OAAO;AAE7C"}
1
+ {"version":3,"file":"json-schema-form-resolve.js","names":[],"sources":["../../src/components/json-schema-form-resolve.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type {\n ArrayDisplay,\n EnumDisplay,\n FieldControl,\n FieldOption,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n LookupDescriptor,\n ScalarItemType,\n} from \"./json-schema-form-types\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { resolveItemSpec } from \"./json-schema-form-item-summary\";\nimport { isFieldTone } from \"./json-schema-form-tone\";\nimport { unionBranches } from \"./json-schema-form-union-model\";\n\n// isOpenStringMap reports whether a property is an object whose entries are\n// described by a sub-schema in `additionalProperties` (a typed key/value map) or\n// by `patternProperties` (a per-key-pattern value map). Either makes it an\n// editable key/value control rather than a fixed-property sub-form.\nexport function isOpenStringMap(prop: JsonSchemaProperty): boolean {\n if (!schemaRendersAsObject(prop)) return false;\n if (\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ) {\n return true;\n }\n return (\n !!prop.patternProperties && Object.keys(prop.patternProperties).length > 0\n );\n}\n\n// patternSchemasOf compiles a schema's `patternProperties` into the ordered\n// {pattern, schema} list the string-map control matches keys against.\nfunction patternSchemasOf(\n prop: JsonSchemaProperty,\n): { pattern: string; schema: JsonSchemaProperty }[] | undefined {\n const pp = prop.patternProperties;\n if (!pp || Object.keys(pp).length === 0) return undefined;\n return Object.entries(pp).map(([pattern, schema]) => ({ pattern, schema }));\n}\n\nfunction schemaHasType(prop: JsonSchemaProperty, type: string): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(type as never);\n return prop.type === type;\n}\n\n// schemaRendersAsObject accepts schemas that omit `type` but use object-only\n// keywords, including composed schemas whose local refs were rehydrated into\n// unconditional allOf members. An explicit incompatible type always wins.\nexport function schemaRendersAsObject(prop: JsonSchemaProperty): boolean {\n if (schemaHasType(prop, \"object\")) return true;\n if (prop.type !== undefined) return false;\n if (\n prop.properties !== undefined ||\n prop.required !== undefined ||\n prop.additionalProperties !== undefined ||\n prop.patternProperties !== undefined ||\n prop.propertyNames !== undefined ||\n prop.unevaluatedProperties !== undefined\n ) {\n return true;\n }\n return (\n prop.allOf?.some(\n (clause) =>\n clause.if === undefined &&\n clause.then === undefined &&\n schemaRendersAsObject(clause as JsonSchemaProperty),\n ) ?? false\n );\n}\n\nfunction enumOptions(prop: JsonSchemaProperty): FieldOption[] {\n const labels = prop[\"x-enum-labels\"];\n const icons = prop[\"x-enum-icons\"];\n const descriptions = prop[\"x-enum-descriptions\"];\n const tones = prop[\"x-enum-tones\"];\n return (prop.enum ?? []).map((v) => {\n const value = String(v);\n const desc = labels?.[value];\n const icon = icons?.[value];\n const description = descriptions?.[value];\n const tone = tones?.[value];\n return {\n value,\n label:\n typeof desc === \"string\" && desc && desc !== value\n ? `${desc} (${value})`\n : value,\n ...(typeof icon === \"string\" && icon ? { icon } : {}),\n ...(typeof description === \"string\" && description\n ? { description }\n : {}),\n ...(isFieldTone(tone) ? { tone } : {}),\n };\n });\n}\n\n// enumDisplay resolves how an enum should render: an explicit `x-enum-display`\n// wins; otherwise an enum carrying `x-enum-icons` defaults to the icon grid.\n// Returns undefined to keep the combobox default.\nfunction enumDisplay(prop: JsonSchemaProperty): EnumDisplay | undefined {\n const d = prop[\"x-enum-display\"];\n if (d === \"combobox\" || d === \"radio\" || d === \"grid\" || d === \"segmented\")\n return d;\n const icons = prop[\"x-enum-icons\"];\n if (icons && Object.keys(icons).length > 0) return \"grid\";\n return undefined;\n}\n\nfunction arrayDisplay(prop: JsonSchemaProperty): ArrayDisplay | undefined {\n const d = prop[\"x-array-display\"];\n return d === \"filter-pills\" ||\n d === \"accordion\" ||\n d === \"cards\" ||\n d === \"stacked\" ||\n d === \"list\"\n ? d\n : undefined;\n}\n\n// helpDisplay reads the per-field `x-help-display` override. Returns undefined\n// to defer to the form-level FormLayout.help.\nfunction helpDisplay(prop: JsonSchemaProperty): HelpDisplay | undefined {\n const d = prop[\"x-help-display\"];\n return d === \"inline\" || d === \"hover\" ? d : undefined;\n}\n\nexport function schemaHelper(prop: JsonSchemaProperty): string | undefined {\n const description =\n typeof prop.description === \"string\" ? prop.description.trim() : \"\";\n const help = prop[\"x-help\"];\n const helpBody =\n isPlainObject(help) && typeof help.body === \"string\"\n ? help.body.trim()\n : \"\";\n\n if (description && helpBody && helpBody !== description) {\n return `${description} ${helpBody}`;\n }\n return description || helpBody || undefined;\n}\n\n// adornmentNode builds a prefix/suffix node from the x-input-*[-icon] extensions:\n// a runtime icon name wins, else static text. Returns undefined when neither set.\nfunction adornmentNode(iconName: unknown, text: unknown): ReactNode {\n if (typeof iconName === \"string\" && iconName) {\n // Match the library's InputField field-icon convention (16px, muted/70) so a\n // schema-driven field lines up with a hand-built one.\n return createElement(LabelIcon, {\n icon: iconName,\n className: \"size-4 text-muted-foreground/70\",\n });\n }\n if (typeof text === \"string\" && text) {\n return createElement(\n \"span\",\n { className: \"text-sm text-muted-foreground\" },\n text,\n );\n }\n return undefined;\n}\n\n// Combine literal choices across scalar branches, including enum-or-template unions.\nexport function enumBranch(\n prop: JsonSchemaProperty,\n): JsonSchemaProperty | undefined {\n const branches = [...(prop.anyOf ?? []), ...(prop.oneOf ?? [])];\n const literalsOnly = branches.every((branch) => branch.enum?.length || typeof branch.const === \"string\");\n const choices = branches.filter((branch) => branch.enum?.length || (literalsOnly && typeof branch.const === \"string\"));\n const first = choices[0];\n if (!first) return undefined;\n return {\n ...first,\n enum: [...new Set(choices.flatMap((branch) => branch.enum ?? [branch.const]))],\n \"x-enum-labels\": Object.assign({}, ...choices.map((branch) => branch[\"x-enum-labels\"])),\n \"x-enum-icons\": Object.assign({}, ...choices.map((branch) => branch[\"x-enum-icons\"])),\n \"x-enum-descriptions\": Object.assign({}, ...choices.map((branch) => branch[\"x-enum-descriptions\"])),\n };\n}\n\n// lookupDescriptor reads the `x-clicky-lookup` extension into a LookupDescriptor,\n// returning undefined when the keyword is absent or lacks its required url/filter.\nfunction lookupDescriptor(\n prop: JsonSchemaProperty,\n): LookupDescriptor | undefined {\n const raw: unknown = prop[\"x-clicky-lookup\"];\n if (!isPlainObject(raw)) return undefined;\n if (typeof raw.url !== \"string\" || typeof raw.filter !== \"string\")\n return undefined;\n return raw as unknown as LookupDescriptor;\n}\n\nexport interface ResolveControlArgs {\n key: string;\n prop: JsonSchemaProperty;\n required: boolean;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\n// resolveControl infers a base, render-ready FieldControl from a property\n// schema. It keys off schema keywords only — never the field name: ascode/token\n// heuristics are layered on by consumer pre-extensions. The one exception is the\n// standard `format: date`/`date-time` keyword, which is a schema-declared signal\n// (not a name guess) and so drives a date control directly. First match wins.\nexport function resolveControl(args: ResolveControlArgs): FieldControl {\n const { key, prop, required, value, onChange } = args;\n const labelIcon = prop[\"x-icon\"];\n const xLayout = prop[\"x-layout\"];\n const explicitLayout =\n xLayout === \"inline\" || xLayout === \"stack\" || xLayout === \"table\"\n ? xLayout\n : undefined;\n // `x-label-position` is a friendlier alias over the same per-field layout knob:\n // \"top\" stacks the label above the value; \"left\" forces inline. `x-layout` wins.\n const labelPosition = prop[\"x-label-position\"];\n const layout =\n explicitLayout ??\n (labelPosition === \"top\"\n ? \"stack\"\n : labelPosition === \"left\"\n ? \"inline\"\n : undefined);\n const prefix = adornmentNode(\n prop[\"x-input-prefix-icon\"],\n prop[\"x-input-prefix\"],\n );\n const suffix = adornmentNode(\n prop[\"x-input-suffix-icon\"],\n prop[\"x-input-suffix\"],\n );\n const labelClassName =\n typeof prop[\"x-label-classes\"] === \"string\"\n ? prop[\"x-label-classes\"]\n : undefined;\n const inputClassName =\n typeof prop[\"x-input-classes\"] === \"string\"\n ? prop[\"x-input-classes\"]\n : undefined;\n const colSpan =\n prop[\"x-col-span\"] === \"full\"\n ? (\"full\" as const)\n : typeof prop[\"x-col-span\"] === \"number\" &&\n Number.isFinite(prop[\"x-col-span\"])\n ? prop[\"x-col-span\"]\n : undefined;\n const keyOptions = keyOptionsFor(prop);\n const helper = schemaHelper(prop);\n const helpMode = helpDisplay(prop);\n const base: FieldControl = {\n key,\n kind: \"string\",\n // An explicit empty title is a field saying it needs no label of its own —\n // its host already named it. Only a MISSING title falls back to the key.\n label: typeof prop.title === \"string\" ? prop.title : key,\n required,\n schema: prop,\n value,\n onChange,\n ...(prop.readOnly === true ? { readOnly: true } : {}),\n ...(prop.writeOnly === true ? { writeOnly: true } : {}),\n ...(prop[\"x-disabled\"] === true ? { disabled: true } : {}),\n ...(typeof prop.description === \"string\"\n ? { description: prop.description }\n : {}),\n ...(helper ? { helper } : {}),\n ...(helpMode ? { helpDisplay: helpMode } : {}),\n ...(labelIcon != null && labelIcon !== \"\"\n ? { labelIcon: labelIcon as FieldControl[\"labelIcon\"] }\n : {}),\n ...(layout ? { layout } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(labelClassName ? { labelClassName } : {}),\n ...(inputClassName ? { inputClassName } : {}),\n ...(colSpan != null ? { colSpan } : {}),\n };\n\n // An `x-clicky-lookup` field is an async entity-reference picker: options load\n // lazily from another entity's list endpoint. Single-select also allows\n // free-form entry so a typed value outside the option set still commits.\n const lookup = lookupDescriptor(prop);\n if (lookup) {\n return {\n ...base,\n kind: \"lookup\",\n lookup,\n options: [],\n allowCustomValue: lookup.multi !== true,\n };\n }\n if (prop.format === \"json\") return { ...base, kind: \"json\" };\n if (unionBranches(prop).length > 1) return { ...base, kind: \"union\" };\n if (Array.isArray(prop.enum) && prop.enum.length > 0) {\n const display = enumDisplay(prop);\n return {\n ...base,\n kind: \"enum\",\n options: enumOptions(prop),\n ...(display ? { display } : {}),\n };\n }\n // A value-or-template union: the enum lives in an anyOf/oneOf branch alongside\n // free-form branches. Render it as a dropdown using that branch's enum; the\n // free-form branches are honoured via a consumer's allowCustomValue pre-ext.\n const branch = enumBranch(prop);\n if (branch) {\n return { ...base, kind: \"enum\", options: enumOptions(branch) };\n }\n const templateBranch = prop.anyOf?.find((part) => part.type === \"string\" && typeof part.pattern === \"string\");\n if (prop.anyOf?.length === 2 && templateBranch) {\n const nativeBranch = prop.anyOf.find((part) => part !== templateBranch);\n if (nativeBranch && (nativeBranch.type === \"number\" || nativeBranch.type === \"integer\" || nativeBranch.type === \"boolean\" || nativeBranch.format === \"date\" || nativeBranch.format === \"date-time\")) {\n const nativeSchema = { ...prop, ...nativeBranch };\n delete nativeSchema.anyOf;\n return resolveControl({ ...args, prop: nativeSchema });\n }\n }\n // A schema-declared date/date-time string renders as a date control.\n if (prop.format === \"date\" || prop.format === \"date-time\") {\n return { ...base, kind: \"date\", dateFormat: prop.format };\n }\n // A long-form string declares `format: textarea` to render a multi-line box.\n if (prop.format === \"textarea\" && schemaHasType(prop, \"string\")) {\n return { ...base, kind: \"textarea\" };\n }\n // A markdown string declares `format: md` to render the MDXEditor-backed\n // editor. Plugin toggles live under `x-md-editor` so schema authors can keep\n // the format signal standard-sized and the editor behavior explicit.\n if (prop.format === \"md\" && schemaHasType(prop, \"string\")) {\n const markdownOptions = prop[\"x-md-editor\"];\n return {\n ...base,\n kind: \"markdown\",\n ...(isPlainObject(markdownOptions) ? { markdownOptions } : {}),\n };\n }\n if (schemaHasType(prop, \"boolean\")) {\n return { ...base, kind: \"boolean\" };\n }\n if (schemaHasType(prop, \"integer\") || schemaHasType(prop, \"number\")) {\n return {\n ...base,\n kind: \"number\",\n coerceNumber: true,\n // A percent number carries a static \"%\" unit shown inside the input.\n ...(prop.format === \"percent\" ? { unit: \"%\" } : {}),\n ...(typeof prop.minimum === \"number\" ? { minimum: prop.minimum } : {}),\n };\n }\n if (schemaHasType(prop, \"array\")) {\n const display = arrayDisplay(prop);\n const itemSchema = prop.items;\n return {\n ...base,\n kind: \"array\",\n ...(itemSchema ? { itemSchema } : {}),\n ...(typeof prop.minItems === \"number\" ? { minItems: prop.minItems } : {}),\n ...(typeof prop.maxItems === \"number\" ? { maxItems: prop.maxItems } : {}),\n ...(display ? { arrayDisplay: display } : {}),\n ...(display === \"accordion\" ? { itemSpec: resolveItemSpec(prop, itemSchema) } : {}),\n // An accordion reuses the array's description as the zero-item copy in its\n // add row, so a paragraph of the same sentence directly above would be a\n // literal duplicate. The schema can still say otherwise.\n ...(display === \"accordion\" && !helpMode ? { helpDisplay: \"hover\" as const } : {}),\n // An enum item schema makes the whole array a list of choices, whichever\n // display renders it (tags by default, filter pills on request), so the\n // options — labels, icons, tones and all — always resolve.\n ...(itemSchema && Array.isArray(itemSchema.enum)\n ? { options: enumOptions(itemSchema) }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // An open map: object whose entries are described by an additionalProperties\n // sub-schema and/or per-key patternProperties. Renders as editable key/value\n // rows (+ any known properties), with the value form resolved per key.\n if (isOpenStringMap(prop)) {\n const addl =\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ? (prop.additionalProperties as JsonSchemaProperty)\n : undefined;\n const patterns = patternSchemasOf(prop);\n // A constrained picker (propertyNames enum) or patternProperties still lets\n // the author ADD keys — the additions are limited to the allowed set, not\n // free-form — so `additionalProperties: false` doesn't disable \"Add field\"\n // in that case. It only closes a plain open map with no key constraints.\n const allowExtraKeys =\n keyOptions || patterns ? true : prop.additionalProperties !== false;\n return {\n ...base,\n kind: \"string-map\",\n ...(addl ? { valueSchema: addl } : {}),\n ...(patterns ? { valuePatternSchemas: patterns } : {}),\n ...(prop.properties ? { knownProperties: prop.properties } : {}),\n allowExtraKeys,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // A structured object: fixed `properties`, not an open map. Renders as a\n // nested sub-form (labels, required, if/then) — recursed into by the renderer.\n if (schemaRendersAsObject(prop)) {\n const valueObject = isPlainObject(value) ? value : {};\n const objectFields = effectiveProperties(\n prop as JsonSchemaObject,\n valueObject,\n );\n if (Object.keys(objectFields.properties).length > 0 || prop.properties) {\n return {\n ...base,\n kind: \"object\",\n objectProperties: objectFields.properties,\n ...(objectFields.required.length > 0\n ? { objectRequired: objectFields.required }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n }\n // A bare object with neither properties nor an additionalProperties schema:\n // treat as an open string map unless explicitly closed.\n if (schemaRendersAsObject(prop)) {\n return {\n ...base,\n kind: \"string-map\",\n allowExtraKeys: prop.additionalProperties !== false,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n return base;\n}\n\n// keyOptionsFor resolves the strict map-key picker options from a map schema's\n// `propertyNames.enum` (e.g. an AsCode-constrained key set). Returns undefined\n// when the keys are unconstrained, so the key stays free-text.\nfunction keyOptionsFor(prop: JsonSchemaProperty): FieldOption[] | undefined {\n const pn = prop.propertyNames as JsonSchemaProperty | undefined;\n if (!pn || !Array.isArray(pn.enum) || pn.enum.length === 0) return undefined;\n return enumOptions(pn);\n}\n\n// scalarItemsType returns the scalar type an array's items hold — the case the\n// array renders as ONE tag list rather than a control per item — or undefined\n// when the items need a real per-item control. Anything carrying an\n// enum/const/properties/items/additionalProperties/allOf has a richer shape (an\n// enum array is a list of choices, and takes the option-backed branch instead).\nexport function scalarItemsType(\n items: JsonSchemaProperty | undefined,\n): ScalarItemType | undefined {\n if (!items) return \"string\"; // untyped items default to string tags\n if (\n items.enum !== undefined ||\n items.const !== undefined ||\n items.properties !== undefined ||\n items.items !== undefined ||\n items.additionalProperties !== undefined ||\n items.allOf !== undefined ||\n items.oneOf !== undefined || items.anyOf !== undefined\n ) {\n return undefined;\n }\n if (items.type === undefined || schemaHasType(items, \"string\")) return \"string\";\n if (schemaHasType(items, \"integer\")) return \"integer\";\n if (schemaHasType(items, \"number\")) return \"number\";\n return undefined;\n}\n"],"mappings":";;;;;;;;AAuBA,SAAgB,gBAAgB,MAAmC;CACjE,IAAI,CAAC,sBAAsB,IAAI,GAAG,OAAO;CACzC,IACE,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,MAE9B,OAAO;CAET,OACE,CAAC,CAAC,KAAK,qBAAqB,OAAO,KAAK,KAAK,iBAAiB,CAAC,CAAC,SAAS;AAE7E;AAIA,SAAS,iBACP,MAC+D;CAC/D,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,OAAO,KAAK,EAAE,CAAC,CAAC,WAAW,GAAG,OAAO,KAAA;CAChD,OAAO,OAAO,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,aAAa;EAAE;EAAS;CAAO,EAAE;AAC5E;AAEA,SAAS,cAAc,MAA0B,MAAuB;CACtE,IAAI,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,KAAK,SAAS,IAAa;CACrE,OAAO,KAAK,SAAS;AACvB;AAKA,SAAgB,sBAAsB,MAAmC;CACvE,IAAI,cAAc,MAAM,QAAQ,GAAG,OAAO;CAC1C,IAAI,KAAK,SAAS,KAAA,GAAW,OAAO;CACpC,IACE,KAAK,eAAe,KAAA,KACpB,KAAK,aAAa,KAAA,KAClB,KAAK,yBAAyB,KAAA,KAC9B,KAAK,sBAAsB,KAAA,KAC3B,KAAK,kBAAkB,KAAA,KACvB,KAAK,0BAA0B,KAAA,GAE/B,OAAO;CAET,OACE,KAAK,OAAO,MACT,WACC,OAAO,OAAO,KAAA,KACd,OAAO,SAAS,KAAA,KAChB,sBAAsB,MAA4B,CACtD,KAAK;AAET;AAEA,SAAS,YAAY,MAAyC;CAC5D,MAAM,SAAS,KAAK;CACpB,MAAM,QAAQ,KAAK;CACnB,MAAM,eAAe,KAAK;CAC1B,MAAM,QAAQ,KAAK;CACnB,QAAQ,KAAK,QAAQ,CAAC,EAAA,CAAG,KAAK,MAAM;EAClC,MAAM,QAAQ,OAAO,CAAC;EACtB,MAAM,OAAO,SAAS;EACtB,MAAM,OAAO,QAAQ;EACrB,MAAM,cAAc,eAAe;EACnC,MAAM,OAAO,QAAQ;EACrB,OAAO;GACL;GACA,OACE,OAAO,SAAS,YAAY,QAAQ,SAAS,QACzC,GAAG,KAAK,IAAI,MAAM,KAClB;GACN,GAAI,OAAO,SAAS,YAAY,OAAO,EAAE,KAAK,IAAI,CAAC;GACnD,GAAI,OAAO,gBAAgB,YAAY,cACnC,EAAE,YAAY,IACd,CAAC;GACL,GAAI,YAAY,IAAI,IAAI,EAAE,KAAK,IAAI,CAAC;EACtC;CACF,CAAC;AACH;AAKA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,IAAI,MAAM,cAAc,MAAM,WAAW,MAAM,UAAU,MAAM,aAC7D,OAAO;CACT,MAAM,QAAQ,KAAK;CACnB,IAAI,SAAS,OAAO,KAAK,KAAK,CAAC,CAAC,SAAS,GAAG,OAAO;AAErD;AAEA,SAAS,aAAa,MAAoD;CACxE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,kBACX,MAAM,eACN,MAAM,WACN,MAAM,aACN,MAAM,SACJ,IACA,KAAA;AACN;AAIA,SAAS,YAAY,MAAmD;CACtE,MAAM,IAAI,KAAK;CACf,OAAO,MAAM,YAAY,MAAM,UAAU,IAAI,KAAA;AAC/C;AAEA,SAAgB,aAAa,MAA8C;CACzE,MAAM,cACJ,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,KAAK,IAAI;CACnE,MAAM,OAAO,KAAK;CAClB,MAAM,WACJ,cAAc,IAAI,KAAK,OAAO,KAAK,SAAS,WACxC,KAAK,KAAK,KAAK,IACf;CAEN,IAAI,eAAe,YAAY,aAAa,aAC1C,OAAO,GAAG,YAAY,GAAG;CAE3B,OAAO,eAAe,YAAY,KAAA;AACpC;AAIA,SAAS,cAAc,UAAmB,MAA0B;CAClE,IAAI,OAAO,aAAa,YAAY,UAGlC,OAAO,cAAc,WAAW;EAC9B,MAAM;EACN,WAAW;CACb,CAAC;CAEH,IAAI,OAAO,SAAS,YAAY,MAC9B,OAAO,cACL,QACA,EAAE,WAAW,gCAAgC,GAC7C,IACF;AAGJ;AAGA,SAAgB,WACd,MACgC;CAChC,MAAM,WAAW,CAAC,GAAI,KAAK,SAAS,CAAC,GAAI,GAAI,KAAK,SAAS,CAAC,CAAE;CAC9D,MAAM,eAAe,SAAS,OAAO,WAAW,OAAO,MAAM,UAAU,OAAO,OAAO,UAAU,QAAQ;CACvG,MAAM,UAAU,SAAS,QAAQ,WAAW,OAAO,MAAM,UAAW,gBAAgB,OAAO,OAAO,UAAU,QAAS;CACrH,MAAM,QAAQ,QAAQ;CACtB,IAAI,CAAC,OAAO,OAAO,KAAA;CACnB,OAAO;EACL,GAAG;EACH,MAAM,CAAC,GAAG,IAAI,IAAI,QAAQ,SAAS,WAAW,OAAO,QAAQ,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC;EAC7E,iBAAiB,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,KAAK,WAAW,OAAO,gBAAgB,CAAC;EACtF,gBAAgB,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,KAAK,WAAW,OAAO,eAAe,CAAC;EACpF,uBAAuB,OAAO,OAAO,CAAC,GAAG,GAAG,QAAQ,KAAK,WAAW,OAAO,sBAAsB,CAAC;CACpG;AACF;AAIA,SAAS,iBACP,MAC8B;CAC9B,MAAM,MAAe,KAAK;CAC1B,IAAI,CAAC,cAAc,GAAG,GAAG,OAAO,KAAA;CAChC,IAAI,OAAO,IAAI,QAAQ,YAAY,OAAO,IAAI,WAAW,UACvD,OAAO,KAAA;CACT,OAAO;AACT;AAeA,SAAgB,eAAe,MAAwC;CACrE,MAAM,EAAE,KAAK,MAAM,UAAU,OAAO,aAAa;CACjD,MAAM,YAAY,KAAK;CACvB,MAAM,UAAU,KAAK;CACrB,MAAM,iBACJ,YAAY,YAAY,YAAY,WAAW,YAAY,UACvD,UACA,KAAA;CAGN,MAAM,gBAAgB,KAAK;CAC3B,MAAM,SACJ,mBACC,kBAAkB,QACf,UACA,kBAAkB,SAChB,WACA,KAAA;CACR,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,SAAS,cACb,KAAK,wBACL,KAAK,iBACP;CACA,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,iBACJ,OAAO,KAAK,uBAAuB,WAC/B,KAAK,qBACL,KAAA;CACN,MAAM,UACJ,KAAK,kBAAkB,SAClB,SACD,OAAO,KAAK,kBAAkB,YAC5B,OAAO,SAAS,KAAK,aAAa,IAClC,KAAK,gBACL,KAAA;CACR,MAAM,aAAa,cAAc,IAAI;CACrC,MAAM,SAAS,aAAa,IAAI;CAChC,MAAM,WAAW,YAAY,IAAI;CACjC,MAAM,OAAqB;EACzB;EACA,MAAM;EAGN,OAAO,OAAO,KAAK,UAAU,WAAW,KAAK,QAAQ;EACrD;EACA,QAAQ;EACR;EACA;EACA,GAAI,KAAK,aAAa,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACnD,GAAI,KAAK,cAAc,OAAO,EAAE,WAAW,KAAK,IAAI,CAAC;EACrD,GAAI,KAAK,kBAAkB,OAAO,EAAE,UAAU,KAAK,IAAI,CAAC;EACxD,GAAI,OAAO,KAAK,gBAAgB,WAC5B,EAAE,aAAa,KAAK,YAAY,IAChC,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,WAAW,EAAE,aAAa,SAAS,IAAI,CAAC;EAC5C,GAAI,aAAa,QAAQ,cAAc,KACnC,EAAa,UAAuC,IACpD,CAAC;EACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC3B,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,iBAAiB,EAAE,eAAe,IAAI,CAAC;EAC3C,GAAI,WAAW,OAAO,EAAE,QAAQ,IAAI,CAAC;CACvC;CAKA,MAAM,SAAS,iBAAiB,IAAI;CACpC,IAAI,QACF,OAAO;EACL,GAAG;EACH,MAAM;EACN;EACA,SAAS,CAAC;EACV,kBAAkB,OAAO,UAAU;CACrC;CAEF,IAAI,KAAK,WAAW,QAAQ,OAAO;EAAE,GAAG;EAAM,MAAM;CAAO;CAC3D,IAAI,cAAc,IAAI,CAAC,CAAC,SAAS,GAAG,OAAO;EAAE,GAAG;EAAM,MAAM;CAAQ;CACpE,IAAI,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,KAAK,SAAS,GAAG;EACpD,MAAM,UAAU,YAAY,IAAI;EAChC,OAAO;GACL,GAAG;GACH,MAAM;GACN,SAAS,YAAY,IAAI;GACzB,GAAI,UAAU,EAAE,QAAQ,IAAI,CAAC;EAC/B;CACF;CAIA,MAAM,SAAS,WAAW,IAAI;CAC9B,IAAI,QACF,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,SAAS,YAAY,MAAM;CAAE;CAE/D,MAAM,iBAAiB,KAAK,OAAO,MAAM,SAAS,KAAK,SAAS,YAAY,OAAO,KAAK,YAAY,QAAQ;CAC5G,IAAI,KAAK,OAAO,WAAW,KAAK,gBAAgB;EAC9C,MAAM,eAAe,KAAK,MAAM,MAAM,SAAS,SAAS,cAAc;EACtE,IAAI,iBAAiB,aAAa,SAAS,YAAY,aAAa,SAAS,aAAa,aAAa,SAAS,aAAa,aAAa,WAAW,UAAU,aAAa,WAAW,cAAc;GACnM,MAAM,eAAe;IAAE,GAAG;IAAM,GAAG;GAAa;GAChD,OAAO,aAAa;GACpB,OAAO,eAAe;IAAE,GAAG;IAAM,MAAM;GAAa,CAAC;EACvD;CACF;CAEA,IAAI,KAAK,WAAW,UAAU,KAAK,WAAW,aAC5C,OAAO;EAAE,GAAG;EAAM,MAAM;EAAQ,YAAY,KAAK;CAAO;CAG1D,IAAI,KAAK,WAAW,cAAc,cAAc,MAAM,QAAQ,GAC5D,OAAO;EAAE,GAAG;EAAM,MAAM;CAAW;CAKrC,IAAI,KAAK,WAAW,QAAQ,cAAc,MAAM,QAAQ,GAAG;EACzD,MAAM,kBAAkB,KAAK;EAC7B,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,cAAc,eAAe,IAAI,EAAE,gBAAgB,IAAI,CAAC;EAC9D;CACF;CACA,IAAI,cAAc,MAAM,SAAS,GAC/B,OAAO;EAAE,GAAG;EAAM,MAAM;CAAU;CAEpC,IAAI,cAAc,MAAM,SAAS,KAAK,cAAc,MAAM,QAAQ,GAChE,OAAO;EACL,GAAG;EACH,MAAM;EACN,cAAc;EAEd,GAAI,KAAK,WAAW,YAAY,EAAE,MAAM,IAAI,IAAI,CAAC;EACjD,GAAI,OAAO,KAAK,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;CACtE;CAEF,IAAI,cAAc,MAAM,OAAO,GAAG;EAChC,MAAM,UAAU,aAAa,IAAI;EACjC,MAAM,aAAa,KAAK;EACxB,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,OAAO,KAAK,aAAa,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;GACvE,GAAI,UAAU,EAAE,cAAc,QAAQ,IAAI,CAAC;GAC3C,GAAI,YAAY,cAAc,EAAE,UAAU,gBAAgB,MAAM,UAAU,EAAE,IAAI,CAAC;GAIjF,GAAI,YAAY,eAAe,CAAC,WAAW,EAAE,aAAa,QAAiB,IAAI,CAAC;GAIhF,GAAI,cAAc,MAAM,QAAQ,WAAW,IAAI,IAC3C,EAAE,SAAS,YAAY,UAAU,EAAE,IACnC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAIA,IAAI,gBAAgB,IAAI,GAAG;EACzB,MAAM,OACJ,OAAO,KAAK,yBAAyB,YACrC,KAAK,yBAAyB,OACzB,KAAK,uBACN,KAAA;EACN,MAAM,WAAW,iBAAiB,IAAI;EAKtC,MAAM,iBACJ,cAAc,WAAW,OAAO,KAAK,yBAAyB;EAChE,OAAO;GACL,GAAG;GACH,MAAM;GACN,GAAI,OAAO,EAAE,aAAa,KAAK,IAAI,CAAC;GACpC,GAAI,WAAW,EAAE,qBAAqB,SAAS,IAAI,CAAC;GACpD,GAAI,KAAK,aAAa,EAAE,iBAAiB,KAAK,WAAW,IAAI,CAAC;GAC9D;GACA,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;GACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CACF;CAGA,IAAI,sBAAsB,IAAI,GAAG;EAC/B,MAAM,cAAc,cAAc,KAAK,IAAI,QAAQ,CAAC;EACpD,MAAM,eAAe,oBACnB,MACA,WACF;EACA,IAAI,OAAO,KAAK,aAAa,UAAU,CAAC,CAAC,SAAS,KAAK,KAAK,YAC1D,OAAO;GACL,GAAG;GACH,MAAM;GACN,kBAAkB,aAAa;GAC/B,GAAI,aAAa,SAAS,SAAS,IAC/B,EAAE,gBAAgB,aAAa,SAAS,IACxC,CAAC;GACL,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;EAC7B;CAEJ;CAGA,IAAI,sBAAsB,IAAI,GAC5B,OAAO;EACL,GAAG;EACH,MAAM;EACN,gBAAgB,KAAK,yBAAyB;EAC9C,GAAI,aAAa,EAAE,WAAW,IAAI,CAAC;EACnC,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC;CAC7B;CAEF,OAAO;AACT;AAKA,SAAS,cAAc,MAAqD;CAC1E,MAAM,KAAK,KAAK;CAChB,IAAI,CAAC,MAAM,CAAC,MAAM,QAAQ,GAAG,IAAI,KAAK,GAAG,KAAK,WAAW,GAAG,OAAO,KAAA;CACnE,OAAO,YAAY,EAAE;AACvB;AAOA,SAAgB,gBACd,OAC4B;CAC5B,IAAI,CAAC,OAAO,OAAO;CACnB,IACE,MAAM,SAAS,KAAA,KACf,MAAM,UAAU,KAAA,KAChB,MAAM,eAAe,KAAA,KACrB,MAAM,UAAU,KAAA,KAChB,MAAM,yBAAyB,KAAA,KAC/B,MAAM,UAAU,KAAA,KAChB,MAAM,UAAU,KAAA,KAAa,MAAM,UAAU,KAAA,GAE7C;CAEF,IAAI,MAAM,SAAS,KAAA,KAAa,cAAc,OAAO,QAAQ,GAAG,OAAO;CACvE,IAAI,cAAc,OAAO,SAAS,GAAG,OAAO;CAC5C,IAAI,cAAc,OAAO,QAAQ,GAAG,OAAO;AAE7C"}
@@ -89,7 +89,7 @@ export interface JsonSchemaObject extends JsonSchemaProperty {
89
89
  allOf?: JsonSchemaConditional[];
90
90
  "x-discriminator"?: string;
91
91
  }
92
- export type FieldControlKind = "string" | "number" | "boolean" | "enum" | "lookup" | "date" | "string-map" | "array" | "object" | "textarea" | "markdown" | "display" | "link";
92
+ export type FieldControlKind = "union" | "json" | "string" | "number" | "boolean" | "enum" | "lookup" | "date" | "string-map" | "array" | "object" | "textarea" | "markdown" | "display" | "link";
93
93
  export type DisplayVariant = "heading" | "text" | "divider" | "spacer";
94
94
  export type EnumDisplay = "combobox" | "radio" | "grid" | "segmented";
95
95
  export type GridColumns = number | "auto";
@@ -144,6 +144,10 @@ export interface JsonSchemaHelpBlock {
144
144
  source?: string;
145
145
  section?: string;
146
146
  body?: string;
147
+ links?: Array<{
148
+ label: string;
149
+ href: string;
150
+ }>;
147
151
  }
148
152
  export interface FieldControl {
149
153
  key: string;