@odus/checkout 0.5.2 → 0.5.4

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.
@@ -1,10 +1,10 @@
1
- const k = () => "http://localhost:3000";
1
+ const k = (n) => n === "test" ? "https://sandbox-api.odus.com" : n === "live" ? "https://api.odus.com" : "http://localhost:3000";
2
2
  class $ {
3
3
  apiKey;
4
4
  baseUrl;
5
5
  browserInfo;
6
6
  constructor(e, t, a) {
7
- this.apiKey = e, this.baseUrl = k(), this.browserInfo = a || { userAgent: navigator.userAgent };
7
+ this.apiKey = e, this.baseUrl = k(t), this.browserInfo = a || { userAgent: navigator.userAgent };
8
8
  }
9
9
  async fetchApi({
10
10
  endpoint: e,
@@ -101,7 +101,7 @@ const R = async ({
101
101
  apiKey: e,
102
102
  environment: t
103
103
  }) => {
104
- const a = k(), i = await fetch(`${a}/checkout-profiles/${n}`, {
104
+ const a = k(t), i = await fetch(`${a}/checkout-profiles/${n}`, {
105
105
  method: "GET",
106
106
  headers: {
107
107
  "Content-Type": "application/json",
@@ -469,24 +469,24 @@ const z = {
469
469
  const E = {
470
470
  ...d.formData,
471
471
  [l]: u
472
- }, v = { ...d.errors };
472
+ }, y = { ...d.errors };
473
473
  if (d.touched[l]) {
474
474
  const m = t(l, u);
475
- m ? v[l] = m : delete v[l];
475
+ m ? y[l] = m : delete y[l];
476
476
  }
477
477
  e.setState({
478
478
  formData: E,
479
- errors: v,
479
+ errors: y,
480
480
  isValid: i(E)
481
481
  });
482
482
  }, s = (l, c) => {
483
483
  const d = e.getState(), u = {
484
484
  ...d.touched,
485
485
  [l]: !0
486
- }, E = t(l, c), v = { ...d.errors };
487
- E ? v[l] = E : delete v[l], e.setState({
486
+ }, E = t(l, c), y = { ...d.errors };
487
+ E ? y[l] = E : delete y[l], e.setState({
488
488
  touched: u,
489
- errors: v
489
+ errors: y
490
490
  });
491
491
  }, o = (l) => {
492
492
  const d = {
@@ -511,7 +511,7 @@ const z = {
511
511
  apiKey: e,
512
512
  environment: t
513
513
  }) => {
514
- const a = k(), i = await fetch(
514
+ const a = k(t), i = await fetch(
515
515
  `${a}/tokenization/generate-iframe-configuration`,
516
516
  {
517
517
  method: "POST",
@@ -645,8 +645,8 @@ function Q({
645
645
  if (C && b)
646
646
  try {
647
647
  l();
648
- } catch (y) {
649
- console.error("Failed to create TokenEx iframe:", y);
648
+ } catch (v) {
649
+ console.error("Failed to create TokenEx iframe:", v);
650
650
  }
651
651
  else m < g && f();
652
652
  }, p);
@@ -677,7 +677,7 @@ function Q({
677
677
  n && await o();
678
678
  }, E = () => {
679
679
  s && (s.remove(), s = null);
680
- }, v = async (m) => {
680
+ }, y = async (m) => {
681
681
  s && (s.on("tokenize", async function(g) {
682
682
  await m(g);
683
683
  }), s.tokenize());
@@ -685,7 +685,7 @@ function Q({
685
685
  return {
686
686
  getState: r.getState.bind(r),
687
687
  subscribe: r.subscribe.bind(r),
688
- tokenize: v,
688
+ tokenize: y,
689
689
  cleanup: E,
690
690
  initialize: u
691
691
  };
@@ -699,7 +699,7 @@ const ee = "E-Mail", te = "Name des/der Karteninhaber/in", ae = "Kartendaten", i
699
699
  loading: se,
700
700
  buttonTexts: ne,
701
701
  validation: oe
702
- }, ce = "Email", de = "Cardholder name", he = "Card information", me = "Full name on card", ue = "MM / YY", pe = "Do not close the window", fe = { pay: "PAY", submit: "SUBMIT", getPlan: "GET MY PLAN", donate: "DONATE", book: "BOOK NOW", order: "ORDER NOW" }, ge = { emailSuggestion: "Did you mean {{email}}?", emailInvalid: "Your email is not correct", cardExpiryInvalid: "Your card's expiration date is in the past", cardExpiryFormat: "Your card’s expiration date is incomplete", cardSecurityFormat: "Your card’s security code is incomplete", nameRequired: "Please enter the name as it appears on your card", cardNumberInvalid: "Your card number is invalid" }, ve = {
702
+ }, ce = "Email", de = "Cardholder name", he = "Card information", me = "Full name on card", ue = "MM / YY", pe = "Do not close the window", fe = { pay: "PAY", submit: "SUBMIT", getPlan: "GET MY PLAN", donate: "DONATE", book: "BOOK NOW", order: "ORDER NOW" }, ge = { emailSuggestion: "Did you mean {{email}}?", emailInvalid: "Your email is not correct", cardExpiryInvalid: "Your card's expiration date is in the past", cardExpiryFormat: "Your card’s expiration date is incomplete", cardSecurityFormat: "Your card’s security code is incomplete", nameRequired: "Please enter the name as it appears on your card", cardNumberInvalid: "Your card number is invalid" }, ye = {
703
703
  email: ce,
704
704
  cardholderNameLabel: de,
705
705
  cardInformation: he,
@@ -708,8 +708,8 @@ const ee = "E-Mail", te = "Name des/der Karteninhaber/in", ae = "Kartendaten", i
708
708
  loading: pe,
709
709
  buttonTexts: fe,
710
710
  validation: ge
711
- }, ye = "Correo electrónico", Ee = "Nombre del titular de la tarjeta", be = "Información de la tarjeta", Ce = "Nombre completo en la tarjeta", Se = "MM / AA", xe = "Por favor, no cierre esta ventana", Fe = { pay: "PAGAR", submit: "ENVIAR", getPlan: "OBTENER MI PLAN", donate: "DONAR", book: "RESERVAR AHORA", order: "ORDENAR AHORA" }, we = { emailSuggestion: "¿Quisiste decir {{email}}?", emailInvalid: "Su correo electrónico no es válido", cardExpiryInvalid: "La fecha de vencimiento de la tarjeta ya pasó", cardExpiryFormat: "La fecha de vencimiento de su tarjeta está incompleta", cardSecurityFormat: "El código de seguridad de su tarjeta está incompleto", nameRequired: "Por favor, ingrese el nombre tal como aparece en su tarjeta", cardNumberInvalid: "Su número de tarjeta no es válido" }, Le = {
712
- email: ye,
711
+ }, ve = "Correo electrónico", Ee = "Nombre del titular de la tarjeta", be = "Información de la tarjeta", Ce = "Nombre completo en la tarjeta", Se = "MM / AA", xe = "Por favor, no cierre esta ventana", Fe = { pay: "PAGAR", submit: "ENVIAR", getPlan: "OBTENER MI PLAN", donate: "DONAR", book: "RESERVAR AHORA", order: "ORDENAR AHORA" }, we = { emailSuggestion: "¿Quisiste decir {{email}}?", emailInvalid: "Su correo electrónico no es válido", cardExpiryInvalid: "La fecha de vencimiento de la tarjeta ya pasó", cardExpiryFormat: "La fecha de vencimiento de su tarjeta está incompleta", cardSecurityFormat: "El código de seguridad de su tarjeta está incompleto", nameRequired: "Por favor, ingrese el nombre tal como aparece en su tarjeta", cardNumberInvalid: "Su número de tarjeta no es válido" }, Le = {
712
+ email: ve,
713
713
  cardholderNameLabel: Ee,
714
714
  cardInformation: be,
715
715
  cardholderNamePlaceholder: Ce,
@@ -753,7 +753,7 @@ const ee = "E-Mail", te = "Name des/der Karteninhaber/in", ae = "Kartendaten", i
753
753
  loading: st,
754
754
  buttonTexts: nt,
755
755
  validation: ot
756
- }, ct = "E-posta", dt = "Kart sahibinin adı", ht = "Kart bilgileri", mt = "Kart üzerindeki tam ad", ut = "AA / YY", pt = "Lütfen pencereyi kapatmayın", ft = { pay: "ÖDE", submit: "GÖNDER", getPlan: "PLANIMI AL", donate: "BAĞIŞ YAP", book: "ŞİMDİ REZERVASYON YAP", order: "ŞİMDİ SİPARİŞ VER" }, gt = { emailSuggestion: "{{email}} demek mi istediniz?", emailInvalid: "E-posta adresiniz geçerli değil", cardExpiryInvalid: "Kartınızın son kullanma tarihi geçmiş", cardExpiryFormat: "Kartınızın son kullanma tarihi eksik", cardSecurityFormat: "Kartınızın güvenlik kodu eksik", nameRequired: "Lütfen kart üzerindeki ismi girin", cardNumberInvalid: "Kart numaranız geçersiz" }, vt = {
756
+ }, ct = "E-posta", dt = "Kart sahibinin adı", ht = "Kart bilgileri", mt = "Kart üzerindeki tam ad", ut = "AA / YY", pt = "Lütfen pencereyi kapatmayın", ft = { pay: "ÖDE", submit: "GÖNDER", getPlan: "PLANIMI AL", donate: "BAĞIŞ YAP", book: "ŞİMDİ REZERVASYON YAP", order: "ŞİMDİ SİPARİŞ VER" }, gt = { emailSuggestion: "{{email}} demek mi istediniz?", emailInvalid: "E-posta adresiniz geçerli değil", cardExpiryInvalid: "Kartınızın son kullanma tarihi geçmiş", cardExpiryFormat: "Kartınızın son kullanma tarihi eksik", cardSecurityFormat: "Kartınızın güvenlik kodu eksik", nameRequired: "Lütfen kart üzerindeki ismi girin", cardNumberInvalid: "Kart numaranız geçersiz" }, yt = {
757
757
  email: ct,
758
758
  cardholderNameLabel: dt,
759
759
  cardInformation: ht,
@@ -763,17 +763,17 @@ const ee = "E-Mail", te = "Name des/der Karteninhaber/in", ae = "Kartendaten", i
763
763
  buttonTexts: ft,
764
764
  validation: gt
765
765
  }, N = {
766
- en: ve,
766
+ en: ye,
767
767
  de: le,
768
768
  es: Le,
769
769
  fr: De,
770
770
  pl: Qe,
771
771
  pt: lt,
772
- tr: vt,
772
+ tr: yt,
773
773
  it: Ue
774
774
  // Add other locales here
775
775
  };
776
- class yt {
776
+ class vt {
777
777
  locale;
778
778
  loadedLocales = /* @__PURE__ */ new Set();
779
779
  constructor(e = "en") {
@@ -822,7 +822,7 @@ const A = [
822
822
  "tr"
823
823
  ], Et = "en";
824
824
  function bt(n) {
825
- const e = new yt(), a = (() => {
825
+ const e = new vt(), a = (() => {
826
826
  const o = navigator?.language?.split("-")[0]?.toLowerCase();
827
827
  return A.includes(o) ? o : Et;
828
828
  })();
@@ -1411,7 +1411,7 @@ class Pt extends h {
1411
1411
  cardExpiryError: d,
1412
1412
  cardExpiryTouched: u,
1413
1413
  onChange: E,
1414
- onBlur: v,
1414
+ onBlur: y,
1415
1415
  translationFunc: m,
1416
1416
  cardExpiryAutocomplete: g = "cc-exp"
1417
1417
  } = e, f = document.createElement("div");
@@ -1434,8 +1434,8 @@ class Pt extends h {
1434
1434
  errorMsg: d,
1435
1435
  value: c,
1436
1436
  autocomplete: g,
1437
- onChange: (y) => {
1438
- this.trimCardExpiry(), E(y);
1437
+ onChange: (v) => {
1438
+ this.trimCardExpiry(), E(v);
1439
1439
  },
1440
1440
  styles: {
1441
1441
  color: t.styles.textColor,
@@ -1443,8 +1443,8 @@ class Pt extends h {
1443
1443
  fontSize: t.styles.fontSize,
1444
1444
  fontFamily: t.styles.fontFamily
1445
1445
  }
1446
- }), this.cardExpiry.addEventListener("blur", v), this.cardExpiry.addEventListener("keydown", (y) => {
1447
- const M = y;
1446
+ }), this.cardExpiry.addEventListener("blur", y), this.cardExpiry.addEventListener("keydown", (v) => {
1447
+ const M = v;
1448
1448
  ![
1449
1449
  "Backspace",
1450
1450
  "Delete",
@@ -1463,16 +1463,16 @@ class Pt extends h {
1463
1463
  isLoading: a,
1464
1464
  isFocused: r
1465
1465
  }), b.appendChild(this.cardCvv.getElement()), p.appendChild(this.cardExpiry.getElement()), p.appendChild(b), f.appendChild(p), this.getElement().appendChild(f), i && !s) {
1466
- const y = new x({
1466
+ const v = new x({
1467
1467
  text: m("validation.cardNumberInvalid")
1468
1468
  });
1469
- this.validationMessages.set("cardNumber", y), this.appendChild(y);
1469
+ this.validationMessages.set("cardNumber", v), this.appendChild(v);
1470
1470
  }
1471
1471
  if (r && !o) {
1472
- const y = new x({
1472
+ const v = new x({
1473
1473
  text: m("validation.cardSecurityFormat")
1474
1474
  });
1475
- this.validationMessages.set("cardCvv", y), this.appendChild(y);
1475
+ this.validationMessages.set("cardCvv", v), this.appendChild(v);
1476
1476
  }
1477
1477
  }
1478
1478
  updateCardType(e) {
@@ -1759,7 +1759,7 @@ class Ut extends h {
1759
1759
  const t = e.error || "Failed to load checkout profile data";
1760
1760
  this.setErrorMessage(t);
1761
1761
  }
1762
- else e.error && this.setErrorMessage(e.error);
1762
+ else e.error && (console.error("NO profile found", e.error), this.setErrorMessage(e.error));
1763
1763
  };
1764
1764
  applyFormContainerStyles(e) {
1765
1765
  e.fontFamily && (this.getElement().style.fontFamily = e.fontFamily);
@@ -1775,7 +1775,11 @@ class Ut extends h {
1775
1775
  const { inputStyles: t, formContainerStyle: a } = Ft(
1776
1776
  e.checkoutProfile
1777
1777
  );
1778
- this.applyFormContainerStyles(a), this.iframeHook = Q({
1778
+ this.applyFormContainerStyles(a), this.cardSection || (this.createCardSection(e.checkoutProfile), console.log("✅ Card element check before iframe initialization:", {
1779
+ cardElementExists: !!document.getElementById("card-element"),
1780
+ cvvElementExists: !!document.getElementById("card-cvv-element"),
1781
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1782
+ })), this.iframeHook = Q({
1779
1783
  apiKey: this.options.apiKey,
1780
1784
  checkoutProfile: e.checkoutProfile,
1781
1785
  inputStyles: t,
@@ -1783,9 +1787,11 @@ class Ut extends h {
1783
1787
  this.formManager.setFormData(i);
1784
1788
  },
1785
1789
  environment: this.options.environment
1786
- }), this.iframeHook?.subscribe(this.handleIframeStateChange), await this.iframeHook?.initialize();
1787
- } catch {
1788
- this.setErrorMessage("Failed to initialize payment form");
1790
+ }), this.iframeHook?.subscribe(this.handleIframeStateChange), await this.iframeHook?.initialize(), console.log("✅ TokenEx iframe initialized successfully:", {
1791
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
1792
+ });
1793
+ } catch (t) {
1794
+ console.error("Failed to initialize payment form:", t), this.setErrorMessage("Failed to initialize payment form");
1789
1795
  }
1790
1796
  else e.checkoutProfile || this.setErrorMessage(
1791
1797
  "Cannot initialize iframe: No checkout profile available"
@@ -1814,7 +1820,7 @@ class Ut extends h {
1814
1820
  isCvvValid: !1,
1815
1821
  possibleCardType: "unknown"
1816
1822
  };
1817
- this.iframeHook && (r = this.iframeHook.getState()), this.cardSection = new Pt({
1823
+ if (this.iframeHook && (r = this.iframeHook.getState()), this.cardSection = new Pt({
1818
1824
  checkoutProfile: e,
1819
1825
  isLoading: r.loadingIframe,
1820
1826
  isFocused: r.isFocused,
@@ -1828,9 +1834,24 @@ class Ut extends h {
1828
1834
  onChange: this.handleChange,
1829
1835
  onBlur: this.handleBlur,
1830
1836
  translationFunc: this.translation.t
1831
- }), this.element.appendChild(this.cardSection.getElement()), this.updateFormUI(), this.cardSection && this.emailField && this.cardholderSection && this.submitButton;
1832
- } catch {
1833
- this.setErrorMessage("Card section temporarily unavailabl");
1837
+ }), this.emailField && this.cardholderSection)
1838
+ this.element.insertBefore(
1839
+ this.cardSection.getElement(),
1840
+ this.cardholderSection.getElement()
1841
+ );
1842
+ else if (this.emailField) {
1843
+ const s = this.emailField.getElement().nextSibling;
1844
+ s ? this.element.insertBefore(
1845
+ this.cardSection.getElement(),
1846
+ s
1847
+ ) : this.element.appendChild(this.cardSection.getElement());
1848
+ } else
1849
+ this.element.appendChild(this.cardSection.getElement()), console.warn(
1850
+ "Card section inserted at end of form - component order may be incorrect"
1851
+ );
1852
+ this.updateFormUI(), this.cardSection && this.emailField && this.cardholderSection && this.submitButton;
1853
+ } catch (t) {
1854
+ console.error("Error creating card section:", t), this.setErrorMessage("Card section temporarily unavailable");
1834
1855
  }
1835
1856
  };
1836
1857
  initializeForm() {
@@ -1856,13 +1877,11 @@ class Ut extends h {
1856
1877
  this.setErrorMessage("Failed to load checkout configuration");
1857
1878
  return;
1858
1879
  }
1859
- this.createPaymentMethods(e.checkoutProfile), this.createEmailField(e.checkoutProfile), this.createCardSection(e.checkoutProfile), this.createCardholderSection(e.checkoutProfile), this.createSubmitButton(e.checkoutProfile), console.log("✅ Form components rendered successfully:", {
1860
- cardElementExists: !!document.getElementById("card-element"),
1861
- cvvElementExists: !!document.getElementById("card-cvv-element"),
1880
+ this.createPaymentMethods(e.checkoutProfile), this.createEmailField(e.checkoutProfile), this.createCardholderSection(e.checkoutProfile), this.createSubmitButton(e.checkoutProfile), console.log("✅ Form components rendered successfully:", {
1862
1881
  timestamp: (/* @__PURE__ */ new Date()).toISOString()
1863
1882
  });
1864
- } catch {
1865
- this.setErrorMessage("Failed to render checkout form components");
1883
+ } catch (e) {
1884
+ console.error("Failed to render form components:", e), this.setErrorMessage("Failed to render checkout form components");
1866
1885
  }
1867
1886
  }
1868
1887
  }
@@ -2170,11 +2189,11 @@ typeof globalThis < "u" && (globalThis.OdusCheckout = Yt);
2170
2189
  export {
2171
2190
  Yt as OdusCheckout,
2172
2191
  le as deLocale,
2173
- ve as enLocale,
2192
+ ye as enLocale,
2174
2193
  Le as esLocale,
2175
2194
  De as frLocale,
2176
2195
  Ue as itLocale,
2177
2196
  Qe as plLocale,
2178
2197
  lt as ptLocale,
2179
- vt as trLocale
2198
+ yt as trLocale
2180
2199
  };
package/dist/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odus/checkout",
3
- "version": "0.5.1",
3
+ "version": "0.5.4",
4
4
  "displayName": "Odus Checkout SDK",
5
5
  "keywords": [
6
6
  "odus",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@odus/checkout",
3
- "version": "0.5.2",
3
+ "version": "0.5.4",
4
4
  "displayName": "Odus Checkout SDK",
5
5
  "keywords": [
6
6
  "odus",
@@ -1,18 +0,0 @@
1
- (function(u,S){typeof exports=="object"&&typeof module<"u"?S(exports):typeof define=="function"&&define.amd?define(["exports"],S):(u=typeof globalThis<"u"?globalThis:u||self,S(u.OdusCheckout={}))})(this,function(u){"use strict";var S=document.createElement("style");S.textContent=`.form-container{display:grid;gap:24px;padding:4px;position:relative;min-height:400px;max-width:100%;text-align:left}.form-container>*{font-family:inherit}.card-grid{display:grid}.card-details{display:grid;grid-template-columns:1fr 1fr}@keyframes slideIn{0%{opacity:0;transform:translateY(-10px)}to{opacity:1;transform:translateY(0)}}.error-alert{background-color:#fef2f2;border:1px solid #fecaca;border-radius:8px;padding:16px;box-shadow:0 1px 3px #0000001a,0 1px 2px #0000000f;animation:slideIn .3s ease-out}.error-alert-content{display:flex;align-items:flex-start;gap:12px}.error-alert-icon-container{flex-shrink:0;display:flex;align-items:center;justify-content:center;width:32px;height:32px;background-color:#fee2e2;border-radius:50%;color:#dc2626}.error-alert-icon{color:#dc2626}.error-alert-text-container{flex:1;min-width:0}.error-alert-title{margin:0 0 4px;font-size:14px;font-weight:600;color:#991b1b;line-height:1.4}.error-alert-message{margin:0;font-size:14px;color:#7f1d1d;line-height:1.5;word-break:break-word}.blur-bg{position:absolute;inset:0;height:100%;width:100%;background:transparent;display:flex;flex-direction:column;align-items:center;justify-content:center;backdrop-filter:blur(2px);-webkit-backdrop-filter:blur(3.5px);z-index:9999}.loader{width:64px;height:64px;border:6px solid transparent;border-top:6px solid #4f81ff;border-right:6px solid #36d1dc;border-radius:50%;animation:spin 1s ease-in-out infinite,glow 1.5s ease-in-out infinite alternate;box-shadow:0 0 #4f81ff00}@keyframes spin{to{transform:rotate(360deg)}}@keyframes glow{0%{box-shadow:0 0 #4f81ff00}to{box-shadow:0 0 20px #4f81ff99}}.title{margin-top:20px;font-size:18px;color:#4f4f4f;animation:fadeIn 1s ease-in-out}@keyframes fadeIn{0%{opacity:0;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}.input-wrapper{display:flex;flex-direction:column}.form-input{opacity:1;font-weight:400;letter-spacing:.02em;transition:box-shadow .1s ease-in,border-radius .2s ease-in;box-shadow:0 0 0 1px #e0e0e0,0 2px 4px #00000012,0 1px 1.5px #0000000d;background:#fff;padding:8px 12px;border:none;outline:none;line-height:1.5;z-index:0;box-sizing:border-box}.form-input-error{color:#dc2727}.form-input::placeholder{color:#717173;opacity:.3}.form-input:focus{box-shadow:0 0 0 1px #3297d3b3,0 1px 1px #00000012,0 0 0 4px #3297d34d;z-index:2}.form-helper-text{color:#dc2727;font-size:12px;font-weight:500;margin-top:4px}.input-label{margin-bottom:6px}.card-element{position:relative;height:38.5px;transition:box-shadow .1s ease-in;box-shadow:0 0 0 1px #e0e0e0,0 2px 4px #00000012,0 1px 1.5px #0000000d;padding:0;border:none;background:#fff;border-radius:inherit;box-sizing:border-box;flex:1 1 50%;min-width:0}.card-element iframe{width:100%;min-width:0}.card-element-focus{box-shadow:0 0 0 1px #3297d3b3,0 1px 1px #00000012,0 0 0 4px #3297d34d}.card-icon{width:16px;transition:opacity .6s ease-in;opacity:1}.card-icon img{max-width:100%;display:block;height:auto}.cards-position{position:absolute;z-index:10;right:20px;top:8px;display:flex;align-items:center;gap:8px;pointer-events:none}.loading{position:relative}.loading:after{content:"";position:absolute;inset:0;height:100%;width:100%;backdrop-filter:blur(3px);border-radius:inherit}@media only screen and (min-width: 600px){.card-icon{width:20px}}.paypal{background-color:#ffc439;color:#253b80;font-weight:700;padding:8px 16px;box-shadow:0 2px 4px #0000001a;text-transform:none;cursor:pointer;border-radius:4px}.paypal:hover{background-color:#ffc439;filter:brightness(.95)}.paypal-icon-container{display:flex;align-items:center;justify-content:center}.paypal-icon-container img{width:69px;height:22px}.button{position:relative;display:inline-flex;align-items:center;justify-content:center;padding:8px 16px;font-size:14px;font-weight:500;line-height:1.5;text-align:center;cursor:pointer;transition:all .2s ease;font-weight:700;border:none;outline:none;white-space:nowrap;width:100%}.disabled{pointer-events:none}.valid{outline:none;overflow:hidden;transition:all .3s ease}.valid:before{content:"";position:absolute;top:0;left:-100%;width:100%;height:100%;background:linear-gradient(90deg,transparent,rgba(255,255,255,.4),transparent);transition:left .5s;animation:glowSlide 6s infinite}@keyframes glowSlide{0%{left:-100%}50%{left:100%}to{left:100%}}.valid:after{content:"";position:absolute;top:0;left:0;width:100%;height:100%;background:linear-gradient(90deg,transparent 0%,rgba(255,255,255,.1) 25%,rgba(255,255,255,.3) 50%,rgba(255,255,255,.1) 75%,transparent 100%);transform:translate(-100%);animation:smoothGlow 7s infinite}@keyframes smoothGlow{0%{transform:translate(-100%)}to{transform:translate(100%)}}
2
- /*$vite$:1*/`,document.head.appendChild(S);const I=()=>"http://localhost:3000";class q{apiKey;baseUrl;browserInfo;constructor(e,t,a){this.apiKey=e,this.baseUrl=I(),this.browserInfo=a||{userAgent:navigator.userAgent}}async fetchApi({endpoint:e,method:t="POST",body:a,customHeaders:i={}}){const r={Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json",...i};try{const n=await fetch(`${this.baseUrl}${e}`,{method:t,headers:r,body:a?JSON.stringify(a):void 0});if(!n.ok){let s;try{s=await n.json()}catch(c){console.log("error",c)}throw{message:s?.message[0]||`API request failed: ${n.status} ${n.statusText}`,status:n.status,statusText:n.statusText,details:s}}return n.json()}catch(n){throw n instanceof Error?{message:n.message,status:0,statusText:"Network Error",details:{message:n.message}}:n}}async authorizePayment({paymentId:e,checkoutKey:t,formData:a,token:i,returnUrl:r}){let n={};if(i&&a){const s=a.cardExpiry.replace(/\s+/g,"").split("/"),l=s[0],c=s[1];n={paymentMethodData:{type:"card",card:{token:i,expMonth:l,expYear:`20${c}`,cardholderName:a.name}},customerData:{email:a.email,name:a.name},context:{returnUrl:r,browserInfo:this.browserInfo}}}else n={paymentMethodData:{type:"paypal"},context:{returnUrl:r,browserInfo:this.browserInfo}};return await this.fetchApi({endpoint:`/payments/${e}/authorize`,customHeaders:{Authorization:`Bearer ${t}`},body:n})}}const G=async({id:o,apiKey:e,environment:t})=>{const a=I(),i=await fetch(`${a}/checkout-profiles/${o}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(!i.ok)throw new Error(`HTTP error! Status: ${i.status}`);return await i.json()};class Z{events=new Map;subscribe(e,t){return this.events.has(e)||this.events.set(e,new Set),this.events.get(e)?.add(t),()=>{const a=this.events.get(e);a&&(a.delete(t),a.size===0&&this.events.delete(e))}}publish(e,t){const a=this.events.get(e);a&&a.forEach(i=>i(t))}clear(){this.events.clear()}subscriberCount(e){return this.events.get(e)?.size||0}}const J=new Z;class W{state;initialState;eventBus;stateChangedEvent="state-changed";constructor(e,t=J){this.initialState={...e},this.state={...e},this.eventBus=t}getState(){return Object.freeze({...this.state})}setState(e){const t={...this.state,...e};JSON.stringify(this.state)!==JSON.stringify(t)&&(this.state=t,this.eventBus.publish(this.stateChangedEvent,this.getState()))}resetState(){this.state={...this.initialState},this.eventBus.publish(this.stateChangedEvent,this.getState())}subscribe(e){return this.eventBus.subscribe(this.stateChangedEvent,e)}getValue(e){return this.state[e]}}function k(o){return new W(o)}function X({apiKey:o,profileId:e,environment:t}){const a=k({checkoutProfile:void 0,isLoading:!0,error:null}),i=async()=>{try{a.setState({isLoading:!0});const r=await G({apiKey:o,id:e,environment:t});r&&a.setState({checkoutProfile:r,isLoading:!1,error:null})}catch(r){a.setState({error:"Failed to load checkout profile",isLoading:!1}),console.error(r)}};return i(),{getState:a.getState.bind(a),subscribe:a.subscribe.bind(a),reload:i}}const N={cardNumber:o=>(o.replace(/\s/g,"").match(/.{1,4}/g)||[]).join(" "),cardExpiry:o=>{const t=o.replace(/\D/g,"").slice(0,4);return t.length>2?`${t.slice(0,2)} / ${t.slice(2)}`:t}},P={"gmail.com":["gmal.com","gmil.com","gmai.com","gmial.com","gmail.co","gmaill.com","gamil.com","gmailcom","gmail.cm","gmail.om"],"yahoo.com":["yaho.com","yahooo.com","yahoo.co","yhoo.com","yahocom","yahoo.cm","yah00.com","yaho0.com","hoo.com"],"hotmail.com":["hotmal.com","hotamail.com","hotmai.com","hotmial.com","hotmail.co","hotmailcom","hotmail.cm","htmail.com","hotmil.com"],"outlook.com":["outlok.com","outloo.com","outlook.co","outllok.com","outlook.cm","outlookcom","outloook.com","outook.com","otlook.com"],"icloud.com":["iclod.com","iclud.com","icloud.co","icloudcom","icloud.cm","iclou.com","icloude.com","icld.com","iclould.com"],"aol.com":["aol.co","aolcom","aol.cm","aolmail.com","al.com","ao.com","aol.comm"],"protonmail.com":["protonmal.com","protonmai.com","protonmial.com","protonmail.co","protonmailcom","protonmail.cm","protonmil.com"],"zoho.com":["zoho.co","zohocom","zoho.cm","zoh.com","zohomail.com","zho.com"],"mail.com":["mail.co","mailcom","mail.cm","mal.com","mial.com","mail.comm"],"comcast.net":["comcast.com","comcat.net","comcst.net","comcastnet","comcast.nt","comcas.net"],"verizon.net":["verizon.com","verizon.nt","verizonnet","verizn.net","verizon.ne","verzon.net"],"att.net":["att.com","at.net","att.nt","attnet","att.ne","attt.net"]},Q=o=>{if(!o||o.includes("."))return null;const e=["com","net","org","edu","gov","io","co"];for(const t of e){if(o==="companycok"&&t==="co")return"company.co";if(o.endsWith(t)&&!o.includes(".")){const a=o.length-t.length;return`${o.substring(0,a)}.${t}`}}return null},ee=(o,e)=>{if(o.length===0)return e.length;if(e.length===0)return o.length;const t=e.length+1,a=o.length+1,i=Array.from({length:t},(r,n)=>Array.from({length:a},(s,l)=>n===0?l:l===0?n:0));for(let r=1;r<t;r++)for(let n=1;n<a;n++){const s=o[n-1]===e[r-1]?0:1;i[r][n]=Math.min(i[r-1][n]+1,i[r][n-1]+1,i[r-1][n-1]+s)}return i[e.length][o.length]},te=o=>{let t=null,a=3;const i=o.toLowerCase();for(const r of Object.keys(P)){const n=ee(i,r);n<=2&&n<a&&(a=n,t=r)}return t},ae=()=>{const{t:o}=T();return{validateEmail:t=>{const a=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;if(!t)return{isValid:!1,message:o("validation.emailInvalid"),suggestion:null};const i=t.indexOf("@");if(i===-1)return{isValid:!1,message:o("validation.emailInvalid"),suggestion:null};const r=t.substring(0,i),n=t.substring(i+1);if(!n.includes(".")){const l=Q(n);if(l)return{isValid:!1,message:o("validation.emailSuggestion",{email:`${r}@${l}`}),suggestion:`${r}@${l}`};for(const c of Object.keys(P))if(c.replace(/\./g,"")===n)return{isValid:!1,message:o("validation.emailSuggestion",{email:`${r}@${c}`}),suggestion:`${r}@${c}`}}if(!a.test(t))return{isValid:!1,message:o("validation.emailInvalid"),suggestion:null};const s=te(n);if(s&&s!==n){const l=`${r}@${s}`;return{isValid:!1,message:o("validation.emailSuggestion",{email:l}),suggestion:l}}return{isValid:!0,message:"Email is valid",suggestion:null}}}},ie=()=>{const{t:o}=T(),{validateEmail:e}=ae();return{email:t=>{const a=e(t);return a.isValid?void 0:a.message},name:t=>{if(!t.trim())return o("validation.nameRequired")},cardExpiry:t=>{const a=t.replace(/\s/g,""),[i,r]=a.split("/").map(p=>p.trim());if(!i||!r||i.length!==2||r.length!==2)return o("validation.cardExpiryFormat");const n=new Date,s=n.getFullYear()%100,l=n.getMonth()+1,c=parseInt(i,10),d=parseInt(r,10);if(c<1||c>12)return o("validation.cardExpiryFormat");if(d<s||d===s&&c<l)return o("validation.cardExpiryInvalid")}}},re=()=>{const o=ie(),e=k({formData:{name:"",email:"",cardExpiry:""},errors:{},touched:{email:!1,name:!1,cardExpiry:!1},isValid:!1}),t=(l,c)=>{const d=o[l];return d?.(c)},a=l=>{const c={};return Object.keys(l).forEach(d=>{const p=t(d,l[d]);p&&(c[d]=p)}),c},i=l=>{const c=a(l);return Object.keys(c).length===0},r=(l,c)=>{const d=e.getState();let p=c;l in N&&(p=N[l](c));const E={...d.formData,[l]:p},v={...d.errors};if(d.touched[l]){const m=t(l,p);m?v[l]=m:delete v[l]}e.setState({formData:E,errors:v,isValid:i(E)})},n=(l,c)=>{const d=e.getState(),p={...d.touched,[l]:!0},E=t(l,c),v={...d.errors};E?v[l]=E:delete v[l],e.setState({touched:p,errors:v})},s=l=>{const d={...e.getState().formData,...l};e.setState({formData:d,isValid:i(d)})};return{getFormState:e.getState.bind(e),subscribe:e.subscribe.bind(e),handleChange:r,handleBlur:n,setFormData:s,reset:e.resetState.bind(e)}},ne=async({props:o,apiKey:e,environment:t})=>{const a=I(),i=await fetch(`${a}/tokenization/generate-iframe-configuration`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(o)});if(!i.ok)throw new Error(`HTTP error! Status: ${i.status}`);return await i.json()},oe=100,se=2,le=2e3,ce=5;function de({apiKey:o,checkoutProfile:e,inputStyles:t,setFormData:a,environment:i}){const r=k({iframeConfig:void 0,loadingIframe:!0,isCcValid:!1,isCvvValid:!1,isFocused:!1,isCvvFocused:!1,possibleCardType:"unknown"});let n=null;const s=async()=>{try{const m=await ne({props:{allowedOrigins:[globalThis.location.origin]},apiKey:o,environment:i});m&&(r.setState({iframeConfig:{...m,origin:globalThis.location.origin}}),d())}catch(m){console.error("Failed to generate iframe config:",m)}},l=()=>{const m=r.getState();if(!m.iframeConfig||!e)return;const y=document.getElementById("card-element"),g=document.getElementById("card-cvv-element");if(!y||!g)throw new Error("Card elements not found in DOM");console.log("✅ TokenEx iframe initializing successfully:",{cardElementId:y.id,cvvElementId:g.id,timestamp:new Date().toISOString()}),n=new globalThis.TokenEx.Iframe("card-element",{...m.iframeConfig,placeholder:"1234 1234 1234 1234",cvvPlaceholder:"CVC",cvv:!0,cvvContainerID:"card-cvv-element",enableValidateOnBlur:!1,enableValidateOnKeyUp:!0,enableValidateOnCvvKeyUp:!0,enablePrettyFormat:!0,inputMode:"numeric",cvvInputType:"numeric",font:e.styles.fontFamily,enableAutoComplete:!0,returnAutoCompleteValues:!0,useExtendedBIN:!0,styles:{...t,base:`${t.base}; sans-serif; border-radius: ${e.styles.borderRadius}px ${e.styles.borderRadius}px 0px 0px`,cvv:{...t,base:`${t.base}; border-radius: 0px 0px ${e.styles.borderRadius}px 0px`}}}),n.on("load",()=>{r.setState({loadingIframe:!1})}),n.on("autoCompleteValues",function(f){const{nameOnCard:C,cardExp:x}=f;a({name:C,cardExpiry:x})}),n.on("validate",function(f){const{isValid:C,isCvvValid:x}=f;r.setState({isCcValid:C,isCvvValid:x})}),n.on("focus",function(){r.setState({isFocused:!0})}),n.on("blur",function(){r.setState({isFocused:!1})}),n.on("cvvFocus",function(){r.setState({isCvvFocused:!0})}),n.on("cvvBlur",function(){r.setState({isCvvFocused:!1})}),n.on("cardTypeChange",function({possibleCardType:f}){r.setState({possibleCardType:f})}),n.load()},c=()=>{let m=0;const y=ce;console.warn("Card elements not found in DOM, retrying iframe initialization...");const g=()=>{if(m++,m>y){console.error("Failed to find card elements after maximum retries");return}const f=Math.min(oe*Math.pow(se,m-1),le);setTimeout(()=>{const C=document.getElementById("card-element"),x=document.getElementById("card-cvv-element");if(C&&x)try{l()}catch(b){console.error("Failed to create TokenEx iframe:",b)}else m<y&&g()},f)};g()},d=()=>{if(!r.getState().iframeConfig||!e)return;if(!globalThis.TokenEx?.Iframe){console.error("TokenEx script not loaded correctly");return}const y=document.getElementById("card-element"),g=document.getElementById("card-cvv-element");if(console.log("🔍 TokenEx iframe initialization check:",{cardElementExists:!!y,cvvElementExists:!!g,timestamp:new Date().toISOString()}),!y||!g){c();return}try{l()}catch(f){console.error("Failed to create TokenEx iframe:",f)}},p=async()=>{o&&await s()},E=()=>{n&&(n.remove(),n=null)},v=async m=>{n&&(n.on("tokenize",async function(y){await m(y)}),n.tokenize())};return{getState:r.getState.bind(r),subscribe:r.subscribe.bind(r),tokenize:v,cleanup:E,initialize:p}}const A={email:"E-Mail",cardholderNameLabel:"Name des/der Karteninhaber/in",cardInformation:"Kartendaten",cardholderNamePlaceholder:"Vollständiger Name",cardExpiry:"MM / JJ",loading:"Das Fenster nicht schließen",buttonTexts:{pay:"ZAHLEN",submit:"ABSENDEN",getPlan:"MEINEN PLAN ERHALTEN",donate:"spenden",book:"jetzt buchen",order:"jetzt bestellen"},validation:{emailSuggestion:"Meinten Sie {{email}}?",emailInvalid:"Ihre E-Mail-Adresse ist nicht korrekt",cardExpiryInvalid:"Das Ablaufdatum Ihrer Karte liegt in der Vergangenheit",cardExpiryFormat:"Das Ablaufdatum Ihrer Karte ist unvollständig",cardSecurityFormat:"Der Sicherheitscode Ihrer Karte ist unvollständig",nameRequired:"Gib deinen Namen genau so ein, wie er auf deiner Karte steht",cardNumberInvalid:"Die Kartennummer ist unvollständig"}},D={email:"Email",cardholderNameLabel:"Cardholder name",cardInformation:"Card information",cardholderNamePlaceholder:"Full name on card",cardExpiry:"MM / YY",loading:"Do not close the window",buttonTexts:{pay:"PAY",submit:"SUBMIT",getPlan:"GET MY PLAN",donate:"DONATE",book:"BOOK NOW",order:"ORDER NOW"},validation:{emailSuggestion:"Did you mean {{email}}?",emailInvalid:"Your email is not correct",cardExpiryInvalid:"Your card's expiration date is in the past",cardExpiryFormat:"Your card’s expiration date is incomplete",cardSecurityFormat:"Your card’s security code is incomplete",nameRequired:"Please enter the name as it appears on your card",cardNumberInvalid:"Your card number is invalid"}},R={email:"Correo electrónico",cardholderNameLabel:"Nombre del titular de la tarjeta",cardInformation:"Información de la tarjeta",cardholderNamePlaceholder:"Nombre completo en la tarjeta",cardExpiry:"MM / AA",loading:"Por favor, no cierre esta ventana",buttonTexts:{pay:"PAGAR",submit:"ENVIAR",getPlan:"OBTENER MI PLAN",donate:"DONAR",book:"RESERVAR AHORA",order:"ORDENAR AHORA"},validation:{emailSuggestion:"¿Quisiste decir {{email}}?",emailInvalid:"Su correo electrónico no es válido",cardExpiryInvalid:"La fecha de vencimiento de la tarjeta ya pasó",cardExpiryFormat:"La fecha de vencimiento de su tarjeta está incompleta",cardSecurityFormat:"El código de seguridad de su tarjeta está incompleto",nameRequired:"Por favor, ingrese el nombre tal como aparece en su tarjeta",cardNumberInvalid:"Su número de tarjeta no es válido"}},V={email:"E-mail",cardholderNameLabel:"Nom du titulaire de la carte",cardInformation:"Informations de la carte",cardholderNamePlaceholder:"Nom complet figurant sur la carte",cardExpiry:"MM / AA",loading:"Veuillez ne pas fermer cette fenêtre",buttonTexts:{pay:"PAYER",submit:"ENVOYER",getPlan:"OBTENIR MON PLAN",donate:"FAIRE UN DON",book:"RÉSERVER MAINTENANT",order:"COMMANDER MAINTENANT"},validation:{emailSuggestion:"Vouliez-vous dire {{email}}?",emailInvalid:"Votre adresse e-mail n’est pas valide",cardExpiryInvalid:"La date d'expiration de votre carte est dans le passé",cardExpiryFormat:"La date d’expiration de votre carte est incomplète",cardSecurityFormat:"Le code de sécurité de votre carte est incomplet",nameRequired:"Veuillez saisir le nom tel qu’il figure sur votre carte",cardNumberInvalid:"Votre numéro de carte est invalide"}},B={email:"Email",cardholderNameLabel:"Nome del titolare della carta",cardInformation:"Informazioni sulla carta",cardholderNamePlaceholder:"Nome completo sulla carta",cardExpiry:"MM / AA",loading:"Non chiudere la finestra",buttonTexts:{pay:"PAGA",submit:"INVIA",getPlan:"OTTIENI IL MIO PIANO",donate:"DONARE",book:"PRENOTA ORA",order:"ORDINA ORA"},validation:{emailSuggestion:"Intendevi {{email}}?",emailInvalid:"La tua email non è corretta",cardExpiryInvalid:"La data di scadenza della tua carta è nel passato",cardExpiryFormat:"La data di scadenza della tua carta è incompleta",cardSecurityFormat:"Il codice di sicurezza della tua carta è incompleto",nameRequired:"Inserisci il nome come appare sulla tua carta",cardNumberInvalid:"Il numero della tua carta non è valido"}},O={email:"Adres e-mail",cardholderNameLabel:"Imię i nazwisko posiadacza karty",cardInformation:"Informacje o karcie",cardholderNamePlaceholder:"Imię i nazwisko na karcie",cardExpiry:"MM / RR",loading:"Proszę nie zamykać tego okna",buttonTexts:{pay:"ZAPŁAĆ",submit:"WYŚLIJ",getPlan:"POBIERZ MÓJ PLAN",donate:"PRZEKAŻ DAROWIZNĘ",book:"ZAREZERWUJ TERAZ",order:"ZAMÓW TERAZ"},validation:{emailSuggestion:"Czy chodziło Ci o {{email}}?",emailInvalid:"Państwa adres e-mail jest nieprawidłowy",cardExpiryInvalid:"Data ważności Państwa karty jest w przeszłości",cardExpiryFormat:"Data ważności Państwa karty jest niekompletna",cardSecurityFormat:"Kod zabezpieczający Państwa karty jest niekompletny",nameRequired:"Proszę wpisać imię i nazwisko tak, jak widnieje na karcie",cardNumberInvalid:"Numer Państwa karty jest nieprawidłowy"}},H={email:"E-mail",cardholderNameLabel:"Nome do titular do cartão",cardInformation:"Informações do cartão",cardholderNamePlaceholder:"Nome completo no cartão",cardExpiry:"MM / AA",loading:"Por favor, não feche esta janela",buttonTexts:{pay:"PAGAR",submit:"ENVIAR",getPlan:"OBTER MEU PLANO",donate:"DOAR",book:"RESERVAR AGORA",order:"FAZER PEDIDO"},validation:{emailSuggestion:"Você quis dizer {{email}}?",emailInvalid:"O seu endereço de e-mail não é válido",cardExpiryInvalid:"A data de validade do seu cartão está no passado",cardExpiryFormat:"A data de validade do seu cartão está incompleta",cardSecurityFormat:"O código de segurança do seu cartão está incompleto",nameRequired:"Por favor, insira o nome conforme aparece no cartão",cardNumberInvalid:"O número do seu cartão é inválido"}},j={email:"E-posta",cardholderNameLabel:"Kart sahibinin adı",cardInformation:"Kart bilgileri",cardholderNamePlaceholder:"Kart üzerindeki tam ad",cardExpiry:"AA / YY",loading:"Lütfen pencereyi kapatmayın",buttonTexts:{pay:"ÖDE",submit:"GÖNDER",getPlan:"PLANIMI AL",donate:"BAĞIŞ YAP",book:"ŞİMDİ REZERVASYON YAP",order:"ŞİMDİ SİPARİŞ VER"},validation:{emailSuggestion:"{{email}} demek mi istediniz?",emailInvalid:"E-posta adresiniz geçerli değil",cardExpiryInvalid:"Kartınızın son kullanma tarihi geçmiş",cardExpiryFormat:"Kartınızın son kullanma tarihi eksik",cardSecurityFormat:"Kartınızın güvenlik kodu eksik",nameRequired:"Lütfen kart üzerindeki ismi girin",cardNumberInvalid:"Kart numaranız geçersiz"}},K={en:D,de:A,es:R,fr:V,pl:O,pt:H,tr:j,it:B};class he{locale;loadedLocales=new Set;constructor(e="en"){this.locale=e,this.loadedLocales.add(e)}setLocale(e){this.locale=e,this.loadedLocales.add(e)}getLocale(){return this.locale}translate(e,t){const a=this.getNestedTranslation(e);return!t||a===e?a:this.interpolate(a,t)}getNestedTranslation(e){const t=this.locale in K?K[this.locale]:{},a=this.findNestedValue(t,e);return a===void 0?e:a}findNestedValue(e,t){const a=t.split(".");let i=e;for(const r of a){if(i==null||!Object.prototype.hasOwnProperty.call(i,r))return;i=i[r]}return typeof i=="string"?i:void 0}interpolate(e,t){return e.replace(/{{(\w+)}}/g,(a,i)=>{const r=t[i];return r===void 0?a:String(r)})}}const _=["en","de","es","fr","pl","pt","it","tr"],me="en";function ue(o){const e=new he,a=(()=>{const s=navigator?.language?.split("-")[0]?.toLowerCase();return _.includes(s)?s:me})();e.setLocale(a);const i=k({locale:a,translationService:e});return{store:i,translate:(s,l)=>i.getState().translationService.translate(s,l),setLocale:s=>{_.includes(s)&&(i.getState().translationService.setLocale(s),i.setState({locale:s}))},getLocale:()=>i.getValue("locale"),subscribe:i.subscribe.bind(i)}}const pe=ue(),T=()=>{const{translate:o,getLocale:e,setLocale:t,subscribe:a}=pe;return{t:o,translate:o,locale:e(),setLocale:t,subscribe:a}},fe=({fontFamily:o})=>{if(!o)return{cleanup:()=>{}};const e=o.replace(/\s+/g,"+"),t=`https://fonts.googleapis.com/css2?family=${e}:wght@400;700&display=swap`,a=[...document.head.querySelectorAll("link")].filter(s=>s.href.includes("fonts.googleapis.com/css2")&&s.rel==="stylesheet"),i=document.createElement("link");i.rel="stylesheet",i.href=t;const r=a.find(s=>s.href.includes(`family=${e}`));if(r)r.href=t;else if(a.length>0){const s=a.at(-1);s?.nextSibling?document.head.insertBefore(i,s.nextSibling):document.head.appendChild(i)}else document.head.appendChild(i);return{cleanup:()=>{document.head.contains(i)&&document.head.removeChild(i)}}},ge=({scriptSrc:o,async:e=!1})=>{if(!o)return{cleanup:()=>{},isLoaded:Promise.resolve(!1)};if([...document.head.querySelectorAll("script")].filter(n=>n.src===o).length>0)return{cleanup:()=>{},isLoaded:Promise.resolve(!0)};const a=document.createElement("script");a.src=o,a.async=e;const i=new Promise((n,s)=>{a.onload=()=>n(!0),a.onerror=()=>{console.error(`Failed to load script: ${o}`),s(new Error(`Failed to load script: ${o}`))}});return document.head.appendChild(a),{cleanup:()=>{document.head.contains(a)&&document.head.removeChild(a)},isLoaded:i}},M=o=>Object.entries(o).map(([e,t])=>{const a=e.replace(/([A-Z])/g,"-$1").toLowerCase(),i=typeof t=="number"?`${t}px`:t;return`${a}: ${i}`}).join("; ");function ye(o){if(!o)return{formContainerStyle:{},baseStyles:{},placeholderStyles:{},errorStyles:{},focusStyles:{},inputStyles:{base:"",error:"",focus:"",placeholder:""}};const e={opacity:"1",background:"#fff",border:"none",outline:"none",fontSize:`${o.styles.fontSize}px`,lineHeight:30,boxSizing:"border-box",padding:"0px 12px",height:36,width:"100%",fontFamily:`${o.styles.fontFamily}, sans-serif`},t={color:"#717173",opacity:"0.3",fontFamily:`${o.styles.fontFamily}, sans-serif`},a={color:"#dc2727"},i={outline:0},r={fontFamily:`${o.styles.fontFamily}, sans-serif`},n={base:M(e),error:M(a),focus:M(i),placeholder:M(t)};return{formContainerStyle:r,baseStyles:e,placeholderStyles:t,errorStyles:a,focusStyles:i,inputStyles:n}}class h{element;children=[];eventListeners=[];constructor(e,t=[],a={}){this.element=document.createElement(e),t.length>0&&this.addClass(...t),Object.entries(a).forEach(([i,r])=>{this.setAttribute(i,r)})}getElement(){return this.element}addClass(...e){return this.element.classList.add(...e),this}removeClass(...e){return this.element.classList.remove(...e),this}setAttribute(e,t){return this.element.setAttribute(e,t),this}setText(e){return this.element.textContent=e,this}setHTML(e){return this.element.innerHTML=e,this}appendChild(e){return this.children.push(e),this.element.appendChild(e.getElement()),this}appendTo(e){return e instanceof h?e.appendChild(this):e.appendChild(this.element),this}addEventListener(e,t,a){return this.element.addEventListener(e,t,a),this.eventListeners.push({type:e,listener:t}),this}removeEventListener(e,t,a){return this.element.removeEventListener(e,t,a),this}hide(){return this.element.style.display="none",this}show(){return this.element.style.display="",this}destroy(){this.eventListeners.forEach(({type:e,listener:t})=>{this.element.removeEventListener(e,t)}),this.eventListeners=[],this.children.forEach(e=>e.destroy()),this.children=[],this.element.parentNode&&this.element.parentNode.removeChild(this.element)}}class w{static createDiv(e=[],t={}){return new h("div",e,t)}static createSpan(e=[],t={}){return new h("span",e,t)}static createButton(e,t=[],a={}){const i=new h("button",t,a);return i.setText(e),i}static createInput(e,t=[],a={}){const i={type:e,...a};return new h("input",t,i)}static createTextInput(e="",t=[],a={}){const i={type:"text",placeholder:e,...a};return new h("input",t,i)}static createForm(e=[],t={}){return new h("form",e,t)}static createLabel(e,t="",a=[],i={}){const r=t?{for:t,...i}:i,n=new h("label",a,r);return n.setText(e),n}static createSelect(e,t=[],a={}){const i=new h("select",t,a);return e.forEach(r=>{const n=document.createElement("option");n.value=r.value,n.textContent=r.text,r.selected&&(n.selected=!0),i.getElement().appendChild(n)}),i}static createImage(e,t="",a=[],i={}){const r={src:e,alt:t,...i};return new h("img",a,r)}}class ve extends h{messageComponent;constructor(e){super("div",[]);const t=w.createDiv(["error-alert"],{role:"alert","aria-live":"polite"}),a=w.createDiv(["error-alert-content"]),i=w.createDiv(["error-alert-icon-container"]);i.getElement().innerHTML=this.createAlertCircleSVG();const r=w.createDiv(["error-alert-text-container"]),n=new h("h4",["error-alert-title"]);n.setText("Checkout Error"),this.messageComponent=new h("p",["error-alert-message"]),this.messageComponent.setText(e.message||"Bad request"),r.appendChild(n),r.appendChild(this.messageComponent),a.appendChild(i),a.appendChild(r),t.appendChild(a),this.appendChild(t)}createAlertCircleSVG(){return`
3
- <svg
4
- xmlns="http://www.w3.org/2000/svg"
5
- width="14"
6
- height="14"
7
- viewBox="0 0 24 24"
8
- fill="none"
9
- stroke="currentColor"
10
- stroke-width="2"
11
- stroke-linecap="round"
12
- stroke-linejoin="round"
13
- >
14
- <circle cx="12" cy="12" r="10" />
15
- <line x1="12" x2="12" y1="8" y2="12" />
16
- <line x1="12" x2="12.01" y1="16" y2="16" />
17
- </svg>
18
- `}setMessage(e){return this.messageComponent.setText(e),this}}class U extends h{titleElement;constructor(e={}){super("div",["blur-bg"]);const t=w.createDiv(["loader"]);this.titleElement=new h("h3",["title"]),this.titleElement.setText(e.text||""),this.appendChild(t),this.appendChild(this.titleElement)}setText(e){return this.titleElement.setText(e),this}}class F extends h{constructor(e){super("div",[]);const t=document.createElement("span");t.className="form-helper-text",t.textContent=e.text||"",this.getElement().appendChild(t)}setText(e){const t=this.getElement().querySelector(".form-helper-text");return t&&(t.textContent=e),this}}class be extends h{constructor(e){super("label",["input-label"],{for:e.id}),this.setText(e.label);const t=this.getElement();t.style.fontFamily="inherit",t.style.color=e.styles.color,t.style.fontSize=`${e.styles.fontSize}px`}}class $ extends h{inputElement;helperText=null;constructor(e){if(super("div",["input-wrapper"]),e.label&&e.styles){const a=new be({styles:{color:e.styles.color,fontSize:e.styles.fontSize},label:e.label,id:e.name});this.appendChild(a)}const t={id:e.name,name:e.name,class:`form-input ${e.error?"form-input-error":""}`};if(e.placeholder&&(t.placeholder=e.placeholder),e.value&&(t.value=e.value),e.required&&(t.required=String(e.required)),e.disabled&&(t.disabled=String(e.disabled)),e.autocomplete&&(t.autocomplete=e.autocomplete),this.inputElement=w.createInput(e.type||"text",[],t),e.styles){const a=this.inputElement.getElement();a.style.fontFamily=`"${e.styles.fontFamily}", sans-serif`,a.style.color=e.styles.color,a.style.fontSize=`${e.styles.fontSize}px`,a.style.borderRadius=e.styles.borderRadius}e.onChange&&this.inputElement.getElement().addEventListener("input",e.onChange),this.getElement().appendChild(this.inputElement.getElement()),e.error&&(this.helperText=new F({text:e.errorMsg}),this.appendChild(this.helperText))}getValue(){return this.inputElement.getElement().value}setValue(e){return this.inputElement.getElement().value=e,this}setError(e,t){const a=this.inputElement.getElement();return e?(a.classList.add("form-input-error"),!this.helperText&&t?(this.helperText=new F({text:t}),this.appendChild(this.helperText)):this.helperText&&t&&this.helperText.setText(t)):(a.classList.remove("form-input-error"),this.helperText&&(this.helperText.getElement().remove(),this.helperText=null)),this}addEventListener(e,t,a){return this.inputElement.getElement().addEventListener(e,t,a),this}}class Ee{input;constructor(e){const{value:t,onChange:a,onBlur:i,error:r,errorMsg:n,checkoutProfile:s,translationFunc:l,autocomplete:c="cc-name"}=e;this.input=new $({name:"name",label:l("cardholderNameLabel"),error:r,errorMsg:n,styles:{color:s.styles.textColor,borderRadius:`${s.styles.borderRadius}px`,fontSize:s.styles.fontSize,fontFamily:s.styles.fontFamily},placeholder:l("cardholderNamePlaceholder"),value:t,autocomplete:c,onChange:d=>{this.trim(),a(d)}}),this.input.addEventListener("blur",d=>{i(d)})}getValue(){return this.input.getValue()}setValue(e){return this.input.setValue(e),this}trim(){const e=this.getValue().trimStart();return this.setValue(e),this}setError(e,t){return this.input.setError(e,t),this}getElement(){return this.input.getElement()}appendTo(e){return this.input.appendTo(e),this}}class xe extends h{constructor(e){super("div",[]);const t=document.createElement("div");t.className=e.isLoading?"loading":"",t.style.borderRadius=`0px 0px ${e.styles.borderRadius}px 0px`;const a=document.createElement("div");a.id="card-cvv-element",a.className=`card-element ${e.isFocused?"card-element-focus":""}`,a.style.zIndex=e.isFocused?"2":"0",t.appendChild(a),this.getElement().appendChild(t)}setFocused(e){const t=this.getElement().querySelector("#card-cvv-element");return t&&(e?(t.classList.add("card-element-focus"),t.setAttribute("style","z-index: 2")):(t.classList.remove("card-element-focus"),t.setAttribute("style","z-index: 0"))),this}setLoading(e){const t=this.getElement().querySelector("div");return t&&(e?t.classList.add("loading"):t.classList.remove("loading")),this}}const L=[{type:"visa",imgSrc:"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='utf-8'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20width='800px'%20height='800px'%20viewBox='0%20-140%20780%20780'%20enable-background='new%200%200%20780%20500'%20version='1.1'%20xml:space='preserve'%20xmlns='http://www.w3.org/2000/svg'%3e%3cpath%20d='M40,0h700c22.092,0,40,17.909,40,40v420c0,22.092-17.908,40-40,40H40c-22.091,0-40-17.908-40-40V40%20C0,17.909,17.909,0,40,0z'%20fill='%230E4595'/%3e%3cpath%20d='m293.2%20348.73l33.361-195.76h53.36l-33.385%20195.76h-53.336zm246.11-191.54c-10.57-3.966-27.137-8.222-47.822-8.222-52.725%200-89.865%2026.55-90.18%2064.603-0.299%2028.13%2026.514%2043.822%2046.752%2053.186%2020.771%209.595%2027.752%2015.714%2027.654%2024.283-0.131%2013.121-16.586%2019.116-31.922%2019.116-21.357%200-32.703-2.967-50.227-10.276l-6.876-3.11-7.489%2043.823c12.463%205.464%2035.51%2010.198%2059.438%2010.443%2056.09%200%2092.5-26.246%2092.916-66.882%200.199-22.269-14.016-39.216-44.801-53.188-18.65-9.055-30.072-15.099-29.951-24.268%200-8.137%209.668-16.839%2030.557-16.839%2017.449-0.27%2030.09%203.535%2039.938%207.5l4.781%202.26%207.232-42.429m137.31-4.223h-41.232c-12.773%200-22.332%203.487-27.941%2016.234l-79.244%20179.4h56.031s9.16-24.123%2011.232-29.418c6.125%200%2060.555%200.084%2068.338%200.084%201.596%206.853%206.49%2029.334%206.49%2029.334h49.514l-43.188-195.64zm-65.418%20126.41c4.412-11.279%2021.26-54.723%2021.26-54.723-0.316%200.522%204.379-11.334%207.074-18.684l3.605%2016.879s10.219%2046.729%2012.354%2056.528h-44.293zm-363.3-126.41l-52.24%20133.5-5.567-27.13c-9.725-31.273-40.025-65.155-73.898-82.118l47.766%20171.2%2056.456-0.064%2084.004-195.39h-56.521'%20fill='%23ffffff'/%3e%3cpath%20d='m146.92%20152.96h-86.041l-0.681%204.073c66.938%2016.204%20111.23%2055.363%20129.62%20102.41l-18.71-89.96c-3.23-12.395-12.597-16.094-24.186-16.527'%20fill='%23F2AE14'/%3e%3c/svg%3e"},{type:"masterCard",imgSrc:"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='iso-8859-1'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20height='800px'%20width='800px'%20version='1.1'%20id='Layer_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20viewBox='0%200%20291.791%20291.791'%20xml:space='preserve'%3e%3cg%3e%3cpath%20style='fill:%23E2574C;'%20d='M182.298,145.895c0,50.366-40.801,91.176-91.149,91.176S0,196.252,0,145.895%20s40.811-91.176,91.149-91.176S182.298,95.538,182.298,145.895z'/%3e%3cpath%20style='fill:%23F4B459;'%20d='M200.616,54.719c-20.442,0-39.261,6.811-54.469,18.181l0.073,0.009%20c2.991,2.89,6.291,4.924,8.835,8.251l-18.965,0.301c-2.972,3-5.68,6.264-8.233,9.656H161.3c2.544,3.054,4.896,5.708,7.03,9.081%20h-46.536c-1.705,2.936-3.282,5.954-4.659,9.09h56.493c1.477,3.127,2.799,5.489,3.921,8.799h-63.76%20c-1.012,3.146-1.878,6.364-2.535,9.646h68.966c0.675,3.155,1.194,6.072,1.55,9.045h-71.884c-0.301,3-0.456,6.045-0.456,9.118%20h72.859c0,3.228-0.228,6.218-0.556,9.118h-71.847c0.31,3.091,0.766,6.127,1.368,9.118h68.856c-0.711,2.954-1.532,5.926-2.562,9.008%20h-63.969c0.966,3.118,2.143,6.145,3.428,9.099h56.621c-1.568,3.319-3.346,5.972-5.306,9.081h-46.691%20c1.842,3.191,3.875,6.236,6.081,9.154l33.589,0.501c-2.863,3.437-6.537,5.507-9.884,8.516c0.182,0.146-5.352-0.018-16.248-0.191%20c16.576,17.105,39.744,27.772,65.446,27.772c50.357,0,91.176-40.82,91.176-91.176S250.981,54.719,200.616,54.719z'/%3e%3c/g%3e%3c/svg%3e"},{type:"americanExpress",imgSrc:"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='iso-8859-1'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20height='30px'%20width='30px'%20version='1.1'%20id='Capa_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20viewBox='0%200%20512%20512'%20xml:space='preserve'%3e%3cpath%20style='fill:%23306FC5;'%20d='M512,402.281c0,16.716-13.55,30.267-30.265,30.267H30.265C13.55,432.549,0,418.997,0,402.281V109.717%20c0-16.715,13.55-30.266,30.265-30.266h451.47c16.716,0,30.265,13.551,30.265,30.266V402.281L512,402.281z'/%3e%3cpath%20style='opacity:0.15;fill:%23202121;enable-background:new%20;'%20d='M21.517,402.281V109.717%20c0-16.715,13.552-30.266,30.267-30.266h-21.52C13.55,79.451,0,93.001,0,109.717v292.565c0,16.716,13.55,30.267,30.265,30.267h21.52%20C35.07,432.549,21.517,418.997,21.517,402.281z'/%3e%3cg%3e%3cpolygon%20style='fill:%23FFFFFF;'%20points='74.59,220.748%2089.888,220.748%2082.241,201.278%20'/%3e%3cpolygon%20style='fill:%23FFFFFF;'%20points='155.946,286.107%20155.946,295.148%20181.675,295.148%20181.675,304.885%20155.946,304.885%20155.946,315.318%20184.455,315.318%20197.666,300.712%20185.151,286.107%20'/%3e%3cpolygon%20style='fill:%23FFFFFF;'%20points='356.898,201.278%20348.553,220.748%20364.548,220.748%20'/%3e%3cpolygon%20style='fill:%23FFFFFF;'%20points='230.348,320.875%20230.348,281.241%20212.268,300.712%20'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M264.42,292.368c-0.696-4.172-3.48-6.261-7.654-6.261h-14.599v12.516h15.299%20C261.637,298.624,264.42,296.539,264.42,292.368z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M313.09,297.236c1.391-0.697,2.089-2.785,2.089-4.867c0.696-2.779-0.698-4.172-2.089-4.868%20c-1.387-0.696-3.476-0.696-5.559-0.696h-13.91v11.127h13.909C309.613,297.932,311.702,297.932,313.09,297.236z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M413.217,183.198v8.344l-4.169-8.344H376.37v8.344l-4.174-8.344h-44.502%20c-7.648,0-13.909,1.392-19.469,4.173v-4.173h-31.289v0.696v3.477c-3.476-2.78-7.648-4.173-13.211-4.173h-111.95l-7.652,17.384%20l-7.647-17.384h-25.031h-10.431v8.344l-3.477-8.344h-0.696H66.942l-13.909,32.68L37.042,251.34l-0.294,0.697h0.294h35.463h0.444%20l0.252-0.697l4.174-10.428h9.039l4.172,11.125h40.326v-0.697v-7.647l3.479,8.343h20.163l3.475-8.343v7.647v0.697h15.993h79.965%20h0.696v-18.08h1.394c1.389,0,1.389,0,1.389,2.087v15.297h50.065v-4.172c4.172,2.089,10.426,4.172,18.771,4.172h20.863l4.172-11.123%20h9.732l4.172,11.123h40.328v-6.952v-3.476l6.261,10.428h1.387h0.698h30.595v-68.143h-31.291l0,0H413.217z%20M177.501,241.609h-6.955%20h-4.171v-4.169v-34.076l-0.696,1.595v-0.019l-16.176,36.669h-0.512h-3.719h-6.017l-16.687-38.245v38.245h-23.64l-4.867-10.43%20H70.417l-4.868,10.43H53.326l20.57-48.675h17.382l19.469,46.587v-46.587h4.171h14.251l0.328,0.697h0.024l8.773,19.094l6.3,14.306%20l0.223-0.721l13.906-33.375H177.5v48.674H177.501L177.501,241.609z%20M225.481,203.364h-27.119v9.039h26.423v9.734h-26.423v9.738%20h27.119v10.427h-38.939v-49.367h38.939V203.364L225.481,203.364z%20M275.076,221.294c0.018,0.016,0.041,0.027,0.063,0.042%20c0.263,0.278,0.488,0.557,0.68,0.824c1.332,1.746,2.409,4.343,2.463,8.151c0.004,0.066,0.007,0.131,0.011,0.197%20c0,0.038,0.007,0.071,0.007,0.11c0,0.022-0.002,0.039-0.002,0.06c0.016,0.383,0.026,0.774,0.026,1.197v9.735h-10.428v-5.565%20c0-2.781,0-6.954-2.089-9.735c-0.657-0.657-1.322-1.09-2.046-1.398c-1.042-0.675-3.017-0.686-6.295-0.686h-12.52v17.384h-11.818%20v-48.675h26.425c6.254,0,10.428,0,13.906,2.086c3.407,2.046,5.465,5.439,5.543,10.812c-0.161,7.4-4.911,11.46-8.326,12.829%20C270.676,218.662,272.996,219.129,275.076,221.294z%20M298.491,241.609h-11.822v-48.675h11.822V241.609z%20M434.083,241.609h-15.3%20l-22.25-36.855v30.595l-0.073-0.072v6.362h-11.747v-0.029h-11.822l-4.172-10.43H344.38l-4.172,11.123h-13.211%20c-5.559,0-12.517-1.389-16.687-5.561c-4.172-4.172-6.256-9.735-6.256-18.773c0-6.953,1.389-13.911,6.256-19.472%20c3.474-4.175,9.735-5.562,17.382-5.562h11.128v10.429h-11.128c-4.172,0-6.254,0.693-9.041,2.783%20c-2.082,2.085-3.474,6.256-3.474,11.123c0,5.564,0.696,9.04,3.474,11.821c2.091,2.089,4.87,2.785,8.346,2.785h4.867l15.991-38.243%20h6.957h10.428l19.472,46.587v-2.376v-15.705v-1.389v-27.116h17.382l20.161,34.07v-34.07h11.826v47.977h0.002L434.083,241.609%20L434.083,241.609z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M265.161,213.207c0.203-0.217,0.387-0.463,0.543-0.745c0.63-0.997,1.352-2.793,0.963-5.244%20c-0.016-0.225-0.057-0.433-0.105-0.634c-0.013-0.056-0.011-0.105-0.026-0.161l-0.007,0.001c-0.346-1.191-1.229-1.923-2.11-2.367%20c-1.394-0.693-3.48-0.693-5.565-0.693h-13.909v11.127h13.909c2.085,0,4.172,0,5.565-0.697c0.209-0.106,0.395-0.25,0.574-0.413%20l0.002,0.009C264.996,213.389,265.067,213.315,265.161,213.207z'/%3e%3cpath%20style='fill:%23FFFFFF;'%20d='M475.105,311.144c0-4.867-1.389-9.736-3.474-13.212v-31.289h-0.032v-2.089c0,0-29.145,0-33.483,0%20c-4.336,0-9.598,4.171-9.598,4.171v-4.171h-31.984c-4.87,0-11.124,1.392-13.909,4.171v-4.171h-57.016v2.089v2.081%20c-4.169-3.474-11.824-4.171-15.298-4.171h-37.549v2.089v2.081c-3.476-3.474-11.824-4.171-15.998-4.171H215.05l-9.737,10.431%20l-9.04-10.431h-2.911h-4.737h-54.93v2.089v5.493v62.651h61.19l10.054-10.057l8.715,10.057h0.698h35.258h1.598h0.696h0.692v-6.953%20v-9.039h3.479c4.863,0,11.124,0,15.991-2.089v17.382v1.394h31.291v-1.394V317.4h1.387c2.089,0,2.089,0,2.089,2.086v14.6v1.394%20h94.563c6.263,0,12.517-1.394,15.993-4.175v2.781v1.394h29.902c6.254,0,12.517-0.695,16.689-3.478%20c6.402-3.841,10.437-10.64,11.037-18.749c0.028-0.24,0.063-0.48,0.085-0.721l-0.041-0.039%20C475.087,312.043,475.105,311.598,475.105,311.144z%20M256.076,306.973h-13.91v2.081v4.174v4.173v7.649h-22.855l-13.302-15.299%20l-0.046,0.051l-0.65-0.748l-15.297,15.996h-44.501v-48.673h45.197l12.348,13.525l2.596,2.832l0.352-0.365l14.604-15.991h36.852%20c7.152,0,15.161,1.765,18.196,9.042c0.365,1.441,0.577,3.043,0.577,4.863C276.237,304.189,266.502,306.973,256.076,306.973z%20M325.609,306.276c1.389,2.081,2.085,4.867,2.085,9.041v9.732h-11.819v-6.256c0-2.786,0-7.65-2.089-9.739%20c-1.387-2.081-4.172-2.081-8.341-2.081H292.93v18.077h-11.82v-49.369h26.421c5.559,0,10.426,0,13.909,2.084%20c3.474,2.088,6.254,5.565,6.254,11.128c0,7.647-4.865,11.819-8.343,13.212C322.829,303.49,324.914,304.885,325.609,306.276z%20M373.589,286.107h-27.122v9.04h26.424v9.737h-26.424v9.736h27.122v10.429H334.65V275.68h38.939V286.107z%20M402.791,325.05h-22.252%20v-10.429h22.252c2.082,0,3.476,0,4.87-1.392c0.696-0.697,1.387-2.085,1.387-3.477c0-1.394-0.691-2.778-1.387-3.475%20c-0.698-0.695-2.091-1.391-4.176-1.391c-11.126-0.696-24.337,0-24.337-15.296c0-6.954,4.172-14.604,16.689-14.604h22.945v11.819%20h-21.554c-2.085,0-3.478,0-4.87,0.696c-1.387,0.697-1.387,2.089-1.387,3.478c0,2.087,1.387,2.783,2.778,3.473%20c1.394,0.697,2.783,0.697,4.172,0.697h6.259c6.259,0,10.43,1.391,13.211,4.173c2.087,2.087,3.478,5.564,3.478,10.43%20C420.869,320.179,414.611,325.05,402.791,325.05z%20M462.59,320.179c-2.778,2.785-7.648,4.871-14.604,4.871H425.74v-10.429h22.245%20c2.087,0,3.481,0,4.87-1.392c0.693-0.697,1.391-2.085,1.391-3.477c0-1.394-0.698-2.778-1.391-3.475%20c-0.696-0.695-2.085-1.391-4.172-1.391c-11.122-0.696-24.337,0-24.337-15.295c0-6.609,3.781-12.579,13.106-14.352%20c1.115-0.154,2.293-0.253,3.583-0.253h22.948v11.819h-15.3h-5.561h-0.696c-2.087,0-3.476,0-4.865,0.696%20c-0.7,0.697-1.396,2.089-1.396,3.478c0,2.087,0.696,2.783,2.785,3.473c1.389,0.697,2.78,0.697,4.172,0.697h0.691h5.565%20c3.039,0,5.337,0.375,7.44,1.114c1.926,0.697,8.302,3.549,9.728,10.994c0.124,0.78,0.215,1.594,0.215,2.495%20C466.761,313.925,465.37,317.401,462.59,320.179z'/%3e%3c/g%3e%3c/svg%3e"},{type:"discover",imgSrc:"data:image/svg+xml,%3c?xml%20version='1.0'%20encoding='iso-8859-1'?%3e%3c!--%20Uploaded%20to:%20SVG%20Repo,%20www.svgrepo.com,%20Generator:%20SVG%20Repo%20Mixer%20Tools%20--%3e%3csvg%20height='30px'%20width='30px'%20version='1.1'%20id='Capa_1'%20xmlns='http://www.w3.org/2000/svg'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20viewBox='0%200%20512%20512'%20xml:space='preserve'%3e%3cpath%20style='fill:%2334495E;'%20d='M512,402.282c0,16.716-13.55,30.267-30.265,30.267H30.265C13.55,432.549,0,418.996,0,402.282V109.717%20c0-16.716,13.55-30.266,30.265-30.266h451.469c16.716,0,30.265,13.551,30.265,30.266L512,402.282L512,402.282z'/%3e%3cpath%20style='opacity:0.15;fill:%23202121;enable-background:new%20;'%20d='M21.517,402.282V109.717%20c0-16.716,13.552-30.266,30.267-30.266h-21.52C13.55,79.451,0,93.003,0,109.717v292.565c0,16.716,13.55,30.267,30.265,30.267h21.52%20C35.07,432.549,21.517,418.996,21.517,402.282z'/%3e%3cpath%20style='fill:%23F26E21;'%20d='M309.389,255.801c0.041-9.636-3.572-19.286-10.843-26.558c-7.287-7.287-16.961-10.897-26.617-10.839%20c-0.046,0-0.091-0.003-0.139-0.003c-20.968,0-37.6,16.628-37.6,37.602c0,20.767,16.837,37.599,37.6,37.599%20c20.974,0,37.604-16.631,37.604-37.599C309.394,255.934,309.389,255.869,309.389,255.801z'/%3e%3cg%3e%3cpath%20style='fill:%23E7E8E3;'%20d='M227.198,271.909c-5.62,5.626-10.807,7.824-16.394,7.943c-13.611-0.122-23.618-10.202-23.618-24.573%20c0-7.234,2.739-13.163,7.078-18.228l0,0c4.069-3.863,9.311-6.359,15.339-6.359c6.507,0,11.571,2.169,17.352,7.954v-16.631%20c-5.78-2.891-10.846-4.338-17.352-4.338c-9.192,0.657-17.859,4.371-24.507,10.203l0,0c-1.916,1.724-3.752,3.627-5.309,5.805%20c-4.856,6.294-7.791,14.001-7.791,22.32c0,20.967,16.637,36.875,37.606,36.875c0.102,0,0.203-0.009,0.302-0.01%20c0.141,0.002,0.28,0.01,0.42,0.01c5.784,0,10.85-1.443,17.357-4.336L227.198,271.909c-0.244,0.244,0.242,0.471,0,0.702V271.909z'/%3e%3cpolygon%20style='fill:%23E7E8E3;'%20points='356.863,228.033%20356.863,228.033%20340.487,268.295%20321.685,220.566%20306.502,220.566%20336.148,293.601%20344.102,293.601%20375.196,220.566%20360.013,220.566%20'/%3e%3cpolygon%20style='fill:%23E7E8E3;'%20points='380.983,252.384%20380.983,291.435%20420.033,291.435%20420.753,291.435%20420.753,279.861%20408.461,279.861%20395.445,279.861%20395.445,266.848%20395.445,260.342%20420.033,260.342%20420.033,248.045%20395.445,248.045%20395.445,232.861%20420.753,232.861%20420.753,220.566%20380.983,220.566%20'/%3e%3cpath%20style='fill:%23E7E8E3;'%20d='M54.135,220.566H33.884v70.869h20.25c10.845,0,18.798-2.895,25.306-7.957%20c7.953-6.508,13.017-16.629,13.017-27.474C92.458,235.028,77.27,220.566,54.135,220.566z%20M70.765,274.08%20c-4.339,3.614-10.124,5.781-18.802,5.781h-4.339V232.86h3.615c8.678,0,14.463,1.446,18.803,5.783%20c5.061,4.336,7.955,10.848,7.955,17.358C78.72,262.509,75.828,269.737,70.765,274.08z'/%3e%3crect%20x='98.97'%20y='220.56'%20style='fill:%23E7E8E3;'%20width='13.739'%20height='70.867'/%3e%3cpath%20style='fill:%23E7E8E3;'%20d='M147.415,248.045c-8.676-2.892-10.848-5.063-10.848-8.677c0-4.339,4.339-7.954,10.124-7.954%20c4.339,0,7.954,1.447,11.57,5.786l7.233-9.4c-5.787-5.064-13.015-7.953-20.97-7.953c-12.296,0-22.42,8.678-22.42,20.244%20c0,10.126,4.343,14.464,17.357,19.526c5.785,2.166,7.955,2.892,9.404,4.338c2.887,1.444,4.336,4.339,4.336,7.228%20c0,5.786-4.336,10.126-10.848,10.126c-6.514,0-12.294-3.615-15.187-9.401l-8.678,8.678c6.511,9.4,14.465,13.738,24.589,13.738%20c14.461,0,24.58-9.4,24.58-23.141C167.659,258.893,163.324,253.831,147.415,248.045z'/%3e%3cpath%20style='fill:%23E7E8E3;'%20d='M459.804,261.783c10.843-2.166,16.63-9.4,16.63-20.244c0-13.014-9.402-20.973-25.308-20.973h-20.972%20v70.869h13.739V263.23h2.172l19.519,28.205h16.634L459.804,261.783z%20M448.23,253.105h-4.336v-21.691h4.336%20c8.678,0,13.742,3.614,13.742,10.85C461.972,249.492,456.909,253.105,448.23,253.105z'/%3e%3c/g%3e%3c/svg%3e"}];class Ce extends h{cardType;constructor(e){super("div",[]),this.cardType=e.cardType;const t=document.createElement("label");t.setAttribute("for","cardNumber"),t.textContent=e.label,t.style.color=e.styles.color,t.style.fontSize=`${e.styles.fontSize}px`,t.style.display="block",t.style.marginBottom="6px",this.getElement().appendChild(t);const a=document.createElement("div");a.className=e.isLoading?"loading":"",a.style.borderRadius=`${e.styles.borderRadius}px ${e.styles.borderRadius}px 0px 0px`;const i=document.createElement("div");i.id="card-element",i.className=`card-element ${e.isFocused?"card-element-focus":""}`,i.style.zIndex=e.isFocused?"2":"0";const r=document.createElement("div");if(r.className="cards-position",e.cardType==="unknown")L.forEach(n=>{r.appendChild(this.createCardIcon(n))});else{const n=L.find(s=>s.type===e.cardType);n&&r.appendChild(this.createCardIcon(n))}i.appendChild(r),a.appendChild(i),this.getElement().appendChild(a)}createCardIcon(e){const t=document.createElement("div");t.className="card-icon";const a=document.createElement("img");return a.src=e.imgSrc,t.appendChild(a),t}setFocused(e){const t=this.getElement().querySelector("#card-element");return t&&(e?(t.classList.add("card-element-focus"),t.style.zIndex="2"):(t.classList.remove("card-element-focus"),t.style.zIndex="0")),this}setLoading(e){const t=this.getElement().querySelector("div");return t&&(e?t.classList.add("loading"):t.classList.remove("loading")),this}updateCardType(e){if(e===void 0&&this.cardType&&this.cardType!=="unknown")return this;const t=e===void 0?"unknown":e;if(this.cardType===t)return this;this.cardType=t;const a=this.getElement().querySelector(".cards-position");if(a)if(a.innerHTML="",this.cardType==="unknown")L.forEach(i=>{a.appendChild(this.createCardIcon(i))});else{const i=L.find(r=>r.type===this.cardType);i?a.appendChild(this.createCardIcon(i)):L.forEach(r=>{a.appendChild(this.createCardIcon(r))})}return this}}class Se extends h{cardNumber;cardExpiry;cardCvv;validationMessages=new Map;constructor(e){super("div",[]);const{checkoutProfile:t,isLoading:a,isFocused:i,isCvvFocused:r,isCcValid:n,isCvvValid:s,cardType:l,cardExpiry:c,cardExpiryError:d,cardExpiryTouched:p,onChange:E,onBlur:v,translationFunc:m,cardExpiryAutocomplete:y="cc-exp"}=e,g=document.createElement("div");g.className="card-grid",this.cardNumber=new Ce({styles:{color:t.styles.textColor,fontSize:t.styles.fontSize,borderRadius:t.styles.borderRadius},label:m("cardInformation"),isLoading:a,isFocused:i,cardType:l}),g.appendChild(this.cardNumber.getElement());const f=document.createElement("div");f.className="card-details",this.cardExpiry=new $({name:"cardExpiry",placeholder:m("cardExpiry"),error:!!(d&&p),errorMsg:d,value:c,autocomplete:y,onChange:b=>{this.trimCardExpiry(),E(b)},styles:{color:t.styles.textColor,borderRadius:`0px 0px 0px ${t.styles.borderRadius}px`,fontSize:t.styles.fontSize,fontFamily:t.styles.fontFamily}}),this.cardExpiry.addEventListener("blur",v),this.cardExpiry.addEventListener("keydown",b=>{const z=b;!["Backspace","Delete","ArrowLeft","ArrowRight","Tab"].includes(z.key)&&!/^\d$/.test(z.key)&&z.preventDefault()});const C=this.cardExpiry.getElement();C.style.height="100%";const x=document.createElement("div");if(x.className="input-wrapper",this.cardCvv=new xe({styles:{borderRadius:typeof t.styles.borderRadius=="number"?t.styles.borderRadius:0},isLoading:a,isFocused:r}),x.appendChild(this.cardCvv.getElement()),f.appendChild(this.cardExpiry.getElement()),f.appendChild(x),g.appendChild(f),this.getElement().appendChild(g),i&&!n){const b=new F({text:m("validation.cardNumberInvalid")});this.validationMessages.set("cardNumber",b),this.appendChild(b)}if(r&&!s){const b=new F({text:m("validation.cardSecurityFormat")});this.validationMessages.set("cardCvv",b),this.appendChild(b)}}updateCardType(e){return this.cardNumber.updateCardType(e),this}updateCardExpiry(e,t,a){return this.cardExpiry.setValue(e),t&&a?this.cardExpiry.setError(!0,t):this.cardExpiry.setError(!1),this}getCardExpiryValue(){return this.cardExpiry.getValue()}trimCardExpiry(){const e=this.getCardExpiryValue().trim();return this.cardExpiry.setValue(e),this}updateCardNumberValidation(e,t,a){if(this.cardNumber.setFocused(e),e&&!t){if(!this.validationMessages.has("cardNumber")){const i=new F({text:a("validation.cardNumberInvalid")});this.validationMessages.set("cardNumber",i),this.appendChild(i)}}else{const i=this.validationMessages.get("cardNumber");i&&(i.getElement().remove(),this.validationMessages.delete("cardNumber"))}return this}updateCardCvvValidation(e,t,a){if(this.cardCvv.setFocused(e),e&&!t){if(!this.validationMessages.has("cardCvv")){const i=new F({text:a("validation.cardSecurityFormat")});this.validationMessages.set("cardCvv",i),this.appendChild(i)}}else{const i=this.validationMessages.get("cardCvv");i&&(i.getElement().remove(),this.validationMessages.delete("cardCvv"))}return this}setLoading(e){return this.cardNumber.setLoading(e),this.cardCvv.setLoading(e),this}}class we{input;constructor(e){const{value:t,onChange:a,onBlur:i,error:r,errorMsg:n,checkoutProfile:s,translationFunc:l,autocomplete:c="email"}=e;this.input=new $({name:"email",label:l("email"),error:r,errorMsg:n,styles:{color:s.styles.textColor,borderRadius:`${s.styles.borderRadius}px`,fontSize:s.styles.fontSize,fontFamily:s.styles.fontFamily},placeholder:l("email"),type:"email",value:t,autocomplete:c,onChange:d=>{this.trim(),a(d)}}),this.input.addEventListener("blur",i)}getValue(){return this.input.getValue()}setValue(e){return this.input.setValue(e),this}trim(){const e=this.getValue().trim();return this.setValue(e),this}setError(e,t){return this.input.setError(e,t),this}getElement(){return this.input.getElement()}appendTo(e){return this.input.appendTo(e),this}}const Fe="data:image/svg+xml,%3csvg%20xmlns='http://www.w3.org/2000/svg'%20width='101px'%20height='32'%20viewBox='0%200%20101%2032'%20preserveAspectRatio='xMinYMin%20meet'%3e%3cpath%20fill='%23003087'%20d='M%2012.237%202.8%20L%204.437%202.8%20C%203.937%202.8%203.437%203.2%203.337%203.7%20L%200.237%2023.7%20C%200.137%2024.1%200.437%2024.4%200.837%2024.4%20L%204.537%2024.4%20C%205.037%2024.4%205.537%2024%205.637%2023.5%20L%206.437%2018.1%20C%206.537%2017.6%206.937%2017.2%207.537%2017.2%20L%2010.037%2017.2%20C%2015.137%2017.2%2018.137%2014.7%2018.937%209.8%20C%2019.237%207.7%2018.937%206%2017.937%204.8%20C%2016.837%203.5%2014.837%202.8%2012.237%202.8%20Z%20M%2013.137%2010.1%20C%2012.737%2012.9%2010.537%2012.9%208.537%2012.9%20L%207.337%2012.9%20L%208.137%207.7%20C%208.137%207.4%208.437%207.2%208.737%207.2%20L%209.237%207.2%20C%2010.637%207.2%2011.937%207.2%2012.637%208%20C%2013.137%208.4%2013.337%209.1%2013.137%2010.1%20Z'/%3e%3cpath%20fill='%23003087'%20d='M%2035.437%2010%20L%2031.737%2010%20C%2031.437%2010%2031.137%2010.2%2031.137%2010.5%20L%2030.937%2011.5%20L%2030.637%2011.1%20C%2029.837%209.9%2028.037%209.5%2026.237%209.5%20C%2022.137%209.5%2018.637%2012.6%2017.937%2017%20C%2017.537%2019.2%2018.037%2021.3%2019.337%2022.7%20C%2020.437%2024%2022.137%2024.6%2024.037%2024.6%20C%2027.337%2024.6%2029.237%2022.5%2029.237%2022.5%20L%2029.037%2023.5%20C%2028.937%2023.9%2029.237%2024.3%2029.637%2024.3%20L%2033.037%2024.3%20C%2033.537%2024.3%2034.037%2023.9%2034.137%2023.4%20L%2036.137%2010.6%20C%2036.237%2010.4%2035.837%2010%2035.437%2010%20Z%20M%2030.337%2017.2%20C%2029.937%2019.3%2028.337%2020.8%2026.137%2020.8%20C%2025.037%2020.8%2024.237%2020.5%2023.637%2019.8%20C%2023.037%2019.1%2022.837%2018.2%2023.037%2017.2%20C%2023.337%2015.1%2025.137%2013.6%2027.237%2013.6%20C%2028.337%2013.6%2029.137%2014%2029.737%2014.6%20C%2030.237%2015.3%2030.437%2016.2%2030.337%2017.2%20Z'/%3e%3cpath%20fill='%23003087'%20d='M%2055.337%2010%20L%2051.637%2010%20C%2051.237%2010%2050.937%2010.2%2050.737%2010.5%20L%2045.537%2018.1%20L%2043.337%2010.8%20C%2043.237%2010.3%2042.737%2010%2042.337%2010%20L%2038.637%2010%20C%2038.237%2010%2037.837%2010.4%2038.037%2010.9%20L%2042.137%2023%20L%2038.237%2028.4%20C%2037.937%2028.8%2038.237%2029.4%2038.737%2029.4%20L%2042.437%2029.4%20C%2042.837%2029.4%2043.137%2029.2%2043.337%2028.9%20L%2055.837%2010.9%20C%2056.137%2010.6%2055.837%2010%2055.337%2010%20Z'/%3e%3cpath%20fill='%23009cde'%20d='M%2067.737%202.8%20L%2059.937%202.8%20C%2059.437%202.8%2058.937%203.2%2058.837%203.7%20L%2055.737%2023.6%20C%2055.637%2024%2055.937%2024.3%2056.337%2024.3%20L%2060.337%2024.3%20C%2060.737%2024.3%2061.037%2024%2061.037%2023.7%20L%2061.937%2018%20C%2062.037%2017.5%2062.437%2017.1%2063.037%2017.1%20L%2065.537%2017.1%20C%2070.637%2017.1%2073.637%2014.6%2074.437%209.7%20C%2074.737%207.6%2074.437%205.9%2073.437%204.7%20C%2072.237%203.5%2070.337%202.8%2067.737%202.8%20Z%20M%2068.637%2010.1%20C%2068.237%2012.9%2066.037%2012.9%2064.037%2012.9%20L%2062.837%2012.9%20L%2063.637%207.7%20C%2063.637%207.4%2063.937%207.2%2064.237%207.2%20L%2064.737%207.2%20C%2066.137%207.2%2067.437%207.2%2068.137%208%20C%2068.637%208.4%2068.737%209.1%2068.637%2010.1%20Z'/%3e%3cpath%20fill='%23009cde'%20d='M%2090.937%2010%20L%2087.237%2010%20C%2086.937%2010%2086.637%2010.2%2086.637%2010.5%20L%2086.437%2011.5%20L%2086.137%2011.1%20C%2085.337%209.9%2083.537%209.5%2081.737%209.5%20C%2077.637%209.5%2074.137%2012.6%2073.437%2017%20C%2073.037%2019.2%2073.537%2021.3%2074.837%2022.7%20C%2075.937%2024%2077.637%2024.6%2079.537%2024.6%20C%2082.837%2024.6%2084.737%2022.5%2084.737%2022.5%20L%2084.537%2023.5%20C%2084.437%2023.9%2084.737%2024.3%2085.137%2024.3%20L%2088.537%2024.3%20C%2089.037%2024.3%2089.537%2023.9%2089.637%2023.4%20L%2091.637%2010.6%20C%2091.637%2010.4%2091.337%2010%2090.937%2010%20Z%20M%2085.737%2017.2%20C%2085.337%2019.3%2083.737%2020.8%2081.537%2020.8%20C%2080.437%2020.8%2079.637%2020.5%2079.037%2019.8%20C%2078.437%2019.1%2078.237%2018.2%2078.437%2017.2%20C%2078.737%2015.1%2080.537%2013.6%2082.637%2013.6%20C%2083.737%2013.6%2084.537%2014%2085.137%2014.6%20C%2085.737%2015.3%2085.937%2016.2%2085.737%2017.2%20Z'/%3e%3cpath%20fill='%23009cde'%20d='M%2095.337%203.3%20L%2092.137%2023.6%20C%2092.037%2024%2092.337%2024.3%2092.737%2024.3%20L%2095.937%2024.3%20C%2096.437%2024.3%2096.937%2023.9%2097.037%2023.4%20L%20100.237%203.5%20C%20100.337%203.1%20100.037%202.8%2099.637%202.8%20L%2096.037%202.8%20C%2095.637%202.8%2095.437%203%2095.337%203.3%20Z'/%3e%3c/svg%3e";class Le extends h{formData;onSubmit;isSubmitting=!1;constructor(e){super("div",["paypal"]);const{formData:t,onSubmit:a}=e;this.formData=t,this.onSubmit=a,this.getElement().style.cursor=a?"pointer":"default",this.getElement().style.opacity="1";const i=document.createElement("div");i.className="paypal-icon-container";const r=document.createElement("img");r.src=Fe,r.style.width="69px",r.style.height="22px",r.style.maxWidth="100%",r.style.display="block",r.style.height="auto",i.appendChild(r),this.getElement().appendChild(i),a&&this.getElement().addEventListener("click",()=>this.handleSubmit())}async handleSubmit(){if(!(!this.onSubmit||this.isSubmitting)){this.isSubmitting=!0,this.getElement().style.opacity="0.7";try{await this.onSubmit({formData:this.formData})}catch(e){console.error("Error during PayPal submission:",e)}finally{this.isSubmitting=!1,this.getElement().style.opacity="1"}}}updateFormData(e){return this.formData=e,this}setSubmitting(e){return this.isSubmitting=e,this.getElement().style.opacity=e?"0.7":"1",this}}class ke extends h{paymentMethods;constructor(e){const{checkoutProfile:t,formData:a,onPaypalSubmit:i}=e;if(!t?.additionalPaymentMethods){super("div",["payment-methods"]),this.paymentMethods=new Map,this.getElement().style.display="none";return}const r=Object.entries(t.additionalPaymentMethods).filter(([,n])=>n.enabled).sort((n,s)=>n[1].order-s[1].order);if(r.length===0){super("div",["payment-methods"]),this.paymentMethods=new Map,this.getElement().style.display="none";return}super("div",["payment-methods"]),this.paymentMethods=new Map;for(const[n]of r)switch(n){case"paypal":{if(i){const s=new Le({checkoutProfile:t,formData:a,onSubmit:i});this.paymentMethods.set("paypal",s),s.appendTo(this.getElement())}break}}}updateFormData(e){const t=this.paymentMethods.get("paypal");return t&&t.updateFormData(e),this}hasVisiblePaymentMethods(){return this.paymentMethods.size>0&&this.getElement().style.display!=="none"}}const Me=17;class Ie extends h{styles;isHovered=!1;constructor(e){super("button",["button"],{type:"submit",disabled:e.disabled?"true":"false"}),this.styles=e.styles,this.setText(e.text),e.disabled?this.addClass("disabled"):this.addClass("valid"),this.applyStyles(),this.addEventListener("mouseenter",()=>this.handleMouseEnter()),this.addEventListener("mouseleave",()=>this.handleMouseLeave())}applyStyles(){const e=this.getElement();e.style.backgroundColor=this.isHovered?`color-mix(in srgb, ${this.styles.backgroundColor} 80%, transparent)`:this.styles.backgroundColor,e.disabled?e.style.color="#cccccc":e.style.color=this.styles.color,e.style.borderRadius=this.styles.borderRadius===Me?"100vmax":`${this.styles.borderRadius}px`,e.style.fontSize=`${this.styles.fontSize}px`,e.style.fontFamily=`${this.styles.fontFamily}, sans-serif`}handleMouseEnter(){this.isHovered=!0,this.applyStyles()}handleMouseLeave(){this.isHovered=!1,this.applyStyles()}setDisabled(e){return this.getElement().disabled=e,e?(this.addClass("disabled"),this.removeClass("valid")):(this.removeClass("disabled"),this.addClass("valid")),this.applyStyles(),this}}class Te{button;constructor(e){const{disabled:t,checkoutProfile:a,translationFunc:i}=e;this.button=new Ie({text:i(`buttonTexts.${a?.layout.actionButton.translationKey}`),styles:{backgroundColor:a.styles.buttonColor,color:a.styles.buttonTextColor,fontFamily:a.styles.fontFamily,borderRadius:a.styles.borderRadius,fontSize:a.styles.buttonFontSize},disabled:t})}getElement(){return this.button.getElement()}setDisabled(e){return this.button.setDisabled(e),this}addEventListener(e,t,a){return this.button.addEventListener(e,t,a),this}appendTo(e){return this.button.appendTo(e),this}}const $e="https://test-htp.tokenex.com/Iframe/Iframe-v3.min.js",ze="https://htp.tokenex.com/iframe/iframe-v3.min.js";class Ne extends h{options;isSubmitting=!1;scriptCleanup;fontCleanup;emailField;cardSection;cardholderSection;submitButton;paymentMethods;spinner;alert;formManager=re();checkoutProfile;translation=T();iframeHook;constructor(e){super("form",["form-container"]),this.options=e,this.checkoutProfile=X({apiKey:e.apiKey,profileId:e.profileId,environment:e.environment}),e.locale&&this.translation.setLocale(e.locale),this.getElement().addEventListener("submit",this.handleSubmit),this.getElement().addEventListener("keydown",this.handleKeyDown),this.formManager.subscribe(this.handleFormStateChange),this.checkoutProfile.subscribe(this.handleProfileStateChange),this.initializeForm(),this.appendTo(e.container)}_getFormStateData(){const e=this.formManager.getFormState();return{formData:e.formData||{email:"",name:"",cardExpiry:""},errors:e.errors||{},touched:e.touched||{}}}handleFormStateChange=()=>{this.updateFormUI()};handleProfileStateChange=e=>{if(!e.isLoading)if(this.setLoadingState(!1),e.checkoutProfile)try{if(e.checkoutProfile.styles?.fontFamily){const{cleanup:t}=fe({fontFamily:e.checkoutProfile.styles.fontFamily});this.fontCleanup=t}this.renderFormComponents(),this.initializeTokenExIframe().catch(t=>{console.error("Error initializing TokenEx iframe:",t),this.setErrorMessage("Failed to initialize payment form")})}catch{const t=e.error||"Failed to load checkout profile data";this.setErrorMessage(t)}else e.error&&this.setErrorMessage(e.error)};applyFormContainerStyles(e){e.fontFamily&&(this.getElement().style.fontFamily=e.fontFamily)}initializeTokenExIframe=async()=>{const e=this.checkoutProfile.getState();if(e.checkoutProfile&&!this.iframeHook)try{if(!("TokenEx"in globalThis)){setTimeout(()=>this.initializeTokenExIframe(),500);return}const{inputStyles:t,formContainerStyle:a}=ye(e.checkoutProfile);this.applyFormContainerStyles(a),this.iframeHook=de({apiKey:this.options.apiKey,checkoutProfile:e.checkoutProfile,inputStyles:t,setFormData:i=>{this.formManager.setFormData(i)},environment:this.options.environment}),this.iframeHook?.subscribe(this.handleIframeStateChange),await this.iframeHook?.initialize()}catch{this.setErrorMessage("Failed to initialize payment form")}else e.checkoutProfile||this.setErrorMessage("Cannot initialize iframe: No checkout profile available")};handleIframeStateChange=e=>{this.cardSection&&(this.cardSection.updateCardNumberValidation(e.isFocused,e.isCcValid,this.translation.t),this.cardSection.updateCardCvvValidation(e.isCvvFocused,e.isCvvValid,this.translation.t),this.cardSection.updateCardType(e.possibleCardType),this.cardSection.setLoading(e.loadingIframe)),this.submitButton&&this.submitButton.setDisabled(this.isFormDisabled())};createCardSection=e=>{if(!this.cardSection)try{const{formData:t,errors:a,touched:i}=this._getFormStateData();let r={loadingIframe:!0,isFocused:!1,isCvvFocused:!1,isCcValid:!1,isCvvValid:!1,possibleCardType:"unknown"};this.iframeHook&&(r=this.iframeHook.getState()),this.cardSection=new Se({checkoutProfile:e,isLoading:r.loadingIframe,isFocused:r.isFocused,isCvvFocused:r.isCvvFocused,isCcValid:r.isCcValid,isCvvValid:r.isCvvValid,cardType:r.possibleCardType,cardExpiry:t.cardExpiry,cardExpiryError:a.cardExpiry,cardExpiryTouched:!!i.cardExpiry,onChange:this.handleChange,onBlur:this.handleBlur,translationFunc:this.translation.t}),this.element.appendChild(this.cardSection.getElement()),this.updateFormUI(),this.cardSection&&this.emailField&&this.cardholderSection&&this.submitButton}catch{this.setErrorMessage("Card section temporarily unavailabl")}};initializeForm(){this.setLoadingState(!0),this.options.errorMsg&&this.setErrorMessage(this.options.errorMsg);const e=this.options.environment==="test"?$e:ze,{cleanup:t,isLoaded:a}=ge({scriptSrc:e});this.scriptCleanup=t,a.then(()=>{}).catch(()=>{this.setLoadingState(!1),this.setErrorMessage("Failed to load payment system. Please try again later.")})}renderFormComponents(){if(!this.emailField){console.log("🏗️ Starting form components rendering:",{timestamp:new Date().toISOString()});try{const e=this.checkoutProfile.getState();if(!e.checkoutProfile){this.setErrorMessage("Failed to load checkout configuration");return}this.createPaymentMethods(e.checkoutProfile),this.createEmailField(e.checkoutProfile),this.createCardSection(e.checkoutProfile),this.createCardholderSection(e.checkoutProfile),this.createSubmitButton(e.checkoutProfile),console.log("✅ Form components rendered successfully:",{cardElementExists:!!document.getElementById("card-element"),cvvElementExists:!!document.getElementById("card-cvv-element"),timestamp:new Date().toISOString()})}catch{this.setErrorMessage("Failed to render checkout form components")}}}createPaymentMethods(e){if(!e?.additionalPaymentMethods||Object.entries(e.additionalPaymentMethods).filter(([,i])=>i.enabled).length===0)return;const{formData:a}=this._getFormStateData();this.paymentMethods=new ke({checkoutProfile:e,formData:a,onPaypalSubmit:async()=>{await this.handlePaypalSubmit()}}),this.appendChild(this.paymentMethods)}createEmailField(e){const{formData:t,errors:a,touched:i}=this._getFormStateData();this.emailField=new we({value:t.email,onChange:this.handleChange,onBlur:this.handleBlur,error:!!(a.email&&i.email),errorMsg:a.email,checkoutProfile:e,translationFunc:this.translation.t}),this.element.appendChild(this.emailField.getElement())}createCardholderSection(e){const{formData:t,errors:a,touched:i}=this._getFormStateData();this.cardholderSection=new Ee({value:t.name,onChange:this.handleChange,onBlur:this.handleBlur,error:!!(a.name&&i.name),errorMsg:a.name,checkoutProfile:e,translationFunc:this.translation.t}),this.element.appendChild(this.cardholderSection.getElement())}createSubmitButton(e){this.submitButton=new Te({disabled:this.isFormDisabled(),checkoutProfile:e,translationFunc:this.translation.t}),this.element.appendChild(this.submitButton.getElement())}handleChange=e=>{const t=e.target,{name:a,value:i}=t;this.formManager.handleChange(a,i)};handleBlur=e=>{const t=e.target,{name:a,value:i}=t;this.formManager.handleBlur(a,i)};updateFormUI(){const e=this.formManager.getFormState();this.checkoutProfile.getState().checkoutProfile&&(this.paymentMethods&&this.paymentMethods.updateFormData(e.formData),this.emailField&&(this.emailField.setValue(e.formData.email),this.emailField.setError(!!(e.errors.email&&e.touched.email),e.errors.email)),this.cardSection&&this.cardSection.updateCardExpiry(e.formData.cardExpiry,e.errors.cardExpiry,!!e.touched.cardExpiry),this.cardholderSection&&(this.cardholderSection.setValue(e.formData.name),this.cardholderSection.setError(!!(e.errors.name&&e.touched.name),e.errors.name)),this.submitButton&&this.submitButton.setDisabled(this.isFormDisabled()))}isFormDisabled(){const e=this.formManager.getFormState();let t={isCcValid:!1,isCvvValid:!1};this.iframeHook&&(t=this.iframeHook.getState());const a=Object.keys(e.errors).length>0,i=(!this.cardSection||t.isCcValid&&t.isCvvValid)&&!!e.formData.email&&!!e.formData.name&&(!this.cardSection||!!e.formData.cardExpiry);return a||!i||this.isSubmitting}setLoadingState(e){if(this.options.onLoadingStateChange){this.options.onLoadingStateChange(e);return}e?(this.hideSpinner(),this.spinner=new U,this.appendChild(this.spinner)):this.hideSpinner()}showSpinner(e){this.hideSpinner(),this.spinner=new U({text:e}),this.appendChild(this.spinner)}hideSpinner(){this.spinner&&(this.spinner.getElement().remove(),this.spinner=void 0)}handleSubmit=async e=>{if(e.preventDefault(),!this.isFormDisabled())try{if(!this.iframeHook)throw new Error("TokenEx iframe not initialized");this.isSubmitting=!0,this.updateFormUI(),this.showSpinner(this.translation.t("loading")),await this.iframeHook.tokenize(async t=>{try{await this.options.onSubmit({formData:this.formManager.getFormState().formData,tokenexData:t}),this.hideSpinner(),this.isSubmitting=!1,this.updateFormUI()}catch{this.handleSubmitError("Payment processing failed. Please try again.")}})}catch{this.handleSubmitError("Payment processing failed. Please try again.")}};handleSubmitError(e){this.hideSpinner(),this.isSubmitting=!1,this.setErrorMessage(e),this.updateFormUI()}handlePaypalSubmit=async()=>{this.isSubmitting=!0,this.updateFormUI(),this.showSpinner(this.translation.t("loading"));try{await this.options.onSubmit({formData:null,tokenexData:null}),this.hideSpinner(),this.isSubmitting=!1,this.updateFormUI()}catch{this.setErrorMessage("PayPal processing failed. Please try again.")}finally{this.hideSpinner(),this.isSubmitting=!1,this.updateFormUI()}};setErrorMessage(e){return this.alert&&(this.alert.getElement().remove(),this.alert=void 0),this.alert=new ve({message:e}),this.element.insertBefore(this.alert.getElement(),this.element.firstChild),this}destroy(){this.scriptCleanup&&(this.scriptCleanup(),this.scriptCleanup=void 0),this.fontCleanup&&(this.fontCleanup(),this.fontCleanup=void 0),this.iframeHook&&this.iframeHook.cleanup(),this.getElement().removeEventListener("submit",this.handleSubmit),this.getElement().removeEventListener("keydown",this.handleKeyDown),this.getElement().removeEventListener("keydown",this.handleKeyDown),this.emailField&&(this.emailField.getElement().remove(),this.emailField=void 0),this.cardSection&&(this.cardSection.getElement().remove(),this.cardSection=void 0),this.cardholderSection&&(this.cardholderSection.getElement().remove(),this.cardholderSection=void 0),this.submitButton&&(this.submitButton.getElement().remove(),this.submitButton=void 0),this.paymentMethods&&(this.paymentMethods.getElement().remove(),this.paymentMethods=void 0),this.spinner&&(this.spinner.getElement().remove(),this.spinner=void 0),this.alert&&(this.alert.getElement().remove(),this.alert=void 0),this.getElement().remove()}handleKeyDown=e=>{e.key==="Enter"&&!this.isFormDisabled()&&(e.target instanceof HTMLTextAreaElement||(e.preventDefault(),this.handleSubmit(e)))}}class Pe{container=null;options;onSubmit;form=null;constructor(e,t){this.options=e,this.onSubmit=t}mount(e){this.unmount(),this.container=e,this.renderForm()}update(e){this.container&&this.form&&(this.form&&e.errorMsg&&!this.options.disableErrorMessages?this.form.setErrorMessage(e.errorMsg):this.renderForm(e.errorMsg))}renderForm(e){this.container&&(this.form&&(this.form.destroy(),this.form=null),this.form=new Ne({apiKey:this.options.apiKey,onSubmit:this.onSubmit,locale:this.options.locale,errorMsg:this.options.disableErrorMessages?void 0:e,profileId:this.options.profileId,container:this.container,environment:this.options.environment,onLoadingStateChange:this.options.onLoadingStateChange}))}unmount(){this.form&&(this.form.destroy(),this.form=null)}}class Ae{state;listeners=new Set;constructor(e){this.state=e}getState(){return{...this.state}}updateState(e){this.state={...this.state,...e},this.notifyListeners()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}notifyListeners(){const e=this.getState();this.listeners.forEach(t=>t(e))}}class Y{config;apiService;formManager;stateManager;constructor(e){this.config=this.validateConfig(e),this.apiService=new q(this.config.apiKey,this.config.environment),this.stateManager=new Ae({mounted:!1,form:null}),this.formManager=new Pe({locale:this.config.locale,apiKey:this.config.apiKey,profileId:this.config.profileId,disableErrorMessages:this.config.disableErrorMessages,environment:this.config.environment,onLoadingStateChange:this.config.callbacks.onLoadingStateChange},this.handleSubmit.bind(this))}validateConfig(e){if(!e.apiKey)throw new Error("API key is required");if(!e.environment||!["test","live"].includes(e.environment))throw new Error('Environment must be "test" or "live"');return{profileId:e.profileId,apiKey:e.apiKey,checkoutKey:e.checkoutKey,paymentId:e.paymentId,returnUrl:e.returnUrl,environment:e.environment,locale:e.locale||null,disableErrorMessages:e.disableErrorMessages??!1,manualActionHandling:e.manualActionHandling??!1,callbacks:{onPaymentSucceeded:e.callbacks?.onPaymentSucceeded||void 0,onPaymentFailed:e.callbacks?.onPaymentFailed||void 0,onActionRequired:e.callbacks?.onActionRequired||void 0,onLoadingStateChange:e.callbacks?.onLoadingStateChange||void 0}}}mount(e){const t=document.querySelector(e);if(!t)throw new Error(`Container ${e} not found`);const a=document.createElement("div");return t.appendChild(a),this.stateManager.updateState({form:a,mounted:!0}),this.formManager.mount(a),this}unmount(){const{mounted:e}=this.stateManager.getState();e&&Promise.resolve().then(()=>{this.formManager.unmount();const{form:t}=this.stateManager.getState();t&&t.remove(),this.stateManager.updateState({form:null,mounted:!1})})}async handleSubmit({tokenexData:e,formData:t}){try{const a=await this.apiService.authorizePayment({checkoutKey:this.config.checkoutKey,formData:t||null,token:e?.token||null,paymentId:this.config.paymentId,returnUrl:this.config.returnUrl});this.handlePaymentResponse(a)}catch(a){this.handleAuthorizationError(a)}}handlePaymentResponse(e){if(e.latestTransaction.status==="authorized"&&this.config.callbacks.onPaymentSucceeded?.(e.latestTransaction.status),e.latestTransaction.status==="failed"&&this.config.callbacks.onPaymentFailed?.(e.latestTransaction.status),e.status==="requires_action"){const{redirectUrl:t}=e.action;this.config.manualActionHandling?this.config.callbacks.onActionRequired?.(t):globalThis.location.href=t}}handleAuthorizationError(e){this.config.callbacks.onPaymentFailed?.(e.details?.message);const{form:t}=this.stateManager.getState();t&&this.formManager.update({errorMsg:e.details?.message})}}typeof globalThis<"u"&&(globalThis.OdusCheckout=Y),u.OdusCheckout=Y,u.deLocale=A,u.enLocale=D,u.esLocale=R,u.frLocale=V,u.itLocale=B,u.plLocale=O,u.ptLocale=H,u.trLocale=j,Object.defineProperty(u,Symbol.toStringTag,{value:"Module"})});