@verbb/formie-browser 1.0.0

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 (490) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/LICENSE.md +40 -0
  3. package/README.md +34 -0
  4. package/dist/chunks/address-finder-DfMCiW89.js +47 -0
  5. package/dist/chunks/api-CbqEMQT5.js +181 -0
  6. package/dist/chunks/api-DE7LfK-R.js +960 -0
  7. package/dist/chunks/api-DOfDzYC_.js +538 -0
  8. package/dist/chunks/async-B3DUf1GZ.js +26 -0
  9. package/dist/chunks/bpoint-Ciy3yY9Q.js +34 -0
  10. package/dist/chunks/calculations-CkYAqO_-.js +197 -0
  11. package/dist/chunks/captcha-eu-DnOWhMwr.js +43 -0
  12. package/dist/chunks/checkbox-radio-0x7Tc0br.js +197 -0
  13. package/dist/chunks/chunk-K6L4z4UQ.js +24 -0
  14. package/dist/chunks/conditions-4fXKhEJS.js +609 -0
  15. package/dist/chunks/date-picker-B6iZkjHS.js +6204 -0
  16. package/dist/chunks/debug-KnZeKYBI.js +39 -0
  17. package/dist/chunks/dist-D09GnXMW.js +2663 -0
  18. package/dist/chunks/event-names-DamGPtXR.js +51 -0
  19. package/dist/chunks/eway-DEAYcwT0.js +86 -0
  20. package/dist/chunks/field-references.keys-BpBZ_quS.js +24 -0
  21. package/dist/chunks/field-references.resolver-Ba6xhiJC.js +183 -0
  22. package/dist/chunks/file-upload-Bh63PQSE.js +430 -0
  23. package/dist/chunks/friendly-captcha-v1-CqO4WVre.js +40 -0
  24. package/dist/chunks/friendly-captcha-v2-CyykcJcM.js +47 -0
  25. package/dist/chunks/friendly-challenge-Dg8XkStd.js +1101 -0
  26. package/dist/chunks/go-cardless-CuND59rR.js +26 -0
  27. package/dist/chunks/google-address--uR8WDSm.js +208 -0
  28. package/dist/chunks/hcaptcha-CmaFUesv.js +72 -0
  29. package/dist/chunks/hidden-CYnZYple.js +36 -0
  30. package/dist/chunks/http-18nn97DZ.js +29 -0
  31. package/dist/chunks/i18n-vUh-KGiH.js +55 -0
  32. package/dist/chunks/loqate-BICNJlVK.js +97 -0
  33. package/dist/chunks/mollie-DwlsgHZ1.js +26 -0
  34. package/dist/chunks/moneris-B_IFZFTx.js +159 -0
  35. package/dist/chunks/opayo-U2x_TOII.js +192 -0
  36. package/dist/chunks/paddle-BqXFrc79.js +75 -0
  37. package/dist/chunks/paypal-Cn_DYGDb.js +121 -0
  38. package/dist/chunks/payway-Rnq796eC.js +75 -0
  39. package/dist/chunks/phone-country-B6Me4lK0.js +3317 -0
  40. package/dist/chunks/place-kit-ldUl-u9w.js +56 -0
  41. package/dist/chunks/placekit-autocomplete.esm-D-lGeaZl.js +1771 -0
  42. package/dist/chunks/recaptcha-enterprise-DPJNyv1X.js +72 -0
  43. package/dist/chunks/recaptcha-shared-DTI4qWVR.js +22 -0
  44. package/dist/chunks/recaptcha-v2-checkbox-zFjpvJ5c.js +49 -0
  45. package/dist/chunks/recaptcha-v2-invisible-CnYtkNvz.js +62 -0
  46. package/dist/chunks/recaptcha-v3-EAlWhnkX.js +33 -0
  47. package/dist/chunks/repeater-CXD1eLSn.js +151 -0
  48. package/dist/chunks/rich-text-DkmZRhGj.js +442 -0
  49. package/dist/chunks/scripts-BGD_iU_6.js +41 -0
  50. package/dist/chunks/sdk-B7u9fTlP.js +2103 -0
  51. package/dist/chunks/shared-DC6_1u8X.js +85 -0
  52. package/dist/chunks/signature-E9KyYXS1.js +765 -0
  53. package/dist/chunks/snaptcha-CCDunGeb.js +8 -0
  54. package/dist/chunks/square-BLqK51rS.js +61 -0
  55. package/dist/chunks/stripe-B8gHpZNC.js +273 -0
  56. package/dist/chunks/styles-BIh6g7V_.js +22 -0
  57. package/dist/chunks/summary-EcNE0cvg.js +191 -0
  58. package/dist/chunks/table-yxEDL6kA.js +124 -0
  59. package/dist/chunks/text-limit-D0H_Ca2c.js +179 -0
  60. package/dist/chunks/theme-classes-vSHpdCUO.js +59 -0
  61. package/dist/chunks/turnstile-DP0bdR7T.js +68 -0
  62. package/dist/chunks/utils-ByrEVYrJ.js +49584 -0
  63. package/dist/css/formie-base.css +78 -0
  64. package/dist/css/formie-theme.css +19 -0
  65. package/dist/css/formie.css +2 -0
  66. package/dist/css/theme/_buttons.css +249 -0
  67. package/dist/css/theme/_loading.css +37 -0
  68. package/dist/css/theme/_messages.css +39 -0
  69. package/dist/css/theme/_progress.css +62 -0
  70. package/dist/css/theme/_tokens.css +361 -0
  71. package/dist/css/theme/_typography.css +70 -0
  72. package/dist/css/theme/fields/_address.css +17 -0
  73. package/dist/css/theme/fields/_check-radio.css +108 -0
  74. package/dist/css/theme/fields/_file.css +58 -0
  75. package/dist/css/theme/fields/_group.css +13 -0
  76. package/dist/css/theme/fields/_input.css +48 -0
  77. package/dist/css/theme/fields/_nested.css +19 -0
  78. package/dist/css/theme/fields/_repeater.css +69 -0
  79. package/dist/css/theme/fields/_rich-text.css +201 -0
  80. package/dist/css/theme/fields/_select.css +37 -0
  81. package/dist/css/theme/fields/_signature.css +39 -0
  82. package/dist/css/theme/fields/_summary.css +53 -0
  83. package/dist/css/theme/fields/_table.css +121 -0
  84. package/dist/css/theme/fields/_text-limit.css +10 -0
  85. package/dist/css/theme/forms/_field.css +62 -0
  86. package/dist/css/theme/forms/_form.css +166 -0
  87. package/dist/css/theme/integrations/_payment-modal.css +32 -0
  88. package/dist/css/theme/integrations/_paypal.css +10 -0
  89. package/dist/css/theme/integrations/_payway.css +10 -0
  90. package/dist/css/theme/integrations/_stripe.css +24 -0
  91. package/dist/css/theme/utilities/_accessibility.css +13 -0
  92. package/dist/css/theme-base/_controls.css +41 -0
  93. package/dist/css/theme-base/_primitives.css +34 -0
  94. package/dist/index.d.ts +30 -0
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +3206 -0
  97. package/dist/js/compatibility/dom-adapter.d.ts +12 -0
  98. package/dist/js/compatibility/dom-adapter.d.ts.map +1 -0
  99. package/dist/js/compatibility/event-map.d.ts +25 -0
  100. package/dist/js/compatibility/event-map.d.ts.map +1 -0
  101. package/dist/js/compatibility/validator-adapter.d.ts +17 -0
  102. package/dist/js/compatibility/validator-adapter.d.ts.map +1 -0
  103. package/dist/js/contracts/client.d.ts +40 -0
  104. package/dist/js/contracts/client.d.ts.map +1 -0
  105. package/dist/js/contracts/common.d.ts +5 -0
  106. package/dist/js/contracts/common.d.ts.map +1 -0
  107. package/dist/js/contracts/modules.d.ts +47 -0
  108. package/dist/js/contracts/modules.d.ts.map +1 -0
  109. package/dist/js/contracts/schema.d.ts +79 -0
  110. package/dist/js/contracts/schema.d.ts.map +1 -0
  111. package/dist/js/contracts/theme.d.ts +2 -0
  112. package/dist/js/contracts/theme.d.ts.map +1 -0
  113. package/dist/js/core/create-formie-client.d.ts +3 -0
  114. package/dist/js/core/create-formie-client.d.ts.map +1 -0
  115. package/dist/js/core/dom-events.d.ts +2 -0
  116. package/dist/js/core/dom-events.d.ts.map +1 -0
  117. package/dist/js/core/formie.d.ts +27 -0
  118. package/dist/js/core/formie.d.ts.map +1 -0
  119. package/dist/js/core/hydrate-modules.d.ts +22 -0
  120. package/dist/js/core/hydrate-modules.d.ts.map +1 -0
  121. package/dist/js/core/page-client-event.d.ts +9 -0
  122. package/dist/js/core/page-client-event.d.ts.map +1 -0
  123. package/dist/js/core/page-tab-errors.d.ts +2 -0
  124. package/dist/js/core/page-tab-errors.d.ts.map +1 -0
  125. package/dist/js/core/submit-flow.d.ts +21 -0
  126. package/dist/js/core/submit-flow.d.ts.map +1 -0
  127. package/dist/js/core/submit-result-state.d.ts +8 -0
  128. package/dist/js/core/submit-result-state.d.ts.map +1 -0
  129. package/dist/js/core/submit-result-ui.d.ts +10 -0
  130. package/dist/js/core/submit-result-ui.d.ts.map +1 -0
  131. package/dist/js/events/event-bus.d.ts +21 -0
  132. package/dist/js/events/event-bus.d.ts.map +1 -0
  133. package/dist/js/modules/address/address-finder.d.ts +2 -0
  134. package/dist/js/modules/address/address-finder.d.ts.map +1 -0
  135. package/dist/js/modules/address/api.d.ts +8 -0
  136. package/dist/js/modules/address/api.d.ts.map +1 -0
  137. package/dist/js/modules/address/constants.d.ts +15 -0
  138. package/dist/js/modules/address/constants.d.ts.map +1 -0
  139. package/dist/js/modules/address/factories.d.ts +35 -0
  140. package/dist/js/modules/address/factories.d.ts.map +1 -0
  141. package/dist/js/modules/address/google-address.d.ts +2 -0
  142. package/dist/js/modules/address/google-address.d.ts.map +1 -0
  143. package/dist/js/modules/address/host.d.ts +30 -0
  144. package/dist/js/modules/address/host.d.ts.map +1 -0
  145. package/dist/js/modules/address/index.d.ts +3 -0
  146. package/dist/js/modules/address/index.d.ts.map +1 -0
  147. package/dist/js/modules/address/loqate.d.ts +2 -0
  148. package/dist/js/modules/address/loqate.d.ts.map +1 -0
  149. package/dist/js/modules/address/place-kit.d.ts +2 -0
  150. package/dist/js/modules/address/place-kit.d.ts.map +1 -0
  151. package/dist/js/modules/captchas/api.d.ts +9 -0
  152. package/dist/js/modules/captchas/api.d.ts.map +1 -0
  153. package/dist/js/modules/captchas/captcha-eu.d.ts +2 -0
  154. package/dist/js/modules/captchas/captcha-eu.d.ts.map +1 -0
  155. package/dist/js/modules/captchas/constants.d.ts +5 -0
  156. package/dist/js/modules/captchas/constants.d.ts.map +1 -0
  157. package/dist/js/modules/captchas/factories.d.ts +63 -0
  158. package/dist/js/modules/captchas/factories.d.ts.map +1 -0
  159. package/dist/js/modules/captchas/friendly-captcha-v1.d.ts +2 -0
  160. package/dist/js/modules/captchas/friendly-captcha-v1.d.ts.map +1 -0
  161. package/dist/js/modules/captchas/friendly-captcha-v2.d.ts +2 -0
  162. package/dist/js/modules/captchas/friendly-captcha-v2.d.ts.map +1 -0
  163. package/dist/js/modules/captchas/hcaptcha.d.ts +2 -0
  164. package/dist/js/modules/captchas/hcaptcha.d.ts.map +1 -0
  165. package/dist/js/modules/captchas/host.d.ts +78 -0
  166. package/dist/js/modules/captchas/host.d.ts.map +1 -0
  167. package/dist/js/modules/captchas/index.d.ts +3 -0
  168. package/dist/js/modules/captchas/index.d.ts.map +1 -0
  169. package/dist/js/modules/captchas/recaptcha-enterprise.d.ts +2 -0
  170. package/dist/js/modules/captchas/recaptcha-enterprise.d.ts.map +1 -0
  171. package/dist/js/modules/captchas/recaptcha-shared.d.ts +26 -0
  172. package/dist/js/modules/captchas/recaptcha-shared.d.ts.map +1 -0
  173. package/dist/js/modules/captchas/recaptcha-v2-checkbox.d.ts +2 -0
  174. package/dist/js/modules/captchas/recaptcha-v2-checkbox.d.ts.map +1 -0
  175. package/dist/js/modules/captchas/recaptcha-v2-invisible.d.ts +2 -0
  176. package/dist/js/modules/captchas/recaptcha-v2-invisible.d.ts.map +1 -0
  177. package/dist/js/modules/captchas/recaptcha-v3.d.ts +2 -0
  178. package/dist/js/modules/captchas/recaptcha-v3.d.ts.map +1 -0
  179. package/dist/js/modules/captchas/snaptcha.d.ts +2 -0
  180. package/dist/js/modules/captchas/snaptcha.d.ts.map +1 -0
  181. package/dist/js/modules/captchas/turnstile.d.ts +2 -0
  182. package/dist/js/modules/captchas/turnstile.d.ts.map +1 -0
  183. package/dist/js/modules/captchas/utils.d.ts +13 -0
  184. package/dist/js/modules/captchas/utils.d.ts.map +1 -0
  185. package/dist/js/modules/fields/calculations.d.ts +3 -0
  186. package/dist/js/modules/fields/calculations.d.ts.map +1 -0
  187. package/dist/js/modules/fields/checkbox-radio.d.ts +3 -0
  188. package/dist/js/modules/fields/checkbox-radio.d.ts.map +1 -0
  189. package/dist/js/modules/fields/conditions/config.d.ts +5 -0
  190. package/dist/js/modules/fields/conditions/config.d.ts.map +1 -0
  191. package/dist/js/modules/fields/conditions/effects.d.ts +2 -0
  192. package/dist/js/modules/fields/conditions/effects.d.ts.map +1 -0
  193. package/dist/js/modules/fields/conditions/evaluator.d.ts +6 -0
  194. package/dist/js/modules/fields/conditions/evaluator.d.ts.map +1 -0
  195. package/dist/js/modules/fields/conditions/references.d.ts +5 -0
  196. package/dist/js/modules/fields/conditions/references.d.ts.map +1 -0
  197. package/dist/js/modules/fields/conditions/transforms.d.ts +3 -0
  198. package/dist/js/modules/fields/conditions/transforms.d.ts.map +1 -0
  199. package/dist/js/modules/fields/conditions/types.d.ts +30 -0
  200. package/dist/js/modules/fields/conditions/types.d.ts.map +1 -0
  201. package/dist/js/modules/fields/conditions/values.d.ts +5 -0
  202. package/dist/js/modules/fields/conditions/values.d.ts.map +1 -0
  203. package/dist/js/modules/fields/conditions.d.ts +3 -0
  204. package/dist/js/modules/fields/conditions.d.ts.map +1 -0
  205. package/dist/js/modules/fields/date-picker.d.ts +3 -0
  206. package/dist/js/modules/fields/date-picker.d.ts.map +1 -0
  207. package/dist/js/modules/fields/file-upload.d.ts +3 -0
  208. package/dist/js/modules/fields/file-upload.d.ts.map +1 -0
  209. package/dist/js/modules/fields/hidden.d.ts +3 -0
  210. package/dist/js/modules/fields/hidden.d.ts.map +1 -0
  211. package/dist/js/modules/fields/index.d.ts +3 -0
  212. package/dist/js/modules/fields/index.d.ts.map +1 -0
  213. package/dist/js/modules/fields/phone-country.d.ts +3 -0
  214. package/dist/js/modules/fields/phone-country.d.ts.map +1 -0
  215. package/dist/js/modules/fields/repeater.d.ts +3 -0
  216. package/dist/js/modules/fields/repeater.d.ts.map +1 -0
  217. package/dist/js/modules/fields/rich-text.d.ts +3 -0
  218. package/dist/js/modules/fields/rich-text.d.ts.map +1 -0
  219. package/dist/js/modules/fields/shared.d.ts +20 -0
  220. package/dist/js/modules/fields/shared.d.ts.map +1 -0
  221. package/dist/js/modules/fields/signature.d.ts +3 -0
  222. package/dist/js/modules/fields/signature.d.ts.map +1 -0
  223. package/dist/js/modules/fields/summary.d.ts +3 -0
  224. package/dist/js/modules/fields/summary.d.ts.map +1 -0
  225. package/dist/js/modules/fields/table.d.ts +3 -0
  226. package/dist/js/modules/fields/table.d.ts.map +1 -0
  227. package/dist/js/modules/fields/text-limit.d.ts +3 -0
  228. package/dist/js/modules/fields/text-limit.d.ts.map +1 -0
  229. package/dist/js/modules/loader.d.ts +11 -0
  230. package/dist/js/modules/loader.d.ts.map +1 -0
  231. package/dist/js/modules/payments/api.d.ts +8 -0
  232. package/dist/js/modules/payments/api.d.ts.map +1 -0
  233. package/dist/js/modules/payments/bpoint.d.ts +2 -0
  234. package/dist/js/modules/payments/bpoint.d.ts.map +1 -0
  235. package/dist/js/modules/payments/constants.d.ts +5 -0
  236. package/dist/js/modules/payments/constants.d.ts.map +1 -0
  237. package/dist/js/modules/payments/eway.d.ts +9 -0
  238. package/dist/js/modules/payments/eway.d.ts.map +1 -0
  239. package/dist/js/modules/payments/factories.d.ts +54 -0
  240. package/dist/js/modules/payments/factories.d.ts.map +1 -0
  241. package/dist/js/modules/payments/go-cardless.d.ts +2 -0
  242. package/dist/js/modules/payments/go-cardless.d.ts.map +1 -0
  243. package/dist/js/modules/payments/host.d.ts +70 -0
  244. package/dist/js/modules/payments/host.d.ts.map +1 -0
  245. package/dist/js/modules/payments/index.d.ts +3 -0
  246. package/dist/js/modules/payments/index.d.ts.map +1 -0
  247. package/dist/js/modules/payments/mollie.d.ts +2 -0
  248. package/dist/js/modules/payments/mollie.d.ts.map +1 -0
  249. package/dist/js/modules/payments/moneris.d.ts +2 -0
  250. package/dist/js/modules/payments/moneris.d.ts.map +1 -0
  251. package/dist/js/modules/payments/opayo.d.ts +25 -0
  252. package/dist/js/modules/payments/opayo.d.ts.map +1 -0
  253. package/dist/js/modules/payments/paddle.d.ts +2 -0
  254. package/dist/js/modules/payments/paddle.d.ts.map +1 -0
  255. package/dist/js/modules/payments/paypal.d.ts +2 -0
  256. package/dist/js/modules/payments/paypal.d.ts.map +1 -0
  257. package/dist/js/modules/payments/payway.d.ts +2 -0
  258. package/dist/js/modules/payments/payway.d.ts.map +1 -0
  259. package/dist/js/modules/payments/square.d.ts +2 -0
  260. package/dist/js/modules/payments/square.d.ts.map +1 -0
  261. package/dist/js/modules/payments/stripe.d.ts +2 -0
  262. package/dist/js/modules/payments/stripe.d.ts.map +1 -0
  263. package/dist/js/modules/payments/utils.d.ts +17 -0
  264. package/dist/js/modules/payments/utils.d.ts.map +1 -0
  265. package/dist/js/modules/registry.d.ts +9 -0
  266. package/dist/js/modules/registry.d.ts.map +1 -0
  267. package/dist/js/modules/styles.d.ts +2 -0
  268. package/dist/js/modules/styles.d.ts.map +1 -0
  269. package/dist/js/submit/pipeline.d.ts +18 -0
  270. package/dist/js/submit/pipeline.d.ts.map +1 -0
  271. package/dist/js/theme/theme-classes.d.ts +10 -0
  272. package/dist/js/theme/theme-classes.d.ts.map +1 -0
  273. package/dist/js/transport/forms-api.d.ts +11 -0
  274. package/dist/js/transport/forms-api.d.ts.map +1 -0
  275. package/dist/js/utils/async.d.ts +8 -0
  276. package/dist/js/utils/async.d.ts.map +1 -0
  277. package/dist/js/utils/debug.d.ts +10 -0
  278. package/dist/js/utils/debug.d.ts.map +1 -0
  279. package/dist/js/utils/event-names.d.ts +13 -0
  280. package/dist/js/utils/event-names.d.ts.map +1 -0
  281. package/dist/js/utils/field-references.d.ts +6 -0
  282. package/dist/js/utils/field-references.d.ts.map +1 -0
  283. package/dist/js/utils/field-references.keys.d.ts +4 -0
  284. package/dist/js/utils/field-references.keys.d.ts.map +1 -0
  285. package/dist/js/utils/field-references.parser.d.ts +3 -0
  286. package/dist/js/utils/field-references.parser.d.ts.map +1 -0
  287. package/dist/js/utils/field-references.registry.d.ts +3 -0
  288. package/dist/js/utils/field-references.registry.d.ts.map +1 -0
  289. package/dist/js/utils/field-references.resolver.d.ts +4 -0
  290. package/dist/js/utils/field-references.resolver.d.ts.map +1 -0
  291. package/dist/js/utils/field-references.types.d.ts +27 -0
  292. package/dist/js/utils/field-references.types.d.ts.map +1 -0
  293. package/dist/js/utils/fields.d.ts +5 -0
  294. package/dist/js/utils/fields.d.ts.map +1 -0
  295. package/dist/js/utils/http.d.ts +9 -0
  296. package/dist/js/utils/http.d.ts.map +1 -0
  297. package/dist/js/utils/i18n.d.ts +7 -0
  298. package/dist/js/utils/i18n.d.ts.map +1 -0
  299. package/dist/js/utils/scripts.d.ts +13 -0
  300. package/dist/js/utils/scripts.d.ts.map +1 -0
  301. package/dist/js/utils/unload-warning.d.ts +10 -0
  302. package/dist/js/utils/unload-warning.d.ts.map +1 -0
  303. package/dist/js/validation/rules/email.d.ts +4 -0
  304. package/dist/js/validation/rules/email.d.ts.map +1 -0
  305. package/dist/js/validation/rules/match.d.ts +4 -0
  306. package/dist/js/validation/rules/match.d.ts.map +1 -0
  307. package/dist/js/validation/rules/number.d.ts +4 -0
  308. package/dist/js/validation/rules/number.d.ts.map +1 -0
  309. package/dist/js/validation/rules/required.d.ts +4 -0
  310. package/dist/js/validation/rules/required.d.ts.map +1 -0
  311. package/dist/js/validation/rules/shared.d.ts +7 -0
  312. package/dist/js/validation/rules/shared.d.ts.map +1 -0
  313. package/dist/js/validation/rules/url.d.ts +4 -0
  314. package/dist/js/validation/rules/url.d.ts.map +1 -0
  315. package/dist/js/validation/rules.d.ts +10 -0
  316. package/dist/js/validation/rules.d.ts.map +1 -0
  317. package/dist/js/validation/types.d.ts +44 -0
  318. package/dist/js/validation/types.d.ts.map +1 -0
  319. package/dist/js/validation/validator.d.ts +53 -0
  320. package/dist/js/validation/validator.d.ts.map +1 -0
  321. package/package.json +78 -0
  322. package/src/css/formie-base.css +78 -0
  323. package/src/css/formie-theme.css +19 -0
  324. package/src/css/formie.css +2 -0
  325. package/src/css/theme/_buttons.css +249 -0
  326. package/src/css/theme/_loading.css +37 -0
  327. package/src/css/theme/_messages.css +39 -0
  328. package/src/css/theme/_progress.css +62 -0
  329. package/src/css/theme/_tokens.css +361 -0
  330. package/src/css/theme/_typography.css +70 -0
  331. package/src/css/theme/fields/_address.css +17 -0
  332. package/src/css/theme/fields/_check-radio.css +108 -0
  333. package/src/css/theme/fields/_file.css +58 -0
  334. package/src/css/theme/fields/_group.css +13 -0
  335. package/src/css/theme/fields/_input.css +48 -0
  336. package/src/css/theme/fields/_nested.css +19 -0
  337. package/src/css/theme/fields/_repeater.css +69 -0
  338. package/src/css/theme/fields/_rich-text.css +201 -0
  339. package/src/css/theme/fields/_select.css +37 -0
  340. package/src/css/theme/fields/_signature.css +39 -0
  341. package/src/css/theme/fields/_summary.css +53 -0
  342. package/src/css/theme/fields/_table.css +121 -0
  343. package/src/css/theme/fields/_text-limit.css +10 -0
  344. package/src/css/theme/forms/_field.css +62 -0
  345. package/src/css/theme/forms/_form.css +166 -0
  346. package/src/css/theme/integrations/_payment-modal.css +32 -0
  347. package/src/css/theme/integrations/_paypal.css +10 -0
  348. package/src/css/theme/integrations/_payway.css +10 -0
  349. package/src/css/theme/integrations/_stripe.css +24 -0
  350. package/src/css/theme/utilities/_accessibility.css +13 -0
  351. package/src/css/theme-base/_controls.css +41 -0
  352. package/src/css/theme-base/_primitives.css +34 -0
  353. package/src/icons/rich-text/aligncenter.svg +6 -0
  354. package/src/icons/rich-text/alignleft.svg +6 -0
  355. package/src/icons/rich-text/alignright.svg +6 -0
  356. package/src/icons/rich-text/bold.svg +4 -0
  357. package/src/icons/rich-text/clear.svg +6 -0
  358. package/src/icons/rich-text/code.svg +4 -0
  359. package/src/icons/rich-text/heading1.svg +3 -0
  360. package/src/icons/rich-text/heading2.svg +3 -0
  361. package/src/icons/rich-text/image.svg +6 -0
  362. package/src/icons/rich-text/italic.svg +5 -0
  363. package/src/icons/rich-text/line.svg +3 -0
  364. package/src/icons/rich-text/link.svg +4 -0
  365. package/src/icons/rich-text/olist.svg +8 -0
  366. package/src/icons/rich-text/paragraph.svg +3 -0
  367. package/src/icons/rich-text/quote.svg +4 -0
  368. package/src/icons/rich-text/strikethrough.svg +4 -0
  369. package/src/icons/rich-text/ulist.svg +8 -0
  370. package/src/icons/rich-text/underline.svg +4 -0
  371. package/src/index.ts +125 -0
  372. package/src/js/compatibility/dom-adapter.ts +129 -0
  373. package/src/js/compatibility/event-map.ts +72 -0
  374. package/src/js/compatibility/validator-adapter.ts +105 -0
  375. package/src/js/contracts/client.ts +43 -0
  376. package/src/js/contracts/common.ts +14 -0
  377. package/src/js/contracts/modules.ts +53 -0
  378. package/src/js/contracts/schema.ts +83 -0
  379. package/src/js/contracts/theme.ts +1 -0
  380. package/src/js/core/create-formie-client.ts +1519 -0
  381. package/src/js/core/dom-events.ts +8 -0
  382. package/src/js/core/formie.ts +242 -0
  383. package/src/js/core/hydrate-modules.ts +102 -0
  384. package/src/js/core/page-client-event.ts +129 -0
  385. package/src/js/core/page-tab-errors.ts +37 -0
  386. package/src/js/core/submit-flow.ts +120 -0
  387. package/src/js/core/submit-result-state.ts +597 -0
  388. package/src/js/core/submit-result-ui.ts +448 -0
  389. package/src/js/events/event-bus.ts +109 -0
  390. package/src/js/modules/address/address-finder.ts +85 -0
  391. package/src/js/modules/address/api.ts +22 -0
  392. package/src/js/modules/address/constants.ts +15 -0
  393. package/src/js/modules/address/factories.ts +203 -0
  394. package/src/js/modules/address/google-address.ts +345 -0
  395. package/src/js/modules/address/host.ts +137 -0
  396. package/src/js/modules/address/index.ts +10 -0
  397. package/src/js/modules/address/loqate.ts +128 -0
  398. package/src/js/modules/address/place-kit.ts +94 -0
  399. package/src/js/modules/captchas/api.ts +25 -0
  400. package/src/js/modules/captchas/captcha-eu.ts +86 -0
  401. package/src/js/modules/captchas/constants.ts +4 -0
  402. package/src/js/modules/captchas/factories.ts +485 -0
  403. package/src/js/modules/captchas/friendly-captcha-v1.ts +65 -0
  404. package/src/js/modules/captchas/friendly-captcha-v2.ts +84 -0
  405. package/src/js/modules/captchas/hcaptcha.ts +153 -0
  406. package/src/js/modules/captchas/host.ts +448 -0
  407. package/src/js/modules/captchas/index.ts +16 -0
  408. package/src/js/modules/captchas/recaptcha-enterprise.ts +138 -0
  409. package/src/js/modules/captchas/recaptcha-shared.ts +69 -0
  410. package/src/js/modules/captchas/recaptcha-v2-checkbox.ts +72 -0
  411. package/src/js/modules/captchas/recaptcha-v2-invisible.ts +108 -0
  412. package/src/js/modules/captchas/recaptcha-v3.ts +62 -0
  413. package/src/js/modules/captchas/snaptcha.ts +10 -0
  414. package/src/js/modules/captchas/turnstile.ts +131 -0
  415. package/src/js/modules/captchas/utils.ts +85 -0
  416. package/src/js/modules/fields/calculations.ts +273 -0
  417. package/src/js/modules/fields/checkbox-radio.ts +295 -0
  418. package/src/js/modules/fields/conditions/config.ts +79 -0
  419. package/src/js/modules/fields/conditions/effects.ts +166 -0
  420. package/src/js/modules/fields/conditions/evaluator.ts +44 -0
  421. package/src/js/modules/fields/conditions/references.ts +165 -0
  422. package/src/js/modules/fields/conditions/transforms.ts +206 -0
  423. package/src/js/modules/fields/conditions/types.ts +33 -0
  424. package/src/js/modules/fields/conditions/values.ts +115 -0
  425. package/src/js/modules/fields/conditions.ts +229 -0
  426. package/src/js/modules/fields/date-picker.ts +272 -0
  427. package/src/js/modules/fields/file-upload.ts +628 -0
  428. package/src/js/modules/fields/hidden.ts +58 -0
  429. package/src/js/modules/fields/index.ts +19 -0
  430. package/src/js/modules/fields/phone-country.ts +226 -0
  431. package/src/js/modules/fields/repeater.ts +231 -0
  432. package/src/js/modules/fields/rich-text.ts +217 -0
  433. package/src/js/modules/fields/shared.ts +238 -0
  434. package/src/js/modules/fields/signature.ts +202 -0
  435. package/src/js/modules/fields/summary.ts +272 -0
  436. package/src/js/modules/fields/table.ts +197 -0
  437. package/src/js/modules/fields/text-limit.ts +280 -0
  438. package/src/js/modules/loader.ts +331 -0
  439. package/src/js/modules/payments/api.ts +20 -0
  440. package/src/js/modules/payments/bpoint.ts +48 -0
  441. package/src/js/modules/payments/constants.ts +17 -0
  442. package/src/js/modules/payments/eway.ts +132 -0
  443. package/src/js/modules/payments/factories.ts +332 -0
  444. package/src/js/modules/payments/go-cardless.ts +37 -0
  445. package/src/js/modules/payments/host.ts +459 -0
  446. package/src/js/modules/payments/index.ts +17 -0
  447. package/src/js/modules/payments/mollie.ts +38 -0
  448. package/src/js/modules/payments/moneris.ts +216 -0
  449. package/src/js/modules/payments/opayo.ts +272 -0
  450. package/src/js/modules/payments/paddle.ts +111 -0
  451. package/src/js/modules/payments/payment.ts +183 -0
  452. package/src/js/modules/payments/paypal.ts +214 -0
  453. package/src/js/modules/payments/payway.ts +114 -0
  454. package/src/js/modules/payments/square.ts +106 -0
  455. package/src/js/modules/payments/stripe.ts +426 -0
  456. package/src/js/modules/payments/stub-payment-module.ts +87 -0
  457. package/src/js/modules/payments/utils.ts +60 -0
  458. package/src/js/modules/registry.ts +38 -0
  459. package/src/js/modules/styles.ts +29 -0
  460. package/src/js/submit/pipeline.ts +514 -0
  461. package/src/js/theme/theme-classes.ts +106 -0
  462. package/src/js/transport/forms-api.ts +345 -0
  463. package/src/js/utils/async.ts +81 -0
  464. package/src/js/utils/debug.ts +59 -0
  465. package/src/js/utils/event-names.ts +60 -0
  466. package/src/js/utils/field-references.keys.ts +47 -0
  467. package/src/js/utils/field-references.parser.ts +121 -0
  468. package/src/js/utils/field-references.registry.ts +50 -0
  469. package/src/js/utils/field-references.resolver.ts +115 -0
  470. package/src/js/utils/field-references.ts +11 -0
  471. package/src/js/utils/field-references.types.ts +31 -0
  472. package/src/js/utils/fields.ts +58 -0
  473. package/src/js/utils/http.ts +51 -0
  474. package/src/js/utils/i18n.ts +98 -0
  475. package/src/js/utils/scripts.ts +84 -0
  476. package/src/js/utils/unload-warning.ts +190 -0
  477. package/src/js/validation/rules/email.ts +18 -0
  478. package/src/js/validation/rules/match.ts +26 -0
  479. package/src/js/validation/rules/minmax.ts +47 -0
  480. package/src/js/validation/rules/number.ts +55 -0
  481. package/src/js/validation/rules/pattern.ts +29 -0
  482. package/src/js/validation/rules/required.ts +30 -0
  483. package/src/js/validation/rules/shared.ts +47 -0
  484. package/src/js/validation/rules/url.ts +23 -0
  485. package/src/js/validation/rules.ts +16 -0
  486. package/src/js/validation/types.ts +50 -0
  487. package/src/js/validation/validator.ts +643 -0
  488. package/src/vendor.d.ts +100 -0
  489. package/src/vite-env.d.ts +22 -0
  490. package/vite-dev.mjs +22 -0
@@ -0,0 +1,960 @@
1
+ import { a as getFormStateEventName, u as normalizeFormieEventName } from "./event-names-DamGPtXR.js";
2
+ import { t as createDebug } from "./debug-KnZeKYBI.js";
3
+ import { i as toggleThemeClasses, r as removeThemeClasses, t as addThemeClasses } from "./theme-classes-vSHpdCUO.js";
4
+ import { i as t } from "./i18n-vUh-KGiH.js";
5
+ import { n as sleep, t as debounce } from "./async-B3DUf1GZ.js";
6
+ import { r as normalizeFieldKey, t as fieldKeyToInputName } from "./field-references.keys-BpBZ_quS.js";
7
+ import { n as resolveFieldReferenceLive, r as buildFieldValueRegistry } from "./field-references.resolver-Ba6xhiJC.js";
8
+ //#region src/js/core/page-client-event.ts
9
+ var debug$2 = createDebug("general", "page-client-event");
10
+ var CLIENT_EVENT_ATTR = "data-formie-client-event";
11
+ function escapePageIdForSelector(pageId) {
12
+ if (typeof window !== "undefined" && window.CSS?.escape) return window.CSS.escape(pageId);
13
+ return pageId.replace(/\\/g, "\\\\").replace(/"/g, "\\\"");
14
+ }
15
+ function resolveSubmittedPageId(form) {
16
+ const fromInput = form.querySelector("input[name=\"pageId\"]")?.value?.trim();
17
+ if (fromInput) return fromInput;
18
+ const fromVisible = form.querySelector("[data-formie-page]:not([data-formie-page-hidden])")?.getAttribute("data-formie-page-id")?.trim();
19
+ if (fromVisible) return fromVisible;
20
+ return form.querySelector("[data-formie-page]")?.getAttribute("data-formie-page-id")?.trim() || null;
21
+ }
22
+ function parseClientEventAttr(raw) {
23
+ if (!raw?.trim()) return null;
24
+ try {
25
+ const parsed = JSON.parse(raw);
26
+ return parsed && typeof parsed === "object" ? parsed : null;
27
+ } catch {
28
+ debug$2.warn("Invalid data-formie-client-event JSON.", { rawPreview: raw.slice(0, 80) });
29
+ return null;
30
+ }
31
+ }
32
+ function buildPayloadObject(fields) {
33
+ const out = {};
34
+ fields.forEach((row) => {
35
+ const key = typeof row.label === "string" ? row.label.trim() : "";
36
+ if (!key) return;
37
+ out[key] = typeof row.value === "string" ? row.value : "";
38
+ });
39
+ return out;
40
+ }
41
+ /**
42
+ * When the builder enables JavaScript events for a page, the theme emits
43
+ * `data-formie-client-event` on that page's section. On each successful
44
+ * **submit** (not back/save), push the configured key/value object to
45
+ * `window.dataLayer` (when present) and dispatch `formie:client-event`.
46
+ */
47
+ function dispatchPageClientEventForSubmit(form, action) {
48
+ if (action !== "submit") return;
49
+ const pageId = resolveSubmittedPageId(form);
50
+ if (!pageId) {
51
+ debug$2.log("No submitted page id; skipping client event.");
52
+ return;
53
+ }
54
+ const section = form.querySelector(`[data-formie-page][data-formie-page-id="${escapePageIdForSelector(pageId)}"]`);
55
+ if (!section) {
56
+ debug$2.log("No page section for id; skipping client event.", { pageId });
57
+ return;
58
+ }
59
+ const rawAttr = section.getAttribute(CLIENT_EVENT_ATTR);
60
+ if (rawAttr === null) return;
61
+ const config = parseClientEventAttr(rawAttr);
62
+ if (!config || !Array.isArray(config.fields)) return;
63
+ const payload = buildPayloadObject(config.fields);
64
+ const win = window;
65
+ win.dataLayer = win.dataLayer || [];
66
+ win.dataLayer.push(payload);
67
+ form.dispatchEvent(new CustomEvent("formie:client-event", {
68
+ bubbles: true,
69
+ detail: { payload }
70
+ }));
71
+ debug$2.log("Dispatched page client event.", {
72
+ pageId,
73
+ keys: Object.keys(payload)
74
+ });
75
+ }
76
+ //#endregion
77
+ //#region src/js/core/page-tab-errors.ts
78
+ function setTabErrorState(tab, hasError) {
79
+ toggleThemeClasses(tab, tab, "tabError", hasError);
80
+ if (hasError) {
81
+ tab.setAttribute("data-formie-tab-error", "true");
82
+ return;
83
+ }
84
+ tab.removeAttribute("data-formie-tab-error");
85
+ }
86
+ function syncPageTabErrors(form) {
87
+ const pageIdsWithErrors = /* @__PURE__ */ new Set();
88
+ form.querySelectorAll("[data-formie-page]").forEach((pageNode) => {
89
+ const page = pageNode;
90
+ const pageId = page.getAttribute("data-formie-page-id");
91
+ if (!pageId) return;
92
+ if (page.querySelector("[data-formie-field-has-error]")) pageIdsWithErrors.add(pageId);
93
+ });
94
+ form.querySelectorAll("[data-formie-tab]").forEach((tabNode) => {
95
+ const tab = tabNode;
96
+ const pageId = tab.getAttribute("data-formie-page-id");
97
+ setTabErrorState(tab, !!pageId && pageIdsWithErrors.has(pageId));
98
+ });
99
+ }
100
+ //#endregion
101
+ //#region src/js/core/submit-result-state.ts
102
+ var STALE_SUBMISSION_STATE_CODE = "STALE_SUBMISSION_STATE";
103
+ var finalSubmitResetTimers = /* @__PURE__ */ new WeakMap();
104
+ var originalSubmitterMarkup = /* @__PURE__ */ new WeakMap();
105
+ var debug$1 = createDebug("general", "submit-result");
106
+ function setHiddenInputValue(form, name, value) {
107
+ let input = form.querySelector(`input[name="${name}"]`);
108
+ if (!input) {
109
+ input = document.createElement("input");
110
+ input.type = "hidden";
111
+ input.name = name;
112
+ form.appendChild(input);
113
+ }
114
+ input.value = value;
115
+ }
116
+ function markInternalNavigation(form, reason) {
117
+ form.setAttribute("data-formie-internal-navigation", reason);
118
+ }
119
+ function removeHiddenInput(form, name) {
120
+ form.querySelector(`input[name="${name}"]`)?.remove();
121
+ }
122
+ function stripQueryParam(urlValue, paramName) {
123
+ try {
124
+ const url = new URL(urlValue, window.location.href);
125
+ url.searchParams.delete(paramName);
126
+ return url.toString();
127
+ } catch {
128
+ return urlValue;
129
+ }
130
+ }
131
+ function isSameOriginUrl(urlValue) {
132
+ try {
133
+ return new URL(urlValue, window.location.href).origin === window.location.origin;
134
+ } catch {
135
+ return false;
136
+ }
137
+ }
138
+ function getPageElements(form) {
139
+ return Array.from(form.querySelectorAll("[data-formie-page]"));
140
+ }
141
+ function getTabElements(form) {
142
+ return Array.from(form.querySelectorAll("[data-formie-tab]"));
143
+ }
144
+ function getProgressPercent(form, currentPageIndex, totalPages) {
145
+ if (currentPageIndex < 0 || totalPages < 1) return 0;
146
+ if ((form.dataset.formieProgressCalculation === "page-position" ? "page-position" : "completion") === "page-position") return Math.round((currentPageIndex + 1) / totalPages * 100);
147
+ return Math.round(currentPageIndex / totalPages * 100);
148
+ }
149
+ function getProgressState(progress) {
150
+ if (progress <= 0) return "start";
151
+ if (progress >= 100) return "end";
152
+ return "middle";
153
+ }
154
+ function getConfiguredSubmitAction(form) {
155
+ return (form.dataset.formieSubmitAction || "").trim();
156
+ }
157
+ function shouldHideFormOnSuccess(form) {
158
+ const rawValue = form.dataset.formieSubmitActionFormHide;
159
+ if (rawValue === void 0) return false;
160
+ const normalized = rawValue.trim().toLowerCase();
161
+ return normalized === "true" || normalized === "1" || normalized === "";
162
+ }
163
+ function setFormHiddenState(form, hidden) {
164
+ const sections = [
165
+ "[data-formie-form-header]",
166
+ "[data-formie-form-navigation]",
167
+ "[data-formie-form-body]",
168
+ "[data-formie-form-footer]"
169
+ ];
170
+ form.toggleAttribute("data-formie-form-hidden", hidden);
171
+ sections.forEach((selector) => {
172
+ form.querySelectorAll(selector).forEach((node) => {
173
+ const element = node;
174
+ if (hidden) element.hidden = true;
175
+ else element.hidden = false;
176
+ });
177
+ });
178
+ }
179
+ function clearPendingFinalSubmitReset(form) {
180
+ const timerId = finalSubmitResetTimers.get(form);
181
+ if (typeof timerId === "number") {
182
+ window.clearTimeout(timerId);
183
+ finalSubmitResetTimers.delete(form);
184
+ }
185
+ }
186
+ function setSubmitterLoadingText(submitter, loadingText) {
187
+ if (!originalSubmitterMarkup.has(submitter)) originalSubmitterMarkup.set(submitter, submitter.innerHTML);
188
+ submitter.textContent = loadingText;
189
+ }
190
+ function restoreSubmitterLoadingText(submitter) {
191
+ const originalMarkup = originalSubmitterMarkup.get(submitter);
192
+ if (originalMarkup === void 0) return;
193
+ submitter.innerHTML = originalMarkup;
194
+ originalSubmitterMarkup.delete(submitter);
195
+ }
196
+ function updateProgressUi(form, progress) {
197
+ const progressBar = form.querySelector("[data-formie-progress-bar]");
198
+ const progressValue = form.querySelector("[data-formie-progress-value]");
199
+ if (!progressBar) return;
200
+ progressBar.style.width = `${progress}%`;
201
+ progressBar.setAttribute("aria-valuenow", `${progress}`);
202
+ progressBar.setAttribute("data-formie-progress-state", getProgressState(progress));
203
+ if (progressValue) {
204
+ progressValue.textContent = `${progress}%`;
205
+ progressValue.setAttribute("data-formie-progress-value", `${progress}`);
206
+ }
207
+ }
208
+ function applySubmitterLoadingState(form, submitter) {
209
+ if (!submitter) return;
210
+ const indicator = (form.dataset.formieLoadingIndicator || "").trim();
211
+ if (!indicator) return;
212
+ submitter.setAttribute("data-formie-loading-indicator", indicator);
213
+ if (indicator === "spinner") {
214
+ toggleThemeClasses(submitter, form, "loading", true);
215
+ restoreSubmitterLoadingText(submitter);
216
+ submitter.removeAttribute("data-formie-loading-text");
217
+ return;
218
+ }
219
+ if (indicator === "text") {
220
+ const configuredText = (form.dataset.formieLoadingIndicatorText || "").trim();
221
+ const fallbackText = submitter.textContent?.trim() || "";
222
+ const loadingText = configuredText || fallbackText;
223
+ submitter.setAttribute("data-formie-loading-text", loadingText);
224
+ setSubmitterLoadingText(submitter, loadingText);
225
+ return;
226
+ }
227
+ restoreSubmitterLoadingText(submitter);
228
+ submitter.removeAttribute("data-formie-loading-text");
229
+ }
230
+ function getActionButtons(form) {
231
+ return Array.from(form.querySelectorAll("[data-formie-action]"));
232
+ }
233
+ function setSubmitLoading(form, submitter) {
234
+ if (form.getAttribute("data-formie-loading") === "true") return;
235
+ form.setAttribute("data-formie-loading", "true");
236
+ getActionButtons(form).forEach((button) => {
237
+ if ("disabled" in button) {
238
+ if (button.disabled) button.setAttribute("data-formie-was-disabled", "true");
239
+ else button.removeAttribute("data-formie-was-disabled");
240
+ button.disabled = true;
241
+ }
242
+ });
243
+ if (submitter) {
244
+ submitter.setAttribute("data-formie-loading", "true");
245
+ applySubmitterLoadingState(form, submitter);
246
+ }
247
+ }
248
+ function clearSubmitLoading(form) {
249
+ form.removeAttribute("data-formie-loading");
250
+ getActionButtons(form).forEach((button) => {
251
+ if ("disabled" in button) {
252
+ const element = button;
253
+ element.disabled = element.getAttribute("data-formie-was-disabled") === "true";
254
+ }
255
+ restoreSubmitterLoadingText(button);
256
+ button.removeAttribute("data-formie-was-disabled");
257
+ button.removeAttribute("data-formie-loading");
258
+ toggleThemeClasses(button, form, "loading", false);
259
+ button.removeAttribute("data-formie-loading-indicator");
260
+ button.removeAttribute("data-formie-loading-text");
261
+ });
262
+ }
263
+ function applyPageState(form, nextPageId) {
264
+ const pages = getPageElements(form);
265
+ const tabs = getTabElements(form);
266
+ const currentPageIndex = pages.findIndex((page) => {
267
+ return page.getAttribute("data-formie-page-id") === nextPageId;
268
+ });
269
+ pages.forEach((page) => {
270
+ if (page.getAttribute("data-formie-page-id") === nextPageId) {
271
+ page.removeAttribute("data-formie-page-hidden");
272
+ removeThemeClasses(page, form, "pageHidden");
273
+ } else {
274
+ page.setAttribute("data-formie-page-hidden", "true");
275
+ addThemeClasses(page, form, "pageHidden");
276
+ }
277
+ });
278
+ tabs.forEach((tab, index) => {
279
+ const isCurrent = tab.getAttribute("data-formie-page-id") === nextPageId;
280
+ const isComplete = currentPageIndex > -1 && index < currentPageIndex;
281
+ toggleThemeClasses(tab, form, "tabCurrent", isCurrent);
282
+ toggleThemeClasses(tab, form, "tabComplete", isComplete);
283
+ if (isCurrent) tab.setAttribute("aria-current", "page");
284
+ else tab.removeAttribute("aria-current");
285
+ if (isComplete) tab.setAttribute("data-formie-tab-complete", "true");
286
+ else tab.removeAttribute("data-formie-tab-complete");
287
+ });
288
+ if (currentPageIndex > -1 && pages.length > 0) updateProgressUi(form, getProgressPercent(form, currentPageIndex, pages.length));
289
+ setHiddenInputValue(form, "pageId", nextPageId);
290
+ syncPageTabErrors(form);
291
+ }
292
+ function syncSubmissionIdentity(form, result) {
293
+ const submissionUid = result.meta?.submissionUid;
294
+ if (typeof submissionUid === "string" && submissionUid.trim() !== "") setHiddenInputValue(form, "submissionUid", submissionUid);
295
+ const continuationToken = (result.meta?.session)?.continuation?.continuationToken;
296
+ if (typeof continuationToken === "string" && continuationToken.trim() !== "") setHiddenInputValue(form, "continuationToken", continuationToken);
297
+ else removeHiddenInput(form, "continuationToken");
298
+ }
299
+ function clearResumeTokenState(form) {
300
+ const action = form.getAttribute("action");
301
+ if (action) form.setAttribute("action", stripQueryParam(action, "resumeToken"));
302
+ try {
303
+ const url = new URL(window.location.href);
304
+ if (!url.searchParams.has("resumeToken")) return;
305
+ url.searchParams.delete("resumeToken");
306
+ window.history.replaceState({}, document.title, `${url.pathname}${url.search}${url.hash}`);
307
+ } catch {}
308
+ }
309
+ function applyResumeTokenState(form, result) {
310
+ const resumeUrl = result.meta?.resumeUrl;
311
+ if (typeof resumeUrl !== "string" || resumeUrl.trim() === "") return;
312
+ const normalizedResumeUrl = resumeUrl.trim();
313
+ if (!isSameOriginUrl(normalizedResumeUrl)) return;
314
+ if (form.getAttribute("action")) form.setAttribute("action", normalizedResumeUrl);
315
+ try {
316
+ const url = new URL(normalizedResumeUrl, window.location.href);
317
+ window.history.replaceState({}, document.title, `${url.pathname}${url.search}${url.hash}`);
318
+ } catch {}
319
+ }
320
+ function resetSubmissionState(form, options = {}) {
321
+ const validator = form.formieValidation;
322
+ const firstPageId = getPageElements(form)[0]?.getAttribute("data-formie-page-id");
323
+ clearPendingFinalSubmitReset(form);
324
+ form.reset();
325
+ if (!options.preserveHiddenState) setFormHiddenState(form, false);
326
+ removeHiddenInput(form, "submissionId");
327
+ removeHiddenInput(form, "submissionUid");
328
+ removeHiddenInput(form, "continuationToken");
329
+ removeHiddenInput(form, "pageId");
330
+ clearResumeTokenState(form);
331
+ validator?.resetLiveState();
332
+ if (firstPageId) {
333
+ applyPageState(form, firstPageId);
334
+ form.dispatchEvent(new CustomEvent(getFormStateEventName("reset"), { bubbles: true }));
335
+ return;
336
+ }
337
+ syncPageTabErrors(form);
338
+ form.dispatchEvent(new CustomEvent(getFormStateEventName("reset"), { bubbles: true }));
339
+ }
340
+ function shouldResetSubmissionState(result) {
341
+ return result.code === STALE_SUBMISSION_STATE_CODE || result.meta?.resetState === true;
342
+ }
343
+ function dispatchSubmitDataEvents(form, result) {
344
+ const submitData = result.submitData;
345
+ const dispatchedEvents = /* @__PURE__ */ new Set();
346
+ let hasPaymentFollowUpEvent = false;
347
+ if (Array.isArray(submitData) && submitData.length > 0) {
348
+ const events = submitData.filter((item) => typeof item === "object" && item !== null && "event" in item && typeof item.event === "string");
349
+ for (const eventData of events) {
350
+ const eventName = normalizeFormieEventName(eventData.event);
351
+ dispatchedEvents.add(eventName);
352
+ debug$1.log("Dispatching submitData event.", { eventName });
353
+ if (eventName.startsWith("formie:payment:")) hasPaymentFollowUpEvent = true;
354
+ form.dispatchEvent(new CustomEvent(eventName, {
355
+ bubbles: true,
356
+ detail: { data: eventData.data }
357
+ }));
358
+ }
359
+ }
360
+ const meta = result.meta || {};
361
+ const paymentAction = (meta.paymentAction && typeof meta.paymentAction === "object" ? meta.paymentAction : null) || (meta.paymentDecision && typeof meta.paymentDecision === "object" ? meta.paymentDecision.action : null);
362
+ const actionEvent = paymentAction ? String(paymentAction.event || "") : "";
363
+ const actionPayload = paymentAction ? paymentAction.payload : void 0;
364
+ const normalizedActionEvent = normalizeFormieEventName(actionEvent);
365
+ if (normalizedActionEvent && !dispatchedEvents.has(normalizedActionEvent)) {
366
+ if (normalizedActionEvent.startsWith("formie:payment:")) hasPaymentFollowUpEvent = true;
367
+ form.dispatchEvent(new CustomEvent(normalizedActionEvent, {
368
+ bubbles: true,
369
+ detail: { data: actionPayload }
370
+ }));
371
+ debug$1.log("Dispatching fallback payment action event.", { eventName: normalizedActionEvent });
372
+ }
373
+ return { hasPaymentFollowUpEvent };
374
+ }
375
+ function applySubmitResultState(form, result, action) {
376
+ debug$1.log("Applying submit result state.", {
377
+ ok: result.ok,
378
+ action,
379
+ code: result.code,
380
+ hasRedirect: !!result.redirect?.url,
381
+ hasSubmitData: Array.isArray(result.submitData) && result.submitData.length > 0
382
+ });
383
+ if (shouldResetSubmissionState(result)) {
384
+ resetSubmissionState(form);
385
+ debug$1.log("Resetting state due to stale/reset marker.");
386
+ return;
387
+ }
388
+ const eventDispatchResult = dispatchSubmitDataEvents(form, result);
389
+ if (!result.ok && result.redirect?.url && !eventDispatchResult.hasPaymentFollowUpEvent) {
390
+ debug$1.log("Applying redirect fallback for failed result.", {
391
+ url: result.redirect.url,
392
+ target: result.redirect.target
393
+ });
394
+ clearPendingFinalSubmitReset(form);
395
+ if (result.redirect.target === "new-tab") window.open(result.redirect.url, "_blank");
396
+ else {
397
+ markInternalNavigation(form, "redirect");
398
+ window.location.href = result.redirect.url;
399
+ }
400
+ return;
401
+ }
402
+ syncSubmissionIdentity(form, result);
403
+ if (!result.ok) {
404
+ debug$1.log("Non-redirect failure; keeping current form state.");
405
+ clearPendingFinalSubmitReset(form);
406
+ return;
407
+ }
408
+ dispatchPageClientEventForSubmit(form, action);
409
+ if (result.nextPage?.id) {
410
+ clearPendingFinalSubmitReset(form);
411
+ form.formieValidation?.resetLiveState();
412
+ applyPageState(form, result.nextPage.id);
413
+ debug$1.log("Advanced to next page.", { nextPageId: result.nextPage.id });
414
+ return;
415
+ }
416
+ if (action === "save") {
417
+ clearPendingFinalSubmitReset(form);
418
+ applyResumeTokenState(form, result);
419
+ debug$1.log("Applied save/resume token state.");
420
+ return;
421
+ }
422
+ if (action === "submit" && !result.redirect?.url) {
423
+ const configuredSubmitAction = getConfiguredSubmitAction(form);
424
+ const preserveHiddenState = configuredSubmitAction === "message" && shouldHideFormOnSuccess(form);
425
+ if (configuredSubmitAction === "reload") {
426
+ clearPendingFinalSubmitReset(form);
427
+ markInternalNavigation(form, "reload");
428
+ window.location.reload();
429
+ return;
430
+ }
431
+ if (configuredSubmitAction === "reset") {
432
+ resetSubmissionState(form);
433
+ return;
434
+ }
435
+ clearPendingFinalSubmitReset(form);
436
+ resetSubmissionState(form, { preserveHiddenState });
437
+ return;
438
+ }
439
+ if (action === "submit" && result.redirect?.url && result.redirect.target === "new-tab") {
440
+ const preserveHiddenState = getConfiguredSubmitAction(form) === "message" && shouldHideFormOnSuccess(form);
441
+ clearPendingFinalSubmitReset(form);
442
+ resetSubmissionState(form, { preserveHiddenState });
443
+ return;
444
+ }
445
+ clearPendingFinalSubmitReset(form);
446
+ }
447
+ //#endregion
448
+ //#region src/js/modules/payments/constants.ts
449
+ /** Default timeout (ms) to wait for payment token inputs to populate. */
450
+ var DEFAULT_WAIT_FOR_VALUE_MS = 2500;
451
+ /** Per-provider default required input name suffixes for payment tokens. */
452
+ var DEFAULT_REQUIRED_INPUT_SUFFIXES = {
453
+ bpoint: ["bpointToken"],
454
+ stripe: ["stripePaymentIntentId"],
455
+ paypal: ["paypalOrderId", "paypalAuthId"],
456
+ payway: ["paywayTokenId"],
457
+ opayo: ["opayoTokenId"],
458
+ eway: ["ewayTokenData"],
459
+ "go-cardless": ["goCardlessRedirectId"],
460
+ mollie: ["molliePaymentId"],
461
+ moneris: ["monerisTokenId"],
462
+ paddle: ["paddleTransactionId"],
463
+ square: ["squarePaymentId"]
464
+ };
465
+ //#endregion
466
+ //#region src/js/utils/fields.ts
467
+ function normalizeHandle(handle) {
468
+ return handle.replace("{field:", "").replace("{", "").replace("}", "").replace("]", "").split("[").join("][");
469
+ }
470
+ function getFieldName(handle) {
471
+ return `fields[${normalizeHandle(handle)}]`;
472
+ }
473
+ function getFormFields(form, handle) {
474
+ const fieldName = getFieldName(handle);
475
+ const direct = Array.from(form.querySelectorAll(`[name="${fieldName}"]`));
476
+ const multi = Array.from(form.querySelectorAll(`[name="${fieldName}[]"]`));
477
+ return (multi.length ? multi : direct).filter((element) => {
478
+ return element instanceof HTMLElement;
479
+ });
480
+ }
481
+ function getFieldLabel(form, handle) {
482
+ const fields = getFormFields(form, handle);
483
+ for (const field of fields) {
484
+ const label = field.closest("[data-formie-field-handle]")?.querySelector("[data-formie-field-label]")?.childNodes[0]?.textContent?.trim();
485
+ if (label) return label;
486
+ }
487
+ return "";
488
+ }
489
+ function currencyToFloat(currencyString) {
490
+ let sanitized = currencyString.replace(/[^\d.,-]/g, "");
491
+ const hasComma = sanitized.includes(",");
492
+ const hasDot = sanitized.includes(".");
493
+ if (hasComma && hasDot) sanitized = sanitized.replace(/\./g, "").replace(/,/, ".");
494
+ else if (hasComma && !hasDot) sanitized = sanitized.replace(/,/, ".");
495
+ else sanitized = sanitized.replace(/,/g, "");
496
+ return parseFloat(sanitized);
497
+ }
498
+ //#endregion
499
+ //#region src/js/modules/payments/utils.ts
500
+ function findPaymentInputBySuffix(root, suffix) {
501
+ const escapedSuffix = suffix.replace(/"/g, "\\\"");
502
+ return root.querySelector(`input[name$="[${escapedSuffix}]"]`) || root.querySelector(`input[name$="${escapedSuffix}"]`);
503
+ }
504
+ function hasRequiredPaymentInputs(root, requiredInputSuffixes) {
505
+ const missingSuffix = requiredInputSuffixes.find((suffix) => {
506
+ const input = findPaymentInputBySuffix(root, suffix);
507
+ return !input || String(input.value || "").trim() === "";
508
+ });
509
+ return {
510
+ ok: !missingSuffix,
511
+ missingSuffix
512
+ };
513
+ }
514
+ async function waitForRequiredPaymentInputs(root, requiredInputSuffixes, waitForValueMs) {
515
+ const initial = hasRequiredPaymentInputs(root, requiredInputSuffixes);
516
+ if (initial.ok) return initial;
517
+ const deadline = Date.now() + Math.max(waitForValueMs, 0);
518
+ while (Date.now() < deadline) {
519
+ await sleep(120);
520
+ const current = hasRequiredPaymentInputs(root, requiredInputSuffixes);
521
+ if (current.ok) return current;
522
+ }
523
+ return hasRequiredPaymentInputs(root, requiredInputSuffixes);
524
+ }
525
+ //#endregion
526
+ //#region src/js/modules/payments/host.ts
527
+ var PAYMENT_OPTION_KEYS = new Set([
528
+ "handle",
529
+ "requiredInputSuffixes",
530
+ "waitForValueMs",
531
+ "errorMessage"
532
+ ]);
533
+ var PAYMENT_SUCCESS_SELECTOR = "[data-payment-success]";
534
+ var PAYMENT_ERROR_SELECTOR = "[data-payment-error]";
535
+ function getPaymentProviderHandle(id, options) {
536
+ return (typeof options.handle === "string" && options.handle.trim() !== "" ? options.handle.trim() : "") || id;
537
+ }
538
+ function normalizePaymentModuleOptions(id, rawOptions, defaults) {
539
+ const options = rawOptions || {};
540
+ const provider = Object.entries(options).reduce((carry, [key, value]) => {
541
+ if (PAYMENT_OPTION_KEYS.has(key)) return carry;
542
+ carry[key] = value;
543
+ return carry;
544
+ }, {});
545
+ const requiredInputSuffixes = Array.isArray(options.requiredInputSuffixes) ? options.requiredInputSuffixes.map(String).filter(Boolean) : defaults.defaultRequiredInputSuffixes || [];
546
+ const waitForValueMs = Number(options.waitForValueMs ?? defaults.defaultWaitForValueMs ?? 2500);
547
+ const errorMessage = typeof options.errorMessage === "string" && options.errorMessage.trim() !== "" ? options.errorMessage.trim() : "Payment authorization is incomplete.";
548
+ return {
549
+ handle: getPaymentProviderHandle(id, options),
550
+ transport: {
551
+ requiredInputSuffixes,
552
+ waitForValueMs: Number.isFinite(waitForValueMs) ? waitForValueMs : DEFAULT_WAIT_FOR_VALUE_MS,
553
+ errorMessage
554
+ },
555
+ provider
556
+ };
557
+ }
558
+ function bindDomEvent(target, eventName, callback) {
559
+ target.addEventListener(eventName, callback);
560
+ return () => {
561
+ target.removeEventListener(eventName, callback);
562
+ };
563
+ }
564
+ function createPaymentHostServices(ctx, options) {
565
+ const field = ctx.target;
566
+ const form = ctx.form;
567
+ const root = ctx.root;
568
+ const tokenRoot = form || root;
569
+ const suffixes = options.transport.requiredInputSuffixes;
570
+ const getRegistry = () => {
571
+ return buildFieldValueRegistry(form || root);
572
+ };
573
+ const getReferenceValue = (reference) => {
574
+ const value = resolveFieldReferenceLive(reference, getRegistry()).value;
575
+ if (Array.isArray(value)) return value[0] || "";
576
+ return String(value || "");
577
+ };
578
+ const updateInputs = (name, value) => {
579
+ const names = Array.isArray(name) ? name : [name];
580
+ for (const n of names) {
581
+ const input = findPaymentInputBySuffix(tokenRoot, n) ?? field.querySelector(`input[name*="${n}"]`);
582
+ if (input) input.value = value;
583
+ }
584
+ };
585
+ const addError = (message) => {
586
+ const container = field.querySelector("[data-formie-field-type] > div, [data-field-type] > div") || field;
587
+ const existing = container.querySelector(PAYMENT_ERROR_SELECTOR);
588
+ if (existing) existing.remove();
589
+ const el = document.createElement("div");
590
+ el.setAttribute("data-payment-error", "");
591
+ el.textContent = message;
592
+ addThemeClasses(el, form || root, "fieldError");
593
+ container.appendChild(el);
594
+ };
595
+ const removeError = () => {
596
+ field.querySelector(PAYMENT_ERROR_SELECTOR)?.remove();
597
+ };
598
+ const addSuccess = (message) => {
599
+ const container = field.querySelector("[data-formie-field-type] > div, [data-field-type] > div") || field;
600
+ const existing = container.querySelector(PAYMENT_SUCCESS_SELECTOR);
601
+ if (existing) existing.remove();
602
+ const el = document.createElement("div");
603
+ el.setAttribute("data-payment-success", "");
604
+ el.textContent = message;
605
+ addThemeClasses(el, form || root, "successMessage");
606
+ container.appendChild(el);
607
+ };
608
+ const removeSuccess = () => {
609
+ field.querySelector(PAYMENT_SUCCESS_SELECTOR)?.remove();
610
+ };
611
+ const triggerSubmit = () => {
612
+ if (form) form.setAttribute("data-formie-internal-resubmit", "true");
613
+ if (form && typeof form.requestSubmit === "function") form.requestSubmit();
614
+ else if (form) form.submit();
615
+ };
616
+ const releaseSubmitLoading = () => {
617
+ if (!form) return;
618
+ form.removeAttribute("data-formie-internal-resubmit");
619
+ clearSubmitLoading(form);
620
+ };
621
+ const resolveAmount = (opts) => {
622
+ const searchRoot = form || root;
623
+ const isDynamic = String(opts.type || "").toLowerCase() === "dynamic" && typeof opts.variable === "string" && opts.variable.trim() !== "";
624
+ const source = opts.value ?? (isDynamic ? opts.variable : opts.fixed);
625
+ const sourceString = String(source ?? "").trim();
626
+ const numericDirect = typeof source === "number" ? source : currencyToFloat(sourceString);
627
+ if (Number.isFinite(numericDirect) && numericDirect > 0) return {
628
+ ok: true,
629
+ value: numericDirect
630
+ };
631
+ if (sourceString !== "") {
632
+ const raw = getReferenceValue(sourceString);
633
+ const numeric = currencyToFloat(raw);
634
+ if (Number.isFinite(numeric) && numeric > 0) return {
635
+ ok: true,
636
+ value: numeric
637
+ };
638
+ const label = getFieldLabel(searchRoot, sourceString);
639
+ if (!raw) return {
640
+ ok: false,
641
+ error: label ? t("Provide a value for \"{label}\" to proceed.", { label }) : t("Provide a payment amount to proceed.")
642
+ };
643
+ }
644
+ return {
645
+ ok: false,
646
+ error: t("Payment amount must be greater than 0.")
647
+ };
648
+ };
649
+ const resolveCurrency = (opts) => {
650
+ const searchRoot = form || root;
651
+ const isDynamic = String(opts.type || "").toLowerCase() === "dynamic" && typeof opts.variable === "string" && opts.variable.trim() !== "";
652
+ const source = opts.value ?? (isDynamic ? opts.variable : opts.fixed ?? opts.defaultCurrency ?? "");
653
+ const sourceString = String(source ?? "").trim();
654
+ const direct = sourceString.toUpperCase();
655
+ if (/^[A-Z]{3}$/.test(direct) && !isDynamic) return {
656
+ ok: true,
657
+ value: direct
658
+ };
659
+ if (sourceString !== "") {
660
+ const raw = String(getReferenceValue(sourceString) || "").trim();
661
+ const normalized = raw.toUpperCase();
662
+ if (/^[A-Z]{3}$/.test(normalized)) return {
663
+ ok: true,
664
+ value: normalized
665
+ };
666
+ const label = getFieldLabel(searchRoot, sourceString);
667
+ if (!raw) return {
668
+ ok: false,
669
+ error: label ? t("Provide a value for \"{label}\" to proceed.", { label }) : t("Provide a payment currency to proceed.")
670
+ };
671
+ }
672
+ return {
673
+ ok: false,
674
+ error: t("Payment currency must be a valid 3-letter code.")
675
+ };
676
+ };
677
+ const watchFieldValueChanges = (handles, callback, debounceMs = 600) => {
678
+ const searchRoot = form || root;
679
+ const normalizedHandles = handles.map((handle) => String(handle || "").trim()).filter(Boolean);
680
+ if (normalizedHandles.length === 0) return () => {};
681
+ const registry = getRegistry();
682
+ const watchedNames = /* @__PURE__ */ new Set();
683
+ normalizedHandles.forEach((handle) => {
684
+ const key = normalizeFieldKey(handle);
685
+ const entry = registry.get(key);
686
+ if (entry?.names?.length) {
687
+ entry.names.forEach((name) => {
688
+ watchedNames.add(name);
689
+ });
690
+ return;
691
+ }
692
+ const fallback = fieldKeyToInputName(key);
693
+ if (fallback) {
694
+ watchedNames.add(fallback);
695
+ watchedNames.add(`${fallback}[]`);
696
+ }
697
+ });
698
+ const debounced = debounce(() => {
699
+ callback();
700
+ }, debounceMs);
701
+ const onInput = (event) => {
702
+ const inputName = event.target?.name || "";
703
+ if (!inputName || !watchedNames.has(inputName)) return;
704
+ debounced();
705
+ };
706
+ searchRoot.addEventListener("input", onInput);
707
+ searchRoot.addEventListener("change", onInput);
708
+ return () => {
709
+ searchRoot.removeEventListener("input", onInput);
710
+ searchRoot.removeEventListener("change", onInput);
711
+ };
712
+ };
713
+ return {
714
+ root,
715
+ form,
716
+ field,
717
+ updateInputs,
718
+ addError,
719
+ removeError,
720
+ addSuccess,
721
+ removeSuccess,
722
+ hasToken: () => hasRequiredPaymentInputs(tokenRoot, suffixes).ok,
723
+ waitForToken: (timeoutMs = options.transport.waitForValueMs) => {
724
+ return waitForRequiredPaymentInputs(tokenRoot, suffixes, timeoutMs).then((r) => r.ok);
725
+ },
726
+ getFieldValue: (handle, type = "string") => {
727
+ const raw = getReferenceValue(handle);
728
+ if (type === "float" || type === "int" || type === "number") return currencyToFloat(raw);
729
+ return raw;
730
+ },
731
+ resolveAmount,
732
+ resolveCurrency,
733
+ watchFieldValueChanges,
734
+ triggerSubmit,
735
+ releaseSubmitLoading,
736
+ getBillingData: (billingDetails) => {
737
+ const billing = {};
738
+ if (!billingDetails || typeof billingDetails !== "object") return { billing_details: billing };
739
+ if (billingDetails.billingName) {
740
+ const name = getReferenceValue(billingDetails.billingName);
741
+ if (name) billing.name = name;
742
+ }
743
+ if (billingDetails.billingEmail) {
744
+ const email = getReferenceValue(billingDetails.billingEmail);
745
+ if (email) billing.email = email;
746
+ }
747
+ if (billingDetails.billingAddress) {
748
+ const addr = billingDetails.billingAddress;
749
+ const address = {};
750
+ const address1 = getReferenceValue(`${addr}.address1`);
751
+ const address2 = getReferenceValue(`${addr}.address2`);
752
+ const address3 = getReferenceValue(`${addr}.address3`);
753
+ const city = getReferenceValue(`${addr}.city`);
754
+ const zip = getReferenceValue(`${addr}.zip`);
755
+ const state = getReferenceValue(`${addr}.state`);
756
+ const country = getReferenceValue(`${addr}.country`);
757
+ if (address1) address.line1 = address1;
758
+ if (address2) address.line2 = address2;
759
+ if (address3) address.line3 = address3;
760
+ if (city) address.city = city;
761
+ if (zip) address.postal_code = zip;
762
+ if (state) address.state = state;
763
+ if (country) address.country = country;
764
+ if (Object.keys(address).length) billing.address = address;
765
+ }
766
+ return { billing_details: billing };
767
+ },
768
+ events: {
769
+ onForm: (eventName, callback) => {
770
+ if (!form) return () => {};
771
+ return bindDomEvent(form, eventName, callback);
772
+ },
773
+ onRoot: (eventName, callback) => bindDomEvent(root, eventName, callback)
774
+ }
775
+ };
776
+ }
777
+ //#endregion
778
+ //#region src/js/modules/payments/factories.ts
779
+ var debug = createDebug("payments");
780
+ function isTargetVisible(element) {
781
+ const node = element;
782
+ return !node.closest("[data-formie-page-hidden]") && !node.closest("[hidden]");
783
+ }
784
+ function createManagedPaymentModule(adapter) {
785
+ const defaultSuffixes = adapter.defaultRequiredInputSuffixes ?? DEFAULT_REQUIRED_INPUT_SUFFIXES[adapter.id] ?? [];
786
+ return {
787
+ id: adapter.id,
788
+ kind: "payment",
789
+ match: (ctx) => {
790
+ return !!(ctx.target.querySelector("[data-formie-field-type=\"payment\"]") || ctx.target.closest("[data-formie-field-type=\"payment\"]") || ctx.target.getAttribute?.("data-formie-field-type") === "payment");
791
+ },
792
+ setup: async (ctx) => {
793
+ const fieldWithRegistry = ctx.target;
794
+ const registry = fieldWithRegistry.__formiePaymentModuleRegistry || {};
795
+ fieldWithRegistry.__formiePaymentModuleRegistry = registry;
796
+ const previous = registry[adapter.id];
797
+ if (previous?.destroy) {
798
+ debug.warn("Found stale payment module instance; destroying previous.", { moduleId: adapter.id });
799
+ try {
800
+ await previous.destroy();
801
+ } catch {}
802
+ }
803
+ const options = normalizePaymentModuleOptions(adapter.id, ctx.options || {}, { defaultRequiredInputSuffixes: defaultSuffixes });
804
+ const services = createPaymentHostServices(ctx, options);
805
+ const setupCtx = {
806
+ ...ctx,
807
+ options,
808
+ services
809
+ };
810
+ const cleanups = [];
811
+ let apiPromise = null;
812
+ let widget = null;
813
+ let customSetupResult = null;
814
+ let authorizeInFlight = null;
815
+ const getApi = async () => {
816
+ if (!apiPromise) {
817
+ debug.log("Loading payment provider API.", { moduleId: adapter.id });
818
+ apiPromise = adapter.load(setupCtx);
819
+ }
820
+ return apiPromise;
821
+ };
822
+ const ensureMounted = async () => {
823
+ if (!adapter.mount || widget || !isTargetVisible(ctx.target)) return;
824
+ const api = await getApi();
825
+ try {
826
+ widget = await adapter.mount({
827
+ api,
828
+ field: ctx.target,
829
+ services,
830
+ options,
831
+ provider: options.provider
832
+ });
833
+ debug.log("Payment widget mounted.", {
834
+ moduleId: adapter.id,
835
+ handle: options.handle
836
+ });
837
+ } catch {
838
+ debug.warn("Payment widget mount failed.", {
839
+ moduleId: adapter.id,
840
+ handle: options.handle
841
+ });
842
+ }
843
+ };
844
+ cleanups.push(ctx.on("formie:submit:before", () => {
845
+ services.removeError();
846
+ services.removeSuccess();
847
+ }));
848
+ if (adapter.setup) {
849
+ const root = ctx.root || ctx.form || ctx.target;
850
+ customSetupResult = await adapter.setup({
851
+ ...setupCtx,
852
+ root
853
+ });
854
+ if (customSetupResult.destroy) cleanups.push(customSetupResult.destroy);
855
+ }
856
+ if (adapter.mount && isTargetVisible(ctx.target)) await ensureMounted();
857
+ ["formie:page:navigate:after", "formie:submit:result"].forEach((eventName) => {
858
+ const handleVisibility = () => {
859
+ ensureMounted();
860
+ };
861
+ ctx.root.addEventListener(eventName, handleVisibility);
862
+ cleanups.push(() => {
863
+ ctx.root.removeEventListener(eventName, handleVisibility);
864
+ });
865
+ });
866
+ const destroy = async () => {
867
+ debug.log("Destroying payment module.", {
868
+ moduleId: adapter.id,
869
+ handle: options.handle
870
+ });
871
+ cleanups.forEach((c) => c());
872
+ if (widget && adapter.unmount) {
873
+ const api = await getApi();
874
+ await adapter.unmount({
875
+ api,
876
+ widget,
877
+ field: ctx.target,
878
+ services,
879
+ options,
880
+ provider: options.provider
881
+ });
882
+ debug.log("Payment widget unmounted.", {
883
+ moduleId: adapter.id,
884
+ handle: options.handle
885
+ });
886
+ }
887
+ if (registry[adapter.id]?.destroy === destroy) delete registry[adapter.id];
888
+ debug.log("Payment module destroy complete.", {
889
+ moduleId: adapter.id,
890
+ handle: options.handle
891
+ });
892
+ };
893
+ registry[adapter.id] = { destroy };
894
+ return {
895
+ destroy,
896
+ onBeforeStage: async (stageCtx) => {
897
+ if (customSetupResult?.onBeforeStage) {
898
+ await customSetupResult.onBeforeStage(stageCtx);
899
+ return;
900
+ }
901
+ if (stageCtx.stage !== "authorize" || stageCtx.action !== "submit") return;
902
+ if (ctx.target.closest("[data-formie-page]")?.hasAttribute("data-formie-page-hidden")) return;
903
+ await ensureMounted();
904
+ const api = await getApi();
905
+ if (adapter.onBeforeAuthorize) {
906
+ if (!authorizeInFlight) authorizeInFlight = (async () => {
907
+ return adapter.onBeforeAuthorize({
908
+ api,
909
+ widget,
910
+ field: ctx.target,
911
+ services,
912
+ options,
913
+ provider: options.provider,
914
+ stageCtx
915
+ });
916
+ })().finally(() => {
917
+ authorizeInFlight = null;
918
+ });
919
+ const ok = await authorizeInFlight;
920
+ debug.log("onBeforeAuthorize resolved.", {
921
+ moduleId: adapter.id,
922
+ handle: options.handle,
923
+ ok
924
+ });
925
+ if (!ok) {
926
+ stageCtx.abort(options.transport.errorMessage);
927
+ return;
928
+ }
929
+ return;
930
+ }
931
+ if (options.transport.requiredInputSuffixes.length === 0) return;
932
+ const result = await waitForRequiredPaymentInputs(ctx.form || ctx.root, options.transport.requiredInputSuffixes, options.transport.waitForValueMs);
933
+ if (!result.ok) {
934
+ debug.warn("Required payment input(s) missing.", {
935
+ moduleId: adapter.id,
936
+ handle: options.handle,
937
+ missingSuffix: result.missingSuffix
938
+ });
939
+ stageCtx.abort(options.transport.errorMessage);
940
+ }
941
+ },
942
+ onAfterStage: async (stagePayload, result) => {
943
+ if (stagePayload.stage !== "dispatch" || !adapter.onAfterSubmit) return;
944
+ await adapter.onAfterSubmit({
945
+ field: ctx.target,
946
+ services,
947
+ options,
948
+ provider: options.provider,
949
+ result
950
+ });
951
+ }
952
+ };
953
+ }
954
+ };
955
+ }
956
+ //#endregion
957
+ //#region src/js/modules/payments/api.ts
958
+ var definePaymentModule = createManagedPaymentModule;
959
+ //#endregion
960
+ export { setFormHiddenState as a, dispatchPageClientEventForSubmit as c, clearSubmitLoading as i, applyPageState as n, setSubmitLoading as o, applySubmitResultState as r, syncPageTabErrors as s, definePaymentModule as t };