@voxepay/checkout 0.2.0 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs.js
CHANGED
|
@@ -1218,8 +1218,8 @@ class VoxePayModal {
|
|
|
1218
1218
|
|
|
1219
1219
|
/* Payment Method Tabs */
|
|
1220
1220
|
.voxepay-method-tabs { display: flex; border-bottom: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }
|
|
1221
|
-
.voxepay-method-tab { flex: 1; display: flex; align-items: center; justify-content: center; gap:
|
|
1222
|
-
.voxepay-method-tab svg { width:
|
|
1221
|
+
.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; }
|
|
1222
|
+
.voxepay-method-tab svg { width: 16px; height: 16px; flex-shrink: 0; }
|
|
1223
1223
|
.voxepay-method-tab:hover { color: var(--voxepay-text); background: var(--voxepay-surface-hover); }
|
|
1224
1224
|
.voxepay-method-tab.active { color: var(--voxepay-primary); border-bottom-color: var(--voxepay-primary); background: var(--voxepay-bg); }
|
|
1225
1225
|
|
package/dist/index.esm.js
CHANGED
|
@@ -1214,8 +1214,8 @@ class VoxePayModal {
|
|
|
1214
1214
|
|
|
1215
1215
|
/* Payment Method Tabs */
|
|
1216
1216
|
.voxepay-method-tabs { display: flex; border-bottom: 1px solid var(--voxepay-border); background: var(--voxepay-surface); }
|
|
1217
|
-
.voxepay-method-tab { flex: 1; display: flex; align-items: center; justify-content: center; gap:
|
|
1218
|
-
.voxepay-method-tab svg { width:
|
|
1217
|
+
.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; }
|
|
1218
|
+
.voxepay-method-tab svg { width: 16px; height: 16px; flex-shrink: 0; }
|
|
1219
1219
|
.voxepay-method-tab:hover { color: var(--voxepay-text); background: var(--voxepay-surface-hover); }
|
|
1220
1220
|
.voxepay-method-tab.active { color: var(--voxepay-primary); border-bottom-color: var(--voxepay-primary); background: var(--voxepay-bg); }
|
|
1221
1221
|
|
|
@@ -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 p(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 l(e){return e.replace(/\D/g,"").slice(0,4)}function v(e,t){return new Intl.NumberFormat("en-US",{style:"currency",currency:t,minimumFractionDigits:2}).format(e/100)}const d='<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>',c='<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>',y='<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>',x='<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>',u='<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>',h='<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>',m='<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>',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 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>',g={visa:"VISA",mastercard:"MC",amex:"AMEX",verve:"VERVE",discover:"DISC"};class f{constructor(e){this.container=null,this.overlay=null,this.handleEscape=e=>{"Escape"===e.key&&(this.close(),document.removeEventListener("keydown",this.handleEscape))},this.options=e;const t=e.paymentMethods||["card","bank_transfer"];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}}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=v(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 ${d}\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 ${m} <span>Card</span>\n </button>`:""}\n ${t.includes("bank_transfer")?`\n <button class="voxepay-method-tab ${n?"":"active"}" data-method="bank_transfer">\n ${h} <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 ${c}\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 ${u}\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 ${b}\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=v(this.options.amount,this.options.currency);t.innerHTML=`\n <div class="voxepay-success-view">\n <div class="voxepay-success-icon">\n ${y}\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 p=null===(n=this.container)||void 0===n?void 0:n.querySelector("#voxepay-back-to-card");null==p||p.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(await new Promise(e=>setTimeout(e,1500)),6!==this.state.otp.length)throw{code:"INVALID_OTP",message:"Invalid OTP",recoverable:!0}}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");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 p=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-method-tab");if(null==p||p.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=v(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=`${y}`,a.classList.add("voxepay-copied"),setTimeout(()=>{a.innerHTML=`${u}`,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=`${b} <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&&g[i.code]||"",r.style.opacity=i?"1":"0"),this.clearError("cardNumber")}handleExpiryInput(e){const t=e.target,a=p(t.value);t.value=a,this.state.expiry=a,this.clearError("expiry")}handleCVVInput(e){const t=e.target,a=l(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=`${x} ${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){this.setProcessing(!0);try{await new Promise(e=>setTimeout(e,1e3)),this.setProcessing(!1),this.renderOTPView()}catch(e){this.setProcessing(!1);const t=e;this.options.onError(t),this.showError("cardNumber",t.message||"Payment failed. Please try again.")}}}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 ${v(this.options.amount,this.options.currency)}</span>`)}async processPayment(){return await new Promise(e=>setTimeout(e,2e3)),{id:`pay_${Date.now()}`,status:"success",amount:this.options.amount,currency:this.options.currency,timestamp:(new Date).toISOString()}}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: 8px; padding: 14px 16px; border: none; background: transparent; color: var(--voxepay-text-muted); font-size: 0.875rem; font-weight: 500; font-family: inherit; cursor: pointer; transition: all var(--voxepay-transition-fast); border-bottom: 2px solid transparent; }\n .voxepay-method-tab svg { width: 18px; height: 18px; }\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 w{constructor(){this.config=null,this.currentModal=null,this.initialized=!1}init(e){e.apiKey?(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] API key is required")}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 f({...e,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.1.0"}get isInitialized(){return this.initialized}}const k=new w;return"undefined"!=typeof window&&(window.VoxePay=k),e.VoxePay=k,e.VoxePaySDK=w,e.default=k,e.detectCardBrand=a,e.formatAmount=v,e.formatCVV=l,e.formatCardNumber=s,e.formatExpiry=p,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 p(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 l(e){return e.replace(/\D/g,"").slice(0,4)}function v(e,t){return new Intl.NumberFormat("en-US",{style:"currency",currency:t,minimumFractionDigits:2}).format(e/100)}const d='<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>',c='<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>',y='<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>',x='<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>',u='<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>',h='<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>',m='<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>',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 8v4l3 3m6-3a9 9 0 11-18 0 9 9 0 0118 0z" />\n </svg>',g={visa:"VISA",mastercard:"MC",amex:"AMEX",verve:"VERVE",discover:"DISC"};class f{constructor(e){this.container=null,this.overlay=null,this.handleEscape=e=>{"Escape"===e.key&&(this.close(),document.removeEventListener("keydown",this.handleEscape))},this.options=e;const t=e.paymentMethods||["card","bank_transfer"];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}}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=v(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 ${d}\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 ${m} <span>Card</span>\n </button>`:""}\n ${t.includes("bank_transfer")?`\n <button class="voxepay-method-tab ${n?"":"active"}" data-method="bank_transfer">\n ${h} <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 ${c}\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 ${u}\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 ${b}\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=v(this.options.amount,this.options.currency);t.innerHTML=`\n <div class="voxepay-success-view">\n <div class="voxepay-success-icon">\n ${y}\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 p=null===(n=this.container)||void 0===n?void 0:n.querySelector("#voxepay-back-to-card");null==p||p.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(await new Promise(e=>setTimeout(e,1500)),6!==this.state.otp.length)throw{code:"INVALID_OTP",message:"Invalid OTP",recoverable:!0}}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");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 p=null===(a=this.container)||void 0===a?void 0:a.querySelectorAll(".voxepay-method-tab");if(null==p||p.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=v(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=`${y}`,a.classList.add("voxepay-copied"),setTimeout(()=>{a.innerHTML=`${u}`,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=`${b} <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&&g[i.code]||"",r.style.opacity=i?"1":"0"),this.clearError("cardNumber")}handleExpiryInput(e){const t=e.target,a=p(t.value);t.value=a,this.state.expiry=a,this.clearError("expiry")}handleCVVInput(e){const t=e.target,a=l(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=`${x} ${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){this.setProcessing(!0);try{await new Promise(e=>setTimeout(e,1e3)),this.setProcessing(!1),this.renderOTPView()}catch(e){this.setProcessing(!1);const t=e;this.options.onError(t),this.showError("cardNumber",t.message||"Payment failed. Please try again.")}}}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 ${v(this.options.amount,this.options.currency)}</span>`)}async processPayment(){return await new Promise(e=>setTimeout(e,2e3)),{id:`pay_${Date.now()}`,status:"success",amount:this.options.amount,currency:this.options.currency,timestamp:(new Date).toISOString()}}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 w{constructor(){this.config=null,this.currentModal=null,this.initialized=!1}init(e){e.apiKey?(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] API key is required")}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 f({...e,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.1.0"}get isInitialized(){return this.initialized}}const k=new w;return"undefined"!=typeof window&&(window.VoxePay=k),e.VoxePay=k,e.VoxePaySDK=w,e.default=k,e.detectCardBrand=a,e.formatAmount=v,e.formatCVV=l,e.formatCardNumber=s,e.formatExpiry=p,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/components/modal.ts","../src/voxepay.ts"],"sourcesContent":[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","ICONS","CARD_BRAND_DISPLAY","visa","mastercard","amex","verve","discover","VoxePayModal","constructor","options","this","container","overlay","handleEscape","e","key","close","document","removeEventListener","methods","paymentMethods","state","otp","errors","isProcessing","isSuccess","isOtpStep","otpTimer","canResendOtp","otpTimerInterval","paymentMethod","transferTimer","transferTimerInterval","bankTransferDetails","open","injectStyles","render","attachEventListeners","requestAnimationFrame","_a","classList","add","stopTransferTimer","remove","setTimeout","_c","onClose","getElementById","createElement","id","textContent","getStyles","head","appendChild","className","innerHTML","getModalHTML","body","querySelector","getPaymentMethods","formattedAmount","showTabs","isCard","description","getCardFormHTML","getBankTransferHTML","details","accountNumber","bankName","accountName","reference","formatCountdown","expiresIn","seconds","m","Math","floor","s","String","padStart","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","result","processPayment","onSuccess","paymentError","showError","message","Promise","resolve","recoverable","cardInput","expiryInput","cvvInput","tabs","tab","method","dataset","switchPaymentMethod","handleCardInput","validateField","handleExpiryInput","_f","handleCVVInput","form","_g","handleSubmit","attachBankTransferListeners","startTransferTimer","loadBankTransferDetails","copyBtn","accountNum","copy","copyToClipboard","confirmBtn","handleTransferConfirm","onBankTransferRequested","toString","toUpperCase","onError","text","navigator","clipboard","writeText","textarea","position","opacity","select","execCommand","removeChild","status","timestamp","toISOString","countdownEl","formatted","brandEl","field","errorEl","inputEl","isCardValid","isExpiryValid","isCVVValid","setProcessing","submitBtn","VoxePaySDK","config","currentModal","initialized","init","apiKey","theme","locale","applyAutoTheme","documentElement","customStyles","applyCustomStyles","console","log","checkout","closeModal","call","setTheme","matchMedia","matches","toggle","styles","root","Object","entries","setProperty","version","isInitialized","VoxePay","NGN","USD","EUR","GBP","GHS","KES","ZAR"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"voxepay-checkout.min.js","sources":["../src/utils/card-validator.ts","../src/utils/formatter.ts","../src/components/modal.ts","../src/voxepay.ts"],"sourcesContent":[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","ICONS","CARD_BRAND_DISPLAY","visa","mastercard","amex","verve","discover","VoxePayModal","constructor","options","this","container","overlay","handleEscape","e","key","close","document","removeEventListener","methods","paymentMethods","state","otp","errors","isProcessing","isSuccess","isOtpStep","otpTimer","canResendOtp","otpTimerInterval","paymentMethod","transferTimer","transferTimerInterval","bankTransferDetails","open","injectStyles","render","attachEventListeners","requestAnimationFrame","_a","classList","add","stopTransferTimer","remove","setTimeout","_c","onClose","getElementById","createElement","id","textContent","getStyles","head","appendChild","className","innerHTML","getModalHTML","body","querySelector","getPaymentMethods","formattedAmount","showTabs","isCard","description","getCardFormHTML","getBankTransferHTML","details","accountNumber","bankName","accountName","reference","formatCountdown","expiresIn","seconds","m","Math","floor","s","String","padStart","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","result","processPayment","onSuccess","paymentError","showError","message","Promise","resolve","recoverable","cardInput","expiryInput","cvvInput","tabs","tab","method","dataset","switchPaymentMethod","handleCardInput","validateField","handleExpiryInput","_f","handleCVVInput","form","_g","handleSubmit","attachBankTransferListeners","startTransferTimer","loadBankTransferDetails","copyBtn","accountNum","copy","copyToClipboard","confirmBtn","handleTransferConfirm","onBankTransferRequested","toString","toUpperCase","onError","text","navigator","clipboard","writeText","textarea","position","opacity","select","execCommand","removeChild","status","timestamp","toISOString","countdownEl","formatted","brandEl","field","errorEl","inputEl","isCardValid","isExpiryValid","isCVVValid","setProcessing","submitBtn","VoxePaySDK","config","currentModal","initialized","init","apiKey","theme","locale","applyAutoTheme","documentElement","customStyles","applyCustomStyles","console","log","checkout","closeModal","call","setTheme","matchMedia","matches","toggle","styles","root","Object","entries","setProperty","version","isInitialized","VoxePay","NGN","USD","EUR","GBP","GHS","KES","ZAR"],"mappings":"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"}
|