customizable-toast-notification 3.9.1 → 3.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +4 -4
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +10 -1
- package/dist/index.esm.mjs +4 -4
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +5 -5
- package/dist/index.umd.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Customizable Toast Notifications 3.9.
|
|
3
|
-
* Build: 2025-09-
|
|
4
|
-
* Cache-Buster:
|
|
2
|
+
* Customizable Toast Notifications 3.9.3
|
|
3
|
+
* Build: 2025-09-19 11:50:17
|
|
4
|
+
* Cache-Buster: 1758282617391
|
|
5
5
|
* Author: Priyanshu Patel
|
|
6
6
|
* Email: [priyanshu.alt191@gmail.com](mailto:priyanshu.alt191@gmail.com)
|
|
7
7
|
* License: Apache-2.0
|
|
@@ -12,5 +12,5 @@
|
|
|
12
12
|
* Supports flexible positioning, theming, icons, animations, and timing options
|
|
13
13
|
* out of the box — with CTA support and zero dependencies.
|
|
14
14
|
*/
|
|
15
|
-
"use strict";async function t(t){return`${t}-${Date.now()}-${Math.floor(1e5*Math.random())}`}async function e(t){if(!t)return"black";try{return await async function(t){if(!t)throw new Error("Color is required");let e,n,o;if(t.startsWith("#")){const i=t.substring(1);if(3===i.length)e=parseInt(i[0]+i[0],16),n=parseInt(i[1]+i[1],16),o=parseInt(i[2]+i[2],16);else{if(6!==i.length)throw new Error(`Invalid hex color format: ${t}`);e=parseInt(i.substring(0,2),16),n=parseInt(i.substring(2,4),16),o=parseInt(i.substring(4,6),16)}}else if(t.startsWith("rgb")||t.startsWith("rgba")){const i=t.match(/^rgba?\((\d{1,3}),\s*(\d{1,3}),\s*(\d{1,3})(?:,\s*(\d+(?:\.\d+)?))?\)$/);if(!i)throw new Error(`Invalid rgb/rgba color format: ${t}`);e=parseInt(i[1]),n=parseInt(i[2]),o=parseInt(i[3])}else{const i={black:[0,0,0],white:[255,255,255]}[t.toLowerCase()];if(!i)throw new Error(`Unsupported color format: ${t}`);e=i[0],n=i[1],o=i[2]}if(isNaN(e)||isNaN(n)||isNaN(o))throw new Error(`Invalid color value: ${t}`);const i=(.2126*e+.7152*n+.0722*o)/255,r=.05;return(Math.max(i,r)+.05)/Math.min(i,r)}(t)>3.5?"black":"white"}catch(t){return"black"}}async function n(t,e,n){const o=await async function(t){try{if("number"==typeof t&&t>0)return t;if("string"==typeof t){if(t.endsWith("s")&&!t.endsWith("ms")){const e=1e3*parseFloat(t);return e>0?e:500}const e=parseFloat(t);return e>0?e:500}}catch(t){}return 500}(e.animationDuration);Object.assign(t.style,{background:e.backgroundColor,padding:"12px 20px",marginBottom:"10px",borderRadius:e.borderRadius,overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"space-between",boxShadow:"0 4px 6px rgba(0, 0, 0, 0.1)",minWidth:"250px",maxWidth:e.maxWidth,opacity:"0",position:"relative",transition:`opacity ${e.animationDuration} ${e.animationEasing}, transform ${e.animationDuration} ${e.animationEasing}`,transform:"translateY(20px)",zIndex:"9999"}),t._animationDuration=o;const i=document.createElement("span");i.style.position=e.fontPosition,i.style.display="inline-block",i.style.flex="1",i.style.padding=e.fontPadding,i.style.borderRadius=e.fontBorderRadius,i.style.background=e.fontBackgroundColor,i.style.fontFamily=e.fontFamily,i.style.fontSize=e.fontSize,i.style.fontWeight=e.fontWeight,i.style.lineHeight=e.fontLineHeight,i.style.color=e.textColor,i.style.userSelect="text",i.style.wordBreak="break-word",i.style.direction=e.fontDirection,i.style.webkitLineClamp="3",i.style.webkitBoxOrient="vertical",i.style.whiteSpace=e.wrapText?"normal":"nowrap",i.style.display="block",i.style.overflow="hidden",i.style.textOverflow="ellipsis",i.style.lineClamp="3",i.style.boxOrient="vertical",i.style.display="-webkit-box",i.textContent=e.message,i.setAttribute("aria-label","Toast Notification Center"),i.setAttribute("title",e.message),t.appendChild(i),await async function(t,e,n){const o=null==e?void 0:e.cta;if(!o||!o.label)return;const i=!!o.href&&"link"===o.variant,r=document.createElement(i?"a":"button");i?(r.href=o.href,o.target&&(r.target=o.target),r.rel=o.rel||("_blank"===o.target?"noopener noreferrer":"")):r.type="button";r.setAttribute("aria-label",o.ariaLabel||o.label),Object.assign(r.style,{marginLeft:"10px",padding:"6px 10px",borderRadius:"6px",fontSize:"12px",fontWeight:"600",lineHeight:"1",border:"1px solid rgba(255,255,255,0.35)",color:e.textColor||"#fff",background:"rgba(255,255,255,0.15)",cursor:"pointer",whiteSpace:"nowrap",flexShrink:"0"}),r.textContent=o.label,r.addEventListener("click",async e=>{try{if("function"==typeof o.onClick){const t=o.onClick(e);null!=t&&t.then&&await t}}finally{!1!==o.autoClose&&n(t)}}),t.appendChild(r)}(t,e,n),e.showCloseButton&&await async function(t,e,n){const o=document.createElement("button");o.setAttribute("aria-label","Close notification"),o.setAttribute("title","Close"),o.textContent="×",Object.assign(o.style,{background:"none",border:"none",color:e.textColor,fontSize:"18px",marginLeft:"10px",cursor:"pointer"}),o.onclick=()=>n(t),t.appendChild(o),t._cleanupCloseButton=()=>{o.onclick=null}}(t,e,n),e.showProgressBar&&await async function(t,e){const n=document.createElement("div");Object.assign(n.style,{position:"absolute",left:"0",height:e.progressHeight||"4px",background:e.progressColor||"rgba(255, 255, 255, 0.3)",width:"100%",transition:`width ${e.duration||1800}ms linear`,["top"===e.progressPosition?"top":"bottom"]:"0"}),t.appendChild(n),setTimeout(()=>{!function(t){try{return(null==t?void 0:t.offsetWidth)||0}catch(t){return 0}}(n),n.style.width="0%"},100)}(t,e),await async function(t){setTimeout(()=>{requestAnimationFrame(()=>{t.style.opacity="1",t.style.transform="translateY(0)"})},50)}(t)}async function o(t,e){try{const n=document.createElement("div");return n.id=`emergency-${Date.now()}`,n.innerHTML=`\n <div style="\n background: #333 !important;\n color: white !important;\n padding: 10px 15px !important;\n position: fixed !important;\n top: 20px !important;\n right: 20px !important;\n z-index: 99999 !important;\n border-radius: 3px !important;\n max-width: 250px !important;\n word-wrap: break-word !important;\n font-family: Arial, sans-serif !important;\n font-size: 14px !important;\n box-shadow: 0 2px 10px rgba(0,0,0,0.3) !important;\n cursor: pointer !important;\n " onclick="this.parentNode.removeChild(this)">\n ${t.message||"Emergency Toast Creation Showing!"}\n <span style="float: right; margin-left: 10px; font-weight: bold;">×</span>\n </div>\n `,n._animationDuration=500,n._isEmergencyToast=!0,setTimeout(()=>{try{n.parentNode&&n.parentNode.removeChild(n),e(n)}catch(t){}},t.duration||1800),n}catch(n){return setTimeout(()=>{try{alert(t.message||"Toast Creation Failed!"),e(null)}catch(t){e(null)}},100),null}}async function i(e,i){let r;if(!document.querySelector('[id^="toast-container-"]'))return null;try{return r=await async function(e,n){try{const o=document.createElement(e);return o.id=await t(n),o}catch(e){try{const e="div",n="fallback",o=document.createElement(e);return o.id=await t(n),o.setAttribute("data-original-tag",e),o}catch(t){}}}("div","toast"),await n(r,e,i),r}catch(t){return await o(e,i),r}}const r=new Map,a=new Map;function s(t="bottom-right"){return`toast-container-${function(t="bottom-right"){return String(t).toLowerCase().trim().replace(/\bbelow\b/g,"bottom").replace(/\s+/g,"-").replace(/[^a-z0-9\-]/g,"-").replace(/\-+/g,"-")}(t)}`}async function l(t={},e){const n=s(t.position);if(a.has(n))return a.get(n);const o=(async()=>{const o=r.get(n);if(o&&o.isConnected)return o;let i=document.getElementById(n);i&&!i.isConnected&&document.body.appendChild(i),i?(i.style.position=i.style.position||"fixed",i.style.zIndex=i.style.zIndex||"9999","function"==typeof e&&await e(i,t)):(i=document.createElement("div"),i.id=n,i.setAttribute("role","status"),i.setAttribute("aria-atomic","true"),i.style.position="fixed",i.style.zIndex="9999",i.style.inset="auto 10px 10px auto",i.style.display="flex",i.style.justifyContent="space-between",i.style.alignItems="center",i.style.flexDirection="column",i.style.overflow="hidden","function"==typeof e&&await e(i,t),document.body.appendChild(i));const a=document.querySelectorAll(`#${n}`);if(a.length>1)for(let t=1;t<a.length;t++)try{a[t].remove()}catch{}return r.set(n,i),i})();a.set(n,o);try{return await o}finally{a.delete(s(t.position))}}async function c(t,e){if(!t||!e.position)throw new Error("Invalid container or position!");!function(t){t.style.top="auto",t.style.bottom="auto",t.style.left="auto",t.style.right="auto",t.style.transform="none"}(t);const n=function(t){const e=t.toLowerCase().trim();return{hasTop:e.includes("top"),hasBottom:e.includes("bottom")||e.includes("below"),hasLeft:e.includes("left"),hasRight:e.includes("right"),hasCenter:e.includes("center"),hasFullWidth:e.includes("top-full-width")||e.includes("bottom-full-width")||e.includes("fullwidth")}}(e.position);(function(t,e,n){if(!n.hasFullWidth)return!1;if(e.maxWidth="100vw",n.hasTop)return t.style.top="10px",t.style.left="10px",t.style.right="10px",!0;if(n.hasBottom)return t.style.bottom="10px",t.style.left="10px",t.style.right="10px",!0;return!1})(t,e,n)||function(t,e){if(!e.hasCenter)return!1;if(e.hasTop&&!e.hasLeft&&!e.hasRight)return t.style.top="10px",t.style.left="50%",t.style.transform="translateX(-50%)",!0;if(e.hasBottom&&!e.hasLeft&&!e.hasRight)return t.style.bottom="10px",t.style.left="50%",t.style.transform="translateX(-50%)",!0;if(e.hasLeft&&!e.hasTop&&!e.hasBottom)return t.style.left="10px",t.style.top="50%",t.style.transform="translateY(-50%)",!0;if(e.hasRight&&!e.hasTop&&!e.hasBottom)return t.style.right="10px",t.style.top="50%",t.style.transform="translateY(-50%)",!0;if(!(e.hasLeft||e.hasRight||e.hasTop||e.hasBottom))return t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%)",!0;return!1}(t,n)||function(t,e){e.hasBottom?t.style.bottom="10px":e.hasTop&&(t.style.top="10px");e.hasRight?t.style.right="10px":e.hasLeft?t.style.left="10px":(t.style.bottom="10px",t.style.left="50%",t.style.transform="translateX(-50%)")}(t,n)}class u{constructor(t,e){this.callback=t,this.delay=e,this.remaining=e,this.startTime=null,this.timeoutId=null,this.isPaused=!1,this.isCompleted=!1}start(){return this.isCompleted||this.timeoutId||(this.startTime=Date.now(),this.timeoutId=setTimeout(()=>{this.isCompleted=!0,this.timeoutId=null,this.callback()},this.remaining)),this}pause(){return this.isPaused||!this.timeoutId||this.isCompleted||(clearTimeout(this.timeoutId),this.timeoutId=null,this.remaining-=Date.now()-this.startTime,this.remaining=Math.max(0,this.remaining),this.isPaused=!0),this}resume(){return!this.isPaused||this.isCompleted||(this.isPaused=!1,this.start()),this}clear(){return this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.isCompleted=!0,this}getRemainingTime(){return this.isCompleted?0:this.isPaused?this.remaining:this.timeoutId?Math.max(0,this.remaining-(Date.now()-this.startTime)):this.delay}}const d=new Map,p=new Map,m=[];let f=0;function h(t){let e=5381;for(let n=0;n<t.length;n++)e=(e<<5)+e+t.charCodeAt(n);return e>>>0}async function y(t={}){const e=function({type:t="info",message:e="",position:n="bottom-right"}){return[String(t).trim().toLowerCase(),h(String(e)).toString(16),String(n).trim().toLowerCase()].join("|")}(t);if(d.has(e)){const n=d.get(e);return n.count++,n.timer.clear(),n.timer=b(n.toast,t),w(n),void C(n)}if(p.has(e))return void p.get(e).count++;const n={options:t,count:1,rafId:0};p.set(e,n),n.rafId=requestAnimationFrame(async()=>{const t=p.get(e);if(t){if(p.delete(e),f>=3)return m.push({options:t.options,key:e,count:t.count}),void v();await g(t.options,e,t.count)}})}async function g(t,e,n){try{f++;const o=await l(t,c),r=await i(t,x);if(!r)throw new Error("Toast element creation failed");const a=document.createElement("div");Object.assign(a.style,{position:"relative",display:"inline-block",overflow:"visible",marginBottom:"10px",zIndex:"0",width:"100%"});const s=document.createElement("div");Object.assign(s.style,{position:"relative",overflow:"hidden",borderRadius:t.borderRadius||"8px",zIndex:"1"}),s.appendChild(r),a.appendChild(s),o.id.includes("toast-container-")&&o.appendChild(a);const u=!1!==t.pauseOnHover&&(!0===t.pauseOnHover||!!t.cta),p={outer:a,toast:r,count:Math.max(1,0|n),timeout:null,pauseOnHover:u};d.set(e,p),r._key=e,p.count>1&&C(p),p.timer=b(r,t),w(p)}catch(e){f=Math.max(0,f-1);(document.querySelector('[id^="toast-container-"]')||document.body).appendChild(o(t,x))}}function b(t,e){const n=(e.duration||1800)+10,o=new u(()=>x(t),n);return o.start(),o}function w(t){if(!t.pauseOnHover||!t.outer||!t.timer)return;const{outer:e,timer:n}=t,o=()=>{n.pause()},i=()=>{n.resume()},r=t=>{t.target.matches("button, a, [tabindex]")&&n.pause()},a=t=>{e.contains(t.relatedTarget)||n.resume()};e.addEventListener("mouseenter",o),e.addEventListener("mouseleave",i),e.addEventListener("focusin",r),e.addEventListener("focusout",a),e._pauseCleanup=()=>{e.removeEventListener("mouseenter",o),e.removeEventListener("mouseleave",i),e.removeEventListener("focusin",r),e.removeEventListener("focusout",a)}}async function x(t){var e,n,o,i;if(!t||!t._key)return;const r=d.get(t._key);var a;r&&(null===(e=r.timer)||void 0===e||e.clear(),null===(n=r.outer)||void 0===n||null===(o=n._pauseCleanup)||void 0===o||o.call(n),d.delete(t._key),f=Math.max(0,f-1),null===(i=r.outer.querySelector(".toast-count-badge"))||void 0===i||i.remove(),await(a=r.outer,new Promise(t=>{let e=!1;const n=()=>{e||(e=!0,async function(t){if(!t)return!0;try{var e;if(null!=t&&null!==(e=t.parentNode)&&void 0!==e&&e.id.includes("toast-container-"))return t.parentNode.removeChild(t),!0}catch(e){try{if(t.remove)return t.remove(),!0}catch(e){try{return t.style.display="none",t.style.opacity="0",t.style.pointerEvents="none",t.style.position="absolute",t.style.left="-9999px",!0}catch(t){return!1}}}}(a),t())},o=a.firstElementChild||a,i=t=>{t.target===o&&(o.removeEventListener("transitionend",i,!0),n())};o.addEventListener("transitionend",i,!0),setTimeout(()=>{o.removeEventListener("transitionend",i,!0),n()},700)})),v())}function v(){for(;f<3&&m.length;){const t=m.shift();if(d.has(t.key)){const e=d.get(t.key);e.count+=t.count,C(e);continue}g(t.options,t.key,t.count)}}function C({outer:t,count:e}){var n;if(e<2)return void(null===(n=t.querySelector(".toast-count-badge"))||void 0===n||n.remove());let o=t.querySelector(".toast-count-badge");o||(o=document.createElement("span"),o.className="toast-count-badge",o.setAttribute("aria-label",`${e} identical notifications`),Object.assign(o.style,{position:"absolute",top:"6px",right:"6px",backgroundColor:"#f44336",color:"#fff",borderRadius:"50%",minWidth:"20px",height:"20px",fontSize:"12px",fontWeight:"600",display:"flex",alignItems:"center",justifyContent:"center",border:"2px solid #fff",boxShadow:"0 2px 6px rgba(0,0,0,0.3)",zIndex:"2",pointerEvents:"none",transition:"transform 150ms ease"}),t.appendChild(o)),o.textContent=e>99?"99+":String(e),o.style.transform="scale(1.2)",setTimeout(()=>o.style.transform="scale(1)",150)}let k={success:"#28a745",error:"#dc3545",warning:"#ffc107",info:"#17a2b8"},E={success:"Operation completed successfully!",error:"Something went wrong!",warning:"Warning message!",info:"Information message!"};const I=[];let T=!1;async function S(t={}){try{const n=await async function(t){var n;const o=null==t||null===(n=t.position)||void 0===n||null===(n=n.toLowerCase())||void 0===n?void 0:n.trim(),i=null!=o&&o.includes("top-full-width")||null!=o&&o.includes("bottom-full-width")?"100vw":"400px",r={pauseOnHover:void 0,duration:1800,position:"bottom-right",type:"info",borderRadius:"50px",backgroundColor:void 0,textColor:void 0,showCloseButton:!0,animationDuration:"0.4s",animationType:"fade",animationEasing:"ease",showProgressBar:!0,progressColor:void 0,progressHeight:"4px",progressPosition:"bottom",fontPosition:"relative",fontPadding:void 0,fontBorderRadius:void 0,fontBackgroundColor:void 0,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',fontSize:"14px",fontWeight:"400",fontLineHeight:"1.4",fontDirection:"auto",wrapText:"normal",maxWidth:i,..."object"!=typeof t||Array.isArray(t)?{}:t};r.message=(null==t?void 0:t.message)??r.message;try{var a,s;if(!r.backgroundColor)r.backgroundColor=(null===(s=k)||void 0===s?void 0:s[r.type])??(window.matchMedia("(prefers-color-scheme: dark)").matches?"#f5f5f5":"#111111");r.message=r.message||(null===(a=E)||void 0===a?void 0:a[r.type])||"No Message Provided!",!r.textColor&&r.backgroundColor&&(r.textColor=await e(r.backgroundColor)),!r.progressColor&&r.backgroundColor&&(r.progressColor=await e(r.backgroundColor))}catch(t){}"string"!=typeof r.message&&(r.message="No Message Provided!");return r}(t);await async function(t){try{return await l(t,c)}catch(t){return document.body}}(n),await y(n)}catch(e){var n;const o="string"==typeof(null==t?void 0:t.message)&&null!==(null==t?void 0:t.message)?`${null==t||null===(n=t.message)||void 0===n?void 0:n.substring(0,200)} toast creation failed!`:"Toast creation failed!";alert(o)}}let L=!1;async function A(t={}){"undefined"!=typeof window&&"undefined"!=typeof document&&(await async function(){T||"undefined"!=typeof window&&"undefined"!=typeof document&&("complete"===document.readyState||"interactive"===document.readyState?(T=!0,I.forEach(t=>setTimeout(()=>S(t),2e3)),I.length=0):document.addEventListener("DOMContentLoaded",()=>{T=!0,I.forEach(t=>setTimeout(()=>S(t),2e3)),I.length=0},{once:!0}))}(),T?L?await S(t):(L=!0,setTimeout(await S(t),2e3)):I.push(t))}function B(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(k={...k,...t})}catch(t){}}function M(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(E={...E,...t})}catch(t){}}try{"undefined"!=typeof window&&(window.customizableToast={createToast:A,setDefaultColors:B,setDefaultMessages:M})}catch(t){}exports.createToast=A,exports.noop=function(){x(document.querySelector('[id^="toast-"]:not([id*="container"])'))},exports.setDefaultColors=B,exports.setDefaultMessages=M;
|
|
15
|
+
"use strict";async function t(t){return`${t}-${Date.now()}-${Math.floor(1e5*Math.random())}`}async function e(t,e){if(!t)return"snow";try{if("transparent"===t)return"snow";return await async function(t,e={}){const i=e.threshold||4.5,r=o(t,e.resolveVarElement);if(!r)return{color:"#000000",contrast:21,meetsAA:!0,blackContrast:21,whiteContrast:1,used:"black"};let l;if(void 0!==r.a&&r.a<1){let t=e.underlyingColor;if(t){const n="string"==typeof t?o(t,e.resolveVarElement):t;t=n?{r:n.r,g:n.g,b:n.b}:{r:255,g:255,b:255}}else t={r:255,g:255,b:255};l=function(t,e){if(void 0===t.a||t.a>=1)return{r:t.r,g:t.g,b:t.b};e||(e={r:255,g:255,b:255});const n=t.a;return{r:Math.round(t.r*n+e.r*(1-n)),g:Math.round(t.g*n+e.g*(1-n)),b:Math.round(t.b*n+e.b*(1-n))}}(r,t)}else l={r:r.r,g:r.g,b:r.b};const c=a(l),u=s(c,1),d=s(c,0);if(u>=i||d>=i)return u>=d?{color:"#ffffff",contrast:u,meetsAA:u>=i,blackContrast:d,whiteContrast:u,used:"white"}:{color:"#000000",contrast:d,meetsAA:d>=i,blackContrast:d,whiteContrast:u,used:"black"};let f;f=u>d?i*(c+.05)-.05:(c+.05)/i-.05;f=Math.min(1,Math.max(0,f));const p=function(t){const e=function(t){return t<=.0031308?Math.round(12.92*t*255):Math.round(255*(1.055*Math.pow(t,1/2.4)-.055))}(t=Math.min(1,Math.max(0,t)));return o=e,i=e,r=e,"#"+n(o)+n(i)+n(r);var o,i,r}(f),m=a({r:parseInt(p.slice(1,3),16),g:parseInt(p.slice(3,5),16),b:parseInt(p.slice(5,7),16)}),h=s(c,m);return{color:p,contrast:h,meetsAA:h>=i,blackContrast:d,whiteContrast:u,used:"generated"}}(t,{underlyingColor:t||"#ffffff",threshold:e||4.5})}catch(t){return"snow"}}function n(t){return("0"+t.toString(16)).slice(-2)}function o(t,e=(t=>null===(t=document)||void 0===t?void 0:t.documentElement)()){if("string"!=typeof t||!t.trim())return null;const n=t.trim();if(n.startsWith("var(")&&"undefined"!=typeof window&&e){const t=n.slice(4,-1).trim(),i=getComputedStyle(e).getPropertyValue(t).trim();return i?o(i,e):null}if("undefined"!=typeof document)try{const t=document.createElement("canvas").getContext("2d");t.fillStyle="#000",t.fillStyle=n;const e=t.fillStyle,o=e.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)(?:,\s*([0-9.]+))?\)$/i);if(o)return{r:+o[1],g:+o[2],b:+o[3],a:void 0!==o[4]?+o[4]:1};if(e.startsWith("#"))return i(e)}catch{}if(/^#[0-9a-fA-F]{3,8}$/.test(n))return i(n);return{black:{r:0,g:0,b:0,a:1},white:{r:255,g:255,b:255,a:1},transparent:{r:0,g:0,b:0,a:0}}[n.toLowerCase()]||null}function i(t){let e=t.replace(/^#/,"");return 3!==e.length&&4!==e.length||(e=e.split("").map(t=>t+t).join("")),6===e.length?{r:parseInt(e.slice(0,2),16),g:parseInt(e.slice(2,4),16),b:parseInt(e.slice(4,6),16),a:1}:8===e.length?{r:parseInt(e.slice(0,2),16),g:parseInt(e.slice(2,4),16),b:parseInt(e.slice(4,6),16),a:parseInt(e.slice(6,8),16)/255}:null}function r(t){return(t/=255)<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}function a(t){return.2126*r(t.r)+.7152*r(t.g)+.0722*r(t.b)}function s(t,e){return(Math.max(t,e)+.05)/(Math.min(t,e)+.05)}async function l(t,e,n){const o=await async function(t){try{if("number"==typeof t&&t>0)return t;if("string"==typeof t){if(t.endsWith("s")&&!t.endsWith("ms")){const e=1e3*parseFloat(t);return e>0?e:500}const e=parseFloat(t);return e>0?e:500}}catch(t){}return 500}(e.animationDuration);Object.assign(t.style,{background:e.backgroundColor,padding:"12px 20px",marginBottom:"10px",borderRadius:e.borderRadius,overflow:"hidden",display:"flex",alignItems:"center",justifyContent:"space-between",boxShadow:"0 4px 6px rgba(0, 0, 0, 0.1)",minWidth:"250px",maxWidth:e.maxWidth,opacity:"0",position:"relative",transition:`opacity ${e.animationDuration} ${e.animationEasing}, transform ${e.animationDuration} ${e.animationEasing}`,transform:"translateY(20px)",zIndex:"9999"}),t._animationDuration=o;const i=document.createElement("span");i.style.position=e.fontPosition,i.style.display="inline-block",i.style.flex="1",i.style.padding=e.fontPadding,i.style.borderRadius=e.fontBorderRadius,i.style.background=e.fontBackgroundColor,i.style.fontFamily=e.fontFamily,i.style.fontSize=e.fontSize,i.style.fontWeight=e.fontWeight,i.style.lineHeight=e.fontLineHeight,i.style.color=e.textColor,i.style.userSelect="text",i.style.wordBreak="break-word",i.style.direction=e.fontDirection,i.style.webkitLineClamp="3",i.style.webkitBoxOrient="vertical",i.style.whiteSpace=e.wrapText?"normal":"nowrap",i.style.display="block",i.style.overflow="hidden",i.style.textOverflow="ellipsis",i.style.lineClamp="3",i.style.boxOrient="vertical",i.style.display="-webkit-box",i.textContent=e.message,i.setAttribute("aria-label","Toast Notification Center"),i.setAttribute("title",e.message),t.appendChild(i),await async function(t,e,n){const o=null==e?void 0:e.cta;if(!o||!o.label)return;const i=!!o.href&&"link"===o.variant,r=document.createElement(i?"a":"button");i?(r.href=o.href,o.target&&(r.target=o.target),r.rel=o.rel||("_blank"===o.target?"noopener noreferrer":"")):r.type="button";r.setAttribute("aria-label",o.ariaLabel||o.label),Object.assign(r.style,{marginLeft:"10px",padding:"6px 10px",borderRadius:"6px",fontSize:"12px",fontWeight:"600",lineHeight:"1",border:"1px solid rgba(255,255,255,0.35)",color:e.textColor||"#fff",background:"rgba(255,255,255,0.15)",cursor:"pointer",whiteSpace:"nowrap",flexShrink:"0"}),r.textContent=o.label,r.addEventListener("click",async e=>{try{if("function"==typeof o.onClick){const t=o.onClick(e);null!=t&&t.then&&await t}}finally{!1!==o.autoClose&&n(t)}}),t.appendChild(r)}(t,e,n),e.showCloseButton&&await async function(t,e,n){const o=document.createElement("button");o.setAttribute("aria-label","Close notification"),o.setAttribute("title","Close"),o.textContent="×",Object.assign(o.style,{background:"none",border:"none",color:e.textColor,fontSize:"18px",marginLeft:"10px",cursor:"pointer"}),o.onclick=()=>n(t),t.appendChild(o),t._cleanupCloseButton=()=>{o.onclick=null}}(t,e,n),e.showProgressBar&&await async function(t,e){const n=document.createElement("div");Object.assign(n.style,{position:"absolute",left:"0",height:e.progressHeight||"4px",background:e.progressColor||"rgba(255, 255, 255, 0.3)",width:"100%",transition:`width ${e.duration||1800}ms linear`,["top"===e.progressPosition?"top":"bottom"]:"0"}),t.appendChild(n),setTimeout(()=>{!function(t){try{return(null==t?void 0:t.offsetWidth)||0}catch(t){return 0}}(n),n.style.width="0%"},100)}(t,e),await async function(t){setTimeout(()=>{requestAnimationFrame(()=>{t.style.opacity="1",t.style.transform="translateY(0)"})},50)}(t)}async function c(t,e){try{const n=document.createElement("div");return n.id=`emergency-${Date.now()}`,n.innerHTML=`\n <div style="\n background: #333 !important;\n color: white !important;\n padding: 10px 15px !important;\n position: fixed !important;\n top: 20px !important;\n right: 20px !important;\n z-index: 99999 !important;\n border-radius: 3px !important;\n max-width: 250px !important;\n word-wrap: break-word !important;\n font-family: Arial, sans-serif !important;\n font-size: 14px !important;\n box-shadow: 0 2px 10px rgba(0,0,0,0.3) !important;\n cursor: pointer !important;\n " onclick="this.parentNode.removeChild(this)">\n ${t.message||"Emergency Toast Creation Showing!"}\n <span style="float: right; margin-left: 10px; font-weight: bold;">×</span>\n </div>\n `,n._animationDuration=500,n._isEmergencyToast=!0,setTimeout(()=>{try{n.parentNode&&n.parentNode.removeChild(n),e(n)}catch(t){}},t.duration||1800),n}catch(n){return setTimeout(()=>{try{alert(t.message||"Toast Creation Failed!"),e(null)}catch(t){e(null)}},100),null}}async function u(e,n){let o;if(!document.querySelector('[id^="toast-container-"]'))return null;try{return o=await async function(e,n){try{const o=document.createElement(e);return o.id=await t(n),o}catch(e){try{const e="div",n="fallback",o=document.createElement(e);return o.id=await t(n),o.setAttribute("data-original-tag",e),o}catch(t){}}}("div","toast"),await l(o,e,n),o}catch(t){return await c(e,n),o}}const d=new Map,f=new Map;function p(t="bottom-right"){return`toast-container-${function(t="bottom-right"){return String(t).toLowerCase().trim().replace(/\bbelow\b/g,"bottom").replace(/\s+/g,"-").replace(/[^a-z0-9\-]/g,"-").replace(/\-+/g,"-")}(t)}`}async function m(t={},e){const n=p(t.position);if(f.has(n))return f.get(n);const o=(async()=>{const o=d.get(n);if(o&&o.isConnected)return o;let i=document.getElementById(n);i&&!i.isConnected&&document.body.appendChild(i),i?(i.style.position=i.style.position||"fixed",i.style.zIndex=i.style.zIndex||"9999","function"==typeof e&&await e(i,t)):(i=document.createElement("div"),i.id=n,i.setAttribute("role","status"),i.setAttribute("aria-atomic","true"),i.style.position="fixed",i.style.zIndex="9999",i.style.inset="auto 10px 10px auto",i.style.display="flex",i.style.justifyContent="space-between",i.style.alignItems="center",i.style.flexDirection="column",i.style.overflow="hidden","function"==typeof e&&await e(i,t),document.body.appendChild(i));const r=document.querySelectorAll(`#${n}`);if(r.length>1)for(let t=1;t<r.length;t++)try{r[t].remove()}catch{}return d.set(n,i),i})();f.set(n,o);try{return await o}finally{f.delete(p(t.position))}}async function h(t,e){if(!t||!e.position)throw new Error("Invalid container or position!");!function(t){t.style.top="auto",t.style.bottom="auto",t.style.left="auto",t.style.right="auto",t.style.transform="none"}(t);const n=function(t){const e=t.toLowerCase().trim();return{hasTop:e.includes("top"),hasBottom:e.includes("bottom")||e.includes("below"),hasLeft:e.includes("left"),hasRight:e.includes("right"),hasCenter:e.includes("center"),hasFullWidth:e.includes("top-full-width")||e.includes("bottom-full-width")||e.includes("fullwidth")}}(e.position);(function(t,e,n){if(!n.hasFullWidth)return!1;if(e.maxWidth="100vw",n.hasTop)return t.style.top="10px",t.style.left="10px",t.style.right="10px",!0;if(n.hasBottom)return t.style.bottom="10px",t.style.left="10px",t.style.right="10px",!0;return!1})(t,e,n)||function(t,e){if(!e.hasCenter)return!1;if(e.hasTop&&!e.hasLeft&&!e.hasRight)return t.style.top="10px",t.style.left="50%",t.style.transform="translateX(-50%)",!0;if(e.hasBottom&&!e.hasLeft&&!e.hasRight)return t.style.bottom="10px",t.style.left="50%",t.style.transform="translateX(-50%)",!0;if(e.hasLeft&&!e.hasTop&&!e.hasBottom)return t.style.left="10px",t.style.top="50%",t.style.transform="translateY(-50%)",!0;if(e.hasRight&&!e.hasTop&&!e.hasBottom)return t.style.right="10px",t.style.top="50%",t.style.transform="translateY(-50%)",!0;if(!(e.hasLeft||e.hasRight||e.hasTop||e.hasBottom))return t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%)",!0;return!1}(t,n)||function(t,e){e.hasBottom?t.style.bottom="10px":e.hasTop&&(t.style.top="10px");e.hasRight?t.style.right="10px":e.hasLeft?t.style.left="10px":(t.style.bottom="10px",t.style.left="50%",t.style.transform="translateX(-50%)")}(t,n)}class y{constructor(t,e){this.callback=t,this.delay=e,this.remaining=e,this.startTime=null,this.timeoutId=null,this.isPaused=!1,this.isCompleted=!1}start(){return this.isCompleted||this.timeoutId||(this.startTime=Date.now(),this.timeoutId=setTimeout(()=>{this.isCompleted=!0,this.timeoutId=null,this.callback()},this.remaining)),this}pause(){return this.isPaused||!this.timeoutId||this.isCompleted||(clearTimeout(this.timeoutId),this.timeoutId=null,this.remaining-=Date.now()-this.startTime,this.remaining=Math.max(0,this.remaining),this.isPaused=!0),this}resume(){return!this.isPaused||this.isCompleted||(this.isPaused=!1,this.start()),this}clear(){return this.timeoutId&&(clearTimeout(this.timeoutId),this.timeoutId=null),this.isCompleted=!0,this}getRemainingTime(){return this.isCompleted?0:this.isPaused?this.remaining:this.timeoutId?Math.max(0,this.remaining-(Date.now()-this.startTime)):this.delay}}const g=new Map,b=new Map,w=[];let v=0;function x(t){let e=5381;for(let n=0;n<t.length;n++)e=(e<<5)+e+t.charCodeAt(n);return e>>>0}function C({type:t=options.type,message:e=options.message||"",position:n=options.position}){return[String(t).trim().toLowerCase(),x(String(e)).toString(16),String(n).trim().toLowerCase()].join("|")}async function k(t,e,n){try{if(!t||"object"!=typeof t)throw new TypeError("options must be an object");v++;const o=await m(t,h);if(!o)throw new Error("Failed to create toast container");const i=await u(t,S);if(!i)throw new Error("Toast element creation failed");const r=document.createElement("div");Object.assign(r.style,{position:"relative",display:"inline-block",overflow:"visible",marginBottom:"10px",zIndex:"0",width:"100%"});const a=document.createElement("div");Object.assign(a.style,{position:"relative",overflow:"hidden",borderRadius:t.borderRadius||"8px",zIndex:"1"}),a.appendChild(i),r.appendChild(a),o.id.includes("toast-container-")&&o.appendChild(r);const s=!1!==t.pauseOnHover&&(!0===t.pauseOnHover||!!t.cta),l={outer:r,toast:i,count:Math.max(1,0|n),timeout:null,pauseOnHover:s};g.set(e,l),i._key=e,l.count>1&&await L(l),l.timer=E(i,t),await T(l)}catch(e){v=Math.max(0,v-1);(document.querySelector('[id^="toast-container-"]')||document.body).appendChild(await c(t,S))}}function E(t,e){const n=(e.duration||1800)+10,o=new y(async()=>await S(t),n);return o.start(),o}async function T(t){if(!t.pauseOnHover||!t.outer||!t.timer)return;const{outer:e,timer:n}=t,o=()=>{n.pause()},i=()=>{n.resume()},r=t=>{t.target.matches("button, a, [tabindex]")&&n.pause()},a=t=>{e.contains(t.relatedTarget)||n.resume()};e.addEventListener("mouseenter",o),e.addEventListener("mouseleave",i),e.addEventListener("focusin",r),e.addEventListener("focusout",a),e._pauseCleanup=()=>{e.removeEventListener("mouseenter",o),e.removeEventListener("mouseleave",i),e.removeEventListener("focusin",r),e.removeEventListener("focusout",a)}}async function S(t){try{var e,n,o;if(null==t||!t._key)return;const i=g.get(t._key);if(!i)return;null===(e=i.timer)||void 0===e||e.clear(),null===(n=i.outer)||void 0===n||null===(o=n._pauseCleanup)||void 0===o||o.call(n),g.delete(t._key),v=Math.max(0,v-1);const r=i.outer.querySelector(".toast-count-badge");r&&r.remove(),await async function(t){return t?new Promise(e=>{let n=!1;const o=()=>{n||(n=!0,async function(t){if(!t)return!0;try{var e;if(null!=t&&null!==(e=t.parentNode)&&void 0!==e&&e.id.includes("toast-container-"))return t.parentNode.removeChild(t),!0}catch(e){try{if(t.remove)return t.remove(),!0}catch(e){try{return t.style.display="none",t.style.opacity="0",t.style.pointerEvents="none",t.style.position="absolute",t.style.left="-9999px",!0}catch(t){return!1}}}}(t),e())},i=t.firstElementChild||t;if(!i)return Promise.resolve();const r=t=>{try{if(t.target!==i)return;i.removeEventListener("transitionend",r,!0),o()}catch(t){}};try{i.addEventListener("transitionend",r,!0)}catch(t){}setTimeout(()=>{try{i.removeEventListener("transitionend",r,!0),o()}catch(t){}},700)}):Promise.resolve()}(i.outer),await I()}catch(t){}}async function I(){for(;v<3&&w.length;){const t=w.shift();if(g.has(t.key)){const e=g.get(t.key);e.count+=t.count,await L(e);continue}k(t.options,t.key,t.count)}}async function L({outer:t,count:e}){if(!t||!t instanceof HTMLElement)throw new Error("updateBadge: outer must be a valid HTMLElement");if(e<2){const e=t.querySelector(".toast-count-badge");return void(e&&e.remove())}let n=t.querySelector(".toast-count-badge");n||(n=document.createElement("span"),n.className="toast-count-badge",n.setAttribute("aria-label",`${e} identical notifications`),Object.assign(n.style,{position:"absolute",top:"6px",right:"6px",backgroundColor:"#f44336",color:"#fff",borderRadius:"50%",minWidth:"20px",height:"20px",fontSize:"12px",fontWeight:"600",display:"flex",alignItems:"center",justifyContent:"center",border:"2px solid #fff",boxShadow:"0 2px 6px rgba(0,0,0,0.3)",zIndex:"2",pointerEvents:"none",transition:"transform 150ms ease"}),t.appendChild(n)),n.textContent=e>99?"99+":String(e);try{n.style.transform="scale(1.2)",setTimeout(()=>n.style.transform="scale(1)",150)}catch(t){}}let M={success:"#28a745",error:"#dc3545",warning:"#ffc107",info:"#17a2b8"},A={success:"Operation completed successfully!",error:"Something went wrong!",warning:"Warning message!",info:"Information message!"};const B=[];let P=!1;async function j(t={}){try{const n=await async function(t){var n;const o=null==t||null===(n=t.position)||void 0===n||null===(n=n.toLowerCase())||void 0===n?void 0:n.trim(),i=null!=o&&o.includes("top-full-width")||null!=o&&o.includes("bottom-full-width")?"100vw":"400px",r={pauseOnHover:void 0,duration:1800,position:"bottom-right",type:"info",borderRadius:"50px",backgroundColor:void 0,textColor:void 0,showCloseButton:!0,animationDuration:"0.4s",animationType:"fade",animationEasing:"ease",showProgressBar:!0,progressColor:void 0,progressHeight:"4px",progressPosition:"bottom",fontPosition:"relative",fontPadding:void 0,fontBorderRadius:void 0,fontBackgroundColor:void 0,fontFamily:'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"',fontSize:"14px",fontWeight:"400",fontLineHeight:"1.4",fontDirection:"auto",wrapText:"normal",maxWidth:i,..."object"!=typeof t||Array.isArray(t)?{}:t};r.message=(null==t?void 0:t.message)??r.message;try{var a,s;if(!r.backgroundColor)r.backgroundColor=(null===(s=M)||void 0===s?void 0:s[r.type])??(window.matchMedia("(prefers-color-scheme: dark)").matches?"#f5f5f5":"#111111");if(r.message=r.message||(null===(a=A)||void 0===a?void 0:a[r.type])||"No Message Provided!",!r.textColor&&r.backgroundColor){const t=await e(r.backgroundColor);r.textColor=null==t?void 0:t.color}if(!r.progressColor&&r.backgroundColor)if(r.textColor)r.progressColor=r.textColor;else{const t=await e(r.backgroundColor);r.progressColor=null==t?void 0:t.color}}catch(t){}"string"!=typeof r.message&&(r.message="No Message Provided!");return r}(t);await async function(t){try{return await m(t,h)}catch(t){return document.body}}(n),await async function(t={}){try{const e=C(t);if(g.has(e)){const n=g.get(e);if(!n)throw new Error(`Active toast with key ${e} not found`);return n.count++,n.timer.clear(),n.timer=E(n.toast,t),await T(n),void await L(n)}if(b.has(e)){const t=b.get(e);if(!t)throw new Error(`Pending toast with key ${e} not found`);return void t.count++}const n={options:t,count:1,rafId:0};b.set(e,n),n.rafId=requestAnimationFrame(async()=>{const t=b.get(e);if(t){if(b.delete(e),v>=3)return w.push({options:t.options,key:e,count:t.count}),void await I();try{await k(t.options,e,t.count)}catch(t){}}})}catch(t){}}(n)}catch(e){var n;const o="string"==typeof(null==t?void 0:t.message)&&null!==(null==t?void 0:t.message)?`${null==t||null===(n=t.message)||void 0===n?void 0:n.substring(0,200)} toast creation failed!`:"Toast creation failed!";alert(o)}}let D=!1;async function W(t={}){"undefined"!=typeof window&&"undefined"!=typeof document&&(await async function(){P||"undefined"!=typeof window&&"undefined"!=typeof document&&("complete"===document.readyState||"interactive"===document.readyState?(P=!0,B.forEach(t=>setTimeout(()=>j(t),2e3)),B.length=0):document.addEventListener("DOMContentLoaded",()=>{P=!0,B.forEach(t=>setTimeout(()=>j(t),2e3)),B.length=0},{once:!0}))}(),P?D?await j(t):(D=!0,setTimeout(await j(t),2e3)):B.push(t))}function R(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(M={...M,...t})}catch(t){}}function $(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(A={...A,...t})}catch(t){}}const z=async function(t){try{const e="all"===t?'[id^="toast-container-"][role="status"]':'[id^="toast-"]:not([id*="container"])';("all"===t?document.querySelectorAll(e):[document.querySelector(e)].filter(Boolean)).forEach(t=>{if("function"==typeof(null==t?void 0:t.remove))t.remove();else if(t)throw new TypeError("Element exists but remove() is not a function")})}catch(t){}};try{"undefined"!=typeof window&&(window.customizableToast={createToast:W,setDefaultColors:R,setDefaultMessages:$,noop:z})}catch(t){}exports.createToast=W,exports.noop=z,exports.setDefaultColors=R,exports.setDefaultMessages=$;
|
|
16
16
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/id.js","../src/utils/dom.js","../src/components/toast-utils.js","../src/components/Toast.js","../src/utils/containerRegistry.js","../src/utils/position.js","../src/utils/PausableTimer.js","../src/components/ToastManager.js","../src/index.js"],"sourcesContent":["// src/utils/id.js\r\n\"use strict\";\r\n\r\n/**\r\n * Generate unique ID for DOM elements to avoid conflicts\r\n * @param {string} prefix - Optional prefix for ID\r\n * @returns {string} Unique ID\r\n */\r\nexport async function generateUniqueId(prefix) {\r\n return `${prefix}-${Date.now()}-${Math.floor(Math.random() * 100000)}`;\r\n}\r\n","// src/utils/dom.js\r\n\"use strict\";\r\n\r\nimport { generateUniqueId } from \"./id.js\";\r\n\r\n/**\r\n * Multi-layer fallback DOM element creation\r\n */\r\nexport async function createElementWithId(tagName, prefix) {\r\n // PRIMARY: Standard createElement\r\n try {\r\n if (!tagName || !prefix) throw new Error(`tagName and prefix is required`);\r\n\r\n const el = document.createElement(tagName);\r\n el.id = await generateUniqueId(prefix);\r\n return el;\r\n } catch (error) {\r\n console.warn(`Primary createElement failed for`, error);\r\n\r\n // FALLBACK-A: Try div as alternative\r\n try {\r\n const fallbackTag = \"div\";\r\n const fallbackPrefix = \"fallback\";\r\n const fallbackEl = document.createElement(fallbackTag);\r\n fallbackEl.id = await generateUniqueId(fallbackPrefix);\r\n fallbackEl.setAttribute(\"data-original-tag\", fallbackTag);\r\n return fallbackEl;\r\n } catch (fallbackError) {\r\n console.error(\"All DOM creation methods failed:\", fallbackError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Multi-strategy appendChild with graceful degradation\r\n */\r\nexport async function appendChild(parent, child) {\r\n if (!parent || !child) return false;\r\n\r\n // PRIMARY: Standard appendChild\r\n try {\r\n if (!parent.contains(child)) {\r\n parent.appendChild(child);\r\n return true;\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn(\"Primary appendChild failed:\", error);\r\n\r\n // FALLBACK-A: insertAdjacentElement\r\n try {\r\n parent.insertAdjacentElement(\"beforeend\", child);\r\n return true;\r\n } catch (fallbackError) {\r\n console.warn(\"Fallback appendChild failed:\", fallbackError);\r\n\r\n // FALLBACK-B: Manual positioning\r\n // Emergency fallback removed: avoid using outerHTML (drops listeners & risks XSS).\r\n // Final attempt: clone and append using standard APIs.\r\n try {\r\n if (parent === document.body) {\r\n const clone = child.cloneNode(true);\r\n parent.appendChild(clone);\r\n return true;\r\n }\r\n } catch (emergencyError) {\r\n console.error(\"All append strategies failed:\", emergencyError);\r\n return false;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Safe element removal with multiple strategies\r\n */\r\nexport async function removeElement(el) {\r\n if (!el) return true;\r\n\r\n // PRIMARY: parentNode.removeChild\r\n try {\r\n if (el?.parentNode?.id.includes(\"toast-container-\")) {\r\n el.parentNode.removeChild(el);\r\n return true;\r\n }\r\n } catch (error) {\r\n console.warn(\"Primary removal failed:\", error);\r\n\r\n // FALLBACK-A: element.remove()\r\n try {\r\n if (el.remove) {\r\n el.remove();\r\n return true;\r\n }\r\n } catch (fallbackError) {\r\n console.warn(\"Fallback removal failed:\", fallbackError);\r\n\r\n // FALLBACK-B: Hide instead of remove\r\n try {\r\n el.style.display = \"none\";\r\n el.style.opacity = \"0\";\r\n el.style.pointerEvents = \"none\";\r\n el.style.position = \"absolute\";\r\n el.style.left = \"-9999px\";\r\n return true;\r\n } catch (hideError) {\r\n console.error(\"All removal strategies failed:\", hideError);\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Animation duration parser with fallbacks\r\n */\r\nexport async function parseAnimationDuration(duration) {\r\n // PRIMARY: Parse provided duration\r\n try {\r\n if (typeof duration === \"number\" && duration > 0) return duration;\r\n if (typeof duration === \"string\") {\r\n if (duration.endsWith(\"s\") && !duration.endsWith(\"ms\")) {\r\n const parsed = parseFloat(duration) * 1000;\r\n return parsed > 0 ? parsed : 500;\r\n }\r\n const parsed = parseFloat(duration);\r\n return parsed > 0 ? parsed : 500;\r\n }\r\n } catch (error) {\r\n console.warn(\"Duration parsing failed:\", error);\r\n }\r\n\r\n // FALLBACK: Safe default\r\n return 500;\r\n}\r\n\r\n/**\r\n * Force reflow with error protection\r\n */\r\nexport function forceReflow(el) {\r\n try {\r\n return el?.offsetWidth || 0;\r\n } catch (error) {\r\n console.warn(\"Force reflow failed:\", error);\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Query selector shortcut with optional root.\r\n * @param {string} selector\r\n * @param {Document|HTMLElement} [root=document]\r\n * @returns {Element|null}\r\n */\r\nexport function query(selector, root = document) {\r\n return root.querySelector(selector);\r\n}\r\n\r\n/**\r\n * Determine text color based on background color.\r\n * @param {string} toastBg Toast background color in hex, rgb, or rgba format.\r\n * @returns {Promise<string>} Text color, either `\"black\"` or `\"white\"`.\r\n */\r\nexport async function getTextColor(toastBg) {\r\n if (!toastBg) return \"black\";\r\n try {\r\n return (await contrast(toastBg)) > 3.5 ? \"black\" : \"white\";\r\n } catch (error) {\r\n console.warn(\"TextColor calculation failed:\", error);\r\n return \"black\";\r\n }\r\n}\r\n\r\n/**\r\n * Calculates the contrast ratio between the given color and black or white.\r\n * @param {string} color A color in hex, rgb, rgba, or color name format.\r\n * @returns {Promise<number>} The contrast ratio between the given color and black or white.\r\n * @throws {Error} If the given color is not supported.\r\n */\r\nasync function contrast(color) {\r\n if (!color) {\r\n throw new Error(\"Color is required\");\r\n }\r\n\r\n let r, g, b;\r\n\r\n // If color is in hex format\r\n if (color.startsWith(\"#\")) {\r\n const hex = color.substring(1);\r\n if (hex.length === 3) {\r\n r = parseInt(hex[0] + hex[0], 16);\r\n g = parseInt(hex[1] + hex[1], 16);\r\n b = parseInt(hex[2] + hex[2], 16);\r\n } else if (hex.length === 6) {\r\n r = parseInt(hex.substring(0, 2), 16);\r\n g = parseInt(hex.substring(2, 4), 16);\r\n b = parseInt(hex.substring(4, 6), 16);\r\n } else {\r\n throw new Error(`Invalid hex color format: ${color}`);\r\n }\r\n }\r\n // If color is in rgb/rgba format\r\n else if (color.startsWith(\"rgb\") || color.startsWith(\"rgba\")) {\r\n const match = color.match(\r\n /^rgba?\\((\\d{1,3}),\\s*(\\d{1,3}),\\s*(\\d{1,3})(?:,\\s*(\\d+(?:\\.\\d+)?))?\\)$/\r\n );\r\n if (match) {\r\n r = parseInt(match[1]);\r\n g = parseInt(match[2]);\r\n b = parseInt(match[3]);\r\n } else {\r\n throw new Error(`Invalid rgb/rgba color format: ${color}`);\r\n }\r\n }\r\n // If color is a color name\r\n else {\r\n const colorMap = {\r\n black: [0, 0, 0],\r\n white: [255, 255, 255],\r\n // Add more color names as needed\r\n };\r\n const colorArray = colorMap[color.toLowerCase()];\r\n if (colorArray) {\r\n r = colorArray[0];\r\n g = colorArray[1];\r\n b = colorArray[2];\r\n } else {\r\n throw new Error(`Unsupported color format: ${color}`);\r\n }\r\n }\r\n\r\n if (isNaN(r) || isNaN(g) || isNaN(b)) {\r\n throw new Error(`Invalid color value: ${color}`);\r\n }\r\n\r\n const l1 = (r * 0.2126 + g * 0.7152 + b * 0.0722) / 255;\r\n const l2 = 0.05;\r\n return (Math.max(l1, l2) + 0.05) / Math.min(l1, l2);\r\n}\r\n","\"use strict\";\r\n\r\nimport { forceReflow, parseAnimationDuration } from \"../utils/dom.js\";\r\n\r\n/**\r\n * Create close button for toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function createCloseButton(toast, options, onClose) {\r\n const closeButton = document.createElement(\"button\");\r\n // Accessibility + avoid innerHTML (XSS surface)\r\n closeButton.setAttribute(\"aria-label\", \"Close notification\");\r\n closeButton.setAttribute(\"title\", \"Close\");\r\n closeButton.textContent = \"×\"; // U+00D7 multiplication sign\r\n Object.assign(closeButton.style, {\r\n background: \"none\",\r\n border: \"none\",\r\n color: options.textColor,\r\n fontSize: \"18px\",\r\n marginLeft: \"10px\",\r\n cursor: \"pointer\",\r\n });\r\n\r\n closeButton.onclick = () => onClose(toast);\r\n toast.appendChild(closeButton);\r\n\r\n toast._cleanupCloseButton = () => {\r\n closeButton.onclick = null;\r\n };\r\n}\r\n\r\n/**\r\n * Create progress bar for toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n */\r\nexport async function createProgressBar(toast, options) {\r\n const progressBar = document.createElement(\"div\");\r\n Object.assign(progressBar.style, {\r\n position: \"absolute\",\r\n left: \"0\",\r\n height: options.progressHeight || \"4px\",\r\n background: options.progressColor || \"rgba(255, 255, 255, 0.3)\",\r\n width: \"100%\",\r\n transition: `width ${options.duration || 1800}ms linear`,\r\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\r\n });\r\n\r\n toast.appendChild(progressBar);\r\n\r\n setTimeout(() => {\r\n forceReflow(progressBar);\r\n progressBar.style.width = \"0%\";\r\n }, 100);\r\n}\r\n\r\n/**\r\n * Run toast fade-in animation\r\n * @param {HTMLElement} toast - Toast element\r\n */\r\nexport async function runToastAnimation(toast) {\r\n setTimeout(() => {\r\n requestAnimationFrame(() => {\r\n toast.style.opacity = \"1\";\r\n toast.style.transform = \"translateY(0)\";\r\n });\r\n }, 50);\r\n}\r\n\r\n/**\r\n * Apply rich styling to toast element\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function applyRichStyling(toast, options, onClose) {\r\n const animDurationMs = await parseAnimationDuration(\r\n options.animationDuration\r\n );\r\n\r\n // Apply full styling\r\n Object.assign(toast.style, {\r\n background: options.backgroundColor,\r\n padding: \"12px 20px\",\r\n marginBottom: \"10px\",\r\n borderRadius: options.borderRadius,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n minWidth: \"250px\",\r\n maxWidth: options.maxWidth,\r\n opacity: \"0\",\r\n position: \"relative\",\r\n transition: `opacity ${options.animationDuration} ${options.animationEasing}, transform ${options.animationDuration} ${options.animationEasing}`,\r\n transform: \"translateY(20px)\",\r\n zIndex: \"9999\",\r\n // willChange: \"opacity, transform\",\r\n });\r\n\r\n // TODO! Later\r\n // await animateElement(toast, {\r\n // animationType: options.animationType,\r\n // duration: animDurationMs,\r\n // easing: options.animationEasing,\r\n // });\r\n\r\n toast._animationDuration = animDurationMs;\r\n\r\n // Message span\r\n const messageSpan = document.createElement(\"span\");\r\n\r\n // Layout & positioning\r\n messageSpan.style.position = options.fontPosition;\r\n messageSpan.style.display = \"inline-block\"; // ensure consistent layout\r\n messageSpan.style.flex = \"1\";\r\n\r\n // Spacing & container styling\r\n messageSpan.style.padding = options.fontPadding;\r\n messageSpan.style.borderRadius = options.fontBorderRadius;\r\n messageSpan.style.background = options.fontBackgroundColor;\r\n\r\n // Font stack (system + emoji + fallback)\r\n messageSpan.style.fontFamily = options.fontFamily;\r\n\r\n // Font size & readability\r\n messageSpan.style.fontSize = options.fontSize; // minimum for readability\r\n messageSpan.style.fontWeight = options.fontWeight;\r\n messageSpan.style.lineHeight = options.fontLineHeight; // balance readability\r\n\r\n //TODO LATER Icons (auto dark/light fallback)\r\n // messageSpan.style.color =\r\n // options.iconColor ||\r\n // (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n // ? \"#f5f5f5\"\r\n // : \"#111111\");\r\n\r\n // Colors (auto dark/light fallback)\r\n messageSpan.style.color = options.textColor;\r\n\r\n // Accessibility\r\n messageSpan.style.userSelect = \"text\"; // allow copy/paste if needed\r\n messageSpan.style.wordBreak = \"break-word\"; // avoid layout breaking on long strings\r\n messageSpan.style.direction = options.fontDirection; // RTL/LTR auto-detect\r\n // ✅ Multi-line ellipsis (max 3 lines)\r\n messageSpan.style.webkitLineClamp = \"3\"; // maximum 3 lines\r\n messageSpan.style.webkitBoxOrient = \"vertical\";\r\n messageSpan.style.whiteSpace = options.wrapText ? \"normal\" : \"nowrap\"; // allow wrapping if wanted\r\n messageSpan.style.display = \"block\";\r\n messageSpan.style.overflow = \"hidden\";\r\n messageSpan.style.textOverflow = \"ellipsis\";\r\n messageSpan.style.lineClamp = \"3\"; // modern property\r\n messageSpan.style.boxOrient = \"vertical\"; // non-prefixed\r\n messageSpan.style.display = \"-webkit-box\";\r\n // messageSpan.style.mixBlendMode = \"difference\";\r\n // Assign message\r\n messageSpan.textContent = options.message;\r\n messageSpan.setAttribute(\"aria-label\", \"Toast Notification Center\");\r\n messageSpan.setAttribute(\"title\", options.message);\r\n // Add to toast\r\n toast.appendChild(messageSpan);\r\n\r\n // TODO Icon Later\r\n // if (options.icon) {\r\n // createIcon(toast, options);\r\n // }\r\n\r\n // CTA factory that appends a safe, keyboard‑accessible button/link at the end of the row\r\n await createCTA(toast, options, onClose);\r\n\r\n // Close button\r\n if (options.showCloseButton) {\r\n await createCloseButton(toast, options, onClose);\r\n }\r\n\r\n // Progress bar\r\n if (options.showProgressBar) {\r\n await createProgressBar(toast, options);\r\n }\r\n\r\n // Animation\r\n await runToastAnimation(toast);\r\n}\r\n\r\n/**\r\n * Create basic fallback toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function createBasicToast(toast, options, onClose) {\r\n // Basic styling only\r\n Object.assign(toast.style, {\r\n background: \"#333\",\r\n color: \"white\",\r\n padding: \"10px 15px\",\r\n margin: \"10px\",\r\n borderRadius: \"3px\",\r\n position: \"fixed\",\r\n top: \"20px\",\r\n right: \"20px\",\r\n zIndex: \"99999\",\r\n maxWidth: \"300px\",\r\n wordWrap: \"break-word\",\r\n });\r\n\r\n toast.textContent = options.message;\r\n\r\n if (options.showCloseButton) {\r\n toast.style.cursor = \"pointer\";\r\n toast.onclick = () => onClose(toast);\r\n }\r\n\r\n toast._animationDuration = 500;\r\n}\r\n\r\n// CSS injection function\r\nasync function injectToastStyles() {\r\n if (document.getElementById(\"ctoast-styles\")) return; // Already injected\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = \"ctoast-styles\";\r\n style.textContent = `\r\n .ctoast-toast {\r\n padding: 12px 20px;\r\n margin-bottom: 10px;\r\n border-radius: 5px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n min-width: 250px;\r\n max-width: 400px;\r\n opacity: 0;\r\n position: relative;\r\n transform: translateY(20px);\r\n z-index: 9999;\r\n }\r\n\r\n .ctoast-message {\r\n flex: 1;\r\n }\r\n\r\n .ctoast-close {\r\n cursor: pointer;\r\n margin-left: 10px;\r\n font-weight: bold;\r\n background: transparent;\r\n border: none;\r\n }\r\n\r\n .ctoast-progress {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n height: 4px;\r\n background: rgba(255,255,255,0.7);\r\n width: 100%;\r\n transform-origin: left;\r\n }\r\n\r\n .ctoast-show {\r\n opacity: 1 !important;\r\n transform: translateY(0) !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\n/**\r\n * Emergency toast as last resort\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function createEmergencyToast(options, onClose) {\r\n try {\r\n // Create emergency div\r\n const emergency = document.createElement(\"div\");\r\n emergency.id = `emergency-${Date.now()}`;\r\n emergency.innerHTML = `\r\n <div style=\"\r\n background: #333 !important;\r\n color: white !important;\r\n padding: 10px 15px !important;\r\n position: fixed !important;\r\n top: 20px !important;\r\n right: 20px !important;\r\n z-index: 99999 !important;\r\n border-radius: 3px !important;\r\n max-width: 250px !important;\r\n word-wrap: break-word !important;\r\n font-family: Arial, sans-serif !important;\r\n font-size: 14px !important;\r\n box-shadow: 0 2px 10px rgba(0,0,0,0.3) !important;\r\n cursor: pointer !important;\r\n \" onclick=\"this.parentNode.removeChild(this)\">\r\n ${options.message || \"Emergency Toast Creation Showing!\"}\r\n <span style=\"float: right; margin-left: 10px; font-weight: bold;\">×</span>\r\n </div>\r\n `;\r\n\r\n emergency._animationDuration = 500;\r\n emergency._isEmergencyToast = true;\r\n\r\n // Auto remove\r\n setTimeout(() => {\r\n try {\r\n if (emergency.parentNode) {\r\n emergency.parentNode.removeChild(emergency);\r\n }\r\n onClose(emergency);\r\n } catch (error) {\r\n console.warn(\"Emergency cleanup failed:\", error);\r\n }\r\n }, options.duration || 1800);\r\n\r\n return emergency;\r\n } catch (emergencyError) {\r\n console.error(\"Emergency toast creation failed:\", emergencyError);\r\n\r\n // ULTIMATE FALLBACK: Alert\r\n setTimeout(() => {\r\n try {\r\n alert(options.message || \"Toast Creation Failed!\");\r\n onClose(null);\r\n } catch (alertError) {\r\n console.error(\"Ultimate fallback failed:\", alertError);\r\n onClose(null);\r\n }\r\n }, 100);\r\n\r\n return null;\r\n }\r\n}\r\n\r\nexport async function safeSetTimeout(fn, delay) {\r\n const id = setTimeout(() => {\r\n console.warn(\"Timer fired after\", delay, \"ms\");\r\n fn();\r\n }, delay);\r\n\r\n console.warn(\"Timer scheduled with id:\", id, \"delay:\", delay);\r\n return id;\r\n}\r\n\r\n/**\r\n * Append a Call-To-Action (CTA) element to the toast container.\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n * @returns {HTMLElement} CTA element\r\n * @example\r\n * const toast = createToast({ ... });\r\n * const cta = createCTA(toast, { cta: { label: \"Visit our website\", href: \"https://www.example.com/\", variant: \"link\" } });\r\n */\r\nexport async function createCTA(toast, options, onClose) {\r\n const cfg = options?.cta;\r\n if (!cfg || !cfg.label) return;\r\n\r\n const isLink = !!cfg.href && cfg.variant === \"link\";\r\n const el = document.createElement(isLink ? \"a\" : \"button\");\r\n\r\n // Base a11y and semantics\r\n if (isLink) {\r\n el.href = cfg.href;\r\n if (cfg.target) el.target = cfg.target;\r\n el.rel = cfg.rel || (cfg.target === \"_blank\" ? \"noopener noreferrer\" : \"\");\r\n } else {\r\n el.type = \"button\";\r\n }\r\n el.setAttribute(\"aria-label\", cfg.ariaLabel || cfg.label);\r\n\r\n // Visuals that fit any theme; minimal, non-intrusive\r\n Object.assign(el.style, {\r\n marginLeft: \"10px\",\r\n padding: \"6px 10px\",\r\n borderRadius: \"6px\",\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n lineHeight: \"1\",\r\n border: \"1px solid rgba(255,255,255,0.35)\",\r\n color: options.textColor || \"#fff\",\r\n background: \"rgba(255,255,255,0.15)\",\r\n cursor: \"pointer\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: \"0\",\r\n });\r\n\r\n el.textContent = cfg.label;\r\n\r\n // Click behavior\r\n el.addEventListener(\"click\", async (e) => {\r\n try {\r\n if (typeof cfg.onClick === \"function\") {\r\n const ret = cfg.onClick(e);\r\n if (ret?.then) await ret; // allow async actions\r\n }\r\n } finally {\r\n if (cfg.autoClose !== false) onClose(toast);\r\n }\r\n });\r\n\r\n // Append after message span, before close/progress doesn’t matter (flex)\r\n toast.appendChild(el);\r\n}\r\n","// src/components/Toast.js //# Single responsibility\r\n\"use strict\";\r\n\r\nimport { createElementWithId } from \"../utils/dom.js\";\r\nimport { applyRichStyling, createEmergencyToast } from \"./toast-utils.js\";\r\n\r\n/**\r\n * Multi-layer toast creation with satellite-grade fallbacks\r\n * @param {Object} options - Toast configuration options\r\n * @param {Function} onClose - Callback when toast closes\r\n * @returns {HTMLElement} Toast element\r\n */\r\nexport async function createToastElement(options, onClose) {\r\n let toastContainer = document.querySelector('[id^=\"toast-container-\"]');\r\n if (!toastContainer) return null;\r\n\r\n let toast;\r\n const tagName = \"div\";\r\n const prefix = \"toast\";\r\n\r\n // PRIMARY: Full-featured toast\r\n try {\r\n toast = await createElementWithId(tagName, prefix);\r\n await applyRichStyling(toast, options, onClose);\r\n return toast;\r\n } catch (error) {\r\n console.warn(\"error:\", error);\r\n await createEmergencyToast(options, onClose);\r\n return toast;\r\n }\r\n}\r\n","// src/utils/containerRegistry.js\r\n\"use strict\";\r\n\r\nconst containerRegistry = new Map(); // id -> HTMLElement\r\nconst containerLocks = new Map(); // id -> Promise<HTMLElement>\r\n\r\n/**\r\n * Normalize a position string to a canonical key (id-safe, stable).\r\n */\r\nexport function normalizePositionKey(position = \"bottom-right\") {\r\n // lower-case, trim, unify separators, alias \"below\" -> \"bottom\"\r\n const raw = String(position).toLowerCase().trim();\r\n const aliased = raw.replace(/\\bbelow\\b/g, \"bottom\");\r\n return aliased\r\n .replace(/\\s+/g, \"-\")\r\n .replace(/[^a-z0-9\\-]/g, \"-\")\r\n .replace(/\\-+/g, \"-\");\r\n}\r\n\r\n/**\r\n * Canonical container id\r\n */\r\nexport function getContainerId(position = \"bottom-right\") {\r\n return `toast-container-${normalizePositionKey(position)}`;\r\n}\r\n\r\n/**\r\n * Atomically get or create a single container per canonical id.\r\n */\r\nexport async function getOrCreateToastContainer(options = {}, setPosition) {\r\n const id = getContainerId(options.position);\r\n // If a creation is in-flight, await it\r\n if (containerLocks.has(id)) {\r\n return containerLocks.get(id);\r\n }\r\n\r\n const p = (async () => {\r\n // 1) Prefer registry cache if still connected\r\n const cached = containerRegistry.get(id);\r\n if (cached && cached.isConnected) {\r\n return cached;\r\n }\r\n\r\n // 2) Find existing in DOM\r\n let el = document.getElementById(id); // unique by spec, but may return first if duplicates exist\r\n if (el && !el.isConnected) {\r\n // re-attach if detached\r\n document.body.appendChild(el);\r\n }\r\n\r\n // 3) If not found, create\r\n if (!el) {\r\n el = document.createElement(\"div\");\r\n el.id = id;\r\n el.setAttribute(\"role\", \"status\"); // polite + atomic by default\r\n el.setAttribute(\"aria-atomic\", \"true\"); // explicit for consistency\r\n el.style.position = \"fixed\";\r\n el.style.zIndex = \"9999\";\r\n el.style.inset = \"auto 10px 10px auto\";\r\n el.style.display = \"flex\";\r\n el.style.justifyContent = \"space-between\";\r\n el.style.alignItems = \"center\";\r\n el.style.flexDirection = \"column\";\r\n el.style.overflow = \"hidden\";\r\n // Position with provided helper\r\n if (typeof setPosition === \"function\") {\r\n await setPosition(el, options);\r\n }\r\n document.body.appendChild(el);\r\n } else {\r\n // Ensure base styles and (re)apply position in case options changed\r\n el.style.position = el.style.position || \"fixed\";\r\n el.style.zIndex = el.style.zIndex || \"9999\";\r\n if (typeof setPosition === \"function\") {\r\n await setPosition(el, options);\r\n }\r\n }\r\n\r\n // 4) If somehow duplicates exist, keep the first and remove the rest\r\n // getElementById would have returned the first; clean up others proactively\r\n const all = document.querySelectorAll(`#${id}`);\r\n if (all.length > 1) {\r\n for (let i = 1; i < all.length; i++) {\r\n try {\r\n all[i].remove();\r\n } catch {}\r\n }\r\n }\r\n\r\n containerRegistry.set(id, el);\r\n return el;\r\n })();\r\n\r\n containerLocks.set(id, p);\r\n try {\r\n const out = await p;\r\n return out;\r\n } finally {\r\n // Clear the lock so future calls can re-enter if needed\r\n containerLocks.delete(getContainerId(options.position));\r\n }\r\n}\r\n","// src/utils/position.js\r\n\"use strict\";\r\n\r\n/**\r\n * Set position for toast container\r\n * @param {HTMLElement} container - Toast container element\r\n * @param {Object} options - Options object containing position\r\n * @returns {Promise<void>}\r\n */\r\nexport async function setPosition(container, options) {\r\n if (!container || !options.position) {\r\n throw new Error(\"Invalid container or position!\");\r\n }\r\n\r\n resetContainerStyles(container);\r\n const positionFlags = parsePosition(options.position);\r\n\r\n if (handleFullWidthPositions(container, options, positionFlags)) return;\r\n if (handleCenterPositions(container, positionFlags)) return;\r\n\r\n applyStandardPositioning(container, positionFlags);\r\n}\r\n\r\n/**\r\n * Reset all position-related styles\r\n * @param {HTMLElement} container\r\n */\r\nfunction resetContainerStyles(container) {\r\n container.style.top = \"auto\";\r\n container.style.bottom = \"auto\";\r\n container.style.left = \"auto\";\r\n container.style.right = \"auto\";\r\n container.style.transform = \"none\";\r\n}\r\n\r\n/**\r\n * Parse position string into boolean flags\r\n * @param {string} position\r\n * @returns {Object} Position flags\r\n */\r\nfunction parsePosition(position) {\r\n const pos = position.toLowerCase().trim();\r\n return {\r\n hasTop: pos.includes(\"top\"),\r\n hasBottom: pos.includes(\"bottom\") || pos.includes(\"below\"),\r\n hasLeft: pos.includes(\"left\"),\r\n hasRight: pos.includes(\"right\"),\r\n hasCenter: pos.includes(\"center\"),\r\n hasFullWidth:\r\n pos.includes(\"top-full-width\") ||\r\n pos.includes(\"bottom-full-width\") ||\r\n pos.includes(\"fullwidth\"),\r\n };\r\n}\r\n\r\n/**\r\n * Handle full-width positioning cases\r\n * @param {HTMLElement} container\r\n * @param {Object} options\r\n * @param {Object} flags\r\n * @returns {boolean} True if position was handled\r\n */\r\nfunction handleFullWidthPositions(container, options, flags) {\r\n if (!flags.hasFullWidth) return false;\r\n\r\n options.maxWidth = \"100vw\";\r\n\r\n if (flags.hasTop) {\r\n container.style.top = \"10px\";\r\n container.style.left = \"10px\";\r\n container.style.right = \"10px\";\r\n return true;\r\n }\r\n\r\n if (flags.hasBottom) {\r\n container.style.bottom = \"10px\";\r\n container.style.left = \"10px\";\r\n container.style.right = \"10px\";\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Handle center positioning cases\r\n * @param {HTMLElement} container\r\n * @param {Object} flags\r\n * @returns {boolean} True if position was handled\r\n */\r\nfunction handleCenterPositions(container, flags) {\r\n if (!flags.hasCenter) return false;\r\n\r\n // top-center\r\n if (flags.hasTop && !flags.hasLeft && !flags.hasRight) {\r\n container.style.top = \"10px\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translateX(-50%)\";\r\n return true;\r\n }\r\n\r\n // bottom-center\r\n if (flags.hasBottom && !flags.hasLeft && !flags.hasRight) {\r\n container.style.bottom = \"10px\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translateX(-50%)\";\r\n return true;\r\n }\r\n\r\n // left-center\r\n if (flags.hasLeft && !flags.hasTop && !flags.hasBottom) {\r\n container.style.left = \"10px\";\r\n container.style.top = \"50%\";\r\n container.style.transform = \"translateY(-50%)\";\r\n return true;\r\n }\r\n\r\n // right-center\r\n if (flags.hasRight && !flags.hasTop && !flags.hasBottom) {\r\n container.style.right = \"10px\";\r\n container.style.top = \"50%\";\r\n container.style.transform = \"translateY(-50%)\";\r\n return true;\r\n }\r\n\r\n // full center (no sides specified)\r\n if (!flags.hasLeft && !flags.hasRight && !flags.hasTop && !flags.hasBottom) {\r\n container.style.top = \"50%\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translate(-50%, -50%)\";\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Apply standard positioning (corners and edges)\r\n * @param {HTMLElement} container\r\n * @param {Object} flags\r\n */\r\nfunction applyStandardPositioning(container, flags) {\r\n // Set vertical position\r\n if (flags.hasBottom) {\r\n container.style.bottom = \"10px\";\r\n } else if (flags.hasTop) {\r\n container.style.top = \"10px\";\r\n }\r\n\r\n // Set horizontal position\r\n if (flags.hasRight) {\r\n container.style.right = \"10px\";\r\n } else if (flags.hasLeft) {\r\n container.style.left = \"10px\";\r\n } else {\r\n // Default: bottom-center\r\n container.style.bottom = \"10px\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translateX(-50%)\";\r\n }\r\n}\r\n","// src/utils/PausableTimer.js\r\n\"use strict\";\r\n\r\nexport class PausableTimer {\r\n constructor(callback, delay) {\r\n this.callback = callback;\r\n this.delay = delay;\r\n this.remaining = delay;\r\n this.startTime = null;\r\n this.timeoutId = null;\r\n this.isPaused = false;\r\n this.isCompleted = false;\r\n }\r\n\r\n start() {\r\n if (this.isCompleted || this.timeoutId) return this;\r\n this.startTime = Date.now();\r\n this.timeoutId = setTimeout(() => {\r\n this.isCompleted = true;\r\n this.timeoutId = null;\r\n this.callback();\r\n }, this.remaining);\r\n return this;\r\n }\r\n\r\n pause() {\r\n if (this.isPaused || !this.timeoutId || this.isCompleted) return this;\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n this.remaining -= Date.now() - this.startTime;\r\n this.remaining = Math.max(0, this.remaining); // prevent negative\r\n this.isPaused = true;\r\n return this;\r\n }\r\n\r\n resume() {\r\n if (!this.isPaused || this.isCompleted) return this;\r\n this.isPaused = false;\r\n this.start();\r\n return this;\r\n }\r\n\r\n clear() {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n this.isCompleted = true;\r\n return this;\r\n }\r\n\r\n getRemainingTime() {\r\n if (this.isCompleted) return 0;\r\n if (this.isPaused) return this.remaining;\r\n if (!this.timeoutId) return this.delay;\r\n return Math.max(0, this.remaining - (Date.now() - this.startTime));\r\n }\r\n}\r\n","// src/components/ToastManager.js\r\n\"use strict\";\r\n\r\n// import { createToastContainer } from \"./ToastContainer.js\";\r\nimport { createToastElement } from \"./Toast.js\";\r\nimport { removeElement } from \"../utils/dom.js\";\r\nimport { createEmergencyToast, safeSetTimeout } from \"./toast-utils.js\";\r\nimport { getOrCreateToastContainer } from \"../utils/containerRegistry.js\";\r\nimport { setPosition } from \"../utils/position.js\";\r\nimport { PausableTimer } from \"../utils/PausableTimer.js\";\r\n\r\n// Config\r\nconst MAX_VISIBLE = 3;\r\n\r\n// State\r\nconst active = new Map(); // key -> { outer, toast, count, timeout }\r\nconst pending = new Map(); // key -> { options, count, rafId }\r\nconst queue = []; // [{ options, key, count }]\r\nlet visibleCount = 0;\r\n\r\n// djb2 hash for full-message dedupe\r\nfunction hashString(str) {\r\n let h = 5381;\r\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\r\n return h >>> 0;\r\n}\r\n\r\n/**\r\n * Creates a unique key for a toast notification based on its type, message, and position.\r\n * This key is used to identify and deduplicate identical toast notifications.\r\n * @param {Object} options - Toast options with type, message, and position.\r\n * @returns {string} A unique key for the toast notification.\r\n */\r\nfunction makeKey({ type = \"info\", message = \"\", position = \"bottom-right\" }) {\r\n return [\r\n String(type).trim().toLowerCase(),\r\n hashString(String(message)).toString(16),\r\n String(position).trim().toLowerCase(),\r\n ].join(\"|\");\r\n}\r\n\r\n/**\r\n * Shows a toast notification with the given options.\r\n * If there is already an active toast with the same type, message, and position,\r\n * it will be grouped immediately and the count will be incremented.\r\n * If there is already a pending toast with the same type, message, and position,\r\n * it will be coalesced and the count will be incremented.\r\n * If there is no capacity left (i.e. the number of visible toasts is at the maximum),\r\n * the grouped request will be enqueued and processed later.\r\n * @param {Object} options - Toast options with type, message, and position.\r\n * @returns {Promise<void>} A promise that resolves when the toast is fully created and displayed.\r\n */\r\nexport async function showToast(options = {}) {\r\n const key = makeKey(options);\r\n\r\n // If already active: group immediately\r\n if (active.has(key)) {\r\n const data = active.get(key);\r\n data.count++;\r\n // clearTimeout(data.timeout);\r\n // data.timeout = await safeSetTimeout(\r\n // () => closeToast(data.toast),\r\n // (options.duration || 1800) + 10\r\n // );\r\n\r\n // Reset timer with new duration\r\n data.timer.clear();\r\n data.timer = createDismissTimer(data.toast, options);\r\n setupPauseOnHover(data);\r\n updateBadge(data);\r\n return;\r\n }\r\n\r\n // If coalescing is already scheduled for this key, just increment the pending count\r\n if (pending.has(key)) {\r\n pending.get(key).count++;\r\n return;\r\n }\r\n\r\n // Start coalescing identical calls in the same frame\r\n const entry = { options, count: 1, rafId: 0 };\r\n pending.set(key, entry);\r\n\r\n entry.rafId = requestAnimationFrame(async () => {\r\n // finalize batch for this key\r\n const current = pending.get(key);\r\n if (!current) return;\r\n pending.delete(key);\r\n\r\n // If capacity full, enqueue the grouped request\r\n if (visibleCount >= MAX_VISIBLE) {\r\n queue.push({ options: current.options, key, count: current.count });\r\n drainQueue();\r\n return;\r\n }\r\n\r\n // Otherwise create immediately with the grouped count\r\n await createOne(current.options, key, current.count);\r\n });\r\n}\r\n\r\n/**\r\n * Creates a single toast notification with the given options and initial count.\r\n * Will create and mount the toast element, and setup a timer to auto-dismiss.\r\n * If the toast creation fails, it will fallback to an emergency toast.\r\n * @param {Object} options - Toast options with type, message, and position.\r\n * @param {string} key - Unique key for the toast.\r\n * @param {number} initialCount - Initial count for the toast.\r\n * @returns {Promise<void>} A promise that resolves when the toast is fully created and displayed.\r\n */\r\nasync function createOne(options, key, initialCount) {\r\n try {\r\n visibleCount++;\r\n\r\n const container = await getOrCreateToastContainer(options, setPosition);\r\n\r\n // Build the toast element\r\n const toast = await createToastElement(options, closeToast);\r\n if (!toast) throw new Error(\"Toast element creation failed\");\r\n\r\n // Outer wrapper (badge surface; visible overflow)\r\n const outer = document.createElement(\"div\");\r\n Object.assign(outer.style, {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n overflow: \"visible\",\r\n marginBottom: \"10px\",\r\n zIndex: \"0\",\r\n width: \"100%\",\r\n });\r\n\r\n // Inner wrapper (clip progress bar & rounded corners)\r\n const inner = document.createElement(\"div\");\r\n Object.assign(inner.style, {\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n borderRadius: options.borderRadius || \"8px\",\r\n zIndex: \"1\",\r\n });\r\n\r\n inner.appendChild(toast);\r\n outer.appendChild(inner);\r\n\r\n // Mount\r\n if (container.id.includes(\"toast-container-\")) {\r\n container.appendChild(outer);\r\n }\r\n\r\n // Determine if should pause on hover (default: true if has CTA)\r\n const shouldPauseOnHover =\r\n options.pauseOnHover !== false &&\r\n (options.pauseOnHover === true || !!options.cta);\r\n\r\n // Track\r\n const data = {\r\n outer,\r\n toast,\r\n count: Math.max(1, initialCount | 0),\r\n timeout: null,\r\n pauseOnHover: shouldPauseOnHover,\r\n };\r\n active.set(key, data);\r\n toast._key = key;\r\n\r\n if (data.count > 1) updateBadge(data);\r\n // Create and start timer\r\n data.timer = createDismissTimer(toast, options);\r\n setupPauseOnHover(data);\r\n\r\n // Auto-dismiss timer\r\n // data.timeout = await safeSetTimeout(\r\n // () => closeToast(toast),\r\n // (options.duration || 1800) + 10\r\n // );\r\n } catch (err) {\r\n // Rollback slot and fall back\r\n visibleCount = Math.max(0, visibleCount - 1);\r\n console.warn(\"Toast creation failed:\", err);\r\n const el =\r\n document.querySelector('[id^=\"toast-container-\"]') || document.body;\r\n el.appendChild(createEmergencyToast(options, closeToast));\r\n }\r\n}\r\n\r\n/**\r\n * Creates a PausableTimer that auto-closes a toast after a delay.\r\n * @param {HTMLElement} toast - The toast element to auto-close.\r\n * @param {Object} options - Toast options with duration.\r\n * @returns {PausableTimer} A timer that can be paused, resumed, or cleared.\r\n */\r\nfunction createDismissTimer(toast, options) {\r\n const delay = (options.duration || 1800) + 10;\r\n const timer = new PausableTimer(() => closeToast(toast), delay);\r\n timer.start();\r\n return timer;\r\n}\r\n\r\nfunction setupPauseOnHover(data) {\r\n if (!data.pauseOnHover || !data.outer || !data.timer) return;\r\n\r\n const { outer, timer } = data;\r\n\r\n // Mouse events\r\n const onMouseEnter = () => {\r\n timer.pause();\r\n };\r\n\r\n const onMouseLeave = () => {\r\n timer.resume();\r\n };\r\n\r\n // Focus events (for keyboard users)\r\n const onFocusIn = (e) => {\r\n // Only pause if focus is on interactive elements (CTA, close button)\r\n if (e.target.matches(\"button, a, [tabindex]\")) {\r\n timer.pause();\r\n }\r\n };\r\n\r\n const onFocusOut = (e) => {\r\n // Only resume if focus is leaving the toast entirely\r\n if (!outer.contains(e.relatedTarget)) {\r\n timer.resume();\r\n }\r\n };\r\n\r\n // Add event listeners\r\n outer.addEventListener(\"mouseenter\", onMouseEnter);\r\n outer.addEventListener(\"mouseleave\", onMouseLeave);\r\n outer.addEventListener(\"focusin\", onFocusIn);\r\n outer.addEventListener(\"focusout\", onFocusOut);\r\n\r\n // Store cleanup function\r\n outer._pauseCleanup = () => {\r\n outer.removeEventListener(\"mouseenter\", onMouseEnter);\r\n outer.removeEventListener(\"mouseleave\", onMouseLeave);\r\n outer.removeEventListener(\"focusin\", onFocusIn);\r\n outer.removeEventListener(\"focusout\", onFocusOut);\r\n };\r\n}\r\n\r\n/**\r\n * Closes a toast notification immediately.\r\n * If the toast is not found in the active toasts map, this function does nothing.\r\n * @param {HTMLElement} toast - The toast element to close.\r\n * @returns {Promise<void>} A promise that resolves when the toast is fully removed from the DOM.\r\n */\r\nexport async function closeToast(toast) {\r\n if (!toast || !toast._key) return;\r\n const data = active.get(toast._key);\r\n if (!data) return;\r\n\r\n // Clear timer and cleanup pause events\r\n data.timer?.clear();\r\n data.outer?._pauseCleanup?.();\r\n // clearTimeout(data.timeout);\r\n active.delete(toast._key);\r\n visibleCount = Math.max(0, visibleCount - 1);\r\n\r\n // Remove badge if present\r\n data.outer.querySelector(\".toast-count-badge\")?.remove();\r\n\r\n // Remove wrapper after transition ends (or fallback)\r\n await removeWithTransition(data.outer);\r\n\r\n // Drain queue after a slot frees\r\n drainQueue();\r\n}\r\n\r\nfunction drainQueue() {\r\n // Fill available slots; coalesce queued entries against active if they became active meanwhile\r\n while (visibleCount < MAX_VISIBLE && queue.length) {\r\n const item = queue.shift();\r\n if (active.has(item.key)) {\r\n const data = active.get(item.key);\r\n data.count += item.count;\r\n updateBadge(data);\r\n continue;\r\n }\r\n // Create without awaiting to keep loop responsive; visibleCount is incremented inside createOne\r\n void createOne(item.options, item.key, item.count);\r\n }\r\n}\r\n\r\nfunction removeWithTransition(el) {\r\n return new Promise((resolve) => {\r\n let done = false;\r\n const finish = () => {\r\n if (done) return;\r\n done = true;\r\n removeElement(el);\r\n resolve();\r\n };\r\n\r\n // Listen on the immediate child (inner wrapper) if possible\r\n const child = el.firstElementChild || el;\r\n const onEnd = (e) => {\r\n if (e.target !== child) return;\r\n child.removeEventListener(\"transitionend\", onEnd, true);\r\n finish();\r\n };\r\n\r\n child.addEventListener(\"transitionend\", onEnd, true);\r\n // Hard fallback if no transition fires\r\n setTimeout(() => {\r\n child.removeEventListener(\"transitionend\", onEnd, true);\r\n finish();\r\n }, 700);\r\n });\r\n}\r\n\r\nfunction updateBadge({ outer, count }) {\r\n if (count < 2) {\r\n outer.querySelector(\".toast-count-badge\")?.remove();\r\n return;\r\n }\r\n let badge = outer.querySelector(\".toast-count-badge\");\r\n if (!badge) {\r\n badge = document.createElement(\"span\");\r\n badge.className = \"toast-count-badge\";\r\n badge.setAttribute(\"aria-label\", `${count} identical notifications`);\r\n Object.assign(badge.style, {\r\n position: \"absolute\",\r\n top: \"6px\",\r\n right: \"6px\",\r\n backgroundColor: \"#f44336\",\r\n color: \"#fff\",\r\n borderRadius: \"50%\",\r\n minWidth: \"20px\",\r\n height: \"20px\",\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n border: \"2px solid #fff\",\r\n boxShadow: \"0 2px 6px rgba(0,0,0,0.3)\",\r\n zIndex: \"2\",\r\n pointerEvents: \"none\",\r\n transition: \"transform 150ms ease\",\r\n });\r\n outer.appendChild(badge);\r\n }\r\n badge.textContent = count > 99 ? \"99+\" : String(count);\r\n badge.style.transform = \"scale(1.2)\";\r\n setTimeout(() => (badge.style.transform = \"scale(1)\"), 150);\r\n}\r\n","// src/index.js\r\n\"use strict\";\r\n\r\nimport { closeToast, showToast } from \"./components/ToastManager.js\";\r\nimport { getOrCreateToastContainer } from \"./utils/containerRegistry.js\";\r\nimport { appendChild, getTextColor } from \"./utils/dom.js\";\r\nimport { setPosition } from \"./utils/position.js\";\r\n\r\n// Protected state with fallbacks\r\nlet defaultColors = {\r\n success: \"#28a745\",\r\n error: \"#dc3545\",\r\n warning: \"#ffc107\",\r\n info: \"#17a2b8\",\r\n};\r\n\r\nlet defaultMessages = {\r\n success: \"Operation completed successfully!\",\r\n error: \"Something went wrong!\",\r\n warning: \"Warning message!\",\r\n info: \"Information message!\",\r\n};\r\n\r\n/**\r\n * Create toast with satellite-grade reliability\r\n */\r\n// Toast queue for calls before DOM ready\r\nconst pendingToasts = [];\r\n\r\n// Flag to indicate DOM ready for toast execution\r\nlet domReady = false;\r\n\r\n// DOM ready check\r\nasync function checkDOMReady() {\r\n if (domReady) return;\r\n\r\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\r\n if (\r\n document.readyState === \"complete\" ||\r\n document.readyState === \"interactive\"\r\n ) {\r\n domReady = true;\r\n // Flush queued toasts after 2s delay\r\n pendingToasts.forEach((options) =>\r\n setTimeout(() => createToastNow(options), 2000)\r\n );\r\n pendingToasts.length = 0;\r\n } else {\r\n // Wait for DOMContentLoaded\r\n document.addEventListener(\r\n \"DOMContentLoaded\",\r\n () => {\r\n domReady = true;\r\n pendingToasts.forEach((options) =>\r\n setTimeout(() => createToastNow(options), 2000)\r\n );\r\n pendingToasts.length = 0;\r\n },\r\n { once: true }\r\n );\r\n }\r\n }\r\n}\r\n\r\n// Core toast creation logic\r\nasync function createToastNow(options = {}) {\r\n try {\r\n const sanitizedOptions = await sanitizeToastOptions(options);\r\n await createFirstToastContainer(sanitizedOptions);\r\n await showToast(sanitizedOptions);\r\n } catch (error) {\r\n console.error(\"CreateToast failed:\", error);\r\n\r\n const safeMessage =\r\n typeof options?.message === \"string\" && options?.message !== null\r\n ? `${options?.message?.substring(0, 200)} toast creation failed!`\r\n : \"Toast creation failed!\";\r\n\r\n alert(safeMessage);\r\n }\r\n}\r\n\r\nlet initialDelayDone = false; // flag to ensure single execution\r\n\r\n// Public API\r\nasync function createToast(options = {}) {\r\n // Check browser environment\r\n const isBrowser =\r\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\r\n\r\n if (!isBrowser) {\r\n console.warn(\r\n \"ToastNotification: running in non-browser environment, no DOM available.\"\r\n );\r\n return;\r\n }\r\n\r\n // Check if DOM ready\r\n await checkDOMReady();\r\n\r\n if (!domReady) {\r\n // Queue for later execution\r\n pendingToasts.push(options);\r\n return;\r\n }\r\n\r\n // If DOM ready → execute after 2s delay\r\n if (!initialDelayDone) {\r\n // First call → wait 2 seconds\r\n initialDelayDone = true;\r\n setTimeout(await createToastNow(options), 2000);\r\n } else {\r\n // Subsequent calls → run immediately\r\n await createToastNow(options);\r\n }\r\n}\r\n\r\nasync function createFirstToastContainer(options) {\r\n try {\r\n // Single source of truth for containers; prevents same-id duplicates\r\n const toastContainer = await getOrCreateToastContainer(\r\n options,\r\n setPosition\r\n );\r\n return toastContainer;\r\n } catch (error) {\r\n console.error(\"Failed to create toast container:\", error);\r\n // Fallback: return body element\r\n return document.body;\r\n }\r\n}\r\n\r\n/**\r\n * Sanitizes and normalizes toast options.\r\n * Fills in defaults, validates input, and ensures colors & messages are set.\r\n * @param {Object} options - User-provided toast options\r\n * @returns {Promise<Object>} final sanitized toast options\r\n */\r\nasync function sanitizeToastOptions(options) {\r\n const contPosition = options?.position?.toLowerCase()?.trim();\r\n const contMaxWidth =\r\n contPosition?.includes(\"top-full-width\") ||\r\n contPosition?.includes(\"bottom-full-width\")\r\n ? \"100vw\"\r\n : \"400px\";\r\n\r\n const defaults = {\r\n pauseOnHover: undefined,\r\n duration: 1800,\r\n position: \"bottom-right\",\r\n type: \"info\",\r\n borderRadius: \"50px\",\r\n backgroundColor: undefined,\r\n textColor: undefined,\r\n showCloseButton: true,\r\n animationDuration: \"0.4s\",\r\n animationType: \"fade\",\r\n animationEasing: \"ease\",\r\n showProgressBar: true,\r\n progressColor: undefined,\r\n progressHeight: \"4px\",\r\n progressPosition: \"bottom\",\r\n fontPosition: \"relative\",\r\n fontPadding: undefined,\r\n fontBorderRadius: undefined,\r\n fontBackgroundColor: undefined,\r\n fontFamily:\r\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\r\n fontSize: \"14px\",\r\n fontWeight: \"400\",\r\n fontLineHeight: \"1.4\",\r\n fontDirection: \"auto\",\r\n wrapText: \"normal\",\r\n maxWidth: contMaxWidth,\r\n };\r\n\r\n // Merge defaults with user options\r\n const final = {\r\n ...defaults,\r\n ...(typeof options === \"object\" && !Array.isArray(options) ? options : {}),\r\n };\r\n\r\n // Ensure message property separately\r\n final.message = options?.message ?? final.message;\r\n\r\n try {\r\n // Background color fallback based on type or system preference\r\n if (!final.backgroundColor) {\r\n final.backgroundColor =\r\n defaultColors?.[final.type] ??\r\n (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n ? \"#f5f5f5\"\r\n : \"#111111\");\r\n }\r\n\r\n // Default message if not provided\r\n final.message =\r\n final.message || defaultMessages?.[final.type] || \"No Message Provided!\";\r\n\r\n // Ensure textColor is set\r\n if (!final.textColor && final.backgroundColor) {\r\n final.textColor = await getTextColor(final.backgroundColor);\r\n }\r\n\r\n // Ensure progressColor is set\r\n if (!final.progressColor && final.backgroundColor) {\r\n final.progressColor = await getTextColor(final.backgroundColor);\r\n }\r\n } catch (error) {\r\n console.warn(\"Option processing failed:\", error);\r\n }\r\n\r\n // Safety check for message type\r\n if (typeof final.message !== \"string\") {\r\n final.message = \"No Message Provided!\";\r\n }\r\n\r\n return final;\r\n}\r\n\r\n/**\r\n * Set default colors with validation\r\n */\r\nfunction setDefaultColors(colors) {\r\n try {\r\n if (colors && typeof colors === \"object\" && !Array.isArray(colors)) {\r\n defaultColors = { ...defaultColors, ...colors };\r\n }\r\n } catch (error) {\r\n console.error(\"setDefaultColors failed:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Set default messages with validation\r\n */\r\nfunction setDefaultMessages(messages) {\r\n try {\r\n if (messages && typeof messages === \"object\" && !Array.isArray(messages)) {\r\n defaultMessages = { ...defaultMessages, ...messages };\r\n }\r\n } catch (error) {\r\n console.error(\"setDefaultMessages failed:\", error);\r\n }\r\n}\r\n\r\nfunction noop() {\r\n const toast = document.querySelector('[id^=\"toast-\"]:not([id*=\"container\"])');\r\n closeToast(toast);\r\n}\r\n\r\n// Module exports\r\nexport { createToast, setDefaultColors, setDefaultMessages, noop };\r\n\r\n// Global assignment with protection\r\ntry {\r\n // UMD/Global support\r\n if (typeof window !== \"undefined\") {\r\n window.customizableToast = {\r\n createToast,\r\n setDefaultColors,\r\n setDefaultMessages,\r\n };\r\n }\r\n} catch (error) {\r\n console.error(\"Global assignment failed:\", error);\r\n}\r\n"],"names":["async","generateUniqueId","prefix","Date","now","Math","floor","random","getTextColor","toastBg","color","Error","r","g","b","startsWith","hex","substring","length","parseInt","match","colorArray","black","white","toLowerCase","isNaN","l1","l2","max","min","contrast","error","applyRichStyling","toast","options","onClose","animDurationMs","duration","endsWith","parsed","parseFloat","parseAnimationDuration","animationDuration","Object","assign","style","background","backgroundColor","padding","marginBottom","borderRadius","overflow","display","alignItems","justifyContent","boxShadow","minWidth","maxWidth","opacity","position","transition","animationEasing","transform","zIndex","_animationDuration","messageSpan","document","createElement","fontPosition","flex","fontPadding","fontBorderRadius","fontBackgroundColor","fontFamily","fontSize","fontWeight","lineHeight","fontLineHeight","textColor","userSelect","wordBreak","direction","fontDirection","webkitLineClamp","webkitBoxOrient","whiteSpace","wrapText","textOverflow","lineClamp","boxOrient","textContent","message","setAttribute","appendChild","cfg","cta","label","isLink","href","variant","el","target","rel","type","ariaLabel","marginLeft","border","cursor","flexShrink","addEventListener","onClick","ret","e","then","autoClose","createCTA","showCloseButton","closeButton","onclick","_cleanupCloseButton","createCloseButton","showProgressBar","progressBar","left","height","progressHeight","progressColor","width","progressPosition","setTimeout","offsetWidth","forceReflow","createProgressBar","requestAnimationFrame","runToastAnimation","createEmergencyToast","emergency","id","innerHTML","_isEmergencyToast","parentNode","removeChild","emergencyError","alert","alertError","createToastElement","querySelector","tagName","fallbackTag","fallbackPrefix","fallbackEl","fallbackError","createElementWithId","containerRegistry","Map","containerLocks","getContainerId","String","trim","replace","normalizePositionKey","getOrCreateToastContainer","setPosition","has","get","p","cached","isConnected","getElementById","body","inset","flexDirection","all","querySelectorAll","i","remove","set","delete","container","top","bottom","right","resetContainerStyles","positionFlags","pos","hasTop","includes","hasBottom","hasLeft","hasRight","hasCenter","hasFullWidth","parsePosition","flags","handleFullWidthPositions","handleCenterPositions","applyStandardPositioning","PausableTimer","constructor","callback","delay","this","remaining","startTime","timeoutId","isPaused","isCompleted","start","pause","clearTimeout","resume","clear","getRemainingTime","active","pending","queue","visibleCount","hashString","str","h","charCodeAt","showToast","key","toString","join","makeKey","data","count","timer","createDismissTimer","setupPauseOnHover","updateBadge","entry","rafId","current","push","drainQueue","createOne","initialCount","closeToast","outer","inner","shouldPauseOnHover","pauseOnHover","timeout","_key","err","onMouseEnter","onMouseLeave","onFocusIn","matches","onFocusOut","contains","relatedTarget","_pauseCleanup","removeEventListener","_data$timer","_data$outer","_data$outer$_pauseCle","_data$outer$querySele","call","Promise","resolve","done","finish","_el$parentNode","pointerEvents","hideError","removeElement","child","firstElementChild","onEnd","item","shift","_outer$querySelector","badge","className","defaultColors","success","warning","info","defaultMessages","pendingToasts","domReady","createToastNow","sanitizedOptions","_options$position","contPosition","contMaxWidth","final","undefined","animationType","Array","isArray","_defaultMessages","_defaultColors","window","matchMedia","sanitizeToastOptions","createFirstToastContainer","_options$message","safeMessage","initialDelayDone","createToast","readyState","forEach","once","checkDOMReady","setDefaultColors","colors","setDefaultMessages","messages","customizableToast"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/id.js","../src/utils/dom.js","../src/components/toast-utils.js","../src/components/Toast.js","../src/utils/containerRegistry.js","../src/utils/position.js","../src/utils/PausableTimer.js","../src/components/ToastManager.js","../src/index.js"],"sourcesContent":["// src/utils/id.js\r\n\"use strict\";\r\n\r\n/**\r\n * Generate unique ID for DOM elements to avoid conflicts\r\n * @param {string} prefix - Optional prefix for ID\r\n * @returns {string} Unique ID\r\n */\r\nexport async function generateUniqueId(prefix) {\r\n return `${prefix}-${Date.now()}-${Math.floor(Math.random() * 100000)}`;\r\n}\r\n","// src/utils/dom.js\r\n\"use strict\";\r\n\r\nimport { generateUniqueId } from \"./id.js\";\r\n\r\n/**\r\n * Multi-layer fallback DOM element creation\r\n */\r\nexport async function createElementWithId(tagName, prefix) {\r\n // PRIMARY: Standard createElement\r\n try {\r\n if (!tagName || !prefix) throw new Error(`tagName and prefix is required`);\r\n\r\n const el = document.createElement(tagName);\r\n el.id = await generateUniqueId(prefix);\r\n return el;\r\n } catch (error) {\r\n console.warn(`Primary createElement failed for`, error);\r\n\r\n // FALLBACK-A: Try div as alternative\r\n try {\r\n const fallbackTag = \"div\";\r\n const fallbackPrefix = \"fallback\";\r\n const fallbackEl = document.createElement(fallbackTag);\r\n fallbackEl.id = await generateUniqueId(fallbackPrefix);\r\n fallbackEl.setAttribute(\"data-original-tag\", fallbackTag);\r\n return fallbackEl;\r\n } catch (fallbackError) {\r\n console.error(\"All DOM creation methods failed:\", fallbackError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Multi-strategy appendChild with graceful degradation\r\n */\r\nexport async function appendChild(parent, child) {\r\n if (!parent || !child) return false;\r\n\r\n // PRIMARY: Standard appendChild\r\n try {\r\n if (!parent.contains(child)) {\r\n parent.appendChild(child);\r\n return true;\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn(\"Primary appendChild failed:\", error);\r\n\r\n // FALLBACK-A: insertAdjacentElement\r\n try {\r\n parent.insertAdjacentElement(\"beforeend\", child);\r\n return true;\r\n } catch (fallbackError) {\r\n console.warn(\"Fallback appendChild failed:\", fallbackError);\r\n\r\n // FALLBACK-B: Manual positioning\r\n // Emergency fallback removed: avoid using outerHTML (drops listeners & risks XSS).\r\n // Final attempt: clone and append using standard APIs.\r\n try {\r\n if (parent === document.body) {\r\n const clone = child.cloneNode(true);\r\n parent.appendChild(clone);\r\n return true;\r\n }\r\n } catch (emergencyError) {\r\n console.error(\"All append strategies failed:\", emergencyError);\r\n return false;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Safe element removal with multiple strategies\r\n */\r\nexport async function removeElement(el) {\r\n if (!el) return true;\r\n\r\n // PRIMARY: parentNode.removeChild\r\n try {\r\n if (el?.parentNode?.id.includes(\"toast-container-\")) {\r\n el.parentNode.removeChild(el);\r\n return true;\r\n }\r\n } catch (error) {\r\n console.warn(\"Primary removal failed:\", error);\r\n\r\n // FALLBACK-A: element.remove()\r\n try {\r\n if (el.remove) {\r\n el.remove();\r\n return true;\r\n }\r\n } catch (fallbackError) {\r\n console.warn(\"Fallback removal failed:\", fallbackError);\r\n\r\n // FALLBACK-B: Hide instead of remove\r\n try {\r\n el.style.display = \"none\";\r\n el.style.opacity = \"0\";\r\n el.style.pointerEvents = \"none\";\r\n el.style.position = \"absolute\";\r\n el.style.left = \"-9999px\";\r\n return true;\r\n } catch (hideError) {\r\n console.error(\"All removal strategies failed:\", hideError);\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Animation duration parser with fallbacks\r\n */\r\nexport async function parseAnimationDuration(duration) {\r\n // PRIMARY: Parse provided duration\r\n try {\r\n if (typeof duration === \"number\" && duration > 0) return duration;\r\n if (typeof duration === \"string\") {\r\n if (duration.endsWith(\"s\") && !duration.endsWith(\"ms\")) {\r\n const parsed = parseFloat(duration) * 1000;\r\n return parsed > 0 ? parsed : 500;\r\n }\r\n const parsed = parseFloat(duration);\r\n return parsed > 0 ? parsed : 500;\r\n }\r\n } catch (error) {\r\n console.warn(\"Duration parsing failed:\", error);\r\n }\r\n\r\n // FALLBACK: Safe default\r\n return 500;\r\n}\r\n\r\n/**\r\n * Force reflow with error protection\r\n */\r\nexport function forceReflow(el) {\r\n try {\r\n return el?.offsetWidth || 0;\r\n } catch (error) {\r\n console.warn(\"Force reflow failed:\", error);\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Query selector shortcut with optional root.\r\n * @param {string} selector\r\n * @param {Document|HTMLElement} [root=document]\r\n * @returns {Element|null}\r\n */\r\nexport function query(selector, root = document) {\r\n return root.querySelector(selector);\r\n}\r\n\r\n/**\r\n * Determine text color based on background color.\r\n * @param {string} toastBg Toast background color in hex, rgb, or rgba format.\r\n * @returns {Promise<string>} Text color, either `\"black\"` or `\"white\"`.\r\n */\r\nexport async function getTextColor(toastBg, opa) {\r\n if (!toastBg) return \"snow\";\r\n try {\r\n if (toastBg === \"transparent\") return \"snow\";\r\n let result = await getAccessibleTextColor(toastBg, {\r\n underlyingColor: toastBg || \"#ffffff\", // agar toast background semi-transparent hai to specify karo\r\n threshold: opa || 4.5,\r\n });\r\n return result;\r\n } catch (error) {\r\n console.warn(\"TextColor calculation failed:\", error);\r\n return \"snow\";\r\n }\r\n}\r\n\r\n/**\r\n * getAccessibleTextColor(bgColor, options)\r\n * - bgColor: any CSS color string (hex, rgb(), rgba(), hsl(), named color, \"transparent\", \"var(--x)\", ...)\r\n * - options: {\r\n * threshold: number (default 4.5) // WCAG AA for normal text\r\n * underlyingColor: cssColorString | {r,g,b} // used if bgColor is semi-transparent\r\n * resolveVarElement: HTMLElement (optional) // element used to resolve CSS vars like var(--x)\r\n * }\r\n *\r\n * Returns:\r\n * {\r\n * color: '#rrggbb', // recommended text color string (hex)\r\n * contrast: number, // computed contrast ratio against background\r\n * meetsAA: boolean,\r\n * blackContrast: number,\r\n * whiteContrast: number,\r\n * used: 'black'|'white'|'generated'\r\n * }\r\n */\r\n\r\n// (function (global) {\r\n// function _toHex(n) {\r\n// return (\"0\" + n.toString(16)).slice(-2);\r\n// }\r\n// function rgbToHex(r, g, b) {\r\n// return \"#\" + _toHex(r) + _toHex(g) + _toHex(b);\r\n// }\r\n\r\n// function parseCssColor(input, resolveVarElement) {\r\n// if (!input || typeof input !== \"string\") return null;\r\n// let s = input.trim();\r\n\r\n// // try to resolve CSS var(...) if passed\r\n// if (s.startsWith(\"var(\") && typeof window !== \"undefined\") {\r\n// try {\r\n// const varName = s.slice(4, -1).trim();\r\n// const el = resolveVarElement || document.documentElement;\r\n// const val = getComputedStyle(el).getPropertyValue(varName).trim();\r\n// if (val) return parseCssColor(val, resolveVarElement);\r\n// } catch (e) {}\r\n// }\r\n\r\n// // use canvas 2D parser if available (works in browsers)\r\n// try {\r\n// if (typeof document !== \"undefined\") {\r\n// const ctx = document.createElement(\"canvas\").getContext(\"2d\");\r\n// ctx.fillStyle = \"#000\";\r\n// ctx.fillStyle = s; // may throw for invalid color\r\n// const computed = ctx.fillStyle; // normalized string like \"rgb(...)\" or \"#rrggbb\" or \"rgba(...)\"\r\n// // rgba / rgb\r\n// const rgbaMatch = computed.match(\r\n// /^rgba?\\((\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*([0-9.]+))?\\)$/i\r\n// );\r\n// if (rgbaMatch) {\r\n// return {\r\n// r: +rgbaMatch[1],\r\n// g: +rgbaMatch[2],\r\n// b: +rgbaMatch[3],\r\n// a: rgbaMatch[4] === undefined ? 1 : +rgbaMatch[4],\r\n// };\r\n// }\r\n// // hex\r\n// if (computed[0] === \"#\") {\r\n// let hex = computed.slice(1);\r\n// if (hex.length === 3)\r\n// hex = hex\r\n// .split(\"\")\r\n// .map((ch) => ch + ch)\r\n// .join(\"\");\r\n// if (hex.length === 6) {\r\n// return {\r\n// r: parseInt(hex.slice(0, 2), 16),\r\n// g: parseInt(hex.slice(2, 4), 16),\r\n// b: parseInt(hex.slice(4, 6), 16),\r\n// a: 1,\r\n// };\r\n// }\r\n// if (hex.length === 8) {\r\n// return {\r\n// r: parseInt(hex.slice(0, 2), 16),\r\n// g: parseInt(hex.slice(2, 4), 16),\r\n// b: parseInt(hex.slice(4, 6), 16),\r\n// a: parseInt(hex.slice(6, 8), 16) / 255,\r\n// };\r\n// }\r\n// }\r\n// }\r\n// } catch (e) {\r\n// // continue to manual parsing\r\n// }\r\n\r\n// // manual parse fallbacks (rgb()/rgba()/hex short/long)\r\n// const hexMatch = s.match(/^#([0-9a-fA-F]{3,8})$/);\r\n// if (hexMatch) {\r\n// let h = hexMatch[1];\r\n// if (h.length === 3)\r\n// h = h\r\n// .split(\"\")\r\n// .map((c) => c + c)\r\n// .join(\"\");\r\n// if (h.length === 4) {\r\n// // rgba short\r\n// const r = parseInt(h[0] + h[0], 16),\r\n// g = parseInt(h[1] + h[1], 16),\r\n// b = parseInt(h[2] + h[2], 16),\r\n// a = parseInt(h[3] + h[3], 16) / 255;\r\n// return { r, g, b, a };\r\n// }\r\n// if (h.length === 6) {\r\n// return {\r\n// r: parseInt(h.slice(0, 2), 16),\r\n// g: parseInt(h.slice(2, 4), 16),\r\n// b: parseInt(h.slice(4, 6), 16),\r\n// a: 1,\r\n// };\r\n// }\r\n// if (h.length === 8) {\r\n// return {\r\n// r: parseInt(h.slice(0, 2), 16),\r\n// g: parseInt(h.slice(2, 4), 16),\r\n// b: parseInt(h.slice(4, 6), 16),\r\n// a: parseInt(h.slice(6, 8), 16) / 255,\r\n// };\r\n// }\r\n// }\r\n\r\n// const rgbMatch = s.match(/^rgba?\\(([^)]+)\\)$/i);\r\n// if (rgbMatch) {\r\n// const parts = rgbMatch[1].split(\",\").map((p) => p.trim());\r\n// let r = parseFloat(parts[0]),\r\n// g = parseFloat(parts[1]),\r\n// b = parseFloat(parts[2]);\r\n// let a = parts[3] === undefined ? 1 : parseFloat(parts[3]);\r\n// // handle percent values e.g. rgb(50% 50% 50%)\r\n// if (parts[0].endsWith(\"%\")) {\r\n// r = Math.round((r / 100) * 255);\r\n// g = Math.round((parseFloat(parts[1]) / 100) * 255);\r\n// b = Math.round((parseFloat(parts[2]) / 100) * 255);\r\n// }\r\n// return { r: Math.round(r), g: Math.round(g), b: Math.round(b), a: a };\r\n// }\r\n\r\n// // last resort: named css color map for few common names (expand as needed)\r\n// const named = {\r\n// black: { r: 0, g: 0, b: 0, a: 1 },\r\n// white: { r: 255, g: 255, b: 255, a: 1 },\r\n// transparent: { r: 0, g: 0, b: 0, a: 0 },\r\n// // add more if you want...\r\n// };\r\n// const lower = s.toLowerCase();\r\n// if (named[lower]) return named[lower];\r\n\r\n// return null;\r\n// }\r\n\r\n// function blendOver(fg, bg) {\r\n// // fg: {r,g,b,a}, bg: {r,g,b}\r\n// if (fg.a === undefined || fg.a >= 1) return { r: fg.r, g: fg.g, b: fg.b };\r\n// if (!bg) bg = { r: 255, g: 255, b: 255 };\r\n// const a = fg.a;\r\n// return {\r\n// r: Math.round(fg.r * a + bg.r * (1 - a)),\r\n// g: Math.round(fg.g * a + bg.g * (1 - a)),\r\n// b: Math.round(fg.b * a + bg.b * (1 - a)),\r\n// };\r\n// }\r\n\r\n// function srgbToLinear(c) {\r\n// c = c / 255;\r\n// return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\r\n// }\r\n// function linearToSrgbComp(lin) {\r\n// if (lin <= 0.0031308) return Math.round(lin * 12.92 * 255);\r\n// return Math.round((1.055 * Math.pow(lin, 1 / 2.4) - 0.055) * 255);\r\n// }\r\n// function relativeLuminance(rgb) {\r\n// const R = srgbToLinear(rgb.r);\r\n// const G = srgbToLinear(rgb.g);\r\n// const B = srgbToLinear(rgb.b);\r\n// return 0.2126 * R + 0.7152 * G + 0.0722 * B;\r\n// }\r\n// function contrastRatioFromL(l1, l2) {\r\n// const L1 = Math.max(l1, l2),\r\n// L2 = Math.min(l1, l2);\r\n// return (L1 + 0.05) / (L2 + 0.05);\r\n// }\r\n\r\n// function genGrayHexFromLinearLum(lin) {\r\n// lin = Math.min(1, Math.max(0, lin));\r\n// const c = linearToSrgbComp(lin);\r\n// return rgbToHex(c, c, c);\r\n// }\r\n\r\n// async function getAccessibleTextColor(bgColor, options) {\r\n// options = options || {};\r\n// const threshold = options.threshold || 4.5;\r\n\r\n// // parse background color\r\n// const parsed = parseCssColor(bgColor, options.resolveVarElement);\r\n// if (!parsed) {\r\n// // fallback: treat as white background\r\n// console.warn(\"getAccessibleTextColor: unable to parse color:\", bgColor);\r\n// return {\r\n// color: \"#000000\",\r\n// contrast: 21,\r\n// meetsAA: true,\r\n// blackContrast: 21,\r\n// whiteContrast: 1,\r\n// used: \"black\",\r\n// };\r\n// }\r\n\r\n// // handle transparency by blending over supplied underlyingColor or document body background or white\r\n// let bgRgb;\r\n// if (parsed.a !== undefined && parsed.a < 1) {\r\n// let under = options.underlyingColor;\r\n// if (under) {\r\n// const p =\r\n// typeof under === \"string\"\r\n// ? parseCssColor(under, options.resolveVarElement)\r\n// : under;\r\n// if (p) under = { r: p.r, g: p.g, b: p.b };\r\n// else under = { r: 255, g: 255, b: 255 };\r\n// } else {\r\n// // try to get document.body computed background\r\n// if (typeof document !== \"undefined\") {\r\n// try {\r\n// const bodyBg = getComputedStyle(document.body).backgroundColor;\r\n// const pb = parseCssColor(bodyBg, options.resolveVarElement);\r\n// under = pb\r\n// ? { r: pb.r, g: pb.g, b: pb.b }\r\n// : { r: 255, g: 255, b: 255 };\r\n// } catch (e) {\r\n// under = { r: 255, g: 255, b: 255 };\r\n// }\r\n// } else {\r\n// under = { r: 255, g: 255, b: 255 };\r\n// }\r\n// }\r\n// bgRgb = blendOver(parsed, under);\r\n// } else {\r\n// bgRgb = { r: parsed.r, g: parsed.g, b: parsed.b };\r\n// }\r\n\r\n// const bgLum = relativeLuminance(bgRgb);\r\n// const whiteLum = 1;\r\n// const blackLum = 0;\r\n// const whiteContrast = contrastRatioFromL(bgLum, whiteLum);\r\n// const blackContrast = contrastRatioFromL(bgLum, blackLum);\r\n\r\n// // Prefer color that meets threshold; if both pass, pick the stronger contrast\r\n// if (whiteContrast >= threshold || blackContrast >= threshold) {\r\n// if (whiteContrast >= threshold && blackContrast >= threshold) {\r\n// // both ok -> choose the higher contrast\r\n// return {\r\n// color: whiteContrast > blackContrast ? \"#ffffff\" : \"#000000\",\r\n// contrast: Math.max(whiteContrast, blackContrast),\r\n// meetsAA: true,\r\n// blackContrast,\r\n// whiteContrast,\r\n// used: whiteContrast > blackContrast ? \"white\" : \"black\",\r\n// };\r\n// }\r\n// if (whiteContrast >= threshold) {\r\n// return {\r\n// color: \"#ffffff\",\r\n// contrast: whiteContrast,\r\n// meetsAA: true,\r\n// blackContrast,\r\n// whiteContrast,\r\n// used: \"white\",\r\n// };\r\n// }\r\n// return {\r\n// color: \"#000000\",\r\n// contrast: blackContrast,\r\n// meetsAA: true,\r\n// blackContrast,\r\n// whiteContrast,\r\n// used: \"black\",\r\n// };\r\n// }\r\n\r\n// // Neither black nor white meets threshold -> generate a grayscale text color with required luminance\r\n// // Decide whether a lighter or darker text is needed: choose the side with higher contrast (closer)\r\n// const wantLighterText = whiteContrast > blackContrast; // if true, we need a lighter text (closer to white)\r\n// let targetL;\r\n// if (wantLighterText) {\r\n// // Solve (Ltext + 0.05)/(bgLum + 0.05) >= threshold => Ltext >= threshold*(bgLum+0.05) - 0.05\r\n// targetL = threshold * (bgLum + 0.05) - 0.05;\r\n// } else {\r\n// // Solve (bgLum + 0.05)/(Ltext + 0.05) >= threshold => Ltext <= (bgLum + 0.05)/threshold - 0.05\r\n// targetL = (bgLum + 0.05) / threshold - 0.05;\r\n// }\r\n// targetL = Math.min(1, Math.max(0, targetL));\r\n\r\n// const generatedHex = genGrayHexFromLinearLum(targetL);\r\n// const genRgb = {\r\n// r: parseInt(generatedHex.slice(1, 3), 16),\r\n// g: parseInt(generatedHex.slice(3, 5), 16),\r\n// b: parseInt(generatedHex.slice(5, 7), 16),\r\n// };\r\n// const genLum = relativeLuminance(genRgb);\r\n// const genContrast = contrastRatioFromL(bgLum, genLum);\r\n\r\n// return {\r\n// color: generatedHex,\r\n// contrast: genContrast,\r\n// meetsAA: genContrast >= threshold,\r\n// blackContrast,\r\n// whiteContrast,\r\n// used: \"generated\",\r\n// };\r\n// }\r\n\r\n// // Expose\r\n// global.getAccessibleTextColor = getAccessibleTextColor;\r\n// if (typeof module !== \"undefined\") module.exports = getAccessibleTextColor;\r\n// })(\r\n// typeof window !== \"undefined\"\r\n// ? window\r\n// : typeof global !== \"undefined\"\r\n// ? global\r\n// : this\r\n// );\r\n\r\n//FINAL\r\n// Utility to compute accessible text color based on background color\r\n// Follows WCAG 2.1 contrast guidelines\r\n\r\nfunction _toHex(n) {\r\n return (\"0\" + n.toString(16)).slice(-2);\r\n}\r\nfunction rgbToHex(r, g, b) {\r\n return \"#\" + _toHex(r) + _toHex(g) + _toHex(b);\r\n}\r\n\r\n/**\r\n * Parse a CSS color string into an RGBA object.\r\n *\r\n * Supports:\r\n * - CSS variables (var(--color))\r\n * - Named colors (black, white, transparent)\r\n * - Hex (#RGB, #RGBA, #RRGGBB, #RRGGBBAA)\r\n * - rgb()/rgba() functional notation\r\n *\r\n * @param {string} input - CSS color string to parse.\r\n * @param {HTMLElement} [resolveVarElement=document.documentElement]\r\n * Element from which to resolve CSS variables.\r\n * @returns {{r:number, g:number, b:number, a:number} | null}\r\n * RGBA components (0–255, alpha 0–1) or null if invalid.\r\n */\r\nfunction parseCssColor(input, resolveVarElement = document?.documentElement) {\r\n if (typeof input !== \"string\" || !input.trim()) return null;\r\n\r\n const s = input.trim();\r\n\r\n // --- Handle CSS variables ---\r\n if (\r\n s.startsWith(\"var(\") &&\r\n typeof window !== \"undefined\" &&\r\n resolveVarElement\r\n ) {\r\n const varName = s.slice(4, -1).trim();\r\n const val = getComputedStyle(resolveVarElement)\r\n .getPropertyValue(varName)\r\n .trim();\r\n return val ? parseCssColor(val, resolveVarElement) : null;\r\n }\r\n\r\n // --- Try browser-native parsing (canvas trick) ---\r\n if (typeof document !== \"undefined\") {\r\n try {\r\n const ctx = document.createElement(\"canvas\").getContext(\"2d\");\r\n ctx.fillStyle = \"#000\"; // reset\r\n ctx.fillStyle = s;\r\n const computed = ctx.fillStyle;\r\n\r\n // rgba() or rgb()\r\n const rgbaMatch = computed.match(\r\n /^rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*([0-9.]+))?\\)$/i\r\n );\r\n if (rgbaMatch) {\r\n return {\r\n r: +rgbaMatch[1],\r\n g: +rgbaMatch[2],\r\n b: +rgbaMatch[3],\r\n a: rgbaMatch[4] !== undefined ? +rgbaMatch[4] : 1,\r\n };\r\n }\r\n\r\n // hex (#RRGGBB or #RRGGBBAA)\r\n if (computed.startsWith(\"#\")) {\r\n return parseHexColor(computed);\r\n }\r\n } catch {\r\n // ignore parsing errors, will fall back below\r\n }\r\n }\r\n\r\n // --- Hex fallback ---\r\n if (/^#[0-9a-fA-F]{3,8}$/.test(s)) {\r\n return parseHexColor(s);\r\n }\r\n\r\n // --- Named colors fallback ---\r\n const named = {\r\n black: { r: 0, g: 0, b: 0, a: 1 },\r\n white: { r: 255, g: 255, b: 255, a: 1 },\r\n transparent: { r: 0, g: 0, b: 0, a: 0 },\r\n };\r\n return named[s.toLowerCase()] || null;\r\n}\r\n\r\n/**\r\n * Parse hex color string (#RGB, #RGBA, #RRGGBB, #RRGGBBAA).\r\n *\r\n * @param {string} hexString - A valid hex color string.\r\n * @returns {{r:number, g:number, b:number, a:number}}\r\n */\r\nfunction parseHexColor(hexString) {\r\n let hex = hexString.replace(/^#/, \"\");\r\n if (hex.length === 3 || hex.length === 4) {\r\n hex = hex\r\n .split(\"\")\r\n .map((c) => c + c)\r\n .join(\"\");\r\n }\r\n\r\n if (hex.length === 6) {\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n a: 1,\r\n };\r\n }\r\n\r\n if (hex.length === 8) {\r\n return {\r\n r: parseInt(hex.slice(0, 2), 16),\r\n g: parseInt(hex.slice(2, 4), 16),\r\n b: parseInt(hex.slice(4, 6), 16),\r\n a: parseInt(hex.slice(6, 8), 16) / 255,\r\n };\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction blendOver(fg, bg) {\r\n if (fg.a === undefined || fg.a >= 1) return { r: fg.r, g: fg.g, b: fg.b };\r\n if (!bg) bg = { r: 255, g: 255, b: 255 };\r\n const a = fg.a;\r\n return {\r\n r: Math.round(fg.r * a + bg.r * (1 - a)),\r\n g: Math.round(fg.g * a + bg.g * (1 - a)),\r\n b: Math.round(fg.b * a + bg.b * (1 - a)),\r\n };\r\n}\r\n\r\nfunction srgbToLinear(c) {\r\n c = c / 255;\r\n return c <= 0.03928 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\r\n}\r\nfunction linearToSrgbComp(lin) {\r\n if (lin <= 0.0031308) return Math.round(lin * 12.92 * 255);\r\n return Math.round((1.055 * Math.pow(lin, 1 / 2.4) - 0.055) * 255);\r\n}\r\nfunction relativeLuminance(rgb) {\r\n const R = srgbToLinear(rgb.r);\r\n const G = srgbToLinear(rgb.g);\r\n const B = srgbToLinear(rgb.b);\r\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\r\n}\r\nfunction contrastRatio(l1, l2) {\r\n const L1 = Math.max(l1, l2),\r\n L2 = Math.min(l1, l2);\r\n return (L1 + 0.05) / (L2 + 0.05);\r\n}\r\nfunction genGrayHexFromLinearLum(lin) {\r\n lin = Math.min(1, Math.max(0, lin));\r\n const c = linearToSrgbComp(lin);\r\n return rgbToHex(c, c, c);\r\n}\r\n\r\n/**\r\n * @param {string} bgColor - The background color to evaluate.\r\n * @param {Object} [options] - Optional parameters.\r\n * @param {number} [options.threshold=4.5] - The minimum contrast ratio to pass the accessibility test.\r\n * @param {string|Object} [options.underlyingColor] - Optional color to use when the original color has transparency.\r\n * @param {Function} [options.resolveVarElement] - A function to resolve CSS variables.\r\n * @returns {Promise<Object>} - A promise resolving to an object with the following properties:\r\n * color: The color to use for the text.\r\n * contrast: The contrast ratio between the selected color and the background color.\r\n * meetsAA: A boolean indicating whether the contrast ratio passes the accessibility test.\r\n * blackContrast: The contrast ratio between the background color and black.\r\n * whiteContrast: The contrast ratio between the background color and white.\r\n * used: A string indicating which color was used (black, white or generated).\r\n */\r\nasync function getAccessibleTextColor(bgColor, options = {}) {\r\n const threshold = options.threshold || 4.5;\r\n\r\n const parsed = parseCssColor(bgColor, options.resolveVarElement);\r\n if (!parsed) {\r\n console.warn(\"getAccessibleTextColor: unable to parse color:\", bgColor);\r\n return {\r\n color: \"#000000\",\r\n contrast: 21,\r\n meetsAA: true,\r\n blackContrast: 21,\r\n whiteContrast: 1,\r\n used: \"black\",\r\n };\r\n }\r\n\r\n // Transparency handling\r\n let bgRgb;\r\n if (parsed.a !== undefined && parsed.a < 1) {\r\n let under = options.underlyingColor;\r\n if (under) {\r\n const p =\r\n typeof under === \"string\"\r\n ? parseCssColor(under, options.resolveVarElement)\r\n : under;\r\n under = p ? { r: p.r, g: p.g, b: p.b } : { r: 255, g: 255, b: 255 };\r\n } else {\r\n under = { r: 255, g: 255, b: 255 };\r\n }\r\n bgRgb = blendOver(parsed, under);\r\n } else {\r\n bgRgb = { r: parsed.r, g: parsed.g, b: parsed.b };\r\n }\r\n\r\n const bgLum = relativeLuminance(bgRgb);\r\n const whiteContrast = contrastRatio(bgLum, 1);\r\n const blackContrast = contrastRatio(bgLum, 0);\r\n\r\n // Pick best between black/white\r\n if (whiteContrast >= threshold || blackContrast >= threshold) {\r\n if (whiteContrast >= blackContrast) {\r\n return {\r\n color: \"#ffffff\",\r\n contrast: whiteContrast,\r\n meetsAA: whiteContrast >= threshold,\r\n blackContrast,\r\n whiteContrast,\r\n used: \"white\",\r\n };\r\n }\r\n return {\r\n color: \"#000000\",\r\n contrast: blackContrast,\r\n meetsAA: blackContrast >= threshold,\r\n blackContrast,\r\n whiteContrast,\r\n used: \"black\",\r\n };\r\n }\r\n\r\n // Fallback: generate gray\r\n const wantLighter = whiteContrast > blackContrast;\r\n let targetL;\r\n if (wantLighter) {\r\n targetL = threshold * (bgLum + 0.05) - 0.05;\r\n } else {\r\n targetL = (bgLum + 0.05) / threshold - 0.05;\r\n }\r\n targetL = Math.min(1, Math.max(0, targetL));\r\n\r\n const generatedHex = genGrayHexFromLinearLum(targetL);\r\n const genRgb = {\r\n r: parseInt(generatedHex.slice(1, 3), 16),\r\n g: parseInt(generatedHex.slice(3, 5), 16),\r\n b: parseInt(generatedHex.slice(5, 7), 16),\r\n };\r\n const genLum = relativeLuminance(genRgb);\r\n const genContrast = contrastRatio(bgLum, genLum);\r\n\r\n return {\r\n color: generatedHex,\r\n contrast: genContrast,\r\n meetsAA: genContrast >= threshold,\r\n blackContrast,\r\n whiteContrast,\r\n used: \"generated\",\r\n };\r\n}\r\n","\"use strict\";\r\n\r\nimport { forceReflow, parseAnimationDuration } from \"../utils/dom.js\";\r\n\r\n/**\r\n * Create close button for toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function createCloseButton(toast, options, onClose) {\r\n const closeButton = document.createElement(\"button\");\r\n // Accessibility + avoid innerHTML (XSS surface)\r\n closeButton.setAttribute(\"aria-label\", \"Close notification\");\r\n closeButton.setAttribute(\"title\", \"Close\");\r\n closeButton.textContent = \"×\"; // U+00D7 multiplication sign\r\n Object.assign(closeButton.style, {\r\n background: \"none\",\r\n border: \"none\",\r\n color: options.textColor,\r\n fontSize: \"18px\",\r\n marginLeft: \"10px\",\r\n cursor: \"pointer\",\r\n });\r\n\r\n closeButton.onclick = () => onClose(toast);\r\n toast.appendChild(closeButton);\r\n\r\n toast._cleanupCloseButton = () => {\r\n closeButton.onclick = null;\r\n };\r\n}\r\n\r\n/**\r\n * Create progress bar for toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n */\r\nexport async function createProgressBar(toast, options) {\r\n const progressBar = document.createElement(\"div\");\r\n Object.assign(progressBar.style, {\r\n position: \"absolute\",\r\n left: \"0\",\r\n height: options.progressHeight || \"4px\",\r\n background: options.progressColor || \"rgba(255, 255, 255, 0.3)\",\r\n width: \"100%\",\r\n transition: `width ${options.duration || 1800}ms linear`,\r\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\r\n });\r\n\r\n toast.appendChild(progressBar);\r\n\r\n setTimeout(() => {\r\n forceReflow(progressBar);\r\n progressBar.style.width = \"0%\";\r\n }, 100);\r\n}\r\n\r\n/**\r\n * Run toast fade-in animation\r\n * @param {HTMLElement} toast - Toast element\r\n */\r\nexport async function runToastAnimation(toast) {\r\n setTimeout(() => {\r\n requestAnimationFrame(() => {\r\n toast.style.opacity = \"1\";\r\n toast.style.transform = \"translateY(0)\";\r\n });\r\n }, 50);\r\n}\r\n\r\n/**\r\n * Apply rich styling to toast element\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function applyRichStyling(toast, options, onClose) {\r\n const animDurationMs = await parseAnimationDuration(\r\n options.animationDuration\r\n );\r\n\r\n // Apply full styling\r\n Object.assign(toast.style, {\r\n background: options.backgroundColor,\r\n padding: \"12px 20px\",\r\n marginBottom: \"10px\",\r\n borderRadius: options.borderRadius,\r\n overflow: \"hidden\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n minWidth: \"250px\",\r\n maxWidth: options.maxWidth,\r\n opacity: \"0\",\r\n position: \"relative\",\r\n transition: `opacity ${options.animationDuration} ${options.animationEasing}, transform ${options.animationDuration} ${options.animationEasing}`,\r\n transform: \"translateY(20px)\",\r\n zIndex: \"9999\",\r\n // willChange: \"opacity, transform\",\r\n });\r\n\r\n // TODO! Later\r\n // await animateElement(toast, {\r\n // animationType: options.animationType,\r\n // duration: animDurationMs,\r\n // easing: options.animationEasing,\r\n // });\r\n\r\n toast._animationDuration = animDurationMs;\r\n\r\n // Message span\r\n const messageSpan = document.createElement(\"span\");\r\n\r\n // Layout & positioning\r\n messageSpan.style.position = options.fontPosition;\r\n messageSpan.style.display = \"inline-block\"; // ensure consistent layout\r\n messageSpan.style.flex = \"1\";\r\n\r\n // Spacing & container styling\r\n messageSpan.style.padding = options.fontPadding;\r\n messageSpan.style.borderRadius = options.fontBorderRadius;\r\n messageSpan.style.background = options.fontBackgroundColor;\r\n\r\n // Font stack (system + emoji + fallback)\r\n messageSpan.style.fontFamily = options.fontFamily;\r\n\r\n // Font size & readability\r\n messageSpan.style.fontSize = options.fontSize; // minimum for readability\r\n messageSpan.style.fontWeight = options.fontWeight;\r\n messageSpan.style.lineHeight = options.fontLineHeight; // balance readability\r\n\r\n //TODO LATER Icons (auto dark/light fallback)\r\n // messageSpan.style.color =\r\n // options.iconColor ||\r\n // (window.matchMedia(\"(prefers-color-scheme: dark)\").matches ? \"#f5f5f5\" : \"#111111\");\r\n\r\n // Colors (auto dark/light fallback)\r\n messageSpan.style.color = options.textColor;\r\n\r\n // Accessibility\r\n messageSpan.style.userSelect = \"text\"; // allow copy/paste if needed\r\n messageSpan.style.wordBreak = \"break-word\"; // avoid layout breaking on long strings\r\n messageSpan.style.direction = options.fontDirection; // RTL/LTR auto-detect\r\n // ✅ Multi-line ellipsis (max 3 lines)\r\n messageSpan.style.webkitLineClamp = \"3\"; // maximum 3 lines\r\n messageSpan.style.webkitBoxOrient = \"vertical\";\r\n messageSpan.style.whiteSpace = options.wrapText ? \"normal\" : \"nowrap\"; // allow wrapping if wanted\r\n messageSpan.style.display = \"block\";\r\n messageSpan.style.overflow = \"hidden\";\r\n messageSpan.style.textOverflow = \"ellipsis\";\r\n messageSpan.style.lineClamp = \"3\"; // modern property\r\n messageSpan.style.boxOrient = \"vertical\"; // non-prefixed\r\n messageSpan.style.display = \"-webkit-box\";\r\n // messageSpan.style.mixBlendMode = \"difference\";\r\n // Assign message\r\n messageSpan.textContent = options.message;\r\n messageSpan.setAttribute(\"aria-label\", \"Toast Notification Center\");\r\n messageSpan.setAttribute(\"title\", options.message);\r\n // Add to toast\r\n toast.appendChild(messageSpan);\r\n\r\n // TODO Icon Later\r\n // if (options.icon) {\r\n // createIcon(toast, options);\r\n // }\r\n\r\n // CTA factory that appends a safe, keyboard‑accessible button/link at the end of the row\r\n await createCTA(toast, options, onClose);\r\n\r\n // Close button\r\n if (options.showCloseButton) {\r\n await createCloseButton(toast, options, onClose);\r\n }\r\n\r\n // Progress bar\r\n if (options.showProgressBar) {\r\n await createProgressBar(toast, options);\r\n }\r\n\r\n // Animation\r\n await runToastAnimation(toast);\r\n}\r\n\r\n/**\r\n * Create basic fallback toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function createBasicToast(toast, options, onClose) {\r\n // Basic styling only\r\n Object.assign(toast.style, {\r\n background: \"#333\",\r\n color: \"white\",\r\n padding: \"10px 15px\",\r\n margin: \"10px\",\r\n borderRadius: \"3px\",\r\n position: \"fixed\",\r\n top: \"20px\",\r\n right: \"20px\",\r\n zIndex: \"99999\",\r\n maxWidth: \"300px\",\r\n wordWrap: \"break-word\",\r\n });\r\n\r\n toast.textContent = options.message;\r\n\r\n if (options.showCloseButton) {\r\n toast.style.cursor = \"pointer\";\r\n toast.onclick = () => onClose(toast);\r\n }\r\n\r\n toast._animationDuration = 500;\r\n}\r\n\r\n// CSS injection function\r\nasync function injectToastStyles() {\r\n if (document.getElementById(\"ctoast-styles\")) return; // Already injected\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = \"ctoast-styles\";\r\n style.textContent = `\r\n .ctoast-toast {\r\n padding: 12px 20px;\r\n margin-bottom: 10px;\r\n border-radius: 5px;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-between;\r\n box-shadow: 0 4px 6px rgba(0,0,0,0.1);\r\n min-width: 250px;\r\n max-width: 400px;\r\n opacity: 0;\r\n position: relative;\r\n transform: translateY(20px);\r\n z-index: 9999;\r\n }\r\n\r\n .ctoast-message {\r\n flex: 1;\r\n }\r\n\r\n .ctoast-close {\r\n cursor: pointer;\r\n margin-left: 10px;\r\n font-weight: bold;\r\n background: transparent;\r\n border: none;\r\n }\r\n\r\n .ctoast-progress {\r\n position: absolute;\r\n bottom: 0;\r\n left: 0;\r\n height: 4px;\r\n background: rgba(255,255,255,0.7);\r\n width: 100%;\r\n transform-origin: left;\r\n }\r\n\r\n .ctoast-show {\r\n opacity: 1 !important;\r\n transform: translateY(0) !important;\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n}\r\n\r\n/**\r\n * Emergency toast as last resort\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport async function createEmergencyToast(options, onClose) {\r\n try {\r\n // Create emergency div\r\n const emergency = document.createElement(\"div\");\r\n emergency.id = `emergency-${Date.now()}`;\r\n emergency.innerHTML = `\r\n <div style=\"\r\n background: #333 !important;\r\n color: white !important;\r\n padding: 10px 15px !important;\r\n position: fixed !important;\r\n top: 20px !important;\r\n right: 20px !important;\r\n z-index: 99999 !important;\r\n border-radius: 3px !important;\r\n max-width: 250px !important;\r\n word-wrap: break-word !important;\r\n font-family: Arial, sans-serif !important;\r\n font-size: 14px !important;\r\n box-shadow: 0 2px 10px rgba(0,0,0,0.3) !important;\r\n cursor: pointer !important;\r\n \" onclick=\"this.parentNode.removeChild(this)\">\r\n ${options.message || \"Emergency Toast Creation Showing!\"}\r\n <span style=\"float: right; margin-left: 10px; font-weight: bold;\">×</span>\r\n </div>\r\n `;\r\n\r\n emergency._animationDuration = 500;\r\n emergency._isEmergencyToast = true;\r\n\r\n // Auto remove\r\n setTimeout(() => {\r\n try {\r\n if (emergency.parentNode) {\r\n emergency.parentNode.removeChild(emergency);\r\n }\r\n onClose(emergency);\r\n } catch (error) {\r\n console.warn(\"Emergency cleanup failed:\", error);\r\n }\r\n }, options.duration || 1800);\r\n\r\n return emergency;\r\n } catch (emergencyError) {\r\n console.error(\"Emergency toast creation failed:\", emergencyError);\r\n\r\n // ULTIMATE FALLBACK: Alert\r\n setTimeout(() => {\r\n try {\r\n alert(options.message || \"Toast Creation Failed!\");\r\n onClose(null);\r\n } catch (alertError) {\r\n console.error(\"Ultimate fallback failed:\", alertError);\r\n onClose(null);\r\n }\r\n }, 100);\r\n\r\n return null;\r\n }\r\n}\r\n\r\nexport async function safeSetTimeout(fn, delay) {\r\n const id = setTimeout(() => {\r\n console.warn(\"Timer fired after\", delay, \"ms\");\r\n fn();\r\n }, delay);\r\n\r\n console.warn(\"Timer scheduled with id:\", id, \"delay:\", delay);\r\n return id;\r\n}\r\n\r\n/**\r\n * Append a Call-To-Action (CTA) element to the toast container.\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n * @returns {HTMLElement} CTA element\r\n * @example\r\n * const toast = createToast({ ... });\r\n * const cta = createCTA(toast, { cta: { label: \"Visit our website\", href: \"https://www.example.com/\", variant: \"link\" } });\r\n */\r\nexport async function createCTA(toast, options, onClose) {\r\n const cfg = options?.cta;\r\n if (!cfg || !cfg.label) return;\r\n\r\n const isLink = !!cfg.href && cfg.variant === \"link\";\r\n const el = document.createElement(isLink ? \"a\" : \"button\");\r\n\r\n // Base a11y and semantics\r\n if (isLink) {\r\n el.href = cfg.href;\r\n if (cfg.target) el.target = cfg.target;\r\n el.rel = cfg.rel || (cfg.target === \"_blank\" ? \"noopener noreferrer\" : \"\");\r\n } else {\r\n el.type = \"button\";\r\n }\r\n el.setAttribute(\"aria-label\", cfg.ariaLabel || cfg.label);\r\n\r\n // Visuals that fit any theme; minimal, non-intrusive\r\n Object.assign(el.style, {\r\n marginLeft: \"10px\",\r\n padding: \"6px 10px\",\r\n borderRadius: \"6px\",\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n lineHeight: \"1\",\r\n border: \"1px solid rgba(255,255,255,0.35)\",\r\n color: options.textColor || \"#fff\",\r\n background: \"rgba(255,255,255,0.15)\",\r\n cursor: \"pointer\",\r\n whiteSpace: \"nowrap\",\r\n flexShrink: \"0\",\r\n });\r\n\r\n el.textContent = cfg.label;\r\n\r\n // Click behavior\r\n el.addEventListener(\"click\", async (e) => {\r\n try {\r\n if (typeof cfg.onClick === \"function\") {\r\n const ret = cfg.onClick(e);\r\n if (ret?.then) await ret; // allow async actions\r\n }\r\n } finally {\r\n if (cfg.autoClose !== false) onClose(toast);\r\n }\r\n });\r\n\r\n // Append after message span, before close/progress doesn’t matter (flex)\r\n toast.appendChild(el);\r\n}\r\n","// src/components/Toast.js //# Single responsibility\r\n\"use strict\";\r\n\r\nimport { createElementWithId } from \"../utils/dom.js\";\r\nimport { applyRichStyling, createEmergencyToast } from \"./toast-utils.js\";\r\n\r\n/**\r\n * Multi-layer toast creation with satellite-grade fallbacks\r\n * @param {Object} options - Toast configuration options\r\n * @param {Function} onClose - Callback when toast closes\r\n * @returns {HTMLElement} Toast element\r\n */\r\nexport async function createToastElement(options, onClose) {\r\n let toastContainer = document.querySelector('[id^=\"toast-container-\"]');\r\n if (!toastContainer) return null;\r\n\r\n let toast;\r\n const tagName = \"div\";\r\n const prefix = \"toast\";\r\n\r\n // PRIMARY: Full-featured toast\r\n try {\r\n toast = await createElementWithId(tagName, prefix);\r\n await applyRichStyling(toast, options, onClose);\r\n return toast;\r\n } catch (error) {\r\n console.warn(\"error:\", error);\r\n await createEmergencyToast(options, onClose);\r\n return toast;\r\n }\r\n}\r\n","// src/utils/containerRegistry.js\r\n\"use strict\";\r\n\r\nconst containerRegistry = new Map(); // id -> HTMLElement\r\nconst containerLocks = new Map(); // id -> Promise<HTMLElement>\r\n\r\n/**\r\n * Normalize a position string to a canonical key (id-safe, stable).\r\n */\r\nexport function normalizePositionKey(position = \"bottom-right\") {\r\n // lower-case, trim, unify separators, alias \"below\" -> \"bottom\"\r\n const raw = String(position).toLowerCase().trim();\r\n const aliased = raw.replace(/\\bbelow\\b/g, \"bottom\");\r\n return aliased\r\n .replace(/\\s+/g, \"-\")\r\n .replace(/[^a-z0-9\\-]/g, \"-\")\r\n .replace(/\\-+/g, \"-\");\r\n}\r\n\r\n/**\r\n * Canonical container id\r\n */\r\nexport function getContainerId(position = \"bottom-right\") {\r\n return `toast-container-${normalizePositionKey(position)}`;\r\n}\r\n\r\n/**\r\n * Atomically get or create a single container per canonical id.\r\n */\r\nexport async function getOrCreateToastContainer(options = {}, setPosition) {\r\n const id = getContainerId(options.position);\r\n // If a creation is in-flight, await it\r\n if (containerLocks.has(id)) {\r\n return containerLocks.get(id);\r\n }\r\n\r\n const p = (async () => {\r\n // 1) Prefer registry cache if still connected\r\n const cached = containerRegistry.get(id);\r\n if (cached && cached.isConnected) {\r\n return cached;\r\n }\r\n\r\n // 2) Find existing in DOM\r\n let el = document.getElementById(id); // unique by spec, but may return first if duplicates exist\r\n if (el && !el.isConnected) {\r\n // re-attach if detached\r\n document.body.appendChild(el);\r\n }\r\n\r\n // 3) If not found, create\r\n if (!el) {\r\n el = document.createElement(\"div\");\r\n el.id = id;\r\n el.setAttribute(\"role\", \"status\"); // polite + atomic by default\r\n el.setAttribute(\"aria-atomic\", \"true\"); // explicit for consistency\r\n el.style.position = \"fixed\";\r\n el.style.zIndex = \"9999\";\r\n el.style.inset = \"auto 10px 10px auto\";\r\n el.style.display = \"flex\";\r\n el.style.justifyContent = \"space-between\";\r\n el.style.alignItems = \"center\";\r\n el.style.flexDirection = \"column\";\r\n el.style.overflow = \"hidden\";\r\n // Position with provided helper\r\n if (typeof setPosition === \"function\") {\r\n await setPosition(el, options);\r\n }\r\n document.body.appendChild(el);\r\n } else {\r\n // Ensure base styles and (re)apply position in case options changed\r\n el.style.position = el.style.position || \"fixed\";\r\n el.style.zIndex = el.style.zIndex || \"9999\";\r\n if (typeof setPosition === \"function\") {\r\n await setPosition(el, options);\r\n }\r\n }\r\n\r\n // 4) If somehow duplicates exist, keep the first and remove the rest\r\n // getElementById would have returned the first; clean up others proactively\r\n const all = document.querySelectorAll(`#${id}`);\r\n if (all.length > 1) {\r\n for (let i = 1; i < all.length; i++) {\r\n try {\r\n all[i].remove();\r\n } catch {}\r\n }\r\n }\r\n\r\n containerRegistry.set(id, el);\r\n return el;\r\n })();\r\n\r\n containerLocks.set(id, p);\r\n try {\r\n const out = await p;\r\n return out;\r\n } finally {\r\n // Clear the lock so future calls can re-enter if needed\r\n containerLocks.delete(getContainerId(options.position));\r\n }\r\n}\r\n","// src/utils/position.js\r\n\"use strict\";\r\n\r\n/**\r\n * Set position for toast container\r\n * @param {HTMLElement} container - Toast container element\r\n * @param {Object} options - Options object containing position\r\n * @returns {Promise<void>}\r\n */\r\nexport async function setPosition(container, options) {\r\n if (!container || !options.position) {\r\n throw new Error(\"Invalid container or position!\");\r\n }\r\n\r\n resetContainerStyles(container);\r\n const positionFlags = parsePosition(options.position);\r\n\r\n if (handleFullWidthPositions(container, options, positionFlags)) return;\r\n if (handleCenterPositions(container, positionFlags)) return;\r\n\r\n applyStandardPositioning(container, positionFlags);\r\n}\r\n\r\n/**\r\n * Reset all position-related styles\r\n * @param {HTMLElement} container\r\n */\r\nfunction resetContainerStyles(container) {\r\n container.style.top = \"auto\";\r\n container.style.bottom = \"auto\";\r\n container.style.left = \"auto\";\r\n container.style.right = \"auto\";\r\n container.style.transform = \"none\";\r\n}\r\n\r\n/**\r\n * Parse position string into boolean flags\r\n * @param {string} position\r\n * @returns {Object} Position flags\r\n */\r\nfunction parsePosition(position) {\r\n const pos = position.toLowerCase().trim();\r\n return {\r\n hasTop: pos.includes(\"top\"),\r\n hasBottom: pos.includes(\"bottom\") || pos.includes(\"below\"),\r\n hasLeft: pos.includes(\"left\"),\r\n hasRight: pos.includes(\"right\"),\r\n hasCenter: pos.includes(\"center\"),\r\n hasFullWidth:\r\n pos.includes(\"top-full-width\") ||\r\n pos.includes(\"bottom-full-width\") ||\r\n pos.includes(\"fullwidth\"),\r\n };\r\n}\r\n\r\n/**\r\n * Handle full-width positioning cases\r\n * @param {HTMLElement} container\r\n * @param {Object} options\r\n * @param {Object} flags\r\n * @returns {boolean} True if position was handled\r\n */\r\nfunction handleFullWidthPositions(container, options, flags) {\r\n if (!flags.hasFullWidth) return false;\r\n\r\n options.maxWidth = \"100vw\";\r\n\r\n if (flags.hasTop) {\r\n container.style.top = \"10px\";\r\n container.style.left = \"10px\";\r\n container.style.right = \"10px\";\r\n return true;\r\n }\r\n\r\n if (flags.hasBottom) {\r\n container.style.bottom = \"10px\";\r\n container.style.left = \"10px\";\r\n container.style.right = \"10px\";\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Handle center positioning cases\r\n * @param {HTMLElement} container\r\n * @param {Object} flags\r\n * @returns {boolean} True if position was handled\r\n */\r\nfunction handleCenterPositions(container, flags) {\r\n if (!flags.hasCenter) return false;\r\n\r\n // top-center\r\n if (flags.hasTop && !flags.hasLeft && !flags.hasRight) {\r\n container.style.top = \"10px\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translateX(-50%)\";\r\n return true;\r\n }\r\n\r\n // bottom-center\r\n if (flags.hasBottom && !flags.hasLeft && !flags.hasRight) {\r\n container.style.bottom = \"10px\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translateX(-50%)\";\r\n return true;\r\n }\r\n\r\n // left-center\r\n if (flags.hasLeft && !flags.hasTop && !flags.hasBottom) {\r\n container.style.left = \"10px\";\r\n container.style.top = \"50%\";\r\n container.style.transform = \"translateY(-50%)\";\r\n return true;\r\n }\r\n\r\n // right-center\r\n if (flags.hasRight && !flags.hasTop && !flags.hasBottom) {\r\n container.style.right = \"10px\";\r\n container.style.top = \"50%\";\r\n container.style.transform = \"translateY(-50%)\";\r\n return true;\r\n }\r\n\r\n // full center (no sides specified)\r\n if (!flags.hasLeft && !flags.hasRight && !flags.hasTop && !flags.hasBottom) {\r\n container.style.top = \"50%\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translate(-50%, -50%)\";\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Apply standard positioning (corners and edges)\r\n * @param {HTMLElement} container\r\n * @param {Object} flags\r\n */\r\nfunction applyStandardPositioning(container, flags) {\r\n // Set vertical position\r\n if (flags.hasBottom) {\r\n container.style.bottom = \"10px\";\r\n } else if (flags.hasTop) {\r\n container.style.top = \"10px\";\r\n }\r\n\r\n // Set horizontal position\r\n if (flags.hasRight) {\r\n container.style.right = \"10px\";\r\n } else if (flags.hasLeft) {\r\n container.style.left = \"10px\";\r\n } else {\r\n // Default: bottom-center\r\n container.style.bottom = \"10px\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translateX(-50%)\";\r\n }\r\n}\r\n","// src/utils/PausableTimer.js\r\n\"use strict\";\r\n\r\nexport class PausableTimer {\r\n constructor(callback, delay) {\r\n this.callback = callback;\r\n this.delay = delay;\r\n this.remaining = delay;\r\n this.startTime = null;\r\n this.timeoutId = null;\r\n this.isPaused = false;\r\n this.isCompleted = false;\r\n }\r\n\r\n start() {\r\n if (this.isCompleted || this.timeoutId) return this;\r\n this.startTime = Date.now();\r\n this.timeoutId = setTimeout(() => {\r\n this.isCompleted = true;\r\n this.timeoutId = null;\r\n this.callback();\r\n }, this.remaining);\r\n return this;\r\n }\r\n\r\n pause() {\r\n if (this.isPaused || !this.timeoutId || this.isCompleted) return this;\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n this.remaining -= Date.now() - this.startTime;\r\n this.remaining = Math.max(0, this.remaining); // prevent negative\r\n this.isPaused = true;\r\n return this;\r\n }\r\n\r\n resume() {\r\n if (!this.isPaused || this.isCompleted) return this;\r\n this.isPaused = false;\r\n this.start();\r\n return this;\r\n }\r\n\r\n clear() {\r\n if (this.timeoutId) {\r\n clearTimeout(this.timeoutId);\r\n this.timeoutId = null;\r\n }\r\n this.isCompleted = true;\r\n return this;\r\n }\r\n\r\n getRemainingTime() {\r\n if (this.isCompleted) return 0;\r\n if (this.isPaused) return this.remaining;\r\n if (!this.timeoutId) return this.delay;\r\n return Math.max(0, this.remaining - (Date.now() - this.startTime));\r\n }\r\n}\r\n","// src/components/ToastManager.js\r\n\"use strict\";\r\n\r\nimport { createToastElement } from \"./Toast.js\";\r\nimport { removeElement } from \"../utils/dom.js\";\r\nimport { createEmergencyToast } from \"./toast-utils.js\";\r\nimport { getOrCreateToastContainer } from \"../utils/containerRegistry.js\";\r\nimport { setPosition } from \"../utils/position.js\";\r\nimport { PausableTimer } from \"../utils/PausableTimer.js\";\r\n\r\n// Config\r\nconst MAX_VISIBLE = 3;\r\n\r\n// State\r\nconst active = new Map(); // key -> { outer, toast, count, timeout }\r\nconst pending = new Map(); // key -> { options, count, rafId }\r\nconst queue = []; // [{ options, key, count }]\r\nlet visibleCount = 0;\r\n\r\n// djb2 hash for full-message dedupe\r\nfunction hashString(str) {\r\n let h = 5381;\r\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\r\n return h >>> 0;\r\n}\r\n\r\n/**\r\n * Creates a unique key for a toast notification based on its type, message, and position.\r\n * This key is used to identify and deduplicate identical toast notifications.\r\n * @param {Object} options - Toast options with type, message, and position.\r\n * @returns {string} A unique key for the toast notification.\r\n */\r\nfunction makeKey({\r\n type = options.type,\r\n message = options.message || \"\",\r\n position = options.position,\r\n}) {\r\n return [\r\n String(type).trim().toLowerCase(),\r\n hashString(String(message)).toString(16),\r\n String(position).trim().toLowerCase(),\r\n ].join(\"|\");\r\n}\r\n\r\n/**\r\n * Shows a toast notification with the given options.\r\n * If there is already an active toast with the same type, message, and position,\r\n * it will be grouped immediately and the count will be incremented.\r\n * If there is already a pending toast with the same type, message, and position,\r\n * it will be coalesced and the count will be incremented.\r\n * If there is no capacity left (i.e. the number of visible toasts is at the maximum),\r\n * the grouped request will be enqueued and processed later.\r\n * @param {Object} options - Toast options with type, message, and position.\r\n * @returns {Promise<void>} A promise that resolves when the toast is fully created and displayed.\r\n */\r\nexport async function showToast(options = {}) {\r\n try {\r\n const key = makeKey(options);\r\n\r\n // If already active: group immediately\r\n if (active.has(key)) {\r\n const data = active.get(key);\r\n if (!data) throw new Error(`Active toast with key ${key} not found`);\r\n data.count++;\r\n\r\n // Reset timer with new duration\r\n data.timer.clear();\r\n data.timer = createDismissTimer(data.toast, options);\r\n await setupPauseOnHover(data);\r\n await updateBadge(data);\r\n return;\r\n }\r\n\r\n // If coalescing is already scheduled for this key, just increment the pending count\r\n if (pending.has(key)) {\r\n const current = pending.get(key);\r\n if (!current) throw new Error(`Pending toast with key ${key} not found`);\r\n current.count++;\r\n return;\r\n }\r\n\r\n // Start coalescing identical calls in the same frame\r\n const entry = { options, count: 1, rafId: 0 };\r\n pending.set(key, entry);\r\n\r\n entry.rafId = requestAnimationFrame(async () => {\r\n // finalize batch for this key\r\n const current = pending.get(key);\r\n if (!current) return;\r\n pending.delete(key);\r\n\r\n // If capacity full, enqueue the grouped request\r\n if (visibleCount >= MAX_VISIBLE) {\r\n queue.push({ options: current.options, key, count: current.count });\r\n await drainQueue();\r\n return;\r\n }\r\n\r\n // Otherwise create immediately with the grouped count\r\n try {\r\n await createOne(current.options, key, current.count);\r\n } catch (error) {\r\n console.error(\"showToast failed:\", error);\r\n }\r\n });\r\n } catch (error) {\r\n console.error(\"showToast failed:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Creates a single toast notification with the given options and initial count.\r\n * Will create and mount the toast element, and setup a timer to auto-dismiss.\r\n * If the toast creation fails, it will fallback to an emergency toast.\r\n * @param {Object} options - Toast options with type, message, and position.\r\n * @param {string} key - Unique key for the toast.\r\n * @param {number} initialCount - Initial count for the toast.\r\n * @returns {Promise<void>} A promise that resolves when the toast is fully created and displayed.\r\n */\r\nasync function createOne(options, key, initialCount) {\r\n try {\r\n if (!options || typeof options !== \"object\") {\r\n throw new TypeError(\"options must be an object\");\r\n }\r\n\r\n visibleCount++;\r\n\r\n const container = await getOrCreateToastContainer(options, setPosition);\r\n if (!container) {\r\n throw new Error(\"Failed to create toast container\");\r\n }\r\n\r\n // Build the toast element\r\n const toast = await createToastElement(options, closeToast);\r\n if (!toast) {\r\n throw new Error(\"Toast element creation failed\");\r\n }\r\n\r\n // Outer wrapper (badge surface; visible overflow)\r\n const outer = document.createElement(\"div\");\r\n Object.assign(outer.style, {\r\n position: \"relative\",\r\n display: \"inline-block\",\r\n overflow: \"visible\",\r\n marginBottom: \"10px\",\r\n zIndex: \"0\",\r\n width: \"100%\",\r\n });\r\n\r\n // Inner wrapper (clip progress bar & rounded corners)\r\n const inner = document.createElement(\"div\");\r\n Object.assign(inner.style, {\r\n position: \"relative\",\r\n overflow: \"hidden\",\r\n borderRadius: options.borderRadius || \"8px\",\r\n zIndex: \"1\",\r\n });\r\n\r\n inner.appendChild(toast);\r\n outer.appendChild(inner);\r\n\r\n // Mount\r\n if (container.id.includes(\"toast-container-\")) {\r\n container.appendChild(outer);\r\n }\r\n\r\n // Determine if should pause on hover (default: true if has CTA)\r\n const shouldPauseOnHover =\r\n options.pauseOnHover !== false &&\r\n (options.pauseOnHover === true || !!options.cta);\r\n\r\n // Track\r\n const data = {\r\n outer,\r\n toast,\r\n count: Math.max(1, initialCount | 0),\r\n timeout: null,\r\n pauseOnHover: shouldPauseOnHover,\r\n };\r\n active.set(key, data);\r\n toast._key = key;\r\n\r\n if (data.count > 1) await updateBadge(data);\r\n\r\n // Create and start timer\r\n data.timer = createDismissTimer(toast, options);\r\n await setupPauseOnHover(data);\r\n } catch (err) {\r\n console.error(\"Toast creation failed:\", err);\r\n visibleCount = Math.max(0, visibleCount - 1);\r\n const el =\r\n document.querySelector('[id^=\"toast-container-\"]') || document.body;\r\n el.appendChild(await createEmergencyToast(options, closeToast));\r\n }\r\n}\r\n\r\n/**\r\n * Creates a PausableTimer that auto-closes a toast after a delay.\r\n * @param {HTMLElement} toast - The toast element to auto-close.\r\n * @param {Object} options - Toast options with duration.\r\n * @returns {PausableTimer} A timer that can be paused, resumed, or cleared.\r\n */\r\nfunction createDismissTimer(toast, options) {\r\n const delay = (options.duration || 1800) + 10;\r\n const timer = new PausableTimer(async () => await closeToast(toast), delay);\r\n timer.start();\r\n return timer;\r\n}\r\n\r\nasync function setupPauseOnHover(data) {\r\n if (!data.pauseOnHover || !data.outer || !data.timer) return;\r\n\r\n const { outer, timer } = data;\r\n\r\n // Mouse events\r\n const onMouseEnter = () => {\r\n timer.pause();\r\n };\r\n\r\n const onMouseLeave = () => {\r\n timer.resume();\r\n };\r\n\r\n // Focus events (for keyboard users)\r\n const onFocusIn = (e) => {\r\n // Only pause if focus is on interactive elements (CTA, close button)\r\n if (e.target.matches(\"button, a, [tabindex]\")) {\r\n timer.pause();\r\n }\r\n };\r\n\r\n const onFocusOut = (e) => {\r\n // Only resume if focus is leaving the toast entirely\r\n if (!outer.contains(e.relatedTarget)) {\r\n timer.resume();\r\n }\r\n };\r\n\r\n // Add event listeners\r\n outer.addEventListener(\"mouseenter\", onMouseEnter);\r\n outer.addEventListener(\"mouseleave\", onMouseLeave);\r\n outer.addEventListener(\"focusin\", onFocusIn);\r\n outer.addEventListener(\"focusout\", onFocusOut);\r\n\r\n // Store cleanup function\r\n outer._pauseCleanup = () => {\r\n outer.removeEventListener(\"mouseenter\", onMouseEnter);\r\n outer.removeEventListener(\"mouseleave\", onMouseLeave);\r\n outer.removeEventListener(\"focusin\", onFocusIn);\r\n outer.removeEventListener(\"focusout\", onFocusOut);\r\n };\r\n}\r\n\r\n/**\r\n * Closes a toast notification immediately.\r\n * If the toast is not found in the active toasts map, this function does nothing.\r\n * @param {HTMLElement|null} toast - The toast element to close.\r\n * @returns {Promise<void>} A promise that resolves when the toast is fully removed from the DOM.\r\n */\r\nexport async function closeToast(toast) {\r\n try {\r\n if (!toast?._key) return;\r\n const data = active.get(toast._key);\r\n if (!data) return;\r\n\r\n // Clear timer and cleanup pause events\r\n data.timer?.clear();\r\n data.outer?._pauseCleanup?.();\r\n\r\n active.delete(toast._key);\r\n visibleCount = Math.max(0, visibleCount - 1);\r\n\r\n // Remove badge if present\r\n const badge = data.outer.querySelector(\".toast-count-badge\");\r\n if (badge) {\r\n badge.remove();\r\n }\r\n\r\n // Remove wrapper after transition ends (or fallback)\r\n await removeWithTransition(data.outer);\r\n\r\n // Drain queue after a slot frees\r\n await drainQueue();\r\n } catch (error) {\r\n console.error(\"closeToast failed:\", error);\r\n }\r\n}\r\n\r\nasync function drainQueue() {\r\n // Fill available slots; coalesce queued entries against active if they became active meanwhile\r\n while (visibleCount < MAX_VISIBLE && queue.length) {\r\n const item = queue.shift();\r\n if (active.has(item.key)) {\r\n const data = active.get(item.key);\r\n data.count += item.count;\r\n await updateBadge(data);\r\n continue;\r\n }\r\n // Create without awaiting to keep loop responsive; visibleCount is incremented inside createOne\r\n void createOne(item.options, item.key, item.count);\r\n }\r\n}\r\n\r\n/**\r\n * Safely remove an element after its transition ends, with a hard timeout fallback\r\n * @param {Element} el - The element to remove\r\n * @returns {Promise<void>} A promise that resolves after the element is removed\r\n */\r\nasync function removeWithTransition(el) {\r\n if (!el) return Promise.resolve();\r\n\r\n return new Promise((resolve) => {\r\n let done = false;\r\n const finish = () => {\r\n if (done) return;\r\n done = true;\r\n removeElement(el);\r\n resolve();\r\n };\r\n\r\n // Listen on the immediate child (inner wrapper) if possible\r\n const child = el.firstElementChild || el;\r\n if (!child) return Promise.resolve();\r\n\r\n const onEnd = (e) => {\r\n try {\r\n // Check if the event target is the same element we're listening on\r\n if (e.target !== child) return;\r\n // Remove the event listener to prevent multiple triggers\r\n child.removeEventListener(\"transitionend\", onEnd, true);\r\n finish();\r\n } catch (error) {\r\n console.error(\"removeWithTransition error:\", error);\r\n }\r\n };\r\n\r\n // Add the event listener to the child element\r\n try {\r\n child.addEventListener(\"transitionend\", onEnd, true);\r\n } catch (error) {\r\n console.error(\"removeWithTransition error:\", error);\r\n }\r\n\r\n // Hard fallback if no transition fires after 700ms\r\n setTimeout(() => {\r\n try {\r\n // Remove the event listener to prevent multiple triggers\r\n child.removeEventListener(\"transitionend\", onEnd, true);\r\n finish();\r\n } catch (error) {\r\n console.error(\"removeWithTransition error:\", error);\r\n }\r\n }, 700);\r\n });\r\n}\r\n\r\n/**\r\n * Updates the badge count on the outer toast wrapper.\r\n * @param {Object} options Options object containing the outer toast wrapper and the count.\r\n * @param {HTMLElement} options.outer The outer toast wrapper element.\r\n * @param {number} options.count The count of identical notifications.\r\n */\r\nasync function updateBadge({ outer, count }) {\r\n if (!outer || !outer instanceof HTMLElement) {\r\n throw new Error(\"updateBadge: outer must be a valid HTMLElement\");\r\n }\r\n\r\n if (count < 2) {\r\n // Remove the badge if the count is less than 2\r\n const badge = outer.querySelector(\".toast-count-badge\");\r\n if (badge) {\r\n badge.remove();\r\n }\r\n return;\r\n }\r\n\r\n let badge = outer.querySelector(\".toast-count-badge\");\r\n if (!badge) {\r\n // Create the badge if it doesn't exist\r\n badge = document.createElement(\"span\");\r\n badge.className = \"toast-count-badge\";\r\n badge.setAttribute(\"aria-label\", `${count} identical notifications`);\r\n\r\n // Style the badge\r\n Object.assign(badge.style, {\r\n position: \"absolute\",\r\n top: \"6px\",\r\n right: \"6px\",\r\n backgroundColor: \"#f44336\",\r\n color: \"#fff\",\r\n borderRadius: \"50%\",\r\n minWidth: \"20px\",\r\n height: \"20px\",\r\n fontSize: \"12px\",\r\n fontWeight: \"600\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"center\",\r\n border: \"2px solid #fff\",\r\n boxShadow: \"0 2px 6px rgba(0,0,0,0.3)\",\r\n zIndex: \"2\",\r\n pointerEvents: \"none\",\r\n transition: \"transform 150ms ease\",\r\n });\r\n\r\n // Add the badge to the outer toast wrapper\r\n outer.appendChild(badge);\r\n }\r\n\r\n // Update the badge text content\r\n badge.textContent = count > 99 ? \"99+\" : String(count);\r\n\r\n // Animate the badge by scaling it up and then back down\r\n try {\r\n badge.style.transform = \"scale(1.2)\";\r\n setTimeout(() => (badge.style.transform = \"scale(1)\"), 150);\r\n } catch (error) {\r\n console.error(\"updateBadge animation error:\", error);\r\n }\r\n}\r\n","// src/index.js\r\n\"use strict\";\r\n\r\nimport { showToast } from \"./components/ToastManager.js\";\r\nimport { getOrCreateToastContainer } from \"./utils/containerRegistry.js\";\r\nimport { getTextColor } from \"./utils/dom.js\";\r\nimport { setPosition } from \"./utils/position.js\";\r\n\r\n// Protected state with fallbacks\r\nlet defaultColors = {\r\n success: \"#28a745\",\r\n error: \"#dc3545\",\r\n warning: \"#ffc107\",\r\n info: \"#17a2b8\",\r\n};\r\n\r\nlet defaultMessages = {\r\n success: \"Operation completed successfully!\",\r\n error: \"Something went wrong!\",\r\n warning: \"Warning message!\",\r\n info: \"Information message!\",\r\n};\r\n\r\n/**\r\n * Create toast with satellite-grade reliability\r\n */\r\n// Toast queue for calls before DOM ready\r\nconst pendingToasts = [];\r\n\r\n// Flag to indicate DOM ready for toast execution\r\nlet domReady = false;\r\n\r\n// DOM ready check\r\nasync function checkDOMReady() {\r\n if (domReady) return;\r\n\r\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\r\n if (\r\n document.readyState === \"complete\" ||\r\n document.readyState === \"interactive\"\r\n ) {\r\n domReady = true;\r\n // Flush queued toasts after 2s delay\r\n pendingToasts.forEach((options) =>\r\n setTimeout(() => createToastNow(options), 2000)\r\n );\r\n pendingToasts.length = 0;\r\n } else {\r\n // Wait for DOMContentLoaded\r\n document.addEventListener(\r\n \"DOMContentLoaded\",\r\n () => {\r\n domReady = true;\r\n pendingToasts.forEach((options) =>\r\n setTimeout(() => createToastNow(options), 2000)\r\n );\r\n pendingToasts.length = 0;\r\n },\r\n { once: true }\r\n );\r\n }\r\n }\r\n}\r\n\r\n// Core toast creation logic\r\nasync function createToastNow(options = {}) {\r\n try {\r\n const sanitizedOptions = await sanitizeToastOptions(options);\r\n await createFirstToastContainer(sanitizedOptions);\r\n await showToast(sanitizedOptions);\r\n } catch (error) {\r\n console.error(\"CreateToast failed:\", error);\r\n\r\n const safeMessage =\r\n typeof options?.message === \"string\" && options?.message !== null\r\n ? `${options?.message?.substring(0, 200)} toast creation failed!`\r\n : \"Toast creation failed!\";\r\n\r\n alert(safeMessage);\r\n }\r\n}\r\n\r\nlet initialDelayDone = false; // flag to ensure single execution\r\n\r\n// Public API\r\nasync function createToast(options = {}) {\r\n // Check browser environment\r\n const isBrowser =\r\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\r\n\r\n if (!isBrowser) {\r\n console.warn(\r\n \"ToastNotification: running in non-browser environment, no DOM available.\"\r\n );\r\n return;\r\n }\r\n\r\n // Check if DOM ready\r\n await checkDOMReady();\r\n\r\n if (!domReady) {\r\n // Queue for later execution\r\n pendingToasts.push(options);\r\n return;\r\n }\r\n\r\n // If DOM ready → execute after 2s delay\r\n if (!initialDelayDone) {\r\n // First call → wait 2 seconds\r\n initialDelayDone = true;\r\n setTimeout(await createToastNow(options), 2000);\r\n } else {\r\n // Subsequent calls → run immediately\r\n await createToastNow(options);\r\n }\r\n}\r\n\r\nasync function createFirstToastContainer(options) {\r\n try {\r\n // Single source of truth for containers; prevents same-id duplicates\r\n const toastContainer = await getOrCreateToastContainer(\r\n options,\r\n setPosition\r\n );\r\n return toastContainer;\r\n } catch (error) {\r\n console.error(\"Failed to create toast container:\", error);\r\n // Fallback: return body element\r\n return document.body;\r\n }\r\n}\r\n\r\n/**\r\n * Sanitizes and normalizes toast options.\r\n * Fills in defaults, validates input, and ensures colors & messages are set.\r\n * @param {Object} options - User-provided toast options\r\n * @returns {Promise<Object>} final sanitized toast options\r\n */\r\nasync function sanitizeToastOptions(options) {\r\n const contPosition = options?.position?.toLowerCase()?.trim();\r\n const contMaxWidth =\r\n contPosition?.includes(\"top-full-width\") ||\r\n contPosition?.includes(\"bottom-full-width\")\r\n ? \"100vw\"\r\n : \"400px\";\r\n\r\n const defaults = {\r\n pauseOnHover: undefined,\r\n duration: 1800,\r\n position: \"bottom-right\",\r\n type: \"info\",\r\n borderRadius: \"50px\",\r\n backgroundColor: undefined,\r\n textColor: undefined,\r\n showCloseButton: true,\r\n animationDuration: \"0.4s\",\r\n animationType: \"fade\",\r\n animationEasing: \"ease\",\r\n showProgressBar: true,\r\n progressColor: undefined,\r\n progressHeight: \"4px\",\r\n progressPosition: \"bottom\",\r\n fontPosition: \"relative\",\r\n fontPadding: undefined,\r\n fontBorderRadius: undefined,\r\n fontBackgroundColor: undefined,\r\n fontFamily:\r\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\r\n fontSize: \"14px\",\r\n fontWeight: \"400\",\r\n fontLineHeight: \"1.4\",\r\n fontDirection: \"auto\",\r\n wrapText: \"normal\",\r\n maxWidth: contMaxWidth,\r\n };\r\n\r\n // Merge defaults with user options\r\n const final = {\r\n ...defaults,\r\n ...(typeof options === \"object\" && !Array.isArray(options) ? options : {}),\r\n };\r\n\r\n // Ensure message property separately\r\n final.message = options?.message ?? final.message;\r\n\r\n try {\r\n // Background color fallback based on type or system preference\r\n if (!final.backgroundColor) {\r\n final.backgroundColor =\r\n defaultColors?.[final.type] ??\r\n (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\r\n ? \"#f5f5f5\"\r\n : \"#111111\");\r\n }\r\n\r\n // Default message if not provided\r\n final.message =\r\n final.message || defaultMessages?.[final.type] || \"No Message Provided!\";\r\n\r\n // Ensure textColor is set\r\n if (!final.textColor && final.backgroundColor) {\r\n const textColorResult = await getTextColor(final.backgroundColor);\r\n final.textColor = textColorResult?.color;\r\n }\r\n\r\n // Ensure progressColor is set\r\n if (!final.progressColor && final.backgroundColor) {\r\n if (final.textColor) {\r\n final.progressColor = final.textColor;\r\n } else {\r\n const barColorResult = await getTextColor(final.backgroundColor);\r\n final.progressColor = barColorResult?.color;\r\n }\r\n }\r\n } catch (error) {\r\n console.warn(\"Option processing failed:\", error);\r\n }\r\n\r\n // Safety check for message type\r\n if (typeof final.message !== \"string\") {\r\n final.message = \"No Message Provided!\";\r\n }\r\n\r\n return final;\r\n}\r\n\r\n/**\r\n * Set default colors with validation\r\n */\r\nfunction setDefaultColors(colors) {\r\n try {\r\n if (colors && typeof colors === \"object\" && !Array.isArray(colors)) {\r\n defaultColors = { ...defaultColors, ...colors };\r\n }\r\n } catch (error) {\r\n console.error(\"setDefaultColors failed:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Set default messages with validation\r\n */\r\nfunction setDefaultMessages(messages) {\r\n try {\r\n if (messages && typeof messages === \"object\" && !Array.isArray(messages)) {\r\n defaultMessages = { ...defaultMessages, ...messages };\r\n }\r\n } catch (error) {\r\n console.error(\"setDefaultMessages failed:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Remove toast notifications from the DOM.\r\n *\r\n * @async\r\n * @function noop\r\n * @param {\"all\"} [mode] - If `\"all\"`, removes all matching toast elements.\r\n * Otherwise, removes only the first matching toast.\r\n * @returns {Promise<void>} Resolves when removal is attempted.\r\n */\r\nconst noop = async function (mode) {\r\n try {\r\n const selector =\r\n mode === \"all\"\r\n ? '[id^=\"toast-container-\"][role=\"status\"]'\r\n : '[id^=\"toast-\"]:not([id*=\"container\"])';\r\n\r\n const elements =\r\n mode === \"all\"\r\n ? document.querySelectorAll(selector)\r\n : [document.querySelector(selector)].filter(Boolean);\r\n\r\n elements.forEach((el) => {\r\n if (typeof el?.remove === \"function\") {\r\n el.remove();\r\n } else if (el) {\r\n throw new TypeError(\"Element exists but remove() is not a function\");\r\n }\r\n });\r\n } catch (error) {\r\n console.error(\"noop failed @ignore:\", error);\r\n }\r\n};\r\n\r\n// Module exports\r\nexport { createToast, setDefaultColors, setDefaultMessages, noop };\r\n\r\n// Global assignment with protection\r\ntry {\r\n // UMD/Global support\r\n if (typeof window !== \"undefined\") {\r\n window.customizableToast = {\r\n createToast,\r\n setDefaultColors,\r\n setDefaultMessages,\r\n noop,\r\n };\r\n }\r\n} catch (error) {\r\n console.error(\"Global assignment failed:\", error);\r\n}\r\n"],"names":["async","generateUniqueId","prefix","Date","now","Math","floor","random","getTextColor","toastBg","opa","bgColor","options","threshold","parsed","parseCssColor","resolveVarElement","color","contrast","meetsAA","blackContrast","whiteContrast","used","bgRgb","undefined","a","under","underlyingColor","p","r","g","b","fg","bg","round","blendOver","bgLum","relativeLuminance","contrastRatio","targetL","min","max","generatedHex","lin","c","pow","linearToSrgbComp","_toHex","genGrayHexFromLinearLum","genLum","parseInt","slice","genContrast","getAccessibleTextColor","error","n","toString","input","_document","document","documentElement","trim","s","startsWith","window","varName","val","getComputedStyle","getPropertyValue","ctx","createElement","getContext","fillStyle","computed","rgbaMatch","match","parseHexColor","test","black","white","transparent","toLowerCase","hexString","hex","replace","length","split","map","join","srgbToLinear","rgb","l1","l2","applyRichStyling","toast","onClose","animDurationMs","duration","endsWith","parseFloat","parseAnimationDuration","animationDuration","Object","assign","style","background","backgroundColor","padding","marginBottom","borderRadius","overflow","display","alignItems","justifyContent","boxShadow","minWidth","maxWidth","opacity","position","transition","animationEasing","transform","zIndex","_animationDuration","messageSpan","fontPosition","flex","fontPadding","fontBorderRadius","fontBackgroundColor","fontFamily","fontSize","fontWeight","lineHeight","fontLineHeight","textColor","userSelect","wordBreak","direction","fontDirection","webkitLineClamp","webkitBoxOrient","whiteSpace","wrapText","textOverflow","lineClamp","boxOrient","textContent","message","setAttribute","appendChild","cfg","cta","label","isLink","href","variant","el","target","rel","type","ariaLabel","marginLeft","border","cursor","flexShrink","addEventListener","onClick","ret","e","then","autoClose","createCTA","showCloseButton","closeButton","onclick","_cleanupCloseButton","createCloseButton","showProgressBar","progressBar","left","height","progressHeight","progressColor","width","progressPosition","setTimeout","offsetWidth","forceReflow","createProgressBar","requestAnimationFrame","runToastAnimation","createEmergencyToast","emergency","id","innerHTML","_isEmergencyToast","parentNode","removeChild","emergencyError","alert","alertError","createToastElement","querySelector","tagName","fallbackTag","fallbackPrefix","fallbackEl","fallbackError","createElementWithId","containerRegistry","Map","containerLocks","getContainerId","String","normalizePositionKey","getOrCreateToastContainer","setPosition","has","get","cached","isConnected","getElementById","body","inset","flexDirection","all","querySelectorAll","i","remove","set","delete","container","Error","top","bottom","right","resetContainerStyles","positionFlags","pos","hasTop","includes","hasBottom","hasLeft","hasRight","hasCenter","hasFullWidth","parsePosition","flags","handleFullWidthPositions","handleCenterPositions","applyStandardPositioning","PausableTimer","constructor","callback","delay","this","remaining","startTime","timeoutId","isPaused","isCompleted","start","pause","clearTimeout","resume","clear","getRemainingTime","active","pending","queue","visibleCount","hashString","str","h","charCodeAt","makeKey","createOne","key","initialCount","TypeError","closeToast","outer","inner","shouldPauseOnHover","pauseOnHover","data","count","timeout","_key","updateBadge","timer","createDismissTimer","setupPauseOnHover","err","onMouseEnter","onMouseLeave","onFocusIn","matches","onFocusOut","contains","relatedTarget","_pauseCleanup","removeEventListener","_data$timer","_data$outer","_data$outer$_pauseCle","call","badge","Promise","resolve","done","finish","_el$parentNode","pointerEvents","hideError","removeElement","child","firstElementChild","onEnd","removeWithTransition","drainQueue","item","shift","HTMLElement","className","defaultColors","success","warning","info","defaultMessages","pendingToasts","domReady","createToastNow","sanitizedOptions","_options$position","contPosition","contMaxWidth","final","animationType","Array","isArray","_defaultMessages","_defaultColors","matchMedia","textColorResult","barColorResult","sanitizeToastOptions","createFirstToastContainer","current","entry","rafId","push","showToast","_options$message","safeMessage","substring","initialDelayDone","createToast","readyState","forEach","once","checkDOMReady","setDefaultColors","colors","setDefaultMessages","messages","noop","mode","selector","filter","Boolean","customizableToast"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,6 +7,15 @@ declare function setDefaultColors(colors: any): void;
|
|
|
7
7
|
* Set default messages with validation
|
|
8
8
|
*/
|
|
9
9
|
declare function setDefaultMessages(messages: any): void;
|
|
10
|
-
|
|
10
|
+
/**
|
|
11
|
+
* Remove toast notifications from the DOM.
|
|
12
|
+
*
|
|
13
|
+
* @async
|
|
14
|
+
* @function noop
|
|
15
|
+
* @param {"all"} [mode] - If `"all"`, removes all matching toast elements.
|
|
16
|
+
* Otherwise, removes only the first matching toast.
|
|
17
|
+
* @returns {Promise<void>} Resolves when removal is attempted.
|
|
18
|
+
*/
|
|
19
|
+
declare function noop(mode?: "all"): Promise<void>;
|
|
11
20
|
|
|
12
21
|
export { createToast, noop, setDefaultColors, setDefaultMessages };
|