@flanksource/clicky-ui 0.3.34 → 0.3.35

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 (680) hide show
  1. package/README.md +4 -0
  2. package/dist/ai.cjs +3 -0
  3. package/dist/ai.cjs.map +1 -1
  4. package/dist/ai.js +3 -0
  5. package/dist/ai.js.map +1 -1
  6. package/dist/comments/CommentCard.d.ts +1 -1
  7. package/dist/comments/CommentProvider.d.ts +1 -1
  8. package/dist/comments/CommentThread.d.ts +1 -1
  9. package/dist/comments/CommentThreadList.d.ts +1 -1
  10. package/dist/comments/MentionTextarea.d.ts +1 -1
  11. package/dist/comments/comment-context.d.ts +4 -4
  12. package/dist/comments/comment-fixtures.d.ts +1 -1
  13. package/dist/comments/comment-types.d.ts +1 -1
  14. package/dist/components/AccordionList.d.ts +1 -1
  15. package/dist/components/ComboboxControl.d.ts +1 -1
  16. package/dist/components/ComboboxMenu.d.ts +2 -2
  17. package/dist/components/ComboboxTags.cjs +41 -11
  18. package/dist/components/ComboboxTags.cjs.map +1 -1
  19. package/dist/components/ComboboxTags.d.ts +6 -0
  20. package/dist/components/ComboboxTags.d.ts.map +1 -1
  21. package/dist/components/ComboboxTags.js +41 -11
  22. package/dist/components/ComboboxTags.js.map +1 -1
  23. package/dist/components/DateField.d.ts +3 -3
  24. package/dist/components/DatePicker.d.ts +3 -3
  25. package/dist/components/DateTimePicker.d.ts +3 -3
  26. package/dist/components/ErrorWrapper.d.ts +2 -2
  27. package/dist/components/Field.d.ts +1 -1
  28. package/dist/components/FilterBar.d.ts +1 -1
  29. package/dist/components/FormLookupProvider.d.ts +1 -1
  30. package/dist/components/FormatOptionsDropdown.d.ts +1 -1
  31. package/dist/components/IconButton.d.ts +3 -3
  32. package/dist/components/InputField.d.ts +2 -2
  33. package/dist/components/ItemActions.d.ts +1 -1
  34. package/dist/components/JsonSchemaForm.cjs +17 -36
  35. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  36. package/dist/components/JsonSchemaForm.d.ts +1 -1
  37. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  38. package/dist/components/JsonSchemaForm.js +17 -36
  39. package/dist/components/JsonSchemaForm.js.map +1 -1
  40. package/dist/components/ListMenu.d.ts +1 -1
  41. package/dist/components/MultiSelect.d.ts +1 -1
  42. package/dist/components/SearchInput.d.ts +1 -1
  43. package/dist/components/SegmentedControl.d.ts +1 -1
  44. package/dist/components/SplitButton.d.ts +1 -1
  45. package/dist/components/Switch.d.ts +1 -1
  46. package/dist/components/TreePickerField.cjs +11 -2
  47. package/dist/components/TreePickerField.cjs.map +1 -1
  48. package/dist/components/TreePickerField.d.ts +13 -4
  49. package/dist/components/TreePickerField.d.ts.map +1 -1
  50. package/dist/components/TreePickerField.js +11 -2
  51. package/dist/components/TreePickerField.js.map +1 -1
  52. package/dist/components/UnitStepControls.d.ts +1 -1
  53. package/dist/components/button.d.ts +3 -3
  54. package/dist/components/combobox-types.d.ts +1 -1
  55. package/dist/components/density-switcher.d.ts +1 -1
  56. package/dist/components/filter-bar-context.d.ts +1 -1
  57. package/dist/components/filter-bar-field-utils.d.ts +2 -2
  58. package/dist/components/form-lookup-context.d.ts +1 -1
  59. package/dist/components/icon-menu-picker.d.ts +1 -1
  60. package/dist/components/json-schema-form-accordion-array.cjs +44 -21
  61. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
  62. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
  63. package/dist/components/json-schema-form-accordion-array.js +47 -24
  64. package/dist/components/json-schema-form-accordion-array.js.map +1 -1
  65. package/dist/components/json-schema-form-array.cjs +53 -30
  66. package/dist/components/json-schema-form-array.cjs.map +1 -1
  67. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  68. package/dist/components/json-schema-form-array.js +54 -31
  69. package/dist/components/json-schema-form-array.js.map +1 -1
  70. package/dist/components/json-schema-form-cards-array.cjs +32 -22
  71. package/dist/components/json-schema-form-cards-array.cjs.map +1 -1
  72. package/dist/components/json-schema-form-cards-array.d.ts.map +1 -1
  73. package/dist/components/json-schema-form-cards-array.js +33 -23
  74. package/dist/components/json-schema-form-cards-array.js.map +1 -1
  75. package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts +44 -0
  76. package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts.map +1 -0
  77. package/dist/components/json-schema-form-discriminator.d.ts +1 -1
  78. package/dist/components/json-schema-form-errors.cjs +5 -1
  79. package/dist/components/json-schema-form-errors.cjs.map +1 -1
  80. package/dist/components/json-schema-form-errors.d.ts +2 -1
  81. package/dist/components/json-schema-form-errors.d.ts.map +1 -1
  82. package/dist/components/json-schema-form-errors.js +6 -2
  83. package/dist/components/json-schema-form-errors.js.map +1 -1
  84. package/dist/components/json-schema-form-extensions.d.ts +1 -1
  85. package/dist/components/json-schema-form-filter-input.cjs +50 -0
  86. package/dist/components/json-schema-form-filter-input.cjs.map +1 -0
  87. package/dist/components/json-schema-form-filter-input.d.ts +5 -0
  88. package/dist/components/json-schema-form-filter-input.d.ts.map +1 -0
  89. package/dist/components/json-schema-form-filter-input.js +50 -0
  90. package/dist/components/json-schema-form-filter-input.js.map +1 -0
  91. package/dist/components/json-schema-form-filter.cjs +49 -0
  92. package/dist/components/json-schema-form-filter.cjs.map +1 -0
  93. package/dist/components/json-schema-form-filter.d.ts +8 -0
  94. package/dist/components/json-schema-form-filter.d.ts.map +1 -0
  95. package/dist/components/json-schema-form-filter.js +49 -0
  96. package/dist/components/json-schema-form-filter.js.map +1 -0
  97. package/dist/components/json-schema-form-layout.cjs +84 -17
  98. package/dist/components/json-schema-form-layout.cjs.map +1 -1
  99. package/dist/components/json-schema-form-layout.d.ts +1 -1
  100. package/dist/components/json-schema-form-layout.d.ts.map +1 -1
  101. package/dist/components/json-schema-form-layout.js +84 -17
  102. package/dist/components/json-schema-form-layout.js.map +1 -1
  103. package/dist/components/json-schema-form-list-array.cjs +16 -5
  104. package/dist/components/json-schema-form-list-array.cjs.map +1 -1
  105. package/dist/components/json-schema-form-list-array.d.ts +2 -1
  106. package/dist/components/json-schema-form-list-array.d.ts.map +1 -1
  107. package/dist/components/json-schema-form-list-array.js +16 -5
  108. package/dist/components/json-schema-form-list-array.js.map +1 -1
  109. package/dist/components/json-schema-form-object.cjs +239 -85
  110. package/dist/components/json-schema-form-object.cjs.map +1 -1
  111. package/dist/components/json-schema-form-object.d.ts +2 -2
  112. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  113. package/dist/components/json-schema-form-object.js +241 -87
  114. package/dist/components/json-schema-form-object.js.map +1 -1
  115. package/dist/components/json-schema-form-preferences.cjs +1 -1
  116. package/dist/components/json-schema-form-preferences.cjs.map +1 -1
  117. package/dist/components/json-schema-form-preferences.d.ts +1 -1
  118. package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
  119. package/dist/components/json-schema-form-preferences.js +1 -1
  120. package/dist/components/json-schema-form-preferences.js.map +1 -1
  121. package/dist/components/json-schema-form-properties-errors.fixtures.d.ts +14 -0
  122. package/dist/components/json-schema-form-properties-errors.fixtures.d.ts.map +1 -0
  123. package/dist/components/json-schema-form-properties-size.cjs +19 -0
  124. package/dist/components/json-schema-form-properties-size.cjs.map +1 -0
  125. package/dist/components/json-schema-form-properties-size.d.ts +4 -0
  126. package/dist/components/json-schema-form-properties-size.d.ts.map +1 -0
  127. package/dist/components/json-schema-form-properties-size.js +19 -0
  128. package/dist/components/json-schema-form-properties-size.js.map +1 -0
  129. package/dist/components/json-schema-form-properties.cjs +305 -0
  130. package/dist/components/json-schema-form-properties.cjs.map +1 -0
  131. package/dist/components/json-schema-form-properties.d.ts +20 -0
  132. package/dist/components/json-schema-form-properties.d.ts.map +1 -0
  133. package/dist/components/json-schema-form-properties.fixtures.d.ts +157 -0
  134. package/dist/components/json-schema-form-properties.fixtures.d.ts.map +1 -0
  135. package/dist/components/json-schema-form-properties.js +305 -0
  136. package/dist/components/json-schema-form-properties.js.map +1 -0
  137. package/dist/components/json-schema-form-property-actions-context.cjs +6 -0
  138. package/dist/components/json-schema-form-property-actions-context.cjs.map +1 -0
  139. package/dist/components/json-schema-form-property-actions-context.d.ts +2 -0
  140. package/dist/components/json-schema-form-property-actions-context.d.ts.map +1 -0
  141. package/dist/components/json-schema-form-property-actions-context.js +6 -0
  142. package/dist/components/json-schema-form-property-actions-context.js.map +1 -0
  143. package/dist/components/json-schema-form-property-collection.cjs +31 -0
  144. package/dist/components/json-schema-form-property-collection.cjs.map +1 -0
  145. package/dist/components/json-schema-form-property-collection.d.ts +6 -0
  146. package/dist/components/json-schema-form-property-collection.d.ts.map +1 -0
  147. package/dist/components/json-schema-form-property-collection.js +31 -0
  148. package/dist/components/json-schema-form-property-collection.js.map +1 -0
  149. package/dist/components/json-schema-form-property-draft.cjs +45 -0
  150. package/dist/components/json-schema-form-property-draft.cjs.map +1 -0
  151. package/dist/components/json-schema-form-property-draft.d.ts +8 -0
  152. package/dist/components/json-schema-form-property-draft.d.ts.map +1 -0
  153. package/dist/components/json-schema-form-property-draft.js +45 -0
  154. package/dist/components/json-schema-form-property-draft.js.map +1 -0
  155. package/dist/components/json-schema-form-property-preview.cjs +68 -0
  156. package/dist/components/json-schema-form-property-preview.cjs.map +1 -0
  157. package/dist/components/json-schema-form-property-preview.d.ts +7 -0
  158. package/dist/components/json-schema-form-property-preview.d.ts.map +1 -0
  159. package/dist/components/json-schema-form-property-preview.js +68 -0
  160. package/dist/components/json-schema-form-property-preview.js.map +1 -0
  161. package/dist/components/json-schema-form-property-selection.cjs +89 -0
  162. package/dist/components/json-schema-form-property-selection.cjs.map +1 -0
  163. package/dist/components/json-schema-form-property-selection.d.ts +6 -0
  164. package/dist/components/json-schema-form-property-selection.d.ts.map +1 -0
  165. package/dist/components/json-schema-form-property-selection.js +89 -0
  166. package/dist/components/json-schema-form-property-selection.js.map +1 -0
  167. package/dist/components/json-schema-form-render.cjs +41 -4
  168. package/dist/components/json-schema-form-render.cjs.map +1 -1
  169. package/dist/components/json-schema-form-render.d.ts +1 -1
  170. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  171. package/dist/components/json-schema-form-render.js +42 -5
  172. package/dist/components/json-schema-form-render.js.map +1 -1
  173. package/dist/components/json-schema-form-resolve.cjs +2 -0
  174. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  175. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  176. package/dist/components/json-schema-form-resolve.js +2 -0
  177. package/dist/components/json-schema-form-resolve.js.map +1 -1
  178. package/dist/components/json-schema-form-runtime-types.d.ts +222 -0
  179. package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -0
  180. package/dist/components/json-schema-form-table-array.cjs +82 -51
  181. package/dist/components/json-schema-form-table-array.cjs.map +1 -1
  182. package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
  183. package/dist/components/json-schema-form-table-array.js +84 -53
  184. package/dist/components/json-schema-form-table-array.js.map +1 -1
  185. package/dist/components/json-schema-form-template-menu.d.ts +1 -1
  186. package/dist/components/json-schema-form-template.d.ts +1 -1
  187. package/dist/components/json-schema-form-types.d.ts +7 -179
  188. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  189. package/dist/components/json-schema-form-utils.cjs +10 -9
  190. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  191. package/dist/components/json-schema-form-utils.d.ts +11 -1
  192. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  193. package/dist/components/json-schema-form-utils.js +10 -9
  194. package/dist/components/json-schema-form-utils.js.map +1 -1
  195. package/dist/components/loading.d.ts +4 -4
  196. package/dist/components/mdx-editor-callout.d.ts +1 -1
  197. package/dist/components/mdx-editor-options.d.ts +1 -1
  198. package/dist/components/select.d.ts +3 -3
  199. package/dist/components/theme-switcher.d.ts +1 -1
  200. package/dist/components/use-list-menu-selection.d.ts +1 -1
  201. package/dist/components/useComboboxLayout.d.ts +1 -1
  202. package/dist/components/workload-picker-utils.d.ts +1 -1
  203. package/dist/data/Avatar.d.ts +1 -1
  204. package/dist/data/AvatarBadge.d.ts +1 -1
  205. package/dist/data/Badge.d.ts +1 -1
  206. package/dist/data/Callout.d.ts +1 -1
  207. package/dist/data/DataTable.cjs +575 -435
  208. package/dist/data/DataTable.cjs.map +1 -1
  209. package/dist/data/DataTable.d.ts +21 -13
  210. package/dist/data/DataTable.d.ts.map +1 -1
  211. package/dist/data/DataTable.grouping.d.ts +1 -1
  212. package/dist/data/DataTable.js +575 -435
  213. package/dist/data/DataTable.js.map +1 -1
  214. package/dist/data/ExecutionTree.d.ts +1 -1
  215. package/dist/data/FilterPill.d.ts +1 -1
  216. package/dist/data/FixtureEditor/RawFenceEditor.d.ts +1 -1
  217. package/dist/data/FixtureEditor/types.d.ts +1 -1
  218. package/dist/data/Gauge.d.ts +1 -1
  219. package/dist/data/GaugeHoverCard.d.ts +1 -1
  220. package/dist/data/Icon.d.ts +1 -1
  221. package/dist/data/KeyValueList.d.ts +1 -1
  222. package/dist/data/MarkdownEditor.d.ts +1 -1
  223. package/dist/data/MatrixTable.d.ts +1 -1
  224. package/dist/data/ObjectGraph.d.ts +1 -1
  225. package/dist/data/ProgressBars.d.ts +1 -1
  226. package/dist/data/Properties.cjs +86 -35
  227. package/dist/data/Properties.cjs.map +1 -1
  228. package/dist/data/Properties.d.ts +2 -2
  229. package/dist/data/Properties.d.ts.map +1 -1
  230. package/dist/data/Properties.js +87 -36
  231. package/dist/data/Properties.js.map +1 -1
  232. package/dist/data/RadialGauge.d.ts +1 -1
  233. package/dist/data/SchemaViewer.d.ts +1 -1
  234. package/dist/data/SortableHeader.d.ts +1 -1
  235. package/dist/data/StatStrip.d.ts +1 -1
  236. package/dist/data/StatusBreakdown.d.ts +1 -1
  237. package/dist/data/TabButton.d.ts +1 -1
  238. package/dist/data/TaskManager.cjs +9 -17
  239. package/dist/data/TaskManager.cjs.map +1 -1
  240. package/dist/data/TaskManager.d.ts.map +1 -1
  241. package/dist/data/TaskManager.js +9 -17
  242. package/dist/data/TaskManager.js.map +1 -1
  243. package/dist/data/TaskManagerButton.cjs +17 -34
  244. package/dist/data/TaskManagerButton.cjs.map +1 -1
  245. package/dist/data/TaskManagerButton.d.ts.map +1 -1
  246. package/dist/data/TaskManagerButton.js +18 -35
  247. package/dist/data/TaskManagerButton.js.map +1 -1
  248. package/dist/data/TaskProcessDetails.cjs +5 -26
  249. package/dist/data/TaskProcessDetails.cjs.map +1 -1
  250. package/dist/data/TaskProcessDetails.d.ts +2 -1
  251. package/dist/data/TaskProcessDetails.d.ts.map +1 -1
  252. package/dist/data/TaskProcessDetails.js +5 -26
  253. package/dist/data/TaskProcessDetails.js.map +1 -1
  254. package/dist/data/TaskProgress.cjs +24 -15
  255. package/dist/data/TaskProgress.cjs.map +1 -1
  256. package/dist/data/TaskProgress.d.ts +2 -1
  257. package/dist/data/TaskProgress.d.ts.map +1 -1
  258. package/dist/data/TaskProgress.js +24 -15
  259. package/dist/data/TaskProgress.js.map +1 -1
  260. package/dist/data/TaskResourceReadings.cjs +42 -0
  261. package/dist/data/TaskResourceReadings.cjs.map +1 -0
  262. package/dist/data/TaskResourceReadings.d.ts +6 -0
  263. package/dist/data/TaskResourceReadings.d.ts.map +1 -0
  264. package/dist/data/TaskResourceReadings.js +42 -0
  265. package/dist/data/TaskResourceReadings.js.map +1 -0
  266. package/dist/data/TaskSnapshot.cjs.map +1 -1
  267. package/dist/data/TaskSnapshot.d.ts +14 -1
  268. package/dist/data/TaskSnapshot.d.ts.map +1 -1
  269. package/dist/data/TaskSnapshot.js.map +1 -1
  270. package/dist/data/Timeline.d.ts +1 -1
  271. package/dist/data/Tree.d.ts +1 -1
  272. package/dist/data/TreeGroupHeader.d.ts +1 -1
  273. package/dist/data/TreeNode.d.ts +1 -1
  274. package/dist/data/Version.d.ts +3 -3
  275. package/dist/data/ai/ChatWindow.cjs +22 -12
  276. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  277. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  278. package/dist/data/ai/ChatWindow.js +22 -12
  279. package/dist/data/ai/ChatWindow.js.map +1 -1
  280. package/dist/data/ai/ChatWindow.test-utils.d.ts +4 -2
  281. package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
  282. package/dist/data/ai/ChatWindow.types.d.ts +1 -1
  283. package/dist/data/ai/ChatWindowManager.cjs +2 -0
  284. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  285. package/dist/data/ai/ChatWindowManager.d.ts +1 -1
  286. package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
  287. package/dist/data/ai/ChatWindowManager.js +2 -0
  288. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  289. package/dist/data/ai/PolicyTree.d.ts +1 -1
  290. package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +1 -1
  291. package/dist/data/ai/PromptCatalog/types.d.ts +1 -1
  292. package/dist/data/ai/PromptRunEditor/index.cjs +4 -0
  293. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  294. package/dist/data/ai/PromptRunEditor/index.d.ts +5 -2
  295. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  296. package/dist/data/ai/PromptRunEditor/index.js +4 -0
  297. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  298. package/dist/data/ai/SessionChatComposer.d.ts +1 -1
  299. package/dist/data/ai/SessionInspector.approvals.cjs +147 -0
  300. package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -0
  301. package/dist/data/ai/SessionInspector.approvals.d.ts +21 -0
  302. package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -0
  303. package/dist/data/ai/SessionInspector.approvals.js +147 -0
  304. package/dist/data/ai/SessionInspector.approvals.js.map +1 -0
  305. package/dist/data/ai/SessionInspector.cjs +21 -8
  306. package/dist/data/ai/SessionInspector.cjs.map +1 -1
  307. package/dist/data/ai/SessionInspector.d.ts +6 -2
  308. package/dist/data/ai/SessionInspector.d.ts.map +1 -1
  309. package/dist/data/ai/SessionInspector.hierarchy.d.ts +1 -1
  310. package/dist/data/ai/SessionInspector.js +21 -8
  311. package/dist/data/ai/SessionInspector.js.map +1 -1
  312. package/dist/data/ai/SessionInspector.panel-parts.cjs +47 -0
  313. package/dist/data/ai/SessionInspector.panel-parts.cjs.map +1 -0
  314. package/dist/data/ai/SessionInspector.panel-parts.d.ts +20 -0
  315. package/dist/data/ai/SessionInspector.panel-parts.d.ts.map +1 -0
  316. package/dist/data/ai/SessionInspector.panel-parts.js +47 -0
  317. package/dist/data/ai/SessionInspector.panel-parts.js.map +1 -0
  318. package/dist/data/ai/SessionInspector.panels.cjs +40 -99
  319. package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
  320. package/dist/data/ai/SessionInspector.panels.d.ts +3 -1
  321. package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
  322. package/dist/data/ai/SessionInspector.panels.js +12 -71
  323. package/dist/data/ai/SessionInspector.panels.js.map +1 -1
  324. package/dist/data/ai/SessionViewer.d.ts +1 -1
  325. package/dist/data/ai/SessionViewer.rows.d.ts +1 -1
  326. package/dist/data/ai/SessionViewer.tool-details.d.ts +1 -1
  327. package/dist/data/ai/SessionViewer.unified.d.ts +23 -0
  328. package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
  329. package/dist/data/ai/SpecRuntimeEditor/Footer.d.ts +1 -1
  330. package/dist/data/ai/SpecRuntimeEditor/Rail.d.ts +1 -1
  331. package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts +1 -1
  332. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs +3 -1
  333. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
  334. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +3 -1
  335. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
  336. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js +3 -1
  337. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
  338. package/dist/data/ai/SpecRuntimeEditor/fields.d.ts +1 -1
  339. package/dist/data/ai/SpecRuntimeEditor/index.cjs +3 -1
  340. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  341. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +5 -2
  342. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  343. package/dist/data/ai/SpecRuntimeEditor/index.js +3 -1
  344. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  345. package/dist/data/ai/chat-window-context.cjs +1 -0
  346. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  347. package/dist/data/ai/chat-window-context.d.ts +13 -5
  348. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  349. package/dist/data/ai/chat-window-context.js +1 -0
  350. package/dist/data/ai/chat-window-context.js.map +1 -1
  351. package/dist/data/ai/index.d.ts +2 -1
  352. package/dist/data/ai/index.d.ts.map +1 -1
  353. package/dist/data/ai/use-session-scroll.d.ts +1 -1
  354. package/dist/data/cache-browser/adapter.d.ts +1 -1
  355. package/dist/data/cells/CellFilterActions.d.ts +1 -1
  356. package/dist/data/cells/EntityCell.d.ts +1 -1
  357. package/dist/data/cells/tag-utils.d.ts +1 -1
  358. package/dist/data/chat/Chat.cjs +42 -46
  359. package/dist/data/chat/Chat.cjs.map +1 -1
  360. package/dist/data/chat/Chat.d.ts +16 -5
  361. package/dist/data/chat/Chat.d.ts.map +1 -1
  362. package/dist/data/chat/Chat.js +43 -47
  363. package/dist/data/chat/Chat.js.map +1 -1
  364. package/dist/data/chat/ModelSelector.d.ts +1 -1
  365. package/dist/data/chat/PromptInput.cjs +13 -0
  366. package/dist/data/chat/PromptInput.cjs.map +1 -1
  367. package/dist/data/chat/PromptInput.d.ts +8 -2
  368. package/dist/data/chat/PromptInput.d.ts.map +1 -1
  369. package/dist/data/chat/PromptInput.js +14 -1
  370. package/dist/data/chat/PromptInput.js.map +1 -1
  371. package/dist/data/chat/tool-render/ToolArgs.d.ts +1 -1
  372. package/dist/data/chat/tool-render/ToolParams.d.ts +1 -1
  373. package/dist/data/chat/tool-render/ToolValue.d.ts +1 -1
  374. package/dist/data/chat/tool-render/adapter.d.ts +1 -1
  375. package/dist/data/chat/tool-render/context.d.ts +1 -1
  376. package/dist/data/chat/tool-render/defaults.d.ts +1 -1
  377. package/dist/data/chat/tool-render/known-tool-views.d.ts +1 -1
  378. package/dist/data/chat/tool-render/summary.d.ts +1 -1
  379. package/dist/data/chat/types.d.ts +1 -1
  380. package/dist/data/clicky-export/useClickyExport.d.ts +1 -1
  381. package/dist/data/data-table-server-filters.d.ts +1 -1
  382. package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +1 -1
  383. package/dist/data/diagnostics/ErrorDetails.d.ts +1 -1
  384. package/dist/data/diagnostics/StackFrameRow.d.ts +1 -1
  385. package/dist/data/git/GitChangeList.d.ts +1 -1
  386. package/dist/data/icon-fallback.d.ts +1 -1
  387. package/dist/data/properties-context.cjs +6 -0
  388. package/dist/data/properties-context.cjs.map +1 -0
  389. package/dist/data/properties-context.d.ts +7 -0
  390. package/dist/data/properties-context.d.ts.map +1 -0
  391. package/dist/data/properties-context.js +6 -0
  392. package/dist/data/properties-context.js.map +1 -0
  393. package/dist/data/query-browser/QueryBrowser.types.d.ts +1 -1
  394. package/dist/data/runtime/RuntimeBar.cjs +7 -3
  395. package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
  396. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
  397. package/dist/data/runtime/RuntimeBar.js +7 -3
  398. package/dist/data/runtime/RuntimeBar.js.map +1 -1
  399. package/dist/data/task-copy.cjs +1 -1
  400. package/dist/data/task-copy.cjs.map +1 -1
  401. package/dist/data/task-copy.js +1 -1
  402. package/dist/data/task-copy.js.map +1 -1
  403. package/dist/data/task-resource-summary.cjs +30 -0
  404. package/dist/data/task-resource-summary.cjs.map +1 -0
  405. package/dist/data/task-resource-summary.d.ts +15 -0
  406. package/dist/data/task-resource-summary.d.ts.map +1 -0
  407. package/dist/data/task-resource-summary.js +30 -0
  408. package/dist/data/task-resource-summary.js.map +1 -0
  409. package/dist/data/task-status.cjs +8 -2
  410. package/dist/data/task-status.cjs.map +1 -1
  411. package/dist/data/task-status.d.ts +3 -0
  412. package/dist/data/task-status.d.ts.map +1 -1
  413. package/dist/data/task-status.js +8 -2
  414. package/dist/data/task-status.js.map +1 -1
  415. package/dist/data/task-work-progress.cjs +24 -0
  416. package/dist/data/task-work-progress.cjs.map +1 -0
  417. package/dist/data/task-work-progress.d.ts +21 -0
  418. package/dist/data/task-work-progress.d.ts.map +1 -0
  419. package/dist/data/task-work-progress.js +24 -0
  420. package/dist/data/task-work-progress.js.map +1 -0
  421. package/dist/data/test-runner/TestRunner.d.ts +1 -1
  422. package/dist/data/test-runner/adapter.d.ts +1 -1
  423. package/dist/data/test-runner/context.d.ts +1 -1
  424. package/dist/data/use-data-table-virtual.cjs +73 -0
  425. package/dist/data/use-data-table-virtual.cjs.map +1 -0
  426. package/dist/data/use-data-table-virtual.d.ts +40 -0
  427. package/dist/data/use-data-table-virtual.d.ts.map +1 -0
  428. package/dist/data/use-data-table-virtual.js +73 -0
  429. package/dist/data/use-data-table-virtual.js.map +1 -0
  430. package/dist/data/verification/VerificationResults.d.ts +1 -1
  431. package/dist/data/version-info.cjs +3 -3
  432. package/dist/data/version-info.js +3 -3
  433. package/dist/expressions/lang/attributes.cjs +56 -0
  434. package/dist/expressions/lang/attributes.cjs.map +1 -0
  435. package/dist/expressions/lang/attributes.d.ts +22 -0
  436. package/dist/expressions/lang/attributes.d.ts.map +1 -0
  437. package/dist/expressions/lang/attributes.js +56 -0
  438. package/dist/expressions/lang/attributes.js.map +1 -0
  439. package/dist/expressions/lang/completion.cjs +164 -0
  440. package/dist/expressions/lang/completion.cjs.map +1 -0
  441. package/dist/expressions/lang/completion.d.ts +29 -0
  442. package/dist/expressions/lang/completion.d.ts.map +1 -0
  443. package/dist/expressions/lang/completion.js +164 -0
  444. package/dist/expressions/lang/completion.js.map +1 -0
  445. package/dist/expressions/lang/environment.cjs +115 -0
  446. package/dist/expressions/lang/environment.cjs.map +1 -0
  447. package/dist/expressions/lang/environment.d.ts +54 -0
  448. package/dist/expressions/lang/environment.d.ts.map +1 -0
  449. package/dist/expressions/lang/environment.js +115 -0
  450. package/dist/expressions/lang/environment.js.map +1 -0
  451. package/dist/expressions/lang/generated/conformance.json.d.ts +4962 -0
  452. package/dist/expressions/lang/generated/index.cjs +18 -0
  453. package/dist/expressions/lang/generated/index.cjs.map +1 -0
  454. package/dist/expressions/lang/generated/index.d.ts +9 -0
  455. package/dist/expressions/lang/generated/index.d.ts.map +1 -0
  456. package/dist/expressions/lang/generated/index.js +18 -0
  457. package/dist/expressions/lang/generated/index.js.map +1 -0
  458. package/dist/expressions/lang/generated/languages.json.cjs +18 -0
  459. package/dist/expressions/lang/generated/languages.json.cjs.map +1 -0
  460. package/dist/expressions/lang/generated/languages.json.d.ts +2305 -0
  461. package/dist/expressions/lang/generated/languages.json.js +18 -0
  462. package/dist/expressions/lang/generated/languages.json.js.map +1 -0
  463. package/dist/expressions/lang/generated/spec.json.cjs +12 -0
  464. package/dist/expressions/lang/generated/spec.json.cjs.map +1 -0
  465. package/dist/expressions/lang/generated/spec.json.d.ts +6260 -0
  466. package/dist/expressions/lang/generated/spec.json.js +12 -0
  467. package/dist/expressions/lang/generated/spec.json.js.map +1 -0
  468. package/dist/expressions/lang/hover.cjs +106 -0
  469. package/dist/expressions/lang/hover.cjs.map +1 -0
  470. package/dist/expressions/lang/hover.d.ts +54 -0
  471. package/dist/expressions/lang/hover.d.ts.map +1 -0
  472. package/dist/expressions/lang/hover.js +106 -0
  473. package/dist/expressions/lang/hover.js.map +1 -0
  474. package/dist/expressions/lang/index.cjs +87 -0
  475. package/dist/expressions/lang/index.cjs.map +1 -0
  476. package/dist/expressions/lang/index.d.ts +65 -0
  477. package/dist/expressions/lang/index.d.ts.map +1 -0
  478. package/dist/expressions/lang/index.js +90 -0
  479. package/dist/expressions/lang/index.js.map +1 -0
  480. package/dist/expressions/lang/merge.cjs +52 -0
  481. package/dist/expressions/lang/merge.cjs.map +1 -0
  482. package/dist/expressions/lang/merge.d.ts +12 -0
  483. package/dist/expressions/lang/merge.d.ts.map +1 -0
  484. package/dist/expressions/lang/merge.js +52 -0
  485. package/dist/expressions/lang/merge.js.map +1 -0
  486. package/dist/expressions/lang/prefix.cjs +91 -0
  487. package/dist/expressions/lang/prefix.cjs.map +1 -0
  488. package/dist/expressions/lang/prefix.d.ts +36 -0
  489. package/dist/expressions/lang/prefix.d.ts.map +1 -0
  490. package/dist/expressions/lang/prefix.js +91 -0
  491. package/dist/expressions/lang/prefix.js.map +1 -0
  492. package/dist/expressions/lang/spec.d.ts +13 -0
  493. package/dist/expressions/lang/spec.d.ts.map +1 -0
  494. package/dist/expressions/lang/theme.cjs +97 -0
  495. package/dist/expressions/lang/theme.cjs.map +1 -0
  496. package/dist/expressions/lang/theme.d.ts +6 -0
  497. package/dist/expressions/lang/theme.d.ts.map +1 -0
  498. package/dist/expressions/lang/theme.js +97 -0
  499. package/dist/expressions/lang/theme.js.map +1 -0
  500. package/dist/expressions/lang/types.d.ts +81 -0
  501. package/dist/expressions/lang/types.d.ts.map +1 -0
  502. package/dist/expressions/playground/ExpressionPlayground.cjs +308 -0
  503. package/dist/expressions/playground/ExpressionPlayground.cjs.map +1 -0
  504. package/dist/expressions/playground/ExpressionPlayground.d.ts +42 -0
  505. package/dist/expressions/playground/ExpressionPlayground.d.ts.map +1 -0
  506. package/dist/expressions/playground/ExpressionPlayground.js +291 -0
  507. package/dist/expressions/playground/ExpressionPlayground.js.map +1 -0
  508. package/dist/expressions/playground/RunControls.cjs +51 -0
  509. package/dist/expressions/playground/RunControls.cjs.map +1 -0
  510. package/dist/expressions/playground/RunControls.d.ts +7 -0
  511. package/dist/expressions/playground/RunControls.d.ts.map +1 -0
  512. package/dist/expressions/playground/RunControls.js +51 -0
  513. package/dist/expressions/playground/RunControls.js.map +1 -0
  514. package/dist/expressions/playground/VerticalSplit.cjs +109 -0
  515. package/dist/expressions/playground/VerticalSplit.cjs.map +1 -0
  516. package/dist/expressions/playground/VerticalSplit.d.ts +23 -0
  517. package/dist/expressions/playground/VerticalSplit.d.ts.map +1 -0
  518. package/dist/expressions/playground/VerticalSplit.js +109 -0
  519. package/dist/expressions/playground/VerticalSplit.js.map +1 -0
  520. package/dist/expressions/playground/api.cjs +49 -0
  521. package/dist/expressions/playground/api.cjs.map +1 -0
  522. package/dist/expressions/playground/api.d.ts +53 -0
  523. package/dist/expressions/playground/api.d.ts.map +1 -0
  524. package/dist/expressions/playground/api.js +49 -0
  525. package/dist/expressions/playground/api.js.map +1 -0
  526. package/dist/expressions/playground/languages.cjs +88 -0
  527. package/dist/expressions/playground/languages.cjs.map +1 -0
  528. package/dist/expressions/playground/languages.d.ts +43 -0
  529. package/dist/expressions/playground/languages.d.ts.map +1 -0
  530. package/dist/expressions/playground/languages.js +88 -0
  531. package/dist/expressions/playground/languages.js.map +1 -0
  532. package/dist/expressions/playground/panels/GraphPanel.cjs +72 -0
  533. package/dist/expressions/playground/panels/GraphPanel.cjs.map +1 -0
  534. package/dist/expressions/playground/panels/GraphPanel.d.ts +19 -0
  535. package/dist/expressions/playground/panels/GraphPanel.d.ts.map +1 -0
  536. package/dist/expressions/playground/panels/GraphPanel.js +72 -0
  537. package/dist/expressions/playground/panels/GraphPanel.js.map +1 -0
  538. package/dist/expressions/playground/panels/ResultPanel.cjs +82 -0
  539. package/dist/expressions/playground/panels/ResultPanel.cjs.map +1 -0
  540. package/dist/expressions/playground/panels/ResultPanel.d.ts +11 -0
  541. package/dist/expressions/playground/panels/ResultPanel.d.ts.map +1 -0
  542. package/dist/expressions/playground/panels/ResultPanel.js +82 -0
  543. package/dist/expressions/playground/panels/ResultPanel.js.map +1 -0
  544. package/dist/expressions/playground/panels/SpecPanel.cjs +76 -0
  545. package/dist/expressions/playground/panels/SpecPanel.cjs.map +1 -0
  546. package/dist/expressions/playground/panels/SpecPanel.d.ts +18 -0
  547. package/dist/expressions/playground/panels/SpecPanel.d.ts.map +1 -0
  548. package/dist/expressions/playground/panels/SpecPanel.js +76 -0
  549. package/dist/expressions/playground/panels/SpecPanel.js.map +1 -0
  550. package/dist/expressions/playground/panels/TokensPanel.cjs +89 -0
  551. package/dist/expressions/playground/panels/TokensPanel.cjs.map +1 -0
  552. package/dist/expressions/playground/panels/TokensPanel.d.ts +15 -0
  553. package/dist/expressions/playground/panels/TokensPanel.d.ts.map +1 -0
  554. package/dist/expressions/playground/panels/TokensPanel.js +72 -0
  555. package/dist/expressions/playground/panels/TokensPanel.js.map +1 -0
  556. package/dist/expressions/playground/panels/graphNodes.cjs +35 -0
  557. package/dist/expressions/playground/panels/graphNodes.cjs.map +1 -0
  558. package/dist/expressions/playground/panels/graphNodes.d.ts +19 -0
  559. package/dist/expressions/playground/panels/graphNodes.d.ts.map +1 -0
  560. package/dist/expressions/playground/panels/graphNodes.js +35 -0
  561. package/dist/expressions/playground/panels/graphNodes.js.map +1 -0
  562. package/dist/expressions/playground/runAction.cjs +12 -0
  563. package/dist/expressions/playground/runAction.cjs.map +1 -0
  564. package/dist/expressions/playground/runAction.d.ts +15 -0
  565. package/dist/expressions/playground/runAction.d.ts.map +1 -0
  566. package/dist/expressions/playground/runAction.js +12 -0
  567. package/dist/expressions/playground/runAction.js.map +1 -0
  568. package/dist/expressions/playground/runShortcut.cjs +9 -0
  569. package/dist/expressions/playground/runShortcut.cjs.map +1 -0
  570. package/dist/expressions/playground/runShortcut.d.ts +2 -0
  571. package/dist/expressions/playground/runShortcut.d.ts.map +1 -0
  572. package/dist/expressions/playground/runShortcut.js +9 -0
  573. package/dist/expressions/playground/runShortcut.js.map +1 -0
  574. package/dist/expressions/playground/useEditorTheme.cjs +40 -0
  575. package/dist/expressions/playground/useEditorTheme.cjs.map +1 -0
  576. package/dist/expressions/playground/useEditorTheme.d.ts +16 -0
  577. package/dist/expressions/playground/useEditorTheme.d.ts.map +1 -0
  578. package/dist/expressions/playground/useEditorTheme.js +23 -0
  579. package/dist/expressions/playground/useEditorTheme.js.map +1 -0
  580. package/dist/expressions/playground/useEvaluator.cjs +72 -0
  581. package/dist/expressions/playground/useEvaluator.cjs.map +1 -0
  582. package/dist/expressions/playground/useEvaluator.d.ts +25 -0
  583. package/dist/expressions/playground/useEvaluator.d.ts.map +1 -0
  584. package/dist/expressions/playground/useEvaluator.js +72 -0
  585. package/dist/expressions/playground/useEvaluator.js.map +1 -0
  586. package/dist/expressions/playground/useParsedInput.cjs +22 -0
  587. package/dist/expressions/playground/useParsedInput.cjs.map +1 -0
  588. package/dist/expressions/playground/useParsedInput.d.ts +20 -0
  589. package/dist/expressions/playground/useParsedInput.d.ts.map +1 -0
  590. package/dist/expressions/playground/useParsedInput.js +22 -0
  591. package/dist/expressions/playground/useParsedInput.js.map +1 -0
  592. package/dist/expressions/playground/verticalSplitModel.cjs +11 -0
  593. package/dist/expressions/playground/verticalSplitModel.cjs.map +1 -0
  594. package/dist/expressions/playground/verticalSplitModel.d.ts +3 -0
  595. package/dist/expressions/playground/verticalSplitModel.d.ts.map +1 -0
  596. package/dist/expressions/playground/verticalSplitModel.js +11 -0
  597. package/dist/expressions/playground/verticalSplitModel.js.map +1 -0
  598. package/dist/expressions/playground.cjs +18 -0
  599. package/dist/expressions/playground.cjs.map +1 -0
  600. package/dist/expressions/playground.d.ts +18 -0
  601. package/dist/expressions/playground.d.ts.map +1 -0
  602. package/dist/expressions/playground.js +18 -0
  603. package/dist/expressions/playground.js.map +1 -0
  604. package/dist/expressions.cjs +28 -0
  605. package/dist/expressions.cjs.map +1 -0
  606. package/dist/expressions.d.ts +10 -0
  607. package/dist/expressions.d.ts.map +1 -0
  608. package/dist/expressions.js +28 -0
  609. package/dist/expressions.js.map +1 -0
  610. package/dist/hooks/density-provider.d.ts +1 -1
  611. package/dist/hooks/theme-provider.d.ts +1 -1
  612. package/dist/hooks/use-density.d.ts +1 -1
  613. package/dist/hooks/use-resource-clock.cjs +14 -0
  614. package/dist/hooks/use-resource-clock.cjs.map +1 -0
  615. package/dist/hooks/use-resource-clock.d.ts +2 -0
  616. package/dist/hooks/use-resource-clock.d.ts.map +1 -0
  617. package/dist/hooks/use-resource-clock.js +14 -0
  618. package/dist/hooks/use-resource-clock.js.map +1 -0
  619. package/dist/hooks/use-task-run.cjs +12 -3
  620. package/dist/hooks/use-task-run.cjs.map +1 -1
  621. package/dist/hooks/use-task-run.d.ts.map +1 -1
  622. package/dist/hooks/use-task-run.js +12 -3
  623. package/dist/hooks/use-task-run.js.map +1 -1
  624. package/dist/hooks/use-theme.d.ts +1 -1
  625. package/dist/icons/registry.d.ts +1 -1
  626. package/dist/icons/types.d.ts +1 -1
  627. package/dist/layout/AppShell.d.ts +1 -1
  628. package/dist/layout/AppShell.nav.drag.d.ts +1 -1
  629. package/dist/layout/AppSidebar.d.ts +1 -1
  630. package/dist/layout/Panel.d.ts +1 -1
  631. package/dist/layout/PanelFrame.d.ts +1 -1
  632. package/dist/layout/Section.d.ts +1 -1
  633. package/dist/layout/SplitPane.d.ts +1 -1
  634. package/dist/layout/Tabs.d.ts +1 -1
  635. package/dist/layout/Workspace.d.ts +1 -1
  636. package/dist/layout/Workspace.model.d.ts +1 -1
  637. package/dist/lib/combobox-values.d.ts +1 -1
  638. package/dist/monaco/MonacoEditor.cjs +3 -3
  639. package/dist/monaco/MonacoEditor.cjs.map +1 -1
  640. package/dist/monaco/MonacoEditor.js +2 -2
  641. package/dist/monaco/MonacoEditor.js.map +1 -1
  642. package/dist/monaco/types.d.ts +1 -1
  643. package/dist/monaco/use-monaco-worker.d.ts +1 -1
  644. package/dist/overlay/CellActions.d.ts +1 -1
  645. package/dist/overlay/CommandPalette.d.ts +2 -2
  646. package/dist/overlay/CommandPalette.model.d.ts +1 -1
  647. package/dist/overlay/CommandPaletteList.d.ts +1 -1
  648. package/dist/overlay/DropdownMenu.d.ts +1 -1
  649. package/dist/overlay/HoverCard.d.ts +1 -1
  650. package/dist/overlay/Modal.d.ts +2 -2
  651. package/dist/overlay/Toast.d.ts +1 -1
  652. package/dist/overlay/TourCard.d.ts +1 -1
  653. package/dist/overlay/TourProvider.d.ts +1 -1
  654. package/dist/overlay/dropdownMenuContext.d.ts +1 -1
  655. package/dist/overlay/toast-context.d.ts +2 -2
  656. package/dist/overlay/tour-context.d.ts +1 -1
  657. package/dist/overlay/tour-types.d.ts +1 -1
  658. package/dist/profiles/connections/connectionBrowserModel.d.ts +1 -1
  659. package/dist/profiles/connections/connectionQueryWorkspace.d.ts +1 -1
  660. package/dist/profiles/editor/profileBuilder.d.ts +1 -1
  661. package/dist/profiles/elasticsearch/esParamOperandExtension.d.ts +1 -1
  662. package/dist/profiles/fields/profileFieldControls.d.ts +1 -1
  663. package/dist/profiles/fields/profileFieldIcons.d.ts +1 -1
  664. package/dist/profiles/fields/profileFieldState.d.ts +1 -1
  665. package/dist/profiles/query/jsonPathSample.d.ts +1 -1
  666. package/dist/profiles/query/jsonPathSampleRow.d.ts +1 -1
  667. package/dist/profiles/query/prometheusResults.d.ts +2 -2
  668. package/dist/rpc/EndpointList.d.ts +1 -1
  669. package/dist/rpc/EntityExplorerApp.d.ts +1 -1
  670. package/dist/rpc/OperationCatalog.d.ts +1 -1
  671. package/dist/rpc/OperationEntityContextPicker.d.ts +1 -1
  672. package/dist/rpc/OperationEntityPage.d.ts +1 -1
  673. package/dist/rpc/OperationResultView.d.ts +1 -1
  674. package/dist/rpc/RouterProvider.d.ts +1 -1
  675. package/dist/rpc/SchemaActionForm.d.ts +1 -1
  676. package/dist/rpc/formMetadata.d.ts +1 -1
  677. package/dist/rpc/router.d.ts +1 -1
  678. package/dist/rpc/rpc-story.fixtures.d.ts +1 -1
  679. package/dist/styles.css +1 -1
  680. package/package.json +21 -2
@@ -4,6 +4,7 @@ const jsxRuntime = require("react/jsx-runtime");
4
4
  const react = require("react");
5
5
  const utils = require("../lib/utils.cjs");
6
6
  const Icon = require("../data/Icon.cjs");
7
+ const jsonSchemaFormFilterInput = require("./json-schema-form-filter-input.cjs");
7
8
  const DropdownMenu = require("../overlay/DropdownMenu.cjs");
8
9
  const jsonSchemaFormLayout = require("./json-schema-form-layout.cjs");
9
10
  const jsonSchemaFormErrorDisplay = require("./json-schema-form-error-display.cjs");
@@ -16,8 +17,6 @@ const jsonSchemaFormResolve = require("./json-schema-form-resolve.cjs");
16
17
  const jsonSchemaFormUtils = require("./json-schema-form-utils.cjs");
17
18
  const jsonSchemaFormSize = require("./json-schema-form-size.cjs");
18
19
  const jsonSchemaFormPreferences = require("./json-schema-form-preferences.cjs");
19
- const UiSearch = require("../icons/components/UiSearch.cjs");
20
- const UiClose = require("../icons/components/UiClose.cjs");
21
20
  const UiEllipsisBold = require("../icons/components/UiEllipsisBold.cjs");
22
21
  const UiCheck = require("../icons/components/UiCheck.cjs");
23
22
  const DEFAULT_LABEL_MAX_WIDTH = "40ch";
@@ -27,6 +26,7 @@ function resolveFormLayout(layout, inline, modeOverride) {
27
26
  const mode = modeOverride ?? baseMode;
28
27
  const valueMaxWidth = (layout == null ? void 0 : layout.valueMaxWidth) ?? DEFAULT_VALUE_MAX_WIDTH;
29
28
  const help = (layout == null ? void 0 : layout.help) ? { help: layout.help } : {};
29
+ if (mode === "properties") return { ...layout, mode, ...help };
30
30
  if (mode !== "inline") return { mode: "stacked", valueMaxWidth, ...help };
31
31
  return {
32
32
  mode: "inline",
@@ -46,12 +46,15 @@ function JsonSchemaForm({
46
46
  size = jsonSchemaFormSize.DEFAULT_FORM_SIZE,
47
47
  idPrefix,
48
48
  hideReadOnlyFields = false,
49
+ hideEmpty = false,
50
+ autoSave = false,
49
51
  hiddenKeys,
50
52
  requiredFirst = false,
51
53
  title,
52
54
  pre,
53
55
  post,
54
56
  showPreferencesMenu = true,
57
+ showFilter,
55
58
  persistPreferences = true,
56
59
  preferencesStorageKey = jsonSchemaFormPreferences.DEFAULT_PREFERENCES_STORAGE_KEY,
57
60
  lookupFetcher
@@ -62,6 +65,7 @@ function JsonSchemaForm({
62
65
  const [fieldFilter, setFieldFilter] = react.useState("");
63
66
  const effectiveSize = prefs.size ?? size;
64
67
  const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);
68
+ const filterVisible = showFilter ?? (showPreferencesMenu && resolvedLayout.mode === "properties");
65
69
  const effectiveSortMode = prefs.sortMode ?? (requiredFirst ? "required-first" : "schema");
66
70
  const applyPrefs = (next) => {
67
71
  setPrefs(next);
@@ -76,11 +80,12 @@ function JsonSchemaForm({
76
80
  value: effectiveValue,
77
81
  errors,
78
82
  hideReadOnlyFields,
83
+ hideEmpty,
79
84
  pre: preExtensions,
80
85
  ...hiddenKeys ? { hiddenKeys } : {},
81
86
  ...fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}
82
87
  }),
83
- [effectiveValue, errors, fieldFilter, hiddenKeys, hideReadOnlyFields, preExtensions, resolvedSchema]
88
+ [effectiveValue, errors, fieldFilter, hiddenKeys, hideEmpty, hideReadOnlyFields, preExtensions, resolvedSchema]
84
89
  );
85
90
  react.useEffect(() => {
86
91
  if (!readOnly && effectiveValue !== value) onChange(effectiveValue);
@@ -88,6 +93,8 @@ function JsonSchemaForm({
88
93
  const ctx = {
89
94
  readOnly,
90
95
  hideReadOnlyFields,
96
+ hideEmpty,
97
+ autoSave,
91
98
  layout: resolvedLayout,
92
99
  size: effectiveSize,
93
100
  sortMode: effectiveSortMode,
@@ -106,7 +113,7 @@ function JsonSchemaForm({
106
113
  const inPickerPhase = discKey != null && (effectiveValue[discKey] == null || effectiveValue[discKey] === "");
107
114
  const objectRows = discKey ? null : jsonSchemaFormRender.renderObjectFields(resolvedSchema, effectiveValue, onChange, ctx, hiddenKeys ? { hiddenKeys } : void 0);
108
115
  const noMatches = objectRows != null && objectRows.length === 0 && fieldFilter.trim() !== "";
109
- return /* @__PURE__ */ jsxRuntime.jsx(FormLookupProvider.FormLookupProvider, { ...lookupFetcher ? { fetcher: lookupFetcher } : {}, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: utils.cn("relative flex flex-col", jsonSchemaFormSize.fieldInnerGapClass[effectiveSize]), children: [
116
+ return /* @__PURE__ */ jsxRuntime.jsx(FormLookupProvider.FormLookupProvider, { ...lookupFetcher ? { fetcher: lookupFetcher } : {}, children: /* @__PURE__ */ jsxRuntime.jsxs("div", { "data-json-schema-form": true, className: utils.cn("relative flex flex-col", jsonSchemaFormSize.fieldInnerGapClass[effectiveSize]), children: [
110
117
  showPreferencesMenu && !inPickerPhase && /* @__PURE__ */ jsxRuntime.jsx(
111
118
  PreferencesMenu,
112
119
  {
@@ -114,6 +121,7 @@ function JsonSchemaForm({
114
121
  layoutMode: resolvedLayout.mode,
115
122
  sortMode: effectiveSortMode,
116
123
  fieldFilter,
124
+ filterInMenu: !filterVisible,
117
125
  onFilterChange: setFieldFilter,
118
126
  onSelectSize: (next) => applyPrefs({ ...prefs, size: next }),
119
127
  onSelectLayout: (next) => applyPrefs({ ...prefs, layoutMode: next }),
@@ -121,6 +129,7 @@ function JsonSchemaForm({
121
129
  }
122
130
  ),
123
131
  title && /* @__PURE__ */ jsxRuntime.jsx("h3", { className: utils.cn("font-semibold", jsonSchemaFormSize.labelSizeClass[effectiveSize]), children: title }),
132
+ filterVisible && !inPickerPhase && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "max-w-md pr-9", children: /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormFilterInput.FormFieldFilter, { value: fieldFilter, onChange: setFieldFilter }) }),
124
133
  /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormErrorDisplay.FormErrorSummary, { errors: unmatchedErrors }),
125
134
  /* @__PURE__ */ jsxRuntime.jsx(
126
135
  jsonSchemaFormLayout.FieldsGrid,
@@ -159,7 +168,8 @@ const SIZE_OPTIONS = [
159
168
  ];
160
169
  const LAYOUT_OPTIONS = [
161
170
  { value: "stacked", label: "Stacked" },
162
- { value: "inline", label: "Inline" }
171
+ { value: "inline", label: "Inline" },
172
+ { value: "properties", label: "Properties" }
163
173
  ];
164
174
  const SORT_OPTIONS = [
165
175
  { value: "schema", label: "Schema order" },
@@ -171,6 +181,7 @@ function PreferencesMenu({
171
181
  layoutMode,
172
182
  sortMode,
173
183
  fieldFilter,
184
+ filterInMenu,
174
185
  onFilterChange,
175
186
  onSelectSize,
176
187
  onSelectLayout,
@@ -197,37 +208,7 @@ function PreferencesMenu({
197
208
  }
198
209
  ),
199
210
  children: (closeMenu) => /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
200
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 pb-1.5 pt-1", children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "relative", children: [
201
- /* @__PURE__ */ jsxRuntime.jsx(
202
- Icon.Icon,
203
- {
204
- icon: UiSearch.UiSearch,
205
- className: "pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground"
206
- }
207
- ),
208
- /* @__PURE__ */ jsxRuntime.jsx(
209
- "input",
210
- {
211
- type: "text",
212
- "aria-label": "Filter fields",
213
- placeholder: "Filter fields…",
214
- value: fieldFilter,
215
- onChange: (e) => onFilterChange(e.target.value),
216
- onKeyDown: (e) => e.stopPropagation(),
217
- className: "w-full rounded-md border border-input bg-background py-1 pl-7 pr-6 text-xs text-foreground outline-none placeholder:text-placeholder focus-visible:ring-2 focus-visible:ring-ring"
218
- }
219
- ),
220
- filterActive && /* @__PURE__ */ jsxRuntime.jsx(
221
- "button",
222
- {
223
- type: "button",
224
- "aria-label": "Clear filter",
225
- onClick: () => onFilterChange(""),
226
- className: "absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center text-muted-foreground hover:text-foreground",
227
- children: /* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiClose.UiClose, className: "text-xs" })
228
- }
229
- )
230
- ] }) }),
211
+ filterInMenu && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "px-2 pb-1.5 pt-1", children: /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormFilterInput.FormFieldFilter, { value: fieldFilter, onChange: onFilterChange }) }),
231
212
  /* @__PURE__ */ jsxRuntime.jsx(PreferenceSection, { title: "Size" }),
232
213
  SIZE_OPTIONS.map((opt) => /* @__PURE__ */ jsxRuntime.jsx(
233
214
  PreferenceItem,
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSchemaForm.cjs","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiClose, UiEllipsisBold, UiSearch } from \"../icons\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { FormErrorSummary } from \"./json-schema-form-error-display\";\nimport { unmatchedFormErrors } from \"./json-schema-form-errors\";\nimport { FormLookupProvider } from \"./FormLookupProvider\";\nimport { DiscriminatedForm } from \"./json-schema-form-discriminator\";\nimport { rehydrateRefs } from \"./json-schema-form-refs\";\nimport { renderApi, renderObjectFields } from \"./json-schema-form-render\";\nimport { applySchemaDefaults } from \"./json-schema-form-resolve\";\nimport {\n cssLength,\n DEFAULT_COLUMN_MIN_WIDTH,\n normalizeColumns,\n} from \"./json-schema-form-utils\";\nimport { DEFAULT_FORM_SIZE, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport {\n DEFAULT_PREFERENCES_STORAGE_KEY,\n readPreferences,\n writePreferences,\n type FormPreferences,\n type LayoutMode,\n type SortMode,\n} from \"./json-schema-form-preferences\";\nimport type { FormLayout, JsonSchemaFormProps, RenderContext } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props plus an optional menu-driven\n// `modeOverride` to a single resolved FormLayout. An explicit `layout` sets the\n// base; `inline` is the shorthand for it; `modeOverride` (from the preferences\n// menu) wins over both but only flips the mode — width caps from `layout` are\n// preserved. Both modes fill valueMaxWidth (inline value column / stacked\n// label+value stack); the label cap only applies inline.\nfunction resolveFormLayout(\n layout: FormLayout | undefined,\n inline: boolean,\n modeOverride: LayoutMode | undefined,\n): FormLayout {\n const baseMode = layout?.mode ?? (inline ? \"inline\" : \"stacked\");\n const mode = modeOverride ?? baseMode;\n const valueMaxWidth = layout?.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH;\n // `help` is orthogonal to mode, so it survives a menu-driven mode flip.\n const help = layout?.help ? { help: layout.help } : {};\n if (mode !== \"inline\") return { mode: \"stacked\", valueMaxWidth, ...help };\n return {\n mode: \"inline\",\n labelMaxWidth: layout?.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth,\n ...help,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n errors = [],\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n showPreferencesMenu = true,\n persistPreferences = true,\n preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY,\n lookupFetcher,\n}: JsonSchemaFormProps) {\n // When the menu is hidden, never touch localStorage and start from an empty\n // override so behaviour is identical to before this feature existed.\n const [prefs, setPrefs] = useState<FormPreferences>(() =>\n showPreferencesMenu && persistPreferences ? readPreferences(preferencesStorageKey) : {},\n );\n // The field filter is transient view state (a \"find\" over the fields), never\n // persisted — reopening the form should never start with fields hidden.\n const [fieldFilter, setFieldFilter] = useState(\"\");\n\n const effectiveSize = prefs.size ?? size;\n const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);\n // The `requiredFirst` prop sets the base sort; a menu selection overrides it.\n const effectiveSortMode = prefs.sortMode ?? (requiredFirst ? \"required-first\" : \"schema\");\n\n const applyPrefs = (next: FormPreferences) => {\n setPrefs(next);\n if (persistPreferences) writePreferences(preferencesStorageKey, next);\n };\n\n // A bundled schema (components under `$defs`, referenced by local `#/$defs`\n // pointers) is resolved once into a self-contained tree the renderer walks\n // directly; a non-bundled schema passes through untouched.\n const resolvedSchema = useMemo(() => rehydrateRefs(schema), [schema]);\n const effectiveValue = useMemo(() => applySchemaDefaults(resolvedSchema, value), [resolvedSchema, value]);\n const preExtensions = pre ?? [];\n const unmatchedErrors = useMemo(\n () =>\n unmatchedFormErrors({\n schema: resolvedSchema,\n value: effectiveValue,\n errors,\n hideReadOnlyFields,\n pre: preExtensions,\n ...(hiddenKeys ? { hiddenKeys } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n }),\n [effectiveValue, errors, fieldFilter, hiddenKeys, hideReadOnlyFields, preExtensions, resolvedSchema],\n );\n // Defaults are part of the submitted form value, not only presentation. This\n // is especially important for required discriminator fields whose default\n // selects an if/then branch.\n useEffect(() => {\n if (!readOnly && effectiveValue !== value) onChange(effectiveValue);\n }, [effectiveValue, onChange, readOnly, value]);\n\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n layout: resolvedLayout,\n size: effectiveSize,\n sortMode: effectiveSortMode,\n pre: preExtensions,\n post: post ?? [],\n rootValue: effectiveValue,\n onRootChange: onChange,\n instancePath: \"\",\n errors,\n depth: 0,\n render: renderApi,\n ...(idPrefix ? { idPrefix } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n };\n // A schema may name a discriminator property whose value selects a \"kind\"; the\n // form then runs a two-phase pick-then-fill flow (see DiscriminatedForm).\n const discKey = typeof resolvedSchema[\"x-discriminator\"] === \"string\" ? resolvedSchema[\"x-discriminator\"] : undefined;\n const inPickerPhase = discKey != null && (effectiveValue[discKey] == null || effectiveValue[discKey] === \"\");\n\n const objectRows = discKey\n ? null\n : renderObjectFields(resolvedSchema, effectiveValue, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n const noMatches = objectRows != null && objectRows.length === 0 && fieldFilter.trim() !== \"\";\n\n return (\n <FormLookupProvider {...(lookupFetcher ? { fetcher: lookupFetcher } : {})}>\n <div className={cn(\"relative flex flex-col\", fieldInnerGapClass[effectiveSize])}>\n {showPreferencesMenu && !inPickerPhase && (\n <PreferencesMenu\n size={effectiveSize}\n layoutMode={resolvedLayout.mode}\n sortMode={effectiveSortMode}\n fieldFilter={fieldFilter}\n onFilterChange={setFieldFilter}\n onSelectSize={(next) => applyPrefs({ ...prefs, size: next })}\n onSelectLayout={(next) => applyPrefs({ ...prefs, layoutMode: next })}\n onSelectSort={(next) => applyPrefs({ ...prefs, sortMode: next })}\n />\n )}\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[effectiveSize])}>{title}</h3>}\n <FormErrorSummary errors={unmatchedErrors} />\n <FieldsGrid\n layout={resolvedLayout}\n size={effectiveSize}\n columns={normalizeColumns(resolvedSchema[\"x-columns\"])}\n columnMinWidth={cssLength(resolvedSchema[\"x-column-min-width\"], DEFAULT_COLUMN_MIN_WIDTH)}\n {...(typeof resolvedSchema[\"x-columns-max-width\"] === \"string\"\n ? { columnsMaxWidth: resolvedSchema[\"x-columns-max-width\"] }\n : {})}\n {...(typeof resolvedSchema[\"x-classes\"] === \"string\" ? { className: resolvedSchema[\"x-classes\"] } : {})}\n >\n {discKey ? (\n <DiscriminatedForm\n schema={resolvedSchema}\n value={effectiveValue}\n onChange={onChange}\n ctx={ctx}\n discKey={discKey}\n />\n ) : (\n objectRows\n )}\n </FieldsGrid>\n {noMatches && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[effectiveSize])}>\n No fields match “{fieldFilter.trim()}”.\n </p>\n )}\n </div>\n </FormLookupProvider>\n );\n}\n\nconst SIZE_OPTIONS: { value: FormSize; label: string }[] = [\n { value: \"xs\", label: \"Extra small\" },\n { value: \"sm\", label: \"Small\" },\n { value: \"md\", label: \"Medium\" },\n { value: \"lg\", label: \"Large\" },\n { value: \"xl\", label: \"Extra large\" },\n];\n\nconst LAYOUT_OPTIONS: { value: LayoutMode; label: string }[] = [\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"inline\", label: \"Inline\" },\n];\n\nconst SORT_OPTIONS: { value: SortMode; label: string }[] = [\n { value: \"schema\", label: \"Schema order\" },\n { value: \"required-first\", label: \"Required first\" },\n { value: \"priority\", label: \"Required & filled first\" },\n];\n\n// PreferencesMenu is the compact top-right ellipsis menu controlling this form's\n// size, layout, sort, and a live field filter. Selecting an option fires the\n// matching callback and closes the menu; typing in the filter updates fields\n// live without closing. The parent decides whether to persist.\nfunction PreferencesMenu({\n size,\n layoutMode,\n sortMode,\n fieldFilter,\n onFilterChange,\n onSelectSize,\n onSelectLayout,\n onSelectSort,\n}: {\n size: FormSize;\n layoutMode: LayoutMode;\n sortMode: SortMode;\n fieldFilter: string;\n onFilterChange: (value: string) => void;\n onSelectSize: (size: FormSize) => void;\n onSelectLayout: (mode: LayoutMode) => void;\n onSelectSort: (mode: SortMode) => void;\n}) {\n const filterActive = fieldFilter.trim() !== \"\";\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Form display options\"\n className=\"absolute right-0 top-0 z-10\"\n trigger={\n <button\n type=\"button\"\n aria-label=\"Form display options\"\n aria-haspopup=\"menu\"\n className={cn(\n \"inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n filterActive ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon icon={UiEllipsisBold} className=\"text-lg\" />\n </button>\n }\n >\n {(closeMenu) => (\n <>\n <div className=\"px-2 pb-1.5 pt-1\">\n <div className=\"relative\">\n <Icon\n icon={UiSearch}\n className=\"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground\"\n />\n <input\n type=\"text\"\n aria-label=\"Filter fields\"\n placeholder=\"Filter fields…\"\n value={fieldFilter}\n onChange={(e) => onFilterChange(e.target.value)}\n // Keep arrow/space/enter keys inside the input instead of driving\n // the menu's list navigation or closing it.\n onKeyDown={(e) => e.stopPropagation()}\n className=\"w-full rounded-md border border-input bg-background py-1 pl-7 pr-6 text-xs text-foreground outline-none placeholder:text-placeholder focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {filterActive && (\n <button\n type=\"button\"\n aria-label=\"Clear filter\"\n onClick={() => onFilterChange(\"\")}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center text-muted-foreground hover:text-foreground\"\n >\n <Icon icon={UiClose} className=\"text-xs\" />\n </button>\n )}\n </div>\n </div>\n <PreferenceSection title=\"Size\" />\n {SIZE_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === size}\n onSelect={() => {\n onSelectSize(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Layout\" />\n {LAYOUT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === layoutMode}\n onSelect={() => {\n onSelectLayout(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Sort\" />\n {SORT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === sortMode}\n onSelect={() => {\n onSelectSort(opt.value);\n closeMenu();\n }}\n />\n ))}\n </>\n )}\n </DropdownMenu>\n );\n}\n\nfunction PreferenceSection({ title }: { title: string }) {\n return (\n <div className=\"px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n );\n}\n\nfunction PreferenceItem({ label, selected, onSelect }: { label: string; selected: boolean; onSelect: () => void }) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n onClick={onSelect}\n >\n <span className=\"flex w-3.5 shrink-0 justify-center\">\n {selected && <Icon icon={UiCheck} className=\"text-xs\" />}\n </span>\n {label}\n </button>\n );\n}\n"],"names":["DEFAULT_FORM_SIZE","DEFAULT_PREFERENCES_STORAGE_KEY","useState","readPreferences","writePreferences","useMemo","rehydrateRefs","applySchemaDefaults","unmatchedFormErrors","useEffect","renderApi","renderObjectFields","FormLookupProvider","jsxs","cn","fieldInnerGapClass","jsx","labelSizeClass","FormErrorSummary","FieldsGrid","normalizeColumns","cssLength","DEFAULT_COLUMN_MIN_WIDTH","DiscriminatedForm","DropdownMenu","Icon","UiEllipsisBold","Fragment","UiSearch","UiClose","UiCheck"],"mappings":"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"}
1
+ {"version":3,"file":"JsonSchemaForm.cjs","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiEllipsisBold } from \"../icons\";\nimport { FormFieldFilter } from \"./json-schema-form-filter-input\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { FormErrorSummary } from \"./json-schema-form-error-display\";\nimport { unmatchedFormErrors } from \"./json-schema-form-errors\";\nimport { FormLookupProvider } from \"./FormLookupProvider\";\nimport { DiscriminatedForm } from \"./json-schema-form-discriminator\";\nimport { rehydrateRefs } from \"./json-schema-form-refs\";\nimport { renderApi, renderObjectFields } from \"./json-schema-form-render\";\nimport { applySchemaDefaults } from \"./json-schema-form-resolve\";\nimport {\n cssLength,\n DEFAULT_COLUMN_MIN_WIDTH,\n normalizeColumns,\n} from \"./json-schema-form-utils\";\nimport { DEFAULT_FORM_SIZE, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport {\n DEFAULT_PREFERENCES_STORAGE_KEY,\n readPreferences,\n writePreferences,\n type FormPreferences,\n type LayoutMode,\n type SortMode,\n} from \"./json-schema-form-preferences\";\nimport type { FormLayout, JsonSchemaFormProps, RenderContext } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props plus an optional menu-driven\n// `modeOverride` to a single resolved FormLayout. An explicit `layout` sets the\n// base; `inline` is the shorthand for it; `modeOverride` (from the preferences\n// menu) wins over both but only flips the mode — width caps from `layout` are\n// preserved. Both modes fill valueMaxWidth (inline value column / stacked\n// label+value stack); the label cap only applies inline.\nfunction resolveFormLayout(\n layout: FormLayout | undefined,\n inline: boolean,\n modeOverride: LayoutMode | undefined,\n): FormLayout {\n const baseMode = layout?.mode ?? (inline ? \"inline\" : \"stacked\");\n const mode = modeOverride ?? baseMode;\n const valueMaxWidth = layout?.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH;\n // `help` is orthogonal to mode, so it survives a menu-driven mode flip.\n const help = layout?.help ? { help: layout.help } : {};\n if (mode === \"properties\") return { ...layout, mode, ...help };\n if (mode !== \"inline\") return { mode: \"stacked\", valueMaxWidth, ...help };\n return {\n mode: \"inline\",\n labelMaxWidth: layout?.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth,\n ...help,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n errors = [],\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hideEmpty = false,\n autoSave = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n showPreferencesMenu = true,\n showFilter,\n persistPreferences = true,\n preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY,\n lookupFetcher,\n}: JsonSchemaFormProps) {\n // When the menu is hidden, never touch localStorage and start from an empty\n // override so behaviour is identical to before this feature existed.\n const [prefs, setPrefs] = useState<FormPreferences>(() =>\n showPreferencesMenu && persistPreferences ? readPreferences(preferencesStorageKey) : {},\n );\n // The field filter is transient view state (a \"find\" over the fields), never\n // persisted — reopening the form should never start with fields hidden.\n const [fieldFilter, setFieldFilter] = useState(\"\");\n\n const effectiveSize = prefs.size ?? size;\n const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);\n const filterVisible = showFilter ?? (showPreferencesMenu && resolvedLayout.mode === \"properties\");\n // The `requiredFirst` prop sets the base sort; a menu selection overrides it.\n const effectiveSortMode = prefs.sortMode ?? (requiredFirst ? \"required-first\" : \"schema\");\n\n const applyPrefs = (next: FormPreferences) => {\n setPrefs(next);\n if (persistPreferences) writePreferences(preferencesStorageKey, next);\n };\n\n // A bundled schema (components under `$defs`, referenced by local `#/$defs`\n // pointers) is resolved once into a self-contained tree the renderer walks\n // directly; a non-bundled schema passes through untouched.\n const resolvedSchema = useMemo(() => rehydrateRefs(schema), [schema]);\n const effectiveValue = useMemo(() => applySchemaDefaults(resolvedSchema, value), [resolvedSchema, value]);\n const preExtensions = pre ?? [];\n const unmatchedErrors = useMemo(\n () =>\n unmatchedFormErrors({\n schema: resolvedSchema,\n value: effectiveValue,\n errors,\n hideReadOnlyFields,\n hideEmpty,\n pre: preExtensions,\n ...(hiddenKeys ? { hiddenKeys } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n }),\n [effectiveValue, errors, fieldFilter, hiddenKeys, hideEmpty, hideReadOnlyFields, preExtensions, resolvedSchema],\n );\n // Defaults are part of the submitted form value, not only presentation. This\n // is especially important for required discriminator fields whose default\n // selects an if/then branch.\n useEffect(() => {\n if (!readOnly && effectiveValue !== value) onChange(effectiveValue);\n }, [effectiveValue, onChange, readOnly, value]);\n\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n hideEmpty,\n autoSave,\n layout: resolvedLayout,\n size: effectiveSize,\n sortMode: effectiveSortMode,\n pre: preExtensions,\n post: post ?? [],\n rootValue: effectiveValue,\n onRootChange: onChange,\n instancePath: \"\",\n errors,\n depth: 0,\n render: renderApi,\n ...(idPrefix ? { idPrefix } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n };\n // A schema may name a discriminator property whose value selects a \"kind\"; the\n // form then runs a two-phase pick-then-fill flow (see DiscriminatedForm).\n const discKey = typeof resolvedSchema[\"x-discriminator\"] === \"string\" ? resolvedSchema[\"x-discriminator\"] : undefined;\n const inPickerPhase = discKey != null && (effectiveValue[discKey] == null || effectiveValue[discKey] === \"\");\n\n const objectRows = discKey\n ? null\n : renderObjectFields(resolvedSchema, effectiveValue, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n const noMatches = objectRows != null && objectRows.length === 0 && fieldFilter.trim() !== \"\";\n\n return (\n <FormLookupProvider {...(lookupFetcher ? { fetcher: lookupFetcher } : {})}>\n <div data-json-schema-form className={cn(\"relative flex flex-col\", fieldInnerGapClass[effectiveSize])}>\n {showPreferencesMenu && !inPickerPhase && (\n <PreferencesMenu\n size={effectiveSize}\n layoutMode={resolvedLayout.mode}\n sortMode={effectiveSortMode}\n fieldFilter={fieldFilter}\n filterInMenu={!filterVisible}\n onFilterChange={setFieldFilter}\n onSelectSize={(next) => applyPrefs({ ...prefs, size: next })}\n onSelectLayout={(next) => applyPrefs({ ...prefs, layoutMode: next })}\n onSelectSort={(next) => applyPrefs({ ...prefs, sortMode: next })}\n />\n )}\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[effectiveSize])}>{title}</h3>}\n {filterVisible && !inPickerPhase && (\n <div className=\"max-w-md pr-9\">\n <FormFieldFilter value={fieldFilter} onChange={setFieldFilter} />\n </div>\n )}\n <FormErrorSummary errors={unmatchedErrors} />\n <FieldsGrid\n layout={resolvedLayout}\n size={effectiveSize}\n columns={normalizeColumns(resolvedSchema[\"x-columns\"])}\n columnMinWidth={cssLength(resolvedSchema[\"x-column-min-width\"], DEFAULT_COLUMN_MIN_WIDTH)}\n {...(typeof resolvedSchema[\"x-columns-max-width\"] === \"string\"\n ? { columnsMaxWidth: resolvedSchema[\"x-columns-max-width\"] }\n : {})}\n {...(typeof resolvedSchema[\"x-classes\"] === \"string\" ? { className: resolvedSchema[\"x-classes\"] } : {})}\n >\n {discKey ? (\n <DiscriminatedForm\n schema={resolvedSchema}\n value={effectiveValue}\n onChange={onChange}\n ctx={ctx}\n discKey={discKey}\n />\n ) : (\n objectRows\n )}\n </FieldsGrid>\n {noMatches && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[effectiveSize])}>\n No fields match “{fieldFilter.trim()}”.\n </p>\n )}\n </div>\n </FormLookupProvider>\n );\n}\n\nconst SIZE_OPTIONS: { value: FormSize; label: string }[] = [\n { value: \"xs\", label: \"Extra small\" },\n { value: \"sm\", label: \"Small\" },\n { value: \"md\", label: \"Medium\" },\n { value: \"lg\", label: \"Large\" },\n { value: \"xl\", label: \"Extra large\" },\n];\n\nconst LAYOUT_OPTIONS: { value: LayoutMode; label: string }[] = [\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"inline\", label: \"Inline\" },\n { value: \"properties\", label: \"Properties\" },\n];\n\nconst SORT_OPTIONS: { value: SortMode; label: string }[] = [\n { value: \"schema\", label: \"Schema order\" },\n { value: \"required-first\", label: \"Required first\" },\n { value: \"priority\", label: \"Required & filled first\" },\n];\n\n// PreferencesMenu is the compact top-right ellipsis menu controlling this form's\n// size, layout, sort, and a live field filter. Selecting an option fires the\n// matching callback and closes the menu; typing in the filter updates fields\n// live without closing. The parent decides whether to persist.\nfunction PreferencesMenu({\n size,\n layoutMode,\n sortMode,\n fieldFilter,\n filterInMenu,\n onFilterChange,\n onSelectSize,\n onSelectLayout,\n onSelectSort,\n}: {\n size: FormSize;\n layoutMode: LayoutMode;\n sortMode: SortMode;\n fieldFilter: string;\n filterInMenu: boolean;\n onFilterChange: (value: string) => void;\n onSelectSize: (size: FormSize) => void;\n onSelectLayout: (mode: LayoutMode) => void;\n onSelectSort: (mode: SortMode) => void;\n}) {\n const filterActive = fieldFilter.trim() !== \"\";\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Form display options\"\n className=\"absolute right-0 top-0 z-10\"\n trigger={\n <button\n type=\"button\"\n aria-label=\"Form display options\"\n aria-haspopup=\"menu\"\n className={cn(\n \"inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n filterActive ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon icon={UiEllipsisBold} className=\"text-lg\" />\n </button>\n }\n >\n {(closeMenu) => (\n <>\n {filterInMenu && <div className=\"px-2 pb-1.5 pt-1\">\n <FormFieldFilter value={fieldFilter} onChange={onFilterChange} />\n </div>}\n <PreferenceSection title=\"Size\" />\n {SIZE_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === size}\n onSelect={() => {\n onSelectSize(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Layout\" />\n {LAYOUT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === layoutMode}\n onSelect={() => {\n onSelectLayout(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Sort\" />\n {SORT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === sortMode}\n onSelect={() => {\n onSelectSort(opt.value);\n closeMenu();\n }}\n />\n ))}\n </>\n )}\n </DropdownMenu>\n );\n}\n\nfunction PreferenceSection({ title }: { title: string }) {\n return (\n <div className=\"px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n );\n}\n\nfunction PreferenceItem({ label, selected, onSelect }: { label: string; selected: boolean; onSelect: () => void }) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n onClick={onSelect}\n >\n <span className=\"flex w-3.5 shrink-0 justify-center\">\n {selected && <Icon icon={UiCheck} className=\"text-xs\" />}\n </span>\n {label}\n </button>\n );\n}\n"],"names":["DEFAULT_FORM_SIZE","DEFAULT_PREFERENCES_STORAGE_KEY","useState","readPreferences","writePreferences","useMemo","rehydrateRefs","applySchemaDefaults","unmatchedFormErrors","useEffect","renderApi","renderObjectFields","jsx","FormLookupProvider","cn","fieldInnerGapClass","labelSizeClass","FormFieldFilter","FormErrorSummary","FieldsGrid","normalizeColumns","cssLength","DEFAULT_COLUMN_MIN_WIDTH","DiscriminatedForm","DropdownMenu","Icon","UiEllipsisBold","jsxs","Fragment","UiCheck"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
1
  import { JsonSchemaFormProps } from './json-schema-form-types';
2
- export declare function JsonSchemaForm({ schema, value, onChange, errors, readOnly, inline, layout, size, idPrefix, hideReadOnlyFields, hiddenKeys, requiredFirst, title, pre, post, showPreferencesMenu, persistPreferences, preferencesStorageKey, lookupFetcher, }: JsonSchemaFormProps): import("react").JSX.Element;
2
+ export declare function JsonSchemaForm({ schema, value, onChange, errors, readOnly, inline, layout, size, idPrefix, hideReadOnlyFields, hideEmpty, autoSave, hiddenKeys, requiredFirst, title, pre, post, showPreferencesMenu, showFilter, persistPreferences, preferencesStorageKey, lookupFetcher, }: JsonSchemaFormProps): import("react").JSX.Element;
3
3
  //# sourceMappingURL=JsonSchemaForm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSchemaForm.d.ts","sourceRoot":"","sources":["../../src/components/JsonSchemaForm.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAc,mBAAmB,EAAiB,MAAM,0BAA0B,CAAC;AAmC/F,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAW,EACX,QAAgB,EAChB,MAAc,EACd,MAAM,EACN,IAAwB,EACxB,QAAQ,EACR,kBAA0B,EAC1B,UAAU,EACV,aAAqB,EACrB,KAAK,EACL,GAAG,EACH,IAAI,EACJ,mBAA0B,EAC1B,kBAAyB,EACzB,qBAAuD,EACvD,aAAa,GACd,EAAE,mBAAmB,+BAwHrB"}
1
+ {"version":3,"file":"JsonSchemaForm.d.ts","sourceRoot":"","sources":["../../src/components/JsonSchemaForm.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EAAc,mBAAmB,EAAiB,MAAM,0BAA0B,CAAC;AAoC/F,wBAAgB,cAAc,CAAC,EAC7B,MAAM,EACN,KAAK,EACL,QAAQ,EACR,MAAW,EACX,QAAgB,EAChB,MAAc,EACd,MAAM,EACN,IAAwB,EACxB,QAAQ,EACR,kBAA0B,EAC1B,SAAiB,EACjB,QAAgB,EAChB,UAAU,EACV,aAAqB,EACrB,KAAK,EACL,GAAG,EACH,IAAI,EACJ,mBAA0B,EAC1B,UAAU,EACV,kBAAyB,EACzB,qBAAuD,EACvD,aAAa,GACd,EAAE,mBAAmB,+BAkIrB"}
@@ -2,6 +2,7 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import { useState, useMemo, useEffect } from "react";
3
3
  import { cn } from "../lib/utils.js";
4
4
  import { Icon } from "../data/Icon.js";
5
+ import { FormFieldFilter } from "./json-schema-form-filter-input.js";
5
6
  import { DropdownMenu } from "../overlay/DropdownMenu.js";
6
7
  import { FieldsGrid } from "./json-schema-form-layout.js";
7
8
  import { FormErrorSummary } from "./json-schema-form-error-display.js";
@@ -14,8 +15,6 @@ import { applySchemaDefaults } from "./json-schema-form-resolve.js";
14
15
  import { cssLength, normalizeColumns, DEFAULT_COLUMN_MIN_WIDTH } from "./json-schema-form-utils.js";
15
16
  import { DEFAULT_FORM_SIZE, labelSizeClass, fieldInnerGapClass } from "./json-schema-form-size.js";
16
17
  import { readPreferences, DEFAULT_PREFERENCES_STORAGE_KEY, writePreferences } from "./json-schema-form-preferences.js";
17
- import { UiSearch } from "../icons/components/UiSearch.js";
18
- import { UiClose } from "../icons/components/UiClose.js";
19
18
  import { UiEllipsisBold } from "../icons/components/UiEllipsisBold.js";
20
19
  import { UiCheck } from "../icons/components/UiCheck.js";
21
20
  const DEFAULT_LABEL_MAX_WIDTH = "40ch";
@@ -25,6 +24,7 @@ function resolveFormLayout(layout, inline, modeOverride) {
25
24
  const mode = modeOverride ?? baseMode;
26
25
  const valueMaxWidth = (layout == null ? void 0 : layout.valueMaxWidth) ?? DEFAULT_VALUE_MAX_WIDTH;
27
26
  const help = (layout == null ? void 0 : layout.help) ? { help: layout.help } : {};
27
+ if (mode === "properties") return { ...layout, mode, ...help };
28
28
  if (mode !== "inline") return { mode: "stacked", valueMaxWidth, ...help };
29
29
  return {
30
30
  mode: "inline",
@@ -44,12 +44,15 @@ function JsonSchemaForm({
44
44
  size = DEFAULT_FORM_SIZE,
45
45
  idPrefix,
46
46
  hideReadOnlyFields = false,
47
+ hideEmpty = false,
48
+ autoSave = false,
47
49
  hiddenKeys,
48
50
  requiredFirst = false,
49
51
  title,
50
52
  pre,
51
53
  post,
52
54
  showPreferencesMenu = true,
55
+ showFilter,
53
56
  persistPreferences = true,
54
57
  preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY,
55
58
  lookupFetcher
@@ -60,6 +63,7 @@ function JsonSchemaForm({
60
63
  const [fieldFilter, setFieldFilter] = useState("");
61
64
  const effectiveSize = prefs.size ?? size;
62
65
  const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);
66
+ const filterVisible = showFilter ?? (showPreferencesMenu && resolvedLayout.mode === "properties");
63
67
  const effectiveSortMode = prefs.sortMode ?? (requiredFirst ? "required-first" : "schema");
64
68
  const applyPrefs = (next) => {
65
69
  setPrefs(next);
@@ -74,11 +78,12 @@ function JsonSchemaForm({
74
78
  value: effectiveValue,
75
79
  errors,
76
80
  hideReadOnlyFields,
81
+ hideEmpty,
77
82
  pre: preExtensions,
78
83
  ...hiddenKeys ? { hiddenKeys } : {},
79
84
  ...fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}
80
85
  }),
81
- [effectiveValue, errors, fieldFilter, hiddenKeys, hideReadOnlyFields, preExtensions, resolvedSchema]
86
+ [effectiveValue, errors, fieldFilter, hiddenKeys, hideEmpty, hideReadOnlyFields, preExtensions, resolvedSchema]
82
87
  );
83
88
  useEffect(() => {
84
89
  if (!readOnly && effectiveValue !== value) onChange(effectiveValue);
@@ -86,6 +91,8 @@ function JsonSchemaForm({
86
91
  const ctx = {
87
92
  readOnly,
88
93
  hideReadOnlyFields,
94
+ hideEmpty,
95
+ autoSave,
89
96
  layout: resolvedLayout,
90
97
  size: effectiveSize,
91
98
  sortMode: effectiveSortMode,
@@ -104,7 +111,7 @@ function JsonSchemaForm({
104
111
  const inPickerPhase = discKey != null && (effectiveValue[discKey] == null || effectiveValue[discKey] === "");
105
112
  const objectRows = discKey ? null : renderObjectFields(resolvedSchema, effectiveValue, onChange, ctx, hiddenKeys ? { hiddenKeys } : void 0);
106
113
  const noMatches = objectRows != null && objectRows.length === 0 && fieldFilter.trim() !== "";
107
- return /* @__PURE__ */ jsx(FormLookupProvider, { ...lookupFetcher ? { fetcher: lookupFetcher } : {}, children: /* @__PURE__ */ jsxs("div", { className: cn("relative flex flex-col", fieldInnerGapClass[effectiveSize]), children: [
114
+ return /* @__PURE__ */ jsx(FormLookupProvider, { ...lookupFetcher ? { fetcher: lookupFetcher } : {}, children: /* @__PURE__ */ jsxs("div", { "data-json-schema-form": true, className: cn("relative flex flex-col", fieldInnerGapClass[effectiveSize]), children: [
108
115
  showPreferencesMenu && !inPickerPhase && /* @__PURE__ */ jsx(
109
116
  PreferencesMenu,
110
117
  {
@@ -112,6 +119,7 @@ function JsonSchemaForm({
112
119
  layoutMode: resolvedLayout.mode,
113
120
  sortMode: effectiveSortMode,
114
121
  fieldFilter,
122
+ filterInMenu: !filterVisible,
115
123
  onFilterChange: setFieldFilter,
116
124
  onSelectSize: (next) => applyPrefs({ ...prefs, size: next }),
117
125
  onSelectLayout: (next) => applyPrefs({ ...prefs, layoutMode: next }),
@@ -119,6 +127,7 @@ function JsonSchemaForm({
119
127
  }
120
128
  ),
121
129
  title && /* @__PURE__ */ jsx("h3", { className: cn("font-semibold", labelSizeClass[effectiveSize]), children: title }),
130
+ filterVisible && !inPickerPhase && /* @__PURE__ */ jsx("div", { className: "max-w-md pr-9", children: /* @__PURE__ */ jsx(FormFieldFilter, { value: fieldFilter, onChange: setFieldFilter }) }),
122
131
  /* @__PURE__ */ jsx(FormErrorSummary, { errors: unmatchedErrors }),
123
132
  /* @__PURE__ */ jsx(
124
133
  FieldsGrid,
@@ -157,7 +166,8 @@ const SIZE_OPTIONS = [
157
166
  ];
158
167
  const LAYOUT_OPTIONS = [
159
168
  { value: "stacked", label: "Stacked" },
160
- { value: "inline", label: "Inline" }
169
+ { value: "inline", label: "Inline" },
170
+ { value: "properties", label: "Properties" }
161
171
  ];
162
172
  const SORT_OPTIONS = [
163
173
  { value: "schema", label: "Schema order" },
@@ -169,6 +179,7 @@ function PreferencesMenu({
169
179
  layoutMode,
170
180
  sortMode,
171
181
  fieldFilter,
182
+ filterInMenu,
172
183
  onFilterChange,
173
184
  onSelectSize,
174
185
  onSelectLayout,
@@ -195,37 +206,7 @@ function PreferencesMenu({
195
206
  }
196
207
  ),
197
208
  children: (closeMenu) => /* @__PURE__ */ jsxs(Fragment, { children: [
198
- /* @__PURE__ */ jsx("div", { className: "px-2 pb-1.5 pt-1", children: /* @__PURE__ */ jsxs("div", { className: "relative", children: [
199
- /* @__PURE__ */ jsx(
200
- Icon,
201
- {
202
- icon: UiSearch,
203
- className: "pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground"
204
- }
205
- ),
206
- /* @__PURE__ */ jsx(
207
- "input",
208
- {
209
- type: "text",
210
- "aria-label": "Filter fields",
211
- placeholder: "Filter fields…",
212
- value: fieldFilter,
213
- onChange: (e) => onFilterChange(e.target.value),
214
- onKeyDown: (e) => e.stopPropagation(),
215
- className: "w-full rounded-md border border-input bg-background py-1 pl-7 pr-6 text-xs text-foreground outline-none placeholder:text-placeholder focus-visible:ring-2 focus-visible:ring-ring"
216
- }
217
- ),
218
- filterActive && /* @__PURE__ */ jsx(
219
- "button",
220
- {
221
- type: "button",
222
- "aria-label": "Clear filter",
223
- onClick: () => onFilterChange(""),
224
- className: "absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center text-muted-foreground hover:text-foreground",
225
- children: /* @__PURE__ */ jsx(Icon, { icon: UiClose, className: "text-xs" })
226
- }
227
- )
228
- ] }) }),
209
+ filterInMenu && /* @__PURE__ */ jsx("div", { className: "px-2 pb-1.5 pt-1", children: /* @__PURE__ */ jsx(FormFieldFilter, { value: fieldFilter, onChange: onFilterChange }) }),
229
210
  /* @__PURE__ */ jsx(PreferenceSection, { title: "Size" }),
230
211
  SIZE_OPTIONS.map((opt) => /* @__PURE__ */ jsx(
231
212
  PreferenceItem,
@@ -1 +1 @@
1
- {"version":3,"file":"JsonSchemaForm.js","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiClose, UiEllipsisBold, UiSearch } from \"../icons\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { FormErrorSummary } from \"./json-schema-form-error-display\";\nimport { unmatchedFormErrors } from \"./json-schema-form-errors\";\nimport { FormLookupProvider } from \"./FormLookupProvider\";\nimport { DiscriminatedForm } from \"./json-schema-form-discriminator\";\nimport { rehydrateRefs } from \"./json-schema-form-refs\";\nimport { renderApi, renderObjectFields } from \"./json-schema-form-render\";\nimport { applySchemaDefaults } from \"./json-schema-form-resolve\";\nimport {\n cssLength,\n DEFAULT_COLUMN_MIN_WIDTH,\n normalizeColumns,\n} from \"./json-schema-form-utils\";\nimport { DEFAULT_FORM_SIZE, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport {\n DEFAULT_PREFERENCES_STORAGE_KEY,\n readPreferences,\n writePreferences,\n type FormPreferences,\n type LayoutMode,\n type SortMode,\n} from \"./json-schema-form-preferences\";\nimport type { FormLayout, JsonSchemaFormProps, RenderContext } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props plus an optional menu-driven\n// `modeOverride` to a single resolved FormLayout. An explicit `layout` sets the\n// base; `inline` is the shorthand for it; `modeOverride` (from the preferences\n// menu) wins over both but only flips the mode — width caps from `layout` are\n// preserved. Both modes fill valueMaxWidth (inline value column / stacked\n// label+value stack); the label cap only applies inline.\nfunction resolveFormLayout(\n layout: FormLayout | undefined,\n inline: boolean,\n modeOverride: LayoutMode | undefined,\n): FormLayout {\n const baseMode = layout?.mode ?? (inline ? \"inline\" : \"stacked\");\n const mode = modeOverride ?? baseMode;\n const valueMaxWidth = layout?.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH;\n // `help` is orthogonal to mode, so it survives a menu-driven mode flip.\n const help = layout?.help ? { help: layout.help } : {};\n if (mode !== \"inline\") return { mode: \"stacked\", valueMaxWidth, ...help };\n return {\n mode: \"inline\",\n labelMaxWidth: layout?.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth,\n ...help,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n errors = [],\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n showPreferencesMenu = true,\n persistPreferences = true,\n preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY,\n lookupFetcher,\n}: JsonSchemaFormProps) {\n // When the menu is hidden, never touch localStorage and start from an empty\n // override so behaviour is identical to before this feature existed.\n const [prefs, setPrefs] = useState<FormPreferences>(() =>\n showPreferencesMenu && persistPreferences ? readPreferences(preferencesStorageKey) : {},\n );\n // The field filter is transient view state (a \"find\" over the fields), never\n // persisted — reopening the form should never start with fields hidden.\n const [fieldFilter, setFieldFilter] = useState(\"\");\n\n const effectiveSize = prefs.size ?? size;\n const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);\n // The `requiredFirst` prop sets the base sort; a menu selection overrides it.\n const effectiveSortMode = prefs.sortMode ?? (requiredFirst ? \"required-first\" : \"schema\");\n\n const applyPrefs = (next: FormPreferences) => {\n setPrefs(next);\n if (persistPreferences) writePreferences(preferencesStorageKey, next);\n };\n\n // A bundled schema (components under `$defs`, referenced by local `#/$defs`\n // pointers) is resolved once into a self-contained tree the renderer walks\n // directly; a non-bundled schema passes through untouched.\n const resolvedSchema = useMemo(() => rehydrateRefs(schema), [schema]);\n const effectiveValue = useMemo(() => applySchemaDefaults(resolvedSchema, value), [resolvedSchema, value]);\n const preExtensions = pre ?? [];\n const unmatchedErrors = useMemo(\n () =>\n unmatchedFormErrors({\n schema: resolvedSchema,\n value: effectiveValue,\n errors,\n hideReadOnlyFields,\n pre: preExtensions,\n ...(hiddenKeys ? { hiddenKeys } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n }),\n [effectiveValue, errors, fieldFilter, hiddenKeys, hideReadOnlyFields, preExtensions, resolvedSchema],\n );\n // Defaults are part of the submitted form value, not only presentation. This\n // is especially important for required discriminator fields whose default\n // selects an if/then branch.\n useEffect(() => {\n if (!readOnly && effectiveValue !== value) onChange(effectiveValue);\n }, [effectiveValue, onChange, readOnly, value]);\n\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n layout: resolvedLayout,\n size: effectiveSize,\n sortMode: effectiveSortMode,\n pre: preExtensions,\n post: post ?? [],\n rootValue: effectiveValue,\n onRootChange: onChange,\n instancePath: \"\",\n errors,\n depth: 0,\n render: renderApi,\n ...(idPrefix ? { idPrefix } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n };\n // A schema may name a discriminator property whose value selects a \"kind\"; the\n // form then runs a two-phase pick-then-fill flow (see DiscriminatedForm).\n const discKey = typeof resolvedSchema[\"x-discriminator\"] === \"string\" ? resolvedSchema[\"x-discriminator\"] : undefined;\n const inPickerPhase = discKey != null && (effectiveValue[discKey] == null || effectiveValue[discKey] === \"\");\n\n const objectRows = discKey\n ? null\n : renderObjectFields(resolvedSchema, effectiveValue, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n const noMatches = objectRows != null && objectRows.length === 0 && fieldFilter.trim() !== \"\";\n\n return (\n <FormLookupProvider {...(lookupFetcher ? { fetcher: lookupFetcher } : {})}>\n <div className={cn(\"relative flex flex-col\", fieldInnerGapClass[effectiveSize])}>\n {showPreferencesMenu && !inPickerPhase && (\n <PreferencesMenu\n size={effectiveSize}\n layoutMode={resolvedLayout.mode}\n sortMode={effectiveSortMode}\n fieldFilter={fieldFilter}\n onFilterChange={setFieldFilter}\n onSelectSize={(next) => applyPrefs({ ...prefs, size: next })}\n onSelectLayout={(next) => applyPrefs({ ...prefs, layoutMode: next })}\n onSelectSort={(next) => applyPrefs({ ...prefs, sortMode: next })}\n />\n )}\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[effectiveSize])}>{title}</h3>}\n <FormErrorSummary errors={unmatchedErrors} />\n <FieldsGrid\n layout={resolvedLayout}\n size={effectiveSize}\n columns={normalizeColumns(resolvedSchema[\"x-columns\"])}\n columnMinWidth={cssLength(resolvedSchema[\"x-column-min-width\"], DEFAULT_COLUMN_MIN_WIDTH)}\n {...(typeof resolvedSchema[\"x-columns-max-width\"] === \"string\"\n ? { columnsMaxWidth: resolvedSchema[\"x-columns-max-width\"] }\n : {})}\n {...(typeof resolvedSchema[\"x-classes\"] === \"string\" ? { className: resolvedSchema[\"x-classes\"] } : {})}\n >\n {discKey ? (\n <DiscriminatedForm\n schema={resolvedSchema}\n value={effectiveValue}\n onChange={onChange}\n ctx={ctx}\n discKey={discKey}\n />\n ) : (\n objectRows\n )}\n </FieldsGrid>\n {noMatches && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[effectiveSize])}>\n No fields match “{fieldFilter.trim()}”.\n </p>\n )}\n </div>\n </FormLookupProvider>\n );\n}\n\nconst SIZE_OPTIONS: { value: FormSize; label: string }[] = [\n { value: \"xs\", label: \"Extra small\" },\n { value: \"sm\", label: \"Small\" },\n { value: \"md\", label: \"Medium\" },\n { value: \"lg\", label: \"Large\" },\n { value: \"xl\", label: \"Extra large\" },\n];\n\nconst LAYOUT_OPTIONS: { value: LayoutMode; label: string }[] = [\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"inline\", label: \"Inline\" },\n];\n\nconst SORT_OPTIONS: { value: SortMode; label: string }[] = [\n { value: \"schema\", label: \"Schema order\" },\n { value: \"required-first\", label: \"Required first\" },\n { value: \"priority\", label: \"Required & filled first\" },\n];\n\n// PreferencesMenu is the compact top-right ellipsis menu controlling this form's\n// size, layout, sort, and a live field filter. Selecting an option fires the\n// matching callback and closes the menu; typing in the filter updates fields\n// live without closing. The parent decides whether to persist.\nfunction PreferencesMenu({\n size,\n layoutMode,\n sortMode,\n fieldFilter,\n onFilterChange,\n onSelectSize,\n onSelectLayout,\n onSelectSort,\n}: {\n size: FormSize;\n layoutMode: LayoutMode;\n sortMode: SortMode;\n fieldFilter: string;\n onFilterChange: (value: string) => void;\n onSelectSize: (size: FormSize) => void;\n onSelectLayout: (mode: LayoutMode) => void;\n onSelectSort: (mode: SortMode) => void;\n}) {\n const filterActive = fieldFilter.trim() !== \"\";\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Form display options\"\n className=\"absolute right-0 top-0 z-10\"\n trigger={\n <button\n type=\"button\"\n aria-label=\"Form display options\"\n aria-haspopup=\"menu\"\n className={cn(\n \"inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n filterActive ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon icon={UiEllipsisBold} className=\"text-lg\" />\n </button>\n }\n >\n {(closeMenu) => (\n <>\n <div className=\"px-2 pb-1.5 pt-1\">\n <div className=\"relative\">\n <Icon\n icon={UiSearch}\n className=\"pointer-events-none absolute left-2 top-1/2 -translate-y-1/2 text-xs text-muted-foreground\"\n />\n <input\n type=\"text\"\n aria-label=\"Filter fields\"\n placeholder=\"Filter fields…\"\n value={fieldFilter}\n onChange={(e) => onFilterChange(e.target.value)}\n // Keep arrow/space/enter keys inside the input instead of driving\n // the menu's list navigation or closing it.\n onKeyDown={(e) => e.stopPropagation()}\n className=\"w-full rounded-md border border-input bg-background py-1 pl-7 pr-6 text-xs text-foreground outline-none placeholder:text-placeholder focus-visible:ring-2 focus-visible:ring-ring\"\n />\n {filterActive && (\n <button\n type=\"button\"\n aria-label=\"Clear filter\"\n onClick={() => onFilterChange(\"\")}\n className=\"absolute right-1.5 top-1/2 -translate-y-1/2 inline-flex items-center justify-center text-muted-foreground hover:text-foreground\"\n >\n <Icon icon={UiClose} className=\"text-xs\" />\n </button>\n )}\n </div>\n </div>\n <PreferenceSection title=\"Size\" />\n {SIZE_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === size}\n onSelect={() => {\n onSelectSize(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Layout\" />\n {LAYOUT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === layoutMode}\n onSelect={() => {\n onSelectLayout(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Sort\" />\n {SORT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === sortMode}\n onSelect={() => {\n onSelectSort(opt.value);\n closeMenu();\n }}\n />\n ))}\n </>\n )}\n </DropdownMenu>\n );\n}\n\nfunction PreferenceSection({ title }: { title: string }) {\n return (\n <div className=\"px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n );\n}\n\nfunction PreferenceItem({ label, selected, onSelect }: { label: string; selected: boolean; onSelect: () => void }) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n onClick={onSelect}\n >\n <span className=\"flex w-3.5 shrink-0 justify-center\">\n {selected && <Icon icon={UiCheck} className=\"text-xs\" />}\n </span>\n {label}\n </button>\n );\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"JsonSchemaForm.js","sources":["../../src/components/JsonSchemaForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiCheck, UiEllipsisBold } from \"../icons\";\nimport { FormFieldFilter } from \"./json-schema-form-filter-input\";\nimport { DropdownMenu } from \"../overlay/DropdownMenu\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { FormErrorSummary } from \"./json-schema-form-error-display\";\nimport { unmatchedFormErrors } from \"./json-schema-form-errors\";\nimport { FormLookupProvider } from \"./FormLookupProvider\";\nimport { DiscriminatedForm } from \"./json-schema-form-discriminator\";\nimport { rehydrateRefs } from \"./json-schema-form-refs\";\nimport { renderApi, renderObjectFields } from \"./json-schema-form-render\";\nimport { applySchemaDefaults } from \"./json-schema-form-resolve\";\nimport {\n cssLength,\n DEFAULT_COLUMN_MIN_WIDTH,\n normalizeColumns,\n} from \"./json-schema-form-utils\";\nimport { DEFAULT_FORM_SIZE, fieldInnerGapClass, labelSizeClass, type FormSize } from \"./json-schema-form-size\";\nimport {\n DEFAULT_PREFERENCES_STORAGE_KEY,\n readPreferences,\n writePreferences,\n type FormPreferences,\n type LayoutMode,\n type SortMode,\n} from \"./json-schema-form-preferences\";\nimport type { FormLayout, JsonSchemaFormProps, RenderContext } from \"./json-schema-form-types\";\n\nconst DEFAULT_LABEL_MAX_WIDTH = \"40ch\";\nconst DEFAULT_VALUE_MAX_WIDTH = \"600px\";\n\n// resolveFormLayout maps the `layout`/`inline` props plus an optional menu-driven\n// `modeOverride` to a single resolved FormLayout. An explicit `layout` sets the\n// base; `inline` is the shorthand for it; `modeOverride` (from the preferences\n// menu) wins over both but only flips the mode — width caps from `layout` are\n// preserved. Both modes fill valueMaxWidth (inline value column / stacked\n// label+value stack); the label cap only applies inline.\nfunction resolveFormLayout(\n layout: FormLayout | undefined,\n inline: boolean,\n modeOverride: LayoutMode | undefined,\n): FormLayout {\n const baseMode = layout?.mode ?? (inline ? \"inline\" : \"stacked\");\n const mode = modeOverride ?? baseMode;\n const valueMaxWidth = layout?.valueMaxWidth ?? DEFAULT_VALUE_MAX_WIDTH;\n // `help` is orthogonal to mode, so it survives a menu-driven mode flip.\n const help = layout?.help ? { help: layout.help } : {};\n if (mode === \"properties\") return { ...layout, mode, ...help };\n if (mode !== \"inline\") return { mode: \"stacked\", valueMaxWidth, ...help };\n return {\n mode: \"inline\",\n labelMaxWidth: layout?.labelMaxWidth ?? DEFAULT_LABEL_MAX_WIDTH,\n valueMaxWidth,\n ...help,\n };\n}\n\n// JsonSchemaForm renders an object subschema as a form: one control per\n// (effective) property. It resolves if/then conditionals internally and recurses\n// through array items and object/map values; every other behaviour is layered on\n// by the pre/post extension functions the consumer supplies. The component holds\n// no domain knowledge.\nexport function JsonSchemaForm({\n schema,\n value,\n onChange,\n errors = [],\n readOnly = false,\n inline = false,\n layout,\n size = DEFAULT_FORM_SIZE,\n idPrefix,\n hideReadOnlyFields = false,\n hideEmpty = false,\n autoSave = false,\n hiddenKeys,\n requiredFirst = false,\n title,\n pre,\n post,\n showPreferencesMenu = true,\n showFilter,\n persistPreferences = true,\n preferencesStorageKey = DEFAULT_PREFERENCES_STORAGE_KEY,\n lookupFetcher,\n}: JsonSchemaFormProps) {\n // When the menu is hidden, never touch localStorage and start from an empty\n // override so behaviour is identical to before this feature existed.\n const [prefs, setPrefs] = useState<FormPreferences>(() =>\n showPreferencesMenu && persistPreferences ? readPreferences(preferencesStorageKey) : {},\n );\n // The field filter is transient view state (a \"find\" over the fields), never\n // persisted — reopening the form should never start with fields hidden.\n const [fieldFilter, setFieldFilter] = useState(\"\");\n\n const effectiveSize = prefs.size ?? size;\n const resolvedLayout = resolveFormLayout(layout, inline, prefs.layoutMode);\n const filterVisible = showFilter ?? (showPreferencesMenu && resolvedLayout.mode === \"properties\");\n // The `requiredFirst` prop sets the base sort; a menu selection overrides it.\n const effectiveSortMode = prefs.sortMode ?? (requiredFirst ? \"required-first\" : \"schema\");\n\n const applyPrefs = (next: FormPreferences) => {\n setPrefs(next);\n if (persistPreferences) writePreferences(preferencesStorageKey, next);\n };\n\n // A bundled schema (components under `$defs`, referenced by local `#/$defs`\n // pointers) is resolved once into a self-contained tree the renderer walks\n // directly; a non-bundled schema passes through untouched.\n const resolvedSchema = useMemo(() => rehydrateRefs(schema), [schema]);\n const effectiveValue = useMemo(() => applySchemaDefaults(resolvedSchema, value), [resolvedSchema, value]);\n const preExtensions = pre ?? [];\n const unmatchedErrors = useMemo(\n () =>\n unmatchedFormErrors({\n schema: resolvedSchema,\n value: effectiveValue,\n errors,\n hideReadOnlyFields,\n hideEmpty,\n pre: preExtensions,\n ...(hiddenKeys ? { hiddenKeys } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n }),\n [effectiveValue, errors, fieldFilter, hiddenKeys, hideEmpty, hideReadOnlyFields, preExtensions, resolvedSchema],\n );\n // Defaults are part of the submitted form value, not only presentation. This\n // is especially important for required discriminator fields whose default\n // selects an if/then branch.\n useEffect(() => {\n if (!readOnly && effectiveValue !== value) onChange(effectiveValue);\n }, [effectiveValue, onChange, readOnly, value]);\n\n const ctx: RenderContext = {\n readOnly,\n hideReadOnlyFields,\n hideEmpty,\n autoSave,\n layout: resolvedLayout,\n size: effectiveSize,\n sortMode: effectiveSortMode,\n pre: preExtensions,\n post: post ?? [],\n rootValue: effectiveValue,\n onRootChange: onChange,\n instancePath: \"\",\n errors,\n depth: 0,\n render: renderApi,\n ...(idPrefix ? { idPrefix } : {}),\n ...(fieldFilter.trim() ? { fieldFilter: fieldFilter.trim() } : {}),\n };\n // A schema may name a discriminator property whose value selects a \"kind\"; the\n // form then runs a two-phase pick-then-fill flow (see DiscriminatedForm).\n const discKey = typeof resolvedSchema[\"x-discriminator\"] === \"string\" ? resolvedSchema[\"x-discriminator\"] : undefined;\n const inPickerPhase = discKey != null && (effectiveValue[discKey] == null || effectiveValue[discKey] === \"\");\n\n const objectRows = discKey\n ? null\n : renderObjectFields(resolvedSchema, effectiveValue, onChange, ctx, hiddenKeys ? { hiddenKeys } : undefined);\n const noMatches = objectRows != null && objectRows.length === 0 && fieldFilter.trim() !== \"\";\n\n return (\n <FormLookupProvider {...(lookupFetcher ? { fetcher: lookupFetcher } : {})}>\n <div data-json-schema-form className={cn(\"relative flex flex-col\", fieldInnerGapClass[effectiveSize])}>\n {showPreferencesMenu && !inPickerPhase && (\n <PreferencesMenu\n size={effectiveSize}\n layoutMode={resolvedLayout.mode}\n sortMode={effectiveSortMode}\n fieldFilter={fieldFilter}\n filterInMenu={!filterVisible}\n onFilterChange={setFieldFilter}\n onSelectSize={(next) => applyPrefs({ ...prefs, size: next })}\n onSelectLayout={(next) => applyPrefs({ ...prefs, layoutMode: next })}\n onSelectSort={(next) => applyPrefs({ ...prefs, sortMode: next })}\n />\n )}\n {title && <h3 className={cn(\"font-semibold\", labelSizeClass[effectiveSize])}>{title}</h3>}\n {filterVisible && !inPickerPhase && (\n <div className=\"max-w-md pr-9\">\n <FormFieldFilter value={fieldFilter} onChange={setFieldFilter} />\n </div>\n )}\n <FormErrorSummary errors={unmatchedErrors} />\n <FieldsGrid\n layout={resolvedLayout}\n size={effectiveSize}\n columns={normalizeColumns(resolvedSchema[\"x-columns\"])}\n columnMinWidth={cssLength(resolvedSchema[\"x-column-min-width\"], DEFAULT_COLUMN_MIN_WIDTH)}\n {...(typeof resolvedSchema[\"x-columns-max-width\"] === \"string\"\n ? { columnsMaxWidth: resolvedSchema[\"x-columns-max-width\"] }\n : {})}\n {...(typeof resolvedSchema[\"x-classes\"] === \"string\" ? { className: resolvedSchema[\"x-classes\"] } : {})}\n >\n {discKey ? (\n <DiscriminatedForm\n schema={resolvedSchema}\n value={effectiveValue}\n onChange={onChange}\n ctx={ctx}\n discKey={discKey}\n />\n ) : (\n objectRows\n )}\n </FieldsGrid>\n {noMatches && (\n <p className={cn(\"text-muted-foreground\", labelSizeClass[effectiveSize])}>\n No fields match “{fieldFilter.trim()}”.\n </p>\n )}\n </div>\n </FormLookupProvider>\n );\n}\n\nconst SIZE_OPTIONS: { value: FormSize; label: string }[] = [\n { value: \"xs\", label: \"Extra small\" },\n { value: \"sm\", label: \"Small\" },\n { value: \"md\", label: \"Medium\" },\n { value: \"lg\", label: \"Large\" },\n { value: \"xl\", label: \"Extra large\" },\n];\n\nconst LAYOUT_OPTIONS: { value: LayoutMode; label: string }[] = [\n { value: \"stacked\", label: \"Stacked\" },\n { value: \"inline\", label: \"Inline\" },\n { value: \"properties\", label: \"Properties\" },\n];\n\nconst SORT_OPTIONS: { value: SortMode; label: string }[] = [\n { value: \"schema\", label: \"Schema order\" },\n { value: \"required-first\", label: \"Required first\" },\n { value: \"priority\", label: \"Required & filled first\" },\n];\n\n// PreferencesMenu is the compact top-right ellipsis menu controlling this form's\n// size, layout, sort, and a live field filter. Selecting an option fires the\n// matching callback and closes the menu; typing in the filter updates fields\n// live without closing. The parent decides whether to persist.\nfunction PreferencesMenu({\n size,\n layoutMode,\n sortMode,\n fieldFilter,\n filterInMenu,\n onFilterChange,\n onSelectSize,\n onSelectLayout,\n onSelectSort,\n}: {\n size: FormSize;\n layoutMode: LayoutMode;\n sortMode: SortMode;\n fieldFilter: string;\n filterInMenu: boolean;\n onFilterChange: (value: string) => void;\n onSelectSize: (size: FormSize) => void;\n onSelectLayout: (mode: LayoutMode) => void;\n onSelectSort: (mode: SortMode) => void;\n}) {\n const filterActive = fieldFilter.trim() !== \"\";\n return (\n <DropdownMenu\n align=\"right\"\n menuLabel=\"Form display options\"\n className=\"absolute right-0 top-0 z-10\"\n trigger={\n <button\n type=\"button\"\n aria-label=\"Form display options\"\n aria-haspopup=\"menu\"\n className={cn(\n \"inline-flex h-7 w-7 items-center justify-center rounded-md transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n filterActive ? \"text-primary\" : \"text-muted-foreground hover:text-foreground\",\n )}\n >\n <Icon icon={UiEllipsisBold} className=\"text-lg\" />\n </button>\n }\n >\n {(closeMenu) => (\n <>\n {filterInMenu && <div className=\"px-2 pb-1.5 pt-1\">\n <FormFieldFilter value={fieldFilter} onChange={onFilterChange} />\n </div>}\n <PreferenceSection title=\"Size\" />\n {SIZE_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === size}\n onSelect={() => {\n onSelectSize(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Layout\" />\n {LAYOUT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === layoutMode}\n onSelect={() => {\n onSelectLayout(opt.value);\n closeMenu();\n }}\n />\n ))}\n <PreferenceSection title=\"Sort\" />\n {SORT_OPTIONS.map((opt) => (\n <PreferenceItem\n key={opt.value}\n label={opt.label}\n selected={opt.value === sortMode}\n onSelect={() => {\n onSelectSort(opt.value);\n closeMenu();\n }}\n />\n ))}\n </>\n )}\n </DropdownMenu>\n );\n}\n\nfunction PreferenceSection({ title }: { title: string }) {\n return (\n <div className=\"px-3 pb-1 pt-2 text-[10px] font-semibold uppercase tracking-wide text-muted-foreground\">\n {title}\n </div>\n );\n}\n\nfunction PreferenceItem({ label, selected, onSelect }: { label: string; selected: boolean; onSelect: () => void }) {\n return (\n <button\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n className=\"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground\"\n onClick={onSelect}\n >\n <span className=\"flex w-3.5 shrink-0 justify-center\">\n {selected && <Icon icon={UiCheck} className=\"text-xs\" />}\n </span>\n {label}\n </button>\n );\n}\n"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { HTMLAttributes, ReactNode } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { HTMLAttributes, ReactNode } from 'react';
2
2
  import { ButtonProps } from './button';
3
3
  import { ListMenuSelection } from './use-list-menu-selection';
4
4
  export type ListMenuProps = HTMLAttributes<HTMLDivElement> & {
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { LabelIconSpec } from '../data/Icon';
3
3
  export type MultiSelectOption = {
4
4
  /** Stable option value written into the selected value array. */
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { InputFieldInputProps } from './InputField';
3
3
  export type SearchInputProps = Omit<InputFieldInputProps, "onChange" | "prefix" | "type" | "value"> & {
4
4
  /** Controlled query value. */
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { StaticIconComponent } from '../data/Icon';
3
3
  export type SegmentedSize = "sm" | "md" | "lg";
4
4
  export type SegmentedOption<T extends string = string> = {
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  import { ButtonProps } from './button';
3
3
  import { StaticIconComponent } from '../data/Icon';
4
4
  import { DropdownMenuItem } from '../overlay/DropdownMenu';
@@ -1,4 +1,4 @@
1
- import { ReactNode } from '../../../../node_modules/@types/react/index.d.ts';
1
+ import { ReactNode } from 'react';
2
2
  export type SwitchProps = {
3
3
  /** Current on/off state. */
4
4
  checked: boolean;
@@ -17,11 +17,15 @@ function TreePickerField({
17
17
  roots,
18
18
  getKey,
19
19
  getChildren,
20
+ getAriaLabel,
20
21
  renderRow,
21
22
  getSearchText,
22
23
  defaultOpen,
24
+ hasMoreChildren,
25
+ loadChildren,
23
26
  isSelectable,
24
27
  onSelect,
28
+ closeOnSelect = true,
25
29
  selected,
26
30
  revealSelected,
27
31
  showControls,
@@ -35,7 +39,8 @@ function TreePickerField({
35
39
  triggerClassName,
36
40
  panelClassName,
37
41
  renderTrigger,
38
- renderFooter
42
+ renderFooter,
43
+ triggerAriaLabel
39
44
  }) {
40
45
  const [open, setOpen] = react.useState(false);
41
46
  const floatingZ = modalStack.useFloatingZIndex();
@@ -106,6 +111,7 @@ function TreePickerField({
106
111
  ref: anchorRef,
107
112
  type: "button",
108
113
  disabled,
114
+ "aria-label": triggerAriaLabel,
109
115
  "aria-haspopup": "tree",
110
116
  "aria-expanded": open,
111
117
  onClick: () => setOpen((current) => !current),
@@ -161,8 +167,11 @@ function TreePickerField({
161
167
  getKey,
162
168
  getChildren,
163
169
  renderRow,
170
+ ...getAriaLabel ? { getAriaLabel } : {},
164
171
  ...getSearchText ? { getSearchText } : {},
165
172
  ...defaultOpen ? { defaultOpen } : {},
173
+ ...hasMoreChildren ? { hasMoreChildren } : {},
174
+ ...loadChildren ? { loadChildren } : {},
166
175
  ...selected !== void 0 ? { selected } : {},
167
176
  ...revealSelected !== void 0 ? { revealSelected } : {},
168
177
  ...showControls !== void 0 ? { showControls } : {},
@@ -171,7 +180,7 @@ function TreePickerField({
171
180
  onSelect: (node) => {
172
181
  if (!isSelectable || isSelectable(node)) {
173
182
  onSelect(node);
174
- setOpen(false);
183
+ if (closeOnSelect) setOpen(false);
175
184
  }
176
185
  }
177
186
  }