@verbb/formie-browser 1.0.10 → 1.0.12

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 (33) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/chunks/{api-BYe9YPko.js → api-DqpfkZWL.js} +15 -2
  3. package/dist/chunks/{bpoint-C0VOftX9.js → bpoint-Dlq34XH1.js} +1 -1
  4. package/dist/chunks/{calculations-HAZ8wUrT.js → calculations-DERi2xaC.js} +8 -8
  5. package/dist/chunks/{conditions-BiA_uANV.js → conditions-65kBcFWW.js} +1 -1
  6. package/dist/chunks/{dist-BaHXfvBO.js → dist-BdUy8m_p.js} +2 -2
  7. package/dist/chunks/{eway-CS6Y1Yvo.js → eway-D9_m8ooj.js} +1 -1
  8. package/dist/chunks/{go-cardless-BTPD668l.js → go-cardless-DAT3ZaQf.js} +1 -1
  9. package/dist/chunks/{mollie-CXgBwvo6.js → mollie-Bibhl67p.js} +1 -1
  10. package/dist/chunks/{moneris-B6oLu7nj.js → moneris-H2wSqk9h.js} +1 -1
  11. package/dist/chunks/opayo-CR0DtsLa.js +179 -0
  12. package/dist/chunks/{paddle-GRlsm5mm.js → paddle-DkvIxQdG.js} +1 -1
  13. package/dist/chunks/{password-validation-D5AirwUM.js → password-validation-T0vDQPCr.js} +1 -1
  14. package/dist/chunks/{paypal-CdcZnf6r.js → paypal-CQpAF7Ua.js} +32 -31
  15. package/dist/chunks/{payway-CfmYOS__.js → payway-CwDkC7YZ.js} +1 -1
  16. package/dist/chunks/{square-BY--5M-X.js → square-DwdcOI1G.js} +1 -1
  17. package/dist/chunks/{stripe-uusYjWty.js → stripe-DaoG2FT1.js} +1 -1
  18. package/dist/chunks/{text-limit-nSATKyhp.js → text-limit-Bn18WrPU.js} +1 -1
  19. package/dist/css/theme/fields/_check-radio.css +3 -1
  20. package/dist/css/theme/integrations/_opayo.css +9 -0
  21. package/dist/index.js +16 -16
  22. package/dist/js/modules/payments/factories.d.ts +5 -1
  23. package/dist/js/modules/payments/factories.d.ts.map +1 -1
  24. package/dist/js/modules/payments/opayo.d.ts +17 -2
  25. package/dist/js/modules/payments/opayo.d.ts.map +1 -1
  26. package/dist/js/modules/payments/paypal.d.ts.map +1 -1
  27. package/package.json +2 -2
  28. package/src/css/theme/fields/_check-radio.css +3 -1
  29. package/src/css/theme/integrations/_opayo.css +9 -0
  30. package/src/js/modules/payments/factories.ts +27 -2
  31. package/src/js/modules/payments/opayo.ts +256 -69
  32. package/src/js/modules/payments/paypal.ts +23 -3
  33. package/dist/chunks/opayo-DPUA5CKr.js +0 -113
package/CHANGELOG.md CHANGED
@@ -2,6 +2,23 @@
2
2
 
3
3
  ## Unreleased
4
4
 
5
+ ## 1.0.12 - 2026-07-02
6
+
7
+ ### Added
8
+ - Add Opayo **Drop-in Checkout** support to the `opayo` payment module via `sagepayCheckout`, including iframe mount on field init, `tokenise()` on authorize, and merchant session key refresh on tokenisation failure. **Own Form** mode continues to use `sagepayOwnForm`.
9
+
10
+ ### Fixed
11
+ - Hide PayPal buttons after successful authorization so users are not prompted to pay again before submitting the form. Buttons are restored automatically when authorization is cleared after a failed submit.
12
+
13
+ ## 1.0.11 - 2026-06-26
14
+
15
+ ### Added
16
+ - Add Radio field **Other** choice support with free-text input, show/hide behaviour, and client-side validation when the Other option is selected. ([#1875](https://github.com/verbb/formie/issues/1875))
17
+ - Add the `password-validation` field module for Password fields, enforcing minimum length and uppercase, lowercase, and special character requirements on the front-end. ([#1880](https://github.com/verbb/formie/issues/1880))
18
+
19
+ ### Changed
20
+ - Insert CSRF hidden inputs during token refresh when cached or statically rendered forms omit them via the `csrfInput: false` render option. ([#2121](https://github.com/verbb/formie/discussions/2121))
21
+
5
22
  ## 1.0.10 - 2026-06-26
6
23
 
7
24
  ### Changed
@@ -810,13 +810,26 @@ function Ie(e) {
810
810
  }), t.abort(o.transport.errorMessage));
811
811
  },
812
812
  onAfterStage: async (t, r) => {
813
- t.stage !== "dispatch" || !e.onAfterSubmit || await e.onAfterSubmit({
813
+ if (!(t.stage !== "dispatch" || !e.onAfterSubmit) && !(!(await e.onAfterSubmit({
814
814
  field: n.target,
815
815
  services: s,
816
816
  options: o,
817
817
  provider: o.provider,
818
818
  result: r
819
- });
819
+ }))?.remount || !e.mount)) {
820
+ if (d && e.unmount) {
821
+ let t = await m();
822
+ await e.unmount({
823
+ api: t,
824
+ widget: d,
825
+ field: n.target,
826
+ services: s,
827
+ options: o,
828
+ provider: o.provider
829
+ });
830
+ }
831
+ d = null, await h();
832
+ }
820
833
  }
821
834
  };
822
835
  }
@@ -1,4 +1,4 @@
1
- import { t as e } from "./api-BYe9YPko.js";
1
+ import { t as e } from "./api-DqpfkZWL.js";
2
2
  //#region src/js/modules/payments/bpoint.ts
3
3
  var t = e({
4
4
  id: "bpoint",
@@ -2,7 +2,7 @@ import { t as e } from "./debug-BV0DvdHx.js";
2
2
  import { r as t, t as n } from "./field-references.keys-58ZSTrCW.js";
3
3
  import { n as r, r as i } from "./field-references.resolver-CHwn0G0L.js";
4
4
  import { r as a, t as o } from "./shared-Bx9s0i0P.js";
5
- import { c as s, n as c, r as l, s as u, t as d } from "./dist-BaHXfvBO.js";
5
+ import { c as s, i as c, r as l, s as u, t as d } from "./dist-BdUy8m_p.js";
6
6
  //#region src/js/utils/field-references.row-scope.ts
7
7
  var f = new Set([
8
8
  "first",
@@ -159,10 +159,10 @@ function w(e, t, n) {
159
159
  return t.forEach(([e, t]) => {
160
160
  let n = x(t);
161
161
  if (String(n.scope || "").trim()) {
162
- o[e] = c(t, y(t.sourceKey || "", n, a).value);
162
+ o[e] = l(t, y(t.sourceKey || "", n, a).value);
163
163
  return;
164
164
  }
165
- o[e] = c(t, r(t.sourceKey || "", a).value);
165
+ o[e] = l(t, r(t.sourceKey || "", a).value);
166
166
  }), d(o, n.formatting);
167
167
  }
168
168
  function T(e, r) {
@@ -187,12 +187,12 @@ function T(e, r) {
187
187
  }), o;
188
188
  }
189
189
  function E(e, t, n, r) {
190
- let i = s(r), a = l(r), c = /* @__PURE__ */ new Map(), d = null, f = !1, p = !1, m = !1, h = () => {
191
- c.forEach((e, t) => {
190
+ let i = s(r), a = c(r), l = /* @__PURE__ */ new Map(), d = null, f = !1, p = !1, m = !1, h = () => {
191
+ l.forEach((e, t) => {
192
192
  e.forEach((e, n) => {
193
193
  t.removeEventListener(n, e);
194
194
  });
195
- }), c.clear();
195
+ }), l.clear();
196
196
  }, g = (e) => {
197
197
  !e || f || queueMicrotask(() => {
198
198
  f || (n.dispatchEvent(new Event("input", { bubbles: !0 })), n.dispatchEvent(new Event("change", { bubbles: !0 })));
@@ -257,8 +257,8 @@ function E(e, t, n, r) {
257
257
  };
258
258
  ["input", "change"].forEach((t) => {
259
259
  e.addEventListener(t, r);
260
- let n = c.get(e) || /* @__PURE__ */ new Map();
261
- n.set(t, r), c.set(e, n);
260
+ let n = l.get(e) || /* @__PURE__ */ new Map();
261
+ n.set(t, r), l.set(e, n);
262
262
  });
263
263
  }, b = () => {
264
264
  m || f || (m = !0, queueMicrotask(() => {
@@ -1,7 +1,7 @@
1
1
  import { t as e } from "./debug-BV0DvdHx.js";
2
2
  import { t } from "./field-references.keys-58ZSTrCW.js";
3
3
  import { n } from "./shared-Bx9s0i0P.js";
4
- import { a as r, o as i } from "./dist-BaHXfvBO.js";
4
+ import { a as r, o as i } from "./dist-BdUy8m_p.js";
5
5
  //#region src/js/modules/fields/conditions/config.ts
6
6
  var a = "[data-formie-conditions]";
7
7
  function o(e) {
@@ -1,4 +1,4 @@
1
- //#region node_modules/@verbb/formie-core/dist/index.js
1
+ //#region ../formie-core/dist/index.js
2
2
  var e = Object.create, t = Object.defineProperty, n = Object.getOwnPropertyDescriptor, r = Object.getOwnPropertyNames, i = Object.getPrototypeOf, a = Object.prototype.hasOwnProperty, o = (e, t) => () => (t || (e((t = { exports: {} }).exports, t), e = null), t.exports), s = (e, i, o, s) => {
3
3
  if (i && typeof i == "object" || typeof i == "function") for (var c = r(i), l = 0, u = c.length, d; l < u; l++) d = c[l], !a.call(e, d) && d !== o && t(e, d, {
4
4
  get: ((e) => i[e]).bind(null, d),
@@ -2656,4 +2656,4 @@ function P(e) {
2656
2656
  };
2657
2657
  }
2658
2658
  //#endregion
2659
- export { g as a, x as c, P as i, T as n, h as o, S as r, E as s, C as t };
2659
+ export { g as a, x as c, S as i, P as n, h as o, T as r, E as s, C as t };
@@ -1,4 +1,4 @@
1
- import { t as e } from "./api-BYe9YPko.js";
1
+ import { t as e } from "./api-DqpfkZWL.js";
2
2
  import { r as t } from "./async-nPFRNQ06.js";
3
3
  import { r as n } from "./scripts-CbQ7agX3.js";
4
4
  //#region src/js/modules/payments/eway.ts
@@ -1,5 +1,5 @@
1
1
  import { s as e } from "./event-names-BCI2FLD8.js";
2
- import { t } from "./api-BYe9YPko.js";
2
+ import { t } from "./api-DqpfkZWL.js";
3
3
  //#region src/js/modules/payments/go-cardless.ts
4
4
  var n = e("go-cardless", "redirect"), r = t({
5
5
  id: "go-cardless",
@@ -1,5 +1,5 @@
1
1
  import { s as e } from "./event-names-BCI2FLD8.js";
2
- import { t } from "./api-BYe9YPko.js";
2
+ import { t } from "./api-DqpfkZWL.js";
3
3
  //#region src/js/modules/payments/mollie.ts
4
4
  var n = e("mollie", "redirect"), r = t({
5
5
  id: "mollie",
@@ -1,4 +1,4 @@
1
- import { t as e } from "./api-BYe9YPko.js";
1
+ import { t as e } from "./api-DqpfkZWL.js";
2
2
  //#region src/js/modules/payments/moneris.ts
3
3
  var t = {
4
4
  940: "Invalid profile ID (tokenization request).",
@@ -0,0 +1,179 @@
1
+ import { s as e } from "./event-names-BCI2FLD8.js";
2
+ import { t } from "./api-DqpfkZWL.js";
3
+ import { t as n } from "./debug-BV0DvdHx.js";
4
+ import { r } from "./scripts-CbQ7agX3.js";
5
+ import { t as i } from "./styles-BfoIZwJp.js";
6
+ //#endregion
7
+ //#region src/js/modules/payments/opayo.ts
8
+ i("opayo", ["@layer formie-theme{.formie-opayo-drop-in{box-sizing:border-box;width:100%;min-height:10rem}}"]);
9
+ var a = "FORMIE_OPAYO_SCRIPT", o = "https://live.opayo.eu.elavon.com/api/v1/js/sagepay.js", s = "https://sandbox.opayo.eu.elavon.com/api/v1/js/sagepay.js", c = "[data-formie-opayo-drop-in]", l = n("payments", "opayo"), u = e("opayo", "challenge"), d = "formie:payment:opayo:challenge:response";
10
+ function f(e) {
11
+ return e.checkoutMode === "dropIn";
12
+ }
13
+ async function p(e) {
14
+ let { form: t, handle: n, sessionToken: r, services: i } = e, a = new FormData();
15
+ a.append("action", "formie/payment-webhooks/process-callback"), a.append("merchantSessionKey", "true"), a.append("handle", n), a.append("sessionToken", r);
16
+ try {
17
+ let e = await fetch(t.action, {
18
+ method: "POST",
19
+ body: a
20
+ });
21
+ return e.status < 200 || e.status >= 300 ? (i.addError(`${e.status}: ${e.statusText}`), l.warn("Merchant session request failed.", {
22
+ status: e.status,
23
+ statusText: e.statusText
24
+ }), null) : (await e.json()).merchantSessionKey || (i.addError("Unable to get merchant session."), l.warn("merchantSessionKey missing in callback response."), null);
25
+ } catch {
26
+ return i.addError("Network error. Please try again."), l.warn("Network error requesting merchant session."), null;
27
+ }
28
+ }
29
+ function m(e) {
30
+ return e.id ||= `formie-opayo-drop-in-${Math.random().toString(36).slice(2, 9)}`, e.id;
31
+ }
32
+ var h = t({
33
+ id: "opayo",
34
+ defaultRequiredInputSuffixes: ["opayoTokenId"],
35
+ load: async (e) => {
36
+ let { provider: t } = e.options, n = t.useSandbox ? s : o;
37
+ return await r(f(t) ? "sagepayCheckout" : "sagepayOwnForm", {
38
+ id: a,
39
+ src: n,
40
+ timeoutMs: 1e4
41
+ }), null;
42
+ },
43
+ mount: async ({ field: e, services: t, provider: n }) => {
44
+ if (!f(n)) return null;
45
+ let r = t.form, i = window.sagepayCheckout, a = e.querySelector(c);
46
+ if (!r?.action) return t.addError("Form action is missing."), l.warn("Missing form action before drop-in mount."), null;
47
+ if (!i) return t.addError("Opayo script failed to load."), l.warn("sagepayCheckout global not available."), null;
48
+ if (!a) return t.addError("Opayo drop-in container is missing."), l.warn("Drop-in container not found in payment field."), null;
49
+ let o = n.handle || "opayo", s = await p({
50
+ form: r,
51
+ handle: o,
52
+ sessionToken: n.sessionToken || "",
53
+ services: t
54
+ });
55
+ if (!s) return null;
56
+ let u = m(a), d = {
57
+ checkout: null,
58
+ merchantSessionKey: s,
59
+ pendingAuthorize: null,
60
+ retriedTokenise: !1
61
+ };
62
+ return d.checkout = i({
63
+ merchantSessionKey: s,
64
+ containerSelector: `#${u}`,
65
+ onTokenise: (e) => {
66
+ let i = d.pendingAuthorize;
67
+ if (d.pendingAuthorize = null, !i) {
68
+ l.warn("Drop-in tokenisation completed without a pending authorize step.");
69
+ return;
70
+ }
71
+ if (e.success && e.cardIdentifier) {
72
+ t.updateInputs("opayoTokenId", e.cardIdentifier), t.updateInputs("opayoSessionKey", d.merchantSessionKey), l.log("Drop-in tokenization succeeded.", { hasCardIdentifier: !!e.cardIdentifier }), i(!0);
73
+ return;
74
+ }
75
+ if (!d.retriedTokenise) {
76
+ d.retriedTokenise = !0, p({
77
+ form: r,
78
+ handle: o,
79
+ sessionToken: n.sessionToken || "",
80
+ services: t
81
+ }).then((n) => {
82
+ if (!n) {
83
+ t.addError(e.errors?.[0]?.message || "Tokenization failed."), l.warn("Drop-in tokenization failed after session refresh.", e), i(!1);
84
+ return;
85
+ }
86
+ d.merchantSessionKey = n, d.pendingAuthorize = i, d.checkout.tokenise({ newMerchantSessionKey: n });
87
+ });
88
+ return;
89
+ }
90
+ t.addError(e.errors?.[0]?.message || "Tokenization failed."), l.warn("Drop-in tokenization failed.", e), i(!1);
91
+ }
92
+ }), l.log("Drop-in checkout mounted.", { containerId: u }), d;
93
+ },
94
+ unmount: async ({ widget: e }) => {
95
+ e?.checkout?.destroy?.();
96
+ },
97
+ onBeforeAuthorize: async (e) => {
98
+ let { field: t, services: n, options: r, provider: i, widget: a } = e, o = i.handle || "opayo", s = n.form;
99
+ if (!s?.action) return n.addError("Form action is missing."), l.warn("Missing form action before authorize."), !1;
100
+ if (f(i)) return a ? (a.retriedTokenise = !1, new Promise((e) => {
101
+ a.pendingAuthorize = e, a.checkout.tokenise();
102
+ })) : (n.addError("Opayo drop-in checkout is not ready."), l.warn("Drop-in authorize requested before widget mount."), !1);
103
+ let c = window.sagepayOwnForm;
104
+ if (!c) return n.addError("Opayo script failed to load."), l.warn("sagepayOwnForm global not available."), !1;
105
+ let u = t.querySelector("[data-opayo-card=\"cardholder-name\"]")?.value ?? "", d = t.querySelector("[data-opayo-card=\"card-number\"]")?.value ?? "", m = t.querySelector("[data-opayo-card=\"expiry-date\"]")?.value ?? "", h = t.querySelector("[data-opayo-card=\"security-code\"]")?.value ?? "";
106
+ d = d.replace(/[\s/]/g, ""), m = m.replace(/[\s/]/g, "");
107
+ let g = await p({
108
+ form: s,
109
+ handle: o,
110
+ sessionToken: i.sessionToken || "",
111
+ services: n
112
+ });
113
+ return g ? new Promise((e) => {
114
+ c({ merchantSessionKey: g }).tokeniseCardDetails({
115
+ cardDetails: {
116
+ cardholderName: u,
117
+ cardNumber: d,
118
+ expiryDate: m,
119
+ securityCode: h
120
+ },
121
+ onTokenised: (t) => {
122
+ t.success && t.cardIdentifier ? (n.updateInputs("opayoTokenId", t.cardIdentifier), n.updateInputs("opayoSessionKey", g), l.log("Tokenization succeeded.", { hasCardIdentifier: !!t.cardIdentifier }), e(!0)) : (n.addError(t.errors?.[0]?.message || "Tokenization failed."), l.warn("Tokenization failed.", t), e(!1));
123
+ }
124
+ });
125
+ }) : !1;
126
+ },
127
+ setup: async (e) => {
128
+ let { services: t } = e;
129
+ e.target;
130
+ let n = null, r = !1, i = () => {
131
+ n?.parentNode && n.parentNode.removeChild(n), n = null;
132
+ }, a = t.events.onForm(u, ((e) => {
133
+ let a = e.detail?.data;
134
+ if (!a?.acsUrl || !a?.creq) return;
135
+ r = !1, l.log("Received payment challenge event.", {
136
+ hasAcsUrl: !!a.acsUrl,
137
+ hasCreq: !!a.creq
138
+ });
139
+ let o = t.form?.querySelector("input[name*=\"opayoSessionKey\"]")?.value || "", s = document.createElement("div");
140
+ s.className = "formie-modal", s.id = `formie-opayo-dialog-${Math.random().toString(36).slice(2, 9)}`, s.innerHTML = "\n <div class=\"formie-modal-backdrop\" data-dialog-close></div>\n <div class=\"formie-modal-content\">\n <div class=\"formie-loading formie-loading-large\" style=\"--formie-loading-width: 3rem; --formie-loading-height: 3rem; top: 50%; margin-top: -1.5rem;\"></div>\n <iframe width=\"100%\" height=\"100%\" style=\"width: 100%; height: 100%; position: relative; z-index: 1;\"></iframe>\n </div>\n ";
141
+ let c = s.querySelector("iframe"), u = (e) => e.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;"), d = a.returnUrl || a.redirectUrl || "", f = `<form action="${u(a.acsUrl)}" method="post">
142
+ <input type="hidden" name="creq" value="${u(a.creq || "")}" />
143
+ <input type="hidden" name="threeDSSessionData" value="${u(a.threeDSSessionData || "")}" />
144
+ <input type="hidden" name="MD" value="${u(o)}" />
145
+ <input type="hidden" name="TermUrl" value="${u(d)}" />
146
+ <input type="hidden" name="ThreeDSNotificationURL" value="${u(d)}" />
147
+ </form><script>document.forms[0].submit();<\/script>`;
148
+ i(), document.body.appendChild(s), n = s, c?.contentWindow && (c.contentWindow.document.open(), c.contentWindow.document.write(f), c.contentWindow.document.close());
149
+ })), o = (e) => {
150
+ if (e.data?.message === d) {
151
+ if (!n) {
152
+ l.log("Ignoring 3DS response without active dialog.");
153
+ return;
154
+ }
155
+ if (r) {
156
+ l.warn("Ignoring duplicate 3DS response while processing.");
157
+ return;
158
+ }
159
+ if (r = !0, l.log("Received payment challenge response message.", e.data?.value), i(), t.removeError(), e.data?.value?.error) {
160
+ t.addError(e.data.value.error.message), t.releaseSubmitLoading(), r = !1;
161
+ return;
162
+ }
163
+ t.updateInputs("opayo3DSComplete", e.data.value?.transactionId ?? ""), t.triggerSubmit();
164
+ }
165
+ };
166
+ return window.addEventListener("message", o), { destroy: () => {
167
+ a(), window.removeEventListener("message", o), i(), r = !1;
168
+ } };
169
+ },
170
+ onAfterSubmit: async ({ services: e }) => {
171
+ e.updateInputs([
172
+ "opayoTokenId",
173
+ "opayoSessionKey",
174
+ "opayo3DSComplete"
175
+ ], "");
176
+ }
177
+ });
178
+ //#endregion
179
+ export { h as opayoModule };
@@ -1,5 +1,5 @@
1
1
  import { s as e } from "./event-names-BCI2FLD8.js";
2
- import { t } from "./api-BYe9YPko.js";
2
+ import { t } from "./api-DqpfkZWL.js";
3
3
  import { r as n } from "./scripts-CbQ7agX3.js";
4
4
  //#region src/js/modules/payments/paddle.ts
5
5
  var r = "FORMIE_PADDLE_SCRIPT", i = e("paddle", "initialize"), a = t({
@@ -1,5 +1,5 @@
1
1
  import { c as e, i as t, l as n } from "./shared-Bx9s0i0P.js";
2
- import { i as r } from "./dist-BaHXfvBO.js";
2
+ import { n as r } from "./dist-BdUy8m_p.js";
3
3
  //#region src/js/modules/fields/password-validation.ts
4
4
  var i = "input[data-formie-password-input]", a = [
5
5
  "passwordMinLength",
@@ -1,4 +1,4 @@
1
- import { t as e } from "./api-BYe9YPko.js";
1
+ import { t as e } from "./api-DqpfkZWL.js";
2
2
  import { r as t } from "./scripts-CbQ7agX3.js";
3
3
  import { t as n } from "./styles-BfoIZwJp.js";
4
4
  //#endregion
@@ -11,49 +11,52 @@ function i(e) {
11
11
  return String(n[0]?.id || r[0]?.id || "").trim();
12
12
  }
13
13
  function a(e, t) {
14
+ e?.close && e.close(), t.removeAttribute("data-formie-paypal-rendered"), t.innerHTML = "";
15
+ }
16
+ function o(e, t) {
14
17
  return `https://www.paypal.com/sdk/js?${[
15
18
  "intent=authorize",
16
19
  `currency=${encodeURIComponent(t)}`,
17
20
  `client-id=${encodeURIComponent(e)}`
18
21
  ].join("&")}`;
19
22
  }
20
- var o = e({
23
+ var s = e({
21
24
  id: "paypal",
22
25
  defaultRequiredInputSuffixes: ["paypalOrderId", "paypalAuthId"],
23
26
  load: async (e) => {
24
27
  let { provider: n } = e.options, i = n.clientId;
25
28
  return i?.trim() ? (await t("paypal", {
26
29
  id: r,
27
- src: a(i, n.currency || "AUD")
30
+ src: o(i, n.currency || "AUD")
28
31
  }), window.paypal) : (console.error("[formie] Missing clientId for PayPal."), null);
29
32
  },
30
33
  mount: async (e) => {
31
- let { api: t, field: n, services: r, options: a, provider: o } = e, s = n.querySelector("[data-formie-paypal-button]");
32
- if (!s || !t || s.getAttribute("data-formie-paypal-rendered") === "true") return null;
33
- s.innerHTML = "";
34
- let c = !!o.useSandbox, l = r.resolveCurrency({
35
- value: o.currency,
34
+ let { api: t, field: n, services: r, options: o, provider: s } = e, c = n.querySelector("[data-formie-paypal-button]");
35
+ if (!c || !t || c.getAttribute("data-formie-paypal-rendered") === "true") return null;
36
+ c.innerHTML = "";
37
+ let l = !!s.useSandbox, u = r.resolveCurrency({
38
+ value: s.currency,
36
39
  defaultCurrency: "AUD"
37
40
  });
38
- if (!l.ok) return r.addError("error" in l ? l.error : "Invalid PayPal currency."), null;
39
- let u = l.value, d = {
40
- layout: o.buttonLayout || "vertical",
41
- color: o.buttonColor || "gold",
42
- shape: o.buttonShape || "rect",
43
- label: o.buttonLabel || "paypal",
44
- width: o.buttonWidth || 250,
45
- height: o.buttonHeight || 35
41
+ if (!u.ok) return r.addError("error" in u ? u.error : "Invalid PayPal currency."), null;
42
+ let d = u.value, f = {
43
+ layout: s.buttonLayout || "vertical",
44
+ color: s.buttonColor || "gold",
45
+ shape: s.buttonShape || "rect",
46
+ label: s.buttonLabel || "paypal",
47
+ width: s.buttonWidth || 250,
48
+ height: s.buttonHeight || 35
46
49
  };
47
- d.layout === "horizontal" && (d.tagline = o.buttonTagline ?? !0);
48
- let f = {
49
- env: c ? "sandbox" : "production",
50
- style: d,
50
+ f.layout === "horizontal" && (f.tagline = s.buttonTagline ?? !0);
51
+ let p = null, m = {
52
+ env: l ? "sandbox" : "production",
53
+ style: f,
51
54
  createOrder: (e, t) => {
52
55
  r.removeError();
53
56
  let n = r.resolveAmount({
54
- type: o.amountType,
55
- fixed: o.amountFixed,
56
- variable: o.amountVariable
57
+ type: s.amountType,
58
+ fixed: s.amountFixed,
59
+ variable: s.amountVariable
57
60
  });
58
61
  if (!n.ok) {
59
62
  let e = "error" in n ? n.error : "Invalid PayPal amount.";
@@ -63,7 +66,7 @@ var o = e({
63
66
  intent: "AUTHORIZE",
64
67
  application_context: { user_action: "CONTINUE" },
65
68
  purchase_units: [{ amount: {
66
- currency_code: u,
69
+ currency_code: d,
67
70
  value: String(n.value)
68
71
  } }]
69
72
  });
@@ -74,22 +77,20 @@ var o = e({
74
77
  onApprove: async (e, t) => {
75
78
  try {
76
79
  let n = i(await t.order.authorize());
77
- r.updateInputs("paypalOrderId", e.orderID), r.updateInputs("paypalAuthId", n || ""), n ? r.addSuccess("Payment authorized. Finalize the form to complete payment.") : r.addSuccess("PayPal approval received. Finalizing payment on submit.");
80
+ r.updateInputs("paypalOrderId", e.orderID), r.updateInputs("paypalAuthId", n || ""), n ? r.addSuccess("Payment authorized. Finalize the form to complete payment.") : r.addSuccess("PayPal approval received. Finalizing payment on submit."), a(p, c);
78
81
  } catch {
79
82
  r.addError("Unable to authorize payment. Please try again.");
80
83
  }
81
84
  }
82
- }, p = t.Buttons(f);
83
- return s.setAttribute("data-formie-paypal-rendered", "true"), p.render(s);
85
+ }, h = t.Buttons(m);
86
+ return c.setAttribute("data-formie-paypal-rendered", "true"), p = h.render(c), p;
84
87
  },
85
88
  unmount: async (e) => {
86
89
  e.widget?.close && e.widget.close();
87
90
  let t = e.field.querySelector("[data-formie-paypal-button]");
88
91
  t && (t.removeAttribute("data-formie-paypal-rendered"), t.innerHTML = "");
89
92
  },
90
- onAfterSubmit: async ({ services: e }) => {
91
- e.updateInputs(["paypalOrderId", "paypalAuthId"], ""), e.removeSuccess(), e.removeError();
92
- }
93
+ onAfterSubmit: async ({ services: e, result: t }) => (e.updateInputs(["paypalOrderId", "paypalAuthId"], ""), e.removeSuccess(), e.removeError(), !t?.ok || t?.nextPage ? { remount: !0 } : {})
93
94
  });
94
95
  //#endregion
95
- export { o as paypalModule };
96
+ export { s as paypalModule };
@@ -1,4 +1,4 @@
1
- import { t as e } from "./api-BYe9YPko.js";
1
+ import { t as e } from "./api-DqpfkZWL.js";
2
2
  import { r as t } from "./scripts-CbQ7agX3.js";
3
3
  import { t as n } from "./styles-BfoIZwJp.js";
4
4
  //#endregion
@@ -1,4 +1,4 @@
1
- import { t as e } from "./api-BYe9YPko.js";
1
+ import { t as e } from "./api-DqpfkZWL.js";
2
2
  import { r as t } from "./scripts-CbQ7agX3.js";
3
3
  //#region src/js/modules/payments/square.ts
4
4
  var n = "FORMIE_SQUARE_SCRIPT", r = e({
@@ -1,5 +1,5 @@
1
1
  import { s as e } from "./event-names-BCI2FLD8.js";
2
- import { t } from "./api-BYe9YPko.js";
2
+ import { t } from "./api-DqpfkZWL.js";
3
3
  import { r as n, t as r } from "./theme-classes-Tv7q7ToE.js";
4
4
  import { r as i } from "./scripts-CbQ7agX3.js";
5
5
  import { t as a } from "./styles-BfoIZwJp.js";
@@ -1,7 +1,7 @@
1
1
  import { i as e } from "./i18n-BY1ds1BL.js";
2
2
  import { t } from "./styles-BfoIZwJp.js";
3
3
  import { c as n, i as r, l as i } from "./shared-Bx9s0i0P.js";
4
- import { i as a } from "./dist-BaHXfvBO.js";
4
+ import { n as a } from "./dist-BdUy8m_p.js";
5
5
  //#region src/css/theme/fields/_text-limit.css?inline
6
6
  var o = "@layer formie-theme{.formie-limit-number{font-weight:var(--formie-font-weight-semibold);color:var(--formie-color-text)}.formie-limit-number-error{color:var(--formie-color-danger)}}", s = "input[data-formie-single-line-text-input], textarea[data-formie-multi-line-text-input]", c = [
7
7
  "textMinCharacterLimit",
@@ -116,8 +116,10 @@
116
116
 
117
117
  .formie-field-option:has(> input[data-formie-other-option]),
118
118
  .formie-other-option {
119
+ display: flex;
119
120
  flex-wrap: wrap;
120
- align-items: flex-start;
121
+ align-items: center;
122
+ width: 100%;
121
123
  }
122
124
 
123
125
  .formie-field-option:has(> input[data-formie-other-option]:checked) > .formie-other-option-text,
@@ -0,0 +1,9 @@
1
+ @layer formie-theme {
2
+
3
+ /* Opayo drop-in checkout iframe mount point. */
4
+ .formie-opayo-drop-in {
5
+ width: 100%;
6
+ min-height: 10rem;
7
+ box-sizing: border-box;
8
+ }
9
+ }
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import { c as e, d as t, l as n, o as r, r as i, t as a, u as o } from "./chunks/event-names-BCI2FLD8.js";
2
- import { a as s, c, d as l, f as u, i as d, l as f, n as p, o as m, p as h, r as g, s as _, t as v, u as y } from "./chunks/api-BYe9YPko.js";
2
+ import { a as s, c, d as l, f as u, i as d, l as f, n as p, o as m, p as h, r as g, s as _, t as v, u as y } from "./chunks/api-DqpfkZWL.js";
3
3
  import { a as b, i as x, n as ee, r as te, t as S } from "./chunks/debug-BV0DvdHx.js";
4
4
  import { n as ne, r as C, t as w } from "./chunks/theme-classes-Tv7q7ToE.js";
5
5
  import { t as T } from "./chunks/http-D-JExro7.js";
@@ -1382,10 +1382,10 @@ var L = class {
1382
1382
  snaptcha: () => import("./chunks/snaptcha-DKx98oon.js").then((e) => e.snaptchaModule),
1383
1383
  turnstile: () => import("./chunks/turnstile-DJakPzQD.js").then((e) => e.turnstileModule)
1384
1384
  }, Xt = {
1385
- calculations: () => import("./chunks/calculations-HAZ8wUrT.js").then((e) => e.calculationsModule),
1385
+ calculations: () => import("./chunks/calculations-DERi2xaC.js").then((e) => e.calculationsModule),
1386
1386
  "checkbox-radio": () => import("./chunks/checkbox-radio-BY2aTCOG.js").then((e) => e.checkboxRadioModule),
1387
1387
  combobox: () => import("./chunks/combobox-C0EuExSI.js").then((e) => e.comboboxModule),
1388
- conditions: () => import("./chunks/conditions-BiA_uANV.js").then((e) => e.conditionsModule),
1388
+ conditions: () => import("./chunks/conditions-65kBcFWW.js").then((e) => e.conditionsModule),
1389
1389
  "custom-google-maps": () => import("./chunks/custom-google-maps-BsaSirEZ.js").then((e) => e.customGoogleMapsModule),
1390
1390
  "custom-link": () => import("./chunks/custom-link-CJ1-FjEM.js").then((e) => e.customLinkModule),
1391
1391
  "custom-maps": () => import("./chunks/custom-maps-DYW_pBid.js").then((e) => e.customMapsModule),
@@ -1394,7 +1394,7 @@ var L = class {
1394
1394
  "upload-manager": () => import("./chunks/upload-manager-W-QDgxKD.js").then((e) => e.uploadManagerModule),
1395
1395
  hidden: () => import("./chunks/hidden-D7_Ch-QN.js").then((e) => e.hiddenModule),
1396
1396
  "phone-country": () => import("./chunks/phone-country-D3ayr60L.js").then((e) => e.phoneCountryModule),
1397
- "password-validation": () => import("./chunks/password-validation-D5AirwUM.js").then((e) => e.passwordValidationModule),
1397
+ "password-validation": () => import("./chunks/password-validation-T0vDQPCr.js").then((e) => e.passwordValidationModule),
1398
1398
  "address-country": () => import("./chunks/address-country-Rx6GQTND.js").then((e) => e.addressCountryModule),
1399
1399
  "address-state": () => import("./chunks/address-state-BwE01m2_.js").then((e) => e.addressStateModule),
1400
1400
  repeater: () => import("./chunks/repeater-BVnPUqTj.js").then((e) => e.repeaterModule),
@@ -1405,19 +1405,19 @@ var L = class {
1405
1405
  "survey-rank": () => import("./chunks/survey-rank-DN6x4IZM.js").then((e) => e.surveyRankModule),
1406
1406
  "survey-rating": () => import("./chunks/survey-rating-BnsNL9U5.js").then((e) => e.surveyRatingModule),
1407
1407
  table: () => import("./chunks/table-CAjCJHrL.js").then((e) => e.tableModule),
1408
- "text-limit": () => import("./chunks/text-limit-nSATKyhp.js").then((e) => e.textLimitModule)
1408
+ "text-limit": () => import("./chunks/text-limit-Bn18WrPU.js").then((e) => e.textLimitModule)
1409
1409
  }, Zt = {
1410
- bpoint: () => import("./chunks/bpoint-C0VOftX9.js").then((e) => e.bpointModule),
1411
- eway: () => import("./chunks/eway-CS6Y1Yvo.js").then((e) => e.ewayModule),
1412
- "go-cardless": () => import("./chunks/go-cardless-BTPD668l.js").then((e) => e.goCardlessModule),
1413
- mollie: () => import("./chunks/mollie-CXgBwvo6.js").then((e) => e.mollieModule),
1414
- moneris: () => import("./chunks/moneris-B6oLu7nj.js").then((e) => e.monerisModule),
1415
- opayo: () => import("./chunks/opayo-DPUA5CKr.js").then((e) => e.opayoModule),
1416
- paddle: () => import("./chunks/paddle-GRlsm5mm.js").then((e) => e.paddleModule),
1417
- paypal: () => import("./chunks/paypal-CdcZnf6r.js").then((e) => e.paypalModule),
1418
- payway: () => import("./chunks/payway-CfmYOS__.js").then((e) => e.paywayModule),
1419
- square: () => import("./chunks/square-BY--5M-X.js").then((e) => e.squareModule),
1420
- stripe: () => import("./chunks/stripe-uusYjWty.js").then((e) => e.stripeModule)
1410
+ bpoint: () => import("./chunks/bpoint-Dlq34XH1.js").then((e) => e.bpointModule),
1411
+ eway: () => import("./chunks/eway-D9_m8ooj.js").then((e) => e.ewayModule),
1412
+ "go-cardless": () => import("./chunks/go-cardless-DAT3ZaQf.js").then((e) => e.goCardlessModule),
1413
+ mollie: () => import("./chunks/mollie-Bibhl67p.js").then((e) => e.mollieModule),
1414
+ moneris: () => import("./chunks/moneris-H2wSqk9h.js").then((e) => e.monerisModule),
1415
+ opayo: () => import("./chunks/opayo-CR0DtsLa.js").then((e) => e.opayoModule),
1416
+ paddle: () => import("./chunks/paddle-DkvIxQdG.js").then((e) => e.paddleModule),
1417
+ paypal: () => import("./chunks/paypal-CQpAF7Ua.js").then((e) => e.paypalModule),
1418
+ payway: () => import("./chunks/payway-CwDkC7YZ.js").then((e) => e.paywayModule),
1419
+ square: () => import("./chunks/square-DwdcOI1G.js").then((e) => e.squareModule),
1420
+ stripe: () => import("./chunks/stripe-DaoG2FT1.js").then((e) => e.stripeModule)
1421
1421
  }, Qt = {
1422
1422
  ...Xt,
1423
1423
  ...Jt,
@@ -8,6 +8,10 @@ type PaymentSetupResult = {
8
8
  destroy?: () => void | Promise<void>;
9
9
  onBeforeStage?: (stageCtx: import('#contracts/modules').SubmitHookContext) => void | Promise<void>;
10
10
  };
11
+ export type PaymentAfterSubmitResult = {
12
+ /** Tear down the current widget and mount again (for example after a failed payment). */
13
+ remount?: boolean;
14
+ };
11
15
  export type ManagedPaymentModuleAdapter<TProvider extends Record<string, unknown>, TApi, TWidget> = {
12
16
  id: string;
13
17
  defaultRequiredInputSuffixes?: string[];
@@ -47,7 +51,7 @@ export type ManagedPaymentModuleAdapter<TProvider extends Record<string, unknown
47
51
  options: NormalizedPaymentModuleOptions<TProvider>;
48
52
  provider: TProvider;
49
53
  result?: import('#contracts/schema').FormSubmitResult;
50
- }) => void | Promise<void>;
54
+ }) => void | Promise<void> | PaymentAfterSubmitResult | Promise<PaymentAfterSubmitResult>;
51
55
  };
52
56
  export declare function createManagedPaymentModule<TProvider extends Record<string, unknown>, TApi, TWidget>(adapter: ManagedPaymentModuleAdapter<TProvider, TApi, TWidget>): FormieModuleDefinition;
53
57
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"factories.d.ts","sourceRoot":"","sources":["../../../../src/js/modules/payments/factories.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACR,sBAAsB,EAEtB,kBAAkB,EACrB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,EAEH,KAAK,8BAA8B,EACnC,KAAK,mBAAmB,EAE3B,MAAM,wBAAwB,CAAC;AAchC,MAAM,MAAM,yBAAyB,CAAC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,kBAAkB,EAAE,SAAS,CAAC,GAAG;IACrH,OAAO,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC;IACnD,QAAQ,EAAE,mBAAmB,CAAC;CACjC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACtB,OAAO,CAAC,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrC,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACtG,CAAC;AAEF,MAAM,MAAM,2BAA2B,CACnC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,IAAI,EACJ,OAAO,IACP;IACA,EAAE,EAAE,MAAM,CAAC;IACX,4BAA4B,CAAC,EAAE,MAAM,EAAE,CAAC;IACxC,IAAI,EAAE,CAAC,GAAG,EAAE,yBAAyB,CAAC,SAAS,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,uGAAuG;IACvG,KAAK,CAAC,EAAE,CAAC,GAAG,EAAE,yBAAyB,CAAC,SAAS,CAAC,GAAG;QAAE,IAAI,EAAE,WAAW,CAAA;KAAE,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;IAC3G,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE;QACX,GAAG,EAAE,IAAI,CAAC;QACV,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,OAAO,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC;QACnD,QAAQ,EAAE,SAAS,CAAC;KACvB,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE;QACb,GAAG,EAAE,IAAI,CAAC;QACV,MAAM,EAAE,OAAO,CAAC;QAChB,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,OAAO,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC;QACnD,QAAQ,EAAE,SAAS,CAAC;KACvB,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAC3B,iBAAiB,CAAC,EAAE,CAAC,IAAI,EAAE;QACvB,GAAG,EAAE,IAAI,CAAC;QACV,MAAM,EAAE,OAAO,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,OAAO,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC;QACnD,QAAQ,EAAE,SAAS,CAAC;QACpB,QAAQ,EAAE,OAAO,oBAAoB,EAAE,iBAAiB,CAAC;KAC5D,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC;IACjC,mFAAmF;IACnF,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE;QACnB,KAAK,EAAE,OAAO,CAAC;QACf,QAAQ,EAAE,mBAAmB,CAAC;QAC9B,OAAO,EAAE,8BAA8B,CAAC,SAAS,CAAC,CAAC;QACnD,QAAQ,EAAE,SAAS,CAAC;QACpB,MAAM,CAAC,EAAE,OAAO,mBAAmB,EAAE,gBAAgB,CAAC;KACzD,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9B,CAAC;AAEF,wBAAgB,0BAA0B,CACtC,SAAS,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACzC,IAAI,EACJ,OAAO,EACT,OAAO,EAAE,2BAA2B,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,sBAAsB,CAwPxF"}
1
+ {"version":3,"file":"factories.d.ts","sourceRoot":"","sources":["../../../../src/js/modules/payments/factories.ts"],"names":[],"mappings":"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"}