@odus/checkout 0.1.0 → 0.1.1

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.
package/dist/checkout.js CHANGED
@@ -1,5 +1,5 @@
1
1
  (function(f,v){typeof exports=="object"&&typeof module<"u"?v(exports):typeof define=="function"&&define.amd?define(["exports"],v):(f=typeof globalThis<"u"?globalThis:f||self,v(f.OdusCheckout={}))})(this,function(f){"use strict";var v=document.createElement("style");v.textContent=`.form-container{display:grid;gap:24px;padding:4px;position:relative;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:linear-gradient(135deg,#f8fbff40,#e2ecf540);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(v);const L=n=>n==="test"?"https://sandbox-api.odus.com":n==="live"?"https://api.odus.com":"http://localhost:3000",j=({name:n})=>{const[e,...t]=n?.split(" ")||[],[i]=t.reverse();return{firstName:e,lastName:i}};class K{apiKey;baseUrl;browserInfo;constructor(e,t,i){this.apiKey=e,this.baseUrl=L(t),this.browserInfo=i||{userAgent:navigator.userAgent}}async fetchApi({endpoint:e,method:t="POST",body:i,customHeaders:a={}}){const r={Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json",...a};try{const s=await fetch(`${this.baseUrl}${e}`,{method:t,headers:r,body:i?JSON.stringify(i):void 0});if(!s.ok){let o;try{o=await s.json()}catch(c){console.log("error",c)}throw{message:o?.message[0]||`API request failed: ${s.status} ${s.statusText}`,status:s.status,statusText:s.statusText,details:o}}return s.json()}catch(s){throw s instanceof Error?{message:s.message,status:0,statusText:"Network Error",details:{message:s.message}}:s}}async authorizePayment({paymentId:e,checkoutKey:t,formData:i,token:a,returnUrl:r}){let s={};if(a&&i){const o=i.cardExpiry.replace(/\s+/g,"").split("/"),l=o[0],c=o[1],{firstName:h,lastName:m}=j({name:i.name});s={paymentMethodData:{type:"card",card:{token:a,expMonth:l,expYear:`20${c}`,cardholderName:i.name}},customerData:{email:i.email,firstName:h,lastName:m},context:{returnUrl:r,browserInfo:this.browserInfo}}}else s={paymentMethodData:{type:"paypal"},context:{returnUrl:r,browserInfo:this.browserInfo}};return await this.fetchApi({endpoint:`/payments/${e}/authorize`,customHeaders:{Authorization:`Bearer ${t}`},body:s})}}const U=async({id:n,apiKey:e,environment:t})=>{const i=L(t),a=await fetch(`${i}/checkout-profiles/${n}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(!a.ok)throw new Error(`HTTP error! Status: ${a.status}`);return await a.json()};class _{events=new Map;subscribe(e,t){return this.events.has(e)||this.events.set(e,new Set),this.events.get(e)?.add(t),()=>{const i=this.events.get(e);i&&(i.delete(t),i.size===0&&this.events.delete(e))}}publish(e,t){const i=this.events.get(e);i&&i.forEach(a=>a(t))}clear(){this.events.clear()}subscriberCount(e){return this.events.get(e)?.size||0}}const q=new _;class G{state;initialState;eventBus;stateChangedEvent="state-changed";constructor(e,t=q){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 C(n){return new G(n)}function Y({apiKey:n,profileId:e,environment:t}){const i=C({checkoutProfile:void 0,isLoading:!0,error:null}),a=async()=>{try{i.setState({isLoading:!0});const r=await U({apiKey:n,id:e,environment:t});r&&i.setState({checkoutProfile:r,isLoading:!1,error:null})}catch(r){i.setState({error:"Failed to load checkout profile",isLoading:!1}),console.error(r)}};return a(),{getState:i.getState.bind(i),subscribe:i.subscribe.bind(i),reload:a}}const I={cardNumber:n=>(n.replace(/\s/g,"").match(/.{1,4}/g)||[]).join(" "),cardExpiry:n=>{const t=n.replace(/\D/g,"").slice(0,4);return t.length>2?`${t.slice(0,2)} / ${t.slice(2)}`:t}},N={"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"]},Z=n=>{if(!n||n.includes("."))return null;const e=["com","net","org","edu","gov","io","co"];for(const t of e){if(n==="companycok"&&t==="co")return"company.co";if(n.endsWith(t)&&!n.includes(".")){const i=n.length-t.length;return`${n.substring(0,i)}.${t}`}}return null},J=(n,e)=>{if(n.length===0)return e.length;if(e.length===0)return n.length;const t=e.length+1,i=n.length+1,a=Array.from({length:t},(r,s)=>Array.from({length:i},(o,l)=>s===0?l:l===0?s:0));for(let r=1;r<t;r++)for(let s=1;s<i;s++){const o=n[s-1]===e[r-1]?0:1;a[r][s]=Math.min(a[r-1][s]+1,a[r][s-1]+1,a[r-1][s-1]+o)}return a[e.length][n.length]},W=n=>{let t=null,i=3;const a=n.toLowerCase();for(const r of Object.keys(N)){const s=J(a,r);s<=2&&s<i&&(i=s,t=r)}return t},X=()=>{const{t:n}=k();return{validateEmail:t=>{const i=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;if(!t)return{isValid:!1,message:n("validation.emailInvalid"),suggestion:null};const a=t.indexOf("@");if(a===-1)return{isValid:!1,message:n("validation.emailInvalid"),suggestion:null};const r=t.substring(0,a),s=t.substring(a+1);if(!s.includes(".")){const l=Z(s);if(l)return{isValid:!1,message:n("validation.emailSuggestion",{email:`${r}@${l}`}),suggestion:`${r}@${l}`};for(const c of Object.keys(N))if(c.replace(/\./g,"")===s)return{isValid:!1,message:n("validation.emailSuggestion",{email:`${r}@${c}`}),suggestion:`${r}@${c}`}}if(!i.test(t))return{isValid:!1,message:n("validation.emailInvalid"),suggestion:null};const o=W(s);if(o&&o!==s){const l=`${r}@${o}`;return{isValid:!1,message:n("validation.emailSuggestion",{email:l}),suggestion:l}}return{isValid:!0,message:"Email is valid",suggestion:null}}}},Q=()=>{const{t:n}=k(),{validateEmail:e}=X();return{email:t=>{const i=e(t);return i.isValid?void 0:i.message},name:t=>{if(!t.trim())return n("validation.nameRequired")},cardExpiry:t=>{const i=t.replace(/\s/g,""),[a,r]=i.split("/").map(m=>m.trim());if(!a||!r||a.length!==2||r.length!==2)return n("validation.cardExpiryFormat");const s=new Date,o=s.getFullYear()%100,l=s.getMonth()+1,c=parseInt(a,10),h=parseInt(r,10);if(c<1||c>12)return n("validation.cardExpiryFormat");if(h<o||h===o&&c<l)return n("validation.cardExpiryInvalid")}}},ee=()=>{const n=Q(),e=C({formData:{name:"",email:"",cardExpiry:""},errors:{},touched:{email:!1,name:!1,cardExpiry:!1},isValid:!1}),t=(l,c)=>{const h=n[l];return h?.(c)},i=l=>{const c={};return Object.keys(l).forEach(h=>{const m=t(h,l[h]);m&&(c[h]=m)}),c},a=l=>{const c=i(l);return Object.keys(c).length===0},r=(l,c)=>{const h=e.getState();let m=c;l in I&&(m=I[l](c));const u={...h.formData,[l]:m},p={...h.errors};if(h.touched[l]){const g=t(l,m);g?p[l]=g:delete p[l]}e.setState({formData:u,errors:p,isValid:a(u)})},s=(l,c)=>{const h=e.getState(),m={...h.touched,[l]:!0},u=t(l,c),p={...h.errors};u?p[l]=u:delete p[l],e.setState({touched:m,errors:p})},o=l=>{const h={...e.getState().formData,...l};e.setState({formData:h,isValid:a(h)})};return{getFormState:e.getState.bind(e),subscribe:e.subscribe.bind(e),handleChange:r,handleBlur:s,setFormData:o,reset:e.resetState.bind(e)}},te=async({props:n,apiKey:e,environment:t})=>{const i=L(t),a=await fetch(`${i}/tokenization/generate-iframe-configuration`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n)});if(!a.ok)throw new Error(`HTTP error! Status: ${a.status}`);return await a.json()};function ie({apiKey:n,checkoutProfile:e,inputStyles:t,setFormData:i,environment:a}){const r=C({iframeConfig:void 0,loadingIframe:!0,isCcValid:!1,isCvvValid:!1,isFocused:!1,isCvvFocused:!1,possibleCardType:"unknown"});let s=null;const o=async()=>{try{const m=await te({props:{allowedOrigins:[globalThis.location.origin]},apiKey:n,environment:a});m&&(r.setState({iframeConfig:{...m,origin:globalThis.location.origin}}),l())}catch(m){console.error("Failed to generate iframe config:",m)}},l=()=>{const m=r.getState();if(m.iframeConfig&&e){if(!globalThis.TokenEx?.Iframe){console.error("TokenEx script not loaded correctly");return}s=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`}}}),s.on("load",()=>{r.setState({loadingIframe:!1})}),s.on("autoCompleteValues",function(u){const{nameOnCard:p,cardExp:g}=u;i({name:p,cardExpiry:g})}),s.on("validate",function(u){const{isValid:p,isCvvValid:g}=u;r.setState({isCcValid:p,isCvvValid:g})}),s.on("focus",function(){r.setState({isFocused:!0})}),s.on("blur",function(){r.setState({isFocused:!1})}),s.on("cvvFocus",function(){r.setState({isCvvFocused:!0})}),s.on("cvvBlur",function(){r.setState({isCvvFocused:!1})}),s.on("cardTypeChange",function({possibleCardType:u}){r.setState({possibleCardType:u})}),s.load()}};n&&o();const c=()=>{s&&(s.remove(),s=null)},h=async m=>{s&&(s.on("tokenize",async function(u){await m(u)}),s.tokenize())};return{getState:r.getState.bind(r),subscribe:r.subscribe.bind(r),tokenize:h,cleanup:c}}const z={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"}},P={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"}},D={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"}},A={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"}},R={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"}},B={en:P,de:z,es:D,fr:V,pl:A,pt:R};class ae{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 i=this.getNestedTranslation(e);return!t||i===e?i:this.interpolate(i,t)}getNestedTranslation(e){const t=this.locale in B?B[this.locale]:{},i=this.findNestedValue(t,e);return i===void 0?e:i}findNestedValue(e,t){const i=t.split(".");let a=e;for(const r of i){if(a==null||!Object.prototype.hasOwnProperty.call(a,r))return;a=a[r]}return typeof a=="string"?a:void 0}interpolate(e,t){return e.replace(/{{(\w+)}}/g,(i,a)=>{const r=t[a];return r===void 0?i:String(r)})}}const O=["en","de","es","fr","pl","pt"],re="en";function se(n){const e=new ae,i=(()=>{const o=navigator?.language?.split("-")[0]?.toLowerCase();return O.includes(o)?o:re})();e.setLocale(i);const a=C({locale:i,translationService:e});return{store:a,translate:(o,l)=>a.getState().translationService.translate(o,l),setLocale:o=>{O.includes(o)&&(a.getState().translationService.setLocale(o),a.setState({locale:o}))},getLocale:()=>a.getValue("locale"),subscribe:a.subscribe.bind(a)}}const ne=se(),k=()=>{const{translate:n,getLocale:e,setLocale:t,subscribe:i}=ne;return{t:n,translate:n,locale:e(),setLocale:t,subscribe:i}},oe=({fontFamily:n})=>{if(!n)return{cleanup:()=>{}};const e=n.replace(/\s+/g,"+"),t=`https://fonts.googleapis.com/css2?family=${e}:wght@400;700&display=swap`,i=[...document.head.querySelectorAll("link")].filter(o=>o.href.includes("fonts.googleapis.com/css2")&&o.rel==="stylesheet"),a=document.createElement("link");a.rel="stylesheet",a.href=t;const r=i.find(o=>o.href.includes(`family=${e}`));if(r)r.href=t;else if(i.length>0){const o=i.at(-1);o?.nextSibling?document.head.insertBefore(a,o.nextSibling):document.head.appendChild(a)}else document.head.appendChild(a);return{cleanup:()=>{document.head.contains(a)&&document.head.removeChild(a)}}},le=({scriptSrc:n,async:e=!1})=>{if(!n)return{cleanup:()=>{},isLoaded:Promise.resolve(!1)};if([...document.head.querySelectorAll("script")].filter(s=>s.src===n).length>0)return{cleanup:()=>{},isLoaded:Promise.resolve(!0)};const i=document.createElement("script");i.src=n,i.async=e;const a=new Promise((s,o)=>{i.onload=()=>s(!0),i.onerror=()=>{console.error(`Failed to load script: ${n}`),o(new Error(`Failed to load script: ${n}`))}});return document.head.appendChild(i),{cleanup:()=>{document.head.contains(i)&&document.head.removeChild(i)},isLoaded:a}},S=n=>Object.entries(n).map(([e,t])=>{const i=e.replace(/([A-Z])/g,"-$1").toLowerCase(),a=typeof t=="number"?`${t}px`:t;return`${i}: ${a}`}).join("; ");function ce(n){if(!n)return{formContainerStyle:{},baseStyles:{},placeholderStyles:{},errorStyles:{},focusStyles:{},inputStyles:{base:"",error:"",focus:"",placeholder:""}};const e={opacity:"1",background:"#fff",border:"none",outline:"none",fontSize:`${n.styles.fontSize}px`,lineHeight:30,boxSizing:"border-box",padding:"0px 12px",height:33,width:"100%",fontFamily:`${n.styles.fontFamily}, sans-serif`},t={color:"#717173",opacity:"0.3",fontFamily:`${n.styles.fontFamily}, sans-serif`},i={color:"#dc2727"},a={outline:0},r={fontFamily:`${n.styles.fontFamily}, sans-serif`},s={base:S(e),error:S(i),focus:S(a),placeholder:S(t)};return{formContainerStyle:r,baseStyles:e,placeholderStyles:t,errorStyles:i,focusStyles:a,inputStyles:s}}class d{element;children=[];eventListeners=[];constructor(e,t=[],i={}){this.element=document.createElement(e),t.length>0&&this.addClass(...t),Object.entries(i).forEach(([a,r])=>{this.setAttribute(a,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 d?e.appendChild(this):e.appendChild(this.element),this}addEventListener(e,t,i){return this.element.addEventListener(e,t,i),this.eventListeners.push({type:e,listener:t}),this}removeEventListener(e,t,i){return this.element.removeEventListener(e,t,i),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 b{static createDiv(e=[],t={}){return new d("div",e,t)}static createSpan(e=[],t={}){return new d("span",e,t)}static createButton(e,t=[],i={}){const a=new d("button",t,i);return a.setText(e),a}static createInput(e,t=[],i={}){const a={type:e,...i};return new d("input",t,a)}static createTextInput(e="",t=[],i={}){const a={type:"text",placeholder:e,...i};return new d("input",t,a)}static createForm(e=[],t={}){return new d("form",e,t)}static createLabel(e,t="",i=[],a={}){const r=t?{for:t,...a}:a,s=new d("label",i,r);return s.setText(e),s}static createSelect(e,t=[],i={}){const a=new d("select",t,i);return e.forEach(r=>{const s=document.createElement("option");s.value=r.value,s.textContent=r.text,r.selected&&(s.selected=!0),a.getElement().appendChild(s)}),a}static createImage(e,t="",i=[],a={}){const r={src:e,alt:t,...a};return new d("img",i,r)}}class de extends d{messageComponent;constructor(e){super("div",[]);const t=b.createDiv(["error-alert"],{role:"alert","aria-live":"polite"}),i=b.createDiv(["error-alert-content"]),a=b.createDiv(["error-alert-icon-container"]);a.getElement().innerHTML=this.createAlertCircleSVG();const r=b.createDiv(["error-alert-text-container"]),s=new d("h4",["error-alert-title"]);s.setText("Checkout Error"),this.messageComponent=new d("p",["error-alert-message"]),this.messageComponent.setText(e.message||"Bad request"),r.appendChild(s),r.appendChild(this.messageComponent),i.appendChild(a),i.appendChild(r),t.appendChild(i),this.appendChild(t)}createAlertCircleSVG(){return`
2
+ /*$vite$:1*/`,document.head.appendChild(v);const L=()=>"http://localhost:3000",j=({name:n})=>{const[e,...t]=n?.split(" ")||[],[i]=t.reverse();return{firstName:e,lastName:i}};class K{apiKey;baseUrl;browserInfo;constructor(e,t,i){this.apiKey=e,this.baseUrl=L(),this.browserInfo=i||{userAgent:navigator.userAgent}}async fetchApi({endpoint:e,method:t="POST",body:i,customHeaders:a={}}){const r={Authorization:`Bearer ${this.apiKey}`,"Content-Type":"application/json",...a};try{const s=await fetch(`${this.baseUrl}${e}`,{method:t,headers:r,body:i?JSON.stringify(i):void 0});if(!s.ok){let o;try{o=await s.json()}catch(c){console.log("error",c)}throw{message:o?.message[0]||`API request failed: ${s.status} ${s.statusText}`,status:s.status,statusText:s.statusText,details:o}}return s.json()}catch(s){throw s instanceof Error?{message:s.message,status:0,statusText:"Network Error",details:{message:s.message}}:s}}async authorizePayment({paymentId:e,checkoutKey:t,formData:i,token:a,returnUrl:r}){let s={};if(a&&i){const o=i.cardExpiry.replace(/\s+/g,"").split("/"),l=o[0],c=o[1],{firstName:h,lastName:m}=j({name:i.name});s={paymentMethodData:{type:"card",card:{token:a,expMonth:l,expYear:`20${c}`,cardholderName:i.name}},customerData:{email:i.email,firstName:h,lastName:m},context:{returnUrl:r,browserInfo:this.browserInfo}}}else s={paymentMethodData:{type:"paypal"},context:{returnUrl:r,browserInfo:this.browserInfo}};return await this.fetchApi({endpoint:`/payments/${e}/authorize`,customHeaders:{Authorization:`Bearer ${t}`},body:s})}}const U=async({id:n,apiKey:e,environment:t})=>{const i=L(),a=await fetch(`${i}/checkout-profiles/${n}`,{method:"GET",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`}});if(!a.ok)throw new Error(`HTTP error! Status: ${a.status}`);return await a.json()};class _{events=new Map;subscribe(e,t){return this.events.has(e)||this.events.set(e,new Set),this.events.get(e)?.add(t),()=>{const i=this.events.get(e);i&&(i.delete(t),i.size===0&&this.events.delete(e))}}publish(e,t){const i=this.events.get(e);i&&i.forEach(a=>a(t))}clear(){this.events.clear()}subscriberCount(e){return this.events.get(e)?.size||0}}const q=new _;class G{state;initialState;eventBus;stateChangedEvent="state-changed";constructor(e,t=q){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 C(n){return new G(n)}function Y({apiKey:n,profileId:e,environment:t}){const i=C({checkoutProfile:void 0,isLoading:!0,error:null}),a=async()=>{try{i.setState({isLoading:!0});const r=await U({apiKey:n,id:e,environment:t});r&&i.setState({checkoutProfile:r,isLoading:!1,error:null})}catch(r){i.setState({error:"Failed to load checkout profile",isLoading:!1}),console.error(r)}};return a(),{getState:i.getState.bind(i),subscribe:i.subscribe.bind(i),reload:a}}const I={cardNumber:n=>(n.replace(/\s/g,"").match(/.{1,4}/g)||[]).join(" "),cardExpiry:n=>{const t=n.replace(/\D/g,"").slice(0,4);return t.length>2?`${t.slice(0,2)} / ${t.slice(2)}`:t}},N={"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"]},Z=n=>{if(!n||n.includes("."))return null;const e=["com","net","org","edu","gov","io","co"];for(const t of e){if(n==="companycok"&&t==="co")return"company.co";if(n.endsWith(t)&&!n.includes(".")){const i=n.length-t.length;return`${n.substring(0,i)}.${t}`}}return null},J=(n,e)=>{if(n.length===0)return e.length;if(e.length===0)return n.length;const t=e.length+1,i=n.length+1,a=Array.from({length:t},(r,s)=>Array.from({length:i},(o,l)=>s===0?l:l===0?s:0));for(let r=1;r<t;r++)for(let s=1;s<i;s++){const o=n[s-1]===e[r-1]?0:1;a[r][s]=Math.min(a[r-1][s]+1,a[r][s-1]+1,a[r-1][s-1]+o)}return a[e.length][n.length]},W=n=>{let t=null,i=3;const a=n.toLowerCase();for(const r of Object.keys(N)){const s=J(a,r);s<=2&&s<i&&(i=s,t=r)}return t},X=()=>{const{t:n}=k();return{validateEmail:t=>{const i=/^[^\s@]+@[^\s@]+\.[^\s@]+$/;if(!t)return{isValid:!1,message:n("validation.emailInvalid"),suggestion:null};const a=t.indexOf("@");if(a===-1)return{isValid:!1,message:n("validation.emailInvalid"),suggestion:null};const r=t.substring(0,a),s=t.substring(a+1);if(!s.includes(".")){const l=Z(s);if(l)return{isValid:!1,message:n("validation.emailSuggestion",{email:`${r}@${l}`}),suggestion:`${r}@${l}`};for(const c of Object.keys(N))if(c.replace(/\./g,"")===s)return{isValid:!1,message:n("validation.emailSuggestion",{email:`${r}@${c}`}),suggestion:`${r}@${c}`}}if(!i.test(t))return{isValid:!1,message:n("validation.emailInvalid"),suggestion:null};const o=W(s);if(o&&o!==s){const l=`${r}@${o}`;return{isValid:!1,message:n("validation.emailSuggestion",{email:l}),suggestion:l}}return{isValid:!0,message:"Email is valid",suggestion:null}}}},Q=()=>{const{t:n}=k(),{validateEmail:e}=X();return{email:t=>{const i=e(t);return i.isValid?void 0:i.message},name:t=>{if(!t.trim())return n("validation.nameRequired")},cardExpiry:t=>{const i=t.replace(/\s/g,""),[a,r]=i.split("/").map(m=>m.trim());if(!a||!r||a.length!==2||r.length!==2)return n("validation.cardExpiryFormat");const s=new Date,o=s.getFullYear()%100,l=s.getMonth()+1,c=parseInt(a,10),h=parseInt(r,10);if(c<1||c>12)return n("validation.cardExpiryFormat");if(h<o||h===o&&c<l)return n("validation.cardExpiryInvalid")}}},ee=()=>{const n=Q(),e=C({formData:{name:"",email:"",cardExpiry:""},errors:{},touched:{email:!1,name:!1,cardExpiry:!1},isValid:!1}),t=(l,c)=>{const h=n[l];return h?.(c)},i=l=>{const c={};return Object.keys(l).forEach(h=>{const m=t(h,l[h]);m&&(c[h]=m)}),c},a=l=>{const c=i(l);return Object.keys(c).length===0},r=(l,c)=>{const h=e.getState();let m=c;l in I&&(m=I[l](c));const u={...h.formData,[l]:m},p={...h.errors};if(h.touched[l]){const g=t(l,m);g?p[l]=g:delete p[l]}e.setState({formData:u,errors:p,isValid:a(u)})},s=(l,c)=>{const h=e.getState(),m={...h.touched,[l]:!0},u=t(l,c),p={...h.errors};u?p[l]=u:delete p[l],e.setState({touched:m,errors:p})},o=l=>{const h={...e.getState().formData,...l};e.setState({formData:h,isValid:a(h)})};return{getFormState:e.getState.bind(e),subscribe:e.subscribe.bind(e),handleChange:r,handleBlur:s,setFormData:o,reset:e.resetState.bind(e)}},te=async({props:n,apiKey:e,environment:t})=>{const i=L(),a=await fetch(`${i}/tokenization/generate-iframe-configuration`,{method:"POST",headers:{"Content-Type":"application/json",Authorization:`Bearer ${e}`},body:JSON.stringify(n)});if(!a.ok)throw new Error(`HTTP error! Status: ${a.status}`);return await a.json()};function ie({apiKey:n,checkoutProfile:e,inputStyles:t,setFormData:i,environment:a}){const r=C({iframeConfig:void 0,loadingIframe:!0,isCcValid:!1,isCvvValid:!1,isFocused:!1,isCvvFocused:!1,possibleCardType:"unknown"});let s=null;const o=async()=>{try{const m=await te({props:{allowedOrigins:[globalThis.location.origin]},apiKey:n,environment:a});m&&(r.setState({iframeConfig:{...m,origin:globalThis.location.origin}}),l())}catch(m){console.error("Failed to generate iframe config:",m)}},l=()=>{const m=r.getState();if(m.iframeConfig&&e){if(!globalThis.TokenEx?.Iframe){console.error("TokenEx script not loaded correctly");return}s=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`}}}),s.on("load",()=>{r.setState({loadingIframe:!1})}),s.on("autoCompleteValues",function(u){const{nameOnCard:p,cardExp:g}=u;i({name:p,cardExpiry:g})}),s.on("validate",function(u){const{isValid:p,isCvvValid:g}=u;r.setState({isCcValid:p,isCvvValid:g})}),s.on("focus",function(){r.setState({isFocused:!0})}),s.on("blur",function(){r.setState({isFocused:!1})}),s.on("cvvFocus",function(){r.setState({isCvvFocused:!0})}),s.on("cvvBlur",function(){r.setState({isCvvFocused:!1})}),s.on("cardTypeChange",function({possibleCardType:u}){r.setState({possibleCardType:u})}),s.load()}};n&&o();const c=()=>{s&&(s.remove(),s=null)},h=async m=>{s&&(s.on("tokenize",async function(u){await m(u)}),s.tokenize())};return{getState:r.getState.bind(r),subscribe:r.subscribe.bind(r),tokenize:h,cleanup:c}}const z={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"}},P={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"}},D={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"}},A={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"}},R={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"}},B={en:P,de:z,es:D,fr:V,pl:A,pt:R};class ae{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 i=this.getNestedTranslation(e);return!t||i===e?i:this.interpolate(i,t)}getNestedTranslation(e){const t=this.locale in B?B[this.locale]:{},i=this.findNestedValue(t,e);return i===void 0?e:i}findNestedValue(e,t){const i=t.split(".");let a=e;for(const r of i){if(a==null||!Object.prototype.hasOwnProperty.call(a,r))return;a=a[r]}return typeof a=="string"?a:void 0}interpolate(e,t){return e.replace(/{{(\w+)}}/g,(i,a)=>{const r=t[a];return r===void 0?i:String(r)})}}const O=["en","de","es","fr","pl","pt"],re="en";function se(n){const e=new ae,i=(()=>{const o=navigator?.language?.split("-")[0]?.toLowerCase();return O.includes(o)?o:re})();e.setLocale(i);const a=C({locale:i,translationService:e});return{store:a,translate:(o,l)=>a.getState().translationService.translate(o,l),setLocale:o=>{O.includes(o)&&(a.getState().translationService.setLocale(o),a.setState({locale:o}))},getLocale:()=>a.getValue("locale"),subscribe:a.subscribe.bind(a)}}const ne=se(),k=()=>{const{translate:n,getLocale:e,setLocale:t,subscribe:i}=ne;return{t:n,translate:n,locale:e(),setLocale:t,subscribe:i}},oe=({fontFamily:n})=>{if(!n)return{cleanup:()=>{}};const e=n.replace(/\s+/g,"+"),t=`https://fonts.googleapis.com/css2?family=${e}:wght@400;700&display=swap`,i=[...document.head.querySelectorAll("link")].filter(o=>o.href.includes("fonts.googleapis.com/css2")&&o.rel==="stylesheet"),a=document.createElement("link");a.rel="stylesheet",a.href=t;const r=i.find(o=>o.href.includes(`family=${e}`));if(r)r.href=t;else if(i.length>0){const o=i.at(-1);o?.nextSibling?document.head.insertBefore(a,o.nextSibling):document.head.appendChild(a)}else document.head.appendChild(a);return{cleanup:()=>{document.head.contains(a)&&document.head.removeChild(a)}}},le=({scriptSrc:n,async:e=!1})=>{if(!n)return{cleanup:()=>{},isLoaded:Promise.resolve(!1)};if([...document.head.querySelectorAll("script")].filter(s=>s.src===n).length>0)return{cleanup:()=>{},isLoaded:Promise.resolve(!0)};const i=document.createElement("script");i.src=n,i.async=e;const a=new Promise((s,o)=>{i.onload=()=>s(!0),i.onerror=()=>{console.error(`Failed to load script: ${n}`),o(new Error(`Failed to load script: ${n}`))}});return document.head.appendChild(i),{cleanup:()=>{document.head.contains(i)&&document.head.removeChild(i)},isLoaded:a}},S=n=>Object.entries(n).map(([e,t])=>{const i=e.replace(/([A-Z])/g,"-$1").toLowerCase(),a=typeof t=="number"?`${t}px`:t;return`${i}: ${a}`}).join("; ");function ce(n){if(!n)return{formContainerStyle:{},baseStyles:{},placeholderStyles:{},errorStyles:{},focusStyles:{},inputStyles:{base:"",error:"",focus:"",placeholder:""}};const e={opacity:"1",background:"#fff",border:"none",outline:"none",fontSize:`${n.styles.fontSize}px`,lineHeight:30,boxSizing:"border-box",padding:"0px 12px",height:33,width:"100%",fontFamily:`${n.styles.fontFamily}, sans-serif`},t={color:"#717173",opacity:"0.3",fontFamily:`${n.styles.fontFamily}, sans-serif`},i={color:"#dc2727"},a={outline:0},r={fontFamily:`${n.styles.fontFamily}, sans-serif`},s={base:S(e),error:S(i),focus:S(a),placeholder:S(t)};return{formContainerStyle:r,baseStyles:e,placeholderStyles:t,errorStyles:i,focusStyles:a,inputStyles:s}}class d{element;children=[];eventListeners=[];constructor(e,t=[],i={}){this.element=document.createElement(e),t.length>0&&this.addClass(...t),Object.entries(i).forEach(([a,r])=>{this.setAttribute(a,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 d?e.appendChild(this):e.appendChild(this.element),this}addEventListener(e,t,i){return this.element.addEventListener(e,t,i),this.eventListeners.push({type:e,listener:t}),this}removeEventListener(e,t,i){return this.element.removeEventListener(e,t,i),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 b{static createDiv(e=[],t={}){return new d("div",e,t)}static createSpan(e=[],t={}){return new d("span",e,t)}static createButton(e,t=[],i={}){const a=new d("button",t,i);return a.setText(e),a}static createInput(e,t=[],i={}){const a={type:e,...i};return new d("input",t,a)}static createTextInput(e="",t=[],i={}){const a={type:"text",placeholder:e,...i};return new d("input",t,a)}static createForm(e=[],t={}){return new d("form",e,t)}static createLabel(e,t="",i=[],a={}){const r=t?{for:t,...a}:a,s=new d("label",i,r);return s.setText(e),s}static createSelect(e,t=[],i={}){const a=new d("select",t,i);return e.forEach(r=>{const s=document.createElement("option");s.value=r.value,s.textContent=r.text,r.selected&&(s.selected=!0),a.getElement().appendChild(s)}),a}static createImage(e,t="",i=[],a={}){const r={src:e,alt:t,...a};return new d("img",i,r)}}class de extends d{messageComponent;constructor(e){super("div",[]);const t=b.createDiv(["error-alert"],{role:"alert","aria-live":"polite"}),i=b.createDiv(["error-alert-content"]),a=b.createDiv(["error-alert-icon-container"]);a.getElement().innerHTML=this.createAlertCircleSVG();const r=b.createDiv(["error-alert-text-container"]),s=new d("h4",["error-alert-title"]);s.setText("Checkout Error"),this.messageComponent=new d("p",["error-alert-message"]),this.messageComponent.setText(e.message||"Bad request"),r.appendChild(s),r.appendChild(this.messageComponent),i.appendChild(a),i.appendChild(r),t.appendChild(i),this.appendChild(t)}createAlertCircleSVG(){return`
3
3
  <svg
4
4
  xmlns="http://www.w3.org/2000/svg"
5
5
  width="14"