@voxepay/checkout 0.3.2 → 0.3.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,2 +1,2 @@
1
- var VoxePay=function(e){"use strict";const t=[{name:"Visa",code:"visa",pattern:/^4/,lengths:[13,16,19],cvvLength:3},{name:"Mastercard",code:"mastercard",pattern:/^(5[1-5]|2[2-7])/,lengths:[16],cvvLength:3},{name:"Verve",code:"verve",pattern:/^(506[0-9]|507[0-9]|6500)/,lengths:[16,18,19],cvvLength:3},{name:"American Express",code:"amex",pattern:/^3[47]/,lengths:[15],cvvLength:4},{name:"Discover",code:"discover",pattern:/^(6011|65|64[4-9])/,lengths:[16,19],cvvLength:3}];function a(e){const a=e.replace(/\s/g,"");for(const e of t)if(e.pattern.test(a))return e;return null}function n(e){const t=e.replace(/\s/g,"");if(!/^\d+$/.test(t))return!1;let a=0,n=!1;for(let e=t.length-1;e>=0;e--){let o=parseInt(t[e],10);n&&(o*=2,o>9&&(o-=9)),a+=o,n=!n}return a%10==0}function o(e){const t=e.replace(/\s/g,"");if(!t)return{valid:!1,error:"Card number is required"};if(!/^\d+$/.test(t))return{valid:!1,error:"Invalid card number"};const o=a(t);return o?o.lengths.includes(t.length)?n(t)?{valid:!0}:{valid:!1,error:"Invalid card number"}:{valid:!1,error:"Invalid card number length"}:{valid:!1,error:"Unsupported card type"}}function r(e){const t=e.replace(/\s/g,"");if(!t)return{valid:!1,error:"Expiry date is required"};const a=t.match(/^(\d{2})\/(\d{2})$/);if(!a)return{valid:!1,error:"Invalid format (MM/YY)"};const n=parseInt(a[1],10),o=parseInt(a[2],10)+2e3;if(n<1||n>12)return{valid:!1,error:"Invalid month"};const r=new Date,i=r.getFullYear(),s=r.getMonth()+1;return o<i||o===i&&n<s?{valid:!1,error:"Card has expired"}:o>i+20?{valid:!1,error:"Invalid expiry year"}:{valid:!0}}function i(e,t){const n=e.replace(/\s/g,"");if(!n)return{valid:!1,error:"CVV is required"};if(!/^\d+$/.test(n))return{valid:!1,error:"Invalid CVV"};const o=t?a(t):null,r=(null==o?void 0:o.cvvLength)||3;return n.length!==r&&3!==n.length&&4!==n.length?{valid:!1,error:`CVV must be ${r} digits`}:{valid:!0}}function s(e){return(e.replace(/\D/g,"").match(/.{1,4}/g)||[]).join(" ").slice(0,23)}function l(e){const t=e.replace(/\D/g,"");if(0===t.length)return"";if(1===t.length)return parseInt(t)>1?`0${t}`:t;if(2===t.length){const e=parseInt(t);return e>12?"12":0===e?"01":t}return`${t.slice(0,2)}/${t.slice(2,4)}`}function d(e){return e.replace(/\D/g,"").slice(0,4)}function p(e,t){return new Intl.NumberFormat("en-US",{style:"currency",currency:t,minimumFractionDigits:2}).format(e/100)}const c=e=>{const t=[];for(let a=0;a<e.length;a+=2)t.push(parseInt(e.substring(a,a+2),16));return t};class v{constructor(){this.data=[],this.sign=0}static fromHex(e){const t=new v;if(0===e.length)return t;t.sign=1;let a=0,n=0;for(let o=e.length-1;o>=0;o--){n|=parseInt(e[o],16)<<a,a+=4,a>=v.BITS&&(t.data.push(n&v.BASE-1),n>>>=v.BITS,a-=v.BITS)}return(n>0||a>0)&&t.data.push(n),t.trim(),t}static fromBytes(e){const t=e.map(e=>e.toString(16).padStart(2,"0")).join("");return v.fromHex(t)}trim(){for(;this.data.length>0&&0===this.data[this.data.length-1];)this.data.pop();0===this.data.length&&(this.sign=0)}isZero(){return 0===this.data.length}bitLength(){if(0===this.data.length)return 0;const e=this.data[this.data.length-1];let t=(this.data.length-1)*v.BITS,a=e;for(;a>0;)t++,a>>>=1;return t}toBytes(e){let t="";for(let e=this.data.length-1;e>=0;e--){const a=this.data[e].toString(16);if(e===this.data.length-1)t+=a;else{const e=Math.ceil(v.BITS/4);t+=a.padStart(e,"0")}}t.length%2!=0&&(t="0"+t);const a=c(t);if(e&&a.length<e){return new Array(e-a.length).fill(0).concat(a)}return a}clone(){const e=new v;return e.data=this.data.slice(),e.sign=this.sign,e}compareAbs(e){if(this.data.length!==e.data.length)return this.data.length>e.data.length?1:-1;for(let t=this.data.length-1;t>=0;t--)if(this.data[t]!==e.data[t])return this.data[t]>e.data[t]?1:-1;return 0}multiply(e){if(this.isZero()||e.isZero())return new v;const t=new v;t.data=new Array(this.data.length+e.data.length).fill(0),t.sign=1;for(let a=0;a<this.data.length;a++){let n=0;for(let o=0;o<e.data.length;o++){const r=this.data[a]*e.data[o]+t.data[a+o]+n;t.data[a+o]=r&v.BASE-1,n=Math.floor(r/v.BASE)}n>0&&(t.data[a+e.data.length]+=n)}return t.trim(),t}modPow(e,t){if(t.isZero())throw new Error("Division by zero");let a=v.fromHex("1"),n=this.mod(t);const o=e.bitLength();for(let r=0;r<o;r++){const o=Math.floor(r/v.BITS),i=r%v.BITS;o<e.data.length&&e.data[o]&1<<i&&(a=a.multiply(n).mod(t)),n=n.multiply(n).mod(t)}return a}mod(e){return this.divmod(e).remainder}divmod(e){if(e.isZero())throw new Error("Division by zero");if(this.isZero())return{quotient:new v,remainder:new v};const t=this.compareAbs(e);if(t<0)return{quotient:new v,remainder:this.clone()};if(0===t){return{quotient:v.fromHex("1"),remainder:new v}}const a=new v;a.data=new Array(this.data.length).fill(0),a.sign=1;let n=new v;for(let t=this.bitLength()-1;t>=0;t--){n=n.shiftLeft(1);const o=Math.floor(t/v.BITS),r=t%v.BITS;if(o<this.data.length&&this.data[o]&1<<r&&(0===n.data.length&&n.data.push(0),n.data[0]|=1,n.sign=1),n.compareAbs(e)>=0){n=n.subtract(e);const o=Math.floor(t/v.BITS),r=t%v.BITS;for(;a.data.length<=o;)a.data.push(0);a.data[o]|=1<<r}}return a.trim(),n.trim(),{quotient:a,remainder:n}}shiftLeft(e){if(this.isZero()||0===e)return this.clone();const t=Math.floor(e/v.BITS),a=e%v.BITS,n=new v;n.sign=this.sign,n.data=new Array(this.data.length+t+1).fill(0);for(let e=0;e<this.data.length;e++)n.data[e+t]|=this.data[e]<<a&v.BASE-1,a>0&&(n.data[e+t+1]|=this.data[e]>>>v.BITS-a);return n.trim(),n}subtract(e){const t=new v;t.sign=1,t.data=new Array(Math.max(this.data.length,e.data.length)).fill(0);let a=0;for(let n=0;n<t.data.length;n++){let o=(this.data[n]||0)-(e.data[n]||0)-a;o<0?(o+=v.BASE,a=1):a=0,t.data[n]=o}return t.trim(),t}}v.BASE=67108864,v.BITS=26;const y="009c7b3ba621a26c4b02f48cfc07ef6ee0aed8e12b4bd11c5cc0abf80d5206be69e1891e60fc88e2d565e2fabe4d0cf630e318a6c721c3ded718d0c530cdf050387ad0a30a336899bbda877d0ec7c7c3ffe693988bfae0ffbab71b25468c7814924f022cb5fda36e0d2c30a7161fa1c6fb5fbd7d05adbef7e68d48f8b6c5f511827c4b1c5ed15b6f20555affc4d0857ef7ab2b5c18ba22bea5d3a79bd1834badb5878d8c7a4b19da20c1f62340b1f7fbf01d2f2e97c9714a9df376ac0ea58072b2b77aeb7872b54a89667519de44d0fc73540beeaec4cb778a45eebfbefe2d817a8a8319b2bc6d9fa714f5289ec7c0dbc43496d71cf2a642cb679b0fc4072fd2cf",u="010001",h=async({version:e,pan:t,pin:a,expiryDate:n,cvv:o})=>{try{const i=c((e=>{let t="";for(let a=0;a<e.length;a++)t+=e.charCodeAt(a).toString(16).padStart(2,"0");return t})(`${e}Z${t}Z${a}Z${n}Z${o}`)),s=v.fromHex(y),l=v.fromHex(u),d=Math.ceil(s.bitLength()/8),p=((e,t)=>{if(e.length>t-11)throw new Error("Message too long for RSA encryption");const a=t-e.length-3,n=new Array(t);n[0]=0,n[1]=2;for(let e=0;e<a;e++){let t=0;if("undefined"!=typeof crypto&&crypto.getRandomValues){const e=new Uint8Array(1);for(;0===t;)crypto.getRandomValues(e),t=e[0]}else for(;0===t;)t=Math.floor(255*Math.random())+1;n[2+e]=t}n[2+a]=0;for(let t=0;t<e.length;t++)n[3+a+t]=e[t];return n})(i,d),h=v.fromBytes(p),x=h.modPow(l,s).toBytes(d);return r=x,"undefined"!=typeof btoa?btoa(String.fromCharCode(...r)):Buffer.from(r).toString("base64")}catch(e){throw console.error("[VoxePay] Encryption error:",e),new Error("Failed to encrypt card data")}var r},x=e=>{const t=e.replace(/\s|\//g,"");if(4!==t.length)return"";const a=t.substring(0,2);return`${t.substring(2,4)}${a}`},m=e=>e.replace(/\s/g,"");class f{constructor(e,t){this.apiKey=e,this.baseUrl=t||"https://devpay.voxepay.app"}async request(e,t){const a=`${this.baseUrl}${e}`,n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey,Accept:"application/json"},body:JSON.stringify(t)}),o=await n.json();if(!n.ok){const e=(null==o?void 0:o.message)||(null==o?void 0:o.error)||`Request failed with status ${n.status}`,t=new Error(e);throw t.code=(null==o?void 0:o.code)||`HTTP_${n.status}`,t.status=n.status,t.data=o,t}return o}async initiatePayment(e){return this.request("/api/v1/payments/initiate",e)}async validateOTP(e){return this.request("/api/v1/payments/validate-otp",e)}async resendOTP(e){await this.request("/api/v1/payments/resend-otp",e)}}const g='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />\n </svg>',b='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />\n </svg>',w='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="3">\n <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />\n </svg>',T='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" />\n </svg>',k='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />\n </svg>',S='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M3 21h18M3 10h18M5 6l7-3 7 3M4 10v11M20 10v11M8 14v3M12 14v3M16 14v3" />\n </svg>',I='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" />\n </svg>',P='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>',E={visa:"VISA",mastercard:"MC",amex:"AMEX",verve:"VERVE",discover:"DISC"};class M{constructor(e){this.container=null,this.overlay=null,this.apiClient=null,this.handleEscape=e=>{"Escape"===e.key&&(this.close(),document.removeEventListener("keydown",this.handleEscape))},this.options=e;const t=e.paymentMethods||["card","bank_transfer"];e._sdkConfig&&(this.apiClient=new f(e._sdkConfig.apiKey,e._sdkConfig.baseUrl)),this.state={cardNumber:"",expiry:"",cvv:"",otp:"",errors:{},isProcessing:!1,isSuccess:!1,isOtpStep:!1,otpTimer:60,canResendOtp:!1,otpTimerInterval:null,paymentMethod:t[0],transferTimer:0,transferTimerInterval:null,bankTransferDetails:e.bankTransferDetails||null,paymentId:null,transactionId:null,transactionRef:null,eciFlag:null}}open(){this.injectStyles(),this.render(),this.attachEventListeners(),requestAnimationFrame(()=>{var e;null===(e=this.overlay)||void 0===e||e.classList.add("voxepay-visible")})}close(){var e;this.stopTransferTimer(),null===(e=this.overlay)||void 0===e||e.classList.remove("voxepay-visible"),setTimeout(()=>{var e,t,a;null===(e=this.container)||void 0===e||e.remove(),this.container=null,this.overlay=null,null===(a=(t=this.options).onClose)||void 0===a||a.call(t)},300)}injectStyles(){if(document.getElementById("voxepay-checkout-styles"))return;const e=document.createElement("style");e.id="voxepay-checkout-styles",e.textContent=this.getStyles(),document.head.appendChild(e)}render(){this.container=document.createElement("div"),this.container.className="voxepay-checkout",this.container.innerHTML=this.getModalHTML(),document.body.appendChild(this.container),this.overlay=this.container.querySelector(".voxepay-overlay")}getPaymentMethods(){return this.options.paymentMethods||["card","bank_transfer"]}getModalHTML(){const e=p(this.options.amount,this.options.currency),t=this.getPaymentMethods(),a=t.length>1,n="card"===this.state.paymentMethod;return`\n <div class="voxepay-overlay">\n <div class="voxepay-modal" role="dialog" aria-modal="true" aria-labelledby="voxepay-title">\n <div class="voxepay-header">\n <div class="voxepay-header-left">\n <div class="voxepay-logo">V</div>\n <div>\n <div class="voxepay-amount" id="voxepay-title">Pay ${e}</div>\n ${this.options.description?`<div style="font-size: 0.875rem; color: var(--voxepay-text-muted);">${this.options.description}</div>`:""}\n </div>\n </div>\n <button class="voxepay-close" aria-label="Close" data-action="close">\n ${g}\n </button>\n </div>\n\n ${a?`\n <div class="voxepay-method-tabs">\n ${t.includes("card")?`\n <button class="voxepay-method-tab ${n?"active":""}" data-method="card">\n ${I} <span>Card</span>\n </button>`:""}\n ${t.includes("bank_transfer")?`\n <button class="voxepay-method-tab ${n?"":"active"}" data-method="bank_transfer">\n ${S} <span>Bank Transfer</span>\n </button>`:""}\n </div>`:""}\n \n <div class="voxepay-body" id="voxepay-form-container">\n ${n?this.getCardFormHTML(e):this.getBankTransferHTML(e)}\n </div>\n \n <div class="voxepay-footer">\n <div class="voxepay-powered-by">\n ${b}\n <span>Secured by <strong>VoxePay</strong></span>\n </div>\n </div>\n </div>\n </div>\n `}getCardFormHTML(e){return`\n <form id="voxepay-payment-form" novalidate>\n <div class="voxepay-form-group">\n <label class="voxepay-label">\n <span class="voxepay-label-icon">💳</span>\n Card Number\n </label>\n <div class="voxepay-card-input-wrapper">\n <input type="text" class="voxepay-input" id="voxepay-card-number" name="cardNumber"\n placeholder="1234 5678 9012 3456" autocomplete="cc-number" inputmode="numeric" />\n <div class="voxepay-card-brand" id="voxepay-card-brand"></div>\n </div>\n <div class="voxepay-error-message" id="voxepay-card-error" style="display: none;"></div>\n </div>\n \n <div class="voxepay-row">\n <div class="voxepay-form-group">\n <label class="voxepay-label"><span class="voxepay-label-icon">📅</span> Expiry</label>\n <input type="text" class="voxepay-input" id="voxepay-expiry" name="expiry"\n placeholder="MM/YY" autocomplete="cc-exp" inputmode="numeric" maxlength="5" />\n <div class="voxepay-error-message" id="voxepay-expiry-error" style="display: none;"></div>\n </div>\n <div class="voxepay-form-group">\n <label class="voxepay-label"><span class="voxepay-label-icon">🔒</span> CVV</label>\n <input type="text" class="voxepay-input" id="voxepay-cvv" name="cvv"\n placeholder="•••" autocomplete="cc-csc" inputmode="numeric" maxlength="4" />\n <div class="voxepay-error-message" id="voxepay-cvv-error" style="display: none;"></div>\n </div>\n </div>\n \n <button type="submit" class="voxepay-submit-btn" id="voxepay-submit">\n <span>Pay Now ${e}</span>\n </button>\n </form>\n `}getBankTransferHTML(e){const t=this.state.bankTransferDetails;return t?`\n <div class="voxepay-transfer-view">\n <div class="voxepay-transfer-instruction">\n <p>Transfer <strong>${e}</strong> to the account below</p>\n </div>\n\n <div class="voxepay-transfer-details">\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Account Number</span>\n <div class="voxepay-transfer-value-row">\n <span class="voxepay-transfer-value voxepay-transfer-account" id="voxepay-account-number">${t.accountNumber}</span>\n <button class="voxepay-copy-btn" id="voxepay-copy-btn" data-copy="${t.accountNumber}" title="Copy">\n ${k}\n </button>\n </div>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Bank Name</span>\n <span class="voxepay-transfer-value">${t.bankName}</span>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Account Name</span>\n <span class="voxepay-transfer-value">${t.accountName}</span>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Amount</span>\n <span class="voxepay-transfer-value voxepay-transfer-amount">${e}</span>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Reference</span>\n <span class="voxepay-transfer-value" style="font-family: monospace; letter-spacing: 1px;">${t.reference}</span>\n </div>\n </div>\n\n <div class="voxepay-transfer-timer" id="voxepay-transfer-timer">\n ${P}\n <span>Account expires in <strong id="voxepay-transfer-countdown">${this.formatCountdown(t.expiresIn)}</strong></span>\n </div>\n\n <button type="button" class="voxepay-submit-btn" id="voxepay-transfer-confirm">\n <span>I've sent the money</span>\n </button>\n </div>\n `:'\n <div class="voxepay-transfer-view">\n <div class="voxepay-transfer-loading">\n <div class="voxepay-spinner"></div>\n <p style="margin-top: 16px; color: var(--voxepay-text-muted);">Generating account details...</p>\n </div>\n </div>\n '}formatCountdown(e){const t=Math.floor(e/60),a=e%60;return`${String(t).padStart(2,"0")}:${String(a).padStart(2,"0")}`}renderSuccessView(){var e;const t=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-form-container");if(!t)return;const a=p(this.options.amount,this.options.currency);t.innerHTML=`\n <div class="voxepay-success-view">\n <div class="voxepay-success-icon">\n ${w}\n </div>\n <h2 class="voxepay-success-title">Payment Successful!</h2>\n <p class="voxepay-success-message">Your payment of ${a} has been processed.</p>\n <button class="voxepay-success-btn" data-action="close">Done</button>\n </div>\n `;const n=t.querySelector('[data-action="close"]');null==n||n.addEventListener("click",()=>this.close())}renderOTPView(){var e;const t=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-form-container");if(!t)return;this.state.isOtpStep=!0,this.state.otpTimer=60,this.state.canResendOtp=!1;const a=this.options.customerEmail?`****${this.options.customerEmail.slice(-4)}`:"****1234";t.innerHTML=`\n <div class="voxepay-otp-view">\n <div class="voxepay-otp-header">\n <div class="voxepay-otp-icon">📱</div>\n <h3 class="voxepay-otp-title">Verify Your Payment</h3>\n <p class="voxepay-otp-subtitle">We've sent a 6-digit code to ${a}</p>\n </div>\n \n <div class="voxepay-otp-inputs-container">\n <div class="voxepay-otp-inputs" id="voxepay-otp-inputs">\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="0" inputmode="numeric" autocomplete="one-time-code" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="1" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="2" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="3" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="4" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="5" inputmode="numeric" />\n </div>\n <div class="voxepay-error-message" id="voxepay-otp-error" style="display: none;"></div>\n </div>\n\n <div class="voxepay-otp-timer" id="voxepay-otp-timer">\n Resend code in <span id="voxepay-timer-count">60</span>s\n </div>\n \n <button class="voxepay-resend-btn" id="voxepay-resend-otp" disabled>\n Resend OTP\n </button>\n \n <button type="button" class="voxepay-submit-btn" id="voxepay-verify-otp">\n <span>🔐 Verify & Pay</span>\n </button>\n \n <button class="voxepay-back-btn" id="voxepay-back-to-card">\n ← Back to card details\n </button>\n </div>\n `,this.attachOTPEventListeners(),this.startOTPTimer()}attachOTPEventListeners(){var e,t,a,n,o;const r=null===(e=this.container)||void 0===e?void 0:e.querySelectorAll(".voxepay-otp-digit");null==r||r.forEach((e,t)=>{e.addEventListener("input",e=>this.handleOTPInput(e,t)),e.addEventListener("keydown",e=>this.handleOTPKeydown(e,t)),e.addEventListener("paste",e=>this.handleOTPPaste(e))});const i=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-verify-otp");null==i||i.addEventListener("click",()=>this.handleOTPSubmit());const s=null===(a=this.container)||void 0===a?void 0:a.querySelector("#voxepay-resend-otp");null==s||s.addEventListener("click",()=>this.handleResendOTP());const l=null===(n=this.container)||void 0===n?void 0:n.querySelector("#voxepay-back-to-card");null==l||l.addEventListener("click",()=>this.handleBackToCard()),null===(o=null==r?void 0:r[0])||void 0===o||o.focus()}handleOTPInput(e,t){var a;const n=e.target,o=n.value.replace(/\D/g,"");if(n.value=o,o&&t<5){const e=null===(a=this.container)||void 0===a?void 0:a.querySelector(`[data-index="${t+1}"]`);null==e||e.focus()}this.updateOTPState(),this.clearError("otp")}handleOTPKeydown(e,t){var a;const n=e.target;if("Backspace"===e.key&&!n.value&&t>0){const e=null===(a=this.container)||void 0===a?void 0:a.querySelector(`[data-index="${t-1}"]`);null==e||e.focus()}}handleOTPPaste(e){var t,a;e.preventDefault();const n=null===(t=e.clipboardData)||void 0===t?void 0:t.getData("text").replace(/\D/g,"").slice(0,6);if(n){const e=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-otp-digit");n.split("").forEach((t,a)=>{e[a]&&(e[a].value=t)}),this.updateOTPState()}}updateOTPState(){var e;const t=null===(e=this.container)||void 0===e?void 0:e.querySelectorAll(".voxepay-otp-digit");let a="";null==t||t.forEach(e=>a+=e.value),this.state.otp=a}startOTPTimer(){var e,t,a;const n=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-timer-count"),o=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-otp-timer"),r=null===(a=this.container)||void 0===a?void 0:a.querySelector("#voxepay-resend-otp");this.state.otpTimerInterval=window.setInterval(()=>{this.state.otpTimer--,n&&(n.textContent=String(this.state.otpTimer)),this.state.otpTimer<=0&&(this.state.otpTimerInterval&&clearInterval(this.state.otpTimerInterval),this.state.canResendOtp=!0,o&&(o.style.display="none"),r&&(r.disabled=!1))},1e3)}async handleOTPSubmit(){if(6===this.state.otp.length){this.setOTPProcessing(!0);try{await this.verifyOTP(),this.state.otpTimerInterval&&clearInterval(this.state.otpTimerInterval);const e=await this.processPayment();this.state.isSuccess=!0,this.renderSuccessView(),this.options.onSuccess(e)}catch(e){this.setOTPProcessing(!1);const t=e;this.showError("otp",t.message||"Invalid OTP. Please try again.")}}else this.showError("otp","Please enter the complete 6-digit code")}setOTPProcessing(e){var t;const a=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-verify-otp");a&&(a.disabled=e,a.innerHTML=e?'<div class="voxepay-spinner"></div><span>Verifying...</span>':"<span>🔐 Verify & Pay</span>")}async verifyOTP(){if(!this.apiClient||!this.options._sdkConfig)throw{code:"SDK_ERROR",message:"SDK not properly initialized",recoverable:!1};if(6!==this.state.otp.length)throw{code:"INVALID_OTP",message:"Please enter the complete 6-digit code",recoverable:!0};if(!this.state.paymentId||!this.state.transactionId)throw{code:"MISSING_PAYMENT_DATA",message:"Payment session expired. Please try again.",recoverable:!1};await this.apiClient.validateOTP({paymentId:this.state.paymentId,otp:this.state.otp,transactionId:this.state.transactionId,eciFlag:this.state.eciFlag||void 0,organizationId:this.options._sdkConfig.organizationId})}async handleResendOTP(){var e,t,a,n;const o=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-otp-timer"),r=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-resend-otp");if(this.apiClient&&this.options._sdkConfig&&this.state.transactionRef)try{r&&(r.disabled=!0),await this.apiClient.resendOTP({transactionRef:this.state.transactionRef,organizationId:this.options._sdkConfig.organizationId})}catch(e){console.error("[VoxePay] Failed to resend OTP:",e)}this.state.otpTimer=60,this.state.canResendOtp=!1,o&&(o.style.display="block"),r&&(r.disabled=!0);const i=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-otp-digit");null==i||i.forEach(e=>e.value=""),this.state.otp="",this.startOTPTimer(),null===(n=null==i?void 0:i[0])||void 0===n||n.focus()}handleBackToCard(){var e;if(this.state.otpTimerInterval&&clearInterval(this.state.otpTimerInterval),this.state.isOtpStep=!1,this.state.otp="",this.container){this.container.innerHTML=this.getModalHTML(),this.overlay=this.container.querySelector(".voxepay-overlay"),null===(e=this.overlay)||void 0===e||e.classList.add("voxepay-visible"),this.attachEventListeners();const t=this.container.querySelector("#voxepay-card-number"),a=this.container.querySelector("#voxepay-expiry"),n=this.container.querySelector("#voxepay-cvv");t&&(t.value=s(this.state.cardNumber)),a&&(a.value=this.state.expiry),n&&(n.value=this.state.cvv)}}attachEventListeners(){var e,t,a,n,o,r,i;const s=null===(e=this.container)||void 0===e?void 0:e.querySelector('[data-action="close"]');null==s||s.addEventListener("click",()=>this.close()),null===(t=this.overlay)||void 0===t||t.addEventListener("click",e=>{e.target===this.overlay&&this.close()}),document.addEventListener("keydown",this.handleEscape);const l=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-method-tab");if(null==l||l.forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.method;t&&t!==this.state.paymentMethod&&this.switchPaymentMethod(t)})}),"card"===this.state.paymentMethod){const e=null===(n=this.container)||void 0===n?void 0:n.querySelector("#voxepay-card-number");null==e||e.addEventListener("input",e=>this.handleCardInput(e)),null==e||e.addEventListener("blur",()=>this.validateField("cardNumber"));const t=null===(o=this.container)||void 0===o?void 0:o.querySelector("#voxepay-expiry");null==t||t.addEventListener("input",e=>this.handleExpiryInput(e)),null==t||t.addEventListener("blur",()=>this.validateField("expiry"));const a=null===(r=this.container)||void 0===r?void 0:r.querySelector("#voxepay-cvv");null==a||a.addEventListener("input",e=>this.handleCVVInput(e)),null==a||a.addEventListener("blur",()=>this.validateField("cvv"));const s=null===(i=this.container)||void 0===i?void 0:i.querySelector("#voxepay-payment-form");null==s||s.addEventListener("submit",e=>this.handleSubmit(e))}"bank_transfer"===this.state.paymentMethod&&(this.attachBankTransferListeners(),this.state.bankTransferDetails?this.startTransferTimer():this.loadBankTransferDetails())}attachBankTransferListeners(){var e,t;const a=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-copy-btn");null==a||a.addEventListener("click",()=>{const e=a.dataset.copy||"";this.copyToClipboard(e)});const n=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-transfer-confirm");null==n||n.addEventListener("click",()=>this.handleTransferConfirm())}switchPaymentMethod(e){var t;if(this.stopTransferTimer(),this.state.paymentMethod=e,this.container&&(this.container.innerHTML=this.getModalHTML(),this.overlay=this.container.querySelector(".voxepay-overlay"),null===(t=this.overlay)||void 0===t||t.classList.add("voxepay-visible"),this.attachEventListeners(),"card"===e&&this.state.cardNumber)){const e=this.container.querySelector("#voxepay-card-number"),t=this.container.querySelector("#voxepay-expiry"),a=this.container.querySelector("#voxepay-cvv");e&&(e.value=s(this.state.cardNumber)),t&&(t.value=this.state.expiry),a&&(a.value=this.state.cvv)}}async loadBankTransferDetails(){var e;try{let t;this.options.onBankTransferRequested?t=await this.options.onBankTransferRequested():(await new Promise(e=>setTimeout(e,1500)),t={accountNumber:"0123456789",bankName:"VoxePay Bank",accountName:"VoxePay Collections",reference:`VP-${Date.now().toString(36).toUpperCase()}`,expiresIn:1800}),this.state.bankTransferDetails=t;const a=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-form-container");if(a){const e=p(this.options.amount,this.options.currency);a.innerHTML=this.getBankTransferHTML(e),this.attachBankTransferListeners(),this.startTransferTimer()}}catch(e){this.options.onError({code:"BANK_TRANSFER_INIT_FAILED",message:"Could not generate bank transfer details. Please try again.",recoverable:!0})}}async copyToClipboard(e){var t;try{await navigator.clipboard.writeText(e);const a=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-copy-btn");a&&(a.innerHTML=`${w}`,a.classList.add("voxepay-copied"),setTimeout(()=>{a.innerHTML=`${k}`,a.classList.remove("voxepay-copied")},2e3))}catch(t){const a=document.createElement("textarea");a.value=e,a.style.position="fixed",a.style.opacity="0",document.body.appendChild(a),a.select(),document.execCommand("copy"),document.body.removeChild(a)}}async handleTransferConfirm(){var e,t;const a=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-transfer-confirm");a&&(a.disabled=!0,a.innerHTML='<div class="voxepay-spinner"></div><span>Confirming transfer...</span>'),this.stopTransferTimer();try{await new Promise(e=>setTimeout(e,3e3));const e={id:`pay_transfer_${Date.now()}`,status:"pending",amount:this.options.amount,currency:this.options.currency,timestamp:(new Date).toISOString(),reference:null===(t=this.state.bankTransferDetails)||void 0===t?void 0:t.reference,paymentMethod:"bank_transfer"};this.state.isSuccess=!0,this.renderSuccessView(),this.options.onSuccess(e)}catch(e){a&&(a.disabled=!1,a.innerHTML="<span>I've sent the money</span>");const t=e;this.options.onError(t)}}startTransferTimer(){this.state.bankTransferDetails&&(this.state.transferTimer=this.state.bankTransferDetails.expiresIn,this.state.transferTimerInterval=window.setInterval(()=>{var e,t,a;this.state.transferTimer--;const n=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-transfer-countdown");if(n&&(n.textContent=this.formatCountdown(this.state.transferTimer)),this.state.transferTimer<=0){this.stopTransferTimer();const e=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-transfer-timer");e&&(e.innerHTML=`${P} <span style="color: var(--voxepay-error);">Account expired. Please try again.</span>`);const n=null===(a=this.container)||void 0===a?void 0:a.querySelector("#voxepay-transfer-confirm");n&&(n.disabled=!0)}},1e3))}stopTransferTimer(){this.state.transferTimerInterval&&(clearInterval(this.state.transferTimerInterval),this.state.transferTimerInterval=null)}handleCardInput(e){var t;const n=e.target,o=s(n.value);n.value=o,this.state.cardNumber=o.replace(/\s/g,"");const r=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-card-brand"),i=a(this.state.cardNumber);r&&(r.textContent=i&&E[i.code]||"",r.style.opacity=i?"1":"0"),this.clearError("cardNumber")}handleExpiryInput(e){const t=e.target,a=l(t.value);t.value=a,this.state.expiry=a,this.clearError("expiry")}handleCVVInput(e){const t=e.target,a=d(t.value);t.value=a,this.state.cvv=a,this.clearError("cvv")}validateField(e){let t;switch(e){case"cardNumber":t=o(this.state.cardNumber);break;case"expiry":t=r(this.state.expiry);break;case"cvv":t=i(this.state.cvv,this.state.cardNumber);break;default:return!0}return t.valid?(this.clearError(e),!0):(this.showError(e,t.error||"Invalid"),!1)}showError(e,t){var a,n;const o=null===(a=this.container)||void 0===a?void 0:a.querySelector(`#voxepay-${"cardNumber"===e?"card":e}-error`),r=null===(n=this.container)||void 0===n?void 0:n.querySelector(`#voxepay-${"cardNumber"===e?"card-number":e}`);o&&(o.innerHTML=`${T} ${t}`,o.style.display="flex"),null==r||r.classList.add("voxepay-error")}clearError(e){var t,a;const n=null===(t=this.container)||void 0===t?void 0:t.querySelector(`#voxepay-${"cardNumber"===e?"card":e}-error`),o=null===(a=this.container)||void 0===a?void 0:a.querySelector(`#voxepay-${"cardNumber"===e?"card-number":e}`);n&&(n.style.display="none"),null==o||o.classList.remove("voxepay-error")}async handleSubmit(e){e.preventDefault();const t=this.validateField("cardNumber"),a=this.validateField("expiry"),n=this.validateField("cvv");if(t&&a&&n)if(this.apiClient&&this.options._sdkConfig){this.setProcessing(!0);try{const e=m(this.state.cardNumber),t=x(this.state.expiry),a=await h({version:"1",pan:e,pin:"",expiryDate:t,cvv:this.state.cvv}),n=`VP-${Date.now().toString(36).toUpperCase()}-${Math.random().toString(36).substring(2,8).toUpperCase()}`,o=await this.apiClient.initiatePayment({organizationId:this.options._sdkConfig.organizationId,transactionRef:n,customerEmail:this.options.customerEmail,customerPhone:this.options.customerPhone,amount:this.options.amount/100,currency:this.options.currency,paymentMethod:"CARD",authData:a,narration:this.options.description});this.state.paymentId=o.paymentId,this.state.transactionId=o.transactionId,this.state.transactionRef=o.transactionRef||n,this.state.eciFlag=o.eciFlag||null,this.setProcessing(!1),this.renderOTPView()}catch(e){this.setProcessing(!1);const t=(null==e?void 0:e.message)||"Payment failed. Please try again.";this.options.onError({code:(null==e?void 0:e.code)||"PAYMENT_INITIATE_FAILED",message:t,recoverable:!0,details:null==e?void 0:e.data}),this.showError("cardNumber",t)}}else this.showError("cardNumber","SDK not properly initialized. Missing API key or organization ID.")}setProcessing(e){var t;this.state.isProcessing=e;const a=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-submit");a&&(a.disabled=e,a.innerHTML=e?'<div class="voxepay-spinner"></div><span>Processing...</span>':`<span>Pay Now ${p(this.options.amount,this.options.currency)}</span>`)}async processPayment(){return{id:this.state.paymentId||`pay_${Date.now()}`,status:"success",amount:this.options.amount,currency:this.options.currency,timestamp:(new Date).toISOString(),reference:this.state.transactionRef||void 0,paymentMethod:"card"}}getStyles(){return"\n :root {\n /* VoxePay Blue Color Palette */\n --voxepay-primary: #0061FF;\n --voxepay-primary-hover: #0056E0;\n --voxepay-secondary: #0047CC;\n --voxepay-accent: #60A5FA;\n --voxepay-glow: rgba(0, 97, 255, 0.35);\n --voxepay-success: #10B981;\n --voxepay-success-bg: rgba(16, 185, 129, 0.1);\n --voxepay-error: #EF4444;\n \n /* Dark Mode (Default) */\n --voxepay-bg: #0C0C1D;\n --voxepay-surface: rgba(255, 255, 255, 0.04);\n --voxepay-surface-hover: rgba(255, 255, 255, 0.08);\n --voxepay-border: rgba(255, 255, 255, 0.08);\n --voxepay-text: #FFFFFF;\n --voxepay-text-muted: #B4B4C7;\n --voxepay-text-subtle: #6B7280;\n --voxepay-input-bg: rgba(255, 255, 255, 0.06);\n \n /* Effects */\n --voxepay-backdrop-blur: blur(24px);\n --voxepay-border-radius: 12px;\n --voxepay-border-radius-lg: 16px;\n --voxepay-border-radius-xl: 24px;\n --voxepay-glow-shadow: 0 0 60px var(--voxepay-glow);\n --voxepay-shadow: 0 25px 60px -15px rgba(0, 0, 0, 0.6);\n --voxepay-transition-fast: 150ms ease;\n --voxepay-transition: 300ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n /* Light Mode */\n html.voxepay-light {\n --voxepay-primary: #0061FF;\n --voxepay-primary-hover: #0056E0;\n --voxepay-secondary: #0047CC;\n --voxepay-glow: rgba(0, 97, 255, 0.2);\n \n --voxepay-bg: #FFFFFF;\n --voxepay-surface: #F8FAFC;\n --voxepay-surface-hover: #F1F5F9;\n --voxepay-border: #E2E8F0;\n --voxepay-text: #0F172A;\n --voxepay-text-muted: #475569;\n --voxepay-text-subtle: #94A3B8;\n --voxepay-input-bg: #F8FAFC;\n \n --voxepay-glow-shadow: 0 0 40px rgba(0, 97, 255, 0.12);\n --voxepay-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n }\n \n .voxepay-checkout * { box-sizing: border-box; margin: 0; padding: 0; }\n .voxepay-checkout { font-family: 'DM Sans', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-size: 1rem; color: var(--voxepay-text); line-height: 1.5; -webkit-font-smoothing: antialiased; }\n \n .voxepay-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: var(--voxepay-backdrop-blur); -webkit-backdrop-filter: var(--voxepay-backdrop-blur); display: flex; align-items: center; justify-content: center; z-index: 999999; opacity: 0; visibility: hidden; transition: opacity var(--voxepay-transition), visibility var(--voxepay-transition); }\n html.voxepay-light .voxepay-overlay { background: rgba(15, 23, 42, 0.4); }\n .voxepay-overlay.voxepay-visible { opacity: 1; visibility: visible; }\n \n .voxepay-modal { background: var(--voxepay-bg); border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius-xl); width: 100%; max-width: 420px; max-height: 90vh; overflow: hidden; box-shadow: var(--voxepay-shadow), var(--voxepay-glow-shadow); transform: scale(0.95) translateY(20px); opacity: 0; transition: transform var(--voxepay-transition), opacity var(--voxepay-transition); }\n .voxepay-overlay.voxepay-visible .voxepay-modal { transform: scale(1) translateY(0); opacity: 1; }\n \n .voxepay-header { display: flex; align-items: center; justify-content: space-between; padding: 20px 24px; border-bottom: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }\n .voxepay-header-left { display: flex; align-items: center; gap: 12px; }\n .voxepay-logo { width: 36px; height: 36px; border-radius: var(--voxepay-border-radius); background: linear-gradient(135deg, var(--voxepay-primary), var(--voxepay-secondary)); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 1.25rem; color: white; box-shadow: 0 4px 12px rgba(0, 97, 255, 0.3); }\n .voxepay-amount { font-size: 1.25rem; font-weight: 600; }\n .voxepay-close { width: 36px; height: 36px; border: none; background: var(--voxepay-surface-hover); border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--voxepay-text-muted); transition: all var(--voxepay-transition-fast); }\n .voxepay-close:hover { background: var(--voxepay-border); color: var(--voxepay-text); transform: rotate(90deg); }\n .voxepay-close svg { width: 18px; height: 18px; }\n \n .voxepay-body { padding: 24px; background: var(--voxepay-bg); }\n .voxepay-form-group { margin-bottom: 20px; }\n .voxepay-label { display: flex; align-items: center; gap: 8px; font-size: 0.875rem; font-weight: 500; color: var(--voxepay-text-muted); margin-bottom: 8px; }\n .voxepay-label-icon { font-size: 1rem; }\n \n .voxepay-input { width: 100%; padding: 14px 16px; background: var(--voxepay-input-bg); border: 1.5px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); color: var(--voxepay-text); font-size: 1rem; font-family: inherit; outline: none; transition: border-color var(--voxepay-transition-fast), box-shadow var(--voxepay-transition-fast), background var(--voxepay-transition-fast); }\n .voxepay-input::placeholder { color: var(--voxepay-text-subtle); }\n .voxepay-input:hover { border-color: var(--voxepay-text-subtle); }\n .voxepay-input:focus { border-color: var(--voxepay-primary); box-shadow: 0 0 0 4px var(--voxepay-glow); background: var(--voxepay-bg); }\n .voxepay-input.voxepay-error { border-color: var(--voxepay-error); box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.15); }\n \n .voxepay-card-input-wrapper { position: relative; }\n .voxepay-card-brand { position: absolute; right: 14px; top: 50%; transform: translateY(-50%); padding: 4px 8px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--voxepay-primary), var(--voxepay-secondary)); border-radius: 6px; font-size: 0.7rem; font-weight: 700; color: white; opacity: 0; transition: opacity var(--voxepay-transition-fast); letter-spacing: 0.5px; }\n .voxepay-card-input-wrapper .voxepay-input { padding-right: 70px; }\n \n .voxepay-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n \n .voxepay-error-message { display: flex; align-items: center; gap: 6px; font-size: 0.813rem; color: var(--voxepay-error); margin-top: 8px; animation: voxepay-shake 0.4s ease; }\n .voxepay-error-message svg { width: 16px; height: 16px; flex-shrink: 0; }\n @keyframes voxepay-shake { 0%, 100% { transform: translateX(0); } 20%, 60% { transform: translateX(-4px); } 40%, 80% { transform: translateX(4px); } }\n \n .voxepay-submit-btn { width: 100%; padding: 16px 24px; background: linear-gradient(135deg, var(--voxepay-primary), var(--voxepay-secondary)); border: none; border-radius: var(--voxepay-border-radius); color: white; font-size: 1.063rem; font-weight: 600; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 10px; transition: all var(--voxepay-transition-fast); position: relative; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 97, 255, 0.35); }\n .voxepay-submit-btn:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 97, 255, 0.45); }\n .voxepay-submit-btn:active:not(:disabled) { transform: translateY(0); }\n .voxepay-submit-btn:disabled { opacity: 0.6; cursor: not-allowed; box-shadow: none; }\n .voxepay-submit-btn span { position: relative; z-index: 1; }\n \n .voxepay-spinner { width: 20px; height: 20px; border: 2.5px solid rgba(255, 255, 255, 0.3); border-top-color: white; border-radius: 50%; animation: voxepay-spin 0.8s linear infinite; }\n @keyframes voxepay-spin { to { transform: rotate(360deg); } }\n \n .voxepay-footer { text-align: center; padding: 16px 24px 20px; border-top: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }\n .voxepay-powered-by { font-size: 0.75rem; color: var(--voxepay-text-subtle); display: flex; align-items: center; justify-content: center; gap: 6px; }\n .voxepay-powered-by svg { width: 14px; height: 14px; color: var(--voxepay-primary); }\n .voxepay-powered-by strong { color: var(--voxepay-primary); font-weight: 600; }\n \n .voxepay-success-view { text-align: center; padding: 40px 24px; }\n .voxepay-success-icon { width: 80px; height: 80px; margin: 0 auto 24px; background: linear-gradient(135deg, var(--voxepay-success), #059669); border-radius: 50%; display: flex; align-items: center; justify-content: center; animation: voxepay-success-pop 0.5s ease; box-shadow: 0 8px 25px rgba(16, 185, 129, 0.35); }\n @keyframes voxepay-success-pop { 0% { transform: scale(0); opacity: 0; } 50% { transform: scale(1.1); } 100% { transform: scale(1); opacity: 1; } }\n .voxepay-success-icon svg { width: 40px; height: 40px; color: white; }\n .voxepay-success-title { font-size: 1.5rem; font-weight: 700; margin-bottom: 8px; color: var(--voxepay-text); }\n .voxepay-success-message { font-size: 1rem; color: var(--voxepay-text-muted); margin-bottom: 24px; }\n .voxepay-success-btn { padding: 12px 32px; background: var(--voxepay-surface); border: 1.5px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); color: var(--voxepay-text); font-size: 1rem; font-weight: 500; cursor: pointer; transition: all var(--voxepay-transition-fast); }\n .voxepay-success-btn:hover { background: var(--voxepay-surface-hover); border-color: var(--voxepay-primary); color: var(--voxepay-primary); }\n \n /* OTP View */\n .voxepay-otp-view { text-align: center; padding: 24px 16px; }\n .voxepay-otp-header { margin-bottom: 24px; }\n .voxepay-otp-icon { font-size: 3rem; margin-bottom: 12px; }\n .voxepay-otp-title { font-size: 1.25rem; font-weight: 700; color: var(--voxepay-text); margin-bottom: 8px; }\n .voxepay-otp-subtitle { font-size: 0.875rem; color: var(--voxepay-text-muted); }\n \n .voxepay-otp-inputs-container { margin-bottom: 16px; }\n .voxepay-otp-inputs { display: flex; justify-content: center; gap: 8px; margin-bottom: 8px; }\n .voxepay-otp-digit { width: 48px; height: 56px; text-align: center; font-size: 1.5rem; font-weight: 700; border: 2px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); background: var(--voxepay-input-bg); color: var(--voxepay-text); outline: none; transition: all var(--voxepay-transition-fast); }\n .voxepay-otp-digit:focus { border-color: var(--voxepay-primary); box-shadow: 0 0 0 4px var(--voxepay-glow); }\n \n .voxepay-otp-timer { font-size: 0.875rem; color: var(--voxepay-text-muted); margin-bottom: 12px; }\n .voxepay-otp-timer span { font-weight: 700; color: var(--voxepay-primary); }\n \n .voxepay-resend-btn { padding: 8px 16px; background: transparent; border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); color: var(--voxepay-text-muted); font-size: 0.875rem; cursor: pointer; margin-bottom: 16px; transition: all var(--voxepay-transition-fast); }\n .voxepay-resend-btn:hover:not(:disabled) { border-color: var(--voxepay-primary); color: var(--voxepay-primary); }\n .voxepay-resend-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n \n .voxepay-back-btn { display: block; width: 100%; padding: 12px; background: transparent; border: none; color: var(--voxepay-text-muted); font-size: 0.875rem; cursor: pointer; margin-top: 12px; transition: color var(--voxepay-transition-fast); }\n .voxepay-back-btn:hover { color: var(--voxepay-primary); }\n\n /* Payment Method Tabs */\n .voxepay-method-tabs { display: flex; border-bottom: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }\n .voxepay-method-tab { flex: 1; display: flex; align-items: center; justify-content: center; gap: 6px; padding: 12px 12px; border: none; background: transparent; color: var(--voxepay-text-muted); font-size: 0.813rem; font-weight: 500; font-family: inherit; cursor: pointer; transition: all var(--voxepay-transition-fast); border-bottom: 2px solid transparent; white-space: nowrap; }\n .voxepay-method-tab svg { width: 16px; height: 16px; flex-shrink: 0; }\n .voxepay-method-tab:hover { color: var(--voxepay-text); background: var(--voxepay-surface-hover); }\n .voxepay-method-tab.active { color: var(--voxepay-primary); border-bottom-color: var(--voxepay-primary); background: var(--voxepay-bg); }\n\n /* Bank Transfer View */\n .voxepay-transfer-view { padding: 4px 0; }\n .voxepay-transfer-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 0; }\n .voxepay-transfer-instruction { text-align: center; margin-bottom: 20px; font-size: 0.938rem; color: var(--voxepay-text-muted); }\n .voxepay-transfer-instruction strong { color: var(--voxepay-text); font-size: 1.063rem; }\n .voxepay-transfer-details { background: var(--voxepay-surface); border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); overflow: hidden; margin-bottom: 16px; }\n .voxepay-transfer-detail { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; border-bottom: 1px solid var(--voxepay-border); }\n .voxepay-transfer-detail:last-child { border-bottom: none; }\n .voxepay-transfer-label { font-size: 0.813rem; color: var(--voxepay-text-muted); font-weight: 500; }\n .voxepay-transfer-value { font-size: 0.938rem; font-weight: 600; color: var(--voxepay-text); }\n .voxepay-transfer-value-row { display: flex; align-items: center; gap: 8px; }\n .voxepay-transfer-account { font-size: 1.125rem; font-weight: 700; color: var(--voxepay-primary); letter-spacing: 1.5px; font-family: 'DM Sans', monospace; }\n .voxepay-transfer-amount { color: var(--voxepay-primary); }\n\n /* Copy Button */\n .voxepay-copy-btn { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: 1px solid var(--voxepay-border); border-radius: 8px; background: var(--voxepay-surface-hover); color: var(--voxepay-text-muted); cursor: pointer; transition: all var(--voxepay-transition-fast); flex-shrink: 0; }\n .voxepay-copy-btn svg { width: 16px; height: 16px; }\n .voxepay-copy-btn:hover { border-color: var(--voxepay-primary); color: var(--voxepay-primary); background: rgba(0, 97, 255, 0.1); }\n .voxepay-copy-btn.voxepay-copied { border-color: var(--voxepay-success); color: var(--voxepay-success); background: var(--voxepay-success-bg); }\n\n /* Transfer Timer */\n .voxepay-transfer-timer { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 10px 16px; background: var(--voxepay-surface); border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); margin-bottom: 16px; font-size: 0.875rem; color: var(--voxepay-text-muted); }\n .voxepay-transfer-timer svg { width: 16px; height: 16px; color: var(--voxepay-primary); flex-shrink: 0; }\n .voxepay-transfer-timer strong { color: var(--voxepay-primary); font-weight: 700; font-family: monospace; font-size: 0.938rem; }\n \n @media (max-width: 480px) { .voxepay-modal { max-width: 100%; max-height: 100%; border-radius: 0; height: 100%; } .voxepay-body { padding: 20px; } .voxepay-otp-digit { width: 42px; height: 50px; font-size: 1.25rem; } .voxepay-transfer-detail { flex-direction: column; align-items: flex-start; gap: 4px; } }\n "}}class C{constructor(){this.config=null,this.currentModal=null,this.initialized=!1}init(e){e.apiKey?e.organizationId?(this.config={theme:"dark",locale:"en-US",...e},this.initialized=!0,"auto"===e.theme?this.applyAutoTheme():"light"===e.theme&&document.documentElement.classList.add("voxepay-light"),e.customStyles&&this.applyCustomStyles(e.customStyles),console.log("[VoxePay] Initialized successfully")):console.error("[VoxePay] Organization ID is required. Find it in your VoxePay dashboard."):console.error("[VoxePay] API key is required. Get your API key from the VoxePay dashboard: Settings > API Keys")}checkout(e){return this.initialized?!e.amount||e.amount<=0?(console.error("[VoxePay] Invalid amount"),void e.onError({code:"INVALID_AMOUNT",message:"Payment amount must be greater than 0",recoverable:!1})):e.currency?(this.closeModal(),this.currentModal=new M({...e,_sdkConfig:{apiKey:this.config.apiKey,organizationId:this.config.organizationId,baseUrl:this.config.baseUrl},onClose:()=>{var t;this.currentModal=null,null===(t=e.onClose)||void 0===t||t.call(e)}}),void this.currentModal.open()):(console.error("[VoxePay] Currency is required"),void e.onError({code:"INVALID_CURRENCY",message:"Currency code is required",recoverable:!1})):(console.error("[VoxePay] Not initialized. Call VoxePay.init() first."),void e.onError({code:"NOT_INITIALIZED",message:"VoxePay SDK not initialized. Call VoxePay.init() first.",recoverable:!1}))}closeModal(){this.currentModal&&(this.currentModal.close(),this.currentModal=null)}setTheme(e){document.documentElement.classList.remove("voxepay-light"),"light"===e?document.documentElement.classList.add("voxepay-light"):"auto"===e&&this.applyAutoTheme(),this.config&&(this.config.theme=e)}applyAutoTheme(){window.matchMedia("(prefers-color-scheme: dark)").matches||document.documentElement.classList.add("voxepay-light"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{var t;"auto"===(null===(t=this.config)||void 0===t?void 0:t.theme)&&document.documentElement.classList.toggle("voxepay-light",!e.matches)})}applyCustomStyles(e){const t=document.documentElement;for(const[a,n]of Object.entries(e))n&&t.style.setProperty(a,n)}get version(){return"0.3.0"}get isInitialized(){return this.initialized}}const L=new C;return"undefined"!=typeof window&&(window.VoxePay=L),e.VoxePay=L,e.VoxePaySDK=C,e.cleanPan=m,e.default=L,e.detectCardBrand=a,e.formatAmount=p,e.formatCVV=d,e.formatCardNumber=s,e.formatExpiry=l,e.formatExpiryForApi=x,e.generateAuthData=h,e.getCurrencySymbol=function(e){return{NGN:"₦",USD:"$",EUR:"€",GBP:"£",GHS:"₵",KES:"KSh",ZAR:"R"}[e.toUpperCase()]||e},e.luhnCheck=n,e.validateCVV=i,e.validateCardNumber=o,e.validateExpiry=r,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
1
+ var VoxePay=function(e){"use strict";const t=[{name:"Visa",code:"visa",pattern:/^4/,lengths:[13,16,19],cvvLength:3},{name:"Mastercard",code:"mastercard",pattern:/^(5[1-5]|2[2-7])/,lengths:[16],cvvLength:3},{name:"Verve",code:"verve",pattern:/^(506[0-9]|507[0-9]|6500)/,lengths:[16,18,19],cvvLength:3},{name:"American Express",code:"amex",pattern:/^3[47]/,lengths:[15],cvvLength:4},{name:"Discover",code:"discover",pattern:/^(6011|65|64[4-9])/,lengths:[16,19],cvvLength:3}];function a(e){const a=e.replace(/\s/g,"");for(const e of t)if(e.pattern.test(a))return e;return null}function n(e){const t=e.replace(/\s/g,"");if(!/^\d+$/.test(t))return!1;let a=0,n=!1;for(let e=t.length-1;e>=0;e--){let o=parseInt(t[e],10);n&&(o*=2,o>9&&(o-=9)),a+=o,n=!n}return a%10==0}function o(e){const t=e.replace(/\s/g,"");if(!t)return{valid:!1,error:"Card number is required"};if(!/^\d+$/.test(t))return{valid:!1,error:"Invalid card number"};const o=a(t);return o?o.lengths.includes(t.length)?n(t)?{valid:!0}:{valid:!1,error:"Invalid card number"}:{valid:!1,error:"Invalid card number length"}:{valid:!1,error:"Unsupported card type"}}function r(e){const t=e.replace(/\s/g,"");if(!t)return{valid:!1,error:"Expiry date is required"};const a=t.match(/^(\d{2})\/(\d{2})$/);if(!a)return{valid:!1,error:"Invalid format (MM/YY)"};const n=parseInt(a[1],10),o=parseInt(a[2],10)+2e3;if(n<1||n>12)return{valid:!1,error:"Invalid month"};const r=new Date,i=r.getFullYear(),s=r.getMonth()+1;return o<i||o===i&&n<s?{valid:!1,error:"Card has expired"}:o>i+20?{valid:!1,error:"Invalid expiry year"}:{valid:!0}}function i(e,t){const n=e.replace(/\s/g,"");if(!n)return{valid:!1,error:"CVV is required"};if(!/^\d+$/.test(n))return{valid:!1,error:"Invalid CVV"};const o=t?a(t):null,r=(null==o?void 0:o.cvvLength)||3;return n.length!==r&&3!==n.length&&4!==n.length?{valid:!1,error:`CVV must be ${r} digits`}:{valid:!0}}function s(e){return(e.replace(/\D/g,"").match(/.{1,4}/g)||[]).join(" ").slice(0,23)}function l(e){const t=e.replace(/\D/g,"");if(0===t.length)return"";if(1===t.length)return parseInt(t)>1?`0${t}`:t;if(2===t.length){const e=parseInt(t);return e>12?"12":0===e?"01":t}return`${t.slice(0,2)}/${t.slice(2,4)}`}function d(e){return e.replace(/\D/g,"").slice(0,4)}function p(e,t){return new Intl.NumberFormat("en-US",{style:"currency",currency:t,minimumFractionDigits:2}).format(e/100)}const c=e=>{const t=[];for(let a=0;a<e.length;a+=2)t.push(parseInt(e.substring(a,a+2),16));return t};class v{constructor(){this.data=[],this.sign=0}static fromHex(e){const t=new v;if(0===e.length)return t;t.sign=1;let a=0,n=0;for(let o=e.length-1;o>=0;o--){n|=parseInt(e[o],16)<<a,a+=4,a>=v.BITS&&(t.data.push(n&v.BASE-1),n>>>=v.BITS,a-=v.BITS)}return(n>0||a>0)&&t.data.push(n),t.trim(),t}static fromBytes(e){const t=e.map(e=>e.toString(16).padStart(2,"0")).join("");return v.fromHex(t)}trim(){for(;this.data.length>0&&0===this.data[this.data.length-1];)this.data.pop();0===this.data.length&&(this.sign=0)}isZero(){return 0===this.data.length}bitLength(){if(0===this.data.length)return 0;const e=this.data[this.data.length-1];let t=(this.data.length-1)*v.BITS,a=e;for(;a>0;)t++,a>>>=1;return t}toBytes(e){let t="";for(let e=this.data.length-1;e>=0;e--){const a=this.data[e].toString(16);if(e===this.data.length-1)t+=a;else{const e=Math.ceil(v.BITS/4);t+=a.padStart(e,"0")}}t.length%2!=0&&(t="0"+t);const a=c(t);if(e&&a.length<e){return new Array(e-a.length).fill(0).concat(a)}return a}clone(){const e=new v;return e.data=this.data.slice(),e.sign=this.sign,e}compareAbs(e){if(this.data.length!==e.data.length)return this.data.length>e.data.length?1:-1;for(let t=this.data.length-1;t>=0;t--)if(this.data[t]!==e.data[t])return this.data[t]>e.data[t]?1:-1;return 0}multiply(e){if(this.isZero()||e.isZero())return new v;const t=new v;t.data=new Array(this.data.length+e.data.length).fill(0),t.sign=1;for(let a=0;a<this.data.length;a++){let n=0;for(let o=0;o<e.data.length;o++){const r=this.data[a]*e.data[o]+t.data[a+o]+n;t.data[a+o]=r&v.BASE-1,n=Math.floor(r/v.BASE)}n>0&&(t.data[a+e.data.length]+=n)}return t.trim(),t}modPow(e,t){if(t.isZero())throw new Error("Division by zero");let a=v.fromHex("1"),n=this.mod(t);const o=e.bitLength();for(let r=0;r<o;r++){const o=Math.floor(r/v.BITS),i=r%v.BITS;o<e.data.length&&e.data[o]&1<<i&&(a=a.multiply(n).mod(t)),n=n.multiply(n).mod(t)}return a}mod(e){return this.divmod(e).remainder}divmod(e){if(e.isZero())throw new Error("Division by zero");if(this.isZero())return{quotient:new v,remainder:new v};const t=this.compareAbs(e);if(t<0)return{quotient:new v,remainder:this.clone()};if(0===t){return{quotient:v.fromHex("1"),remainder:new v}}const a=new v;a.data=new Array(this.data.length).fill(0),a.sign=1;let n=new v;for(let t=this.bitLength()-1;t>=0;t--){n=n.shiftLeft(1);const o=Math.floor(t/v.BITS),r=t%v.BITS;if(o<this.data.length&&this.data[o]&1<<r&&(0===n.data.length&&n.data.push(0),n.data[0]|=1,n.sign=1),n.compareAbs(e)>=0){n=n.subtract(e);const o=Math.floor(t/v.BITS),r=t%v.BITS;for(;a.data.length<=o;)a.data.push(0);a.data[o]|=1<<r}}return a.trim(),n.trim(),{quotient:a,remainder:n}}shiftLeft(e){if(this.isZero()||0===e)return this.clone();const t=Math.floor(e/v.BITS),a=e%v.BITS,n=new v;n.sign=this.sign,n.data=new Array(this.data.length+t+1).fill(0);for(let e=0;e<this.data.length;e++)n.data[e+t]|=this.data[e]<<a&v.BASE-1,a>0&&(n.data[e+t+1]|=this.data[e]>>>v.BITS-a);return n.trim(),n}subtract(e){const t=new v;t.sign=1,t.data=new Array(Math.max(this.data.length,e.data.length)).fill(0);let a=0;for(let n=0;n<t.data.length;n++){let o=(this.data[n]||0)-(e.data[n]||0)-a;o<0?(o+=v.BASE,a=1):a=0,t.data[n]=o}return t.trim(),t}}v.BASE=67108864,v.BITS=26;const y="009c7b3ba621a26c4b02f48cfc07ef6ee0aed8e12b4bd11c5cc0abf80d5206be69e1891e60fc88e2d565e2fabe4d0cf630e318a6c721c3ded718d0c530cdf050387ad0a30a336899bbda877d0ec7c7c3ffe693988bfae0ffbab71b25468c7814924f022cb5fda36e0d2c30a7161fa1c6fb5fbd7d05adbef7e68d48f8b6c5f511827c4b1c5ed15b6f20555affc4d0857ef7ab2b5c18ba22bea5d3a79bd1834badb5878d8c7a4b19da20c1f62340b1f7fbf01d2f2e97c9714a9df376ac0ea58072b2b77aeb7872b54a89667519de44d0fc73540beeaec4cb778a45eebfbefe2d817a8a8319b2bc6d9fa714f5289ec7c0dbc43496d71cf2a642cb679b0fc4072fd2cf",u="010001",h=async({version:e,pan:t,pin:a,expiryDate:n,cvv:o})=>{try{const i=c((e=>{let t="";for(let a=0;a<e.length;a++)t+=e.charCodeAt(a).toString(16).padStart(2,"0");return t})(`${e}Z${t}Z${a}Z${n}Z${o}`)),s=v.fromHex(y),l=v.fromHex(u),d=Math.ceil(s.bitLength()/8),p=((e,t)=>{if(e.length>t-11)throw new Error("Message too long for RSA encryption");const a=t-e.length-3,n=new Array(t);n[0]=0,n[1]=2;for(let e=0;e<a;e++){let t=0;if("undefined"!=typeof crypto&&crypto.getRandomValues){const e=new Uint8Array(1);for(;0===t;)crypto.getRandomValues(e),t=e[0]}else for(;0===t;)t=Math.floor(255*Math.random())+1;n[2+e]=t}n[2+a]=0;for(let t=0;t<e.length;t++)n[3+a+t]=e[t];return n})(i,d),h=v.fromBytes(p),x=h.modPow(l,s).toBytes(d);return r=x,"undefined"!=typeof btoa?btoa(String.fromCharCode(...r)):Buffer.from(r).toString("base64")}catch(e){throw console.error("[VoxePay] Encryption error:",e),new Error("Failed to encrypt card data")}var r},x=e=>{const t=e.replace(/\s|\//g,"");if(4!==t.length)return"";const a=t.substring(0,2);return`${t.substring(2,4)}${a}`},m=e=>e.replace(/\s/g,"");class f{constructor(e,t){this.apiKey=e,this.baseUrl=t||"https://devpay.voxepay.app"}async request(e,t){const a=`${this.baseUrl}${e}`,n=await fetch(a,{method:"POST",headers:{"Content-Type":"application/json","X-API-Key":this.apiKey,Accept:"application/json"},body:JSON.stringify(t)}),o=await n.json();if(!n.ok){const e=(null==o?void 0:o.message)||(null==o?void 0:o.error)||`Request failed with status ${n.status}`,t=new Error(e);throw t.code=(null==o?void 0:o.code)||`HTTP_${n.status}`,t.status=n.status,t.data=o,t}return o}async initiatePayment(e){return this.request("/api/v1/payments/initiate",e)}async validateOTP(e){return this.request("/api/v1/payments/validate-otp",e)}async resendOTP(e){await this.request("/api/v1/payments/resend-otp",e)}}const g='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M6 18L18 6M6 6l12 12" />\n </svg>',b='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z" />\n </svg>',w='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="3">\n <path stroke-linecap="round" stroke-linejoin="round" d="M5 13l4 4L19 7" />\n </svg>',T='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" />\n </svg>',k='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M8 16H6a2 2 0 01-2-2V6a2 2 0 012-2h8a2 2 0 012 2v2m-6 12h8a2 2 0 002-2v-8a2 2 0 00-2-2h-8a2 2 0 00-2 2v8a2 2 0 002 2z" />\n </svg>',S='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M3 21h18M3 10h18M5 6l7-3 7 3M4 10v11M20 10v11M8 14v3M12 14v3M16 14v3" />\n </svg>',I='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M3 10h18M7 15h1m4 0h1m-7 4h12a3 3 0 003-3V8a3 3 0 00-3-3H6a3 3 0 00-3 3v8a3 3 0 003 3z" />\n </svg>',P='<svg xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2">\n <path stroke-linecap="round" stroke-linejoin="round" d="M12 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>',E={visa:"VISA",mastercard:"MC",amex:"AMEX",verve:"VERVE",discover:"DISC"};class M{constructor(e){this.container=null,this.overlay=null,this.apiClient=null,this.handleEscape=e=>{"Escape"===e.key&&(this.close(),document.removeEventListener("keydown",this.handleEscape))},this.options=e;const t=e.paymentMethods||["card","bank_transfer"];e._sdkConfig&&(this.apiClient=new f(e._sdkConfig.apiKey,e._sdkConfig.baseUrl)),this.state={cardNumber:"",expiry:"",cvv:"",otp:"",errors:{},isProcessing:!1,isSuccess:!1,isOtpStep:!1,otpTimer:60,canResendOtp:!1,otpTimerInterval:null,paymentMethod:t[0],transferTimer:0,transferTimerInterval:null,bankTransferDetails:e.bankTransferDetails||null,paymentId:null,transactionId:null,transactionRef:null,eciFlag:null}}open(){this.injectStyles(),this.render(),this.attachEventListeners(),requestAnimationFrame(()=>{var e;null===(e=this.overlay)||void 0===e||e.classList.add("voxepay-visible")})}close(){var e;this.stopTransferTimer(),null===(e=this.overlay)||void 0===e||e.classList.remove("voxepay-visible"),setTimeout(()=>{var e,t,a;null===(e=this.container)||void 0===e||e.remove(),this.container=null,this.overlay=null,null===(a=(t=this.options).onClose)||void 0===a||a.call(t)},300)}injectStyles(){if(document.getElementById("voxepay-checkout-styles"))return;const e=document.createElement("style");e.id="voxepay-checkout-styles",e.textContent=this.getStyles(),document.head.appendChild(e)}render(){this.container=document.createElement("div"),this.container.className="voxepay-checkout",this.container.innerHTML=this.getModalHTML(),document.body.appendChild(this.container),this.overlay=this.container.querySelector(".voxepay-overlay")}getPaymentMethods(){return this.options.paymentMethods||["card","bank_transfer"]}getModalHTML(){const e=p(this.options.amount,this.options.currency),t=this.getPaymentMethods(),a=t.length>1,n="card"===this.state.paymentMethod;return`\n <div class="voxepay-overlay">\n <div class="voxepay-modal" role="dialog" aria-modal="true" aria-labelledby="voxepay-title">\n <div class="voxepay-header">\n <div class="voxepay-header-left">\n <div class="voxepay-logo">V</div>\n <div>\n <div class="voxepay-amount" id="voxepay-title">Pay ${e}</div>\n ${this.options.description?`<div style="font-size: 0.875rem; color: var(--voxepay-text-muted);">${this.options.description}</div>`:""}\n </div>\n </div>\n <button class="voxepay-close" aria-label="Close" data-action="close">\n ${g}\n </button>\n </div>\n\n ${a?`\n <div class="voxepay-method-tabs">\n ${t.includes("card")?`\n <button class="voxepay-method-tab ${n?"active":""}" data-method="card">\n ${I} <span>Card</span>\n </button>`:""}\n ${t.includes("bank_transfer")?`\n <button class="voxepay-method-tab ${n?"":"active"}" data-method="bank_transfer">\n ${S} <span>Bank Transfer</span>\n </button>`:""}\n </div>`:""}\n \n <div class="voxepay-body" id="voxepay-form-container">\n ${n?this.getCardFormHTML(e):this.getBankTransferHTML(e)}\n </div>\n \n <div class="voxepay-footer">\n <div class="voxepay-powered-by">\n ${b}\n <span>Secured by <strong>VoxePay</strong></span>\n </div>\n </div>\n </div>\n </div>\n `}getCardFormHTML(e){return`\n <form id="voxepay-payment-form" novalidate>\n <div class="voxepay-form-group">\n <label class="voxepay-label">\n <span class="voxepay-label-icon">💳</span>\n Card Number\n </label>\n <div class="voxepay-card-input-wrapper">\n <input type="text" class="voxepay-input" id="voxepay-card-number" name="cardNumber"\n placeholder="1234 5678 9012 3456" autocomplete="cc-number" inputmode="numeric" />\n <div class="voxepay-card-brand" id="voxepay-card-brand"></div>\n </div>\n <div class="voxepay-error-message" id="voxepay-card-error" style="display: none;"></div>\n </div>\n \n <div class="voxepay-row">\n <div class="voxepay-form-group">\n <label class="voxepay-label"><span class="voxepay-label-icon">📅</span> Expiry</label>\n <input type="text" class="voxepay-input" id="voxepay-expiry" name="expiry"\n placeholder="MM/YY" autocomplete="cc-exp" inputmode="numeric" maxlength="5" />\n <div class="voxepay-error-message" id="voxepay-expiry-error" style="display: none;"></div>\n </div>\n <div class="voxepay-form-group">\n <label class="voxepay-label"><span class="voxepay-label-icon">🔒</span> CVV</label>\n <input type="text" class="voxepay-input" id="voxepay-cvv" name="cvv"\n placeholder="•••" autocomplete="cc-csc" inputmode="numeric" maxlength="4" />\n <div class="voxepay-error-message" id="voxepay-cvv-error" style="display: none;"></div>\n </div>\n </div>\n \n <button type="submit" class="voxepay-submit-btn" id="voxepay-submit">\n <span>Pay Now ${e}</span>\n </button>\n </form>\n `}getBankTransferHTML(e){const t=this.state.bankTransferDetails;return t?`\n <div class="voxepay-transfer-view">\n <div class="voxepay-transfer-instruction">\n <p>Transfer <strong>${e}</strong> to the account below</p>\n </div>\n\n <div class="voxepay-transfer-details">\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Account Number</span>\n <div class="voxepay-transfer-value-row">\n <span class="voxepay-transfer-value voxepay-transfer-account" id="voxepay-account-number">${t.accountNumber}</span>\n <button class="voxepay-copy-btn" id="voxepay-copy-btn" data-copy="${t.accountNumber}" title="Copy">\n ${k}\n </button>\n </div>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Bank Name</span>\n <span class="voxepay-transfer-value">${t.bankName}</span>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Account Name</span>\n <span class="voxepay-transfer-value">${t.accountName}</span>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Amount</span>\n <span class="voxepay-transfer-value voxepay-transfer-amount">${e}</span>\n </div>\n\n <div class="voxepay-transfer-detail">\n <span class="voxepay-transfer-label">Reference</span>\n <span class="voxepay-transfer-value" style="font-family: monospace; letter-spacing: 1px;">${t.reference}</span>\n </div>\n </div>\n\n <div class="voxepay-transfer-timer" id="voxepay-transfer-timer">\n ${P}\n <span>Account expires in <strong id="voxepay-transfer-countdown">${this.formatCountdown(t.expiresIn)}</strong></span>\n </div>\n\n <button type="button" class="voxepay-submit-btn" id="voxepay-transfer-confirm">\n <span>I've sent the money</span>\n </button>\n </div>\n `:'\n <div class="voxepay-transfer-view">\n <div class="voxepay-transfer-loading">\n <div class="voxepay-spinner"></div>\n <p style="margin-top: 16px; color: var(--voxepay-text-muted);">Generating account details...</p>\n </div>\n </div>\n '}formatCountdown(e){const t=Math.floor(e/60),a=e%60;return`${String(t).padStart(2,"0")}:${String(a).padStart(2,"0")}`}renderSuccessView(){var e;const t=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-form-container");if(!t)return;const a=p(this.options.amount,this.options.currency);t.innerHTML=`\n <div class="voxepay-success-view">\n <div class="voxepay-success-icon">\n ${w}\n </div>\n <h2 class="voxepay-success-title">Payment Successful!</h2>\n <p class="voxepay-success-message">Your payment of ${a} has been processed.</p>\n <button class="voxepay-success-btn" data-action="close">Done</button>\n </div>\n `;const n=t.querySelector('[data-action="close"]');null==n||n.addEventListener("click",()=>this.close())}renderOTPView(){var e;const t=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-form-container");if(!t)return;this.state.isOtpStep=!0,this.state.otpTimer=60,this.state.canResendOtp=!1;const a=this.options.customerEmail?`****${this.options.customerEmail.slice(-4)}`:"****1234";t.innerHTML=`\n <div class="voxepay-otp-view">\n <div class="voxepay-otp-header">\n <div class="voxepay-otp-icon">📱</div>\n <h3 class="voxepay-otp-title">Verify Your Payment</h3>\n <p class="voxepay-otp-subtitle">We've sent a 6-digit code to ${a}</p>\n </div>\n \n <div class="voxepay-otp-inputs-container">\n <div class="voxepay-otp-inputs" id="voxepay-otp-inputs">\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="0" inputmode="numeric" autocomplete="one-time-code" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="1" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="2" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="3" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="4" inputmode="numeric" />\n <input type="text" maxlength="1" class="voxepay-otp-digit" data-index="5" inputmode="numeric" />\n </div>\n <div class="voxepay-error-message" id="voxepay-otp-error" style="display: none;"></div>\n </div>\n\n <div class="voxepay-otp-timer" id="voxepay-otp-timer">\n Resend code in <span id="voxepay-timer-count">60</span>s\n </div>\n \n <button class="voxepay-resend-btn" id="voxepay-resend-otp" disabled>\n Resend OTP\n </button>\n \n <button type="button" class="voxepay-submit-btn" id="voxepay-verify-otp">\n <span>🔐 Verify & Pay</span>\n </button>\n \n <button class="voxepay-back-btn" id="voxepay-back-to-card">\n ← Back to card details\n </button>\n </div>\n `,this.attachOTPEventListeners(),this.startOTPTimer()}attachOTPEventListeners(){var e,t,a,n,o;const r=null===(e=this.container)||void 0===e?void 0:e.querySelectorAll(".voxepay-otp-digit");null==r||r.forEach((e,t)=>{e.addEventListener("input",e=>this.handleOTPInput(e,t)),e.addEventListener("keydown",e=>this.handleOTPKeydown(e,t)),e.addEventListener("paste",e=>this.handleOTPPaste(e))});const i=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-verify-otp");null==i||i.addEventListener("click",()=>this.handleOTPSubmit());const s=null===(a=this.container)||void 0===a?void 0:a.querySelector("#voxepay-resend-otp");null==s||s.addEventListener("click",()=>this.handleResendOTP());const l=null===(n=this.container)||void 0===n?void 0:n.querySelector("#voxepay-back-to-card");null==l||l.addEventListener("click",()=>this.handleBackToCard()),null===(o=null==r?void 0:r[0])||void 0===o||o.focus()}handleOTPInput(e,t){var a;const n=e.target,o=n.value.replace(/\D/g,"");if(n.value=o,o&&t<5){const e=null===(a=this.container)||void 0===a?void 0:a.querySelector(`[data-index="${t+1}"]`);null==e||e.focus()}this.updateOTPState(),this.clearError("otp")}handleOTPKeydown(e,t){var a;const n=e.target;if("Backspace"===e.key&&!n.value&&t>0){const e=null===(a=this.container)||void 0===a?void 0:a.querySelector(`[data-index="${t-1}"]`);null==e||e.focus()}}handleOTPPaste(e){var t,a;e.preventDefault();const n=null===(t=e.clipboardData)||void 0===t?void 0:t.getData("text").replace(/\D/g,"").slice(0,6);if(n){const e=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-otp-digit");n.split("").forEach((t,a)=>{e[a]&&(e[a].value=t)}),this.updateOTPState()}}updateOTPState(){var e;const t=null===(e=this.container)||void 0===e?void 0:e.querySelectorAll(".voxepay-otp-digit");let a="";null==t||t.forEach(e=>a+=e.value),this.state.otp=a}startOTPTimer(){var e,t,a;const n=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-timer-count"),o=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-otp-timer"),r=null===(a=this.container)||void 0===a?void 0:a.querySelector("#voxepay-resend-otp");this.state.otpTimerInterval=window.setInterval(()=>{this.state.otpTimer--,n&&(n.textContent=String(this.state.otpTimer)),this.state.otpTimer<=0&&(this.state.otpTimerInterval&&clearInterval(this.state.otpTimerInterval),this.state.canResendOtp=!0,o&&(o.style.display="none"),r&&(r.disabled=!1))},1e3)}async handleOTPSubmit(){if(6===this.state.otp.length){this.setOTPProcessing(!0);try{await this.verifyOTP(),this.state.otpTimerInterval&&clearInterval(this.state.otpTimerInterval);const e=await this.processPayment();this.state.isSuccess=!0,this.renderSuccessView(),this.options.onSuccess(e)}catch(e){this.setOTPProcessing(!1);const t=e;this.showError("otp",t.message||"Invalid OTP. Please try again.")}}else this.showError("otp","Please enter the complete 6-digit code")}setOTPProcessing(e){var t;const a=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-verify-otp");a&&(a.disabled=e,a.innerHTML=e?'<div class="voxepay-spinner"></div><span>Verifying...</span>':"<span>🔐 Verify & Pay</span>")}async verifyOTP(){if(!this.apiClient||!this.options._sdkConfig)throw{code:"SDK_ERROR",message:"SDK not properly initialized",recoverable:!1};if(6!==this.state.otp.length)throw{code:"INVALID_OTP",message:"Please enter the complete 6-digit code",recoverable:!0};if(!this.state.paymentId||!this.state.transactionId)throw{code:"MISSING_PAYMENT_DATA",message:"Payment session expired. Please try again.",recoverable:!1};await this.apiClient.validateOTP({paymentId:this.state.paymentId,otp:this.state.otp,transactionId:this.state.transactionId,eciFlag:this.state.eciFlag||void 0,organizationId:this.options._sdkConfig.organizationId})}async handleResendOTP(){var e,t,a,n;const o=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-otp-timer"),r=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-resend-otp");if(this.apiClient&&this.options._sdkConfig&&this.state.transactionRef)try{r&&(r.disabled=!0),await this.apiClient.resendOTP({transactionRef:this.state.transactionRef,organizationId:this.options._sdkConfig.organizationId})}catch(e){console.error("[VoxePay] Failed to resend OTP:",e)}this.state.otpTimer=60,this.state.canResendOtp=!1,o&&(o.style.display="block"),r&&(r.disabled=!0);const i=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-otp-digit");null==i||i.forEach(e=>e.value=""),this.state.otp="",this.startOTPTimer(),null===(n=null==i?void 0:i[0])||void 0===n||n.focus()}handleBackToCard(){var e;if(this.state.otpTimerInterval&&clearInterval(this.state.otpTimerInterval),this.state.isOtpStep=!1,this.state.otp="",this.container){this.container.innerHTML=this.getModalHTML(),this.overlay=this.container.querySelector(".voxepay-overlay"),null===(e=this.overlay)||void 0===e||e.classList.add("voxepay-visible"),this.attachEventListeners();const t=this.container.querySelector("#voxepay-card-number"),a=this.container.querySelector("#voxepay-expiry"),n=this.container.querySelector("#voxepay-cvv");t&&(t.value=s(this.state.cardNumber)),a&&(a.value=this.state.expiry),n&&(n.value=this.state.cvv)}}attachEventListeners(){var e,t,a,n,o,r,i;const s=null===(e=this.container)||void 0===e?void 0:e.querySelector('[data-action="close"]');null==s||s.addEventListener("click",()=>this.close()),null===(t=this.overlay)||void 0===t||t.addEventListener("click",e=>{e.target===this.overlay&&this.close()}),document.addEventListener("keydown",this.handleEscape);const l=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-method-tab");if(null==l||l.forEach(e=>{e.addEventListener("click",()=>{const t=e.dataset.method;t&&t!==this.state.paymentMethod&&this.switchPaymentMethod(t)})}),"card"===this.state.paymentMethod){const e=null===(n=this.container)||void 0===n?void 0:n.querySelector("#voxepay-card-number");null==e||e.addEventListener("input",e=>this.handleCardInput(e)),null==e||e.addEventListener("blur",()=>this.validateField("cardNumber"));const t=null===(o=this.container)||void 0===o?void 0:o.querySelector("#voxepay-expiry");null==t||t.addEventListener("input",e=>this.handleExpiryInput(e)),null==t||t.addEventListener("blur",()=>this.validateField("expiry"));const a=null===(r=this.container)||void 0===r?void 0:r.querySelector("#voxepay-cvv");null==a||a.addEventListener("input",e=>this.handleCVVInput(e)),null==a||a.addEventListener("blur",()=>this.validateField("cvv"));const s=null===(i=this.container)||void 0===i?void 0:i.querySelector("#voxepay-payment-form");null==s||s.addEventListener("submit",e=>this.handleSubmit(e))}"bank_transfer"===this.state.paymentMethod&&(this.attachBankTransferListeners(),this.state.bankTransferDetails?this.startTransferTimer():this.loadBankTransferDetails())}attachBankTransferListeners(){var e,t;const a=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-copy-btn");null==a||a.addEventListener("click",()=>{const e=a.dataset.copy||"";this.copyToClipboard(e)});const n=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-transfer-confirm");null==n||n.addEventListener("click",()=>this.handleTransferConfirm())}switchPaymentMethod(e){var t;if(this.stopTransferTimer(),this.state.paymentMethod=e,this.container&&(this.container.innerHTML=this.getModalHTML(),this.overlay=this.container.querySelector(".voxepay-overlay"),null===(t=this.overlay)||void 0===t||t.classList.add("voxepay-visible"),this.attachEventListeners(),"card"===e&&this.state.cardNumber)){const e=this.container.querySelector("#voxepay-card-number"),t=this.container.querySelector("#voxepay-expiry"),a=this.container.querySelector("#voxepay-cvv");e&&(e.value=s(this.state.cardNumber)),t&&(t.value=this.state.expiry),a&&(a.value=this.state.cvv)}}async loadBankTransferDetails(){var e;try{let t;this.options.onBankTransferRequested?t=await this.options.onBankTransferRequested():(await new Promise(e=>setTimeout(e,1500)),t={accountNumber:"0123456789",bankName:"VoxePay Bank",accountName:"VoxePay Collections",reference:`VP-${Date.now().toString(36).toUpperCase()}`,expiresIn:1800}),this.state.bankTransferDetails=t;const a=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-form-container");if(a){const e=p(this.options.amount,this.options.currency);a.innerHTML=this.getBankTransferHTML(e),this.attachBankTransferListeners(),this.startTransferTimer()}}catch(e){this.options.onError({code:"BANK_TRANSFER_INIT_FAILED",message:"Could not generate bank transfer details. Please try again.",recoverable:!0})}}async copyToClipboard(e){var t;try{await navigator.clipboard.writeText(e);const a=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-copy-btn");a&&(a.innerHTML=`${w}`,a.classList.add("voxepay-copied"),setTimeout(()=>{a.innerHTML=`${k}`,a.classList.remove("voxepay-copied")},2e3))}catch(t){const a=document.createElement("textarea");a.value=e,a.style.position="fixed",a.style.opacity="0",document.body.appendChild(a),a.select(),document.execCommand("copy"),document.body.removeChild(a)}}async handleTransferConfirm(){var e,t;const a=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-transfer-confirm");a&&(a.disabled=!0,a.innerHTML='<div class="voxepay-spinner"></div><span>Confirming transfer...</span>'),this.stopTransferTimer();try{await new Promise(e=>setTimeout(e,3e3));const e={id:`pay_transfer_${Date.now()}`,status:"pending",amount:this.options.amount,currency:this.options.currency,timestamp:(new Date).toISOString(),reference:null===(t=this.state.bankTransferDetails)||void 0===t?void 0:t.reference,paymentMethod:"bank_transfer"};this.state.isSuccess=!0,this.renderSuccessView(),this.options.onSuccess(e)}catch(e){a&&(a.disabled=!1,a.innerHTML="<span>I've sent the money</span>");const t=e;this.options.onError(t)}}startTransferTimer(){this.state.bankTransferDetails&&(this.state.transferTimer=this.state.bankTransferDetails.expiresIn,this.state.transferTimerInterval=window.setInterval(()=>{var e,t,a;this.state.transferTimer--;const n=null===(e=this.container)||void 0===e?void 0:e.querySelector("#voxepay-transfer-countdown");if(n&&(n.textContent=this.formatCountdown(this.state.transferTimer)),this.state.transferTimer<=0){this.stopTransferTimer();const e=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-transfer-timer");e&&(e.innerHTML=`${P} <span style="color: var(--voxepay-error);">Account expired. Please try again.</span>`);const n=null===(a=this.container)||void 0===a?void 0:a.querySelector("#voxepay-transfer-confirm");n&&(n.disabled=!0)}},1e3))}stopTransferTimer(){this.state.transferTimerInterval&&(clearInterval(this.state.transferTimerInterval),this.state.transferTimerInterval=null)}handleCardInput(e){var t;const n=e.target,o=s(n.value);n.value=o,this.state.cardNumber=o.replace(/\s/g,"");const r=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-card-brand"),i=a(this.state.cardNumber);r&&(r.textContent=i&&E[i.code]||"",r.style.opacity=i?"1":"0"),this.clearError("cardNumber")}handleExpiryInput(e){const t=e.target,a=l(t.value);t.value=a,this.state.expiry=a,this.clearError("expiry")}handleCVVInput(e){const t=e.target,a=d(t.value);t.value=a,this.state.cvv=a,this.clearError("cvv")}validateField(e){let t;switch(e){case"cardNumber":t=o(this.state.cardNumber);break;case"expiry":t=r(this.state.expiry);break;case"cvv":t=i(this.state.cvv,this.state.cardNumber);break;default:return!0}return t.valid?(this.clearError(e),!0):(this.showError(e,t.error||"Invalid"),!1)}showError(e,t){var a,n;const o=null===(a=this.container)||void 0===a?void 0:a.querySelector(`#voxepay-${"cardNumber"===e?"card":e}-error`),r=null===(n=this.container)||void 0===n?void 0:n.querySelector(`#voxepay-${"cardNumber"===e?"card-number":e}`);o&&(o.innerHTML=`${T} ${t}`,o.style.display="flex"),null==r||r.classList.add("voxepay-error")}clearError(e){var t,a;const n=null===(t=this.container)||void 0===t?void 0:t.querySelector(`#voxepay-${"cardNumber"===e?"card":e}-error`),o=null===(a=this.container)||void 0===a?void 0:a.querySelector(`#voxepay-${"cardNumber"===e?"card-number":e}`);n&&(n.style.display="none"),null==o||o.classList.remove("voxepay-error")}async handleSubmit(e){e.preventDefault();const t=this.validateField("cardNumber"),a=this.validateField("expiry"),n=this.validateField("cvv");if(t&&a&&n)if(this.apiClient&&this.options._sdkConfig){this.setProcessing(!0);try{const e=m(this.state.cardNumber),t=x(this.state.expiry),a=await h({version:"1",pan:e,pin:"",expiryDate:t,cvv:this.state.cvv}),n=`VP-${Date.now().toString(36).toUpperCase()}-${Math.random().toString(36).substring(2,8).toUpperCase()}`,o=await this.apiClient.initiatePayment({organizationId:this.options._sdkConfig.organizationId,transactionRef:n,customerId:this.options.customerEmail,customerEmail:this.options.customerEmail,customerPhone:this.options.customerPhone,amount:this.options.amount/100,currency:this.options.currency,paymentMethod:"CARD",authData:a,narration:this.options.description});this.state.paymentId=o.paymentId,this.state.transactionId=o.transactionId,this.state.transactionRef=o.transactionRef||n,this.state.eciFlag=o.eciFlag||null,this.setProcessing(!1),this.renderOTPView()}catch(e){this.setProcessing(!1);const t=(null==e?void 0:e.message)||"Payment failed. Please try again.";this.options.onError({code:(null==e?void 0:e.code)||"PAYMENT_INITIATE_FAILED",message:t,recoverable:!0,details:null==e?void 0:e.data}),this.showError("cardNumber",t)}}else this.showError("cardNumber","SDK not properly initialized. Missing API key or organization ID.")}setProcessing(e){var t;this.state.isProcessing=e;const a=null===(t=this.container)||void 0===t?void 0:t.querySelector("#voxepay-submit");a&&(a.disabled=e,a.innerHTML=e?'<div class="voxepay-spinner"></div><span>Processing...</span>':`<span>Pay Now ${p(this.options.amount,this.options.currency)}</span>`)}async processPayment(){return{id:this.state.paymentId||`pay_${Date.now()}`,status:"success",amount:this.options.amount,currency:this.options.currency,timestamp:(new Date).toISOString(),reference:this.state.transactionRef||void 0,paymentMethod:"card"}}getStyles(){return"\n :root {\n /* VoxePay Blue Color Palette */\n --voxepay-primary: #0061FF;\n --voxepay-primary-hover: #0056E0;\n --voxepay-secondary: #0047CC;\n --voxepay-accent: #60A5FA;\n --voxepay-glow: rgba(0, 97, 255, 0.35);\n --voxepay-success: #10B981;\n --voxepay-success-bg: rgba(16, 185, 129, 0.1);\n --voxepay-error: #EF4444;\n \n /* Dark Mode (Default) */\n --voxepay-bg: #0C0C1D;\n --voxepay-surface: rgba(255, 255, 255, 0.04);\n --voxepay-surface-hover: rgba(255, 255, 255, 0.08);\n --voxepay-border: rgba(255, 255, 255, 0.08);\n --voxepay-text: #FFFFFF;\n --voxepay-text-muted: #B4B4C7;\n --voxepay-text-subtle: #6B7280;\n --voxepay-input-bg: rgba(255, 255, 255, 0.06);\n \n /* Effects */\n --voxepay-backdrop-blur: blur(24px);\n --voxepay-border-radius: 12px;\n --voxepay-border-radius-lg: 16px;\n --voxepay-border-radius-xl: 24px;\n --voxepay-glow-shadow: 0 0 60px var(--voxepay-glow);\n --voxepay-shadow: 0 25px 60px -15px rgba(0, 0, 0, 0.6);\n --voxepay-transition-fast: 150ms ease;\n --voxepay-transition: 300ms cubic-bezier(0.4, 0, 0.2, 1);\n }\n \n /* Light Mode */\n html.voxepay-light {\n --voxepay-primary: #0061FF;\n --voxepay-primary-hover: #0056E0;\n --voxepay-secondary: #0047CC;\n --voxepay-glow: rgba(0, 97, 255, 0.2);\n \n --voxepay-bg: #FFFFFF;\n --voxepay-surface: #F8FAFC;\n --voxepay-surface-hover: #F1F5F9;\n --voxepay-border: #E2E8F0;\n --voxepay-text: #0F172A;\n --voxepay-text-muted: #475569;\n --voxepay-text-subtle: #94A3B8;\n --voxepay-input-bg: #F8FAFC;\n \n --voxepay-glow-shadow: 0 0 40px rgba(0, 97, 255, 0.12);\n --voxepay-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.15);\n }\n \n .voxepay-checkout * { box-sizing: border-box; margin: 0; padding: 0; }\n .voxepay-checkout { font-family: 'DM Sans', 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; font-size: 1rem; color: var(--voxepay-text); line-height: 1.5; -webkit-font-smoothing: antialiased; }\n \n .voxepay-overlay { position: fixed; top: 0; left: 0; right: 0; bottom: 0; background: rgba(0, 0, 0, 0.5); backdrop-filter: var(--voxepay-backdrop-blur); -webkit-backdrop-filter: var(--voxepay-backdrop-blur); display: flex; align-items: center; justify-content: center; z-index: 999999; opacity: 0; visibility: hidden; transition: opacity var(--voxepay-transition), visibility var(--voxepay-transition); }\n html.voxepay-light .voxepay-overlay { background: rgba(15, 23, 42, 0.4); }\n .voxepay-overlay.voxepay-visible { opacity: 1; visibility: visible; }\n \n .voxepay-modal { background: var(--voxepay-bg); border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius-xl); width: 100%; max-width: 420px; max-height: 90vh; overflow: hidden; box-shadow: var(--voxepay-shadow), var(--voxepay-glow-shadow); transform: scale(0.95) translateY(20px); opacity: 0; transition: transform var(--voxepay-transition), opacity var(--voxepay-transition); }\n .voxepay-overlay.voxepay-visible .voxepay-modal { transform: scale(1) translateY(0); opacity: 1; }\n \n .voxepay-header { display: flex; align-items: center; justify-content: space-between; padding: 20px 24px; border-bottom: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }\n .voxepay-header-left { display: flex; align-items: center; gap: 12px; }\n .voxepay-logo { width: 36px; height: 36px; border-radius: var(--voxepay-border-radius); background: linear-gradient(135deg, var(--voxepay-primary), var(--voxepay-secondary)); display: flex; align-items: center; justify-content: center; font-weight: 700; font-size: 1.25rem; color: white; box-shadow: 0 4px 12px rgba(0, 97, 255, 0.3); }\n .voxepay-amount { font-size: 1.25rem; font-weight: 600; }\n .voxepay-close { width: 36px; height: 36px; border: none; background: var(--voxepay-surface-hover); border-radius: 50%; cursor: pointer; display: flex; align-items: center; justify-content: center; color: var(--voxepay-text-muted); transition: all var(--voxepay-transition-fast); }\n .voxepay-close:hover { background: var(--voxepay-border); color: var(--voxepay-text); transform: rotate(90deg); }\n .voxepay-close svg { width: 18px; height: 18px; }\n \n .voxepay-body { padding: 24px; background: var(--voxepay-bg); }\n .voxepay-form-group { margin-bottom: 20px; }\n .voxepay-label { display: flex; align-items: center; gap: 8px; font-size: 0.875rem; font-weight: 500; color: var(--voxepay-text-muted); margin-bottom: 8px; }\n .voxepay-label-icon { font-size: 1rem; }\n \n .voxepay-input { width: 100%; padding: 14px 16px; background: var(--voxepay-input-bg); border: 1.5px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); color: var(--voxepay-text); font-size: 1rem; font-family: inherit; outline: none; transition: border-color var(--voxepay-transition-fast), box-shadow var(--voxepay-transition-fast), background var(--voxepay-transition-fast); }\n .voxepay-input::placeholder { color: var(--voxepay-text-subtle); }\n .voxepay-input:hover { border-color: var(--voxepay-text-subtle); }\n .voxepay-input:focus { border-color: var(--voxepay-primary); box-shadow: 0 0 0 4px var(--voxepay-glow); background: var(--voxepay-bg); }\n .voxepay-input.voxepay-error { border-color: var(--voxepay-error); box-shadow: 0 0 0 4px rgba(239, 68, 68, 0.15); }\n \n .voxepay-card-input-wrapper { position: relative; }\n .voxepay-card-brand { position: absolute; right: 14px; top: 50%; transform: translateY(-50%); padding: 4px 8px; display: flex; align-items: center; justify-content: center; background: linear-gradient(135deg, var(--voxepay-primary), var(--voxepay-secondary)); border-radius: 6px; font-size: 0.7rem; font-weight: 700; color: white; opacity: 0; transition: opacity var(--voxepay-transition-fast); letter-spacing: 0.5px; }\n .voxepay-card-input-wrapper .voxepay-input { padding-right: 70px; }\n \n .voxepay-row { display: grid; grid-template-columns: 1fr 1fr; gap: 16px; }\n \n .voxepay-error-message { display: flex; align-items: center; gap: 6px; font-size: 0.813rem; color: var(--voxepay-error); margin-top: 8px; animation: voxepay-shake 0.4s ease; }\n .voxepay-error-message svg { width: 16px; height: 16px; flex-shrink: 0; }\n @keyframes voxepay-shake { 0%, 100% { transform: translateX(0); } 20%, 60% { transform: translateX(-4px); } 40%, 80% { transform: translateX(4px); } }\n \n .voxepay-submit-btn { width: 100%; padding: 16px 24px; background: linear-gradient(135deg, var(--voxepay-primary), var(--voxepay-secondary)); border: none; border-radius: var(--voxepay-border-radius); color: white; font-size: 1.063rem; font-weight: 600; cursor: pointer; display: flex; align-items: center; justify-content: center; gap: 10px; transition: all var(--voxepay-transition-fast); position: relative; overflow: hidden; box-shadow: 0 4px 15px rgba(0, 97, 255, 0.35); }\n .voxepay-submit-btn:hover:not(:disabled) { transform: translateY(-2px); box-shadow: 0 8px 25px rgba(0, 97, 255, 0.45); }\n .voxepay-submit-btn:active:not(:disabled) { transform: translateY(0); }\n .voxepay-submit-btn:disabled { opacity: 0.6; cursor: not-allowed; box-shadow: none; }\n .voxepay-submit-btn span { position: relative; z-index: 1; }\n \n .voxepay-spinner { width: 20px; height: 20px; border: 2.5px solid rgba(255, 255, 255, 0.3); border-top-color: white; border-radius: 50%; animation: voxepay-spin 0.8s linear infinite; }\n @keyframes voxepay-spin { to { transform: rotate(360deg); } }\n \n .voxepay-footer { text-align: center; padding: 16px 24px 20px; border-top: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }\n .voxepay-powered-by { font-size: 0.75rem; color: var(--voxepay-text-subtle); display: flex; align-items: center; justify-content: center; gap: 6px; }\n .voxepay-powered-by svg { width: 14px; height: 14px; color: var(--voxepay-primary); }\n .voxepay-powered-by strong { color: var(--voxepay-primary); font-weight: 600; }\n \n .voxepay-success-view { text-align: center; padding: 40px 24px; }\n .voxepay-success-icon { width: 80px; height: 80px; margin: 0 auto 24px; background: linear-gradient(135deg, var(--voxepay-success), #059669); border-radius: 50%; display: flex; align-items: center; justify-content: center; animation: voxepay-success-pop 0.5s ease; box-shadow: 0 8px 25px rgba(16, 185, 129, 0.35); }\n @keyframes voxepay-success-pop { 0% { transform: scale(0); opacity: 0; } 50% { transform: scale(1.1); } 100% { transform: scale(1); opacity: 1; } }\n .voxepay-success-icon svg { width: 40px; height: 40px; color: white; }\n .voxepay-success-title { font-size: 1.5rem; font-weight: 700; margin-bottom: 8px; color: var(--voxepay-text); }\n .voxepay-success-message { font-size: 1rem; color: var(--voxepay-text-muted); margin-bottom: 24px; }\n .voxepay-success-btn { padding: 12px 32px; background: var(--voxepay-surface); border: 1.5px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); color: var(--voxepay-text); font-size: 1rem; font-weight: 500; cursor: pointer; transition: all var(--voxepay-transition-fast); }\n .voxepay-success-btn:hover { background: var(--voxepay-surface-hover); border-color: var(--voxepay-primary); color: var(--voxepay-primary); }\n \n /* OTP View */\n .voxepay-otp-view { text-align: center; padding: 24px 16px; }\n .voxepay-otp-header { margin-bottom: 24px; }\n .voxepay-otp-icon { font-size: 3rem; margin-bottom: 12px; }\n .voxepay-otp-title { font-size: 1.25rem; font-weight: 700; color: var(--voxepay-text); margin-bottom: 8px; }\n .voxepay-otp-subtitle { font-size: 0.875rem; color: var(--voxepay-text-muted); }\n \n .voxepay-otp-inputs-container { margin-bottom: 16px; }\n .voxepay-otp-inputs { display: flex; justify-content: center; gap: 8px; margin-bottom: 8px; }\n .voxepay-otp-digit { width: 48px; height: 56px; text-align: center; font-size: 1.5rem; font-weight: 700; border: 2px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); background: var(--voxepay-input-bg); color: var(--voxepay-text); outline: none; transition: all var(--voxepay-transition-fast); }\n .voxepay-otp-digit:focus { border-color: var(--voxepay-primary); box-shadow: 0 0 0 4px var(--voxepay-glow); }\n \n .voxepay-otp-timer { font-size: 0.875rem; color: var(--voxepay-text-muted); margin-bottom: 12px; }\n .voxepay-otp-timer span { font-weight: 700; color: var(--voxepay-primary); }\n \n .voxepay-resend-btn { padding: 8px 16px; background: transparent; border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); color: var(--voxepay-text-muted); font-size: 0.875rem; cursor: pointer; margin-bottom: 16px; transition: all var(--voxepay-transition-fast); }\n .voxepay-resend-btn:hover:not(:disabled) { border-color: var(--voxepay-primary); color: var(--voxepay-primary); }\n .voxepay-resend-btn:disabled { opacity: 0.5; cursor: not-allowed; }\n \n .voxepay-back-btn { display: block; width: 100%; padding: 12px; background: transparent; border: none; color: var(--voxepay-text-muted); font-size: 0.875rem; cursor: pointer; margin-top: 12px; transition: color var(--voxepay-transition-fast); }\n .voxepay-back-btn:hover { color: var(--voxepay-primary); }\n\n /* Payment Method Tabs */\n .voxepay-method-tabs { display: flex; border-bottom: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }\n .voxepay-method-tab { flex: 1; display: flex; align-items: center; justify-content: center; gap: 6px; padding: 12px 12px; border: none; background: transparent; color: var(--voxepay-text-muted); font-size: 0.813rem; font-weight: 500; font-family: inherit; cursor: pointer; transition: all var(--voxepay-transition-fast); border-bottom: 2px solid transparent; white-space: nowrap; }\n .voxepay-method-tab svg { width: 16px; height: 16px; flex-shrink: 0; }\n .voxepay-method-tab:hover { color: var(--voxepay-text); background: var(--voxepay-surface-hover); }\n .voxepay-method-tab.active { color: var(--voxepay-primary); border-bottom-color: var(--voxepay-primary); background: var(--voxepay-bg); }\n\n /* Bank Transfer View */\n .voxepay-transfer-view { padding: 4px 0; }\n .voxepay-transfer-loading { display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 48px 0; }\n .voxepay-transfer-instruction { text-align: center; margin-bottom: 20px; font-size: 0.938rem; color: var(--voxepay-text-muted); }\n .voxepay-transfer-instruction strong { color: var(--voxepay-text); font-size: 1.063rem; }\n .voxepay-transfer-details { background: var(--voxepay-surface); border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); overflow: hidden; margin-bottom: 16px; }\n .voxepay-transfer-detail { display: flex; align-items: center; justify-content: space-between; padding: 14px 16px; border-bottom: 1px solid var(--voxepay-border); }\n .voxepay-transfer-detail:last-child { border-bottom: none; }\n .voxepay-transfer-label { font-size: 0.813rem; color: var(--voxepay-text-muted); font-weight: 500; }\n .voxepay-transfer-value { font-size: 0.938rem; font-weight: 600; color: var(--voxepay-text); }\n .voxepay-transfer-value-row { display: flex; align-items: center; gap: 8px; }\n .voxepay-transfer-account { font-size: 1.125rem; font-weight: 700; color: var(--voxepay-primary); letter-spacing: 1.5px; font-family: 'DM Sans', monospace; }\n .voxepay-transfer-amount { color: var(--voxepay-primary); }\n\n /* Copy Button */\n .voxepay-copy-btn { display: flex; align-items: center; justify-content: center; width: 32px; height: 32px; border: 1px solid var(--voxepay-border); border-radius: 8px; background: var(--voxepay-surface-hover); color: var(--voxepay-text-muted); cursor: pointer; transition: all var(--voxepay-transition-fast); flex-shrink: 0; }\n .voxepay-copy-btn svg { width: 16px; height: 16px; }\n .voxepay-copy-btn:hover { border-color: var(--voxepay-primary); color: var(--voxepay-primary); background: rgba(0, 97, 255, 0.1); }\n .voxepay-copy-btn.voxepay-copied { border-color: var(--voxepay-success); color: var(--voxepay-success); background: var(--voxepay-success-bg); }\n\n /* Transfer Timer */\n .voxepay-transfer-timer { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 10px 16px; background: var(--voxepay-surface); border: 1px solid var(--voxepay-border); border-radius: var(--voxepay-border-radius); margin-bottom: 16px; font-size: 0.875rem; color: var(--voxepay-text-muted); }\n .voxepay-transfer-timer svg { width: 16px; height: 16px; color: var(--voxepay-primary); flex-shrink: 0; }\n .voxepay-transfer-timer strong { color: var(--voxepay-primary); font-weight: 700; font-family: monospace; font-size: 0.938rem; }\n \n @media (max-width: 480px) { .voxepay-modal { max-width: 100%; max-height: 100%; border-radius: 0; height: 100%; } .voxepay-body { padding: 20px; } .voxepay-otp-digit { width: 42px; height: 50px; font-size: 1.25rem; } .voxepay-transfer-detail { flex-direction: column; align-items: flex-start; gap: 4px; } }\n "}}class C{constructor(){this.config=null,this.currentModal=null,this.initialized=!1}init(e){e.apiKey?e.organizationId?(this.config={theme:"dark",locale:"en-US",...e},this.initialized=!0,"auto"===e.theme?this.applyAutoTheme():"light"===e.theme&&document.documentElement.classList.add("voxepay-light"),e.customStyles&&this.applyCustomStyles(e.customStyles),console.log("[VoxePay] Initialized successfully")):console.error("[VoxePay] Organization ID is required. Find it in your VoxePay dashboard."):console.error("[VoxePay] API key is required. Get your API key from the VoxePay dashboard: Settings > API Keys")}checkout(e){return this.initialized?!e.amount||e.amount<=0?(console.error("[VoxePay] Invalid amount"),void e.onError({code:"INVALID_AMOUNT",message:"Payment amount must be greater than 0",recoverable:!1})):e.currency?(this.closeModal(),this.currentModal=new M({...e,_sdkConfig:{apiKey:this.config.apiKey,organizationId:this.config.organizationId,baseUrl:this.config.baseUrl},onClose:()=>{var t;this.currentModal=null,null===(t=e.onClose)||void 0===t||t.call(e)}}),void this.currentModal.open()):(console.error("[VoxePay] Currency is required"),void e.onError({code:"INVALID_CURRENCY",message:"Currency code is required",recoverable:!1})):(console.error("[VoxePay] Not initialized. Call VoxePay.init() first."),void e.onError({code:"NOT_INITIALIZED",message:"VoxePay SDK not initialized. Call VoxePay.init() first.",recoverable:!1}))}closeModal(){this.currentModal&&(this.currentModal.close(),this.currentModal=null)}setTheme(e){document.documentElement.classList.remove("voxepay-light"),"light"===e?document.documentElement.classList.add("voxepay-light"):"auto"===e&&this.applyAutoTheme(),this.config&&(this.config.theme=e)}applyAutoTheme(){window.matchMedia("(prefers-color-scheme: dark)").matches||document.documentElement.classList.add("voxepay-light"),window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change",e=>{var t;"auto"===(null===(t=this.config)||void 0===t?void 0:t.theme)&&document.documentElement.classList.toggle("voxepay-light",!e.matches)})}applyCustomStyles(e){const t=document.documentElement;for(const[a,n]of Object.entries(e))n&&t.style.setProperty(a,n)}get version(){return"0.3.0"}get isInitialized(){return this.initialized}}const L=new C;return"undefined"!=typeof window&&(window.VoxePay=L),e.VoxePay=L,e.VoxePaySDK=C,e.cleanPan=m,e.default=L,e.detectCardBrand=a,e.formatAmount=p,e.formatCVV=d,e.formatCardNumber=s,e.formatExpiry=l,e.formatExpiryForApi=x,e.generateAuthData=h,e.getCurrencySymbol=function(e){return{NGN:"₦",USD:"$",EUR:"€",GBP:"£",GHS:"₵",KES:"KSh",ZAR:"R"}[e.toUpperCase()]||e},e.luhnCheck=n,e.validateCVV=i,e.validateCardNumber=o,e.validateExpiry=r,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
2
2
  //# sourceMappingURL=voxepay-checkout.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"voxepay-checkout.min.js","sources":["../src/utils/card-validator.ts","../src/utils/formatter.ts","../src/utils/encryption.ts","../src/api/client.ts","../src/components/modal.ts","../src/voxepay.ts"],"sourcesContent":[null,null,null,null,null,null],"names":["CARD_BRANDS","name","code","pattern","lengths","cvvLength","detectCardBrand","cardNumber","cleaned","replace","brand","test","luhnCheck","sum","isEven","i","length","digit","parseInt","validateCardNumber","valid","error","includes","validateExpiry","expiry","match","month","year","now","Date","currentYear","getFullYear","currentMonth","getMonth","validateCVV","cvv","expectedLength","formatCardNumber","value","join","slice","formatExpiry","formatCVV","formatAmount","amount","currency","Intl","NumberFormat","style","minimumFractionDigits","format","hexToBytes","hex","bytes","push","substring","RSABigInt","constructor","this","data","sign","fromHex","n","bitPos","current","BITS","BASE","trim","fromBytes","map","b","toString","padStart","pop","isZero","bitLength","topWord","bits","w","toBytes","h","padLen","Math","ceil","Array","fill","concat","clone","r","compareAbs","other","multiply","result","carry","j","prod","floor","modPow","exp","mod","Error","base","expBits","wordIdx","bitIdx","m","divmod","remainder","divisor","quotient","cmp","shiftLeft","subtract","qWordIdx","qBitIdx","wordShift","bitShift","max","borrow","diff","RSA_CONFIG","generateAuthData","async","version","pan","pin","expiryDate","messageBytes","str","charCodeAt","toHex","modulus","exponent","keyByteLen","padded","crypto","getRandomValues","arr","Uint8Array","random","pkcs1Pad","encryptedBytes","btoa","String","fromCharCode","Buffer","from","console","formatExpiryForApi","cleanPan","VoxePayApiClient","apiKey","baseUrl","request","endpoint","body","url","response","fetch","method","headers","Accept","JSON","stringify","json","ok","errorMessage","message","status","initiatePayment","validateOTP","resendOTP","ICONS","CARD_BRAND_DISPLAY","visa","mastercard","amex","verve","discover","VoxePayModal","options","container","overlay","apiClient","handleEscape","e","key","close","document","removeEventListener","methods","paymentMethods","_sdkConfig","state","otp","errors","isProcessing","isSuccess","isOtpStep","otpTimer","canResendOtp","otpTimerInterval","paymentMethod","transferTimer","transferTimerInterval","bankTransferDetails","paymentId","transactionId","transactionRef","eciFlag","open","injectStyles","render","attachEventListeners","requestAnimationFrame","_a","classList","add","stopTransferTimer","remove","setTimeout","_c","onClose","getElementById","createElement","id","textContent","getStyles","head","appendChild","className","innerHTML","getModalHTML","querySelector","getPaymentMethods","formattedAmount","showTabs","isCard","description","getCardFormHTML","getBankTransferHTML","details","accountNumber","bankName","accountName","reference","formatCountdown","expiresIn","seconds","s","renderSuccessView","formContainer","closeBtn","addEventListener","renderOTPView","maskedPhone","customerEmail","attachOTPEventListeners","startOTPTimer","otpInputs","querySelectorAll","forEach","input","index","handleOTPInput","handleOTPKeydown","handleOTPPaste","verifyBtn","_b","handleOTPSubmit","resendBtn","handleResendOTP","backBtn","_d","handleBackToCard","_e","focus","target","nextInput","updateOTPState","clearError","prevInput","preventDefault","pastedData","clipboardData","getData","inputs","split","timerEl","timerContainer","window","setInterval","clearInterval","display","disabled","setOTPProcessing","verifyOTP","processPayment","onSuccess","paymentError","showError","recoverable","undefined","organizationId","cardInput","expiryInput","cvvInput","tabs","tab","dataset","switchPaymentMethod","handleCardInput","validateField","handleExpiryInput","_f","handleCVVInput","form","_g","handleSubmit","attachBankTransferListeners","startTransferTimer","loadBankTransferDetails","copyBtn","accountNum","copy","copyToClipboard","confirmBtn","handleTransferConfirm","onBankTransferRequested","Promise","resolve","toUpperCase","onError","text","navigator","clipboard","writeText","textarea","position","opacity","select","execCommand","removeChild","timestamp","toISOString","countdownEl","formatted","brandEl","field","errorEl","inputEl","isCardValid","isExpiryValid","isCVVValid","setProcessing","authData","customerPhone","narration","submitBtn","VoxePaySDK","config","currentModal","initialized","init","theme","locale","applyAutoTheme","documentElement","customStyles","applyCustomStyles","log","checkout","closeModal","call","setTheme","matchMedia","matches","toggle","styles","root","Object","entries","setProperty","isInitialized","VoxePay","NGN","USD","EUR","GBP","GHS","KES","ZAR"],"mappings":"qCAYO,MAAMA,EAA2B,CACpC,CACIC,KAAM,OACNC,KAAM,OACNC,QAAS,KACTC,QAAS,CAAC,GAAI,GAAI,IAClBC,UAAW,GAEf,CACIJ,KAAM,aACNC,KAAM,aACNC,QAAS,mBACTC,QAAS,CAAC,IACVC,UAAW,GAEf,CACIJ,KAAM,QACNC,KAAM,QACNC,QAAS,4BACTC,QAAS,CAAC,GAAI,GAAI,IAClBC,UAAW,GAEf,CACIJ,KAAM,mBACNC,KAAM,OACNC,QAAS,SACTC,QAAS,CAAC,IACVC,UAAW,GAEf,CACIJ,KAAM,WACNC,KAAM,WACNC,QAAS,qBACTC,QAAS,CAAC,GAAI,IACdC,UAAW,IAOb,SAAUC,EAAgBC,GAC5B,MAAMC,EAAUD,EAAWE,QAAQ,MAAO,IAC1C,IAAK,MAAMC,KAASV,EAChB,GAAIU,EAAMP,QAAQQ,KAAKH,GACnB,OAAOE,EAGf,OAAO,IACX,CAKM,SAAUE,EAAUL,GACtB,MAAMC,EAAUD,EAAWE,QAAQ,MAAO,IAC1C,IAAK,QAAQE,KAAKH,GAAU,OAAO,EAEnC,IAAIK,EAAM,EACNC,GAAS,EAEb,IAAK,IAAIC,EAAIP,EAAQQ,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAC1C,IAAIE,EAAQC,SAASV,EAAQO,GAAI,IAE7BD,IACAG,GAAS,EACLA,EAAQ,IACRA,GAAS,IAIjBJ,GAAOI,EACPH,GAAUA,CACd,CAEA,OAAOD,EAAM,IAAO,CACxB,CAKM,SAAUM,EAAmBZ,GAC/B,MAAMC,EAAUD,EAAWE,QAAQ,MAAO,IAE1C,IAAKD,EACD,MAAO,CAAEY,OAAO,EAAOC,MAAO,2BAGlC,IAAK,QAAQV,KAAKH,GACd,MAAO,CAAEY,OAAO,EAAOC,MAAO,uBAGlC,MAAMX,EAAQJ,EAAgBE,GAE9B,OAAKE,EAIAA,EAAMN,QAAQkB,SAASd,EAAQQ,QAI/BJ,EAAUJ,GAIR,CAAEY,OAAO,GAHL,CAAEA,OAAO,EAAOC,MAAO,uBAJvB,CAAED,OAAO,EAAOC,MAAO,8BAJvB,CAAED,OAAO,EAAOC,MAAO,wBAYtC,CAKM,SAAUE,EAAeC,GAC3B,MAAMhB,EAAUgB,EAAOf,QAAQ,MAAO,IAEtC,IAAKD,EACD,MAAO,CAAEY,OAAO,EAAOC,MAAO,2BAGlC,MAAMI,EAAQjB,EAAQiB,MAAM,sBAC5B,IAAKA,EACD,MAAO,CAAEL,OAAO,EAAOC,MAAO,0BAGlC,MAAMK,EAAQR,SAASO,EAAM,GAAI,IAC3BE,EAAOT,SAASO,EAAM,GAAI,IAAM,IAEtC,GAAIC,EAAQ,GAAKA,EAAQ,GACrB,MAAO,CAAEN,OAAO,EAAOC,MAAO,iBAGlC,MAAMO,EAAM,IAAIC,KACVC,EAAcF,EAAIG,cAClBC,EAAeJ,EAAIK,WAAa,EAEtC,OAAIN,EAAOG,GAAgBH,IAASG,GAAeJ,EAAQM,EAChD,CAAEZ,OAAO,EAAOC,MAAO,oBAG9BM,EAAOG,EAAc,GACd,CAAEV,OAAO,EAAOC,MAAO,uBAG3B,CAAED,OAAO,EACpB,CAKM,SAAUc,EAAYC,EAAa5B,GACrC,MAAMC,EAAU2B,EAAI1B,QAAQ,MAAO,IAEnC,IAAKD,EACD,MAAO,CAAEY,OAAO,EAAOC,MAAO,mBAGlC,IAAK,QAAQV,KAAKH,GACd,MAAO,CAAEY,OAAO,EAAOC,MAAO,eAGlC,MAAMX,EAAQH,EAAaD,EAAgBC,GAAc,KACnD6B,GAAiB1B,aAAK,EAALA,EAAOL,YAAa,EAE3C,OAAIG,EAAQQ,SAAWoB,GAAqC,IAAnB5B,EAAQQ,QAAmC,IAAnBR,EAAQQ,OAC9D,CAAEI,OAAO,EAAOC,MAAO,eAAee,YAG1C,CAAEhB,OAAO,EACpB,CC7KM,SAAUiB,EAAiBC,GAG7B,OAFgBA,EAAM7B,QAAQ,MAAO,IACdgB,MAAM,YAAc,IAC7Bc,KAAK,KAAKC,MAAM,EAAG,GACrC,CAKM,SAAUC,EAAaH,GACzB,MAAM9B,EAAU8B,EAAM7B,QAAQ,MAAO,IAErC,GAAuB,IAAnBD,EAAQQ,OAAc,MAAO,GACjC,GAAuB,IAAnBR,EAAQQ,OACR,OAAOE,SAASV,GAAW,EAAI,IAAIA,IAAYA,EAEnD,GAAuB,IAAnBA,EAAQQ,OAAc,CACtB,MAAMU,EAAQR,SAASV,GACvB,OAAIkB,EAAQ,GAAW,KACT,IAAVA,EAAoB,KACjBlB,CACX,CAIA,MAAO,GAFOA,EAAQgC,MAAM,EAAG,MAClBhC,EAAQgC,MAAM,EAAG,IAElC,CAKM,SAAUE,EAAUJ,GACtB,OAAOA,EAAM7B,QAAQ,MAAO,IAAI+B,MAAM,EAAG,EAC7C,CAKM,SAAUG,EAAaC,EAAgBC,GAQzC,OAPkB,IAAIC,KAAKC,aAAa,QAAS,CAC7CC,MAAO,WACPH,SAAUA,EACVI,sBAAuB,IAIVC,OAAON,EAAS,IACrC,CCSA,MAWMO,EAAcC,IAChB,MAAMC,EAAkB,GACxB,IAAK,IAAItC,EAAI,EAAGA,EAAIqC,EAAIpC,OAAQD,GAAK,EACjCsC,EAAMC,KAAKpC,SAASkC,EAAIG,UAAUxC,EAAGA,EAAI,GAAI,KAEjD,OAAOsC,GAoBX,MAAMG,EAOF,WAAAC,GACIC,KAAKC,KAAO,GACZD,KAAKE,KAAO,CAChB,CAEA,cAAOC,CAAQT,GACX,MAAMU,EAAI,IAAIN,EACd,GAAmB,IAAfJ,EAAIpC,OAAc,OAAO8C,EAE7BA,EAAEF,KAAO,EAIT,IAAIG,EAAS,EACTC,EAAU,EAEd,IAAK,IAAIjD,EAAIqC,EAAIpC,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAEtCiD,GADe9C,SAASkC,EAAIrC,GAAI,KACXgD,EACrBA,GAAU,EACNA,GAAUP,EAAUS,OACpBH,EAAEH,KAAKL,KAAKU,EAAWR,EAAUU,KAAO,GACxCF,KAAsBR,EAAUS,KAChCF,GAAUP,EAAUS,KAE5B,CAMA,OALID,EAAU,GAAKD,EAAS,IACxBD,EAAEH,KAAKL,KAAKU,GAGhBF,EAAEK,OACKL,CACX,CAEA,gBAAOM,CAAUf,GACb,MAAMD,EAAMC,EAAMgB,IAAIC,GAAKA,EAAEC,SAAS,IAAIC,SAAS,EAAG,MAAMjC,KAAK,IACjE,OAAOiB,EAAUK,QAAQT,EAC7B,CAEA,IAAAe,GACI,KAAOT,KAAKC,KAAK3C,OAAS,GAAyC,IAApC0C,KAAKC,KAAKD,KAAKC,KAAK3C,OAAS,IACxD0C,KAAKC,KAAKc,MAEW,IAArBf,KAAKC,KAAK3C,SAAc0C,KAAKE,KAAO,EAC5C,CAEA,MAAAc,GACI,OAA4B,IAArBhB,KAAKC,KAAK3C,MACrB,CAEA,SAAA2D,GACI,GAAyB,IAArBjB,KAAKC,KAAK3C,OAAc,OAAO,EACnC,MAAM4D,EAAUlB,KAAKC,KAAKD,KAAKC,KAAK3C,OAAS,GAC7C,IAAI6D,GAAQnB,KAAKC,KAAK3C,OAAS,GAAKwC,EAAUS,KAC1Ca,EAAIF,EACR,KAAOE,EAAI,GACPD,IACAC,KAAO,EAEX,OAAOD,CACX,CAEA,OAAAE,CAAQ/D,GAEJ,IAAIoC,EAAM,GACV,IAAK,IAAIrC,EAAI2C,KAAKC,KAAK3C,OAAS,EAAGD,GAAK,EAAGA,IAAK,CAC5C,MAAMiE,EAAItB,KAAKC,KAAK5C,GAAGwD,SAAS,IAChC,GAAIxD,IAAM2C,KAAKC,KAAK3C,OAAS,EACzBoC,GAAO4B,MACJ,CAEH,MAAMC,EAASC,KAAKC,KAAK3B,EAAUS,KAAO,GAC1Cb,GAAO4B,EAAER,SAASS,EAAQ,IAC9B,CACJ,CAEI7B,EAAIpC,OAAS,GAAM,IAAGoC,EAAM,IAAMA,GAEtC,MAAMC,EAAQF,EAAWC,GAEzB,GAAIpC,GAAUqC,EAAMrC,OAASA,EAAQ,CAGjC,OADe,IAAIoE,MAAMpE,EAASqC,EAAMrC,QAAQqE,KAAK,GACvCC,OAAOjC,EACzB,CACA,OAAOA,CACX,CAEA,KAAAkC,GACI,MAAMC,EAAI,IAAIhC,EAGd,OAFAgC,EAAE7B,KAAOD,KAAKC,KAAKnB,QACnBgD,EAAE5B,KAAOF,KAAKE,KACP4B,CACX,CAKA,UAAAC,CAAWC,GACP,GAAIhC,KAAKC,KAAK3C,SAAW0E,EAAM/B,KAAK3C,OAChC,OAAO0C,KAAKC,KAAK3C,OAAS0E,EAAM/B,KAAK3C,OAAS,GAAI,EAEtD,IAAK,IAAID,EAAI2C,KAAKC,KAAK3C,OAAS,EAAGD,GAAK,EAAGA,IACvC,GAAI2C,KAAKC,KAAK5C,KAAO2E,EAAM/B,KAAK5C,GAC5B,OAAO2C,KAAKC,KAAK5C,GAAK2E,EAAM/B,KAAK5C,GAAK,GAAI,EAGlD,OAAO,CACX,CAKA,QAAA4E,CAASD,GACL,GAAIhC,KAAKgB,UAAYgB,EAAMhB,SAAU,OAAO,IAAIlB,EAEhD,MAAMoC,EAAS,IAAIpC,EACnBoC,EAAOjC,KAAO,IAAIyB,MAAM1B,KAAKC,KAAK3C,OAAS0E,EAAM/B,KAAK3C,QAAQqE,KAAK,GACnEO,EAAOhC,KAAO,EAEd,IAAK,IAAI7C,EAAI,EAAGA,EAAI2C,KAAKC,KAAK3C,OAAQD,IAAK,CACvC,IAAI8E,EAAQ,EACZ,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAM/B,KAAK3C,OAAQ8E,IAAK,CACxC,MAAMC,EAAOrC,KAAKC,KAAK5C,GAAK2E,EAAM/B,KAAKmC,GAAKF,EAAOjC,KAAK5C,EAAI+E,GAAKD,EACjED,EAAOjC,KAAK5C,EAAI+E,GAAKC,EAAQvC,EAAUU,KAAO,EAC9C2B,EAAQX,KAAKc,MAAMD,EAAOvC,EAAUU,KACxC,CACI2B,EAAQ,IACRD,EAAOjC,KAAK5C,EAAI2E,EAAM/B,KAAK3C,SAAW6E,EAE9C,CAGA,OADAD,EAAOzB,OACAyB,CACX,CAMA,MAAAK,CAAOC,EAAgBC,GACnB,GAAIA,EAAIzB,SAAU,MAAM,IAAI0B,MAAM,oBAElC,IAAIR,EAASpC,EAAUK,QAAQ,KAC3BwC,EAAO3C,KAAKyC,IAAIA,GACpB,MAAMG,EAAUJ,EAAIvB,YAEpB,IAAK,IAAI5D,EAAI,EAAGA,EAAIuF,EAASvF,IAAK,CAC9B,MAAMwF,EAAUrB,KAAKc,MAAMjF,EAAIyC,EAAUS,MACnCuC,EAASzF,EAAIyC,EAAUS,KAEzBsC,EAAUL,EAAIvC,KAAK3C,QAAWkF,EAAIvC,KAAK4C,GAAY,GAAKC,IACxDZ,EAASA,EAAOD,SAASU,GAAMF,IAAIA,IAEvCE,EAAOA,EAAKV,SAASU,GAAMF,IAAIA,EACnC,CAEA,OAAOP,CACX,CAKA,GAAAO,CAAIM,GAEA,OADe/C,KAAKgD,OAAOD,GACbE,SAClB,CAKA,MAAAD,CAAOE,GACH,GAAIA,EAAQlC,SAAU,MAAM,IAAI0B,MAAM,oBACtC,GAAI1C,KAAKgB,SAAU,MAAO,CAAEmC,SAAU,IAAIrD,EAAamD,UAAW,IAAInD,GAEtE,MAAMsD,EAAMpD,KAAK+B,WAAWmB,GAC5B,GAAIE,EAAM,EAAG,MAAO,CAAED,SAAU,IAAIrD,EAAamD,UAAWjD,KAAK6B,SACjE,GAAY,IAARuB,EAAW,CAEX,MAAO,CAAED,SADGrD,EAAUK,QAAQ,KACN8C,UAAW,IAAInD,EAC3C,CAGA,MAAMqD,EAAW,IAAIrD,EACrBqD,EAASlD,KAAO,IAAIyB,MAAM1B,KAAKC,KAAK3C,QAAQqE,KAAK,GACjDwB,EAASjD,KAAO,EAEhB,IAAI+C,EAAY,IAAInD,EAIpB,IAAK,IAAIzC,EAFS2C,KAAKiB,YAEE,EAAG5D,GAAK,EAAGA,IAAK,CAErC4F,EAAYA,EAAUI,UAAU,GAGhC,MAAMR,EAAUrB,KAAKc,MAAMjF,EAAIyC,EAAUS,MACnCuC,EAASzF,EAAIyC,EAAUS,KAQ7B,GAPIsC,EAAU7C,KAAKC,KAAK3C,QAAW0C,KAAKC,KAAK4C,GAAY,GAAKC,IAC5B,IAA1BG,EAAUhD,KAAK3C,QAAc2F,EAAUhD,KAAKL,KAAK,GACrDqD,EAAUhD,KAAK,IAAM,EACrBgD,EAAU/C,KAAO,GAIjB+C,EAAUlB,WAAWmB,IAAY,EAAG,CACpCD,EAAYA,EAAUK,SAASJ,GAC/B,MAAMK,EAAW/B,KAAKc,MAAMjF,EAAIyC,EAAUS,MACpCiD,EAAUnG,EAAIyC,EAAUS,KAC9B,KAAO4C,EAASlD,KAAK3C,QAAUiG,GAAUJ,EAASlD,KAAKL,KAAK,GAC5DuD,EAASlD,KAAKsD,IAAc,GAAKC,CACrC,CACJ,CAIA,OAFAL,EAAS1C,OACTwC,EAAUxC,OACH,CAAE0C,WAAUF,YACvB,CAKA,SAAAI,CAAUjD,GACN,GAAIJ,KAAKgB,UAAkB,IAANZ,EAAS,OAAOJ,KAAK6B,QAE1C,MAAM4B,EAAYjC,KAAKc,MAAMlC,EAAIN,EAAUS,MACrCmD,EAAWtD,EAAIN,EAAUS,KAEzB2B,EAAS,IAAIpC,EACnBoC,EAAOhC,KAAOF,KAAKE,KACnBgC,EAAOjC,KAAO,IAAIyB,MAAM1B,KAAKC,KAAK3C,OAASmG,EAAY,GAAG9B,KAAK,GAE/D,IAAK,IAAItE,EAAI,EAAGA,EAAI2C,KAAKC,KAAK3C,OAAQD,IAClC6E,EAAOjC,KAAK5C,EAAIoG,IAAezD,KAAKC,KAAK5C,IAAMqG,EAAa5D,EAAUU,KAAO,EACzEkD,EAAW,IACXxB,EAAOjC,KAAK5C,EAAIoG,EAAY,IAAMzD,KAAKC,KAAK5C,KAAQyC,EAAUS,KAAOmD,GAK7E,OADAxB,EAAOzB,OACAyB,CACX,CAKA,QAAAoB,CAAStB,GACL,MAAME,EAAS,IAAIpC,EACnBoC,EAAOhC,KAAO,EACdgC,EAAOjC,KAAO,IAAIyB,MAAMF,KAAKmC,IAAI3D,KAAKC,KAAK3C,OAAQ0E,EAAM/B,KAAK3C,SAASqE,KAAK,GAE5E,IAAIiC,EAAS,EACb,IAAK,IAAIvG,EAAI,EAAGA,EAAI6E,EAAOjC,KAAK3C,OAAQD,IAAK,CACzC,IAAIwG,GAAQ7D,KAAKC,KAAK5C,IAAM,IAAM2E,EAAM/B,KAAK5C,IAAM,GAAKuG,EACpDC,EAAO,GACPA,GAAQ/D,EAAUU,KAClBoD,EAAS,GAETA,EAAS,EAEb1B,EAAOjC,KAAK5C,GAAKwG,CACrB,CAGA,OADA3B,EAAOzB,OACAyB,CACX,EA/QOpC,EAAAU,KAAO,SACPV,EAAAS,KAAO,GAsRlB,MAsCMuD,EAEE,qgBAFFA,EAGc,SAoBPC,EAAmBC,OAC5BC,UACAC,MACAC,MACAC,aACA3F,UAEA,IAEI,MACM4F,EAAe5E,EAnYf,CAAC6E,IACX,IAAI5E,EAAM,GACV,IAAK,IAAIrC,EAAI,EAAGA,EAAIiH,EAAIhH,OAAQD,IAC5BqC,GAAO4E,EAAIC,WAAWlH,GAAGwD,SAAS,IAAIC,SAAS,EAAG,KAEtD,OAAOpB,GA8X6B8E,CADT,GAAGP,KAAWC,KAAOC,KAAOC,KAAc3F,MAI3DgG,EAAU3E,EAAUK,QAAQ2D,GAC5BY,EAAW5E,EAAUK,QAAQ2D,GAG7Ba,EAAanD,KAAKC,KAAKgD,EAAQxD,YAAc,GAG7C2D,EAjFG,EAAC3E,EAAgB0E,KAC9B,GAAI1E,EAAK3C,OAASqH,EAAa,GAC3B,MAAM,IAAIjC,MAAM,uCAGpB,MAAMnB,EAASoD,EAAa1E,EAAK3C,OAAS,EACpCsH,EAAS,IAAIlD,MAAMiD,GACzBC,EAAO,GAAK,EACZA,EAAO,GAAK,EAGZ,IAAK,IAAIvH,EAAI,EAAGA,EAAIkE,EAAQlE,IAAK,CAE7B,IAAIyE,EAAI,EACR,GAAsB,oBAAX+C,QAA0BA,OAAOC,gBAAiB,CACzD,MAAMC,EAAM,IAAIC,WAAW,GAC3B,KAAa,IAANlD,GACH+C,OAAOC,gBAAgBC,GACvBjD,EAAIiD,EAAI,EAEhB,MACI,KAAa,IAANjD,GACHA,EAAIN,KAAKc,MAAsB,IAAhBd,KAAKyD,UAAkB,EAG9CL,EAAO,EAAIvH,GAAKyE,CACpB,CAEA8C,EAAO,EAAIrD,GAAU,EACrB,IAAK,IAAIlE,EAAI,EAAGA,EAAI4C,EAAK3C,OAAQD,IAC7BuH,EAAO,EAAIrD,EAASlE,GAAK4C,EAAK5C,GAGlC,OAAOuH,GAgDYM,CAASb,EAAcM,GAGhC5B,EAAIjD,EAAUY,UAAUkE,GAMxBO,EAHIpC,EAAER,OAAOmC,EAAUD,GAGJpD,QAAQsD,GAGjC,OAnYehF,EAmYMwF,EAlYL,oBAATC,KAEAA,KAAKC,OAAOC,gBAAgB3F,IAGhC4F,OAAOC,KAAK7F,GAAOkB,SAAS,SA8XnC,CAAE,MAAOlD,GAEL,MADA8H,QAAQ9H,MAAM,8BAA+BA,GACvC,IAAI+E,MAAM,8BACpB,CAvYkB,IAAC/C,GA6YV+F,EAAsB5H,IAC/B,MAAMhB,EAAUgB,EAAOf,QAAQ,SAAU,IACzC,GAAuB,IAAnBD,EAAQQ,OAAc,MAAO,GACjC,MAAMU,EAAQlB,EAAQ+C,UAAU,EAAG,GAEnC,MAAO,GADM/C,EAAQ+C,UAAU,EAAG,KACjB7B,KAMR2H,EAAYzB,GACdA,EAAInH,QAAQ,MAAO,UCzbjB6I,EAIT,WAAA7F,CAAY8F,EAAgBC,GACxB9F,KAAK6F,OAASA,EACd7F,KAAK8F,QAAUA,GAtDE,4BAuDrB,CAEQ,aAAMC,CAAWC,EAAkBC,GACvC,MAAMC,EAAM,GAAGlG,KAAK8F,UAAUE,IAExBG,QAAiBC,MAAMF,EAAK,CAC9BG,OAAQ,OACRC,QAAS,CACL,eAAgB,mBAChB,YAAatG,KAAK6F,OAClBU,OAAU,oBAEdN,KAAMO,KAAKC,UAAUR,KAGnBhG,QAAakG,EAASO,OAE5B,IAAKP,EAASQ,GAAI,CACd,MAAMC,GAAe3G,aAAI,EAAJA,EAAM4G,WAAW5G,aAAI,EAAJA,EAAMtC,QAAS,8BAA8BwI,EAASW,SACtFnJ,EAAa,IAAI+E,MAAMkE,GAI7B,MAHAjJ,EAAMnB,MAAOyD,eAAAA,EAAMzD,OAAQ,QAAQ2J,EAASW,SAC5CnJ,EAAMmJ,OAASX,EAASW,OACxBnJ,EAAMsC,KAAOA,EACPtC,CACV,CAEA,OAAOsC,CACX,CAKA,qBAAM8G,CAAgB9G,GAClB,OAAOD,KAAK+F,QAAiC,4BAA6B9F,EAC9E,CAKA,iBAAM+G,CAAY/G,GACd,OAAOD,KAAK+F,QAA6B,gCAAiC9F,EAC9E,CAKA,eAAMgH,CAAUhH,SACND,KAAK+F,QAAiB,8BAA+B9F,EAC/D,ECtFJ,MAAMiH,EACG,kNADHA,EAIE,kSAJFA,EAOG,4MAPHA,EAUG,qZAVHA,EAaE,mTAbFA,EAgBE,kQAhBFA,EAmBE,oRAnBFA,EAsBG,yOAMHC,EAA6C,CACjDC,KAAM,OACNC,WAAY,KACZC,KAAM,OACNC,MAAO,QACPC,SAAU,cA+BCC,EAOX,WAAA1H,CAAY2H,GAJJ1H,KAAA2H,UAAmC,KACnC3H,KAAA4H,QAAiC,KACjC5H,KAAA6H,UAAqC,KA+xBrC7H,KAAA8H,aAAgBC,IACR,WAAVA,EAAEC,MACJhI,KAAKiI,QACLC,SAASC,oBAAoB,UAAWnI,KAAK8H,gBA/xB/C9H,KAAK0H,QAAUA,EACf,MAAMU,EAAUV,EAAQW,gBAAkB,CAAC,OAAQ,iBAG/CX,EAAQY,aACVtI,KAAK6H,UAAY,IAAIjC,EACnB8B,EAAQY,WAAWzC,OACnB6B,EAAQY,WAAWxC,UAIvB9F,KAAKuI,MAAQ,CACX1L,WAAY,GACZiB,OAAQ,GACRW,IAAK,GACL+J,IAAK,GACLC,OAAQ,CAAA,EACRC,cAAc,EACdC,WAAW,EACXC,WAAW,EACXC,SAAU,GACVC,cAAc,EACdC,iBAAkB,KAClBC,cAAeZ,EAAQ,GACvBa,cAAe,EACfC,sBAAuB,KACvBC,oBAAqBzB,EAAQyB,qBAAuB,KACpDC,UAAW,KACXC,cAAe,KACfC,eAAgB,KAChBC,QAAS,KAEb,CAKA,IAAAC,GACExJ,KAAKyJ,eACLzJ,KAAK0J,SACL1J,KAAK2J,uBAGLC,sBAAsB,WACR,QAAZC,EAAA7J,KAAK4H,mBAAOiC,GAAAA,EAAEC,UAAUC,IAAI,oBAEhC,CAKA,KAAA9B,SACEjI,KAAKgK,oBACO,QAAZH,EAAA7J,KAAK4H,mBAAOiC,GAAAA,EAAEC,UAAUG,OAAO,mBAE/BC,WAAW,eACK,QAAdL,EAAA7J,KAAK2H,qBAASkC,GAAAA,EAAEI,SAChBjK,KAAK2H,UAAY,KACjB3H,KAAK4H,QAAU,aACfuC,KAAAnK,KAAK0H,SAAQ0C,iCACZ,IACL,CAKQ,YAAAX,GACN,GAAIvB,SAASmC,eAAe,2BAA4B,OAExD,MAAM/K,EAAQ4I,SAASoC,cAAc,SACrChL,EAAMiL,GAAK,0BACXjL,EAAMkL,YAAcxK,KAAKyK,YACzBvC,SAASwC,KAAKC,YAAYrL,EAC5B,CAKQ,MAAAoK,GACN1J,KAAK2H,UAAYO,SAASoC,cAAc,OACxCtK,KAAK2H,UAAUiD,UAAY,mBAC3B5K,KAAK2H,UAAUkD,UAAY7K,KAAK8K,eAChC5C,SAASjC,KAAK0E,YAAY3K,KAAK2H,WAE/B3H,KAAK4H,QAAU5H,KAAK2H,UAAUoD,cAAc,mBAC9C,CAKQ,iBAAAC,GACN,OAAOhL,KAAK0H,QAAQW,gBAAkB,CAAC,OAAQ,gBACjD,CAKQ,YAAAyC,GACN,MAAMG,EAAkBhM,EAAae,KAAK0H,QAAQxI,OAAQc,KAAK0H,QAAQvI,UACjEiJ,EAAUpI,KAAKgL,oBACfE,EAAW9C,EAAQ9K,OAAS,EAC5B6N,EAAsC,SAA7BnL,KAAKuI,MAAMS,cAE1B,MAAO,+WAO0DiC,4BACnDjL,KAAK0H,QAAQ0D,YAAc,uEAAuEpL,KAAK0H,QAAQ0D,oBAAsB,kJAIvIlE,2DAIJgE,EAAW,8DAET9C,EAAQxK,SAAS,QAAU,mDACOuN,EAAS,SAAW,0CACpDjE,6CACS,mBACXkB,EAAQxK,SAAS,iBAAmB,mDACDuN,EAAoB,GAAX,yDAC1CjE,sDACS,uBACL,iGAGNiE,EAASnL,KAAKqL,gBAAgBJ,GAAmBjL,KAAKsL,oBAAoBL,yIAKxE/D,6IAOd,CAKQ,eAAAmE,CAAgBJ,GACtB,MAAO,wtDA+BeA,kDAIxB,CAKQ,mBAAAK,CAAoBL,GAC1B,MAAMM,EAAUvL,KAAKuI,MAAMY,oBAE3B,OAAKoC,EAWE,kIAGqBN,iYAO0EM,EAAQC,yGAChCD,EAAQC,iDACxEtE,4OAOiCqE,EAAQE,gNAKRF,EAAQG,qOAKgBT,2PAK6BM,EAAQI,6IAKpGzE,iFACiElH,KAAK4L,gBAAgBL,EAAQM,2NAlD7F,0SA0DX,CAKQ,eAAAD,CAAgBE,GACtB,MAAM/I,EAAIvB,KAAKc,MAAMwJ,EAAU,IACzBC,EAAID,EAAU,GACpB,MAAO,GAAGzG,OAAOtC,GAAGjC,SAAS,EAAG,QAAQuE,OAAO0G,GAAGjL,SAAS,EAAG,MAChE,CAKQ,iBAAAkL,SACN,MAAMC,EAA8B,QAAdpC,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,2BACpD,IAAKkB,EAAe,OAEpB,MAAMhB,EAAkBhM,EAAae,KAAK0H,QAAQxI,OAAQc,KAAK0H,QAAQvI,UAEvE8M,EAAcpB,UAAY,qGAGlB3D,qJAGiD+D,+HAMzD,MAAMiB,EAAWD,EAAclB,cAAc,yBAC7CmB,SAAAA,EAAUC,iBAAiB,QAAS,IAAMnM,KAAKiI,QACjD,CAKQ,aAAAmE,SACN,MAAMH,EAA8B,QAAdpC,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,2BACpD,IAAKkB,EAAe,OAEpBjM,KAAKuI,MAAMK,WAAY,EACvB5I,KAAKuI,MAAMM,SAAW,GACtB7I,KAAKuI,MAAMO,cAAe,EAE1B,MAAMuD,EAAcrM,KAAK0H,QAAQ4E,cAC7B,OAAOtM,KAAK0H,QAAQ4E,cAAcxN,OAAM,KACxC,WAEJmN,EAAcpB,UAAY,gRAK2CwB,uhDAiCrErM,KAAKuM,0BACLvM,KAAKwM,eACP,CAKQ,uBAAAD,iBACN,MAAME,EAA0B,QAAd5C,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAE6C,iBAAiB,sBAEnDD,SAAAA,EAAWE,QAAQ,CAACC,EAAOC,KACzBD,EAAMT,iBAAiB,QAAUpE,GAAM/H,KAAK8M,eAAe/E,EAAG8E,IAC9DD,EAAMT,iBAAiB,UAAYpE,GAAM/H,KAAK+M,iBAAiBhF,EAAG8E,IAClED,EAAMT,iBAAiB,QAAUpE,GAAM/H,KAAKgN,eAAejF,MAG7D,MAAMkF,EAA0B,QAAdC,EAAAlN,KAAK2H,iBAAS,IAAAuF,OAAA,EAAAA,EAAEnC,cAAc,uBAChDkC,SAAAA,EAAWd,iBAAiB,QAAS,IAAMnM,KAAKmN,mBAEhD,MAAMC,EAA0B,QAAdjD,EAAAnK,KAAK2H,iBAAS,IAAAwC,OAAA,EAAAA,EAAEY,cAAc,uBAChDqC,SAAAA,EAAWjB,iBAAiB,QAAS,IAAMnM,KAAKqN,mBAEhD,MAAMC,EAAwB,QAAdC,EAAAvN,KAAK2H,iBAAS,IAAA4F,OAAA,EAAAA,EAAExC,cAAc,yBAC9CuC,SAAAA,EAASnB,iBAAiB,QAAS,IAAMnM,KAAKwN,oBAEV,QAApCC,EAAChB,aAAS,EAATA,EAAY,UAAuB,IAAAgB,GAAAA,EAAEC,OACxC,CAEQ,cAAAZ,CAAe/E,EAAU8E,SAC/B,MAAMD,EAAQ7E,EAAE4F,OACV/O,EAAQgO,EAAMhO,MAAM7B,QAAQ,MAAO,IAGzC,GAFA6P,EAAMhO,MAAQA,EAEVA,GAASiO,EAAQ,EAAG,CACtB,MAAMe,EAA0B,QAAd/D,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,gBAAgB8B,EAAQ,OACxEe,SAAAA,EAAWF,OACb,CAEA1N,KAAK6N,iBACL7N,KAAK8N,WAAW,MAClB,CAEQ,gBAAAf,CAAiBhF,EAAkB8E,SACzC,MAAMD,EAAQ7E,EAAE4F,OAEhB,GAAc,cAAV5F,EAAEC,MAAwB4E,EAAMhO,OAASiO,EAAQ,EAAG,CACtD,MAAMkB,EAA0B,QAAdlE,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,gBAAgB8B,EAAQ,OACxEkB,SAAAA,EAAWL,OACb,CACF,CAEQ,cAAAV,CAAejF,WACrBA,EAAEiG,iBACF,MAAMC,EAA4B,QAAfpE,EAAA9B,EAAEmG,qBAAa,IAAArE,OAAA,EAAAA,EAAEsE,QAAQ,QAAQpR,QAAQ,MAAO,IAAI+B,MAAM,EAAG,GAEhF,GAAImP,EAAY,CACd,MAAMG,EAAuB,QAAdlB,EAAAlN,KAAK2H,iBAAS,IAAAuF,OAAA,EAAAA,EAAER,iBAAiB,sBAChDuB,EAAWI,MAAM,IAAI1B,QAAQ,CAACpP,EAAOF,KAC/B+Q,EAAO/Q,KACT+Q,EAAO/Q,GAAGuB,MAAQrB,KAGtByC,KAAK6N,gBACP,CACF,CAEQ,cAAAA,SACN,MAAMO,EAAuB,QAAdvE,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAE6C,iBAAiB,sBAChD,IAAIlE,EAAM,GACV4F,SAAAA,EAAQzB,QAAQC,GAASpE,GAAOoE,EAAMhO,OACtCoB,KAAKuI,MAAMC,IAAMA,CACnB,CAEQ,aAAAgE,aACN,MAAM8B,EAAwB,QAAdzE,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,wBACxCwD,EAA+B,QAAdrB,EAAAlN,KAAK2H,iBAAS,IAAAuF,OAAA,EAAAA,EAAEnC,cAAc,sBAC/CqC,EAA0B,QAAdjD,EAAAnK,KAAK2H,iBAAS,IAAAwC,OAAA,EAAAA,EAAEY,cAAc,uBAEhD/K,KAAKuI,MAAMQ,iBAAmByF,OAAOC,YAAY,KAC/CzO,KAAKuI,MAAMM,WAEPyF,IACFA,EAAQ9D,YAAcnF,OAAOrF,KAAKuI,MAAMM,WAGtC7I,KAAKuI,MAAMM,UAAY,IACrB7I,KAAKuI,MAAMQ,kBACb2F,cAAc1O,KAAKuI,MAAMQ,kBAE3B/I,KAAKuI,MAAMO,cAAe,EACtByF,IAAiBA,EAA+BjP,MAAMqP,QAAU,QAChEvB,IAAWA,EAAUwB,UAAW,KAErC,IACL,CAEQ,qBAAMzB,GACZ,GAA8B,IAA1BnN,KAAKuI,MAAMC,IAAIlL,OAAnB,CAKA0C,KAAK6O,kBAAiB,GAEtB,UACQ7O,KAAK8O,YAEP9O,KAAKuI,MAAMQ,kBACb2F,cAAc1O,KAAKuI,MAAMQ,kBAG3B,MAAM7G,QAAelC,KAAK+O,iBAE1B/O,KAAKuI,MAAMI,WAAY,EACvB3I,KAAKgM,oBACLhM,KAAK0H,QAAQsH,UAAU9M,EACzB,CAAE,MAAOvE,GACPqC,KAAK6O,kBAAiB,GACtB,MAAMI,EAAetR,EACrBqC,KAAKkP,UAAU,MAAOD,EAAapI,SAAW,iCAChD,CApBA,MAFE7G,KAAKkP,UAAU,MAAO,yCAuB1B,CAEQ,gBAAAL,CAAiBnG,SACvB,MAAMuE,EAA0B,QAAdpD,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,uBAE5CkC,IACFA,EAAU2B,SAAWlG,EACrBuE,EAAUpC,UAAYnC,EAClB,+DACA,+BAER,CAEQ,eAAMoG,GACZ,IAAK9O,KAAK6H,YAAc7H,KAAK0H,QAAQY,WACnC,KAAM,CAAE9L,KAAM,YAAaqK,QAAS,+BAAgCsI,aAAa,GAGnF,GAA8B,IAA1BnP,KAAKuI,MAAMC,IAAIlL,OACjB,KAAM,CAAEd,KAAM,cAAeqK,QAAS,yCAA0CsI,aAAa,GAG/F,IAAKnP,KAAKuI,MAAMa,YAAcpJ,KAAKuI,MAAMc,cACvC,KAAM,CAAE7M,KAAM,uBAAwBqK,QAAS,6CAA8CsI,aAAa,SAGtGnP,KAAK6H,UAAUb,YAAY,CAC/BoC,UAAWpJ,KAAKuI,MAAMa,UACtBZ,IAAKxI,KAAKuI,MAAMC,IAChBa,cAAerJ,KAAKuI,MAAMc,cAC1BE,QAASvJ,KAAKuI,MAAMgB,cAAW6F,EAC/BC,eAAgBrP,KAAK0H,QAAQY,WAAW+G,gBAE5C,CAEQ,qBAAMhC,eACZ,MAAMkB,EAA+B,QAAd1E,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,sBAC/CqC,EAA0B,QAAdF,EAAAlN,KAAK2H,iBAAS,IAAAuF,OAAA,EAAAA,EAAEnC,cAAc,uBAGhD,GAAI/K,KAAK6H,WAAa7H,KAAK0H,QAAQY,YAActI,KAAKuI,MAAMe,eAC1D,IACM8D,IAAWA,EAAUwB,UAAW,SAC9B5O,KAAK6H,UAAUZ,UAAU,CAC7BqC,eAAgBtJ,KAAKuI,MAAMe,eAC3B+F,eAAgBrP,KAAK0H,QAAQY,WAAW+G,gBAE5C,CAAE,MAAO1R,GACP8H,QAAQ9H,MAAM,kCAAmCA,EAEnD,CAGFqC,KAAKuI,MAAMM,SAAW,GACtB7I,KAAKuI,MAAMO,cAAe,EAEtByF,IAAgBA,EAAejP,MAAMqP,QAAU,SAC/CvB,IAAWA,EAAUwB,UAAW,GAEpC,MAAMR,EAAuB,QAAdjE,EAAAnK,KAAK2H,iBAAS,IAAAwC,OAAA,EAAAA,EAAEuC,iBAAiB,sBAChD0B,SAAAA,EAAQzB,QAAQC,GAASA,EAAMhO,MAAQ,IACvCoB,KAAKuI,MAAMC,IAAM,GAEjBxI,KAAKwM,gBAC4B,QAAjCe,EAACa,aAAM,EAANA,EAAS,UAAuB,IAAAb,GAAAA,EAAEG,OACrC,CAEQ,gBAAAF,SAQN,GAPIxN,KAAKuI,MAAMQ,kBACb2F,cAAc1O,KAAKuI,MAAMQ,kBAG3B/I,KAAKuI,MAAMK,WAAY,EACvB5I,KAAKuI,MAAMC,IAAM,GAEbxI,KAAK2H,UAAW,CAClB3H,KAAK2H,UAAUkD,UAAY7K,KAAK8K,eAChC9K,KAAK4H,QAAU5H,KAAK2H,UAAUoD,cAAc,oBAChC,QAAZlB,EAAA7J,KAAK4H,mBAAOiC,GAAAA,EAAEC,UAAUC,IAAI,mBAC5B/J,KAAK2J,uBAEL,MAAM2F,EAAYtP,KAAK2H,UAAUoD,cAAc,wBACzCwE,EAAcvP,KAAK2H,UAAUoD,cAAc,mBAC3CyE,EAAWxP,KAAK2H,UAAUoD,cAAc,gBAE1CuE,IAAWA,EAAU1Q,MAAQD,EAAiBqB,KAAKuI,MAAM1L,aACzD0S,IAAaA,EAAY3Q,MAAQoB,KAAKuI,MAAMzK,QAC5C0R,IAAUA,EAAS5Q,MAAQoB,KAAKuI,MAAM9J,IAC5C,CACF,CAKQ,oBAAAkL,qBACN,MAAMuC,EAAyB,QAAdrC,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,yBAC/CmB,SAAAA,EAAUC,iBAAiB,QAAS,IAAMnM,KAAKiI,SAEnC,QAAZiF,EAAAlN,KAAK4H,mBAAOsF,GAAAA,EAAEf,iBAAiB,QAAUpE,IACnCA,EAAE4F,SAAW3N,KAAK4H,SACpB5H,KAAKiI,UAITC,SAASiE,iBAAiB,UAAWnM,KAAK8H,cAG1C,MAAM2H,EAAqB,QAAdtF,EAAAnK,KAAK2H,iBAAS,IAAAwC,OAAA,EAAAA,EAAEuC,iBAAiB,uBAW9C,GAVA+C,SAAAA,EAAM9C,QAAQ+C,IACZA,EAAIvD,iBAAiB,QAAS,KAC5B,MAAM9F,EAAUqJ,EAAoBC,QAAQtJ,OACxCA,GAAUA,IAAWrG,KAAKuI,MAAMS,eAClChJ,KAAK4P,oBAAoBvJ,OAME,SAA7BrG,KAAKuI,MAAMS,cAA0B,CACvC,MAAMsG,EAA0B,QAAd/B,EAAAvN,KAAK2H,iBAAS,IAAA4F,OAAA,EAAAA,EAAExC,cAAc,wBAChDuE,SAAAA,EAAWnD,iBAAiB,QAAUpE,GAAM/H,KAAK6P,gBAAgB9H,IACjEuH,SAAAA,EAAWnD,iBAAiB,OAAQ,IAAMnM,KAAK8P,cAAc,eAE7D,MAAMP,EAA4B,QAAd9B,EAAAzN,KAAK2H,iBAAS,IAAA8F,OAAA,EAAAA,EAAE1C,cAAc,mBAClDwE,SAAAA,EAAapD,iBAAiB,QAAUpE,GAAM/H,KAAK+P,kBAAkBhI,IACrEwH,SAAAA,EAAapD,iBAAiB,OAAQ,IAAMnM,KAAK8P,cAAc,WAE/D,MAAMN,EAAyB,QAAdQ,EAAAhQ,KAAK2H,iBAAS,IAAAqI,OAAA,EAAAA,EAAEjF,cAAc,gBAC/CyE,SAAAA,EAAUrD,iBAAiB,QAAUpE,GAAM/H,KAAKiQ,eAAelI,IAC/DyH,SAAAA,EAAUrD,iBAAiB,OAAQ,IAAMnM,KAAK8P,cAAc,QAE5D,MAAMI,EAAqB,QAAdC,EAAAnQ,KAAK2H,iBAAS,IAAAwI,OAAA,EAAAA,EAAEpF,cAAc,yBAC3CmF,SAAAA,EAAM/D,iBAAiB,SAAWpE,GAAM/H,KAAKoQ,aAAarI,GAC5D,CAGiC,kBAA7B/H,KAAKuI,MAAMS,gBACbhJ,KAAKqQ,8BAGArQ,KAAKuI,MAAMY,oBAGdnJ,KAAKsQ,qBAFLtQ,KAAKuQ,0BAKX,CAKQ,2BAAAF,WACN,MAAMG,EAAwB,QAAd3G,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,qBAC9CyF,SAAAA,EAASrE,iBAAiB,QAAS,KACjC,MAAMsE,EAAcD,EAAwBb,QAAQe,MAAQ,GAC5D1Q,KAAK2Q,gBAAgBF,KAGvB,MAAMG,EAA2B,QAAd1D,EAAAlN,KAAK2H,iBAAS,IAAAuF,OAAA,EAAAA,EAAEnC,cAAc,6BACjD6F,SAAAA,EAAYzE,iBAAiB,QAAS,IAAMnM,KAAK6Q,wBACnD,CAKQ,mBAAAjB,CAAoBvJ,SAK1B,GAJArG,KAAKgK,oBACLhK,KAAKuI,MAAMS,cAAgB3C,EAGvBrG,KAAK2H,YACP3H,KAAK2H,UAAUkD,UAAY7K,KAAK8K,eAChC9K,KAAK4H,QAAU5H,KAAK2H,UAAUoD,cAAc,oBAChC,QAAZlB,EAAA7J,KAAK4H,mBAAOiC,GAAAA,EAAEC,UAAUC,IAAI,mBAC5B/J,KAAK2J,uBAGU,SAAXtD,GAAqBrG,KAAKuI,MAAM1L,YAAY,CAC9C,MAAMyS,EAAYtP,KAAK2H,UAAUoD,cAAc,wBACzCwE,EAAcvP,KAAK2H,UAAUoD,cAAc,mBAC3CyE,EAAWxP,KAAK2H,UAAUoD,cAAc,gBAC1CuE,IAAWA,EAAU1Q,MAAQD,EAAiBqB,KAAKuI,MAAM1L,aACzD0S,IAAaA,EAAY3Q,MAAQoB,KAAKuI,MAAMzK,QAC5C0R,IAAUA,EAAS5Q,MAAQoB,KAAKuI,MAAM9J,IAC5C,CAEJ,CAKQ,6BAAM8R,SACZ,IACE,IAAIhF,EAEAvL,KAAK0H,QAAQoJ,wBACfvF,QAAgBvL,KAAK0H,QAAQoJ,iCAGvB,IAAIC,QAAQC,GAAW9G,WAAW8G,EAAS,OACjDzF,EAAU,CACRC,cAAe,aACfC,SAAU,eACVC,YAAa,sBACbC,UAAW,MAAMxN,KAAKD,MAAM2C,SAAS,IAAIoQ,gBACzCpF,UAAW,OAIf7L,KAAKuI,MAAMY,oBAAsBoC,EAGjC,MAAMU,EAA8B,QAAdpC,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,2BACpD,GAAIkB,EAAe,CACjB,MAAMhB,EAAkBhM,EAAae,KAAK0H,QAAQxI,OAAQc,KAAK0H,QAAQvI,UACvE8M,EAAcpB,UAAY7K,KAAKsL,oBAAoBL,GACnDjL,KAAKqQ,8BACLrQ,KAAKsQ,oBACP,CACF,CAAE,MAAO3S,GACPqC,KAAK0H,QAAQwJ,QAAQ,CACnB1U,KAAM,4BACNqK,QAAS,8DACTsI,aAAa,GAEjB,CACF,CAKQ,qBAAMwB,CAAgBQ,SAC5B,UACQC,UAAUC,UAAUC,UAAUH,GACpC,MAAMX,EAAwB,QAAd3G,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,qBAC1CyF,IACFA,EAAQ3F,UAAY,GAAG3D,IACvBsJ,EAAQ1G,UAAUC,IAAI,kBACtBG,WAAW,KACTsG,EAAQ3F,UAAY,GAAG3D,IACvBsJ,EAAQ1G,UAAUG,OAAO,mBACxB,KAEP,CAAE,MAAAiD,GAEA,MAAMqE,EAAWrJ,SAASoC,cAAc,YACxCiH,EAAS3S,MAAQuS,EACjBI,EAASjS,MAAMkS,SAAW,QAC1BD,EAASjS,MAAMmS,QAAU,IACzBvJ,SAASjC,KAAK0E,YAAY4G,GAC1BA,EAASG,SACTxJ,SAASyJ,YAAY,QACrBzJ,SAASjC,KAAK2L,YAAYL,EAC5B,CACF,CAKQ,2BAAMV,WACZ,MAAMD,EAA2B,QAAd/G,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,6BAC7C6F,IACFA,EAAWhC,UAAW,EACtBgC,EAAW/F,UAAY,0EAGzB7K,KAAKgK,oBAEL,UAEQ,IAAI+G,QAAQC,GAAW9G,WAAW8G,EAAS,MAEjD,MAAM9O,EAAwB,CAC5BqI,GAAI,gBAAgBpM,KAAKD,QACzB4I,OAAQ,UACR5H,OAAQc,KAAK0H,QAAQxI,OACrBC,SAAUa,KAAK0H,QAAQvI,SACvB0S,WAAW,IAAI1T,MAAO2T,cACtBnG,oBAAW3L,KAAKuI,MAAMY,0CAAqBwC,UAC3C3C,cAAe,iBAGjBhJ,KAAKuI,MAAMI,WAAY,EACvB3I,KAAKgM,oBACLhM,KAAK0H,QAAQsH,UAAU9M,EACzB,CAAE,MAAOvE,GACHiT,IACFA,EAAWhC,UAAW,EACtBgC,EAAW/F,UAAY,oCAEzB,MAAMoE,EAAetR,EACrBqC,KAAK0H,QAAQwJ,QAAQjC,EACvB,CACF,CAKQ,kBAAAqB,GACDtQ,KAAKuI,MAAMY,sBAEhBnJ,KAAKuI,MAAMU,cAAgBjJ,KAAKuI,MAAMY,oBAAoB0C,UAE1D7L,KAAKuI,MAAMW,sBAAwBsF,OAAOC,YAAY,eACpDzO,KAAKuI,MAAMU,gBAEX,MAAM8I,EAA4B,QAAdlI,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,+BAKlD,GAJIgH,IACFA,EAAYvH,YAAcxK,KAAK4L,gBAAgB5L,KAAKuI,MAAMU,gBAGxDjJ,KAAKuI,MAAMU,eAAiB,EAAG,CACjCjJ,KAAKgK,oBAEL,MAAMsE,EAAwB,QAAdpB,EAAAlN,KAAK2H,iBAAS,IAAAuF,OAAA,EAAAA,EAAEnC,cAAc,2BAC1CuD,IACFA,EAAQzD,UAAY,GAAG3D,0FAEzB,MAAM0J,EAA2B,QAAdzG,EAAAnK,KAAK2H,iBAAS,IAAAwC,OAAA,EAAAA,EAAEY,cAAc,6BAC7C6F,IAAYA,EAAWhC,UAAW,EACxC,GACC,KACL,CAKQ,iBAAA5E,GACFhK,KAAKuI,MAAMW,wBACbwF,cAAc1O,KAAKuI,MAAMW,uBACzBlJ,KAAKuI,MAAMW,sBAAwB,KAEvC,CASQ,eAAA2G,CAAgB9H,SACtB,MAAM6E,EAAQ7E,EAAE4F,OACVqE,EAAYrT,EAAiBiO,EAAMhO,OACzCgO,EAAMhO,MAAQoT,EACdhS,KAAKuI,MAAM1L,WAAamV,EAAUjV,QAAQ,MAAO,IAEjD,MAAMkV,EAAwB,QAAdpI,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,uBACxC/N,EAAQJ,EAAgBoD,KAAKuI,MAAM1L,YACrCoV,IACFA,EAAQzH,YAAcxN,GAAQmK,EAAmBnK,EAAMR,OAAc,GACrEyV,EAAQ3S,MAAMmS,QAAUzU,EAAQ,IAAM,KAGxCgD,KAAK8N,WAAW,aAClB,CAEQ,iBAAAiC,CAAkBhI,GACxB,MAAM6E,EAAQ7E,EAAE4F,OACVqE,EAAYjT,EAAa6N,EAAMhO,OACrCgO,EAAMhO,MAAQoT,EACdhS,KAAKuI,MAAMzK,OAASkU,EACpBhS,KAAK8N,WAAW,SAClB,CAEQ,cAAAmC,CAAelI,GACrB,MAAM6E,EAAQ7E,EAAE4F,OACVqE,EAAYhT,EAAU4N,EAAMhO,OAClCgO,EAAMhO,MAAQoT,EACdhS,KAAKuI,MAAM9J,IAAMuT,EACjBhS,KAAK8N,WAAW,MAClB,CAEQ,aAAAgC,CAAcoC,GACpB,IAAIhQ,EAEJ,OAAQgQ,GACN,IAAK,aACHhQ,EAASzE,EAAmBuC,KAAKuI,MAAM1L,YACvC,MACF,IAAK,SACHqF,EAASrE,EAAemC,KAAKuI,MAAMzK,QACnC,MACF,IAAK,MACHoE,EAAS1D,EAAYwB,KAAKuI,MAAM9J,IAAKuB,KAAKuI,MAAM1L,YAChD,MACF,QACE,OAAO,EAGX,OAAKqF,EAAOxE,OAKZsC,KAAK8N,WAAWoE,IACT,IALLlS,KAAKkP,UAAUgD,EAAOhQ,EAAOvE,OAAS,YAC/B,EAKX,CAEQ,SAAAuR,CAAUgD,EAAerL,WAC/B,MAAMsL,EAAwB,QAAdtI,EAAA7J,KAAK2H,qBAASkC,OAAA,EAAAA,EAAEkB,cAAc,YAAsB,eAAVmH,EAAyB,OAASA,WACtFE,EAAwB,QAAdlF,EAAAlN,KAAK2H,qBAASuF,OAAA,EAAAA,EAAEnC,cAAc,YAAsB,eAAVmH,EAAyB,cAAgBA,KAE/FC,IACFA,EAAQtH,UAAY,GAAG3D,KAAeL,IACtCsL,EAAQ7S,MAAMqP,QAAU,QAE1ByD,SAAAA,EAAStI,UAAUC,IAAI,gBACzB,CAEQ,UAAA+D,CAAWoE,WACjB,MAAMC,EAAwB,QAAdtI,EAAA7J,KAAK2H,qBAASkC,OAAA,EAAAA,EAAEkB,cAAc,YAAsB,eAAVmH,EAAyB,OAASA,WACtFE,EAAwB,QAAdlF,EAAAlN,KAAK2H,qBAASuF,OAAA,EAAAA,EAAEnC,cAAc,YAAsB,eAAVmH,EAAyB,cAAgBA,KAE/FC,IACFA,EAAQ7S,MAAMqP,QAAU,QAE1ByD,SAAAA,EAAStI,UAAUG,OAAO,gBAC5B,CAEQ,kBAAMmG,CAAarI,GACzBA,EAAEiG,iBAEF,MAAMqE,EAAcrS,KAAK8P,cAAc,cACjCwC,EAAgBtS,KAAK8P,cAAc,UACnCyC,EAAavS,KAAK8P,cAAc,OAEtC,GAAKuC,GAAgBC,GAAkBC,EAIvC,GAAKvS,KAAK6H,WAAc7H,KAAK0H,QAAQY,WAArC,CAKAtI,KAAKwS,eAAc,GAEnB,IAEE,MAAMtO,EAAMyB,EAAS3F,KAAKuI,MAAM1L,YAC1BuH,EAAasB,EAAmB1F,KAAKuI,MAAMzK,QAC3C2U,QAAiB1O,EAAiB,CACtCE,QAAS,IACTC,MACAC,IAAK,GACLC,aACA3F,IAAKuB,KAAKuI,MAAM9J,MAIZ6K,EAAiB,MAAMnL,KAAKD,MAAM2C,SAAS,IAAIoQ,iBAAiBzP,KAAKyD,SAASpE,SAAS,IAAIhB,UAAU,EAAG,GAAGoR,gBAG3G9K,QAAiBnG,KAAK6H,UAAUd,gBAAgB,CACpDsI,eAAgBrP,KAAK0H,QAAQY,WAAW+G,eACxC/F,iBACAgD,cAAetM,KAAK0H,QAAQ4E,cAC5BoG,cAAe1S,KAAK0H,QAAQgL,cAC5BxT,OAAQc,KAAK0H,QAAQxI,OAAS,IAC9BC,SAAUa,KAAK0H,QAAQvI,SACvB6J,cAAe,OACfyJ,WACAE,UAAW3S,KAAK0H,QAAQ0D,cAI1BpL,KAAKuI,MAAMa,UAAYjD,EAASiD,UAChCpJ,KAAKuI,MAAMc,cAAgBlD,EAASkD,cACpCrJ,KAAKuI,MAAMe,eAAiBnD,EAASmD,gBAAkBA,EACvDtJ,KAAKuI,MAAMgB,QAAUpD,EAASoD,SAAW,KAEzCvJ,KAAKwS,eAAc,GACnBxS,KAAKoM,eACP,CAAE,MAAOzO,GACPqC,KAAKwS,eAAc,GACnB,MAAM3L,GAAUlJ,aAAK,EAALA,EAAOkJ,UAAW,oCAClC7G,KAAK0H,QAAQwJ,QAAQ,CACnB1U,MAAMmB,eAAAA,EAAOnB,OAAQ,0BACrBqK,UACAsI,aAAa,EACb5D,QAAS5N,aAAK,EAALA,EAAOsC,OAElBD,KAAKkP,UAAU,aAAcrI,EAC/B,CAlDA,MAFE7G,KAAKkP,UAAU,aAAc,oEAqDjC,CAEQ,aAAAsD,CAAc9J,SACpB1I,KAAKuI,MAAMG,aAAeA,EAC1B,MAAMkK,EAA0B,QAAd/I,EAAA7J,KAAK2H,iBAAS,IAAAkC,OAAA,EAAAA,EAAEkB,cAAc,mBAE5C6H,IACFA,EAAUhE,SAAWlG,EACrBkK,EAAU/H,UAAYnC,EAClB,gEACA,iBAAiBzJ,EAAae,KAAK0H,QAAQxI,OAAQc,KAAK0H,QAAQvI,mBAExE,CAEQ,oBAAM4P,GACZ,MAAO,CACLxE,GAAIvK,KAAKuI,MAAMa,WAAa,OAAOjL,KAAKD,QACxC4I,OAAQ,UACR5H,OAAQc,KAAK0H,QAAQxI,OACrBC,SAAUa,KAAK0H,QAAQvI,SACvB0S,WAAW,IAAI1T,MAAO2T,cACtBnG,UAAW3L,KAAKuI,MAAMe,qBAAkB8F,EACxCpG,cAAe,OAEnB,CAKQ,SAAAyB,GACN,MAAO,44eA2KT,EClsCF,MAAMoI,EAAN,WAAA9S,GACYC,KAAA8S,OAA+B,KAC/B9S,KAAA+S,aAAoC,KACpC/S,KAAAgT,aAAc,CAmK1B,CA7JI,IAAAC,CAAKH,GACIA,EAAOjN,OAKPiN,EAAOzD,gBAKZrP,KAAK8S,OAAS,CACVI,MAAO,OACPC,OAAQ,WACLL,GAEP9S,KAAKgT,aAAc,EAGE,SAAjBF,EAAOI,MACPlT,KAAKoT,iBACmB,UAAjBN,EAAOI,OACdhL,SAASmL,gBAAgBvJ,UAAUC,IAAI,iBAIvC+I,EAAOQ,cACPtT,KAAKuT,kBAAkBT,EAAOQ,cAGlC7N,QAAQ+N,IAAI,uCAvBR/N,QAAQ9H,MAAM,6EALd8H,QAAQ9H,MAAM,kGA6BtB,CAMA,QAAA8V,CAAS/L,GACL,OAAK1H,KAAKgT,aAULtL,EAAQxI,QAAUwI,EAAQxI,QAAU,GACrCuG,QAAQ9H,MAAM,iCACd+J,EAAQwJ,QAAQ,CACZ1U,KAAM,iBACNqK,QAAS,wCACTsI,aAAa,KAKhBzH,EAAQvI,UAWba,KAAK0T,aAGL1T,KAAK+S,aAAe,IAAItL,EAAa,IAC9BC,EACHY,WAAY,CACRzC,OAAQ7F,KAAK8S,OAAQjN,OACrBwJ,eAAgBrP,KAAK8S,OAAQzD,eAC7BvJ,QAAS9F,KAAK8S,OAAQhN,SAE1BsE,QAAS,WACLpK,KAAK+S,aAAe,KACL,QAAflJ,EAAAnC,EAAQ0C,eAAO,IAAAP,GAAAA,EAAA8J,KAAAjM,WAIvB1H,KAAK+S,aAAavJ,SA1Bd/D,QAAQ9H,MAAM,uCACd+J,EAAQwJ,QAAQ,CACZ1U,KAAM,mBACNqK,QAAS,4BACTsI,aAAa,MAxBjB1J,QAAQ9H,MAAM,8DACd+J,EAAQwJ,QAAQ,CACZ1U,KAAM,kBACNqK,QAAS,0DACTsI,aAAa,IA2CzB,CAKA,UAAAuE,GACQ1T,KAAK+S,eACL/S,KAAK+S,aAAa9K,QAClBjI,KAAK+S,aAAe,KAE5B,CAMA,QAAAa,CAASV,GACLhL,SAASmL,gBAAgBvJ,UAAUG,OAAO,iBAE5B,UAAViJ,EACAhL,SAASmL,gBAAgBvJ,UAAUC,IAAI,iBACtB,SAAVmJ,GACPlT,KAAKoT,iBAGLpT,KAAK8S,SACL9S,KAAK8S,OAAOI,MAAQA,EAE5B,CAKQ,cAAAE,GACgB5E,OAAOqF,WAAW,gCAAgCC,SAElE5L,SAASmL,gBAAgBvJ,UAAUC,IAAI,iBAG3CyE,OAAOqF,WAAW,gCAAgC1H,iBAAiB,SAAWpE,UAC/C,kBAAvB8B,EAAA7J,KAAK8S,6BAAQI,QACbhL,SAASmL,gBAAgBvJ,UAAUiK,OAAO,iBAAkBhM,EAAE+L,UAG1E,CAKQ,iBAAAP,CAAkBS,GACtB,MAAMC,EAAO/L,SAASmL,gBACtB,IAAK,MAAOrL,EAAKpJ,KAAUsV,OAAOC,QAAQH,GAClCpV,GACAqV,EAAK3U,MAAM8U,YAAYpM,EAAKpJ,EAGxC,CAKA,WAAIqF,GACA,MAAO,OACX,CAKA,iBAAIoQ,GACA,OAAOrU,KAAKgT,WAChB,EAIJ,MAAMsB,EAAU,IAAIzB,QAME,oBAAXrE,SACNA,OAA8C8F,QAAUA,gNJ7IvD,SAA4BnV,GAU9B,MATwC,CACpCoV,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,IACLC,IAAK,MACLC,IAAK,KAEM1V,EAAS8R,gBAAkB9R,CAC9C"}
1
+ {"version":3,"file":"voxepay-checkout.min.js","sources":["../src/utils/card-validator.ts","../src/utils/formatter.ts","../src/utils/encryption.ts","../src/api/client.ts","../src/components/modal.ts","../src/voxepay.ts"],"sourcesContent":[null,null,null,null,null,null],"names":["CARD_BRANDS","name","code","pattern","lengths","cvvLength","detectCardBrand","cardNumber","cleaned","replace","brand","test","luhnCheck","sum","isEven","i","length","digit","parseInt","validateCardNumber","valid","error","includes","validateExpiry","expiry","match","month","year","now","Date","currentYear","getFullYear","currentMonth","getMonth","validateCVV","cvv","expectedLength","formatCardNumber","value","join","slice","formatExpiry","formatCVV","formatAmount","amount","currency","Intl","NumberFormat","style","minimumFractionDigits","format","hexToBytes","hex","bytes","push","substring","RSABigInt","constructor","this","data","sign","fromHex","n","bitPos","current","BITS","BASE","trim","fromBytes","map","b","toString","padStart","pop","isZero","bitLength","topWord","bits","w","toBytes","h","padLen","Math","ceil","Array","fill","concat","clone","r","compareAbs","other","multiply","result","carry","j","prod","floor","modPow","exp","mod","Error","base","expBits","wordIdx","bitIdx","m","divmod","remainder","divisor","quotient","cmp","shiftLeft","subtract","qWordIdx","qBitIdx","wordShift","bitShift","max","borrow","diff","RSA_CONFIG","generateAuthData","async","version","pan","pin","expiryDate","messageBytes","str","charCodeAt","toHex","modulus","exponent","keyByteLen","padded","crypto","getRandomValues","arr","Uint8Array","random","pkcs1Pad","encryptedBytes","btoa","String","fromCharCode","Buffer","from","console","formatExpiryForApi","cleanPan","VoxePayApiClient","apiKey","baseUrl","request","endpoint","body","url","response","fetch","method","headers","Accept","JSON","stringify","json","ok","errorMessage","message","status","initiatePayment","validateOTP","resendOTP","ICONS","CARD_BRAND_DISPLAY","visa","mastercard","amex","verve","discover","VoxePayModal","options","container","overlay","apiClient","handleEscape","e","key","close","document","removeEventListener","methods","paymentMethods","_sdkConfig","state","otp","errors","isProcessing","isSuccess","isOtpStep","otpTimer","canResendOtp","otpTimerInterval","paymentMethod","transferTimer","transferTimerInterval","bankTransferDetails","paymentId","transactionId","transactionRef","eciFlag","open","injectStyles","render","attachEventListeners","requestAnimationFrame","_a","classList","add","stopTransferTimer","remove","setTimeout","_c","onClose","getElementById","createElement","id","textContent","getStyles","head","appendChild","className","innerHTML","getModalHTML","querySelector","getPaymentMethods","formattedAmount","showTabs","isCard","description","getCardFormHTML","getBankTransferHTML","details","accountNumber","bankName","accountName","reference","formatCountdown","expiresIn","seconds","s","renderSuccessView","formContainer","closeBtn","addEventListener","renderOTPView","maskedPhone","customerEmail","attachOTPEventListeners","startOTPTimer","otpInputs","querySelectorAll","forEach","input","index","handleOTPInput","handleOTPKeydown","handleOTPPaste","verifyBtn","_b","handleOTPSubmit","resendBtn","handleResendOTP","backBtn","_d","handleBackToCard","_e","focus","target","nextInput","updateOTPState","clearError","prevInput","preventDefault","pastedData","clipboardData","getData","inputs","split","timerEl","timerContainer","window","setInterval","clearInterval","display","disabled","setOTPProcessing","verifyOTP","processPayment","onSuccess","paymentError","showError","recoverable","undefined","organizationId","cardInput","expiryInput","cvvInput","tabs","tab","dataset","switchPaymentMethod","handleCardInput","validateField","handleExpiryInput","_f","handleCVVInput","form","_g","handleSubmit","attachBankTransferListeners","startTransferTimer","loadBankTransferDetails","copyBtn","accountNum","copy","copyToClipboard","confirmBtn","handleTransferConfirm","onBankTransferRequested","Promise","resolve","toUpperCase","onError","text","navigator","clipboard","writeText","textarea","position","opacity","select","execCommand","removeChild","timestamp","toISOString","countdownEl","formatted","brandEl","field","errorEl","inputEl","isCardValid","isExpiryValid","isCVVValid","setProcessing","authData","customerId","customerPhone","narration","submitBtn","VoxePaySDK","config","currentModal","initialized","init","theme","locale","applyAutoTheme","documentElement","customStyles","applyCustomStyles","log","checkout","closeModal","call","setTheme","matchMedia","matches","toggle","styles","root","Object","entries","setProperty","isInitialized","VoxePay","NGN","USD","EUR","GBP","GHS","KES","ZAR"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@voxepay/checkout",
3
- "version": "0.3.2",
3
+ "version": "0.3.4",
4
4
  "description": "Modern payment checkout modal for VoxePay - beautiful, fast, and secure",
5
5
  "author": "VoxePay",
6
6
  "license": "MIT",
@@ -23,6 +23,7 @@
23
23
  },
24
24
  "files": [
25
25
  "dist",
26
+ "src",
26
27
  "README.md"
27
28
  ],
28
29
  "scripts": {
@@ -0,0 +1,110 @@
1
+ /**
2
+ * VoxePay Payment API Client
3
+ * Handles communication with the VoxePay payment gateway
4
+ */
5
+
6
+ const DEFAULT_BASE_URL = 'https://devpay.voxepay.app';
7
+
8
+ export interface InitiatePaymentRequest {
9
+ organizationId: string;
10
+ transactionRef: string;
11
+ customerId?: string;
12
+ customerEmail?: string;
13
+ customerPhone?: string;
14
+ amount: number;
15
+ currency: string;
16
+ paymentMethod: 'CARD' | 'BANK_TRANSFER';
17
+ authData: string;
18
+ narration?: string;
19
+ }
20
+
21
+ export interface InitiatePaymentResponse {
22
+ paymentId: string;
23
+ transactionId: string;
24
+ transactionRef: string;
25
+ status: string;
26
+ message: string;
27
+ eciFlag?: string;
28
+ [key: string]: unknown;
29
+ }
30
+
31
+ export interface ValidateOTPRequest {
32
+ paymentId: string;
33
+ otp: string;
34
+ transactionId: string;
35
+ eciFlag?: string;
36
+ organizationId: string;
37
+ }
38
+
39
+ export interface ValidateOTPResponse {
40
+ status: string;
41
+ message: string;
42
+ paymentId: string;
43
+ transactionRef?: string;
44
+ amount?: number;
45
+ currency?: string;
46
+ [key: string]: unknown;
47
+ }
48
+
49
+ export interface ResendOTPRequest {
50
+ transactionRef: string;
51
+ organizationId: string;
52
+ }
53
+
54
+ export class VoxePayApiClient {
55
+ private apiKey: string;
56
+ private baseUrl: string;
57
+
58
+ constructor(apiKey: string, baseUrl?: string) {
59
+ this.apiKey = apiKey;
60
+ this.baseUrl = baseUrl || DEFAULT_BASE_URL;
61
+ }
62
+
63
+ private async request<T>(endpoint: string, body: unknown): Promise<T> {
64
+ const url = `${this.baseUrl}${endpoint}`;
65
+
66
+ const response = await fetch(url, {
67
+ method: 'POST',
68
+ headers: {
69
+ 'Content-Type': 'application/json',
70
+ 'X-API-Key': this.apiKey,
71
+ 'Accept': 'application/json',
72
+ },
73
+ body: JSON.stringify(body),
74
+ });
75
+
76
+ const data = await response.json();
77
+
78
+ if (!response.ok) {
79
+ const errorMessage = data?.message || data?.error || `Request failed with status ${response.status}`;
80
+ const error: any = new Error(errorMessage);
81
+ error.code = data?.code || `HTTP_${response.status}`;
82
+ error.status = response.status;
83
+ error.data = data;
84
+ throw error;
85
+ }
86
+
87
+ return data as T;
88
+ }
89
+
90
+ /**
91
+ * Initiate a card payment
92
+ */
93
+ async initiatePayment(data: InitiatePaymentRequest): Promise<InitiatePaymentResponse> {
94
+ return this.request<InitiatePaymentResponse>('/api/v1/payments/initiate', data);
95
+ }
96
+
97
+ /**
98
+ * Validate OTP for a payment
99
+ */
100
+ async validateOTP(data: ValidateOTPRequest): Promise<ValidateOTPResponse> {
101
+ return this.request<ValidateOTPResponse>('/api/v1/payments/validate-otp', data);
102
+ }
103
+
104
+ /**
105
+ * Resend OTP for a payment
106
+ */
107
+ async resendOTP(data: ResendOTPRequest): Promise<void> {
108
+ await this.request<unknown>('/api/v1/payments/resend-otp', data);
109
+ }
110
+ }