@enjoys/pinglet 1.2.2 → 1.3.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/package.json +1 -1
- package/pinglet-sse.js +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@enjoys/pinglet",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"description": "Lightweight Customizable Web & CustomPush Notification SDK for modern web apps. Supports customizable layouts, secure delivery, and real-time updates via SSE.",
|
|
5
5
|
"main": "./pinglet-sse.js",
|
|
6
6
|
"types": "./pinglet-sse.d.ts",
|
package/pinglet-sse.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
!function(){"use strict";function t(t,e){switch(t.action){case"redirect":case"open":return window.open(t.src,"_blank");case"link":return window.open(t.src);case"alert":return alert(t.src);case"reload":return window.location.reload();case"event":return window.addEventListener(t.src,(()=>{}));case"close":case"dismiss":return window.dispatchEvent(new CustomEvent("pinglet:notificationClosed",{detail:{contentEl:e,reason:"user-dismiss"}}))}return window.open("https://pinglet.enjoys.in/docs","_blank")}function e(e,n,i=[{text:"See Docs",onClick:()=>window.open("https://pinglet.enjoys.in/docs","_blank")}],o="⚠️",s={duration:5e3,auto_dismiss:!0}){const a="toastContainer";let l=document.getElementById(a);l||(l=document.createElement("div"),l.id=a,Object.assign(l.style,{position:"fixed",bottom:"24px",right:"24px",zIndex:"9999",display:"flex",flexDirection:"column",gap:"4px",alignItems:"flex-end",fontFamily:"Manrope, sans-serif"}),document.body.appendChild(l));const r=document.createElement("div");Object.assign(r.style,{background:"#1f1f1f",color:"#fff",padding:"16px 20px",borderRadius:"12px",boxShadow:"0 6px 18px rgba(0, 0, 0, 0.25)",minWidth:"260px",maxWidth:"340px",opacity:"0",transform:"translateX(100%)",transition:"opacity 0.3s ease, transform 0.3s ease",display:"flex",flexDirection:"column",gap:"10px",fontFamily:"Manrope, sans-serif"});const c=document.createElement("div");Object.assign(c.style,{display:"flex",alignItems:"center",gap:"10px",fontSize:"16px",fontWeight:"600",fontFamily:"Manrope, sans-serif"});const d=document.createElement("div");d.textContent=o;const p=document.createElement("div");if(p.textContent=e,c.appendChild(d),c.appendChild(p),r.appendChild(c),n){const t=document.createElement("div");t.textContent=n,Object.assign(t.style,{fontSize:"13.5px",fontWeight:"400",color:"#ddd",lineHeight:"1.5"}),r.appendChild(t)}if(Array.isArray(i)&&i.length){const e=document.createElement("div");Object.assign(e.style,{marginTop:"8px",display:"flex",gap:"10px",justifyContent:"flex-start"});for(const n of i){const i=document.createElement("button");if(i.textContent=n.text||"Click Here",Object.assign(i.style,{padding:"8px 14px",background:"#333",color:"#fff",border:"1px solid #444",borderRadius:"6px",fontSize:"13px",cursor:"pointer",transition:"background 0.3s",fontFamily:"Manrope, sans-serif"}),i.onmouseover=()=>i.style.background="#444",i.onmouseout=()=>i.style.background="#333",n?.onClick){const t=new Function(`return ${n.onClick}`)();"function"==typeof t&&i.addEventListener("click",t)}else i.addEventListener("click",(e=>(e.stopPropagation(),t(n,i))));e.appendChild(i)}r.appendChild(e)}const m=document.createElement("div");return m.innerHTML='Notifications by <a href="https://pinglet.enjoys.in" target="_blank" style="color:#4da6ff;text-decoration:none;">Pinglet</a> - Enjoys',Object.assign(m.style,{fontSize:"11px",color:"#999",marginTop:"4px",textAlign:"right",fontFamily:"Manrope, sans-serif"}),l.appendChild(r),l.appendChild(m),requestAnimationFrame((()=>{r.style.opacity="1",r.style.transform="translateX(0)"})),s.auto_dismiss||setTimeout((()=>{r.style.opacity="0",r.style.transform="translateX(100%)",setTimeout((()=>{r.remove(),m.remove()}),500)}),s.duration||5e3),l}const n={duration:3e3,btn1:{color:"#ffffff",backgroundColor:"#007bff",padding:"6px 10px",borderRadius:"6px",fontSize:"14px",fontWeight:"600",border:"none",boxShadow:"0 2px 6px rgba(0,0,0,0.15)"},btn2:{color:"#333333",backgroundColor:"#f0f0f0",padding:"6px 10px",borderRadius:"6px",fontSize:"14px",fontWeight:"600",border:"1px solid #ccc"},title:{color:"#111111",fontSize:"14px",fontWeight:"500",lineHeight:"1.4",margin:"0 0 0 0",textAlign:"left"},description:{color:"#444444",fontSize:"13px",fontWeight:"400",lineHeight:"1.5",margin:"0 0 10px 0",textAlign:"left"},controls:{video:{autoplay:!1,muted:!1,loop:!1,controls:!1},audio:{autoplay:!1,muted:!1,loop:!1,controls:!1}},media:{image:{width:"100%",height:"200px",borderRadius:"6px",objectFit:"cover",margin:"0 0 8px 0"},icon:{width:"24px",height:"24px",margin:"0 8px 0 0",objectFit:"contain"},logo:{width:"50px",height:"50px",margin:"0 8px 0 0",objectFit:"contain"},video:{width:"100%",height:"140px",borderRadius:"6px",objectFit:"cover",margin:"0 0 10px 0"},iframe:{width:"100%",height:"140px",borderRadius:"6px",objectFit:"cover",margin:"0 0 10px 0"},audio:{width:"100%",margin:"8px 0"}}},i={position:"bottom-left",transition:"fade",branding:{show:!0,once:!0,html:'Notifications by <a href="https://pinglet.enjoys.in" style="color:#4da6ff;text-decoration:none;" target="_blank">Pinglet</a> - Enjoys'},sound:{play:!1,src:"https://pinglet.enjoys.in/api/v1/pinglet-sound.mp3?v=1&ext=mp3",volume:.6},duration:2e3,maxVisible:3,stacking:!0,auto_dismiss:!0,dismissible:!0,website:"https://pinglet.enjoys.in",time:!0,favicon:!0,pauseOnHover:!0,theme:{mode:"light",customClass:"",rounded:!0,shadow:!0,border:!1},iconDefaults:{show:!0,size:20,position:"left"},progressBar:{show:!0,color:"#4da6ff",height:3}};function o(t){const e=(t+"=".repeat((4-t.length%4)%4)).replace(/\-/g,"+").replace(/_/g,"/"),n=window.atob(e);return Uint8Array.from([...n].map((t=>t.charCodeAt(0))))}function s(t,n,i){"Notification"in window?"granted"===Notification.permission||function(t={}){const{title:e="Stay updated with notifications",description:n="Get notified about important updates, new features, and exclusive content. We'll only send you valuable notifications.",site:i=window.location.hostname,onAllow:o=()=>{},onDeny:s=()=>{}}=t,a=document.createElement("div");a.className="notification-dialog",Object.assign(a.style,{position:"fixed",bottom:"24px",right:"24px",width:"380px",background:"#fff",borderRadius:"16px",boxShadow:"0 20px 40px rgba(0, 0, 0, 0.15), 0 0 0 1px rgba(255,255,255,0.1)",zIndex:"1000",overflow:"hidden",transform:"translateX(420px)",animation:"slideIn 0.6s ease-out 1s forwards",fontFamily:"-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif"});const l=document.createElement("style");l.textContent="\n @keyframes slideIn { to { transform: translateX(0); } }\n @keyframes pulse {\n 0%, 100% { box-shadow: 0 4px 12px rgba(102, 126, 234, 0.3); }\n 50% { box-shadow: 0 4px 20px rgba(102, 126, 234, 0.5); }\n }\n @media (max-width: 480px) {\n .notification-dialog {\n width: calc(100vw - 32px) !important;\n right: 16px !important;\n bottom: 16px !important;\n transform: translateY(420px) !important;\n }\n @keyframes slideIn { to { transform: translateY(0); } }\n }\n ",document.head.appendChild(l);const r=document.createElement("div");r.style.display="flex",r.style.justifyContent="space-between",r.style.padding="20px 20px 0 20px";const c=document.createElement("div");c.style.display="flex",c.style.alignItems="center",c.style.gap="8px",c.style.color="#6b7280",c.style.fontSize="14px",c.style.fontWeight="500";const d=document.createElement("div");d.style.width="16px",d.style.height="16px",d.style.borderRadius="4px",d.style.background="linear-gradient(135deg, #667eea 0%, #764ba2 100%)",d.style.display="flex",d.style.alignItems="center",d.style.justifyContent="center",d.innerHTML='<svg viewBox="0 0 16 16" fill="white" width="10" height="10"><path d="M8 0C3.58 0 0 3.58 0 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8z"/></svg>';const p=document.createElement("span");p.textContent=i,c.append(d,p);const m=document.createElement("button");m.innerHTML='<svg viewBox="0 0 16 16" fill="currentColor" width="12" height="12">\n <path d="M12.854 4.854a.5.5 0 0 0-.708-.708L8 8.293 3.854 4.146a.5.5 0 1 0-.708.708L7.293 9l-4.147 4.146a.5.5 0 0 0 .708.708L8 9.707l4.146 4.147a.5.5 0 0 0 .708-.708L8.707 9l4.147-4.146z"/>\n </svg>',Object.assign(m.style,{width:"24px",height:"24px",background:"#f3f4f6",border:"none",borderRadius:"6px",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",color:"#6b7280"}),m.onclick=()=>a.remove(),r.append(c,m);const f=document.createElement("div");f.style.padding="16px 24px 24px 24px";const g=document.createElement("div");g.style.width="48px",g.style.height="48px",g.style.borderRadius="12px",g.style.marginBottom="16px",g.style.animation="pulse 2s infinite",g.style.background="linear-gradient(135deg, #667eea 0%, #764ba2 100%)",g.style.display="flex",g.style.alignItems="center",g.style.justifyContent="center",g.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="2" width="24" height="24">\n <path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/>\n </svg>';const u=document.createElement("h3");u.textContent=e,Object.assign(u.style,{fontSize:"18px",fontWeight:"600",color:"#111827",marginBottom:"8px"});const y=document.createElement("p");y.textContent=n,Object.assign(y.style,{fontSize:"14px",color:"#6b7280",lineHeight:"1.5",marginBottom:"20px"});const x=document.createElement("div");x.style.display="flex",x.style.gap="8px";const h=document.createElement("button");h.textContent="Not now",Object.assign(h.style,{flex:1,padding:"10px 16px",borderRadius:"8px",fontSize:"14px",fontWeight:"500",border:"1px solid #e5e7eb",background:"#f9fafb",color:"#6b7280",cursor:"pointer"}),h.onclick=()=>{s(),a.remove()};const b=document.createElement("button");b.textContent="Allow notifications",Object.assign(b.style,{flex:1,padding:"10px 16px",borderRadius:"8px",fontSize:"14px",fontWeight:"500",border:"none",background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",color:"#fff",boxShadow:"0 2px 8px rgba(102, 126, 234, 0.3)",cursor:"pointer"}),b.onclick=()=>{o(),a.remove()},x.append(h,b);const w=document.createElement("div");w.style.marginTop="12px",w.style.display="flex",w.style.alignItems="center",w.style.justifyContent="center",w.style.gap="6px",w.style.color="#9ca3af",w.style.fontSize="12px",w.innerHTML='<svg viewBox="0 0 16 16" fill="currentColor" width="12" height="12"><path d="M8 0c-.69 0-1.843.265-2.928.56-1.11.3-2.229.655-2.887.87a1.54 1.54 0 0 0-1.044 1.262c-.596 4.477.787 7.795 2.465 9.99a11.777 11.777 0 0 0 2.517 2.453c.386.273.744.482 1.048.625.28.132.581.24.829.24s.548-.108.829-.24a7.159 7.159 0 0 0 1.048-.625 11.775 11.775 0 0 0 2.517-2.453c1.678-2.195 3.061-5.513 2.465-9.99a1.541 1.541 0 0 0-1.044-1.263 62.467 62.467 0 0 0-2.887-.87C9.843.266 8.69 0 8 0z"/></svg><span>Secure & private • Unsubscribe anytime</span>',f.append(g,u,y,x,w),a.append(r,f),document.body.appendChild(a)}({site:window.location.hostname,onAllow:()=>{Notification.requestPermission().then((async s=>"granted"===s?async function(t,n,i){try{const s=await navigator.serviceWorker.register(`${t}/sw.js`);if(await s.pushManager.getSubscription())return;const a=await s.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:o(i)}),l=await fetch(`${t}/subscribe?projectId=${n}`,{method:"POST",body:JSON.stringify(a),headers:{"Content-Type":"application/json"},credentials:"omit"}),r=await l.json();if(r.success)return localStorage.getItem("subscription")?void 0:(localStorage.setItem("subscription","true"),e("Notifications Enabled","You can now receive notifications from this site.",[{text:"See Demo",onClick:'()=>{\n new Notification("Pinglet", {\n body: "This is a demo notification",\n icon: "https://pinglet.enjoys.in/favicon.ico"\n }).onclick = () => {\n window.open("https://pinglet.enjoys.in", "_blank");\n }) \n }'}],"🎉"));e("Something Went Wrong",r.message,[],"❌")}catch(t){}}(t,n,i):e("Permission Denied","You blocked notifications!",[],"😭"))).catch((t=>e("Permission Error","Error requesting notification permission:",[],"😭")))},onDeny:()=>e("Permission Denied","You blocked notifications!",[],"❌")}):e("Unsupported Browser","Notifications not supported.",[],"🚫")}let a,l,r=null,c=null,d=null;function p(){a&&(a.currentTime=0,a.play())}function m(t){return c||(c=document.createElement("div"),c.className="pinglet-branding",c.innerHTML=t?.html||'Notifications by <a href="https://pinglet.enjoys.in" class="pinglet-link" target="_blank" style="color:#4da6ff;text-decoration:none;">Pinglet</a>',c.style="\n font-size: 11px;\n color: #808080;\n text-align: right;\n width: 100%;\n pointer-events: auto;\n ",c)}function f(t){if(l&&r)return{toastContainer:l,toastStack:r};const e=document.getElementById("pinglet-widget-container");return e?(l=e,r=l.querySelector(".pinglet-widget-stack"),{toastContainer:l,toastStack:r}):(l=document.createElement("div"),l.id="pinglet-widget-container",l.style.position="fixed",l.style.bottom="20px",l.style.left="20px",l.style.zIndex="9999",l.style.display="flex",l.style.flexDirection="column",l.style.alignItems="flex-start",l.style.gap="8px",l.style.maxWidth="360px",l.style.width="360px",l.style.boxSizing="border-box",l.style.pointerEvents="none",l.style.padding="4px",l.style.borderRadius="8px",r=document.createElement("div"),r.className="pinglet-widget-stack",r.style.display="flex",r.style.flexDirection="column",r.style.gap="12px",r.style.pointerEvents="none",r.style.overflow="visible",r.style.flexShrink="0",l.appendChild(r),t?.show&&t?.once&&l.appendChild(m(t)),document.body.appendChild(l),{toastContainer:l,toastStack:r})}function g(t,e){const n=e.config,{toastContainer:i,toastStack:o}=f(n.branding);var s,a;let l;function r(){n?.auto_dismiss&&(l=setTimeout((()=>{o.contains(t)&&(y("dropped",t,"user doesn't engaged"),u(t,n?.transition||"fade"))}),n.duration||5e3))}return n?.branding?.show&&n?.branding?.once&&i.appendChild(c),s=t,a=n.transition,s.style.opacity="0",s.style.transition="all 0.4s ease","fade"===a?(s.style.transform="translateX(20px)",requestAnimationFrame((()=>{s.style.opacity="1",s.style.transform="translateX(0)"}))):"slide"===a?(s.style.transform="translateX(100%)",requestAnimationFrame((()=>{s.style.opacity="1",s.style.transform="translateX(0)"}))):"zoom"===a?(s.style.transform="scale(0.8)",requestAnimationFrame((()=>{s.style.opacity="1",s.style.transform="scale(1)"}))):s.style.opacity="1",t.style.pointerEvents="auto",o.appendChild(t),i.addEventListener("mouseenter",(function(){clearTimeout(l)})),i.addEventListener("mouseleave",r),r(),{toastContainer:i,toastStack:o}}function u(t,e){t&&(t.style.transition="all 0.4s ease","fade"===e?(t.style.opacity="0",t.style.transform="translateX(-40px)"):"slide"===e?(t.style.transform="translateX(-100%)",t.style.opacity="0"):"zoom"===e?(t.style.transform="scale(0.8)",t.style.opacity="0"):t.style.opacity="0",t.addEventListener("transitionend",(()=>{t.remove(),r&&0===r.children.length&&c?.remove()}),{once:!0}))}async function y(t,e,n="user-dismiss"){const i=e.getAttribute("data-notification-id"),o=e.getAttribute("data-notification-type")||"0",[s,a]=i.split("-");window.sendNotificationEvent(t,{project_id:s,notification_id:i,timestamp:a,reason:n,type:o})}function x(t=i,e=window.location.hostname,n="just now",o=!1){const s=document.createElement("div");s.className="pinglet-row",Object.assign(s.style,{display:"flex",justifyContent:"space-between",alignItems:"center",background:o?"#1a1a1a":"transparent",fontFamily:"system-ui, sans-serif",fontSize:"10px",padding:"6px 10px",borderBottom:o?"1px solid rgba(255, 255, 255, 0.1)":"1px solid rgba(0, 0, 0, 0.05)",color:o?"#f0f0f0":"#000"});const a=document.createElement("div");a.className="pinglet-left",Object.assign(a.style,{display:"flex",alignItems:"center",gap:"6px",flexGrow:"1"});const l=document.createElement("span");l.className="pinglet-icon",l.textContent="- Pinglet",l.onclick=()=>{window.open("https://pinglet.enjoys.in","_blank")},Object.assign(l.style,{alignItems:"center",color:"dodgerblue",flexShrink:"0",fontWeight:"bold",cursor:"pointer"});const d=document.createElement("span");d.className="pinglet-domain",d.textContent=e,d.style.color=o?"#bbb":"#808080";const p=document.createElement("span");p.className="pinglet-time",p.textContent=`- ${n}`,p.style.color=o?"#ccc":"#aaa";const m=document.createElement("button");return m.className="pinglet-close",m.textContent="✕",Object.assign(m.style,{background:"none",border:"none",fontSize:"12px",cursor:"pointer",color:o?"#aaa":"#888",padding:"0 4px"}),m.addEventListener("mouseenter",(()=>{m.style.color="#f44"})),m.addEventListener("mouseleave",(()=>{m.style.color=o?"#aaa":"#888"})),t?.website&&a.appendChild(d),t?.time&&a.appendChild(p),t?.favicon&&a.appendChild(l),s.appendChild(a),t?.dismissible&&s.appendChild(m),m.addEventListener("click",(t=>{var e,n;t.stopPropagation(),e="pinglet:notificationClosed",n={contentEl:m.parentElement?.parentElement,reason:"user-dismiss"},window.dispatchEvent(new CustomEvent(e,{detail:n})),r&&0===r.children.length&&c?.remove()})),s}function h(e,i){const o=i.style,s=i.config,a=(s.theme.mode||{})&&window.matchMedia("(prefers-color-scheme: dark)").matches,l=document.createElement("div");l.id="pinglet-variant",l.setAttribute("data-key",`${Date.now()}-${Math.random().toString(36).slice(2,8)}`),l.className=`pinglet-variant pinglet-${e.variant||"default"}`,Object.assign(l.style,{display:"flex",flexDirection:"column",alignItems:"stretch",width:"320px",maxHeight:"calc(100vh - 40px)",borderRadius:"8px",overflowY:"auto",padding:"4px",gap:"4px",pointerEvents:"none",overflow:"visible",flexShrink:"0",boxShadow:a?"0 2px 8px rgba(0,0,0,0.6)":"0 2px 8px rgba(0,0,0,0.1)",backgroundColor:a?"#1e1e1e":"whitesmoke",color:a?"#f0f0f0":"#000"}),l.appendChild(x(s,window.location.hostname,"just now",a));let r=null;const d="icon"in e||"logo"in e;if(e.media?.type&&(r=function(t,e,i){switch(t.type){case"image":{const i=document.createElement("img");return i.src=t.src,Object.assign(i.style,e?.image||n.media.image),i}case"video":{const o=document.createElement("video");return o.src=t.src,o.autoplay=i?.video?.autoplay||n.controls.video.autoplay||!1,o.muted=i?.video?.muted||n.controls.video.muted||!1,o.loop=i?.video?.loop||n.controls.video.loop||!1,o.controls=i?.video?.controls||n.controls.video.controls||!1,o.style=e?.video||n.media.video,Object.assign(o.style,e?.video||n.media.video),o}case"audio":return function(t,e,n,i){const o=document.createElement("div");Object.assign(o.style,{maxWidth:"auto",padding:"16px",borderRadius:"20px 20px 6px 20px",background:"#fff",boxShadow:"0 8px 32px rgba(0,0,0,0.12)",position:"relative",fontFamily:"Segoe UI, sans-serif"});const s=document.createElement("div");Object.assign(s.style,{position:"absolute",bottom:"6px",right:"-6px",width:"0",height:"0",borderLeft:"8px solid #ffffff",borderBottom:"8px solid transparent"}),o.appendChild(s);const a=document.createElement("audio");a.src=t,a.autoplay=!0,a.muted=e,a.loop=n,a.controls=i,o.appendChild(a);const l=document.createElement("div");Object.assign(l.style,{display:"flex",alignItems:"center",gap:"14px"});const r=document.createElement("button");r.textContent="▶",Object.assign(r.style,{background:"linear-gradient(135deg, #667eea 0%, #764ba2 100%)",border:"none",borderRadius:"50%",color:"white",width:"44px",height:"44px",fontSize:"18px",cursor:"pointer",flexShrink:"0",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 4px 16px rgba(102, 126, 234, 0.4)",transition:"transform 0.3s ease"}),l.appendChild(r);const c=document.createElement("div");Object.assign(c.style,{flex:"1",display:"flex",flexDirection:"column",gap:"8px"});const d=document.createElement("div");Object.assign(d.style,{display:"flex",alignItems:"center",justifyContent:"space-between",height:"32px",padding:"0 4px"});const p=[];for(let t=0;t<20;t++){const e=document.createElement("div");Object.assign(e.style,{width:"4px",background:"linear-gradient(to top, #667eea, #764ba2)",borderRadius:"2px",transition:"all 0.3s ease",height:8+t%5*4+"px",animation:"wave 1.5s infinite ease-in-out",animationDelay:t%5*.15+"s",animationPlayState:"paused"}),p.push(e),d.appendChild(e)}c.appendChild(d);const m=document.createElement("div");Object.assign(m.style,{display:"flex",justifyContent:"space-between",alignItems:"center",fontSize:"13px",color:"#666"});const f=document.createElement("div");f.textContent="Voice message",f.style.fontSize="12px",f.style.color="#888";const g=document.createElement("div");g.textContent="0:00",Object.assign(g.style,{fontWeight:"500",color:"#667eea"}),m.appendChild(f),m.appendChild(g),c.appendChild(m),l.appendChild(c),o.appendChild(l);const u=document.createElement("style");function y(t){return`${Math.floor(t/60)}:${Math.floor(t%60).toString().padStart(2,"0")}`}return u.textContent="\n @keyframes wave {\n 0%, 100% { opacity: 0.3; transform: scaleY(0.5); }\n 50% { opacity: 1; transform: scaleY(1); }\n }\n ",document.head.appendChild(u),a.addEventListener("loadedmetadata",(()=>{g.textContent=y(a.duration)})),a.addEventListener("timeupdate",(()=>{g.textContent=y(a.currentTime)})),r.addEventListener("click",(()=>{a.paused?(a.play(),r.textContent="⏸",p.forEach((t=>t.style.animationPlayState="running"))):(a.pause(),r.textContent="▶",p.forEach((t=>t.style.animationPlayState="paused")))})),a.addEventListener("ended",(()=>{r.textContent="▶",p.forEach((t=>t.style.animationPlayState="paused")),a.currentTime=0})),o}(t.src,i?.audio?.muted||n.controls?.audio.muted||!1,i?.audio?.loop||n.controls?.audio?.loop||!1,i?.audio?.controls||n.controls?.audio?.controls||!1);default:return null}}(e.media,o.media,o.controls),r.style.marginBottom="12px"),r&&l.appendChild(r),d){const t=document.createElement("div");Object.assign(t.style,{display:"flex",flexDirection:"row",alignItems:"flex-start",gap:"6px"});const s=document.createElement("div");Object.assign(s.style,{flex:"0 0 auto"});const r=function(t,e,i){if("logo"===t){const t=document.createElement("img");return t.src=e,Object.assign(t.style,i?.logo||n.media.logo),t}if("icon"===t){const t=document.createElement("span");if("string"==typeof e){const n=/^data:image\/(png|jpeg|gif|webp);base64,/.test(e),i=/^<svg[\s\S]*<\/svg>$/.test(e.trim());n?(t.style.backgroundImage=`url('${e}')`,t.style.backgroundSize="cover",t.textContent=""):i?t.innerHTML=e:t.textContent=e}return t.className="pinglet-icon",Object.assign(t.style,{width:"40px",height:"40px",display:"inline-flex",alignItems:"center",justifyContent:"center",backgroundPosition:"center",borderRadius:"8px",fontSize:"24px",overflow:"hidden"}),t}return null}("icon"in e?"icon":"logo",e?.icon||e?.logo,i.style.media);r&&s.appendChild(r),t.appendChild(s);const c=document.createElement("div");if(Object.assign(c.style,{display:"flex",flexDirection:"column",flex:"1"}),e.title){const t=document.createElement("div");t.className="pinglet-title",t.innerText=e.title,Object.assign(t.style,{...o.title||n.title,color:a?"#ffffff":"#000000"}),c.appendChild(t)}if(e.description){const t=document.createElement("p");t.className="pinglet-desc",t.innerText=e.description,Object.assign(t.style,{...o.description||n.description,color:a?"#dddddd":"#333333"}),c.appendChild(t)}t.appendChild(c),l.appendChild(t)}else{if(e.title){const t=document.createElement("div");t.className="pinglet-title",t.innerText=e.title,Object.assign(t.style,{...o.title||n.title,color:a?"#ffffff":"#000000"}),l.appendChild(t)}if(e.description){const t=document.createElement("p");t.className="pinglet-desc",t.innerText=e.description,Object.assign(t.style,{...o.description||n.description,color:a?"#dddddd":"#333333"}),l.appendChild(t)}}if(e.buttons){const n=document.createElement("div");n.className="pinglet-buttons",n.style.fontFamily="Manrope",e.buttons.forEach(((e,i)=>{const s=document.createElement("button");if(s.innerText=e.text,s.className="pinglet-btn",Object.assign(s.style,{cursor:"pointer",padding:"6px 10px",fontFamily:"Manrope, sans-serif",margin:"1px 4px",color:a?"#f0f0f0":"#000",backgroundColor:a?"#333":"#f0f0f0",border:"none",borderRadius:"4px"}),Object.assign(s.style,0===i?o.btn1:o.btn2),e?.onClick){const t=new Function(`return ${e.onClick}`)();"function"==typeof t&&s.addEventListener("click",t)}else s.addEventListener("click",(n=>(n.stopPropagation(),t(e,l))));n.appendChild(s)})),l.appendChild(n)}return s.sound?.play&&p(),!c||l.contains(c)||s.branding?.once||l.appendChild(c),l}window.addEventListener("pinglet:notificationClosed",(t=>{y("closed",t.detail.contentEl,t.detail.reason),u(t.detail.contentEl,"fade")}));let b=!1;async function w(t,e){(await self.clients.matchAll({type:"window",includeUncontrolled:!0})).forEach((n=>{n.postMessage({type:"CUSTOM_NOTIFICATION_EVENT",eventName:t,payload:e})}))}async function v(t,e){"project_id"in e&&await fetch("https://pinglet.enjoys.in/api/v1/log/event",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,event:t})})}function E(t,e){const n=new CustomEvent(`notification:${t}`,{detail:e});document.dispatchEvent(n)}function C(t,e){document.addEventListener(`notification:${t}`,(t=>{e(t.detail)}))}async function k(t,e){"project_id"in e&&await fetch("https://pinglet.enjoys.in/api/v1/log/track",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...e,event:t}),credentials:"omit"})}self.addEventListener("install",(t=>{self.skipWaiting()})),self.addEventListener("activate",(t=>{clients.claim()})),self.addEventListener("push",(async t=>{if(console.log("[Service Worker] Push Received."),!t.data)return;const e=t.data?.json?.()||{},n={body:e?.body,icon:e?.icon,badge:e?.badge,tag:e?.tag,requireInteraction:e?.requireInteraction||!0,silent:e?.silent||!1,data:e?.data,actions:e?.actions,image:e?.image,timestamp:Date.now(),vibrate:[200,100,200]};e.data?.duration&&setTimeout((()=>{self.registration.getNotifications({tag:e.tag}).then((async t=>{const n=await self.clients.matchAll({type:"window",includeUncontrolled:!0});t.forEach((t=>{n.length>0?w("dropped",{...e?.data,notificationTag:t.tag,timestamp:Date.now()}):v("dropped",{...e?.data,notificationTag:t.tag,timestamp:Date.now()}),t.close()}))}))}),e.data?.duration||5e3);const i=await self.clients.matchAll({type:"window",includeUncontrolled:!0});b=i.length>0,t.waitUntil(self.registration.showNotification(e.title,n))})),self.addEventListener("notificationclick",(t=>{t.notification.close();const e=t.notification.data||{},n=t.action;if(n&&e.actionEvents&&e.actionEvents[n]){const i=e.actionEvents[n];async function o(t,e,n){const{eventName:i,eventData:o,url:s,windowAction:a}=t;try{if(b?n.waitUntil(w(i,{...o,notificationTag:n.notification.tag,timestamp:Date.now()})):n.waitUntil(v("clicked",{...e,notificationTag:n.notification.tag,timestamp:Date.now()})),"open"===a&&s)await clients.openWindow(s);else if("focus"===a){const t=await clients.matchAll({type:"window"});t.length>0?await t[0].focus():s&&await clients.openWindow(s)}}catch(t){}}t.waitUntil(o(i,e,t))}else{if("dismiss"===t.action)return b?t.waitUntil(w("closed",{...e,notificationTag:t.notification.tag,timestamp:Date.now()})):t.waitUntil(v("closed",{...eventData,notificationTag:t.notification.tag,timestamp:Date.now()})),t.notification.close();if("url"in e){const s=e.url;t.waitUntil(clients.openWindow(s))}b?t.waitUntil(w("clicked",{...e,notificationTag:t.notification.tag,timestamp:Date.now()})):t.waitUntil(v("clicked",{...eventData,notificationTag:t.notification.tag,timestamp:Date.now()}))}})),self.addEventListener("notificationclose",(t=>{console.log("Notification closed:",t.notification.tag)})),window.notificationEventHandlers={},"serviceWorker"in navigator&&navigator.serviceWorker.addEventListener("message",(t=>{const{type:e,eventName:n,payload:i}=t.data;"CUSTOM_NOTIFICATION_EVENT"===e&&E(n,i)})),window.sendNotificationEvent=E,C("clicked",(t=>k("clicked",t))),C("dropped",(t=>k("dropped",t))),C("closed",(t=>k("closed",t)));const j={autoCloseDelay:1e4,brandingText:"Powered by Enjoys",brandingPosition:"right",defaultClass:"pinglet-wigdet-wrapper",spacing:2,maxVisible:3,side:"right"},S=document.createElement("style");function I(t,e){let n=document.getElementById(t);return n||(n=document.createElement("div"),n.id=t,n.style.position="fixed",n.style.zIndex="9999",n.style.display="flex",n.style.flexDirection="column-reverse",n.style.gap=`${j.spacing}px`,n.style.pointerEvents="none",n.style.bottom="20px",n.classList.add(j.defaultClass),"left"===e?n.style.left="20px":n.style.right="20px",document.body.appendChild(n)),n}S.innerHTML="\n@keyframes slideIn {\n from { opacity: 0; transform: translateY(40px); }\n to { opacity: 1; transform: translateY(0); }\n}\n@keyframes slideOut {\n from { opacity: 1; transform: translateY(0); }\n to { opacity: 0; transform: translateY(40px); }\n}",document.head.appendChild(S);const O=I("container-right","right"),T=I("container-left","left"),L={left:[],right:[]},N={left:[],right:[]};function z(t=[],e={}){const n={...j,...e},i=document.createElement("div");i.style.position="relative",i.style.width="300px",i.style.borderRadius="10px",i.style.boxShadow="0 4px 12px rgba(0,0,0,0.15)",i.style.backgroundColor="#fff",i.style.transition="transform 0.3s ease, opacity 0.3s ease",i.style.animation="slideIn 0.4s forwards",i.style.pointerEvents="all",i.id="pinglet-custom-wrapper",t.forEach((t=>i.appendChild(t)));const o=document.createElement("button");o.innerText="×",Object.assign(o.style,{position:"absolute",top:"-10px",right:"-10px",width:"25px",height:"25px",borderRadius:"50%",border:"none",backgroundColor:"#f00",color:"#fff",fontSize:"16px",fontWeight:"bold",cursor:"pointer",display:"flex",alignItems:"center",justifyContent:"center",boxShadow:"0 2px 4px rgba(0,0,0,0.2)"}),o.addEventListener("click",(async t=>{t.stopPropagation(),r(),y("closed",i),P(i,n.side)})),i.appendChild(o);const s=document.createElement("div");let a;function l(){a=setTimeout((()=>{(T.contains(i)||O.contains(i))&&y("dropped",i,"user doesn't interact"),P(i,n.side)}),n.autoCloseDelay)}function r(){clearTimeout(a)}return s.innerText=n.brandingText,Object.assign(s.style,{position:"absolute",bottom:"5px",fontSize:"12px",color:"#666"}),s.style[n.brandingPosition]="10px",i.appendChild(s),i.addEventListener("mouseenter",r),i.addEventListener("mouseleave",l),l(),L[n.side].push(i),D(n.side),i}function D(t){const e="left"===t?T:O;for(;N[t].length<j.maxVisible&&L[t].length>0;){const n=L[t].shift();e.appendChild(n),N[t].push(n)}}function P(t,e){t.style.animation="slideOut 0.4s forwards",t.addEventListener("animationend",(()=>{t.remove();const n=N[e].indexOf(t);-1!==n&&N[e].splice(n,1),D(e)}))}const _=Array.from(document.scripts).find((t=>t.src.includes("pinglet-sse")&&t.dataset.endpoint))||document.currentScript,M=_?.dataset.endpoint,W=_?.dataset.configuredDomain,A=_?.dataset.projectId,R=_?.dataset.pingletId,$=_?.dataset.checksum,F=_?.dataset.testimonials,X=_?.dataset.templates;(async t=>{if(t.projectId=A,t.PingletWidget)return void console.warn("PingletNotification is already initialized.");!function(){const t=document.createElement("link");t.rel="stylesheet",t.href="https://fonts.googleapis.com/css2?family=Manrope:wght@200..800&display=swap",document.head.appendChild(t);const e=document.createElement("style");e.innerHTML='\n [class^="pinglet-"],\n [class*=" pinglet-"] {\n font-family: \'Manrope\', sans-serif !important;\n font-weight: 400 !important;\n }\n ',document.head.appendChild(e)}(),s(M,A,R),F&&function(){const t=document.getElementById("pinglet-testimonials");if(t)return t;const n=document.createElement("div");n.className="pinglet-floating-btn",n.style.position="fixed",n.style.bottom="30px",n.style.right="30px",n.style.display="flex",n.style.alignItems="center",n.style.background="#667EEA",n.style.borderRadius="50px",n.style.padding="0",n.style.cursor="pointer",n.style.boxShadow="0 4px 14px 0 rgba(102, 126, 234, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.05)",n.style.transition="all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",n.style.overflow="hidden",n.style.width="24px",n.style.height="24px",n.style.zIndex="1000",n.style.backdropFilter="blur(10px)",n.style.border="1px solid rgba(255, 255, 255, 0.1)";const i=document.createElement("div");i.textContent="❔",i.className="icon",i.style.fontSize="20px",i.style.display="flex",i.style.alignItems="center",i.style.justifyContent="center",i.style.transition="all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",i.style.width="24px",i.style.height="24px",i.style.flexShrink="0",i.style.color="white";const o=document.createElement("span");o.textContent="View",o.className="label",o.style.color="white",o.style.fontWeight="500",o.style.fontSize="14px",o.style.marginLeft="8px",o.style.marginRight="16px",o.style.opacity="0",o.style.transform="translateX(-8px)",o.style.transition="all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",o.style.whiteSpace="nowrap",o.style.letterSpacing="0.025em",n.appendChild(i),n.appendChild(o),document.body.appendChild(n),n.addEventListener("mouseenter",(()=>{n.style.width="100px",n.style.borderRadius="28px",n.style.boxShadow="0 8px 25px 0 rgba(102, 126, 234, 0.35), 0 0 0 1px rgba(255, 255, 255, 0.1)",n.style.transform="translateY(-2px)",o.style.opacity="1",o.style.transform="translateX(0)",i.style.transform="scale(1.05)"})),n.addEventListener("mouseleave",(()=>{n.style.width="40px",n.style.height="40px",n.style.borderRadius="50px",n.style.boxShadow="0 4px 14px 0 rgba(102, 126, 234, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.05)",n.style.transform="translateY(0)",o.style.opacity="0",o.style.transform="translateX(-8px)",i.style.transform="scale(1)"})),n.addEventListener("mousedown",(()=>{n.style.transform="translateY(0) scale(0.98)",n.style.boxShadow="0 2px 8px 0 rgba(102, 126, 234, 0.3), 0 0 0 1px rgba(255, 255, 255, 0.05)"})),n.addEventListener("mouseup",(()=>{n.style.transform="translateY(-2px)",n.style.boxShadow="0 8px 25px 0 rgba(102, 126, 234, 0.35), 0 0 0 1px rgba(255, 255, 255, 0.1)"})),o.addEventListener("click",(()=>{e("Testimonials Error","There was an error loading testimonials. Please try again later. If the issue persists, please contact support.",[],"❌")}));const s=()=>{window.innerWidth<=768?(n.style.bottom="16px",n.style.right="16px",n.style.width="48px",n.style.height="48px",i.style.width="48px",i.style.height="48px",i.style.fontSize="18px",o.style.fontSize="13px",o.style.marginLeft="6px",o.style.marginRight="12px"):(n.style.bottom="30px",n.style.right="30px",n.style.width="40px",n.style.height="40px",i.style.width="40px",i.style.height="40px",i.style.fontSize="20px",o.style.fontSize="14px",o.style.marginLeft="8px",o.style.marginRight="16px")};s(),window.addEventListener("resize",s)}();const o={version:"1.2.1",checksum:$.replace("sha384-",""),async init({endpoint:t,configuredDomain:o,projectId:s,pingletId:l}){if(console.log("%cPingletWidget initialized successfully.","color: #1e90ff; font-weight: bold;",this.version),!l)return e("Configuration Error","Missing Pinglet ID.",[{text:"Retry",action:"reload"},{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],"❌"),console.error("Missing pingletId.");if(!t)return e("Configuration Error","Missing Endpoint.",[{text:"Retry",action:"reload"},{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],"❌"),console.error("Missing pingletId.");if("1.2.1"!==this.version)return e("Pinglet Unsupported Version",`PingletWidget version ${this.version} is not supported. Please update to the latest version.`,[{text:"See Docs",actions:"redirect",src:"https://pinglet.enjoys.in/docs"}],"⚠️"),void console.warn("Unsupported version detected.");if(!this.checksum||!$)return e("Configuration Error","Missing checksum.");const r=await fetch(`${t}/load/projects?projectId=${s}&domain=${o}`,{headers:{"X-Project-ID":s,"X-Timestamp":Date.now(),"X-Pinglet-Signature":l,"X-Pinglet-Checksum":this.checksum,"X-Pinglet-Version":this.version,"X-Configured-Domain":o,"X-Pinglet-Id":l},credentials:"omit"}),c=await r.json();if(!c||!c.success)return e("Configuration Error",`Failed to load configuration for PingletWidget. ${c.message||"Unknown error"}`,[{text:"Retry",action:"reload"},{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],"❌"),console.error("Failed to load configuration for PingletWidget.");m(c.result.config.branding);let f={};X||(f=await async function(t,e,n,i,o,s){const a=await fetch(`${t}/load/templates?projectId=${e}&templatesIds=${s}`,{headers:{"X-Project-ID":e,"X-Timestamp":Date.now(),"X-Pinglet-Signature":n,"X-Pinglet-Checksum":i,"X-Pinglet-Version":o},credentials:"omit"}),l=await a.json();return l&&l.success?l.result:null}(t,s,l,this.checksum,this.version,X),f||e("Configuration Error","Failed to load templates for PingletWidget."));const u={is_tff:c.result?.is_premium??!1,templates:Object.assign({},{default:{compiled_text:e.toString(),config:i,is_active:!0,is_default:!0}},f),style:Object.assign({},n,c.result.template?.config),config:Object.assign({},i,c.result.config)};!function(t){if(a)return a;t.config.sound?.play&&t.config.sound.src&&(d=t.config.sound.src,a=new Audio(d||t.config.sound.src),a.volume=t.config.sound.volume??.5)}(u);new EventSource(`${t}/sse?projectId=${s}&pingletId=${l}`,{withCredentials:!1}).onmessage=t=>{const e=JSON.parse(t.data),n=e.data;if(u?.is_tff&&Object.assign(u.config,u.config,n?.overrides??{}),"1"===e?.type&&e?.template_id&&e?.custom_template){const t=u.templates[e.template_id];if(!t||0===t.compiled_text.length)return console.error("Template not found");const n=new Function(`return ${t.compiled_text?.trim()}`)()(e?.custom_template);let i;return u.config.sound&&p(),i=Array.isArray(n)?z(n,{side:"left"}):z([n],{side:"left"}),i.setAttribute("data-notification-id",`${e?.project_id||s}-${Date.now()}`),i.setAttribute("data-notification-type",e?.type||"1"),void i.addEventListener("click",(()=>{y("clicked",i,"user clicked"),e.custom_template.url&&window.open(e.custom_template.url,"_blank")}))}if("0"===e?.type&&e?.body){const t=h(e.body,u);t.setAttribute("data-notification-id",`${e?.project_id||s}-${Date.now()}`),t.setAttribute("data-notification-type",e?.type||"0");const{toastContainer:n}=g(t,u);"url"in e.body&&n.addEventListener("click",(()=>{y("clicked",t,"user clicked"),t.remove(),window.open(e.body.url,"_blank")}))}else e&&"-1"===e?.type&&function(t,e,n){new Notification(t,{badge:"🎉",body:e,actions:[{action:"pinglet",title:"Pinglet"}],icon:n,dir:"rtl",lang:"en",silent:!1,tag:"pinglet",vibrate:[100,50,100],requireInteraction:!0}).onclick=()=>{}}(body.title,body.description,body.type?.icon?.src||"")}}};t.PingletWidget=o,o.init({endpoint:M,configuredDomain:W,projectId:A,pingletId:R})})(window)}();
|
|
1
|
+
!function(){"use strict";const e={position:"bottom-left",transition:"fade",duration:5e3,maxVisible:3,stacking:!0,auto_dismiss:!0,dismissible:!0,website:!0,favicon:!0,time:!0,sound:{play:!1,src:"",volume:.5},theme:{mode:"auto",customClass:"",rounded:!0,shadow:!0,border:!1},branding:{show:!0,once:!0,html:""},progressBar:{show:!0,color:""}},t={duration:3e3,btn1:{color:"#ffffff",backgroundColor:"#007bff",padding:"6px 10px",borderRadius:"6px",fontSize:"14px",fontWeight:"600",border:"none",boxShadow:"0 2px 6px rgba(0,0,0,0.15)"},btn2:{color:"#333333",backgroundColor:"#f0f0f0",padding:"6px 10px",borderRadius:"6px",fontSize:"14px",fontWeight:"600",border:"1px solid #ccc"},title:{color:"#111111",fontSize:"14px",fontWeight:"500",lineHeight:"1.4",margin:"0",textAlign:"left"},description:{color:"#444444",fontSize:"13px",fontWeight:"400",lineHeight:"1.5",margin:"0 0 10px 0",textAlign:"left"},controls:{video:{autoplay:!1,muted:!1,loop:!1,controls:!0},audio:{autoplay:!1,muted:!1,loop:!1,controls:!0}},media:{image:{width:"100%",borderRadius:"8px",objectFit:"cover",maxHeight:"200px"},video:{width:"100%",borderRadius:"8px",maxHeight:"200px"},audio:{width:"100%"},iframe:{width:"100%",borderRadius:"8px",height:"180px",border:"none"}}},n="1.3.0",o="__pinglet_popup_css__",i="__pinglet_popup_font__";function a(e,t,n=[{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],a="⚠️",r={duration:6e3,auto_dismiss:!0}){!function(){if(document.getElementById(o))return;if(!document.getElementById(i)){const e=document.createElement("link");e.id=i,e.rel="stylesheet",e.href="https://fonts.googleapis.com/css2?family=Raleway:wght@400;500;600;700&family=Lato:wght@300;400;700&display=swap",document.head.appendChild(e)}const e=document.createElement("style");e.id=o,e.textContent="\n/* Popup container */\n.pgl-pop-wrap{position:fixed;bottom:20px;right:20px;z-index:2147483647;display:flex;flex-direction:column;gap:10px;\n align-items:flex-end;pointer-events:none;max-width:400px}\n/* Card — Light */\n.pgl-pop{pointer-events:auto;width:360px;max-width:calc(100vw - 40px);border-radius:16px;overflow:hidden;\n background:rgba(255,255,255,0.88);backdrop-filter:blur(24px) saturate(1.5);-webkit-backdrop-filter:blur(24px) saturate(1.5);\n border:1px solid rgba(255,255,255,0.55);box-shadow:0 12px 40px rgba(0,0,0,0.10),0 2px 10px rgba(0,0,0,0.04);\n font-family:'Lato','Raleway',sans-serif;color:#1c1c2e;\n opacity:0;transform:translateX(60px);animation:pgl-pop-in .4s cubic-bezier(.22,1,.36,1) forwards}\n/* Card — Dark */\n.pgl-pop.pgl-pop-dk{background:rgba(16,16,28,0.92);border:1px solid rgba(255,255,255,0.07);\n box-shadow:0 12px 40px rgba(0,0,0,0.45),0 2px 10px rgba(0,0,0,0.2);color:#e0e0ef}\n/* Severity bar */\n.pgl-pop-bar{height:3px;border-radius:16px 16px 0 0}\n.pgl-pop-bar.pgl-err{background:linear-gradient(90deg,#ef4444,#f97316)}\n.pgl-pop-bar.pgl-warn{background:linear-gradient(90deg,#f59e0b,#eab308)}\n.pgl-pop-bar.pgl-info{background:linear-gradient(90deg,#6366f1,#8b5cf6)}\n.pgl-pop-bar.pgl-ok{background:linear-gradient(90deg,#22c55e,#10b981)}\n/* Anim */\n@keyframes pgl-pop-in{to{opacity:1;transform:translateX(0)}}\n@keyframes pgl-pop-out{to{opacity:0;transform:translateX(40px) scale(0.96)}}\n@keyframes pgl-pop-shake{0%,100%{transform:translateX(0)}10%,30%,50%{transform:translateX(-3px)}20%,40%{transform:translateX(3px)}}\n/* Inner */\n.pgl-pop-inner{padding:16px 18px 14px}\n/* Header */\n.pgl-pop-head{display:flex;align-items:flex-start;gap:12px}\n.pgl-pop-icon{width:40px;height:40px;border-radius:12px;display:flex;align-items:center;justify-content:center;\n font-size:20px;flex-shrink:0;line-height:1}\n.pgl-pop-icon.pgl-err{background:rgba(239,68,68,0.10)}\n.pgl-pop-icon.pgl-warn{background:rgba(245,158,11,0.10)}\n.pgl-pop-icon.pgl-info{background:rgba(99,102,241,0.10)}\n.pgl-pop-icon.pgl-ok{background:rgba(34,197,94,0.10)}\n.pgl-pop-dk .pgl-pop-icon.pgl-err{background:rgba(239,68,68,0.15)}\n.pgl-pop-dk .pgl-pop-icon.pgl-warn{background:rgba(245,158,11,0.15)}\n.pgl-pop-dk .pgl-pop-icon.pgl-info{background:rgba(99,102,241,0.18)}\n.pgl-pop-dk .pgl-pop-icon.pgl-ok{background:rgba(34,197,94,0.15)}\n.pgl-pop-text{flex:1;min-width:0}\n.pgl-pop-title{font-family:'Raleway',sans-serif;font-size:14.5px;font-weight:700;margin:0 0 3px;line-height:1.35;letter-spacing:-0.1px}\n.pgl-pop-desc{font-family:'Lato',sans-serif;font-size:12.5px;font-weight:400;color:#6b7280;line-height:1.5;margin:0;\n display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}\n.pgl-pop-dk .pgl-pop-desc{color:#8b8ba0}\n.pgl-pop-close{width:26px;height:26px;border:none;border-radius:8px;cursor:pointer;display:flex;align-items:center;justify-content:center;\n background:transparent;color:#a1a1aa;transition:all .15s;flex-shrink:0;padding:0;margin-top:-2px}\n.pgl-pop-close:hover{background:rgba(0,0,0,0.05);color:#52525b}\n.pgl-pop-dk .pgl-pop-close{color:#5c5c72}\n.pgl-pop-dk .pgl-pop-close:hover{background:rgba(255,255,255,0.08);color:#a5a5bf}\n.pgl-pop-close svg{width:12px;height:12px}\n/* Buttons */\n.pgl-pop-btns{display:flex;gap:8px;margin-top:14px}\n.pgl-pop-btn{flex:1;padding:8px 14px;border-radius:10px;font-family:'Raleway',sans-serif;font-size:12px;font-weight:600;\n cursor:pointer;transition:all .15s;border:none;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}\n.pgl-pop-btn-primary{background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;box-shadow:0 2px 8px rgba(99,102,241,0.25)}\n.pgl-pop-btn-primary:hover{box-shadow:0 4px 14px rgba(99,102,241,0.35);transform:translateY(-1px)}\n.pgl-pop-btn-sec{background:rgba(0,0,0,0.04);color:#52525b;border:1px solid rgba(0,0,0,0.06)}\n.pgl-pop-btn-sec:hover{background:rgba(0,0,0,0.07)}\n.pgl-pop-dk .pgl-pop-btn-sec{background:rgba(255,255,255,0.06);color:#c0c0d6;border-color:rgba(255,255,255,0.08)}\n.pgl-pop-dk .pgl-pop-btn-sec:hover{background:rgba(255,255,255,0.10)}\n/* Footer */\n.pgl-pop-footer{display:flex;align-items:center;justify-content:space-between;padding:0 18px 12px;font-size:10.5px;color:#a1a1aa}\n.pgl-pop-dk .pgl-pop-footer{color:#4e4e64}\n.pgl-pop-footer a{color:#6366f1;text-decoration:none;font-weight:500}\n.pgl-pop-dk .pgl-pop-footer a{color:#818cf8}\n.pgl-pop-footer a:hover{text-decoration:underline}\n/* Progress */\n.pgl-pop-progress{height:2px;background:rgba(0,0,0,0.04);margin:0 18px 0;border-radius:2px;overflow:hidden}\n.pgl-pop-dk .pgl-pop-progress{background:rgba(255,255,255,0.04)}\n.pgl-pop-progress-bar{height:100%;border-radius:2px;transition:width linear}\n.pgl-pop-progress-bar.pgl-err{background:rgba(239,68,68,0.5)}\n.pgl-pop-progress-bar.pgl-warn{background:rgba(245,158,11,0.5)}\n.pgl-pop-progress-bar.pgl-info{background:rgba(99,102,241,0.4)}\n.pgl-pop-progress-bar.pgl-ok{background:rgba(34,197,94,0.4)}\n/* Mobile */\n@media(max-width:440px){.pgl-pop-wrap{right:12px;bottom:12px}.pgl-pop{width:calc(100vw - 24px)}}\n",document.head.appendChild(e)}();const s=window.matchMedia("(prefers-color-scheme: dark)").matches,p=function(e){if(!e)return"err";const t=String(e);return t.includes("❌")||t.includes("🔴")||t.includes("💀")?"err":t.includes("⚠")||t.includes("🟡")||t.includes("🟠")?"warn":t.includes("✅")||t.includes("🟢")||t.includes("🎉")?"ok":"info"}(a),l="pgl-pop-wrap";let d=document.getElementById(l);d||(d=document.createElement("div"),d.id=l,d.className="pgl-pop-wrap",document.body.appendChild(d));const c=document.createElement("div");c.className="pgl-pop"+(s?" pgl-pop-dk":"");const g=document.createElement("div");g.className="pgl-pop-bar "+p,c.appendChild(g);const m=document.createElement("div");m.className="pgl-pop-inner";const u=document.createElement("div");u.className="pgl-pop-head";const f=document.createElement("div");f.className="pgl-pop-icon "+p,f.textContent=a;const h=document.createElement("div");h.className="pgl-pop-text";const b=document.createElement("div");if(b.className="pgl-pop-title",b.textContent=e,h.appendChild(b),t){const e=document.createElement("div");e.className="pgl-pop-desc",e.textContent=t,h.appendChild(e)}const x=document.createElement("button");if(x.className="pgl-pop-close",x.setAttribute("aria-label","Close"),x.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>',u.append(f,h,x),m.appendChild(u),Array.isArray(n)&&n.length){const e=document.createElement("div");e.className="pgl-pop-btns",n.forEach(((t,n)=>{const o=document.createElement("button");if(o.className="pgl-pop-btn "+(0===n?"pgl-pop-btn-primary":"pgl-pop-btn-sec"),o.textContent=t.text||"Click Here",t?.onClick)try{const e=new Function(`return ${t.onClick}`)();"function"==typeof e&&o.addEventListener("click",e)}catch(e){console.warn("[Pinglet] Invalid onClick handler:",e)}else o.addEventListener("click",(e=>{e.stopPropagation(),function(e,t){switch(e.action){case"redirect":case"open":return window.open(e.src,"_blank","noopener,noreferrer");case"link":return window.open(e.src);case"alert":return alert(e.src);case"reload":return window.location.reload();case"event":{const t=e.event||e.eventName||e.src;if(!t)return void console.warn("[Pinglet] Button action 'event' requires an event name (event, eventName, or src).");const n=e.payload||e.data||{};return window.dispatchEvent(new CustomEvent(t,{detail:n}))}case"close":case"dismiss":return window.dispatchEvent(new CustomEvent("pinglet:notificationClosed",{detail:{contentEl:t,reason:"user-dismiss"}}));default:window.open("https://pinglet.enjoys.in/docs","_blank","noopener,noreferrer")}}(t,c),T()}));e.appendChild(o)})),m.appendChild(e)}c.appendChild(m);const v=r.duration||6e3,w=!1!==r.auto_dismiss;let y=null;if(w){const e=document.createElement("div");e.className="pgl-pop-progress",y=document.createElement("div"),y.className="pgl-pop-progress-bar "+p,y.style.width="100%",e.appendChild(y),c.appendChild(e)}const k=document.createElement("div");k.className="pgl-pop-footer";const E=document.createElement("span");E.textContent="just now";const C=document.createElement("span");C.innerHTML='by <a href="https://pinglet.enjoys.in" target="_blank" rel="noopener noreferrer">Enjoys</a>',k.append(E,C),c.appendChild(k);let L=!1,_=null,N=0,M=v;function T(){L||(L=!0,_&&clearTimeout(_),c.style.animation="pgl-pop-out .3s ease forwards",c.addEventListener("animationend",(()=>c.remove()),{once:!0}))}function j(){w&&!L&&(N=Date.now(),y&&(y.style.transition="width "+M+"ms linear",y.style.width="0%"),_=setTimeout(T,M))}return x.addEventListener("click",(e=>{e.stopPropagation(),T()})),c.addEventListener("mouseenter",(function(){if(!w||L)return;clearTimeout(_);const e=Date.now()-N;if(M=Math.max(M-e,200),y){const e=M/v*100;y.style.transition="none",y.style.width=e+"%"}})),c.addEventListener("mouseleave",j),"err"===p&&c.addEventListener("animationend",(()=>{m.style.animation="pgl-pop-shake .4s ease"}),{once:!0}),d.appendChild(c),requestAnimationFrame((()=>j())),c}function r(e){const t=(e+"=".repeat((4-e.length%4)%4)).replace(/-/g,"+").replace(/_/g,"/"),n=window.atob(t),o=new Uint8Array(n.length);for(let e=0;e<n.length;e++)o[e]=n.charCodeAt(e);return o}const s="__pinglet_perm_css__",p="__pinglet_perm_font__";function l(e={}){const{title:t="Stay in the loop",description:n="Get instant updates on new features, important alerts, and exclusive content — right on your screen.",site:o=window.location.hostname,onAllow:i=()=>{},onDeny:a=()=>{}}=e;!function(){if(document.getElementById(s))return;if(!document.getElementById(p)){const e=document.createElement("link");e.id=p,e.rel="stylesheet",e.href="https://fonts.googleapis.com/css2?family=Manrope:wght@400;500;600;700&display=swap",document.head.appendChild(e)}const e=document.createElement("style");e.id=s,e.textContent="\n/* Permission dialog */\n.pgl-perm{position:fixed;bottom:24px;right:24px;width:370px;z-index:2147483646;border-radius:20px;overflow:hidden;\n background:rgba(255,255,255,0.82);backdrop-filter:blur(28px) saturate(1.5);-webkit-backdrop-filter:blur(28px) saturate(1.5);\n border:1px solid rgba(255,255,255,0.6);box-shadow:0 20px 60px rgba(0,0,0,0.10),0 2px 12px rgba(0,0,0,0.05);\n font-family:'Manrope',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;color:#1c1c2e;\n opacity:0;transform:translateY(30px) scale(0.97);animation:pgl-perm-in .5s cubic-bezier(.22,1,.36,1) .8s forwards}\n/* Dark */\n.pgl-perm.pgl-dk{background:rgba(18,18,32,0.88);border:1px solid rgba(255,255,255,0.08);\n box-shadow:0 20px 60px rgba(0,0,0,0.4),0 2px 12px rgba(0,0,0,0.2);color:#e8e8f0}\n/* Anim */\n@keyframes pgl-perm-in{to{opacity:1;transform:translateY(0) scale(1)}}\n@keyframes pgl-perm-out{to{opacity:0;transform:translateY(20px) scale(0.95)}}\n@keyframes pgl-bell-ring{0%,100%{transform:rotate(0)}15%{transform:rotate(14deg)}30%{transform:rotate(-12deg)}45%{transform:rotate(8deg)}60%{transform:rotate(-4deg)}75%{transform:rotate(2deg)}}\n@keyframes pgl-glow{0%,100%{box-shadow:0 0 16px rgba(99,102,241,0.25)}50%{box-shadow:0 0 28px rgba(99,102,241,0.45)}}\n/* Top accent bar */\n.pgl-perm-accent{height:3px;background:linear-gradient(90deg,#6366f1,#a855f7,#ec4899);border-radius:20px 20px 0 0}\n/* Inner */\n.pgl-perm-inner{padding:22px 24px 20px}\n/* Top row */\n.pgl-perm-top{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px}\n.pgl-perm-site{display:flex;align-items:center;gap:8px;font-size:12.5px;font-weight:400;color:#71717a;letter-spacing:0.3px}\n.pgl-dk .pgl-perm-site{color:#8b8ba0}\n.pgl-perm-dot{width:7px;height:7px;border-radius:50%;background:#22c55e;flex-shrink:0}\n.pgl-perm-x{width:28px;height:28px;border:none;border-radius:10px;cursor:pointer;display:flex;align-items:center;justify-content:center;\n background:rgba(0,0,0,0.04);color:#a1a1aa;transition:all .2s}\n.pgl-perm-x:hover{background:rgba(0,0,0,0.08);color:#52525b}\n.pgl-dk .pgl-perm-x{background:rgba(255,255,255,0.06);color:#6b6b80}\n.pgl-dk .pgl-perm-x:hover{background:rgba(255,255,255,0.12);color:#a5a5bf}\n.pgl-perm-x svg{width:13px;height:13px}\n/* Bell icon */\n.pgl-perm-bell{width:56px;height:56px;border-radius:16px;margin:0 auto 16px;display:flex;align-items:center;justify-content:center;\n background:linear-gradient(135deg,#6366f1 0%,#8b5cf6 50%,#a855f7 100%);animation:pgl-glow 3s ease-in-out infinite;position:relative}\n.pgl-perm-bell svg{animation:pgl-bell-ring 2s ease-in-out 1.5s}\n.pgl-perm-bell::after{content:'';position:absolute;top:-2px;right:-2px;width:14px;height:14px;border-radius:50%;\n background:#22c55e;border:2.5px solid rgba(255,255,255,0.9)}\n.pgl-dk .pgl-perm-bell::after{border-color:rgba(18,18,32,0.9)}\n/* Text */\n.pgl-perm-title{font-family:'Manrope',sans-serif;font-size:17px;font-weight:700;text-align:center;margin:0 0 8px;letter-spacing:-0.2px;line-height:1.35}\n.pgl-perm-desc{font-family:'Manrope',sans-serif;font-size:13.5px;color:#6b7280;text-align:center;line-height:1.55;margin:0 0 22px;font-weight:400}\n.pgl-dk .pgl-perm-desc{color:#8b8ba0}\n/* Features */\n.pgl-perm-feats{display:flex;gap:6px;margin-bottom:20px;justify-content:center;flex-wrap:wrap}\n.pgl-perm-feat{display:flex;align-items:center;gap:5px;font-size:11.5px;font-weight:400;color:#6b7280;\n background:rgba(99,102,241,0.06);padding:4px 10px;border-radius:20px}\n.pgl-dk .pgl-perm-feat{background:rgba(99,102,241,0.12);color:#a5a5c0}\n.pgl-perm-feat svg{width:12px;height:12px;color:#6366f1;flex-shrink:0}\n.pgl-dk .pgl-perm-feat svg{color:#818cf8}\n/* Buttons */\n.pgl-perm-btns{display:flex;gap:10px}\n.pgl-perm-btn{flex:1;padding:11px 16px;border-radius:12px;font-family:'Manrope',sans-serif;font-size:13.5px;font-weight:600;\n cursor:pointer;transition:all .2s;border:none;letter-spacing:0.2px}\n.pgl-perm-deny{background:rgba(0,0,0,0.04);color:#71717a}\n.pgl-perm-deny:hover{background:rgba(0,0,0,0.08)}\n.pgl-dk .pgl-perm-deny{background:rgba(255,255,255,0.06);color:#8b8ba0}\n.pgl-dk .pgl-perm-deny:hover{background:rgba(255,255,255,0.10)}\n.pgl-perm-allow{background:linear-gradient(135deg,#6366f1,#8b5cf6);color:#fff;\n box-shadow:0 4px 14px rgba(99,102,241,0.3)}\n.pgl-perm-allow:hover{box-shadow:0 6px 20px rgba(99,102,241,0.4);transform:translateY(-1px)}\n.pgl-dk .pgl-perm-allow{box-shadow:0 4px 14px rgba(99,102,241,0.2)}\n/* Trust */\n.pgl-perm-trust{display:flex;align-items:center;justify-content:center;gap:5px;margin-top:14px;\n font-size:11px;color:#a1a1aa;font-weight:400}\n.pgl-dk .pgl-perm-trust{color:#5c5c72}\n.pgl-perm-trust svg{width:11px;height:11px;opacity:0.7}\n/* Mobile */\n@media(max-width:440px){.pgl-perm{width:calc(100vw - 24px);right:12px;bottom:12px}}\n",document.head.appendChild(e)}();const r=window.matchMedia("(prefers-color-scheme: dark)").matches,l=document.createElement("div");l.className="pgl-perm"+(r?" pgl-dk":"");const d=document.createElement("div");d.className="pgl-perm-accent",l.appendChild(d);const c=document.createElement("div");c.className="pgl-perm-inner";const g=document.createElement("div");g.className="pgl-perm-top";const m=document.createElement("div");m.className="pgl-perm-site",m.innerHTML='<span class="pgl-perm-dot"></span><span>'+o+"</span>";const u=document.createElement("button");u.className="pgl-perm-x",u.setAttribute("aria-label","Close"),u.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>',u.onclick=()=>{l.style.animation="pgl-perm-out .3s ease forwards",l.addEventListener("animationend",(()=>l.remove()),{once:!0})},g.append(m,u),c.appendChild(g);const f=document.createElement("div");f.className="pgl-perm-bell",f.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="white" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round" width="28" height="28"><path d="M18 8A6 6 0 0 0 6 8c0 7-3 9-3 9h18s-3-2-3-9"/><path d="M13.73 21a2 2 0 0 1-3.46 0"/></svg>',c.appendChild(f);const h=document.createElement("div");h.className="pgl-perm-title",h.textContent=t,c.appendChild(h);const b=document.createElement("div");b.className="pgl-perm-desc",b.textContent=n,c.appendChild(b);const x=document.createElement("div");x.className="pgl-perm-feats";const v=[{icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M13 2L3 14h9l-1 8 10-12h-9l1-8z"/></svg>',text:"Instant alerts"},{icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M12 22s8-4 8-10V5l-8-3-8 3v7c0 6 8 10 8 10z"/></svg>',text:"Private & secure"},{icon:'<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><circle cx="12" cy="12" r="10"/><path d="M8 12l2 2 4-4"/></svg>',text:"Unsubscribe anytime"}];for(const e of v){const t=document.createElement("span");t.className="pgl-perm-feat",t.innerHTML=e.icon+"<span>"+e.text+"</span>",x.appendChild(t)}c.appendChild(x);const w=document.createElement("div");w.className="pgl-perm-btns";const y=document.createElement("button");y.className="pgl-perm-btn pgl-perm-deny",y.textContent="Maybe later",y.onclick=()=>{a(),l.style.animation="pgl-perm-out .3s ease forwards",l.addEventListener("animationend",(()=>l.remove()),{once:!0})};const k=document.createElement("button");k.className="pgl-perm-btn pgl-perm-allow",k.textContent="Enable notifications",k.onclick=()=>{i(),l.style.animation="pgl-perm-out .3s ease forwards",l.addEventListener("animationend",(()=>l.remove()),{once:!0})},w.append(y,k),c.appendChild(w);const E=document.createElement("div");return E.className="pgl-perm-trust",E.innerHTML='<svg viewBox="0 0 24 24" fill="currentColor"><path d="M12 1L3 5v6c0 5.55 3.84 10.74 9 12 5.16-1.26 9-6.45 9-12V5l-9-4z"/></svg><span>Your data stays private</span>',c.appendChild(E),l.appendChild(c),document.body.appendChild(l),l}function d(e,t,n){"Notification"in window?"granted"!==Notification.permission&&"denied"!==Notification.permission&&l({site:window.location.hostname,onAllow:()=>{Notification.requestPermission().then((o=>{"granted"===o&&async function(e,t,n){try{const o=await navigator.serviceWorker.register(`${e}/sw.js`);if(await o.pushManager.getSubscription())return;const i=await o.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:r(n)}),s=await fetch(`${e}/subscribe?projectId=${t}`,{method:"POST",body:JSON.stringify(i),headers:{"Content-Type":"application/json"},credentials:"omit"}),p=await s.json();if(p.success)return void(localStorage.getItem("pinglet_subscription")||(localStorage.setItem("pinglet_subscription","true"),a("Notifications Enabled","You can now receive notifications from this site.",[{text:"See Demo",onClick:'()=>{\n\t\t\t\t\t\t\t\tnew Notification("Pinglet", {\n\t\t\t\t\t\t\t\t\tbody: "This is a demo notification",\n\t\t\t\t\t\t\t\t\ticon: "https://pinglet.enjoys.in/favicon.ico"\n\t\t\t\t\t\t\t\t}).onclick = () => {\n\t\t\t\t\t\t\t\t\twindow.open("https://pinglet.enjoys.in", "_blank");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}'}],"🎉")));a("Something Went Wrong",p.message,[],"❌")}catch(e){console.error("[Pinglet] Subscribe error:",e)}}(e,t,n)}))}}):a("Unsupported Browser","Notifications not supported.",[],"🚫")}function c(e,t){document.dispatchEvent(new CustomEvent(`notification:${e}`,{detail:t}))}function g(e,t){document.addEventListener(`notification:${e}`,(e=>{t(e.detail)}))}async function m(e,t){if(!t||!("project_id"in t))return;const n=function(){const e=Array.from(document.scripts).find((e=>e.src.includes("pinglet-sse")&&e.dataset.endpoint));return e?.dataset.endpoint||""}();if(n)try{await fetch(`${n}/log/track`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,event:e}),credentials:"omit"})}catch(e){console.warn("[Pinglet] Event tracking failed:",e)}}window.notificationEventHandlers=window.notificationEventHandlers||{},"serviceWorker"in navigator&&navigator.serviceWorker.addEventListener("message",(e=>{const{type:t,eventName:n,payload:o}=e.data||{};"CUSTOM_NOTIFICATION_EVENT"===t&&c(n,o)})),g("clicked",(e=>m("clicked",e))),g("dropped",(e=>m("dropped",e))),g("closed",(e=>m("closed",e))),window.sendNotificationEvent=c;let u=null,f=null;function h(){u&&(u.readyState<HTMLMediaElement.HAVE_ENOUGH_DATA||(u.currentTime=0,u.play().catch((()=>{}))))}function b(e){if(!e)return"";try{const t=new URL(e,window.location.origin);if("http:"===t.protocol||"https:"===t.protocol)return t.href}catch(e){}return""}const x="__pinglet_audio_player_css__";const v='<svg viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>';function w(e,t=!1,n=!1,o=!1,i=!1){!function(){if(document.getElementById(x))return;const e=document.createElement("style");e.id=x,e.textContent="\n/* ── Audio Player ── */\n.pn-audio{display:flex;align-items:center;gap:10px;padding:10px 12px;border-radius:12px;font-family:inherit;width:100%;box-sizing:border-box}\n.pn-audio.pn-a-light{background:rgba(0,0,0,0.03);border:1px solid rgba(0,0,0,0.06)}\n.pn-audio.pn-a-dark{background:rgba(255,255,255,0.06);border:1px solid rgba(255,255,255,0.08)}\n\n.pn-a-btn{width:36px;height:36px;border-radius:50%;border:none;cursor:pointer;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:transform .15s,background .15s;padding:0}\n.pn-a-btn:hover{transform:scale(1.08)}\n.pn-a-btn:active{transform:scale(0.95)}\n.pn-a-light .pn-a-btn{background:rgba(79,70,229,0.1);color:#4f46e5}\n.pn-a-dark .pn-a-btn{background:rgba(129,140,248,0.15);color:#818cf8}\n.pn-a-btn svg{width:16px;height:16px;fill:currentColor}\n\n.pn-a-mid{flex:1;display:flex;flex-direction:column;gap:4px;min-width:0}\n.pn-a-track{position:relative;height:6px;border-radius:3px;cursor:pointer;overflow:hidden}\n.pn-a-light .pn-a-track{background:rgba(0,0,0,0.06)}\n.pn-a-dark .pn-a-track{background:rgba(255,255,255,0.08)}\n.pn-a-fill{height:100%;border-radius:3px;width:0%;pointer-events:none}\n.pn-a-light .pn-a-fill{background:#4f46e5}\n.pn-a-dark .pn-a-fill{background:#818cf8}\n\n.pn-a-time{display:flex;justify-content:space-between;font-size:10.5px;font-weight:500;line-height:1}\n.pn-a-light .pn-a-time{color:#6b7280}\n.pn-a-dark .pn-a-time{color:#8888a8}\n",document.head.appendChild(e)}();const a=document.createElement("div");a.className="pn-audio "+(i?"pn-a-dark":"pn-a-light");const r=document.createElement("audio");r.src=e,r.muted=t,r.loop=n,r.preload="metadata",r.style.display="none",a.appendChild(r);const s=document.createElement("button");s.className="pn-a-btn",s.innerHTML=v,s.setAttribute("aria-label","Play audio"),a.appendChild(s);const p=document.createElement("div");p.className="pn-a-mid";const l=document.createElement("div");l.className="pn-a-track";const d=document.createElement("div");d.className="pn-a-fill",l.appendChild(d),p.appendChild(l);const c=document.createElement("div");c.className="pn-a-time";const g=document.createElement("span");g.textContent="0:00";const m=document.createElement("span");function u(e){return Math.floor(e/60)+":"+Math.floor(e%60).toString().padStart(2,"0")}return m.textContent="0:00",c.append(g,m),p.appendChild(c),a.appendChild(p),r.addEventListener("loadedmetadata",(()=>{m.textContent=u(r.duration)})),r.addEventListener("timeupdate",(()=>{r.duration&&(g.textContent=u(r.currentTime),d.style.width=r.currentTime/r.duration*100+"%")})),l.addEventListener("click",(e=>{if(e.stopPropagation(),!r.duration)return;const t=l.getBoundingClientRect();r.currentTime=Math.max(0,Math.min(1,(e.clientX-t.left)/t.width))*r.duration})),s.addEventListener("click",(e=>{e.stopPropagation(),r.paused?(r.play(),s.innerHTML='<svg viewBox="0 0 24 24"><path d="M6 4h4v16H6zm8 0h4v16h-4z"/></svg>'):(r.pause(),s.innerHTML=v)})),r.addEventListener("ended",(()=>{s.innerHTML=v,d.style.width="0%",g.textContent="0:00"})),a}const y="__pinglet_video_player_css__";const k='<svg viewBox="0 0 24 24"><path d="M8 5v14l11-7z"/></svg>',E='<svg viewBox="0 0 24 24"><path d="M6 4h4v16H6zm8 0h4v16h-4z"/></svg>',C='<svg viewBox="0 0 24 24"><path d="M16.5 12A4.5 4.5 0 0 0 14 8.18v1.7l2.4 2.4c.06-.36.1-.74.1-1.13v-.15zM19 12c0 .94-.2 1.82-.54 2.64l1.51 1.51A8.7 8.7 0 0 0 21 12c0-4.28-2.99-7.86-7-8.77v2.06C17.01 6.25 19 8.9 19 12zM4.27 3 3 4.27 7.73 9H3v6h4l5 5v-6.73l4.25 4.25c-.67.52-1.42.93-2.25 1.18v2.06a8.99 8.99 0 0 0 3.69-1.81L19.73 21 21 19.73l-9-9L4.27 3zM12 4 9.91 6.09 12 8.18V4z"/></svg>',L='<svg viewBox="0 0 24 24"><path d="M3 9v6h4l5 5V4L7 9H3zm13.5 3A4.5 4.5 0 0 0 14 8.18v7.64c1.5-.74 2.5-2.24 2.5-3.82zM14 3.23v2.06c2.89.86 5 3.54 5 6.71s-2.11 5.85-5 6.71v2.06c4.01-.91 7-4.49 7-8.77s-2.99-7.86-7-8.77z"/></svg>',_='<svg viewBox="0 0 24 24"><path d="M7 14H5v5h5v-2H7v-3zm-2-4h2V7h3V5H5v5zm12 7h-3v2h5v-5h-2v3zM14 5v2h3v3h2V5h-5z"/></svg>',N='<svg viewBox="0 0 24 24"><path d="M12 5V1L7 6l5 5V7c3.31 0 6 2.69 6 6s-2.69 6-6 6-6-2.69-6-6H4c0 4.42 3.58 8 8 8s8-3.58 8-8-3.58-8-8-8z"/></svg>';function M(e){if(!e||!isFinite(e))return"0:00";return Math.floor(e/60)+":"+Math.floor(e%60).toString().padStart(2,"0")}function T(e,t=!0,n=!1,o=null){!function(){if(document.getElementById(y))return;const e=document.createElement("style");e.id=y,e.textContent="\n/* ─── Container ─── */\n.pnv{position:relative;border-radius:10px;overflow:hidden;width:100%;font-family:inherit;user-select:none;-webkit-user-select:none}\n\n/* ─── Video element ─── */\n.pnv video{width:100%;display:block;max-height:220px;object-fit:cover;border-radius:10px}\n.pnv.pnv-dark video{border:1px solid rgba(255,255,255,0.06);box-sizing:border-box}\n\n/* ─── Controls bar (bottom overlay) ─── */\n.pnv-controls{\n position:absolute;bottom:0;left:0;right:0;\n display:flex;align-items:center;gap:6px;\n padding:6px 10px;\n background:linear-gradient(transparent,rgba(0,0,0,0.55));\n opacity:0;transition:opacity .25s;\n border-radius:0 0 10px 10px;\n pointer-events:auto;\n}\n.pnv:hover .pnv-controls,.pnv.pnv-playing .pnv-controls{opacity:1}\n\n/* ─── Shared icon button ─── */\n.pnv-btn{\n width:28px;height:28px;border:none;border-radius:50%;cursor:pointer;\n display:flex;align-items:center;justify-content:center;flex-shrink:0;\n padding:0;transition:transform .12s,background .12s;\n background:rgba(255,255,255,0.15);color:#fff;\n backdrop-filter:blur(4px);-webkit-backdrop-filter:blur(4px);\n}\n.pnv-btn:hover{transform:scale(1.08);background:rgba(255,255,255,0.25)}\n.pnv-btn:active{transform:scale(0.94)}\n.pnv-btn svg{width:14px;height:14px;fill:currentColor}\n\n/* ─── Seek / progress track ─── */\n.pnv-track{flex:1;position:relative;height:4px;border-radius:2px;cursor:pointer;background:rgba(255,255,255,0.2);overflow:visible}\n.pnv-fill{height:100%;border-radius:2px;width:0%;pointer-events:none;background:rgba(255,255,255,0.85);position:relative}\n.pnv-fill::after{\n content:'';position:absolute;right:-5px;top:50%;transform:translateY(-50%);\n width:10px;height:10px;border-radius:50%;background:#fff;\n box-shadow:0 0 4px rgba(0,0,0,0.3);\n opacity:0;transition:opacity .15s;\n}\n.pnv:hover .pnv-fill::after{opacity:1}\n\n/* ─── Time label ─── */\n.pnv-time{font-size:10px;color:rgba(255,255,255,0.85);white-space:nowrap;min-width:52px;text-align:center;font-variant-numeric:tabular-nums;pointer-events:none}\n\n/* ─── Big center play overlay (paused state) ─── */\n.pnv-overlay{\n position:absolute;inset:0;display:flex;align-items:center;justify-content:center;\n background:rgba(0,0,0,0.25);transition:opacity .25s;cursor:pointer;border-radius:10px;\n}\n.pnv-overlay.pnv-hide{opacity:0;pointer-events:none}\n.pnv-big-play{\n width:50px;height:50px;border-radius:50%;border:none;cursor:pointer;\n display:flex;align-items:center;justify-content:center;\n backdrop-filter:blur(8px);-webkit-backdrop-filter:blur(8px);\n transition:transform .15s;padding:0;\n}\n.pnv-big-play:hover{transform:scale(1.1)}\n.pnv-big-play svg{width:22px;height:22px;fill:currentColor}\n\n.pnv-big-play.pnv-bp-light{background:rgba(255,255,255,0.75);color:#1a1a2e}\n.pnv-big-play.pnv-bp-dark{background:rgba(0,0,0,0.5);color:#f0f0f0}\n\n/* ─── Volume slider ─── */\n.pnv-vol-wrap{display:flex;align-items:center;gap:4px;position:relative}\n.pnv-vol-slider{\n width:0;overflow:hidden;transition:width .2s;height:4px;border-radius:2px;\n cursor:pointer;appearance:none;-webkit-appearance:none;background:rgba(255,255,255,0.2);\n}\n.pnv-vol-wrap:hover .pnv-vol-slider{width:50px}\n.pnv-vol-slider::-webkit-slider-thumb{-webkit-appearance:none;width:10px;height:10px;border-radius:50%;background:#fff;cursor:pointer;border:none}\n.pnv-vol-slider::-moz-range-thumb{width:10px;height:10px;border-radius:50%;background:#fff;cursor:pointer;border:none}\n.pnv-vol-slider::-webkit-slider-runnable-track{height:4px;border-radius:2px;background:rgba(255,255,255,0.2)}\n.pnv-vol-slider::-moz-range-track{height:4px;border-radius:2px;background:rgba(255,255,255,0.2)}\n",document.head.appendChild(e)}();let i=0;const a=document.createElement("div");a.className="pnv"+(n?" pnv-dark":"");const r=document.createElement("video");r.src=e,r.muted=t,r.playsInline=!0,r.preload="metadata",a.appendChild(r);const s=document.createElement("div");s.className="pnv-overlay";const p=document.createElement("button");p.className="pnv-big-play "+(n?"pnv-bp-dark":"pnv-bp-light"),p.innerHTML=k,p.setAttribute("aria-label","Play video"),s.appendChild(p),a.appendChild(s);const l=document.createElement("div");l.className="pnv-controls";const d=document.createElement("button");d.className="pnv-btn",d.innerHTML=k,d.setAttribute("aria-label","Play"),l.appendChild(d);const c=document.createElement("div");c.className="pnv-track";const g=document.createElement("div");g.className="pnv-fill",c.appendChild(g),l.appendChild(c);const m=document.createElement("span");m.className="pnv-time",m.textContent="0:00 / 0:00",l.appendChild(m);const u=document.createElement("div");u.className="pnv-vol-wrap";const f=document.createElement("button");f.className="pnv-btn",f.innerHTML=t?C:L,f.setAttribute("aria-label","Toggle mute");const h=document.createElement("input");h.type="range",h.min="0",h.max="1",h.step="0.05",h.value=t?"0":"0.7",h.className="pnv-vol-slider",u.append(f,h),l.appendChild(u);const b=document.createElement("button");b.className="pnv-btn",b.innerHTML=_,b.setAttribute("aria-label","Fullscreen"),l.appendChild(b),a.appendChild(l);let x=!1,v=.7,w=!1;function T(e){if(e.stopPropagation(),w)return w=!1,r.currentTime=0,void r.play();r.paused?r.play():r.pause()}function j(e){if(!r.duration)return;const t=c.getBoundingClientRect(),n=Math.max(0,Math.min(1,(e.clientX-t.left)/t.width));r.currentTime=n*r.duration,g.style.width=100*n+"%",m.textContent=M(r.currentTime)+" / "+M(r.duration)}return r.addEventListener("loadedmetadata",(()=>{i=Math.round(1e3*r.duration),m.textContent="0:00 / "+M(r.duration),"function"==typeof o&&o(i),r.play().then((()=>{a.classList.add("pnv-playing"),s.classList.add("pnv-hide"),d.innerHTML=E})).catch((()=>{}))})),r.addEventListener("timeupdate",(()=>{if(x||!r.duration)return;const e=r.currentTime/r.duration*100;g.style.width=e+"%",m.textContent=M(r.currentTime)+" / "+M(r.duration)})),r.addEventListener("play",(()=>{w=!1,a.classList.add("pnv-playing"),s.classList.add("pnv-hide"),d.innerHTML=E})),r.addEventListener("pause",(()=>{w||(a.classList.remove("pnv-playing"),s.classList.remove("pnv-hide"),p.innerHTML=k,d.innerHTML=k)})),r.addEventListener("ended",(()=>{w=!0,a.classList.remove("pnv-playing"),s.classList.remove("pnv-hide"),p.innerHTML=N,d.innerHTML=N,g.style.width="100%"})),p.addEventListener("click",T),d.addEventListener("click",T),r.addEventListener("click",(e=>{T(e)})),c.addEventListener("mousedown",(e=>{e.stopPropagation(),x=!0,j(e);const t=e=>j(e),n=()=>{x=!1,document.removeEventListener("mousemove",t),document.removeEventListener("mouseup",n)};document.addEventListener("mousemove",t),document.addEventListener("mouseup",n)})),f.addEventListener("click",(e=>{e.stopPropagation(),r.muted||0===r.volume?(r.muted=!1,r.volume=v||.7,h.value=String(r.volume),f.innerHTML=L):(v=r.volume,r.muted=!0,h.value="0",f.innerHTML=C)})),h.addEventListener("input",(e=>{e.stopPropagation();const t=parseFloat(h.value);r.volume=t,r.muted=0===t,f.innerHTML=0===t?C:L,t>0&&(v=t)})),h.addEventListener("click",(e=>e.stopPropagation())),b.addEventListener("click",(e=>{e.stopPropagation(),document.fullscreenElement===a?document.exitFullscreen():a.requestFullscreen?.()||a.webkitRequestFullscreen?.()})),document.addEventListener("fullscreenchange",(()=>{b.innerHTML=document.fullscreenElement===a?'<svg viewBox="0 0 24 24"><path d="M5 16h3v3h2v-5H5v2zm3-8H5v2h5V5H8v3zm6 11h2v-3h3v-2h-5v5zm2-11V5h-2v5h5V8h-3z"/></svg>':_})),{element:a,getDuration:()=>i}}const j="__pinglet_html_ntfy_css__",S="__pinglet_html_ntfy_container__",z=new Map,I=new Map,P=new Map,A=new Set;function H(e={}){!function(){if(document.getElementById(j))return;const e=document.createElement("style");e.id=j,e.textContent="\n/* Container */\n.pn-container{position:fixed;z-index:2147483647;display:flex;flex-direction:column;gap:12px;pointer-events:none;max-height:100vh;overflow:visible}\n.pn-container.pn-top-right{top:20px;right:20px;align-items:flex-end}\n.pn-container.pn-top-left{top:20px;left:20px;align-items:flex-start}\n.pn-container.pn-bottom-right{bottom:20px;right:20px;align-items:flex-end;flex-direction:column-reverse}\n.pn-container.pn-bottom-left{bottom:20px;left:20px;align-items:flex-start;flex-direction:column-reverse}\n\n/* Card — Light */\n.pn-card{\n pointer-events:auto;width:380px;max-width:calc(100vw - 40px);border-radius:16px;\n background:rgba(255,255,255,0.55);backdrop-filter:blur(24px) saturate(1.6);\n -webkit-backdrop-filter:blur(24px) saturate(1.6);\n border:1px solid rgba(255,255,255,0.45);\n box-shadow:0 8px 32px rgba(0,0,0,0.12),0 2px 8px rgba(0,0,0,0.06),inset 0 1px 0 rgba(255,255,255,0.6);\n overflow:hidden;font-family:'Manrope',-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,'Helvetica Neue',Arial,sans-serif;\n color:#1a1a2e;transform:translateX(0);transition:opacity .3s ease,transform .3s ease;\n}\n.pn-card.pn-enter-right{animation:pn-slideInRight .4s cubic-bezier(.16,1,.3,1) forwards}\n.pn-card.pn-enter-left{animation:pn-slideInLeft .4s cubic-bezier(.16,1,.3,1) forwards}\n.pn-card.pn-exit{animation:pn-fadeOut .25s ease forwards}\n.pn-card.pn-silent{animation:none;opacity:1}\n\n/* Card — Dark */\n.pn-card.pn-dark{\n background:rgba(22,22,38,0.72);border:1px solid rgba(255,255,255,0.1);\n box-shadow:0 8px 32px rgba(0,0,0,0.45),0 2px 8px rgba(0,0,0,0.2),inset 0 1px 0 rgba(255,255,255,0.05);\n color:#ececf6;\n}\n.pn-dark .pn-header{border-color:rgba(255,255,255,0.06)}\n.pn-dark .pn-body-text{color:#a8a8c0!important}\n.pn-dark .pn-domain{color:#7878a0!important}\n.pn-dark .pn-time{color:#686890!important}\n.pn-dark .pn-icon{background:#2a2a3e!important}\n.pn-dark .pn-content:hover{background:rgba(255,255,255,0.03)}\n.pn-dark .pn-btn{background:rgba(255,255,255,0.07)!important;color:#d0d0e6!important;border-color:rgba(255,255,255,0.09)!important}\n.pn-dark .pn-btn:hover{background:rgba(255,255,255,0.13)!important}\n.pn-dark .pn-close{color:#686890!important}\n.pn-dark .pn-close:hover{background:rgba(255,255,255,0.08)!important;color:#b0b0c8!important}\n.pn-dark .pn-progress{background:rgba(255,255,255,0.05)!important}\n.pn-dark .pn-progress-bar{background:rgba(140,140,200,0.3)!important}\n.pn-dark .pn-media img,.pn-dark .pn-media video,.pn-dark .pn-media iframe{border:1px solid rgba(255,255,255,0.06);box-sizing:border-box}\n\n/* Keyframes */\n@keyframes pn-slideInRight{from{opacity:0;transform:translateX(100%)}to{opacity:1;transform:translateX(0)}}\n@keyframes pn-slideInLeft{from{opacity:0;transform:translateX(-100%)}to{opacity:1;transform:translateX(0)}}\n@keyframes pn-fadeOut{to{opacity:0;transform:scale(.95) translateY(-8px)}}\n@keyframes pn-replaceIn{from{opacity:0;transform:scale(0.97)}to{opacity:1;transform:scale(1)}}\n.pn-card.pn-replace{animation:pn-replaceIn .25s cubic-bezier(.16,1,.3,1) forwards}\n\n/* Header */\n.pn-header{display:flex;align-items:center;justify-content:space-between;padding:14px 14px 0 14px}\n.pn-header-left{display:flex;align-items:center;gap:8px;min-width:0}\n.pn-domain{font-size:11.5px;font-weight:500;color:#6b7280;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:200px}\n.pn-time{font-size:11px;color:#9ca3af;white-space:nowrap;flex-shrink:0}\n\n/* Close */\n.pn-close{\n width:26px;height:26px;border:none;background:transparent;border-radius:8px;\n display:flex;align-items:center;justify-content:center;cursor:pointer;\n color:#9ca3af;transition:background .15s,color .15s;flex-shrink:0;padding:0;\n}\n.pn-close:hover{background:rgba(0,0,0,0.06);color:#374151}\n.pn-close svg{width:14px;height:14px}\n\n/* Content */\n.pn-content{display:flex;gap:12px;padding:12px 14px;cursor:pointer;border-radius:8px;transition:background .15s}\n.pn-content:hover{background:rgba(0,0,0,0.02)}\n.pn-icon{width:44px;height:44px;border-radius:10px;object-fit:cover;flex-shrink:0;background:#f0f0f5}\n.pn-text-wrap{min-width:0;flex:1}\n.pn-title{font-size:14px;font-weight:600;line-height:1.35;margin:0 0 3px 0;word-break:break-word}\n.pn-body-text{font-size:13px;line-height:1.45;color:#4b5563;margin:0;word-break:break-word;display:-webkit-box;-webkit-line-clamp:3;-webkit-box-orient:vertical;overflow:hidden}\n\n/* Media */\n.pn-media{padding:0 14px 4px 14px}\n.pn-media img,.pn-media video,.pn-media iframe{width:100%;border-radius:10px;max-height:200px;object-fit:cover;display:block}\n.pn-media audio{width:100%}\n\n/* Buttons */\n.pn-actions{display:flex;gap:8px;padding:6px 14px 14px 14px}\n.pn-btn{\n flex:1;padding:8px 12px;border:1px solid rgba(0,0,0,0.06);border-radius:10px;\n background:rgba(0,0,0,0.03);font-size:12.5px;font-weight:500;color:#374151;\n cursor:pointer;transition:background .15s;text-align:center;white-space:nowrap;\n overflow:hidden;text-overflow:ellipsis;display:flex;align-items:center;justify-content:center;gap:6px;\n}\n.pn-btn:hover{background:rgba(0,0,0,0.07)}\n.pn-btn img{width:16px;height:16px;border-radius:3px}\n\n/* Progress bar */\n.pn-progress{height:3px;background:rgba(0,0,0,0.04);border-radius:0 0 16px 16px;overflow:hidden}\n.pn-progress-bar{height:100%;background:rgba(0,0,0,0.12);border-radius:0 0 16px 16px;transition:width linear}\n\n/* Branding */\n.pn-branding{padding:4px 14px 10px;text-align:right;font-size:10.5px;color:#9ca3af;pointer-events:auto;line-height:1.3}\n.pn-branding a{color:#4da6ff;text-decoration:none;font-weight:500}\n.pn-branding a:hover{text-decoration:underline}\n.pn-dark .pn-branding{color:#686890}\n.pn-dark .pn-branding a{color:#6da8e0}\n\n/* Custom template content */\n.pn-custom{padding:12px 14px;pointer-events:auto}\n\n/* Mobile */\n@media(max-width:440px){\n .pn-card{width:calc(100vw - 24px);border-radius:14px}\n .pn-container.pn-top-right,.pn-container.pn-top-left{top:12px;right:12px;left:12px}\n .pn-container.pn-bottom-right,.pn-container.pn-bottom-left{bottom:12px;right:12px;left:12px}\n}",document.head.appendChild(e)}();const{title:t="",body:n="",icon:o="",badge:i="",image:a="",media:r=null,buttons:s=[],domain:p=window.location.hostname,tag:l="",url:d="",silent:c=!1,requireInteraction:g=!1,duration:m=6e3,position:u="top-right",dir:f="ltr",timestamp:h=Date.now(),data:x={},notification_id:v="",notification_type:y="0",theme:k="auto",branding:E=null,maxVisible:C=3,customContent:L=null,onClick:_=null,onClose:N=null,onAction:M=null}=e;let D=!1;if(l&&z.has(l)){D=!0;const e=z.get(l);if(e.element){const t=e.element;t.style.transition="opacity 0.15s ease, transform 0.15s ease",t.style.opacity="0",t.style.transform+=" scale(0.98)";for(const[e,n]of I){const e=n.indexOf(t);if(-1!==e){n.splice(e,1);break}}setTimeout((()=>{t.remove();const e=t.parentElement;e&&0===e.children.length&&e.remove()}),160)}z.delete(l)}I.has(u)||I.set(u,[]),P.has(u)||P.set(u,[]);const B=I.get(u);if(B.length>=C)return P.get(u).push(e),{close:()=>{},element:null};if(o){const e=b(o);if(e&&!A.has(e)){A.add(e);const t=document.createElement("link");t.rel="prefetch",t.as="image",t.href=e,document.head.appendChild(t)}}const O="dark"===k||"auto"===k&&window.matchMedia("(prefers-color-scheme: dark)").matches,U=u.includes("right"),$=function(e){const t="pn-"+e;let n=document.querySelector("."+S+"."+t);return n||(n=document.createElement("div"),n.className=S+" pn-container "+t,document.body.appendChild(n),n)}(u),V=document.createElement("div"),X=c?" pn-silent":D?" pn-replace":U?" pn-enter-right":" pn-enter-left";V.className="pn-card"+X+(O?" pn-dark":""),V.setAttribute("role","alert"),V.setAttribute("aria-live","polite"),"rtl"===f&&(V.style.direction="rtl"),v&&(V.setAttribute("data-notification-id",v),V.setAttribute("data-notification-type",y));const R=document.createElement("div");R.className="pn-header";const F=document.createElement("div");if(F.className="pn-header-left",i){const e=document.createElement("img");e.src=b(i),e.alt="",e.style.cssText="width:14px;height:14px;border-radius:3px;flex-shrink:0",F.appendChild(e)}const W=document.createElement("span");W.className="pn-domain",W.textContent=p,F.appendChild(W);const q=document.createElement("span");q.className="pn-time",q.textContent=function(e){if(!e)return"";const t=Date.now()-e;return t<5e3?"now":t<6e4?Math.floor(t/1e3)+"s ago":t<36e5?Math.floor(t/6e4)+"m ago":t<864e5?Math.floor(t/36e5)+"h ago":Math.floor(t/864e5)+"d ago"}(h),F.appendChild(q);const Y=document.createElement("button");Y.className="pn-close",Y.setAttribute("aria-label","Close notification"),Y.innerHTML='<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2.5" stroke-linecap="round"><line x1="6" y1="6" x2="18" y2="18"/><line x1="18" y1="6" x2="6" y2="18"/></svg>',R.append(F,Y),V.appendChild(R);let J=null,G=null;if(L){const e=document.createElement("div");e.className="pn-custom",e.appendChild(L),V.appendChild(e)}else{if(J=document.createElement("div"),J.className="pn-content",o){const e=document.createElement("img");e.className="pn-icon",e.src=b(o),e.alt="",e.decoding="async",J.appendChild(e)}const e=document.createElement("div");if(e.className="pn-text-wrap",t){const n=document.createElement("p");n.className="pn-title",n.textContent=t,e.appendChild(n)}if(n){const t=document.createElement("p");t.className="pn-body-text",t.textContent=n,e.appendChild(t)}J.appendChild(e),V.appendChild(J);const i=r?.type||(a?"image":null),p=b(r?.src||a);if(i&&p){const e=document.createElement("div");if(e.className="pn-media","image"===i){const n=document.createElement("img");n.src=p,n.alt=function(e){if(!e)return"";const t=document.createElement("div");return t.textContent=e,t.innerHTML}(t),n.loading="lazy",n.decoding="async",e.appendChild(n)}else if("video"===i){const t=T(p,!0,O,(e=>{if(!Z||oe||e<=0)return;const t=e+1500;K=t,clearTimeout(ee),ne=t,Q&&(Q.style.transition="none",Q.style.width="100%",requestAnimationFrame((()=>{Q.style.transition="width "+t+"ms linear",Q.style.width="0%"}))),te=Date.now(),ee=setTimeout((()=>{ie="dropped",ae="auto-dismiss",re()}),t)}));e.appendChild(t.element),G=t.getDuration}else if("audio"===i)e.appendChild(w(p,!1,!1,!1,O));else if("iframe"===i){const t=document.createElement("iframe");t.src=p,t.style.cssText="height:180px;border:none",t.setAttribute("sandbox","allow-scripts allow-same-origin"),t.loading="lazy",e.appendChild(t)}V.appendChild(e)}const l=Array.isArray(s)?s.slice(0,3):[];if(l.length>0){const e=document.createElement("div");e.className="pn-actions";for(const t of l){const n=document.createElement("button");if(n.className="pn-btn",t.icon){const e=document.createElement("img");e.src=b(t.icon),e.alt="",n.appendChild(e)}const o=document.createElement("span");o.textContent=t.text||t.action||"",n.appendChild(o),n.addEventListener("click",(e=>{if(e.stopPropagation(),ie="clicked",ae="action:"+(t.action||t.text||""),"event"===t.action){const e=t.event||t.eventName||t.src;if(e){const n=t.payload||t.data||{};window.dispatchEvent(new CustomEvent(e,{detail:n}))}}"function"==typeof M&&M(t.action,{...x,...t.payload||{}}),re()})),e.appendChild(n)}V.appendChild(e)}}if(E&&!1!==E.show){const e=document.createElement("div");e.className="pn-branding",e.innerHTML=E.html||'Notifications by <a href="https://pinglet.enjoys.in" target="_blank" rel="noopener noreferrer">Pinglet</a>',V.appendChild(e)}let K=m;G&&(K=3e4);const Z=!g&&K>0;let Q=null,ee=null,te=0,ne=K;if(Z){const e=document.createElement("div");e.className="pn-progress",Q=document.createElement("div"),Q.className="pn-progress-bar",Q.style.width="100%",e.appendChild(Q),V.appendChild(e)}let oe=!1,ie="closed",ae="user-dismiss";function re(){if(oe)return;oe=!0,ee&&clearTimeout(ee),l&&z.delete(l);const e=I.get(u);if(e){const t=e.indexOf(V);-1!==t&&e.splice(t,1)}!function(e,t,n){if("function"!=typeof window.sendNotificationEvent)return;const o=t.getAttribute("data-notification-id");if(!o)return;const i=t.getAttribute("data-notification-type")||"0",[a,r]=o.split("-");window.sendNotificationEvent(e,{project_id:a,notification_id:o,timestamp:r,reason:n||"user-dismiss",type:i})}(ie,V,ae),V.classList.add("pn-exit"),V.addEventListener("animationend",(()=>{V.remove(),0===$.children.length&&$.remove();const e=P.get(u);if(e&&e.length>0){H(e.shift())}}),{once:!0}),"function"==typeof N&&N(x)}function se(){Z&&(te=Date.now(),Q.style.transition="width "+ne+"ms linear",Q.style.width="0%",ee=setTimeout((()=>{ie="dropped",ae="auto-dismiss",re()}),ne))}return V.addEventListener("mouseenter",(function(){if(!Z||oe)return;clearTimeout(ee);const e=Date.now()-te;ne=Math.max(ne-e,200);const t=ne/K*100;Q.style.transition="none",Q.style.width=t+"%"})),V.addEventListener("mouseleave",se),Y.addEventListener("click",(e=>{e.stopPropagation(),ie="closed",ae="user-dismiss",re()})),J&&J.addEventListener("click",(()=>{ie="clicked",ae="user-click","function"==typeof _&&_(x);const e=b(d);e&&window.open(e,"_blank","noopener,noreferrer"),re()})),$.appendChild(V),B.push(V),l&&z.set(l,{close:re}),requestAnimationFrame((()=>se())),{close:function(e,t){ie=e||"closed",ae=t||"programmatic",re()},element:V}}let D="",B="";const O=Date.now();function U(e,t){D||(D=e,B=t,window.addEventListener("scroll",(()=>{const e=Math.floor((window.scrollY+window.innerHeight)/document.documentElement.scrollHeight*100);e>F&&(F=e)})),window.addEventListener("beforeunload",(()=>{R("page_exit",{scrollDepth:F,sessionTime:Date.now()-O})})),window.addEventListener("load",(()=>{R("page_view",{performance:X()})})),document.addEventListener("click",(e=>{const t=e.target;"A"!==t.tagName&&"BUTTON"!==t.tagName||R("click",{element:{tag:t.tagName,text:(t.textContent||"").slice(0,100),href:t.href||"",id:t.id||"",className:(t.className||"").toString().slice(0,100)}})})))}function $(){let e=localStorage.getItem("pinglet_anon_id");return e||(e=crypto.randomUUID(),localStorage.setItem("pinglet_anon_id",e)),e}function V(){const e=new URLSearchParams(window.location.search);return{utm_source:e.get("utm_source"),utm_medium:e.get("utm_medium"),utm_campaign:e.get("utm_campaign")}}function X(){const e=performance.timing;return{loadTime:e.loadEventEnd-e.navigationStart,domContentLoaded:e.domContentLoadedEventEnd-e.navigationStart,timeToFirstByte:e.responseStart-e.requestStart}}function R(e,t={}){B&&function(){const e=navigator.userAgent+navigator.language+screen.width+screen.height+(navigator.platform||"");return crypto.subtle.digest("SHA-256",(new TextEncoder).encode(e)).then((e=>[...new Uint8Array(e)].map((e=>e.toString(16).padStart(2,"0"))).join("")))}().then((n=>{!function(e){if(!D)return;const t=`${D}/log/track`,n=JSON.stringify(e);navigator.sendBeacon?navigator.sendBeacon(t,new Blob([n],{type:"application/json"})):fetch(t,{method:"POST",headers:{"Content-Type":"application/json"},body:n,credentials:"omit"}).catch((()=>{}))}({event:"activity",eventType:e,project_id:B,anonId:$(),fingerprint:n,timestamp:(new Date).toISOString(),page:{url:location.href,referrer:document.referrer,title:document.title},browser:{userAgent:navigator.userAgent,language:navigator.language,platform:navigator.platform||"",screen:{width:screen.width,height:screen.height,colorDepth:screen.colorDepth},timezone:Intl.DateTimeFormat().resolvedOptions().timeZone},utm:V(),...t})}))}let F=0;let W="",q="";const Y=[];let J=!1;const G=self.location.href.substring(0,self.location.href.lastIndexOf("/"));async function K(e,t){const n=await self.clients.matchAll({type:"window",includeUncontrolled:!0});for(const o of n)o.postMessage({type:"CUSTOM_NOTIFICATION_EVENT",eventName:e,payload:t})}async function Z(e,t){if(t&&"project_id"in t)try{await fetch(`${G}/log/event`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({...t,event:e})})}catch(e){}}self.addEventListener("install",(()=>self.skipWaiting())),self.addEventListener("activate",(()=>self.clients.claim())),self.addEventListener("push",(async e=>{if(!e.data)return;const t=e.data?.json?.()||{},n={body:t?.body,icon:t?.icon,badge:t?.badge,tag:t?.tag,requireInteraction:t?.requireInteraction??!0,silent:t?.silent??!1,data:t?.data,actions:t?.actions,image:t?.image,timestamp:Date.now(),vibrate:[200,100,200]};t.data?.duration&&setTimeout((async()=>{try{const e=await self.registration.getNotifications({tag:t.tag}),n=await self.clients.matchAll({type:"window",includeUncontrolled:!0});for(const o of e){const e={...t?.data,notificationTag:o.tag,timestamp:Date.now()};n.length>0?K("dropped",e):Z("dropped",e),o.close()}}catch(e){}}),t.data?.duration||5e3);const o=await self.clients.matchAll({type:"window",includeUncontrolled:!0});J=o.length>0,e.waitUntil(self.registration.showNotification(t.title,n))})),self.addEventListener("notificationclick",(e=>{e.notification.close();const t=e.notification.data||{},n=e.action;if(n&&t.actionEvents?.[n]){const o=t.actionEvents[n];e.waitUntil(async function(e,t,n){const{eventName:o,eventData:i,url:a,windowAction:r}=e;try{const e={...i,notificationTag:n.notification.tag,timestamp:Date.now()};if(J?await K(o,e):await Z("clicked",{...t,notificationTag:n.notification.tag,timestamp:Date.now()}),"open"===r&&a)await self.clients.openWindow(a);else if("focus"===r){const e=await self.clients.matchAll({type:"window"});e.length>0?await e[0].focus():a&&await self.clients.openWindow(a)}}catch(e){console.error("[Pinglet SW] Action handler error:",e)}}(o,t,e))}else if("dismiss"===n){const n={...t,notificationTag:e.notification.tag,timestamp:Date.now()};J?e.waitUntil(K("closed",n)):e.waitUntil(Z("closed",n))}else{const n={...t,notificationTag:e.notification.tag,timestamp:Date.now()};J?e.waitUntil(K("clicked",n)):e.waitUntil(Z("clicked",n)),t.url&&e.waitUntil(self.clients.openWindow(t.url))}})),self.addEventListener("notificationclose",(e=>{const t={...e.notification.data||{},notificationTag:e.notification.tag,timestamp:Date.now()};J?e.waitUntil(K("closed",t)):e.waitUntil(Z("closed",t))}));const{endpoint:Q,configuredDomain:ee,projectId:te,pingletId:ne,checksum:oe,testimonials:ie,templatesIds:ae}=function(){const e=Array.from(document.scripts).find((e=>e.src.includes("pinglet-sse")&&e.dataset.endpoint))||document.currentScript;return{endpoint:e?.dataset.endpoint||"",configuredDomain:e?.dataset.configuredDomain||"",projectId:e?.dataset.projectId||"",pingletId:e?.dataset.pingletId||"",checksum:e?.dataset.checksum||"",testimonials:"true"===e?.dataset.testimonials,templatesIds:e?.dataset.templates||""}}();(async o=>{if(o.projectId=te,o.PingletWidget)return void console.warn("[Pinglet] Already initialized.");!function(e="Manrope"){if(document.getElementById("pinglet-font-link"))return;const t=document.createElement("link");t.id="pinglet-font-link",t.rel="stylesheet",t.href=`https://fonts.googleapis.com/css2?family=${e}:wght@200..800&display=swap`,document.head.appendChild(t);const n=document.createElement("style");n.id="pinglet-font-style",n.textContent=`\n[class^="pinglet-"],\n[class*=" pinglet-"] {\n font-family: '${e}', sans-serif !important;\n font-weight: 400 !important;\n}`,document.head.appendChild(n)}(),d(Q,te,ne),ie&&function(){if(document.getElementById("pinglet-testimonials"))return null;const e=document.createElement("div");e.id="pinglet-testimonials",e.className="pinglet-floating-btn",Object.assign(e.style,{position:"fixed",bottom:"30px",right:"30px",display:"flex",alignItems:"center",background:"#667EEA",borderRadius:"50px",padding:"0",cursor:"pointer",boxShadow:"0 4px 14px 0 rgba(102, 126, 234, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.05)",transition:"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",overflow:"hidden",width:"40px",height:"40px",zIndex:"1000",backdropFilter:"blur(10px)",border:"1px solid rgba(255, 255, 255, 0.1)"});const t=document.createElement("div");t.textContent="❔",Object.assign(t.style,{fontSize:"20px",display:"flex",alignItems:"center",justifyContent:"center",transition:"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",width:"40px",height:"40px",flexShrink:"0",color:"white"});const n=document.createElement("span");n.textContent="View",Object.assign(n.style,{color:"white",fontWeight:"500",fontSize:"14px",marginLeft:"8px",marginRight:"16px",opacity:"0",transform:"translateX(-8px)",transition:"all 0.3s cubic-bezier(0.4, 0, 0.2, 1)",whiteSpace:"nowrap",letterSpacing:"0.025em"}),e.append(t,n),document.body.appendChild(e),e.addEventListener("mouseenter",(()=>{e.style.width="100px",e.style.borderRadius="28px",e.style.boxShadow="0 8px 25px 0 rgba(102, 126, 234, 0.35), 0 0 0 1px rgba(255, 255, 255, 0.1)",e.style.transform="translateY(-2px)",n.style.opacity="1",n.style.transform="translateX(0)",t.style.transform="scale(1.05)"})),e.addEventListener("mouseleave",(()=>{e.style.width="40px",e.style.height="40px",e.style.borderRadius="50px",e.style.boxShadow="0 4px 14px 0 rgba(102, 126, 234, 0.25), 0 0 0 1px rgba(255, 255, 255, 0.05)",e.style.transform="translateY(0)",n.style.opacity="0",n.style.transform="translateX(-8px)",t.style.transform="scale(1)"})),e.addEventListener("mousedown",(()=>{e.style.transform="translateY(0) scale(0.98)"})),e.addEventListener("mouseup",(()=>{e.style.transform="translateY(-2px)"})),n.addEventListener("click",(()=>{a("Testimonials Error","There was an error loading testimonials. Please try again later.",[],"❌")}));const o=()=>{window.innerWidth<=768?(Object.assign(e.style,{bottom:"16px",right:"16px",width:"48px",height:"48px"}),Object.assign(t.style,{width:"48px",height:"48px",fontSize:"18px"})):(Object.assign(e.style,{bottom:"30px",right:"30px",width:"40px",height:"40px"}),Object.assign(t.style,{width:"40px",height:"40px",fontSize:"20px"}))};o(),window.addEventListener("resize",o)}();const i={version:n,checksum:(oe||"").replace("sha384-",""),async init({endpoint:o,configuredDomain:i,projectId:r,pingletId:s}){if(console.log("%cPingletWidget initialized successfully.","color: #1e90ff; font-weight: bold;",this.version),!s)return a("Configuration Error","Missing Pinglet ID.",[{text:"Retry",action:"reload"},{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],"❌"),console.error("[Pinglet] Missing pingletId.");if(!o)return a("Configuration Error","Missing Endpoint.",[{text:"Retry",action:"reload"},{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],"❌"),console.error("[Pinglet] Missing endpoint.");if(this.version!==n)return void a("Pinglet Unsupported Version",`PingletWidget version ${this.version} is not supported. Please update to the latest version.`,[{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],"⚠️");if(!this.checksum||!oe)return a("Configuration Error","Missing checksum.");const p=await fetch(`${o}/load/projects?projectId=${r}&domain=${i}`,{headers:{"X-Project-ID":r,"X-Timestamp":Date.now(),"X-Pinglet-Signature":s,"X-Pinglet-Checksum":this.checksum,"X-Pinglet-Version":this.version,"X-Configured-Domain":i,"X-Pinglet-Id":s},credentials:"omit"}),l=await p.json();if(!l||!l.success)return a("Configuration Error",`Failed to load configuration. ${l.message||"Unknown error"}`,[{text:"Retry",action:"reload"},{text:"See Docs",action:"redirect",src:"https://pinglet.enjoys.in/docs"}],"❌"),console.error("[Pinglet] Failed to load configuration.");var d;d=l.result.config.branding,f||(f=document.createElement("div"),f.className="pinglet-branding",f.innerHTML=d?.html||'Notifications by <a href="https://pinglet.enjoys.in" class="pinglet-link" target="_blank" rel="noopener noreferrer" style="color:#4da6ff;text-decoration:none;">Pinglet</a>',Object.assign(f.style,{fontSize:"11px",color:"#808080",textAlign:"right",width:"100%",pointerEvents:"auto"}));let c={};ae||(c=await async function(e,t,n,o,i,a){try{const r=await fetch(`${e}/load/templates?projectId=${t}&templatesIds=${a}`,{headers:{"X-Project-ID":t,"X-Timestamp":Date.now(),"X-Pinglet-Signature":n,"X-Pinglet-Checksum":o,"X-Pinglet-Version":i},credentials:"omit"}),s=await r.json();return s&&s.success?s.result:null}catch(e){return console.error("[Pinglet] Failed to load templates:",e),null}}(o,r,s,this.checksum,this.version,ae),c||(c={}));const g=Object.assign({},e,l.result.config);g.sound?.src||(g.sound=Object.assign({},g.sound,{src:`${o}/pinglet-sound.mp3?v=1&ext=mp3`}));const m={is_tff:l.result?.is_premium??!1,templates:Object.assign({},{default:{compiled_text:a.toString(),config:e,is_active:!0,is_default:!0}},c),style:Object.assign({},t,l.result.template?.config),config:g};!function(e){if(u)return u;const t=e.config.sound;if(t?.play&&t.src){const e=new Audio;e.volume=t.volume??.5,e.preload="auto",e.addEventListener("canplaythrough",(()=>{u=e}),{once:!0}),e.addEventListener("error",(()=>{u=null}),{once:!0}),e.src=t.src}}(m),U(o,r),function(e,t){if(W)return;if(W=e,q=t,"undefined"==typeof rrweb||!rrweb.record)return void console.warn("[Pinglet] rrweb not loaded. Session recording disabled. Load from:","https://unpkg.com/rrweb@2.0.0-alpha.17/dist/rrweb.min.js");rrweb.record({maskAllInputs:!0,maskInputOptions:{password:!0,email:!0,textarea:!0},emit(e){Y.push(e)}});const n=localStorage.getItem("pinglet_anon_id")||crypto.randomUUID();window.addEventListener("beforeunload",(()=>{if(0===Y.length)return;const e=`${W}/log/track`,t=JSON.stringify({event:"session_recording",project_id:q,visitor_id:n,events:Y,page_url:location.href,duration_ms:Y.length>1?Y[Y.length-1].timestamp-Y[0].timestamp:0,event_count:Y.length,timestamp:(new Date).toISOString()});navigator.sendBeacon(e,t)}))}(o,r);const b=new EventSource(`${o}/sse?projectId=${r}&pingletId=${s}`,{withCredentials:!1});b.onmessage=e=>{const t=JSON.parse(e.data),n=t.data,o=t?.overrides||n?.overrides||{};if("-1"!==t?.type)if("1"===t?.type&&t?.template_id&&t?.custom_template){const e=m.templates[t.template_id];if(!e||!e.is_active)return void a("Template Error",`Template "${t.template_id}" not found or inactive.`);try{const n=new Function("data","config","globalConfig",e.compiled_text)(t.data||{},e.config||{},m);let i;if(n instanceof HTMLElement)i=n;else{if(!Array.isArray(n))return void console.error("[Pinglet] Template did not return an HTMLElement.");i=document.createElement("div");for(const e of n)e instanceof Node&&i.appendChild(e)}const a=Object.assign({},m.config,o);o.theme&&m.config.theme&&(a.theme=Object.assign({},m.config.theme,o.theme)),a.sound?.play&&h(),H({customContent:i,position:a.position||"top-right",duration:!1===a.auto_dismiss?0:a.duration||6e3,requireInteraction:!1===a.auto_dismiss,domain:a.website||window.location.hostname,theme:a.theme?.mode||"auto",branding:a.branding||{show:!0,html:'Notifications by <a href="https://pinglet.enjoys.in" target="_blank" rel="noopener noreferrer">Pinglet</a>'},maxVisible:a.maxVisible||3,notification_id:`${r}-${Date.now()}`,notification_type:"1"})}catch(e){console.error("[Pinglet] Template render error:",e)}}else if(t?.body){const e=t.body||{},n=Object.assign({},m.config,o);o.theme&&m.config.theme&&(n.theme=Object.assign({},m.config.theme,o.theme));const i=n.theme?.mode||"auto";n.sound?.play&&h();const a=(n.branding?.show?n.branding?.html||"Notifications by Pinglet":"").replace(/<[^>]*>/g,"").trim();H({title:e.title||"",body:e.description||"",icon:e.icon||"",image:"image"===e.media?.type?e.media.src:"",media:e.media?.type&&"image"!==e.media?.type?{type:e.media.type,src:e.media.src}:null,url:e.url||"",buttons:e.buttons||[],tag:t.tag||"",position:n.position||"top-right",duration:!1===n.auto_dismiss?0:n.duration||6e3,requireInteraction:!1===n.auto_dismiss,domain:a||n.website||window.location.hostname,theme:i,branding:n.branding||{show:!0,html:'Notifications by <a href="https://pinglet.enjoys.in" target="_blank" rel="noopener noreferrer">Pinglet</a>'},maxVisible:n.maxVisible||3,notification_id:`${r}-${Date.now()}`,notification_type:t?.type||"0"})}},b.onerror=()=>{console.warn("[Pinglet] SSE connection error. Reconnecting...")}}};o.PingletWidget=i,Q&&te&&ne&&i.init({endpoint:Q,configuredDomain:ee,projectId:te,pingletId:ne})})(window)}();
|