@dxos/react-ui-form 0.8.4-main.fd6878d → 0.8.4-staging.60fe92afc8

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 (318) hide show
  1. package/LICENSE +102 -5
  2. package/README.md +0 -1
  3. package/dist/lib/browser/index.mjs +4054 -2217
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/translations.mjs +87 -0
  7. package/dist/lib/browser/translations.mjs.map +7 -0
  8. package/dist/lib/node-esm/index.mjs +4054 -2217
  9. package/dist/lib/node-esm/index.mjs.map +4 -4
  10. package/dist/lib/node-esm/meta.json +1 -1
  11. package/dist/lib/node-esm/translations.mjs +89 -0
  12. package/dist/lib/node-esm/translations.mjs.map +7 -0
  13. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts +8 -8
  14. package/dist/types/src/components/FieldEditor/FieldEditor.d.ts.map +1 -1
  15. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts +89 -5
  16. package/dist/types/src/components/FieldEditor/FieldEditor.stories.d.ts.map +1 -1
  17. package/dist/types/src/components/Form/Form.d.ts +135 -25
  18. package/dist/types/src/components/Form/Form.d.ts.map +1 -1
  19. package/dist/types/src/components/Form/Form.stories.d.ts +207 -56
  20. package/dist/types/src/components/Form/Form.stories.d.ts.map +1 -1
  21. package/dist/types/src/components/Form/FormField.d.ts +52 -0
  22. package/dist/types/src/components/Form/FormField.d.ts.map +1 -0
  23. package/dist/types/src/components/Form/FormFieldComponent.d.ts +98 -0
  24. package/dist/types/src/components/Form/FormFieldComponent.d.ts.map +1 -0
  25. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts +9 -0
  26. package/dist/types/src/components/Form/FormFieldComponent.stories.d.ts.map +1 -0
  27. package/dist/types/src/components/Form/FormFieldSet.d.ts +26 -0
  28. package/dist/types/src/components/Form/FormFieldSet.d.ts.map +1 -0
  29. package/dist/types/src/components/Form/FormTooltipsContext.d.ts +19 -0
  30. package/dist/types/src/components/Form/FormTooltipsContext.d.ts.map +1 -0
  31. package/dist/types/src/components/Form/Layout/FormLayout.d.ts +50 -0
  32. package/dist/types/src/components/Form/Layout/FormLayout.d.ts.map +1 -0
  33. package/dist/types/src/components/Form/Layout/FormLayout.stories.d.ts +123 -0
  34. package/dist/types/src/components/Form/Layout/FormLayout.stories.d.ts.map +1 -0
  35. package/dist/types/src/components/Form/Layout/FormLayout.stories.test.d.ts +2 -0
  36. package/dist/types/src/components/Form/Layout/FormLayout.stories.test.d.ts.map +1 -0
  37. package/dist/types/src/components/Form/Layout/FormLayout.test.d.ts +2 -0
  38. package/dist/types/src/components/Form/Layout/FormLayout.test.d.ts.map +1 -0
  39. package/dist/types/src/components/Form/Layout/annotation.d.ts +30 -0
  40. package/dist/types/src/components/Form/Layout/annotation.d.ts.map +1 -0
  41. package/dist/types/src/components/Form/Layout/index.d.ts +4 -0
  42. package/dist/types/src/components/Form/Layout/index.d.ts.map +1 -0
  43. package/dist/types/src/components/Form/Layout/parser.d.ts +31 -0
  44. package/dist/types/src/components/Form/Layout/parser.d.ts.map +1 -0
  45. package/dist/types/src/components/Form/Layout/parser.test.d.ts +2 -0
  46. package/dist/types/src/components/Form/Layout/parser.test.d.ts.map +1 -0
  47. package/dist/types/src/components/Form/fields/ArrayField.d.ts +18 -0
  48. package/dist/types/src/components/Form/fields/ArrayField.d.ts.map +1 -0
  49. package/dist/types/src/components/Form/fields/BooleanField.d.ts +4 -0
  50. package/dist/types/src/components/Form/fields/BooleanField.d.ts.map +1 -0
  51. package/dist/types/src/components/Form/fields/DateField.d.ts +4 -0
  52. package/dist/types/src/components/Form/fields/DateField.d.ts.map +1 -0
  53. package/dist/types/src/components/Form/fields/GeoPointField.d.ts +5 -0
  54. package/dist/types/src/components/Form/fields/GeoPointField.d.ts.map +1 -0
  55. package/dist/types/src/components/Form/fields/InlineRefField.d.ts +13 -0
  56. package/dist/types/src/components/Form/fields/InlineRefField.d.ts.map +1 -0
  57. package/dist/types/src/components/Form/fields/MarkdownField.d.ts +11 -0
  58. package/dist/types/src/components/Form/fields/MarkdownField.d.ts.map +1 -0
  59. package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts +89 -0
  60. package/dist/types/src/components/Form/fields/MarkdownField.stories.d.ts.map +1 -0
  61. package/dist/types/src/components/Form/fields/NumberField.d.ts +4 -0
  62. package/dist/types/src/components/Form/fields/NumberField.d.ts.map +1 -0
  63. package/dist/types/src/components/Form/fields/RefField.d.ts +34 -0
  64. package/dist/types/src/components/Form/fields/RefField.d.ts.map +1 -0
  65. package/dist/types/src/components/Form/fields/RefField.test.d.ts +2 -0
  66. package/dist/types/src/components/Form/fields/RefField.test.d.ts.map +1 -0
  67. package/dist/types/src/components/Form/fields/SelectField.d.ts +13 -0
  68. package/dist/types/src/components/Form/fields/SelectField.d.ts.map +1 -0
  69. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts +5 -0
  70. package/dist/types/src/components/Form/fields/SelectOptionField.d.ts.map +1 -0
  71. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts +89 -0
  72. package/dist/types/src/components/Form/fields/SelectOptionField.stories.d.ts.map +1 -0
  73. package/dist/types/src/components/Form/fields/TextAreaField.d.ts +4 -0
  74. package/dist/types/src/components/Form/fields/TextAreaField.d.ts.map +1 -0
  75. package/dist/types/src/components/Form/fields/TextField.d.ts +4 -0
  76. package/dist/types/src/components/Form/fields/TextField.d.ts.map +1 -0
  77. package/dist/types/src/components/Form/fields/TupleField.d.ts +6 -0
  78. package/dist/types/src/components/Form/fields/TupleField.d.ts.map +1 -0
  79. package/dist/types/src/components/Form/fields/index.d.ts +14 -0
  80. package/dist/types/src/components/Form/fields/index.d.ts.map +1 -0
  81. package/dist/types/src/components/Form/index.d.ts +5 -4
  82. package/dist/types/src/components/Form/index.d.ts.map +1 -1
  83. package/dist/types/src/components/Form/meta-tags.d.ts +30 -0
  84. package/dist/types/src/components/Form/meta-tags.d.ts.map +1 -0
  85. package/dist/types/src/components/Form/meta-tags.test.d.ts +2 -0
  86. package/dist/types/src/components/Form/meta-tags.test.d.ts.map +1 -0
  87. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts +8 -0
  88. package/dist/types/src/components/ObjectForm/ObjectForm.d.ts.map +1 -0
  89. package/dist/types/src/components/ObjectForm/ObjectForm.stories.d.ts +87 -0
  90. package/dist/types/src/components/ObjectForm/ObjectForm.stories.d.ts.map +1 -0
  91. package/dist/types/src/components/ObjectForm/index.d.ts +2 -0
  92. package/dist/types/src/components/ObjectForm/index.d.ts.map +1 -0
  93. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts +68 -0
  94. package/dist/types/src/components/ObjectPicker/ObjectPicker.d.ts.map +1 -0
  95. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts +92 -0
  96. package/dist/types/src/components/ObjectPicker/ObjectPicker.stories.d.ts.map +1 -0
  97. package/dist/types/src/components/ObjectPicker/index.d.ts +2 -0
  98. package/dist/types/src/components/ObjectPicker/index.d.ts.map +1 -0
  99. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts +9 -0
  100. package/dist/types/src/components/ObjectProperties/ObjectProperties.d.ts.map +1 -0
  101. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts +132 -0
  102. package/dist/types/src/components/ObjectProperties/ObjectProperties.stories.d.ts.map +1 -0
  103. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts +2 -0
  104. package/dist/types/src/components/ObjectProperties/ObjectProperties.test.d.ts.map +1 -0
  105. package/dist/types/src/components/ObjectProperties/index.d.ts +2 -0
  106. package/dist/types/src/components/ObjectProperties/index.d.ts.map +1 -0
  107. package/dist/types/src/components/ObjectTree/ObjectTree.d.ts +9 -0
  108. package/dist/types/src/components/ObjectTree/ObjectTree.d.ts.map +1 -0
  109. package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts +91 -0
  110. package/dist/types/src/components/ObjectTree/ObjectTree.stories.d.ts.map +1 -0
  111. package/dist/types/src/components/ObjectTree/index.d.ts +2 -0
  112. package/dist/types/src/components/ObjectTree/index.d.ts.map +1 -0
  113. package/dist/types/src/components/RefEditor/RefEditor.d.ts +73 -0
  114. package/dist/types/src/components/RefEditor/RefEditor.d.ts.map +1 -0
  115. package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts +92 -0
  116. package/dist/types/src/components/RefEditor/RefEditor.stories.d.ts.map +1 -0
  117. package/dist/types/src/components/RefEditor/index.d.ts +3 -0
  118. package/dist/types/src/components/RefEditor/index.d.ts.map +1 -0
  119. package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts +47 -0
  120. package/dist/types/src/components/RefEditor/ref-editor-extension.d.ts.map +1 -0
  121. package/dist/types/src/components/Settings/Settings.d.ts +51 -0
  122. package/dist/types/src/components/Settings/Settings.d.ts.map +1 -0
  123. package/dist/types/src/components/Settings/Settings.stories.d.ts +89 -0
  124. package/dist/types/src/components/Settings/Settings.stories.d.ts.map +1 -0
  125. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts +43 -0
  126. package/dist/types/src/components/Settings/SettingsFieldSet.d.ts.map +1 -0
  127. package/dist/types/src/components/Settings/SettingsItem.d.ts +16 -0
  128. package/dist/types/src/components/Settings/SettingsItem.d.ts.map +1 -0
  129. package/dist/types/src/components/Settings/SettingsSelectField.d.ts +18 -0
  130. package/dist/types/src/components/Settings/SettingsSelectField.d.ts.map +1 -0
  131. package/dist/types/src/components/Settings/index.d.ts +4 -0
  132. package/dist/types/src/components/Settings/index.d.ts.map +1 -0
  133. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts +21 -11
  134. package/dist/types/src/components/ViewEditor/ViewEditor.d.ts.map +1 -1
  135. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts +91 -9
  136. package/dist/types/src/components/ViewEditor/ViewEditor.stories.d.ts.map +1 -1
  137. package/dist/types/src/components/index.d.ts +6 -2
  138. package/dist/types/src/components/index.d.ts.map +1 -1
  139. package/dist/types/src/components/testing.d.ts +14 -4
  140. package/dist/types/src/components/testing.d.ts.map +1 -1
  141. package/dist/types/src/hooks/index.d.ts +2 -3
  142. package/dist/types/src/hooks/index.d.ts.map +1 -1
  143. package/dist/types/src/hooks/useFormHandler.d.ts +82 -0
  144. package/dist/types/src/hooks/useFormHandler.d.ts.map +1 -0
  145. package/dist/types/src/hooks/useKeyHandler.d.ts +7 -0
  146. package/dist/types/src/hooks/useKeyHandler.d.ts.map +1 -0
  147. package/dist/types/src/index.d.ts +0 -2
  148. package/dist/types/src/index.d.ts.map +1 -1
  149. package/dist/types/src/translations.d.ts +70 -55
  150. package/dist/types/src/translations.d.ts.map +1 -1
  151. package/dist/types/src/util/field-type.d.ts +19 -0
  152. package/dist/types/src/util/field-type.d.ts.map +1 -0
  153. package/dist/types/src/util/field.d.ts +3 -3
  154. package/dist/types/src/util/field.d.ts.map +1 -1
  155. package/dist/types/src/util/formatting.d.ts +2 -2
  156. package/dist/types/src/util/formatting.d.ts.map +1 -1
  157. package/dist/types/src/util/index.d.ts +2 -1
  158. package/dist/types/src/util/index.d.ts.map +1 -1
  159. package/dist/types/src/util/properties.d.ts +35 -0
  160. package/dist/types/src/util/properties.d.ts.map +1 -0
  161. package/dist/types/src/util/properties.test.d.ts +2 -0
  162. package/dist/types/src/util/properties.test.d.ts.map +1 -0
  163. package/dist/types/src/util/refs.d.ts +3 -3
  164. package/dist/types/src/util/refs.d.ts.map +1 -1
  165. package/dist/types/tsconfig.tsbuildinfo +1 -1
  166. package/package.json +64 -47
  167. package/src/components/FieldEditor/FieldEditor.stories.tsx +49 -31
  168. package/src/components/FieldEditor/FieldEditor.test.tsx +4 -2
  169. package/src/components/FieldEditor/FieldEditor.tsx +100 -97
  170. package/src/components/Form/AUDIT.md +17 -0
  171. package/src/components/Form/Form.stories.tsx +151 -221
  172. package/src/components/Form/Form.tsx +461 -95
  173. package/src/components/Form/FormField.tsx +345 -0
  174. package/src/components/Form/FormFieldComponent.stories.tsx +65 -0
  175. package/src/components/Form/FormFieldComponent.tsx +253 -0
  176. package/src/components/Form/FormFieldSet.tsx +213 -0
  177. package/src/components/Form/FormTooltipsContext.ts +25 -0
  178. package/src/components/Form/Layout/FormLayout.stories.test.tsx +51 -0
  179. package/src/components/Form/Layout/FormLayout.stories.tsx +422 -0
  180. package/src/components/Form/Layout/FormLayout.test.ts +59 -0
  181. package/src/components/Form/Layout/FormLayout.tsx +251 -0
  182. package/src/components/Form/Layout/annotation.ts +38 -0
  183. package/src/components/Form/Layout/index.ts +7 -0
  184. package/src/components/Form/Layout/parser.test.ts +120 -0
  185. package/src/components/Form/Layout/parser.ts +167 -0
  186. package/src/components/Form/README.md +3 -0
  187. package/src/components/Form/fields/ArrayField.tsx +173 -0
  188. package/src/components/Form/fields/BooleanField.tsx +22 -0
  189. package/src/components/Form/fields/DateField.tsx +101 -0
  190. package/src/components/Form/fields/GeoPointField.tsx +124 -0
  191. package/src/components/Form/fields/InlineRefField.tsx +138 -0
  192. package/src/components/Form/fields/MarkdownField.stories.tsx +206 -0
  193. package/src/components/Form/fields/MarkdownField.tsx +167 -0
  194. package/src/components/Form/fields/NumberField.tsx +76 -0
  195. package/src/components/Form/fields/RefField.test.ts +45 -0
  196. package/src/components/Form/fields/RefField.tsx +266 -0
  197. package/src/components/Form/fields/SelectField.tsx +77 -0
  198. package/src/components/Form/fields/SelectOptionField.stories.tsx +66 -0
  199. package/src/components/Form/{custom/SelectOptionsInput.tsx → fields/SelectOptionField.tsx} +39 -32
  200. package/src/components/Form/fields/TextAreaField.tsx +38 -0
  201. package/src/components/Form/fields/TextField.tsx +38 -0
  202. package/src/components/Form/fields/TupleField.tsx +55 -0
  203. package/src/components/Form/fields/index.ts +17 -0
  204. package/src/components/Form/index.ts +6 -4
  205. package/src/components/Form/meta-tags.test.ts +47 -0
  206. package/src/components/Form/meta-tags.ts +33 -0
  207. package/src/components/ObjectForm/ObjectForm.stories.tsx +62 -0
  208. package/src/components/ObjectForm/ObjectForm.tsx +111 -0
  209. package/src/components/{ControlSection → ObjectForm}/index.ts +1 -1
  210. package/src/components/ObjectPicker/ObjectPicker.stories.tsx +212 -0
  211. package/src/components/ObjectPicker/ObjectPicker.tsx +202 -0
  212. package/src/components/ObjectPicker/index.ts +5 -0
  213. package/src/components/ObjectProperties/ObjectProperties.stories.tsx +350 -0
  214. package/src/components/ObjectProperties/ObjectProperties.test.tsx +111 -0
  215. package/src/components/ObjectProperties/ObjectProperties.tsx +146 -0
  216. package/src/components/ObjectProperties/index.ts +5 -0
  217. package/src/components/ObjectTree/ObjectTree.stories.tsx +134 -0
  218. package/src/components/ObjectTree/ObjectTree.tsx +190 -0
  219. package/src/components/ObjectTree/index.ts +5 -0
  220. package/src/components/RefEditor/RefEditor.stories.tsx +148 -0
  221. package/src/components/RefEditor/RefEditor.tsx +275 -0
  222. package/src/components/RefEditor/index.ts +6 -0
  223. package/src/components/RefEditor/ref-editor-extension.ts +254 -0
  224. package/src/components/Settings/AUDIT.md +51 -0
  225. package/src/components/Settings/Settings.stories.tsx +104 -0
  226. package/src/components/Settings/Settings.tsx +81 -0
  227. package/src/components/Settings/SettingsFieldSet.tsx +257 -0
  228. package/src/components/Settings/SettingsItem.tsx +58 -0
  229. package/src/components/Settings/SettingsSelectField.tsx +59 -0
  230. package/src/components/Settings/index.ts +7 -0
  231. package/src/components/ViewEditor/ViewEditor.stories.tsx +132 -64
  232. package/src/components/ViewEditor/ViewEditor.test.tsx +23 -22
  233. package/src/components/ViewEditor/ViewEditor.tsx +378 -216
  234. package/src/components/index.ts +6 -3
  235. package/src/components/testing.tsx +31 -12
  236. package/src/hooks/index.ts +2 -3
  237. package/src/hooks/useFormHandler.ts +380 -0
  238. package/src/hooks/useKeyHandler.tsx +37 -0
  239. package/src/index.ts +0 -4
  240. package/src/translations.ts +76 -59
  241. package/src/util/field-type.ts +60 -0
  242. package/src/util/field.ts +33 -43
  243. package/src/util/formatting.ts +22 -22
  244. package/src/util/index.ts +2 -1
  245. package/src/util/properties.test.ts +153 -0
  246. package/src/util/properties.ts +100 -0
  247. package/src/util/refs.ts +20 -19
  248. package/src/vite-env.d.ts +10 -0
  249. package/dist/types/src/components/ControlSection/ControlSection.d.ts +0 -23
  250. package/dist/types/src/components/ControlSection/ControlSection.d.ts.map +0 -1
  251. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts +0 -8
  252. package/dist/types/src/components/ControlSection/ControlSection.stories.d.ts.map +0 -1
  253. package/dist/types/src/components/ControlSection/index.d.ts +0 -2
  254. package/dist/types/src/components/ControlSection/index.d.ts.map +0 -1
  255. package/dist/types/src/components/Form/ArrayField.d.ts +0 -16
  256. package/dist/types/src/components/Form/ArrayField.d.ts.map +0 -1
  257. package/dist/types/src/components/Form/Defaults.d.ts +0 -14
  258. package/dist/types/src/components/Form/Defaults.d.ts.map +0 -1
  259. package/dist/types/src/components/Form/FormActions.d.ts +0 -9
  260. package/dist/types/src/components/Form/FormActions.d.ts.map +0 -1
  261. package/dist/types/src/components/Form/FormContent.d.ts +0 -57
  262. package/dist/types/src/components/Form/FormContent.d.ts.map +0 -1
  263. package/dist/types/src/components/Form/FormContext.d.ts +0 -23
  264. package/dist/types/src/components/Form/FormContext.d.ts.map +0 -1
  265. package/dist/types/src/components/Form/Input.d.ts +0 -26
  266. package/dist/types/src/components/Form/Input.d.ts.map +0 -1
  267. package/dist/types/src/components/Form/RefField.d.ts +0 -12
  268. package/dist/types/src/components/Form/RefField.d.ts.map +0 -1
  269. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts +0 -4
  270. package/dist/types/src/components/Form/custom/GeoPointInput.d.ts.map +0 -1
  271. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts +0 -4
  272. package/dist/types/src/components/Form/custom/SelectOptionsInput.d.ts.map +0 -1
  273. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts +0 -7
  274. package/dist/types/src/components/Form/custom/SelectOptionsInput.stories.d.ts.map +0 -1
  275. package/dist/types/src/components/Form/custom/TupleInput.d.ts +0 -6
  276. package/dist/types/src/components/Form/custom/TupleInput.d.ts.map +0 -1
  277. package/dist/types/src/components/Form/custom/index.d.ts +0 -4
  278. package/dist/types/src/components/Form/custom/index.d.ts.map +0 -1
  279. package/dist/types/src/components/Form/factory.d.ts +0 -8
  280. package/dist/types/src/components/Form/factory.d.ts.map +0 -1
  281. package/dist/types/src/components/deprecated/Form.d.ts +0 -15
  282. package/dist/types/src/components/deprecated/Form.d.ts.map +0 -1
  283. package/dist/types/src/components/deprecated/Form.stories.d.ts +0 -13
  284. package/dist/types/src/components/deprecated/Form.stories.d.ts.map +0 -1
  285. package/dist/types/src/components/deprecated/FormInput.d.ts +0 -16
  286. package/dist/types/src/components/deprecated/FormInput.d.ts.map +0 -1
  287. package/dist/types/src/components/deprecated/index.d.ts +0 -2
  288. package/dist/types/src/components/deprecated/index.d.ts.map +0 -1
  289. package/dist/types/src/hooks/useForm.d.ts +0 -67
  290. package/dist/types/src/hooks/useForm.d.ts.map +0 -1
  291. package/dist/types/src/hooks/useQueryRefOptions.d.ts +0 -23
  292. package/dist/types/src/hooks/useQueryRefOptions.d.ts.map +0 -1
  293. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts +0 -8
  294. package/dist/types/src/hooks/useRefQueryLookupHandler.d.ts.map +0 -1
  295. package/dist/types/src/util/schema.d.ts +0 -3
  296. package/dist/types/src/util/schema.d.ts.map +0 -1
  297. package/src/components/ControlSection/ControlSection.stories.tsx +0 -42
  298. package/src/components/ControlSection/ControlSection.tsx +0 -139
  299. package/src/components/Form/ArrayField.tsx +0 -125
  300. package/src/components/Form/Defaults.tsx +0 -204
  301. package/src/components/Form/FormActions.tsx +0 -54
  302. package/src/components/Form/FormContent.tsx +0 -241
  303. package/src/components/Form/FormContext.tsx +0 -110
  304. package/src/components/Form/Input.tsx +0 -51
  305. package/src/components/Form/RefField.tsx +0 -214
  306. package/src/components/Form/custom/GeoPointInput.tsx +0 -72
  307. package/src/components/Form/custom/SelectOptionsInput.stories.tsx +0 -62
  308. package/src/components/Form/custom/TupleInput.tsx +0 -47
  309. package/src/components/Form/custom/index.ts +0 -7
  310. package/src/components/Form/factory.tsx +0 -31
  311. package/src/components/deprecated/Form.stories.tsx +0 -63
  312. package/src/components/deprecated/Form.tsx +0 -119
  313. package/src/components/deprecated/FormInput.tsx +0 -71
  314. package/src/components/deprecated/index.ts +0 -5
  315. package/src/hooks/useForm.ts +0 -293
  316. package/src/hooks/useQueryRefOptions.ts +0 -53
  317. package/src/hooks/useRefQueryLookupHandler.ts +0 -39
  318. package/src/util/schema.ts +0 -14
@@ -1,241 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { Schema, SchemaAST, pipe } from 'effect';
6
- import { capitalize } from 'effect/String';
7
- import React, { forwardRef, useMemo } from 'react';
8
-
9
- import { createJsonPath, findNode, getDiscriminatedType, isDiscriminatedUnion } from '@dxos/effect';
10
- import { type ThemedClassName } from '@dxos/react-ui';
11
- import { mx } from '@dxos/react-ui-theme';
12
- import { type SchemaProperty, getSchemaProperties } from '@dxos/schema';
13
- import { isNotFalsy } from '@dxos/util';
14
-
15
- import { type QueryRefOptions } from '../../hooks';
16
- import { getRefProps } from '../../util';
17
-
18
- import { ArrayField } from './ArrayField';
19
- import { SelectInput } from './Defaults';
20
- import { getInputComponent } from './factory';
21
- import { type ComponentLookup } from './Form';
22
- import { useFormValues, useInputProps } from './FormContext';
23
- import { type InputComponent } from './Input';
24
- import { RefField } from './RefField';
25
-
26
- export type FormFieldProps = {
27
- property: SchemaProperty<any>;
28
- path?: (string | number)[];
29
- readonly?: boolean;
30
- /** Used to indicate if input should be presented inline (e.g. for array items). */
31
- inline?: boolean;
32
- onQueryRefOptions?: QueryRefOptions;
33
- lookupComponent?: ComponentLookup;
34
- Custom?: Partial<Record<string, InputComponent>>;
35
- };
36
-
37
- export const FormField = ({
38
- property,
39
- path,
40
- readonly,
41
- inline,
42
- onQueryRefOptions,
43
- lookupComponent,
44
- Custom,
45
- }: FormFieldProps) => {
46
- const { ast, name, type, format, title, description, options, examples, array } = property;
47
- const inputProps = useInputProps(path);
48
-
49
- const label = useMemo(() => title ?? pipe(name, capitalize), [title, name]);
50
- const placeholder = useMemo(
51
- () => (examples?.length ? `Example: "${examples[0]}"` : description),
52
- [examples, description],
53
- );
54
-
55
- //
56
- // Registry and Custom.
57
- //
58
-
59
- const FoundComponent = lookupComponent?.({
60
- prop: name,
61
- schema: Schema.make(ast),
62
- inputProps: {
63
- type,
64
- format,
65
- label,
66
- disabled: readonly,
67
- placeholder,
68
- ...inputProps,
69
- },
70
- });
71
-
72
- if (FoundComponent) {
73
- return FoundComponent;
74
- }
75
-
76
- const jsonPath = createJsonPath(path ?? []);
77
- const CustomComponent = Custom?.[jsonPath];
78
- if (CustomComponent) {
79
- return (
80
- <CustomComponent
81
- type={type}
82
- format={format}
83
- label={label}
84
- inputOnly={inline}
85
- placeholder={placeholder}
86
- disabled={readonly}
87
- {...inputProps}
88
- />
89
- );
90
- }
91
-
92
- //
93
- // Refs.
94
- //
95
-
96
- const refProps = getRefProps(property);
97
- if (refProps) {
98
- return (
99
- <RefField
100
- ast={refProps.ast}
101
- array={refProps.isArray}
102
- type={type}
103
- format={format}
104
- label={label}
105
- placeholder={placeholder}
106
- disabled={readonly}
107
- inputOnly={inline}
108
- onQueryRefOptions={onQueryRefOptions}
109
- {...inputProps}
110
- />
111
- );
112
- }
113
-
114
- //
115
- // Arrays.
116
- //
117
-
118
- if (array) {
119
- return <ArrayField property={property} path={path} inputProps={inputProps} readonly={readonly} Custom={Custom} />;
120
- }
121
-
122
- //
123
- // Standard Inputs.
124
- //
125
-
126
- const InputComponent = getInputComponent(type, format);
127
- if (InputComponent) {
128
- return (
129
- <InputComponent
130
- type={type}
131
- format={format}
132
- label={label}
133
- inputOnly={inline}
134
- placeholder={placeholder}
135
- disabled={readonly}
136
- {...inputProps}
137
- />
138
- );
139
- }
140
-
141
- //
142
- // Select.
143
- //
144
-
145
- if (options) {
146
- return (
147
- <SelectInput
148
- type={type}
149
- format={format}
150
- disabled={readonly}
151
- inputOnly={inline}
152
- label={label}
153
- options={options.map((option) => ({ value: option, label: String(option) }))}
154
- placeholder={placeholder}
155
- {...inputProps}
156
- />
157
- );
158
- }
159
-
160
- //
161
- // Nested Objects.
162
- //
163
-
164
- if (type === 'object') {
165
- const baseNode = findNode(ast, isDiscriminatedUnion);
166
- const typeLiteral = baseNode
167
- ? getDiscriminatedType(baseNode, inputProps.getValue() as any)
168
- : findNode(ast, SchemaAST.isTypeLiteral);
169
-
170
- if (typeLiteral) {
171
- return (
172
- <>
173
- {!inline && <h3 className={mx('text-lg mlb-inputSpacingBlock first:mbs-0')}>{label}</h3>}
174
- <FormFields
175
- schema={Schema.make(typeLiteral)}
176
- path={path}
177
- readonly={readonly}
178
- onQueryRefOptions={onQueryRefOptions}
179
- Custom={Custom}
180
- lookupComponent={lookupComponent}
181
- />
182
- </>
183
- );
184
- }
185
- }
186
-
187
- return null;
188
- };
189
-
190
- export type FormFieldsProps = ThemedClassName<{
191
- testId?: string;
192
- readonly?: boolean;
193
- schema: Schema.Schema.All;
194
- /**
195
- * Path to the current object from the root. Used with nested forms.
196
- */
197
- path?: (string | number)[];
198
- filter?: (props: SchemaProperty<any>[]) => SchemaProperty<any>[];
199
- sort?: string[];
200
- lookupComponent?: ComponentLookup;
201
- /**
202
- * Map of custom renderers for specific properties.
203
- * Prefer lookupComponent for plugin specific input surfaces.
204
- */
205
- Custom?: Partial<Record<string, InputComponent>>;
206
- onQueryRefOptions?: QueryRefOptions;
207
- }>;
208
-
209
- export const FormFields = forwardRef<HTMLDivElement, FormFieldsProps>(
210
- (
211
- { classNames, testId, schema, path, filter, sort, readonly, lookupComponent, Custom, onQueryRefOptions },
212
- forwardRef,
213
- ) => {
214
- const values = useFormValues(path);
215
- const properties = useMemo(() => {
216
- const props = getSchemaProperties(schema.ast, values);
217
- const filtered = filter ? filter(props) : props;
218
- return sort ? filtered.sort((a, b) => sort.indexOf(a.name) - sort.indexOf(b.name)) : filtered;
219
- }, [schema, values, filter, sort]);
220
-
221
- return (
222
- <div role='form' className={mx('is-full', classNames)} ref={forwardRef}>
223
- {properties
224
- .map((property) => {
225
- return (
226
- <FormField
227
- key={property.name}
228
- property={property}
229
- path={[...(path ?? []), property.name]}
230
- readonly={readonly}
231
- onQueryRefOptions={onQueryRefOptions}
232
- lookupComponent={lookupComponent}
233
- Custom={Custom}
234
- />
235
- );
236
- })
237
- .filter(isNotFalsy)}
238
- </div>
239
- );
240
- },
241
- );
@@ -1,110 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import React, {
6
- type FocusEvent,
7
- type PropsWithChildren,
8
- type RefObject,
9
- createContext,
10
- useCallback,
11
- useContext,
12
- useEffect,
13
- useMemo,
14
- } from 'react';
15
-
16
- import { raise } from '@dxos/debug';
17
- import { type BaseObject, getValue } from '@dxos/echo-schema';
18
- import { type SimpleType, createJsonPath } from '@dxos/effect';
19
-
20
- import { type FormHandler, type FormOptions, useForm } from '../../hooks';
21
-
22
- type FormContextValue<T extends BaseObject> = FormHandler<T>;
23
-
24
- const FormContext = createContext<FormContextValue<any> | undefined>(undefined);
25
-
26
- export const useFormContext = <T extends BaseObject>(): FormContextValue<T> => {
27
- return useContext(FormContext) ?? raise(new Error('Missing FormContext'));
28
- };
29
-
30
- export const useFormValues = (path: (string | number)[] = []): any => {
31
- const { values: formValues } = useFormContext();
32
- const jsonPath = createJsonPath(path);
33
- return getValue(formValues, jsonPath) as BaseObject;
34
- };
35
-
36
- export type FormInputStateProps = {
37
- getStatus: () => { status?: 'error'; error?: string };
38
- getValue: <V>() => V | undefined;
39
- onValueChange: (type: SimpleType, value: any) => void;
40
- onBlur: (event: FocusEvent<HTMLElement>) => void;
41
- };
42
-
43
- export const useInputProps = (path: (string | number)[] = []): FormInputStateProps => {
44
- const { getStatus, getValue: getFormValue, onValueChange, onTouched } = useFormContext();
45
-
46
- const stablePath = useMemo(() => path, [Array.isArray(path) ? path.join('.') : path]);
47
- return useMemo(
48
- () => ({
49
- getStatus: () => getStatus(stablePath),
50
- getValue: () => getFormValue(stablePath),
51
- onValueChange: (type: SimpleType, value: any) => onValueChange(stablePath, type, value),
52
- onBlur: () => onTouched(stablePath),
53
- }),
54
- [getStatus, getFormValue, onValueChange, onTouched, stablePath],
55
- );
56
- };
57
-
58
- export const FormProvider = ({
59
- children,
60
- formRef,
61
- autoSave,
62
- ...formOptions
63
- }: PropsWithChildren<
64
- FormOptions<any> & {
65
- formRef?: RefObject<HTMLDivElement>;
66
- autoSave?: boolean;
67
- }
68
- >) => {
69
- const form = useForm(formOptions);
70
-
71
- const handleKeyDown = useCallback(
72
- (event: KeyboardEvent) => {
73
- const keyIsEnter = event.key === 'Enter';
74
- const modifierUsed = event.ctrlKey || event.altKey || event.metaKey || event.shiftKey;
75
- const inputIsTextarea = (event.target as HTMLElement).tagName.toLowerCase() === 'textarea';
76
- const inputOptOut =
77
- (event.target as HTMLElement).hasAttribute('data-no-submit') ||
78
- (event.target as HTMLElement).closest('[data-no-submit]') !== null;
79
-
80
- // Regular inputs: Submit on Enter (no modifiers).
81
- const shouldSubmitRegularInput = !inputIsTextarea && keyIsEnter && !modifierUsed;
82
-
83
- // Textareas: Submit only on Meta+Enter.
84
- const shouldSubmitTextarea = inputIsTextarea && keyIsEnter && event.metaKey;
85
-
86
- if ((shouldSubmitRegularInput || shouldSubmitTextarea) && !inputOptOut) {
87
- if (!autoSave && form.canSave) {
88
- form.handleSave();
89
- }
90
- if (autoSave && form.formIsValid) {
91
- (event.target as HTMLElement).blur();
92
- }
93
- }
94
- },
95
- [form, autoSave],
96
- );
97
-
98
- useEffect(() => {
99
- if (!formRef?.current) {
100
- return;
101
- }
102
-
103
- const formElement = formRef.current;
104
-
105
- formElement.addEventListener('keydown', handleKeyDown);
106
- return () => formElement.removeEventListener('keydown', handleKeyDown);
107
- }, [formRef, form.canSave, form.formIsValid, form.handleSave, autoSave]);
108
-
109
- return <FormContext.Provider value={form}>{children}</FormContext.Provider>;
110
- };
@@ -1,51 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import React, { type FC } from 'react';
6
-
7
- import { type FormatEnum } from '@dxos/echo-schema';
8
- import { type SimpleType } from '@dxos/effect';
9
- import { Icon, Input, Tooltip } from '@dxos/react-ui';
10
- import { labelSpacing } from '@dxos/react-ui-stack';
11
- import { errorText, mx } from '@dxos/react-ui-theme';
12
-
13
- import { type FormInputStateProps } from './FormContext';
14
-
15
- /**
16
- * Props passed to input components.
17
- */
18
- export type InputProps = {
19
- type: SimpleType;
20
- format?: FormatEnum;
21
- label: string;
22
- disabled?: boolean;
23
- placeholder?: string;
24
- inputOnly?: boolean;
25
- } & FormInputStateProps;
26
-
27
- /**
28
- * Form input component.
29
- */
30
- export type InputComponent = FC<InputProps>;
31
-
32
- export type InputHeaderProps = {
33
- error?: string;
34
- label: string;
35
- readonly?: boolean;
36
- };
37
-
38
- export const InputHeader = ({ error, label, readonly }: InputHeaderProps) => {
39
- const Label = readonly ? 'span' : Input.Label;
40
- const labelProps = readonly ? {} : { classNames: '!mlb-0' };
41
- return (
42
- <div role='none' className={mx('flex justify-between items-center', labelSpacing)}>
43
- <Label {...labelProps}>{label}</Label>
44
- {error && (
45
- <Tooltip.Trigger asChild content={error} side='bottom'>
46
- <Icon icon='ph--warning--regular' size={4} classNames={errorText} />
47
- </Tooltip.Trigger>
48
- )}
49
- </div>
50
- );
51
- };
@@ -1,214 +0,0 @@
1
- //
2
- // Copyright 2025 DXOS.org
3
- //
4
-
5
- import { type SchemaAST } from 'effect';
6
- import React, { type FocusEvent, useCallback, useMemo } from 'react';
7
-
8
- import {
9
- Expando,
10
- Ref,
11
- ReferenceAnnotationId,
12
- type ReferenceAnnotationValue,
13
- getTypeAnnotation,
14
- } from '@dxos/echo-schema';
15
- import { findAnnotation } from '@dxos/effect';
16
- import { DXN } from '@dxos/keys';
17
- import { DxRefTag } from '@dxos/lit-ui/react';
18
- import { Input, useTranslation } from '@dxos/react-ui';
19
- import { TagPicker, type TagPickerItemData, type TagPickerMode } from '@dxos/react-ui-tag-picker';
20
- import { descriptionText, mx } from '@dxos/react-ui-theme';
21
- import { isNonNullable } from '@dxos/util';
22
-
23
- import { type QueryRefOptions, useQueryRefOptions } from '../../hooks';
24
- import { translationKey } from '../../translations';
25
-
26
- import { TextInput } from './Defaults';
27
- import { InputHeader, type InputProps } from './Input';
28
-
29
- type RefFieldProps = InputProps & {
30
- ast?: SchemaAST.AST;
31
- array?: boolean;
32
- onQueryRefOptions?: QueryRefOptions;
33
- };
34
-
35
- export const RefField = ({
36
- type,
37
- label,
38
- disabled,
39
- placeholder,
40
- inputOnly,
41
- array,
42
- ast,
43
- getValue,
44
- onBlur,
45
- onQueryRefOptions,
46
- onValueChange,
47
- ...restInputProps
48
- }: RefFieldProps) => {
49
- const { t } = useTranslation(translationKey);
50
- const refTypeInfo = useMemo(
51
- () => (ast ? findAnnotation<ReferenceAnnotationValue>(ast, ReferenceAnnotationId) : undefined),
52
- [ast],
53
- );
54
- const { options: availableOptions, loading: _loading } = useQueryRefOptions({ refTypeInfo, onQueryRefOptions });
55
-
56
- if ((refTypeInfo && refTypeInfo?.typename === getTypeAnnotation(Expando)?.typename) || !onQueryRefOptions) {
57
- // If ref type is expando, fall back to taking a DXN in string format.
58
- return (
59
- <RefFieldFallback
60
- {...{ type, label, placeholder, disabled, inputOnly, getValue, onBlur, onValueChange, ...restInputProps }}
61
- />
62
- );
63
- }
64
-
65
- const handleGetValue = useCallback((): TagPickerItemData[] => {
66
- const formValue = getValue();
67
-
68
- const unknownToRefOption = (val: unknown) => {
69
- if (Ref.isRef(val)) {
70
- const dxnString = val.dxn.toString();
71
- const matchingOption = availableOptions.find((option) => option.id === dxnString);
72
- if (matchingOption) {
73
- return matchingOption;
74
- }
75
- }
76
- return undefined;
77
- };
78
-
79
- if (array && Array.isArray(formValue)) {
80
- return formValue.map(unknownToRefOption).filter(isNonNullable) ?? [];
81
- }
82
-
83
- const option = unknownToRefOption(formValue);
84
- if (option) {
85
- return [option];
86
- }
87
-
88
- return [];
89
- }, [getValue, availableOptions, array]);
90
-
91
- const handleSearch = useCallback(
92
- (text: string, ids: string[]): TagPickerItemData[] =>
93
- availableOptions
94
- .filter((option) => !ids.includes(option.id))
95
- .filter((option) => option.label.toLowerCase().includes(text.toLowerCase()))
96
- .map((option) => ({ id: option.id, label: option.label, hue: option.hue as any })),
97
- [availableOptions],
98
- );
99
-
100
- const handleUpdate = useCallback(
101
- (ids: string[]) => {
102
- if (ids.length === 0) {
103
- onValueChange('object', undefined);
104
- return;
105
- }
106
-
107
- const refs = ids
108
- .map((id) => {
109
- const item = availableOptions.find((option) => option.id === id);
110
- if (item) {
111
- const dxn = DXN.parse(item.id);
112
- return Ref.fromDXN(dxn);
113
- }
114
- return null;
115
- })
116
- .filter(isNonNullable);
117
-
118
- if (array) {
119
- onValueChange('object', refs);
120
- } else {
121
- onValueChange('object', refs[0]);
122
- }
123
- },
124
- [availableOptions, array, onValueChange],
125
- );
126
-
127
- const tagPickerMode: TagPickerMode = useMemo(() => (array ? 'multi-select' : 'single-select'), [array]);
128
-
129
- if (!refTypeInfo) {
130
- return null;
131
- }
132
-
133
- const { status, error } = restInputProps.getStatus();
134
-
135
- const items = handleGetValue();
136
-
137
- // NOTE(thure): I left both predicates in-place in case we decide to add variants which do render readonly but empty values.
138
- return disabled && items.length < 1 ? null : (
139
- <Input.Root validationValence={status}>
140
- {!inputOnly && <InputHeader error={error} label={label} />}
141
- <div data-no-submit>
142
- {disabled ? (
143
- items.length < 1 ? (
144
- <p className={mx(descriptionText, 'mbe-2')}>{t('empty readonly ref field label')}</p>
145
- ) : (
146
- items.map((item) => (
147
- <DxRefTag key={item.id} refid={item.id} rootclassname='mie-1' style={{ marginInlineEnd: '.25rem' }}>
148
- {item.label}
149
- </DxRefTag>
150
- ))
151
- )
152
- ) : (
153
- <TagPicker
154
- readonly={disabled}
155
- items={items}
156
- mode={tagPickerMode}
157
- onBlur={(event) => onBlur(event as unknown as FocusEvent<HTMLElement>)}
158
- onUpdate={handleUpdate}
159
- onSearch={handleSearch}
160
- classNames='bg-inputSurface p-1.5 rounded-sm'
161
- />
162
- )}
163
- </div>
164
- {inputOnly && <Input.DescriptionAndValidation>{error}</Input.DescriptionAndValidation>}
165
- </Input.Root>
166
- );
167
- };
168
-
169
- const RefFieldFallback = ({
170
- type,
171
- label,
172
- disabled,
173
- placeholder,
174
- inputOnly,
175
- getValue,
176
- onValueChange,
177
- ...restInputProps
178
- }: InputProps) => {
179
- const handleOnValueChange = (_type: any, dxnString: string) => {
180
- const dxn = DXN.tryParse(dxnString);
181
- if (dxn) {
182
- onValueChange?.('object', Ref.fromDXN(dxn));
183
- } else if (dxnString === '') {
184
- onValueChange?.('object', undefined);
185
- } else {
186
- onValueChange?.('string', dxnString);
187
- }
188
- };
189
-
190
- const handleGetValue = () => {
191
- const formValue = getValue();
192
- if (typeof formValue === 'string') {
193
- return formValue;
194
- }
195
- if (Ref.isRef(formValue)) {
196
- return formValue.dxn.toString();
197
- }
198
-
199
- return undefined;
200
- };
201
-
202
- return (
203
- <TextInput
204
- type={type}
205
- label={label}
206
- disabled={disabled}
207
- placeholder={placeholder}
208
- inputOnly={inputOnly}
209
- getValue={handleGetValue as <V>() => V | undefined}
210
- onValueChange={handleOnValueChange}
211
- {...restInputProps}
212
- />
213
- );
214
- };
@@ -1,72 +0,0 @@
1
- //
2
- // Copyright 2024 DXOS.org
3
- //
4
-
5
- import React, { type ChangeEvent, useCallback, useEffect, useMemo, useState } from 'react';
6
-
7
- import { GeoLocation, type GeoPoint } from '@dxos/echo-schema';
8
- import { Input, useTranslation } from '@dxos/react-ui';
9
- import { safeParseFloat } from '@dxos/util';
10
-
11
- import { translationKey } from '../../../translations';
12
- import { InputHeader, type InputProps } from '../Input';
13
-
14
- export const GeoPointInput = ({ type, label, disabled, getStatus, getValue, onValueChange, onBlur }: InputProps) => {
15
- const { t } = useTranslation(translationKey);
16
- const { status, error } = getStatus();
17
- const geoPoint = useMemo<GeoPoint>(() => getValue<GeoPoint>() ?? [0, 0], [getValue]);
18
- const geoLocation = useMemo(() => GeoLocation.fromGeoPoint(geoPoint), [geoPoint]);
19
-
20
- const [longitudeText, setLongitudeText] = useState(geoLocation.longitude?.toString());
21
- const [latitudeText, setLatitudeText] = useState(geoLocation.latitude?.toString());
22
-
23
- useEffect(() => {
24
- const location = GeoLocation.fromGeoPoint(geoPoint);
25
- setLongitudeText(location.longitude.toString());
26
- setLatitudeText(location.latitude.toString());
27
- }, [geoPoint]);
28
-
29
- const handleCoordinateChange = useCallback(
30
- (coordinateType: keyof Pick<GeoLocation, 'longitude' | 'latitude'>, setText: (text: string) => void) =>
31
- (event: ChangeEvent<HTMLInputElement>) => {
32
- const inputText = event.target.value;
33
- setText(inputText);
34
- if (inputText !== '' && inputText !== '-') {
35
- const coord = safeParseFloat(inputText);
36
- if (coord !== undefined && !isNaN(coord)) {
37
- const currentLocation = GeoLocation.fromGeoPoint(getValue<GeoPoint>() ?? [0, 0]);
38
- const newLocation = { ...currentLocation, [coordinateType]: coord };
39
- const newValue = GeoLocation.toGeoPoint(newLocation);
40
- onValueChange(type, newValue);
41
- }
42
- }
43
- },
44
- [getValue, onValueChange, type],
45
- );
46
-
47
- return (
48
- <Input.Root validationValence={status}>
49
- <InputHeader error={error} label={label} />
50
- <div role='none' className='grid grid-cols-2 gap-2'>
51
- <Input.TextInput
52
- type='text'
53
- pattern='^-?[0-9]*\.?[0-9]*$'
54
- disabled={disabled}
55
- placeholder={t('placeholder latitude')}
56
- value={latitudeText}
57
- onChange={handleCoordinateChange('latitude', setLatitudeText)}
58
- onBlur={onBlur}
59
- />
60
- <Input.TextInput
61
- type='text'
62
- pattern='^-?[0-9]*\.?[0-9]*$'
63
- disabled={disabled}
64
- placeholder={t('placeholder longitude')}
65
- value={longitudeText}
66
- onChange={handleCoordinateChange('longitude', setLongitudeText)}
67
- onBlur={onBlur}
68
- />
69
- </div>
70
- </Input.Root>
71
- );
72
- };