@thepayulink/checkout 2.2.0 → 2.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/README.md CHANGED
@@ -14,7 +14,7 @@ Or with no build step, from the CDN:
14
14
 
15
15
  ```html
16
16
  <!-- pinned (recommended: immutable, cached a year) -->
17
- <script src="https://assetcdn.payulink.io/checkout/v1/checkout-2.2.0.js"></script>
17
+ <script src="https://assetcdn.payulink.io/checkout/v1/checkout-2.2.1.js"></script>
18
18
 
19
19
  <!-- or float on the latest v1 (cached up to 4 hours) -->
20
20
  <script src="https://assetcdn.payulink.io/checkout/v1/checkout.js"></script>
@@ -1,4 +1,4 @@
1
- var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var re=(l,s)=>{for(var r in s)O(l,r,{get:s[r],enumerable:!0})},ie=(l,s,r,m)=>{if(s&&typeof s=="object"||typeof s=="function")for(let h of ae(s))!te.call(l,h)&&h!==r&&O(l,h,{get:()=>s[h],enumerable:!(m=le(s,h))||m.enumerable});return l};var oe=l=>ie(O({},"__esModule",{value:!0}),l);var ce={};re(ce,{default:()=>M});module.exports=oe(ce);var ne=`
1
+ var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var re=(l,i)=>{for(var r in i)O(l,r,{get:i[r],enumerable:!0})},ie=(l,i,r,m)=>{if(i&&typeof i=="object"||typeof i=="function")for(let h of ae(i))!te.call(l,h)&&h!==r&&O(l,h,{get:()=>i[h],enumerable:!(m=le(i,h))||m.enumerable});return l};var oe=l=>ie(O({},"__esModule",{value:!0}),l);var ce={};re(ce,{default:()=>M});module.exports=oe(ce);var ne=`
2
2
  #pl-overlay * { box-sizing: border-box; margin: 0; padding: 0; }
3
3
  #pl-overlay { --pl-blue:#3395ff; --pl-blue-dark:#1f86f5; --pl-brand:#0b3068; --pl-ink:#1a2a44; --pl-mut:#6b7c93; --pl-line:#eceff4;
4
4
  position: fixed; inset: 0; z-index: 2147483000; font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
@@ -246,7 +246,7 @@ var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object
246
246
  #pl-overlay .pl-approw { justify-content: center; }
247
247
  #pl-overlay .pl-validrow { margin: 0 auto; }
248
248
  }
249
- `,D=!1;function R(l=document){if(D&&l.getElementById("pl-checkout-styles"))return;let s=l.createElement("style");s.id="pl-checkout-styles",s.textContent=ne,l.head.appendChild(s),D=!0}var pe=l=>"\u20B9"+Number(l||0).toLocaleString("en-IN",{maximumFractionDigits:2}),se=l=>`${Math.floor(l/60)}:${l%60<10?"0":""}${l%60}`,y=l=>String(l==null?"":l).replace(/[&<>"]/g,s=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[s]),x=l=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${l}</svg>`,S={qr:x('<rect width="5" height="5" x="3" y="3" rx="1"/><rect width="5" height="5" x="16" y="3" rx="1"/><rect width="5" height="5" x="3" y="16" rx="1"/><path d="M21 16h-3a2 2 0 0 0-2 2v3"/><path d="M21 21v.01"/><path d="M12 7v3a2 2 0 0 1-2 2H7"/><path d="M3 12h.01"/><path d="M12 3h.01"/><path d="M12 16v.01"/><path d="M16 12h1"/><path d="M21 12v.01"/><path d="M12 21v-1"/>'),card:x('<rect width="20" height="14" x="2" y="5" rx="2"/><line x1="2" x2="22" y1="10" y2="10"/>'),netbanking:x('<path d="M10 18v-7"/><path d="M11.119 2.205a2 2 0 0 1 1.762 0l7.84 3.846A.5.5 0 0 1 20.5 7h-17a.5.5 0 0 1-.22-.949z"/><path d="M14 18v-7"/><path d="M18 18v-7"/><path d="M3 22h18"/><path d="M6 18v-7"/>'),wallet:x('<path d="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1"/><path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"/>'),emi:x('<path d="M16 14v2.2l1.6 1"/><path d="M16 2v4"/><path d="M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5"/><path d="M3 10h5"/><path d="M8 2v4"/><circle cx="16" cy="16" r="6"/>'),back:x('<path d="M15 18l-6-6 6-6"/>'),mail:x('<rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/>'),arrow:x('<path d="M5 12h14M13 6l6 6-6 6"/>'),verified:x('<path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/>'),lock:x('<rect width="18" height="11" x="3" y="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>')},N='<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 1l9 4v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4z"/></svg>',de=[{m:"card",t:"Cards",s:"Visa, Mastercard & RuPay",ic:"card"},{m:"netbanking",t:"Netbanking",s:"All Indian banks",ic:"netbanking"},{m:"wallet",t:"Wallet",s:"Paytm, PhonePe & more",ic:"wallet"},{m:"emi",t:"EMI",s:"EMI via cards & more",ic:"emi"}];function H(l){R(),l=Object.assign({name:"Payment",description:"",amount:0,assetBase:"/assets",logo:"/assets/payulink-logo.png",prefill:{},apiBase:""},l);let s=String(l.apiBase||"").replace(/\/$/,""),r=pe(l.amount),m=["gpay","phonepe","paytm","bhim","amazonpay"].reduce((e,a)=>(e[a]=`${l.assetBase}/upi/${a}.png`,e),{}),h=["phonepe","gpay","paytm","bhim","amazonpay"],t={screen:"loader",order:null,customer:null,timer:null,stop:null,done:!1,utr:null,expiryMs:null},i=document.createElement("div");i.id="pl-overlay",l.brandColor&&i.style.setProperty("--pl-brand",l.brandColor),i.innerHTML=`
249
+ `,D=!1;function R(l=document){if(D&&l.getElementById("pl-checkout-styles"))return;let i=l.createElement("style");i.id="pl-checkout-styles",i.textContent=ne,l.head.appendChild(i),D=!0}var pe=l=>{let i=Number(l||0);return"\u20B9"+i.toLocaleString("en-IN",{minimumFractionDigits:i%1===0?0:2,maximumFractionDigits:2})},se=l=>`${Math.floor(l/60)}:${l%60<10?"0":""}${l%60}`,y=l=>String(l==null?"":l).replace(/[&<>"]/g,i=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[i]),x=l=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${l}</svg>`,S={qr:x('<rect width="5" height="5" x="3" y="3" rx="1"/><rect width="5" height="5" x="16" y="3" rx="1"/><rect width="5" height="5" x="3" y="16" rx="1"/><path d="M21 16h-3a2 2 0 0 0-2 2v3"/><path d="M21 21v.01"/><path d="M12 7v3a2 2 0 0 1-2 2H7"/><path d="M3 12h.01"/><path d="M12 3h.01"/><path d="M12 16v.01"/><path d="M16 12h1"/><path d="M21 12v.01"/><path d="M12 21v-1"/>'),card:x('<rect width="20" height="14" x="2" y="5" rx="2"/><line x1="2" x2="22" y1="10" y2="10"/>'),netbanking:x('<path d="M10 18v-7"/><path d="M11.119 2.205a2 2 0 0 1 1.762 0l7.84 3.846A.5.5 0 0 1 20.5 7h-17a.5.5 0 0 1-.22-.949z"/><path d="M14 18v-7"/><path d="M18 18v-7"/><path d="M3 22h18"/><path d="M6 18v-7"/>'),wallet:x('<path d="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1"/><path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"/>'),emi:x('<path d="M16 14v2.2l1.6 1"/><path d="M16 2v4"/><path d="M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5"/><path d="M3 10h5"/><path d="M8 2v4"/><circle cx="16" cy="16" r="6"/>'),back:x('<path d="M15 18l-6-6 6-6"/>'),mail:x('<rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/>'),arrow:x('<path d="M5 12h14M13 6l6 6-6 6"/>'),verified:x('<path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/>'),lock:x('<rect width="18" height="11" x="3" y="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>')},N='<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 1l9 4v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4z"/></svg>',de=[{m:"card",t:"Cards",s:"Visa, Mastercard & RuPay",ic:"card"},{m:"netbanking",t:"Netbanking",s:"All Indian banks",ic:"netbanking"},{m:"wallet",t:"Wallet",s:"Paytm, PhonePe & more",ic:"wallet"},{m:"emi",t:"EMI",s:"EMI via cards & more",ic:"emi"}];function H(l){R(),l=Object.assign({name:"Payment",description:"",amount:0,assetBase:"/assets",logo:"/assets/payulink-logo.png",prefill:{},apiBase:""},l);let i=String(l.apiBase||"").replace(/\/$/,""),r=pe(l.amount),m=["gpay","phonepe","paytm","bhim","amazonpay"].reduce((e,a)=>(e[a]=`${l.assetBase}/upi/${a}.png`,e),{}),h=["phonepe","gpay","paytm","bhim","amazonpay"],t={screen:"loader",order:null,customer:null,timer:null,stop:null,done:!1,utr:null,expiryMs:null},o=document.createElement("div");o.id="pl-overlay",l.brandColor&&o.style.setProperty("--pl-brand",l.brandColor),o.innerHTML=`
250
250
  <div class="pl-modal" role="dialog" aria-modal="true">
251
251
  <div class="pl-splash" id="pl-splash">
252
252
  <div class="pl-shield">
@@ -287,7 +287,7 @@ var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object
287
287
  <div class="pl-vp"><div class="pl-screen pl-active" id="pl-screen"></div></div>
288
288
  <footer class="pl-foot">${S.lock}<span>Encrypted &amp; secure payments</span></footer>
289
289
  </section>
290
- </div>`,document.body.appendChild(i);let v=document.body.style.overflow;document.body.style.overflow="hidden";let E=i.querySelector(".pl-vp"),I=i.querySelector("#pl-title"),j=i.querySelector("#pl-back");function C(){q(),l.onDismiss&&l.onDismiss()}function q(){if(t.stop)try{t.stop()}catch{}clearInterval(t.timer),i.classList.add("pl-closing"),document.body.style.overflow=v,setTimeout(()=>i.remove(),240)}i.querySelector("#pl-close").onclick=C,i.addEventListener("mousedown",e=>{e.target.id==="pl-overlay"&&C()}),j.onclick=()=>{t.screen==="contact"||t.screen==="success"||d("options")};let f={loader:"Payment Options",contact:"Contact Details",options:"Payment Options",success:"Payment Successful"};function d(e){t.screen=e,I.textContent=f[e]||"Payment",j.classList.toggle("pl-show",e==="options"),clearInterval(t.timer);let a=document.createElement("div");a.className="pl-screen pl-active"+(e==="options"?" pl-screen-options":""),a.innerHTML=u[e]?u[e]():"",E.replaceChildren(a),_(e,a)}let o=h.slice(0,4).map(e=>`<img src="${m[e]}" alt="">`).join(""),b=h.map(e=>`<a class="pl-uapp" data-app="${e}" title="${e}"><img src="${m[e]}" alt="${e}"></a>`).join(""),u={loader:()=>`<div class="pl-loader"><div class="pl-bload"><img src="${y(l.logo)}" alt=""><span class="pl-bring"></span><span class="pl-bripple"></span><span class="pl-bripple pl-bripple2"></span></div><p>Securely loading payment options\u2026</p></div>`,contact:()=>`
290
+ </div>`,document.body.appendChild(o);let v=document.body.style.overflow;document.body.style.overflow="hidden";let E=o.querySelector(".pl-vp"),I=o.querySelector("#pl-title"),j=o.querySelector("#pl-back");function C(){q(),l.onDismiss&&l.onDismiss()}function q(){if(t.stop)try{t.stop()}catch{}clearInterval(t.timer),o.classList.add("pl-closing"),document.body.style.overflow=v,setTimeout(()=>o.remove(),240)}o.querySelector("#pl-close").onclick=C,o.addEventListener("mousedown",e=>{e.target.id==="pl-overlay"&&C()}),j.onclick=()=>{t.screen==="contact"||t.screen==="success"||d("options")};let f={loader:"Payment Options",contact:"Contact Details",options:"Payment Options",success:"Payment Successful"};function d(e){t.screen=e,I.textContent=f[e]||"Payment",j.classList.toggle("pl-show",e==="options"),clearInterval(t.timer);let a=document.createElement("div");a.className="pl-screen pl-active"+(e==="options"?" pl-screen-options":""),a.innerHTML=u[e]?u[e]():"",E.replaceChildren(a),_(e,a)}let n=h.slice(0,4).map(e=>`<img src="${m[e]}" alt="">`).join(""),g=h.map(e=>`<a class="pl-uapp" data-app="${e}" title="${e}"><img src="${m[e]}" alt="${e}"></a>`).join(""),u={loader:()=>`<div class="pl-loader"><div class="pl-bload"><img src="${y(l.logo)}" alt=""><span class="pl-bring"></span><span class="pl-bripple"></span><span class="pl-bripple pl-bripple2"></span></div><p>Securely loading payment options\u2026</p></div>`,contact:()=>`
291
291
  <div class="pl-pad">
292
292
  <div class="pl-h1">Contact details</div>
293
293
  <div class="pl-sub">Enter your details to continue the payment</div>
@@ -309,7 +309,7 @@ var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object
309
309
  <div class="pl-navitem active" data-m="upi">
310
310
  <div class="pl-ni-ic">${S.qr}</div>
311
311
  <div class="pl-ni-body"><div class="pl-ni-t">UPI</div></div>
312
- <div class="pl-ni-apps">${o}</div>
312
+ <div class="pl-ni-apps">${n}</div>
313
313
  </div>
314
314
  <div class="pl-navlabel">Cards, Banking &amp; More</div>
315
315
  ${de.map(e=>`
@@ -323,7 +323,7 @@ var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object
323
323
  </div>`,success:()=>{let e=["#00c060","#3395ff","#ffb020","#ff5a5f","#7a52d8","#19c3c3"];return`
324
324
  <div class="pl-success">
325
325
  <div class="pl-burst">
326
- ${Array.from({length:18},(n,p)=>{let c=p/18*Math.PI*2+(p%2?.22:-.22),k=60+p*13%40,P=Math.round(Math.cos(c)*k),U=Math.round(Math.sin(c)*k),J=e[p%e.length],Z=(p%2?1:-1)*(140+p*14),K=p%3===0?6:8,ee=p%4===0?6:12;return`<i class="pl-confetti" style="--tx:${P}px;--ty:${U}px;--c:${J};--r:${Z}deg;width:${K}px;height:${ee}px;border-radius:${p%4===0?"50%":"2px"};animation-delay:${(.15+p*.024).toFixed(3)}s"></i>`}).join("")}
326
+ ${Array.from({length:18},(p,s)=>{let c=s/18*Math.PI*2+(s%2?.22:-.22),k=60+s*13%40,P=Math.round(Math.cos(c)*k),U=Math.round(Math.sin(c)*k),J=e[s%e.length],Z=(s%2?1:-1)*(140+s*14),K=s%3===0?6:8,ee=s%4===0?6:12;return`<i class="pl-confetti" style="--tx:${P}px;--ty:${U}px;--c:${J};--r:${Z}deg;width:${K}px;height:${ee}px;border-radius:${s%4===0?"50%":"2px"};animation-delay:${(.15+s*.024).toFixed(3)}s"></i>`}).join("")}
327
327
  <span class="pl-ripple"></span><span class="pl-ripple pl-ripple2"></span>
328
328
  <div class="pl-check"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></div>
329
329
  </div>
@@ -337,7 +337,7 @@ var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object
337
337
  <div class="pl-qrbox" id="pl-qr"><div class="pl-qrloading"></div></div>
338
338
  <div class="pl-qrside">
339
339
  <div class="pl-scan">Scan the QR using any UPI App</div>
340
- <div class="pl-approw" id="pl-applist">${b}</div>
340
+ <div class="pl-approw" id="pl-applist">${g}</div>
341
341
  <div class="pl-validrow"><span class="pl-dot"></span><span id="pl-timer">Valid 5:00</span></div>
342
342
  </div>
343
343
  </div>
@@ -346,4 +346,4 @@ var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object
346
346
  <input class="pl-vpa" id="pl-vpa" placeholder="example@okhdfcbank" autocomplete="off" spellcheck="false">
347
347
  <button class="pl-verify" id="pl-verify">Verify and Pay</button>
348
348
  </div>
349
- <div id="pl-status" class="pl-pendrow"><span class="pl-mini-spin"></span> Waiting for payment\u2026</div>`}function _(e,a){if(e==="contact")a.querySelector("#pl-continue").onclick=()=>{let n=a.querySelector("#pl-name").value.trim(),p=a.querySelector("#pl-mobile").value.replace(/\D/g,""),c=a.querySelector("#pl-email").value.trim(),k=a.querySelector("#pl-cerr");if(n.length<2)return k.textContent="Please enter your name";if(p.length!==10)return k.textContent="Enter a valid 10-digit mobile number";t.customer={name:n,mobile:p,email:c},d("options")};else if(e==="options"){a.querySelectorAll(".pl-navitem").forEach(p=>p.onclick=()=>{p.dataset.m!=="upi"&&L("Coming soon \u2014 please pay via UPI / QR for now")});let n=a.querySelector("#pl-verify");n&&(n.onclick=()=>{let p=(a.querySelector("#pl-vpa").value||"").trim();if(!/^[\w.\-]{2,}@[a-zA-Z]{2,}$/.test(p))return a.querySelector("#pl-vpa").focus(),L("Enter a valid UPI ID, e.g. name@okhdfcbank");let c=t.order&&(t.order.upi_intent_url||t.order.payment_link);c&&/Android|iPhone|iPad|Mobile/i.test(navigator.userAgent)?location.href=c:L("Scan the QR with your phone\u2019s UPI app to complete the payment.")}),A(),w(!0)}}let g=!1;async function w(e){if(e||d("options"),t.order){$();return}if(!g){g=!0;try{t.customer||(t.customer={name:l.prefill.name||"Customer",mobile:(l.prefill.contact||"").replace(/\D/g,""),email:l.prefill.email||""}),t.order=await l.createOrder(t.customer),$(),F()}catch(a){let n=i.querySelector("#pl-qr");if(n){n.innerHTML=`<div class="pl-qrerr"><span>${y(a.message||"Could not start payment")}</span><button class="pl-retry" id="pl-retry">Try again</button></div>`;let p=n.querySelector("#pl-retry");p&&(p.onclick=()=>{g=!1,n.innerHTML='<div class="pl-qrloading"></div>',w(!0)})}}finally{g=!1}}}function $(){let e=t.order;if(!e)return;Q(e);let a=i.querySelector("#pl-qr");a&&(e.qr_data_url?a.innerHTML=`<img src="${e.qr_data_url}" alt="UPI QR">`:a.innerHTML=`<div class="pl-qrerr"><span>${y(e.qr_unavailable_reason||"QR unavailable \u2014 use a UPI app below")}</span></div>`);let n=e.upi_intent_url||e.payment_link||"#",p=i.querySelector("#pl-applist");p&&p.querySelectorAll(".pl-uapp").forEach(c=>{c.setAttribute("href",n),c.setAttribute("target","_blank"),c.setAttribute("rel","noopener")}),e.test_mode&&typeof e.simulate=="function"&&V(e),A()}function V(e){let a=i.querySelector(".pl-scan");a&&(a.textContent="Test mode \u2014 no real payment. Simulate the result below.");let n=i.querySelector("#pl-applist");n&&(n.style.display="none");let p=i.querySelector(".pl-paneh2");p&&(p.textContent="Simulate payment (test mode)");let c=i.querySelector(".pl-vparow");!c||c.dataset.sim||(c.dataset.sim="1",c.innerHTML='<div class="pl-simrow"><button class="pl-sim pl-sim-ok" data-outcome="success">Simulate success</button><button class="pl-sim pl-sim-fail" data-outcome="failure">Simulate failure</button></div>',c.querySelectorAll(".pl-sim").forEach(k=>k.onclick=async()=>{c.querySelectorAll(".pl-sim").forEach(P=>P.disabled=!0),z("pending","Simulating\u2026");try{await e.simulate(k.dataset.outcome)}catch(P){z("failed",P.message||"Simulation failed"),c.querySelectorAll(".pl-sim").forEach(U=>U.disabled=!1)}}))}function Q(e){e&&e.expires_at&&e.server_now?t.expiryMs=Date.now()+Math.max(0,e.expires_at-e.server_now):t.expiryMs||(t.expiryMs=Date.now()+5*60*1e3)}function B(){if(t.done)return;let e=i.querySelector("#pl-qr");e&&(e.innerHTML='<div class="pl-qrerr"><span>QR code expired</span><button class="pl-retry" id="pl-regen">Generate new QR</button></div>');let a=i.querySelector("#pl-regen");a&&(a.onclick=X);let n=i.querySelector("#pl-timer");n&&(n.textContent="Expired");let p=i.querySelector(".pl-validrow");p&&p.classList.add("pl-expired")}function X(){if(t.stop){try{t.stop()}catch{}t.stop=null}t.order=null,t.expiryMs=null,g=!1;let e=i.querySelector(".pl-validrow");e&&e.classList.remove("pl-expired");let a=i.querySelector("#pl-qr");a&&(a.innerHTML='<div class="pl-qrloading"></div>'),w(!0)}function F(){!t.order||t.stop||(t.stop=l.watchOrder(t.order.merchant_order_no,e=>{!e||typeof e.status!="number"||(e.status===0?(t.utr=e.utr||t.utr,G()):e.status===3?(clearInterval(t.timer),t.expiryMs=Date.now(),B(),z("failed","QR expired \u2014 generate a new one")):[1,4].includes(e.status)?z("failed","Payment "+(e.status_label||"failed").toLowerCase()):e.status===6&&z("pending","Processing payment\u2026"))}))}function z(e,a){let n=i.querySelector("#pl-status");n&&(n.className=e==="failed"?"pl-pendrow pl-fail":"pl-pendrow",n.innerHTML=(e==="pending"?'<span class="pl-mini-spin"></span> ':"")+y(a))}function G(){t.done||(t.done=!0,clearInterval(t.timer),d("success"),l.onSuccess&&l.onSuccess({merchant_order_no:t.order.merchant_order_no,utr:t.utr,amount:l.amount}),t.utr||W())}async function W(){if(typeof l.fetchUtr=="function")for(let e=0;e<10&&!t.utr;e++){await new Promise(a=>setTimeout(a,4e3));try{let a=await l.fetchUtr();if(a){t.utr=a;let n=i.querySelector("#pl-pid");n&&t.screen==="success"&&n.insertAdjacentHTML("afterend",`<div class="pl-pid pl-utr">UTR ${y(a)}</div>`);break}}catch{}}}function A(){clearInterval(t.timer);let e=()=>{let a=i.querySelector("#pl-timer");if(!a)return;if(!t.expiryMs){a.textContent="Valid 5:00";return}let n=Math.max(0,Math.round((t.expiryMs-Date.now())/1e3));a.textContent=n>0?"Valid "+se(n):"Expired",n<=0&&(clearInterval(t.timer),B())};e(),t.timer=setInterval(e,1e3)}function L(e){let a=document.getElementById("pl-toast");a||(a=document.createElement("div"),a.id="pl-toast",document.body.appendChild(a)),a.textContent=e,a.classList.add("pl-show"),clearTimeout(a._t),a._t=setTimeout(()=>a.classList.remove("pl-show"),2600)}return d("loader"),setTimeout(()=>{let e=l.prefill||{};e.name&&(e.contact||"").replace(/\D/g,"").length===10?(t.customer={name:e.name,mobile:e.contact.replace(/\D/g,""),email:e.email||""},d("options")):d("contact");let a=i.querySelector("#pl-splash");a&&(a.classList.add("pl-splash-hide"),setTimeout(()=>a.remove(),450))},1600),{close:q}}var Y={apiBase:"https://payulink.io/api",assetBase:"https://assetcdn.payulink.io/checkout/v1/assets",name:null,logo:null,brandColor:null,pollMs:2500},M=class l{constructor(s={}){if(typeof window=="undefined"||typeof document=="undefined")throw new Error("PayuLink checkout runs in the browser only. On React Native use @thepayulink/checkout-react-native; on a server use @thepayulink/server.");let r=s.key||s.keyId||s.key_id;if(!r)throw new Error("PayuLink: `key` (your publishable pl_live_\u2026 / pl_test_\u2026 key) is required");if(/^pl_(live|test)_/.test(r)||console.warn("PayuLink: `key` should look like pl_live_\u2026 or pl_test_\u2026"),s.keySecret||s.key_secret)throw new Error("PayuLink: never pass a key_secret to the browser SDK. It belongs on your server only.");this.options=Object.assign({},Y,s,{key:r})}open(s={}){let r=Object.assign({},this.options,s),m=String(r.apiBase||"").replace(/\/$/,""),h=String(r.assetBase||`${m}/assets`).replace(/\/$/,""),t=r.order_id||r.orderId;if(!t)throw new Error("PayuLink: `order_id` is required. Create it on your server with POST /v1/orders.");let i=f=>{typeof r.onError=="function"?r.onError(f):console.error("PayuLink:",f.message||f)},v=null,E=null,I=async()=>v!=null&&v.session_token?(await fetch(`${m}/v1/checkout/session/${encodeURIComponent(v.session_token)}`)).json().catch(()=>({})):{},j=async f=>{var b,u,T;let d=await fetch(`${m}/v1/checkout/session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key_id:r.key,order_id:t,customer:f?{name:f.name,contact:f.mobile||f.contact,email:f.email}:void 0})}),o=await d.json().catch(()=>({}));if(!d.ok){let _=new Error(((b=o==null?void 0:o.error)==null?void 0:b.description)||`Could not start payment (HTTP ${d.status})`);throw _.code=(u=o==null?void 0:o.error)==null?void 0:u.code,_.retriable=((T=o==null?void 0:o.error)==null?void 0:T.code)==="GATEWAY_BUSY",_}return v=o,{merchant_order_no:o.order_id,amount:o.amount/100,upi_intent_url:o.upi_intent_url,payment_link:o.payment_link,qr_data_url:o.qr_data_url||null,qr_unavailable_reason:o.qr_unavailable_reason||null,qr_retriable:o.qr_retriable===!0,expires_at:o.expires_at?o.expires_at*1e3:null,server_now:Date.now(),test_mode:o.test_mode===!0,simulate:o.test_mode===!0&&o.simulate_url?async _=>{var $;let g=await fetch(`${m}${o.simulate_url}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({outcome:_})}),w=await g.json().catch(()=>({}));if(!g.ok)throw new Error((($=w==null?void 0:w.error)==null?void 0:$.description)||`Simulation failed (HTTP ${g.status})`);return w}:null}},C=(f,d)=>{let o=async()=>{if(v!=null&&v.session_token)try{let u=await I();u.status==="paid"&&u.payulink_signature&&(E={payulink_order_id:u.payulink_order_id,payulink_payment_id:u.payulink_payment_id,payulink_signature:u.payulink_signature,utr:u.utr||null,amount:u.amount}),d({status:u.status==="paid"?0:u.status==="failed"?1:u.status==="expired"?3:2,status_label:String(u.status||"pending").toUpperCase(),utr:u.utr||null})}catch{}},b=setInterval(o,r.pollMs||Y.pollMs);return o(),()=>clearInterval(b)},q={_inner:null,close(){var f;(f=this._inner)==null||f.close()}};return fetch(`${m}/v1/checkout/order/${encodeURIComponent(t)}?key_id=${encodeURIComponent(r.key)}`).then(async f=>{var o;let d=await f.json().catch(()=>({}));if(!f.ok)throw new Error(((o=d==null?void 0:d.error)==null?void 0:o.description)||"Unknown or expired order");q._inner=H(Object.assign({},{apiBase:m,assetBase:h,name:r.name||d.merchant_name,logo:r.logo||`${h}/payulink-logo.png`,brandColor:r.brandColor||r.theme&&r.theme.color||null,testMode:d.mode==="test",note:r.note,prefill:r.prefill||{},amount:d.amount/100,description:r.description||r.item||d.merchant_name,createOrder:j,watchOrder:C,fetchUtr:async()=>(await I()).utr||null,onSuccess:()=>{let b=E||{payulink_order_id:(v==null?void 0:v.order_id)||t,payulink_payment_id:null,payulink_signature:null};typeof r.handler=="function"&&r.handler(b),typeof r.onSuccess=="function"&&r.onSuccess(b)},onDismiss:()=>{typeof r.onDismiss=="function"&&r.onDismiss()},onError:i}))}).catch(i),q}static open(s={}){return new l(s).open(s)}};typeof window!="undefined"&&(window.PayuLink=M,window.PayulinkCheckout=M);
349
+ <div id="pl-status" class="pl-pendrow"><span class="pl-mini-spin"></span> Waiting for payment\u2026</div>`}function _(e,a){if(e==="contact")a.querySelector("#pl-continue").onclick=()=>{let p=a.querySelector("#pl-name").value.trim(),s=a.querySelector("#pl-mobile").value.replace(/\D/g,""),c=a.querySelector("#pl-email").value.trim(),k=a.querySelector("#pl-cerr");if(p.length<2)return k.textContent="Please enter your name";if(s.length!==10)return k.textContent="Enter a valid 10-digit mobile number";t.customer={name:p,mobile:s,email:c},d("options")};else if(e==="options"){a.querySelectorAll(".pl-navitem").forEach(s=>s.onclick=()=>{s.dataset.m!=="upi"&&L("Coming soon \u2014 please pay via UPI / QR for now")});let p=a.querySelector("#pl-verify");p&&(p.onclick=()=>{let s=(a.querySelector("#pl-vpa").value||"").trim();if(!/^[\w.\-]{2,}@[a-zA-Z]{2,}$/.test(s))return a.querySelector("#pl-vpa").focus(),L("Enter a valid UPI ID, e.g. name@okhdfcbank");let c=t.order&&(t.order.upi_intent_url||t.order.payment_link);c&&/Android|iPhone|iPad|Mobile/i.test(navigator.userAgent)?location.href=c:L("Scan the QR with your phone\u2019s UPI app to complete the payment.")}),A(),w(!0)}}let b=!1;async function w(e){if(e||d("options"),t.order){$();return}if(!b){b=!0;try{t.customer||(t.customer={name:l.prefill.name||"Customer",mobile:(l.prefill.contact||"").replace(/\D/g,""),email:l.prefill.email||""}),t.order=await l.createOrder(t.customer),$(),X()}catch(a){let p=o.querySelector("#pl-qr");if(p){p.innerHTML=`<div class="pl-qrerr"><span>${y(a.message||"Could not start payment")}</span><button class="pl-retry" id="pl-retry">Try again</button></div>`;let s=p.querySelector("#pl-retry");s&&(s.onclick=()=>{b=!1,p.innerHTML='<div class="pl-qrloading"></div>',w(!0)})}}finally{b=!1}}}function $(){let e=t.order;if(!e)return;Q(e);let a=o.querySelector("#pl-qr");a&&(e.qr_data_url?a.innerHTML=`<img src="${e.qr_data_url}" alt="UPI QR">`:a.innerHTML=`<div class="pl-qrerr"><span>${y(e.qr_unavailable_reason||"QR unavailable \u2014 use a UPI app below")}</span></div>`);let p=e.upi_intent_url||e.payment_link||"#",s=o.querySelector("#pl-applist");s&&s.querySelectorAll(".pl-uapp").forEach(c=>{c.setAttribute("href",p),c.setAttribute("target","_blank"),c.setAttribute("rel","noopener")}),e.test_mode&&typeof e.simulate=="function"&&V(e),A()}function V(e){let a=o.querySelector(".pl-scan");a&&(a.textContent="Test mode \u2014 no real payment. Simulate the result below.");let p=o.querySelector("#pl-applist");p&&(p.style.display="none");let s=o.querySelector(".pl-paneh2");s&&(s.textContent="Simulate payment (test mode)");let c=o.querySelector(".pl-vparow");!c||c.dataset.sim||(c.dataset.sim="1",c.innerHTML='<div class="pl-simrow"><button class="pl-sim pl-sim-ok" data-outcome="success">Simulate success</button><button class="pl-sim pl-sim-fail" data-outcome="failure">Simulate failure</button></div>',c.querySelectorAll(".pl-sim").forEach(k=>k.onclick=async()=>{c.querySelectorAll(".pl-sim").forEach(P=>P.disabled=!0),z("pending","Simulating\u2026");try{await e.simulate(k.dataset.outcome)}catch(P){z("failed",P.message||"Simulation failed"),c.querySelectorAll(".pl-sim").forEach(U=>U.disabled=!1)}}))}function Q(e){e&&e.expires_at&&e.server_now?t.expiryMs=Date.now()+Math.max(0,e.expires_at-e.server_now):t.expiryMs||(t.expiryMs=Date.now()+5*60*1e3)}function B(){if(t.done)return;let e=o.querySelector("#pl-qr");e&&(e.innerHTML='<div class="pl-qrerr"><span>QR code expired</span><button class="pl-retry" id="pl-regen">Generate new QR</button></div>');let a=o.querySelector("#pl-regen");a&&(a.onclick=F);let p=o.querySelector("#pl-timer");p&&(p.textContent="Expired");let s=o.querySelector(".pl-validrow");s&&s.classList.add("pl-expired")}function F(){if(t.stop){try{t.stop()}catch{}t.stop=null}t.order=null,t.expiryMs=null,b=!1;let e=o.querySelector(".pl-validrow");e&&e.classList.remove("pl-expired");let a=o.querySelector("#pl-qr");a&&(a.innerHTML='<div class="pl-qrloading"></div>'),w(!0)}function X(){!t.order||t.stop||(t.stop=l.watchOrder(t.order.merchant_order_no,e=>{!e||typeof e.status!="number"||(e.status===0?(t.utr=e.utr||t.utr,G()):e.status===3?(clearInterval(t.timer),t.expiryMs=Date.now(),B(),z("failed","QR expired \u2014 generate a new one")):[1,4].includes(e.status)?z("failed","Payment "+(e.status_label||"failed").toLowerCase()):e.status===6&&z("pending","Processing payment\u2026"))}))}function z(e,a){let p=o.querySelector("#pl-status");p&&(p.className=e==="failed"?"pl-pendrow pl-fail":"pl-pendrow",p.innerHTML=(e==="pending"?'<span class="pl-mini-spin"></span> ':"")+y(a))}function G(){t.done||(t.done=!0,clearInterval(t.timer),d("success"),l.onSuccess&&l.onSuccess({merchant_order_no:t.order.merchant_order_no,utr:t.utr,amount:l.amount}),t.utr||W())}async function W(){if(typeof l.fetchUtr=="function")for(let e=0;e<10&&!t.utr;e++){await new Promise(a=>setTimeout(a,4e3));try{let a=await l.fetchUtr();if(a){t.utr=a;let p=o.querySelector("#pl-pid");p&&t.screen==="success"&&p.insertAdjacentHTML("afterend",`<div class="pl-pid pl-utr">UTR ${y(a)}</div>`);break}}catch{}}}function A(){clearInterval(t.timer);let e=()=>{let a=o.querySelector("#pl-timer");if(!a)return;if(!t.expiryMs){a.textContent="Valid 5:00";return}let p=Math.max(0,Math.round((t.expiryMs-Date.now())/1e3));a.textContent=p>0?"Valid "+se(p):"Expired",p<=0&&(clearInterval(t.timer),B())};e(),t.timer=setInterval(e,1e3)}function L(e){let a=document.getElementById("pl-toast");a||(a=document.createElement("div"),a.id="pl-toast",document.body.appendChild(a)),a.textContent=e,a.classList.add("pl-show"),clearTimeout(a._t),a._t=setTimeout(()=>a.classList.remove("pl-show"),2600)}return d("loader"),setTimeout(()=>{let e=l.prefill||{};e.name&&(e.contact||"").replace(/\D/g,"").length===10?(t.customer={name:e.name,mobile:e.contact.replace(/\D/g,""),email:e.email||""},d("options")):d("contact");let a=o.querySelector("#pl-splash");a&&(a.classList.add("pl-splash-hide"),setTimeout(()=>a.remove(),450))},1600),{close:q}}var Y={apiBase:"https://payulink.io/api",assetBase:"https://assetcdn.payulink.io/checkout/v1/assets",name:null,logo:null,brandColor:null,pollMs:2500},M=class l{constructor(i={}){if(typeof window=="undefined"||typeof document=="undefined")throw new Error("PayuLink checkout runs in the browser only. On React Native use @thepayulink/checkout-react-native; on a server use @thepayulink/server.");let r=i.key||i.keyId||i.key_id;if(!r)throw new Error("PayuLink: `key` (your publishable pl_live_\u2026 / pl_test_\u2026 key) is required");if(/^pl_(live|test)_/.test(r)||console.warn("PayuLink: `key` should look like pl_live_\u2026 or pl_test_\u2026"),i.keySecret||i.key_secret)throw new Error("PayuLink: never pass a key_secret to the browser SDK. It belongs on your server only.");this.options=Object.assign({},Y,i,{key:r})}open(i={}){let r=Object.assign({},this.options,i),m=String(r.apiBase||"").replace(/\/$/,""),h=String(r.assetBase||`${m}/assets`).replace(/\/$/,""),t=r.order_id||r.orderId;if(!t)throw new Error("PayuLink: `order_id` is required. Create it on your server with POST /v1/orders.");let o=f=>{typeof r.onError=="function"?r.onError(f):console.error("PayuLink:",f.message||f)},v=null,E=null,I=async()=>v!=null&&v.session_token?(await fetch(`${m}/v1/checkout/session/${encodeURIComponent(v.session_token)}`)).json().catch(()=>({})):{},j=async f=>{var g,u,T;let d=await fetch(`${m}/v1/checkout/session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key_id:r.key,order_id:t,customer:f?{name:f.name,contact:f.mobile||f.contact,email:f.email}:void 0})}),n=await d.json().catch(()=>({}));if(!d.ok){let _=new Error(((g=n==null?void 0:n.error)==null?void 0:g.description)||`Could not start payment (HTTP ${d.status})`);throw _.code=(u=n==null?void 0:n.error)==null?void 0:u.code,_.retriable=((T=n==null?void 0:n.error)==null?void 0:T.code)==="GATEWAY_BUSY",_}return v=n,{merchant_order_no:n.order_id,amount:n.amount/100,upi_intent_url:n.upi_intent_url,payment_link:n.payment_link,qr_data_url:n.qr_data_url||null,qr_unavailable_reason:n.qr_unavailable_reason||null,qr_retriable:n.qr_retriable===!0,expires_at:n.expires_at?n.expires_at*1e3:null,server_now:Date.now(),test_mode:n.test_mode===!0,simulate:n.test_mode===!0&&n.simulate_url?async _=>{var $;let b=await fetch(`${m}${n.simulate_url}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({outcome:_})}),w=await b.json().catch(()=>({}));if(!b.ok)throw new Error((($=w==null?void 0:w.error)==null?void 0:$.description)||`Simulation failed (HTTP ${b.status})`);return w}:null}},C=(f,d)=>{let n=async()=>{if(v!=null&&v.session_token)try{let u=await I();u.status==="paid"&&u.payulink_signature&&(E={payulink_order_id:u.payulink_order_id,payulink_payment_id:u.payulink_payment_id,payulink_signature:u.payulink_signature,utr:u.utr||null,amount:u.amount}),d({status:u.status==="paid"?0:u.status==="failed"?1:u.status==="expired"?3:2,status_label:String(u.status||"pending").toUpperCase(),utr:u.utr||null})}catch{}},g=setInterval(n,r.pollMs||Y.pollMs);return n(),()=>clearInterval(g)},q={_inner:null,close(){var f;(f=this._inner)==null||f.close()}};return fetch(`${m}/v1/checkout/order/${encodeURIComponent(t)}?key_id=${encodeURIComponent(r.key)}`).then(async f=>{var n;let d=await f.json().catch(()=>({}));if(!f.ok)throw new Error(((n=d==null?void 0:d.error)==null?void 0:n.description)||"Unknown or expired order");q._inner=H(Object.assign({},{apiBase:m,assetBase:h,name:r.name||d.merchant_name,logo:r.logo||`${h}/payulink-logo.png`,brandColor:r.brandColor||r.theme&&r.theme.color||null,testMode:d.mode==="test",note:r.note,prefill:r.prefill||{},amount:d.amount/100,description:r.description||r.item||d.merchant_name,createOrder:j,watchOrder:C,fetchUtr:async()=>(await I()).utr||null,onSuccess:()=>{let g=E||{payulink_order_id:(v==null?void 0:v.order_id)||t,payulink_payment_id:null,payulink_signature:null};typeof r.handler=="function"&&r.handler(g),typeof r.onSuccess=="function"&&r.onSuccess(g)},onDismiss:()=>{typeof r.onDismiss=="function"&&r.onDismiss()},onError:o}))}).catch(o),q}static open(i={}){return new l(i).open(i)}};typeof window!="undefined"&&(window.PayuLink=M,window.PayulinkCheckout=M);
@@ -246,7 +246,7 @@ var ee=`
246
246
  #pl-overlay .pl-approw { justify-content: center; }
247
247
  #pl-overlay .pl-validrow { margin: 0 auto; }
248
248
  }
249
- `,A=!1;function D(t=document){if(A&&t.getElementById("pl-checkout-styles"))return;let f=t.createElement("style");f.id="pl-checkout-styles",f.textContent=ee,t.head.appendChild(f),A=!0}var le=t=>"\u20B9"+Number(t||0).toLocaleString("en-IN",{maximumFractionDigits:2}),ae=t=>`${Math.floor(t/60)}:${t%60<10?"0":""}${t%60}`,y=t=>String(t==null?"":t).replace(/[&<>"]/g,f=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[f]),m=t=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${t}</svg>`,_={qr:m('<rect width="5" height="5" x="3" y="3" rx="1"/><rect width="5" height="5" x="16" y="3" rx="1"/><rect width="5" height="5" x="3" y="16" rx="1"/><path d="M21 16h-3a2 2 0 0 0-2 2v3"/><path d="M21 21v.01"/><path d="M12 7v3a2 2 0 0 1-2 2H7"/><path d="M3 12h.01"/><path d="M12 3h.01"/><path d="M12 16v.01"/><path d="M16 12h1"/><path d="M21 12v.01"/><path d="M12 21v-1"/>'),card:m('<rect width="20" height="14" x="2" y="5" rx="2"/><line x1="2" x2="22" y1="10" y2="10"/>'),netbanking:m('<path d="M10 18v-7"/><path d="M11.119 2.205a2 2 0 0 1 1.762 0l7.84 3.846A.5.5 0 0 1 20.5 7h-17a.5.5 0 0 1-.22-.949z"/><path d="M14 18v-7"/><path d="M18 18v-7"/><path d="M3 22h18"/><path d="M6 18v-7"/>'),wallet:m('<path d="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1"/><path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"/>'),emi:m('<path d="M16 14v2.2l1.6 1"/><path d="M16 2v4"/><path d="M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5"/><path d="M3 10h5"/><path d="M8 2v4"/><circle cx="16" cy="16" r="6"/>'),back:m('<path d="M15 18l-6-6 6-6"/>'),mail:m('<rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/>'),arrow:m('<path d="M5 12h14M13 6l6 6-6 6"/>'),verified:m('<path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/>'),lock:m('<rect width="18" height="11" x="3" y="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>')},R='<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 1l9 4v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4z"/></svg>',te=[{m:"card",t:"Cards",s:"Visa, Mastercard & RuPay",ic:"card"},{m:"netbanking",t:"Netbanking",s:"All Indian banks",ic:"netbanking"},{m:"wallet",t:"Wallet",s:"Paytm, PhonePe & more",ic:"wallet"},{m:"emi",t:"EMI",s:"EMI via cards & more",ic:"emi"}];function N(t){D(),t=Object.assign({name:"Payment",description:"",amount:0,assetBase:"/assets",logo:"/assets/payulink-logo.png",prefill:{},apiBase:""},t);let f=String(t.apiBase||"").replace(/\/$/,""),r=le(t.amount),h=["gpay","phonepe","paytm","bhim","amazonpay"].reduce((e,l)=>(e[l]=`${t.assetBase}/upi/${l}.png`,e),{}),S=["phonepe","gpay","paytm","bhim","amazonpay"],a={screen:"loader",order:null,customer:null,timer:null,stop:null,done:!1,utr:null,expiryMs:null},i=document.createElement("div");i.id="pl-overlay",t.brandColor&&i.style.setProperty("--pl-brand",t.brandColor),i.innerHTML=`
249
+ `,A=!1;function D(t=document){if(A&&t.getElementById("pl-checkout-styles"))return;let s=t.createElement("style");s.id="pl-checkout-styles",s.textContent=ee,t.head.appendChild(s),A=!0}var le=t=>{let s=Number(t||0);return"\u20B9"+s.toLocaleString("en-IN",{minimumFractionDigits:s%1===0?0:2,maximumFractionDigits:2})},ae=t=>`${Math.floor(t/60)}:${t%60<10?"0":""}${t%60}`,y=t=>String(t==null?"":t).replace(/[&<>"]/g,s=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[s]),m=t=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${t}</svg>`,_={qr:m('<rect width="5" height="5" x="3" y="3" rx="1"/><rect width="5" height="5" x="16" y="3" rx="1"/><rect width="5" height="5" x="3" y="16" rx="1"/><path d="M21 16h-3a2 2 0 0 0-2 2v3"/><path d="M21 21v.01"/><path d="M12 7v3a2 2 0 0 1-2 2H7"/><path d="M3 12h.01"/><path d="M12 3h.01"/><path d="M12 16v.01"/><path d="M16 12h1"/><path d="M21 12v.01"/><path d="M12 21v-1"/>'),card:m('<rect width="20" height="14" x="2" y="5" rx="2"/><line x1="2" x2="22" y1="10" y2="10"/>'),netbanking:m('<path d="M10 18v-7"/><path d="M11.119 2.205a2 2 0 0 1 1.762 0l7.84 3.846A.5.5 0 0 1 20.5 7h-17a.5.5 0 0 1-.22-.949z"/><path d="M14 18v-7"/><path d="M18 18v-7"/><path d="M3 22h18"/><path d="M6 18v-7"/>'),wallet:m('<path d="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1"/><path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"/>'),emi:m('<path d="M16 14v2.2l1.6 1"/><path d="M16 2v4"/><path d="M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5"/><path d="M3 10h5"/><path d="M8 2v4"/><circle cx="16" cy="16" r="6"/>'),back:m('<path d="M15 18l-6-6 6-6"/>'),mail:m('<rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/>'),arrow:m('<path d="M5 12h14M13 6l6 6-6 6"/>'),verified:m('<path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/>'),lock:m('<rect width="18" height="11" x="3" y="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>')},R='<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 1l9 4v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4z"/></svg>',te=[{m:"card",t:"Cards",s:"Visa, Mastercard & RuPay",ic:"card"},{m:"netbanking",t:"Netbanking",s:"All Indian banks",ic:"netbanking"},{m:"wallet",t:"Wallet",s:"Paytm, PhonePe & more",ic:"wallet"},{m:"emi",t:"EMI",s:"EMI via cards & more",ic:"emi"}];function N(t){D(),t=Object.assign({name:"Payment",description:"",amount:0,assetBase:"/assets",logo:"/assets/payulink-logo.png",prefill:{},apiBase:""},t);let s=String(t.apiBase||"").replace(/\/$/,""),r=le(t.amount),h=["gpay","phonepe","paytm","bhim","amazonpay"].reduce((e,l)=>(e[l]=`${t.assetBase}/upi/${l}.png`,e),{}),S=["phonepe","gpay","paytm","bhim","amazonpay"],a={screen:"loader",order:null,customer:null,timer:null,stop:null,done:!1,utr:null,expiryMs:null},i=document.createElement("div");i.id="pl-overlay",t.brandColor&&i.style.setProperty("--pl-brand",t.brandColor),i.innerHTML=`
250
250
  <div class="pl-modal" role="dialog" aria-modal="true">
251
251
  <div class="pl-splash" id="pl-splash">
252
252
  <div class="pl-shield">
@@ -287,7 +287,7 @@ var ee=`
287
287
  <div class="pl-vp"><div class="pl-screen pl-active" id="pl-screen"></div></div>
288
288
  <footer class="pl-foot">${_.lock}<span>Encrypted &amp; secure payments</span></footer>
289
289
  </section>
290
- </div>`,document.body.appendChild(i);let v=document.body.style.overflow;document.body.style.overflow="hidden";let E=i.querySelector(".pl-vp"),I=i.querySelector("#pl-title"),j=i.querySelector("#pl-back");function C(){M(),t.onDismiss&&t.onDismiss()}function M(){if(a.stop)try{a.stop()}catch{}clearInterval(a.timer),i.classList.add("pl-closing"),document.body.style.overflow=v,setTimeout(()=>i.remove(),240)}i.querySelector("#pl-close").onclick=C,i.addEventListener("mousedown",e=>{e.target.id==="pl-overlay"&&C()}),j.onclick=()=>{a.screen==="contact"||a.screen==="success"||s("options")};let c={loader:"Payment Options",contact:"Contact Details",options:"Payment Options",success:"Payment Successful"};function s(e){a.screen=e,I.textContent=c[e]||"Payment",j.classList.toggle("pl-show",e==="options"),clearInterval(a.timer);let l=document.createElement("div");l.className="pl-screen pl-active"+(e==="options"?" pl-screen-options":""),l.innerHTML=u[e]?u[e]():"",E.replaceChildren(l),k(e,l)}let o=S.slice(0,4).map(e=>`<img src="${h[e]}" alt="">`).join(""),x=S.map(e=>`<a class="pl-uapp" data-app="${e}" title="${e}"><img src="${h[e]}" alt="${e}"></a>`).join(""),u={loader:()=>`<div class="pl-loader"><div class="pl-bload"><img src="${y(t.logo)}" alt=""><span class="pl-bring"></span><span class="pl-bripple"></span><span class="pl-bripple pl-bripple2"></span></div><p>Securely loading payment options\u2026</p></div>`,contact:()=>`
290
+ </div>`,document.body.appendChild(i);let v=document.body.style.overflow;document.body.style.overflow="hidden";let E=i.querySelector(".pl-vp"),I=i.querySelector("#pl-title"),j=i.querySelector("#pl-back");function C(){M(),t.onDismiss&&t.onDismiss()}function M(){if(a.stop)try{a.stop()}catch{}clearInterval(a.timer),i.classList.add("pl-closing"),document.body.style.overflow=v,setTimeout(()=>i.remove(),240)}i.querySelector("#pl-close").onclick=C,i.addEventListener("mousedown",e=>{e.target.id==="pl-overlay"&&C()}),j.onclick=()=>{a.screen==="contact"||a.screen==="success"||d("options")};let f={loader:"Payment Options",contact:"Contact Details",options:"Payment Options",success:"Payment Successful"};function d(e){a.screen=e,I.textContent=f[e]||"Payment",j.classList.toggle("pl-show",e==="options"),clearInterval(a.timer);let l=document.createElement("div");l.className="pl-screen pl-active"+(e==="options"?" pl-screen-options":""),l.innerHTML=u[e]?u[e]():"",E.replaceChildren(l),k(e,l)}let o=S.slice(0,4).map(e=>`<img src="${h[e]}" alt="">`).join(""),x=S.map(e=>`<a class="pl-uapp" data-app="${e}" title="${e}"><img src="${h[e]}" alt="${e}"></a>`).join(""),u={loader:()=>`<div class="pl-loader"><div class="pl-bload"><img src="${y(t.logo)}" alt=""><span class="pl-bring"></span><span class="pl-bripple"></span><span class="pl-bripple pl-bripple2"></span></div><p>Securely loading payment options\u2026</p></div>`,contact:()=>`
291
291
  <div class="pl-pad">
292
292
  <div class="pl-h1">Contact details</div>
293
293
  <div class="pl-sub">Enter your details to continue the payment</div>
@@ -323,7 +323,7 @@ var ee=`
323
323
  </div>`,success:()=>{let e=["#00c060","#3395ff","#ffb020","#ff5a5f","#7a52d8","#19c3c3"];return`
324
324
  <div class="pl-success">
325
325
  <div class="pl-burst">
326
- ${Array.from({length:18},(n,p)=>{let d=p/18*Math.PI*2+(p%2?.22:-.22),w=60+p*13%40,z=Math.round(Math.cos(d)*w),U=Math.round(Math.sin(d)*w),W=e[p%e.length],J=(p%2?1:-1)*(140+p*14),Z=p%3===0?6:8,K=p%4===0?6:12;return`<i class="pl-confetti" style="--tx:${z}px;--ty:${U}px;--c:${W};--r:${J}deg;width:${Z}px;height:${K}px;border-radius:${p%4===0?"50%":"2px"};animation-delay:${(.15+p*.024).toFixed(3)}s"></i>`}).join("")}
326
+ ${Array.from({length:18},(n,p)=>{let c=p/18*Math.PI*2+(p%2?.22:-.22),w=60+p*13%40,z=Math.round(Math.cos(c)*w),U=Math.round(Math.sin(c)*w),W=e[p%e.length],J=(p%2?1:-1)*(140+p*14),Z=p%3===0?6:8,K=p%4===0?6:12;return`<i class="pl-confetti" style="--tx:${z}px;--ty:${U}px;--c:${W};--r:${J}deg;width:${Z}px;height:${K}px;border-radius:${p%4===0?"50%":"2px"};animation-delay:${(.15+p*.024).toFixed(3)}s"></i>`}).join("")}
327
327
  <span class="pl-ripple"></span><span class="pl-ripple pl-ripple2"></span>
328
328
  <div class="pl-check"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></div>
329
329
  </div>
@@ -346,4 +346,4 @@ var ee=`
346
346
  <input class="pl-vpa" id="pl-vpa" placeholder="example@okhdfcbank" autocomplete="off" spellcheck="false">
347
347
  <button class="pl-verify" id="pl-verify">Verify and Pay</button>
348
348
  </div>
349
- <div id="pl-status" class="pl-pendrow"><span class="pl-mini-spin"></span> Waiting for payment\u2026</div>`}function k(e,l){if(e==="contact")l.querySelector("#pl-continue").onclick=()=>{let n=l.querySelector("#pl-name").value.trim(),p=l.querySelector("#pl-mobile").value.replace(/\D/g,""),d=l.querySelector("#pl-email").value.trim(),w=l.querySelector("#pl-cerr");if(n.length<2)return w.textContent="Please enter your name";if(p.length!==10)return w.textContent="Enter a valid 10-digit mobile number";a.customer={name:n,mobile:p,email:d},s("options")};else if(e==="options"){l.querySelectorAll(".pl-navitem").forEach(p=>p.onclick=()=>{p.dataset.m!=="upi"&&L("Coming soon \u2014 please pay via UPI / QR for now")});let n=l.querySelector("#pl-verify");n&&(n.onclick=()=>{let p=(l.querySelector("#pl-vpa").value||"").trim();if(!/^[\w.\-]{2,}@[a-zA-Z]{2,}$/.test(p))return l.querySelector("#pl-vpa").focus(),L("Enter a valid UPI ID, e.g. name@okhdfcbank");let d=a.order&&(a.order.upi_intent_url||a.order.payment_link);d&&/Android|iPhone|iPad|Mobile/i.test(navigator.userAgent)?location.href=d:L("Scan the QR with your phone\u2019s UPI app to complete the payment.")}),B(),g(!0)}}let b=!1;async function g(e){if(e||s("options"),a.order){q();return}if(!b){b=!0;try{a.customer||(a.customer={name:t.prefill.name||"Customer",mobile:(t.prefill.contact||"").replace(/\D/g,""),email:t.prefill.email||""}),a.order=await t.createOrder(a.customer),q(),X()}catch(l){let n=i.querySelector("#pl-qr");if(n){n.innerHTML=`<div class="pl-qrerr"><span>${y(l.message||"Could not start payment")}</span><button class="pl-retry" id="pl-retry">Try again</button></div>`;let p=n.querySelector("#pl-retry");p&&(p.onclick=()=>{b=!1,n.innerHTML='<div class="pl-qrloading"></div>',g(!0)})}}finally{b=!1}}}function q(){let e=a.order;if(!e)return;V(e);let l=i.querySelector("#pl-qr");l&&(e.qr_data_url?l.innerHTML=`<img src="${e.qr_data_url}" alt="UPI QR">`:l.innerHTML=`<div class="pl-qrerr"><span>${y(e.qr_unavailable_reason||"QR unavailable \u2014 use a UPI app below")}</span></div>`);let n=e.upi_intent_url||e.payment_link||"#",p=i.querySelector("#pl-applist");p&&p.querySelectorAll(".pl-uapp").forEach(d=>{d.setAttribute("href",n),d.setAttribute("target","_blank"),d.setAttribute("rel","noopener")}),e.test_mode&&typeof e.simulate=="function"&&Y(e),B()}function Y(e){let l=i.querySelector(".pl-scan");l&&(l.textContent="Test mode \u2014 no real payment. Simulate the result below.");let n=i.querySelector("#pl-applist");n&&(n.style.display="none");let p=i.querySelector(".pl-paneh2");p&&(p.textContent="Simulate payment (test mode)");let d=i.querySelector(".pl-vparow");!d||d.dataset.sim||(d.dataset.sim="1",d.innerHTML='<div class="pl-simrow"><button class="pl-sim pl-sim-ok" data-outcome="success">Simulate success</button><button class="pl-sim pl-sim-fail" data-outcome="failure">Simulate failure</button></div>',d.querySelectorAll(".pl-sim").forEach(w=>w.onclick=async()=>{d.querySelectorAll(".pl-sim").forEach(z=>z.disabled=!0),$("pending","Simulating\u2026");try{await e.simulate(w.dataset.outcome)}catch(z){$("failed",z.message||"Simulation failed"),d.querySelectorAll(".pl-sim").forEach(U=>U.disabled=!1)}}))}function V(e){e&&e.expires_at&&e.server_now?a.expiryMs=Date.now()+Math.max(0,e.expires_at-e.server_now):a.expiryMs||(a.expiryMs=Date.now()+5*60*1e3)}function O(){if(a.done)return;let e=i.querySelector("#pl-qr");e&&(e.innerHTML='<div class="pl-qrerr"><span>QR code expired</span><button class="pl-retry" id="pl-regen">Generate new QR</button></div>');let l=i.querySelector("#pl-regen");l&&(l.onclick=Q);let n=i.querySelector("#pl-timer");n&&(n.textContent="Expired");let p=i.querySelector(".pl-validrow");p&&p.classList.add("pl-expired")}function Q(){if(a.stop){try{a.stop()}catch{}a.stop=null}a.order=null,a.expiryMs=null,b=!1;let e=i.querySelector(".pl-validrow");e&&e.classList.remove("pl-expired");let l=i.querySelector("#pl-qr");l&&(l.innerHTML='<div class="pl-qrloading"></div>'),g(!0)}function X(){!a.order||a.stop||(a.stop=t.watchOrder(a.order.merchant_order_no,e=>{!e||typeof e.status!="number"||(e.status===0?(a.utr=e.utr||a.utr,F()):e.status===3?(clearInterval(a.timer),a.expiryMs=Date.now(),O(),$("failed","QR expired \u2014 generate a new one")):[1,4].includes(e.status)?$("failed","Payment "+(e.status_label||"failed").toLowerCase()):e.status===6&&$("pending","Processing payment\u2026"))}))}function $(e,l){let n=i.querySelector("#pl-status");n&&(n.className=e==="failed"?"pl-pendrow pl-fail":"pl-pendrow",n.innerHTML=(e==="pending"?'<span class="pl-mini-spin"></span> ':"")+y(l))}function F(){a.done||(a.done=!0,clearInterval(a.timer),s("success"),t.onSuccess&&t.onSuccess({merchant_order_no:a.order.merchant_order_no,utr:a.utr,amount:t.amount}),a.utr||G())}async function G(){if(typeof t.fetchUtr=="function")for(let e=0;e<10&&!a.utr;e++){await new Promise(l=>setTimeout(l,4e3));try{let l=await t.fetchUtr();if(l){a.utr=l;let n=i.querySelector("#pl-pid");n&&a.screen==="success"&&n.insertAdjacentHTML("afterend",`<div class="pl-pid pl-utr">UTR ${y(l)}</div>`);break}}catch{}}}function B(){clearInterval(a.timer);let e=()=>{let l=i.querySelector("#pl-timer");if(!l)return;if(!a.expiryMs){l.textContent="Valid 5:00";return}let n=Math.max(0,Math.round((a.expiryMs-Date.now())/1e3));l.textContent=n>0?"Valid "+ae(n):"Expired",n<=0&&(clearInterval(a.timer),O())};e(),a.timer=setInterval(e,1e3)}function L(e){let l=document.getElementById("pl-toast");l||(l=document.createElement("div"),l.id="pl-toast",document.body.appendChild(l)),l.textContent=e,l.classList.add("pl-show"),clearTimeout(l._t),l._t=setTimeout(()=>l.classList.remove("pl-show"),2600)}return s("loader"),setTimeout(()=>{let e=t.prefill||{};e.name&&(e.contact||"").replace(/\D/g,"").length===10?(a.customer={name:e.name,mobile:e.contact.replace(/\D/g,""),email:e.email||""},s("options")):s("contact");let l=i.querySelector("#pl-splash");l&&(l.classList.add("pl-splash-hide"),setTimeout(()=>l.remove(),450))},1600),{close:M}}var H={apiBase:"https://payulink.io/api",assetBase:"https://assetcdn.payulink.io/checkout/v1/assets",name:null,logo:null,brandColor:null,pollMs:2500},P=class t{constructor(f={}){if(typeof window=="undefined"||typeof document=="undefined")throw new Error("PayuLink checkout runs in the browser only. On React Native use @thepayulink/checkout-react-native; on a server use @thepayulink/server.");let r=f.key||f.keyId||f.key_id;if(!r)throw new Error("PayuLink: `key` (your publishable pl_live_\u2026 / pl_test_\u2026 key) is required");if(/^pl_(live|test)_/.test(r)||console.warn("PayuLink: `key` should look like pl_live_\u2026 or pl_test_\u2026"),f.keySecret||f.key_secret)throw new Error("PayuLink: never pass a key_secret to the browser SDK. It belongs on your server only.");this.options=Object.assign({},H,f,{key:r})}open(f={}){let r=Object.assign({},this.options,f),h=String(r.apiBase||"").replace(/\/$/,""),S=String(r.assetBase||`${h}/assets`).replace(/\/$/,""),a=r.order_id||r.orderId;if(!a)throw new Error("PayuLink: `order_id` is required. Create it on your server with POST /v1/orders.");let i=c=>{typeof r.onError=="function"?r.onError(c):console.error("PayuLink:",c.message||c)},v=null,E=null,I=async()=>v!=null&&v.session_token?(await fetch(`${h}/v1/checkout/session/${encodeURIComponent(v.session_token)}`)).json().catch(()=>({})):{},j=async c=>{var x,u,T;let s=await fetch(`${h}/v1/checkout/session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key_id:r.key,order_id:a,customer:c?{name:c.name,contact:c.mobile||c.contact,email:c.email}:void 0})}),o=await s.json().catch(()=>({}));if(!s.ok){let k=new Error(((x=o==null?void 0:o.error)==null?void 0:x.description)||`Could not start payment (HTTP ${s.status})`);throw k.code=(u=o==null?void 0:o.error)==null?void 0:u.code,k.retriable=((T=o==null?void 0:o.error)==null?void 0:T.code)==="GATEWAY_BUSY",k}return v=o,{merchant_order_no:o.order_id,amount:o.amount/100,upi_intent_url:o.upi_intent_url,payment_link:o.payment_link,qr_data_url:o.qr_data_url||null,qr_unavailable_reason:o.qr_unavailable_reason||null,qr_retriable:o.qr_retriable===!0,expires_at:o.expires_at?o.expires_at*1e3:null,server_now:Date.now(),test_mode:o.test_mode===!0,simulate:o.test_mode===!0&&o.simulate_url?async k=>{var q;let b=await fetch(`${h}${o.simulate_url}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({outcome:k})}),g=await b.json().catch(()=>({}));if(!b.ok)throw new Error(((q=g==null?void 0:g.error)==null?void 0:q.description)||`Simulation failed (HTTP ${b.status})`);return g}:null}},C=(c,s)=>{let o=async()=>{if(v!=null&&v.session_token)try{let u=await I();u.status==="paid"&&u.payulink_signature&&(E={payulink_order_id:u.payulink_order_id,payulink_payment_id:u.payulink_payment_id,payulink_signature:u.payulink_signature,utr:u.utr||null,amount:u.amount}),s({status:u.status==="paid"?0:u.status==="failed"?1:u.status==="expired"?3:2,status_label:String(u.status||"pending").toUpperCase(),utr:u.utr||null})}catch{}},x=setInterval(o,r.pollMs||H.pollMs);return o(),()=>clearInterval(x)},M={_inner:null,close(){var c;(c=this._inner)==null||c.close()}};return fetch(`${h}/v1/checkout/order/${encodeURIComponent(a)}?key_id=${encodeURIComponent(r.key)}`).then(async c=>{var o;let s=await c.json().catch(()=>({}));if(!c.ok)throw new Error(((o=s==null?void 0:s.error)==null?void 0:o.description)||"Unknown or expired order");M._inner=N(Object.assign({},{apiBase:h,assetBase:S,name:r.name||s.merchant_name,logo:r.logo||`${S}/payulink-logo.png`,brandColor:r.brandColor||r.theme&&r.theme.color||null,testMode:s.mode==="test",note:r.note,prefill:r.prefill||{},amount:s.amount/100,description:r.description||r.item||s.merchant_name,createOrder:j,watchOrder:C,fetchUtr:async()=>(await I()).utr||null,onSuccess:()=>{let x=E||{payulink_order_id:(v==null?void 0:v.order_id)||a,payulink_payment_id:null,payulink_signature:null};typeof r.handler=="function"&&r.handler(x),typeof r.onSuccess=="function"&&r.onSuccess(x)},onDismiss:()=>{typeof r.onDismiss=="function"&&r.onDismiss()},onError:i}))}).catch(i),M}static open(f={}){return new t(f).open(f)}};typeof window!="undefined"&&(window.PayuLink=P,window.PayulinkCheckout=P);export{P as default};
349
+ <div id="pl-status" class="pl-pendrow"><span class="pl-mini-spin"></span> Waiting for payment\u2026</div>`}function k(e,l){if(e==="contact")l.querySelector("#pl-continue").onclick=()=>{let n=l.querySelector("#pl-name").value.trim(),p=l.querySelector("#pl-mobile").value.replace(/\D/g,""),c=l.querySelector("#pl-email").value.trim(),w=l.querySelector("#pl-cerr");if(n.length<2)return w.textContent="Please enter your name";if(p.length!==10)return w.textContent="Enter a valid 10-digit mobile number";a.customer={name:n,mobile:p,email:c},d("options")};else if(e==="options"){l.querySelectorAll(".pl-navitem").forEach(p=>p.onclick=()=>{p.dataset.m!=="upi"&&L("Coming soon \u2014 please pay via UPI / QR for now")});let n=l.querySelector("#pl-verify");n&&(n.onclick=()=>{let p=(l.querySelector("#pl-vpa").value||"").trim();if(!/^[\w.\-]{2,}@[a-zA-Z]{2,}$/.test(p))return l.querySelector("#pl-vpa").focus(),L("Enter a valid UPI ID, e.g. name@okhdfcbank");let c=a.order&&(a.order.upi_intent_url||a.order.payment_link);c&&/Android|iPhone|iPad|Mobile/i.test(navigator.userAgent)?location.href=c:L("Scan the QR with your phone\u2019s UPI app to complete the payment.")}),B(),b(!0)}}let g=!1;async function b(e){if(e||d("options"),a.order){q();return}if(!g){g=!0;try{a.customer||(a.customer={name:t.prefill.name||"Customer",mobile:(t.prefill.contact||"").replace(/\D/g,""),email:t.prefill.email||""}),a.order=await t.createOrder(a.customer),q(),F()}catch(l){let n=i.querySelector("#pl-qr");if(n){n.innerHTML=`<div class="pl-qrerr"><span>${y(l.message||"Could not start payment")}</span><button class="pl-retry" id="pl-retry">Try again</button></div>`;let p=n.querySelector("#pl-retry");p&&(p.onclick=()=>{g=!1,n.innerHTML='<div class="pl-qrloading"></div>',b(!0)})}}finally{g=!1}}}function q(){let e=a.order;if(!e)return;V(e);let l=i.querySelector("#pl-qr");l&&(e.qr_data_url?l.innerHTML=`<img src="${e.qr_data_url}" alt="UPI QR">`:l.innerHTML=`<div class="pl-qrerr"><span>${y(e.qr_unavailable_reason||"QR unavailable \u2014 use a UPI app below")}</span></div>`);let n=e.upi_intent_url||e.payment_link||"#",p=i.querySelector("#pl-applist");p&&p.querySelectorAll(".pl-uapp").forEach(c=>{c.setAttribute("href",n),c.setAttribute("target","_blank"),c.setAttribute("rel","noopener")}),e.test_mode&&typeof e.simulate=="function"&&Y(e),B()}function Y(e){let l=i.querySelector(".pl-scan");l&&(l.textContent="Test mode \u2014 no real payment. Simulate the result below.");let n=i.querySelector("#pl-applist");n&&(n.style.display="none");let p=i.querySelector(".pl-paneh2");p&&(p.textContent="Simulate payment (test mode)");let c=i.querySelector(".pl-vparow");!c||c.dataset.sim||(c.dataset.sim="1",c.innerHTML='<div class="pl-simrow"><button class="pl-sim pl-sim-ok" data-outcome="success">Simulate success</button><button class="pl-sim pl-sim-fail" data-outcome="failure">Simulate failure</button></div>',c.querySelectorAll(".pl-sim").forEach(w=>w.onclick=async()=>{c.querySelectorAll(".pl-sim").forEach(z=>z.disabled=!0),$("pending","Simulating\u2026");try{await e.simulate(w.dataset.outcome)}catch(z){$("failed",z.message||"Simulation failed"),c.querySelectorAll(".pl-sim").forEach(U=>U.disabled=!1)}}))}function V(e){e&&e.expires_at&&e.server_now?a.expiryMs=Date.now()+Math.max(0,e.expires_at-e.server_now):a.expiryMs||(a.expiryMs=Date.now()+5*60*1e3)}function O(){if(a.done)return;let e=i.querySelector("#pl-qr");e&&(e.innerHTML='<div class="pl-qrerr"><span>QR code expired</span><button class="pl-retry" id="pl-regen">Generate new QR</button></div>');let l=i.querySelector("#pl-regen");l&&(l.onclick=Q);let n=i.querySelector("#pl-timer");n&&(n.textContent="Expired");let p=i.querySelector(".pl-validrow");p&&p.classList.add("pl-expired")}function Q(){if(a.stop){try{a.stop()}catch{}a.stop=null}a.order=null,a.expiryMs=null,g=!1;let e=i.querySelector(".pl-validrow");e&&e.classList.remove("pl-expired");let l=i.querySelector("#pl-qr");l&&(l.innerHTML='<div class="pl-qrloading"></div>'),b(!0)}function F(){!a.order||a.stop||(a.stop=t.watchOrder(a.order.merchant_order_no,e=>{!e||typeof e.status!="number"||(e.status===0?(a.utr=e.utr||a.utr,X()):e.status===3?(clearInterval(a.timer),a.expiryMs=Date.now(),O(),$("failed","QR expired \u2014 generate a new one")):[1,4].includes(e.status)?$("failed","Payment "+(e.status_label||"failed").toLowerCase()):e.status===6&&$("pending","Processing payment\u2026"))}))}function $(e,l){let n=i.querySelector("#pl-status");n&&(n.className=e==="failed"?"pl-pendrow pl-fail":"pl-pendrow",n.innerHTML=(e==="pending"?'<span class="pl-mini-spin"></span> ':"")+y(l))}function X(){a.done||(a.done=!0,clearInterval(a.timer),d("success"),t.onSuccess&&t.onSuccess({merchant_order_no:a.order.merchant_order_no,utr:a.utr,amount:t.amount}),a.utr||G())}async function G(){if(typeof t.fetchUtr=="function")for(let e=0;e<10&&!a.utr;e++){await new Promise(l=>setTimeout(l,4e3));try{let l=await t.fetchUtr();if(l){a.utr=l;let n=i.querySelector("#pl-pid");n&&a.screen==="success"&&n.insertAdjacentHTML("afterend",`<div class="pl-pid pl-utr">UTR ${y(l)}</div>`);break}}catch{}}}function B(){clearInterval(a.timer);let e=()=>{let l=i.querySelector("#pl-timer");if(!l)return;if(!a.expiryMs){l.textContent="Valid 5:00";return}let n=Math.max(0,Math.round((a.expiryMs-Date.now())/1e3));l.textContent=n>0?"Valid "+ae(n):"Expired",n<=0&&(clearInterval(a.timer),O())};e(),a.timer=setInterval(e,1e3)}function L(e){let l=document.getElementById("pl-toast");l||(l=document.createElement("div"),l.id="pl-toast",document.body.appendChild(l)),l.textContent=e,l.classList.add("pl-show"),clearTimeout(l._t),l._t=setTimeout(()=>l.classList.remove("pl-show"),2600)}return d("loader"),setTimeout(()=>{let e=t.prefill||{};e.name&&(e.contact||"").replace(/\D/g,"").length===10?(a.customer={name:e.name,mobile:e.contact.replace(/\D/g,""),email:e.email||""},d("options")):d("contact");let l=i.querySelector("#pl-splash");l&&(l.classList.add("pl-splash-hide"),setTimeout(()=>l.remove(),450))},1600),{close:M}}var H={apiBase:"https://payulink.io/api",assetBase:"https://assetcdn.payulink.io/checkout/v1/assets",name:null,logo:null,brandColor:null,pollMs:2500},P=class t{constructor(s={}){if(typeof window=="undefined"||typeof document=="undefined")throw new Error("PayuLink checkout runs in the browser only. On React Native use @thepayulink/checkout-react-native; on a server use @thepayulink/server.");let r=s.key||s.keyId||s.key_id;if(!r)throw new Error("PayuLink: `key` (your publishable pl_live_\u2026 / pl_test_\u2026 key) is required");if(/^pl_(live|test)_/.test(r)||console.warn("PayuLink: `key` should look like pl_live_\u2026 or pl_test_\u2026"),s.keySecret||s.key_secret)throw new Error("PayuLink: never pass a key_secret to the browser SDK. It belongs on your server only.");this.options=Object.assign({},H,s,{key:r})}open(s={}){let r=Object.assign({},this.options,s),h=String(r.apiBase||"").replace(/\/$/,""),S=String(r.assetBase||`${h}/assets`).replace(/\/$/,""),a=r.order_id||r.orderId;if(!a)throw new Error("PayuLink: `order_id` is required. Create it on your server with POST /v1/orders.");let i=f=>{typeof r.onError=="function"?r.onError(f):console.error("PayuLink:",f.message||f)},v=null,E=null,I=async()=>v!=null&&v.session_token?(await fetch(`${h}/v1/checkout/session/${encodeURIComponent(v.session_token)}`)).json().catch(()=>({})):{},j=async f=>{var x,u,T;let d=await fetch(`${h}/v1/checkout/session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key_id:r.key,order_id:a,customer:f?{name:f.name,contact:f.mobile||f.contact,email:f.email}:void 0})}),o=await d.json().catch(()=>({}));if(!d.ok){let k=new Error(((x=o==null?void 0:o.error)==null?void 0:x.description)||`Could not start payment (HTTP ${d.status})`);throw k.code=(u=o==null?void 0:o.error)==null?void 0:u.code,k.retriable=((T=o==null?void 0:o.error)==null?void 0:T.code)==="GATEWAY_BUSY",k}return v=o,{merchant_order_no:o.order_id,amount:o.amount/100,upi_intent_url:o.upi_intent_url,payment_link:o.payment_link,qr_data_url:o.qr_data_url||null,qr_unavailable_reason:o.qr_unavailable_reason||null,qr_retriable:o.qr_retriable===!0,expires_at:o.expires_at?o.expires_at*1e3:null,server_now:Date.now(),test_mode:o.test_mode===!0,simulate:o.test_mode===!0&&o.simulate_url?async k=>{var q;let g=await fetch(`${h}${o.simulate_url}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({outcome:k})}),b=await g.json().catch(()=>({}));if(!g.ok)throw new Error(((q=b==null?void 0:b.error)==null?void 0:q.description)||`Simulation failed (HTTP ${g.status})`);return b}:null}},C=(f,d)=>{let o=async()=>{if(v!=null&&v.session_token)try{let u=await I();u.status==="paid"&&u.payulink_signature&&(E={payulink_order_id:u.payulink_order_id,payulink_payment_id:u.payulink_payment_id,payulink_signature:u.payulink_signature,utr:u.utr||null,amount:u.amount}),d({status:u.status==="paid"?0:u.status==="failed"?1:u.status==="expired"?3:2,status_label:String(u.status||"pending").toUpperCase(),utr:u.utr||null})}catch{}},x=setInterval(o,r.pollMs||H.pollMs);return o(),()=>clearInterval(x)},M={_inner:null,close(){var f;(f=this._inner)==null||f.close()}};return fetch(`${h}/v1/checkout/order/${encodeURIComponent(a)}?key_id=${encodeURIComponent(r.key)}`).then(async f=>{var o;let d=await f.json().catch(()=>({}));if(!f.ok)throw new Error(((o=d==null?void 0:d.error)==null?void 0:o.description)||"Unknown or expired order");M._inner=N(Object.assign({},{apiBase:h,assetBase:S,name:r.name||d.merchant_name,logo:r.logo||`${S}/payulink-logo.png`,brandColor:r.brandColor||r.theme&&r.theme.color||null,testMode:d.mode==="test",note:r.note,prefill:r.prefill||{},amount:d.amount/100,description:r.description||r.item||d.merchant_name,createOrder:j,watchOrder:C,fetchUtr:async()=>(await I()).utr||null,onSuccess:()=>{let x=E||{payulink_order_id:(v==null?void 0:v.order_id)||a,payulink_payment_id:null,payulink_signature:null};typeof r.handler=="function"&&r.handler(x),typeof r.onSuccess=="function"&&r.onSuccess(x)},onDismiss:()=>{typeof r.onDismiss=="function"&&r.onDismiss()},onError:i}))}).catch(i),M}static open(s={}){return new t(s).open(s)}};typeof window!="undefined"&&(window.PayuLink=P,window.PayulinkCheckout=P);export{P as default};
@@ -1,4 +1,4 @@
1
- var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var re=(l,s)=>{for(var r in s)O(l,r,{get:s[r],enumerable:!0})},ie=(l,s,r,m)=>{if(s&&typeof s=="object"||typeof s=="function")for(let h of ae(s))!te.call(l,h)&&h!==r&&O(l,h,{get:()=>s[h],enumerable:!(m=le(s,h))||m.enumerable});return l};var oe=l=>ie(O({},"__esModule",{value:!0}),l);var ce={};re(ce,{default:()=>M});var ne=`
1
+ var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPropertyDescriptor;var ae=Object.getOwnPropertyNames;var te=Object.prototype.hasOwnProperty;var re=(l,i)=>{for(var r in i)O(l,r,{get:i[r],enumerable:!0})},ie=(l,i,r,m)=>{if(i&&typeof i=="object"||typeof i=="function")for(let h of ae(i))!te.call(l,h)&&h!==r&&O(l,h,{get:()=>i[h],enumerable:!(m=le(i,h))||m.enumerable});return l};var oe=l=>ie(O({},"__esModule",{value:!0}),l);var ce={};re(ce,{default:()=>M});var ne=`
2
2
  #pl-overlay * { box-sizing: border-box; margin: 0; padding: 0; }
3
3
  #pl-overlay { --pl-blue:#3395ff; --pl-blue-dark:#1f86f5; --pl-brand:#0b3068; --pl-ink:#1a2a44; --pl-mut:#6b7c93; --pl-line:#eceff4;
4
4
  position: fixed; inset: 0; z-index: 2147483000; font-family: 'Inter', system-ui, -apple-system, BlinkMacSystemFont, sans-serif;
@@ -246,7 +246,7 @@ var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPro
246
246
  #pl-overlay .pl-approw { justify-content: center; }
247
247
  #pl-overlay .pl-validrow { margin: 0 auto; }
248
248
  }
249
- `,D=!1;function R(l=document){if(D&&l.getElementById("pl-checkout-styles"))return;let s=l.createElement("style");s.id="pl-checkout-styles",s.textContent=ne,l.head.appendChild(s),D=!0}var pe=l=>"\u20B9"+Number(l||0).toLocaleString("en-IN",{maximumFractionDigits:2}),se=l=>`${Math.floor(l/60)}:${l%60<10?"0":""}${l%60}`,y=l=>String(l==null?"":l).replace(/[&<>"]/g,s=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[s]),x=l=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${l}</svg>`,S={qr:x('<rect width="5" height="5" x="3" y="3" rx="1"/><rect width="5" height="5" x="16" y="3" rx="1"/><rect width="5" height="5" x="3" y="16" rx="1"/><path d="M21 16h-3a2 2 0 0 0-2 2v3"/><path d="M21 21v.01"/><path d="M12 7v3a2 2 0 0 1-2 2H7"/><path d="M3 12h.01"/><path d="M12 3h.01"/><path d="M12 16v.01"/><path d="M16 12h1"/><path d="M21 12v.01"/><path d="M12 21v-1"/>'),card:x('<rect width="20" height="14" x="2" y="5" rx="2"/><line x1="2" x2="22" y1="10" y2="10"/>'),netbanking:x('<path d="M10 18v-7"/><path d="M11.119 2.205a2 2 0 0 1 1.762 0l7.84 3.846A.5.5 0 0 1 20.5 7h-17a.5.5 0 0 1-.22-.949z"/><path d="M14 18v-7"/><path d="M18 18v-7"/><path d="M3 22h18"/><path d="M6 18v-7"/>'),wallet:x('<path d="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1"/><path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"/>'),emi:x('<path d="M16 14v2.2l1.6 1"/><path d="M16 2v4"/><path d="M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5"/><path d="M3 10h5"/><path d="M8 2v4"/><circle cx="16" cy="16" r="6"/>'),back:x('<path d="M15 18l-6-6 6-6"/>'),mail:x('<rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/>'),arrow:x('<path d="M5 12h14M13 6l6 6-6 6"/>'),verified:x('<path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/>'),lock:x('<rect width="18" height="11" x="3" y="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>')},N='<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 1l9 4v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4z"/></svg>',de=[{m:"card",t:"Cards",s:"Visa, Mastercard & RuPay",ic:"card"},{m:"netbanking",t:"Netbanking",s:"All Indian banks",ic:"netbanking"},{m:"wallet",t:"Wallet",s:"Paytm, PhonePe & more",ic:"wallet"},{m:"emi",t:"EMI",s:"EMI via cards & more",ic:"emi"}];function H(l){R(),l=Object.assign({name:"Payment",description:"",amount:0,assetBase:"/assets",logo:"/assets/payulink-logo.png",prefill:{},apiBase:""},l);let s=String(l.apiBase||"").replace(/\/$/,""),r=pe(l.amount),m=["gpay","phonepe","paytm","bhim","amazonpay"].reduce((e,a)=>(e[a]=`${l.assetBase}/upi/${a}.png`,e),{}),h=["phonepe","gpay","paytm","bhim","amazonpay"],t={screen:"loader",order:null,customer:null,timer:null,stop:null,done:!1,utr:null,expiryMs:null},i=document.createElement("div");i.id="pl-overlay",l.brandColor&&i.style.setProperty("--pl-brand",l.brandColor),i.innerHTML=`
249
+ `,D=!1;function R(l=document){if(D&&l.getElementById("pl-checkout-styles"))return;let i=l.createElement("style");i.id="pl-checkout-styles",i.textContent=ne,l.head.appendChild(i),D=!0}var pe=l=>{let i=Number(l||0);return"\u20B9"+i.toLocaleString("en-IN",{minimumFractionDigits:i%1===0?0:2,maximumFractionDigits:2})},se=l=>`${Math.floor(l/60)}:${l%60<10?"0":""}${l%60}`,y=l=>String(l==null?"":l).replace(/[&<>"]/g,i=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;"})[i]),x=l=>`<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">${l}</svg>`,S={qr:x('<rect width="5" height="5" x="3" y="3" rx="1"/><rect width="5" height="5" x="16" y="3" rx="1"/><rect width="5" height="5" x="3" y="16" rx="1"/><path d="M21 16h-3a2 2 0 0 0-2 2v3"/><path d="M21 21v.01"/><path d="M12 7v3a2 2 0 0 1-2 2H7"/><path d="M3 12h.01"/><path d="M12 3h.01"/><path d="M12 16v.01"/><path d="M16 12h1"/><path d="M21 12v.01"/><path d="M12 21v-1"/>'),card:x('<rect width="20" height="14" x="2" y="5" rx="2"/><line x1="2" x2="22" y1="10" y2="10"/>'),netbanking:x('<path d="M10 18v-7"/><path d="M11.119 2.205a2 2 0 0 1 1.762 0l7.84 3.846A.5.5 0 0 1 20.5 7h-17a.5.5 0 0 1-.22-.949z"/><path d="M14 18v-7"/><path d="M18 18v-7"/><path d="M3 22h18"/><path d="M6 18v-7"/>'),wallet:x('<path d="M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1"/><path d="M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4"/>'),emi:x('<path d="M16 14v2.2l1.6 1"/><path d="M16 2v4"/><path d="M21 7.5V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h3.5"/><path d="M3 10h5"/><path d="M8 2v4"/><circle cx="16" cy="16" r="6"/>'),back:x('<path d="M15 18l-6-6 6-6"/>'),mail:x('<rect x="2" y="4" width="20" height="16" rx="2"/><path d="m22 7-10 5L2 7"/>'),arrow:x('<path d="M5 12h14M13 6l6 6-6 6"/>'),verified:x('<path d="M9 12l2 2 4-4"/><circle cx="12" cy="12" r="10"/>'),lock:x('<rect width="18" height="11" x="3" y="11" rx="2"/><path d="M7 11V7a5 5 0 0 1 10 0v4"/>')},N='<svg width="13" height="13" viewBox="0 0 24 24" fill="currentColor"><path d="M12 1l9 4v6c0 5.5-3.8 10.7-9 12-5.2-1.3-9-6.5-9-12V5l9-4z"/></svg>',de=[{m:"card",t:"Cards",s:"Visa, Mastercard & RuPay",ic:"card"},{m:"netbanking",t:"Netbanking",s:"All Indian banks",ic:"netbanking"},{m:"wallet",t:"Wallet",s:"Paytm, PhonePe & more",ic:"wallet"},{m:"emi",t:"EMI",s:"EMI via cards & more",ic:"emi"}];function H(l){R(),l=Object.assign({name:"Payment",description:"",amount:0,assetBase:"/assets",logo:"/assets/payulink-logo.png",prefill:{},apiBase:""},l);let i=String(l.apiBase||"").replace(/\/$/,""),r=pe(l.amount),m=["gpay","phonepe","paytm","bhim","amazonpay"].reduce((e,a)=>(e[a]=`${l.assetBase}/upi/${a}.png`,e),{}),h=["phonepe","gpay","paytm","bhim","amazonpay"],t={screen:"loader",order:null,customer:null,timer:null,stop:null,done:!1,utr:null,expiryMs:null},o=document.createElement("div");o.id="pl-overlay",l.brandColor&&o.style.setProperty("--pl-brand",l.brandColor),o.innerHTML=`
250
250
  <div class="pl-modal" role="dialog" aria-modal="true">
251
251
  <div class="pl-splash" id="pl-splash">
252
252
  <div class="pl-shield">
@@ -287,7 +287,7 @@ var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPro
287
287
  <div class="pl-vp"><div class="pl-screen pl-active" id="pl-screen"></div></div>
288
288
  <footer class="pl-foot">${S.lock}<span>Encrypted &amp; secure payments</span></footer>
289
289
  </section>
290
- </div>`,document.body.appendChild(i);let v=document.body.style.overflow;document.body.style.overflow="hidden";let E=i.querySelector(".pl-vp"),I=i.querySelector("#pl-title"),j=i.querySelector("#pl-back");function C(){q(),l.onDismiss&&l.onDismiss()}function q(){if(t.stop)try{t.stop()}catch{}clearInterval(t.timer),i.classList.add("pl-closing"),document.body.style.overflow=v,setTimeout(()=>i.remove(),240)}i.querySelector("#pl-close").onclick=C,i.addEventListener("mousedown",e=>{e.target.id==="pl-overlay"&&C()}),j.onclick=()=>{t.screen==="contact"||t.screen==="success"||d("options")};let f={loader:"Payment Options",contact:"Contact Details",options:"Payment Options",success:"Payment Successful"};function d(e){t.screen=e,I.textContent=f[e]||"Payment",j.classList.toggle("pl-show",e==="options"),clearInterval(t.timer);let a=document.createElement("div");a.className="pl-screen pl-active"+(e==="options"?" pl-screen-options":""),a.innerHTML=u[e]?u[e]():"",E.replaceChildren(a),_(e,a)}let o=h.slice(0,4).map(e=>`<img src="${m[e]}" alt="">`).join(""),b=h.map(e=>`<a class="pl-uapp" data-app="${e}" title="${e}"><img src="${m[e]}" alt="${e}"></a>`).join(""),u={loader:()=>`<div class="pl-loader"><div class="pl-bload"><img src="${y(l.logo)}" alt=""><span class="pl-bring"></span><span class="pl-bripple"></span><span class="pl-bripple pl-bripple2"></span></div><p>Securely loading payment options\u2026</p></div>`,contact:()=>`
290
+ </div>`,document.body.appendChild(o);let v=document.body.style.overflow;document.body.style.overflow="hidden";let E=o.querySelector(".pl-vp"),I=o.querySelector("#pl-title"),j=o.querySelector("#pl-back");function C(){q(),l.onDismiss&&l.onDismiss()}function q(){if(t.stop)try{t.stop()}catch{}clearInterval(t.timer),o.classList.add("pl-closing"),document.body.style.overflow=v,setTimeout(()=>o.remove(),240)}o.querySelector("#pl-close").onclick=C,o.addEventListener("mousedown",e=>{e.target.id==="pl-overlay"&&C()}),j.onclick=()=>{t.screen==="contact"||t.screen==="success"||d("options")};let f={loader:"Payment Options",contact:"Contact Details",options:"Payment Options",success:"Payment Successful"};function d(e){t.screen=e,I.textContent=f[e]||"Payment",j.classList.toggle("pl-show",e==="options"),clearInterval(t.timer);let a=document.createElement("div");a.className="pl-screen pl-active"+(e==="options"?" pl-screen-options":""),a.innerHTML=u[e]?u[e]():"",E.replaceChildren(a),_(e,a)}let n=h.slice(0,4).map(e=>`<img src="${m[e]}" alt="">`).join(""),g=h.map(e=>`<a class="pl-uapp" data-app="${e}" title="${e}"><img src="${m[e]}" alt="${e}"></a>`).join(""),u={loader:()=>`<div class="pl-loader"><div class="pl-bload"><img src="${y(l.logo)}" alt=""><span class="pl-bring"></span><span class="pl-bripple"></span><span class="pl-bripple pl-bripple2"></span></div><p>Securely loading payment options\u2026</p></div>`,contact:()=>`
291
291
  <div class="pl-pad">
292
292
  <div class="pl-h1">Contact details</div>
293
293
  <div class="pl-sub">Enter your details to continue the payment</div>
@@ -309,7 +309,7 @@ var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPro
309
309
  <div class="pl-navitem active" data-m="upi">
310
310
  <div class="pl-ni-ic">${S.qr}</div>
311
311
  <div class="pl-ni-body"><div class="pl-ni-t">UPI</div></div>
312
- <div class="pl-ni-apps">${o}</div>
312
+ <div class="pl-ni-apps">${n}</div>
313
313
  </div>
314
314
  <div class="pl-navlabel">Cards, Banking &amp; More</div>
315
315
  ${de.map(e=>`
@@ -323,7 +323,7 @@ var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPro
323
323
  </div>`,success:()=>{let e=["#00c060","#3395ff","#ffb020","#ff5a5f","#7a52d8","#19c3c3"];return`
324
324
  <div class="pl-success">
325
325
  <div class="pl-burst">
326
- ${Array.from({length:18},(n,p)=>{let c=p/18*Math.PI*2+(p%2?.22:-.22),k=60+p*13%40,P=Math.round(Math.cos(c)*k),U=Math.round(Math.sin(c)*k),J=e[p%e.length],Z=(p%2?1:-1)*(140+p*14),K=p%3===0?6:8,ee=p%4===0?6:12;return`<i class="pl-confetti" style="--tx:${P}px;--ty:${U}px;--c:${J};--r:${Z}deg;width:${K}px;height:${ee}px;border-radius:${p%4===0?"50%":"2px"};animation-delay:${(.15+p*.024).toFixed(3)}s"></i>`}).join("")}
326
+ ${Array.from({length:18},(p,s)=>{let c=s/18*Math.PI*2+(s%2?.22:-.22),k=60+s*13%40,P=Math.round(Math.cos(c)*k),U=Math.round(Math.sin(c)*k),J=e[s%e.length],Z=(s%2?1:-1)*(140+s*14),K=s%3===0?6:8,ee=s%4===0?6:12;return`<i class="pl-confetti" style="--tx:${P}px;--ty:${U}px;--c:${J};--r:${Z}deg;width:${K}px;height:${ee}px;border-radius:${s%4===0?"50%":"2px"};animation-delay:${(.15+s*.024).toFixed(3)}s"></i>`}).join("")}
327
327
  <span class="pl-ripple"></span><span class="pl-ripple pl-ripple2"></span>
328
328
  <div class="pl-check"><svg viewBox="0 0 24 24"><path d="M5 13l4 4L19 7"/></svg></div>
329
329
  </div>
@@ -337,7 +337,7 @@ var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPro
337
337
  <div class="pl-qrbox" id="pl-qr"><div class="pl-qrloading"></div></div>
338
338
  <div class="pl-qrside">
339
339
  <div class="pl-scan">Scan the QR using any UPI App</div>
340
- <div class="pl-approw" id="pl-applist">${b}</div>
340
+ <div class="pl-approw" id="pl-applist">${g}</div>
341
341
  <div class="pl-validrow"><span class="pl-dot"></span><span id="pl-timer">Valid 5:00</span></div>
342
342
  </div>
343
343
  </div>
@@ -346,5 +346,5 @@ var PayulinkCheckoutNS=(()=>{var O=Object.defineProperty;var le=Object.getOwnPro
346
346
  <input class="pl-vpa" id="pl-vpa" placeholder="example@okhdfcbank" autocomplete="off" spellcheck="false">
347
347
  <button class="pl-verify" id="pl-verify">Verify and Pay</button>
348
348
  </div>
349
- <div id="pl-status" class="pl-pendrow"><span class="pl-mini-spin"></span> Waiting for payment\u2026</div>`}function _(e,a){if(e==="contact")a.querySelector("#pl-continue").onclick=()=>{let n=a.querySelector("#pl-name").value.trim(),p=a.querySelector("#pl-mobile").value.replace(/\D/g,""),c=a.querySelector("#pl-email").value.trim(),k=a.querySelector("#pl-cerr");if(n.length<2)return k.textContent="Please enter your name";if(p.length!==10)return k.textContent="Enter a valid 10-digit mobile number";t.customer={name:n,mobile:p,email:c},d("options")};else if(e==="options"){a.querySelectorAll(".pl-navitem").forEach(p=>p.onclick=()=>{p.dataset.m!=="upi"&&L("Coming soon \u2014 please pay via UPI / QR for now")});let n=a.querySelector("#pl-verify");n&&(n.onclick=()=>{let p=(a.querySelector("#pl-vpa").value||"").trim();if(!/^[\w.\-]{2,}@[a-zA-Z]{2,}$/.test(p))return a.querySelector("#pl-vpa").focus(),L("Enter a valid UPI ID, e.g. name@okhdfcbank");let c=t.order&&(t.order.upi_intent_url||t.order.payment_link);c&&/Android|iPhone|iPad|Mobile/i.test(navigator.userAgent)?location.href=c:L("Scan the QR with your phone\u2019s UPI app to complete the payment.")}),A(),w(!0)}}let g=!1;async function w(e){if(e||d("options"),t.order){$();return}if(!g){g=!0;try{t.customer||(t.customer={name:l.prefill.name||"Customer",mobile:(l.prefill.contact||"").replace(/\D/g,""),email:l.prefill.email||""}),t.order=await l.createOrder(t.customer),$(),F()}catch(a){let n=i.querySelector("#pl-qr");if(n){n.innerHTML=`<div class="pl-qrerr"><span>${y(a.message||"Could not start payment")}</span><button class="pl-retry" id="pl-retry">Try again</button></div>`;let p=n.querySelector("#pl-retry");p&&(p.onclick=()=>{g=!1,n.innerHTML='<div class="pl-qrloading"></div>',w(!0)})}}finally{g=!1}}}function $(){let e=t.order;if(!e)return;Q(e);let a=i.querySelector("#pl-qr");a&&(e.qr_data_url?a.innerHTML=`<img src="${e.qr_data_url}" alt="UPI QR">`:a.innerHTML=`<div class="pl-qrerr"><span>${y(e.qr_unavailable_reason||"QR unavailable \u2014 use a UPI app below")}</span></div>`);let n=e.upi_intent_url||e.payment_link||"#",p=i.querySelector("#pl-applist");p&&p.querySelectorAll(".pl-uapp").forEach(c=>{c.setAttribute("href",n),c.setAttribute("target","_blank"),c.setAttribute("rel","noopener")}),e.test_mode&&typeof e.simulate=="function"&&V(e),A()}function V(e){let a=i.querySelector(".pl-scan");a&&(a.textContent="Test mode \u2014 no real payment. Simulate the result below.");let n=i.querySelector("#pl-applist");n&&(n.style.display="none");let p=i.querySelector(".pl-paneh2");p&&(p.textContent="Simulate payment (test mode)");let c=i.querySelector(".pl-vparow");!c||c.dataset.sim||(c.dataset.sim="1",c.innerHTML='<div class="pl-simrow"><button class="pl-sim pl-sim-ok" data-outcome="success">Simulate success</button><button class="pl-sim pl-sim-fail" data-outcome="failure">Simulate failure</button></div>',c.querySelectorAll(".pl-sim").forEach(k=>k.onclick=async()=>{c.querySelectorAll(".pl-sim").forEach(P=>P.disabled=!0),z("pending","Simulating\u2026");try{await e.simulate(k.dataset.outcome)}catch(P){z("failed",P.message||"Simulation failed"),c.querySelectorAll(".pl-sim").forEach(U=>U.disabled=!1)}}))}function Q(e){e&&e.expires_at&&e.server_now?t.expiryMs=Date.now()+Math.max(0,e.expires_at-e.server_now):t.expiryMs||(t.expiryMs=Date.now()+5*60*1e3)}function B(){if(t.done)return;let e=i.querySelector("#pl-qr");e&&(e.innerHTML='<div class="pl-qrerr"><span>QR code expired</span><button class="pl-retry" id="pl-regen">Generate new QR</button></div>');let a=i.querySelector("#pl-regen");a&&(a.onclick=X);let n=i.querySelector("#pl-timer");n&&(n.textContent="Expired");let p=i.querySelector(".pl-validrow");p&&p.classList.add("pl-expired")}function X(){if(t.stop){try{t.stop()}catch{}t.stop=null}t.order=null,t.expiryMs=null,g=!1;let e=i.querySelector(".pl-validrow");e&&e.classList.remove("pl-expired");let a=i.querySelector("#pl-qr");a&&(a.innerHTML='<div class="pl-qrloading"></div>'),w(!0)}function F(){!t.order||t.stop||(t.stop=l.watchOrder(t.order.merchant_order_no,e=>{!e||typeof e.status!="number"||(e.status===0?(t.utr=e.utr||t.utr,G()):e.status===3?(clearInterval(t.timer),t.expiryMs=Date.now(),B(),z("failed","QR expired \u2014 generate a new one")):[1,4].includes(e.status)?z("failed","Payment "+(e.status_label||"failed").toLowerCase()):e.status===6&&z("pending","Processing payment\u2026"))}))}function z(e,a){let n=i.querySelector("#pl-status");n&&(n.className=e==="failed"?"pl-pendrow pl-fail":"pl-pendrow",n.innerHTML=(e==="pending"?'<span class="pl-mini-spin"></span> ':"")+y(a))}function G(){t.done||(t.done=!0,clearInterval(t.timer),d("success"),l.onSuccess&&l.onSuccess({merchant_order_no:t.order.merchant_order_no,utr:t.utr,amount:l.amount}),t.utr||W())}async function W(){if(typeof l.fetchUtr=="function")for(let e=0;e<10&&!t.utr;e++){await new Promise(a=>setTimeout(a,4e3));try{let a=await l.fetchUtr();if(a){t.utr=a;let n=i.querySelector("#pl-pid");n&&t.screen==="success"&&n.insertAdjacentHTML("afterend",`<div class="pl-pid pl-utr">UTR ${y(a)}</div>`);break}}catch{}}}function A(){clearInterval(t.timer);let e=()=>{let a=i.querySelector("#pl-timer");if(!a)return;if(!t.expiryMs){a.textContent="Valid 5:00";return}let n=Math.max(0,Math.round((t.expiryMs-Date.now())/1e3));a.textContent=n>0?"Valid "+se(n):"Expired",n<=0&&(clearInterval(t.timer),B())};e(),t.timer=setInterval(e,1e3)}function L(e){let a=document.getElementById("pl-toast");a||(a=document.createElement("div"),a.id="pl-toast",document.body.appendChild(a)),a.textContent=e,a.classList.add("pl-show"),clearTimeout(a._t),a._t=setTimeout(()=>a.classList.remove("pl-show"),2600)}return d("loader"),setTimeout(()=>{let e=l.prefill||{};e.name&&(e.contact||"").replace(/\D/g,"").length===10?(t.customer={name:e.name,mobile:e.contact.replace(/\D/g,""),email:e.email||""},d("options")):d("contact");let a=i.querySelector("#pl-splash");a&&(a.classList.add("pl-splash-hide"),setTimeout(()=>a.remove(),450))},1600),{close:q}}var Y={apiBase:"https://payulink.io/api",assetBase:"https://assetcdn.payulink.io/checkout/v1/assets",name:null,logo:null,brandColor:null,pollMs:2500},M=class l{constructor(s={}){if(typeof window=="undefined"||typeof document=="undefined")throw new Error("PayuLink checkout runs in the browser only. On React Native use @thepayulink/checkout-react-native; on a server use @thepayulink/server.");let r=s.key||s.keyId||s.key_id;if(!r)throw new Error("PayuLink: `key` (your publishable pl_live_\u2026 / pl_test_\u2026 key) is required");if(/^pl_(live|test)_/.test(r)||console.warn("PayuLink: `key` should look like pl_live_\u2026 or pl_test_\u2026"),s.keySecret||s.key_secret)throw new Error("PayuLink: never pass a key_secret to the browser SDK. It belongs on your server only.");this.options=Object.assign({},Y,s,{key:r})}open(s={}){let r=Object.assign({},this.options,s),m=String(r.apiBase||"").replace(/\/$/,""),h=String(r.assetBase||`${m}/assets`).replace(/\/$/,""),t=r.order_id||r.orderId;if(!t)throw new Error("PayuLink: `order_id` is required. Create it on your server with POST /v1/orders.");let i=f=>{typeof r.onError=="function"?r.onError(f):console.error("PayuLink:",f.message||f)},v=null,E=null,I=async()=>v!=null&&v.session_token?(await fetch(`${m}/v1/checkout/session/${encodeURIComponent(v.session_token)}`)).json().catch(()=>({})):{},j=async f=>{var b,u,T;let d=await fetch(`${m}/v1/checkout/session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key_id:r.key,order_id:t,customer:f?{name:f.name,contact:f.mobile||f.contact,email:f.email}:void 0})}),o=await d.json().catch(()=>({}));if(!d.ok){let _=new Error(((b=o==null?void 0:o.error)==null?void 0:b.description)||`Could not start payment (HTTP ${d.status})`);throw _.code=(u=o==null?void 0:o.error)==null?void 0:u.code,_.retriable=((T=o==null?void 0:o.error)==null?void 0:T.code)==="GATEWAY_BUSY",_}return v=o,{merchant_order_no:o.order_id,amount:o.amount/100,upi_intent_url:o.upi_intent_url,payment_link:o.payment_link,qr_data_url:o.qr_data_url||null,qr_unavailable_reason:o.qr_unavailable_reason||null,qr_retriable:o.qr_retriable===!0,expires_at:o.expires_at?o.expires_at*1e3:null,server_now:Date.now(),test_mode:o.test_mode===!0,simulate:o.test_mode===!0&&o.simulate_url?async _=>{var $;let g=await fetch(`${m}${o.simulate_url}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({outcome:_})}),w=await g.json().catch(()=>({}));if(!g.ok)throw new Error((($=w==null?void 0:w.error)==null?void 0:$.description)||`Simulation failed (HTTP ${g.status})`);return w}:null}},C=(f,d)=>{let o=async()=>{if(v!=null&&v.session_token)try{let u=await I();u.status==="paid"&&u.payulink_signature&&(E={payulink_order_id:u.payulink_order_id,payulink_payment_id:u.payulink_payment_id,payulink_signature:u.payulink_signature,utr:u.utr||null,amount:u.amount}),d({status:u.status==="paid"?0:u.status==="failed"?1:u.status==="expired"?3:2,status_label:String(u.status||"pending").toUpperCase(),utr:u.utr||null})}catch{}},b=setInterval(o,r.pollMs||Y.pollMs);return o(),()=>clearInterval(b)},q={_inner:null,close(){var f;(f=this._inner)==null||f.close()}};return fetch(`${m}/v1/checkout/order/${encodeURIComponent(t)}?key_id=${encodeURIComponent(r.key)}`).then(async f=>{var o;let d=await f.json().catch(()=>({}));if(!f.ok)throw new Error(((o=d==null?void 0:d.error)==null?void 0:o.description)||"Unknown or expired order");q._inner=H(Object.assign({},{apiBase:m,assetBase:h,name:r.name||d.merchant_name,logo:r.logo||`${h}/payulink-logo.png`,brandColor:r.brandColor||r.theme&&r.theme.color||null,testMode:d.mode==="test",note:r.note,prefill:r.prefill||{},amount:d.amount/100,description:r.description||r.item||d.merchant_name,createOrder:j,watchOrder:C,fetchUtr:async()=>(await I()).utr||null,onSuccess:()=>{let b=E||{payulink_order_id:(v==null?void 0:v.order_id)||t,payulink_payment_id:null,payulink_signature:null};typeof r.handler=="function"&&r.handler(b),typeof r.onSuccess=="function"&&r.onSuccess(b)},onDismiss:()=>{typeof r.onDismiss=="function"&&r.onDismiss()},onError:i}))}).catch(i),q}static open(s={}){return new l(s).open(s)}};typeof window!="undefined"&&(window.PayuLink=M,window.PayulinkCheckout=M);return oe(ce);})();
349
+ <div id="pl-status" class="pl-pendrow"><span class="pl-mini-spin"></span> Waiting for payment\u2026</div>`}function _(e,a){if(e==="contact")a.querySelector("#pl-continue").onclick=()=>{let p=a.querySelector("#pl-name").value.trim(),s=a.querySelector("#pl-mobile").value.replace(/\D/g,""),c=a.querySelector("#pl-email").value.trim(),k=a.querySelector("#pl-cerr");if(p.length<2)return k.textContent="Please enter your name";if(s.length!==10)return k.textContent="Enter a valid 10-digit mobile number";t.customer={name:p,mobile:s,email:c},d("options")};else if(e==="options"){a.querySelectorAll(".pl-navitem").forEach(s=>s.onclick=()=>{s.dataset.m!=="upi"&&L("Coming soon \u2014 please pay via UPI / QR for now")});let p=a.querySelector("#pl-verify");p&&(p.onclick=()=>{let s=(a.querySelector("#pl-vpa").value||"").trim();if(!/^[\w.\-]{2,}@[a-zA-Z]{2,}$/.test(s))return a.querySelector("#pl-vpa").focus(),L("Enter a valid UPI ID, e.g. name@okhdfcbank");let c=t.order&&(t.order.upi_intent_url||t.order.payment_link);c&&/Android|iPhone|iPad|Mobile/i.test(navigator.userAgent)?location.href=c:L("Scan the QR with your phone\u2019s UPI app to complete the payment.")}),A(),w(!0)}}let b=!1;async function w(e){if(e||d("options"),t.order){$();return}if(!b){b=!0;try{t.customer||(t.customer={name:l.prefill.name||"Customer",mobile:(l.prefill.contact||"").replace(/\D/g,""),email:l.prefill.email||""}),t.order=await l.createOrder(t.customer),$(),X()}catch(a){let p=o.querySelector("#pl-qr");if(p){p.innerHTML=`<div class="pl-qrerr"><span>${y(a.message||"Could not start payment")}</span><button class="pl-retry" id="pl-retry">Try again</button></div>`;let s=p.querySelector("#pl-retry");s&&(s.onclick=()=>{b=!1,p.innerHTML='<div class="pl-qrloading"></div>',w(!0)})}}finally{b=!1}}}function $(){let e=t.order;if(!e)return;Q(e);let a=o.querySelector("#pl-qr");a&&(e.qr_data_url?a.innerHTML=`<img src="${e.qr_data_url}" alt="UPI QR">`:a.innerHTML=`<div class="pl-qrerr"><span>${y(e.qr_unavailable_reason||"QR unavailable \u2014 use a UPI app below")}</span></div>`);let p=e.upi_intent_url||e.payment_link||"#",s=o.querySelector("#pl-applist");s&&s.querySelectorAll(".pl-uapp").forEach(c=>{c.setAttribute("href",p),c.setAttribute("target","_blank"),c.setAttribute("rel","noopener")}),e.test_mode&&typeof e.simulate=="function"&&V(e),A()}function V(e){let a=o.querySelector(".pl-scan");a&&(a.textContent="Test mode \u2014 no real payment. Simulate the result below.");let p=o.querySelector("#pl-applist");p&&(p.style.display="none");let s=o.querySelector(".pl-paneh2");s&&(s.textContent="Simulate payment (test mode)");let c=o.querySelector(".pl-vparow");!c||c.dataset.sim||(c.dataset.sim="1",c.innerHTML='<div class="pl-simrow"><button class="pl-sim pl-sim-ok" data-outcome="success">Simulate success</button><button class="pl-sim pl-sim-fail" data-outcome="failure">Simulate failure</button></div>',c.querySelectorAll(".pl-sim").forEach(k=>k.onclick=async()=>{c.querySelectorAll(".pl-sim").forEach(P=>P.disabled=!0),z("pending","Simulating\u2026");try{await e.simulate(k.dataset.outcome)}catch(P){z("failed",P.message||"Simulation failed"),c.querySelectorAll(".pl-sim").forEach(U=>U.disabled=!1)}}))}function Q(e){e&&e.expires_at&&e.server_now?t.expiryMs=Date.now()+Math.max(0,e.expires_at-e.server_now):t.expiryMs||(t.expiryMs=Date.now()+5*60*1e3)}function B(){if(t.done)return;let e=o.querySelector("#pl-qr");e&&(e.innerHTML='<div class="pl-qrerr"><span>QR code expired</span><button class="pl-retry" id="pl-regen">Generate new QR</button></div>');let a=o.querySelector("#pl-regen");a&&(a.onclick=F);let p=o.querySelector("#pl-timer");p&&(p.textContent="Expired");let s=o.querySelector(".pl-validrow");s&&s.classList.add("pl-expired")}function F(){if(t.stop){try{t.stop()}catch{}t.stop=null}t.order=null,t.expiryMs=null,b=!1;let e=o.querySelector(".pl-validrow");e&&e.classList.remove("pl-expired");let a=o.querySelector("#pl-qr");a&&(a.innerHTML='<div class="pl-qrloading"></div>'),w(!0)}function X(){!t.order||t.stop||(t.stop=l.watchOrder(t.order.merchant_order_no,e=>{!e||typeof e.status!="number"||(e.status===0?(t.utr=e.utr||t.utr,G()):e.status===3?(clearInterval(t.timer),t.expiryMs=Date.now(),B(),z("failed","QR expired \u2014 generate a new one")):[1,4].includes(e.status)?z("failed","Payment "+(e.status_label||"failed").toLowerCase()):e.status===6&&z("pending","Processing payment\u2026"))}))}function z(e,a){let p=o.querySelector("#pl-status");p&&(p.className=e==="failed"?"pl-pendrow pl-fail":"pl-pendrow",p.innerHTML=(e==="pending"?'<span class="pl-mini-spin"></span> ':"")+y(a))}function G(){t.done||(t.done=!0,clearInterval(t.timer),d("success"),l.onSuccess&&l.onSuccess({merchant_order_no:t.order.merchant_order_no,utr:t.utr,amount:l.amount}),t.utr||W())}async function W(){if(typeof l.fetchUtr=="function")for(let e=0;e<10&&!t.utr;e++){await new Promise(a=>setTimeout(a,4e3));try{let a=await l.fetchUtr();if(a){t.utr=a;let p=o.querySelector("#pl-pid");p&&t.screen==="success"&&p.insertAdjacentHTML("afterend",`<div class="pl-pid pl-utr">UTR ${y(a)}</div>`);break}}catch{}}}function A(){clearInterval(t.timer);let e=()=>{let a=o.querySelector("#pl-timer");if(!a)return;if(!t.expiryMs){a.textContent="Valid 5:00";return}let p=Math.max(0,Math.round((t.expiryMs-Date.now())/1e3));a.textContent=p>0?"Valid "+se(p):"Expired",p<=0&&(clearInterval(t.timer),B())};e(),t.timer=setInterval(e,1e3)}function L(e){let a=document.getElementById("pl-toast");a||(a=document.createElement("div"),a.id="pl-toast",document.body.appendChild(a)),a.textContent=e,a.classList.add("pl-show"),clearTimeout(a._t),a._t=setTimeout(()=>a.classList.remove("pl-show"),2600)}return d("loader"),setTimeout(()=>{let e=l.prefill||{};e.name&&(e.contact||"").replace(/\D/g,"").length===10?(t.customer={name:e.name,mobile:e.contact.replace(/\D/g,""),email:e.email||""},d("options")):d("contact");let a=o.querySelector("#pl-splash");a&&(a.classList.add("pl-splash-hide"),setTimeout(()=>a.remove(),450))},1600),{close:q}}var Y={apiBase:"https://payulink.io/api",assetBase:"https://assetcdn.payulink.io/checkout/v1/assets",name:null,logo:null,brandColor:null,pollMs:2500},M=class l{constructor(i={}){if(typeof window=="undefined"||typeof document=="undefined")throw new Error("PayuLink checkout runs in the browser only. On React Native use @thepayulink/checkout-react-native; on a server use @thepayulink/server.");let r=i.key||i.keyId||i.key_id;if(!r)throw new Error("PayuLink: `key` (your publishable pl_live_\u2026 / pl_test_\u2026 key) is required");if(/^pl_(live|test)_/.test(r)||console.warn("PayuLink: `key` should look like pl_live_\u2026 or pl_test_\u2026"),i.keySecret||i.key_secret)throw new Error("PayuLink: never pass a key_secret to the browser SDK. It belongs on your server only.");this.options=Object.assign({},Y,i,{key:r})}open(i={}){let r=Object.assign({},this.options,i),m=String(r.apiBase||"").replace(/\/$/,""),h=String(r.assetBase||`${m}/assets`).replace(/\/$/,""),t=r.order_id||r.orderId;if(!t)throw new Error("PayuLink: `order_id` is required. Create it on your server with POST /v1/orders.");let o=f=>{typeof r.onError=="function"?r.onError(f):console.error("PayuLink:",f.message||f)},v=null,E=null,I=async()=>v!=null&&v.session_token?(await fetch(`${m}/v1/checkout/session/${encodeURIComponent(v.session_token)}`)).json().catch(()=>({})):{},j=async f=>{var g,u,T;let d=await fetch(`${m}/v1/checkout/session`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({key_id:r.key,order_id:t,customer:f?{name:f.name,contact:f.mobile||f.contact,email:f.email}:void 0})}),n=await d.json().catch(()=>({}));if(!d.ok){let _=new Error(((g=n==null?void 0:n.error)==null?void 0:g.description)||`Could not start payment (HTTP ${d.status})`);throw _.code=(u=n==null?void 0:n.error)==null?void 0:u.code,_.retriable=((T=n==null?void 0:n.error)==null?void 0:T.code)==="GATEWAY_BUSY",_}return v=n,{merchant_order_no:n.order_id,amount:n.amount/100,upi_intent_url:n.upi_intent_url,payment_link:n.payment_link,qr_data_url:n.qr_data_url||null,qr_unavailable_reason:n.qr_unavailable_reason||null,qr_retriable:n.qr_retriable===!0,expires_at:n.expires_at?n.expires_at*1e3:null,server_now:Date.now(),test_mode:n.test_mode===!0,simulate:n.test_mode===!0&&n.simulate_url?async _=>{var $;let b=await fetch(`${m}${n.simulate_url}`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({outcome:_})}),w=await b.json().catch(()=>({}));if(!b.ok)throw new Error((($=w==null?void 0:w.error)==null?void 0:$.description)||`Simulation failed (HTTP ${b.status})`);return w}:null}},C=(f,d)=>{let n=async()=>{if(v!=null&&v.session_token)try{let u=await I();u.status==="paid"&&u.payulink_signature&&(E={payulink_order_id:u.payulink_order_id,payulink_payment_id:u.payulink_payment_id,payulink_signature:u.payulink_signature,utr:u.utr||null,amount:u.amount}),d({status:u.status==="paid"?0:u.status==="failed"?1:u.status==="expired"?3:2,status_label:String(u.status||"pending").toUpperCase(),utr:u.utr||null})}catch{}},g=setInterval(n,r.pollMs||Y.pollMs);return n(),()=>clearInterval(g)},q={_inner:null,close(){var f;(f=this._inner)==null||f.close()}};return fetch(`${m}/v1/checkout/order/${encodeURIComponent(t)}?key_id=${encodeURIComponent(r.key)}`).then(async f=>{var n;let d=await f.json().catch(()=>({}));if(!f.ok)throw new Error(((n=d==null?void 0:d.error)==null?void 0:n.description)||"Unknown or expired order");q._inner=H(Object.assign({},{apiBase:m,assetBase:h,name:r.name||d.merchant_name,logo:r.logo||`${h}/payulink-logo.png`,brandColor:r.brandColor||r.theme&&r.theme.color||null,testMode:d.mode==="test",note:r.note,prefill:r.prefill||{},amount:d.amount/100,description:r.description||r.item||d.merchant_name,createOrder:j,watchOrder:C,fetchUtr:async()=>(await I()).utr||null,onSuccess:()=>{let g=E||{payulink_order_id:(v==null?void 0:v.order_id)||t,payulink_payment_id:null,payulink_signature:null};typeof r.handler=="function"&&r.handler(g),typeof r.onSuccess=="function"&&r.onSuccess(g)},onDismiss:()=>{typeof r.onDismiss=="function"&&r.onDismiss()},onError:o}))}).catch(o),q}static open(i={}){return new l(i).open(i)}};typeof window!="undefined"&&(window.PayuLink=M,window.PayulinkCheckout=M);return oe(ce);})();
350
350
  window.PayulinkCheckout=PayulinkCheckoutNS.default||PayulinkCheckoutNS;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thepayulink/checkout",
3
- "version": "2.2.0",
3
+ "version": "2.2.1",
4
4
  "description": "PayuLink Checkout — open a server-created order in the browser with your publishable key.",
5
5
  "type": "module",
6
6
  "main": "./dist/payulink-checkout.cjs",
package/src/modal.js CHANGED
@@ -2,7 +2,11 @@
2
2
  // Adapted from Elite Yatra's hosted PayulinkCheckout widget.
3
3
  import { injectStyles } from './style.js';
4
4
 
5
- const inr = (r) => '₹' + Number(r || 0).toLocaleString('en-IN', { maximumFractionDigits: 2 });
5
+ // ₹199.50, ₹200 two decimals whenever there are paise, none for whole rupees.
6
+ const inr = (r) => {
7
+ const n = Number(r || 0);
8
+ return '₹' + n.toLocaleString('en-IN', { minimumFractionDigits: n % 1 === 0 ? 0 : 2, maximumFractionDigits: 2 });
9
+ };
6
10
  const mmss = (s) => `${Math.floor(s / 60)}:${(s % 60) < 10 ? '0' : ''}${s % 60}`;
7
11
  const esc = (s) => String(s == null ? '' : s).replace(/[&<>"]/g, (c) => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;' }[c]));
8
12