@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
@@ -0,0 +1,146 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ import * as Function from 'effect/Function';
6
+ import * as Option from 'effect/Option';
7
+ import React, { type PropsWithChildren, useCallback, useMemo } from 'react';
8
+
9
+ import { Obj, Ref, Tag, Type } from '@dxos/echo';
10
+ import { useType } from '@dxos/echo-react';
11
+ import { SchemaEx } from '@dxos/effect';
12
+ import { invariant } from '@dxos/invariant';
13
+ import { composable, composableProps } from '@dxos/react-ui';
14
+ import { HuePicker } from '@dxos/react-ui-pickers';
15
+ import { FactoryAnnotation } from '@dxos/schema';
16
+
17
+ import { translationKey } from '#translations';
18
+
19
+ import { Form, type FormFieldMap, META_TAGS_KEY, withMetaTags } from '../Form';
20
+
21
+ export type ObjectPropertiesProps = PropsWithChildren<{ object: Obj.Unknown }>;
22
+
23
+ // TODO(wittjosiah): Reconcile w/ ObjectForm.
24
+ export const ObjectProperties = composable<HTMLDivElement, ObjectPropertiesProps>(
25
+ ({ children, object, ...props }, forwardedRef) => {
26
+ const db = Obj.getDatabase(object);
27
+ const meta = Obj.getMeta(object);
28
+ // `meta.tags` already holds `Ref<Tag>`s (materialized by the database handler).
29
+ const tags = [...meta.tags];
30
+ const values = useMemo(() => ({ [META_TAGS_KEY]: tags, ...object }), [object, tags]);
31
+
32
+ // Obj.getType fails for database-registered (dynamic) schemas due to DXN mismatch;
33
+ // useType queries by the object's stored type URI, resolving both static and dynamic schemas.
34
+ const typeUri = Obj.getTypeURI(object);
35
+ const typeFromRegistry = useType(db, typeUri);
36
+ const type = Obj.getType(object) ?? typeFromRegistry;
37
+
38
+ const formSchema = useMemo(() => {
39
+ return Function.pipe(
40
+ type,
41
+ Option.fromNullable,
42
+ Option.map((type) => Type.getSchema(type)),
43
+ Option.map((schema) => withMetaTags(schema)),
44
+ Option.getOrUndefined,
45
+ );
46
+ }, [type]);
47
+
48
+ // Persist a newly-created object referenced by one of the form's ref
49
+ // fields and return it. The calling RefField wires the new Ref into its
50
+ // own slot's form value; for the synthetic `_tags` array, the resulting
51
+ // form change is then synced back to `Obj.getMeta(object).tags` by
52
+ // `handleChange` below — so Tag.Tag follows the same generic path as any
53
+ // other ref-array field, no type-specific branching required here.
54
+ //
55
+ // Schemas whose required structure can't be produced by `Obj.make(schema,
56
+ // values)` alone (e.g. types with a required ref to a backing object) can
57
+ // declare a `FactoryAnnotation` to take over construction.
58
+ const handleCreate = useCallback(
59
+ (type: Type.AnyEntity, values: any): Obj.Unknown => {
60
+ invariant(db);
61
+ invariant(Type.isObject(type));
62
+ const factory = Option.getOrUndefined(FactoryAnnotation.get(Type.getSchema(type)));
63
+ const newObject = factory ? (factory(values) as Obj.Unknown) : Obj.make(type, values);
64
+ return db.add(newObject) as Obj.Unknown;
65
+ },
66
+ [db],
67
+ );
68
+
69
+ // TODO(wittjosiah): Use FormRootProps type.
70
+ const handleChange = useCallback(
71
+ (
72
+ { [META_TAGS_KEY]: metaTags, ...values }: any,
73
+ { isValid, changed }: { isValid: boolean; changed: Record<SchemaEx.JsonPath, boolean> },
74
+ ) => {
75
+ if (!isValid) {
76
+ return;
77
+ }
78
+
79
+ const changedPaths = Object.keys(changed).filter(
80
+ (path) => changed[path as SchemaEx.JsonPath],
81
+ ) as SchemaEx.JsonPath[];
82
+
83
+ // Handle meta-tags separately using Obj.update.
84
+ const hasTagsChange = changedPaths.some((path) => SchemaEx.splitJsonPath(path)[0] === META_TAGS_KEY);
85
+ if (hasTagsChange) {
86
+ Obj.update(object, (object) => {
87
+ // Copy so later in-place form mutations don't bypass the `Obj.update` boundary.
88
+ Obj.getMeta(object).tags = Array.isArray(metaTags) ? [...(metaTags as Ref.Ref<Tag.Tag>[])] : [];
89
+ });
90
+ }
91
+
92
+ // Handle other property changes.
93
+ const nonTagPaths = changedPaths.filter((path) => SchemaEx.splitJsonPath(path)[0] !== META_TAGS_KEY);
94
+ if (nonTagPaths.length > 0) {
95
+ Obj.update(object, () => {
96
+ for (const path of nonTagPaths) {
97
+ const parts = SchemaEx.splitJsonPath(path);
98
+ const value = Obj.getValue(values as any, parts);
99
+ Obj.setValue(object, parts, value);
100
+ }
101
+ });
102
+ }
103
+ },
104
+ [object],
105
+ );
106
+
107
+ if (!formSchema) {
108
+ return null;
109
+ }
110
+
111
+ return (
112
+ <Form.Root
113
+ schema={formSchema}
114
+ defaultValues={values as any}
115
+ createTypename={Type.getTypename(Tag.Tag)}
116
+ createOptionIcon='ph--plus--regular'
117
+ createOptionLabel={['add-tag.label', { ns: translationKey }]}
118
+ createInitialValuePath='label'
119
+ createFieldMap={createFieldMap}
120
+ db={db}
121
+ onValuesChanged={handleChange}
122
+ onCreate={handleCreate}
123
+ >
124
+ <Form.Viewport {...composableProps(props)} ref={forwardedRef}>
125
+ <Form.Content>
126
+ <Form.FieldSet />
127
+ {children}
128
+ </Form.Content>
129
+ </Form.Viewport>
130
+ </Form.Root>
131
+ );
132
+ },
133
+ );
134
+
135
+ const createFieldMap: FormFieldMap = {
136
+ hue: ({ type, label, layout, getValue, onValueChange }) => {
137
+ const handleChange = useCallback((nextHue: string) => onValueChange(type, nextHue), [onValueChange, type]);
138
+ const handleReset = useCallback(() => onValueChange(type, undefined), [onValueChange, type]);
139
+ return (
140
+ <>
141
+ {layout !== 'inline' && <Form.Label label={label} />}
142
+ <HuePicker value={getValue()} onChange={handleChange} onReset={handleReset} />
143
+ </>
144
+ );
145
+ },
146
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2024 DXOS.org
3
+ //
4
+
5
+ export * from './ObjectProperties';
@@ -0,0 +1,134 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React from 'react';
7
+
8
+ import { parseProto } from '@dxos/effect-proto';
9
+ import { log } from '@dxos/log';
10
+ import { type Config as ConfigProto, Runtime } from '@dxos/protocols/proto/dxos/config';
11
+ // Raw .proto source resolved through `@dxos/protocols`'s `./proto/dxos/*.proto`
12
+ // exports entry. Vite's `?raw` query suffix returns the file as a string so we
13
+ // can hand it straight to `parseProto` -- the same flow the unit test uses.
14
+ import configProto from '@dxos/protocols/proto/dxos/config.proto?raw';
15
+ import { Syntax } from '@dxos/react-ui-syntax-highlighter';
16
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
17
+
18
+ import { translations } from '#translations';
19
+
20
+ import { Form } from '../Form';
21
+ import { ObjectTree } from './ObjectTree';
22
+
23
+ const registry = parseProto(configProto);
24
+ const ConfigSchema = registry.get('dxos.config.Config');
25
+
26
+ // A representative Config value that exercises nested messages, arrays, enums
27
+ // (rendered as their string names by the proto codec), and `google.protobuf.Any`.
28
+ const value: ConfigProto = {
29
+ version: 1,
30
+ runtime: {
31
+ client: {
32
+ log: { filter: 'info', prefix: 'app' },
33
+ storage: {
34
+ persistent: true,
35
+ sqliteMode: Runtime.Client.Storage.SqliteMode.OPFS,
36
+ dataRoot: '/var/lib/dxos',
37
+ },
38
+ edgeFeatures: {
39
+ echoReplicator: true,
40
+ subductionReplicator: true,
41
+ signaling: true,
42
+ },
43
+ servicesMode: Runtime.Client.ServicesMode.SHARED_WORKER,
44
+ enableSnapshots: false,
45
+ snapshotInterval: 60_000,
46
+ },
47
+ app: {
48
+ org: 'DXOS',
49
+ theme: 'dark',
50
+ website: 'https://dxos.org',
51
+ build: {
52
+ timestamp: '2026-05-22T12:00:00Z',
53
+ commitHash: 'abc1234',
54
+ version: '0.8.3',
55
+ branch: 'main',
56
+ },
57
+ },
58
+ services: {
59
+ edge: { url: 'wss://edge.dxos.org' },
60
+ signaling: [
61
+ { server: 'wss://signal-1.dxos.org', api: 'v1' },
62
+ { server: 'wss://signal-2.dxos.org', api: 'v1' },
63
+ ],
64
+ iceProviders: [{ urls: 'turn:turn.dxos.org' }],
65
+ },
66
+ keys: [
67
+ { name: 'OPENAI_API_KEY', value: 'sk-...' },
68
+ { name: 'ANTHROPIC_API_KEY', value: 'ant-...' },
69
+ ],
70
+ },
71
+ };
72
+
73
+ const meta = {
74
+ title: 'ui/react-ui-form/ObjectTree',
75
+ component: ObjectTree,
76
+ decorators: [withTheme(), withLayout({ layout: 'column', scroll: true })],
77
+ parameters: {
78
+ layout: 'fullscreen',
79
+ translations,
80
+ },
81
+ } satisfies Meta<typeof ObjectTree>;
82
+
83
+ export default meta;
84
+
85
+ type Story = StoryObj<typeof meta>;
86
+
87
+ export const Default: Story = {
88
+ args: {
89
+ schema: ConfigSchema,
90
+ value: value,
91
+ },
92
+ };
93
+
94
+ export const JSON = () => (
95
+ <Syntax.Root data={value}>
96
+ <Syntax.Content>
97
+ <Syntax.Filter />
98
+ <Syntax.Viewport>
99
+ <Syntax.Code />
100
+ </Syntax.Viewport>
101
+ </Syntax.Content>
102
+ </Syntax.Root>
103
+ );
104
+
105
+ // Renders the same proto-derived `ConfigSchema` + `value` through the
106
+ // interactive `Form` component, for side-by-side comparison with the
107
+ // read-only ObjectTree above. `db` is intentionally omitted -- the proto
108
+ // schema is not an ECHO type, so there's no space/database in play.
109
+ export const WithForm = () => (
110
+ <Form.Root
111
+ schema={ConfigSchema as any}
112
+ defaultValues={value as any}
113
+ onSave={(next) => log.info('save', { next })}
114
+ onCancel={() => log.info('cancel')}
115
+ >
116
+ <Form.Viewport>
117
+ <Form.Content>
118
+ <Form.FieldSet />
119
+ <Form.Actions />
120
+ </Form.Content>
121
+ </Form.Viewport>
122
+ </Form.Root>
123
+ );
124
+
125
+ export const WithReadOnlyForm = () => (
126
+ <Form.Root schema={ConfigSchema as any} defaultValues={value as any} readonly={true}>
127
+ <Form.Viewport>
128
+ <Form.Content>
129
+ <Form.FieldSet />
130
+ <Form.Actions />
131
+ </Form.Content>
132
+ </Form.Viewport>
133
+ </Form.Root>
134
+ );
@@ -0,0 +1,190 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ // A minimal, read-only schema-driven viewer. Walks an Effect Schema and a
6
+ // matching value and produces a flat list of indented key/value rows -- one
7
+ // per leaf field, with nested Struct fields contributing a header row plus
8
+ // recursively-indented children, and arrays expanded as `[index]` rows.
9
+ //
10
+ // Designed to drive a hierarchical editor over schemas produced by
11
+ // `@dxos/effect-proto` (e.g. the proto-generated `dxos.config.Config`
12
+ // schema), but works for any Effect Struct schema.
13
+
14
+ import * as Schema from 'effect/Schema';
15
+ import * as SchemaAST from 'effect/SchemaAST';
16
+ import React, { type ReactElement, type ReactNode, type RefAttributes } from 'react';
17
+
18
+ import { composable, composableProps } from '@dxos/react-ui';
19
+ import { mx } from '@dxos/ui-theme';
20
+ import { type ComposableProps } from '@dxos/ui-types';
21
+
22
+ export type ObjectTreeProps<T> = {
23
+ schema: Schema.Schema<T, any, never>;
24
+ value: T;
25
+ };
26
+
27
+ /**
28
+ * Render a value as a sequence of key/value rows whose shape and order are
29
+ * driven by `schema`. Object-typed properties become a header row whose
30
+ * children are indented under it; arrays expand element-by-element.
31
+ *
32
+ * Composable: spreads unknown props (incl. `className` / `classNames` /
33
+ * `style` / `role`) onto its root `<div>` and forwards its ref, so it can
34
+ * be slotted into themed parents like `Panel.Content`.
35
+ */
36
+ const ObjectTreeImpl = composable<HTMLDivElement, ObjectTreeProps<any>>(({ schema, value, ...props }, forwardedRef) => (
37
+ <div {...composableProps(props, { role: 'table', classNames: 'font-mono text-sm w-full' })} ref={forwardedRef}>
38
+ <Node ast={schema.ast} value={value} label={null} depth={0} />
39
+ </div>
40
+ ));
41
+
42
+ ObjectTreeImpl.displayName = 'ObjectTree';
43
+
44
+ // `composable<HTMLDivElement, ObjectTreeProps<any>>` erases the `T` type
45
+ // parameter inside the factory; the cast restores the generic signature for
46
+ // consumers without changing the underlying component (the COMPOSABLE marker
47
+ // stays attached). This is the pattern documented on `composable()` itself.
48
+ export const ObjectTree = ObjectTreeImpl as unknown as <T>(
49
+ props: ComposableProps<ObjectTreeProps<T>> & RefAttributes<HTMLDivElement>,
50
+ ) => ReactElement | null;
51
+
52
+ /**
53
+ * Peel wrappers that don't affect the runtime shape: Refinements pass their
54
+ * `from`, Suspends resolve via `f()`, and Transformations expose the encoded
55
+ * (input) side. Repeated unwrapping handles chains like `Schema.suspend ->
56
+ * Refinement -> TypeLiteral`.
57
+ */
58
+ const unwrap = (ast: SchemaAST.AST): SchemaAST.AST => {
59
+ if (SchemaAST.isRefinement(ast)) {
60
+ return unwrap(ast.from);
61
+ }
62
+ if (SchemaAST.isSuspend(ast)) {
63
+ return unwrap(ast.f());
64
+ }
65
+ if (SchemaAST.isTransformation(ast)) {
66
+ return unwrap(ast.from);
67
+ }
68
+ return ast;
69
+ };
70
+
71
+ /**
72
+ * Effect models `Schema.optional(X)` as a property whose type AST is
73
+ * `Union(X, UndefinedKeyword)`. For walking purposes we want X -- the
74
+ * undefined branch carries no schema information for the viewer.
75
+ */
76
+ const stripOptional = (ast: SchemaAST.AST): SchemaAST.AST => {
77
+ if (!SchemaAST.isUnion(ast)) {
78
+ return ast;
79
+ }
80
+ const nonUndef = ast.types.filter((t) => !SchemaAST.isUndefinedKeyword(t));
81
+ return nonUndef.length === 1 ? nonUndef[0] : ast;
82
+ };
83
+
84
+ type NodeProps = {
85
+ ast: SchemaAST.AST;
86
+ value: unknown;
87
+ /** Row label; `null` means render children directly without a header row. */
88
+ label: ReactNode | null;
89
+ depth: number;
90
+ };
91
+
92
+ const Node = ({ ast, value, label, depth }: NodeProps) => {
93
+ const inner = unwrap(stripOptional(ast));
94
+
95
+ // Struct: header row + indented children. Skipping the header at depth 0
96
+ // keeps the root flush-left.
97
+ if (SchemaAST.isTypeLiteral(inner) && isPlainObject(value)) {
98
+ const childDepth = label === null ? depth : depth + 1;
99
+ return (
100
+ <>
101
+ {label !== null && <Row label={label} value={null} depth={depth} kind='group' />}
102
+ {inner.propertySignatures.map((prop) => (
103
+ <Node
104
+ key={String(prop.name)}
105
+ ast={prop.type}
106
+ value={(value as Record<string, unknown>)[String(prop.name)]}
107
+ label={String(prop.name)}
108
+ depth={childDepth}
109
+ />
110
+ ))}
111
+ </>
112
+ );
113
+ }
114
+
115
+ // Array (`Schema.Array(X)` -> TupleType with single rest element).
116
+ if (SchemaAST.isTupleType(inner) && Array.isArray(value)) {
117
+ const elemType = inner.rest[0]?.type;
118
+ return (
119
+ <>
120
+ {label !== null && <Row label={label} value={`Array(${value.length})`} depth={depth} kind='group' />}
121
+ {value.map((item, index) => (
122
+ <Node
123
+ key={index}
124
+ ast={elemType ?? SchemaAST.unknownKeyword}
125
+ value={item}
126
+ label={`[${index}]`}
127
+ depth={depth + 1}
128
+ />
129
+ ))}
130
+ </>
131
+ );
132
+ }
133
+
134
+ // Leaf (scalars, unions of literals, unknown, etc.).
135
+ return <Row label={label ?? ''} value={formatLeaf(value)} depth={depth} kind='leaf' />;
136
+ };
137
+
138
+ type RowProps = {
139
+ label: ReactNode;
140
+ value: ReactNode;
141
+ depth: number;
142
+ kind: 'group' | 'leaf';
143
+ };
144
+
145
+ const Row = ({ label, value, depth }: RowProps) => (
146
+ <div role='row' className={mx('flex items-baseline gap-3 py-1')} style={{ paddingInlineStart: 8 + depth * 16 }}>
147
+ <div role='cell' className='text-subdued'>
148
+ {label}
149
+ </div>
150
+ <div role='cell' className={mx('break-all text-base-fg')}>
151
+ {value}
152
+ </div>
153
+ </div>
154
+ );
155
+
156
+ const isPlainObject = (value: unknown): value is Record<string, unknown> =>
157
+ typeof value === 'object' && value !== null && !Array.isArray(value);
158
+
159
+ /**
160
+ * Format a leaf value for display. Strings are quoted so empty strings are
161
+ * visible; missing values surface as an em-dash so the row stays present.
162
+ */
163
+ const formatLeaf = (value: unknown): ReactNode => {
164
+ if (value === undefined) {
165
+ return null;
166
+ }
167
+
168
+ if (value === null) {
169
+ return <span className='text-description'>null</span>;
170
+ }
171
+
172
+ switch (typeof value) {
173
+ case 'string':
174
+ // Quote strings so empty strings remain visible (`""` rather than blank).
175
+ return <span className='text-blue-text'>{JSON.stringify(value)}</span>;
176
+ case 'number':
177
+ case 'bigint':
178
+ return <span className='text-green-text'>{String(value)}</span>;
179
+ case 'boolean':
180
+ return <span className='text-purple-text'>{String(value)}</span>;
181
+ default:
182
+ // Objects we couldn't expand via schema (e.g. `google.protobuf.Any` -> Unknown)
183
+ // are rendered as compact JSON.
184
+ try {
185
+ return JSON.stringify(value);
186
+ } catch {
187
+ return String(value);
188
+ }
189
+ }
190
+ };
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ export * from './ObjectTree';
@@ -0,0 +1,148 @@
1
+ //
2
+ // Copyright 2026 DXOS.org
3
+ //
4
+
5
+ import { type Meta, type StoryObj } from '@storybook/react-vite';
6
+ import React, { Fragment, useState } from 'react';
7
+
8
+ import { type Database, Filter, Obj } from '@dxos/echo';
9
+ import { random } from '@dxos/random';
10
+ import { useQuery } from '@dxos/react-client/echo';
11
+ import { useClientStory, withClientProvider } from '@dxos/react-client/testing';
12
+ import { JsonHighlighter } from '@dxos/react-ui-syntax-highlighter';
13
+ import { withLayout, withTheme } from '@dxos/react-ui/testing';
14
+ import { type ValueGenerator, createObjectFactory } from '@dxos/schema/testing';
15
+ import { Person } from '@dxos/types';
16
+
17
+ import { translations } from '#translations';
18
+
19
+ import { EMAIL_REGEX } from './ref-editor-extension';
20
+ import { RefEditor, type RefEditorProps } from './RefEditor';
21
+
22
+ const generator: ValueGenerator = random as any;
23
+
24
+ random.seed(7);
25
+
26
+ /**
27
+ * Generate Person objects into the space. The generator does not populate array fields, so derive
28
+ * email addresses from each person's name (every other person gets a second work alias so the
29
+ * email-mode picker shows multiple entries per person).
30
+ */
31
+ const generatePeople = async (db: Database.Database, count: number) => {
32
+ const people = await createObjectFactory(db, generator)([{ type: Person.Person, count }]);
33
+ people.forEach((person, index) => {
34
+ Obj.update(person, (person: Obj.Mutable<Person.Person>) => {
35
+ const slug = (person.fullName ?? 'user')
36
+ .toLowerCase()
37
+ .replace(/[^a-z0-9]+/g, '.')
38
+ .replace(/^\.+|\.+$/g, '');
39
+ person.emails = [
40
+ { value: `${slug}@example.com` },
41
+ ...(index % 2 === 0 ? [{ label: 'work', value: `${slug}@work.example.com` }] : []),
42
+ ...(index % 4 === 0 ? [{ label: 'private', value: `${random.lorem.word()}@gmail.com` }] : []),
43
+ ];
44
+ });
45
+ });
46
+ return people;
47
+ };
48
+
49
+ /** Person email addresses (the values a person can be captured as in email mode). */
50
+ const getPersonValues = (object: Obj.Unknown): readonly string[] =>
51
+ Obj.instanceOf(Person.Person, object) ? (object.emails ?? []).map(({ value }) => value) : [];
52
+
53
+ /**
54
+ * Dense reference grid of the generated people and their email addresses.
55
+ */
56
+ const PeopleGrid = ({ db }: { db?: Database.Database }) => {
57
+ const people = useQuery(db, Filter.type(Person.Person));
58
+ return (
59
+ <div className='grid grid-cols-[max-content_1fr] gap-x-4 text-sm text-description'>
60
+ {people.flatMap((person) =>
61
+ (person.emails ?? []).map(({ value }) => (
62
+ <Fragment key={`${person.id}-${value}`}>
63
+ <span className='truncate'>{person.fullName}</span>
64
+ <span className='truncate'>{value}</span>
65
+ </Fragment>
66
+ )),
67
+ )}
68
+ </div>
69
+ );
70
+ };
71
+
72
+ type StoryProps = Partial<Pick<RefEditorProps, 'value' | 'mode' | 'activateOnTyping' | 'autoFocus'>>;
73
+
74
+ // NOTE: The Person config (type/match/getValues) is supplied in render, not args — Storybook's
75
+ // arg traversal attempts to mutate the proxied ECHO schema and crashes.
76
+ const DefaultStory = ({ value: initialValue, ...args }: StoryProps) => {
77
+ const { space } = useClientStory();
78
+ const [value, setValue] = useState(initialValue ?? '');
79
+
80
+ return (
81
+ <div className='flex flex-col gap-2'>
82
+ <RefEditor
83
+ {...args}
84
+ value={initialValue}
85
+ type={Person.Person}
86
+ match={EMAIL_REGEX}
87
+ getValues={getPersonValues}
88
+ icon='ph--user--regular'
89
+ db={space?.db}
90
+ onChange={setValue}
91
+ classNames='border'
92
+ />
93
+ <JsonHighlighter data={{ value }} classNames='text-xs' />
94
+ <PeopleGrid db={space?.db} />
95
+ </div>
96
+ );
97
+ };
98
+
99
+ const meta = {
100
+ title: 'ui/react-ui-form/RefEditor',
101
+ render: DefaultStory,
102
+ decorators: [
103
+ withTheme(),
104
+ withLayout({ layout: 'column', classNames: 'p-2', scroll: true }),
105
+ withClientProvider({
106
+ types: [Person.Person],
107
+ createIdentity: true,
108
+ createSpace: true,
109
+ onCreateSpace: async ({ space }) => {
110
+ await generatePeople(space.db, 8);
111
+ },
112
+ }),
113
+ ],
114
+ parameters: {
115
+ translations,
116
+ },
117
+ } satisfies Meta<typeof DefaultStory>;
118
+
119
+ export default meta;
120
+
121
+ type Story = StoryObj<typeof meta>;
122
+
123
+ export const Default: Story = {
124
+ args: {
125
+ autoFocus: true,
126
+ },
127
+ };
128
+
129
+ export const ActivateOnTyping: Story = {
130
+ args: {
131
+ autoFocus: true,
132
+ activateOnTyping: true,
133
+ },
134
+ };
135
+
136
+ export const EmailMode: Story = {
137
+ args: {
138
+ autoFocus: true,
139
+ mode: 'email',
140
+ activateOnTyping: true,
141
+ },
142
+ };
143
+
144
+ export const WithEmail: Story = {
145
+ args: {
146
+ value: 'someone@example.com ',
147
+ },
148
+ };