@flanksource/clicky-ui 0.3.17 → 0.3.18

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 (822) hide show
  1. package/dist/ai.cjs +12 -6
  2. package/dist/ai.cjs.map +1 -1
  3. package/dist/ai.js +10 -4
  4. package/dist/ai.js.map +1 -1
  5. package/dist/chat.cjs +36 -0
  6. package/dist/chat.cjs.map +1 -1
  7. package/dist/chat.js +37 -1
  8. package/dist/chat.js.map +1 -1
  9. package/dist/components/Combobox.cjs +122 -153
  10. package/dist/components/Combobox.cjs.map +1 -1
  11. package/dist/components/Combobox.d.ts.map +1 -1
  12. package/dist/components/Combobox.js +124 -155
  13. package/dist/components/Combobox.js.map +1 -1
  14. package/dist/components/ComboboxControl.cjs +145 -0
  15. package/dist/components/ComboboxControl.cjs.map +1 -0
  16. package/dist/components/ComboboxControl.d.ts +37 -0
  17. package/dist/components/ComboboxControl.d.ts.map +1 -0
  18. package/dist/components/ComboboxControl.js +145 -0
  19. package/dist/components/ComboboxControl.js.map +1 -0
  20. package/dist/components/ComboboxMenu.cjs +31 -14
  21. package/dist/components/ComboboxMenu.cjs.map +1 -1
  22. package/dist/components/ComboboxMenu.d.ts.map +1 -1
  23. package/dist/components/ComboboxMenu.js +31 -14
  24. package/dist/components/ComboboxMenu.js.map +1 -1
  25. package/dist/components/ComboboxTags.cjs +40 -0
  26. package/dist/components/ComboboxTags.cjs.map +1 -0
  27. package/dist/components/ComboboxTags.d.ts +8 -0
  28. package/dist/components/ComboboxTags.d.ts.map +1 -0
  29. package/dist/components/ComboboxTags.js +40 -0
  30. package/dist/components/ComboboxTags.js.map +1 -0
  31. package/dist/components/ErrorWrapper.cjs +168 -0
  32. package/dist/components/ErrorWrapper.cjs.map +1 -0
  33. package/dist/components/ErrorWrapper.d.ts +19 -0
  34. package/dist/components/ErrorWrapper.d.ts.map +1 -0
  35. package/dist/components/ErrorWrapper.js +168 -0
  36. package/dist/components/ErrorWrapper.js.map +1 -0
  37. package/dist/components/FilterBar.cjs +64 -2
  38. package/dist/components/FilterBar.cjs.map +1 -1
  39. package/dist/components/FilterBar.d.ts +18 -1
  40. package/dist/components/FilterBar.d.ts.map +1 -1
  41. package/dist/components/FilterBar.js +64 -2
  42. package/dist/components/FilterBar.js.map +1 -1
  43. package/dist/components/JSONPathField.cjs +91 -0
  44. package/dist/components/JSONPathField.cjs.map +1 -0
  45. package/dist/components/JSONPathField.d.ts +19 -0
  46. package/dist/components/JSONPathField.d.ts.map +1 -0
  47. package/dist/components/JSONPathField.js +91 -0
  48. package/dist/components/JSONPathField.js.map +1 -0
  49. package/dist/components/JsonSchemaForm.cjs +8 -4
  50. package/dist/components/JsonSchemaForm.cjs.map +1 -1
  51. package/dist/components/JsonSchemaForm.d.ts.map +1 -1
  52. package/dist/components/JsonSchemaForm.js +8 -4
  53. package/dist/components/JsonSchemaForm.js.map +1 -1
  54. package/dist/components/TreePickerField.cjs +22 -4
  55. package/dist/components/TreePickerField.cjs.map +1 -1
  56. package/dist/components/TreePickerField.d.ts +22 -2
  57. package/dist/components/TreePickerField.d.ts.map +1 -1
  58. package/dist/components/TreePickerField.js +22 -4
  59. package/dist/components/TreePickerField.js.map +1 -1
  60. package/dist/components/TriStateToggle.cjs +53 -0
  61. package/dist/components/TriStateToggle.cjs.map +1 -0
  62. package/dist/components/TriStateToggle.d.ts +27 -0
  63. package/dist/components/TriStateToggle.d.ts.map +1 -0
  64. package/dist/components/TriStateToggle.js +53 -0
  65. package/dist/components/TriStateToggle.js.map +1 -0
  66. package/dist/components/combobox-types.d.ts +16 -1
  67. package/dist/components/combobox-types.d.ts.map +1 -1
  68. package/dist/components/combobox-utils.cjs +26 -0
  69. package/dist/components/combobox-utils.cjs.map +1 -1
  70. package/dist/components/combobox-utils.d.ts +10 -0
  71. package/dist/components/combobox-utils.d.ts.map +1 -1
  72. package/dist/components/combobox-utils.js +26 -0
  73. package/dist/components/combobox-utils.js.map +1 -1
  74. package/dist/components/filter-bar-utils.cjs +5 -0
  75. package/dist/components/filter-bar-utils.cjs.map +1 -1
  76. package/dist/components/filter-bar-utils.d.ts.map +1 -1
  77. package/dist/components/filter-bar-utils.js +5 -0
  78. package/dist/components/filter-bar-utils.js.map +1 -1
  79. package/dist/components/json-schema-form-accordion-array.cjs +290 -0
  80. package/dist/components/json-schema-form-accordion-array.cjs.map +1 -0
  81. package/dist/components/json-schema-form-accordion-array.d.ts +7 -0
  82. package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -0
  83. package/dist/components/json-schema-form-accordion-array.js +290 -0
  84. package/dist/components/json-schema-form-accordion-array.js.map +1 -0
  85. package/dist/components/json-schema-form-array.cjs +99 -110
  86. package/dist/components/json-schema-form-array.cjs.map +1 -1
  87. package/dist/components/json-schema-form-array.d.ts +1 -1
  88. package/dist/components/json-schema-form-array.d.ts.map +1 -1
  89. package/dist/components/json-schema-form-array.js +98 -109
  90. package/dist/components/json-schema-form-array.js.map +1 -1
  91. package/dist/components/json-schema-form-error-display.cjs +4 -2
  92. package/dist/components/json-schema-form-error-display.cjs.map +1 -1
  93. package/dist/components/json-schema-form-error-display.d.ts +4 -2
  94. package/dist/components/json-schema-form-error-display.d.ts.map +1 -1
  95. package/dist/components/json-schema-form-error-display.js +4 -2
  96. package/dist/components/json-schema-form-error-display.js.map +1 -1
  97. package/dist/components/json-schema-form-extensions.cjs +10 -0
  98. package/dist/components/json-schema-form-extensions.cjs.map +1 -0
  99. package/dist/components/json-schema-form-extensions.d.ts +8 -0
  100. package/dist/components/json-schema-form-extensions.d.ts.map +1 -0
  101. package/dist/components/json-schema-form-extensions.js +10 -0
  102. package/dist/components/json-schema-form-extensions.js.map +1 -0
  103. package/dist/components/json-schema-form-fields.cjs +25 -101
  104. package/dist/components/json-schema-form-fields.cjs.map +1 -1
  105. package/dist/components/json-schema-form-fields.d.ts +1 -32
  106. package/dist/components/json-schema-form-fields.d.ts.map +1 -1
  107. package/dist/components/json-schema-form-fields.js +28 -104
  108. package/dist/components/json-schema-form-fields.js.map +1 -1
  109. package/dist/components/json-schema-form-item-summary.cjs +131 -0
  110. package/dist/components/json-schema-form-item-summary.cjs.map +1 -0
  111. package/dist/components/json-schema-form-item-summary.d.ts +13 -0
  112. package/dist/components/json-schema-form-item-summary.d.ts.map +1 -0
  113. package/dist/components/json-schema-form-item-summary.js +131 -0
  114. package/dist/components/json-schema-form-item-summary.js.map +1 -0
  115. package/dist/components/json-schema-form-layout.cjs +156 -0
  116. package/dist/components/json-schema-form-layout.cjs.map +1 -0
  117. package/dist/components/json-schema-form-layout.d.ts +43 -0
  118. package/dist/components/json-schema-form-layout.d.ts.map +1 -0
  119. package/dist/components/json-schema-form-layout.js +156 -0
  120. package/dist/components/json-schema-form-layout.js.map +1 -0
  121. package/dist/components/json-schema-form-lookup-tree.cjs +149 -0
  122. package/dist/components/json-schema-form-lookup-tree.cjs.map +1 -0
  123. package/dist/components/json-schema-form-lookup-tree.d.ts +22 -0
  124. package/dist/components/json-schema-form-lookup-tree.d.ts.map +1 -0
  125. package/dist/components/json-schema-form-lookup-tree.js +149 -0
  126. package/dist/components/json-schema-form-lookup-tree.js.map +1 -0
  127. package/dist/components/json-schema-form-object.cjs +11 -4
  128. package/dist/components/json-schema-form-object.cjs.map +1 -1
  129. package/dist/components/json-schema-form-object.d.ts.map +1 -1
  130. package/dist/components/json-schema-form-object.js +11 -4
  131. package/dist/components/json-schema-form-object.js.map +1 -1
  132. package/dist/components/json-schema-form-render.cjs +51 -28
  133. package/dist/components/json-schema-form-render.cjs.map +1 -1
  134. package/dist/components/json-schema-form-render.d.ts.map +1 -1
  135. package/dist/components/json-schema-form-render.js +51 -28
  136. package/dist/components/json-schema-form-render.js.map +1 -1
  137. package/dist/components/json-schema-form-resolve.cjs +62 -13
  138. package/dist/components/json-schema-form-resolve.cjs.map +1 -1
  139. package/dist/components/json-schema-form-resolve.d.ts +1 -0
  140. package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
  141. package/dist/components/json-schema-form-resolve.js +62 -13
  142. package/dist/components/json-schema-form-resolve.js.map +1 -1
  143. package/dist/components/json-schema-form-table-array.cjs +123 -0
  144. package/dist/components/json-schema-form-table-array.cjs.map +1 -0
  145. package/dist/components/json-schema-form-table-array.d.ts +7 -0
  146. package/dist/components/json-schema-form-table-array.d.ts.map +1 -0
  147. package/dist/components/json-schema-form-table-array.js +123 -0
  148. package/dist/components/json-schema-form-table-array.js.map +1 -0
  149. package/dist/components/json-schema-form-tone.cjs +34 -0
  150. package/dist/components/json-schema-form-tone.cjs.map +1 -0
  151. package/dist/components/json-schema-form-tone.d.ts +8 -0
  152. package/dist/components/json-schema-form-tone.d.ts.map +1 -0
  153. package/dist/components/json-schema-form-tone.js +34 -0
  154. package/dist/components/json-schema-form-tone.js.map +1 -0
  155. package/dist/components/json-schema-form-types.d.ts +79 -10
  156. package/dist/components/json-schema-form-types.d.ts.map +1 -1
  157. package/dist/components/json-schema-form-utils.cjs +47 -4
  158. package/dist/components/json-schema-form-utils.cjs.map +1 -1
  159. package/dist/components/json-schema-form-utils.d.ts +19 -4
  160. package/dist/components/json-schema-form-utils.d.ts.map +1 -1
  161. package/dist/components/json-schema-form-utils.js +47 -4
  162. package/dist/components/json-schema-form-utils.js.map +1 -1
  163. package/dist/components/tri-state.cjs +8 -0
  164. package/dist/components/tri-state.cjs.map +1 -0
  165. package/dist/components/tri-state.d.ts +5 -0
  166. package/dist/components/tri-state.d.ts.map +1 -0
  167. package/dist/components/tri-state.js +8 -0
  168. package/dist/components/tri-state.js.map +1 -0
  169. package/dist/components/useComboboxLayout.cjs +59 -0
  170. package/dist/components/useComboboxLayout.cjs.map +1 -0
  171. package/dist/components/useComboboxLayout.d.ts +5 -0
  172. package/dist/components/useComboboxLayout.d.ts.map +1 -0
  173. package/dist/components/useComboboxLayout.js +59 -0
  174. package/dist/components/useComboboxLayout.js.map +1 -0
  175. package/dist/components.cjs +21 -0
  176. package/dist/components.cjs.map +1 -1
  177. package/dist/components.d.ts +14 -4
  178. package/dist/components.d.ts.map +1 -1
  179. package/dist/components.js +22 -1
  180. package/dist/components.js.map +1 -1
  181. package/dist/data/Clicky.cjs +51 -2
  182. package/dist/data/Clicky.cjs.map +1 -1
  183. package/dist/data/Clicky.d.ts +10 -1
  184. package/dist/data/Clicky.d.ts.map +1 -1
  185. package/dist/data/Clicky.js +51 -2
  186. package/dist/data/Clicky.js.map +1 -1
  187. package/dist/data/DataTable.cjs +185 -53
  188. package/dist/data/DataTable.cjs.map +1 -1
  189. package/dist/data/DataTable.d.ts +63 -3
  190. package/dist/data/DataTable.d.ts.map +1 -1
  191. package/dist/data/DataTable.js +185 -53
  192. package/dist/data/DataTable.js.map +1 -1
  193. package/dist/data/LogsTable.cjs +10 -1
  194. package/dist/data/LogsTable.cjs.map +1 -1
  195. package/dist/data/LogsTable.d.ts +3 -1
  196. package/dist/data/LogsTable.d.ts.map +1 -1
  197. package/dist/data/LogsTable.js +10 -1
  198. package/dist/data/LogsTable.js.map +1 -1
  199. package/dist/data/TaskManager.cjs +99 -14
  200. package/dist/data/TaskManager.cjs.map +1 -1
  201. package/dist/data/TaskManager.d.ts.map +1 -1
  202. package/dist/data/TaskManager.js +100 -15
  203. package/dist/data/TaskManager.js.map +1 -1
  204. package/dist/data/TaskProgress.cjs +50 -11
  205. package/dist/data/TaskProgress.cjs.map +1 -1
  206. package/dist/data/TaskProgress.d.ts +2 -1
  207. package/dist/data/TaskProgress.d.ts.map +1 -1
  208. package/dist/data/TaskProgress.js +50 -11
  209. package/dist/data/TaskProgress.js.map +1 -1
  210. package/dist/data/ai/AdvancedChatConfig.cjs +289 -0
  211. package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -0
  212. package/dist/data/ai/AdvancedChatConfig.d.ts +21 -0
  213. package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -0
  214. package/dist/data/ai/AdvancedChatConfig.js +289 -0
  215. package/dist/data/ai/AdvancedChatConfig.js.map +1 -0
  216. package/dist/data/ai/AdvancedCostsPanel.cjs +120 -0
  217. package/dist/data/ai/AdvancedCostsPanel.cjs.map +1 -0
  218. package/dist/data/ai/AdvancedCostsPanel.d.ts +16 -0
  219. package/dist/data/ai/AdvancedCostsPanel.d.ts.map +1 -0
  220. package/dist/data/ai/AdvancedCostsPanel.js +120 -0
  221. package/dist/data/ai/AdvancedCostsPanel.js.map +1 -0
  222. package/dist/data/ai/ChatWindow.catalogs.cjs +74 -0
  223. package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -0
  224. package/dist/data/ai/ChatWindow.catalogs.d.ts +16 -0
  225. package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -0
  226. package/dist/data/ai/ChatWindow.catalogs.js +74 -0
  227. package/dist/data/ai/ChatWindow.catalogs.js.map +1 -0
  228. package/dist/data/ai/ChatWindow.cjs +78 -100
  229. package/dist/data/ai/ChatWindow.cjs.map +1 -1
  230. package/dist/data/ai/ChatWindow.d.ts +1 -1
  231. package/dist/data/ai/ChatWindow.d.ts.map +1 -1
  232. package/dist/data/ai/ChatWindow.js +80 -102
  233. package/dist/data/ai/ChatWindow.js.map +1 -1
  234. package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
  235. package/dist/data/ai/ChatWindow.preferences.d.ts +2 -4
  236. package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
  237. package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
  238. package/dist/data/ai/ChatWindow.runtime.cjs +120 -0
  239. package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -0
  240. package/dist/data/ai/ChatWindow.runtime.d.ts +20 -0
  241. package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -0
  242. package/dist/data/ai/ChatWindow.runtime.js +120 -0
  243. package/dist/data/ai/ChatWindow.runtime.js.map +1 -0
  244. package/dist/data/ai/ChatWindow.thread.cjs +1 -1
  245. package/dist/data/ai/ChatWindow.thread.cjs.map +1 -1
  246. package/dist/data/ai/ChatWindow.thread.js +1 -1
  247. package/dist/data/ai/ChatWindow.thread.js.map +1 -1
  248. package/dist/data/ai/ChatWindow.tool-catalog.cjs +20 -0
  249. package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
  250. package/dist/data/ai/ChatWindow.tool-catalog.d.ts +17 -1
  251. package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
  252. package/dist/data/ai/ChatWindow.tool-catalog.js +20 -0
  253. package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
  254. package/dist/data/ai/ChatWindow.types.d.ts +13 -5
  255. package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
  256. package/dist/data/ai/ChatWindowManager.cjs +3 -1
  257. package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
  258. package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
  259. package/dist/data/ai/ChatWindowManager.js +3 -1
  260. package/dist/data/ai/ChatWindowManager.js.map +1 -1
  261. package/dist/data/ai/PromptPicker/PromptPicker.cjs +1 -1
  262. package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
  263. package/dist/data/ai/PromptPicker/PromptPicker.d.ts +1 -1
  264. package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
  265. package/dist/data/ai/PromptPicker/PromptPicker.js +1 -1
  266. package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
  267. package/dist/data/ai/PromptRunEditor/index.cjs +2 -2
  268. package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
  269. package/dist/data/ai/PromptRunEditor/index.d.ts +1 -1
  270. package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
  271. package/dist/data/ai/PromptRunEditor/index.js +2 -2
  272. package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
  273. package/dist/data/ai/RuntimeModePicker.cjs +1 -1
  274. package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
  275. package/dist/data/ai/RuntimeModePicker.d.ts +1 -1
  276. package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
  277. package/dist/data/ai/RuntimeModePicker.js +1 -1
  278. package/dist/data/ai/RuntimeModePicker.js.map +1 -1
  279. package/dist/data/ai/SessionInspector.files.cjs +26 -43
  280. package/dist/data/ai/SessionInspector.files.cjs.map +1 -1
  281. package/dist/data/ai/SessionInspector.files.d.ts.map +1 -1
  282. package/dist/data/ai/SessionInspector.files.js +26 -43
  283. package/dist/data/ai/SessionInspector.files.js.map +1 -1
  284. package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
  285. package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
  286. package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
  287. package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
  288. package/dist/data/ai/SessionInspector.model.cjs +1 -1
  289. package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
  290. package/dist/data/ai/SessionInspector.model.js +1 -1
  291. package/dist/data/ai/SessionInspector.model.js.map +1 -1
  292. package/dist/data/ai/SessionViewer.rows.cjs +4 -16
  293. package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
  294. package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
  295. package/dist/data/ai/SessionViewer.rows.js +4 -16
  296. package/dist/data/ai/SessionViewer.rows.js.map +1 -1
  297. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +12 -3
  298. package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
  299. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +1 -1
  300. package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
  301. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +12 -3
  302. package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
  303. package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
  304. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +1 -1
  305. package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
  306. package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
  307. package/dist/data/ai/SpecRuntimeEditor/fields.js +1 -1
  308. package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
  309. package/dist/data/ai/SpecRuntimeEditor/index.d.ts +2 -2
  310. package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
  311. package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
  312. package/dist/data/ai/ThreadPicker.cjs +65 -3
  313. package/dist/data/ai/ThreadPicker.cjs.map +1 -1
  314. package/dist/data/ai/ThreadPicker.d.ts +11 -5
  315. package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
  316. package/dist/data/ai/ThreadPicker.js +65 -3
  317. package/dist/data/ai/ThreadPicker.js.map +1 -1
  318. package/dist/data/ai/ToolPreferences.cjs +65 -685
  319. package/dist/data/ai/ToolPreferences.cjs.map +1 -1
  320. package/dist/data/ai/ToolPreferences.d.ts +15 -17
  321. package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
  322. package/dist/data/ai/ToolPreferences.js +64 -683
  323. package/dist/data/ai/ToolPreferences.js.map +1 -1
  324. package/dist/data/ai/ToolPreferences.model.cjs +148 -0
  325. package/dist/data/ai/ToolPreferences.model.cjs.map +1 -0
  326. package/dist/data/ai/ToolPreferences.model.d.ts +31 -0
  327. package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -0
  328. package/dist/data/ai/ToolPreferences.model.js +148 -0
  329. package/dist/data/ai/ToolPreferences.model.js.map +1 -0
  330. package/dist/data/ai/ToolPreferencesList.cjs +270 -0
  331. package/dist/data/ai/ToolPreferencesList.cjs.map +1 -0
  332. package/dist/data/ai/ToolPreferencesList.d.ts +18 -0
  333. package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -0
  334. package/dist/data/ai/ToolPreferencesList.js +270 -0
  335. package/dist/data/ai/ToolPreferencesList.js.map +1 -0
  336. package/dist/data/ai/agent-action-icons.cjs.map +1 -1
  337. package/dist/data/ai/agent-action-icons.js.map +1 -1
  338. package/dist/data/ai/chat-window-context.cjs +4 -1
  339. package/dist/data/ai/chat-window-context.cjs.map +1 -1
  340. package/dist/data/ai/chat-window-context.d.ts +7 -0
  341. package/dist/data/ai/chat-window-context.d.ts.map +1 -1
  342. package/dist/data/ai/chat-window-context.js +4 -1
  343. package/dist/data/ai/chat-window-context.js.map +1 -1
  344. package/dist/data/ai/index.d.ts +6 -3
  345. package/dist/data/ai/index.d.ts.map +1 -1
  346. package/dist/data/ai/session-tones.cjs +67 -0
  347. package/dist/data/ai/session-tones.cjs.map +1 -0
  348. package/dist/data/ai/session-tones.d.ts +34 -0
  349. package/dist/data/ai/session-tones.d.ts.map +1 -0
  350. package/dist/data/ai/session-tones.js +67 -0
  351. package/dist/data/ai/session-tones.js.map +1 -0
  352. package/dist/data/ai/thread-costs.cjs +39 -0
  353. package/dist/data/ai/thread-costs.cjs.map +1 -0
  354. package/dist/data/ai/thread-costs.d.ts +62 -0
  355. package/dist/data/ai/thread-costs.d.ts.map +1 -0
  356. package/dist/data/ai/thread-costs.js +39 -0
  357. package/dist/data/ai/thread-costs.js.map +1 -0
  358. package/dist/data/cells/CellFilterActions.cjs +68 -0
  359. package/dist/data/cells/CellFilterActions.cjs.map +1 -0
  360. package/dist/data/cells/CellFilterActions.d.ts +15 -0
  361. package/dist/data/cells/CellFilterActions.d.ts.map +1 -0
  362. package/dist/data/cells/CellFilterActions.js +68 -0
  363. package/dist/data/cells/CellFilterActions.js.map +1 -0
  364. package/dist/data/chat/Chat.cjs +156 -113
  365. package/dist/data/chat/Chat.cjs.map +1 -1
  366. package/dist/data/chat/Chat.d.ts +24 -7
  367. package/dist/data/chat/Chat.d.ts.map +1 -1
  368. package/dist/data/chat/Chat.fixtures.cjs +48 -3
  369. package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
  370. package/dist/data/chat/Chat.fixtures.d.ts +1 -1
  371. package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
  372. package/dist/data/chat/Chat.fixtures.js +48 -3
  373. package/dist/data/chat/Chat.fixtures.js.map +1 -1
  374. package/dist/data/chat/Chat.js +160 -117
  375. package/dist/data/chat/Chat.js.map +1 -1
  376. package/dist/data/chat/Chat.runtime.cjs +63 -0
  377. package/dist/data/chat/Chat.runtime.cjs.map +1 -0
  378. package/dist/data/chat/Chat.runtime.d.ts +16 -0
  379. package/dist/data/chat/Chat.runtime.d.ts.map +1 -0
  380. package/dist/data/chat/Chat.runtime.js +63 -0
  381. package/dist/data/chat/Chat.runtime.js.map +1 -0
  382. package/dist/data/chat/ChatRuntimeToolbar.cjs +62 -0
  383. package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -0
  384. package/dist/data/chat/ChatRuntimeToolbar.d.ts +14 -0
  385. package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -0
  386. package/dist/data/chat/ChatRuntimeToolbar.js +62 -0
  387. package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -0
  388. package/dist/data/chat/ToolCall.cjs +86 -24
  389. package/dist/data/chat/ToolCall.cjs.map +1 -1
  390. package/dist/data/chat/ToolCall.d.ts +12 -5
  391. package/dist/data/chat/ToolCall.d.ts.map +1 -1
  392. package/dist/data/chat/ToolCall.js +86 -24
  393. package/dist/data/chat/ToolCall.js.map +1 -1
  394. package/dist/data/chat/approval.cjs +49 -6
  395. package/dist/data/chat/approval.cjs.map +1 -1
  396. package/dist/data/chat/approval.d.ts +11 -4
  397. package/dist/data/chat/approval.d.ts.map +1 -1
  398. package/dist/data/chat/approval.js +49 -6
  399. package/dist/data/chat/approval.js.map +1 -1
  400. package/dist/data/chat/index.d.ts +5 -3
  401. package/dist/data/chat/index.d.ts.map +1 -1
  402. package/dist/data/chat/tool-render/ToolArgs.cjs +50 -0
  403. package/dist/data/chat/tool-render/ToolArgs.cjs.map +1 -0
  404. package/dist/data/chat/tool-render/ToolArgs.d.ts +7 -0
  405. package/dist/data/chat/tool-render/ToolArgs.d.ts.map +1 -0
  406. package/dist/data/chat/tool-render/ToolArgs.js +50 -0
  407. package/dist/data/chat/tool-render/ToolArgs.js.map +1 -0
  408. package/dist/data/chat/tool-render/ToolParams.cjs +155 -0
  409. package/dist/data/chat/tool-render/ToolParams.cjs.map +1 -0
  410. package/dist/data/chat/tool-render/ToolParams.d.ts +20 -0
  411. package/dist/data/chat/tool-render/ToolParams.d.ts.map +1 -0
  412. package/dist/data/chat/tool-render/ToolParams.js +155 -0
  413. package/dist/data/chat/tool-render/ToolParams.js.map +1 -0
  414. package/dist/data/chat/tool-render/ToolValue.cjs +140 -0
  415. package/dist/data/chat/tool-render/ToolValue.cjs.map +1 -0
  416. package/dist/data/chat/tool-render/ToolValue.d.ts +16 -0
  417. package/dist/data/chat/tool-render/ToolValue.d.ts.map +1 -0
  418. package/dist/data/chat/tool-render/ToolValue.js +140 -0
  419. package/dist/data/chat/tool-render/ToolValue.js.map +1 -0
  420. package/dist/data/chat/tool-render/adapter.cjs +48 -0
  421. package/dist/data/chat/tool-render/adapter.cjs.map +1 -0
  422. package/dist/data/chat/tool-render/adapter.d.ts +57 -0
  423. package/dist/data/chat/tool-render/adapter.d.ts.map +1 -0
  424. package/dist/data/chat/tool-render/adapter.js +48 -0
  425. package/dist/data/chat/tool-render/adapter.js.map +1 -0
  426. package/dist/data/chat/tool-render/context.cjs +16 -0
  427. package/dist/data/chat/tool-render/context.cjs.map +1 -0
  428. package/dist/data/chat/tool-render/context.d.ts +6 -0
  429. package/dist/data/chat/tool-render/context.d.ts.map +1 -0
  430. package/dist/data/chat/tool-render/context.js +16 -0
  431. package/dist/data/chat/tool-render/context.js.map +1 -0
  432. package/dist/data/chat/tool-render/defaults.cjs +45 -0
  433. package/dist/data/chat/tool-render/defaults.cjs.map +1 -0
  434. package/dist/data/chat/tool-render/defaults.d.ts +11 -0
  435. package/dist/data/chat/tool-render/defaults.d.ts.map +1 -0
  436. package/dist/data/chat/tool-render/defaults.js +45 -0
  437. package/dist/data/chat/tool-render/defaults.js.map +1 -0
  438. package/dist/data/chat/tool-render/index.d.ts +13 -0
  439. package/dist/data/chat/tool-render/index.d.ts.map +1 -0
  440. package/dist/data/chat/tool-render/known-tool-views.cjs +208 -0
  441. package/dist/data/chat/tool-render/known-tool-views.cjs.map +1 -0
  442. package/dist/data/chat/tool-render/known-tool-views.d.ts +10 -0
  443. package/dist/data/chat/tool-render/known-tool-views.d.ts.map +1 -0
  444. package/dist/data/chat/tool-render/known-tool-views.js +208 -0
  445. package/dist/data/chat/tool-render/known-tool-views.js.map +1 -0
  446. package/dist/data/chat/tool-render/known-tools.cjs +58 -0
  447. package/dist/data/chat/tool-render/known-tools.cjs.map +1 -0
  448. package/dist/data/chat/tool-render/known-tools.d.ts +4 -0
  449. package/dist/data/chat/tool-render/known-tools.d.ts.map +1 -0
  450. package/dist/data/chat/tool-render/known-tools.js +58 -0
  451. package/dist/data/chat/tool-render/known-tools.js.map +1 -0
  452. package/dist/data/chat/tool-render/normalize.cjs +42 -0
  453. package/dist/data/chat/tool-render/normalize.cjs.map +1 -0
  454. package/dist/data/chat/tool-render/normalize.d.ts +13 -0
  455. package/dist/data/chat/tool-render/normalize.d.ts.map +1 -0
  456. package/dist/data/chat/tool-render/normalize.js +42 -0
  457. package/dist/data/chat/tool-render/normalize.js.map +1 -0
  458. package/dist/data/chat/tool-render/registry.cjs +14 -0
  459. package/dist/data/chat/tool-render/registry.cjs.map +1 -0
  460. package/dist/data/chat/tool-render/registry.d.ts +7 -0
  461. package/dist/data/chat/tool-render/registry.d.ts.map +1 -0
  462. package/dist/data/chat/tool-render/registry.js +14 -0
  463. package/dist/data/chat/tool-render/registry.js.map +1 -0
  464. package/dist/data/chat/tool-render/schema.cjs +57 -0
  465. package/dist/data/chat/tool-render/schema.cjs.map +1 -0
  466. package/dist/data/chat/tool-render/schema.d.ts +28 -0
  467. package/dist/data/chat/tool-render/schema.d.ts.map +1 -0
  468. package/dist/data/chat/tool-render/schema.js +57 -0
  469. package/dist/data/chat/tool-render/schema.js.map +1 -0
  470. package/dist/data/chat/tool-render/shape.cjs +94 -0
  471. package/dist/data/chat/tool-render/shape.cjs.map +1 -0
  472. package/dist/data/chat/tool-render/shape.d.ts +39 -0
  473. package/dist/data/chat/tool-render/shape.d.ts.map +1 -0
  474. package/dist/data/chat/tool-render/shape.js +94 -0
  475. package/dist/data/chat/tool-render/shape.js.map +1 -0
  476. package/dist/data/chat/tool-render/summary.cjs +34 -0
  477. package/dist/data/chat/tool-render/summary.cjs.map +1 -0
  478. package/dist/data/chat/tool-render/summary.d.ts +8 -0
  479. package/dist/data/chat/tool-render/summary.d.ts.map +1 -0
  480. package/dist/data/chat/tool-render/summary.js +34 -0
  481. package/dist/data/chat/tool-render/summary.js.map +1 -0
  482. package/dist/data/chat/types.cjs.map +1 -1
  483. package/dist/data/chat/types.d.ts +7 -0
  484. package/dist/data/chat/types.d.ts.map +1 -1
  485. package/dist/data/chat/types.js.map +1 -1
  486. package/dist/data/chat/usage-snapshot.cjs +17 -0
  487. package/dist/data/chat/usage-snapshot.cjs.map +1 -0
  488. package/dist/data/chat/usage-snapshot.d.ts +21 -0
  489. package/dist/data/chat/usage-snapshot.d.ts.map +1 -0
  490. package/dist/data/chat/usage-snapshot.js +17 -0
  491. package/dist/data/chat/usage-snapshot.js.map +1 -0
  492. package/dist/data/data-table-filter-values.cjs +83 -0
  493. package/dist/data/data-table-filter-values.cjs.map +1 -0
  494. package/dist/data/data-table-filter-values.d.ts +18 -0
  495. package/dist/data/data-table-filter-values.d.ts.map +1 -0
  496. package/dist/data/data-table-filter-values.js +83 -0
  497. package/dist/data/data-table-filter-values.js.map +1 -0
  498. package/dist/data/data-table-server-filters.cjs +171 -0
  499. package/dist/data/data-table-server-filters.cjs.map +1 -0
  500. package/dist/data/data-table-server-filters.d.ts +128 -0
  501. package/dist/data/data-table-server-filters.d.ts.map +1 -0
  502. package/dist/data/data-table-server-filters.js +171 -0
  503. package/dist/data/data-table-server-filters.js.map +1 -0
  504. package/dist/data/query-browser/QueryBrowser.cjs +96 -19
  505. package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
  506. package/dist/data/query-browser/QueryBrowser.d.ts +37 -6
  507. package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
  508. package/dist/data/query-browser/QueryBrowser.js +96 -19
  509. package/dist/data/query-browser/QueryBrowser.js.map +1 -1
  510. package/dist/data/query-browser/index.d.ts +1 -1
  511. package/dist/data/query-browser/index.d.ts.map +1 -1
  512. package/dist/data/runtime/ProviderStatusPanel.cjs +187 -0
  513. package/dist/data/runtime/ProviderStatusPanel.cjs.map +1 -0
  514. package/dist/data/runtime/ProviderStatusPanel.d.ts +10 -0
  515. package/dist/data/runtime/ProviderStatusPanel.d.ts.map +1 -0
  516. package/dist/data/runtime/ProviderStatusPanel.js +187 -0
  517. package/dist/data/runtime/ProviderStatusPanel.js.map +1 -0
  518. package/dist/data/runtime/RuntimeBar.cjs +147 -0
  519. package/dist/data/runtime/RuntimeBar.cjs.map +1 -0
  520. package/dist/data/{ai → runtime}/RuntimeBar.d.ts +8 -6
  521. package/dist/data/runtime/RuntimeBar.d.ts.map +1 -0
  522. package/dist/data/runtime/RuntimeBar.js +147 -0
  523. package/dist/data/runtime/RuntimeBar.js.map +1 -0
  524. package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -0
  525. package/dist/data/{ai → runtime}/RuntimeBar.model.d.ts +2 -2
  526. package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
  527. package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
  528. package/dist/data/{ai → runtime}/RuntimeBarCombo.cjs +25 -30
  529. package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
  530. package/dist/data/{ai → runtime}/RuntimeBarCombo.d.ts +4 -3
  531. package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
  532. package/dist/data/{ai → runtime}/RuntimeBarCombo.js +25 -30
  533. package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
  534. package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +54 -120
  535. package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -0
  536. package/dist/data/runtime/RuntimeBarSegments.d.ts +25 -0
  537. package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -0
  538. package/dist/data/{ai/RuntimeBar.js → runtime/RuntimeBarSegments.js} +58 -124
  539. package/dist/data/runtime/RuntimeBarSegments.js.map +1 -0
  540. package/dist/data/runtime/availability.cjs +11 -0
  541. package/dist/data/runtime/availability.cjs.map +1 -0
  542. package/dist/data/runtime/availability.d.ts +6 -0
  543. package/dist/data/runtime/availability.d.ts.map +1 -0
  544. package/dist/data/runtime/availability.js +11 -0
  545. package/dist/data/runtime/availability.js.map +1 -0
  546. package/dist/data/runtime/model-capabilities.cjs.map +1 -0
  547. package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
  548. package/dist/data/runtime/model-capabilities.js.map +1 -0
  549. package/dist/data/runtime/provider-status.cjs +106 -0
  550. package/dist/data/runtime/provider-status.cjs.map +1 -0
  551. package/dist/data/runtime/provider-status.d.ts +24 -0
  552. package/dist/data/runtime/provider-status.d.ts.map +1 -0
  553. package/dist/data/runtime/provider-status.js +106 -0
  554. package/dist/data/runtime/provider-status.js.map +1 -0
  555. package/dist/data/{ai → runtime}/runtime-mode.cjs +119 -27
  556. package/dist/data/runtime/runtime-mode.cjs.map +1 -0
  557. package/dist/data/{ai → runtime}/runtime-mode.d.ts +7 -1
  558. package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
  559. package/dist/data/{ai → runtime}/runtime-mode.js +120 -28
  560. package/dist/data/runtime/runtime-mode.js.map +1 -0
  561. package/dist/data/task-query-keys.cjs +26 -0
  562. package/dist/data/task-query-keys.cjs.map +1 -0
  563. package/dist/data/task-query-keys.d.ts +27 -0
  564. package/dist/data/task-query-keys.d.ts.map +1 -0
  565. package/dist/data/task-query-keys.js +26 -0
  566. package/dist/data/task-query-keys.js.map +1 -0
  567. package/dist/data/version-info.cjs +3 -3
  568. package/dist/data/version-info.js +3 -3
  569. package/dist/data.cjs +16 -0
  570. package/dist/data.cjs.map +1 -1
  571. package/dist/data.d.ts +6 -2
  572. package/dist/data.d.ts.map +1 -1
  573. package/dist/data.js +16 -0
  574. package/dist/data.js.map +1 -1
  575. package/dist/hooks/use-hotkey.cjs +6 -1
  576. package/dist/hooks/use-hotkey.cjs.map +1 -1
  577. package/dist/hooks/use-hotkey.d.ts.map +1 -1
  578. package/dist/hooks/use-hotkey.js +6 -1
  579. package/dist/hooks/use-hotkey.js.map +1 -1
  580. package/dist/hooks/use-task-run.cjs +7 -4
  581. package/dist/hooks/use-task-run.cjs.map +1 -1
  582. package/dist/hooks/use-task-run.d.ts +12 -0
  583. package/dist/hooks/use-task-run.d.ts.map +1 -1
  584. package/dist/hooks/use-task-run.js +7 -4
  585. package/dist/hooks/use-task-run.js.map +1 -1
  586. package/dist/icons/index.d.ts +1 -0
  587. package/dist/icons/index.d.ts.map +1 -1
  588. package/dist/icons/registry.cjs +692 -0
  589. package/dist/icons/registry.cjs.map +1 -0
  590. package/dist/icons/registry.d.ts +21 -0
  591. package/dist/icons/registry.d.ts.map +1 -0
  592. package/dist/icons/registry.js +692 -0
  593. package/dist/icons/registry.js.map +1 -0
  594. package/dist/icons.cjs +3 -0
  595. package/dist/icons.cjs.map +1 -1
  596. package/dist/icons.js +4 -1
  597. package/dist/icons.js.map +1 -1
  598. package/dist/index.cjs +47 -0
  599. package/dist/index.cjs.map +1 -1
  600. package/dist/index.js +49 -2
  601. package/dist/index.js.map +1 -1
  602. package/dist/layout/AppShell.cjs +92 -56
  603. package/dist/layout/AppShell.cjs.map +1 -1
  604. package/dist/layout/AppShell.d.ts +49 -1
  605. package/dist/layout/AppShell.d.ts.map +1 -1
  606. package/dist/layout/AppShell.js +92 -56
  607. package/dist/layout/AppShell.js.map +1 -1
  608. package/dist/layout/AppShell.nav.cjs +144 -19
  609. package/dist/layout/AppShell.nav.cjs.map +1 -1
  610. package/dist/layout/AppShell.nav.d.ts +6 -1
  611. package/dist/layout/AppShell.nav.d.ts.map +1 -1
  612. package/dist/layout/AppShell.nav.js +144 -19
  613. package/dist/layout/AppShell.nav.js.map +1 -1
  614. package/dist/layout/SplitPane.cjs +23 -7
  615. package/dist/layout/SplitPane.cjs.map +1 -1
  616. package/dist/layout/SplitPane.d.ts +3 -1
  617. package/dist/layout/SplitPane.d.ts.map +1 -1
  618. package/dist/layout/SplitPane.js +23 -7
  619. package/dist/layout/SplitPane.js.map +1 -1
  620. package/dist/lib/format.cjs +86 -4
  621. package/dist/lib/format.cjs.map +1 -1
  622. package/dist/lib/format.d.ts +69 -0
  623. package/dist/lib/format.d.ts.map +1 -1
  624. package/dist/lib/format.js +86 -4
  625. package/dist/lib/format.js.map +1 -1
  626. package/dist/lib/path-tree.cjs +69 -0
  627. package/dist/lib/path-tree.cjs.map +1 -0
  628. package/dist/lib/path-tree.d.ts +54 -0
  629. package/dist/lib/path-tree.d.ts.map +1 -0
  630. package/dist/lib/path-tree.js +69 -0
  631. package/dist/lib/path-tree.js.map +1 -0
  632. package/dist/monaco.d.ts +1 -0
  633. package/dist/monaco.d.ts.map +1 -1
  634. package/dist/overlay/DropdownMenuSubmenu.cjs +13 -7
  635. package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
  636. package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
  637. package/dist/overlay/DropdownMenuSubmenu.js +13 -7
  638. package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
  639. package/dist/overlay/Tour.cjs +173 -0
  640. package/dist/overlay/Tour.cjs.map +1 -0
  641. package/dist/overlay/Tour.d.ts +61 -0
  642. package/dist/overlay/Tour.d.ts.map +1 -0
  643. package/dist/overlay/Tour.js +173 -0
  644. package/dist/overlay/Tour.js.map +1 -0
  645. package/dist/overlay/TourCard.cjs +108 -0
  646. package/dist/overlay/TourCard.cjs.map +1 -0
  647. package/dist/overlay/TourCard.d.ts +23 -0
  648. package/dist/overlay/TourCard.d.ts.map +1 -0
  649. package/dist/overlay/TourCard.js +108 -0
  650. package/dist/overlay/TourCard.js.map +1 -0
  651. package/dist/overlay/TourProvider.cjs +160 -0
  652. package/dist/overlay/TourProvider.cjs.map +1 -0
  653. package/dist/overlay/TourProvider.d.ts +31 -0
  654. package/dist/overlay/TourProvider.d.ts.map +1 -0
  655. package/dist/overlay/TourProvider.js +160 -0
  656. package/dist/overlay/TourProvider.js.map +1 -0
  657. package/dist/overlay/TourSpotlight.cjs +47 -0
  658. package/dist/overlay/TourSpotlight.cjs.map +1 -0
  659. package/dist/overlay/TourSpotlight.d.ts +12 -0
  660. package/dist/overlay/TourSpotlight.d.ts.map +1 -0
  661. package/dist/overlay/TourSpotlight.js +47 -0
  662. package/dist/overlay/TourSpotlight.js.map +1 -0
  663. package/dist/overlay/modalStack.cjs +18 -4
  664. package/dist/overlay/modalStack.cjs.map +1 -1
  665. package/dist/overlay/modalStack.d.ts +10 -2
  666. package/dist/overlay/modalStack.d.ts.map +1 -1
  667. package/dist/overlay/modalStack.js +19 -5
  668. package/dist/overlay/modalStack.js.map +1 -1
  669. package/dist/overlay/tour-anchor.cjs +114 -0
  670. package/dist/overlay/tour-anchor.cjs.map +1 -0
  671. package/dist/overlay/tour-anchor.d.ts +30 -0
  672. package/dist/overlay/tour-anchor.d.ts.map +1 -0
  673. package/dist/overlay/tour-anchor.js +114 -0
  674. package/dist/overlay/tour-anchor.js.map +1 -0
  675. package/dist/overlay/tour-context.cjs +12 -0
  676. package/dist/overlay/tour-context.cjs.map +1 -0
  677. package/dist/overlay/tour-context.d.ts +40 -0
  678. package/dist/overlay/tour-context.d.ts.map +1 -0
  679. package/dist/overlay/tour-context.js +12 -0
  680. package/dist/overlay/tour-context.js.map +1 -0
  681. package/dist/overlay/tour-geometry.cjs +65 -0
  682. package/dist/overlay/tour-geometry.cjs.map +1 -0
  683. package/dist/overlay/tour-geometry.d.ts +47 -0
  684. package/dist/overlay/tour-geometry.d.ts.map +1 -0
  685. package/dist/overlay/tour-geometry.js +65 -0
  686. package/dist/overlay/tour-geometry.js.map +1 -0
  687. package/dist/overlay/tour-model.cjs +79 -0
  688. package/dist/overlay/tour-model.cjs.map +1 -0
  689. package/dist/overlay/tour-model.d.ts +29 -0
  690. package/dist/overlay/tour-model.d.ts.map +1 -0
  691. package/dist/overlay/tour-model.js +79 -0
  692. package/dist/overlay/tour-model.js.map +1 -0
  693. package/dist/overlay/tour-progress.cjs +54 -0
  694. package/dist/overlay/tour-progress.cjs.map +1 -0
  695. package/dist/overlay/tour-progress.d.ts +40 -0
  696. package/dist/overlay/tour-progress.d.ts.map +1 -0
  697. package/dist/overlay/tour-progress.js +54 -0
  698. package/dist/overlay/tour-progress.js.map +1 -0
  699. package/dist/overlay/tour-types.d.ts +144 -0
  700. package/dist/overlay/tour-types.d.ts.map +1 -0
  701. package/dist/overlay/use-tour-anchor.cjs +43 -0
  702. package/dist/overlay/use-tour-anchor.cjs.map +1 -0
  703. package/dist/overlay/use-tour-anchor.d.ts +23 -0
  704. package/dist/overlay/use-tour-anchor.d.ts.map +1 -0
  705. package/dist/overlay/use-tour-anchor.js +43 -0
  706. package/dist/overlay/use-tour-anchor.js.map +1 -0
  707. package/dist/overlay/use-tour-rect.cjs +33 -0
  708. package/dist/overlay/use-tour-rect.cjs.map +1 -0
  709. package/dist/overlay/use-tour-rect.d.ts +12 -0
  710. package/dist/overlay/use-tour-rect.d.ts.map +1 -0
  711. package/dist/overlay/use-tour-rect.js +33 -0
  712. package/dist/overlay/use-tour-rect.js.map +1 -0
  713. package/dist/overlay/use-tour-step.cjs +66 -0
  714. package/dist/overlay/use-tour-step.cjs.map +1 -0
  715. package/dist/overlay/use-tour-step.d.ts +45 -0
  716. package/dist/overlay/use-tour-step.d.ts.map +1 -0
  717. package/dist/overlay/use-tour-step.js +66 -0
  718. package/dist/overlay/use-tour-step.js.map +1 -0
  719. package/dist/overlay/zIndex.cjs +8 -0
  720. package/dist/overlay/zIndex.cjs.map +1 -1
  721. package/dist/overlay/zIndex.d.ts +8 -0
  722. package/dist/overlay/zIndex.d.ts.map +1 -1
  723. package/dist/overlay/zIndex.js +8 -0
  724. package/dist/overlay/zIndex.js.map +1 -1
  725. package/dist/rpc/CommandOutput.cjs +8 -0
  726. package/dist/rpc/CommandOutput.cjs.map +1 -1
  727. package/dist/rpc/CommandOutput.d.ts +4 -1
  728. package/dist/rpc/CommandOutput.d.ts.map +1 -1
  729. package/dist/rpc/CommandOutput.js +8 -0
  730. package/dist/rpc/CommandOutput.js.map +1 -1
  731. package/dist/rpc/EntityExplorerApp.cjs +10 -16
  732. package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
  733. package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
  734. package/dist/rpc/EntityExplorerApp.js +10 -16
  735. package/dist/rpc/EntityExplorerApp.js.map +1 -1
  736. package/dist/rpc/OperationActionBar.cjs +1 -1
  737. package/dist/rpc/OperationActionBar.cjs.map +1 -1
  738. package/dist/rpc/OperationActionBar.js +1 -1
  739. package/dist/rpc/OperationActionBar.js.map +1 -1
  740. package/dist/rpc/OperationCatalog.cjs +83 -7
  741. package/dist/rpc/OperationCatalog.cjs.map +1 -1
  742. package/dist/rpc/OperationCatalog.d.ts.map +1 -1
  743. package/dist/rpc/OperationCatalog.js +84 -8
  744. package/dist/rpc/OperationCatalog.js.map +1 -1
  745. package/dist/rpc/OperationResultView.cjs +2 -0
  746. package/dist/rpc/OperationResultView.cjs.map +1 -1
  747. package/dist/rpc/OperationResultView.d.ts +6 -0
  748. package/dist/rpc/OperationResultView.d.ts.map +1 -1
  749. package/dist/rpc/OperationResultView.js +2 -0
  750. package/dist/rpc/OperationResultView.js.map +1 -1
  751. package/dist/rpc/SchemaActionForm.cjs +2 -21
  752. package/dist/rpc/SchemaActionForm.cjs.map +1 -1
  753. package/dist/rpc/SchemaActionForm.d.ts.map +1 -1
  754. package/dist/rpc/SchemaActionForm.js +3 -22
  755. package/dist/rpc/SchemaActionForm.js.map +1 -1
  756. package/dist/rpc/apiClient.cjs +16 -2
  757. package/dist/rpc/apiClient.cjs.map +1 -1
  758. package/dist/rpc/apiClient.d.ts.map +1 -1
  759. package/dist/rpc/apiClient.js +16 -2
  760. package/dist/rpc/apiClient.js.map +1 -1
  761. package/dist/rpc/formMetadata.cjs +89 -49
  762. package/dist/rpc/formMetadata.cjs.map +1 -1
  763. package/dist/rpc/formMetadata.d.ts +14 -6
  764. package/dist/rpc/formMetadata.d.ts.map +1 -1
  765. package/dist/rpc/formMetadata.js +87 -47
  766. package/dist/rpc/formMetadata.js.map +1 -1
  767. package/dist/rpc/operationFilterSearch.cjs +23 -0
  768. package/dist/rpc/operationFilterSearch.cjs.map +1 -0
  769. package/dist/rpc/operationFilterSearch.d.ts +22 -0
  770. package/dist/rpc/operationFilterSearch.d.ts.map +1 -0
  771. package/dist/rpc/operationFilterSearch.js +23 -0
  772. package/dist/rpc/operationFilterSearch.js.map +1 -0
  773. package/dist/rpc/operationLookupFetcher.cjs +28 -0
  774. package/dist/rpc/operationLookupFetcher.cjs.map +1 -0
  775. package/dist/rpc/operationLookupFetcher.d.ts +17 -0
  776. package/dist/rpc/operationLookupFetcher.d.ts.map +1 -0
  777. package/dist/rpc/operationLookupFetcher.js +28 -0
  778. package/dist/rpc/operationLookupFetcher.js.map +1 -0
  779. package/dist/rpc/surfaceNav.cjs +77 -0
  780. package/dist/rpc/surfaceNav.cjs.map +1 -0
  781. package/dist/rpc/surfaceNav.d.ts +19 -0
  782. package/dist/rpc/surfaceNav.d.ts.map +1 -0
  783. package/dist/rpc/surfaceNav.js +77 -0
  784. package/dist/rpc/surfaceNav.js.map +1 -0
  785. package/dist/rpc/types.cjs.map +1 -1
  786. package/dist/rpc/types.d.ts +12 -1
  787. package/dist/rpc/types.d.ts.map +1 -1
  788. package/dist/rpc/types.js.map +1 -1
  789. package/dist/rpc.cjs +2 -0
  790. package/dist/rpc.cjs.map +1 -1
  791. package/dist/rpc.d.ts +1 -0
  792. package/dist/rpc.d.ts.map +1 -1
  793. package/dist/rpc.js +2 -0
  794. package/dist/rpc.js.map +1 -1
  795. package/dist/styles.css +1 -1
  796. package/dist/utils.cjs +8 -0
  797. package/dist/utils.cjs.map +1 -1
  798. package/dist/utils.d.ts +2 -1
  799. package/dist/utils.d.ts.map +1 -1
  800. package/dist/utils.js +10 -2
  801. package/dist/utils.js.map +1 -1
  802. package/package.json +1 -1
  803. package/dist/data/ai/RuntimeBar.cjs.map +0 -1
  804. package/dist/data/ai/RuntimeBar.d.ts.map +0 -1
  805. package/dist/data/ai/RuntimeBar.js.map +0 -1
  806. package/dist/data/ai/RuntimeBar.model.cjs.map +0 -1
  807. package/dist/data/ai/RuntimeBar.model.d.ts.map +0 -1
  808. package/dist/data/ai/RuntimeBar.model.js.map +0 -1
  809. package/dist/data/ai/RuntimeBarCombo.cjs.map +0 -1
  810. package/dist/data/ai/RuntimeBarCombo.d.ts.map +0 -1
  811. package/dist/data/ai/RuntimeBarCombo.js.map +0 -1
  812. package/dist/data/ai/model-capabilities.cjs.map +0 -1
  813. package/dist/data/ai/model-capabilities.d.ts.map +0 -1
  814. package/dist/data/ai/model-capabilities.js.map +0 -1
  815. package/dist/data/ai/runtime-mode.cjs.map +0 -1
  816. package/dist/data/ai/runtime-mode.d.ts.map +0 -1
  817. package/dist/data/ai/runtime-mode.js.map +0 -1
  818. /package/dist/data/{ai → runtime}/RuntimeBar.model.cjs +0 -0
  819. /package/dist/data/{ai → runtime}/RuntimeBar.model.js +0 -0
  820. /package/dist/data/{ai → runtime}/model-capabilities.cjs +0 -0
  821. /package/dist/data/{ai → runtime}/model-capabilities.d.ts +0 -0
  822. /package/dist/data/{ai → runtime}/model-capabilities.js +0 -0
@@ -1,115 +1,19 @@
1
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
1
+ import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
2
  import { Suspense, useState, useRef, useCallback, useEffect, lazy } from "react";
3
3
  import { cn } from "../lib/utils.js";
4
- import { LabelIcon } from "../data/Icon.js";
5
4
  import { formatDateTimeRelative } from "../data/cells/timestamp-format.js";
6
5
  import { Combobox } from "./Combobox.js";
7
6
  import { DateTimePicker } from "./DateTimePicker.js";
8
7
  import { SegmentedControl } from "./SegmentedControl.js";
9
8
  import { GridControl } from "./json-schema-form-grid.js";
9
+ import { LookupTreeControl } from "./json-schema-form-lookup-tree.js";
10
10
  import { useLookupFetcher, resolveLookupScope } from "./form-lookup-context.js";
11
- import { toText, defaultPlaceholder, inputClass, withSyntheticValue } from "./json-schema-form-utils.js";
12
- import { inlineRowGapClass, stackedRowGapClass, labelSizeClass, fieldInnerGapClass, controlMinHeightClass, controlHeightClass } from "./json-schema-form-size.js";
11
+ import { toText, defaultPlaceholder, inputClass, fieldAriaProps, comboboxAriaProps, withSyntheticValue } from "./json-schema-form-utils.js";
12
+ import { labelSizeClass, controlHeightClass } from "./json-schema-form-size.js";
13
13
  const LazyMdxEditorField = lazy(async () => {
14
14
  const mod = await import("./MdxEditorField.js");
15
15
  return { default: mod.MdxEditorField };
16
16
  });
17
- function FieldsGrid({
18
- layout,
19
- size,
20
- columns,
21
- className,
22
- children
23
- }) {
24
- if (layout.mode === "inline") {
25
- const labelMaxWidth = layout.labelMaxWidth ?? "40ch";
26
- const valueMaxWidth = layout.valueMaxWidth ?? "600px";
27
- return /* @__PURE__ */ jsx(
28
- "div",
29
- {
30
- className: cn("grid", inlineRowGapClass[size], className),
31
- style: { gridTemplateColumns: `fit-content(${labelMaxWidth}) minmax(0, ${valueMaxWidth})` },
32
- children
33
- }
34
- );
35
- }
36
- if (columns && columns > 1) {
37
- return /* @__PURE__ */ jsx(
38
- "div",
39
- {
40
- className: cn("grid gap-x-3", stackedRowGapClass[size], className),
41
- style: { gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` },
42
- children
43
- }
44
- );
45
- }
46
- return /* @__PURE__ */ jsx("div", { className: cn("grid", stackedRowGapClass[size], className), children });
47
- }
48
- function FieldWrapper({
49
- label,
50
- value,
51
- helper,
52
- error,
53
- layout,
54
- size
55
- }) {
56
- if (layout.mode === "inline") {
57
- return /* @__PURE__ */ jsxs("div", { className: "col-span-2 grid grid-cols-subgrid items-start gap-x-3 gap-y-0.5", children: [
58
- /* @__PURE__ */ jsx("div", { className: cn("flex min-w-0 items-center", controlMinHeightClass[size]), children: label }),
59
- /* @__PURE__ */ jsx("div", { className: "min-w-0", children: value }),
60
- helper && /* @__PURE__ */ jsx("p", { className: "col-start-2 text-xs text-muted-foreground", children: helper }),
61
- error && /* @__PURE__ */ jsx("p", { className: "col-start-2 text-xs text-destructive", children: error })
62
- ] });
63
- }
64
- return /* @__PURE__ */ jsxs(
65
- "div",
66
- {
67
- className: "flex w-full flex-col gap-1",
68
- style: { maxWidth: layout.valueMaxWidth ?? "600px" },
69
- children: [
70
- label,
71
- value,
72
- helper && /* @__PURE__ */ jsx("p", { className: "text-xs text-muted-foreground", children: helper }),
73
- error && /* @__PURE__ */ jsx("p", { className: "text-xs text-destructive", children: error })
74
- ]
75
- }
76
- );
77
- }
78
- function FieldLabel({ field, fieldId, size }) {
79
- return /* @__PURE__ */ jsxs(
80
- "label",
81
- {
82
- htmlFor: fieldId,
83
- className: cn("flex min-w-0 items-center gap-2 font-medium", labelSizeClass[size], field.labelClassName),
84
- children: [
85
- /* @__PURE__ */ jsx(LabelIcon, { icon: field.labelIcon, className: "shrink-0 text-[15px] text-muted-foreground" }),
86
- /* @__PURE__ */ jsx("span", { className: "truncate", title: field.label !== field.key ? field.key : void 0, children: field.label }),
87
- field.required && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-destructive", children: "*" }),
88
- field.badge && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground", children: field.badge })
89
- ]
90
- }
91
- );
92
- }
93
- function ObjectSection({
94
- label,
95
- required,
96
- size,
97
- badge,
98
- helper,
99
- labelIcon,
100
- children
101
- }) {
102
- return /* @__PURE__ */ jsxs("div", { className: cn("col-span-full flex min-w-0 max-w-full flex-col", fieldInnerGapClass[size]), children: [
103
- /* @__PURE__ */ jsxs("div", { className: cn("flex min-w-0 items-center gap-2 border-b border-border pb-1 font-semibold", labelSizeClass[size]), children: [
104
- /* @__PURE__ */ jsx(LabelIcon, { icon: labelIcon, className: "shrink-0 text-[15px] text-muted-foreground" }),
105
- /* @__PURE__ */ jsx("span", { className: "min-w-0 truncate", children: label }),
106
- required && /* @__PURE__ */ jsx("span", { className: "shrink-0 text-destructive", children: "*" }),
107
- badge && /* @__PURE__ */ jsx("span", { className: "shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground", children: badge })
108
- ] }),
109
- helper && /* @__PURE__ */ jsx("p", { className: "min-w-0 break-words text-xs text-muted-foreground", children: helper }),
110
- children
111
- ] });
112
- }
113
17
  function ReadOnlyValue({ field, fieldId, size }) {
114
18
  const text = toText(field.value);
115
19
  const secret = field.schema.format === "password";
@@ -151,6 +55,7 @@ function StringControl({
151
55
  type: field.schema.format === "password" ? "password" : "text",
152
56
  autoComplete: field.schema.format === "password" ? "new-password" : void 0,
153
57
  "data-jsf-input": true,
58
+ ...fieldAriaProps(field, fieldId),
154
59
  className: cn(inputClass(size), field.prefix && "pl-8", field.suffix && "pr-8", field.inputClassName),
155
60
  value: toText(field.value),
156
61
  disabled: readOnly,
@@ -184,6 +89,7 @@ function NumberControl({
184
89
  ...typeof field.schema.maximum === "number" ? { max: field.schema.maximum } : {}
185
90
  } : {},
186
91
  "data-jsf-input": true,
92
+ ...fieldAriaProps(field, fieldId),
187
93
  className: cn(inputClass(size), field.prefix && "pl-8", suffix && "pr-8", field.inputClassName),
188
94
  value: toText(field.value),
189
95
  disabled: readOnly,
@@ -236,6 +142,7 @@ function NumberSliderControl({
236
142
  "data-jsf-input": true,
237
143
  type: "range",
238
144
  "aria-label": field.label,
145
+ ...fieldAriaProps(field, fieldId),
239
146
  min,
240
147
  max,
241
148
  step,
@@ -274,6 +181,7 @@ function DateControl({
274
181
  id: fieldId,
275
182
  "aria-label": field.label,
276
183
  "data-jsf-input": true,
184
+ ...fieldAriaProps(field, fieldId),
277
185
  inputClassName: cn(inputClass(size), field.prefix && "pl-8", field.suffix ? "pr-14" : "pr-8"),
278
186
  value: text,
279
187
  onChange: (next) => field.onChange(next),
@@ -296,6 +204,7 @@ function BooleanControl({
296
204
  id: fieldId,
297
205
  type: "checkbox",
298
206
  className: "h-4 w-4 accent-primary",
207
+ ...fieldAriaProps(field, fieldId),
299
208
  checked: field.value === true,
300
209
  disabled: readOnly,
301
210
  onChange: (e) => field.onChange(e.target.checked)
@@ -333,6 +242,7 @@ function EnumControl({
333
242
  onChange: (v) => field.onChange(v),
334
243
  prefix: field.prefix,
335
244
  suffix: field.suffix,
245
+ ...comboboxAriaProps(field, fieldId),
336
246
  ...field.inputClassName ? { className: field.inputClassName } : {},
337
247
  ...defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {}
338
248
  }
@@ -404,6 +314,20 @@ function LookupControl({
404
314
  if (descriptor && fetcher) onSearch("");
405
315
  else setOptions([]);
406
316
  }, [scopeKey, onSearch]);
317
+ if (descriptor == null ? void 0 : descriptor.hierarchy) {
318
+ return /* @__PURE__ */ jsx(
319
+ LookupTreeControl,
320
+ {
321
+ field,
322
+ fieldId,
323
+ readOnly,
324
+ size,
325
+ options,
326
+ loading,
327
+ hierarchy: descriptor.hierarchy
328
+ }
329
+ );
330
+ }
407
331
  if (!descriptor || !fetcher) {
408
332
  return /* @__PURE__ */ jsx(
409
333
  Combobox,
@@ -415,6 +339,7 @@ function LookupControl({
415
339
  size,
416
340
  allowCustomValue: true,
417
341
  onChange: (v) => field.onChange(v),
342
+ ...comboboxAriaProps(field, fieldId),
418
343
  ...defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {}
419
344
  }
420
345
  );
@@ -431,6 +356,7 @@ function LookupControl({
431
356
  allowCustomValue: field.allowCustomValue ?? false,
432
357
  onSearch,
433
358
  onChange: (v) => field.onChange(v),
359
+ ...comboboxAriaProps(field, fieldId),
434
360
  ...defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {}
435
361
  }
436
362
  );
@@ -512,6 +438,7 @@ function TextareaControl({
512
438
  {
513
439
  id: fieldId,
514
440
  "data-jsf-input": true,
441
+ ...fieldAriaProps(field, fieldId),
515
442
  rows: 4,
516
443
  className: cn(
517
444
  inputClass(size),
@@ -538,6 +465,7 @@ function MarkdownControl({
538
465
  {
539
466
  id: fieldId,
540
467
  "data-jsf-input": true,
468
+ ...fieldAriaProps(field, fieldId),
541
469
  rows: 6,
542
470
  className: cn(inputClass(size), "h-auto resize-y font-mono", field.prefix && "pl-8", field.suffix && "pr-8"),
543
471
  value: toText(field.value),
@@ -604,15 +532,11 @@ export {
604
532
  DateControl,
605
533
  DisplayControl,
606
534
  EnumControl,
607
- FieldLabel,
608
- FieldWrapper,
609
- FieldsGrid,
610
535
  LinkControl,
611
536
  LookupControl,
612
537
  MarkdownControl,
613
538
  NumberControl,
614
539
  NumberSliderControl,
615
- ObjectSection,
616
540
  ReadOnlyValue,
617
541
  StringControl,
618
542
  TextareaControl
@@ -1 +1 @@
1
- {"version":3,"file":"json-schema-form-fields.js","sources":["../../src/components/json-schema-form-fields.tsx"],"sourcesContent":["import { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { LabelIcon, type LabelIconSpec } from \"../data/Icon\";\nimport { formatDateTimeRelative } from \"../data/cells/timestamp-format\";\nimport { Combobox } from \"./Combobox\";\nimport { DateTimePicker } from \"./DateTimePicker\";\nimport { SegmentedControl, type SegmentedSize } from \"./SegmentedControl\";\nimport { GridControl } from \"./json-schema-form-grid\";\nimport { resolveLookupScope, useLookupFetcher } from \"./form-lookup-context\";\nimport type { FieldControl, FieldOption, FormLayout } from \"./json-schema-form-types\";\nimport {\n defaultPlaceholder,\n inputClass,\n toText,\n withSyntheticValue,\n} from \"./json-schema-form-utils\";\nimport {\n controlHeightClass,\n controlMinHeightClass,\n fieldInnerGapClass,\n inlineRowGapClass,\n labelSizeClass,\n stackedRowGapClass,\n type FormSize,\n} from \"./json-schema-form-size\";\n\nconst LazyMdxEditorField = lazy(async () => {\n const mod = await import(\"./MdxEditorField\");\n return { default: mod.MdxEditorField };\n});\n\n// FieldsGrid is the container every group of field rows renders into — the\n// top-level form and each nested object/map. In inline mode it owns the single\n// 2-column track definition: `fit-content(labelMaxWidth)` for the label column,\n// `minmax(0, valueMaxWidth)` for the value column. Every field row is a\n// `subgrid` that inherits these tracks, so all labels share one column width and\n// every value lines up — a real form grid, not per-row independent grids.\n// (`fit-content()` is the only valid CSS for \"size to content, clamped to a max\"\n// — `min(w, max-content)` is rejected by the browser, which silently drops the\n// whole declaration and collapses every row to a stacked-looking column. The\n// template is an inline style because Tailwind can't interpolate runtime widths.)\n// Stacked mode is a plain single-column grid.\nexport function FieldsGrid({\n layout,\n size,\n columns,\n className,\n children,\n}: {\n layout: FormLayout;\n size: FormSize;\n // Object-level `x-columns`: split a stacked object into N equal columns. Fields\n // span one column unless they set `x-col-span`. Ignored in inline mode (which\n // owns its own 2-track label/value layout).\n columns?: number;\n // Object-level `x-classes`: extra classes merged onto the grid container\n // (e.g. `gap-2`, padding). Applied last so a standard utility wins over the\n // defaults via tailwind-merge.\n className?: string;\n children: ReactNode;\n}) {\n if (layout.mode === \"inline\") {\n const labelMaxWidth = layout.labelMaxWidth ?? \"40ch\";\n const valueMaxWidth = layout.valueMaxWidth ?? \"600px\";\n return (\n <div\n className={cn(\"grid\", inlineRowGapClass[size], className)}\n style={{ gridTemplateColumns: `fit-content(${labelMaxWidth}) minmax(0, ${valueMaxWidth})` }}\n >\n {children}\n </div>\n );\n }\n if (columns && columns > 1) {\n return (\n <div\n className={cn(\"grid gap-x-3\", stackedRowGapClass[size], className)}\n style={{ gridTemplateColumns: `repeat(${columns}, minmax(0, 1fr))` }}\n >\n {children}\n </div>\n );\n }\n return <div className={cn(\"grid\", stackedRowGapClass[size], className)}>{children}</div>;\n}\n\n// FieldWrapper lays out a single label + value (+ helper/error). In inline mode\n// it is a `subgrid` row spanning the parent FieldsGrid's two columns, so its\n// label and value snap to the shared label/value tracks (helper/error sit under\n// the value column). In stacked mode the label sits tight above its control as\n// one unit, capped at valueMaxWidth so controls don't stretch edge to edge.\nexport function FieldWrapper({\n label,\n value,\n helper,\n error,\n layout,\n size,\n}: {\n label: ReactNode;\n value: ReactNode;\n helper?: ReactNode;\n error?: ReactNode;\n layout: FormLayout;\n size: FormSize;\n}) {\n if (layout.mode === \"inline\") {\n return (\n <div className=\"col-span-2 grid grid-cols-subgrid items-start gap-x-3 gap-y-0.5\">\n <div className={cn(\"flex min-w-0 items-center\", controlMinHeightClass[size])}>{label}</div>\n <div className=\"min-w-0\">{value}</div>\n {helper && <p className=\"col-start-2 text-xs text-muted-foreground\">{helper}</p>}\n {error && <p className=\"col-start-2 text-xs text-destructive\">{error}</p>}\n </div>\n );\n }\n return (\n <div\n className=\"flex w-full flex-col gap-1\"\n style={{ maxWidth: layout.valueMaxWidth ?? \"600px\" }}\n >\n {label}\n {value}\n {helper && <p className=\"text-xs text-muted-foreground\">{helper}</p>}\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n );\n}\n\nexport function FieldLabel({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n return (\n <label\n htmlFor={fieldId}\n className={cn(\"flex min-w-0 items-center gap-2 font-medium\", labelSizeClass[size], field.labelClassName)}\n >\n <LabelIcon icon={field.labelIcon} className=\"shrink-0 text-[15px] text-muted-foreground\" />\n <span className=\"truncate\" title={field.label !== field.key ? field.key : undefined}>\n {field.label}\n </span>\n {field.required && <span className=\"shrink-0 text-destructive\">*</span>}\n {field.badge && (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {field.badge}\n </span>\n )}\n </label>\n );\n}\n\n// ObjectSection renders a nested object as a labelled section: a header row\n// (the field label + required/badge) above its fields, which fill the full\n// width below. It replaces the inline label + bordered box so nested objects\n// read as flat, headed groups rather than indented sub-forms. `col-span-full`\n// makes it span both tracks of an inline FieldsGrid (full width, not crammed\n// into the value column); in a stacked single-column grid it is a no-op.\nexport function ObjectSection({\n label,\n required,\n size,\n badge,\n helper,\n labelIcon,\n children,\n}: {\n label: string;\n required: boolean;\n size: FormSize;\n badge?: string;\n helper?: string;\n labelIcon?: LabelIconSpec;\n children: ReactNode;\n}) {\n return (\n <div className={cn(\"col-span-full flex min-w-0 max-w-full flex-col\", fieldInnerGapClass[size])}>\n <div className={cn(\"flex min-w-0 items-center gap-2 border-b border-border pb-1 font-semibold\", labelSizeClass[size])}>\n <LabelIcon icon={labelIcon} className=\"shrink-0 text-[15px] text-muted-foreground\" />\n <span className=\"min-w-0 truncate\">{label}</span>\n {required && <span className=\"shrink-0 text-destructive\">*</span>}\n {badge && (\n <span className=\"shrink-0 rounded bg-muted px-1.5 py-0.5 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\">\n {badge}\n </span>\n )}\n </div>\n {helper && <p className=\"min-w-0 break-words text-xs text-muted-foreground\">{helper}</p>}\n {children}\n </div>\n );\n}\n\n// ReadOnlyValue renders a `readOnly` field's current value as static text — no\n// input, no border, just the value (date/date-time formatted human-readably).\n// An empty value shows an em-dash. Carries the same id + data-jsf-input as the\n// editable controls so layout and queries stay uniform.\nexport function ReadOnlyValue({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const secret = field.schema.format === \"password\";\n const display = secret && text ? \"••••••••\" : field.kind === \"date\" && text ? formatDateTimeRelative(text) : text;\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={secret ? undefined : text || undefined}\n >\n {display || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n}\n\n// FieldAdornmentWrapper positions a field's leading/trailing in-field adornments\n// (FieldControl.prefix at the left edge, FieldControl.suffix at the right). The\n// container is tagged data-jsf-control so an adornment can locate its sibling\n// input[data-jsf-input] (e.g. for caret-aware insertion). With neither adornment\n// it renders the input bare, so unadorned fields are byte-for-byte unchanged.\nfunction FieldAdornmentWrapper({\n prefix,\n suffix,\n children,\n}: {\n prefix?: ReactNode;\n suffix?: ReactNode;\n children: ReactNode;\n}) {\n if (!prefix && !suffix) return <>{children}</>;\n return (\n <div data-jsf-control className=\"relative\">\n {prefix && <div className=\"absolute inset-y-0 left-1.5 flex items-center\">{prefix}</div>}\n {children}\n {suffix && <div className=\"absolute inset-y-0 right-1.5 flex items-center\">{suffix}</div>}\n </div>\n );\n}\n\nexport function StringControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <input\n id={fieldId}\n // format:\"password\" masks secret material (API keys, client secrets);\n // autoComplete new-password stops browsers from offering saved logins.\n type={field.schema.format === \"password\" ? \"password\" : \"text\"}\n autoComplete={field.schema.format === \"password\" ? \"new-password\" : undefined}\n data-jsf-input\n className={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function NumberControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // A bounded number can opt into a single-thumb progress slider.\n if (field.schema[\"x-number-display\"] === \"slider\" && typeof field.schema.maximum === \"number\") {\n return <NumberSliderControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n // Default type=\"text\" (not number) so non-numeric values a consumer permits —\n // e.g. template tokens — are not silently dropped by the browser. A schema that\n // declares `multipleOf` opts into a real `<input type=\"number\">` (native step,\n // spin buttons, min/max), matching a hand-built numeric field.\n const coerce = field.coerceNumber !== false;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : undefined;\n const native = step !== undefined;\n // A static unit (e.g. \"%\") rides the right edge of the input as a display-only\n // suffix; a consumer-set `suffix` (e.g. an insert-snippet button) wins if both\n // are present (number insert triggers mount on the left as `prefix`).\n const suffix = field.suffix ?? (field.unit ? (\n <span className=\"pointer-events-none select-none text-muted-foreground\">{field.unit}</span>\n ) : undefined);\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={suffix}>\n <input\n id={fieldId}\n type={native ? \"number\" : \"text\"}\n inputMode=\"decimal\"\n {...(native\n ? {\n step,\n ...(typeof field.schema.minimum === \"number\" ? { min: field.schema.minimum } : {}),\n ...(typeof field.schema.maximum === \"number\" ? { max: field.schema.maximum } : {}),\n }\n : {})}\n data-jsf-input\n className={cn(inputClass(size), field.prefix && \"pl-8\", suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => {\n const raw = e.target.value;\n // Coerce mid-typing ONLY when the parse round-trips to the same text\n // (e.g. \"100\", \"33.5\") — so an in-progress decimal like \"33.\" or a\n // trailing-zero \"33.30\" keeps its raw text instead of collapsing to a\n // number and stranding the caret. Non-numeric tokens fall through to\n // the raw string. Blur finalizes any still-uncoerced numeric text.\n if (coerce && raw.trim() !== \"\" && String(Number(raw)) === raw.trim()) {\n field.onChange(Number(raw));\n } else {\n field.onChange(raw);\n }\n }}\n onBlur={(e) => {\n const raw = e.target.value;\n if (coerce && raw.trim() !== \"\" && Number.isFinite(Number(raw))) {\n field.onChange(Number(raw));\n }\n }}\n />\n </FieldAdornmentWrapper>\n );\n}\n\n// A single-thumb range input styled with a progress-filled track. The input sits\n// above the track/fill divs; only its thumb is painted.\nconst SLIDER_INPUT_CLASS =\n \"absolute inset-0 h-6 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 [&::-webkit-slider-runnable-track]:h-1 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-transparent [&::-webkit-slider-thumb]:size-3.5 [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border [&::-webkit-slider-thumb]:border-background/80 [&::-webkit-slider-thumb]:bg-primary [&::-webkit-slider-thumb]:shadow-sm [&::-moz-range-track]:h-1 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-transparent [&::-moz-range-thumb]:size-3.5 [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:bg-primary [&::-moz-range-thumb]:shadow-sm\";\n\n// NumberSliderControl renders a bounded number (`x-number-display: \"slider\"`) as\n// a single-thumb slider whose fill grows with the value, with the live value\n// shown to the right.\nexport function NumberSliderControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const min = typeof field.schema.minimum === \"number\" ? field.schema.minimum : 0;\n const max = typeof field.schema.maximum === \"number\" ? field.schema.maximum : 100;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : 1;\n const raw = typeof field.value === \"number\" ? field.value : Number(toText(field.value));\n const hasValue = Number.isFinite(raw);\n const value = hasValue ? Math.min(max, Math.max(min, raw)) : min;\n const percent = max > min ? ((value - min) / (max - min)) * 100 : 0;\n return (\n <div className=\"flex items-center gap-3\">\n <div className=\"relative h-6 min-w-0 flex-1\">\n <div className=\"absolute inset-x-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-border\" />\n <div\n className=\"absolute left-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-primary/70\"\n style={{ width: `${percent}%` }}\n />\n <input\n id={fieldId}\n data-jsf-input\n type=\"range\"\n aria-label={field.label}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={readOnly}\n className={cn(SLIDER_INPUT_CLASS, field.inputClassName)}\n onChange={(event) => field.onChange(Number(event.target.value))}\n />\n </div>\n <span className={cn(\"w-16 shrink-0 text-right tabular-nums\", labelSizeClass[size])}>\n {hasValue ? value.toLocaleString() : \"—\"}\n </span>\n </div>\n );\n}\n\n// DateControl edits a `format: date`/`date-time` string. Read-only, it shows the\n// human-readable absolute + relative form (e.g. \"Apr 15, 2026, 12:00 PM (2h\n// ago)\"); editable, a DateTimePicker. The raw string is committed unchanged so a\n// consumer-permitted template token in the field is preserved.\nexport function DateControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (readOnly) {\n return (\n <div\n id={fieldId}\n data-jsf-input\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={text || undefined}\n >\n {text ? formatDateTimeRelative(text) : <span className=\"text-muted-foreground\">—</span>}\n </div>\n );\n }\n return (\n <DateTimePicker\n id={fieldId}\n aria-label={field.label}\n data-jsf-input\n inputClassName={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix ? \"pr-14\" : \"pr-8\")}\n value={text}\n onChange={(next) => field.onChange(next)}\n placeholder={defaultPlaceholder(field.schema)}\n prefix={field.prefix}\n suffix={field.suffix}\n />\n );\n}\n\nexport function BooleanControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // Only render a checkbox when the value is genuinely boolean (or unset).\n // A non-boolean value (e.g. a token a consumer left in place) renders as text\n // so it is preserved and editable.\n if (typeof field.value === \"boolean\" || field.value === undefined || field.value === null) {\n return (\n <div className={cn(\"flex items-center\", controlHeightClass[size])}>\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n checked={field.value === true}\n disabled={readOnly}\n onChange={(e) => field.onChange(e.target.checked)}\n />\n </div>\n );\n }\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n}\n\nexport function EnumControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const value = toText(field.value);\n const options = withSyntheticValue(field.options ?? [], value);\n if (field.display === \"grid\") {\n return <GridControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n if (field.display === \"radio\") {\n return (\n <RadioGroupControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n if (field.display === \"segmented\") {\n return (\n <SegmentedEnumControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n return (\n <Combobox\n id={fieldId}\n options={options}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue={field.allowCustomValue ?? false}\n onChange={(v) => field.onChange(v)}\n prefix={field.prefix}\n suffix={field.suffix}\n {...(field.inputClassName ? { className: field.inputClassName } : {})}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// The FormSize scale is wider than SegmentedControl's; map the extremes down.\nconst SEGMENTED_SIZE: Record<FormSize, SegmentedSize> = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n xl: \"lg\",\n};\n\n// SegmentedEnumControl renders an enum (x-enum-display: \"segmented\") with the\n// shared SegmentedControl. Icons come from x-enum-icons, descriptions from\n// x-enum-descriptions (which promote it to the large card layout). The wrapper\n// carries the field id + data-jsf-input so the JSF field contract holds.\nfunction SegmentedEnumControl({\n field,\n fieldId,\n readOnly,\n options,\n value,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n}) {\n const hasDescription = options.some((opt) => opt.description);\n const segSize: SegmentedSize = hasDescription ? \"lg\" : SEGMENTED_SIZE[size];\n return (\n <div id={fieldId} data-jsf-input className={cn(field.inputClassName)}>\n <SegmentedControl\n aria-label={field.label}\n value={value}\n onChange={(next) => field.onChange(next)}\n size={segSize}\n wrap\n options={options.map((opt) => ({\n id: opt.value,\n label: opt.label,\n // x-enum-icons resolves to a runtime name string; SegmentedControl\n // renders that via <Icon name>. Non-string (pre-extension) icons are\n // dropped here since the segmented option type only takes name/component.\n ...(typeof opt.icon === \"string\" ? { icon: opt.icon } : {}),\n ...(opt.description ? { description: opt.description } : {}),\n ...(readOnly ? { disabled: true } : {}),\n }))}\n />\n </div>\n );\n}\n\n// LookupControl is the async entity-reference picker for an `x-clicky-lookup`\n// field. It wraps Combobox and fetches options lazily through the form's\n// LookupFetcher (from context): the head set loads when the menu opens and the\n// (debounced) typed query drives server-side search. Single-select keeps\n// allowCustomValue on so a value outside the option set still commits (e.g. an\n// inline DSN). When no fetcher is wired it degrades to a free-text combobox.\nexport function LookupControl({\n field,\n fieldId,\n readOnly,\n size,\n rootValue,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n rootValue?: Record<string, unknown>;\n}) {\n const fetcher = useLookupFetcher();\n const descriptor = field.lookup;\n const value = toText(field.value);\n const [options, setOptions] = useState<FieldOption[]>([]);\n const [loading, setLoading] = useState(false);\n\n // rootValue is read through a ref so onSearch stays referentially stable: a new\n // onSearch each render would retrigger Combobox's search effect on every\n // setOptions, looping. The scopeKey effect below re-fetches when scope changes.\n const rootRef = useRef(rootValue);\n rootRef.current = rootValue;\n\n const onSearch = useCallback(\n (query: string) => {\n if (!descriptor || !fetcher) return;\n setLoading(true);\n const root = rootRef.current;\n fetcher({ descriptor, query, ...(root ? { rootValue: root } : {}) })\n .then((next) => setOptions(next))\n .catch(() => setOptions([]))\n .finally(() => setLoading(false));\n },\n [descriptor, fetcher],\n );\n\n // Re-fetch the head set when the scope (a sibling field, e.g. provider type)\n // changes so the out-of-scope set is replaced rather than shown stale.\n const scopeKey = descriptor ? JSON.stringify(resolveLookupScope(descriptor, rootValue)) : \"\";\n useEffect(() => {\n if (descriptor && fetcher) onSearch(\"\");\n else setOptions([]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scopeKey, onSearch]);\n\n if (!descriptor || !fetcher) {\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue([], value)}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue\n onChange={(v) => field.onChange(v)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n }\n\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue(options, value)}\n value={value}\n disabled={readOnly}\n size={size}\n loading={loading}\n allowCustomValue={field.allowCustomValue ?? false}\n onSearch={onSearch}\n onChange={(v) => field.onChange(v)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// RadioGroupControl renders a small fixed enum as a segmented radio-button group\n// instead of a dropdown. It shares EnumControl's option list (any out-of-enum\n// value is already prepended, so a token still shows). One `radiogroup` role +\n// native radios keep it keyboard-navigable; the visible chip is a styled label.\nfunction RadioGroupControl({\n field,\n fieldId,\n readOnly,\n options,\n value,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n}) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n id={fieldId}\n data-jsf-input\n className={cn(\n \"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5\",\n field.inputClassName,\n )}\n >\n {options.map((opt) => {\n const checked = opt.value === value;\n return (\n <label\n key={opt.value}\n className={cn(\n \"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1\",\n labelSizeClass[size],\n checked\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n readOnly && \"cursor-not-allowed opacity-60\",\n )}\n >\n <input\n type=\"radio\"\n name={fieldId}\n className=\"sr-only\"\n value={opt.value}\n checked={checked}\n disabled={readOnly}\n onChange={() => field.onChange(opt.value)}\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n\n// TextareaControl edits a long-form string in a multi-line box. Read-only, it\n// shows the value with line breaks preserved; editable, a resizable <textarea>.\n// The raw string is committed unchanged so a consumer-permitted template token\n// survives.\nexport function TextareaControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (readOnly) {\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"block whitespace-pre-wrap break-words text-foreground\", labelSizeClass[size])}\n title={text || undefined}\n >\n {text || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n }\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <textarea\n id={fieldId}\n data-jsf-input\n rows={4}\n className={cn(\n inputClass(size),\n \"h-auto min-h-[5rem] resize-y\",\n field.prefix && \"pl-8\",\n field.suffix && \"pr-8\",\n field.inputClassName,\n )}\n value={text}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function MarkdownControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const fallback = (\n <textarea\n id={fieldId}\n data-jsf-input\n rows={6}\n className={cn(inputClass(size), \"h-auto resize-y font-mono\", field.prefix && \"pl-8\", field.suffix && \"pr-8\")}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n );\n\n return (\n <Suspense fallback={fallback}>\n <LazyMdxEditorField\n id={fieldId}\n value={toText(field.value)}\n readOnly={readOnly}\n size={size}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(next) => field.onChange(next)}\n {...field.markdownOptions}\n />\n </Suspense>\n );\n}\n\n// DisplayControl renders a static, non-editable presentation element:\n// Label/Title (heading), Message (info text), Line (divider), or Blank/Filler\n// (spacer). It never collects a value; the heading/text source is the field's\n// title (label) and, for \"text\", its description. Rendered identically in the\n// form and the read-only Viewer.\nexport function DisplayControl({ field, size }: { field: FieldControl; size: FormSize }) {\n const variant = field.displayVariant ?? \"text\";\n if (variant === \"divider\") {\n return <hr data-jsf-input className=\"my-1 w-full border-t border-border\" />;\n }\n if (variant === \"spacer\") {\n return <div data-jsf-input aria-hidden className=\"h-2\" />;\n }\n if (variant === \"heading\") {\n return (\n <div\n data-jsf-input\n className={cn(\"border-b border-border pb-1 font-semibold text-foreground\", labelSizeClass[size])}\n >\n {field.label}\n </div>\n );\n }\n const text = field.description ?? toText(field.value) ?? field.label;\n return (\n <p data-jsf-input className={cn(\"text-muted-foreground\", labelSizeClass[size])}>\n {text || field.label}\n </p>\n );\n}\n\n// LinkControl renders a read-only external hyperlink. The\n// href is field.href, falling back to the value when it is an absolute URL; with\n// neither it degrades to a plain read-only value.\nexport function LinkControl({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const href = field.href ?? (/^https?:\\/\\//i.test(text) ? text : undefined);\n if (!href) {\n return <ReadOnlyValue field={field} fieldId={fieldId} size={size} />;\n }\n return (\n <a\n id={fieldId}\n data-jsf-input\n href={href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={cn(\"inline-flex items-center text-primary underline underline-offset-2\", controlHeightClass[size], labelSizeClass[size])}\n >\n {text || field.label || href}\n </a>\n );\n}\n\n// HMR probe\n// HMR probe 2\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"json-schema-form-fields.js","sources":["../../src/components/json-schema-form-fields.tsx"],"sourcesContent":["import { lazy, Suspense, useCallback, useEffect, useRef, useState, type ReactNode } from \"react\";\nimport { cn } from \"../lib/utils\";\nimport { formatDateTimeRelative } from \"../data/cells/timestamp-format\";\nimport { Combobox } from \"./Combobox\";\nimport { DateTimePicker } from \"./DateTimePicker\";\nimport { SegmentedControl, type SegmentedSize } from \"./SegmentedControl\";\nimport { GridControl } from \"./json-schema-form-grid\";\nimport { LookupTreeControl } from \"./json-schema-form-lookup-tree\";\nimport { resolveLookupScope, useLookupFetcher } from \"./form-lookup-context\";\nimport type { FieldControl, FieldOption } from \"./json-schema-form-types\";\nimport {\n comboboxAriaProps,\n defaultPlaceholder,\n fieldAriaProps,\n inputClass,\n toText,\n withSyntheticValue,\n} from \"./json-schema-form-utils\";\nimport {\n controlHeightClass,\n labelSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\n\nconst LazyMdxEditorField = lazy(async () => {\n const mod = await import(\"./MdxEditorField\");\n return { default: mod.MdxEditorField };\n});\n\n// ReadOnlyValue renders a `readOnly` field's current value as static text — no\n// input, no border, just the value (date/date-time formatted human-readably).\n// An empty value shows an em-dash. Carries the same id + data-jsf-input as the\n// editable controls so layout and queries stay uniform.\nexport function ReadOnlyValue({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const secret = field.schema.format === \"password\";\n const display = secret && text ? \"••••••••\" : field.kind === \"date\" && text ? formatDateTimeRelative(text) : text;\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={secret ? undefined : text || undefined}\n >\n {display || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n}\n\n// FieldAdornmentWrapper positions a field's leading/trailing in-field adornments\n// (FieldControl.prefix at the left edge, FieldControl.suffix at the right). The\n// container is tagged data-jsf-control so an adornment can locate its sibling\n// input[data-jsf-input] (e.g. for caret-aware insertion). With neither adornment\n// it renders the input bare, so unadorned fields are byte-for-byte unchanged.\nfunction FieldAdornmentWrapper({\n prefix,\n suffix,\n children,\n}: {\n prefix?: ReactNode;\n suffix?: ReactNode;\n children: ReactNode;\n}) {\n if (!prefix && !suffix) return <>{children}</>;\n return (\n <div data-jsf-control className=\"relative\">\n {prefix && <div className=\"absolute inset-y-0 left-1.5 flex items-center\">{prefix}</div>}\n {children}\n {suffix && <div className=\"absolute inset-y-0 right-1.5 flex items-center\">{suffix}</div>}\n </div>\n );\n}\n\nexport function StringControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <input\n id={fieldId}\n // format:\"password\" masks secret material (API keys, client secrets);\n // autoComplete new-password stops browsers from offering saved logins.\n type={field.schema.format === \"password\" ? \"password\" : \"text\"}\n autoComplete={field.schema.format === \"password\" ? \"new-password\" : undefined}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n className={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function NumberControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // A bounded number can opt into a single-thumb progress slider.\n if (field.schema[\"x-number-display\"] === \"slider\" && typeof field.schema.maximum === \"number\") {\n return <NumberSliderControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n // Default type=\"text\" (not number) so non-numeric values a consumer permits —\n // e.g. template tokens — are not silently dropped by the browser. A schema that\n // declares `multipleOf` opts into a real `<input type=\"number\">` (native step,\n // spin buttons, min/max), matching a hand-built numeric field.\n const coerce = field.coerceNumber !== false;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : undefined;\n const native = step !== undefined;\n // A static unit (e.g. \"%\") rides the right edge of the input as a display-only\n // suffix; a consumer-set `suffix` (e.g. an insert-snippet button) wins if both\n // are present (number insert triggers mount on the left as `prefix`).\n const suffix = field.suffix ?? (field.unit ? (\n <span className=\"pointer-events-none select-none text-muted-foreground\">{field.unit}</span>\n ) : undefined);\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={suffix}>\n <input\n id={fieldId}\n type={native ? \"number\" : \"text\"}\n inputMode=\"decimal\"\n {...(native\n ? {\n step,\n ...(typeof field.schema.minimum === \"number\" ? { min: field.schema.minimum } : {}),\n ...(typeof field.schema.maximum === \"number\" ? { max: field.schema.maximum } : {}),\n }\n : {})}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n className={cn(inputClass(size), field.prefix && \"pl-8\", suffix && \"pr-8\", field.inputClassName)}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => {\n const raw = e.target.value;\n // Coerce mid-typing ONLY when the parse round-trips to the same text\n // (e.g. \"100\", \"33.5\") — so an in-progress decimal like \"33.\" or a\n // trailing-zero \"33.30\" keeps its raw text instead of collapsing to a\n // number and stranding the caret. Non-numeric tokens fall through to\n // the raw string. Blur finalizes any still-uncoerced numeric text.\n if (coerce && raw.trim() !== \"\" && String(Number(raw)) === raw.trim()) {\n field.onChange(Number(raw));\n } else {\n field.onChange(raw);\n }\n }}\n onBlur={(e) => {\n const raw = e.target.value;\n if (coerce && raw.trim() !== \"\" && Number.isFinite(Number(raw))) {\n field.onChange(Number(raw));\n }\n }}\n />\n </FieldAdornmentWrapper>\n );\n}\n\n// A single-thumb range input styled with a progress-filled track. The input sits\n// above the track/fill divs; only its thumb is painted.\nconst SLIDER_INPUT_CLASS =\n \"absolute inset-0 h-6 w-full cursor-pointer appearance-none bg-transparent focus-visible:outline-none disabled:cursor-not-allowed disabled:opacity-50 [&::-webkit-slider-runnable-track]:h-1 [&::-webkit-slider-runnable-track]:rounded-full [&::-webkit-slider-runnable-track]:bg-transparent [&::-webkit-slider-thumb]:size-3.5 [&::-webkit-slider-thumb]:-mt-[5px] [&::-webkit-slider-thumb]:appearance-none [&::-webkit-slider-thumb]:rounded-full [&::-webkit-slider-thumb]:border [&::-webkit-slider-thumb]:border-background/80 [&::-webkit-slider-thumb]:bg-primary [&::-webkit-slider-thumb]:shadow-sm [&::-moz-range-track]:h-1 [&::-moz-range-track]:rounded-full [&::-moz-range-track]:bg-transparent [&::-moz-range-thumb]:size-3.5 [&::-moz-range-thumb]:appearance-none [&::-moz-range-thumb]:rounded-full [&::-moz-range-thumb]:border-0 [&::-moz-range-thumb]:bg-primary [&::-moz-range-thumb]:shadow-sm\";\n\n// NumberSliderControl renders a bounded number (`x-number-display: \"slider\"`) as\n// a single-thumb slider whose fill grows with the value, with the live value\n// shown to the right.\nexport function NumberSliderControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const min = typeof field.schema.minimum === \"number\" ? field.schema.minimum : 0;\n const max = typeof field.schema.maximum === \"number\" ? field.schema.maximum : 100;\n const step = typeof field.schema.multipleOf === \"number\" ? field.schema.multipleOf : 1;\n const raw = typeof field.value === \"number\" ? field.value : Number(toText(field.value));\n const hasValue = Number.isFinite(raw);\n const value = hasValue ? Math.min(max, Math.max(min, raw)) : min;\n const percent = max > min ? ((value - min) / (max - min)) * 100 : 0;\n return (\n <div className=\"flex items-center gap-3\">\n <div className=\"relative h-6 min-w-0 flex-1\">\n <div className=\"absolute inset-x-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-border\" />\n <div\n className=\"absolute left-0 top-1/2 h-1 -translate-y-1/2 rounded-full bg-primary/70\"\n style={{ width: `${percent}%` }}\n />\n <input\n id={fieldId}\n data-jsf-input\n type=\"range\"\n aria-label={field.label}\n {...fieldAriaProps(field, fieldId)}\n min={min}\n max={max}\n step={step}\n value={value}\n disabled={readOnly}\n className={cn(SLIDER_INPUT_CLASS, field.inputClassName)}\n onChange={(event) => field.onChange(Number(event.target.value))}\n />\n </div>\n <span className={cn(\"w-16 shrink-0 text-right tabular-nums\", labelSizeClass[size])}>\n {hasValue ? value.toLocaleString() : \"—\"}\n </span>\n </div>\n );\n}\n\n// DateControl edits a `format: date`/`date-time` string. Read-only, it shows the\n// human-readable absolute + relative form (e.g. \"Apr 15, 2026, 12:00 PM (2h\n// ago)\"); editable, a DateTimePicker. The raw string is committed unchanged so a\n// consumer-permitted template token in the field is preserved.\nexport function DateControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (readOnly) {\n return (\n <div\n id={fieldId}\n data-jsf-input\n className={cn(\"flex items-center text-foreground\", controlHeightClass[size], labelSizeClass[size])}\n title={text || undefined}\n >\n {text ? formatDateTimeRelative(text) : <span className=\"text-muted-foreground\">—</span>}\n </div>\n );\n }\n return (\n <DateTimePicker\n id={fieldId}\n aria-label={field.label}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n inputClassName={cn(inputClass(size), field.prefix && \"pl-8\", field.suffix ? \"pr-14\" : \"pr-8\")}\n value={text}\n onChange={(next) => field.onChange(next)}\n placeholder={defaultPlaceholder(field.schema)}\n prefix={field.prefix}\n suffix={field.suffix}\n />\n );\n}\n\nexport function BooleanControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n // Only render a checkbox when the value is genuinely boolean (or unset).\n // A non-boolean value (e.g. a token a consumer left in place) renders as text\n // so it is preserved and editable.\n if (typeof field.value === \"boolean\" || field.value === undefined || field.value === null) {\n return (\n <div className={cn(\"flex items-center\", controlHeightClass[size])}>\n <input\n id={fieldId}\n type=\"checkbox\"\n className=\"h-4 w-4 accent-primary\"\n {...fieldAriaProps(field, fieldId)}\n checked={field.value === true}\n disabled={readOnly}\n onChange={(e) => field.onChange(e.target.checked)}\n />\n </div>\n );\n }\n return <StringControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n}\n\nexport function EnumControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const value = toText(field.value);\n const options = withSyntheticValue(field.options ?? [], value);\n if (field.display === \"grid\") {\n return <GridControl field={field} fieldId={fieldId} readOnly={readOnly} size={size} />;\n }\n if (field.display === \"radio\") {\n return (\n <RadioGroupControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n if (field.display === \"segmented\") {\n return (\n <SegmentedEnumControl field={field} fieldId={fieldId} readOnly={readOnly} options={options} value={value} size={size} />\n );\n }\n return (\n <Combobox\n id={fieldId}\n options={options}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue={field.allowCustomValue ?? false}\n onChange={(v) => field.onChange(v)}\n prefix={field.prefix}\n suffix={field.suffix}\n {...comboboxAriaProps(field, fieldId)}\n {...(field.inputClassName ? { className: field.inputClassName } : {})}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// The FormSize scale is wider than SegmentedControl's; map the extremes down.\nconst SEGMENTED_SIZE: Record<FormSize, SegmentedSize> = {\n xs: \"sm\",\n sm: \"sm\",\n md: \"md\",\n lg: \"lg\",\n xl: \"lg\",\n};\n\n// SegmentedEnumControl renders an enum (x-enum-display: \"segmented\") with the\n// shared SegmentedControl. Icons come from x-enum-icons, descriptions from\n// x-enum-descriptions (which promote it to the large card layout). The wrapper\n// carries the field id + data-jsf-input so the JSF field contract holds.\nfunction SegmentedEnumControl({\n field,\n fieldId,\n readOnly,\n options,\n value,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n}) {\n const hasDescription = options.some((opt) => opt.description);\n const segSize: SegmentedSize = hasDescription ? \"lg\" : SEGMENTED_SIZE[size];\n return (\n <div id={fieldId} data-jsf-input className={cn(field.inputClassName)}>\n <SegmentedControl\n aria-label={field.label}\n value={value}\n onChange={(next) => field.onChange(next)}\n size={segSize}\n wrap\n options={options.map((opt) => ({\n id: opt.value,\n label: opt.label,\n // x-enum-icons resolves to a runtime name string; SegmentedControl\n // renders that via <Icon name>. Non-string (pre-extension) icons are\n // dropped here since the segmented option type only takes name/component.\n ...(typeof opt.icon === \"string\" ? { icon: opt.icon } : {}),\n ...(opt.description ? { description: opt.description } : {}),\n ...(readOnly ? { disabled: true } : {}),\n }))}\n />\n </div>\n );\n}\n\n// LookupControl is the async entity-reference picker for an `x-clicky-lookup`\n// field. It wraps Combobox and fetches options lazily through the form's\n// LookupFetcher (from context): the head set loads when the menu opens and the\n// (debounced) typed query drives server-side search. Single-select keeps\n// allowCustomValue on so a value outside the option set still commits (e.g. an\n// inline DSN). When no fetcher is wired it degrades to a free-text combobox.\nexport function LookupControl({\n field,\n fieldId,\n readOnly,\n size,\n rootValue,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n rootValue?: Record<string, unknown>;\n}) {\n const fetcher = useLookupFetcher();\n const descriptor = field.lookup;\n const value = toText(field.value);\n const [options, setOptions] = useState<FieldOption[]>([]);\n const [loading, setLoading] = useState(false);\n\n // rootValue is read through a ref so onSearch stays referentially stable: a new\n // onSearch each render would retrigger Combobox's search effect on every\n // setOptions, looping. The scopeKey effect below re-fetches when scope changes.\n const rootRef = useRef(rootValue);\n rootRef.current = rootValue;\n\n const onSearch = useCallback(\n (query: string) => {\n if (!descriptor || !fetcher) return;\n setLoading(true);\n const root = rootRef.current;\n fetcher({ descriptor, query, ...(root ? { rootValue: root } : {}) })\n .then((next) => setOptions(next))\n .catch(() => setOptions([]))\n .finally(() => setLoading(false));\n },\n [descriptor, fetcher],\n );\n\n // Re-fetch the head set when the scope (a sibling field, e.g. provider type)\n // changes so the out-of-scope set is replaced rather than shown stale.\n const scopeKey = descriptor ? JSON.stringify(resolveLookupScope(descriptor, rootValue)) : \"\";\n useEffect(() => {\n if (descriptor && fetcher) onSearch(\"\");\n else setOptions([]);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [scopeKey, onSearch]);\n\n // A descriptor that declares a hierarchy browses its options as a tree rather\n // than scrolling one flat list. It owns the multi-value case too, since the\n // committed value is then an array rather than a single string.\n if (descriptor?.hierarchy) {\n return (\n <LookupTreeControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={size}\n options={options}\n loading={loading}\n hierarchy={descriptor.hierarchy}\n />\n );\n }\n\n if (!descriptor || !fetcher) {\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue([], value)}\n value={value}\n disabled={readOnly}\n size={size}\n allowCustomValue\n onChange={(v) => field.onChange(v)}\n {...comboboxAriaProps(field, fieldId)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n }\n\n return (\n <Combobox\n id={fieldId}\n options={withSyntheticValue(options, value)}\n value={value}\n disabled={readOnly}\n size={size}\n loading={loading}\n allowCustomValue={field.allowCustomValue ?? false}\n onSearch={onSearch}\n onChange={(v) => field.onChange(v)}\n {...comboboxAriaProps(field, fieldId)}\n {...(defaultPlaceholder(field.schema) ? { placeholder: defaultPlaceholder(field.schema) } : {})}\n />\n );\n}\n\n// RadioGroupControl renders a small fixed enum as a segmented radio-button group\n// instead of a dropdown. It shares EnumControl's option list (any out-of-enum\n// value is already prepended, so a token still shows). One `radiogroup` role +\n// native radios keep it keyboard-navigable; the visible chip is a styled label.\nfunction RadioGroupControl({\n field,\n fieldId,\n readOnly,\n options,\n value,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n options: FieldOption[];\n value: string;\n size: FormSize;\n}) {\n return (\n <div\n role=\"radiogroup\"\n aria-label={field.label}\n id={fieldId}\n data-jsf-input\n className={cn(\n \"inline-flex flex-wrap items-center gap-1 rounded-md border border-input bg-background p-0.5\",\n field.inputClassName,\n )}\n >\n {options.map((opt) => {\n const checked = opt.value === value;\n return (\n <label\n key={opt.value}\n className={cn(\n \"inline-flex cursor-pointer select-none items-center rounded px-2.5 py-1\",\n labelSizeClass[size],\n checked\n ? \"bg-primary text-primary-foreground\"\n : \"text-muted-foreground hover:bg-accent hover:text-foreground\",\n readOnly && \"cursor-not-allowed opacity-60\",\n )}\n >\n <input\n type=\"radio\"\n name={fieldId}\n className=\"sr-only\"\n value={opt.value}\n checked={checked}\n disabled={readOnly}\n onChange={() => field.onChange(opt.value)}\n />\n {opt.label}\n </label>\n );\n })}\n </div>\n );\n}\n\n// TextareaControl edits a long-form string in a multi-line box. Read-only, it\n// shows the value with line breaks preserved; editable, a resizable <textarea>.\n// The raw string is committed unchanged so a consumer-permitted template token\n// survives.\nexport function TextareaControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const text = toText(field.value);\n if (readOnly) {\n return (\n <span\n id={fieldId}\n data-jsf-input\n data-jsf-readonly\n className={cn(\"block whitespace-pre-wrap break-words text-foreground\", labelSizeClass[size])}\n title={text || undefined}\n >\n {text || <span className=\"text-muted-foreground\">—</span>}\n </span>\n );\n }\n return (\n <FieldAdornmentWrapper prefix={field.prefix} suffix={field.suffix}>\n <textarea\n id={fieldId}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n rows={4}\n className={cn(\n inputClass(size),\n \"h-auto min-h-[5rem] resize-y\",\n field.prefix && \"pl-8\",\n field.suffix && \"pr-8\",\n field.inputClassName,\n )}\n value={text}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n </FieldAdornmentWrapper>\n );\n}\n\nexport function MarkdownControl({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const fallback = (\n <textarea\n id={fieldId}\n data-jsf-input\n {...fieldAriaProps(field, fieldId)}\n rows={6}\n className={cn(inputClass(size), \"h-auto resize-y font-mono\", field.prefix && \"pl-8\", field.suffix && \"pr-8\")}\n value={toText(field.value)}\n disabled={readOnly}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(e) => field.onChange(e.target.value)}\n />\n );\n\n return (\n <Suspense fallback={fallback}>\n <LazyMdxEditorField\n id={fieldId}\n value={toText(field.value)}\n readOnly={readOnly}\n size={size}\n placeholder={defaultPlaceholder(field.schema)}\n onChange={(next) => field.onChange(next)}\n {...field.markdownOptions}\n />\n </Suspense>\n );\n}\n\n// DisplayControl renders a static, non-editable presentation element:\n// Label/Title (heading), Message (info text), Line (divider), or Blank/Filler\n// (spacer). It never collects a value; the heading/text source is the field's\n// title (label) and, for \"text\", its description. Rendered identically in the\n// form and the read-only Viewer.\nexport function DisplayControl({ field, size }: { field: FieldControl; size: FormSize }) {\n const variant = field.displayVariant ?? \"text\";\n if (variant === \"divider\") {\n return <hr data-jsf-input className=\"my-1 w-full border-t border-border\" />;\n }\n if (variant === \"spacer\") {\n return <div data-jsf-input aria-hidden className=\"h-2\" />;\n }\n if (variant === \"heading\") {\n return (\n <div\n data-jsf-input\n className={cn(\"border-b border-border pb-1 font-semibold text-foreground\", labelSizeClass[size])}\n >\n {field.label}\n </div>\n );\n }\n const text = field.description ?? toText(field.value) ?? field.label;\n return (\n <p data-jsf-input className={cn(\"text-muted-foreground\", labelSizeClass[size])}>\n {text || field.label}\n </p>\n );\n}\n\n// LinkControl renders a read-only external hyperlink. The\n// href is field.href, falling back to the value when it is an absolute URL; with\n// neither it degrades to a plain read-only value.\nexport function LinkControl({ field, fieldId, size }: { field: FieldControl; fieldId: string; size: FormSize }) {\n const text = toText(field.value);\n const href = field.href ?? (/^https?:\\/\\//i.test(text) ? text : undefined);\n if (!href) {\n return <ReadOnlyValue field={field} fieldId={fieldId} size={size} />;\n }\n return (\n <a\n id={fieldId}\n data-jsf-input\n href={href}\n target=\"_blank\"\n rel=\"noreferrer noopener\"\n className={cn(\"inline-flex items-center text-primary underline underline-offset-2\", controlHeightClass[size], labelSizeClass[size])}\n >\n {text || field.label || href}\n </a>\n );\n}\n\n// HMR probe\n// HMR probe 2\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
+ const jsonSchemaFormTone = require("./json-schema-form-tone.cjs");
4
+ const jsonSchemaFormUtils = require("./json-schema-form-utils.cjs");
5
+ const DEFAULT_TITLE_KEYS = ["title", "name", "label", "id", "key"];
6
+ const SUMMARY_SEPARATOR = " · ";
7
+ const VALUE_SEPARATOR = ", ";
8
+ function resolveItemSpec(arraySchema, itemSchema) {
9
+ const raw = jsonSchemaFormUtils.isPlainObject(arraySchema["x-item"]) ? arraySchema["x-item"] : {};
10
+ const title = stringArray(raw.title);
11
+ const summary = summaryParts(raw.summary);
12
+ const glyph = typeof raw.glyph === "string" ? raw.glyph : autoGlyphKey(itemSchema);
13
+ return {
14
+ title: title.length > 0 ? title : DEFAULT_TITLE_KEYS,
15
+ ...typeof raw.fallback === "string" && raw.fallback ? { fallback: raw.fallback } : {},
16
+ ...summary.length > 0 ? { summary } : {},
17
+ ...glyph ? { glyph } : {},
18
+ ...typeof raw.badge === "string" && raw.badge ? { badge: raw.badge } : {},
19
+ ...typeof raw.flag === "string" && raw.flag ? { flag: raw.flag } : {},
20
+ noun: firstNonEmpty([raw.noun, itemSchema == null ? void 0 : itemSchema.title]) ?? "item",
21
+ nounPlural: firstNonEmpty([raw.nounPlural, arraySchema.title]) ?? "items",
22
+ ...typeof raw.empty === "string" && raw.empty ? { empty: raw.empty } : {}
23
+ };
24
+ }
25
+ function autoGlyphKey(itemSchema) {
26
+ for (const [key, prop] of Object.entries((itemSchema == null ? void 0 : itemSchema.properties) ?? {})) {
27
+ const icons = prop["x-enum-icons"];
28
+ if (Array.isArray(prop.enum) && icons && Object.keys(icons).length > 0) return key;
29
+ }
30
+ return void 0;
31
+ }
32
+ function itemSummaryFor({
33
+ item,
34
+ index,
35
+ spec,
36
+ itemSchema
37
+ }) {
38
+ var _a, _b, _c;
39
+ const obj = jsonSchemaFormUtils.isPlainObject(item) ? item : {};
40
+ const props = (itemSchema == null ? void 0 : itemSchema.properties) ?? {};
41
+ const title = firstNonEmpty((spec.title ?? DEFAULT_TITLE_KEYS).map((key) => text(obj[key]))) ?? spec.fallback ?? `Item ${index + 1}`;
42
+ const summary = (spec.summary ?? []).map((part) => summaryPart(obj, part)).filter((s) => !!s).join(SUMMARY_SEPARATOR);
43
+ const glyphValue = spec.glyph ? text(obj[spec.glyph]) : "";
44
+ const glyphProp = spec.glyph ? props[spec.glyph] : void 0;
45
+ const badgeValue = spec.badge ? text(obj[spec.badge]) : "";
46
+ const badgeProp = spec.badge ? props[spec.badge] : void 0;
47
+ const badgeIcon = (_a = badgeProp == null ? void 0 : badgeProp["x-enum-icons"]) == null ? void 0 : _a[badgeValue];
48
+ return {
49
+ title,
50
+ ...summary ? { summary } : {},
51
+ ...spec.glyph ? {
52
+ glyph: {
53
+ ...((_b = glyphProp == null ? void 0 : glyphProp["x-enum-icons"]) == null ? void 0 : _b[glyphValue]) ? { icon: glyphProp["x-enum-icons"][glyphValue] } : {},
54
+ tone: jsonSchemaFormTone.normalizeTone((_c = glyphProp == null ? void 0 : glyphProp["x-enum-tones"]) == null ? void 0 : _c[glyphValue]),
55
+ ...glyphValue ? { label: enumLabel(glyphProp, glyphValue) } : {}
56
+ }
57
+ } : {},
58
+ ...badgeValue ? {
59
+ badge: {
60
+ ...badgeIcon ? { icon: badgeIcon } : {},
61
+ label: enumLabel(badgeProp, badgeValue)
62
+ }
63
+ } : {},
64
+ ...spec.flag && obj[spec.flag] === true ? { flagged: true } : {}
65
+ };
66
+ }
67
+ function addItemLabel(spec) {
68
+ return `Add ${spec.noun ?? "item"}`;
69
+ }
70
+ function itemCountLabel(spec, count) {
71
+ return count === 1 ? `1 ${spec.noun ?? "item"}` : `${count} ${spec.nounPlural ?? "items"}`;
72
+ }
73
+ function emptyItemsCopy(spec, arraySchema) {
74
+ if (spec.empty) return spec.empty;
75
+ const description = typeof arraySchema.description === "string" ? arraySchema.description.trim() : "";
76
+ return description || void 0;
77
+ }
78
+ function noItemsLabel(spec) {
79
+ return `No ${spec.nounPlural ?? "items"} yet`;
80
+ }
81
+ function summaryPart(obj, part) {
82
+ const { property, pattern } = typeof part === "string" ? { property: part, pattern: void 0 } : part;
83
+ const value = text(obj[property]);
84
+ if (!value) return void 0;
85
+ return pattern ? pattern.replace("{}", value) : value;
86
+ }
87
+ function enumLabel(prop, value) {
88
+ var _a;
89
+ const label = (_a = prop == null ? void 0 : prop["x-enum-labels"]) == null ? void 0 : _a[value];
90
+ return typeof label === "string" && label ? label : value;
91
+ }
92
+ function text(value) {
93
+ if (value === void 0 || value === null) return "";
94
+ if (Array.isArray(value)) return value.map(text).filter(Boolean).join(VALUE_SEPARATOR);
95
+ if (typeof value === "object") return "";
96
+ return String(value).trim();
97
+ }
98
+ function stringArray(value) {
99
+ if (typeof value === "string") return [value];
100
+ if (!Array.isArray(value)) return [];
101
+ return value.filter((v) => typeof v === "string" && !!v);
102
+ }
103
+ function summaryParts(value) {
104
+ if (!Array.isArray(value)) return [];
105
+ return value.flatMap((part) => {
106
+ if (typeof part === "string" && part) return [part];
107
+ if (jsonSchemaFormUtils.isPlainObject(part) && typeof part.property === "string" && part.property) {
108
+ return [
109
+ {
110
+ property: part.property,
111
+ ...typeof part.pattern === "string" && part.pattern ? { pattern: part.pattern } : {}
112
+ }
113
+ ];
114
+ }
115
+ return [];
116
+ });
117
+ }
118
+ function firstNonEmpty(values) {
119
+ for (const value of values) {
120
+ const trimmed = typeof value === "string" ? value.trim() : "";
121
+ if (trimmed) return trimmed;
122
+ }
123
+ return void 0;
124
+ }
125
+ exports.addItemLabel = addItemLabel;
126
+ exports.emptyItemsCopy = emptyItemsCopy;
127
+ exports.itemCountLabel = itemCountLabel;
128
+ exports.itemSummaryFor = itemSummaryFor;
129
+ exports.noItemsLabel = noItemsLabel;
130
+ exports.resolveItemSpec = resolveItemSpec;
131
+ //# sourceMappingURL=json-schema-form-item-summary.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-item-summary.cjs","sources":["../../src/components/json-schema-form-item-summary.ts"],"sourcesContent":["import { normalizeTone } from \"./json-schema-form-tone\";\nimport { isPlainObject } from \"./json-schema-form-utils\";\nimport type {\n ArrayItemSpec,\n ArrayItemSummary,\n ArrayItemSummaryPart,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\n// Property names worth trying for a row title when the schema does not say.\n// Ordered most-human-readable first.\nconst DEFAULT_TITLE_KEYS = [\"title\", \"name\", \"label\", \"id\", \"key\"];\n\nconst SUMMARY_SEPARATOR = \" · \";\nconst VALUE_SEPARATOR = \", \";\n\n// resolveItemSpec reads the array's `x-item` and fills in every default, so the\n// renderer never has to ask whether a key was supplied. With no `x-item` at all\n// the result reproduces today's behaviour exactly: an `Item <n>` title and an\n// \"Add item\" button.\nexport function resolveItemSpec(\n arraySchema: JsonSchemaProperty,\n itemSchema: JsonSchemaProperty | undefined,\n): ArrayItemSpec {\n const raw = isPlainObject(arraySchema[\"x-item\"])\n ? (arraySchema[\"x-item\"] as ArrayItemSpec)\n : {};\n const title = stringArray(raw.title);\n const summary = summaryParts(raw.summary);\n const glyph = typeof raw.glyph === \"string\" ? raw.glyph : autoGlyphKey(itemSchema);\n return {\n title: title.length > 0 ? title : DEFAULT_TITLE_KEYS,\n ...(typeof raw.fallback === \"string\" && raw.fallback ? { fallback: raw.fallback } : {}),\n ...(summary.length > 0 ? { summary } : {}),\n ...(glyph ? { glyph } : {}),\n ...(typeof raw.badge === \"string\" && raw.badge ? { badge: raw.badge } : {}),\n ...(typeof raw.flag === \"string\" && raw.flag ? { flag: raw.flag } : {}),\n noun: firstNonEmpty([raw.noun, itemSchema?.title]) ?? \"item\",\n nounPlural: firstNonEmpty([raw.nounPlural, arraySchema.title]) ?? \"items\",\n ...(typeof raw.empty === \"string\" && raw.empty ? { empty: raw.empty } : {}),\n };\n}\n\n// autoGlyphKey picks the item property that can colour a row without being told:\n// the first enum carrying per-value icons. Keeps a schema that already declares\n// x-enum-icons from having to repeat itself in x-item.\nfunction autoGlyphKey(itemSchema: JsonSchemaProperty | undefined): string | undefined {\n for (const [key, prop] of Object.entries(itemSchema?.properties ?? {})) {\n const icons = prop[\"x-enum-icons\"];\n if (Array.isArray(prop.enum) && icons && Object.keys(icons).length > 0) return key;\n }\n return undefined;\n}\n\n// itemSummaryFor derives one collapsed row from the item's raw VALUE — never\n// from its rendered fields. A consumer pre-extension may hide a property's\n// control entirely (returning null) and still have it appear in the summary.\nexport function itemSummaryFor({\n item,\n index,\n spec,\n itemSchema,\n}: {\n item: unknown;\n index: number;\n spec: ArrayItemSpec;\n itemSchema: JsonSchemaProperty | undefined;\n}): ArrayItemSummary {\n const obj = isPlainObject(item) ? item : {};\n const props = itemSchema?.properties ?? {};\n\n const title =\n firstNonEmpty((spec.title ?? DEFAULT_TITLE_KEYS).map((key) => text(obj[key]))) ??\n spec.fallback ??\n `Item ${index + 1}`;\n\n const summary = (spec.summary ?? [])\n .map((part) => summaryPart(obj, part))\n .filter((s): s is string => !!s)\n .join(SUMMARY_SEPARATOR);\n\n const glyphValue = spec.glyph ? text(obj[spec.glyph]) : \"\";\n const glyphProp = spec.glyph ? props[spec.glyph] : undefined;\n const badgeValue = spec.badge ? text(obj[spec.badge]) : \"\";\n const badgeProp = spec.badge ? props[spec.badge] : undefined;\n const badgeIcon = badgeProp?.[\"x-enum-icons\"]?.[badgeValue];\n\n return {\n title,\n ...(summary ? { summary } : {}),\n ...(spec.glyph\n ? {\n glyph: {\n ...(glyphProp?.[\"x-enum-icons\"]?.[glyphValue]\n ? { icon: glyphProp[\"x-enum-icons\"][glyphValue] }\n : {}),\n tone: normalizeTone(glyphProp?.[\"x-enum-tones\"]?.[glyphValue]),\n ...(glyphValue ? { label: enumLabel(glyphProp, glyphValue) } : {}),\n },\n }\n : {}),\n ...(badgeValue\n ? {\n badge: {\n ...(badgeIcon ? { icon: badgeIcon } : {}),\n label: enumLabel(badgeProp, badgeValue),\n },\n }\n : {}),\n ...(spec.flag && obj[spec.flag] === true ? { flagged: true } : {}),\n };\n}\n\n// The add row's button text — \"Add parameter\" when the schema names its noun,\n// and the historical \"Add item\" when it does not.\nexport function addItemLabel(spec: ArrayItemSpec): string {\n return `Add ${spec.noun ?? \"item\"}`;\n}\n\nexport function itemCountLabel(spec: ArrayItemSpec, count: number): string {\n return count === 1\n ? `1 ${spec.noun ?? \"item\"}`\n : `${count} ${spec.nounPlural ?? \"items\"}`;\n}\n\n// The zero-item explanation. Falls back to the array's own description, so a\n// schema that already documents the field gets the empty state for free.\nexport function emptyItemsCopy(\n spec: ArrayItemSpec,\n arraySchema: JsonSchemaProperty,\n): string | undefined {\n if (spec.empty) return spec.empty;\n const description = typeof arraySchema.description === \"string\" ? arraySchema.description.trim() : \"\";\n return description || undefined;\n}\n\nexport function noItemsLabel(spec: ArrayItemSpec): string {\n return `No ${spec.nounPlural ?? \"items\"} yet`;\n}\n\n// summaryPart renders one part, substituting the value into a single literal\n// `{}` in the pattern. A pattern without `{}` renders as-is (it is a literal),\n// and a missing value drops the part rather than leaving a dangling separator.\nfunction summaryPart(\n obj: Record<string, unknown>,\n part: string | ArrayItemSummaryPart,\n): string | undefined {\n const { property, pattern } = typeof part === \"string\" ? { property: part, pattern: undefined } : part;\n const value = text(obj[property]);\n if (!value) return undefined;\n return pattern ? pattern.replace(\"{}\", value) : value;\n}\n\n// enumLabel prefers the human label the schema declares for a code, falling back\n// to the code itself. Unlike the combobox option list this does NOT render\n// \"Label (code)\" — a chip has room for one of the two, and the label is the one\n// worth reading.\nfunction enumLabel(prop: JsonSchemaProperty | undefined, value: string): string {\n const label = prop?.[\"x-enum-labels\"]?.[value];\n return typeof label === \"string\" && label ? label : value;\n}\n\n// text flattens a value to its display string. Arrays join, so a list-valued\n// property still reads as one line.\nfunction text(value: unknown): string {\n if (value === undefined || value === null) return \"\";\n if (Array.isArray(value)) return value.map(text).filter(Boolean).join(VALUE_SEPARATOR);\n if (typeof value === \"object\") return \"\";\n return String(value).trim();\n}\n\nfunction stringArray(value: unknown): string[] {\n if (typeof value === \"string\") return [value];\n if (!Array.isArray(value)) return [];\n return value.filter((v): v is string => typeof v === \"string\" && !!v);\n}\n\nfunction summaryParts(value: unknown): Array<string | ArrayItemSummaryPart> {\n if (!Array.isArray(value)) return [];\n return (value as unknown[]).flatMap((part): Array<string | ArrayItemSummaryPart> => {\n if (typeof part === \"string\" && part) return [part];\n if (isPlainObject(part) && typeof part.property === \"string\" && part.property) {\n return [\n {\n property: part.property,\n ...(typeof part.pattern === \"string\" && part.pattern ? { pattern: part.pattern } : {}),\n } satisfies ArrayItemSummaryPart,\n ];\n }\n return [];\n });\n}\n\nfunction firstNonEmpty(values: Array<string | undefined>): string | undefined {\n for (const value of values) {\n const trimmed = typeof value === \"string\" ? value.trim() : \"\";\n if (trimmed) return trimmed;\n }\n return undefined;\n}\n"],"names":["isPlainObject","normalizeTone"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { ArrayItemSpec, ArrayItemSummary, JsonSchemaProperty } from './json-schema-form-types';
2
+ export declare function resolveItemSpec(arraySchema: JsonSchemaProperty, itemSchema: JsonSchemaProperty | undefined): ArrayItemSpec;
3
+ export declare function itemSummaryFor({ item, index, spec, itemSchema, }: {
4
+ item: unknown;
5
+ index: number;
6
+ spec: ArrayItemSpec;
7
+ itemSchema: JsonSchemaProperty | undefined;
8
+ }): ArrayItemSummary;
9
+ export declare function addItemLabel(spec: ArrayItemSpec): string;
10
+ export declare function itemCountLabel(spec: ArrayItemSpec, count: number): string;
11
+ export declare function emptyItemsCopy(spec: ArrayItemSpec, arraySchema: JsonSchemaProperty): string | undefined;
12
+ export declare function noItemsLabel(spec: ArrayItemSpec): string;
13
+ //# sourceMappingURL=json-schema-form-item-summary.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-schema-form-item-summary.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-item-summary.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,aAAa,EACb,gBAAgB,EAEhB,kBAAkB,EACnB,MAAM,0BAA0B,CAAC;AAalC,wBAAgB,eAAe,CAC7B,WAAW,EAAE,kBAAkB,EAC/B,UAAU,EAAE,kBAAkB,GAAG,SAAS,GACzC,aAAa,CAkBf;AAgBD,wBAAgB,cAAc,CAAC,EAC7B,IAAI,EACJ,KAAK,EACL,IAAI,EACJ,UAAU,GACX,EAAE;IACD,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,aAAa,CAAC;IACpB,UAAU,EAAE,kBAAkB,GAAG,SAAS,CAAC;CAC5C,GAAG,gBAAgB,CA4CnB;AAID,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAExD;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAIzE;AAID,wBAAgB,cAAc,CAC5B,IAAI,EAAE,aAAa,EACnB,WAAW,EAAE,kBAAkB,GAC9B,MAAM,GAAG,SAAS,CAIpB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,aAAa,GAAG,MAAM,CAExD"}