@digigov/form 2.0.0-rc.7 → 2.0.2

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 (819) hide show
  1. package/CHANGELOG.md +113 -3
  2. package/Field/ErrorGroup.d.ts +15 -0
  3. package/Field/ErrorGroup.js +53 -0
  4. package/Field/FieldBase.d.ts +1 -1
  5. package/Field/FieldBase.js +77 -0
  6. package/Field/FieldBaseContainer.d.ts +2 -2
  7. package/Field/FieldBaseContainer.js +43 -0
  8. package/Field/FieldConditional.d.ts +1 -1
  9. package/Field/FieldConditional.js +45 -0
  10. package/Field/index.d.ts +1 -1
  11. package/Field/index.js +70 -68
  12. package/Field/types.d.ts +61 -11
  13. package/Field/utils/evaluateFieldWithConditions.d.ts +2 -0
  14. package/Field/utils/evaluateFieldWithConditions.js +19 -0
  15. package/Field/utils/resolveField.d.ts +3 -0
  16. package/Field/utils/resolveField.js +32 -0
  17. package/Field/utils/useField.d.ts +2 -0
  18. package/Field/utils/useField.js +47 -0
  19. package/FieldArray/BaseFieldArray.d.ts +5 -0
  20. package/FieldArray/BaseFieldArray.js +46 -0
  21. package/FieldArray/FormDialog/ArrayDisplay/ArrayContainerDisplay.d.ts +9 -0
  22. package/FieldArray/FormDialog/ArrayDisplay/ArrayContainerDisplay.js +13 -0
  23. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.d.ts +26 -0
  24. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.js +134 -0
  25. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.d.ts +5 -0
  26. package/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.js +6 -0
  27. package/FieldArray/FormDialog/ArrayDisplay/index.d.ts +15 -0
  28. package/FieldArray/FormDialog/ArrayDisplay/index.js +32 -0
  29. package/FieldArray/FormDialog/ArrayEditModal.d.ts +24 -0
  30. package/FieldArray/FormDialog/ArrayEditModal.js +138 -0
  31. package/FieldArray/FormDialog/index.d.ts +19 -0
  32. package/FieldArray/FormDialog/index.js +199 -0
  33. package/FieldArray/index.d.ts +11 -2
  34. package/FieldArray/index.js +65 -60
  35. package/FieldObject/index.d.ts +11 -3
  36. package/FieldObject/index.js +53 -52
  37. package/Fieldset/FieldsetWithContext.js +27 -0
  38. package/Fieldset/index.d.ts +2 -2
  39. package/Fieldset/index.js +18 -32
  40. package/Fieldset/types.d.ts +3 -2
  41. package/FormBuilder/index.d.ts +8 -1
  42. package/FormBuilder/index.js +239 -2
  43. package/FormContext.d.ts +3 -2
  44. package/FormContext.js +7 -0
  45. package/MultiplicityField/add-objects.d.ts +3 -2
  46. package/MultiplicityField/add-objects.js +107 -0
  47. package/MultiplicityField/index.d.ts +2 -19
  48. package/MultiplicityField/index.js +84 -111
  49. package/MultiplicityField/types.d.ts +19 -0
  50. package/Questions/Questions.d.ts +1 -1
  51. package/Questions/Questions.js +48 -0
  52. package/Questions/QuestionsContext.d.ts +1 -2
  53. package/Questions/QuestionsContext.js +10 -0
  54. package/Questions/Step/ReviewStep.js +32 -0
  55. package/Questions/Step/Step.d.ts +1 -1
  56. package/Questions/Step/Step.js +39 -0
  57. package/Questions/Step/StepArrayReview.d.ts +1 -1
  58. package/Questions/Step/StepArrayReview.js +35 -0
  59. package/Questions/Step/StepContext.d.ts +1 -2
  60. package/Questions/Step/StepContext.js +28 -0
  61. package/Questions/Step/StepDescription.d.ts +1 -1
  62. package/Questions/Step/StepDescription.js +18 -0
  63. package/Questions/Step/StepForm.d.ts +2 -2
  64. package/Questions/Step/StepForm.js +29 -0
  65. package/Questions/Step/StepQuote.d.ts +1 -1
  66. package/Questions/Step/StepQuote.js +5 -0
  67. package/Questions/Step/StepTitle.d.ts +2 -1
  68. package/Questions/Step/StepTitle.js +25 -0
  69. package/Questions/Step/getAddMoreFields.d.ts +2 -2
  70. package/Questions/Step/getAddMoreFields.js +24 -0
  71. package/Questions/Step/index.d.ts +11 -12
  72. package/Questions/Step/index.js +13 -13
  73. package/Questions/Step/types.d.ts +2 -1
  74. package/Questions/Step/types.js +0 -0
  75. package/Questions/getNextStep.d.ts +1 -1
  76. package/Questions/getNextStep.js +13 -0
  77. package/Questions/index.d.ts +2 -2
  78. package/Questions/index.js +4 -3
  79. package/Questions/types.d.ts +2 -1
  80. package/Questions/types.js +0 -0
  81. package/hooks/useFieldFocusManager.d.ts +25 -0
  82. package/hooks/useFieldFocusManager.js +83 -0
  83. package/hooks/utils.d.ts +18 -0
  84. package/hooks/utils.js +60 -0
  85. package/index.d.ts +5 -2
  86. package/index.js +8 -4
  87. package/inputs/AutoCompleteInput/index.d.ts +5 -5
  88. package/inputs/AutoCompleteInput/index.js +42 -44
  89. package/inputs/Checkboxes/index.d.ts +7 -4
  90. package/inputs/Checkboxes/index.js +50 -91
  91. package/inputs/DateInput/index.d.ts +3 -7
  92. package/inputs/DateInput/index.js +128 -125
  93. package/inputs/DateTimeInput/index.d.ts +10 -0
  94. package/inputs/DateTimeInput/index.js +190 -0
  95. package/inputs/FileInput/index.d.ts +18 -2
  96. package/inputs/FileInput/index.js +59 -56
  97. package/inputs/ImageInput/index.d.ts +10 -2
  98. package/inputs/ImageInput/index.js +94 -74
  99. package/inputs/Input/index.d.ts +5 -2
  100. package/inputs/Input/index.js +67 -67
  101. package/inputs/Label/index.d.ts +2 -4
  102. package/inputs/Label/index.js +13 -21
  103. package/inputs/OtpInput/index.d.ts +1 -5
  104. package/inputs/OtpInput/index.js +122 -139
  105. package/inputs/Radio/index.d.ts +10 -3
  106. package/inputs/Radio/index.js +72 -56
  107. package/inputs/Select/index.d.ts +7 -4
  108. package/inputs/Select/index.js +23 -30
  109. package/inputs/index.d.ts +9 -9
  110. package/inputs/index.js +10 -9
  111. package/inputs/registry.d.ts +5 -0
  112. package/inputs/registry.js +80 -0
  113. package/internal.d.ts +5 -34
  114. package/internal.js +6 -0
  115. package/lazy.d.ts +93 -65
  116. package/lazy.js +163 -0
  117. package/package.json +12 -13
  118. package/registry.d.ts +45 -27
  119. package/registry.js +170 -0
  120. package/src/Field/ErrorGroup.tsx +84 -0
  121. package/src/Field/FieldBase.tsx +43 -25
  122. package/src/Field/FieldBaseContainer.tsx +71 -47
  123. package/src/Field/FieldConditional.tsx +10 -2
  124. package/src/Field/doc.mdx +207 -0
  125. package/src/Field/index.tsx +37 -23
  126. package/src/Field/types.tsx +92 -13
  127. package/src/Field/utils/evaluateFieldWithConditions.ts +33 -0
  128. package/src/Field/utils/resolveField.ts +58 -0
  129. package/src/Field/utils/useField.ts +68 -0
  130. package/src/FieldArray/BaseFieldArray.tsx +97 -0
  131. package/src/FieldArray/FieldArray.stories.js +4 -2
  132. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayContainerDisplay.tsx +45 -0
  133. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayDisplay.stories.js +14 -0
  134. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemDisplay.tsx +370 -0
  135. package/src/FieldArray/FormDialog/ArrayDisplay/ArrayItemHeader.tsx +15 -0
  136. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Cards.tsx +88 -0
  137. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Default.tsx +93 -0
  138. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnly.tsx +79 -0
  139. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/ReadOnlyCards.tsx +75 -0
  140. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/Sortable.tsx +93 -0
  141. package/src/FieldArray/FormDialog/ArrayDisplay/__stories__/SortableCards.tsx +88 -0
  142. package/src/FieldArray/FormDialog/ArrayDisplay/index.test.tsx +44 -0
  143. package/src/FieldArray/FormDialog/ArrayDisplay/index.tsx +67 -0
  144. package/src/FieldArray/FormDialog/ArrayEditModal.tsx +241 -0
  145. package/src/FieldArray/FormDialog/index.tsx +302 -0
  146. package/src/FieldArray/__stories__/CardsWithError.tsx +110 -0
  147. package/src/FieldArray/__stories__/Default.tsx +2 -1
  148. package/src/FieldArray/__stories__/TableWithError.tsx +111 -0
  149. package/src/FieldArray/__stories__/WithExactLength.tsx +2 -1
  150. package/src/FieldArray/__stories__/WithModal.tsx +188 -0
  151. package/src/FieldArray/__tests__/fieldset-multiplicity.spec.tsx +271 -0
  152. package/src/FieldArray/__tests__/multiplicity-attachment.spec.tsx +280 -0
  153. package/src/FieldArray/__tests__/multiplicity-optional.spec.tsx +232 -0
  154. package/src/FieldArray/__tests__/multiplicity-required.spec.tsx +170 -0
  155. package/src/FieldArray/__tests__/nested-fieldset-multiplicity.spec.tsx +627 -0
  156. package/src/FieldArray/__tests__/preference-multiple-choice.spec.tsx +222 -0
  157. package/src/FieldArray/index.spec.tsx +355 -0
  158. package/src/FieldArray/index.test.tsx +43 -0
  159. package/src/FieldArray/index.tsx +84 -55
  160. package/src/FieldObject/index.tsx +53 -27
  161. package/src/Fieldset/FieldsetWithContext.tsx +1 -1
  162. package/src/Fieldset/index.tsx +6 -6
  163. package/src/Fieldset/types.tsx +5 -3
  164. package/src/FormBuilder/FormBuilder.stories.js +6 -1
  165. package/src/FormBuilder/__stories__/AutoErrorGrouping.tsx +63 -0
  166. package/src/FormBuilder/__stories__/Default.tsx +1 -1
  167. package/src/FormBuilder/__stories__/ErrorGrouping.tsx +43 -0
  168. package/src/FormBuilder/{FormBuilder.mdx → doc.mdx} +27 -35
  169. package/src/FormBuilder/index.test.tsx +32 -0
  170. package/src/FormBuilder/index.tsx +314 -1
  171. package/src/FormBuilder/interaction.test.tsx +40 -0
  172. package/src/FormBuilder/scenarios.test.tsx +2775 -0
  173. package/src/FormContext.tsx +7 -3
  174. package/src/MultiplicityField/MultiplicityField.stories.js +9 -6
  175. package/src/MultiplicityField/__stories__/Default.tsx +1 -1
  176. package/src/MultiplicityField/__stories__/PreviewDisplay.tsx +4 -6
  177. package/src/MultiplicityField/__stories__/WithExactLength.tsx +2 -2
  178. package/src/MultiplicityField/__stories__/WithMaxLength.tsx +2 -2
  179. package/src/MultiplicityField/__stories__/WithMinAndMaxLength.tsx +2 -2
  180. package/src/MultiplicityField/__stories__/WithMinLength.tsx +2 -2
  181. package/src/MultiplicityField/add-objects.tsx +39 -30
  182. package/{cjs/MultiplicityField/MultiplicityField.mdx → src/MultiplicityField/doc.mdx} +112 -98
  183. package/src/MultiplicityField/index.test.tsx +44 -0
  184. package/src/MultiplicityField/index.tsx +25 -34
  185. package/src/MultiplicityField/types.ts +25 -0
  186. package/src/Questions/Questions.stories.js +4 -1
  187. package/src/Questions/Questions.tsx +6 -6
  188. package/src/Questions/QuestionsContext.tsx +1 -1
  189. package/src/Questions/Step/Step.tsx +1 -1
  190. package/src/Questions/Step/StepArrayReview.tsx +3 -3
  191. package/src/Questions/Step/StepContext.tsx +1 -1
  192. package/src/Questions/Step/StepDescription.tsx +2 -1
  193. package/src/Questions/Step/StepForm.tsx +2 -2
  194. package/src/Questions/Step/StepQuote.tsx +2 -1
  195. package/src/Questions/Step/StepTitle.tsx +6 -3
  196. package/src/Questions/Step/getAddMoreFields.tsx +2 -2
  197. package/src/Questions/Step/index.ts +0 -1
  198. package/src/Questions/Step/types.tsx +2 -1
  199. package/src/Questions/__snapshots__/index.spec.tsx.snap +74 -587
  200. package/src/Questions/__stories__/Default.tsx +1 -1
  201. package/{Questions/index.mdx → src/Questions/doc.mdx} +34 -57
  202. package/src/Questions/getNextStep.tsx +1 -1
  203. package/src/Questions/index.spec.tsx +17 -5
  204. package/src/Questions/index.test.tsx +24 -0
  205. package/src/Questions/types.tsx +2 -1
  206. package/src/create-simple-form.mdx +2 -6
  207. package/src/{index.mdx → doc.mdx} +29 -18
  208. package/src/hooks/__tests__/useFieldFocusManager.spec.tsx +1079 -0
  209. package/src/hooks/__tests__/utils.spec.ts +568 -0
  210. package/src/hooks/useFieldFocusManager.ts +162 -0
  211. package/src/hooks/utils.ts +122 -0
  212. package/src/index.ts +4 -1
  213. package/src/inputs/AutoCompleteInput/AutoComplete.stories.js +5 -2
  214. package/src/inputs/AutoCompleteInput/__stories__/Default.tsx +3 -11
  215. package/src/inputs/AutoCompleteInput/__stories__/Multiple.tsx +3 -10
  216. package/{cjs/inputs/AutoCompleteInput/index.mdx → src/inputs/AutoCompleteInput/doc.mdx} +2 -13
  217. package/src/inputs/AutoCompleteInput/index.test.tsx +28 -0
  218. package/src/inputs/AutoCompleteInput/index.tsx +49 -35
  219. package/src/inputs/Checkboxes/Checkboxes.stories.js +6 -3
  220. package/src/inputs/Checkboxes/__stories__/Conditional.tsx +1 -1
  221. package/src/inputs/Checkboxes/__stories__/Default.tsx +1 -1
  222. package/src/inputs/Checkboxes/__stories__/WithDivider.tsx +1 -1
  223. package/src/inputs/Checkboxes/{index.mdx → doc.mdx} +5 -15
  224. package/src/inputs/Checkboxes/index.test.tsx +32 -0
  225. package/src/inputs/Checkboxes/index.tsx +106 -92
  226. package/src/inputs/DateInput/DateInput.stories.js +8 -1
  227. package/src/inputs/DateInput/__stories__/Default.tsx +17 -16
  228. package/src/inputs/DateInput/__stories__/WithDefaultValue.tsx +26 -0
  229. package/src/inputs/DateInput/__stories__/WithInitialValue.tsx +28 -0
  230. package/src/inputs/DateInput/__stories__/WithWrongDefaultValue.tsx +26 -0
  231. package/src/inputs/DateInput/__stories__/WithWrongInitialValue.tsx +28 -0
  232. package/src/inputs/DateInput/{index.mdx → doc.mdx} +1 -8
  233. package/src/inputs/DateInput/index.test.tsx +40 -0
  234. package/src/inputs/DateInput/index.tsx +77 -27
  235. package/src/inputs/DateTimeInput/DateTimeInput.stories.js +14 -0
  236. package/src/inputs/DateTimeInput/__stories__/Default.tsx +25 -0
  237. package/src/inputs/DateTimeInput/__stories__/WithDefaultValue.tsx +26 -0
  238. package/src/inputs/DateTimeInput/__stories__/WithInitialValue.tsx +28 -0
  239. package/src/inputs/DateTimeInput/__stories__/WithWrongDefaultValue.tsx +26 -0
  240. package/src/inputs/DateTimeInput/__stories__/WithWrongInitialValue.tsx +28 -0
  241. package/src/inputs/DateTimeInput/doc.mdx +16 -0
  242. package/src/inputs/DateTimeInput/index.test.tsx +40 -0
  243. package/src/inputs/DateTimeInput/index.tsx +246 -0
  244. package/src/inputs/FileInput/FileInput.stories.js +5 -1
  245. package/src/inputs/FileInput/__stories__/Default.tsx +1 -1
  246. package/src/inputs/FileInput/__stories__/WithBorderAndLink.tsx +34 -0
  247. package/{inputs/FileInput/index.mdx → src/inputs/FileInput/doc.mdx} +1 -5
  248. package/src/inputs/FileInput/index.test.tsx +28 -0
  249. package/src/inputs/FileInput/index.tsx +102 -43
  250. package/src/inputs/ImageInput/ImageInput.stories.js +7 -3
  251. package/src/inputs/ImageInput/__stories__/Default.tsx +1 -1
  252. package/src/inputs/ImageInput/__stories__/{WithInvalidImageSize.tsx → MaxSize.tsx} +5 -3
  253. package/src/inputs/ImageInput/__stories__/WithInitialValues.tsx +45 -0
  254. package/src/inputs/ImageInput/__stories__/WithInvalidImageDimension.tsx +3 -1
  255. package/src/inputs/ImageInput/__stories__/logo.d.ts +4 -0
  256. package/src/inputs/ImageInput/__stories__/logo.png +0 -0
  257. package/src/inputs/ImageInput/doc.mdx +23 -0
  258. package/src/inputs/ImageInput/index.test.tsx +36 -0
  259. package/src/inputs/ImageInput/index.tsx +105 -52
  260. package/src/inputs/Input/Input.stories.js +17 -10
  261. package/src/inputs/Input/__stories__/AFM.tsx +1 -1
  262. package/src/inputs/Input/__stories__/AMKA.tsx +23 -0
  263. package/src/inputs/Input/__stories__/Boolean.tsx +1 -1
  264. package/src/inputs/Input/__stories__/Email.tsx +23 -0
  265. package/src/inputs/Input/__stories__/IBAN.tsx +1 -1
  266. package/src/inputs/Input/__stories__/Integer.tsx +1 -1
  267. package/src/inputs/Input/__stories__/LandlineNumber.tsx +3 -2
  268. package/src/inputs/Input/__stories__/MobilePhone.tsx +2 -1
  269. package/src/inputs/Input/__stories__/PhoneNumber.tsx +2 -1
  270. package/src/inputs/Input/__stories__/PostalCode.tsx +2 -1
  271. package/src/inputs/Input/__stories__/Rate.tsx +25 -0
  272. package/src/inputs/Input/__stories__/{Default.tsx → String.tsx} +2 -2
  273. package/src/inputs/Input/__stories__/StringWithTrimValidation.tsx +26 -0
  274. package/src/inputs/Input/__stories__/{TextWithCharacterLimit.tsx → TextWithLimit.tsx} +3 -2
  275. package/src/inputs/Input/doc.mdx +56 -0
  276. package/src/inputs/Input/index.test.tsx +76 -0
  277. package/src/inputs/Input/index.tsx +55 -35
  278. package/src/inputs/Label/Label.stories.js +4 -1
  279. package/src/inputs/Label/__stories__/Default.tsx +4 -2
  280. package/src/inputs/Label/doc.mdx +14 -0
  281. package/src/inputs/Label/index.test.tsx +24 -0
  282. package/src/inputs/Label/index.tsx +4 -11
  283. package/src/inputs/OtpInput/OtpInput.stories.js +4 -1
  284. package/src/inputs/OtpInput/__stories__/Default.tsx +1 -1
  285. package/{cjs/inputs/OtpInput/index.mdx → src/inputs/OtpInput/doc.mdx} +1 -8
  286. package/src/inputs/OtpInput/index.test.tsx +24 -0
  287. package/src/inputs/OtpInput/index.tsx +45 -34
  288. package/src/inputs/Radio/Radio.stories.js +6 -3
  289. package/src/inputs/Radio/__stories__/Conditional.tsx +3 -2
  290. package/src/inputs/Radio/__stories__/Default.tsx +1 -1
  291. package/src/inputs/Radio/__stories__/WithDivider.tsx +1 -1
  292. package/{cjs/inputs/Radio/index.mdx → src/inputs/Radio/doc.mdx} +5 -15
  293. package/src/inputs/Radio/index.test.tsx +32 -0
  294. package/src/inputs/Radio/index.tsx +93 -12
  295. package/src/inputs/Select/Select.stories.js +4 -1
  296. package/src/inputs/Select/__stories__/Default.tsx +1 -1
  297. package/src/inputs/Select/{index.mdx → doc.mdx} +1 -5
  298. package/src/inputs/Select/index.test.tsx +24 -0
  299. package/src/inputs/Select/index.tsx +22 -9
  300. package/src/inputs/registry.ts +86 -0
  301. package/src/installation.mdx +2 -5
  302. package/src/internal.ts +2 -31
  303. package/src/lazy.ts +56 -0
  304. package/src/registry.ts +179 -0
  305. package/src/types.tsx +21 -65
  306. package/src/utils.ts +67 -33
  307. package/src/validators/index.ts +138 -99
  308. package/src/validators/types.ts +1 -1
  309. package/src/validators/utils/amka.ts +39 -0
  310. package/src/validators/utils/date.ts +131 -0
  311. package/src/validators/utils/datetime.ts +222 -0
  312. package/src/validators/utils/email.ts +11 -0
  313. package/src/validators/utils/file.ts +35 -19
  314. package/src/validators/utils/iban.ts +2 -2
  315. package/src/validators/utils/image.ts +2 -2
  316. package/src/validators/utils/index.ts +15 -6
  317. package/src/validators/utils/int.ts +2 -2
  318. package/src/validators/utils/number.ts +2 -2
  319. package/src/validators/utils/otp.ts +2 -2
  320. package/src/validators/utils/phone.ts +65 -74
  321. package/src/validators/utils/postal_code.ts +3 -3
  322. package/src/validators/utils/text_limit.ts +2 -2
  323. package/src/validators/utils/uuid4.ts +2 -1
  324. package/src/validators/validators.spec.ts +6 -40
  325. package/types.d.ts +14 -37
  326. package/types.js +1 -0
  327. package/utils.d.ts +4 -1
  328. package/utils.js +56 -0
  329. package/validators/index.d.ts +6 -6
  330. package/validators/index.js +115 -180
  331. package/validators/types.d.ts +1 -1
  332. package/validators/types.js +0 -0
  333. package/validators/utils/afm.js +19 -0
  334. package/validators/utils/amka.d.ts +6 -0
  335. package/validators/utils/amka.js +27 -0
  336. package/validators/utils/date.d.ts +9 -0
  337. package/validators/utils/date.js +95 -0
  338. package/validators/utils/datetime.d.ts +9 -0
  339. package/validators/utils/datetime.js +121 -0
  340. package/validators/utils/email.d.ts +5 -0
  341. package/validators/utils/email.js +10 -0
  342. package/validators/utils/file.d.ts +2 -2
  343. package/validators/utils/file.js +31 -0
  344. package/validators/utils/iban.d.ts +2 -2
  345. package/validators/utils/iban.js +104 -0
  346. package/validators/utils/image.d.ts +2 -2
  347. package/validators/utils/image.js +65 -0
  348. package/validators/utils/index.d.ts +14 -11
  349. package/validators/utils/index.js +62 -85
  350. package/validators/utils/int.d.ts +1 -1
  351. package/validators/utils/int.js +13 -0
  352. package/validators/utils/number.d.ts +1 -1
  353. package/validators/utils/number.js +12 -0
  354. package/validators/utils/otp.d.ts +2 -2
  355. package/validators/utils/otp.js +21 -0
  356. package/validators/utils/phone.d.ts +3 -3
  357. package/validators/utils/phone.js +198 -0
  358. package/validators/utils/postal_code.d.ts +3 -3
  359. package/validators/utils/postal_code.js +18 -0
  360. package/validators/utils/text_limit.d.ts +2 -2
  361. package/validators/utils/text_limit.js +34 -0
  362. package/validators/utils/uuid4.js +14 -0
  363. package/Field/FieldBase/index.js +0 -82
  364. package/Field/FieldBase/package.json +0 -6
  365. package/Field/FieldBaseContainer/index.js +0 -40
  366. package/Field/FieldBaseContainer/package.json +0 -6
  367. package/Field/FieldConditional/index.js +0 -59
  368. package/Field/FieldConditional/package.json +0 -6
  369. package/Field/index.mdx +0 -6
  370. package/Field/package.json +0 -6
  371. package/Field/types/index.js +0 -1
  372. package/Field/types/package.json +0 -6
  373. package/Field/utils/index.js +0 -153
  374. package/Field/utils/package.json +0 -6
  375. package/Field/utils.d.ts +0 -5
  376. package/FieldArray/FieldArray.stories/index.js +0 -8
  377. package/FieldArray/FieldArray.stories/package.json +0 -6
  378. package/FieldArray/FieldArray.stories.d.ts +0 -9
  379. package/FieldArray/FieldArray.stories.playwright.json +0 -353
  380. package/FieldArray/__stories__/Default/index.js +0 -88
  381. package/FieldArray/__stories__/Default/package.json +0 -6
  382. package/FieldArray/__stories__/Default.d.ts +0 -2
  383. package/FieldArray/__stories__/WithExactLength/index.js +0 -88
  384. package/FieldArray/__stories__/WithExactLength/package.json +0 -6
  385. package/FieldArray/__stories__/WithExactLength.d.ts +0 -2
  386. package/FieldArray/package.json +0 -6
  387. package/FieldObject/package.json +0 -6
  388. package/Fieldset/FieldsetWithContext/index.js +0 -35
  389. package/Fieldset/FieldsetWithContext/package.json +0 -6
  390. package/Fieldset/package.json +0 -6
  391. package/Fieldset/types/index.js +0 -1
  392. package/Fieldset/types/package.json +0 -6
  393. package/Form.stories/index.js +0 -3
  394. package/Form.stories/package.json +0 -6
  395. package/Form.stories.d.ts +0 -4
  396. package/FormBuilder/FormBuilder/index.js +0 -152
  397. package/FormBuilder/FormBuilder/package.json +0 -6
  398. package/FormBuilder/FormBuilder.d.ts +0 -5
  399. package/FormBuilder/FormBuilder.mdx +0 -256
  400. package/FormBuilder/FormBuilder.stories/index.js +0 -7
  401. package/FormBuilder/FormBuilder.stories/package.json +0 -6
  402. package/FormBuilder/FormBuilder.stories.d.ts +0 -8
  403. package/FormBuilder/FormBuilder.stories.playwright.json +0 -52
  404. package/FormBuilder/__stories__/Default/index.js +0 -26
  405. package/FormBuilder/__stories__/Default/package.json +0 -6
  406. package/FormBuilder/__stories__/Default.d.ts +0 -3
  407. package/FormBuilder/package.json +0 -6
  408. package/FormContext/index.js +0 -5
  409. package/FormContext/package.json +0 -6
  410. package/MultiplicityField/MultiplicityField.mdx +0 -590
  411. package/MultiplicityField/MultiplicityField.stories/index.js +0 -12
  412. package/MultiplicityField/MultiplicityField.stories/package.json +0 -6
  413. package/MultiplicityField/MultiplicityField.stories.d.ts +0 -13
  414. package/MultiplicityField/MultiplicityField.stories.playwright.json +0 -1370
  415. package/MultiplicityField/__stories__/Default/index.js +0 -95
  416. package/MultiplicityField/__stories__/Default/package.json +0 -6
  417. package/MultiplicityField/__stories__/Default.d.ts +0 -2
  418. package/MultiplicityField/__stories__/PreviewDisplay/index.js +0 -72
  419. package/MultiplicityField/__stories__/PreviewDisplay/package.json +0 -6
  420. package/MultiplicityField/__stories__/PreviewDisplay.d.ts +0 -2
  421. package/MultiplicityField/__stories__/WithExactLength/index.js +0 -90
  422. package/MultiplicityField/__stories__/WithExactLength/package.json +0 -6
  423. package/MultiplicityField/__stories__/WithExactLength.d.ts +0 -2
  424. package/MultiplicityField/__stories__/WithMaxLength/index.js +0 -93
  425. package/MultiplicityField/__stories__/WithMaxLength/package.json +0 -6
  426. package/MultiplicityField/__stories__/WithMaxLength.d.ts +0 -2
  427. package/MultiplicityField/__stories__/WithMinAndMaxLength/index.js +0 -94
  428. package/MultiplicityField/__stories__/WithMinAndMaxLength/package.json +0 -6
  429. package/MultiplicityField/__stories__/WithMinAndMaxLength.d.ts +0 -2
  430. package/MultiplicityField/__stories__/WithMinLength/index.js +0 -93
  431. package/MultiplicityField/__stories__/WithMinLength/package.json +0 -6
  432. package/MultiplicityField/__stories__/WithMinLength.d.ts +0 -2
  433. package/MultiplicityField/add-objects/index.js +0 -148
  434. package/MultiplicityField/add-objects/package.json +0 -6
  435. package/MultiplicityField/package.json +0 -6
  436. package/Questions/Questions/index.js +0 -75
  437. package/Questions/Questions/package.json +0 -6
  438. package/Questions/Questions.stories/index.js +0 -7
  439. package/Questions/Questions.stories/package.json +0 -6
  440. package/Questions/Questions.stories.d.ts +0 -8
  441. package/Questions/QuestionsContext/index.js +0 -11
  442. package/Questions/QuestionsContext/package.json +0 -6
  443. package/Questions/Step/ReviewStep/index.js +0 -50
  444. package/Questions/Step/ReviewStep/package.json +0 -6
  445. package/Questions/Step/Step/index.js +0 -62
  446. package/Questions/Step/Step/package.json +0 -6
  447. package/Questions/Step/StepArrayReview/index.js +0 -46
  448. package/Questions/Step/StepArrayReview/package.json +0 -6
  449. package/Questions/Step/StepContext/index.js +0 -27
  450. package/Questions/Step/StepContext/package.json +0 -6
  451. package/Questions/Step/StepDescription/index.js +0 -24
  452. package/Questions/Step/StepDescription/package.json +0 -6
  453. package/Questions/Step/StepForm/index.js +0 -44
  454. package/Questions/Step/StepForm/package.json +0 -6
  455. package/Questions/Step/StepQuote/index.js +0 -10
  456. package/Questions/Step/StepQuote/package.json +0 -6
  457. package/Questions/Step/StepTitle/index.js +0 -41
  458. package/Questions/Step/StepTitle/package.json +0 -6
  459. package/Questions/Step/getAddMoreFields/index.js +0 -21
  460. package/Questions/Step/getAddMoreFields/package.json +0 -6
  461. package/Questions/Step/package.json +0 -6
  462. package/Questions/Step/types/index.js +0 -1
  463. package/Questions/Step/types/package.json +0 -6
  464. package/Questions/__snapshots__/index.spec.tsx.snap +0 -596
  465. package/Questions/__stories__/Default/index.js +0 -102
  466. package/Questions/__stories__/Default/package.json +0 -6
  467. package/Questions/__stories__/Default.d.ts +0 -3
  468. package/Questions/getNextStep/index.js +0 -20
  469. package/Questions/getNextStep/package.json +0 -6
  470. package/Questions/index.spec/index.js +0 -59
  471. package/Questions/index.spec/package.json +0 -6
  472. package/Questions/index.spec.d.ts +0 -1
  473. package/Questions/package.json +0 -6
  474. package/Questions/types/index.js +0 -1
  475. package/Questions/types/package.json +0 -6
  476. package/cjs/Field/FieldBase/index.js +0 -89
  477. package/cjs/Field/FieldBaseContainer/index.js +0 -47
  478. package/cjs/Field/FieldConditional/index.js +0 -66
  479. package/cjs/Field/index.js +0 -80
  480. package/cjs/Field/index.mdx +0 -6
  481. package/cjs/Field/types/index.js +0 -5
  482. package/cjs/Field/utils/index.js +0 -162
  483. package/cjs/FieldArray/FieldArray.stories/index.js +0 -38
  484. package/cjs/FieldArray/FieldArray.stories.playwright.json +0 -353
  485. package/cjs/FieldArray/__stories__/Default/index.js +0 -98
  486. package/cjs/FieldArray/__stories__/WithExactLength/index.js +0 -98
  487. package/cjs/FieldArray/index.js +0 -68
  488. package/cjs/FieldObject/index.js +0 -64
  489. package/cjs/Fieldset/FieldsetWithContext/index.js +0 -45
  490. package/cjs/Fieldset/index.js +0 -44
  491. package/cjs/Fieldset/types/index.js +0 -5
  492. package/cjs/Form.stories/index.js +0 -9
  493. package/cjs/FormBuilder/FormBuilder/index.js +0 -162
  494. package/cjs/FormBuilder/FormBuilder.mdx +0 -256
  495. package/cjs/FormBuilder/FormBuilder.stories/index.js +0 -26
  496. package/cjs/FormBuilder/FormBuilder.stories.playwright.json +0 -52
  497. package/cjs/FormBuilder/__stories__/Default/index.js +0 -36
  498. package/cjs/FormBuilder/index.js +0 -8
  499. package/cjs/FormContext/index.js +0 -11
  500. package/cjs/MultiplicityField/MultiplicityField.stories/index.js +0 -86
  501. package/cjs/MultiplicityField/MultiplicityField.stories.playwright.json +0 -1370
  502. package/cjs/MultiplicityField/__stories__/Default/index.js +0 -105
  503. package/cjs/MultiplicityField/__stories__/PreviewDisplay/index.js +0 -82
  504. package/cjs/MultiplicityField/__stories__/WithExactLength/index.js +0 -100
  505. package/cjs/MultiplicityField/__stories__/WithMaxLength/index.js +0 -103
  506. package/cjs/MultiplicityField/__stories__/WithMinAndMaxLength/index.js +0 -104
  507. package/cjs/MultiplicityField/__stories__/WithMinLength/index.js +0 -103
  508. package/cjs/MultiplicityField/add-objects/index.js +0 -155
  509. package/cjs/MultiplicityField/index.js +0 -123
  510. package/cjs/Questions/Questions/index.js +0 -85
  511. package/cjs/Questions/Questions.stories/index.js +0 -26
  512. package/cjs/Questions/QuestionsContext/index.js +0 -17
  513. package/cjs/Questions/Step/ReviewStep/index.js +0 -60
  514. package/cjs/Questions/Step/Step/index.js +0 -72
  515. package/cjs/Questions/Step/StepArrayReview/index.js +0 -56
  516. package/cjs/Questions/Step/StepContext/index.js +0 -33
  517. package/cjs/Questions/Step/StepDescription/index.js +0 -34
  518. package/cjs/Questions/Step/StepForm/index.js +0 -54
  519. package/cjs/Questions/Step/StepQuote/index.js +0 -17
  520. package/cjs/Questions/Step/StepTitle/index.js +0 -51
  521. package/cjs/Questions/Step/getAddMoreFields/index.js +0 -27
  522. package/cjs/Questions/Step/index.js +0 -143
  523. package/cjs/Questions/Step/types/index.js +0 -5
  524. package/cjs/Questions/__snapshots__/index.spec.tsx.snap +0 -596
  525. package/cjs/Questions/__stories__/Default/index.js +0 -113
  526. package/cjs/Questions/getNextStep/index.js +0 -26
  527. package/cjs/Questions/index.js +0 -21
  528. package/cjs/Questions/index.mdx +0 -415
  529. package/cjs/Questions/index.spec/index.js +0 -63
  530. package/cjs/Questions/types/index.js +0 -5
  531. package/cjs/create-simple-form.mdx +0 -539
  532. package/cjs/index.js +0 -22
  533. package/cjs/index.mdx +0 -51
  534. package/cjs/inputs/AutoCompleteInput/AutoComplete.stories/index.js +0 -38
  535. package/cjs/inputs/AutoCompleteInput/__stories__/Default/index.js +0 -51
  536. package/cjs/inputs/AutoCompleteInput/__stories__/Multiple/index.js +0 -52
  537. package/cjs/inputs/AutoCompleteInput/index.js +0 -55
  538. package/cjs/inputs/Checkboxes/Checkboxes.stories/index.js +0 -50
  539. package/cjs/inputs/Checkboxes/Checkboxes.stories.playwright.json +0 -85
  540. package/cjs/inputs/Checkboxes/__stories__/Conditional/index.js +0 -103
  541. package/cjs/inputs/Checkboxes/__stories__/Default/index.js +0 -50
  542. package/cjs/inputs/Checkboxes/__stories__/WithDivider/index.js +0 -51
  543. package/cjs/inputs/Checkboxes/index.js +0 -101
  544. package/cjs/inputs/Checkboxes/index.mdx +0 -33
  545. package/cjs/inputs/DateInput/DateInput.stories/index.js +0 -26
  546. package/cjs/inputs/DateInput/DateInput.stories.playwright.json +0 -72
  547. package/cjs/inputs/DateInput/__stories__/Default/index.js +0 -33
  548. package/cjs/inputs/DateInput/index.js +0 -141
  549. package/cjs/inputs/DateInput/index.mdx +0 -23
  550. package/cjs/inputs/FileInput/FileInput.stories/index.js +0 -26
  551. package/cjs/inputs/FileInput/FileInput.stories.playwright.json +0 -75
  552. package/cjs/inputs/FileInput/__stories__/Default/index.js +0 -30
  553. package/cjs/inputs/FileInput/index.js +0 -68
  554. package/cjs/inputs/FileInput/index.mdx +0 -19
  555. package/cjs/inputs/ImageInput/ImageInput.stories/index.js +0 -50
  556. package/cjs/inputs/ImageInput/ImageInput.stories.playwright.json +0 -77
  557. package/cjs/inputs/ImageInput/__stories__/Default/index.js +0 -38
  558. package/cjs/inputs/ImageInput/__stories__/WithInvalidImageDimension/index.js +0 -46
  559. package/cjs/inputs/ImageInput/__stories__/WithInvalidImageSize/index.js +0 -43
  560. package/cjs/inputs/ImageInput/index.js +0 -86
  561. package/cjs/inputs/ImageInput/index.mdx +0 -19
  562. package/cjs/inputs/Input/Input.stories/index.js +0 -134
  563. package/cjs/inputs/Input/Input.stories.playwright.json +0 -376
  564. package/cjs/inputs/Input/__stories__/AFM/index.js +0 -32
  565. package/cjs/inputs/Input/__stories__/Boolean/index.js +0 -33
  566. package/cjs/inputs/Input/__stories__/Default/index.js +0 -33
  567. package/cjs/inputs/Input/__stories__/IBAN/index.js +0 -33
  568. package/cjs/inputs/Input/__stories__/Integer/index.js +0 -41
  569. package/cjs/inputs/Input/__stories__/LandlineNumber/index.js +0 -36
  570. package/cjs/inputs/Input/__stories__/MobilePhone/index.js +0 -36
  571. package/cjs/inputs/Input/__stories__/PhoneNumber/index.js +0 -35
  572. package/cjs/inputs/Input/__stories__/PostalCode/index.js +0 -35
  573. package/cjs/inputs/Input/__stories__/TextWithCharacterLimit/index.js +0 -39
  574. package/cjs/inputs/Input/index.js +0 -76
  575. package/cjs/inputs/Input/index.mdx +0 -95
  576. package/cjs/inputs/Label/Label.stories/index.js +0 -26
  577. package/cjs/inputs/Label/Label.stories.playwright.json +0 -40
  578. package/cjs/inputs/Label/__stories__/Default/index.js +0 -37
  579. package/cjs/inputs/Label/index.js +0 -29
  580. package/cjs/inputs/OtpInput/OtpInput.stories/index.js +0 -26
  581. package/cjs/inputs/OtpInput/__stories__/Default/index.js +0 -39
  582. package/cjs/inputs/OtpInput/index.js +0 -151
  583. package/cjs/inputs/Radio/Radio.stories/index.js +0 -50
  584. package/cjs/inputs/Radio/Radio.stories.playwright.json +0 -73
  585. package/cjs/inputs/Radio/__stories__/Conditional/index.js +0 -103
  586. package/cjs/inputs/Radio/__stories__/Default/index.js +0 -55
  587. package/cjs/inputs/Radio/__stories__/WithDivider/index.js +0 -56
  588. package/cjs/inputs/Radio/index.js +0 -64
  589. package/cjs/inputs/Select/Select.stories/index.js +0 -26
  590. package/cjs/inputs/Select/Select.stories.playwright.json +0 -22
  591. package/cjs/inputs/Select/__stories__/Default/index.js +0 -61
  592. package/cjs/inputs/Select/index.js +0 -38
  593. package/cjs/inputs/Select/index.mdx +0 -17
  594. package/cjs/inputs/index.js +0 -69
  595. package/cjs/installation.mdx +0 -68
  596. package/cjs/internal/index.js +0 -348
  597. package/cjs/lazy/index.js +0 -517
  598. package/cjs/registry/index.js +0 -147
  599. package/cjs/types/index.js +0 -5
  600. package/cjs/utils/index.js +0 -87
  601. package/cjs/validators/index.js +0 -193
  602. package/cjs/validators/types/index.js +0 -5
  603. package/cjs/validators/utils/afm/index.js +0 -38
  604. package/cjs/validators/utils/file/index.js +0 -43
  605. package/cjs/validators/utils/iban/index.js +0 -123
  606. package/cjs/validators/utils/image/index.js +0 -126
  607. package/cjs/validators/utils/index.js +0 -204
  608. package/cjs/validators/utils/int/index.js +0 -26
  609. package/cjs/validators/utils/number/index.js +0 -22
  610. package/cjs/validators/utils/otp/index.js +0 -32
  611. package/cjs/validators/utils/phone/index.js +0 -143
  612. package/cjs/validators/utils/postal_code/index.js +0 -34
  613. package/cjs/validators/utils/text_limit/index.js +0 -54
  614. package/cjs/validators/utils/uuid4/index.js +0 -25
  615. package/cjs/validators/validators.spec/index.js +0 -87
  616. package/create-simple-form.mdx +0 -539
  617. package/index.mdx +0 -51
  618. package/inputs/AutoCompleteInput/AutoComplete.stories/index.js +0 -8
  619. package/inputs/AutoCompleteInput/AutoComplete.stories/package.json +0 -6
  620. package/inputs/AutoCompleteInput/AutoComplete.stories.d.ts +0 -9
  621. package/inputs/AutoCompleteInput/__stories__/Default/index.js +0 -44
  622. package/inputs/AutoCompleteInput/__stories__/Default/package.json +0 -6
  623. package/inputs/AutoCompleteInput/__stories__/Default.d.ts +0 -3
  624. package/inputs/AutoCompleteInput/__stories__/Multiple/index.js +0 -45
  625. package/inputs/AutoCompleteInput/__stories__/Multiple/package.json +0 -6
  626. package/inputs/AutoCompleteInput/__stories__/Multiple.d.ts +0 -3
  627. package/inputs/AutoCompleteInput/index.mdx +0 -29
  628. package/inputs/AutoCompleteInput/package.json +0 -6
  629. package/inputs/Checkboxes/Checkboxes.stories/index.js +0 -9
  630. package/inputs/Checkboxes/Checkboxes.stories/package.json +0 -6
  631. package/inputs/Checkboxes/Checkboxes.stories.d.ts +0 -10
  632. package/inputs/Checkboxes/Checkboxes.stories.playwright.json +0 -85
  633. package/inputs/Checkboxes/__stories__/Conditional/index.js +0 -93
  634. package/inputs/Checkboxes/__stories__/Conditional/package.json +0 -6
  635. package/inputs/Checkboxes/__stories__/Conditional.d.ts +0 -3
  636. package/inputs/Checkboxes/__stories__/Default/index.js +0 -40
  637. package/inputs/Checkboxes/__stories__/Default/package.json +0 -6
  638. package/inputs/Checkboxes/__stories__/Default.d.ts +0 -3
  639. package/inputs/Checkboxes/__stories__/WithDivider/index.js +0 -41
  640. package/inputs/Checkboxes/__stories__/WithDivider/package.json +0 -6
  641. package/inputs/Checkboxes/__stories__/WithDivider.d.ts +0 -3
  642. package/inputs/Checkboxes/index.mdx +0 -33
  643. package/inputs/Checkboxes/package.json +0 -6
  644. package/inputs/DateInput/DateInput.stories/index.js +0 -7
  645. package/inputs/DateInput/DateInput.stories/package.json +0 -6
  646. package/inputs/DateInput/DateInput.stories.d.ts +0 -8
  647. package/inputs/DateInput/DateInput.stories.playwright.json +0 -72
  648. package/inputs/DateInput/__stories__/Default/index.js +0 -23
  649. package/inputs/DateInput/__stories__/Default/package.json +0 -6
  650. package/inputs/DateInput/__stories__/Default.d.ts +0 -3
  651. package/inputs/DateInput/index.mdx +0 -23
  652. package/inputs/DateInput/package.json +0 -6
  653. package/inputs/FileInput/FileInput.stories/index.js +0 -7
  654. package/inputs/FileInput/FileInput.stories/package.json +0 -6
  655. package/inputs/FileInput/FileInput.stories.d.ts +0 -8
  656. package/inputs/FileInput/FileInput.stories.playwright.json +0 -75
  657. package/inputs/FileInput/__stories__/Default/index.js +0 -20
  658. package/inputs/FileInput/__stories__/Default/package.json +0 -6
  659. package/inputs/FileInput/__stories__/Default.d.ts +0 -3
  660. package/inputs/FileInput/package.json +0 -6
  661. package/inputs/ImageInput/ImageInput.stories/index.js +0 -9
  662. package/inputs/ImageInput/ImageInput.stories/package.json +0 -6
  663. package/inputs/ImageInput/ImageInput.stories.d.ts +0 -10
  664. package/inputs/ImageInput/ImageInput.stories.playwright.json +0 -77
  665. package/inputs/ImageInput/__stories__/Default/index.js +0 -28
  666. package/inputs/ImageInput/__stories__/Default/package.json +0 -6
  667. package/inputs/ImageInput/__stories__/Default.d.ts +0 -3
  668. package/inputs/ImageInput/__stories__/WithInvalidImageDimension/index.js +0 -36
  669. package/inputs/ImageInput/__stories__/WithInvalidImageDimension/package.json +0 -6
  670. package/inputs/ImageInput/__stories__/WithInvalidImageDimension.d.ts +0 -3
  671. package/inputs/ImageInput/__stories__/WithInvalidImageSize/index.js +0 -33
  672. package/inputs/ImageInput/__stories__/WithInvalidImageSize/package.json +0 -6
  673. package/inputs/ImageInput/__stories__/WithInvalidImageSize.d.ts +0 -3
  674. package/inputs/ImageInput/index.mdx +0 -19
  675. package/inputs/ImageInput/package.json +0 -6
  676. package/inputs/Input/Input.stories/index.js +0 -16
  677. package/inputs/Input/Input.stories/package.json +0 -6
  678. package/inputs/Input/Input.stories.d.ts +0 -17
  679. package/inputs/Input/Input.stories.playwright.json +0 -376
  680. package/inputs/Input/__stories__/AFM/index.js +0 -22
  681. package/inputs/Input/__stories__/AFM/package.json +0 -6
  682. package/inputs/Input/__stories__/AFM.d.ts +0 -3
  683. package/inputs/Input/__stories__/Boolean/index.js +0 -23
  684. package/inputs/Input/__stories__/Boolean/package.json +0 -6
  685. package/inputs/Input/__stories__/Boolean.d.ts +0 -3
  686. package/inputs/Input/__stories__/Default/index.js +0 -23
  687. package/inputs/Input/__stories__/Default/package.json +0 -6
  688. package/inputs/Input/__stories__/Default.d.ts +0 -3
  689. package/inputs/Input/__stories__/IBAN/index.js +0 -23
  690. package/inputs/Input/__stories__/IBAN/package.json +0 -6
  691. package/inputs/Input/__stories__/IBAN.d.ts +0 -3
  692. package/inputs/Input/__stories__/Integer/index.js +0 -31
  693. package/inputs/Input/__stories__/Integer/package.json +0 -6
  694. package/inputs/Input/__stories__/Integer.d.ts +0 -3
  695. package/inputs/Input/__stories__/LandlineNumber/index.js +0 -26
  696. package/inputs/Input/__stories__/LandlineNumber/package.json +0 -6
  697. package/inputs/Input/__stories__/LandlineNumber.d.ts +0 -3
  698. package/inputs/Input/__stories__/MobilePhone/index.js +0 -26
  699. package/inputs/Input/__stories__/MobilePhone/package.json +0 -6
  700. package/inputs/Input/__stories__/MobilePhone.d.ts +0 -3
  701. package/inputs/Input/__stories__/PhoneNumber/index.js +0 -25
  702. package/inputs/Input/__stories__/PhoneNumber/package.json +0 -6
  703. package/inputs/Input/__stories__/PhoneNumber.d.ts +0 -3
  704. package/inputs/Input/__stories__/PostalCode/index.js +0 -25
  705. package/inputs/Input/__stories__/PostalCode/package.json +0 -6
  706. package/inputs/Input/__stories__/PostalCode.d.ts +0 -3
  707. package/inputs/Input/__stories__/TextWithCharacterLimit/index.js +0 -29
  708. package/inputs/Input/__stories__/TextWithCharacterLimit/package.json +0 -6
  709. package/inputs/Input/__stories__/TextWithCharacterLimit.d.ts +0 -3
  710. package/inputs/Input/index.mdx +0 -95
  711. package/inputs/Input/package.json +0 -6
  712. package/inputs/Label/Label.stories/index.js +0 -7
  713. package/inputs/Label/Label.stories/package.json +0 -6
  714. package/inputs/Label/Label.stories.d.ts +0 -8
  715. package/inputs/Label/Label.stories.playwright.json +0 -40
  716. package/inputs/Label/__stories__/Default/index.js +0 -27
  717. package/inputs/Label/__stories__/Default/package.json +0 -6
  718. package/inputs/Label/__stories__/Default.d.ts +0 -3
  719. package/inputs/Label/package.json +0 -6
  720. package/inputs/OtpInput/OtpInput.stories/index.js +0 -7
  721. package/inputs/OtpInput/OtpInput.stories/package.json +0 -6
  722. package/inputs/OtpInput/OtpInput.stories.d.ts +0 -8
  723. package/inputs/OtpInput/__stories__/Default/index.js +0 -29
  724. package/inputs/OtpInput/__stories__/Default/package.json +0 -6
  725. package/inputs/OtpInput/__stories__/Default.d.ts +0 -3
  726. package/inputs/OtpInput/index.mdx +0 -23
  727. package/inputs/OtpInput/package.json +0 -6
  728. package/inputs/Radio/Radio.stories/index.js +0 -9
  729. package/inputs/Radio/Radio.stories/package.json +0 -6
  730. package/inputs/Radio/Radio.stories.d.ts +0 -10
  731. package/inputs/Radio/Radio.stories.playwright.json +0 -73
  732. package/inputs/Radio/__stories__/Conditional/index.js +0 -93
  733. package/inputs/Radio/__stories__/Conditional/package.json +0 -6
  734. package/inputs/Radio/__stories__/Conditional.d.ts +0 -3
  735. package/inputs/Radio/__stories__/Default/index.js +0 -45
  736. package/inputs/Radio/__stories__/Default/package.json +0 -6
  737. package/inputs/Radio/__stories__/Default.d.ts +0 -3
  738. package/inputs/Radio/__stories__/WithDivider/index.js +0 -46
  739. package/inputs/Radio/__stories__/WithDivider/package.json +0 -6
  740. package/inputs/Radio/__stories__/WithDivider.d.ts +0 -3
  741. package/inputs/Radio/index.mdx +0 -33
  742. package/inputs/Radio/package.json +0 -6
  743. package/inputs/Select/Select.stories/index.js +0 -7
  744. package/inputs/Select/Select.stories/package.json +0 -6
  745. package/inputs/Select/Select.stories.d.ts +0 -8
  746. package/inputs/Select/Select.stories.playwright.json +0 -22
  747. package/inputs/Select/__stories__/Default/index.js +0 -51
  748. package/inputs/Select/__stories__/Default/package.json +0 -6
  749. package/inputs/Select/__stories__/Default.d.ts +0 -3
  750. package/inputs/Select/index.mdx +0 -17
  751. package/inputs/Select/package.json +0 -6
  752. package/inputs/package.json +0 -6
  753. package/installation.mdx +0 -68
  754. package/internal/index.js +0 -34
  755. package/internal/package.json +0 -6
  756. package/lazy/index.js +0 -395
  757. package/lazy/package.json +0 -6
  758. package/registry/index.js +0 -138
  759. package/registry/package.json +0 -6
  760. package/src/Field/index.mdx +0 -6
  761. package/src/Field/utils.ts +0 -191
  762. package/src/FieldArray/FieldArray.stories.playwright.json +0 -353
  763. package/src/FormBuilder/FormBuilder.stories.playwright.json +0 -52
  764. package/src/FormBuilder/FormBuilder.tsx +0 -166
  765. package/src/MultiplicityField/MultiplicityField.mdx +0 -590
  766. package/src/MultiplicityField/MultiplicityField.stories.playwright.json +0 -1370
  767. package/src/Questions/index.mdx +0 -415
  768. package/src/inputs/AutoCompleteInput/index.mdx +0 -29
  769. package/src/inputs/Checkboxes/Checkboxes.stories.playwright.json +0 -85
  770. package/src/inputs/DateInput/DateInput.stories.playwright.json +0 -72
  771. package/src/inputs/FileInput/FileInput.stories.playwright.json +0 -75
  772. package/src/inputs/FileInput/index.mdx +0 -19
  773. package/src/inputs/ImageInput/ImageInput.stories.playwright.json +0 -77
  774. package/src/inputs/ImageInput/index.mdx +0 -19
  775. package/src/inputs/Input/Input.stories.playwright.json +0 -376
  776. package/src/inputs/Input/index.mdx +0 -95
  777. package/src/inputs/Label/Label.stories.playwright.json +0 -40
  778. package/src/inputs/OtpInput/index.mdx +0 -23
  779. package/src/inputs/Radio/Radio.stories.playwright.json +0 -73
  780. package/src/inputs/Radio/index.mdx +0 -33
  781. package/src/inputs/Select/Select.stories.playwright.json +0 -22
  782. package/src/lazy.js +0 -60
  783. package/src/registry.js +0 -145
  784. package/types/index.js +0 -1
  785. package/types/package.json +0 -6
  786. package/utils/index.js +0 -80
  787. package/utils/package.json +0 -6
  788. package/validators/package.json +0 -6
  789. package/validators/types/index.js +0 -1
  790. package/validators/types/package.json +0 -6
  791. package/validators/utils/afm/index.js +0 -31
  792. package/validators/utils/afm/package.json +0 -6
  793. package/validators/utils/file/index.js +0 -37
  794. package/validators/utils/file/package.json +0 -6
  795. package/validators/utils/iban/index.js +0 -116
  796. package/validators/utils/iban/package.json +0 -6
  797. package/validators/utils/image/index.js +0 -119
  798. package/validators/utils/image/package.json +0 -6
  799. package/validators/utils/int/index.js +0 -19
  800. package/validators/utils/int/package.json +0 -6
  801. package/validators/utils/number/index.js +0 -15
  802. package/validators/utils/number/package.json +0 -6
  803. package/validators/utils/otp/index.js +0 -25
  804. package/validators/utils/otp/package.json +0 -6
  805. package/validators/utils/package.json +0 -6
  806. package/validators/utils/phone/index.js +0 -134
  807. package/validators/utils/phone/package.json +0 -6
  808. package/validators/utils/postal_code/index.js +0 -27
  809. package/validators/utils/postal_code/package.json +0 -6
  810. package/validators/utils/text_limit/index.js +0 -47
  811. package/validators/utils/text_limit/package.json +0 -6
  812. package/validators/utils/uuid4/index.js +0 -18
  813. package/validators/utils/uuid4/package.json +0 -6
  814. package/validators/validators.spec/index.js +0 -85
  815. package/validators/validators.spec/package.json +0 -6
  816. package/validators/validators.spec.d.ts +0 -1
  817. /package/{cjs/inputs/Label/index.mdx → Field/types.js} +0 -0
  818. /package/{inputs/Label/index.mdx → Fieldset/types.js} +0 -0
  819. /package/{src/inputs/Label/index.mdx → MultiplicityField/types.js} +0 -0
@@ -0,0 +1,1079 @@
1
+ import React from 'react';
2
+ import {
3
+ renderHook,
4
+ act,
5
+ render,
6
+ screen,
7
+ fireEvent,
8
+ waitFor,
9
+ } from '@testing-library/react';
10
+ import { useForm, useFieldArray } from 'react-hook-form';
11
+ import { expect } from 'vitest';
12
+
13
+ import { useFieldFocusManager } from '@digigov/form/hooks/useFieldFocusManager';
14
+
15
+ // Mock component that uses the hook
16
+ function TestFormComponent({
17
+ enabled = true,
18
+ onRegisterElement,
19
+ }: {
20
+ enabled?: boolean;
21
+ onRegisterElement?: (register: any) => void;
22
+ }) {
23
+ const form = useForm({
24
+ defaultValues: {
25
+ firstName: '',
26
+ lastName: '',
27
+ email: '',
28
+ },
29
+ shouldFocusError: false, // Disable default focus behavior for testing
30
+ });
31
+
32
+ const { registerCustomFocusableElement, focusOnError } = useFieldFocusManager(
33
+ {
34
+ enabled,
35
+ control: form.control,
36
+ subscribe: form.subscribe,
37
+ setFocus: form.setFocus,
38
+ }
39
+ );
40
+
41
+ // Expose register function for testing
42
+ React.useEffect(() => {
43
+ if (onRegisterElement) {
44
+ onRegisterElement(registerCustomFocusableElement);
45
+ }
46
+ }, [registerCustomFocusableElement, onRegisterElement]);
47
+
48
+ return (
49
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
50
+ <input
51
+ {...form.register('firstName', { required: 'First name is required' })}
52
+ data-testid="firstName"
53
+ placeholder="First Name"
54
+ />
55
+ <input
56
+ {...form.register('lastName', { required: 'Last name is required' })}
57
+ data-testid="lastName"
58
+ placeholder="Last Name"
59
+ />
60
+ <input
61
+ {...form.register('email', { required: 'Email is required' })}
62
+ data-testid="email"
63
+ placeholder="Email"
64
+ />
65
+ <button type="submit" data-testid="submit">
66
+ Submit
67
+ </button>
68
+ </form>
69
+ );
70
+ }
71
+
72
+ // FieldArray test component
73
+ function TestFieldArrayComponent({
74
+ enabled = true,
75
+ onRegisterElement,
76
+ }: {
77
+ enabled?: boolean;
78
+ onRegisterElement?: (register: any) => void;
79
+ }) {
80
+ const form = useForm({
81
+ defaultValues: {
82
+ users: [{ name: '', email: '' }],
83
+ items: [{ title: '', description: '' }],
84
+ },
85
+ shouldFocusError: false,
86
+ });
87
+
88
+ const { fields: userFields, append: appendUser } = useFieldArray({
89
+ control: form.control,
90
+ name: 'users',
91
+ });
92
+
93
+ const { fields: itemFields, append: appendItem } = useFieldArray({
94
+ control: form.control,
95
+ name: 'items',
96
+ });
97
+
98
+ const { registerCustomFocusableElement, focusOnError } = useFieldFocusManager(
99
+ {
100
+ enabled,
101
+ control: form.control,
102
+ subscribe: form.subscribe,
103
+ setFocus: form.setFocus,
104
+ }
105
+ );
106
+
107
+ React.useEffect(() => {
108
+ if (onRegisterElement) {
109
+ onRegisterElement(registerCustomFocusableElement);
110
+ }
111
+ }, [registerCustomFocusableElement, onRegisterElement]);
112
+
113
+ return (
114
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
115
+ <div data-testid="users-section">
116
+ {userFields.map((field, index) => (
117
+ <div key={field.id} data-testid={`user-${index}`}>
118
+ <input
119
+ {...form.register(`users.${index}.name`, {
120
+ required: 'Name is required',
121
+ })}
122
+ data-testid={`user-${index}-name`}
123
+ placeholder={`User ${index} Name`}
124
+ />
125
+ <input
126
+ {...form.register(`users.${index}.email`, {
127
+ required: 'Email is required',
128
+ })}
129
+ data-testid={`user-${index}-email`}
130
+ placeholder={`User ${index} Email`}
131
+ />
132
+ </div>
133
+ ))}
134
+ <button
135
+ type="button"
136
+ onClick={() => appendUser({ name: '', email: '' })}
137
+ data-testid="add-user"
138
+ >
139
+ Add User
140
+ </button>
141
+ </div>
142
+
143
+ <div data-testid="items-section">
144
+ {itemFields.map((field, index) => (
145
+ <div key={field.id} data-testid={`item-${index}`}>
146
+ <input
147
+ {...form.register(`items.${index}.title`, {
148
+ required: 'Title is required',
149
+ })}
150
+ data-testid={`item-${index}-title`}
151
+ placeholder={`Item ${index} Title`}
152
+ />
153
+ <input
154
+ {...form.register(`items.${index}.description`)}
155
+ data-testid={`item-${index}-description`}
156
+ placeholder={`Item ${index} Description`}
157
+ />
158
+ </div>
159
+ ))}
160
+ <button
161
+ type="button"
162
+ onClick={() => appendItem({ title: '', description: '' })}
163
+ data-testid="add-item"
164
+ >
165
+ Add Item
166
+ </button>
167
+ </div>
168
+
169
+ <button type="submit" data-testid="submit">
170
+ Submit
171
+ </button>
172
+ </form>
173
+ );
174
+ }
175
+
176
+ // Nested FieldArray component
177
+ function TestNestedFieldArrayComponent() {
178
+ const form = useForm({
179
+ defaultValues: {
180
+ projects: [
181
+ {
182
+ name: '',
183
+ tasks: [{ title: '', assignee: '' }],
184
+ },
185
+ ],
186
+ },
187
+ shouldFocusError: false,
188
+ });
189
+
190
+ const { fields: projectFields, append: appendProject } = useFieldArray({
191
+ control: form.control,
192
+ name: 'projects',
193
+ });
194
+
195
+ const { focusOnError } = useFieldFocusManager({
196
+ control: form.control,
197
+ subscribe: form.subscribe,
198
+ setFocus: form.setFocus,
199
+ });
200
+
201
+ return (
202
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
203
+ {projectFields.map((projectField, projectIndex) => (
204
+ <div key={projectField.id} data-testid={`project-${projectIndex}`}>
205
+ <input
206
+ {...form.register(`projects.${projectIndex}.name`, {
207
+ required: 'Project name is required',
208
+ })}
209
+ data-testid={`project-${projectIndex}-name`}
210
+ placeholder={`Project ${projectIndex} Name`}
211
+ />
212
+
213
+ <NestedTasksFieldArray
214
+ control={form.control}
215
+ register={form.register}
216
+ projectIndex={projectIndex}
217
+ />
218
+ </div>
219
+ ))}
220
+
221
+ <button
222
+ type="button"
223
+ onClick={() =>
224
+ appendProject({ name: '', tasks: [{ title: '', assignee: '' }] })
225
+ }
226
+ data-testid="add-project"
227
+ >
228
+ Add Project
229
+ </button>
230
+
231
+ <button type="submit" data-testid="submit">
232
+ Submit
233
+ </button>
234
+ </form>
235
+ );
236
+ }
237
+
238
+ function NestedTasksFieldArray({
239
+ control,
240
+ register,
241
+ projectIndex,
242
+ }: {
243
+ control: any;
244
+ register: any;
245
+ projectIndex: number;
246
+ }) {
247
+ const { fields: taskFields, append: appendTask } = useFieldArray({
248
+ control,
249
+ name: `projects.${projectIndex}.tasks`,
250
+ });
251
+
252
+ return (
253
+ <div data-testid={`project-${projectIndex}-tasks`}>
254
+ {taskFields.map((taskField, taskIndex) => (
255
+ <div
256
+ key={taskField.id}
257
+ data-testid={`project-${projectIndex}-task-${taskIndex}`}
258
+ >
259
+ <input
260
+ {...register(`projects.${projectIndex}.tasks.${taskIndex}.title`, {
261
+ required: 'Task title is required',
262
+ })}
263
+ data-testid={`project-${projectIndex}-task-${taskIndex}-title`}
264
+ placeholder={`Task ${taskIndex} Title`}
265
+ />
266
+ <input
267
+ {...register(
268
+ `projects.${projectIndex}.tasks.${taskIndex}.assignee`,
269
+ {
270
+ required: 'Assignee is required',
271
+ }
272
+ )}
273
+ data-testid={`project-${projectIndex}-task-${taskIndex}-assignee`}
274
+ placeholder={`Task ${taskIndex} Assignee`}
275
+ />
276
+ </div>
277
+ ))}
278
+
279
+ <button
280
+ type="button"
281
+ onClick={() => appendTask({ title: '', assignee: '' })}
282
+ data-testid={`add-task-${projectIndex}`}
283
+ >
284
+ Add Task
285
+ </button>
286
+ </div>
287
+ );
288
+ }
289
+
290
+ describe('useFieldFocusManager', () => {
291
+ beforeEach(() => {
292
+ vi.clearAllMocks();
293
+ });
294
+
295
+ describe('basic functionality', () => {
296
+ it('should return registerCustomFocusableElement function', () => {
297
+ const { result } = renderHook(() => {
298
+ const form = useForm();
299
+ return useFieldFocusManager({
300
+ control: form.control,
301
+ subscribe: form.subscribe,
302
+ setFocus: form.setFocus,
303
+ });
304
+ });
305
+
306
+ expect(result.current.registerCustomFocusableElement).toBeInstanceOf(
307
+ Function
308
+ );
309
+ });
310
+
311
+ it('should be enabled by default', () => {
312
+ const { result } = renderHook(() => {
313
+ const form = useForm();
314
+ return useFieldFocusManager({
315
+ control: form.control,
316
+ subscribe: form.subscribe,
317
+ setFocus: form.setFocus,
318
+ });
319
+ });
320
+
321
+ expect(result.current.registerCustomFocusableElement).toBeDefined();
322
+ });
323
+ });
324
+
325
+ describe('error focusing behavior', () => {
326
+ it('should focus the first field with an error in DOM order', async () => {
327
+ render(<TestFormComponent />);
328
+
329
+ const firstNameInput = screen.getByTestId('firstName');
330
+ const submitButton = screen.getByTestId('submit');
331
+
332
+ // Submit form to trigger validation errors
333
+ fireEvent.click(submitButton);
334
+
335
+ // First field in DOM order should be focused
336
+ await waitFor(() => expect(firstNameInput).toHaveFocus());
337
+ });
338
+
339
+ it('should focus the first field with error even if not the first field in form', async () => {
340
+ function TestForm() {
341
+ const form = useForm({
342
+ defaultValues: {
343
+ firstName: 'Valid',
344
+ lastName: '',
345
+ email: '',
346
+ },
347
+ shouldFocusError: false,
348
+ });
349
+
350
+ const { focusOnError } = useFieldFocusManager({
351
+ control: form.control,
352
+ subscribe: form.subscribe,
353
+ setFocus: form.setFocus,
354
+ });
355
+
356
+ return (
357
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
358
+ <input
359
+ {...form.register('firstName')}
360
+ data-testid="firstName"
361
+ placeholder="First Name"
362
+ />
363
+ <input
364
+ {...form.register('lastName', {
365
+ required: 'Last name is required',
366
+ })}
367
+ data-testid="lastName"
368
+ placeholder="Last Name"
369
+ />
370
+ <input
371
+ {...form.register('email', { required: 'Email is required' })}
372
+ data-testid="email"
373
+ placeholder="Email"
374
+ />
375
+ <button type="submit" data-testid="submit">
376
+ Submit
377
+ </button>
378
+ </form>
379
+ );
380
+ }
381
+
382
+ render(<TestForm />);
383
+
384
+ const lastNameInput = screen.getByTestId('lastName');
385
+ const submitButton = screen.getByTestId('submit');
386
+
387
+ // Submit form to trigger validation errors
388
+ fireEvent.click(submitButton);
389
+
390
+ // Wait for focus to be applied
391
+ await act(async () => {
392
+ await new Promise((resolve) => setTimeout(resolve, 50));
393
+ });
394
+
395
+ // lastName should be focused as it's the first field with an error
396
+ expect(lastNameInput).toHaveFocus();
397
+ });
398
+
399
+ it('should not focus any field when there are no errors', async () => {
400
+ function TestForm() {
401
+ const form = useForm({
402
+ defaultValues: {
403
+ firstName: 'John',
404
+ lastName: 'Doe',
405
+ email: 'john@example.com',
406
+ },
407
+ shouldFocusError: false,
408
+ });
409
+
410
+ const { focusOnError } = useFieldFocusManager({
411
+ control: form.control,
412
+ subscribe: form.subscribe,
413
+ setFocus: form.setFocus,
414
+ });
415
+
416
+ return (
417
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
418
+ <input
419
+ {...form.register('firstName', {
420
+ required: 'First name is required',
421
+ })}
422
+ data-testid="input"
423
+ placeholder="First Name"
424
+ />
425
+ <input
426
+ {...form.register('lastName', {
427
+ required: 'Last name is required',
428
+ })}
429
+ data-testid="input"
430
+ placeholder="Last Name"
431
+ />
432
+ <input
433
+ {...form.register('email', { required: 'Email is required' })}
434
+ data-testid="input"
435
+ placeholder="Email"
436
+ />
437
+ <button type="submit" data-testid="submit">
438
+ Submit
439
+ </button>
440
+ </form>
441
+ );
442
+ }
443
+
444
+ render(<TestForm />);
445
+
446
+ const submitButton = screen.getByTestId('submit');
447
+
448
+ // Submit form - should not trigger any focus since all fields are valid
449
+ fireEvent.click(submitButton);
450
+
451
+ // Wait for any potential focus changes
452
+ await act(async () => {
453
+ await new Promise((resolve) => setTimeout(resolve, 50));
454
+ });
455
+
456
+ // No input should be focused (submit button should retain focus)
457
+ for (const input of screen.getAllByTestId('input')) {
458
+ expect(input).not.toHaveFocus();
459
+ }
460
+ });
461
+
462
+ it('should focus fields in correct DOM order regardless of registration order', async () => {
463
+ function SimpleOrderTest() {
464
+ const form = useForm({
465
+ defaultValues: {
466
+ field1: 'valid',
467
+ field2: '',
468
+ field3: '',
469
+ },
470
+ shouldFocusError: false,
471
+ });
472
+
473
+ const { focusOnError } = useFieldFocusManager({
474
+ control: form.control,
475
+ subscribe: form.subscribe,
476
+ setFocus: form.setFocus,
477
+ });
478
+
479
+ return (
480
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
481
+ <input {...form.register('field1')} data-testid="field1" />
482
+ <input
483
+ {...form.register('field2', { required: 'Required' })}
484
+ data-testid="field2"
485
+ />
486
+ <input
487
+ {...form.register('field3', { required: 'Required' })}
488
+ data-testid="field3"
489
+ />
490
+ <button type="submit" data-testid="submit">
491
+ Submit
492
+ </button>
493
+ </form>
494
+ );
495
+ }
496
+
497
+ render(<SimpleOrderTest />);
498
+
499
+ const submitButton = screen.getByTestId('submit');
500
+ fireEvent.click(submitButton);
501
+
502
+ await act(async () => {
503
+ await new Promise((resolve) => setTimeout(resolve, 50));
504
+ });
505
+
506
+ // field2 should be focused as it's the first field with an error in DOM order
507
+ const field2Input = screen.getByTestId('field2');
508
+ expect(field2Input).toHaveFocus();
509
+ });
510
+ });
511
+
512
+ describe('FieldArray support', () => {
513
+ it('should focus first field array field with error', async () => {
514
+ render(<TestFieldArrayComponent />);
515
+
516
+ const submitButton = screen.getByTestId('submit');
517
+
518
+ // Submit form to trigger validation errors on the first user's name field
519
+ fireEvent.click(submitButton);
520
+
521
+ await act(async () => {
522
+ await new Promise((resolve) => setTimeout(resolve, 50));
523
+ });
524
+
525
+ // First field in first user should be focused (users.0.name)
526
+ const firstUserNameInput = screen.getByTestId('user-0-name');
527
+ expect(firstUserNameInput).toHaveFocus();
528
+ });
529
+
530
+ it('should focus field arrays in DOM order', async () => {
531
+ render(<TestFieldArrayComponent />);
532
+
533
+ const addUserButton = screen.getByTestId('add-user');
534
+
535
+ // Add another user (but don't add items yet)
536
+ fireEvent.click(addUserButton);
537
+
538
+ // Fill in the first user's fields to make them valid
539
+ const firstUserName = screen.getByTestId('user-0-name');
540
+ const firstUserEmail = screen.getByTestId('user-0-email');
541
+
542
+ fireEvent.change(firstUserName, { target: { value: 'John' } });
543
+ fireEvent.change(firstUserEmail, {
544
+ target: { value: 'john@example.com' },
545
+ });
546
+
547
+ // Also fill in the first item's title to make it valid
548
+ const firstItemTitle = screen.getByTestId('item-0-title');
549
+ fireEvent.change(firstItemTitle, { target: { value: 'Valid Title' } });
550
+
551
+ const submitButton = screen.getByTestId('submit');
552
+ fireEvent.click(submitButton);
553
+
554
+ await act(async () => {
555
+ await new Promise((resolve) => setTimeout(resolve, 50));
556
+ });
557
+
558
+ // Should focus the second user's name field (first error in DOM order)
559
+ const secondUserNameInput = screen.getByTestId('user-1-name');
560
+ expect(secondUserNameInput).toHaveFocus();
561
+ });
562
+
563
+ it('should handle dynamically added field array items', async () => {
564
+ render(<TestFieldArrayComponent />);
565
+
566
+ const addUserButton = screen.getByTestId('add-user');
567
+ const addItemButton = screen.getByTestId('add-item');
568
+
569
+ // Add multiple users and items
570
+ fireEvent.click(addUserButton);
571
+ fireEvent.click(addUserButton);
572
+ fireEvent.click(addItemButton);
573
+
574
+ // Verify elements were added
575
+ expect(screen.getByTestId('user-0-name')).toBeInTheDocument();
576
+ expect(screen.getByTestId('user-1-name')).toBeInTheDocument();
577
+ expect(screen.getByTestId('user-2-name')).toBeInTheDocument();
578
+ expect(screen.getByTestId('item-0-title')).toBeInTheDocument();
579
+
580
+ const submitButton = screen.getByTestId('submit');
581
+ fireEvent.click(submitButton);
582
+
583
+ await act(async () => {
584
+ await new Promise((resolve) => setTimeout(resolve, 50));
585
+ });
586
+
587
+ // Should focus the first field with an error (first user's name)
588
+ const firstUserNameInput = screen.getByTestId('user-0-name');
589
+ expect(firstUserNameInput).toHaveFocus();
590
+ });
591
+
592
+ it('should focus items array fields when users are valid', async () => {
593
+ render(<TestFieldArrayComponent />);
594
+
595
+ const addItemButton = screen.getByTestId('add-item');
596
+ fireEvent.click(addItemButton);
597
+
598
+ // Fill in user fields to make them valid
599
+ const userNameInput = screen.getByTestId('user-0-name');
600
+ const userEmailInput = screen.getByTestId('user-0-email');
601
+
602
+ fireEvent.change(userNameInput, { target: { value: 'John' } });
603
+ fireEvent.change(userEmailInput, {
604
+ target: { value: 'john@example.com' },
605
+ });
606
+
607
+ const submitButton = screen.getByTestId('submit');
608
+ fireEvent.click(submitButton);
609
+
610
+ await act(async () => {
611
+ await new Promise((resolve) => setTimeout(resolve, 50));
612
+ });
613
+
614
+ // Should focus the first item's title field (first error in items array)
615
+ const firstItemTitleInput = screen.getByTestId('item-0-title');
616
+ expect(firstItemTitleInput).toHaveFocus();
617
+ });
618
+
619
+ it('should handle mixed field array and regular field errors', async () => {
620
+ function MixedFieldsForm() {
621
+ const form = useForm({
622
+ defaultValues: {
623
+ regularField: '',
624
+ users: [{ name: '', email: '' }],
625
+ },
626
+ shouldFocusError: false,
627
+ });
628
+
629
+ const { fields } = useFieldArray({
630
+ control: form.control,
631
+ name: 'users',
632
+ });
633
+
634
+ const { focusOnError } = useFieldFocusManager({
635
+ control: form.control,
636
+ subscribe: form.subscribe,
637
+ setFocus: form.setFocus,
638
+ });
639
+
640
+ return (
641
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
642
+ <input
643
+ {...form.register('regularField', {
644
+ required: 'Regular field is required',
645
+ })}
646
+ data-testid="regular-field"
647
+ placeholder="Regular Field"
648
+ />
649
+
650
+ {fields.map((field, index) => (
651
+ <div key={field.id}>
652
+ <input
653
+ {...form.register(`users.${index}.name`, {
654
+ required: 'Name is required',
655
+ })}
656
+ data-testid={`user-${index}-name`}
657
+ placeholder={`User ${index} Name`}
658
+ />
659
+ </div>
660
+ ))}
661
+
662
+ <button type="submit" data-testid="submit">
663
+ Submit
664
+ </button>
665
+ </form>
666
+ );
667
+ }
668
+
669
+ render(<MixedFieldsForm />);
670
+
671
+ const submitButton = screen.getByTestId('submit');
672
+ fireEvent.click(submitButton);
673
+
674
+ await act(async () => {
675
+ await new Promise((resolve) => setTimeout(resolve, 50));
676
+ });
677
+
678
+ // Should focus the regular field first (appears first in DOM)
679
+ const regularFieldInput = screen.getByTestId('regular-field');
680
+ expect(regularFieldInput).toHaveFocus();
681
+ });
682
+ });
683
+
684
+ describe('nested FieldArrays', () => {
685
+ it('should focus nested field array fields', async () => {
686
+ render(<TestNestedFieldArrayComponent />);
687
+
688
+ const submitButton = screen.getByTestId('submit');
689
+ fireEvent.click(submitButton);
690
+
691
+ await act(async () => {
692
+ await new Promise((resolve) => setTimeout(resolve, 50));
693
+ });
694
+
695
+ // Should focus the project name field first
696
+ const projectNameInput = screen.getByTestId('project-0-name');
697
+ expect(projectNameInput).toHaveFocus();
698
+ });
699
+
700
+ it('should focus nested task fields when project name is valid', async () => {
701
+ render(<TestNestedFieldArrayComponent />);
702
+
703
+ // Fill in project name to make it valid
704
+ const projectNameInput = screen.getByTestId('project-0-name');
705
+ fireEvent.change(projectNameInput, { target: { value: 'Project 1' } });
706
+
707
+ const submitButton = screen.getByTestId('submit');
708
+ fireEvent.click(submitButton);
709
+
710
+ await act(async () => {
711
+ await new Promise((resolve) => setTimeout(resolve, 50));
712
+ });
713
+
714
+ // Should focus the first task's title field
715
+ const taskTitleInput = screen.getByTestId('project-0-task-0-title');
716
+ expect(taskTitleInput).toHaveFocus();
717
+ });
718
+
719
+ it('should handle adding nested field arrays dynamically', async () => {
720
+ render(<TestNestedFieldArrayComponent />);
721
+
722
+ const addProjectButton = screen.getByTestId('add-project');
723
+ const addTaskButton = screen.getByTestId('add-task-0');
724
+
725
+ // Add another project and task
726
+ fireEvent.click(addProjectButton);
727
+ fireEvent.click(addTaskButton);
728
+
729
+ // Verify elements were added
730
+ expect(screen.getByTestId('project-0-name')).toBeInTheDocument();
731
+ expect(screen.getByTestId('project-1-name')).toBeInTheDocument();
732
+ expect(screen.getByTestId('project-0-task-0-title')).toBeInTheDocument();
733
+ expect(screen.getByTestId('project-0-task-1-title')).toBeInTheDocument();
734
+
735
+ const submitButton = screen.getByTestId('submit');
736
+ fireEvent.click(submitButton);
737
+
738
+ await act(async () => {
739
+ await new Promise((resolve) => setTimeout(resolve, 50));
740
+ });
741
+
742
+ // Should focus the first project's name field
743
+ const firstProjectNameInput = screen.getByTestId('project-0-name');
744
+ expect(firstProjectNameInput).toHaveFocus();
745
+ });
746
+
747
+ it('should focus deeply nested fields in correct order', async () => {
748
+ render(<TestNestedFieldArrayComponent />);
749
+
750
+ // Fill in first project name and first task title to test deep nesting
751
+ const projectNameInput = screen.getByTestId('project-0-name');
752
+ const taskTitleInput = screen.getByTestId('project-0-task-0-title');
753
+
754
+ fireEvent.change(projectNameInput, { target: { value: 'Project 1' } });
755
+ fireEvent.change(taskTitleInput, { target: { value: 'Task 1' } });
756
+
757
+ const submitButton = screen.getByTestId('submit');
758
+ fireEvent.click(submitButton);
759
+
760
+ await act(async () => {
761
+ await new Promise((resolve) => setTimeout(resolve, 50));
762
+ });
763
+
764
+ // Should focus the first task's assignee field (next field with error)
765
+ const taskAssigneeInput = screen.getByTestId('project-0-task-0-assignee');
766
+ expect(taskAssigneeInput).toHaveFocus();
767
+ });
768
+ });
769
+
770
+ describe('custom focusable elements', () => {
771
+ it('should register and focus custom elements', async () => {
772
+ function TestForm() {
773
+ const form = useForm({
774
+ defaultValues: {
775
+ firstName: '',
776
+ },
777
+ shouldFocusError: false,
778
+ });
779
+
780
+ const { registerCustomFocusableElement, focusOnError } =
781
+ useFieldFocusManager({
782
+ control: form.control,
783
+ subscribe: form.subscribe,
784
+ setFocus: form.setFocus,
785
+ });
786
+
787
+ return (
788
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
789
+ <input
790
+ {...form.register('firstName', {
791
+ required: 'First name is required',
792
+ })}
793
+ data-testid="firstName"
794
+ placeholder="First Name"
795
+ />
796
+ <div
797
+ data-testid="custom-element"
798
+ tabIndex={0}
799
+ ref={(el) => {
800
+ if (el) {
801
+ registerCustomFocusableElement('customField', el);
802
+ }
803
+ }}
804
+ >
805
+ Custom focusable element
806
+ </div>
807
+ <button type="submit" data-testid="submit">
808
+ Submit
809
+ </button>
810
+ </form>
811
+ );
812
+ }
813
+
814
+ render(<TestForm />);
815
+
816
+ const submitButton = screen.getByTestId('submit');
817
+
818
+ // Submit form to trigger validation errors
819
+ fireEvent.click(submitButton);
820
+
821
+ // Wait for focus to be applied
822
+ await act(async () => {
823
+ await new Promise((resolve) => setTimeout(resolve, 50));
824
+ });
825
+
826
+ // First field should still be focused since it has an error
827
+ const firstNameInput = screen.getByTestId('firstName');
828
+ expect(firstNameInput).toHaveFocus();
829
+ });
830
+
831
+ it('should return an unregister function', () => {
832
+ let registerFunction: any;
833
+
834
+ render(
835
+ <TestFormComponent
836
+ onRegisterElement={(register) => {
837
+ registerFunction = register;
838
+ }}
839
+ />
840
+ );
841
+
842
+ const mockElement = document.createElement('div');
843
+ const unregister = registerFunction('testField', mockElement);
844
+
845
+ expect(unregister).toBeInstanceOf(Function);
846
+ });
847
+
848
+ it('should register custom elements for field array items', async () => {
849
+ function TestFormWithCustomElements() {
850
+ const form = useForm({
851
+ defaultValues: {
852
+ items: [{ customField: '' }],
853
+ },
854
+ shouldFocusError: false,
855
+ });
856
+
857
+ const { fields } = useFieldArray({
858
+ control: form.control,
859
+ name: 'items',
860
+ });
861
+
862
+ const { registerCustomFocusableElement, focusOnError } =
863
+ useFieldFocusManager({
864
+ control: form.control,
865
+ subscribe: form.subscribe,
866
+ setFocus: form.setFocus,
867
+ });
868
+
869
+ return (
870
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
871
+ {fields.map((field, index) => (
872
+ <div key={field.id}>
873
+ <div
874
+ data-testid={`custom-element-${index}`}
875
+ tabIndex={0}
876
+ ref={(el) => {
877
+ if (el) {
878
+ registerCustomFocusableElement(
879
+ `items.${index}.customField`,
880
+ el
881
+ );
882
+ }
883
+ }}
884
+ >
885
+ Custom element {index}
886
+ </div>
887
+ </div>
888
+ ))}
889
+ <button type="submit" data-testid="submit">
890
+ Submit
891
+ </button>
892
+ </form>
893
+ );
894
+ }
895
+
896
+ render(<TestFormWithCustomElements />);
897
+
898
+ const customElement = screen.getByTestId('custom-element-0');
899
+ expect(customElement).toBeInTheDocument();
900
+
901
+ // The custom element should be registered and available for focusing
902
+ expect(customElement.tabIndex).toBe(0);
903
+ });
904
+ });
905
+
906
+ describe('enabled/disabled behavior', () => {
907
+ it('should not focus fields when disabled', async () => {
908
+ render(<TestFormComponent enabled={false} />);
909
+
910
+ const firstNameInput = screen.getByTestId('firstName');
911
+ const submitButton = screen.getByTestId('submit');
912
+
913
+ // Submit form to trigger validation errors
914
+ fireEvent.click(submitButton);
915
+
916
+ // Wait for any potential focus changes
917
+ await act(async () => {
918
+ await new Promise((resolve) => setTimeout(resolve, 50));
919
+ });
920
+
921
+ // No field should be focused since the hook is disabled
922
+ expect(firstNameInput).not.toHaveFocus();
923
+ });
924
+
925
+ it('should not focus field array fields when disabled', async () => {
926
+ render(<TestFieldArrayComponent enabled={false} />);
927
+
928
+ const submitButton = screen.getByTestId('submit');
929
+ fireEvent.click(submitButton);
930
+
931
+ await act(async () => {
932
+ await new Promise((resolve) => setTimeout(resolve, 50));
933
+ });
934
+
935
+ // No field should be focused since the hook is disabled
936
+ const firstUserNameInput = screen.getByTestId('user-0-name');
937
+ expect(firstUserNameInput).not.toHaveFocus();
938
+ });
939
+ });
940
+
941
+ describe('edge cases', () => {
942
+ it('should handle form with no fields', () => {
943
+ function EmptyForm() {
944
+ const form = useForm();
945
+ useFieldFocusManager({
946
+ control: form.control,
947
+ subscribe: form.subscribe,
948
+ setFocus: form.setFocus,
949
+ });
950
+
951
+ return (
952
+ <form>
953
+ <button type="submit">Submit</button>
954
+ </form>
955
+ );
956
+ }
957
+
958
+ expect(() => render(<EmptyForm />)).not.toThrow();
959
+ });
960
+
961
+ it('should handle unregistering custom elements', () => {
962
+ let registerFunction: any;
963
+
964
+ render(
965
+ <TestFormComponent
966
+ onRegisterElement={(register) => {
967
+ registerFunction = register;
968
+ }}
969
+ />
970
+ );
971
+
972
+ const mockElement = document.createElement('div');
973
+ const unregister = registerFunction('testField', mockElement);
974
+
975
+ // Should not throw when unregistering
976
+ expect(() => unregister()).not.toThrow();
977
+ });
978
+
979
+ it('should handle empty field arrays', async () => {
980
+ function EmptyFieldArrayForm() {
981
+ const form = useForm({
982
+ defaultValues: {
983
+ items: [],
984
+ },
985
+ shouldFocusError: false,
986
+ });
987
+
988
+ const { fields } = useFieldArray({
989
+ control: form.control,
990
+ // @ts-expect-error it expects `never`
991
+ name: 'items',
992
+ });
993
+
994
+ useFieldFocusManager({
995
+ control: form.control,
996
+ subscribe: form.subscribe,
997
+ setFocus: form.setFocus,
998
+ });
999
+
1000
+ return (
1001
+ <form onSubmit={form.handleSubmit(() => {})}>
1002
+ {fields.map((field, index) => (
1003
+ <input
1004
+ key={field.id}
1005
+ {...form.register(`items.${index}.title` as any)}
1006
+ data-testid={`item-${index}-title`}
1007
+ />
1008
+ ))}
1009
+ <button type="submit" data-testid="submit">
1010
+ Submit
1011
+ </button>
1012
+ </form>
1013
+ );
1014
+ }
1015
+
1016
+ render(<EmptyFieldArrayForm />);
1017
+
1018
+ const submitButton = screen.getByTestId('submit');
1019
+
1020
+ // Should not throw when submitting form with empty field arrays
1021
+ expect(() => fireEvent.click(submitButton)).not.toThrow();
1022
+
1023
+ await act(async () => {
1024
+ await new Promise((resolve) => setTimeout(resolve, 50));
1025
+ });
1026
+
1027
+ // No errors should occur and no elements should be focused
1028
+ expect(screen.queryByTestId('item-0-title')).not.toBeInTheDocument();
1029
+ });
1030
+
1031
+ it('should handle field arrays with non-sequential indices', async () => {
1032
+ function NonSequentialFieldArrayForm() {
1033
+ const form = useForm({
1034
+ defaultValues: {
1035
+ items: { 0: { title: '' }, 2: { title: '' } },
1036
+ },
1037
+ shouldFocusError: false,
1038
+ });
1039
+
1040
+ const { focusOnError } = useFieldFocusManager({
1041
+ control: form.control,
1042
+ subscribe: form.subscribe,
1043
+ setFocus: form.setFocus,
1044
+ });
1045
+
1046
+ return (
1047
+ <form onSubmit={form.handleSubmit(() => {}, focusOnError)}>
1048
+ <input
1049
+ {...form.register('items.0.title' as any, {
1050
+ required: 'Title required',
1051
+ })}
1052
+ data-testid="item-0-title"
1053
+ />
1054
+ <input
1055
+ {...form.register('items.2.title' as any, {
1056
+ required: 'Title required',
1057
+ })}
1058
+ data-testid="item-2-title"
1059
+ />
1060
+ <button type="submit" data-testid="submit">
1061
+ Submit
1062
+ </button>
1063
+ </form>
1064
+ );
1065
+ }
1066
+
1067
+ render(<NonSequentialFieldArrayForm />);
1068
+
1069
+ const submitButton = screen.getByTestId('submit');
1070
+ fireEvent.click(submitButton);
1071
+
1072
+ // Should focus the first field in DOM order
1073
+ await waitFor(() => {
1074
+ const firstItemInput = screen.getByTestId('item-0-title');
1075
+ expect(firstItemInput).toHaveFocus();
1076
+ });
1077
+ });
1078
+ });
1079
+ });