customizable-toast-notification 3.12.4 → 3.15.0
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/CHANGELOG.md +38 -0
- package/README.md +96 -37
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +32 -3
- package/dist/index.esm.mjs +3 -3
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +3 -3
- package/dist/index.umd.js.map +1 -1
- package/package.json +3 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.cjs","sources":["../src/utils/dom.js","../src/utils/html-sanitizer.js","../src/components/toast-utils.js","../src/components/loader.js","../src/components/toast-utils-core.js","../src/utils/containerRegistry.js","../src/utils/position.js","../src/utils/PausableTimer.js","../src/components/ToastManager.js","../src/components/Toast.js","../src/utils/id.js","../src/index.js"],"sourcesContent":["\"use strict\";\n\nimport { generateToastId } from \"./id.js\";\n\nexport async function createElementWithId(tagName, prefix) {\n if (!tagName || !prefix) throw new Error(\"tagName and prefix are required\");\n const el = document.createElement(tagName);\n el.id = generateToastId(prefix);\n return el;\n}\n\nexport async function appendChild(parent, child) {\n if (!parent || !child) return false;\n\n try {\n if (!parent.contains(child)) parent.appendChild(child);\n return true;\n } catch (primaryError) {\n console.warn(\"appendChild primary failed:\", primaryError);\n try {\n parent.insertAdjacentElement(\"beforeend\", child);\n return true;\n } catch (fallbackError) {\n console.warn(\"appendChild fallback failed:\", fallbackError);\n try {\n if (parent === document.body) {\n console.warn(\n \"appendChild: using last-resort cloneNode fallback — the \" +\n \"appended element's event listeners (close button, CTA \" +\n \"clicks, etc.) will NOT work, since cloneNode() does not \" +\n \"copy JS-attached listeners. This path only runs when both \" +\n \"the primary appendChild and insertAdjacentElement calls \" +\n \"already failed.\",\n );\n const clone = child.cloneNode(true);\n parent.appendChild(clone);\n return false; // Return false to indicate fallback was used and listeners lost\n }\n } catch (emergencyError) {\n console.error(\"appendChild emergency failed:\", emergencyError);\n return false;\n }\n }\n }\n return false;\n}\n\nexport async function removeElement(el) {\n if (!el) return true;\n\n try {\n if (typeof el.remove === \"function\") {\n el.remove();\n return true;\n }\n } catch {}\n\n try {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n return true;\n }\n } catch {}\n\n return false;\n}\n\nexport async function parseAnimationDuration(duration) {\n if (typeof duration === \"number\" && Number.isFinite(duration) && duration > 0) return duration;\n if (typeof duration === \"string\") {\n if (duration.endsWith(\"s\") && !duration.endsWith(\"ms\")) {\n const parsed = parseFloat(duration) * 1000;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 500;\n }\n const parsed = parseFloat(duration);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 500;\n }\n return 500;\n}\n\nexport function forceReflow(el) {\n try {\n return el?.offsetWidth || 0;\n } catch (error) {\n console.warn(\"Force reflow failed:\", error);\n return 0;\n }\n}\n\nexport function query(selector, root = (typeof document !== \"undefined\" ? document : null)) {\n return root?.querySelector ? root.querySelector(selector) : null;\n}\n\nclass LRUCache {\n constructor(maxSize = 200) {\n this.maxSize = maxSize;\n this.map = new Map();\n }\n\n get(key) {\n if (!this.map.has(key)) return undefined;\n const value = this.map.get(key);\n this.map.delete(key);\n this.map.set(key, value);\n return value;\n }\n\n set(key, value) {\n if (this.map.has(key)) this.map.delete(key);\n else if (this.map.size >= this.maxSize) {\n const firstKey = this.map.keys().next().value;\n this.map.delete(firstKey);\n }\n this.map.set(key, value);\n }\n}\n\nconst colorCache = new LRUCache(200);\n\nconst namedColors = {\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n grey: [128, 128, 128],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n rebeccapurple: [102, 51, 153],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50],\n};\n\nconst precomputedNamedTextColors = {};\nObject.entries(namedColors).forEach(([name, [r, g, b]]) => {\n const lum = (c) => {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n };\n const L = 0.2126 * lum(r) + 0.7152 * lum(g) + 0.0722 * lum(b);\n const contrastBlack = (L + 0.05) / 0.05;\n const contrastWhite = 1.05 / (L + 0.05);\n precomputedNamedTextColors[name.toLowerCase()] =\n contrastBlack >= contrastWhite ? \"#000000\" : \"#ffffff\";\n});\n\nexport function getDynamicAccessibleTextColorHex(toastBg) {\n if (!toastBg) return \"snow\";\n\n const key = String(toastBg);\n const cached = colorCache.get(key);\n if (cached) return cached;\n\n if (precomputedNamedTextColors[toastBg?.toLowerCase()]) {\n const textColor = precomputedNamedTextColors[toastBg.toLowerCase()];\n colorCache.set(key, textColor);\n return textColor;\n }\n\n let r, g, b;\n\n // AUDIT FIX (H2): this function previously only understood hex and\n // rgb()/rgba() strings. Anything else — hsl(), a CSS custom property\n // like var(--brand), any modern color syntax — fell straight into the\n // catch block below, which used to assign a RANDOM RGB triplet as the\n // \"background\" driving the black-vs-white text decision. For a function\n // whose entire purpose is accessibility, that meant it could pick white\n // text on a light background (or the reverse) for any color format it\n // didn't recognize, and the choice wasn't even stable between calls for\n // the same input. Two changes: (1) genuinely parse hsl()/hsla() and CSS\n // custom properties instead of giving up on them, (2) for the cases\n // that are still truly unparseable, fall back to a fixed neutral\n // midpoint gray instead of Math.random() — deterministic and\n // reasonable, never actively wrong in a random direction.\n function resolveCssCustomProperty(value) {\n const varMatch = value?.match(/^var\\((--[\\w-]+)(?:\\s*,\\s*(.+))?\\)$/i);\n if (!varMatch) return value;\n try {\n if (\n typeof document !== \"undefined\" &&\n typeof getComputedStyle === \"function\"\n ) {\n const resolved = getComputedStyle(document.documentElement)\n .getPropertyValue(varMatch[1])\n .trim();\n if (resolved) return resolved;\n }\n } catch (e) {}\n // Fall back to the var()'s own declared fallback value, if it had one\n // (e.g. var(--brand, #336699)), before giving up entirely.\n return varMatch[2]?.trim() || value;\n }\n\n function parseToRgb(value) {\n const hexMatch = value?.match(/^#([0-9a-f]{3,8})$/i);\n if (hexMatch) {\n let hex = hexMatch[1];\n if (hex.length === 3)\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n };\n }\n\n const rgbMatch = value?.match(\n /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)/i,\n );\n if (rgbMatch) {\n return {\n r: Number(rgbMatch[1]),\n g: Number(rgbMatch[2]),\n b: Number(rgbMatch[3]),\n };\n }\n\n const hslMatch = value?.match(\n /hsla?\\(\\s*([\\d.]+)(?:deg)?\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*[\\d.]+)?\\)/i,\n );\n if (hslMatch) {\n const h = Number(hslMatch[1]) / 360;\n const s = Number(hslMatch[2]) / 100;\n const l = Number(hslMatch[3]) / 100;\n if (s === 0) {\n const gray = Math.round(l * 255);\n return { r: gray, g: gray, b: gray };\n }\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n }\n\n return null;\n }\n\n try {\n const resolvedBg = resolveCssCustomProperty(toastBg);\n const parsed = parseToRgb(resolvedBg);\n if (!parsed) throw new Error(\"Unknown color\");\n ({ r, g, b } = parsed);\n } catch {\n // Deterministic neutral fallback — a mid-gray reads reasonably against\n // either black or white text, and critically, gives the SAME answer\n // every time for the same unparseable input instead of a coin flip.\n r = g = b = 128;\n }\n\n const rgbToHsl = (r, g, b) => {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h,\n s,\n l = (max + min) / 2;\n if (max === min) h = s = 0;\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n }\n h /= 6;\n }\n return [h * 360, s, l];\n };\n const hslToRgb = (h, s, l) => {\n h /= 360;\n let r, g, b;\n if (s === 0) r = g = b = l;\n else {\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n };\n const luminance = (r, g, b) => {\n const a = [r, g, b].map((v) => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n };\n const contrastRatio = (rgb1, rgb2) => {\n const L1 = luminance(...rgb1);\n const L2 = luminance(...rgb2);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n };\n const rgbToHex = (r, g, b) =>\n `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b\n .toString(16)\n .padStart(2, \"0\")}`;\n\n let [h, s, l] = rgbToHsl(r, g, b);\n const minContrast = 4.5;\n let textL = l < 0.5 ? Math.min(l + 0.5, 1) : Math.max(l - 0.5, 0);\n let [tr, tg, tb] = hslToRgb(h, s, textL);\n\n if (contrastRatio([r, g, b], [tr, tg, tb]) < minContrast) {\n const contrastBlack = contrastRatio([r, g, b], [0, 0, 0]);\n const contrastWhite = contrastRatio([r, g, b], [255, 255, 255]);\n [tr, tg, tb] = contrastBlack >= contrastWhite ? [0, 0, 0] : [255, 255, 255];\n }\n\n const result = rgbToHex(tr, tg, tb);\n colorCache.set(key, result);\n return result;\n}\n","// AUDIT FIX (H1): these used to live inside fallbackSanitize() only, which\n// meant sanitizeHtml()'s DOMPurify branch had no way to reference them —\n// it just used DOMPurify's own (much broader) default allowlist instead.\n// Same allowHtml:true input could sanitize completely differently\n// depending on whether some UNRELATED script on the host page happened to\n// load DOMPurify onto window — a security boundary that was an\n// environmental accident rather than a deliberate, consistent policy.\n// Hoisting these to module scope makes them the single source of truth\n// for BOTH paths, so the same input gets the same treatment regardless of\n// which sanitizer implementation actually runs.\nconst ALLOWED_TAGS = new Set([\n \"DIV\",\n \"SPAN\",\n \"P\",\n \"BR\",\n \"STRONG\",\n \"B\",\n \"EM\",\n \"I\",\n \"U\",\n \"SMALL\",\n \"UL\",\n \"OL\",\n \"LI\",\n \"A\",\n \"IMG\",\n \"PRE\",\n \"CODE\",\n \"MARK\",\n]);\n// AUDIT FIX (C1 — security): 'style' was previously allowed through with\n// zero validation, letting an attacker-controlled message (allowHtml:true)\n// inject `position:fixed;inset:0;z-index:999999` and render a full-page\n// clickjacking overlay through a toast that already renders at\n// z-index:9999. Inline style is a well-known sanitizer bypass class (see\n// OWASP's XSS Filter Evasion Cheat Sheet). Removed from the allowlist\n// entirely rather than attempting partial validation — toasts don't need\n// arbitrary inline styling to be useful, and \"no unchecked style\" is the\n// safe default most reputable sanitizers ship with.\nconst ALLOWED_ATTRS = new Set([\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"class\",\n \"target\",\n \"rel\",\n \"loading\",\n]);\n\nconst BLOCKED_TAGS_REGEX = /<\\/?(script|iframe|object|embed|link|meta|style|form|input|button|svg|math|video|audio|details|dialog|applet|frame|frameset|textarea|select|option|optgroup|fieldset|legend|datalist|output|progress|meter|keygen|canvas|map|area|base|basefont|bgsound|blink|center|dir|font|hgroup|isindex|listing|marquee|multicol|nextid|noembed|noframes|plaintext|rb|rtc|spacer|strike|tt|xmp)[^>]*>/gi;\n\nconst EVENT_HANDLER_REGEX = /\\s(on\\w+)\\s*=\\s*(['\"])[\\s\\S]*?\\2/gi;\n\nconst JAVASCRIPT_URI_REGEX = /(href|src)\\s*=\\s*(['\"])\\s*javascript:[^'\"]*\\2/gi;\n\nconst ALLOWED_URI_REGEX = /^\\s*(https?:|data:image\\/)/i;\n\nexport function hasDOMPurify() {\n try {\n if (typeof window !== \"undefined\" && window.DOMPurify) return true;\n } catch (e) {}\n return false;\n}\n\nfunction sanitizeAttributes(el, allowedAttrs) {\n const attrsToRemove = [];\n Array.from(el.attributes || []).forEach((attr) => {\n const name = attr.name.toLowerCase();\n const val = attr.value;\n if (!allowedAttrs.has(name)) {\n attrsToRemove.push(name);\n return;\n }\n if ((name === \"href\" || name === \"src\") && /^\\s*javascript:/i.test(val)) {\n attrsToRemove.push(name);\n return;\n }\n if (name === \"src\" && !/^\\s*(https?:|data:image\\/)/i.test(val)) {\n attrsToRemove.push(name);\n return;\n }\n if (name === \"target\" && val === \"_blank\") {\n const rel = (el.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n el.setAttribute(\"rel\", rel.join(\" \"));\n }\n });\n attrsToRemove.forEach((name) => el.removeAttribute(name));\n}\n\nfunction sanitizeNode(node, allowedTags, allowedAttrs) {\n if (node.nodeType === Node.TEXT_NODE) {\n return document.createTextNode(node.nodeValue);\n }\n if (node.nodeType === Node.COMMENT_NODE) {\n return null;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n const tag = node.tagName.toUpperCase();\n if (!allowedTags.has(tag)) {\n const frag = document.createDocumentFragment();\n Array.from(node.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitized) frag.appendChild(sanitized);\n });\n return frag;\n }\n const el = document.createElement(node.tagName);\n Array.from(node.attributes || []).forEach((attr) => {\n el.setAttribute(attr.name, attr.value);\n });\n sanitizeAttributes(el, allowedAttrs);\n Array.from(node.childNodes).forEach((child) => {\n const sanitizedChild = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitizedChild) el.appendChild(sanitizedChild);\n });\n return el;\n}\n\nexport function fallbackSanitize(dirty) {\n if (!dirty || typeof dirty !== \"string\") return \"\";\n\n let step1 = dirty.replace(BLOCKED_TAGS_REGEX, \"\");\n step1 = step1.replace(EVENT_HANDLER_REGEX, \"\");\n step1 = step1.replace(\n JAVASCRIPT_URI_REGEX,\n \"$1=$2#$2\",\n );\n\n const container = document.createElement(\"div\");\n container.innerHTML = step1;\n\n const outFrag = document.createDocumentFragment();\n Array.from(container.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, ALLOWED_TAGS, ALLOWED_ATTRS);\n if (sanitized) outFrag.appendChild(sanitized);\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.appendChild(outFrag);\n\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n\n return wrapper.innerHTML;\n}\n\nexport function sanitizeHtml(dirty, opts = {}) {\n if (typeof dirty !== \"string\" || !dirty.trim()) return \"\";\n try {\n if (!opts.forceFallback && hasDOMPurify()) {\n const DOMPurify = window.DOMPurify;\n const cleaned = DOMPurify.sanitize(dirty, {\n ALLOWED_TAGS: Array.from(ALLOWED_TAGS),\n ALLOWED_ATTR: Array.from(ALLOWED_ATTRS),\n ALLOWED_URI_REGEXP:\n /^(?:(?:https?|mailto|ftp|tel|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i,\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = cleaned;\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n return wrapper.innerHTML;\n }\n } catch (err) {\n console.warn(\"DOMPurify sanitization failed, falling back:\", err);\n }\n return fallbackSanitize(dirty);\n}","// src/components/toast-utils.js\n\"use strict\";\n\nimport { parseAnimationDuration } from \"../utils/dom.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { createLoader } from \"./loader.js\";\nimport {\n createCTA,\n createCloseButton,\n createProgressBar,\n runToastAnimation,\n} from \"./toast-utils-core.js\";\n\n/**\n * Applies rich styling and content to a toast element.\n * @param {HTMLElement} toast - The toast container element.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n */\nexport async function applyRichStyling(toast, options, onClose) {\n const durationMs = await parseAnimationDuration(options?.animationDuration);\n const validAnimationDuration = `${durationMs}ms`;\n const easing = typeof options?.animationEasing === \"string\" && options.animationEasing.trim()\n ? options.animationEasing.trim()\n : \"ease\";\n\n // Compose className based on provided type and optional custom className\n const customClass = typeof options?.className === \"string\" && options.className.trim()\n ? ` ${options.className.trim()}`\n : \"\";\n toast.className = `toast toast-${options?.type ?? \"info\"}${customClass}`;\n\n Object.assign(toast.style, {\n background: options?.backgroundColor,\n padding: \"12px 16px\",\n marginBottom: \"10px\",\n borderRadius: options?.borderRadius,\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n minWidth: \"250px\",\n maxWidth: options?.maxWidth,\n opacity: \"0\",\n position: \"relative\",\n cursor: \"default\",\n boxSizing: \"border-box\",\n userSelect: \"text\",\n pointerEvents: \"auto\",\n transition: `opacity ${validAnimationDuration} ${easing}, transform ${validAnimationDuration} ${easing}`,\n transform: \"translateY(20px)\",\n zIndex: \"9999\",\n });\n // Accessibility settings\n toast.setAttribute(\"role\", \"alert\");\n toast.setAttribute(\"aria-live\", \"polite\");\n toast.tabIndex = 0; // Make focusable for accessibility if needed\n\n toast._animationDuration = durationMs;\n\n const messageSpan = document.createElement(\"span\");\n\n if (options?.wrapText) {\n Object.assign(messageSpan.style, {\n display: \"block\",\n whiteSpace: \"normal\",\n });\n } else {\n Object.assign(messageSpan.style, {\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: \"3\",\n whiteSpace: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n });\n }\n\n Object.assign(messageSpan.style, {\n flex: \"1\",\n padding: options?.fontPadding,\n fontFamily: options?.fontFamily,\n fontSize: options?.fontSize,\n fontWeight: options?.fontWeight,\n lineHeight: options?.fontLineHeight,\n color: options?.textColor,\n userSelect: \"text\",\n wordBreak: \"break-word\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n direction:\n options?.fontDirection && options.fontDirection !== \"auto\"\n ? options.fontDirection\n : undefined,\n });\n\n const allowHtml = !!options.allowHtml; // opt-in flag\n const rawMessage = options.message ?? \"\";\n\n // If a loader is requested as part of the message, create it safely\n if (options.loader || options.showLoader) {\n // createLoader returns an element (see new function below)\n const loaderEl = createLoader(options.loader || {});\n // Put loader before message content\n messageSpan.appendChild(loaderEl);\n // Small spacer\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.appendChild(spacer);\n }\n\n // If allowHtml is explicitly true, sanitize and set innerHTML, otherwise use textContent\n if (\n allowHtml &&\n typeof rawMessage === \"string\" &&\n rawMessage.trim().length > 0\n ) {\n try {\n const sanitized = sanitizeHtml(rawMessage);\n // Use DOM APIs to set sanitized HTML safely\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n // Move children to messageSpan to avoid re-parsing at outer scope\n while (tmp.firstChild) {\n messageSpan.appendChild(tmp.firstChild);\n }\n } catch (err) {\n console.warn(\n \"HTML message sanitization failed, falling back to text:\",\n err\n );\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n } else {\n // default safe text node mode (preserves loader and spacer elements)\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n\n // Set title for overflow tooltip without masking accessible text\n messageSpan.setAttribute(\n \"title\",\n typeof rawMessage === \"string\"\n ? rawMessage.replace(/<[^>]+>/g, \"\")\n : String(rawMessage)\n );\n toast.appendChild(messageSpan);\n\n if (options?.cta && Object.keys(options.cta).length !== 0) {\n createCTA(toast, options, onClose);\n }\n\n if (options?.showCloseButton) {\n createCloseButton(toast, options, onClose);\n }\n\n if (options?.showProgressBar) {\n createProgressBar(toast, options);\n }\n\n runToastAnimation(toast);\n}\n\n/**\n * Creates an emergency toast as a safe fallback.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n * @returns {Promise<HTMLElement|null>}\n */\nexport async function createEmergencyToast(options, onClose) {\n try {\n const emergency = document.createElement(\"div\");\n const position = options?.position || \"bottom-right\";\n const posFlags = position.toLowerCase().trim();\n let top = \"auto\", bottom = \"auto\", left = \"auto\", right = \"auto\", transform = \"none\";\n\n if (posFlags.startsWith(\"top\")) top = \"20px\";\n else if (posFlags.startsWith(\"bottom\") || posFlags.includes(\"below\")) bottom = \"20px\";\n\n if (posFlags.startsWith(\"left\")) left = \"20px\";\n else if (posFlags.startsWith(\"right\")) right = \"20px\";\n else if (posFlags === \"center\") {\n left = \"50%\"; top = \"50%\"; transform = \"translate(-50%, -50%)\";\n } else if (posFlags.includes(\"center\")) {\n if (posFlags.includes(\"left\")) { left = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"right\")) { right = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"top\")) { top = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n else if (posFlags.includes(\"bottom\")) { bottom = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n } else {\n right = \"20px\"; bottom = \"20px\";\n }\n\n Object.assign(emergency.style, {\n background: \"#333\",\n color: \"white\",\n padding: \"10px 15px\",\n position: \"fixed\",\n top,\n bottom,\n left,\n right,\n transform,\n zIndex: \"99999\",\n borderRadius: \"3px\",\n maxWidth: \"250px\",\n wordWrap: \"break-word\",\n boxShadow: \"0 2px 10px rgba(0,0,0,0.3)\",\n });\n\n const innerWrapper = document.createElement(\"div\");\n const msgEl = document.createElement(\"span\");\n msgEl.style.display = \"inline-block\";\n if (options.allowHtml) {\n msgEl.innerHTML = sanitizeHtml(\n String(options.message || \"Emergency Toast Showing!\")\n );\n } else {\n msgEl.textContent = String(\n options.message || \"Emergency Toast Creation Showing!\"\n );\n }\n innerWrapper.appendChild(msgEl);\n\n const closeSpan = document.createElement(\"span\");\n closeSpan.style.cssText =\n \"float: right; margin-left: 10px; font-weight: bold; cursor: pointer;\";\n closeSpan.textContent = \"×\";\n innerWrapper.appendChild(closeSpan);\n\n while (emergency.firstChild) emergency.removeChild(emergency.firstChild);\n emergency.appendChild(innerWrapper);\n closeSpan.addEventListener(\"click\", () => {\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n });\n\n document.body.appendChild(emergency);\n const duration = Number(options?.duration) || 2500;\n const timer = setTimeout(() => {\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n }, duration);\n if (typeof timer?.unref === \"function\") timer.unref();\n\n return emergency;\n } catch (error) {\n console.error(\"Emergency toast creation failed:\", error);\n if (typeof onClose === \"function\") onClose(null);\n return null;\n }\n}\n","// src/components/loader.js\nexport function createLoader(opts = {}) {\n const safeOpts = opts && typeof opts === \"object\" && !Array.isArray(opts) ? opts : {};\n const size = Number(safeOpts.size) || 14;\n const color = typeof safeOpts.color === \"string\" && safeOpts.color.trim() ? safeOpts.color.trim() : \"currentColor\";\n const labelText = typeof safeOpts.text === \"string\" ? safeOpts.text : \"\";\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"toast-loader\";\n wrapper.style.display = \"inline-flex\";\n wrapper.style.alignItems = \"center\";\n wrapper.style.gap = \"8px\";\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 50 50\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n // spinner circle\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"cx\", \"25\");\n circle.setAttribute(\"cy\", \"25\");\n circle.setAttribute(\"r\", \"20\");\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", color);\n circle.setAttribute(\"stroke-width\", \"4\");\n circle.setAttribute(\"stroke-linecap\", \"round\");\n circle.style.opacity = \"0.85\";\n circle.style.strokeDasharray = \"90\";\n circle.style.strokeDashoffset = \"60\";\n circle.style.transformOrigin = \"center\";\n circle.style.animation = \"toast-spinner 1s linear infinite\";\n\n svg.appendChild(circle);\n wrapper.appendChild(svg);\n\n if (labelText) {\n const lbl = document.createElement(\"span\");\n lbl.style.fontSize = \"13px\";\n lbl.textContent = labelText;\n wrapper.appendChild(lbl);\n }\n\n // add minimal spinner keyframes if not present\n if (typeof document !== \"undefined\" && !document.getElementById(\"toast-spinner-styles\")) {\n const st = document.createElement(\"style\");\n st.id = \"toast-spinner-styles\";\n st.textContent = `@keyframes toast-spinner { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }`;\n const target = document.head || document.documentElement;\n if (target) target.appendChild(st);\n }\n\n return wrapper;\n}\n","\"use strict\";\n\nimport { getDynamicAccessibleTextColorHex } from \"../utils/dom.js\";\n\nexport function createCTA(toast, options, onClose) {\n const rawCfg = options?.cta;\n if (!rawCfg || typeof rawCfg !== \"object\" || Array.isArray(rawCfg)) return;\n\n const cfg = { ...rawCfg };\n\n if (!cfg.label) {\n cfg.label = \"CTA Label Missing!\";\n }\n\n const isLink = !!cfg.href && cfg.variant === \"link\";\n const el = document.createElement(isLink ? \"a\" : \"button\");\n\n if (isLink) {\n el.href = cfg.href;\n if (cfg.target) el.target = cfg.target;\n el.rel = cfg.rel || (cfg.target === \"_blank\" ? \"noopener noreferrer\" : \"\");\n } else {\n el.type = \"button\";\n }\n\n el.setAttribute(\"aria-label\", cfg.ariaLabel || cfg.label);\n\n const ctaTextColor = options.textColor || getDynamicAccessibleTextColorHex(options.backgroundColor);\n const ctaBgColor = options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.15)\";\n\n const isHex6 = typeof ctaTextColor === \"string\" && /^#[0-9a-fA-F]{6}$/.test(ctaTextColor.trim());\n const ctaBorderColor = isHex6 ? `${ctaTextColor.trim()}44` : \"rgba(128, 128, 128, 0.3)\";\n\n Object.assign(el.style, {\n marginLeft: \"10px\",\n padding: \"6px 10px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n lineHeight: \"1\",\n border: `1px solid ${ctaBorderColor}`,\n color: ctaTextColor,\n background: ctaBgColor,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n });\n\n el.textContent = cfg.label;\n\n const onClick = async (e) => {\n try {\n if (typeof cfg.onClick === \"function\") {\n const res = cfg.onClick(e);\n if (res?.then) await res;\n }\n } catch (err) {\n console.error(\"CTA onClick handler error:\", err);\n } finally {\n if (cfg.autoClose !== false && typeof onClose === \"function\") {\n onClose(toast);\n }\n }\n };\n\n el.addEventListener(\"click\", onClick);\n\n el._cleanup = () => el.removeEventListener(\"click\", onClick);\n toast._cleanupCTA = () => el.removeEventListener(\"click\", onClick);\n\n toast.appendChild(el);\n}\n\nexport function createCloseButton(toast, options, onClose) {\n const closeBtn = document.createElement(\"button\");\n closeBtn.setAttribute(\"aria-label\", \"Close notification\");\n closeBtn.setAttribute(\"title\", \"Close\");\n closeBtn.textContent = \"×\";\n\n const closeTextColor = options.textColor || getDynamicAccessibleTextColorHex(options.backgroundColor);\n\n Object.assign(closeBtn.style, {\n background: \"none\",\n border: \"none\",\n color: closeTextColor,\n fontSize: \"18px\",\n marginLeft: \"10px\",\n cursor: \"pointer\",\n lineHeight: \"1\",\n padding: \"0 4px\",\n });\n\n const onClick = () => {\n if (typeof onClose === \"function\") onClose(toast);\n };\n closeBtn.addEventListener(\"click\", onClick);\n\n toast._cleanupCloseButton = () => {\n closeBtn.removeEventListener(\"click\", onClick);\n };\n\n toast.appendChild(closeBtn);\n}\n\nfunction getContrastBackground(bgColor) {\n if (!bgColor) return \"rgba(255,255,255,0.15)\";\n const textColor = getDynamicAccessibleTextColorHex(bgColor);\n if (textColor === \"#000000\") {\n return \"rgba(0,0,0,0.15)\";\n }\n return \"rgba(255,255,255,0.15)\";\n}\n\nexport function createProgressBar(toast, options) {\n const progressBar = document.createElement(\"div\");\n const borderRadiusStr = options.borderRadius || \"0\";\n const borderRadiusNum = parseInt(borderRadiusStr, 10);\n\n const progressHeightPx = parseInt(options.progressHeight, 10) || 4;\n const duration = Number(options.duration ?? 2500);\n const progressDuration = duration + 5;\n\n const leftOffset = Math.min(borderRadiusNum, progressHeightPx * 2);\n const finalWidth = borderRadiusNum > 0\n ? `calc(100% - ${leftOffset}px)`\n : \"100%\";\n\n Object.assign(progressBar.style, {\n position: \"absolute\",\n left: `${leftOffset}px`,\n height: `${progressHeightPx}px`,\n background: options.progressColor || \"currentColor\",\n width: `${finalWidth}`,\n transition: `width ${progressDuration}ms linear`,\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\n borderRadius: `${progressHeightPx / 2}px`,\n opacity: \"0.8\",\n });\n\n toast.appendChild(progressBar);\n\n if (typeof progressBar.animate === \"function\") {\n toast._progressAnimation = progressBar.animate(\n [{ width: finalWidth }, { width: \"0%\" }],\n {\n duration: progressDuration,\n easing: \"linear\",\n fill: \"forwards\",\n delay: 50,\n },\n );\n } else {\n progressBar.style.transition = `width ${progressDuration}ms linear`;\n setTimeout(() => {\n progressBar.offsetWidth;\n progressBar.style.width = \"0%\";\n }, 50);\n }\n}\n\nexport function runToastAnimation(toast) {\n const delay = 50;\n setTimeout(() => {\n requestAnimationFrame(() => {\n toast.style.opacity = \"1\";\n toast.style.transform = \"translateY(0)\";\n });\n }, delay);\n}","// src/utils/containerRegistry.js\n\"use strict\";\n\nconst containerRegistry = new Map(); // id -> HTMLElement\nconst containerLocks = new Map(); // id -> Promise<HTMLElement>\n\n/**\n * Normalize a position string to a canonical key (id-safe, stable).\n */\nexport function normalizePositionKey(position) {\n if (!position || typeof position !== \"string\") return \"bottom-right\";\n const raw = position.toLowerCase().trim();\n if (!raw) return \"bottom-right\";\n const aliased = raw.replace(/\\bbelow\\b/g, \"bottom\");\n return aliased\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-{2,}/g, \"-\");\n}\n\n/**\n * Canonical container id\n */\nexport function getContainerId(position) {\n const pos = normalizePositionKey(position);\n return `toast-container-${pos}`;\n}\n\nexport function resetContainerRegistry() {\n containerRegistry.clear();\n containerLocks.clear();\n}\n\n/**\n * Atomically get or create a single container per canonical id.\n */\nexport async function getOrCreateToastContainer(options, setPosition) {\n const id = getContainerId(options?.position || \"bottom-right\");\n // If a creation is in-flight, await it\n if (containerLocks.has(id)) {\n return containerLocks.get(id);\n }\n\n const p = (async () => {\n // 1) Prefer registry cache if still connected to current document\n const cached = containerRegistry.get(id);\n const isCurrentDoc = typeof document === \"undefined\" || cached?.ownerDocument === document;\n if (cached?.isConnected && isCurrentDoc) {\n return cached;\n }\n // Clean up stale registry entry if container was removed from DOM or from old document\n if (cached) {\n containerRegistry.delete(id);\n }\n\n // 2) Find existing in DOM\n let el = document.getElementById(id); // unique by spec, but may return first if duplicates exist\n if (el && !el.isConnected) {\n // re-attach if detached\n document.body.appendChild(el);\n }\n\n // 3) If not found, create\n if (!el) {\n el = document.createElement(\"div\");\n el.id = id;\n el.setAttribute(\"role\", \"status\"); // polite + atomic by default\n el.setAttribute(\"aria-atomic\", \"true\"); // explicit for consistency\n el.style.position = \"fixed\";\n el.style.zIndex = \"9999\";\n el.style.pointerEvents = \"none\";\n el.style.inset = \"auto 10px 10px auto\";\n el.style.display = \"flex\";\n el.style.justifyContent = \"space-between\";\n el.style.alignItems = \"center\";\n el.style.flexDirection = \"column\";\n el.style.overflow = \"hidden\";\n // Position with provided helper\n if (typeof setPosition === \"function\") {\n await setPosition(el, options);\n }\n document.body.appendChild(el);\n } else {\n // Ensure base styles and (re)apply position in case options changed\n el.style.position = el.style.position || \"fixed\";\n el.style.zIndex = el.style.zIndex || \"9999\";\n if (typeof setPosition === \"function\") {\n await setPosition(el, options);\n }\n }\n\n // 4) If somehow duplicates exist, keep the first and remove the rest\n // getElementById would have returned the first; clean up others proactively\n const all = document.querySelectorAll(`#${id}`);\n if (all.length > 1) {\n for (let i = 1; i < all.length; i++) {\n try {\n all[i].remove();\n } catch {}\n }\n }\n\n containerRegistry.set(id, el);\n return el;\n })();\n\n containerLocks.set(id, p);\n try {\n const out = await p;\n return out;\n } finally {\n // Clear the lock so future calls can re-enter if needed\n containerLocks.delete(id);\n }\n}\n","\"use strict\";\n\nconst DOCUMENTED_POSITIONS = new Set([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"top-center\",\n \"bottom-center\",\n \"left-center\",\n \"right-center\",\n \"top-full-width\",\n \"bottom-full-width\",\n \"center\",\n]);\n\nconst LEGACY_POSITIONS = new Set([\"top\", \"bottom\"]);\n\nfunction isDocumentedPosition(pos) {\n return DOCUMENTED_POSITIONS.has(pos);\n}\n\nexport async function setPosition(container, options) {\n if (!container || !options?.position) {\n throw new Error(\"Invalid container or position!\");\n }\n\n const rawPos = String(options.position).toLowerCase().trim();\n let effectivePos = rawPos;\n\n if (!isDocumentedPosition(rawPos) && !LEGACY_POSITIONS.has(rawPos)) {\n console.warn(`Unknown position \"${options.position}\", defaulting to \"bottom-right\"`);\n effectivePos = \"bottom-right\";\n }\n\n resetContainerStyles(container);\n const positionFlags = parsePosition(effectivePos);\n\n if (handleFullWidthPositions(container, options, positionFlags)) return;\n if (handleCenterPositions(container, positionFlags)) return;\n\n applyStandardPositioning(container, positionFlags);\n}\n\nfunction resetContainerStyles(container) {\n container.style.top = \"auto\";\n container.style.bottom = \"auto\";\n container.style.left = \"auto\";\n container.style.right = \"auto\";\n container.style.transform = \"none\";\n}\n\nfunction parsePosition(position) {\n const pos = position.toLowerCase().trim();\n\n const hasTop = pos.startsWith(\"top\");\n const hasBottom = pos.startsWith(\"bottom\") || pos.startsWith(\"below\");\n const hasLeft = pos.startsWith(\"left\");\n const hasRight = pos.startsWith(\"right\");\n const hasCenter = pos === \"center\" || (pos.includes(\"center\") && !pos.includes(\"left\") && !pos.includes(\"right\") && !pos.includes(\"top\") && !pos.includes(\"bottom\"));\n\n const isFullWidth = pos === \"top-full-width\" || pos === \"bottom-full-width\";\n\n return {\n hasTop,\n hasBottom,\n hasLeft,\n hasRight,\n hasCenter,\n hasFullWidth: isFullWidth,\n };\n}\n\nfunction handleFullWidthPositions(container, options, flags) {\n if (!flags.hasFullWidth) return false;\n\n container.style.maxWidth = \"100vw\";\n try {\n if (options && !options.maxWidth) {\n options.maxWidth = \"100vw\";\n }\n } catch {}\n\n if (flags.hasTop) {\n container.style.top = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n return false;\n}\n\nfunction handleCenterPositions(container, flags) {\n if (!flags.hasCenter) return false;\n\n if (flags.hasTop && !flags.hasLeft && !flags.hasRight) {\n container.style.top = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasBottom && !flags.hasLeft && !flags.hasRight) {\n container.style.bottom = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasLeft && !flags.hasTop && !flags.hasBottom) {\n container.style.left = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.right = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (!flags.hasLeft && !flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.top = \"50%\";\n container.style.left = \"50%\";\n container.style.transform = \"translate(-50%, -50%)\";\n return true;\n }\n\n return false;\n}\n\nfunction applyStandardPositioning(container, flags) {\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n } else if (flags.hasTop) {\n container.style.top = \"10px\";\n } else {\n container.style.bottom = \"10px\";\n }\n\n if (flags.hasRight) {\n container.style.right = \"10px\";\n } else if (flags.hasLeft) {\n container.style.left = \"10px\";\n } else {\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n }\n}","// src/utils/PausableTimer.js\n\"use strict\";\n\nexport class PausableTimer {\n constructor(callback, delay) {\n this.callback = typeof callback === \"function\" ? callback : () => {};\n const safeDelay = Number.isFinite(delay) && delay >= 0 ? delay : 0;\n this.delay = safeDelay;\n this.remaining = safeDelay;\n this.startTime = null;\n this.timeoutId = null;\n this.isPaused = false;\n this.isCompleted = false;\n }\n\n start() {\n if (this.isCompleted || this.timeoutId) return this;\n this.startTime = Date.now();\n this.timeoutId = setTimeout(() => {\n this.isCompleted = true;\n this.timeoutId = null;\n try {\n this.callback();\n } catch (err) {\n console.error(\"PausableTimer callback error:\", err);\n }\n }, this.remaining);\n if (typeof this.timeoutId?.unref === \"function\") {\n this.timeoutId.unref();\n }\n return this;\n }\n\n pause() {\n if (this.isPaused || !this.timeoutId || this.isCompleted) return this;\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n this.remaining -= Date.now() - this.startTime;\n this.remaining = Math.max(0, this.remaining); // prevent negative\n this.isPaused = true;\n return this;\n }\n\n resume() {\n if (!this.isPaused || this.isCompleted) return this;\n this.isPaused = false;\n this.start();\n return this;\n }\n\n clear() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.isCompleted = true;\n return this;\n }\n\n getRemainingTime() {\n if (this.isCompleted) return 0;\n if (this.isPaused) return this.remaining;\n if (!this.timeoutId) return this.delay;\n return Math.max(0, this.remaining - (Date.now() - this.startTime));\n }\n}\n","\"use strict\";\n\nimport { createToastElement } from \"./Toast.js\";\nimport { removeElement } from \"../utils/dom.js\";\nimport { createEmergencyToast } from \"./toast-utils.js\";\nimport { getOrCreateToastContainer, normalizePositionKey } from \"../utils/containerRegistry.js\";\nimport { setPosition } from \"../utils/position.js\";\nimport { PausableTimer } from \"../utils/PausableTimer.js\";\n\nconst MAX_VISIBLE = 3;\n\nconst active = new Map();\nconst pending = new Map();\nconst queue = [];\nlet visibleCount = 0;\n\nfunction hashString(str) {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction makeKey(options = {}) {\n const safe = options && typeof options === \"object\" ? options : {};\n const type = String(safe.type || \"info\").trim().toLowerCase();\n const messageHash = hashString(String(safe.message || \"\")).toString(16);\n const position = normalizePositionKey(safe.position || \"bottom-right\");\n\n return `${type}|${messageHash}|${position}`;\n}\n\nexport async function showToast(options = {}) {\n try {\n const key = makeKey(options);\n\n if (active.has(key)) {\n const data = active.get(key);\n if (!data) throw new Error(`Active toast with key ${key} not found`);\n data.count++;\n\n data.timer.clear();\n data.timer = createDismissTimer(data.toast, options);\n await setupPauseOnHover(data);\n await updateBadge(data);\n return key;\n }\n\n if (pending.has(key)) {\n const current = pending.get(key);\n if (!current) throw new Error(`Pending toast with key ${key} not found`);\n current.count++;\n return key;\n }\n\n const entry = { options, count: 1, rafId: 0 };\n pending.set(key, entry);\n\n entry.rafId = requestAnimationFrame(async () => {\n const current = pending.get(key);\n if (!current) return;\n pending.delete(key);\n\n if (visibleCount >= MAX_VISIBLE) {\n queue.push({ options: current.options, key, count: current.count });\n await drainQueue();\n return;\n }\n\n try {\n await createOne(current.options, key, current.count);\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n });\n\n // AUDIT/FEATURE (toastPromise support): returns the computed key so\n // callers can build a handle for targeted dismissal later — e.g.\n // toastPromise() needs to dismiss THIS SPECIFIC loading toast when the\n // promise settles, not whatever happens to be \"most recent\" by then.\n // This does NOT change when showToast() resolves (still resolves\n // right after scheduling the rAF callback, same as before) — it only\n // adds a return VALUE where there was none. The actual toast element\n // is still created asynchronously afterward, same as always.\n return key;\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n}\n\nasync function createOne(options, key, initialCount) {\n try {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"options must be an object\");\n }\n\n visibleCount++;\n\n const container = await getOrCreateToastContainer(options, setPosition);\n if (!container) {\n throw new Error(\"Failed to create toast container\");\n }\n\n const toast = await createToastElement(options, closeToast);\n if (!toast) {\n throw new Error(\"Toast element creation failed\");\n }\n\n const outer = document.createElement(\"div\");\n Object.assign(outer.style, {\n position: \"relative\",\n display: \"inline-block\",\n overflow: \"visible\",\n marginBottom: \"10px\",\n zIndex: \"0\",\n width: \"100%\",\n pointerEvents: \"auto\",\n });\n\n const inner = document.createElement(\"div\");\n Object.assign(inner.style, {\n position: \"relative\",\n overflow: \"hidden\",\n zIndex: \"1\",\n });\n\n inner.appendChild(toast);\n outer.appendChild(inner);\n\n if (container.id.includes(\"toast-container-\")) {\n container.appendChild(outer);\n }\n\n const shouldPauseOnHover =\n options.pauseOnHover !== false &&\n (options.pauseOnHover === true || !!options.cta);\n\n const data = {\n outer,\n toast,\n options,\n count: Math.max(1, Math.floor(initialCount ?? 0)),\n timeout: null,\n pauseOnHover: shouldPauseOnHover,\n };\n active.set(key, data);\n toast._key = key;\n\n if (data.count > 1) await updateBadge(data);\n\n data.timer = createDismissTimer(toast, options);\n await setupPauseOnHover(data);\n } catch (err) {\n console.error(\"Something went wrong: \", err);\n visibleCount = Math.max(0, visibleCount - 1);\n const el =\n document.querySelector('[id^=\"toast-container-\"]') || document.body;\n el.appendChild(await createEmergencyToast(options, closeToast));\n }\n}\n\nexport async function dismissMostRecent() {\n try {\n if (active.size === 0) return;\n\n let lastToastEl = null;\n\n // Direct lookup: last active entry is the most recently created toast\n const activeValues = Array.from(active.values());\n if (activeValues.length > 0) {\n const lastData = activeValues.at(-1);\n lastToastEl =\n lastData.toast ||\n (lastData.outer && lastData.outer.querySelector('[id^=\"toast-\"]'));\n }\n\n if (!lastToastEl) {\n const containers = document.querySelectorAll('[id^=\"toast-container-\"]');\n containers.forEach((container) => {\n const children = Array.from(container.children || []);\n if (children.length === 0) return;\n const candidate = children.at(-1);\n if (candidate) {\n lastToastEl = candidate.querySelector('[id^=\"toast-\"]') || candidate;\n }\n });\n }\n\n if (!lastToastEl) return;\n\n const toastEl = lastToastEl._key\n ? lastToastEl\n : lastToastEl.querySelector('[id^=\"toast-\"]') || lastToastEl;\n\n await closeToast(toastEl);\n } catch (err) {\n console.error(\"dismissMostRecent failed:\", err);\n }\n}\n\nexport async function closeAllToasts() {\n try {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n\n const activeToasts = Array.from(active.values())\n .map((d) => d.toast)\n .filter(Boolean);\n\n for (const t of activeToasts) {\n try {\n await closeToast(t);\n } catch (error_inner) {\n console.warn(\"closeAllToasts: failed to close one toast:\", error_inner);\n }\n }\n } catch (err) {\n console.error(\"closeAllToasts failed:\", err);\n }\n}\n\nexport function resetToastManager() {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n for (const [, data] of active) {\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanup?.();\n }\n active.clear();\n visibleCount = 0;\n}\n\nexport const dismiss = dismissMostRecent;\nexport const noop = closeAllToasts;\n\nfunction createDismissTimer(toast, options) {\n const raw = Number(options?.duration);\n const duration = Number.isFinite(raw) && raw > 0 ? raw : 2500;\n const delay = duration + 5;\n const timer = new PausableTimer(async () => await closeToast(toast), delay);\n timer.start();\n return timer;\n}\n\nasync function setupPauseOnHover(data) {\n if (!data.pauseOnHover || !data.outer || !data.timer) return;\n\n const { outer, timer, toast } = data;\n\n const onMouseEnter = () => {\n timer.pause();\n toast?._progressAnimation?.pause();\n };\n const onMouseLeave = () => {\n timer.resume();\n toast?._progressAnimation?.play();\n };\n\n const onFocusIn = (e) => {\n if (e.target.matches(\"[tabindex], div, span, button, a\")) {\n timer.pause();\n toast?._progressAnimation?.pause();\n }\n };\n\n const onFocusOut = (e) => {\n if (!outer.contains(e.relatedTarget)) {\n timer.resume();\n toast?._progressAnimation?.play();\n }\n };\n\n outer.addEventListener(\"mouseenter\", onMouseEnter);\n outer.addEventListener(\"mouseleave\", onMouseLeave);\n outer.addEventListener(\"focusin\", onFocusIn);\n outer.addEventListener(\"focusout\", onFocusOut);\n\n outer._pauseCleanup = () => {\n outer.removeEventListener(\"mouseenter\", onMouseEnter);\n outer.removeEventListener(\"mouseleave\", onMouseLeave);\n outer.removeEventListener(\"focusin\", onFocusIn);\n outer.removeEventListener(\"focusout\", onFocusOut);\n };\n}\n\nexport async function closeToast(toast) {\n if (!toast?._key) return;\n return closeToastByKey(toast._key);\n}\n\n// AUDIT/FEATURE (toastPromise support): the actual removal logic, now\n// keyed directly instead of requiring a toast DOM element. closeToast()\n// above is now a thin wrapper over this — same guard checks, same order\n// of operations, nothing behaviorally changed for existing closeToast()\n// callers. This lets toastPromise() (and anything else that only has a\n// key, not a live element reference) target a SPECIFIC toast for removal\n// — e.g. the loading toast — rather than only being able to close\n// \"whatever toast a DOM element currently points to.\"\nexport async function closeToastByKey(key) {\n try {\n if (!key) return;\n\n // AUDIT/FEATURE FIX: toast creation is deferred one animation frame\n // (see showToast's rAF coalescing, used for grouping/dedup) — so a\n // caller holding a handle from createToast() can call dismiss()\n // before the toast has actually been created yet and moved from\n // `pending` into `active`. This is a real, reachable race: it\n // happens whenever a wrapped operation resolves faster than one\n // animation frame (e.g. toastPromise() with an already-resolved or\n // synchronously-resolving promise). Previously this just silently\n // no-op'd — the scheduled creation went ahead anyway, leaving a\n // toast that was supposed to be dismissed still showing (and, for\n // toastPromise()'s loading toast specifically, still running its\n // long fallback duration). Checking `pending` first and cancelling\n // the scheduled frame is the correct fix: \"dismiss a not-yet-created\n // toast\" should mean \"don't create it,\" not \"silently do nothing.\"\n const pendingEntry = pending.get(key);\n if (pendingEntry) {\n cancelAnimationFrame(pendingEntry.rafId);\n pending.delete(key);\n return;\n }\n\n // Same race, different intermediate state: the toast finished its\n // rAF-scheduled creation but MAX_VISIBLE was already hit at that\n // moment, so it was pushed into `queue` instead of `active` — not\n // yet showing, waiting for a slot to free up via drainQueue().\n const queueIndex = queue.findIndex((item) => item.key === key);\n if (queueIndex !== -1) {\n queue.splice(queueIndex, 1);\n return;\n }\n\n const data = active.get(key);\n if (!data) return;\n\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanup?.();\n // Clean up CTA click listener if present directly on button/link\n const ctaEl = data.toast?.querySelector(\"button, a\");\n ctaEl?._cleanup?.();\n\n active.delete(key);\n visibleCount = Math.max(0, visibleCount - 1);\n\n const badge = data.outer.querySelector(\".toast-count-badge\");\n if (badge) badge.remove();\n\n const animDuration = data.toast?._animationDuration ?? 400;\n if (data.toast) {\n data.toast.style.opacity = \"0\";\n data.toast.style.transform = \"translateY(20px)\";\n }\n\n const parentContainer = data.outer?.parentElement;\n await removeWithTransition(data.outer, data.toast, animDuration);\n\n if (\n parentContainer &&\n parentContainer.children.length === 0 &&\n parentContainer.id?.startsWith(\"toast-container-\")\n ) {\n try {\n parentContainer.remove();\n } catch {}\n }\n\n await drainQueue();\n } catch (error) {\n console.error(\"Closing Toast failed!: \", error);\n }\n}\n\nasync function drainQueue() {\n while (visibleCount < MAX_VISIBLE && queue.length) {\n const item = queue.shift();\n if (active.has(item.key)) {\n const data = active.get(item.key);\n data.count += item.count;\n await updateBadge(data);\n continue;\n }\n void createOne(item.options, item.key, item.count);\n }\n}\n\nasync function removeWithTransition(el, targetEl, animationDurationMs = 400) {\n if (!el) return Promise.resolve();\n\n return new Promise((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n removeElement(el);\n resolve();\n };\n\n const animEl = targetEl || el.firstElementChild || el;\n if (!animEl) return resolve();\n\n const onEnd = (e) => {\n try {\n if (e.target !== animEl) return;\n animEl.removeEventListener(\"transitionend\", onEnd, true);\n finish();\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n };\n\n try {\n animEl.addEventListener(\"transitionend\", onEnd, true);\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n\n // Use animation duration + 100ms buffer for fallback timeout\n const fallbackTimeout = animationDurationMs + 100;\n setTimeout(() => {\n try {\n animEl.removeEventListener(\"transitionend\", onEnd, true);\n finish();\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n }, fallbackTimeout);\n });\n}\n\nasync function updateBadge({ outer, count }) {\n if (!outer || !(outer instanceof HTMLElement)) {\n throw new Error(\"updateBadge: outer must be a valid HTMLElement\");\n }\n\n if (count < 2) {\n const badge = outer.querySelector(\".toast-count-badge\");\n if (badge) badge.remove();\n return;\n }\n\n let badge = outer.querySelector(\".toast-count-badge\");\n if (!badge) {\n badge = document.createElement(\"span\");\n badge.className = \"toast-count-badge\";\n badge.setAttribute(\"aria-label\", `${count} identical notifications`);\n\n Object.assign(badge.style, {\n position: \"absolute\",\n top: \"6px\",\n right: \"6px\",\n backgroundColor: \"#f44336\",\n color: \"#fff\",\n borderRadius: \"50%\",\n minWidth: \"20px\",\n height: \"20px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"2px solid #fff\",\n boxShadow: \"0 2px 6px rgba(0,0,0,0.3)\",\n zIndex: \"2\",\n pointerEvents: \"none\",\n transition: \"transform 150ms ease\",\n });\n\n outer.appendChild(badge);\n }\n\n badge.textContent = count > 99 ? \"99+\" : String(count);\n\n try {\n badge.style.transform = \"scale(1.2)\";\n setTimeout(() => (badge.style.transform = \"scale(1)\"), 150);\n } catch (error) {\n console.error(\"updateBadge animation error:\", error);\n }\n}\n","// src/components/Toast.js //# Single responsibility\n\"use strict\";\n\nimport { createElementWithId } from \"../utils/dom.js\";\nimport { applyRichStyling, createEmergencyToast } from \"./toast-utils.js\";\n\n/**\n * Creates a multi-layer toast element with satellite-grade fallbacks\n * @param {Object} options - Toast configuration options\n * @param {Function} onClose - Callback when toast closes\n * @returns {HTMLElement} Toast element\n */\nexport async function createToastElement(options, onClose) {\n let toast;\n const tagName = \"div\";\n const prefix = \"toast\";\n\n // PRIMARY: Full-featured toast\n try {\n toast = await createElementWithId(tagName, prefix);\n await applyRichStyling(toast, options, onClose);\n return toast;\n } catch (error) {\n console.warn(\n \"toast creation failed with error showing fallback one: \",\n error\n );\n // Fallback: create emergency toast\n toast = await createEmergencyToast(options, onClose);\n return toast;\n }\n}\n","// src/utils/id.js\n\"use strict\";\n\n/**\n * Generate unique ID for DOM elements to avoid conflicts\n * @param {string} prefix - Optional prefix for ID\n * @returns {string} Unique ID\n */\nexport function generateToastId(prefix = \"toast\") {\n const safePrefix = typeof prefix === \"string\" && prefix.trim() ? prefix.trim() : \"toast\";\n const timestamp = Date.now().toString(36); // shorter timestamp\n const random = Math.floor(Math.random() * 0xfffff).toString(36); // short random part\n return `${safePrefix}-${timestamp}-${random}`;\n}\n","\"use strict\";\n\nimport { showToast, closeToastByKey, resetToastManager } from \"./components/ToastManager.js\";\nimport { getOrCreateToastContainer, resetContainerRegistry } from \"./utils/containerRegistry.js\";\nimport { getDynamicAccessibleTextColorHex } from \"./utils/dom.js\";\nimport { setPosition } from \"./utils/position.js\";\n\n/**\n * @typedef {'info' | 'success' | 'error' | 'warning'} ToastType\n */\n\n/**\n * @typedef {'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center' | 'left-center' | 'right-center' | 'top-full-width' | 'bottom-full-width' | 'center'} ToastPosition\n */\n\n/**\n * @typedef {Object} CTAOptions\n * @property {string} [label]\n * @property {string} [href]\n * @property {'button' | 'link'} [variant]\n * @property {string} [target]\n * @property {string} [rel]\n * @property {string} [ariaLabel]\n * @property {boolean} [autoClose]\n * @property {(e: MouseEvent) => void | Promise<void>} [onClick]\n */\n\n/**\n * @typedef {Object} ToastLoaderOptions\n * @property {number} [size] - Spinner size in pixels (default 14)\n * @property {string} [color] - Spinner SVG stroke color (default 'currentColor')\n * @property {string} [text] - Optional text label alongside spinner\n */\n\n/**\n * @typedef {Object} ToastOptions\n * @property {string} [message]\n * @property {ToastType} [type]\n * @property {number} [duration]\n * @property {ToastPosition | string} [position]\n * @property {string} [borderRadius]\n * @property {string} [backgroundColor]\n * @property {string} [textColor]\n * @property {boolean} [showCloseButton]\n * @property {boolean} [showProgressBar]\n * @property {string} [animationDuration]\n * @property {string} [animationEasing]\n * @property {string} [progressColor]\n * @property {string} [progressHeight]\n * @property {'top' | 'bottom'} [progressPosition]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} [allowHtml]\n * @property {boolean} [sanitizeHtml]\n * @property {boolean} [showLoader]\n * @property {ToastLoaderOptions} [loader]\n * @property {'normal' | 'truncate' | string | boolean} [wrapText]\n * @property {string} [maxWidth]\n * @property {string} [fontFamily]\n * @property {string} [fontSize]\n * @property {string} [fontWeight]\n * @property {string} [fontLineHeight]\n * @property {'auto' | 'ltr' | 'rtl'} [fontDirection]\n * @property {string} [fontPadding]\n * @property {string} [className]\n * @property {CTAOptions} [cta]\n */\n\n/**\n * @typedef {Object} ToastHandle\n * @property {() => Promise<void>} dismiss\n */\n\n/**\n * @typedef {Object} ToastPromiseMessages\n * @property {string} [loading]\n * @property {string | ((result: any) => string)} [success]\n * @property {string | ((error: any) => string)} [error]\n */\n\nlet defaultColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n};\n\nlet defaultMessages = {\n success: \"Operation completed successfully!\",\n error: \"Something went wrong!\",\n warning: \"Warning message!\",\n info: \"Information message!\",\n};\n\nconst pendingToasts = [];\n\nlet domReady = false;\n\nasync function checkDOMReady() {\n if (domReady) return;\n\n const SETTLE_DELAY_MS = 200;\n\n if (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (\n document.readyState === \"complete\" ||\n document.readyState === \"interactive\"\n ) {\n domReady = true;\n const toFlush = [...pendingToasts];\n pendingToasts.length = 0;\n for (const options of toFlush) {\n setTimeout(() => createToastNow(options), 0);\n }\n } else {\n document.addEventListener(\n \"DOMContentLoaded\",\n () => {\n setTimeout(() => {\n domReady = true;\n const toFlush = [...pendingToasts];\n pendingToasts.length = 0;\n for (const options of toFlush) {\n setTimeout(() => createToastNow(options), 0);\n }\n }, SETTLE_DELAY_MS);\n },\n { once: true },\n );\n }\n }\n}\n\nasync function createToastNow(options = {}) {\n try {\n const sanitizedOptions = await sanitizeToastOptions(options);\n\n await createFirstToastContainer(sanitizedOptions);\n\n return await showToast(sanitizedOptions);\n } catch (error) {\n console.error(\"CreateToast failed:\", error);\n return null;\n }\n}\n\nasync function createToast(options = {}) {\n const isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n if (!isBrowser) {\n console.warn(\n \"ToastNotification: running in non-browser environment, no DOM available.\",\n );\n return null;\n }\n\n await checkDOMReady();\n\n if (!domReady) {\n pendingToasts.push(options);\n return null;\n }\n\n return await createToastNow(options);\n}\n\nasync function createFirstToastContainer(options) {\n try {\n return await getOrCreateToastContainer(options, setPosition);\n } catch (error) {\n console.error(\"Failed to create toast container:\", error);\n return document.body;\n }\n}\n\nasync function sanitizeToastOptions(options) {\n const contPosition = options?.position?.toLowerCase()?.trim();\n const contMaxWidth =\n contPosition?.includes(\"top-full-width\") ||\n contPosition?.includes(\"bottom-full-width\")\n ? \"100vw\"\n : \"400px\";\n\n const defaults = {\n allowHtml: false,\n sanitizeHtml: true,\n pauseOnHover: undefined,\n duration: 2500,\n position: \"bottom-right\",\n type: \"info\",\n borderRadius: \"50px\",\n backgroundColor: undefined,\n textColor: undefined,\n showCloseButton: true,\n animationDuration: \"0.4s\",\n animationEasing: \"ease\",\n showProgressBar: true,\n progressColor: undefined,\n progressHeight: \"4px\",\n progressPosition: \"bottom\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n fontSize: \"14px\",\n fontWeight: \"400\",\n fontLineHeight: \"1.4\",\n fontDirection: \"auto\",\n wrapText: \"normal\",\n maxWidth: contMaxWidth,\n };\n\n const final = {\n ...defaults,\n ...(typeof options === \"object\" && !Array.isArray(options) ? options : {}),\n };\n\n final.message = options?.message ?? final.message;\n\n try {\n if (!final.backgroundColor) {\n final.backgroundColor =\n defaultColors?.[final.type] ??\n (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"#f5f5f5\"\n : \"#111111\");\n }\n } catch (error) {\n console.warn(\"Background color resolution failed:\", error);\n }\n\n try {\n final.message =\n final.message || defaultMessages?.[final.type] || \"No Message Provided!\";\n } catch (error) {\n console.warn(\"Default message resolution failed:\", error);\n }\n\n try {\n if (!final.textColor && final.backgroundColor) {\n final.textColor = getDynamicAccessibleTextColorHex(final.backgroundColor);\n }\n } catch (error) {\n console.warn(\"Text color resolution failed:\", error);\n }\n\n try {\n if (!final.progressColor && final.backgroundColor) {\n final.progressColor =\n final.textColor ||\n getDynamicAccessibleTextColorHex(final.backgroundColor);\n }\n } catch (error) {\n console.warn(\"Progress bar color resolution failed:\", error);\n }\n\n if (typeof final.message !== \"string\") {\n final.message = \"No Message Provided!\";\n }\n\n return final;\n}\n\n/**\n * Sets default background colors for toast types.\n * @param {Partial<Record<ToastType, string>>} colors\n */\nfunction setDefaultColors(colors) {\n try {\n if (colors && typeof colors === \"object\" && !Array.isArray(colors)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(colors)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultColors = { ...defaultColors, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultColors failed:\", error);\n }\n}\n\n/**\n * Sets default messages for toast types.\n * @param {Partial<Record<ToastType, string>>} messages\n */\nfunction setDefaultMessages(messages) {\n try {\n if (messages && typeof messages === \"object\" && !Array.isArray(messages)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(messages)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultMessages = { ...defaultMessages, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultMessages failed:\", error);\n }\n}\n\nimport { dismiss, noop as managerNoop } from \"./components/ToastManager.js\";\n\nlet closeInProgress = false;\nlet closePromise = null;\n\nasync function runWithClosePriority(fn) {\n if (closeInProgress && closePromise) {\n try {\n await closePromise;\n } catch (closeError) {\n console.warn(\n \"Previous close operation failed (continuing anyway):\",\n closeError,\n );\n }\n }\n return fn();\n}\n\nconst originalCreateToast = createToast;\n\n/**\n * Creates and displays a toast notification.\n * @param {ToastOptions} [options]\n * @returns {Promise<ToastHandle>}\n */\nasync function createToastWithPriority(options = {}) {\n const key = await runWithClosePriority(() => originalCreateToast(options));\n return {\n dismiss: () => (key ? closeToastByKey(key) : Promise.resolve()),\n };\n}\n\nexport { createToastWithPriority as createToast };\n\nexport { setDefaultColors, setDefaultMessages };\nconst dismissToast = async () => {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await dismiss();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nconst noopAll = async () => {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await managerNoop();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nexport { dismissToast as dismiss, noopAll as noop };\n\nconst TOAST_PROMISE_LOADING_DURATION_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Wraps a promise or function with automatic loading, success, and error toasts.\n * @template T\n * @param {Promise<T> | (() => Promise<T> | T)} promiseOrFn\n * @param {ToastPromiseMessages} [messages]\n * @param {ToastOptions} [options]\n * @returns {Promise<T>}\n */\nasync function toastPromise(promiseOrFn, messages = {}, options = {}) {\n const safeMessages = messages && typeof messages === \"object\" ? messages : {};\n const safeOptions = options && typeof options === \"object\" ? options : {};\n const loadingMessage = safeMessages.loading ?? \"Loading...\";\n\n const loadingHandle = await createToastWithPriority({\n ...safeOptions,\n type: \"info\",\n message: loadingMessage,\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n });\n\n const baseOptions = {\n ...safeOptions,\n pauseOnHover: safeOptions.pauseOnHover,\n };\n\n try {\n const settledPromise =\n typeof promiseOrFn === \"function\" ? promiseOrFn() : promiseOrFn;\n const result = await settledPromise;\n await loadingHandle.dismiss();\n\n const successMessage =\n typeof safeMessages.success === \"function\"\n ? safeMessages.success(result)\n : (safeMessages.success ?? \"Done!\");\n\n await createToastWithPriority({\n ...baseOptions,\n type: \"success\",\n message: successMessage,\n });\n\n return result;\n } catch (err) {\n await loadingHandle.dismiss();\n\n const errorMessage =\n typeof safeMessages.error === \"function\"\n ? safeMessages.error(err)\n : (safeMessages.error ?? \"Something went wrong.\");\n\n await createToastWithPriority({\n ...baseOptions,\n type: \"error\",\n message: errorMessage,\n });\n\n throw err;\n }\n}\n\nexport { toastPromise, resetToastManager, resetContainerRegistry };\n\nif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!window.__customizableToastEscapeAttached) {\n window.__customizableToastEscapeAttached = true;\n const onKeyDown = (e) => {\n if (e.key === \"Escape\" || e.key === \"Esc\") {\n (async () => {\n try {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await dismiss();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n } catch (error) {\n console.error(\"Escape key dismiss failed:\", error);\n closeInProgress = false;\n closePromise = null;\n }\n })();\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, { passive: true });\n }\n}\n\ntry {\n if (typeof window !== \"undefined\") {\n window.customizableToast = {\n createToast: createToastWithPriority,\n setDefaultColors,\n setDefaultMessages,\n noop: noopAll,\n dismiss: dismissToast,\n toastPromise,\n };\n }\n} catch (error) {\n console.error(\"Global assignment failed:\", error);\n}"],"names":["colorCache","constructor","maxSize","this","map","Map","get","key","has","value","delete","set","size","firstKey","keys","next","precomputedNamedTextColors","getDynamicAccessibleTextColorHex","toastBg","String","cached","toLowerCase","textColor","r","g","b","parsed","hexMatch","match","hex","length","split","c","join","parseInt","slice","rgbMatch","Number","hslMatch","h","s","l","gray","Math","round","hue2rgb","p","q","t","parseToRgb","_varMatch$","varMatch","document","getComputedStyle","resolved","documentElement","getPropertyValue","trim","e","resolveCssCustomProperty","Error","luminance","a","v","pow","contrastRatio","rgb1","rgb2","L1","L2","max","min","rgbToHsl","d","textL","tr","tg","tb","hslToRgb","contrastBlack","contrastWhite","result","rgbToHex","toString","padStart","Object","entries","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","forEach","name","lum","L","ALLOWED_TAGS","Set","ALLOWED_ATTRS","BLOCKED_TAGS_REGEX","EVENT_HANDLER_REGEX","JAVASCRIPT_URI_REGEX","sanitizeNode","node","allowedTags","allowedAttrs","nodeType","Node","TEXT_NODE","createTextNode","nodeValue","COMMENT_NODE","ELEMENT_NODE","tag","tagName","toUpperCase","frag","createDocumentFragment","Array","from","childNodes","child","sanitized","appendChild","el","createElement","attributes","attr","setAttribute","attrsToRemove","val","test","rel","getAttribute","filter","Boolean","includes","push","removeAttribute","sanitizeAttributes","sanitizedChild","sanitizeHtml","dirty","opts","forceFallback","window","DOMPurify","hasDOMPurify","cleaned","sanitize","ALLOWED_ATTR","ALLOWED_URI_REGEXP","wrapper","innerHTML","querySelectorAll","err","console","warn","step1","replace","container","outFrag","fallbackSanitize","async","applyRichStyling","toast","options","onClose","durationMs","duration","isFinite","endsWith","parseFloat","parseAnimationDuration","animationDuration","validAnimationDuration","easing","animationEasing","customClass","className","type","assign","style","background","backgroundColor","padding","marginBottom","borderRadius","overflow","display","alignItems","justifyContent","boxShadow","minWidth","maxWidth","opacity","position","cursor","boxSizing","userSelect","pointerEvents","transition","transform","zIndex","tabIndex","_animationDuration","messageSpan","wrapText","whiteSpace","WebkitBoxOrient","WebkitLineClamp","textOverflow","flex","fontPadding","fontFamily","fontSize","fontWeight","lineHeight","fontLineHeight","color","wordBreak","direction","fontDirection","undefined","allowHtml","rawMessage","message","loader","showLoader","loaderEl","safeOpts","isArray","labelText","text","gap","svgNS","svg","createElementNS","circle","strokeDasharray","strokeDashoffset","transformOrigin","animation","lbl","textContent","getElementById","st","id","target","head","createLoader","spacer","width","tmp","firstChild","cta","rawCfg","cfg","label","isLink","href","variant","ariaLabel","ctaTextColor","ctaBgColor","bgColor","ctaBorderColor","marginLeft","border","flexShrink","onClick","res","then","error","autoClose","addEventListener","_cleanup","removeEventListener","_cleanupCTA","createCTA","showCloseButton","closeBtn","closeTextColor","_cleanupCloseButton","createCloseButton","showProgressBar","progressBar","borderRadiusStr","borderRadiusNum","progressHeightPx","progressHeight","progressDuration","leftOffset","finalWidth","left","height","progressColor","progressPosition","animate","_progressAnimation","fill","delay","setTimeout","offsetWidth","createProgressBar","requestAnimationFrame","runToastAnimation","createEmergencyToast","emergency","posFlags","top","bottom","right","startsWith","wordWrap","innerWrapper","msgEl","closeSpan","cssText","removeChild","remove","body","timer","unref","containerRegistry","containerLocks","normalizePositionKey","raw","getOrCreateToastContainer","setPosition","isCurrentDoc","ownerDocument","isConnected","inset","flexDirection","all","i","DOCUMENTED_POSITIONS","LEGACY_POSITIONS","rawPos","effectivePos","pos","resetContainerStyles","positionFlags","hasTop","hasBottom","hasLeft","hasRight","hasCenter","hasFullWidth","parsePosition","flags","handleFullWidthPositions","handleCenterPositions","applyStandardPositioning","PausableTimer","callback","safeDelay","remaining","startTime","timeoutId","isPaused","isCompleted","start","_this$timeoutId","Date","now","pause","clearTimeout","resume","clear","getRemainingTime","active","pending","queue","visibleCount","createOne","initialCount","TypeError","prefix","floor","random","generateToastId","createElementWithId","createToastElement","closeToast","outer","inner","shouldPauseOnHover","pauseOnHover","data","count","timeout","_key","updateBadge","createDismissTimer","setupPauseOnHover","querySelector","dismiss","lastToastEl","activeValues","values","lastData","at","children","candidate","toastEl","onMouseEnter","_toast$_progressAnima","onMouseLeave","_toast$_progressAnima2","play","onFocusIn","_toast$_progressAnima3","matches","onFocusOut","_toast$_progressAnima4","contains","relatedTarget","_pauseCleanup","closeToastByKey","_data$timer2","_data$outer2","_data$outer2$_pauseCl","_data$toast3","_data$toast3$_cleanup","_data$toast4","_data$toast4$_cleanup","_data$toast5","_data$toast5$_cleanup","_data$toast6","_ctaEl$_cleanup","_data$toast7","_data$outer3","_parentContainer$id","pendingEntry","cancelAnimationFrame","rafId","queueIndex","findIndex","item","splice","call","ctaEl","badge","animDuration","parentContainer","parentElement","targetEl","animationDurationMs","Promise","resolve","done","finish","parentNode","removeElement","animEl","firstElementChild","onEnd","removeWithTransition","drainQueue","shift","HTMLElement","defaultColors","success","warning","info","defaultMessages","pendingToasts","domReady","createToastNow","sanitizedOptions","_options$position","contPosition","final","_defaultColors","matchMedia","_defaultMessages","sanitizeToastOptions","createFirstToastContainer","safe","str","charCodeAt","hashString","makeKey","current","entry","showToast","setDefaultColors","colors","validTypes","validated","setDefaultMessages","messages","closeInProgress","closePromise","createToastWithPriority","closeError","readyState","toFlush","once","checkDOMReady","originalCreateToast","runWithClosePriority","dismissToast","noopAll","activeToasts","error_inner","managerNoop","toastPromise","promiseOrFn","safeMessages","safeOptions","loadingMessage","loading","loadingHandle","baseOptions","settledPromise","successMessage","errorMessage","__customizableToastEscapeAttached","onKeyDown","passive","customizableToast","createToast","noop","_data$timer","_data$outer","_data$outer$_pauseCle","_data$toast","_data$toast$_cleanupC","_data$toast2","_data$toast2$_cleanup"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/utils/dom.js","../src/utils/html-sanitizer.js","../src/components/loader.js","../src/components/toast-utils-core.js","../src/utils/audio.js","../src/components/toast-utils.js","../src/utils/containerRegistry.js","../src/utils/position.js","../src/utils/PausableTimer.js","../src/components/ToastManager.js","../src/components/Toast.js","../src/utils/id.js","../src/index.js"],"sourcesContent":["\"use strict\";\n\nimport { generateToastId } from \"./id.js\";\n\nexport async function createElementWithId(tagName, prefix) {\n if (!tagName || !prefix) throw new Error(\"tagName and prefix are required\");\n const el = document.createElement(tagName);\n el.id = generateToastId(prefix);\n return el;\n}\n\nexport async function appendChild(parent, child) {\n if (!parent || !child) return false;\n\n try {\n if (!parent.contains(child)) parent.appendChild(child);\n return true;\n } catch (primaryError) {\n console.warn(\"appendChild primary failed:\", primaryError);\n try {\n parent.insertAdjacentElement(\"beforeend\", child);\n return true;\n } catch (fallbackError) {\n console.warn(\"appendChild fallback failed:\", fallbackError);\n try {\n if (parent === document.body) {\n console.warn(\n \"appendChild: using last-resort cloneNode fallback — the \" +\n \"appended element's event listeners (close button, CTA \" +\n \"clicks, etc.) will NOT work, since cloneNode() does not \" +\n \"copy JS-attached listeners. This path only runs when both \" +\n \"the primary appendChild and insertAdjacentElement calls \" +\n \"already failed.\",\n );\n const clone = child.cloneNode(true);\n parent.appendChild(clone);\n return false; // Return false to indicate fallback was used and listeners lost\n }\n } catch (emergencyError) {\n console.error(\"appendChild emergency failed:\", emergencyError);\n return false;\n }\n }\n }\n return false;\n}\n\nexport async function removeElement(el) {\n if (!el) return true;\n\n try {\n if (typeof el.remove === \"function\") {\n el.remove();\n return true;\n }\n } catch {}\n\n try {\n if (el.parentNode) {\n el.parentNode.removeChild(el);\n return true;\n }\n } catch {}\n\n return false;\n}\n\nexport async function parseAnimationDuration(duration) {\n if (typeof duration === \"number\" && Number.isFinite(duration) && duration > 0) return duration;\n if (typeof duration === \"string\") {\n if (duration.endsWith(\"s\") && !duration.endsWith(\"ms\")) {\n const parsed = parseFloat(duration) * 1000;\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 500;\n }\n const parsed = parseFloat(duration);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : 500;\n }\n return 500;\n}\n\nexport function forceReflow(el) {\n try {\n return el?.offsetWidth || 0;\n } catch {\n return 0;\n }\n}\n\nexport function query(selector, root = (typeof document !== \"undefined\" ? document : null)) {\n return root?.querySelector ? root.querySelector(selector) : null;\n}\n\nclass LRUCache {\n constructor(maxSize = 200) {\n this.maxSize = maxSize;\n this.map = new Map();\n }\n\n get(key) {\n if (!this.map.has(key)) return undefined;\n const value = this.map.get(key);\n this.map.delete(key);\n this.map.set(key, value);\n return value;\n }\n\n set(key, value) {\n if (this.map.has(key)) this.map.delete(key);\n else if (this.map.size >= this.maxSize) {\n const firstKey = this.map.keys().next().value;\n this.map.delete(firstKey);\n }\n this.map.set(key, value);\n }\n}\n\nconst colorCache = new LRUCache(200);\n\nconst namedColors = {\n aliceblue: [240, 248, 255],\n antiquewhite: [250, 235, 215],\n aqua: [0, 255, 255],\n aquamarine: [127, 255, 212],\n azure: [240, 255, 255],\n beige: [245, 245, 220],\n bisque: [255, 228, 196],\n black: [0, 0, 0],\n blanchedalmond: [255, 235, 205],\n blue: [0, 0, 255],\n blueviolet: [138, 43, 226],\n brown: [165, 42, 42],\n burlywood: [222, 184, 135],\n cadetblue: [95, 158, 160],\n chartreuse: [127, 255, 0],\n chocolate: [210, 105, 30],\n coral: [255, 127, 80],\n cornflowerblue: [100, 149, 237],\n cornsilk: [255, 248, 220],\n crimson: [220, 20, 60],\n cyan: [0, 255, 255],\n darkblue: [0, 0, 139],\n darkcyan: [0, 139, 139],\n darkgoldenrod: [184, 134, 11],\n darkgray: [169, 169, 169],\n darkgreen: [0, 100, 0],\n darkgrey: [169, 169, 169],\n darkkhaki: [189, 183, 107],\n darkmagenta: [139, 0, 139],\n darkolivegreen: [85, 107, 47],\n darkorange: [255, 140, 0],\n darkorchid: [153, 50, 204],\n darkred: [139, 0, 0],\n darksalmon: [233, 150, 122],\n darkseagreen: [143, 188, 143],\n darkslateblue: [72, 61, 139],\n darkslategray: [47, 79, 79],\n darkslategrey: [47, 79, 79],\n darkturquoise: [0, 206, 209],\n darkviolet: [148, 0, 211],\n deeppink: [255, 20, 147],\n deepskyblue: [0, 191, 255],\n dimgray: [105, 105, 105],\n dimgrey: [105, 105, 105],\n dodgerblue: [30, 144, 255],\n firebrick: [178, 34, 34],\n floralwhite: [255, 250, 240],\n forestgreen: [34, 139, 34],\n fuchsia: [255, 0, 255],\n gainsboro: [220, 220, 220],\n ghostwhite: [248, 248, 255],\n gold: [255, 215, 0],\n goldenrod: [218, 165, 32],\n gray: [128, 128, 128],\n green: [0, 128, 0],\n greenyellow: [173, 255, 47],\n grey: [128, 128, 128],\n honeydew: [240, 255, 240],\n hotpink: [255, 105, 180],\n indianred: [205, 92, 92],\n indigo: [75, 0, 130],\n ivory: [255, 255, 240],\n khaki: [240, 230, 140],\n lavender: [230, 230, 250],\n lavenderblush: [255, 240, 245],\n lawngreen: [124, 252, 0],\n lemonchiffon: [255, 250, 205],\n lightblue: [173, 216, 230],\n lightcoral: [240, 128, 128],\n lightcyan: [224, 255, 255],\n lightgoldenrodyellow: [250, 250, 210],\n lightgray: [211, 211, 211],\n lightgreen: [144, 238, 144],\n lightgrey: [211, 211, 211],\n lightpink: [255, 182, 193],\n lightsalmon: [255, 160, 122],\n lightseagreen: [32, 178, 170],\n lightskyblue: [135, 206, 250],\n lightslategray: [119, 136, 153],\n lightslategrey: [119, 136, 153],\n lightsteelblue: [176, 196, 222],\n lightyellow: [255, 255, 224],\n lime: [0, 255, 0],\n limegreen: [50, 205, 50],\n linen: [250, 240, 230],\n magenta: [255, 0, 255],\n maroon: [128, 0, 0],\n mediumaquamarine: [102, 205, 170],\n mediumblue: [0, 0, 205],\n mediumorchid: [186, 85, 211],\n mediumpurple: [147, 112, 219],\n mediumseagreen: [60, 179, 113],\n mediumslateblue: [123, 104, 238],\n mediumspringgreen: [0, 250, 154],\n mediumturquoise: [72, 209, 204],\n mediumvioletred: [199, 21, 133],\n midnightblue: [25, 25, 112],\n mintcream: [245, 255, 250],\n mistyrose: [255, 228, 225],\n moccasin: [255, 228, 181],\n navajowhite: [255, 222, 173],\n navy: [0, 0, 128],\n oldlace: [253, 245, 230],\n olive: [128, 128, 0],\n olivedrab: [107, 142, 35],\n orange: [255, 165, 0],\n orangered: [255, 69, 0],\n orchid: [218, 112, 214],\n palegoldenrod: [238, 232, 170],\n palegreen: [152, 251, 152],\n paleturquoise: [175, 238, 238],\n palevioletred: [219, 112, 147],\n papayawhip: [255, 239, 213],\n peachpuff: [255, 218, 185],\n peru: [205, 133, 63],\n pink: [255, 192, 203],\n plum: [221, 160, 221],\n powderblue: [176, 224, 230],\n purple: [128, 0, 128],\n rebeccapurple: [102, 51, 153],\n red: [255, 0, 0],\n rosybrown: [188, 143, 143],\n royalblue: [65, 105, 225],\n saddlebrown: [139, 69, 19],\n salmon: [250, 128, 114],\n sandybrown: [244, 164, 96],\n seagreen: [46, 139, 87],\n seashell: [255, 245, 238],\n sienna: [160, 82, 45],\n silver: [192, 192, 192],\n skyblue: [135, 206, 235],\n slateblue: [106, 90, 205],\n slategray: [112, 128, 144],\n slategrey: [112, 128, 144],\n snow: [255, 250, 250],\n springgreen: [0, 255, 127],\n steelblue: [70, 130, 180],\n tan: [210, 180, 140],\n teal: [0, 128, 128],\n thistle: [216, 191, 216],\n tomato: [255, 99, 71],\n turquoise: [64, 224, 208],\n violet: [238, 130, 238],\n wheat: [245, 222, 179],\n white: [255, 255, 255],\n whitesmoke: [245, 245, 245],\n yellow: [255, 255, 0],\n yellowgreen: [154, 205, 50],\n};\n\nconst precomputedNamedTextColors = {};\nObject.entries(namedColors).forEach(([name, [r, g, b]]) => {\n const lum = (c) => {\n const v = c / 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n };\n const L = 0.2126 * lum(r) + 0.7152 * lum(g) + 0.0722 * lum(b);\n const contrastBlack = (L + 0.05) / 0.05;\n const contrastWhite = 1.05 / (L + 0.05);\n precomputedNamedTextColors[name.toLowerCase()] =\n contrastBlack >= contrastWhite ? \"#000000\" : \"#ffffff\";\n});\n\nexport function getDynamicAccessibleTextColorHex(toastBg) {\n if (!toastBg) return \"snow\";\n\n const key = String(toastBg);\n const cached = colorCache.get(key);\n if (cached) return cached;\n\n if (precomputedNamedTextColors[toastBg?.toLowerCase()]) {\n const textColor = precomputedNamedTextColors[toastBg.toLowerCase()];\n colorCache.set(key, textColor);\n return textColor;\n }\n\n let r, g, b;\n\n // AUDIT FIX (H2): this function previously only understood hex and\n // rgb()/rgba() strings. Anything else — hsl(), a CSS custom property\n // like var(--brand), any modern color syntax — fell straight into the\n // catch block below, which used to assign a RANDOM RGB triplet as the\n // \"background\" driving the black-vs-white text decision. For a function\n // whose entire purpose is accessibility, that meant it could pick white\n // text on a light background (or the reverse) for any color format it\n // didn't recognize, and the choice wasn't even stable between calls for\n // the same input. Two changes: (1) genuinely parse hsl()/hsla() and CSS\n // custom properties instead of giving up on them, (2) for the cases\n // that are still truly unparseable, fall back to a fixed neutral\n // midpoint gray instead of Math.random() — deterministic and\n // reasonable, never actively wrong in a random direction.\n function resolveCssCustomProperty(value) {\n const varMatch = value?.match(/^var\\((--[\\w-]+)(?:\\s*,\\s*(.+))?\\)$/i);\n if (!varMatch) return value;\n try {\n if (\n typeof document !== \"undefined\" &&\n typeof getComputedStyle === \"function\"\n ) {\n const resolved = getComputedStyle(document.documentElement)\n .getPropertyValue(varMatch[1])\n .trim();\n if (resolved) return resolved;\n }\n } catch (e) {}\n // Fall back to the var()'s own declared fallback value, if it had one\n // (e.g. var(--brand, #336699)), before giving up entirely.\n return varMatch[2]?.trim() || value;\n }\n\n function parseToRgb(value) {\n const hexMatch = value?.match(/^#([0-9a-f]{3,8})$/i);\n if (hexMatch) {\n let hex = hexMatch[1];\n if (hex.length === 3)\n hex = hex\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n };\n }\n\n const rgbMatch = value?.match(\n /rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)(?:,\\s*[\\d.]+)?\\)/i,\n );\n if (rgbMatch) {\n return {\n r: Number(rgbMatch[1]),\n g: Number(rgbMatch[2]),\n b: Number(rgbMatch[3]),\n };\n }\n\n const hslMatch = value?.match(\n /hsla?\\(\\s*([\\d.]+)(?:deg)?\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*[\\d.]+)?\\)/i,\n );\n if (hslMatch) {\n const h = Number(hslMatch[1]) / 360;\n const s = Number(hslMatch[2]) / 100;\n const l = Number(hslMatch[3]) / 100;\n if (s === 0) {\n const gray = Math.round(l * 255);\n return { r: gray, g: gray, b: gray };\n }\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n return {\n r: Math.round(hue2rgb(p, q, h + 1 / 3) * 255),\n g: Math.round(hue2rgb(p, q, h) * 255),\n b: Math.round(hue2rgb(p, q, h - 1 / 3) * 255),\n };\n }\n\n return null;\n }\n\n try {\n const resolvedBg = resolveCssCustomProperty(toastBg);\n const parsed = parseToRgb(resolvedBg);\n if (!parsed) throw new Error(\"Unknown color\");\n ({ r, g, b } = parsed);\n } catch {\n // Deterministic neutral fallback — a mid-gray reads reasonably against\n // either black or white text, and critically, gives the SAME answer\n // every time for the same unparseable input instead of a coin flip.\n r = g = b = 128;\n }\n\n const rgbToHsl = (r, g, b) => {\n r /= 255;\n g /= 255;\n b /= 255;\n const max = Math.max(r, g, b),\n min = Math.min(r, g, b);\n let h,\n s,\n l = (max + min) / 2;\n if (max === min) h = s = 0;\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n }\n h /= 6;\n }\n return [h * 360, s, l];\n };\n const hslToRgb = (h, s, l) => {\n h /= 360;\n let r, g, b;\n if (s === 0) r = g = b = l;\n else {\n const hue2rgb = (p, q, t) => {\n if (t < 0) t += 1;\n if (t > 1) t -= 1;\n if (t < 1 / 6) return p + (q - p) * 6 * t;\n if (t < 1 / 2) return q;\n if (t < 2 / 3) return p + (q - p) * (2 / 3 - t) * 6;\n return p;\n };\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];\n };\n const luminance = (r, g, b) => {\n const a = [r, g, b].map((v) => {\n v /= 255;\n return v <= 0.03928 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\n });\n return 0.2126 * a[0] + 0.7152 * a[1] + 0.0722 * a[2];\n };\n const contrastRatio = (rgb1, rgb2) => {\n const L1 = luminance(...rgb1);\n const L2 = luminance(...rgb2);\n return (Math.max(L1, L2) + 0.05) / (Math.min(L1, L2) + 0.05);\n };\n const rgbToHex = (r, g, b) =>\n `#${r.toString(16).padStart(2, \"0\")}${g.toString(16).padStart(2, \"0\")}${b\n .toString(16)\n .padStart(2, \"0\")}`;\n\n let [h, s, l] = rgbToHsl(r, g, b);\n const minContrast = 4.5;\n let textL = l < 0.5 ? Math.min(l + 0.5, 1) : Math.max(l - 0.5, 0);\n let [tr, tg, tb] = hslToRgb(h, s, textL);\n\n if (contrastRatio([r, g, b], [tr, tg, tb]) < minContrast) {\n const contrastBlack = contrastRatio([r, g, b], [0, 0, 0]);\n const contrastWhite = contrastRatio([r, g, b], [255, 255, 255]);\n [tr, tg, tb] = contrastBlack >= contrastWhite ? [0, 0, 0] : [255, 255, 255];\n }\n\n const result = rgbToHex(tr, tg, tb);\n colorCache.set(key, result);\n return result;\n}\n","// AUDIT FIX (H1): these used to live inside fallbackSanitize() only, which\n// meant sanitizeHtml()'s DOMPurify branch had no way to reference them —\n// it just used DOMPurify's own (much broader) default allowlist instead.\n// Same allowHtml:true input could sanitize completely differently\n// depending on whether some UNRELATED script on the host page happened to\n// load DOMPurify onto window — a security boundary that was an\n// environmental accident rather than a deliberate, consistent policy.\n// Hoisting these to module scope makes them the single source of truth\n// for BOTH paths, so the same input gets the same treatment regardless of\n// which sanitizer implementation actually runs.\nconst ALLOWED_TAGS = new Set([\n \"DIV\",\n \"SPAN\",\n \"P\",\n \"BR\",\n \"STRONG\",\n \"B\",\n \"EM\",\n \"I\",\n \"U\",\n \"SMALL\",\n \"UL\",\n \"OL\",\n \"LI\",\n \"A\",\n \"IMG\",\n \"PRE\",\n \"CODE\",\n \"MARK\",\n]);\n// AUDIT FIX (C1 — security): 'style' was previously allowed through with\n// zero validation, letting an attacker-controlled message (allowHtml:true)\n// inject `position:fixed;inset:0;z-index:999999` and render a full-page\n// clickjacking overlay through a toast that already renders at\n// z-index:9999. Inline style is a well-known sanitizer bypass class (see\n// OWASP's XSS Filter Evasion Cheat Sheet). Removed from the allowlist\n// entirely rather than attempting partial validation — toasts don't need\n// arbitrary inline styling to be useful, and \"no unchecked style\" is the\n// safe default most reputable sanitizers ship with.\nconst ALLOWED_ATTRS = new Set([\n \"href\",\n \"src\",\n \"alt\",\n \"title\",\n \"class\",\n \"target\",\n \"rel\",\n \"loading\",\n]);\n\nconst BLOCKED_TAGS_REGEX = /<\\/?(script|iframe|object|embed|link|meta|style|form|input|button|svg|math|video|audio|details|dialog|applet|frame|frameset|textarea|select|option|optgroup|fieldset|legend|datalist|output|progress|meter|keygen|canvas|map|area|base|basefont|bgsound|blink|center|dir|font|hgroup|isindex|listing|marquee|multicol|nextid|noembed|noframes|plaintext|rb|rtc|spacer|strike|tt|xmp)[^>]*>/gi;\n\nconst EVENT_HANDLER_REGEX = /\\s(on\\w+)\\s*=\\s*(['\"])[\\s\\S]*?\\2/gi;\n\nconst JAVASCRIPT_URI_REGEX = /(href|src)\\s*=\\s*(['\"])\\s*javascript:[^'\"]*\\2/gi;\n\nconst ALLOWED_URI_REGEX = /^\\s*(https?:|data:image\\/)/i;\n\nexport function hasDOMPurify() {\n try {\n if (typeof window !== \"undefined\" && window.DOMPurify) return true;\n } catch (e) {}\n return false;\n}\n\nfunction sanitizeAttributes(el, allowedAttrs) {\n const attrsToRemove = [];\n Array.from(el.attributes || []).forEach((attr) => {\n const name = attr.name.toLowerCase();\n const val = attr.value;\n if (!allowedAttrs.has(name)) {\n attrsToRemove.push(name);\n return;\n }\n if ((name === \"href\" || name === \"src\") && /^\\s*javascript:/i.test(val)) {\n attrsToRemove.push(name);\n return;\n }\n if (name === \"src\" && !/^\\s*(https?:|data:image\\/)/i.test(val)) {\n attrsToRemove.push(name);\n return;\n }\n if (name === \"target\" && val === \"_blank\") {\n const rel = (el.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n el.setAttribute(\"rel\", rel.join(\" \"));\n }\n });\n attrsToRemove.forEach((name) => el.removeAttribute(name));\n}\n\nfunction sanitizeNode(node, allowedTags, allowedAttrs) {\n if (node.nodeType === Node.TEXT_NODE) {\n return document.createTextNode(node.nodeValue);\n }\n if (node.nodeType === Node.COMMENT_NODE) {\n return null;\n }\n if (node.nodeType !== Node.ELEMENT_NODE) {\n return null;\n }\n const tag = node.tagName.toUpperCase();\n if (!allowedTags.has(tag)) {\n const frag = document.createDocumentFragment();\n Array.from(node.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitized) frag.appendChild(sanitized);\n });\n return frag;\n }\n const el = document.createElement(node.tagName);\n Array.from(node.attributes || []).forEach((attr) => {\n el.setAttribute(attr.name, attr.value);\n });\n sanitizeAttributes(el, allowedAttrs);\n Array.from(node.childNodes).forEach((child) => {\n const sanitizedChild = sanitizeNode(child, allowedTags, allowedAttrs);\n if (sanitizedChild) el.appendChild(sanitizedChild);\n });\n return el;\n}\n\nexport function fallbackSanitize(dirty) {\n if (!dirty || typeof dirty !== \"string\") return \"\";\n\n let step1 = dirty.replace(BLOCKED_TAGS_REGEX, \"\");\n step1 = step1.replace(EVENT_HANDLER_REGEX, \"\");\n step1 = step1.replace(\n JAVASCRIPT_URI_REGEX,\n \"$1=$2#$2\",\n );\n\n const container = document.createElement(\"div\");\n container.innerHTML = step1;\n\n const outFrag = document.createDocumentFragment();\n Array.from(container.childNodes).forEach((child) => {\n const sanitized = sanitizeNode(child, ALLOWED_TAGS, ALLOWED_ATTRS);\n if (sanitized) outFrag.appendChild(sanitized);\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.appendChild(outFrag);\n\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n\n return wrapper.innerHTML;\n}\n\nexport function sanitizeHtml(dirty, opts = {}) {\n if (typeof dirty !== \"string\" || !dirty.trim()) return \"\";\n try {\n if (!opts.forceFallback && hasDOMPurify()) {\n const DOMPurify = window.DOMPurify;\n const cleaned = DOMPurify.sanitize(dirty, {\n ALLOWED_TAGS: Array.from(ALLOWED_TAGS),\n ALLOWED_ATTR: Array.from(ALLOWED_ATTRS),\n ALLOWED_URI_REGEXP:\n /^(?:(?:https?|mailto|ftp|tel|data):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i,\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = cleaned;\n wrapper.querySelectorAll('a[target=\"_blank\"]').forEach((a) => {\n const rel = (a.getAttribute(\"rel\") || \"\").split(/\\s+/).filter(Boolean);\n if (!rel.includes(\"noopener\")) rel.push(\"noopener\");\n if (!rel.includes(\"noreferrer\")) rel.push(\"noreferrer\");\n a.setAttribute(\"rel\", rel.join(\" \"));\n });\n return wrapper.innerHTML;\n }\n } catch (err) {\n console.warn(\"DOMPurify sanitization failed, falling back:\", err);\n }\n return fallbackSanitize(dirty);\n}","// src/components/loader.js\nexport function createLoader(opts = {}) {\n const safeOpts = opts && typeof opts === \"object\" && !Array.isArray(opts) ? opts : {};\n const size = Number(safeOpts.size) || 14;\n const color = typeof safeOpts.color === \"string\" && safeOpts.color.trim() ? safeOpts.color.trim() : \"currentColor\";\n const labelText = typeof safeOpts.text === \"string\" ? safeOpts.text : \"\";\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"toast-loader\";\n wrapper.style.display = \"inline-flex\";\n wrapper.style.alignItems = \"center\";\n wrapper.style.gap = \"8px\";\n\n const svgNS = \"http://www.w3.org/2000/svg\";\n const svg = document.createElementNS(svgNS, \"svg\");\n svg.setAttribute(\"width\", String(size));\n svg.setAttribute(\"height\", String(size));\n svg.setAttribute(\"viewBox\", \"0 0 50 50\");\n svg.setAttribute(\"aria-hidden\", \"true\");\n // spinner circle\n const circle = document.createElementNS(svgNS, \"circle\");\n circle.setAttribute(\"cx\", \"25\");\n circle.setAttribute(\"cy\", \"25\");\n circle.setAttribute(\"r\", \"20\");\n circle.setAttribute(\"fill\", \"none\");\n circle.setAttribute(\"stroke\", color);\n circle.setAttribute(\"stroke-width\", \"4\");\n circle.setAttribute(\"stroke-linecap\", \"round\");\n circle.style.opacity = \"0.85\";\n circle.style.strokeDasharray = \"90\";\n circle.style.strokeDashoffset = \"60\";\n circle.style.transformOrigin = \"center\";\n circle.style.animation = \"toast-spinner 1s linear infinite\";\n\n svg.appendChild(circle);\n wrapper.appendChild(svg);\n\n if (labelText) {\n const lbl = document.createElement(\"span\");\n lbl.style.fontSize = \"13px\";\n lbl.textContent = labelText;\n wrapper.appendChild(lbl);\n }\n\n // add minimal spinner keyframes if not present\n if (typeof document !== \"undefined\" && !document.getElementById(\"toast-spinner-styles\")) {\n const st = document.createElement(\"style\");\n st.id = \"toast-spinner-styles\";\n st.textContent = `@keyframes toast-spinner { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } }`;\n const target = document.head || document.documentElement;\n if (target) target.appendChild(st);\n }\n\n return wrapper;\n}\n","import { getDynamicAccessibleTextColorHex, forceReflow } from \"../utils/dom.js\";\n\nexport function createCTA(toast, options, onClose) {\n const rawCfg = options?.cta;\n if (!rawCfg || typeof rawCfg !== \"object\" || Array.isArray(rawCfg)) return;\n\n const cfg = { ...rawCfg };\n\n if (!cfg.label) {\n cfg.label = \"CTA Label Missing!\";\n }\n\n const isLink = cfg.variant === \"link\" || (!cfg.variant && !!cfg.href);\n const el = document.createElement(isLink ? \"a\" : \"button\");\n\n if (isLink) {\n el.href = cfg.href;\n if (cfg.target) el.target = cfg.target;\n el.rel = cfg.rel || (cfg.target === \"_blank\" ? \"noopener noreferrer\" : \"\");\n } else {\n el.type = \"button\";\n }\n\n el.setAttribute(\"aria-label\", cfg.ariaLabel || cfg.label);\n\n const ctaTextColor = options.textColor || getDynamicAccessibleTextColorHex(options.backgroundColor);\n const ctaBgColor = options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.15)\";\n\n const isHex6 = typeof ctaTextColor === \"string\" && /^#[0-9a-fA-F]{6}$/.test(ctaTextColor.trim());\n const ctaBorderColor = isHex6 ? `${ctaTextColor.trim()}44` : \"rgba(128, 128, 128, 0.3)\";\n\n Object.assign(el.style, {\n marginLeft: \"10px\",\n padding: \"6px 10px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n lineHeight: \"1\",\n border: `1px solid ${ctaBorderColor}`,\n color: ctaTextColor,\n background: ctaBgColor,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n });\n\n el.textContent = cfg.label;\n\n const onClick = async (e) => {\n try {\n if (typeof cfg.onClick === \"function\") {\n const res = cfg.onClick(e);\n if (res?.then) await res;\n }\n } catch (err) {\n console.error(\"CTA onClick handler error:\", err);\n } finally {\n if (cfg.autoClose !== false && typeof onClose === \"function\") {\n onClose(toast);\n }\n }\n };\n\n el.addEventListener(\"click\", onClick);\n\n el._cleanup = () => el.removeEventListener(\"click\", onClick);\n toast._cleanupCTA = () => el.removeEventListener(\"click\", onClick);\n\n toast.appendChild(el);\n}\n\nexport function createCloseButton(toast, options, onClose) {\n const closeBtn = document.createElement(\"button\");\n closeBtn.setAttribute(\"aria-label\", \"Close notification\");\n closeBtn.setAttribute(\"title\", \"Close\");\n closeBtn.textContent = \"×\";\n\n const closeTextColor = options.textColor || getDynamicAccessibleTextColorHex(options.backgroundColor);\n\n Object.assign(closeBtn.style, {\n background: \"none\",\n border: \"none\",\n color: closeTextColor,\n fontSize: \"18px\",\n marginLeft: \"10px\",\n cursor: \"pointer\",\n lineHeight: \"1\",\n padding: \"0 4px\",\n });\n\n const onClick = () => {\n if (typeof onClose === \"function\") onClose(toast);\n };\n closeBtn.addEventListener(\"click\", onClick);\n\n toast._cleanupCloseButton = () => {\n closeBtn.removeEventListener(\"click\", onClick);\n };\n\n toast.appendChild(closeBtn);\n}\n\nfunction getContrastBackground(bgColor) {\n if (!bgColor) return \"rgba(255,255,255,0.15)\";\n const textColor = getDynamicAccessibleTextColorHex(bgColor);\n if (textColor === \"#000000\") {\n return \"rgba(0,0,0,0.15)\";\n }\n return \"rgba(255,255,255,0.15)\";\n}\n\nexport function createProgressBar(toast, options) {\n const progressBar = document.createElement(\"div\");\n progressBar.className = \"toast-progress-bar\";\n toast._progressBar = progressBar;\n const borderRadiusStr = options.borderRadius || \"0\";\n const borderRadiusNum = parseInt(borderRadiusStr, 10);\n\n const progressHeightPx = parseInt(options.progressHeight, 10) || 4;\n const duration = Number(options.duration ?? 2500);\n const progressDuration = duration + 5;\n\n const leftOffset = Math.min(borderRadiusNum, progressHeightPx * 2);\n const finalWidth = borderRadiusNum > 0\n ? `calc(100% - ${leftOffset}px)`\n : \"100%\";\n\n Object.assign(progressBar.style, {\n position: \"absolute\",\n left: `${leftOffset}px`,\n height: `${progressHeightPx}px`,\n background: options.progressColor || \"currentColor\",\n width: `${finalWidth}`,\n transition: `width ${progressDuration}ms linear`,\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\n borderRadius: `${progressHeightPx / 2}px`,\n opacity: \"0.8\",\n });\n\n toast.appendChild(progressBar);\n\n if (options.progress !== undefined) {\n let pct = Number(options.progress);\n if (!Number.isFinite(pct)) pct = 0;\n if (pct <= 1 && pct > 0) pct = pct * 100;\n pct = Math.min(100, Math.max(0, pct));\n progressBar.style.width = `${pct}%`;\n progressBar.style.transition = \"width 200ms ease\";\n return;\n }\n\n if (typeof progressBar.animate === \"function\") {\n toast._progressAnimation = progressBar.animate(\n [{ width: finalWidth }, { width: \"0%\" }],\n {\n duration: progressDuration,\n easing: \"linear\",\n fill: \"forwards\",\n delay: 50,\n },\n );\n } else {\n progressBar.style.transition = `width ${progressDuration}ms linear`;\n setTimeout(() => {\n forceReflow(progressBar);\n progressBar.style.width = \"0%\";\n }, 50);\n }\n}\n\nexport function runToastAnimation(toast) {\n forceReflow(toast);\n const delay = 50;\n setTimeout(() => {\n requestAnimationFrame(() => {\n toast.style.opacity = \"1\";\n toast.style.transform = \"translateY(0)\";\n });\n }, delay);\n}\n\nexport function attachSwipeToDismiss(toast, onClose) {\n if (!toast || typeof toast.addEventListener !== \"function\") return;\n\n let startX = 0;\n let startY = 0;\n let currentX = 0;\n let isDragging = false;\n let isHorizontal = false;\n\n const onTouchStart = (e) => {\n if (!e || !e.touches || e.touches.length !== 1) return;\n startX = e.touches[0].clientX;\n startY = e.touches[0].clientY;\n currentX = startX;\n isDragging = true;\n isHorizontal = false;\n toast.style.transition = \"none\";\n };\n\n const onTouchMove = (e) => {\n if (!isDragging || !e || !e.touches || e.touches.length !== 1) return;\n const x = e.touches[0].clientX;\n const y = e.touches[0].clientY;\n const dx = x - startX;\n const dy = y - startY;\n\n if (!isHorizontal) {\n if (Math.abs(dx) > 8 && Math.abs(dx) > Math.abs(dy)) {\n isHorizontal = true;\n } else if (Math.abs(dy) > 8) {\n isDragging = false;\n return;\n }\n }\n\n if (isHorizontal) {\n currentX = x;\n const opacity = Math.max(0, 1 - Math.abs(dx) / 280);\n toast.style.transform = `translateX(${dx}px)`;\n toast.style.opacity = String(opacity);\n if (e.cancelable) e.preventDefault();\n }\n };\n\n const onTouchEnd = () => {\n if (!isDragging || !isHorizontal) {\n isDragging = false;\n return;\n }\n isDragging = false;\n const dx = currentX - startX;\n const threshold = 75;\n\n if (Math.abs(dx) >= threshold) {\n const exitX = dx > 0 ? 320 : -320;\n toast.style.transition = \"transform 180ms ease-out, opacity 180ms ease-out\";\n toast.style.transform = `translateX(${exitX}px)`;\n toast.style.opacity = \"0\";\n setTimeout(() => {\n if (typeof onClose === \"function\") onClose(toast);\n }, 180);\n } else {\n toast.style.transition = \"transform 200ms ease, opacity 200ms ease\";\n toast.style.transform = \"translateX(0)\";\n toast.style.opacity = \"1\";\n }\n };\n\n toast.addEventListener(\"touchstart\", onTouchStart, { passive: true });\n toast.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n toast.addEventListener(\"touchend\", onTouchEnd, { passive: true });\n toast.addEventListener(\"touchcancel\", onTouchEnd, { passive: true });\n\n toast._cleanupSwipe = () => {\n toast.removeEventListener(\"touchstart\", onTouchStart);\n toast.removeEventListener(\"touchmove\", onTouchMove);\n toast.removeEventListener(\"touchend\", onTouchEnd);\n toast.removeEventListener(\"touchcancel\", onTouchEnd);\n };\n}","// src/utils/audio.js\n\"use strict\";\n\nlet audioContext = null;\nlet audioEnabled = true;\n\n/**\n * Lazily initialize and return a shared AudioContext.\n * Returns null in non-browser or unsupported environments.\n */\nfunction getAudioContext() {\n if (typeof window === \"undefined\") return null;\n const AudioCtx = window.AudioContext || window.webkitAudioContext;\n if (!AudioCtx) return null;\n\n if (!audioContext) {\n try {\n audioContext = new AudioCtx();\n } catch {\n return null;\n }\n }\n\n if (audioContext && audioContext.state === \"suspended\") {\n // Resume context if suspended by browser autoplay policies\n try {\n audioContext.resume().catch(() => {});\n } catch {}\n }\n\n return audioContext;\n}\n\n/**\n * Synthesizes a pleasant audio chime or tone using pure Web Audio API oscillators.\n * Zero external audio assets or network requests.\n * @param {'success' | 'error' | 'warning' | 'info' | 'pop' | string} toneType\n */\nexport function playTone(toneType = \"info\") {\n if (!audioEnabled) return;\n const ctx = getAudioContext();\n if (!ctx) return;\n\n try {\n const now = ctx.currentTime;\n const tone = String(toneType || \"info\").toLowerCase().trim();\n\n if (tone === \"success\") {\n // Pleasant rising major chord chime (C5 -> E5 -> G5)\n const notes = [523.25, 659.25, 783.99];\n notes.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(freq, now + idx * 0.08);\n\n gain.gain.setValueAtTime(0.001, now + idx * 0.08);\n gain.gain.exponentialRampToValueAtTime(0.12, now + idx * 0.08 + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + idx * 0.08 + 0.35);\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.start(now + idx * 0.08);\n osc.stop(now + idx * 0.08 + 0.36);\n });\n } else if (tone === \"error\") {\n // Subtle two-tone descending soft buzz\n const freqs = [320, 240];\n freqs.forEach((freq, idx) => {\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"triangle\";\n osc.frequency.setValueAtTime(freq, now + idx * 0.1);\n\n gain.gain.setValueAtTime(0.001, now + idx * 0.1);\n gain.gain.exponentialRampToValueAtTime(0.15, now + idx * 0.1 + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + idx * 0.1 + 0.22);\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.start(now + idx * 0.1);\n osc.stop(now + idx * 0.1 + 0.23);\n });\n } else if (tone === \"warning\") {\n // Gentle alert ping\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(440, now);\n osc.frequency.exponentialRampToValueAtTime(493.88, now + 0.12);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.12, now + 0.02);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.28);\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.start(now);\n osc.stop(now + 0.3);\n } else {\n // Light droplet pop ('info' or 'pop')\n const osc = ctx.createOscillator();\n const gain = ctx.createGain();\n osc.type = \"sine\";\n osc.frequency.setValueAtTime(600, now);\n osc.frequency.exponentialRampToValueAtTime(950, now + 0.04);\n osc.frequency.exponentialRampToValueAtTime(400, now + 0.09);\n\n gain.gain.setValueAtTime(0.001, now);\n gain.gain.exponentialRampToValueAtTime(0.1, now + 0.015);\n gain.gain.exponentialRampToValueAtTime(0.0001, now + 0.12);\n\n osc.connect(gain);\n gain.connect(ctx.destination);\n\n osc.start(now);\n osc.stop(now + 0.13);\n }\n } catch {}\n}\n\n/**\n * Globally enable or disable synthesized notification sounds.\n * @param {boolean} enabled\n */\nexport function setAudioEnabled(enabled) {\n audioEnabled = Boolean(enabled);\n}\n\n/**\n * Returns current global audio feedback status.\n * @returns {boolean}\n */\nexport function isAudioEnabled() {\n return audioEnabled;\n}\n","// src/components/toast-utils.js\n\"use strict\";\n\nimport { parseAnimationDuration } from \"../utils/dom.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { createLoader } from \"./loader.js\";\nimport {\n createCTA,\n createCloseButton,\n createProgressBar,\n runToastAnimation,\n attachSwipeToDismiss,\n} from \"./toast-utils-core.js\";\nimport { playTone } from \"../utils/audio.js\";\n\n/**\n * Applies rich styling and content to a toast element.\n * @param {HTMLElement} toast - The toast container element.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n */\nexport async function applyRichStyling(toast, options, onClose) {\n const durationMs = await parseAnimationDuration(options?.animationDuration);\n const validAnimationDuration = `${durationMs}ms`;\n const easing = typeof options?.animationEasing === \"string\" && options.animationEasing.trim()\n ? options.animationEasing.trim()\n : \"ease\";\n\n // Compose className based on provided type and optional custom className\n const customClass = typeof options?.className === \"string\" && options.className.trim()\n ? ` ${options.className.trim()}`\n : \"\";\n toast.className = `toast toast-${options?.type ?? \"info\"}${customClass}`;\n\n const borderRadius =\n typeof options?.borderRadius === \"number\"\n ? `${options.borderRadius}px`\n : options?.borderRadius;\n\n const maxWidth =\n typeof options?.maxWidth === \"number\"\n ? `${options.maxWidth}px`\n : options?.maxWidth;\n\n Object.assign(toast.style, {\n background: options?.backgroundColor,\n padding: \"12px 16px\",\n marginBottom: \"10px\",\n borderRadius,\n overflow: \"hidden\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"space-between\",\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\n minWidth: \"250px\",\n maxWidth,\n opacity: \"0\",\n position: \"relative\",\n cursor: \"default\",\n boxSizing: \"border-box\",\n userSelect: \"text\",\n pointerEvents: \"auto\",\n transition: `opacity ${validAnimationDuration} ${easing}, transform ${validAnimationDuration} ${easing}`,\n transform: \"translateY(20px)\",\n zIndex: \"9999\",\n });\n // Accessibility settings\n toast.setAttribute(\"role\", \"alert\");\n toast.setAttribute(\"aria-live\", \"polite\");\n toast.tabIndex = 0; // Make focusable for accessibility if needed\n toast._animationDuration = durationMs;\n\n const messageSpan = document.createElement(\"span\");\n messageSpan.className = \"toast-message\";\n toast._messageSpan = messageSpan;\n\n const isTruncate =\n options?.wrapText === \"truncate\" ||\n options?.wrapText === \"ellipsis\" ||\n options?.wrapText === false;\n\n if (isTruncate || !options?.wrapText) {\n Object.assign(messageSpan.style, {\n display: \"-webkit-box\",\n WebkitBoxOrient: \"vertical\",\n WebkitLineClamp: \"3\",\n whiteSpace: \"normal\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n });\n } else {\n Object.assign(messageSpan.style, {\n display: \"block\",\n whiteSpace: \"normal\",\n });\n }\n\n const fontSize =\n typeof options?.fontSize === \"number\"\n ? `${options.fontSize}px`\n : options?.fontSize;\n\n Object.assign(messageSpan.style, {\n flex: \"1\",\n padding: options?.fontPadding,\n fontFamily: options?.fontFamily,\n fontSize,\n fontWeight: options?.fontWeight,\n lineHeight: options?.fontLineHeight,\n color: options?.textColor,\n userSelect: \"text\",\n wordBreak: \"break-word\",\n overflow: \"hidden\",\n textOverflow: \"ellipsis\",\n direction:\n options?.fontDirection && options.fontDirection !== \"auto\"\n ? options.fontDirection\n : undefined,\n });\n\n const allowHtml = !!options.allowHtml; // opt-in flag\n const rawMessage = options.message ?? \"\";\n\n // If a loader is requested as part of the message, create it safely\n if (options.loader || options.showLoader) {\n // createLoader returns an element (see new function below)\n const loaderEl = createLoader(options.loader || {});\n // Put loader before message content\n messageSpan.appendChild(loaderEl);\n // Small spacer\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.appendChild(spacer);\n }\n\n // If allowHtml is explicitly true, sanitize and set innerHTML, otherwise use textContent\n if (\n allowHtml &&\n typeof rawMessage === \"string\" &&\n rawMessage.trim().length > 0\n ) {\n try {\n const sanitized = sanitizeHtml(rawMessage);\n // Use DOM APIs to set sanitized HTML safely\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n // Move children to messageSpan to avoid re-parsing at outer scope\n while (tmp.firstChild) {\n messageSpan.appendChild(tmp.firstChild);\n }\n } catch (err) {\n console.warn(\n \"HTML message sanitization failed, falling back to text:\",\n err\n );\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n } else {\n // default safe text node mode (preserves loader and spacer elements)\n messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n\n // Set title for overflow tooltip without masking accessible text\n messageSpan.setAttribute(\n \"title\",\n typeof rawMessage === \"string\"\n ? rawMessage.replace(/<[^>]+>/g, \"\")\n : String(rawMessage)\n );\n toast.appendChild(messageSpan);\n\n if (options?.cta && Object.keys(options.cta).length !== 0) {\n createCTA(toast, options, onClose);\n }\n\n if (options?.showCloseButton) {\n createCloseButton(toast, options, onClose);\n }\n\n if (options?.showProgressBar) {\n createProgressBar(toast, options);\n }\n\n if (options?.swipeToDismiss !== false) {\n attachSwipeToDismiss(toast, onClose);\n }\n\n if (options?.sound) {\n const tone = typeof options.sound === \"string\" ? options.sound : options?.type || \"info\";\n playTone(tone);\n }\n\n runToastAnimation(toast);\n}\n\n/**\n * Creates an emergency toast as a safe fallback.\n * @param {object} options - Configuration options for the toast.\n * @param {Function} onClose - Callback invoked when the toast closes.\n * @returns {Promise<HTMLElement|null>}\n */\nexport async function createEmergencyToast(options, onClose) {\n try {\n const emergency = document.createElement(\"div\");\n const position = options?.position || \"bottom-right\";\n const posFlags = position.toLowerCase().trim();\n let top = \"auto\", bottom = \"auto\", left = \"auto\", right = \"auto\", transform = \"none\";\n\n if (posFlags.startsWith(\"top\")) top = \"20px\";\n else if (posFlags.startsWith(\"bottom\") || posFlags.includes(\"below\")) bottom = \"20px\";\n\n if (posFlags.startsWith(\"left\")) left = \"20px\";\n else if (posFlags.startsWith(\"right\")) right = \"20px\";\n else if (posFlags === \"center\") {\n left = \"50%\"; top = \"50%\"; transform = \"translate(-50%, -50%)\";\n } else if (posFlags.includes(\"center\")) {\n if (posFlags.includes(\"left\")) { left = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"right\")) { right = \"20px\"; top = \"50%\"; transform = \"translateY(-50%)\"; }\n else if (posFlags.includes(\"top\")) { top = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n else if (posFlags.includes(\"bottom\")) { bottom = \"20px\"; left = \"50%\"; transform = \"translateX(-50%)\"; }\n } else {\n right = \"20px\"; bottom = \"20px\";\n }\n\n Object.assign(emergency.style, {\n background: \"#333\",\n color: \"white\",\n padding: \"10px 15px\",\n position: \"fixed\",\n top,\n bottom,\n left,\n right,\n transform,\n zIndex: \"99999\",\n borderRadius: \"3px\",\n maxWidth: \"250px\",\n wordWrap: \"break-word\",\n boxShadow: \"0 2px 10px rgba(0,0,0,0.3)\",\n });\n\n const innerWrapper = document.createElement(\"div\");\n const msgEl = document.createElement(\"span\");\n msgEl.style.display = \"inline-block\";\n if (options.allowHtml) {\n msgEl.innerHTML = sanitizeHtml(\n String(options.message || \"Emergency Toast Showing!\")\n );\n } else {\n msgEl.textContent = String(\n options.message || \"Emergency Toast Creation Showing!\"\n );\n }\n innerWrapper.appendChild(msgEl);\n\n const closeSpan = document.createElement(\"span\");\n closeSpan.style.cssText =\n \"float: right; margin-left: 10px; font-weight: bold; cursor: pointer;\";\n closeSpan.textContent = \"×\";\n innerWrapper.appendChild(closeSpan);\n\n while (emergency.firstChild) emergency.removeChild(emergency.firstChild);\n emergency.appendChild(innerWrapper);\n closeSpan.addEventListener(\"click\", () => {\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n });\n\n const duration = Number(options?.duration) || 2500;\n const timer = setTimeout(() => {\n emergency.remove();\n if (typeof onClose === \"function\") onClose(emergency);\n }, duration);\n if (typeof timer?.unref === \"function\") timer.unref();\n\n return emergency;\n } catch (error) {\n console.error(\"Emergency toast creation failed:\", error);\n if (typeof onClose === \"function\") onClose(null);\n return null;\n }\n}\n","// src/utils/containerRegistry.js\n\"use strict\";\n\nconst containerRegistry = new Map(); // id -> HTMLElement\nconst containerLocks = new Map(); // id -> Promise<HTMLElement>\n\n/**\n * Normalize a position string to a canonical key (id-safe, stable).\n */\nexport function normalizePositionKey(position) {\n if (!position || typeof position !== \"string\") return \"bottom-right\";\n const raw = position.toLowerCase().trim();\n if (!raw) return \"bottom-right\";\n const aliased = raw.replace(/\\bbelow\\b/g, \"bottom\");\n return aliased\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-{2,}/g, \"-\");\n}\n\n/**\n * Canonical container id\n */\nexport function getContainerId(position) {\n const pos = normalizePositionKey(position);\n return `toast-container-${pos}`;\n}\n\nexport function resetContainerRegistry() {\n containerRegistry.clear();\n containerLocks.clear();\n}\n\n/**\n * Atomically get or create a single container per canonical id.\n */\nexport async function getOrCreateToastContainer(options, setPosition) {\n const id = getContainerId(options?.position || \"bottom-right\");\n // If a creation is in-flight, await it\n if (containerLocks.has(id)) {\n return containerLocks.get(id);\n }\n\n const p = (async () => {\n // 1) Prefer registry cache if still connected to current document\n const cached = containerRegistry.get(id);\n const isCurrentDoc = typeof document === \"undefined\" || cached?.ownerDocument === document;\n if (cached?.isConnected && isCurrentDoc) {\n return cached;\n }\n // Clean up stale registry entry if container was removed from DOM or from old document\n if (cached) {\n containerRegistry.delete(id);\n }\n\n // 2) Find existing in DOM\n let el = document.getElementById(id); // unique by spec, but may return first if duplicates exist\n if (el && !el.isConnected) {\n // re-attach if detached\n document.body.appendChild(el);\n }\n\n // 3) If not found, create\n if (!el) {\n el = document.createElement(\"div\");\n el.id = id;\n el.setAttribute(\"role\", \"status\"); // polite + atomic by default\n el.setAttribute(\"aria-atomic\", \"true\"); // explicit for consistency\n el.style.position = \"fixed\";\n el.style.zIndex = \"9999\";\n el.style.pointerEvents = \"none\";\n el.style.inset = \"auto 10px 10px auto\";\n el.style.display = \"flex\";\n el.style.justifyContent = \"space-between\";\n el.style.alignItems = \"center\";\n el.style.flexDirection = \"column\";\n el.style.overflow = \"hidden\";\n // Position with provided helper\n if (typeof setPosition === \"function\") {\n await setPosition(el, options);\n }\n document.body.appendChild(el);\n } else {\n // Ensure base styles and (re)apply position in case options changed\n el.style.position = el.style.position || \"fixed\";\n el.style.zIndex = el.style.zIndex || \"9999\";\n if (typeof setPosition === \"function\") {\n await setPosition(el, options);\n }\n }\n\n // 4) If somehow duplicates exist, keep the first and remove the rest\n // getElementById would have returned the first; clean up others proactively\n const all = document.querySelectorAll(`#${id}`);\n if (all.length > 1) {\n for (let i = 1; i < all.length; i++) {\n try {\n all[i].remove();\n } catch {}\n }\n }\n\n containerRegistry.set(id, el);\n return el;\n })();\n\n containerLocks.set(id, p);\n try {\n const out = await p;\n return out;\n } finally {\n // Clear the lock so future calls can re-enter if needed\n containerLocks.delete(id);\n }\n}\n","\"use strict\";\n\nconst DOCUMENTED_POSITIONS = new Set([\n \"top-left\",\n \"top-right\",\n \"bottom-left\",\n \"bottom-right\",\n \"top-center\",\n \"bottom-center\",\n \"left-center\",\n \"right-center\",\n \"top-full-width\",\n \"bottom-full-width\",\n \"center\",\n]);\n\nconst LEGACY_POSITIONS = new Set([\"top\", \"bottom\"]);\n\nfunction isDocumentedPosition(pos) {\n return DOCUMENTED_POSITIONS.has(pos);\n}\n\nexport async function setPosition(container, options) {\n if (!container || !options?.position) {\n throw new Error(\"Invalid container or position!\");\n }\n\n const rawPos = String(options.position).toLowerCase().trim();\n let effectivePos = rawPos;\n\n if (!isDocumentedPosition(rawPos) && !LEGACY_POSITIONS.has(rawPos)) {\n console.warn(`Unknown position \"${options.position}\", defaulting to \"bottom-right\"`);\n effectivePos = \"bottom-right\";\n }\n\n resetContainerStyles(container);\n const positionFlags = parsePosition(effectivePos);\n\n if (handleFullWidthPositions(container, options, positionFlags)) return;\n if (handleCenterPositions(container, positionFlags)) return;\n\n applyStandardPositioning(container, positionFlags);\n}\n\nfunction resetContainerStyles(container) {\n container.style.top = \"auto\";\n container.style.bottom = \"auto\";\n container.style.left = \"auto\";\n container.style.right = \"auto\";\n container.style.transform = \"none\";\n}\n\nfunction parsePosition(position) {\n const pos = position.toLowerCase().trim();\n\n const hasTop = pos.startsWith(\"top\");\n const hasBottom = pos.startsWith(\"bottom\") || pos.startsWith(\"below\");\n const hasLeft = pos.startsWith(\"left\");\n const hasRight = pos.startsWith(\"right\");\n const hasCenter = pos === \"center\" || (pos.includes(\"center\") && !pos.includes(\"left\") && !pos.includes(\"right\") && !pos.includes(\"top\") && !pos.includes(\"bottom\"));\n\n const isFullWidth = pos === \"top-full-width\" || pos === \"bottom-full-width\";\n\n return {\n hasTop,\n hasBottom,\n hasLeft,\n hasRight,\n hasCenter,\n hasFullWidth: isFullWidth,\n };\n}\n\nfunction handleFullWidthPositions(container, options, flags) {\n if (!flags.hasFullWidth) return false;\n\n container.style.maxWidth = \"100vw\";\n try {\n if (options && !options.maxWidth) {\n options.maxWidth = \"100vw\";\n }\n } catch {}\n\n if (flags.hasTop) {\n container.style.top = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n container.style.left = \"10px\";\n container.style.right = \"10px\";\n return true;\n }\n\n return false;\n}\n\nfunction handleCenterPositions(container, flags) {\n if (!flags.hasCenter) return false;\n\n if (flags.hasTop && !flags.hasLeft && !flags.hasRight) {\n container.style.top = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasBottom && !flags.hasLeft && !flags.hasRight) {\n container.style.bottom = \"10px\";\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n return true;\n }\n\n if (flags.hasLeft && !flags.hasTop && !flags.hasBottom) {\n container.style.left = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.right = \"10px\";\n container.style.top = \"50%\";\n container.style.transform = \"translateY(-50%)\";\n return true;\n }\n\n if (!flags.hasLeft && !flags.hasRight && !flags.hasTop && !flags.hasBottom) {\n container.style.top = \"50%\";\n container.style.left = \"50%\";\n container.style.transform = \"translate(-50%, -50%)\";\n return true;\n }\n\n return false;\n}\n\nfunction applyStandardPositioning(container, flags) {\n if (flags.hasBottom) {\n container.style.bottom = \"10px\";\n } else if (flags.hasTop) {\n container.style.top = \"10px\";\n } else {\n container.style.bottom = \"10px\";\n }\n\n if (flags.hasRight) {\n container.style.right = \"10px\";\n } else if (flags.hasLeft) {\n container.style.left = \"10px\";\n } else {\n container.style.left = \"50%\";\n container.style.transform = \"translateX(-50%)\";\n }\n}","// src/utils/PausableTimer.js\n\"use strict\";\n\nexport class PausableTimer {\n constructor(callback, delay) {\n this.callback = typeof callback === \"function\" ? callback : () => {};\n const safeDelay = Number.isFinite(delay) && delay >= 0 ? delay : 0;\n this.delay = safeDelay;\n this.remaining = safeDelay;\n this.startTime = null;\n this.timeoutId = null;\n this.isPaused = false;\n this.isCompleted = false;\n }\n\n start() {\n if (this.isCompleted || this.timeoutId) return this;\n this.startTime = Date.now();\n this.timeoutId = setTimeout(() => {\n this.isCompleted = true;\n this.timeoutId = null;\n try {\n this.callback();\n } catch (err) {\n console.error(\"PausableTimer callback error:\", err);\n }\n }, this.remaining);\n if (typeof this.timeoutId?.unref === \"function\") {\n this.timeoutId.unref();\n }\n return this;\n }\n\n pause() {\n if (this.isPaused || !this.timeoutId || this.isCompleted) return this;\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n this.remaining -= Date.now() - this.startTime;\n this.remaining = Math.max(0, this.remaining); // prevent negative\n this.isPaused = true;\n return this;\n }\n\n resume() {\n if (!this.isPaused || this.isCompleted) return this;\n this.isPaused = false;\n this.start();\n return this;\n }\n\n clear() {\n if (this.timeoutId) {\n clearTimeout(this.timeoutId);\n this.timeoutId = null;\n }\n this.isCompleted = true;\n return this;\n }\n\n getRemainingTime() {\n if (this.isCompleted) return 0;\n if (this.isPaused) return this.remaining;\n if (!this.timeoutId) return this.delay;\n return Math.max(0, this.remaining - (Date.now() - this.startTime));\n }\n}\n","\"use strict\";\n\nimport { createToastElement } from \"./Toast.js\";\nimport { removeElement, getDynamicAccessibleTextColorHex } from \"../utils/dom.js\";\nimport { createEmergencyToast } from \"./toast-utils.js\";\nimport { getOrCreateToastContainer, normalizePositionKey } from \"../utils/containerRegistry.js\";\nimport { setPosition } from \"../utils/position.js\";\nimport { PausableTimer } from \"../utils/PausableTimer.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { playTone } from \"../utils/audio.js\";\nimport { createProgressBar } from \"./toast-utils-core.js\";\nimport { createLoader } from \"./loader.js\";\n\nconst MAX_VISIBLE = 3;\n\nconst active = new Map();\nconst pending = new Map();\nconst queue = [];\nlet visibleCount = 0;\n\nexport function updateStackedLayout(container) {\n if (!container || !container.children) return;\n const isStacked = container.getAttribute(\"data-stacked\") === \"true\";\n if (!isStacked) return;\n\n if (!container._stackedInitialized && typeof container.addEventListener === \"function\") {\n container._stackedInitialized = true;\n container.addEventListener(\"mouseenter\", () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n });\n container.addEventListener(\"mouseleave\", () => {\n container._isExpanded = false;\n updateStackedLayout(container);\n });\n container.addEventListener(\"focusin\", () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n });\n container.addEventListener(\"focusout\", (e) => {\n if (!container.contains(e.relatedTarget)) {\n container._isExpanded = false;\n updateStackedLayout(container);\n }\n });\n }\n\n const items = Array.from(container.children);\n const count = items.length;\n const isExpanded = Boolean(container._isExpanded);\n const isTop = Boolean(container.id && container.id.includes(\"top\"));\n\n items.forEach((item, index) => {\n const depthFromTop = count - 1 - index;\n item.style.transition =\n \"transform 240ms cubic-bezier(0.16, 1, 0.3, 1), margin 240ms cubic-bezier(0.16, 1, 0.3, 1), opacity 240ms ease\";\n\n if (isExpanded) {\n item.style.transform = \"none\";\n item.style.marginTop = \"0px\";\n item.style.marginBottom = \"10px\";\n item.style.opacity = \"1\";\n item.style.zIndex = String(100 + index);\n item.style.pointerEvents = \"auto\";\n } else {\n if (depthFromTop === 0) {\n item.style.transform = \"scale(1)\";\n item.style.marginTop = \"0px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"1\";\n item.style.zIndex = \"30\";\n item.style.pointerEvents = \"auto\";\n } else if (depthFromTop === 1) {\n const y = isTop ? 10 : -10;\n item.style.transform = `scale(0.95) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0.9\";\n item.style.zIndex = \"20\";\n item.style.pointerEvents = \"auto\";\n } else if (depthFromTop === 2) {\n const y = isTop ? 20 : -20;\n item.style.transform = `scale(0.90) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0.75\";\n item.style.zIndex = \"10\";\n item.style.pointerEvents = \"auto\";\n } else {\n const y = isTop ? 30 : -30;\n item.style.transform = `scale(0.85) translateY(${y}px)`;\n item.style.marginTop = \"-55px\";\n item.style.marginBottom = \"0px\";\n item.style.opacity = \"0\";\n item.style.zIndex = \"1\";\n item.style.pointerEvents = \"none\";\n }\n }\n });\n}\n\nfunction hashString(str) {\n let h = 5381;\n for (let i = 0; i < str.length; i++) h = (h << 5) + h + str.charCodeAt(i);\n return h >>> 0;\n}\n\nfunction makeKey(options = {}) {\n const safe = options && typeof options === \"object\" ? options : {};\n const type = String(safe.type || \"info\").trim().toLowerCase();\n const messageHash = hashString(String(safe.message || \"\")).toString(16);\n const position = normalizePositionKey(safe.position || \"bottom-right\");\n\n return `${type}|${messageHash}|${position}`;\n}\n\nexport async function showToast(options = {}) {\n try {\n const key = makeKey(options);\n\n if (active.has(key)) {\n const data = active.get(key);\n if (!data) throw new Error(`Active toast with key ${key} not found`);\n data.count++;\n\n data.timer.clear();\n data.timer = createDismissTimer(data.toast, options);\n await setupPauseOnHover(data);\n await updateBadge(data);\n return key;\n }\n\n if (pending.has(key)) {\n const current = pending.get(key);\n if (!current) throw new Error(`Pending toast with key ${key} not found`);\n current.count++;\n return key;\n }\n\n const entry = { options, count: 1, rafId: 0 };\n pending.set(key, entry);\n\n entry.rafId = requestAnimationFrame(async () => {\n const current = pending.get(key);\n if (!current) return;\n pending.delete(key);\n\n if (visibleCount >= MAX_VISIBLE) {\n queue.push({ options: current.options, key, count: current.count });\n await drainQueue();\n return;\n }\n\n try {\n await createOne(current.options, key, current.count);\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n });\n\n // AUDIT/FEATURE (toastPromise support): returns the computed key so\n // callers can build a handle for targeted dismissal later — e.g.\n // toastPromise() needs to dismiss THIS SPECIFIC loading toast when the\n // promise settles, not whatever happens to be \"most recent\" by then.\n // This does NOT change when showToast() resolves (still resolves\n // right after scheduling the rAF callback, same as before) — it only\n // adds a return VALUE where there was none. The actual toast element\n // is still created asynchronously afterward, same as always.\n return key;\n } catch (error) {\n console.error(\"showToast failed:\", error);\n }\n}\n\nasync function createOne(options, key, initialCount) {\n try {\n if (!options || typeof options !== \"object\") {\n throw new TypeError(\"options must be an object\");\n }\n\n visibleCount++;\n\n const container = await getOrCreateToastContainer(options, setPosition);\n if (!container) {\n throw new Error(\"Failed to create toast container\");\n }\n\n const toast = await createToastElement(options, closeToast);\n if (!toast) {\n throw new Error(\"Toast element creation failed\");\n }\n\n const outer = document.createElement(\"div\");\n Object.assign(outer.style, {\n position: \"relative\",\n display: \"inline-block\",\n overflow: \"visible\",\n marginBottom: \"10px\",\n zIndex: \"0\",\n width: \"100%\",\n pointerEvents: \"auto\",\n });\n\n const inner = document.createElement(\"div\");\n Object.assign(inner.style, {\n position: \"relative\",\n overflow: \"hidden\",\n zIndex: \"1\",\n });\n\n inner.appendChild(toast);\n outer.appendChild(inner);\n\n if (container.id.includes(\"toast-container-\")) {\n container.appendChild(outer);\n if (options.stacked) {\n container.setAttribute(\"data-stacked\", \"true\");\n }\n if (container.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(container);\n }\n }\n\n const shouldPauseOnHover =\n options.pauseOnHover !== false &&\n (options.pauseOnHover === true || !!options.cta);\n\n const data = {\n outer,\n toast,\n options,\n count: Math.max(1, Math.floor(initialCount ?? 0)),\n pauseOnHover: shouldPauseOnHover,\n };\n active.set(key, data);\n toast._key = key;\n\n if (data.count > 1) await updateBadge(data);\n\n data.timer = createDismissTimer(toast, options);\n await setupPauseOnHover(data);\n } catch (err) {\n console.error(\"Something went wrong: \", err);\n visibleCount = Math.max(0, visibleCount - 1);\n const el =\n document.querySelector('[id^=\"toast-container-\"]') || document.body;\n el.appendChild(await createEmergencyToast(options, closeToast));\n }\n}\n\nexport async function dismissMostRecent() {\n try {\n if (active.size === 0) {\n if (pending.size > 0) {\n const [pendingKey, pendingEntry] = Array.from(pending.entries()).at(-1);\n if (pendingEntry?.rafId) cancelAnimationFrame(pendingEntry.rafId);\n pending.delete(pendingKey);\n return;\n }\n\n if (queue.length > 0) {\n queue.pop();\n return;\n }\n\n return;\n }\n\n let lastToastEl = null;\n\n // Direct lookup: last active entry is the most recently created toast\n const activeValues = Array.from(active.values());\n if (activeValues.length > 0) {\n const lastData = activeValues.at(-1);\n lastToastEl =\n lastData.toast ||\n (lastData.outer && lastData.outer.querySelector('[id^=\"toast-\"]'));\n }\n\n if (!lastToastEl) {\n const containers = document.querySelectorAll('[id^=\"toast-container-\"]');\n containers.forEach((container) => {\n const children = Array.from(container.children || []);\n if (children.length === 0) return;\n const candidate = children.at(-1);\n if (candidate) {\n lastToastEl = candidate.querySelector('[id^=\"toast-\"]') || candidate;\n }\n });\n }\n\n if (!lastToastEl) return;\n\n const toastEl = lastToastEl._key\n ? lastToastEl\n : lastToastEl.querySelector('[id^=\"toast-\"]') || lastToastEl;\n\n await closeToast(toastEl);\n } catch (err) {\n console.error(\"dismissMostRecent failed:\", err);\n }\n}\n\nexport async function closeAllToasts() {\n try {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n\n const activeToasts = Array.from(active.values())\n .map((d) => d.toast)\n .filter(Boolean);\n\n await Promise.allSettled(\n activeToasts.map(async (t) => {\n try {\n await closeToast(t);\n } catch (error_inner) {\n console.warn(\"closeAllToasts: failed to close one toast:\", error_inner);\n }\n }),\n );\n } catch (err) {\n console.error(\"closeAllToasts failed:\", err);\n }\n}\n\nexport function resetToastManager() {\n for (const [, entry] of pending) {\n if (entry?.rafId) cancelAnimationFrame(entry.rafId);\n }\n pending.clear();\n queue.length = 0;\n for (const [, data] of active) {\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanup?.();\n }\n active.clear();\n visibleCount = 0;\n}\n\nexport const dismiss = dismissMostRecent;\nexport const noop = closeAllToasts;\n\nfunction createDismissTimer(toast, options) {\n const raw = Number(options?.duration);\n const duration = Number.isFinite(raw) && raw > 0 ? raw : 2500;\n const delay = duration + 5;\n const timer = new PausableTimer(async () => await closeToast(toast), delay);\n timer.start();\n return timer;\n}\n\nasync function setupPauseOnHover(data) {\n if (!data.pauseOnHover || !data.outer || !data.timer) return;\n\n const { outer, timer, toast } = data;\n\n const onMouseEnter = () => {\n timer.pause();\n toast?._progressAnimation?.pause();\n };\n const onMouseLeave = () => {\n timer.resume();\n toast?._progressAnimation?.play();\n };\n\n const onFocusIn = (e) => {\n if (e.target.matches(\"[tabindex], div, span, button, a\")) {\n timer.pause();\n toast?._progressAnimation?.pause();\n }\n };\n\n const onFocusOut = (e) => {\n if (!outer.contains(e.relatedTarget)) {\n timer.resume();\n toast?._progressAnimation?.play();\n }\n };\n\n outer.addEventListener(\"mouseenter\", onMouseEnter);\n outer.addEventListener(\"mouseleave\", onMouseLeave);\n outer.addEventListener(\"focusin\", onFocusIn);\n outer.addEventListener(\"focusout\", onFocusOut);\n\n outer._pauseCleanup = () => {\n outer.removeEventListener(\"mouseenter\", onMouseEnter);\n outer.removeEventListener(\"mouseleave\", onMouseLeave);\n outer.removeEventListener(\"focusin\", onFocusIn);\n outer.removeEventListener(\"focusout\", onFocusOut);\n };\n}\n\nexport async function closeToast(toast) {\n if (!toast?._key) return;\n return closeToastByKey(toast._key);\n}\n\n// AUDIT/FEATURE (toastPromise support): the actual removal logic, now\n// keyed directly instead of requiring a toast DOM element. closeToast()\n// above is now a thin wrapper over this — same guard checks, same order\n// of operations, nothing behaviorally changed for existing closeToast()\n// callers. This lets toastPromise() (and anything else that only has a\n// key, not a live element reference) target a SPECIFIC toast for removal\n// — e.g. the loading toast — rather than only being able to close\n// \"whatever toast a DOM element currently points to.\"\nexport async function closeToastByKey(key) {\n try {\n if (!key) return;\n\n // AUDIT/FEATURE FIX: toast creation is deferred one animation frame\n // (see showToast's rAF coalescing, used for grouping/dedup) — so a\n // caller holding a handle from createToast() can call dismiss()\n // before the toast has actually been created yet and moved from\n // `pending` into `active`. This is a real, reachable race: it\n // happens whenever a wrapped operation resolves faster than one\n // animation frame (e.g. toastPromise() with an already-resolved or\n // synchronously-resolving promise). Previously this just silently\n // no-op'd — the scheduled creation went ahead anyway, leaving a\n // toast that was supposed to be dismissed still showing (and, for\n // toastPromise()'s loading toast specifically, still running its\n // long fallback duration). Checking `pending` first and cancelling\n // the scheduled frame is the correct fix: \"dismiss a not-yet-created\n // toast\" should mean \"don't create it,\" not \"silently do nothing.\"\n const pendingEntry = pending.get(key);\n if (pendingEntry) {\n cancelAnimationFrame(pendingEntry.rafId);\n pending.delete(key);\n return;\n }\n\n // Same race, different intermediate state: the toast finished its\n // rAF-scheduled creation but MAX_VISIBLE was already hit at that\n // moment, so it was pushed into `queue` instead of `active` — not\n // yet showing, waiting for a slot to free up via drainQueue().\n const queueIndex = queue.findIndex((item) => item.key === key);\n if (queueIndex !== -1) {\n queue.splice(queueIndex, 1);\n return;\n }\n\n const data = active.get(key);\n if (!data) return;\n\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanup?.();\n // Clean up CTA click listener if present directly on button/link\n const ctaEl = data.toast?.querySelector(\"button, a\");\n ctaEl?._cleanup?.();\n\n active.delete(key);\n visibleCount = Math.max(0, visibleCount - 1);\n\n const badge = data.outer.querySelector(\".toast-count-badge\");\n if (badge) badge.remove();\n\n const animDuration = data.toast?._animationDuration ?? 400;\n if (data.toast) {\n data.toast.style.opacity = \"0\";\n data.toast.style.transform = \"translateY(20px)\";\n }\n\n const parentContainer = data.outer?.parentElement;\n await removeWithTransition(data.outer, data.toast, animDuration);\n\n if (\n parentContainer &&\n parentContainer.children.length === 0 &&\n parentContainer.id?.startsWith(\"toast-container-\")\n ) {\n try {\n parentContainer.remove();\n } catch {}\n } else if (parentContainer && parentContainer.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(parentContainer);\n }\n\n await drainQueue();\n } catch (error) {\n console.error(\"Closing Toast failed!: \", error);\n }\n}\n\nasync function drainQueue() {\n while (visibleCount < MAX_VISIBLE && queue.length) {\n const item = queue.shift();\n if (active.has(item.key)) {\n const data = active.get(item.key);\n data.count += item.count;\n await updateBadge(data);\n continue;\n }\n void createOne(item.options, item.key, item.count);\n }\n}\n\nasync function removeWithTransition(el, targetEl, animationDurationMs = 400) {\n if (!el) return Promise.resolve();\n\n return new Promise((resolve) => {\n let done = false;\n const finish = () => {\n if (done) return;\n done = true;\n removeElement(el);\n resolve();\n };\n\n const animEl = targetEl || el.firstElementChild || el;\n if (!animEl) return resolve();\n\n const onEnd = (e) => {\n try {\n if (e.target !== animEl) return;\n animEl.removeEventListener(\"transitionend\", onEnd, true);\n finish();\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n };\n\n try {\n animEl.addEventListener(\"transitionend\", onEnd, true);\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n\n // Use animation duration + 100ms buffer for fallback timeout\n const fallbackTimeout = animationDurationMs + 100;\n setTimeout(() => {\n try {\n animEl.removeEventListener(\"transitionend\", onEnd, true);\n finish();\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n }, fallbackTimeout);\n });\n}\n\nasync function updateBadge({ outer, count }) {\n if (!outer || !(outer instanceof HTMLElement)) {\n throw new Error(\"updateBadge: outer must be a valid HTMLElement\");\n }\n\n if (count < 2) {\n const badge = outer.querySelector(\".toast-count-badge\");\n if (badge) badge.remove();\n return;\n }\n\n let badge = outer.querySelector(\".toast-count-badge\");\n if (!badge) {\n badge = document.createElement(\"span\");\n badge.className = \"toast-count-badge\";\n badge.setAttribute(\"aria-label\", `${count} identical notifications`);\n\n Object.assign(badge.style, {\n position: \"absolute\",\n top: \"6px\",\n right: \"6px\",\n backgroundColor: \"#f44336\",\n color: \"#fff\",\n borderRadius: \"50%\",\n minWidth: \"20px\",\n height: \"20px\",\n fontSize: \"12px\",\n fontWeight: \"600\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n border: \"2px solid #fff\",\n boxShadow: \"0 2px 6px rgba(0,0,0,0.3)\",\n zIndex: \"2\",\n pointerEvents: \"none\",\n transition: \"transform 150ms ease\",\n });\n\n outer.appendChild(badge);\n }\n\n badge.textContent = count > 99 ? \"99+\" : String(count);\n\n try {\n badge.style.transform = \"scale(1.2)\";\n setTimeout(() => (badge.style.transform = \"scale(1)\"), 150);\n } catch (error) {\n console.error(\"updateBadge animation error:\", error);\n }\n}\n\n/**\n * Updates an active, pending, or queued toast in-place with new options.\n * @param {string} key\n * @param {Partial<import('../index.js').ToastOptions>} [newOptions]\n */\nexport async function updateToastByKey(key, newOptions = {}) {\n if (!key || typeof newOptions !== \"object\" || newOptions === null) return;\n\n if (pending.has(key)) {\n const entry = pending.get(key);\n entry.options = { ...entry.options, ...newOptions };\n return;\n }\n\n const queued = queue.find((q) => q.key === key);\n if (queued) {\n queued.options = { ...queued.options, ...newOptions };\n return;\n }\n\n const data = active.get(key);\n if (!data || !data.toast) return;\n\n data.options = { ...data.options, ...newOptions };\n const toast = data.toast;\n const messageSpan =\n toast._messageSpan ||\n toast.querySelector(\".toast-message\") ||\n toast.querySelector(\"span:not(.toast-count-badge)\");\n\n // 1. Update message\n if (newOptions.message !== undefined) {\n const rawMessage = String(newOptions.message ?? \"\");\n const allowHtml =\n newOptions.allowHtml !== undefined\n ? Boolean(newOptions.allowHtml)\n : Boolean(data.options.allowHtml);\n\n if (messageSpan) {\n const existingLoader = messageSpan.querySelector(\".toast-loader\");\n messageSpan.innerHTML = \"\";\n if (\n existingLoader &&\n newOptions.showLoader !== false &&\n newOptions.loader !== null\n ) {\n messageSpan.appendChild(existingLoader);\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.appendChild(spacer);\n }\n\n if (allowHtml && rawMessage.trim().length > 0) {\n try {\n const sanitized = sanitizeHtml(rawMessage);\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n messageSpan.appendChild(tmp.firstChild);\n }\n } catch {\n messageSpan.appendChild(document.createTextNode(rawMessage));\n }\n } else {\n messageSpan.appendChild(document.createTextNode(rawMessage));\n }\n\n messageSpan.setAttribute(\n \"title\",\n rawMessage.replace(/<[^>]+>/g, \"\")\n );\n }\n }\n\n // 2. Handle Loader\n if (newOptions.showLoader === false || newOptions.loader === null) {\n const loaderEl = messageSpan?.querySelector(\".toast-loader\");\n if (loaderEl) {\n if (loaderEl.nextSibling && loaderEl.nextSibling.nodeName === \"SPAN\") {\n loaderEl.nextSibling.remove();\n }\n loaderEl.remove();\n }\n } else if (\n (newOptions.showLoader === true ||\n (newOptions.loader && typeof newOptions.loader === \"object\")) &&\n messageSpan &&\n !messageSpan.querySelector(\".toast-loader\")\n ) {\n const loaderEl = createLoader(newOptions.loader || {});\n messageSpan.insertBefore(loaderEl, messageSpan.firstChild);\n const spacer = document.createElement(\"span\");\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n messageSpan.insertBefore(spacer, loaderEl.nextSibling);\n }\n\n // 3. Update type & colors\n if (newOptions.type) {\n const newType = String(newOptions.type).toLowerCase().trim();\n toast.className = toast.className.replace(\n /\\btoast-(info|success|error|warning)\\b/g,\n `toast-${newType}`,\n );\n if (!newOptions.backgroundColor) {\n const typeColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n };\n if (typeColors[newType]) {\n toast.style.background = typeColors[newType];\n }\n }\n }\n\n if (newOptions.backgroundColor) {\n toast.style.background = newOptions.backgroundColor;\n }\n\n if (newOptions.textColor) {\n toast.style.color = newOptions.textColor;\n if (messageSpan) messageSpan.style.color = newOptions.textColor;\n } else if (newOptions.type || newOptions.backgroundColor) {\n const bg = toast.style.background;\n if (bg) {\n const dynamicColor = getDynamicAccessibleTextColorHex(bg);\n toast.style.color = dynamicColor;\n if (messageSpan) messageSpan.style.color = dynamicColor;\n }\n }\n\n // 4. Update Progress Bar\n if (newOptions.progress !== undefined) {\n let pct = Number(newOptions.progress);\n if (!Number.isFinite(pct)) pct = 0;\n if (pct <= 1 && pct > 0) pct = pct * 100;\n pct = Math.min(100, Math.max(0, pct));\n\n let progressBar = toast.querySelector(\".toast-progress-bar\");\n if (\n !progressBar &&\n (newOptions.showProgressBar || data.options.showProgressBar)\n ) {\n createProgressBar(toast, { ...data.options, ...newOptions });\n progressBar = toast.querySelector(\".toast-progress-bar\");\n }\n if (progressBar) {\n if (toast._progressAnimation) {\n try {\n toast._progressAnimation.cancel();\n } catch {}\n toast._progressAnimation = null;\n }\n progressBar.style.transition = \"width 200ms ease\";\n progressBar.style.width = `${pct}%`;\n }\n } else if (newOptions.showProgressBar === false) {\n const bar = toast.querySelector(\".toast-progress-bar\");\n if (bar) bar.remove();\n }\n\n // 5. Update Duration / Timer\n if (newOptions.duration !== undefined) {\n data.timer?.clear();\n const raw = Number(newOptions.duration);\n if (Number.isFinite(raw) && raw > 0) {\n data.timer = createDismissTimer(toast, { duration: raw });\n }\n }\n\n // 6. Audio Tone\n if (newOptions.sound) {\n const tone =\n typeof newOptions.sound === \"string\"\n ? newOptions.sound\n : newOptions.type || data.options.type || \"info\";\n playTone(tone);\n }\n\n // 7. Stacked update\n const container = toast.closest('[id^=\"toast-container-\"]');\n if (container && container.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(container);\n }\n}\n\n","// src/components/Toast.js //# Single responsibility\n\"use strict\";\n\nimport { createElementWithId } from \"../utils/dom.js\";\nimport { applyRichStyling, createEmergencyToast } from \"./toast-utils.js\";\n\n/**\n * Creates a multi-layer toast element with satellite-grade fallbacks\n * @param {Object} options - Toast configuration options\n * @param {Function} onClose - Callback when toast closes\n * @returns {HTMLElement} Toast element\n */\nexport async function createToastElement(options, onClose) {\n let toast;\n const tagName = \"div\";\n const prefix = \"toast\";\n\n // PRIMARY: Full-featured toast\n try {\n toast = await createElementWithId(tagName, prefix);\n await applyRichStyling(toast, options, onClose);\n return toast;\n } catch (error) {\n console.warn(\n \"toast creation failed with error showing fallback one: \",\n error\n );\n // Fallback: create emergency toast\n toast = await createEmergencyToast(options, onClose);\n return toast;\n }\n}\n","// src/utils/id.js\n\"use strict\";\n\n/**\n * Generate unique ID for DOM elements to avoid conflicts\n * @param {string} prefix - Optional prefix for ID\n * @returns {string} Unique ID\n */\nexport function generateToastId(prefix = \"toast\") {\n const safePrefix = typeof prefix === \"string\" && prefix.trim() ? prefix.trim() : \"toast\";\n const timestamp = Date.now().toString(36); // shorter timestamp\n const random = Math.floor(Math.random() * 0xfffff).toString(36); // short random part\n return `${safePrefix}-${timestamp}-${random}`;\n}\n","\"use strict\";\n\nimport {\n showToast,\n closeToastByKey,\n updateToastByKey,\n resetToastManager,\n dismiss,\n noop as managerNoop,\n} from \"./components/ToastManager.js\";\nimport { getOrCreateToastContainer, resetContainerRegistry } from \"./utils/containerRegistry.js\";\nimport { getDynamicAccessibleTextColorHex } from \"./utils/dom.js\";\nimport { setPosition } from \"./utils/position.js\";\nimport { setAudioEnabled, isAudioEnabled, playTone } from \"./utils/audio.js\";\n\n/**\n * @typedef {'info' | 'success' | 'error' | 'warning'} ToastType\n */\n\n/**\n * @typedef {'top-left' | 'top-right' | 'bottom-left' | 'bottom-right' | 'top-center' | 'bottom-center' | 'left-center' | 'right-center' | 'top-full-width' | 'bottom-full-width' | 'center'} ToastPosition\n */\n\n/**\n * @typedef {Object} CTAOptions\n * @property {string} [label]\n * @property {string} [href]\n * @property {'button' | 'link'} [variant]\n * @property {string} [target]\n * @property {string} [rel]\n * @property {string} [ariaLabel]\n * @property {boolean} [autoClose]\n * @property {(e: MouseEvent) => void | Promise<void>} [onClick]\n */\n\n/**\n * @typedef {Object} ToastLoaderOptions\n * @property {number} [size] - Spinner size in pixels (default 14)\n * @property {string} [color] - Spinner SVG stroke color (default 'currentColor')\n * @property {string} [text] - Optional text label alongside spinner\n */\n\n/**\n * @typedef {Object} ToastOptions\n * @property {string} [message]\n * @property {ToastType} [type]\n * @property {number} [duration]\n * @property {ToastPosition | string} [position]\n * @property {string} [borderRadius]\n * @property {string} [backgroundColor]\n * @property {string} [textColor]\n * @property {boolean} [showCloseButton]\n * @property {boolean} [showProgressBar]\n * @property {string} [animationDuration]\n * @property {string} [animationEasing]\n * @property {string} [progressColor]\n * @property {string} [progressHeight]\n * @property {'top' | 'bottom'} [progressPosition]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} [allowHtml]\n * @property {boolean} [sanitizeHtml]\n * @property {boolean} [showLoader]\n * @property {ToastLoaderOptions} [loader]\n * @property {'normal' | 'truncate' | string | boolean} [wrapText]\n * @property {string} [maxWidth]\n * @property {string} [fontFamily]\n * @property {string} [fontSize]\n * @property {string} [fontWeight]\n * @property {string} [fontLineHeight]\n * @property {'auto' | 'ltr' | 'rtl'} [fontDirection]\n * @property {string} [fontPadding]\n * @property {string} [className]\n * @property {CTAOptions} [cta]\n * @property {boolean} [stacked]\n * @property {boolean | 'success' | 'error' | 'warning' | 'info' | 'pop' | string} [sound]\n * @property {boolean} [swipeToDismiss]\n * @property {number} [progress]\n */\n\n/**\n * @typedef {Object} ToastHandle\n * @property {() => Promise<void>} dismiss\n * @property {(newOptions: Partial<ToastOptions>) => Promise<void>} update\n */\n\n/**\n * @typedef {Object} ToastPromiseMessages\n * @property {string} [loading]\n * @property {string | ((result: unknown) => string)} [success]\n * @property {string | ((error: unknown) => string)} [error]\n */\n\nlet defaultColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n};\n\nlet defaultMessages = {\n success: \"Operation completed successfully!\",\n error: \"Something went wrong!\",\n warning: \"Warning message!\",\n info: \"Information message!\",\n};\n\nlet domReady = false;\nlet domReadyPromise = null;\n\nasync function checkDOMReady() {\n if (domReady) return;\n\n if (typeof window === \"undefined\" || typeof document === \"undefined\") {\n return;\n }\n\n if (\n document.readyState === \"complete\" ||\n document.readyState === \"interactive\"\n ) {\n domReady = true;\n return;\n }\n\n if (!domReadyPromise) {\n domReadyPromise = new Promise((resolve) => {\n document.addEventListener(\n \"DOMContentLoaded\",\n () => {\n domReady = true;\n resolve();\n },\n { once: true },\n );\n });\n }\n\n await domReadyPromise;\n}\n\nasync function createToastNow(options = {}) {\n try {\n const sanitizedOptions = await sanitizeToastOptions(options);\n\n await createFirstToastContainer(sanitizedOptions);\n\n return await showToast(sanitizedOptions);\n } catch (error) {\n console.error(\"CreateToast failed:\", error);\n return null;\n }\n}\n\nasync function createToast(options = {}) {\n const isBrowser =\n typeof window !== \"undefined\" && typeof document !== \"undefined\";\n\n if (!isBrowser) {\n console.warn(\n \"ToastNotification: running in non-browser environment, no DOM available.\",\n );\n return null;\n }\n\n await checkDOMReady();\n\n return await createToastNow(options);\n}\n\nasync function createFirstToastContainer(options) {\n try {\n return await getOrCreateToastContainer(options, setPosition);\n } catch (error) {\n console.error(\"Failed to create toast container:\", error);\n return document.body;\n }\n}\n\nasync function sanitizeToastOptions(options) {\n const contPosition = options?.position?.toLowerCase()?.trim();\n const contMaxWidth =\n contPosition?.includes(\"top-full-width\") ||\n contPosition?.includes(\"bottom-full-width\")\n ? \"100vw\"\n : \"400px\";\n\n const defaults = {\n allowHtml: false,\n sanitizeHtml: true,\n pauseOnHover: undefined,\n duration: 2500,\n position: \"bottom-right\",\n type: \"info\",\n borderRadius: \"50px\",\n backgroundColor: undefined,\n textColor: undefined,\n showCloseButton: true,\n animationDuration: \"0.4s\",\n animationEasing: \"ease\",\n showProgressBar: true,\n progressColor: undefined,\n progressHeight: \"4px\",\n progressPosition: \"bottom\",\n fontFamily:\n '-apple-system, BlinkMacSystemFont, \"Segoe UI\", Roboto, Helvetica, Arial, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\"',\n fontSize: \"14px\",\n fontWeight: \"400\",\n fontLineHeight: \"1.4\",\n fontDirection: \"auto\",\n wrapText: \"normal\",\n maxWidth: contMaxWidth,\n };\n\n const final = {\n ...defaults,\n ...(typeof options === \"object\" && !Array.isArray(options) ? options : {}),\n };\n\n final.message = options?.message ?? final.message;\n\n try {\n if (!final.backgroundColor) {\n final.backgroundColor =\n defaultColors?.[final.type] ??\n (window.matchMedia(\"(prefers-color-scheme: dark)\").matches\n ? \"#f5f5f5\"\n : \"#111111\");\n }\n } catch (error) {\n console.warn(\"Background color resolution failed:\", error);\n }\n\n try {\n final.message =\n final.message || defaultMessages?.[final.type] || \"No Message Provided!\";\n } catch (error) {\n console.warn(\"Default message resolution failed:\", error);\n }\n\n try {\n if (!final.textColor && final.backgroundColor) {\n final.textColor = getDynamicAccessibleTextColorHex(final.backgroundColor);\n }\n } catch (error) {\n console.warn(\"Text color resolution failed:\", error);\n }\n\n try {\n if (!final.progressColor && final.backgroundColor) {\n final.progressColor =\n final.textColor ||\n getDynamicAccessibleTextColorHex(final.backgroundColor);\n }\n } catch (error) {\n console.warn(\"Progress bar color resolution failed:\", error);\n }\n\n if (typeof final.message !== \"string\") {\n final.message = \"No Message Provided!\";\n }\n\n return final;\n}\n\n/**\n * Sets default background colors for toast types.\n * @param {Partial<Record<ToastType, string>>} colors\n */\nfunction setDefaultColors(colors) {\n try {\n if (colors && typeof colors === \"object\" && !Array.isArray(colors)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(colors)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultColors = { ...defaultColors, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultColors failed:\", error);\n }\n}\n\n/**\n * Sets default messages for toast types.\n * @param {Partial<Record<ToastType, string>>} messages\n */\nfunction setDefaultMessages(messages) {\n try {\n if (messages && typeof messages === \"object\" && !Array.isArray(messages)) {\n const validTypes = [\"success\", \"error\", \"warning\", \"info\"];\n const validated = {};\n for (const [key, value] of Object.entries(messages)) {\n if (validTypes.includes(key) && typeof value === \"string\" && value.trim()) {\n validated[key] = value.trim();\n }\n }\n if (Object.keys(validated).length > 0) {\n defaultMessages = { ...defaultMessages, ...validated };\n }\n }\n } catch (error) {\n console.error(\"setDefaultMessages failed:\", error);\n }\n}\n\nlet closeInProgress = false;\nlet closePromise = null;\n\nasync function runWithClosePriority(fn) {\n if (closeInProgress && closePromise) {\n try {\n await closePromise;\n } catch (closeError) {\n console.warn(\n \"Previous close operation failed (continuing anyway):\",\n closeError,\n );\n }\n }\n return fn();\n}\n\nconst originalCreateToast = createToast;\n\n/**\n * Creates and displays a toast notification.\n * @param {ToastOptions} [options]\n * @returns {Promise<ToastHandle>}\n */\nasync function createToastWithPriority(options = {}) {\n const key = await runWithClosePriority(() => originalCreateToast(options));\n return {\n dismiss: () => (key ? closeToastByKey(key) : Promise.resolve()),\n update: (newOptions) =>\n key ? updateToastByKey(key, newOptions) : Promise.resolve(),\n };\n}\n\nexport { createToastWithPriority as createToast };\n\nexport { setDefaultColors, setDefaultMessages };\nconst dismissToast = async () => {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await dismiss();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nconst noopAll = async () => {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await managerNoop();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n};\nexport { dismissToast as dismiss, noopAll as noop };\n\nconst TOAST_PROMISE_LOADING_DURATION_MS = 24 * 60 * 60 * 1000;\n\n/**\n * Wraps a promise or function with automatic loading, success, and error toasts.\n * @template T\n * @param {Promise<T> | (() => Promise<T> | T)} promiseOrFn\n * @param {ToastPromiseMessages} [messages]\n * @param {ToastOptions} [options]\n * @returns {Promise<T>}\n */\nasync function toastPromise(promiseOrFn, messages = {}, options = {}) {\n const safeMessages = messages && typeof messages === \"object\" ? messages : {};\n const safeOptions = options && typeof options === \"object\" ? options : {};\n const loadingMessage = safeMessages.loading ?? \"Loading...\";\n\n const loadingHandle = await createToastWithPriority({\n ...safeOptions,\n type: \"info\",\n message: loadingMessage,\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n });\n\n const baseOptions = {\n ...safeOptions,\n pauseOnHover: safeOptions.pauseOnHover,\n };\n\n try {\n const settledPromise =\n typeof promiseOrFn === \"function\" ? promiseOrFn() : promiseOrFn;\n const result = await settledPromise;\n await loadingHandle.dismiss();\n\n const successMessage =\n typeof safeMessages.success === \"function\"\n ? safeMessages.success(result)\n : (safeMessages.success ?? \"Done!\");\n\n await createToastWithPriority({\n ...baseOptions,\n type: \"success\",\n message: successMessage,\n });\n\n return result;\n } catch (err) {\n await loadingHandle.dismiss();\n\n const errorMessage =\n typeof safeMessages.error === \"function\"\n ? safeMessages.error(err)\n : (safeMessages.error ?? \"Something went wrong.\");\n\n await createToastWithPriority({\n ...baseOptions,\n type: \"error\",\n message: errorMessage,\n });\n\n throw err;\n }\n}\n\nconst version = typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"3.15.0\";\n\nexport {\n version,\n toastPromise,\n resetToastManager,\n resetContainerRegistry,\n updateToastByKey,\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n};\n\nif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n if (!window.__customizableToastEscapeAttached) {\n window.__customizableToastEscapeAttached = true;\n const onKeyDown = (e) => {\n if (e.key === \"Escape\" || e.key === \"Esc\") {\n (async () => {\n try {\n closeInProgress = true;\n closePromise = (async () => {\n try {\n await dismiss();\n } finally {\n closeInProgress = false;\n closePromise = null;\n }\n })();\n await closePromise;\n } catch (error) {\n console.error(\"Escape key dismiss failed:\", error);\n closeInProgress = false;\n closePromise = null;\n }\n })();\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, { passive: true });\n }\n}\n\ntry {\n if (typeof window !== \"undefined\") {\n window.customizableToast = {\n version,\n createToast: createToastWithPriority,\n setDefaultColors,\n setDefaultMessages,\n noop: noopAll,\n dismiss: dismissToast,\n toastPromise,\n updateToastByKey,\n setAudioEnabled,\n isAudioEnabled,\n playTone,\n };\n }\n} catch (error) {\n console.error(\"Global assignment failed:\", error);\n}"],"names":["forceReflow","el","offsetWidth","colorCache","constructor","maxSize","this","map","Map","get","key","has","value","delete","set","size","firstKey","keys","next","precomputedNamedTextColors","getDynamicAccessibleTextColorHex","toastBg","String","cached","toLowerCase","textColor","r","g","b","parsed","hexMatch","match","hex","length","split","c","join","parseInt","slice","rgbMatch","Number","hslMatch","h","s","l","gray","Math","round","hue2rgb","p","q","t","parseToRgb","_varMatch$","varMatch","document","getComputedStyle","resolved","documentElement","getPropertyValue","trim","e","resolveCssCustomProperty","Error","luminance","a","v","pow","contrastRatio","rgb1","rgb2","L1","L2","max","min","rgbToHsl","d","textL","tr","tg","tb","hslToRgb","contrastBlack","contrastWhite","result","rgbToHex","toString","padStart","Object","entries","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","green","greenyellow","grey","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","white","whitesmoke","yellow","yellowgreen","forEach","name","lum","L","ALLOWED_TAGS","Set","ALLOWED_ATTRS","BLOCKED_TAGS_REGEX","EVENT_HANDLER_REGEX","JAVASCRIPT_URI_REGEX","sanitizeNode","node","allowedTags","allowedAttrs","nodeType","Node","TEXT_NODE","createTextNode","nodeValue","COMMENT_NODE","ELEMENT_NODE","tag","tagName","toUpperCase","frag","createDocumentFragment","Array","from","childNodes","child","sanitized","appendChild","createElement","attributes","attr","setAttribute","attrsToRemove","val","test","rel","getAttribute","filter","Boolean","includes","push","removeAttribute","sanitizeAttributes","sanitizedChild","sanitizeHtml","dirty","opts","forceFallback","window","DOMPurify","hasDOMPurify","cleaned","sanitize","ALLOWED_ATTR","ALLOWED_URI_REGEXP","wrapper","innerHTML","querySelectorAll","err","console","warn","step1","replace","container","outFrag","fallbackSanitize","createLoader","safeOpts","isArray","color","labelText","text","className","style","display","alignItems","gap","svgNS","svg","createElementNS","circle","opacity","strokeDasharray","strokeDashoffset","transformOrigin","animation","lbl","fontSize","textContent","getElementById","st","id","target","head","createProgressBar","toast","options","progressBar","_progressBar","borderRadiusStr","borderRadius","borderRadiusNum","progressHeightPx","progressHeight","progressDuration","duration","leftOffset","finalWidth","assign","position","left","height","background","progressColor","width","transition","progressPosition","undefined","progress","pct","isFinite","animate","_progressAnimation","easing","fill","delay","setTimeout","audioContext","audioEnabled","playTone","toneType","ctx","AudioCtx","AudioContext","webkitAudioContext","state","resume","catch","getAudioContext","now","currentTime","tone","freq","idx","osc","createOscillator","gain","createGain","type","frequency","setValueAtTime","exponentialRampToValueAtTime","connect","destination","start","stop","setAudioEnabled","enabled","isAudioEnabled","async","applyRichStyling","onClose","durationMs","endsWith","parseFloat","parseAnimationDuration","animationDuration","validAnimationDuration","animationEasing","customClass","maxWidth","backgroundColor","padding","marginBottom","overflow","justifyContent","boxShadow","minWidth","cursor","boxSizing","userSelect","pointerEvents","transform","zIndex","tabIndex","_animationDuration","messageSpan","_messageSpan","wrapText","whiteSpace","WebkitBoxOrient","WebkitLineClamp","textOverflow","flex","fontPadding","fontFamily","fontWeight","lineHeight","fontLineHeight","wordBreak","direction","fontDirection","allowHtml","rawMessage","message","loader","showLoader","loaderEl","spacer","tmp","firstChild","cta","rawCfg","cfg","label","isLink","variant","href","ariaLabel","ctaTextColor","ctaBgColor","bgColor","ctaBorderColor","marginLeft","border","flexShrink","onClick","res","then","error","autoClose","addEventListener","_cleanup","removeEventListener","_cleanupCTA","createCTA","showCloseButton","closeBtn","closeTextColor","_cleanupCloseButton","createCloseButton","showProgressBar","swipeToDismiss","startX","startY","currentX","isDragging","isHorizontal","onTouchStart","touches","clientX","clientY","onTouchMove","x","y","dx","dy","abs","cancelable","preventDefault","onTouchEnd","exitX","passive","_cleanupSwipe","attachSwipeToDismiss","sound","requestAnimationFrame","runToastAnimation","createEmergencyToast","emergency","posFlags","top","bottom","right","startsWith","wordWrap","innerWrapper","msgEl","closeSpan","cssText","removeChild","remove","timer","unref","containerRegistry","containerLocks","normalizePositionKey","raw","getOrCreateToastContainer","setPosition","isCurrentDoc","ownerDocument","isConnected","body","inset","flexDirection","all","i","DOCUMENTED_POSITIONS","LEGACY_POSITIONS","rawPos","effectivePos","pos","resetContainerStyles","positionFlags","hasTop","hasBottom","hasLeft","hasRight","hasCenter","hasFullWidth","parsePosition","flags","handleFullWidthPositions","handleCenterPositions","applyStandardPositioning","PausableTimer","callback","safeDelay","remaining","startTime","timeoutId","isPaused","isCompleted","_this$timeoutId","Date","pause","clearTimeout","clear","getRemainingTime","active","pending","queue","visibleCount","updateStackedLayout","children","_stackedInitialized","_isExpanded","contains","relatedTarget","items","count","isExpanded","isTop","item","index","depthFromTop","marginTop","createOne","initialCount","TypeError","prefix","floor","random","generateToastId","createElementWithId","createToastElement","closeToast","outer","inner","stacked","shouldPauseOnHover","pauseOnHover","data","_key","updateBadge","createDismissTimer","setupPauseOnHover","querySelector","dismiss","pendingKey","pendingEntry","at","rafId","cancelAnimationFrame","pop","lastToastEl","activeValues","values","lastData","candidate","toastEl","onMouseEnter","_toast$_progressAnima","onMouseLeave","_toast$_progressAnima2","play","onFocusIn","_toast$_progressAnima3","matches","onFocusOut","_toast$_progressAnima4","_pauseCleanup","closeToastByKey","_data$timer2","_data$outer2","_data$outer2$_pauseCl","_data$toast5","_data$toast5$_cleanup","_data$toast6","_data$toast6$_cleanup","_data$toast7","_data$toast7$_cleanup","_data$toast8","_data$toast8$_cleanup","_data$toast9","_ctaEl$_cleanup","_data$toast0","_data$outer3","_parentContainer$id","queueIndex","findIndex","splice","call","ctaEl","badge","animDuration","parentContainer","parentElement","targetEl","animationDurationMs","Promise","resolve","done","finish","parentNode","removeElement","animEl","firstElementChild","onEnd","removeWithTransition","drainQueue","shift","HTMLElement","updateToastByKey","newOptions","entry","queued","find","existingLoader","nextSibling","nodeName","insertBefore","newType","typeColors","success","warning","info","bg","dynamicColor","cancel","bar","_data$timer3","closest","defaultColors","defaultMessages","domReady","domReadyPromise","createToastNow","sanitizedOptions","_options$position","contPosition","final","_defaultColors","matchMedia","_defaultMessages","sanitizeToastOptions","createFirstToastContainer","safe","str","charCodeAt","hashString","makeKey","current","showToast","setDefaultColors","colors","validTypes","validated","setDefaultMessages","messages","closeInProgress","closePromise","createToastWithPriority","closeError","readyState","once","checkDOMReady","originalCreateToast","runWithClosePriority","update","dismissToast","noopAll","activeToasts","allSettled","error_inner","managerNoop","toastPromise","promiseOrFn","safeMessages","safeOptions","loadingMessage","loading","loadingHandle","baseOptions","settledPromise","successMessage","errorMessage","version","__customizableToastEscapeAttached","onKeyDown","customizableToast","createToast","noop","_data$timer","_data$outer","_data$outer$_pauseCle","_data$toast","_data$toast$_cleanupC","_data$toast2","_data$toast2$_cleanup","_data$toast3","_data$toast3$_cleanup","_data$toast4","_data$toast4$_cleanup"],"mappings":"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"}
|