@10x-media/form-builder 0.1.0-beta.2 → 0.1.0-beta.21

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 (619) hide show
  1. package/CHANGELOG.md +360 -0
  2. package/README.md +7 -5
  3. package/dist/actions/assertNoBlockCollision.js +18 -0
  4. package/dist/actions/assertNoBlockCollision.js.map +1 -0
  5. package/dist/actions/body/converters.d.ts +20 -0
  6. package/dist/actions/body/converters.js +57 -0
  7. package/dist/actions/body/converters.js.map +1 -0
  8. package/dist/actions/body/escapeHtml.d.ts +6 -0
  9. package/dist/actions/body/escapeHtml.js +14 -0
  10. package/dist/actions/body/escapeHtml.js.map +1 -0
  11. package/dist/actions/body/serializeBody.d.ts +55 -0
  12. package/dist/actions/body/serializeBody.js +78 -0
  13. package/dist/actions/body/serializeBody.js.map +1 -0
  14. package/dist/actions/body/serializeSlate.js +31 -0
  15. package/dist/actions/body/serializeSlate.js.map +1 -0
  16. package/dist/actions/body/textOfBody.d.ts +13 -0
  17. package/dist/actions/body/textOfBody.js +35 -0
  18. package/dist/actions/body/textOfBody.js.map +1 -0
  19. package/dist/actions/body/wildcards.d.ts +10 -0
  20. package/dist/actions/body/wildcards.js +33 -0
  21. package/dist/actions/body/wildcards.js.map +1 -0
  22. package/dist/actions/buildActionBlocks.js +12 -9
  23. package/dist/actions/buildActionBlocks.js.map +1 -1
  24. package/dist/actions/builtin/confirmation.js +47 -43
  25. package/dist/actions/builtin/confirmation.js.map +1 -1
  26. package/dist/actions/builtin/emailAction.d.ts +20 -0
  27. package/dist/actions/builtin/emailAction.js +120 -0
  28. package/dist/actions/builtin/emailAction.js.map +1 -0
  29. package/dist/actions/builtin/emailTeam.js +20 -38
  30. package/dist/actions/builtin/emailTeam.js.map +1 -1
  31. package/dist/actions/builtin/index.d.ts +16 -1
  32. package/dist/actions/builtin/index.js +21 -7
  33. package/dist/actions/builtin/index.js.map +1 -1
  34. package/dist/actions/builtin/signedWebhook.js +6 -2
  35. package/dist/actions/builtin/signedWebhook.js.map +1 -1
  36. package/dist/actions/defineAction.d.ts +17 -5
  37. package/dist/actions/defineAction.js.map +1 -1
  38. package/dist/actions/dispatch.js +51 -6
  39. package/dist/actions/dispatch.js.map +1 -1
  40. package/dist/actions/dispatchContext.js +13 -0
  41. package/dist/actions/dispatchContext.js.map +1 -0
  42. package/dist/actions/emailRecipients.d.ts +12 -0
  43. package/dist/actions/emailRecipients.js +146 -0
  44. package/dist/actions/emailRecipients.js.map +1 -0
  45. package/dist/actions/fromAddresses.d.ts +37 -0
  46. package/dist/actions/fromAddresses.js +131 -0
  47. package/dist/actions/fromAddresses.js.map +1 -0
  48. package/dist/actions/recipientSources.d.ts +34 -0
  49. package/dist/actions/recipientSources.js +11 -0
  50. package/dist/actions/recipientSources.js.map +1 -0
  51. package/dist/actions/registry.d.ts +2 -1
  52. package/dist/actions/registry.js +5 -7
  53. package/dist/actions/registry.js.map +1 -1
  54. package/dist/actions/runActions.js +10 -1
  55. package/dist/actions/runActions.js.map +1 -1
  56. package/dist/actions/task.js +47 -16
  57. package/dist/actions/task.js.map +1 -1
  58. package/dist/aggregation/aggregateResponses.d.ts +9 -0
  59. package/dist/aggregation/aggregateResponses.js +8 -14
  60. package/dist/aggregation/aggregateResponses.js.map +1 -1
  61. package/dist/aggregation/resolveResultsRequest.d.ts +41 -6
  62. package/dist/aggregation/resolveResultsRequest.js +97 -11
  63. package/dist/aggregation/resolveResultsRequest.js.map +1 -1
  64. package/dist/calc/computeCalcFields.d.ts +5 -3
  65. package/dist/calc/computeCalcFields.js +6 -4
  66. package/dist/calc/computeCalcFields.js.map +1 -1
  67. package/dist/calc/evaluate.d.ts +26 -3
  68. package/dist/calc/evaluate.js +34 -13
  69. package/dist/calc/evaluate.js.map +1 -1
  70. package/dist/calc/formatCalc.d.ts +11 -0
  71. package/dist/calc/formatCalc.js +35 -0
  72. package/dist/calc/formatCalc.js.map +1 -0
  73. package/dist/calc/formatCalcValue.d.ts +17 -0
  74. package/dist/calc/formatCalcValue.js +17 -0
  75. package/dist/calc/formatCalcValue.js.map +1 -0
  76. package/dist/calc/normalizeCalc.d.ts +17 -3
  77. package/dist/calc/normalizeCalc.js +42 -33
  78. package/dist/calc/normalizeCalc.js.map +1 -1
  79. package/dist/calc/registry.d.ts +43 -0
  80. package/dist/calc/registry.js +27 -0
  81. package/dist/calc/registry.js.map +1 -0
  82. package/dist/calc/resolveCalcContext.d.ts +36 -0
  83. package/dist/calc/resolveCalcContext.js +87 -0
  84. package/dist/calc/resolveCalcContext.js.map +1 -0
  85. package/dist/calc/types.d.ts +25 -4
  86. package/dist/calc/types.js +23 -0
  87. package/dist/calc/types.js.map +1 -0
  88. package/dist/client/ByteSizeField.d.ts +29 -0
  89. package/dist/client/ByteSizeField.js +58 -0
  90. package/dist/client/ByteSizeField.js.map +1 -0
  91. package/dist/client/CalcExpressionBuilder.d.ts +20 -0
  92. package/dist/client/CalcExpressionBuilder.js +890 -0
  93. package/dist/client/CalcExpressionBuilder.js.map +1 -0
  94. package/dist/client/ClosePollButton.d.ts +15 -0
  95. package/dist/client/ClosePollButton.js +80 -0
  96. package/dist/client/ClosePollButton.js.map +1 -0
  97. package/dist/client/CondensedArray.d.ts +15 -0
  98. package/dist/client/CondensedArray.js +97 -0
  99. package/dist/client/CondensedArray.js.map +1 -0
  100. package/dist/client/ConditionBuilder.js +2 -1
  101. package/dist/client/ConditionBuilder.js.map +1 -1
  102. package/dist/client/ConsentBlockLabel.d.ts +15 -0
  103. package/dist/client/ConsentBlockLabel.js +71 -0
  104. package/dist/client/ConsentBlockLabel.js.map +1 -0
  105. package/dist/client/ConsentSourceRowLabel.d.ts +9 -0
  106. package/dist/client/ConsentSourceRowLabel.js +21 -0
  107. package/dist/client/ConsentSourceRowLabel.js.map +1 -0
  108. package/dist/client/EndpointOptionsSelect.d.ts +55 -0
  109. package/dist/client/EndpointOptionsSelect.js +112 -0
  110. package/dist/client/EndpointOptionsSelect.js.map +1 -0
  111. package/dist/client/FieldBlockLabel.d.ts +18 -0
  112. package/dist/client/FieldBlockLabel.js +34 -0
  113. package/dist/client/FieldBlockLabel.js.map +1 -0
  114. package/dist/client/FieldNameSelect.d.ts +37 -0
  115. package/dist/client/FieldNameSelect.js +72 -0
  116. package/dist/client/FieldNameSelect.js.map +1 -0
  117. package/dist/client/FlowBuilder.d.ts +2 -2
  118. package/dist/client/FlowBuilder.js +137 -88
  119. package/dist/client/FlowBuilder.js.map +1 -1
  120. package/dist/client/FormConditionField.js +1 -4
  121. package/dist/client/FormConditionField.js.map +1 -1
  122. package/dist/client/RecipientsSelect.d.ts +37 -0
  123. package/dist/client/RecipientsSelect.js +197 -0
  124. package/dist/client/RecipientsSelect.js.map +1 -0
  125. package/dist/client/RuleDescription.d.ts +21 -0
  126. package/dist/client/RuleDescription.js +19 -0
  127. package/dist/client/RuleDescription.js.map +1 -0
  128. package/dist/client/admin.css +557 -0
  129. package/dist/client/endpointOptions.d.ts +11 -0
  130. package/dist/client/endpointOptions.js +38 -0
  131. package/dist/client/endpointOptions.js.map +1 -0
  132. package/dist/client/flowAuthoring.js +142 -0
  133. package/dist/client/flowAuthoring.js.map +1 -0
  134. package/dist/client/synthesizeClientField.js +21 -10
  135. package/dist/client/synthesizeClientField.js.map +1 -1
  136. package/dist/client/toStaticLabel.js +13 -0
  137. package/dist/client/toStaticLabel.js.map +1 -0
  138. package/dist/collections/buttonFields.d.ts +34 -0
  139. package/dist/collections/buttonFields.js +35 -0
  140. package/dist/collections/buttonFields.js.map +1 -0
  141. package/dist/collections/cells/FieldCountCell.d.ts +15 -0
  142. package/dist/collections/cells/FieldCountCell.js +18 -0
  143. package/dist/collections/cells/FieldCountCell.js.map +1 -0
  144. package/dist/collections/cells/FlowStepsCell.d.ts +14 -0
  145. package/dist/collections/cells/FlowStepsCell.js +17 -0
  146. package/dist/collections/cells/FlowStepsCell.js.map +1 -0
  147. package/dist/collections/formSubmissions.js +114 -28
  148. package/dist/collections/formSubmissions.js.map +1 -1
  149. package/dist/collections/forms.js +449 -112
  150. package/dist/collections/forms.js.map +1 -1
  151. package/dist/collections/formsEndpoints.js +106 -0
  152. package/dist/collections/formsEndpoints.js.map +1 -0
  153. package/dist/collections/redirectFields.d.ts +29 -0
  154. package/dist/collections/settingsFields.d.ts +31 -0
  155. package/dist/collections/settingsFields.js +45 -0
  156. package/dist/collections/settingsFields.js.map +1 -0
  157. package/dist/conditions/conditionType.js +9 -2
  158. package/dist/conditions/conditionType.js.map +1 -1
  159. package/dist/conditions/evaluate.js +1 -1
  160. package/dist/conditions/evaluate.js.map +1 -1
  161. package/dist/conditions/fieldTypes.d.ts +3 -1
  162. package/dist/conditions/fieldTypes.js +4 -1
  163. package/dist/conditions/fieldTypes.js.map +1 -1
  164. package/dist/conditions/normalizeConditions.js +20 -6
  165. package/dist/conditions/normalizeConditions.js.map +1 -1
  166. package/dist/consent/applyConsentStatements.d.ts +14 -0
  167. package/dist/consent/applyConsentStatements.js +17 -0
  168. package/dist/consent/applyConsentStatements.js.map +1 -0
  169. package/dist/consent/captureConsent.d.ts +39 -11
  170. package/dist/consent/captureConsent.js +63 -13
  171. package/dist/consent/captureConsent.js.map +1 -1
  172. package/dist/consent/consentSourcesField.d.ts +66 -0
  173. package/dist/consent/consentSourcesField.js +98 -0
  174. package/dist/consent/consentSourcesField.js.map +1 -0
  175. package/dist/consent/effectiveStatement.js +16 -0
  176. package/dist/consent/effectiveStatement.js.map +1 -0
  177. package/dist/consent/resolveConsentEntries.d.ts +24 -0
  178. package/dist/consent/resolveConsentEntries.js +40 -0
  179. package/dist/consent/resolveConsentEntries.js.map +1 -0
  180. package/dist/consent/resolveConsentSourcesRequest.d.ts +37 -0
  181. package/dist/consent/resolveConsentSourcesRequest.js +54 -0
  182. package/dist/consent/resolveConsentSourcesRequest.js.map +1 -0
  183. package/dist/consent/resolveConsentStatements.d.ts +45 -0
  184. package/dist/consent/resolveConsentStatements.js +46 -0
  185. package/dist/consent/resolveConsentStatements.js.map +1 -0
  186. package/dist/consent/resolvePublishedVersionRef.d.ts +17 -11
  187. package/dist/consent/resolvePublishedVersionRef.js +13 -10
  188. package/dist/consent/resolvePublishedVersionRef.js.map +1 -1
  189. package/dist/consent/types.d.ts +69 -0
  190. package/dist/context/formContext.d.ts +30 -0
  191. package/dist/context/formContext.js +54 -0
  192. package/dist/context/formContext.js.map +1 -0
  193. package/dist/email/departments.d.ts +59 -0
  194. package/dist/email/departments.js +87 -0
  195. package/dist/email/departments.js.map +1 -0
  196. package/dist/email/departmentsField.d.ts +53 -0
  197. package/dist/email/departmentsField.js +73 -0
  198. package/dist/email/departmentsField.js.map +1 -0
  199. package/dist/exports/client.d.ts +14 -1
  200. package/dist/exports/client.js +14 -1
  201. package/dist/exports/i18n.d.ts +5 -2
  202. package/dist/exports/i18n.js +5 -2
  203. package/dist/exports/react.d.ts +34 -10
  204. package/dist/exports/react.js +24 -4
  205. package/dist/exports/rsc.d.ts +10 -1
  206. package/dist/exports/rsc.js +10 -1
  207. package/dist/exports/types.d.ts +20 -12
  208. package/dist/fields/buildFieldBlocks.js +46 -25
  209. package/dist/fields/buildFieldBlocks.js.map +1 -1
  210. package/dist/fields/builtin/calculation.d.ts +17 -0
  211. package/dist/fields/builtin/calculation.js +193 -18
  212. package/dist/fields/builtin/calculation.js.map +1 -1
  213. package/dist/fields/builtin/checkbox.js +23 -0
  214. package/dist/fields/builtin/checkbox.js.map +1 -1
  215. package/dist/fields/builtin/consent.js +49 -14
  216. package/dist/fields/builtin/consent.js.map +1 -1
  217. package/dist/fields/builtin/country.d.ts +13 -0
  218. package/dist/fields/builtin/country.js +30 -0
  219. package/dist/fields/builtin/country.js.map +1 -0
  220. package/dist/fields/builtin/date.js +31 -0
  221. package/dist/fields/builtin/date.js.map +1 -0
  222. package/dist/fields/builtin/email.js +8 -1
  223. package/dist/fields/builtin/email.js.map +1 -1
  224. package/dist/fields/builtin/file.d.ts +15 -0
  225. package/dist/fields/builtin/file.js +95 -8
  226. package/dist/fields/builtin/file.js.map +1 -1
  227. package/dist/fields/builtin/index.d.ts +30 -0
  228. package/dist/fields/builtin/index.js +37 -10
  229. package/dist/fields/builtin/index.js.map +1 -1
  230. package/dist/fields/builtin/message.js +30 -0
  231. package/dist/fields/builtin/message.js.map +1 -0
  232. package/dist/fields/builtin/repeater.js +8 -3
  233. package/dist/fields/builtin/repeater.js.map +1 -1
  234. package/dist/fields/builtin/select.js +28 -4
  235. package/dist/fields/builtin/select.js.map +1 -1
  236. package/dist/fields/builtin/state.d.ts +13 -0
  237. package/dist/fields/builtin/state.js +30 -0
  238. package/dist/fields/builtin/state.js.map +1 -0
  239. package/dist/fields/builtin/text.js +7 -0
  240. package/dist/fields/builtin/text.js.map +1 -1
  241. package/dist/fields/data/regions.d.ts +21 -0
  242. package/dist/fields/data/regions.js +1238 -0
  243. package/dist/fields/data/regions.js.map +1 -0
  244. package/dist/fields/fieldKey.d.ts +15 -0
  245. package/dist/fields/fieldKey.js +16 -0
  246. package/dist/fields/fieldKey.js.map +1 -0
  247. package/dist/fields/fieldNamesOfType.js +30 -0
  248. package/dist/fields/fieldNamesOfType.js.map +1 -0
  249. package/dist/fields/instanceOptions.js +20 -0
  250. package/dist/fields/instanceOptions.js.map +1 -0
  251. package/dist/fields/localizedIf.d.ts +13 -0
  252. package/dist/fields/localizedIf.js +12 -0
  253. package/dist/fields/localizedIf.js.map +1 -0
  254. package/dist/fields/registry.d.ts +3 -1
  255. package/dist/fields/registry.js +23 -8
  256. package/dist/fields/registry.js.map +1 -1
  257. package/dist/fields/sharedConfig.js +125 -59
  258. package/dist/fields/sharedConfig.js.map +1 -1
  259. package/dist/fields/types.d.ts +78 -9
  260. package/dist/flow/engine.d.ts +6 -4
  261. package/dist/flow/engine.js +11 -6
  262. package/dist/flow/engine.js.map +1 -1
  263. package/dist/flow/normalizeFlow.js +28 -9
  264. package/dist/flow/normalizeFlow.js.map +1 -1
  265. package/dist/flow/stepLabel.js +15 -0
  266. package/dist/flow/stepLabel.js.map +1 -0
  267. package/dist/flow/types.d.ts +12 -3
  268. package/dist/flow/types.js +11 -0
  269. package/dist/flow/types.js.map +1 -0
  270. package/dist/form/pollState.d.ts +23 -0
  271. package/dist/form/pollState.js +17 -0
  272. package/dist/form/pollState.js.map +1 -0
  273. package/dist/form/toFormDocument.d.ts +110 -0
  274. package/dist/form/toFormDocument.js +89 -0
  275. package/dist/form/toFormDocument.js.map +1 -0
  276. package/dist/form/types.d.ts +73 -0
  277. package/dist/index.d.ts +67 -61
  278. package/dist/index.js +120 -25
  279. package/dist/index.js.map +1 -1
  280. package/dist/options.d.ts +281 -0
  281. package/dist/plugin/applyRegistryConfig.d.ts +11 -0
  282. package/dist/plugin/applyRegistryConfig.js +20 -0
  283. package/dist/plugin/applyRegistryConfig.js.map +1 -0
  284. package/dist/plugin/customState.js +26 -0
  285. package/dist/plugin/customState.js.map +1 -0
  286. package/dist/plugin/registerCollections.js +43 -40
  287. package/dist/plugin/registerCollections.js.map +1 -1
  288. package/dist/plugin/uploadsCollection.d.ts +16 -0
  289. package/dist/plugin/uploadsCollection.js +53 -0
  290. package/dist/plugin/uploadsCollection.js.map +1 -0
  291. package/dist/poll/applyPollOptions.js +18 -0
  292. package/dist/poll/applyPollOptions.js.map +1 -0
  293. package/dist/poll/buildPollOptionSourceFields.js +50 -0
  294. package/dist/poll/buildPollOptionSourceFields.js.map +1 -0
  295. package/dist/poll/closeJob.d.ts +53 -0
  296. package/dist/poll/closeJob.js +121 -0
  297. package/dist/poll/closeJob.js.map +1 -0
  298. package/dist/poll/definePollOptionSource.d.ts +44 -0
  299. package/dist/poll/definePollOptionSource.js +6 -0
  300. package/dist/poll/definePollOptionSource.js.map +1 -0
  301. package/dist/poll/definePollType.d.ts +34 -0
  302. package/dist/poll/definePollType.js +6 -0
  303. package/dist/poll/definePollType.js.map +1 -0
  304. package/dist/poll/effectivePollOptions.d.ts +38 -0
  305. package/dist/poll/effectivePollOptions.js +64 -0
  306. package/dist/poll/effectivePollOptions.js.map +1 -0
  307. package/dist/poll/mostVoted.d.ts +21 -0
  308. package/dist/poll/mostVoted.js +32 -0
  309. package/dist/poll/mostVoted.js.map +1 -0
  310. package/dist/poll/outcomeBeforeChange.js +91 -0
  311. package/dist/poll/outcomeBeforeChange.js.map +1 -0
  312. package/dist/poll/outcomeFields.d.ts +38 -0
  313. package/dist/poll/outcomeFields.js +52 -0
  314. package/dist/poll/outcomeFields.js.map +1 -0
  315. package/dist/poll/pollTypeRegistry.d.ts +34 -0
  316. package/dist/poll/pollTypeRegistry.js +69 -0
  317. package/dist/poll/pollTypeRegistry.js.map +1 -0
  318. package/dist/poll/registry.d.ts +17 -0
  319. package/dist/poll/registry.js +12 -0
  320. package/dist/poll/registry.js.map +1 -0
  321. package/dist/poll/resolvePollCloseRequest.js +106 -0
  322. package/dist/poll/resolvePollCloseRequest.js.map +1 -0
  323. package/dist/poll/resolvePollOptions.d.ts +29 -0
  324. package/dist/poll/resolvePollOptions.js +52 -0
  325. package/dist/poll/resolvePollOptions.js.map +1 -0
  326. package/dist/poll/resolvePollOptionsRequest.js +50 -0
  327. package/dist/poll/resolvePollOptionsRequest.js.map +1 -0
  328. package/dist/poll/resolvePollOutcome.d.ts +40 -0
  329. package/dist/poll/resolvePollOutcome.js +90 -0
  330. package/dist/poll/resolvePollOutcome.js.map +1 -0
  331. package/dist/poll/resultsField.js +21 -0
  332. package/dist/poll/resultsField.js.map +1 -0
  333. package/dist/poll/votes/aggregateFromVotes.d.ts +27 -0
  334. package/dist/poll/votes/aggregateFromVotes.js +54 -0
  335. package/dist/poll/votes/aggregateFromVotes.js.map +1 -0
  336. package/dist/poll/votes/answerValues.js +16 -0
  337. package/dist/poll/votes/answerValues.js.map +1 -0
  338. package/dist/poll/votes/bumpPollVote.js +88 -0
  339. package/dist/poll/votes/bumpPollVote.js.map +1 -0
  340. package/dist/poll/votes/recountPollVotes.d.ts +20 -0
  341. package/dist/poll/votes/recountPollVotes.js +63 -0
  342. package/dist/poll/votes/recountPollVotes.js.map +1 -0
  343. package/dist/poll/votes/voteTallyHook.js +76 -0
  344. package/dist/poll/votes/voteTallyHook.js.map +1 -0
  345. package/dist/poll/votes/votesCollection.d.ts +19 -0
  346. package/dist/poll/votes/votesCollection.js +89 -0
  347. package/dist/poll/votes/votesCollection.js.map +1 -0
  348. package/dist/prefill/valuesFromSearchParams.js +5 -9
  349. package/dist/prefill/valuesFromSearchParams.js.map +1 -1
  350. package/dist/presentations/types.d.ts +3 -2
  351. package/dist/react/Form.d.ts +77 -35
  352. package/dist/react/Form.js +368 -222
  353. package/dist/react/Form.js.map +1 -1
  354. package/dist/react/FormContext.d.ts +51 -1
  355. package/dist/react/FormContext.js.map +1 -1
  356. package/dist/react/FormControls.d.ts +55 -0
  357. package/dist/react/FormControls.js +56 -0
  358. package/dist/react/FormControls.js.map +1 -0
  359. package/dist/react/FormFields.d.ts +18 -0
  360. package/dist/react/FormFields.js +114 -0
  361. package/dist/react/FormFields.js.map +1 -0
  362. package/dist/react/FormLayout.d.ts +4 -2
  363. package/dist/react/FormLayout.js +3 -2
  364. package/dist/react/FormLayout.js.map +1 -1
  365. package/dist/react/FormResults.d.ts +8 -3
  366. package/dist/react/FormResults.js +50 -29
  367. package/dist/react/FormResults.js.map +1 -1
  368. package/dist/react/FormSteps.d.ts +17 -0
  369. package/dist/react/FormSteps.js +35 -0
  370. package/dist/react/FormSteps.js.map +1 -0
  371. package/dist/react/Poll.d.ts +40 -6
  372. package/dist/react/Poll.js +137 -33
  373. package/dist/react/Poll.js.map +1 -1
  374. package/dist/react/adapters.d.ts +35 -0
  375. package/dist/react/adapters.js +11 -0
  376. package/dist/react/adapters.js.map +1 -0
  377. package/dist/react/captcha/HcaptchaCaptcha.d.ts +31 -0
  378. package/dist/react/captcha/HcaptchaCaptcha.js +53 -0
  379. package/dist/react/captcha/HcaptchaCaptcha.js.map +1 -0
  380. package/dist/react/captcha/RecaptchaCaptcha.d.ts +44 -0
  381. package/dist/react/captcha/RecaptchaCaptcha.js +93 -0
  382. package/dist/react/captcha/RecaptchaCaptcha.js.map +1 -0
  383. package/dist/react/captcha/TurnstileCaptcha.d.ts +31 -0
  384. package/dist/react/captcha/TurnstileCaptcha.js +53 -0
  385. package/dist/react/captcha/TurnstileCaptcha.js.map +1 -0
  386. package/dist/react/captcha/types.d.ts +8 -0
  387. package/dist/react/captcha/useCaptchaScript.js +63 -0
  388. package/dist/react/captcha/useCaptchaScript.js.map +1 -0
  389. package/dist/react/captcha/vendors.js +8 -0
  390. package/dist/react/captcha/vendors.js.map +1 -0
  391. package/dist/react/contract.d.ts +2 -3
  392. package/dist/react/contract.js.map +1 -1
  393. package/dist/react/fetchResults.d.ts +1 -1
  394. package/dist/react/fetchResults.js +1 -1
  395. package/dist/react/fetchResults.js.map +1 -1
  396. package/dist/react/presentation/DialogSurface.js +1 -4
  397. package/dist/react/presentation/DialogSurface.js.map +1 -1
  398. package/dist/react/primitives/Checkbox.d.ts +6 -2
  399. package/dist/react/primitives/Checkbox.js +4 -2
  400. package/dist/react/primitives/Checkbox.js.map +1 -1
  401. package/dist/react/primitives/ChoiceGroup.d.ts +40 -0
  402. package/dist/react/primitives/ChoiceGroup.js +33 -0
  403. package/dist/react/primitives/ChoiceGroup.js.map +1 -0
  404. package/dist/react/primitives/FieldShell.d.ts +13 -5
  405. package/dist/react/primitives/FieldShell.js +35 -32
  406. package/dist/react/primitives/FieldShell.js.map +1 -1
  407. package/dist/react/primitives/Input.d.ts +4 -2
  408. package/dist/react/primitives/Input.js +2 -1
  409. package/dist/react/primitives/Input.js.map +1 -1
  410. package/dist/react/renderers/calculation.js +7 -5
  411. package/dist/react/renderers/calculation.js.map +1 -1
  412. package/dist/react/renderers/checkbox.js +3 -5
  413. package/dist/react/renderers/checkbox.js.map +1 -1
  414. package/dist/react/renderers/consent.js +84 -36
  415. package/dist/react/renderers/consent.js.map +1 -1
  416. package/dist/react/renderers/date.js +33 -0
  417. package/dist/react/renderers/date.js.map +1 -0
  418. package/dist/react/renderers/email.js +4 -5
  419. package/dist/react/renderers/email.js.map +1 -1
  420. package/dist/react/renderers/file.js +29 -14
  421. package/dist/react/renderers/file.js.map +1 -1
  422. package/dist/react/renderers/index.js +7 -0
  423. package/dist/react/renderers/index.js.map +1 -1
  424. package/dist/react/renderers/message.js +41 -0
  425. package/dist/react/renderers/message.js.map +1 -0
  426. package/dist/react/renderers/number.js +1 -4
  427. package/dist/react/renderers/number.js.map +1 -1
  428. package/dist/react/renderers/region.js +43 -0
  429. package/dist/react/renderers/region.js.map +1 -0
  430. package/dist/react/renderers/repeater.js +32 -14
  431. package/dist/react/renderers/repeater.js.map +1 -1
  432. package/dist/react/renderers/select.js +21 -6
  433. package/dist/react/renderers/select.js.map +1 -1
  434. package/dist/react/renderers/text.js +4 -5
  435. package/dist/react/renderers/text.js.map +1 -1
  436. package/dist/react/renderers/textarea.js +1 -4
  437. package/dist/react/renderers/textarea.js.map +1 -1
  438. package/dist/react/state.d.ts +46 -3
  439. package/dist/react/state.js +73 -10
  440. package/dist/react/state.js.map +1 -1
  441. package/dist/react/submitForm.js +1 -1
  442. package/dist/react/submitForm.js.map +1 -1
  443. package/dist/react/uploadFile.d.ts +2 -2
  444. package/dist/react/uploadFile.js +1 -1
  445. package/dist/react/uploadFile.js.map +1 -1
  446. package/dist/react/useCalcValues.d.ts +10 -0
  447. package/dist/react/useCalcValues.js +13 -0
  448. package/dist/react/useCalcValues.js.map +1 -0
  449. package/dist/react/useField.d.ts +0 -1
  450. package/dist/react/useField.js +7 -6
  451. package/dist/react/useField.js.map +1 -1
  452. package/dist/react/useFormState.d.ts +1 -1
  453. package/dist/react/useFormState.js +1 -1
  454. package/dist/react/useFormState.js.map +1 -1
  455. package/dist/react/validateField.js +3 -6
  456. package/dist/react/validateField.js.map +1 -1
  457. package/dist/recall/interpolate.d.ts +4 -3
  458. package/dist/recall/interpolate.js +5 -4
  459. package/dist/recall/interpolate.js.map +1 -1
  460. package/dist/recall/resolver.d.ts +1 -1
  461. package/dist/recall/resolver.js +15 -3
  462. package/dist/recall/resolver.js.map +1 -1
  463. package/dist/spam/captcha.d.ts +4 -3
  464. package/dist/spam/captcha.js +4 -3
  465. package/dist/spam/captcha.js.map +1 -1
  466. package/dist/spam/clientIp.js +9 -0
  467. package/dist/spam/clientIp.js.map +1 -0
  468. package/dist/spam/constants.js +13 -1
  469. package/dist/spam/constants.js.map +1 -1
  470. package/dist/spam/identify.js +3 -6
  471. package/dist/spam/identify.js.map +1 -1
  472. package/dist/spam/providers/hcaptcha.d.ts +17 -0
  473. package/dist/spam/providers/hcaptcha.js +18 -0
  474. package/dist/spam/providers/hcaptcha.js.map +1 -0
  475. package/dist/spam/providers/recaptcha.d.ts +23 -0
  476. package/dist/spam/providers/recaptcha.js +23 -0
  477. package/dist/spam/providers/recaptcha.js.map +1 -0
  478. package/dist/spam/providers/siteverify.js +34 -0
  479. package/dist/spam/providers/siteverify.js.map +1 -0
  480. package/dist/spam/providers/turnstile.d.ts +17 -0
  481. package/dist/spam/providers/turnstile.js +18 -0
  482. package/dist/spam/providers/turnstile.js.map +1 -0
  483. package/dist/spam/resolveSpam.js +2 -1
  484. package/dist/spam/resolveSpam.js.map +1 -1
  485. package/dist/spam/spamGuard.js +25 -11
  486. package/dist/spam/spamGuard.js.map +1 -1
  487. package/dist/spam/types.d.ts +19 -4
  488. package/dist/submissions/SubmissionAnswers.js +6 -2
  489. package/dist/submissions/SubmissionAnswers.js.map +1 -1
  490. package/dist/submissions/SubmissionAnswersClient.js +100 -64
  491. package/dist/submissions/SubmissionAnswersClient.js.map +1 -1
  492. package/dist/submissions/coerceBoolean.js +14 -0
  493. package/dist/submissions/coerceBoolean.js.map +1 -0
  494. package/dist/submissions/createSubmission.d.ts +36 -0
  495. package/dist/submissions/createSubmission.js +26 -0
  496. package/dist/submissions/createSubmission.js.map +1 -0
  497. package/dist/submissions/formIdOf.js +13 -0
  498. package/dist/submissions/formIdOf.js.map +1 -0
  499. package/dist/submissions/resolveVotedSubmission.d.ts +27 -0
  500. package/dist/submissions/resolveVotedSubmission.js +51 -0
  501. package/dist/submissions/resolveVotedSubmission.js.map +1 -0
  502. package/dist/submissions/runSubmission.d.ts +10 -0
  503. package/dist/submissions/runSubmission.js +104 -54
  504. package/dist/submissions/runSubmission.js.map +1 -1
  505. package/dist/submissions/types.d.ts +11 -4
  506. package/dist/submissions/validateSubmission.js +99 -13
  507. package/dist/submissions/validateSubmission.js.map +1 -1
  508. package/dist/submissions/verifyContext.js +35 -0
  509. package/dist/submissions/verifyContext.js.map +1 -0
  510. package/dist/submissions/voteChangeEndpoint.js +105 -0
  511. package/dist/submissions/voteChangeEndpoint.js.map +1 -0
  512. package/dist/submissions/votedCookie.d.ts +15 -0
  513. package/dist/submissions/votedCookie.js +74 -0
  514. package/dist/submissions/votedCookie.js.map +1 -0
  515. package/dist/translations/clientRuntimeKeys.d.ts +17 -0
  516. package/dist/translations/clientRuntimeKeys.js +48 -0
  517. package/dist/translations/clientRuntimeKeys.js.map +1 -0
  518. package/dist/translations/de.d.ts +12 -0
  519. package/dist/translations/de.js +380 -0
  520. package/dist/translations/de.js.map +1 -0
  521. package/dist/translations/en.js +250 -28
  522. package/dist/translations/en.js.map +1 -1
  523. package/dist/translations/index.d.ts +14 -5
  524. package/dist/translations/index.js +14 -3
  525. package/dist/translations/index.js.map +1 -1
  526. package/dist/translations/keys.d.ts +245 -23
  527. package/dist/translations/keys.js +246 -24
  528. package/dist/translations/keys.js.map +1 -1
  529. package/dist/translations/makeTranslate.d.ts +7 -3
  530. package/dist/translations/makeTranslate.js +12 -3
  531. package/dist/translations/makeTranslate.js.map +1 -1
  532. package/dist/translations/server.js +8 -1
  533. package/dist/translations/server.js.map +1 -1
  534. package/dist/uploads/captureFileRef.d.ts +10 -3
  535. package/dist/uploads/captureFileRef.js +18 -9
  536. package/dist/uploads/captureFileRef.js.map +1 -1
  537. package/dist/uploads/formatBytes.d.ts +9 -0
  538. package/dist/uploads/formatBytes.js +25 -0
  539. package/dist/uploads/formatBytes.js.map +1 -0
  540. package/dist/uploads/resolveFileRef.js +3 -2
  541. package/dist/uploads/resolveFileRef.js.map +1 -1
  542. package/dist/uploads/types.d.ts +1 -2
  543. package/dist/validation/buildRuleBlocks.js +18 -17
  544. package/dist/validation/buildRuleBlocks.js.map +1 -1
  545. package/dist/validation/builtin/email.js +2 -1
  546. package/dist/validation/builtin/email.js.map +1 -1
  547. package/dist/validation/builtin/index.d.ts +14 -0
  548. package/dist/validation/builtin/index.js +14 -1
  549. package/dist/validation/builtin/index.js.map +1 -1
  550. package/dist/validation/builtin/integer.js +15 -0
  551. package/dist/validation/builtin/integer.js.map +1 -0
  552. package/dist/validation/builtin/matchesField.js +3 -7
  553. package/dist/validation/builtin/matchesField.js.map +1 -1
  554. package/dist/validation/builtin/max.js +1 -0
  555. package/dist/validation/builtin/max.js.map +1 -1
  556. package/dist/validation/builtin/maxDate.js +24 -0
  557. package/dist/validation/builtin/maxDate.js.map +1 -0
  558. package/dist/validation/builtin/maxLength.js +1 -0
  559. package/dist/validation/builtin/maxLength.js.map +1 -1
  560. package/dist/validation/builtin/min.js +1 -0
  561. package/dist/validation/builtin/min.js.map +1 -1
  562. package/dist/validation/builtin/minDate.js +24 -0
  563. package/dist/validation/builtin/minDate.js.map +1 -0
  564. package/dist/validation/builtin/minLength.js +1 -0
  565. package/dist/validation/builtin/minLength.js.map +1 -1
  566. package/dist/validation/builtin/notAlreadySubmitted.js +5 -1
  567. package/dist/validation/builtin/notAlreadySubmitted.js.map +1 -1
  568. package/dist/validation/builtin/oneOf.js +1 -0
  569. package/dist/validation/builtin/oneOf.js.map +1 -1
  570. package/dist/validation/builtin/pattern.js +11 -2
  571. package/dist/validation/builtin/pattern.js.map +1 -1
  572. package/dist/validation/builtin/url.js +1 -0
  573. package/dist/validation/builtin/url.js.map +1 -1
  574. package/dist/validation/builtin/validateDateBound.js +18 -0
  575. package/dist/validation/builtin/validateDateBound.js.map +1 -0
  576. package/dist/validation/builtin/validateRegexParams.js +44 -0
  577. package/dist/validation/builtin/validateRegexParams.js.map +1 -0
  578. package/dist/validation/emailPattern.js +10 -0
  579. package/dist/validation/emailPattern.js.map +1 -0
  580. package/dist/validation/fieldTargetParam.d.ts +22 -0
  581. package/dist/validation/fieldTargetParam.js +38 -0
  582. package/dist/validation/fieldTargetParam.js.map +1 -0
  583. package/dist/validation/registry.d.ts +2 -1
  584. package/dist/validation/registry.js +2 -9
  585. package/dist/validation/registry.js.map +1 -1
  586. package/dist/validation/runValidation.js +8 -29
  587. package/dist/validation/runValidation.js.map +1 -1
  588. package/dist/validation/types.d.ts +5 -11
  589. package/dist/validation/validateUrl.js +22 -0
  590. package/dist/validation/validateUrl.js.map +1 -0
  591. package/package.json +14 -6
  592. package/styles/form-builder.css +94 -190
  593. package/dist/collections/uploads.d.ts +0 -30
  594. package/dist/collections/uploads.js +0 -55
  595. package/dist/collections/uploads.js.map +0 -1
  596. package/dist/consent/buildConsentSourceConfig.js +0 -49
  597. package/dist/consent/buildConsentSourceConfig.js.map +0 -1
  598. package/dist/consent/builtin/index.d.ts +0 -7
  599. package/dist/consent/builtin/index.js +0 -11
  600. package/dist/consent/builtin/index.js.map +0 -1
  601. package/dist/consent/builtin/pageReference.js +0 -75
  602. package/dist/consent/builtin/pageReference.js.map +0 -1
  603. package/dist/consent/builtin/static.js +0 -44
  604. package/dist/consent/builtin/static.js.map +0 -1
  605. package/dist/consent/defineConsentSource.d.ts +0 -35
  606. package/dist/consent/defineConsentSource.js +0 -6
  607. package/dist/consent/defineConsentSource.js.map +0 -1
  608. package/dist/consent/registry.d.ts +0 -16
  609. package/dist/consent/registry.js +0 -16
  610. package/dist/consent/registry.js.map +0 -1
  611. package/dist/consent/resolveConsentLinks.d.ts +0 -19
  612. package/dist/consent/resolveConsentLinks.js +0 -26
  613. package/dist/consent/resolveConsentLinks.js.map +0 -1
  614. package/dist/presentations/registry.d.ts +0 -15
  615. package/dist/presentations/registry.js +0 -15
  616. package/dist/presentations/registry.js.map +0 -1
  617. package/dist/react/toFormDocument.d.ts +0 -24
  618. package/dist/react/toFormDocument.js +0 -22
  619. package/dist/react/toFormDocument.js.map +0 -1
@@ -1,93 +1,115 @@
1
1
  "use client";
2
+ import { keys } from "../translations/keys.js";
2
3
  import { interpolate } from "../recall/interpolate.js";
4
+ import { serializeBody } from "../actions/body/serializeBody.js";
3
5
  import { noopEventSink } from "../events/noopSink.js";
4
- import { CAPTCHA_TOKEN_KEY } from "../spam/constants.js";
5
- import { defaultPresentationDescriptors } from "../presentations/defaults.js";
6
+ import { fieldKey, isNamedField } from "../fields/fieldKey.js";
6
7
  import { calcExpressionOf, computeCalcFields } from "../calc/computeCalcFields.js";
8
+ import { CAPTCHA_TOKEN_KEY, CONTEXT_KEY, HONEYPOT_VALUE_KEY } from "../spam/constants.js";
7
9
  import { evaluateCondition } from "../conditions/evaluate.js";
10
+ import { resolveMessage } from "../validation/message.js";
8
11
  import { en } from "../translations/en.js";
9
- import { buildRecallResolver } from "../recall/resolver.js";
12
+ import { defaultPresentationDescriptors } from "../presentations/defaults.js";
13
+ import { buildRecallResolver, descriptorsFor } from "../recall/resolver.js";
10
14
  import { firstStepId, isTerminalStepId, resolveNextStepId, stepFieldNames } from "../flow/engine.js";
11
15
  import { cn } from "./cn.js";
12
16
  import { makeTranslate } from "../translations/makeTranslate.js";
17
+ import { defaultNavigate } from "./adapters.js";
13
18
  import { emitFormEvent } from "./events.js";
14
19
  import { FormContext } from "./FormContext.js";
15
- import { FormLayout, widthProps } from "./FormLayout.js";
20
+ import { FormControls } from "./FormControls.js";
21
+ import { DEFAULT_STEP_ID, formReducer, initialFormState, seedFieldValues } from "./state.js";
22
+ import { FormFields } from "./FormFields.js";
16
23
  import { Honeypot } from "./Honeypot.js";
17
24
  import { defaultPresentations } from "./presentation/presentations.js";
18
25
  import { resolvePresentations } from "./presentation/registry.js";
19
- import { applyRecall } from "./recall.js";
20
26
  import { resolveRenderers } from "./registry.js";
21
- import { useField } from "./useField.js";
22
27
  import { defaultRenderers } from "./renderers/index.js";
23
28
  import { buildFieldTypeRegistry, buildValidationRuleRegistry, visibleFields } from "./resolveForm.js";
24
- import { formReducer, initialFormState } from "./state.js";
25
29
  import { submitForm } from "./submitForm.js";
26
30
  import { validateFieldValue } from "./validateField.js";
27
- import { createElement, useCallback, useEffect, useId, useMemo, useReducer, useRef, useState } from "react";
28
- import { jsx, jsxs } from "react/jsx-runtime";
31
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
32
+ import { useCallback, useEffect, useMemo, useReducer, useRef, useState } from "react";
29
33
  //#region src/react/Form.tsx
30
34
  const isEmpty = (value) => value == null || value === "" || Array.isArray(value) && value.length === 0;
31
- const FIELD_WIDTHS = new Set([
32
- "full",
33
- "half",
34
- "third",
35
- "twoThirds"
36
- ]);
37
- const FieldHost = ({ field, renderer, locale, t }) => {
38
- const id = useId();
39
- const { value, errors, warnings, setValue, onBlur } = useField(field.name);
40
- return createElement(renderer, {
41
- field,
42
- id,
43
- name: field.name,
44
- value,
45
- onChange: setValue,
46
- onBlur,
47
- errors,
48
- warnings,
49
- required: Boolean(field.required),
50
- locale,
51
- t
52
- });
35
+ /** Visually hidden but screen-reader-announced, for the "Step X of Y" live region (no host CSS required). */
36
+ const SR_ONLY = {
37
+ position: "absolute",
38
+ width: 1,
39
+ height: 1,
40
+ padding: 0,
41
+ margin: -1,
42
+ overflow: "hidden",
43
+ clip: "rect(0, 0, 0, 0)",
44
+ whiteSpace: "nowrap",
45
+ border: 0
53
46
  };
54
- /** Hosts a derived (calc) field: read-only, value supplied from `effectiveValues`, never bound via `useField`. */
55
- const CalcFieldHost = ({ field, renderer, value, locale, t }) => {
56
- return createElement(renderer, {
57
- field,
58
- id: useId(),
59
- name: field.name,
60
- value,
61
- onChange: () => {},
62
- onBlur: () => {},
63
- errors: [],
64
- warnings: [],
65
- required: false,
66
- disabled: true,
67
- locale,
68
- t
69
- });
47
+ /** The base field name of an error key: the part before a repeater composite suffix (`name[0].sub`). */
48
+ const baseFieldKey = (key) => {
49
+ const bracket = key.indexOf("[");
50
+ return bracket === -1 ? key : key.slice(0, bracket);
51
+ };
52
+ /** The id of the first flow step (in order) that owns an errored field, or undefined when none does. */
53
+ const firstStepWithError = (flow, errors) => {
54
+ const errored = new Set(Object.keys(errors).map(baseFieldKey));
55
+ return flow.steps.find((flowStep) => flowStep.fields.some((key) => errored.has(key)))?.id;
56
+ };
57
+ /** The first focusable element under `root` that a step transition should land on (skips hidden/honeypot). */
58
+ const focusFirstIn = (root, selector) => {
59
+ (root?.querySelector(selector))?.focus();
70
60
  };
61
+ /** A stored button label counts only when it is a non-empty string; anything else falls through. */
62
+ const storedLabel = (value) => typeof value === "string" && value.length > 0 ? value : void 0;
71
63
  /** The headless form controller: state, progressive client validation, conditional visibility, submission, events. */
72
- const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSuccess, onError, events, t, locale = "en", layout, submitLabel = "Submit", nextLabel = "Next", backLabel = "Back", closeLabel = "Close", successMessage = "Thank you.", presentation, presentations, onClose, title, initialValues, honeypot, captchaToken, children, className, renderSubmit, renderNext, renderBack, submitButtonClassName, nextButtonClassName, backButtonClassName }) => {
64
+ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSuccess, onError, converters, successBehavior = "replace", calcFunctions, events, t, locale = "en", layout, submitLabel, nextLabel, prevLabel, closeLabel, successMessage, presentation, presentations, onClose, title, initialValues, honeypot, captchaToken, context, children, header, className, renderSubmit, renderNext, renderBack, submitButtonClassName, nextButtonClassName, backButtonClassName, adapters }) => {
73
65
  const honeypotName = honeypot === false ? null : honeypot?.name ?? "website";
74
66
  const honeypotRef = useRef(null);
75
67
  const registry = useMemo(() => buildFieldTypeRegistry(fieldTypes), [fieldTypes]);
76
68
  const ruleRegistry = useMemo(() => buildValidationRuleRegistry(rules), [rules]);
77
69
  const rendererRegistry = useMemo(() => resolveRenderers(defaultRenderers, renderers), [renderers]);
78
70
  const presentationRegistry = useMemo(() => resolvePresentations(defaultPresentations, presentations), [presentations]);
79
- const activePresentation = typeof presentation === "object" ? presentation : presentationRegistry.get(presentation ?? form.defaultPresentation ?? "page") ?? presentationRegistry.get("page") ?? defaultPresentationDescriptors.page;
80
- const fieldsByName = useMemo(() => new Map(form.fields.map((field) => [field.name, field])), [form.fields]);
71
+ const activePresentation = typeof presentation === "object" ? presentation : presentationRegistry.get(presentation ?? "page") ?? presentationRegistry.get("page") ?? defaultPresentationDescriptors.page;
72
+ const fieldsByName = useMemo(() => new Map(form.fields.filter(isNamedField).map((field) => [field.name, field])), [form.fields]);
81
73
  const translate = useMemo(() => t ?? makeTranslate(en), [t]);
74
+ const resolvedCloseLabel = closeLabel ?? translate(keys.formClose);
75
+ const resolvedSuccessMessage = successMessage ?? translate(keys.formSuccess);
76
+ const docButtons = form.buttons;
77
+ const labels = useMemo(() => ({
78
+ prev: prevLabel ?? storedLabel(docButtons?.prevLabel) ?? translate(keys.formBack),
79
+ next: nextLabel ?? storedLabel(docButtons?.nextLabel) ?? translate(keys.formNext),
80
+ submit: submitLabel ?? storedLabel(docButtons?.submitLabel) ?? translate(keys.formSubmit)
81
+ }), [
82
+ prevLabel,
83
+ nextLabel,
84
+ submitLabel,
85
+ docButtons,
86
+ translate
87
+ ]);
82
88
  const sinkRef = useRef(noopEventSink);
83
89
  sinkRef.current = events ?? noopEventSink;
84
90
  const formIdRef = useRef("");
85
91
  formIdRef.current = String(form.id);
86
92
  const [state, rawDispatch] = useReducer(formReducer, form.fields, (fields) => initialFormState({
87
- ...Object.fromEntries(fields.map((field) => [field.name, void 0])),
93
+ ...seedFieldValues(fields),
88
94
  ...initialValues ?? {}
89
95
  }));
90
- const effectiveValues = useMemo(() => computeCalcFields(form.fields, state.values), [form.fields, state.values]);
96
+ const effectiveValues = useMemo(() => computeCalcFields(form.fields, state.values, {
97
+ ...form.calcResolved ?? {},
98
+ ...calcFunctions ? { functions: calcFunctions } : {}
99
+ }), [
100
+ form.fields,
101
+ state.values,
102
+ form.calcResolved,
103
+ calcFunctions
104
+ ]);
105
+ const calcValues = useMemo(() => {
106
+ const values = {};
107
+ for (const field of form.fields) if (calcExpressionOf(field) && isNamedField(field)) {
108
+ const computed = effectiveValues[field.name];
109
+ values[field.name] = typeof computed === "number" ? computed : 0;
110
+ }
111
+ return values;
112
+ }, [form.fields, effectiveValues]);
91
113
  const recall = useMemo(() => buildRecallResolver({
92
114
  fields: form.fields,
93
115
  values: effectiveValues,
@@ -101,14 +123,28 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
101
123
  locale,
102
124
  translate
103
125
  ]);
104
- const flow = form.flow && form.flow.steps.length >= 2 ? form.flow : void 0;
126
+ const flow = form.multistep === true && form.flow && form.flow.steps.length >= 2 ? form.flow : void 0;
105
127
  const [currentStepId, setCurrentStepId] = useState(() => flow ? firstStepId(flow) : void 0);
106
128
  const [history, setHistory] = useState([]);
107
129
  const startedRef = useRef(false);
108
130
  const submittedRef = useRef(false);
109
131
  const submittingRef = useRef(false);
132
+ const advancingRef = useRef(false);
110
133
  const flowRef = useRef(flow);
111
134
  flowRef.current = flow;
135
+ const stepIdOfField = useMemo(() => {
136
+ const map = /* @__PURE__ */ new Map();
137
+ if (flow) for (const flowStep of flow.steps) for (const key of flowStep.fields) map.set(key, flowStep.id);
138
+ return (fieldKey) => map.get(fieldKey) ?? "__form__";
139
+ }, [flow]);
140
+ const allStepIds = useMemo(() => flow ? flow.steps.map((flowStep) => flowStep.id) : [DEFAULT_STEP_ID], [flow]);
141
+ const formRef = useRef(null);
142
+ const pendingFocusRef = useRef(null);
143
+ const [focusNonce, setFocusNonce] = useState(0);
144
+ const requestFocus = (intent) => {
145
+ pendingFocusRef.current = intent;
146
+ setFocusNonce((nonce) => nonce + 1);
147
+ };
112
148
  const dispatch = useCallback((action) => {
113
149
  if (action.type === "SET_VALUE" && !startedRef.current) {
114
150
  startedRef.current = true;
@@ -127,8 +163,7 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
127
163
  rawDispatch({
128
164
  type: "SET_FIELD_ISSUES",
129
165
  name,
130
- errors: [],
131
- warnings: []
166
+ errors: []
132
167
  });
133
168
  return;
134
169
  }
@@ -140,12 +175,11 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
140
175
  answers,
141
176
  locale,
142
177
  t: translate
143
- }).then(({ errors, warnings }) => {
178
+ }).then(({ errors }) => {
144
179
  rawDispatch({
145
180
  type: "SET_FIELD_ISSUES",
146
181
  name,
147
- errors,
148
- warnings
182
+ errors
149
183
  });
150
184
  const [firstError] = errors;
151
185
  if (firstError !== void 0) emitFormEvent(sinkRef.current, formIdRef.current, {
@@ -163,59 +197,169 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
163
197
  translate
164
198
  ]);
165
199
  const visible = visibleFields(form.fields, effectiveValues);
166
- const stepVisible = (flow && currentStepId ? stepFieldNames(flow, currentStepId) : []).map((name) => visible.find((field) => field.name === name)).filter((field) => Boolean(field));
200
+ /** Visible, answered named fields. Display-only ('none' kind) and nameless (bare) fields never contribute. */
201
+ const answerableFields = () => visibleFields(form.fields, effectiveValues).filter((field) => registry.get(field.blockType)?.value !== "none").filter(isNamedField).filter((field) => !isEmpty(effectiveValues[field.name]));
202
+ /** Answered visible fields as raw submission values, sent to the server on submit. */
203
+ const answeredValues = () => answerableFields().map((field) => ({
204
+ field: field.name,
205
+ value: effectiveValues[field.name]
206
+ }));
207
+ /**
208
+ * Same fields, formatted via `recall` (option labels, Yes/No, localized dates): recall-fidelity
209
+ * values for client-rendered templates, matching what the server gives email-team's body.
210
+ */
211
+ const formattedValues = () => answerableFields().map((field) => ({
212
+ field: field.name,
213
+ value: recall(field.name)
214
+ }));
215
+ /**
216
+ * The recall-resolved success response: a redirect's url, or the response message serialized with
217
+ * the active `converters` (so host blocks survive). Shared by the success screen and the value
218
+ * handed to `onSuccess`, so both stay identical.
219
+ */
220
+ const resolveSuccessResponse = () => {
221
+ const response = form.response;
222
+ if (response?.type === "redirect") return {
223
+ type: "redirect",
224
+ url: response.redirect?.url ?? void 0
225
+ };
226
+ const message = response?.type === "message" || response?.type == null ? response?.message : void 0;
227
+ if (!message) return;
228
+ return {
229
+ type: "message",
230
+ html: serializeBody(message, {
231
+ values: formattedValues(),
232
+ descriptors: descriptorsFor(answerableFields()),
233
+ converters
234
+ })
235
+ };
236
+ };
237
+ const stepKeys = flow && currentStepId ? stepFieldNames(flow, currentStepId) : [];
238
+ const stepKeySet = new Set(stepKeys);
239
+ const stepVisible = visible.filter((field) => stepKeySet.has(fieldKey(field)));
240
+ const validateRepeaterSubFields = async (repeaters) => {
241
+ const errors = {};
242
+ for (const field of repeaters.filter((f) => f.blockType === "repeater" && isNamedField(f))) {
243
+ const rows = Array.isArray(effectiveValues[field.name]) ? effectiveValues[field.name] : [];
244
+ const subFields = (Array.isArray(field.subFields) ? field.subFields : []).filter(isNamedField);
245
+ for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
246
+ const row = rows[rowIndex] ?? {};
247
+ for (const subField of subFields) {
248
+ if (!evaluateCondition(subField.visibleWhen, row)) continue;
249
+ if (!evaluateCondition(subField.validateWhen, row)) continue;
250
+ const subResult = await validateFieldValue({
251
+ field: subField,
252
+ value: row[subField.name],
253
+ registry,
254
+ ruleRegistry,
255
+ answers: row,
256
+ locale,
257
+ t: translate
258
+ });
259
+ const compositeKey = `${field.name}[${rowIndex}].${subField.name}`;
260
+ if (subResult.errors.length > 0) errors[compositeKey] = subResult.errors;
261
+ }
262
+ }
263
+ }
264
+ return errors;
265
+ };
167
266
  const goNext = async () => {
168
- if (!flow || !currentStepId) return;
169
- const results = await Promise.all(stepVisible.filter((field) => !calcExpressionOf(field)).filter((field) => evaluateCondition(field.validateWhen, effectiveValues)).map(async (field) => ({
170
- field,
171
- ...await validateFieldValue({
267
+ if (!flow || !currentStepId || advancingRef.current) return;
268
+ advancingRef.current = true;
269
+ try {
270
+ const results = await Promise.all(stepVisible.filter((field) => !calcExpressionOf(field)).filter((field) => registry.get(field.blockType)?.value !== "none").filter(isNamedField).filter((field) => evaluateCondition(field.validateWhen, effectiveValues)).map(async (field) => ({
172
271
  field,
173
- value: effectiveValues[field.name],
174
- registry,
175
- ruleRegistry,
176
- answers: effectiveValues,
177
- locale,
178
- t: translate
179
- })
180
- })));
181
- let hasError = false;
182
- for (const result of results) {
183
- rawDispatch({
184
- type: "TOUCH",
185
- name: result.field.name
272
+ ...await validateFieldValue({
273
+ field,
274
+ value: effectiveValues[field.name],
275
+ registry,
276
+ ruleRegistry,
277
+ answers: effectiveValues,
278
+ locale,
279
+ t: translate
280
+ })
281
+ })));
282
+ let hasError = false;
283
+ for (const result of results) {
284
+ rawDispatch({
285
+ type: "TOUCH",
286
+ name: result.field.name
287
+ });
288
+ rawDispatch({
289
+ type: "SET_FIELD_ISSUES",
290
+ name: result.field.name,
291
+ errors: result.errors
292
+ });
293
+ if (result.errors.length > 0) hasError = true;
294
+ }
295
+ const repeaterErrors = await validateRepeaterSubFields(stepVisible);
296
+ for (const [compositeKey, errs] of Object.entries(repeaterErrors)) {
297
+ rawDispatch({
298
+ type: "SET_FIELD_ISSUES",
299
+ name: compositeKey,
300
+ errors: errs
301
+ });
302
+ hasError = true;
303
+ }
304
+ if (hasError) {
305
+ rawDispatch({
306
+ type: "MARK_STEP_ATTEMPTED",
307
+ stepId: currentStepId
308
+ });
309
+ requestFocus("firstInvalid");
310
+ return;
311
+ }
312
+ const next = resolveNextStepId(flow, currentStepId, effectiveValues);
313
+ if (!next) return;
314
+ emitFormEvent(sinkRef.current, formIdRef.current, {
315
+ type: "step.completed",
316
+ stepId: currentStepId
186
317
  });
187
- rawDispatch({
188
- type: "SET_FIELD_ISSUES",
189
- name: result.field.name,
190
- errors: result.errors,
191
- warnings: result.warnings
318
+ setHistory((prev) => [...prev, currentStepId]);
319
+ setCurrentStepId(next);
320
+ requestFocus("stepStart");
321
+ emitFormEvent(sinkRef.current, formIdRef.current, {
322
+ type: "step.viewed",
323
+ stepId: next
192
324
  });
193
- if (result.errors.length > 0) hasError = true;
325
+ } finally {
326
+ advancingRef.current = false;
194
327
  }
195
- if (hasError) return;
196
- const next = resolveNextStepId(flow, currentStepId, state.values);
197
- if (!next) return;
198
- emitFormEvent(sinkRef.current, formIdRef.current, {
199
- type: "step.completed",
200
- stepId: currentStepId
201
- });
202
- setHistory((prev) => [...prev, currentStepId]);
203
- setCurrentStepId(next);
204
- emitFormEvent(sinkRef.current, formIdRef.current, {
205
- type: "step.viewed",
206
- stepId: next
207
- });
208
328
  };
209
329
  const goBack = () => {
210
330
  const prev = history[history.length - 1];
211
331
  if (prev === void 0) return;
212
332
  setHistory((entries) => entries.slice(0, -1));
213
333
  setCurrentStepId(prev);
334
+ requestFocus("stepStart");
214
335
  emitFormEvent(sinkRef.current, formIdRef.current, {
215
336
  type: "step.viewed",
216
337
  stepId: prev
217
338
  });
218
339
  };
340
+ const navigateToStep = (stepId) => {
341
+ if (!flow || stepId === currentStepId) return;
342
+ const idx = flow.steps.findIndex((flowStep) => flowStep.id === stepId);
343
+ if (idx < 0) return;
344
+ setHistory(flow.steps.slice(0, idx).map((flowStep) => flowStep.id));
345
+ setCurrentStepId(stepId);
346
+ emitFormEvent(sinkRef.current, formIdRef.current, {
347
+ type: "step.viewed",
348
+ stepId
349
+ });
350
+ };
351
+ useEffect(() => {
352
+ const intent = pendingFocusRef.current;
353
+ if (!intent) return;
354
+ pendingFocusRef.current = null;
355
+ if (intent === "firstInvalid") {
356
+ focusFirstIn(formRef.current, "[aria-invalid=\"true\"]");
357
+ return;
358
+ }
359
+ const region = formRef.current?.querySelector("[data-fb-step-region]");
360
+ if (region) region.focus();
361
+ else focusFirstIn(formRef.current, "input:not([type=\"hidden\"]), select, textarea");
362
+ }, [currentStepId, focusNonce]);
219
363
  useEffect(() => {
220
364
  emitFormEvent(sinkRef.current, formIdRef.current, { type: "form.viewed" });
221
365
  const mountFlow = flowRef.current;
@@ -238,7 +382,7 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
238
382
  if (submittingRef.current) return;
239
383
  submittingRef.current = true;
240
384
  const visible = visibleFields(form.fields, effectiveValues);
241
- const results = await Promise.all(visible.filter((field) => !calcExpressionOf(field)).filter((field) => evaluateCondition(field.validateWhen, effectiveValues)).map(async (field) => ({
385
+ const results = await Promise.all(visible.filter((field) => !calcExpressionOf(field)).filter((field) => registry.get(field.blockType)?.value !== "none").filter(isNamedField).filter((field) => evaluateCondition(field.validateWhen, effectiveValues)).map(async (field) => ({
242
386
  field,
243
387
  ...await validateFieldValue({
244
388
  field,
@@ -251,60 +395,38 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
251
395
  })
252
396
  })));
253
397
  const errors = {};
254
- const warnings = {};
255
- for (const result of results) {
256
- if (result.errors.length > 0) {
257
- errors[result.field.name] = result.errors;
258
- const [firstError] = result.errors;
259
- if (firstError !== void 0) emitFormEvent(sinkRef.current, formIdRef.current, {
260
- type: "field.errored",
261
- field: result.field.name,
262
- message: firstError
263
- });
264
- }
265
- if (result.warnings.length > 0) warnings[result.field.name] = result.warnings;
266
- }
267
- for (const field of visible.filter((f) => f.blockType === "repeater")) {
268
- const rows = Array.isArray(effectiveValues[field.name]) ? effectiveValues[field.name] : [];
269
- const subFields = Array.isArray(field.subFields) ? field.subFields : [];
270
- for (let rowIndex = 0; rowIndex < rows.length; rowIndex++) {
271
- const row = rows[rowIndex] ?? {};
272
- for (const subField of subFields) {
273
- if (!evaluateCondition(subField.visibleWhen, row)) continue;
274
- if (!evaluateCondition(subField.validateWhen, row)) continue;
275
- const subResult = await validateFieldValue({
276
- field: subField,
277
- value: row[subField.name],
278
- registry,
279
- ruleRegistry,
280
- answers: row,
281
- locale,
282
- t: translate
283
- });
284
- const compositeKey = `${field.name}[${rowIndex}].${subField.name}`;
285
- if (subResult.errors.length > 0) errors[compositeKey] = subResult.errors;
286
- if (subResult.warnings.length > 0) warnings[compositeKey] = subResult.warnings;
287
- }
288
- }
398
+ for (const result of results) if (result.errors.length > 0) {
399
+ errors[result.field.name] = result.errors;
400
+ const [firstError] = result.errors;
401
+ if (firstError !== void 0) emitFormEvent(sinkRef.current, formIdRef.current, {
402
+ type: "field.errored",
403
+ field: result.field.name,
404
+ message: firstError
405
+ });
289
406
  }
407
+ Object.assign(errors, await validateRepeaterSubFields(visible));
408
+ const hasErrors = Object.keys(errors).length > 0;
290
409
  rawDispatch({
291
410
  type: "SET_ALL_ISSUES",
292
411
  errors,
293
- warnings
412
+ steps: hasErrors ? allStepIds : []
294
413
  });
295
- if (Object.keys(errors).length > 0) {
414
+ if (hasErrors) {
296
415
  submittingRef.current = false;
416
+ if (flow && currentStepId) {
417
+ const target = firstStepWithError(flow, errors);
418
+ if (target) navigateToStep(target);
419
+ }
420
+ requestFocus("firstInvalid");
297
421
  return;
298
422
  }
299
423
  rawDispatch({ type: "SUBMIT_START" });
300
- const values = visible.filter((field) => !isEmpty(effectiveValues[field.name])).map((field) => ({
301
- field: field.name,
302
- value: effectiveValues[field.name]
303
- }));
424
+ const values = answeredValues();
425
+ const answers = [...values];
304
426
  if (honeypotName) {
305
427
  const decoy = honeypotRef.current?.value ?? "";
306
428
  if (decoy !== "") values.push({
307
- field: honeypotName,
429
+ field: HONEYPOT_VALUE_KEY,
308
430
  value: decoy
309
431
  });
310
432
  }
@@ -312,6 +434,10 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
312
434
  field: CAPTCHA_TOKEN_KEY,
313
435
  value: captchaToken
314
436
  });
437
+ if (context) values.push({
438
+ field: CONTEXT_KEY,
439
+ value: context
440
+ });
315
441
  const result = onSubmit ? await onSubmit({
316
442
  formId: form.id,
317
443
  values
@@ -323,20 +449,40 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
323
449
  submittingRef.current = false;
324
450
  if (result.ok) {
325
451
  submittedRef.current = true;
326
- rawDispatch({ type: "SUBMIT_SUCCESS" });
327
452
  emitFormEvent(sinkRef.current, formIdRef.current, {
328
453
  type: "submission.created",
329
454
  submissionId: result.submissionId
330
455
  });
331
- onSuccess?.(result.submissionId);
332
- if (activePresentation.dismissOnSuccess) handleClose();
456
+ onSuccess?.(result.submissionId, {
457
+ response: resolveSuccessResponse(),
458
+ values: answers
459
+ });
460
+ if (successBehavior === "reset") {
461
+ rawDispatch({
462
+ type: "RESET",
463
+ values: {
464
+ ...seedFieldValues(form.fields),
465
+ ...initialValues ?? {}
466
+ }
467
+ });
468
+ if (flow) {
469
+ setCurrentStepId(firstStepId(flow));
470
+ setHistory([]);
471
+ }
472
+ startedRef.current = false;
473
+ } else {
474
+ rawDispatch({ type: "SUBMIT_SUCCESS" });
475
+ if (activePresentation.dismissOnSuccess) handleClose();
476
+ }
477
+ const redirectUrl = form.response?.type === "redirect" ? form.response.redirect?.url : void 0;
478
+ if (typeof redirectUrl === "string" && redirectUrl.length > 0) (adapters?.navigate ?? defaultNavigate)(redirectUrl, { replace: false });
333
479
  } else {
334
480
  if (result.fieldErrors) rawDispatch({
335
481
  type: "SET_ALL_ISSUES",
336
482
  errors: result.fieldErrors,
337
- warnings: {}
483
+ steps: allStepIds
338
484
  });
339
- const message = result.message ?? "Submission failed";
485
+ const message = result.message ?? translate(keys.formSubmitFailed);
340
486
  rawDispatch({
341
487
  type: "SUBMIT_ERROR",
342
488
  message
@@ -344,13 +490,24 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
344
490
  onError?.(message);
345
491
  }
346
492
  };
493
+ const isTerminalStep = flow && currentStepId ? isTerminalStepId(flow, currentStepId, effectiveValues) : true;
494
+ const handleKeyDown = (event) => {
495
+ if (!flow || event.key !== "Enter") return;
496
+ const target = event.target;
497
+ if (target instanceof HTMLTextAreaElement || target instanceof HTMLSelectElement || target instanceof HTMLButtonElement) return;
498
+ if (target instanceof HTMLInputElement && (target.type === "submit" || target.type === "button")) return;
499
+ if (!isTerminalStep) {
500
+ event.preventDefault();
501
+ goNext();
502
+ }
503
+ };
347
504
  const step = flow ? {
348
505
  flow,
349
506
  currentStepId,
350
507
  stepIndex: flow.steps.findIndex((s) => s.id === currentStepId),
351
508
  stepCount: flow.steps.length,
352
509
  isFirst: history.length === 0,
353
- isTerminal: currentStepId ? isTerminalStepId(flow, currentStepId, state.values) : true,
510
+ isTerminal: isTerminalStep,
354
511
  goNext: () => {
355
512
  goNext();
356
513
  },
@@ -363,13 +520,27 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
363
520
  goNext: () => {},
364
521
  goBack: () => {}
365
522
  };
523
+ const stepStatusText = flow ? resolveMessage(translate(keys.formStepStatus), {
524
+ current: String(step.stepIndex + 1),
525
+ total: String(step.stepCount)
526
+ }) : "";
527
+ const currentStepHasError = flow != null && currentStepId != null && state.attemptedSteps.has(currentStepId) && Object.entries(state.errors).some(([key, errs]) => errs.length > 0 && stepIdOfField(baseFieldKey(key)) === currentStepId);
366
528
  const contextValue = {
529
+ form,
367
530
  state,
368
531
  dispatch,
369
532
  validateField,
370
533
  locale,
371
534
  step,
372
- rendererRegistry
535
+ rendererRegistry,
536
+ labels,
537
+ t: translate,
538
+ effectiveValues,
539
+ calcValues,
540
+ recall,
541
+ renderedFields: (flow ? stepVisible : visible).filter((field) => field.hidden !== true && field.calcDisplay !== false),
542
+ converters,
543
+ stepIdOfField
373
544
  };
374
545
  const PresentationWrapper = activePresentation.Wrapper;
375
546
  const wrap = (content) => PresentationWrapper ? /* @__PURE__ */ jsx(PresentationWrapper, {
@@ -377,15 +548,17 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
377
548
  open: true,
378
549
  onClose: handleClose,
379
550
  title,
380
- closeLabel,
551
+ closeLabel: resolvedCloseLabel,
381
552
  children: content
382
553
  }) : content;
383
554
  if (children !== void 0) return /* @__PURE__ */ jsx(FormContext.Provider, {
384
555
  value: contextValue,
385
556
  children: wrap(/* @__PURE__ */ jsxs("form", {
557
+ ref: formRef,
386
558
  className: cn("fb-form-root", className),
387
559
  noValidate: true,
388
560
  onSubmit: handleSubmit,
561
+ onKeyDown: handleKeyDown,
389
562
  "data-fb-presentation": activePresentation.name,
390
563
  "data-fb-density": activePresentation.density,
391
564
  children: [honeypotName ? /* @__PURE__ */ jsx(Honeypot, {
@@ -394,23 +567,34 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
394
567
  }) : null, children]
395
568
  }))
396
569
  });
397
- if (state.submitted) return /* @__PURE__ */ jsx(FormContext.Provider, {
398
- value: contextValue,
399
- children: wrap(/* @__PURE__ */ jsx("p", {
400
- role: "status",
401
- className: cn("fb-form__success", className),
402
- "data-fb-presentation": activePresentation.name,
403
- "data-fb-density": activePresentation.density,
404
- children: interpolate(successMessage, recall)
405
- }))
406
- });
407
- const rendered = (flow ? stepVisible : visible).filter((field) => field.hidden !== true && field.calcDisplay !== false);
570
+ if (state.submitted) {
571
+ const successResponse = resolveSuccessResponse();
572
+ const responseHtml = successResponse?.type === "message" ? successResponse.html : void 0;
573
+ return /* @__PURE__ */ jsx(FormContext.Provider, {
574
+ value: contextValue,
575
+ children: wrap(responseHtml ? /* @__PURE__ */ jsx("div", {
576
+ role: "status",
577
+ className: cn("fb-form__success", className),
578
+ "data-fb-presentation": activePresentation.name,
579
+ "data-fb-density": activePresentation.density,
580
+ dangerouslySetInnerHTML: { __html: responseHtml }
581
+ }) : /* @__PURE__ */ jsx("p", {
582
+ role: "status",
583
+ className: cn("fb-form__success", className),
584
+ "data-fb-presentation": activePresentation.name,
585
+ "data-fb-density": activePresentation.density,
586
+ children: interpolate(resolvedSuccessMessage, recall)
587
+ }))
588
+ });
589
+ }
408
590
  return /* @__PURE__ */ jsx(FormContext.Provider, {
409
591
  value: contextValue,
410
592
  children: wrap(/* @__PURE__ */ jsxs("form", {
593
+ ref: formRef,
411
594
  className: cn("fb-form-root", className),
412
595
  noValidate: true,
413
596
  onSubmit: handleSubmit,
597
+ onKeyDown: handleKeyDown,
414
598
  "data-fb-presentation": activePresentation.name,
415
599
  "data-fb-density": activePresentation.density,
416
600
  children: [
@@ -418,76 +602,38 @@ const Form = ({ form, fieldTypes, rules, renderers, apiRoute, onSubmit, onSucces
418
602
  name: honeypotName,
419
603
  inputRef: honeypotRef
420
604
  }) : null,
421
- /* @__PURE__ */ jsx(FormLayout, {
422
- enabled: layout !== false,
423
- children: rendered.map((field) => {
424
- const renderer = rendererRegistry.get(field.blockType);
425
- if (!renderer) return null;
426
- const width = typeof field.width === "string" && FIELD_WIDTHS.has(field.width) ? field.width : void 0;
427
- const recalledField = applyRecall(field, recall);
428
- return /* @__PURE__ */ jsx("div", {
429
- ...widthProps(width),
430
- children: calcExpressionOf(field) ? /* @__PURE__ */ jsx(CalcFieldHost, {
431
- field: recalledField,
432
- renderer,
433
- value: effectiveValues[field.name],
434
- locale,
435
- t: translate
436
- }) : /* @__PURE__ */ jsx(FieldHost, {
437
- field: recalledField,
438
- renderer,
439
- locale,
440
- t: translate
441
- })
442
- }, field.name);
443
- })
444
- }),
605
+ header,
606
+ flow ? /* @__PURE__ */ jsxs(Fragment, { children: [
607
+ /* @__PURE__ */ jsx("div", {
608
+ "aria-live": "polite",
609
+ "aria-atomic": "true",
610
+ style: SR_ONLY,
611
+ children: stepStatusText
612
+ }),
613
+ /* @__PURE__ */ jsx("div", {
614
+ "data-fb-step-region": true,
615
+ tabIndex: -1,
616
+ className: "fb-form__step",
617
+ children: /* @__PURE__ */ jsx(FormFields, { layout })
618
+ }),
619
+ currentStepHasError ? /* @__PURE__ */ jsx("p", {
620
+ role: "alert",
621
+ className: "fb-form__step-error",
622
+ children: translate(keys.formStepInvalid)
623
+ }) : null
624
+ ] }) : /* @__PURE__ */ jsx(FormFields, { layout }),
445
625
  state.submitError ? /* @__PURE__ */ jsx("p", {
446
626
  role: "alert",
447
627
  className: "fb-form__submit-error",
448
628
  children: state.submitError
449
629
  }) : null,
450
- flow ? /* @__PURE__ */ jsxs("div", {
451
- className: "fb-form__controls",
452
- children: [!step.isFirst ? renderBack ? renderBack({
453
- label: backLabel,
454
- submitting: state.submitting,
455
- onClick: goBack
456
- }) : /* @__PURE__ */ jsx("button", {
457
- type: "button",
458
- className: backButtonClassName,
459
- onClick: goBack,
460
- disabled: state.submitting,
461
- children: backLabel
462
- }) : null, step.isTerminal ? renderSubmit ? renderSubmit({
463
- label: submitLabel,
464
- submitting: state.submitting
465
- }) : /* @__PURE__ */ jsx("button", {
466
- type: "submit",
467
- className: submitButtonClassName,
468
- disabled: state.submitting,
469
- children: submitLabel
470
- }) : renderNext ? renderNext({
471
- label: nextLabel,
472
- submitting: state.submitting,
473
- onClick: () => void goNext()
474
- }) : /* @__PURE__ */ jsx("button", {
475
- type: "button",
476
- className: nextButtonClassName,
477
- disabled: state.submitting,
478
- onClick: () => {
479
- goNext();
480
- },
481
- children: nextLabel
482
- })]
483
- }) : renderSubmit ? renderSubmit({
484
- label: submitLabel,
485
- submitting: state.submitting
486
- }) : /* @__PURE__ */ jsx("button", {
487
- type: "submit",
488
- className: submitButtonClassName,
489
- disabled: state.submitting,
490
- children: submitLabel
630
+ /* @__PURE__ */ jsx(FormControls, {
631
+ backButtonClassName,
632
+ nextButtonClassName,
633
+ submitButtonClassName,
634
+ renderBack,
635
+ renderNext,
636
+ renderSubmit
491
637
  })
492
638
  ]
493
639
  }))