customizable-toast-notification 3.20.2 → 4.0.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 +22 -0
- package/README.md +56 -132
- package/dist/angular.cjs +117 -0
- package/dist/angular.cjs.map +1 -0
- package/dist/angular.d.ts +44 -0
- package/dist/angular.esm.mjs +117 -0
- package/dist/angular.esm.mjs.map +1 -0
- package/dist/index.cjs +106 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.css +1 -1
- package/dist/index.css.d.ts +0 -12
- package/dist/index.css.map +2 -2
- package/dist/index.d.ts +28 -630
- package/dist/index.esm.mjs +105 -4
- package/dist/index.esm.mjs.map +1 -1
- package/dist/index.umd.js +105 -4
- package/dist/index.umd.js.map +1 -1
- package/dist/react.cjs +117 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.ts +44 -0
- package/dist/react.esm.mjs +117 -0
- package/dist/react.esm.mjs.map +1 -0
- package/dist/solid.cjs +117 -0
- package/dist/solid.cjs.map +1 -0
- package/dist/solid.d.ts +45 -0
- package/dist/solid.esm.mjs +117 -0
- package/dist/solid.esm.mjs.map +1 -0
- package/dist/svelte.cjs +117 -0
- package/dist/svelte.cjs.map +1 -0
- package/dist/svelte.d.ts +50 -0
- package/dist/svelte.esm.mjs +117 -0
- package/dist/svelte.esm.mjs.map +1 -0
- package/dist/vue.cjs +117 -0
- package/dist/vue.cjs.map +1 -0
- package/dist/vue.d.ts +45 -0
- package/dist/vue.esm.mjs +117 -0
- package/dist/vue.esm.mjs.map +1 -0
- package/package.json +20 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"angular.cjs","sources":["../src/utils/config.js","../src/utils/id.js","../src/utils/dom.js","../src/utils/html-sanitizer.js","../src/components/loader.js","../src/components/toast-utils-core.js","../src/components/icons.js","../src/components/toast-utils.js","../src/components/Toast.js","../src/utils/containerRegistry.js","../src/utils/position.js","../src/utils/PausableTimer.js","../src/components/ToastManager.js","../src/index.js","../src/angular/index.js"],"sourcesContent":["/**\n * @typedef {'auto' | 'always' | 'never'} ReducedMotionMode\n */\n\n/**\n * @typedef {'light' | 'dark' | 'high-contrast' | 'compact' | 'spacious' | 'glass'} ToastTheme\n */\n\n/**\n * @typedef {Element | DocumentFragment | ShadowRoot} ToastMountTarget\n */\n\n/**\n * @typedef {Object} ToastMetrics\n * @property {number} activeCount - Currently rendered active toasts\n * @property {number} queueDepth - Number of queued toasts waiting to be displayed\n * @property {number} visibleCount - Count of currently visible toasts\n * @property {number} droppedCount - Number of toasts dropped due to queue overflow\n * @property {number} timestamp - Epoch timestamp (ms) when metrics were recorded\n */\n\n/**\n * @typedef {Object} ToastGlobalConfig\n * @property {number} maxVisible\n * @property {number} maxQueueSize\n * @property {number} zIndex\n * @property {ToastMountTarget | null} targetNode\n * @property {boolean} disableInlineStyles\n * @property {ReducedMotionMode} reducedMotion\n * @property {string} defaultPosition\n * @property {ToastTheme} theme\n * @property {boolean} stacked\n * @property {boolean} swipeToDismiss\n * @property {boolean} sound\n * @property {boolean} [icon]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} priorityQueue\n * @property {boolean} [shadowDom]\n * @property {boolean} [trapFocus]\n * @property {boolean} [debug]\n * @property {((context: { type: string, message: string, duration?: number, options?: Record<string, unknown> }) => number | { score: number }) | null} [priorityScorer]\n * @property {((metrics: ToastMetrics) => void) | null} [onMetrics]\n */\n\nconst DEFAULT_GLOBAL_CONFIG = Object.freeze({\n maxVisible: 3,\n maxQueueSize: 100,\n zIndex: 9999,\n targetNode: null,\n disableInlineStyles: false,\n reducedMotion: \"auto\",\n defaultPosition: \"bottom-right\",\n theme: \"light\",\n stacked: false,\n swipeToDismiss: true,\n sound: false,\n icon: true,\n pauseOnHover: false,\n priorityQueue: false,\n shadowDom: false,\n trapFocus: false,\n priorityScorer: null,\n onMetrics: null,\n debug: false,\n});\n\nconst globalConfig = { ...DEFAULT_GLOBAL_CONFIG };\n\nfunction isValidMountTarget(value) {\n return value && typeof value === \"object\" && typeof value.appendChild === \"function\";\n}\n\n/**\n * Updates global toast configuration.\n * @param {Partial<ToastGlobalConfig>} [options]\n * @returns {ToastGlobalConfig}\n */\nexport function setConfig(options = {}) {\n if (!options || typeof options !== \"object\" || Array.isArray(options)) {\n return getConfig();\n }\n\n const {\n maxVisible,\n maxQueueSize,\n zIndex,\n targetNode,\n disableInlineStyles,\n reducedMotion,\n defaultPosition,\n theme,\n stacked,\n swipeToDismiss,\n sound,\n icon,\n pauseOnHover,\n priorityQueue,\n shadowDom,\n trapFocus,\n priorityScorer,\n onMetrics,\n debug,\n } = options;\n\n if (shadowDom !== undefined) {\n globalConfig.shadowDom = Boolean(shadowDom);\n }\n\n if (trapFocus !== undefined) {\n globalConfig.trapFocus = Boolean(trapFocus);\n }\n\n if (debug !== undefined) {\n globalConfig.debug = Boolean(debug);\n }\n\n if (maxVisible !== undefined) {\n const v = Number(maxVisible);\n if (Number.isFinite(v) && v > 0) {\n globalConfig.maxVisible = Math.max(1, Math.floor(v));\n }\n }\n\n if (maxQueueSize !== undefined) {\n const q = Number(maxQueueSize);\n if (Number.isFinite(q) && q >= 0) {\n globalConfig.maxQueueSize = Math.floor(q);\n }\n }\n\n if (zIndex !== undefined) {\n const z = Number(zIndex);\n if (Number.isFinite(z)) {\n globalConfig.zIndex = Math.trunc(z);\n }\n }\n\n if (targetNode !== undefined) {\n globalConfig.targetNode = (targetNode && typeof targetNode === \"object\" && typeof targetNode.appendChild === \"function\") ? targetNode : null;\n }\n\n if (disableInlineStyles !== undefined) {\n globalConfig.disableInlineStyles = Boolean(disableInlineStyles);\n }\n\n if (reducedMotion !== undefined) {\n const r = String(reducedMotion || \"auto\").toLowerCase();\n if ([\"auto\", \"always\", \"never\"].includes(r)) {\n globalConfig.reducedMotion = r;\n if (typeof document !== \"undefined\") {\n if (r === \"always\") {\n document.documentElement.setAttribute(\"data-toast-reduced-motion\", \"always\");\n } else if (r === \"never\") {\n document.documentElement.setAttribute(\"data-toast-reduced-motion\", \"never\");\n } else {\n document.documentElement.removeAttribute(\"data-toast-reduced-motion\");\n }\n }\n }\n }\n\n if (defaultPosition !== undefined) {\n const p = String(defaultPosition || \"\").toLowerCase().trim();\n if (p) {\n globalConfig.defaultPosition = p;\n }\n }\n\n if (theme !== undefined) {\n const t = String(theme || \"light\").toLowerCase();\n if ([\"light\", \"dark\", \"high-contrast\", \"compact\", \"spacious\", \"glass\"].includes(t)) {\n globalConfig.theme = t;\n // Apply theme to document root\n if (typeof document !== \"undefined\") {\n document.documentElement.setAttribute(\"data-toast-theme\", t);\n }\n }\n }\n\n if (stacked !== undefined) {\n globalConfig.stacked = Boolean(stacked);\n }\n\n if (swipeToDismiss !== undefined) {\n globalConfig.swipeToDismiss = Boolean(swipeToDismiss);\n }\n\n if (sound !== undefined) {\n globalConfig.sound = Boolean(sound);\n }\n\n if (icon !== undefined) {\n globalConfig.icon = Boolean(icon);\n }\n\n if (pauseOnHover !== undefined) {\n globalConfig.pauseOnHover = Boolean(pauseOnHover);\n }\n\n if (priorityQueue !== undefined) {\n globalConfig.priorityQueue = Boolean(priorityQueue);\n }\n\n if (priorityScorer !== undefined) {\n globalConfig.priorityScorer = typeof priorityScorer === \"function\" ? priorityScorer : null;\n }\n\n if (onMetrics !== undefined) {\n globalConfig.onMetrics = typeof onMetrics === \"function\" ? onMetrics : null;\n }\n\n return getConfig();\n}\n\n/**\n * Resets global toast configuration back to pristine defaults.\n * Cleans up DOM attributes attached to document.documentElement.\n * @returns {ToastGlobalConfig}\n */\nexport function resetConfig() {\n Object.assign(globalConfig, DEFAULT_GLOBAL_CONFIG);\n if (typeof document !== \"undefined\") {\n document.documentElement.removeAttribute(\"data-toast-theme\");\n document.documentElement.removeAttribute(\"data-toast-reduced-motion\");\n }\n return getConfig();\n}\n\n/**\n * Returns a snapshot of the current global toast configuration.\n * @returns {ToastGlobalConfig}\n */\nexport function getConfig() {\n return { ...globalConfig };\n}\n\n/**\n * Returns the current mount root, falling back to document.body.\n * @returns {ToastMountTarget | HTMLElement | null}\n */\nexport function getToastRoot() {\n if (isValidMountTarget(globalConfig.targetNode)) return globalConfig.targetNode;\n if (typeof document !== \"undefined\") return document.body;\n return null;\n}\n\n/**\n * Whether toast animations should be reduced for accessibility.\n * @returns {boolean}\n */\nexport function shouldReduceMotion() {\n if (globalConfig.reducedMotion === \"always\") return true;\n if (globalConfig.reducedMotion === \"never\") return false;\n try {\n return Boolean(\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-reduced-motion: reduce)\").matches,\n );\n } catch {\n return false;\n }\n}\n","// src/utils/id.js\n\"use strict\";\n\nlet counter = 0;\n\n/**\n * Tab/Session-level unique salt generator (cryptographically secure where available, deterministic & safe across all environments)\n * @param {Crypto | null} [customCrypto] - Optional custom crypto object for testing\n * @returns {string} Unique 3-character salt\n */\nexport function generateSalt(customCrypto = typeof globalThis !== \"undefined\" ? globalThis.crypto : null) {\n if (customCrypto && typeof customCrypto.getRandomValues === \"function\") {\n const arr = new Uint16Array(1);\n customCrypto.getRandomValues(arr);\n return arr[0].toString(36).padStart(3, \"0\").slice(-3);\n }\n const highRes = typeof performance !== \"undefined\" && typeof performance.now === \"function\"\n ? Math.floor(performance.now() * 1000)\n : 0;\n const entropy = (Date.now() ^ highRes) & 0xffff;\n return entropy.toString(36).padStart(3, \"0\").slice(-3);\n}\nconst sessionSalt = generateSalt();\n\n/**\n * Reset the internal monotonic counter (primarily for test isolation)\n * @returns {void}\n */\nexport function resetToastIdCounter() {\n counter = 0;\n}\n\n/**\n * Generate unique, CSS-safe ID for DOM elements.\n * Combines sanitized prefix, millisecond timestamp, and monotonic counter with session salt.\n * Guarantees 0% collision rate without HTTP/HTTPS secure context restrictions.\n *\n * @param {string} [prefix=\"toast\"] - Optional prefix for ID\n * @returns {string} Unique ID matching /^toast-[a-z0-9]+-[a-z0-9]+$/\n */\nexport function generateToastId(prefix = \"toast\") {\n const cleanPrefix =\n typeof prefix === \"string\"\n ? prefix\n .trim()\n .toLowerCase()\n .replace(/[^a-z0-9_-]/g, \"-\")\n .replace(/-+/g, \"-\")\n .replace(/^-|-$/g, \"\")\n : \"\";\n\n const safePrefix =\n cleanPrefix && !/^[0-9]/.test(cleanPrefix) ? cleanPrefix : \"toast\";\n\n const timestamp = Date.now().toString(36);\n\n // Monotonic increment: 0% collision mathematically guaranteed\n counter = (counter + 1) & 0xffffff;\n const countPart = counter.toString(36);\n\n return `${safePrefix}-${timestamp}-${sessionSalt}${countPart}`;\n}\n","\"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 && typeof parent.appendChild === \"function\") {\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 const trimmed = duration.trim().toLowerCase();\n if (trimmed.endsWith(\"s\") && !trimmed.endsWith(\"ms\")) {\n const parsed = Number.parseFloat(trimmed) * 1000;\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 500;\n }\n const parsed = Number.parseFloat(trimmed);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : 500;\n }\n return 500;\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 black: [0, 0, 0],\n white: [255, 255, 255],\n gray: [128, 128, 128],\n grey: [128, 128, 128],\n red: [255, 0, 0],\n green: [0, 128, 0],\n blue: [0, 0, 255],\n yellow: [255, 255, 0],\n orange: [255, 165, 0],\n purple: [128, 0, 128],\n transparent: [255, 255, 255],\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 \"#ffffff\";\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 if (typeof value !== \"string\") return value;\n let current = value.trim();\n let depth = 0;\n while (current.toLowerCase().startsWith(\"var(\") && current.endsWith(\")\") && depth < 5) {\n depth++;\n const inner = current.slice(4, -1).trim();\n const commaIndex = inner.indexOf(\",\");\n const propName = (commaIndex === -1 ? inner : inner.slice(0, commaIndex)).trim();\n const fallbackVal = commaIndex === -1 ? \"\" : inner.slice(commaIndex + 1).trim();\n\n if (!propName.startsWith(\"--\")) return current;\n\n let resolved = \"\";\n try {\n if (\n typeof document !== \"undefined\" &&\n typeof getComputedStyle === \"function\"\n ) {\n resolved = getComputedStyle(document.documentElement)\n .getPropertyValue(propName)\n .trim();\n }\n } catch { /* ignore */ }\n\n if (resolved) {\n current = resolved;\n } else if (fallbackVal) {\n current = fallbackVal;\n } else {\n break;\n }\n }\n return current;\n }\n\n function parseToRgb(value) {\n const hexMatch = value?.match(/^#(?:([0-9a-f]{3,4})|([0-9a-f]{6})|([0-9a-f]{8}))$/i);\n if (hexMatch) {\n let hex = hexMatch[1] || hexMatch[2] || hexMatch[3];\n if (hex.length === 3 || hex.length === 4) {\n hex = hex\n .slice(0, 3)\n .split(\"\")\n .map((c) => c + c)\n .join(\"\");\n }\n if (hex.length >= 6) {\n const r = Number.parseInt(hex.slice(0, 2), 16);\n const g = Number.parseInt(hex.slice(2, 4), 16);\n const b = Number.parseInt(hex.slice(4, 6), 16);\n if (Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b)) {\n return { r, g, b };\n }\n }\n return null;\n }\n\n const parseComponent = (c) => {\n if (typeof c !== \"string\") return Number(c);\n const trimmed = c.trim();\n if (trimmed.endsWith(\"%\")) {\n return Math.round((Number.parseFloat(trimmed) / 100) * 255);\n }\n return Number(trimmed);\n };\n\n const rgbMatch = value?.match(\n /rgba?\\(\\s*([\\d.]+%?)\\s*,\\s*([\\d.]+%?)\\s*,\\s*([\\d.]+%?)(?:\\s*,\\s*[\\d.%]+)?\\s*\\)/i,\n );\n if (rgbMatch) {\n const r = Math.min(255, Math.max(0, parseComponent(rgbMatch[1])));\n const g = Math.min(255, Math.max(0, parseComponent(rgbMatch[2])));\n const b = Math.min(255, Math.max(0, parseComponent(rgbMatch[3])));\n if (Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b)) {\n return { r, g, b };\n }\n }\n\n const rgbSpaceMatch = value?.match(\n /rgba?\\(\\s*([\\d.]+%?)\\s+([\\d.]+%?)\\s+([\\d.]+%?)(?:\\s*\\/\\s*[\\d.%]+)?\\s*\\)/i,\n );\n if (rgbSpaceMatch) {\n const r = Math.min(255, Math.max(0, parseComponent(rgbSpaceMatch[1])));\n const g = Math.min(255, Math.max(0, parseComponent(rgbSpaceMatch[2])));\n const b = Math.min(255, Math.max(0, parseComponent(rgbSpaceMatch[3])));\n if (Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b)) {\n return { r, g, b };\n }\n }\n\n const parseHue = (hStr) => {\n const trimmed = hStr.trim().toLowerCase();\n let raw = Number.parseFloat(trimmed);\n if (!Number.isFinite(raw)) return 0;\n if (trimmed.endsWith(\"turn\")) {\n raw = raw * 360;\n } else if (trimmed.endsWith(\"grad\")) {\n raw = (raw * 360) / 400;\n } else if (trimmed.endsWith(\"rad\")) {\n raw = (raw * 180) / Math.PI;\n }\n return (((raw % 360) + 360) % 360) / 360;\n };\n\n const hslMatch = value?.match(\n /hsla?\\(\\s*(-?[\\d.]+(?:deg|grad|rad|turn)?)\\s*,\\s*([\\d.]+)%\\s*,\\s*([\\d.]+)%(?:\\s*,\\s*[\\d.%]+)?\\s*\\)/i,\n );\n const hslSpaceMatch = !hslMatch && value?.match(\n /hsla?\\(\\s*(-?[\\d.]+(?:deg|grad|rad|turn)?)\\s+([\\d.]+)%\\s+([\\d.]+)%(?:\\s*\\/\\s*[\\d.%]+)?\\s*\\)/i,\n );\n\n const activeHslMatch = hslMatch || hslSpaceMatch;\n if (activeHslMatch) {\n const h = parseHue(activeHslMatch[1]);\n const s = Math.min(1, Math.max(0, Number(activeHslMatch[2]) / 100));\n const l = Math.min(1, Math.max(0, Number(activeHslMatch[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 let val = t;\n if (val < 0) val += 1;\n if (val > 1) val -= 1;\n if (val < 1 / 6) return p + (q - p) * 6 * val;\n if (val < 1 / 2) return q;\n if (val < 2 / 3) return p + (q - p) * (2 / 3 - val) * 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 cleanBg = typeof toastBg === \"string\" ? toastBg.trim() : String(toastBg || \"\");\n const resolvedBg = resolveCssCustomProperty(cleanBg).trim();\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 DISCARDED_TAGS = new Set([\n \"SCRIPT\",\n \"STYLE\",\n \"IFRAME\",\n \"NOSCRIPT\",\n \"OBJECT\",\n \"EMBED\",\n \"SVG\",\n \"MATH\",\n \"AUDIO\",\n \"VIDEO\",\n \"CANVAS\",\n \"TEMPLATE\",\n]);\n\nconst ALLOWED_URI_REGEX = /^\\s*(?:https?:|mailto:|data:image\\/(?:png|jpe?g|gif|webp|avif|bmp|ico);|\\/(?!\\/|\\\\)|\\.\\/|\\.\\.\\/|#)/i;\n\nexport function hasDOMPurify() {\n try {\n return Boolean(\n typeof window !== \"undefined\" &&\n window.DOMPurify &&\n typeof window.DOMPurify.sanitize === \"function\"\n );\n } catch { /* ignore */ }\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) || name.startsWith(\"on\")) {\n attrsToRemove.push(attr.name);\n return;\n }\n if (name === \"href\" || name === \"src\") {\n const trimmedVal = typeof val === \"string\" ? val.trim().toLowerCase() : \"\";\n if (\n trimmedVal.startsWith(\"javascript:\") ||\n trimmedVal.startsWith(\"vbscript:\") ||\n trimmedVal.startsWith(\"data:\")\n ) {\n if (\n name === \"src\" &&\n trimmedVal.startsWith(\"data:image/\") &&\n !trimmedVal.startsWith(\"data:image/svg+xml\")\n ) {\n // Allowed raster image data URI for <img> tags\n } else {\n if (name === \"href\") {\n el.setAttribute(\"href\", \"#\");\n return;\n }\n attrsToRemove.push(attr.name);\n return;\n }\n }\n if (!ALLOWED_URI_REGEX.test(val)) {\n if (name === \"href\") {\n el.setAttribute(\"href\", \"#\");\n return;\n }\n attrsToRemove.push(attr.name);\n return;\n }\n }\n if (name === \"target\" && typeof val === \"string\" && val.trim().toLowerCase() === \"_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 const finalTarget = el.getAttribute(\"target\");\n if (el.tagName === \"A\" && typeof finalTarget === \"string\" && finalTarget.trim().toLowerCase() === \"_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\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 (\n DISCARDED_TAGS.has(tag) ||\n tag.includes(\"SCRIPT\") ||\n tag.includes(\"<\") ||\n tag.includes(\">\")\n ) {\n return null;\n }\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\nfunction parseHtmlInert(html) {\n if (typeof DOMParser !== \"undefined\") {\n try {\n const parser = new DOMParser();\n const doc = parser.parseFromString(html, \"text/html\");\n if (doc && doc.body) return doc.body;\n } catch {}\n }\n if (typeof document !== \"undefined\") {\n const template = document.createElement(\"template\");\n if (\"content\" in template) {\n template.innerHTML = html;\n return template.content;\n }\n const div = document.createElement(\"div\");\n div.innerHTML = html;\n return div;\n }\n return null;\n}\n\nexport function fallbackSanitize(dirty) {\n if (!dirty || typeof dirty !== \"string\") return \"\";\n\n const container = parseHtmlInert(dirty);\n if (!container) return \"\";\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: ALLOWED_URI_REGEX,\n });\n\n const wrapper = document.createElement(\"div\");\n wrapper.innerHTML = cleaned;\n wrapper.querySelectorAll(\"a[href]\").forEach((a) => {\n const href = a.getAttribute(\"href\") || \"\";\n if (!ALLOWED_URI_REGEX.test(href)) {\n a.setAttribute(\"href\", \"#\");\n }\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 return wrapper.innerHTML;\n }\n } catch (err) {\n console.warn(\"DOMPurify sanitization failed, falling back:\", err);\n }\n return fallbackSanitize(dirty);\n}\n","// src/components/loader.js\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\n\nexport function createLoader(opts = {}) {\n if (typeof document === \"undefined\") return null;\n const safeOpts = opts && typeof opts === \"object\" && !Array.isArray(opts) ? opts : {};\n const rawSize = Number(safeOpts.size);\n const size = Number.isFinite(rawSize) && rawSize > 0 ? rawSize : 14;\n const rawColor = typeof safeOpts.color === \"string\" && safeOpts.color.trim() ? safeOpts.color.trim() : \"currentColor\";\n const color = (/[\\r\\n<>\"';]/.test(rawColor) || /^\\s*javascript:/i.test(rawColor)) ? \"currentColor\" : rawColor;\n const labelText = typeof safeOpts.text === \"string\" ? safeOpts.text : \"\";\n const wrapper = document.createElement(\"span\");\n wrapper.className = \"toast-loader\";\n wrapper.setAttribute(\"role\", \"status\");\n wrapper.setAttribute(\"aria-label\", labelText || \"Loading\");\n\n const config = getConfig();\n if (!config.disableInlineStyles) {\n wrapper.style.display = \"inline-flex\";\n wrapper.style.alignItems = \"center\";\n wrapper.style.gap = \"8px\";\n }\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 const circle = document.createElementNS(svgNS, \"circle\");\n circle.classList.add(\"toast-loader-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 if (!config.disableInlineStyles) {\n circle.style.opacity = \"0.85\";\n circle.style.strokeDasharray = \"90\";\n circle.style.strokeDashoffset = \"60\";\n circle.style.transformOrigin = \"center\";\n if (!shouldReduceMotion()) {\n circle.style.animation = \"toast-spinner 1s linear infinite\";\n }\n }\n\n svg.appendChild(circle);\n wrapper.appendChild(svg);\n\n if (labelText) {\n const lbl = document.createElement(\"span\");\n lbl.className = \"toast-loader-label\";\n if (!config.disableInlineStyles) {\n lbl.style.fontSize = \"13px\";\n }\n lbl.textContent = labelText;\n wrapper.appendChild(lbl);\n }\n\n if (!config.disableInlineStyles && typeof document !== \"undefined\" && !document.getElementById(\"toast-spinner-styles\")) {\n try {\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 } catch {\n // In strict CSP environments where style element appending is blocked\n }\n }\n\n return wrapper;\n}\n","import { getDynamicAccessibleTextColorHex } from \"../utils/dom.js\";\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\n\nexport function createCTA(toast, options, onClose) {\n const rawCfg = options?.cta;\n if (!rawCfg || typeof rawCfg !== \"object\") return;\n\n const configs = Array.isArray(rawCfg)\n ? rawCfg.filter((item) => item && typeof item === \"object\")\n : [rawCfg];\n if (configs.length === 0) return;\n\n const cleanups = [];\n\n configs.forEach((raw, idx) => {\n if (!raw || typeof raw !== \"object\") return;\n const cfg = { ...raw };\n\n if (!cfg.label) {\n cfg.label = configs.length > 1 ? `Action ${idx + 1}` : \"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 if (cfg.href) {\n const trimmedHref = String(cfg.href).trim();\n const isDangerous = /^(javascript:|vbscript:|data:(?!image\\/[a-z0-9.+-]+;base64,))/i.test(trimmedHref);\n el.href = isDangerous ? \"#\" : trimmedHref;\n } else {\n el.setAttribute(\"role\", \"button\");\n el.tabIndex = 0;\n }\n if (cfg.target) el.target = cfg.target;\n const relSet = new Set((cfg.rel || \"\").split(/\\s+/).filter(Boolean));\n if (typeof cfg.target === \"string\" && cfg.target.trim().toLowerCase() === \"_blank\") {\n relSet.add(\"noopener\");\n relSet.add(\"noreferrer\");\n }\n el.rel = Array.from(relSet).join(\" \");\n } else {\n el.type = \"button\";\n }\n\n el.setAttribute(\"aria-label\", cfg.ariaLabel || cfg.label);\n\n const ctaTextColor =\n cfg.textColor ||\n cfg.color ||\n options.textColor ||\n getDynamicAccessibleTextColorHex(options.backgroundColor);\n const ctaBgColor =\n cfg.backgroundColor ||\n cfg.background ||\n (options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.15)\");\n\n const trimmedColor = typeof ctaTextColor === \"string\" ? ctaTextColor.trim() : \"\";\n const hexMatch = trimmedColor.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);\n let ctaBorderColor = \"rgba(128, 128, 128, 0.3)\";\n if (hexMatch) {\n const h = hexMatch[1].length === 3\n ? `#${hexMatch[1][0]}${hexMatch[1][0]}${hexMatch[1][1]}${hexMatch[1][1]}${hexMatch[1][2]}${hexMatch[1][2]}`\n : `#${hexMatch[1]}`;\n ctaBorderColor = `${h}44`;\n }\n\n el.className = \"toast-cta\";\n const isRtl = options.fontDirection === \"rtl\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(el.style, {\n marginLeft: isRtl ? \"0px\" : (idx === 0 ? \"10px\" : \"6px\"),\n marginRight: isRtl ? (idx === 0 ? \"10px\" : \"6px\") : \"0px\",\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 display: \"inline-flex\",\n alignItems: \"center\",\n textDecoration: \"none\",\n outline: \"none\",\n });\n }\n\n el.textContent = cfg.label;\n\n const onClick = async (e) => {\n if (el._isExecuting) return;\n el._isExecuting = true;\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 el._isExecuting = false;\n if (cfg.autoClose !== false && typeof onClose === \"function\") {\n await onClose(toast);\n }\n }\n };\n\n const onKeyDown = (e) => {\n if (isLink && !cfg.href && (e.key === \"Enter\" || e.key === \" \")) {\n e.preventDefault();\n void onClick(e);\n }\n };\n\n el.addEventListener(\"click\", onClick);\n if (isLink && !cfg.href) {\n el.addEventListener(\"keydown\", onKeyDown);\n }\n\n const cleanupItem = () => {\n el.removeEventListener(\"click\", onClick);\n if (isLink && !cfg.href) {\n el.removeEventListener(\"keydown\", onKeyDown);\n }\n };\n el._cleanup = cleanupItem;\n cleanups.push(cleanupItem);\n\n const insertTarget =\n toast.querySelector(\".toast-undo-btn\") ||\n toast.querySelector(\".toast-close-btn\") ||\n toast.querySelector(\".toast-progress-bar\");\n if (insertTarget) {\n toast.insertBefore(el, insertTarget);\n } else {\n toast.appendChild(el);\n }\n });\n\n const prevCleanup = toast._cleanupCTA;\n toast._cleanupCTA = () => {\n prevCleanup?.();\n cleanups.forEach((c) => c());\n };\n}\n\n/**\n * Creates an Undo action button with optional live countdown decay.\n * @param {HTMLElement} toast\n * @param {object} options\n * @param {Function} onClose\n * @returns {void}\n */\nexport function createUndoAction(toast, options, onClose) {\n const undo = options?.undo;\n if (!undo) return;\n\n const isFn = typeof undo === \"function\";\n if (!isFn && (typeof undo !== \"object\" || Array.isArray(undo))) return;\n\n const undoCfg = isFn ? { onUndo: undo } : { ...undo };\n const baseLabel =\n typeof undoCfg.label === \"string\" && undoCfg.label.trim()\n ? undoCfg.label.trim()\n : (typeof options?.undoText === \"string\" && options.undoText.trim() ? options.undoText.trim() : \"Undo\");\n\n const totalDuration = Number(options?.duration);\n const showCountdown =\n undoCfg.showCountdown !== false &&\n Number.isFinite(totalDuration) &&\n totalDuration > 0;\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"toast-undo-btn\";\n btn.setAttribute(\"aria-label\", `${baseLabel} action`);\n\n const textColor =\n options.textColor ||\n getDynamicAccessibleTextColorHex(options.backgroundColor);\n const bgColor = options.backgroundColor\n ? getContrastBackground(options.backgroundColor)\n : \"rgba(255,255,255,0.18)\";\n\n const trimmedText = typeof textColor === \"string\" ? textColor.trim() : \"\";\n const hexMatchUndo = trimmedText.match(/^#([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$/);\n let borderColor = \"rgba(128, 128, 128, 0.35)\";\n if (hexMatchUndo) {\n const h = hexMatchUndo[1].length === 3\n ? `#${hexMatchUndo[1][0]}${hexMatchUndo[1][0]}${hexMatchUndo[1][1]}${hexMatchUndo[1][1]}${hexMatchUndo[1][2]}${hexMatchUndo[1][2]}`\n : `#${hexMatchUndo[1]}`;\n borderColor = `${h}55`;\n }\n\n const isRtl = options.fontDirection === \"rtl\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(btn.style, {\n marginLeft: isRtl ? \"0px\" : \"10px\",\n marginRight: isRtl ? \"10px\" : \"0px\",\n padding: \"5px 10px\",\n borderRadius: \"6px\",\n fontSize: \"12px\",\n fontWeight: \"700\",\n lineHeight: \"1\",\n border: `1px solid ${borderColor}`,\n color: textColor,\n background: bgColor,\n cursor: \"pointer\",\n whiteSpace: \"nowrap\",\n flexShrink: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n gap: \"4px\",\n });\n }\n\n let remainingSec = Math.max(1, Math.ceil((totalDuration || 2500) / 1000));\n const updateLabel = () => {\n btn.textContent = showCountdown\n ? `${baseLabel} (${remainingSec}s)`\n : baseLabel;\n };\n updateLabel();\n\n let intervalId = null;\n let isPaused = false;\n if (showCountdown) {\n intervalId = setInterval(() => {\n if (isPaused) return;\n remainingSec = Math.max(0, remainingSec - 1);\n updateLabel();\n if (remainingSec <= 0 && intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n }, 1000);\n if (typeof intervalId?.unref === \"function\") {\n intervalId.unref();\n }\n }\n\n toast._pauseUndo = () => {\n isPaused = true;\n };\n toast._resumeUndo = () => {\n isPaused = false;\n };\n\n const cleanupTimer = () => {\n if (intervalId) {\n clearInterval(intervalId);\n intervalId = null;\n }\n toast._pauseUndo = null;\n toast._resumeUndo = null;\n };\n\n const onClick = async (e) => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n try {\n if (typeof undoCfg.onUndo === \"function\") {\n const res = undoCfg.onUndo(e, toast);\n if (res?.then) await res;\n }\n } catch (err) {\n console.error(\"Undo action error:\", err);\n } finally {\n if (typeof onClose === \"function\") {\n await onClose(toast);\n }\n }\n };\n\n btn.addEventListener(\"click\", onClick);\n\n btn._cleanup = () => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n };\n toast._cleanupUndo = () => {\n cleanupTimer();\n btn.removeEventListener(\"click\", onClick);\n };\n\n const insertTarget =\n toast.querySelector(\".toast-close-btn\") ||\n toast.querySelector(\".toast-progress-bar\");\n if (insertTarget) {\n toast.insertBefore(btn, insertTarget);\n } else {\n toast.appendChild(btn);\n }\n}\n\nexport function createCloseButton(toast, options, onClose) {\n const closeBtn = document.createElement(\"button\");\n closeBtn.type = \"button\";\n const closeLabel =\n typeof options?.closeAriaLabel === \"string\" && options.closeAriaLabel.trim()\n ? options.closeAriaLabel.trim()\n : \"Close notification\";\n closeBtn.setAttribute(\"aria-label\", closeLabel);\n closeBtn.setAttribute(\"title\", closeLabel);\n closeBtn.textContent = \"×\";\n\n const closeTextColor = options.textColor || getDynamicAccessibleTextColorHex(options.backgroundColor);\n\n closeBtn.className = \"toast-close-btn\";\n const isRtl = options.fontDirection === \"rtl\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(closeBtn.style, {\n background: \"none\",\n border: \"none\",\n color: closeTextColor,\n fontSize: \"18px\",\n marginLeft: isRtl ? \"0px\" : \"10px\",\n marginRight: isRtl ? \"10px\" : \"0px\",\n cursor: \"pointer\",\n lineHeight: \"1\",\n padding: \"0 4px\",\n flexShrink: \"0\",\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n });\n }\n\n const onClick = () => {\n if (typeof onClose === \"function\") void 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 ensureProgressIndeterminateStyles() {\n if (typeof document === \"undefined\" || document.getElementById(\"toast-progress-indeterminate-styles\")) {\n return;\n }\n const st = document.createElement(\"style\");\n st.id = \"toast-progress-indeterminate-styles\";\n st.textContent = `\n @keyframes toast-progress-indeterminate {\n 0% { left: 0%; width: 0%; }\n 50% { left: 20%; width: 60%; }\n 100% { left: 100%; width: 0%; }\n }\n @keyframes toast-progress-indeterminate-rtl {\n 0% { right: 0%; width: 0%; }\n 50% { right: 20%; width: 60%; }\n 100% { right: 100%; width: 0%; }\n }\n .toast-progress-bar-indeterminate {\n animation: toast-progress-indeterminate 1.6s cubic-bezier(0.4, 0, 0.2, 1) infinite !important;\n }\n .toast-progress-bar-indeterminate-rtl {\n animation: toast-progress-indeterminate-rtl 1.6s cubic-bezier(0.4, 0, 0.2, 1) infinite !important;\n }\n `;\n const target = document.head || document.documentElement;\n if (target) target.appendChild(st);\n}\n\n/**\n * Safely parses and normalizes a progress value (number, percentage string, or normalized ratio).\n * Handles string percentages (\"75%\"), normalized streams (0.0 to 1.0), and NaN / out-of-bound defense.\n * @param {number | string | undefined | null} rawProgress\n * @param {HTMLElement} [toast]\n * @param {Object} [options]\n * @returns {number | \"indeterminate\" | null}\n */\nexport function parseProgressValue(rawProgress, toast, options = {}) {\n if (rawProgress === undefined || rawProgress === null) return null;\n if (rawProgress === \"indeterminate\") return \"indeterminate\";\n\n let pct;\n if (typeof rawProgress === \"string\") {\n pct = Number.parseFloat(rawProgress.trim());\n } else {\n pct = Number(rawProgress);\n }\n\n if (!Number.isFinite(pct)) return 0;\n\n // Normalized mode (0.0 to 1.0):\n // If explicitly requested via options.progressNormalized, or if value was a fraction (0 < pct < 1),\n // remember ratio mode on toast so that completion (1 or 1.0) scales to 100%.\n if (toast && pct > 0 && pct < 1) {\n toast._progressRatioMode = true;\n }\n\n const isNormalized = Boolean(options.progressNormalized) || Boolean(toast?._progressRatioMode);\n if (isNormalized && pct > 0 && pct <= 1) {\n pct = pct * 100;\n } else if (pct > 0 && pct < 1) {\n pct = pct * 100;\n }\n\n return Math.min(100, Math.max(0, pct));\n}\n\nexport function createProgressBar(toast, options = {}) {\n if (!toast) return;\n const progressBar = document.createElement(\"div\");\n progressBar.className = \"toast-progress-bar\";\n toast._progressBar = progressBar;\n const borderRadiusStr = options.borderRadius || \"0\";\n const parsedRadius = Number.parseInt(borderRadiusStr, 10);\n const borderRadiusNum = Number.isFinite(parsedRadius) && parsedRadius > 0 ? parsedRadius : 0;\n\n let progressHeightPx = 4;\n let progressHeightStyle = \"4px\";\n if (typeof options.progressHeight === \"number\" && Number.isFinite(options.progressHeight) && options.progressHeight > 0) {\n progressHeightPx = options.progressHeight;\n progressHeightStyle = `${progressHeightPx}px`;\n } else if (typeof options.progressHeight === \"string\" && options.progressHeight.trim()) {\n const trimmed = options.progressHeight.trim();\n const parsedFloat = Number.parseFloat(trimmed);\n if (Number.isFinite(parsedFloat) && parsedFloat > 0) {\n if (trimmed.endsWith(\"rem\") || trimmed.endsWith(\"em\")) {\n progressHeightPx = parsedFloat * 16;\n progressHeightStyle = trimmed;\n } else {\n progressHeightPx = parsedFloat;\n progressHeightStyle = /^\\d+(\\.\\d+)?$/.test(trimmed) ? `${parsedFloat}px` : trimmed;\n }\n }\n }\n\n const duration = Number(options.duration ?? 2500);\n const progressDuration = Math.max(0, duration + 5);\n\n const leftOffset = Math.min(borderRadiusNum, progressHeightPx * 2);\n const finalWidth = borderRadiusNum > 0\n ? `calc(100% - ${leftOffset * 2}px)`\n : \"100%\";\n\n const isReverse = options.progressDirection === \"reverse\" || options.progressDirection === \"increasing\" || options.progressDirection === \"ltr\";\n const isRtl = options.fontDirection === \"rtl\" || options.progressDirection === \"rtl\" || toast?.style?.direction === \"rtl\";\n\n progressBar._leftOffset = leftOffset;\n progressBar._finalWidth = finalWidth;\n progressBar._isReverse = isReverse;\n progressBar._isRtl = isRtl;\n\n const progressBg = options.progressBarColor || options.progressColor || \"currentColor\";\n\n if (!getConfig().disableInlineStyles) {\n Object.assign(progressBar.style, {\n position: \"absolute\",\n left: isRtl ? \"auto\" : `${leftOffset}px`,\n right: isRtl ? `${leftOffset}px` : \"auto\",\n height: progressHeightStyle,\n background: progressBg,\n width: isReverse ? \"0%\" : `${finalWidth}`,\n transition: `width ${progressDuration}ms linear`,\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\n borderRadius: `${progressHeightPx / 2}px`,\n opacity: \"0.8\",\n zIndex: \"2\",\n willChange: \"width\",\n });\n }\n\n toast.appendChild(progressBar);\n\n // 1. Indeterminate mode or loading state (duration: 0 or Infinity with showProgressBar)\n const isIndeterminate = options.progress === \"indeterminate\" ||\n (Boolean(options.showProgressBar) && (options.duration === 0 || options.duration === Infinity) && options.progress === undefined);\n\n progressBar._isIndeterminate = isIndeterminate;\n progressBar._isManualProgress = options.progress !== undefined && options.progress !== \"indeterminate\";\n\n if (isIndeterminate) {\n progressBar.classList.add(\"toast-progress-bar-indeterminate\");\n if (isRtl) {\n progressBar.classList.add(\"toast-progress-bar-indeterminate-rtl\");\n }\n if (!getConfig().disableInlineStyles) {\n ensureProgressIndeterminateStyles();\n const animName = isRtl ? \"toast-progress-indeterminate-rtl\" : \"toast-progress-indeterminate\";\n progressBar.style.animation = `${animName} 1.6s cubic-bezier(0.4, 0, 0.2, 1) infinite`;\n }\n progressBar.style.width = finalWidth;\n return;\n }\n\n // 2. Explicit manual percentage progress (determinate)\n if (options.progress !== undefined) {\n const pct = parseProgressValue(options.progress, toast, options);\n progressBar.style.width = `${pct}%`;\n progressBar.style.transition = \"width 200ms ease\";\n return;\n }\n\n if (options.duration === 0 || options.duration === Infinity) {\n progressBar.style.width = \"0%\";\n return;\n }\n\n if (shouldReduceMotion()) {\n progressBar.style.display = \"none\";\n } else if (typeof progressBar.animate === \"function\") {\n const keyframes = isReverse\n ? [{ width: \"0%\" }, { width: finalWidth }]\n : [{ width: finalWidth }, { width: \"0%\" }];\n toast._progressAnimation = progressBar.animate(\n keyframes,\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 requestAnimationFrame(() => {\n progressBar.style.width = isReverse ? finalWidth : \"0%\";\n });\n }\n}\n\nexport function runToastAnimation(toast) {\n if (!toast) return;\n if (toast._hasAnimated) return;\n\n if (shouldReduceMotion()) {\n toast._hasAnimated = true;\n toast.style.transition = \"none\";\n toast.style.opacity = \"1\";\n toast.style.transform = \"translateY(0)\";\n toast.classList.add(\"active\");\n return;\n }\n\n const trigger = () => {\n if (toast._hasAnimated) return;\n toast._hasAnimated = true;\n // Force browser layout/reflow so initial styles (opacity: 0, translateY) are committed to render tree\n try {\n void toast.offsetHeight;\n } catch {}\n\n requestAnimationFrame(() => {\n toast.style.opacity = \"1\";\n toast.style.transform = \"none\";\n toast.classList.add(\"active\");\n });\n };\n\n if (toast.isConnected) {\n trigger();\n } else {\n // If not yet connected to the DOM, defer to next frame when container.appendChild has occurred\n requestAnimationFrame(() => {\n if (toast.isConnected) {\n trigger();\n } else {\n requestAnimationFrame(() => {\n trigger();\n });\n }\n });\n }\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 startTime = 0;\n let isDragging = false;\n let isHorizontal = false;\n let touchId = null;\n\n let isWindowListening = false;\n\n const cleanupWindowListeners = () => {\n if (isWindowListening) {\n isWindowListening = false;\n window.removeEventListener(\"mousemove\", onPointerMove);\n window.removeEventListener(\"mouseup\", onPointerEnd);\n }\n };\n\n const onPointerDown = (e) => {\n if (!e) return;\n if (e.button !== undefined && e.button !== 0) return;\n const target = e.target;\n if (\n target &&\n typeof target.closest === \"function\" &&\n target.closest(\"button, a, input, textarea, select, label\")\n ) {\n return;\n }\n let ev = e;\n if (e.touches && e.touches.length > 0) {\n ev = e.touches[0];\n touchId = ev.identifier ?? null;\n } else {\n touchId = null;\n }\n startX = ev.clientX;\n startY = ev.clientY;\n currentX = startX;\n startTime = Date.now();\n isDragging = true;\n isHorizontal = false;\n toast._originalTransition = toast.style.transition || \"\";\n toast.style.transition = \"none\";\n toast.style.userSelect = \"none\";\n\n if (!isWindowListening && typeof window !== \"undefined\") {\n isWindowListening = true;\n window.addEventListener(\"mousemove\", onPointerMove, { passive: false });\n window.addEventListener(\"mouseup\", onPointerEnd, { passive: true });\n }\n };\n\n const onPointerMove = (e) => {\n if (!isDragging || !e) return;\n let ev = e;\n if (e.touches) {\n if (touchId !== null) {\n for (let i = 0; i < e.touches.length; i++) {\n if (e.touches[i].identifier === touchId) {\n ev = e.touches[i];\n break;\n }\n }\n } else if (e.touches.length > 0) {\n ev = e.touches[0];\n }\n }\n const x = ev.clientX;\n const y = ev.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 toast.style.userSelect = \"\";\n cleanupWindowListeners();\n return;\n }\n }\n\n if (isHorizontal) {\n currentX = x;\n const opacity = Math.max(0, 1 - Math.abs(dx) / 280);\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n toast.style.transform = `translateX(${dx}px)`;\n toast.style.opacity = String(opacity);\n }\n if (e.cancelable) e.preventDefault();\n }\n };\n\n const onPointerEnd = () => {\n cleanupWindowListeners();\n touchId = null;\n if (!isDragging || !isHorizontal) {\n isDragging = false;\n toast.style.userSelect = \"\";\n return;\n }\n isDragging = false;\n toast.style.userSelect = \"\";\n\n const dx = currentX - startX;\n const duration = Math.max(1, Date.now() - startTime);\n const velocity = duration > 0 ? Math.abs(dx) / duration : 0; // px/ms\n const isFlick = velocity >= 0.65 && Math.abs(dx) >= 50;\n const threshold = isFlick ? 50 : 75;\n\n if (Math.abs(dx) >= threshold) {\n const exitX = dx > 0 ? 320 : -320;\n const exitDuration = isFlick ? 120 : 180;\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n toast.style.transition = `transform ${exitDuration}ms ease-out, opacity ${exitDuration}ms ease-out`;\n toast.style.transform = `translateX(${exitX}px)`;\n toast.style.opacity = \"0\";\n }\n if (toast._swipeTimeout) clearTimeout(toast._swipeTimeout);\n toast._swipeTimeout = setTimeout(() => {\n toast._swipeTimeout = null;\n if (typeof onClose === \"function\") void onClose(toast);\n }, exitDuration);\n if (typeof toast._swipeTimeout?.unref === \"function\") {\n toast._swipeTimeout.unref();\n }\n } else {\n if (!getConfig().disableInlineStyles && !shouldReduceMotion()) {\n const snapEasing = \"cubic-bezier(0.34, 1.56, 0.64, 1)\";\n const snapDuration = 200;\n toast.style.transition = `transform ${snapDuration}ms ${snapEasing}, opacity 200ms ease`;\n toast.style.transform = \"translateX(0)\";\n toast.style.opacity = \"1\";\n\n if (toast._snapbackTimer) clearTimeout(toast._snapbackTimer);\n toast._snapbackTimer = setTimeout(() => {\n toast._snapbackTimer = null;\n toast.style.transform = \"none\";\n if (toast._originalTransition) {\n toast.style.transition = toast._originalTransition;\n }\n }, snapDuration);\n if (typeof toast._snapbackTimer?.unref === \"function\") {\n toast._snapbackTimer.unref();\n }\n }\n }\n };\n\n toast.addEventListener(\"touchstart\", onPointerDown, { passive: true });\n toast.addEventListener(\"touchmove\", onPointerMove, { passive: false });\n toast.addEventListener(\"touchend\", onPointerEnd, { passive: true });\n toast.addEventListener(\"touchcancel\", onPointerEnd, { passive: true });\n\n toast.addEventListener(\"mousedown\", onPointerDown, { passive: true });\n\n toast._cleanupSwipe = () => {\n if (toast._swipeTimeout) {\n clearTimeout(toast._swipeTimeout);\n toast._swipeTimeout = null;\n }\n if (toast._snapbackTimer) {\n clearTimeout(toast._snapbackTimer);\n toast._snapbackTimer = null;\n }\n cleanupWindowListeners();\n\n toast.removeEventListener(\"touchstart\", onPointerDown);\n toast.removeEventListener(\"touchmove\", onPointerMove);\n toast.removeEventListener(\"touchend\", onPointerEnd);\n toast.removeEventListener(\"touchcancel\", onPointerEnd);\n toast.removeEventListener(\"mousedown\", onPointerDown);\n };\n\n}\n\n/**\n * Constrains keyboard Tab focus inside an active interactive toast.\n * @param {HTMLElement} toast\n * @returns {(() => void) | null} Cleanup function\n */\nexport function attachFocusTrap(toast) {\n if (!toast || typeof toast.querySelectorAll !== \"function\") return null;\n\n const previouslyFocused =\n typeof document !== \"undefined\" && document.activeElement && document.activeElement !== document.body\n ? document.activeElement\n : null;\n\n const getFocusable = () =>\n Array.from(\n toast.querySelectorAll(\n 'button:not([disabled]), [href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), [tabindex]:not([tabindex=\"-1\"])'\n )\n ).filter((el) => {\n try {\n if (typeof el.offsetWidth === \"number\" && typeof el.offsetHeight === \"number\") {\n const style = typeof window !== \"undefined\" && window.getComputedStyle ? window.getComputedStyle(el) : null;\n if (style && (style.display === \"none\" || style.visibility === \"hidden\")) return false;\n const hasRealLayout = typeof document !== \"undefined\" && document.body && (document.body.offsetWidth > 0 || document.body.offsetHeight > 0);\n if (hasRealLayout && el.offsetWidth === 0 && el.offsetHeight === 0) {\n return el === document.activeElement;\n }\n }\n return true;\n } catch {\n return true;\n }\n });\n\n const onKeyDown = (e) => {\n if (e.key !== \"Tab\") return;\n if (!toast.isConnected) return;\n const focusable = getFocusable();\n if (focusable.length === 0) return;\n\n const first = focusable[0];\n const last = focusable[focusable.length - 1];\n\n if (e.shiftKey) {\n if (document.activeElement === first || !toast.contains(document.activeElement)) {\n last.focus();\n e.preventDefault();\n }\n } else {\n if (document.activeElement === last || !toast.contains(document.activeElement)) {\n first.focus();\n e.preventDefault();\n }\n }\n };\n\n toast.addEventListener(\"keydown\", onKeyDown);\n if (typeof document !== \"undefined\") {\n document.addEventListener(\"keydown\", onKeyDown);\n }\n\n const initialFocusTimer = setTimeout(() => {\n const focusable = getFocusable();\n if (focusable.length > 0 && typeof focusable[0].focus === \"function\") {\n focusable[0].focus();\n }\n }, 30);\n if (typeof initialFocusTimer?.unref === \"function\") initialFocusTimer.unref();\n\n const cleanup = () => {\n clearTimeout(initialFocusTimer);\n toast.removeEventListener(\"keydown\", onKeyDown);\n if (typeof document !== \"undefined\") {\n document.removeEventListener(\"keydown\", onKeyDown);\n }\n if (previouslyFocused && typeof previouslyFocused.focus === \"function\" && previouslyFocused.isConnected) {\n try {\n previouslyFocused.focus();\n } catch {}\n }\n };\n\n toast._cleanupFocusTrap = cleanup;\n return cleanup;\n}\n","// src/components/icons.js\nimport { getConfig } from \"../utils/config.js\";\n\nconst svgNS = \"http://www.w3.org/2000/svg\";\n\nconst ALLOWED_SVG_TAGS = new Set([\n \"svg\",\n \"g\",\n \"path\",\n \"circle\",\n \"rect\",\n \"line\",\n \"polyline\",\n \"polygon\",\n \"ellipse\",\n \"title\",\n \"desc\",\n \"defs\",\n \"clippath\",\n \"use\",\n]);\n\nconst ALLOWED_SVG_ATTRS = new Set([\n \"viewbox\",\n \"width\",\n \"height\",\n \"fill\",\n \"stroke\",\n \"stroke-width\",\n \"stroke-linecap\",\n \"stroke-linejoin\",\n \"stroke-miterlimit\",\n \"stroke-dasharray\",\n \"stroke-dashoffset\",\n \"opacity\",\n \"fill-opacity\",\n \"stroke-opacity\",\n \"d\",\n \"cx\",\n \"cy\",\n \"r\",\n \"x\",\n \"y\",\n \"x1\",\n \"y1\",\n \"x2\",\n \"y2\",\n \"points\",\n \"rx\",\n \"ry\",\n \"transform\",\n \"role\",\n \"aria-hidden\",\n \"focusable\",\n \"xmlns\",\n \"preserveaspectratio\",\n \"class\",\n \"id\",\n \"href\",\n \"xlink:href\",\n]);\n\nfunction isUnsafeUrl(value = \"\") {\n return /^\\s*javascript:/i.test(value);\n}\n\nfunction sanitizeInlineSvg(svgText) {\n const parserClass =\n typeof DOMParser !== \"undefined\"\n ? DOMParser\n : typeof window !== \"undefined\" && window.DOMParser\n ? window.DOMParser\n : null;\n\n if (!parserClass) return null;\n try {\n const parser = new parserClass();\n const parsed = parser.parseFromString(svgText, \"image/svg+xml\");\n if (parsed.querySelector(\"parsererror\")) return null;\n const sourceSvg = parsed.documentElement;\n if (!sourceSvg || sourceSvg.tagName.toLowerCase() !== \"svg\") return null;\n\n const copySafeNode = (node) => {\n if (node.nodeType === 3) {\n return document.createTextNode(node.textContent || \"\");\n }\n if (node.nodeType !== 1) return null;\n const tag = node.tagName.toLowerCase();\n if (!ALLOWED_SVG_TAGS.has(tag)) return null;\n\n const safeEl = document.createElementNS(svgNS, tag);\n if (node.attributes) {\n for (let i = 0; i < node.attributes.length; i++) {\n const attr = node.attributes[i];\n const name = attr.name;\n const lowerName = name.toLowerCase();\n const value = attr.value || \"\";\n\n if (lowerName.startsWith(\"on\")) continue;\n if (!ALLOWED_SVG_ATTRS.has(lowerName)) continue;\n if ((lowerName === \"href\" || lowerName === \"xlink:href\")) {\n if (isUnsafeUrl(value)) continue;\n if (tag === \"use\" && value && !value.startsWith(\"#\")) continue;\n }\n safeEl.setAttribute(name, value);\n }\n }\n\n if (node.childNodes) {\n for (let j = 0; j < node.childNodes.length; j++) {\n const safeChild = copySafeNode(node.childNodes[j]);\n if (safeChild) safeEl.appendChild(safeChild);\n }\n }\n return safeEl;\n };\n\n return copySafeNode(sourceSvg);\n } catch {\n return null;\n }\n}\n\n/**\n * Default SVG path data for built-in toast status icons.\n */\nconst ICON_SVGS = {\n success: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M20 6L9 17l-5-5\"/>\n </svg>\n `,\n error: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"15\" y1=\"9\" x2=\"9\" y2=\"15\"/>\n <line x1=\"9\" y1=\"9\" x2=\"15\" y2=\"15\"/>\n </svg>\n `,\n warning: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <path d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"/>\n <line x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"/>\n <line x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"/>\n </svg>\n `,\n info: `\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\" aria-hidden=\"true\" focusable=\"false\">\n <circle cx=\"12\" cy=\"12\" r=\"10\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"/>\n <line x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"/>\n </svg>\n `,\n};\n\n/**\n * Creates an icon element for the toast based on options.icon or options.type.\n * @param {object} options\n * @returns {HTMLElement | null}\n */\nexport function createToastIcon(options = {}) {\n const safeOptions = options && typeof options === \"object\" && !Array.isArray(options) ? options : {};\n let iconOpt = safeOptions.icon;\n if (iconOpt === undefined) {\n const globalIcon = getConfig().icon;\n if (globalIcon !== undefined) {\n iconOpt = globalIcon;\n }\n }\n if (typeof iconOpt === \"function\") {\n try {\n iconOpt = iconOpt(safeOptions);\n } catch (err) {\n console.warn(\"options.icon callback error:\", err);\n iconOpt = null;\n }\n }\n\n if (iconOpt === false || iconOpt === \"\" || iconOpt === null) return null;\n if (typeof document === \"undefined\") return null;\n\n const type = safeOptions.type;\n const config = getConfig();\n\n const iconTag = document.createElement(\"i\");\n iconTag.className = \"toast-icon\";\n iconTag.setAttribute(\"aria-hidden\", \"true\");\n\n const isRtl = safeOptions.fontDirection === \"rtl\";\n if (!config.disableInlineStyles) {\n Object.assign(iconTag.style, {\n display: \"inline-flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n flexShrink: \"0\",\n marginLeft: isRtl ? \"8px\" : \"0px\",\n marginRight: isRtl ? \"0px\" : \"8px\",\n lineHeight: \"1\",\n fontStyle: \"normal\",\n });\n }\n\n // 1. Custom DOM node provided (with cross-realm/iframe/fragment support)\n if (\n iconOpt &&\n typeof iconOpt === \"object\" &&\n (iconOpt.nodeType === 1 ||\n iconOpt.nodeType === 11 ||\n (typeof HTMLElement !== \"undefined\" && iconOpt instanceof HTMLElement))\n ) {\n if (typeof iconOpt.cloneNode === \"function\") {\n iconTag.appendChild(iconOpt.cloneNode(true));\n return iconTag;\n }\n }\n\n // 2. Custom string: emoji, raw SVG, text, or alias\n if (typeof iconOpt === \"string\" && iconOpt.trim()) {\n const trimmed = iconOpt.trim();\n const aliasMap = {\n check: ICON_SVGS.success,\n checkmark: ICON_SVGS.success,\n success: ICON_SVGS.success,\n cross: ICON_SVGS.error,\n error: ICON_SVGS.error,\n alert: ICON_SVGS.warning,\n warning: ICON_SVGS.warning,\n circle: ICON_SVGS.info,\n info: ICON_SVGS.info,\n };\n const matchedAlias = aliasMap[trimmed.toLowerCase()];\n if (matchedAlias) {\n const safeSvg = sanitizeInlineSvg(matchedAlias.trim());\n if (safeSvg) {\n iconTag.appendChild(safeSvg);\n }\n return iconTag;\n }\n if (trimmed.startsWith(\"<svg\") && trimmed.endsWith(\"</svg>\")) {\n const safeSvg = sanitizeInlineSvg(trimmed);\n if (safeSvg) {\n safeSvg.setAttribute(\"aria-hidden\", \"true\");\n safeSvg.setAttribute(\"focusable\", \"false\");\n if (!safeSvg.getAttribute(\"width\")) safeSvg.setAttribute(\"width\", \"18\");\n if (!safeSvg.getAttribute(\"height\")) safeSvg.setAttribute(\"height\", \"18\");\n iconTag.appendChild(safeSvg);\n } else {\n iconTag.textContent = trimmed;\n }\n } else {\n iconTag.textContent = trimmed;\n }\n return iconTag;\n }\n\n // 3. Built-in type icon (when icon is explicitly true, or type is specified and icon is not false)\n const normalizedType = typeof type === \"string\" ? type.toLowerCase().trim() : \"\";\n if ((iconOpt === true || iconOpt === undefined) && normalizedType && ICON_SVGS[normalizedType]) {\n const safeSvg = sanitizeInlineSvg(ICON_SVGS[normalizedType].trim());\n if (safeSvg) {\n iconTag.appendChild(safeSvg);\n }\n return iconTag;\n }\n\n return null;\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 createUndoAction,\n createCloseButton,\n createProgressBar,\n runToastAnimation,\n attachSwipeToDismiss,\n attachFocusTrap,\n} from \"./toast-utils-core.js\";\nimport { getConfig } from \"../utils/config.js\";\nimport { createToastIcon } from \"./icons.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 */\nfunction getInitialTransform(position, animationType, isSpring) {\n const pos = String(position || \"\").toLowerCase();\n const isTop = pos.includes(\"top\");\n const isLeft = pos.includes(\"left\");\n const isRight = pos.includes(\"right\");\n const anim = String(animationType || \"\").toLowerCase().trim();\n\n if (anim === \"fade\") return \"none\";\n if (anim === \"zoom\" || anim === \"scale\") return \"scale(0.75)\";\n if (anim === \"flip\") return \"perspective(600px) rotateX(45deg)\";\n if (anim === \"slide\") {\n if (isLeft) return \"translateX(-100%)\";\n if (isRight) return \"translateX(100%)\";\n return isTop ? \"translateY(-100%)\" : \"translateY(100%)\";\n }\n\n if (isSpring) {\n if (pos.includes(\"center\") && !isTop && !pos.includes(\"bottom\")) {\n if (isLeft) return \"translateX(-36px) scale(0.92)\";\n if (isRight) return \"translateX(36px) scale(0.92)\";\n return \"scale(0.85)\";\n }\n return isTop ? \"translateY(-36px) scale(0.92)\" : \"translateY(36px) scale(0.92)\";\n }\n\n if (anim === \"bounce\") {\n return isTop ? \"translateY(-36px) scale(0.9)\" : \"translateY(36px) scale(0.9)\";\n }\n\n return isTop ? \"translateY(-20px)\" : \"translateY(20px)\";\n}\n\nexport async function applyRichStyling(toast, options, onClose) {\n const config = getConfig();\n const animType = String(options?.animationType || \"\").toLowerCase().trim();\n const isSpring = Boolean(options?.spring) || animType === \"spring\";\n const durationMs = isSpring\n ? 400\n : await parseAnimationDuration(options?.animationDuration);\n const validAnimationDuration = `${durationMs}ms`;\n const easing = isSpring\n ? \"cubic-bezier(0.34, 1.56, 0.64, 1)\"\n : typeof options?.animationEasing === \"string\" && options.animationEasing.trim()\n ? options.animationEasing.trim()\n : \"ease\";\n\n toast._animationType = options?.animationType;\n\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 const opacityDuration = isSpring ? `${Math.min(300, durationMs)}ms` : validAnimationDuration;\n const opacityEasing = isSpring ? \"ease\" : easing;\n\n if (!config.disableInlineStyles) {\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 ${opacityDuration} ${opacityEasing}, transform ${validAnimationDuration} ${easing}`,\n transform: getInitialTransform(options?.position, options?.animationType, isSpring),\n zIndex: String(config.zIndex),\n direction:\n options?.fontDirection && options.fontDirection !== \"auto\"\n ? options.fontDirection\n : undefined,\n });\n }\n\n const isError = options?.type === \"error\";\n const role = options?.role || \"alert\";\n const ariaLive = options?.ariaLive || (isError ? \"assertive\" : \"polite\");\n toast.setAttribute(\"role\", role);\n toast.setAttribute(\"aria-live\", ariaLive);\n toast.tabIndex = 0;\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 messageSpan.classList.add(\"is-truncated\");\n if (!config.disableInlineStyles) {\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 } else if (!config.disableInlineStyles) {\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 if (!config.disableInlineStyles) {\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\n const allowHtml = !!options.allowHtml;\n const rawMessage = options.message ?? \"\";\n\n // Render icon if provided or enabled for type\n const iconEl = createToastIcon(options);\n if (iconEl) {\n toast.appendChild(iconEl);\n }\n\n if (options.loader || options.showLoader) {\n const loaderEl = createLoader(options.loader || {});\n messageSpan.appendChild(loaderEl);\n const spacer = document.createElement(\"span\");\n spacer.className = \"toast-message-spacer\";\n if (!config.disableInlineStyles) {\n spacer.style.display = \"inline-block\";\n spacer.style.width = \"8px\";\n }\n messageSpan.appendChild(spacer);\n }\n\n if (\n allowHtml &&\n typeof rawMessage === \"string\" &&\n rawMessage.trim().length > 0\n ) {\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 (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 messageSpan.appendChild(document.createTextNode(String(rawMessage)));\n }\n\n messageSpan.setAttribute(\"title\", messageSpan.textContent || \"\");\n toast.appendChild(messageSpan);\n\n if (options?.cta && typeof options.cta === \"object\") {\n createCTA(toast, options, onClose);\n }\n\n if (options?.undo) {\n createUndoAction(toast, options, onClose);\n }\n\n if (options?.showCloseButton) {\n createCloseButton(toast, options, onClose);\n }\n\n if (options?.showProgressBar !== false && (options?.showProgressBar || options?.progress !== undefined)) {\n createProgressBar(toast, options);\n }\n\n const shouldSwipe =\n options?.swipeToDismiss !== undefined ? options.swipeToDismiss : config.swipeToDismiss;\n if (shouldSwipe !== false) {\n attachSwipeToDismiss(toast, onClose);\n }\n\n // Play audio chime/sound if enabled (URL string or custom callback)\n const shouldPlaySound = options?.sound !== undefined ? options.sound : config.sound;\n if (shouldPlaySound) {\n if (typeof options?.sound === \"string\" && typeof window !== \"undefined\" && typeof window.Audio === \"function\") {\n try {\n new window.Audio(options.sound).play().catch(() => {});\n } catch {}\n } else if (typeof options?.onSound === \"function\") {\n try {\n options.onSound(options);\n } catch {}\n }\n }\n\n if (options?.trapFocus ?? config.trapFocus) {\n attachFocusTrap(toast);\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 config = getConfig();\n const emergency = document.createElement(\"div\");\n const position = options?.position || config.defaultPosition;\n const posFlags = String(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 emergency.className = \"toast-emergency\";\n emergency.tabIndex = 0;\n emergency.setAttribute(\"role\", \"alert\");\n emergency.setAttribute(\"aria-live\", \"assertive\");\n if (!config.disableInlineStyles) {\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: String(config.zIndex + 100),\n borderRadius: \"3px\",\n maxWidth: \"250px\",\n wordWrap: \"break-word\",\n boxShadow: \"0 2px 10px rgba(0,0,0,0.3)\",\n });\n }\n\n const innerWrapper = document.createElement(\"div\");\n const msgEl = document.createElement(\"span\");\n msgEl.className = \"toast-emergency-message\";\n if (!config.disableInlineStyles) msgEl.style.display = \"inline-block\";\n if (options.allowHtml) {\n try {\n const sanitized = sanitizeHtml(\n String(options.message || \"Emergency Toast Showing!\")\n );\n const tmp = document.createElement(\"div\");\n tmp.innerHTML = sanitized;\n while (tmp.firstChild) {\n msgEl.appendChild(tmp.firstChild);\n }\n } catch {\n msgEl.appendChild(\n document.createTextNode(\n String(options.message || \"Emergency Toast Showing!\")\n )\n );\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(\"button\");\n closeSpan.type = \"button\";\n closeSpan.className = \"toast-emergency-close\";\n closeSpan.setAttribute(\"aria-label\", \"Close emergency notification\");\n if (!config.disableInlineStyles) {\n Object.assign(closeSpan.style, {\n float: \"right\",\n marginLeft: \"10px\",\n fontWeight: \"bold\",\n cursor: \"pointer\",\n background: \"transparent\",\n border: \"none\",\n color: \"inherit\",\n padding: \"0\",\n font: \"inherit\",\n });\n }\n closeSpan.textContent = \"×\";\n innerWrapper.appendChild(closeSpan);\n\n while (emergency.firstChild) emergency.removeChild(emergency.firstChild);\n emergency.appendChild(innerWrapper);\n\n let timer = null;\n const onClick = () => {\n if (timer) clearTimeout(timer);\n closeSpan.removeEventListener(\"click\", onClick);\n emergency.remove();\n if (typeof onClose === \"function\") void onClose(emergency);\n };\n closeSpan.addEventListener(\"click\", onClick);\n\n const duration = Number(options?.duration) || 2500;\n timer = setTimeout(() => {\n closeSpan.removeEventListener(\"click\", onClick);\n emergency.remove();\n if (typeof onClose === \"function\") void 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\") void onClose(null);\n return null;\n }\n}\n","// src/components/Toast.js\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 emergency fallbacks\n * @param {Object} options - Toast configuration options\n * @param {Function} onClose - Callback when toast closes\n * @returns {Promise<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/containerRegistry.js\n\"use strict\";\n\nimport { getConfig, getToastRoot } from \"./config.js\";\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 * @param {unknown} position\n * @returns {string}\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 const normalized = aliased\n .replace(/\\s+/g, \"-\")\n .replace(/[^a-z0-9-]/g, \"-\")\n .replace(/-{2,}/g, \"-\");\n\n const canonicalAliases = {\n \"center-top\": \"top-center\",\n \"center-bottom\": \"bottom-center\",\n \"center-left\": \"left-center\",\n \"center-right\": \"right-center\",\n \"top\": \"top-center\",\n \"bottom\": \"bottom-center\",\n };\n\n return canonicalAliases[normalized] || normalized;\n}\n\n/**\n * Canonical container id.\n * @param {unknown} position\n * @returns {string}\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 if (typeof document !== \"undefined\") {\n const host = document.querySelector(\"#toast-shadow-host\");\n if (host) {\n try {\n host.remove();\n } catch {}\n }\n }\n}\n\n/**\n * Remove a container from the registry when pruned from the DOM\n * @param {string} id\n * @returns {void}\n */\nexport function unregisterContainer(idOrPosition) {\n if (!idOrPosition) return;\n const id = typeof idOrPosition === \"string\" && idOrPosition.startsWith(\"toast-container-\")\n ? idOrPosition\n : getContainerId(idOrPosition);\n containerRegistry.delete(id);\n containerLocks.delete(id);\n}\n\nfunction getContainerRoot() {\n return getToastRoot();\n}\n\nfunction findContainerById(root, id) {\n if (!root) return null;\n if (typeof root.getElementById === \"function\") return root.getElementById(id);\n if (typeof root.querySelector === \"function\") return root.querySelector(`#${id}`);\n return null;\n}\n\nfunction isConnectedToRoot(el, root) {\n if (!el || !root) return false;\n if (root === document.body) return el.isConnected && el.ownerDocument === document;\n if (typeof root.contains === \"function\") return root.contains(el);\n return el.isConnected && el.ownerDocument === document;\n}\n\nfunction applyContainerBaseStyles(el) {\n const config = getConfig();\n el.className = \"toast-container-base\";\n if (config.disableInlineStyles) return;\n\n el.style.position = \"fixed\";\n el.style.zIndex = String(config.zIndex);\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}\n\n/**\n * Atomically get or create a single container per canonical id.\n * @param {object} options\n * @param {(container: HTMLElement, options: object) => Promise<void>} setPosition\n * @returns {Promise<HTMLElement>}\n */\nexport async function getOrCreateToastContainer(options = {}, setPosition) {\n const config = getConfig();\n const id = getContainerId(options?.position || config.defaultPosition);\n let root = getContainerRoot();\n if (!root) throw new Error(\"Toast container root is unavailable\");\n\n const useShadow = Boolean(options?.shadowDom ?? config.shadowDom);\n if (useShadow && typeof document !== \"undefined\" && typeof document.createElement === \"function\") {\n let host = null;\n try {\n host = root.querySelector ? root.querySelector(\"#toast-shadow-host\") : null;\n } catch {}\n if (!host) {\n host = document.createElement(\"div\");\n host.id = \"toast-shadow-host\";\n host.style.position = \"fixed\";\n host.style.zIndex = String(config.zIndex || 9999);\n host.style.pointerEvents = \"none\";\n host.style.inset = \"0\";\n host.style.overflow = \"visible\";\n root.appendChild(host);\n }\n if (!host.shadowRoot && typeof host.attachShadow === \"function\") {\n try {\n host.attachShadow({ mode: \"open\" });\n } catch {}\n }\n if (host.shadowRoot) {\n root = host.shadowRoot;\n if (!root.querySelector(\"style[data-toast-shadow-style]\")) {\n const shadowStyle = document.createElement(\"style\");\n shadowStyle.setAttribute(\"data-toast-shadow-style\", \"true\");\n shadowStyle.textContent = `\n :host { position: fixed; inset: 0; pointer-events: none; z-index: ${config.zIndex || 9999}; }\n * { box-sizing: border-box; }\n .toast-container-base {\n position: fixed;\n z-index: ${config.zIndex || 9999};\n pointer-events: none;\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-direction: column;\n overflow: hidden;\n inset: auto 10px 10px auto;\n contain: layout style;\n }\n [data-stacked=\"true\"] .toast-outer-wrapper {\n transition: 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 [data-stacked=\"true\"] .toast-outer-wrapper[data-stacked-depth=\"expanded\"] {\n transform: none;\n margin-top: 0px;\n margin-bottom: 10px;\n opacity: 1;\n pointer-events: auto;\n }\n [data-stacked=\"true\"] .toast-outer-wrapper[data-stacked-depth=\"0\"] {\n transform: scale(1);\n margin-top: 0px;\n margin-bottom: 0px;\n opacity: 1;\n z-index: 30;\n pointer-events: auto;\n }\n [data-stacked=\"true\"] .toast-outer-wrapper[data-stacked-depth=\"1\"] {\n transform: scale(0.95) translateY(-10px);\n margin-top: -55px;\n margin-bottom: 0px;\n opacity: 0.9;\n z-index: 20;\n pointer-events: auto;\n }\n [data-stacked=\"true\"][id*=\"top\"] .toast-outer-wrapper[data-stacked-depth=\"1\"] {\n transform: scale(0.95) translateY(10px);\n }\n [data-stacked=\"true\"] .toast-outer-wrapper[data-stacked-depth=\"2\"] {\n transform: scale(0.90) translateY(-20px);\n margin-top: -55px;\n margin-bottom: 0px;\n opacity: 0.75;\n z-index: 10;\n pointer-events: auto;\n }\n [data-stacked=\"true\"][id*=\"top\"] .toast-outer-wrapper[data-stacked-depth=\"2\"] {\n transform: scale(0.90) translateY(20px);\n }\n [data-stacked=\"true\"] .toast-outer-wrapper[data-stacked-depth=\"overflow\"] {\n transform: scale(0.85) translateY(-30px);\n margin-top: -55px;\n margin-bottom: 0px;\n opacity: 0;\n z-index: 1;\n pointer-events: none;\n }\n `;\n root.appendChild(shadowStyle);\n }\n }\n }\n\n if (containerLocks.has(id)) {\n return containerLocks.get(id);\n }\n\n const p = (async () => {\n const cached = containerRegistry.get(id);\n if (isConnectedToRoot(cached, root)) return cached;\n if (cached) containerRegistry.delete(id);\n\n let el = findContainerById(root, id);\n if (!el) {\n const doc = root?.ownerDocument || (typeof document !== \"undefined\" ? document : null);\n if (!doc) throw new Error(\"Document is unavailable\");\n el = doc.createElement(\"div\");\n el.id = id;\n el.setAttribute(\"role\", \"status\");\n el.setAttribute(\"aria-atomic\", \"true\");\n applyContainerBaseStyles(el);\n if (typeof setPosition === \"function\") await setPosition(el, options);\n root.appendChild(el);\n } else {\n applyContainerBaseStyles(el);\n if (typeof setPosition === \"function\") await setPosition(el, options);\n }\n\n if (typeof root.querySelectorAll === \"function\") {\n const all = root.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\n containerRegistry.set(id, el);\n return el;\n })();\n\n containerLocks.set(id, p);\n try {\n return await p;\n } finally {\n containerLocks.delete(id);\n }\n}\n","\"use strict\";\n\nimport { getConfig } from \"./config.js\";\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 \"center-top\",\n \"center-bottom\",\n \"left-center\",\n \"right-center\",\n \"center-left\",\n \"center-right\",\n \"top-full-width\",\n \"bottom-full-width\",\n \"center\",\n]);\n\nconst LEGACY_POSITIONS = new Set([\"top\", \"bottom\"]);\nconst ALL_POSITIONS = [...DOCUMENTED_POSITIONS, ...LEGACY_POSITIONS];\n\nfunction isDocumentedPosition(pos) {\n return DOCUMENTED_POSITIONS.has(pos);\n}\n\nfunction resetPositionClasses(container) {\n if (!container?.classList) return;\n for (let i = 0; i < ALL_POSITIONS.length; i++) {\n container.classList.remove(\"toast-position-\" + ALL_POSITIONS[i]);\n }\n}\n\nexport async function setPosition(container, options = {}) {\n if (!container || !options || typeof options !== \"object\") {\n throw new Error(\"Invalid container or position!\");\n }\n\n const config = getConfig();\n const rawPos = String(options?.position || config.defaultPosition || \"bottom-right\")\n .toLowerCase()\n .trim()\n .replace(/\\s+/g, \"-\");\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 resetPositionClasses(container);\n container.classList?.add(\"toast-position-\" + effectivePos);\n\n if (getConfig().disableInlineStyles) {\n return;\n }\n\n resetContainerStyles(container);\n const positionFlags = parsePosition(effectivePos);\n\n if (handleFullWidthPositions(container, 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 container.style.maxWidth = \"none\";\n}\n\nfunction parsePosition(position) {\n const pos = position.toLowerCase().trim();\n\n const isFullWidth = pos === \"top-full-width\" || pos === \"bottom-full-width\";\n const hasTop = pos.startsWith(\"top\") || pos.endsWith(\"top\");\n const hasBottom = pos.startsWith(\"bottom\") || pos.endsWith(\"bottom\") || pos.includes(\"below\");\n const hasLeft = pos.startsWith(\"left\") || pos.endsWith(\"left\");\n const hasRight = pos.startsWith(\"right\") || pos.endsWith(\"right\");\n const hasCenter = pos.includes(\"center\");\n\n return {\n hasTop,\n hasBottom,\n hasLeft,\n hasRight,\n hasCenter,\n hasFullWidth: isFullWidth,\n };\n}\n\nfunction handleFullWidthPositions(container, flags) {\n if (!flags.hasFullWidth) return false;\n\n container.style.maxWidth = \"100vw\";\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}\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 isInfinite = delay === Infinity;\n const safeDelay = Number.isFinite(delay) && delay >= 0 ? delay : (isInfinite ? Infinity : 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 this.isInfinite = isInfinite;\n }\n\n start() {\n if (this.isCompleted || this.timeoutId || this.isInfinite) return this;\n this.isPaused = false;\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 const elapsed = Math.max(0, Date.now() - this.startTime);\n this.remaining = Math.min(this.delay, Math.max(0, this.remaining - elapsed));\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, unregisterContainer } from \"../utils/containerRegistry.js\";\nimport { setPosition } from \"../utils/position.js\";\nimport { PausableTimer } from \"../utils/PausableTimer.js\";\nimport { sanitizeHtml } from \"../utils/html-sanitizer.js\";\nimport { createProgressBar, createCTA, createUndoAction, createCloseButton, runToastAnimation, parseProgressValue, ensureProgressIndeterminateStyles, attachSwipeToDismiss } from \"./toast-utils-core.js\";\nimport { createLoader } from \"./loader.js\";\nimport { createToastIcon } from \"./icons.js\";\nimport { getConfig, shouldReduceMotion } from \"../utils/config.js\";\n\n\nconst active = new Map();\nconst pending = new Map();\nconst queue = [];\nlet visibleCount = 0;\nlet droppedCount = 0;\n\n/**\n * Returns a real-time snapshot of toast manager telemetry metrics.\n * @returns {import('../utils/config.js').ToastMetrics}\n */\nexport function getToastMetrics() {\n return {\n activeCount: active.size,\n queueDepth: queue.length,\n visibleCount,\n droppedCount,\n timestamp: Date.now(),\n };\n}\n\n/**\n * Emits current toast metrics to global onMetrics callback if configured.\n */\nfunction emitMetrics() {\n const config = getConfig();\n if (typeof config.onMetrics === \"function\") {\n try {\n config.onMetrics(getToastMetrics());\n } catch (err) {\n console.error(\"onMetrics callback error:\", err);\n }\n }\n}\n\n\n// Priority Queue Manager - Standard numeric priority scoring\n\n/**\n * Numeric priority score for a queued toast item (higher = shown sooner).\n * Normalizes to a plain number for queue sorting and priority comparison.\n * @param {{options?: Object, priority?: {score?: number}}} item\n * @returns {number}\n */\nfunction getItemPriority(item) {\n if (typeof item?.options?.priority === \"number\" && Number.isFinite(item.options.priority)) {\n return item.options.priority;\n }\n const cached = item?.priority?.score;\n if (typeof cached === \"number\" && Number.isFinite(cached)) return cached;\n\n const config = getConfig();\n if (typeof config.priorityScorer === \"function\") {\n try {\n const res = config.priorityScorer({\n type: item?.options?.type || \"info\",\n message: item?.options?.message || \"\",\n duration: item?.options?.duration,\n options: item?.options,\n });\n if (typeof res === \"number\" && Number.isFinite(res)) return res;\n if (res && typeof res.score === \"number\" && Number.isFinite(res.score)) return res.score;\n } catch (err) {\n console.warn(\"[Toast] Custom priorityScorer error, falling back to built-in:\", err);\n }\n }\n\n const TYPE_PRIORITIES = { error: 80, warning: 60, info: 40, success: 20 };\n return TYPE_PRIORITIES[item?.options?.type] || 0;\n}\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 const onMouseEnter = () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n };\n const onMouseLeave = () => {\n container._isExpanded = false;\n updateStackedLayout(container);\n };\n const onFocusIn = () => {\n container._isExpanded = true;\n updateStackedLayout(container);\n };\n const onFocusOut = (e) => {\n if (!container.contains(e.relatedTarget)) {\n container._isExpanded = false;\n updateStackedLayout(container);\n }\n };\n\n container.addEventListener(\"mouseenter\", onMouseEnter);\n container.addEventListener(\"mouseleave\", onMouseLeave);\n container.addEventListener(\"focusin\", onFocusIn);\n container.addEventListener(\"focusout\", onFocusOut);\n\n container._stackedCleanup = () => {\n container.removeEventListener(\"mouseenter\", onMouseEnter);\n container.removeEventListener(\"mouseleave\", onMouseLeave);\n container.removeEventListener(\"focusin\", onFocusIn);\n container.removeEventListener(\"focusout\", onFocusOut);\n container._stackedInitialized = false;\n };\n }\n\n if (!container.children || container.children.length === 0) return;\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 const depthKey = isExpanded ? \"expanded\" : (depthFromTop >= 3 ? \"overflow\" : String(depthFromTop));\n if (typeof item.setAttribute === \"function\") {\n item.setAttribute(\"data-stacked-depth\", depthKey);\n }\n\n if (!getConfig().disableInlineStyles) {\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}\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 if (safe.id !== undefined && safe.id !== null && safe.id !== \"\") return String(safe.id);\n if (safe.tag !== undefined && safe.tag !== null && safe.tag !== \"\") {\n const position = normalizePositionKey(safe.position || \"bottom-right\");\n return `tag:${String(safe.tag).trim()}:${position}`;\n }\n if (safe.groupId !== undefined && safe.groupId !== null && safe.groupId !== \"\") {\n const position = normalizePositionKey(safe.position || \"bottom-right\");\n return `group:${String(safe.groupId).trim()}:${position}`;\n }\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 // If tagged or grouped thread, update message text in-place to latest update\n if ((options.tag || options.groupId) && options.message && data.toast?._messageSpan) {\n data.toast._messageSpan.textContent = String(options.message);\n data.toast._messageSpan.title = String(options.message);\n }\n\n data.timer?.clear();\n data.timer = createDismissTimer(data.toast, options);\n await setupPauseOnHover(data);\n await updateBadge(data);\n emitMetrics();\n\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 if ((options.tag || options.groupId) && options.message) {\n current.options = { ...current.options, ...options };\n }\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 >= getConfig().maxVisible) {\n const item = { options: current.options, key, count: current.count };\n const maxQ = getConfig().maxQueueSize ?? 100;\n if (maxQ <= 0) {\n droppedCount++;\n emitMetrics();\n return;\n }\n\n const existingQueued = queue.find((queuedItem) => queuedItem.key === key);\n if (existingQueued) {\n existingQueued.count += current.count;\n if (typeof current.options?.priority === \"number\") {\n existingQueued.options = { ...existingQueued.options, ...current.options };\n existingQueued.priority = { score: getItemPriority(existingQueued) };\n }\n emitMetrics();\n return;\n }\n const usesPriority =\n typeof current.options?.priority === \"number\" ||\n typeof getConfig().priorityScorer === \"function\" ||\n queue.some((queuedItem) => typeof queuedItem?.options?.priority === \"number\");\n\n if (usesPriority) {\n item.priority = { score: getItemPriority(item) };\n }\n\n if (queue.length >= maxQ) {\n if (usesPriority) {\n const incomingPriority = getItemPriority(item);\n let lowestIndex = 0;\n let lowestPriority = getItemPriority(queue[0]);\n\n for (let index = 1; index < queue.length; index++) {\n const candidatePriority = getItemPriority(queue[index]);\n if (candidatePriority < lowestPriority) {\n lowestIndex = index;\n lowestPriority = candidatePriority;\n }\n }\n\n if (incomingPriority <= lowestPriority) {\n droppedCount++;\n emitMetrics();\n return;\n }\n\n queue.splice(lowestIndex, 1);\n } else {\n queue.shift();\n }\n droppedCount++;\n }\n\n queue.push(item);\n if (usesPriority) {\n queue.sort((a, b) => getItemPriority(b) - getItemPriority(a));\n }\n emitMetrics();\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 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 outer.className = \"toast-outer-wrapper\";\n if (!getConfig().disableInlineStyles) {\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\n const inner = document.createElement(\"div\");\n inner.className = \"toast-inner-wrapper\";\n if (!getConfig().disableInlineStyles) {\n Object.assign(inner.style, {\n position: \"relative\",\n overflow: \"hidden\",\n zIndex: \"1\",\n }); \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 runToastAnimation(toast);\n\n const shouldPauseOnHover =\n options.pauseOnHover !== false &&\n (options.pauseOnHover === true || !!options.cta || Boolean(getConfig().pauseOnHover));\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 emitMetrics();\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 emitMetrics();\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 emitMetrics();\n return;\n }\n\n if (queue.length > 0) {\n queue.pop();\n emitMetrics();\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 emitMetrics();\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?._cleanupUndo?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanupFocusTrap?.();\n data.toast?._cleanup?.();\n if (data.toast?._progressAnimation) {\n try {\n data.toast._progressAnimation.cancel();\n } catch {}\n data.toast._progressAnimation = null;\n }\n const badge = data.outer?.querySelector(\".toast-count-badge\");\n if (badge?._scaleTimer) {\n clearTimeout(badge._scaleTimer);\n badge._scaleTimer = null;\n }\n }\n if (typeof document !== \"undefined\") {\n const containers = document.querySelectorAll('[id^=\"toast-container-\"]');\n containers.forEach((c) => {\n try {\n c._stackedCleanup?.();\n } catch {}\n });\n }\n active.clear();\n visibleCount = 0;\n droppedCount = 0;\n isDraining = false;\n emitMetrics();\n}\n\nexport const dismiss = dismissMostRecent;\nexport const noop = closeAllToasts;\n\nfunction createDismissTimer(toast, options) {\n const raw = Number(options?.duration);\n if (options?.duration === Infinity || (typeof options?.duration === \"number\" && options?.duration <= 0)) {\n return null;\n }\n const duration = Number.isFinite(raw) && raw > 0 ? raw : 2500;\n const delay = duration + 5;\n const timer = new PausableTimer(() => {\n void closeToast(toast).catch(console.error);\n }, delay);\n timer.start();\n return timer;\n}\n\nasync function setupPauseOnHover(data) {\n if (!data.pauseOnHover || !data.outer || !data.timer) return;\n\n data.outer._pauseCleanup?.();\n\n const { outer, timer, toast } = data;\n\n const pauseProgressBar = () => {\n if (toast?._progressAnimation) {\n try {\n toast._progressAnimation.pause();\n } catch {}\n } else if (toast?._progressBar) {\n try {\n if (toast._progressBar._isIndeterminate) {\n toast._progressBar.style.animationPlayState = \"paused\";\n } else if (toast._progressBar._isManualProgress) {\n // Manual determinate progress: do NOT pause or overwrite manual width\n } else {\n const computedWidth = window.getComputedStyle(toast._progressBar).width;\n toast._progressBar._pausedWidth = computedWidth;\n toast._progressBar.style.transition = \"none\";\n toast._progressBar.style.width = computedWidth;\n }\n } catch {}\n }\n };\n\n const resumeProgressBar = () => {\n if (toast?._progressAnimation) {\n try {\n toast._progressAnimation.play();\n } catch {}\n } else if (toast?._progressBar) {\n try {\n if (toast._progressBar._isIndeterminate) {\n toast._progressBar.style.animationPlayState = \"running\";\n } else if (toast._progressBar._isManualProgress) {\n // Manual determinate progress: preserve current manual width\n } else if (toast._progressBar._pausedWidth) {\n const remainingMs = timer.getRemainingTime?.() ?? 1000;\n const isReverse = toast._progressBar._isReverse;\n const finalWidth = toast._progressBar._finalWidth || \"100%\";\n toast._progressBar.style.transition = `width ${Math.max(0, remainingMs)}ms linear`;\n toast._progressBar.style.width = isReverse ? finalWidth : \"0%\";\n toast._progressBar._pausedWidth = null;\n }\n } catch {}\n }\n };\n\n const onMouseEnter = () => {\n timer.pause();\n pauseProgressBar();\n toast?._pauseUndo?.();\n toast?.classList.add(\"toast-paused\");\n };\n const onMouseLeave = () => {\n timer.resume();\n resumeProgressBar();\n toast?._resumeUndo?.();\n toast?.classList.remove(\"toast-paused\");\n };\n\n const onFocusIn = (e) => {\n if (e?.target && typeof e.target.matches === \"function\" && e.target.matches(\"[tabindex], div, span, button, a\")) {\n timer.pause();\n pauseProgressBar();\n toast?._pauseUndo?.();\n toast?.classList.add(\"toast-paused\");\n }\n };\n\n const onFocusOut = (e) => {\n if (!outer.contains(e.relatedTarget)) {\n timer.resume();\n resumeProgressBar();\n toast?._resumeUndo?.();\n toast?.classList.remove(\"toast-paused\");\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 const data = active.get(key);\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 emitMetrics();\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 emitMetrics();\n return;\n }\n\n if (!data) return;\n\n data.timer?.clear();\n data.outer?._pauseCleanup?.();\n data.toast?._cleanupCloseButton?.();\n data.toast?._cleanupCTA?.();\n data.toast?._cleanupUndo?.();\n data.toast?._cleanupSwipe?.();\n data.toast?._cleanupFocusTrap?.();\n data.toast?._cleanup?.();\n if (data.toast?._progressAnimation) {\n try {\n data.toast._progressAnimation.cancel();\n } catch {}\n data.toast._progressAnimation = null;\n }\n const badge = data.outer?.querySelector(\".toast-count-badge\");\n if (badge?._scaleTimer) {\n clearTimeout(badge._scaleTimer);\n badge._scaleTimer = null;\n }\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 emitMetrics();\n\n if (badge) badge.remove();\n\n const animDuration = data.toast?._animationDuration ?? 400;\n const exitDuration = Math.min(animDuration, 300);\n\n if (data.toast) {\n if (!getConfig().disableInlineStyles) {\n const pos = String(data.options?.position || data.outer?.parentElement?.id || \"\").toLowerCase();\n const isTop = pos.includes(\"top\");\n const isLeft = pos.includes(\"left\");\n const isRight = pos.includes(\"right\");\n const anim = String(data.options?.animationType || \"\").toLowerCase().trim();\n\n let exitTransform = \"translateY(20px)\";\n\n if (shouldReduceMotion()) {\n data.toast.style.transition = \"none\";\n data.toast.style.opacity = \"0\";\n } else {\n if (anim === \"fade\") {\n exitTransform = \"none\";\n } else if (anim === \"zoom\" || anim === \"scale\") {\n exitTransform = \"scale(0.75)\";\n } else if (anim === \"flip\") {\n exitTransform = \"perspective(600px) rotateX(-45deg)\";\n } else if (anim === \"slide\") {\n exitTransform = isLeft ? \"translateX(-100%)\" : isRight ? \"translateX(100%)\" : isTop ? \"translateY(-100%)\" : \"translateY(100%)\";\n } else if (anim === \"bounce\") {\n exitTransform = isTop ? \"translateY(-36px) scale(0.9)\" : \"translateY(36px) scale(0.9)\";\n } else if (data.options?.spring || anim === \"spring\") {\n exitTransform = isTop ? \"translateY(-28px) scale(0.94)\" : \"translateY(28px) scale(0.94)\";\n }\n\n data.toast.style.transition = `opacity ${exitDuration}ms ease-in, transform ${exitDuration}ms ease-in`;\n data.toast.style.opacity = \"0\";\n data.toast.style.transform = exitTransform;\n }\n }\n data.toast.classList.remove(\"active\");\n }\n\n const parentContainer = data.outer?.parentElement;\n await removeWithTransition(data.outer, data.toast, exitDuration);\n\n if (\n parentContainer &&\n parentContainer.children.length === 0 &&\n parentContainer.id?.startsWith(\"toast-container-\")\n ) {\n try {\n parentContainer._stackedCleanup?.();\n unregisterContainer(parentContainer.id);\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\nlet isDraining = false;\n\nasync function drainQueue() {\n if (isDraining) return;\n isDraining = true;\n try {\n const config = getConfig();\n\n // Apply priority sorting if enabled globally or on queued items\n if ((config.priorityQueue || typeof config.priorityScorer === \"function\" || queue.some(i => i.options?.priorityQueue || typeof i.options?.priority === \"number\")) && queue.length > 1) {\n queue.sort((a, b) => getItemPriority(b) - getItemPriority(a)); // Higher priority first\n }\n\n while (visibleCount < config.maxVisible && 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 if ((item.options.tag || item.options.groupId) && item.options.message && data.toast?._messageSpan) {\n data.toast._messageSpan.textContent = String(item.options.message);\n data.toast._messageSpan.title = String(item.options.message);\n data.timer?.clear();\n data.timer = createDismissTimer(data.toast, item.options);\n }\n await updateBadge(data);\n emitMetrics();\n continue;\n }\n await createOne(item.options, item.key, item.count);\n }\n emitMetrics();\n } finally {\n isDraining = false;\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 let fallbackTimer = null;\n const animEl = targetEl || el.firstElementChild || el;\n\n const finish = () => {\n if (done) return;\n done = true;\n if (fallbackTimer) {\n clearTimeout(fallbackTimer);\n fallbackTimer = null;\n }\n try {\n animEl?.removeEventListener?.(\"transitionend\", onEnd, true);\n } catch {}\n void removeElement(el).catch(console.error);\n resolve();\n };\n\n if (shouldReduceMotion() || animationDurationMs <= 0) {\n finish();\n return;\n }\n\n const onEnd = (e) => {\n try {\n if (e.target !== animEl) return;\n if (\n e.propertyName === \"transform\" ||\n ((!animEl.style.transform || animEl.style.transform === \"none\" || animEl.style.transform === \"initial\") &&\n e.propertyName === \"opacity\")\n ) {\n finish();\n }\n } catch (error) {\n console.error(\"removeWithTransition error:\", error);\n }\n };\n\n if (!animEl) return finish();\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 fallbackTimer = setTimeout(finish, fallbackTimeout);\n if (typeof fallbackTimer?.unref === \"function\") {\n fallbackTimer.unref();\n }\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 if (!getConfig().disableInlineStyles) {\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\n outer.appendChild(badge);\n }\n\n badge.textContent = count > 99 ? \"99+\" : String(count);\n\n try {\n if (!shouldReduceMotion()) {\n if (badge._scaleTimer) clearTimeout(badge._scaleTimer);\n badge.style.transform = \"scale(1.2)\";\n badge._scaleTimer = setTimeout(() => {\n badge.style.transform = \"scale(1)\";\n badge._scaleTimer = null;\n }, 150);\n if (typeof badge._scaleTimer?.unref === \"function\") {\n badge._scaleTimer.unref();\n }\n }\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 const prevOptions = { ...data.options };\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 const isFinishingLoading =\n (newOptions.type === \"success\" ||\n newOptions.type === \"error\" ||\n newOptions.type === \"warning\" ||\n newOptions.type === \"info\") &&\n newOptions.showLoader !== true;\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 !isFinishingLoading\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(\"title\", messageSpan.textContent || \"\");\n }\n }\n\n // 2. Handle Loader\n const isFinishingLoading =\n (newOptions.type === \"success\" ||\n newOptions.type === \"error\" ||\n newOptions.type === \"warning\" ||\n newOptions.type === \"info\") &&\n newOptions.showLoader !== true;\n\n if (\n newOptions.showLoader === false ||\n newOptions.loader === null ||\n isFinishingLoading\n ) {\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 const isErr = newType === \"error\";\n if (newOptions.role) {\n toast.setAttribute(\"role\", newOptions.role);\n } else {\n toast.setAttribute(\"role\", \"alert\");\n }\n toast.setAttribute(\"aria-live\", newOptions.ariaLive || (isErr ? \"assertive\" : \"polite\"));\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 // 3.1 Update icon\n if (newOptions.icon !== undefined || newOptions.type !== undefined) {\n const existingIcon = toast?.querySelector(\".toast-icon\");\n if (existingIcon) existingIcon.remove();\n const mergedForIcon = { ...data.options, ...newOptions };\n const newIconEl = createToastIcon(mergedForIcon);\n if (newIconEl) {\n if (messageSpan) {\n toast.insertBefore(newIconEl, messageSpan);\n } else {\n toast.appendChild(newIconEl);\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 if (newOptions.borderRadius !== undefined) {\n const br = typeof newOptions.borderRadius === \"number\" ? `${newOptions.borderRadius}px` : newOptions.borderRadius;\n toast.style.borderRadius = br;\n }\n\n if (newOptions.maxWidth !== undefined) {\n const mw = typeof newOptions.maxWidth === \"number\" ? `${newOptions.maxWidth}px` : newOptions.maxWidth;\n toast.style.maxWidth = mw;\n }\n\n if (newOptions.fontDirection !== undefined) {\n const dir = newOptions.fontDirection !== \"auto\" ? newOptions.fontDirection : \"\";\n toast.style.direction = dir;\n if (messageSpan) messageSpan.style.direction = dir;\n const isRtl = dir === \"rtl\";\n toast.querySelectorAll(\".toast-cta, .toast-undo-btn, .toast-close-btn\").forEach((btn) => {\n btn.style.marginLeft = isRtl ? \"0px\" : \"10px\";\n btn.style.marginRight = isRtl ? \"10px\" : \"0px\";\n });\n }\n\n if (newOptions.fontSize !== undefined) {\n const fs = typeof newOptions.fontSize === \"number\" ? `${newOptions.fontSize}px` : newOptions.fontSize;\n toast.style.fontSize = fs;\n if (messageSpan) messageSpan.style.fontSize = fs;\n }\n\n if (newOptions.fontFamily !== undefined) {\n toast.style.fontFamily = newOptions.fontFamily;\n if (messageSpan) messageSpan.style.fontFamily = newOptions.fontFamily;\n }\n\n if (newOptions.fontWeight !== undefined) {\n const fw = typeof newOptions.fontWeight === \"number\" ? String(newOptions.fontWeight) : newOptions.fontWeight;\n toast.style.fontWeight = fw;\n if (messageSpan) messageSpan.style.fontWeight = fw;\n }\n\n if (newOptions.fontLineHeight !== undefined) {\n toast.style.lineHeight = newOptions.fontLineHeight;\n if (messageSpan) messageSpan.style.lineHeight = newOptions.fontLineHeight;\n }\n\n if (newOptions.fontPadding !== undefined && messageSpan) {\n messageSpan.style.padding = newOptions.fontPadding;\n }\n\n if (newOptions.wrapText !== undefined && messageSpan) {\n const isTruncate =\n newOptions.wrapText === \"truncate\" ||\n newOptions.wrapText === \"ellipsis\" ||\n newOptions.wrapText === false;\n if (isTruncate || !newOptions.wrapText) {\n messageSpan.classList.add(\"is-truncated\");\n if (!getConfig().disableInlineStyles) {\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 } else {\n messageSpan.classList.remove(\"is-truncated\");\n if (!getConfig().disableInlineStyles) {\n Object.assign(messageSpan.style, {\n display: \"block\",\n WebkitBoxOrient: \"\",\n WebkitLineClamp: \"\",\n whiteSpace: \"normal\",\n overflow: \"visible\",\n textOverflow: \"clip\",\n });\n }\n }\n }\n\n if (newOptions.role !== undefined) {\n toast.setAttribute(\"role\", newOptions.role);\n }\n if (newOptions.ariaLive !== undefined) {\n toast.setAttribute(\"aria-live\", newOptions.ariaLive);\n }\n\n if (newOptions.className !== undefined) {\n const prevClass = prevOptions.className;\n if (prevClass && typeof prevClass === \"string\") {\n toast.classList.remove(...prevClass.trim().split(/\\s+/));\n }\n if (newOptions.className && typeof newOptions.className === \"string\") {\n toast.classList.add(...newOptions.className.trim().split(/\\s+/));\n }\n }\n // 4. Progress bar updates\n let progressBar = toast.querySelector(\".toast-progress-bar\");\n\n if (newOptions.showProgressBar === false) {\n if (toast._progressAnimation) {\n try {\n toast._progressAnimation.cancel();\n } catch {}\n toast._progressAnimation = null;\n }\n if (progressBar) {\n progressBar.remove();\n }\n toast._progressBar = null;\n progressBar = null;\n } else if (\n !progressBar &&\n newOptions.showProgressBar !== false &&\n (newOptions.progress !== undefined || newOptions.showProgressBar === true)\n ) {\n createProgressBar(toast, {\n ...data.options,\n ...newOptions,\n showProgressBar: true,\n });\n progressBar = toast.querySelector(\".toast-progress-bar\");\n }\n\n if (progressBar) {\n if (newOptions.progress !== undefined) {\n if (newOptions.progress === \"indeterminate\") {\n progressBar._isIndeterminate = true;\n progressBar._isManualProgress = false;\n if (toast._progressAnimation) {\n try {\n toast._progressAnimation.cancel();\n } catch {}\n toast._progressAnimation = null;\n }\n progressBar.classList.add(\"toast-progress-bar-indeterminate\");\n const isRtl = progressBar._isRtl || newOptions.fontDirection === \"rtl\" || newOptions.progressDirection === \"rtl\";\n if (isRtl) {\n progressBar.classList.add(\"toast-progress-bar-indeterminate-rtl\");\n }\n if (!getConfig().disableInlineStyles) {\n ensureProgressIndeterminateStyles();\n const animName = isRtl ? \"toast-progress-indeterminate-rtl\" : \"toast-progress-indeterminate\";\n progressBar.style.animation = `${animName} 1.6s cubic-bezier(0.4, 0, 0.2, 1) infinite`;\n }\n progressBar.style.width = progressBar._finalWidth || \"100%\";\n } else {\n const pct = parseProgressValue(newOptions.progress, toast, { ...data.options, ...newOptions });\n progressBar._isIndeterminate = false;\n progressBar._isManualProgress = true;\n progressBar.classList.remove(\"toast-progress-bar-indeterminate\");\n progressBar.classList.remove(\"toast-progress-bar-indeterminate-rtl\");\n progressBar.style.animation = \"none\";\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 }\n\n if (newOptions.progressBarColor || newOptions.progressColor) {\n progressBar.style.background = newOptions.progressBarColor || newOptions.progressColor;\n }\n\n if (newOptions.progressPosition) {\n progressBar.style.top = newOptions.progressPosition === \"top\" ? \"0\" : \"auto\";\n progressBar.style.bottom = newOptions.progressPosition === \"bottom\" ? \"0\" : \"auto\";\n }\n\n if (newOptions.progressHeight !== undefined) {\n const ph = typeof newOptions.progressHeight === \"number\" ? `${newOptions.progressHeight}px` : newOptions.progressHeight;\n progressBar.style.height = ph;\n }\n }\n\n if (newOptions.animationType !== undefined) {\n data.options.animationType = newOptions.animationType;\n toast._animationType = newOptions.animationType;\n }\n\n if (newOptions.spring !== undefined) {\n data.options.spring = newOptions.spring;\n }\n\n if (newOptions.swipeToDismiss !== undefined) {\n data.options.swipeToDismiss = newOptions.swipeToDismiss;\n if (newOptions.swipeToDismiss === false) {\n toast._cleanupSwipe?.();\n toast._cleanupSwipe = null;\n } else if (newOptions.swipeToDismiss === true && !toast._cleanupSwipe) {\n attachSwipeToDismiss(toast, closeToast);\n }\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 await setupPauseOnHover(data);\n if (progressBar && !progressBar._isManualProgress && !progressBar._isIndeterminate) {\n const newDuration = raw + 5;\n if (toast._progressAnimation) {\n try {\n toast._progressAnimation.cancel();\n } catch {}\n const isReverse = progressBar._isReverse;\n const finalWidth = progressBar._finalWidth || \"100%\";\n const keyframes = isReverse\n ? [{ width: \"0%\" }, { width: finalWidth }]\n : [{ width: finalWidth }, { width: \"0%\" }];\n toast._progressAnimation = progressBar.animate(keyframes, {\n duration: newDuration,\n easing: \"linear\",\n fill: \"forwards\",\n delay: 0,\n });\n } else {\n progressBar.style.transition = `width ${newDuration}ms linear`;\n const isReverse = progressBar._isReverse;\n const finalWidth = progressBar._finalWidth || \"100%\";\n progressBar.style.width = isReverse ? finalWidth : \"0%\";\n }\n }\n } else {\n data.timer = null;\n if (progressBar && !progressBar._isManualProgress && !progressBar._isIndeterminate) {\n if (toast._progressAnimation) {\n try { toast._progressAnimation.cancel(); } catch {}\n toast._progressAnimation = null;\n }\n progressBar.style.width = \"0%\";\n }\n }\n } else if (\n (data.options.duration === 0 || !data.timer) &&\n (newOptions.type === \"success\" ||\n newOptions.type === \"error\" ||\n newOptions.type === \"warning\" ||\n newOptions.showLoader === false)\n ) {\n // If it was a persistent loading toast (duration: 0) and transitioned to a resolved state\n // without an explicit duration, start a standard auto-dismiss timer so it doesn't stay permanently stuck on screen.\n data.options.duration = 2500;\n data.timer?.clear();\n data.timer = createDismissTimer(toast, { duration: 2500 });\n await setupPauseOnHover(data);\n }\n\n // 5.1 Update CTA\n if (newOptions.cta !== undefined) {\n if (toast._cleanupCTA) {\n toast._cleanupCTA();\n toast._cleanupCTA = null;\n }\n toast.querySelectorAll(\".toast-cta\").forEach((el) => el.remove());\n\n if (newOptions.cta && typeof newOptions.cta === \"object\") {\n const mergedOpts = { ...data.options, ...newOptions };\n createCTA(toast, mergedOpts, closeToast);\n }\n }\n\n // 5.2 Update Undo Action\n if (newOptions.undo !== undefined) {\n if (toast._cleanupUndo) {\n toast._cleanupUndo();\n toast._cleanupUndo = null;\n }\n toast.querySelectorAll(\".toast-undo-btn\").forEach((el) => el.remove());\n\n if (newOptions.undo) {\n const mergedOpts = { ...data.options, ...newOptions };\n createUndoAction(toast, mergedOpts, closeToast);\n }\n }\n\n // 5.3 Update Close Button\n if (newOptions.showCloseButton !== undefined) {\n const existingCloseBtn = toast.querySelector(\".toast-close-btn\");\n if (newOptions.showCloseButton === false) {\n if (toast._cleanupCloseButton) {\n toast._cleanupCloseButton();\n toast._cleanupCloseButton = null;\n }\n if (existingCloseBtn) existingCloseBtn.remove();\n } else if (newOptions.showCloseButton === true && !existingCloseBtn) {\n const mergedOpts = { ...data.options, ...newOptions };\n createCloseButton(toast, mergedOpts, closeToast);\n }\n }\n\n // 6. Audio / Sound\n const shouldPlayAudio =\n newOptions.sound !== undefined\n ? Boolean(newOptions.sound)\n : Boolean(newOptions.type && (data.options.sound || getConfig().sound));\n\n if (shouldPlayAudio) {\n if (typeof newOptions.sound === \"string\" && typeof window !== \"undefined\" && typeof window.Audio === \"function\") {\n try {\n new window.Audio(newOptions.sound).play().catch(() => {});\n } catch {}\n } else if (typeof newOptions.onSound === \"function\") {\n try {\n newOptions.onSound(newOptions);\n } catch {}\n }\n }\n\n // 7. Stacked update\n const container = toast.closest('[id^=\"toast-container-\"]');\n if (container) {\n if (newOptions.stacked === true) {\n container.setAttribute(\"data-stacked\", \"true\");\n updateStackedLayout(container);\n } else if (newOptions.stacked === false) {\n container.removeAttribute(\"data-stacked\");\n container._stackedCleanup?.();\n Array.from(container.children).forEach((child) => {\n child.removeAttribute(\"data-stacked-depth\");\n child.style.transform = \"\";\n child.style.marginTop = \"\";\n child.style.marginBottom = \"10px\";\n child.style.opacity = \"\";\n child.style.zIndex = \"\";\n child.style.pointerEvents = \"auto\";\n });\n } else if (container.getAttribute(\"data-stacked\") === \"true\") {\n updateStackedLayout(container);\n }\n }\n}\n\n","\"use strict\";\n\nimport { setConfig, getConfig, resetConfig, shouldReduceMotion } from \"./utils/config.js\";\n\nimport {\n showToast,\n closeToastByKey,\n updateToastByKey,\n resetToastManager,\n dismiss,\n noop as managerNoop,\n getToastMetrics,\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 { generateToastId, resetToastIdCounter } from \"./utils/id.js\";\n\n/**\n * @typedef {'modern' | 'retro' | 'futuristic' | 'subtle' | 'bell' | string} SoundPreset\n */\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 {string} [color]\n * @property {string} [textColor]\n * @property {string} [background]\n * @property {string} [backgroundColor]\n * @property {(e: MouseEvent) => void | Promise<void>} [onClick]\n */\n\n/**\n * @typedef {Object} UndoOptions\n * @property {string} [label] - Button text label (default: 'Undo')\n * @property {boolean} [showCountdown] - Whether to display decaying seconds counter (default: true)\n * @property {(e: MouseEvent, toast: HTMLElement) => void | Promise<void>} [onUndo] - Callback fired when clicked\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} [id] - Optional custom unique identifier for the toast notification\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 {'default' | 'fade' | 'slide' | 'zoom' | 'bounce' | 'flip' | 'spring' | string} [animationType]\n * @property {string} [progressColor]\n * @property {string} [progressBarColor]\n * @property {string} [progressHeight]\n * @property {'top' | 'bottom'} [progressPosition]\n * @property {'decreasing' | 'increasing' | 'ltr' | 'rtl' | 'reverse' | string} [progressDirection]\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 | CTAOptions[]} [cta]\n * @property {((e: MouseEvent, toast: HTMLElement) => void | Promise<void>) | UndoOptions} [undo]\n * @property {boolean} [spring]\n * @property {boolean} [stacked]\n * @property {boolean | string} [sound]\n * @property {((options: ToastOptions) => void)} [onSound] - Sound playback handler callback\n * @property {boolean | string | HTMLElement | ((options: ToastOptions) => boolean | string | HTMLElement | null | undefined)} [icon]\n * @property {boolean} [swipeToDismiss]\n * @property {number | string | 'indeterminate'} [progress]\n * @property {boolean} [progressNormalized]\n * @property {boolean} [priorityQueue] - Whether to sort toasts by priority\n * @property {number} [priority] - Numeric priority score (higher = shown sooner)\n * @property {string} [tag] - Optional thread/tag identifier for replacement/updating\n * @property {string} [groupId] - Optional group identifier for grouping related toasts\n * @property {boolean} [trapFocus] - Whether to trap keyboard Tab focus within the toast\n * @property {boolean} [shadowDom] - Whether to isolate the container in an attached Shadow DOM root\n * @property {'alert' | 'status' | string} [role] - ARIA role attribute (default: 'alert')\n * @property {'polite' | 'assertive' | 'off'} [ariaLive] - ARIA live region politeness\n */\n\n\n/**\n * @typedef {'auto' | 'always' | 'never'} ReducedMotionMode\n */\n\n/**\n * @typedef {'light' | 'dark' | 'high-contrast' | 'compact' | 'spacious' | 'glass'} ToastTheme\n */\n\n/**\n * @typedef {Element | DocumentFragment | ShadowRoot} ToastMountTarget\n */\n\n/**\n * @typedef {Object} ToastMetrics\n * @property {number} activeCount - Currently rendered active toasts\n * @property {number} queueDepth - Number of queued toasts waiting to be displayed\n * @property {number} visibleCount - Count of currently visible toasts\n * @property {number} droppedCount - Number of toasts dropped due to queue overflow\n * @property {number} timestamp - Epoch timestamp (ms) when metrics were recorded\n */\n\n/**\n * @typedef {Object} ToastGlobalConfig\n * @property {number} [maxVisible]\n * @property {number} [maxQueueSize]\n * @property {number} [zIndex]\n * @property {ToastMountTarget | null} [targetNode]\n * @property {boolean} [disableInlineStyles]\n * @property {ReducedMotionMode} [reducedMotion]\n * @property {ToastPosition | string} [defaultPosition]\n * @property {ToastTheme} [theme]\n * @property {boolean} [stacked]\n * @property {boolean} [swipeToDismiss]\n * @property {boolean} [sound]\n * @property {boolean} [icon]\n * @property {boolean} [pauseOnHover]\n * @property {boolean} [priorityQueue]\n * @property {boolean} [shadowDom]\n * @property {boolean} [trapFocus]\n * @property {boolean} [debug]\n * @property {((context: { type: string, message: string, duration?: number, options?: Record<string, unknown> }) => number | { score: number }) | null} [priorityScorer]\n * @property {((metrics: ToastMetrics) => void) | null} [onMetrics]\n */\n\n/**\n * @typedef {Object} ToastHandle\n * @property {string} [id] - The unique identifier/key of the toast notification.\n * @property {() => Promise<void>} dismiss\n * @property {(newOptions: Partial<ToastOptions>) => Promise<void>} update\n */\n\n/**\n * @typedef {Object} ToastPromiseMessages\n * @property {string | Partial<ToastOptions>} [loading]\n * @property {string | Partial<ToastOptions> | ((result: unknown) => string | Partial<ToastOptions>)} [success]\n * @property {string | Partial<ToastOptions> | ((error: unknown) => string | Partial<ToastOptions>)} [error]\n */\n\nlet defaultColors = {\n success: \"#28a745\",\n error: \"#dc3545\",\n warning: \"#ffc107\",\n info: \"#17a2b8\",\n};\n\nconst DEFAULT_TYPE_MESSAGES = {\n success: \"Operation completed successfully!\",\n error: \"Something went wrong!\",\n warning: \"Warning message!\",\n info: \"Information message!\",\n loading: \"Loading, please wait...\",\n};\n\nlet customDefaultMessages = {};\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 getConfig().targetNode || document.body;\n }\n}\n\nfunction normalizeToastOptions(messageOrOptions, maybeOptions) {\n const extra =\n typeof maybeOptions === \"object\" && maybeOptions !== null && !Array.isArray(maybeOptions)\n ? maybeOptions\n : {};\n\n if (\n typeof messageOrOptions === \"string\" ||\n typeof messageOrOptions === \"number\" ||\n typeof messageOrOptions === \"boolean\" ||\n typeof messageOrOptions === \"bigint\"\n ) {\n return {\n ...extra,\n message: String(messageOrOptions),\n };\n }\n\n if (messageOrOptions instanceof Error) {\n return {\n ...extra,\n message: messageOrOptions.message || String(messageOrOptions),\n };\n }\n\n if (typeof messageOrOptions === \"object\" && messageOrOptions !== null && !Array.isArray(messageOrOptions)) {\n return {\n ...extra,\n ...messageOrOptions,\n };\n }\n\n return { ...extra };\n}\n\nasync function sanitizeToastOptions(rawOptions) {\n const options = normalizeToastOptions(rawOptions);\n const config = getConfig();\n const contPosition = String(options?.position ?? config.defaultPosition).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: config.defaultPosition,\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 progressBarColor: undefined,\n progressHeight: \"4px\",\n progressPosition: \"bottom\",\n progressDirection: \"decreasing\",\n animationType: \"default\",\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 ...options,\n };\n\n final.message = options?.message ?? final.message;\n\n try {\n if (!final.backgroundColor) {\n const prefersDark =\n typeof window !== \"undefined\" &&\n typeof window.matchMedia === \"function\" &&\n window.matchMedia(\"(prefers-color-scheme: dark)\")?.matches;\n final.backgroundColor =\n defaultColors?.[final.type] ?? (prefersDark ? \"#f5f5f5\" : \"#111111\");\n }\n } catch (error) {\n console.warn(\"Background color resolution failed:\", error);\n if (!final.backgroundColor) {\n final.backgroundColor = \"#111111\";\n }\n }\n\n try {\n final.message =\n final.message ||\n customDefaultMessages[final.type] ||\n DEFAULT_TYPE_MESSAGES[final.type] ||\n \"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 const rawProgressColor = options?.progressBarColor || options?.progressColor;\n if (rawProgressColor) {\n final.progressColor = rawProgressColor;\n final.progressBarColor = rawProgressColor;\n } else if (!final.progressColor && final.backgroundColor) {\n final.progressColor =\n final.textColor ||\n getDynamicAccessibleTextColorHex(final.backgroundColor);\n final.progressBarColor = final.progressColor;\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 customDefaultMessages = { ...customDefaultMessages, ...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 * Supports string shorthand: `createToast(\"Message\")` or full options `createToast({ message: \"...\" })`.\n * Also provides ergonomic shorthand methods: `createToast.success(...)`, `createToast.error(...)`, etc.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [maybeOptions]\n * @returns {Promise<ToastHandle>}\n */\nasync function createToastWithPriority(messageOrOptions = {}, maybeOptions) {\n const normalized = normalizeToastOptions(messageOrOptions, maybeOptions);\n const key = await runWithClosePriority(() => originalCreateToast(normalized));\n return {\n id: key,\n dismiss: () => (key ? closeToastByKey(key) : Promise.resolve()),\n update: (newOptions) =>\n key ? updateToastByKey(key, newOptions) : Promise.resolve(),\n };\n}\n\n/**\n * Displays a success toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.success = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"success\" });\n};\n\n/**\n * Displays an error toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.error = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"error\" });\n};\n\n/**\n * Displays a warning toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.warning = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"warning\" });\n};\n\n/**\n * Displays an informational toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.info = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({ ...normalized, type: \"info\" });\n};\n\n/**\n * Displays a persistent loading toast with an animated spinner.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.loading = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({\n type: \"info\",\n showLoader: true,\n duration: 0,\n showProgressBar: false,\n pauseOnHover: false,\n ...normalized,\n });\n};\n\n/**\n * Displays a custom styled HTML toast notification.\n * @param {string | ToastOptions} [messageOrOptions]\n * @param {Partial<ToastOptions>} [options]\n * @returns {Promise<ToastHandle>}\n */\ncreateToastWithPriority.custom = (messageOrOptions, options) => {\n const normalized = normalizeToastOptions(messageOrOptions, options);\n return createToastWithPriority({\n allowHtml: true,\n ...normalized,\n });\n};\n\nconst success = createToastWithPriority.success;\nconst error = createToastWithPriority.error;\nconst warning = createToastWithPriority.warning;\nconst info = createToastWithPriority.info;\nconst loading = createToastWithPriority.loading;\nconst custom = createToastWithPriority.custom;\n\nexport {\n createToastWithPriority as createToast,\n success,\n error,\n warning,\n info,\n loading,\n custom,\n};\n\nexport { setDefaultColors, setDefaultMessages };\n\n/**\n * Dismisses a toast by its key/id, handle, element, or dismisses the most recent toast if target is omitted.\n * @param {string | ToastHandle | HTMLElement | Promise<ToastHandle>} [target]\n * @returns {Promise<void>}\n */\nconst dismissToast = async (target) => {\n let resolvedTarget = target;\n if (target && typeof target.then === \"function\") {\n try {\n resolvedTarget = await target;\n } catch {\n return;\n }\n }\n\n closeInProgress = true;\n closePromise = (async () => {\n try {\n if (typeof resolvedTarget === \"string\" && resolvedTarget.length > 0) {\n await closeToastByKey(resolvedTarget);\n } else if (resolvedTarget && typeof resolvedTarget === \"object\") {\n if (typeof resolvedTarget.dismiss === \"function\") {\n await resolvedTarget.dismiss();\n } else if (resolvedTarget._key && typeof resolvedTarget._key === \"string\") {\n await closeToastByKey(resolvedTarget._key);\n } else if (resolvedTarget.id && typeof resolvedTarget.id === \"string\") {\n await closeToastByKey(resolvedTarget.id);\n } else {\n await dismiss();\n }\n } else {\n await dismiss();\n }\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};\nconst clear = noopAll;\nconst dismissAll = noopAll;\nexport { dismissToast as dismiss, noopAll as noop, dismissAll, clear };\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\n const loadingInput = safeMessages.loading ?? \"Loading...\";\n const loadingOptions =\n typeof loadingInput === \"object\" && loadingInput !== null && !Array.isArray(loadingInput)\n ? {\n ...safeOptions,\n type: \"info\",\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n showLoader: safeOptions.showLoader ?? true,\n ...loadingInput,\n }\n : {\n ...safeOptions,\n type: \"info\",\n message: String(loadingInput),\n duration: TOAST_PROMISE_LOADING_DURATION_MS,\n showProgressBar: false,\n pauseOnHover: false,\n showLoader: safeOptions.showLoader ?? true,\n };\n\n const loadingHandle = await createToastWithPriority(loadingOptions);\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\n if (loadingHandle && typeof loadingHandle.dismiss === \"function\") {\n try {\n await loadingHandle.dismiss();\n } catch {\n // Loading toast may already be dismissed\n }\n }\n\n const successResult =\n typeof safeMessages.success === \"function\"\n ? safeMessages.success(result)\n : (safeMessages.success ?? \"Done!\");\n\n const successOptions =\n typeof successResult === \"object\" && successResult !== null && !Array.isArray(successResult)\n ? { ...baseOptions, type: \"success\", ...successResult }\n : { ...baseOptions, type: \"success\", message: String(successResult) };\n\n await createToastWithPriority(successOptions);\n\n return result;\n } catch (err) {\n if (loadingHandle && typeof loadingHandle.dismiss === \"function\") {\n try {\n await loadingHandle.dismiss();\n } catch {\n // Loading toast may already be dismissed\n }\n }\n\n const errorResult =\n typeof safeMessages.error === \"function\"\n ? safeMessages.error(err)\n : (safeMessages.error ?? \"Something went wrong.\");\n\n const errorOptions =\n typeof errorResult === \"object\" && errorResult !== null && !Array.isArray(errorResult)\n ? { ...baseOptions, type: \"error\", ...errorResult }\n : { ...baseOptions, type: \"error\", message: String(errorResult) };\n\n await createToastWithPriority(errorOptions);\n\n throw err;\n }\n}\n\ncreateToastWithPriority.promise = toastPromise;\ncreateToastWithPriority.dismiss = dismissToast;\ncreateToastWithPriority.dismissAll = noopAll;\ncreateToastWithPriority.clear = noopAll;\n\n/** @type {string} */\nconst version = typeof __VERSION__ !== \"undefined\" ? __VERSION__ : \"4.0.0\";\n\nexport {\n version,\n toastPromise,\n setConfig,\n getConfig,\n resetConfig,\n shouldReduceMotion,\n resetToastManager,\n resetContainerRegistry,\n updateToastByKey,\n generateToastId,\n resetToastIdCounter,\n getToastMetrics,\n};\n\n/**\n * Attach global keyboard event listeners (Escape to dismiss, F6/Alt+T for landmark navigation)\n * @param {Window} [win]\n * @returns {void}\n */\nexport function initKeyboardShortcuts(win = typeof window !== \"undefined\" ? window : null) {\n if (!win || !win.document || win.__customizableToastEscapeAttached) return;\n win.__customizableToastEscapeAttached = true;\n const onKeyDown = (e) => {\n if (e.key === \"Escape\" || e.key === \"Esc\") {\n void (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 } else if (e.key === \"F6\" || ((e.altKey || e.metaKey) && (e.key === \"t\" || e.key === \"T\"))) {\n // Accessible landmark navigation: focus the most recent active toast\n const root = (getConfig().targetNode && typeof getConfig().targetNode.querySelectorAll === \"function\") ? getConfig().targetNode : win.document;\n const activeToasts = root.querySelectorAll('[id^=\"toast-container-\"] [id^=\"toast-\"]');\n if (activeToasts.length > 0) {\n const targetToast = activeToasts[activeToasts.length - 1];\n // Try focusing the interactive CTA, undo, or close button inside the toast first\n const interactive = targetToast.querySelector(\"button, a, [tabindex='0']\");\n if (interactive && typeof interactive.focus === \"function\") {\n interactive.focus();\n } else if (typeof targetToast.focus === \"function\") {\n targetToast.focus();\n }\n }\n }\n };\n win.addEventListener(\"keydown\", onKeyDown, { passive: true });\n}\n\nif (typeof window !== \"undefined\" && typeof document !== \"undefined\") {\n initKeyboardShortcuts(window);\n}\n\ntry {\n if (typeof window !== \"undefined\") {\n window.customizableToast = {\n setConfig,\n getConfig,\n resetConfig,\n shouldReduceMotion,\n version,\n createToast: createToastWithPriority,\n success,\n error,\n warning,\n info,\n loading,\n custom,\n setDefaultColors,\n setDefaultMessages,\n noop: noopAll,\n dismiss: dismissToast,\n dismissAll: noopAll,\n clear: noopAll,\n toastPromise,\n promise: toastPromise,\n updateToastByKey,\n generateToastId,\n resetToastIdCounter,\n getToastMetrics,\n initKeyboardShortcuts,\n };\n }\n} catch (error) {\n console.error(\"Global assignment failed:\", error);\n}\n\nexport default createToastWithPriority;\n","import {\n createToast,\n toastPromise,\n dismiss,\n dismissAll,\n clear,\n setConfig,\n getConfig,\n resetConfig,\n} from \"../index.js\";\n\n/**\n * Angular-compatible Toast Service.\n * Can be injected in Angular components or instantiated directly.\n */\nexport class ToastService {\n success(message, options) {\n return createToast.success(message, options);\n }\n\n error(message, options) {\n return createToast.error(message, options);\n }\n\n warning(message, options) {\n return createToast.warning(message, options);\n }\n\n info(message, options) {\n return createToast.info(message, options);\n }\n\n loading(message, options) {\n return createToast.loading(message, options);\n }\n\n custom(message, options) {\n return createToast.custom(message, options);\n }\n\n show(options) {\n return createToast(options);\n }\n\n promise(promiseOrFn, messages, options) {\n return toastPromise(promiseOrFn, messages, options);\n }\n\n dismiss(target) {\n return dismiss(target);\n }\n\n dismissAll() {\n return dismissAll();\n }\n\n clear() {\n return clear();\n }\n\n setConfig(options) {\n return setConfig(options);\n }\n\n getConfig() {\n return getConfig();\n }\n\n resetConfig() {\n return resetConfig();\n }\n}\n\n// Angular Ivy dependency injection token compatibility metadata\nToastService.ɵfac = function ToastService_Factory(t) {\n return new (t || ToastService)();\n};\nToastService.ɵprov = {\n token: ToastService,\n providedIn: \"root\",\n factory: ToastService.ɵfac,\n};\n\nlet cachedInstance = null;\n\n/**\n * Returns a singleton instance of ToastService.\n * @returns {ToastService}\n */\nexport function injectToast() {\n if (!cachedInstance) {\n cachedInstance = new ToastService();\n }\n return cachedInstance;\n}\n\nexport const toast = injectToast();\n\nexport {\n createToast,\n toastPromise,\n dismiss,\n dismissAll,\n clear,\n setConfig,\n getConfig,\n resetConfig,\n};\n"],"names":["value","options","maxVisible","maxQueueSize","zIndex","targetNode","disableInlineStyles","reducedMotion","defaultPosition","theme","stacked","swipeToDismiss","sound","icon","pauseOnHover","priorityQueue","shadowDom","trapFocus","priorityScorer","onMetrics","debug","q","z","r","p","t","customCrypto","arr","highRes","prefix","cleanPrefix","safePrefix","timestamp","countPart","tagName","el","duration","trimmed","parsed","maxSize","key","firstKey","name","g","b","lum","c","v","L","contrastBlack","contrastWhite","toastBg","cached","textColor","resolveCssCustomProperty","current","depth","inner","commaIndex","propName","fallbackVal","resolved","parseToRgb","hexMatch","hex","parseComponent","rgbMatch","rgbSpaceMatch","parseHue","hStr","raw","hslMatch","hslSpaceMatch","activeHslMatch","h","s","l","gray","hue2rgb","val","cleanBg","resolvedBg","rgbToHsl","max","min","d","hslToRgb","luminance","a","contrastRatio","rgb1","rgb2","L1","L2","rgbToHex","minContrast","textL","tr","tg","tb","result","allowedAttrs","attrsToRemove","attr","trimmedVal","rel","finalTarget","node","allowedTags","tag","frag","child","sanitized","sanitizedChild","html","doc","template","div","dirty","container","outFrag","wrapper","opts","cleaned","href","err","safeOpts","rawSize","size","rawColor","color","labelText","config","svgNS","svg","circle","lbl","st","target","toast","onClose","rawCfg","configs","item","cleanups","idx","cfg","isLink","trimmedHref","isDangerous","relSet","ctaTextColor","ctaBgColor","ctaBorderColor","isRtl","onClick","e","res","onKeyDown","cleanupItem","insertTarget","prevCleanup","undo","isFn","undoCfg","baseLabel","totalDuration","showCountdown","btn","bgColor","hexMatchUndo","borderColor","remainingSec","updateLabel","intervalId","isPaused","cleanupTimer","closeBtn","closeLabel","closeTextColor","rawProgress","pct","_a","progressBar","borderRadiusStr","parsedRadius","borderRadiusNum","progressHeightPx","progressHeightStyle","parsedFloat","progressDuration","leftOffset","finalWidth","isReverse","progressBg","isIndeterminate","animName","keyframes","trigger","startX","startY","currentX","startTime","isDragging","isHorizontal","touchId","isWindowListening","cleanupWindowListeners","onPointerMove","onPointerEnd","onPointerDown","ev","i","x","y","dx","dy","opacity","_b","isFlick","threshold","exitX","exitDuration","snapEasing","previouslyFocused","getFocusable","style","focusable","first","last","initialFocusTimer","cleanup","svgText","parserClass","sourceSvg","copySafeNode","safeEl","lowerName","j","safeChild","safeOptions","iconOpt","globalIcon","type","iconTag","matchedAlias","safeSvg","normalizedType","position","animationType","isSpring","pos","isTop","isLeft","isRight","anim","animType","durationMs","validAnimationDuration","easing","customClass","borderRadius","maxWidth","opacityDuration","opacityEasing","isError","role","ariaLive","messageSpan","fontSize","allowHtml","rawMessage","iconEl","loaderEl","spacer","tmp","emergency","posFlags","top","bottom","left","right","transform","innerWrapper","msgEl","closeSpan","timer","error","normalized","idOrPosition","id","root","setPosition","host","shadowStyle","all","rawPos","effectivePos","positionFlags","isFullWidth","hasTop","hasBottom","hasLeft","hasRight","hasCenter","flags","callback","delay","isInfinite","safeDelay","elapsed","_c","_d","_e","_f","onMouseEnter","onMouseLeave","onFocusIn","onFocusOut","items","count","isExpanded","index","depthFromTop","depthKey","str","safe","messageHash","data","entry","maxQ","existingQueued","queuedItem","usesPriority","incomingPriority","lowestIndex","lowestPriority","candidatePriority","initialCount","outer","shouldPauseOnHover","pendingKey","pendingEntry","lastToastEl","activeValues","lastData","children","candidate","toastEl","activeToasts","error_inner","pauseProgressBar","computedWidth","resumeProgressBar","remainingMs","_g","_h","_i","_j","_k","_l","_m","_n","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","_A","_B","queueIndex","badge","ctaEl","animDuration","exitTransform","parentContainer","targetEl","animationDurationMs","resolve","done","fallbackTimer","animEl","finish","onEnd","fallbackTimeout","newOptions","queued","prevOptions","isFinishingLoading","existingLoader","newType","isErr","typeColors","existingIcon","mergedForIcon","newIconEl","bg","dynamicColor","br","mw","dir","fs","fw","prevClass","ph","newDuration","mergedOpts","existingCloseBtn","sanitizedOptions","messageOrOptions","maybeOptions","extra","rawOptions","contPosition","contMaxWidth","final","prefersDark","rawProgressColor","colors","validTypes","validated","messages","fn","closeError","resolvedTarget","managerNoop","promiseOrFn","safeMessages","loadingInput","loadingOptions","loadingHandle","baseOptions","successResult","successOptions","errorResult","errorOptions","win","targetToast","interactive","message","createToast","dismiss"],"mappings":"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"}
|