UNPKG

customizable-toast-notification

Version:

A lightweight, zero-dependency toast notification library for modern JavaScript applications with production-grade reliability and comprehensive system mechanisms

1 lines 37.5 kB
{"version":3,"file":"index.esm.mjs","sources":["../src/utils/id.js","../src/utils/dom.js","../src/components/ToastContainer.js","../src/utils/position.js","../src/components/toast-utils.js","../src/components/Toast.js","../src/components/ToastManager.js","../src/index.js"],"sourcesContent":["// src/utils/id.js\r\n\"use strict\";\r\n\r\n/**\r\n * Generate unique ID for DOM elements to avoid conflicts\r\n * @param {string} prefix - Optional prefix for ID\r\n * @returns {string} Unique ID\r\n */\r\nexport function generateUniqueId(prefix = \"toast\") {\r\n return `${prefix}-${Date.now()}-${Math.floor(Math.random() * 100000)}`;\r\n}\r\n","// src/utils/dom.js\r\n\"use strict\";\r\n\r\nimport { generateUniqueId } from \"./id.js\";\r\n\r\n/**\r\n * Multi-layer fallback DOM element creation\r\n */\r\nexport function createElementWithId(tagName, prefix) {\r\n // PRIMARY: Standard createElement\r\n try {\r\n const el = document.createElement(tagName);\r\n el.id = generateUniqueId(prefix);\r\n return el;\r\n } catch (error) {\r\n console.warn(`Primary createElement failed for ${tagName}:`, error);\r\n\r\n // FALLBACK-A: Try div as alternative\r\n try {\r\n const fallbackEl = document.createElement(\"div\");\r\n fallbackEl.id = generateUniqueId(prefix || \"fallback\");\r\n fallbackEl.setAttribute(\"data-original-tag\", tagName);\r\n return fallbackEl;\r\n } catch (fallbackError) {\r\n console.error(\"All DOM creation methods failed:\", fallbackError);\r\n\r\n // FALLBACK-B: Return minimal object that won't crash\r\n return {\r\n id: generateUniqueId(prefix || \"emergency\"),\r\n style: {},\r\n appendChild: () => {},\r\n setAttribute: () => {},\r\n innerHTML: \"\",\r\n textContent: \"\",\r\n onclick: null,\r\n _isEmergencyElement: true,\r\n };\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Multi-strategy appendChild with graceful degradation\r\n */\r\nexport function appendChild(parent, child) {\r\n if (!parent || !child) return false;\r\n\r\n // PRIMARY: Standard appendChild\r\n try {\r\n if (!parent.contains(child)) {\r\n parent.appendChild(child);\r\n return true;\r\n }\r\n return true;\r\n } catch (error) {\r\n console.warn(\"Primary appendChild failed:\", error);\r\n\r\n // FALLBACK-A: insertAdjacentElement\r\n try {\r\n parent.insertAdjacentElement(\"beforeend\", child);\r\n return true;\r\n } catch (fallbackError) {\r\n console.warn(\"Fallback appendChild failed:\", fallbackError);\r\n\r\n // FALLBACK-B: Manual positioning\r\n try {\r\n if (parent === document.body) {\r\n child.style.position = \"fixed\";\r\n child.style.top = \"10px\";\r\n child.style.right = \"10px\";\r\n child.style.zIndex = \"99999\";\r\n document.body.insertAdjacentHTML(\"beforeend\", child.outerHTML || \"\");\r\n return true;\r\n }\r\n } catch (emergencyError) {\r\n console.error(\"All append strategies failed:\", emergencyError);\r\n return false;\r\n }\r\n }\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Safe element removal with multiple strategies\r\n */\r\nexport function removeElement(el) {\r\n if (!el) return true;\r\n\r\n // PRIMARY: parentNode.removeChild\r\n try {\r\n if (el.parentNode) {\r\n el.parentNode.removeChild(el);\r\n return true;\r\n }\r\n } catch (error) {\r\n console.warn(\"Primary removal failed:\", error);\r\n\r\n // FALLBACK-A: element.remove()\r\n try {\r\n if (el.remove) {\r\n el.remove();\r\n return true;\r\n }\r\n } catch (fallbackError) {\r\n console.warn(\"Fallback removal failed:\", fallbackError);\r\n\r\n // FALLBACK-B: Hide instead of remove\r\n try {\r\n el.style.display = \"none\";\r\n el.style.opacity = \"0\";\r\n el.style.pointerEvents = \"none\";\r\n el.style.position = \"absolute\";\r\n el.style.left = \"-9999px\";\r\n return true;\r\n } catch (hideError) {\r\n console.error(\"All removal strategies failed:\", hideError);\r\n return false;\r\n }\r\n }\r\n }\r\n return true;\r\n}\r\n\r\n/**\r\n * Animation duration parser with fallbacks\r\n */\r\nexport function parseAnimationDuration(duration) {\r\n // PRIMARY: Parse provided duration\r\n try {\r\n if (typeof duration === \"number\" && duration > 0) return duration;\r\n if (typeof duration === \"string\") {\r\n if (duration.endsWith(\"s\") && !duration.endsWith(\"ms\")) {\r\n const parsed = parseFloat(duration) * 1000;\r\n return parsed > 0 ? parsed : 500;\r\n }\r\n const parsed = parseFloat(duration);\r\n return parsed > 0 ? parsed : 500;\r\n }\r\n } catch (error) {\r\n console.warn(\"Duration parsing failed:\", error);\r\n }\r\n\r\n // FALLBACK: Safe default\r\n return 500;\r\n}\r\n\r\n/**\r\n * Force reflow with error protection\r\n */\r\nexport function forceReflow(el) {\r\n try {\r\n return el?.offsetWidth || 0;\r\n } catch (error) {\r\n console.warn(\"Force reflow failed:\", error);\r\n return 0;\r\n }\r\n}\r\n\r\n/**\r\n * Query selector shortcut with optional root.\r\n * @param {string} selector\r\n * @param {Document|HTMLElement} [root=document]\r\n * @returns {Element|null}\r\n */\r\nexport function query(selector, root = document) {\r\n return root.querySelector(selector);\r\n}\r\n","// src/components/ToastContainer.js //# Container logic\r\n\"use strict\";\r\n\r\nimport { setPosition } from \"../utils/position.js\";\r\nimport { appendChild } from \"../utils/dom.js\";\r\n\r\n/**\r\n * Create toast container with error handling\r\n * @param {string} position - Toast position\r\n * @returns {HTMLElement} Toast container element\r\n */\r\nexport function createToastContainer(position) {\r\n try {\r\n let toastContainer = document.getElementById(`toast-container-${position}`);\r\n\r\n if (!toastContainer) {\r\n toastContainer = document.createElement(\"div\");\r\n toastContainer.id = `toast-container-${position}`;\r\n toastContainer.style.position = \"fixed\";\r\n toastContainer.style.zIndex = \"9999\";\r\n setPosition(toastContainer, position);\r\n appendChild(document.body, toastContainer);\r\n }\r\n\r\n return toastContainer;\r\n } catch (error) {\r\n console.error(\"Failed to create toast container:\", error);\r\n // Fallback: return body element\r\n return document.body;\r\n }\r\n}\r\n","// src/utils/position.js\r\n\"use strict\";\r\n\r\n/**\r\n * Set position for toast container (EXACT same logic as original)\r\n * @param {HTMLElement} container - Toast container element\r\n * @param {string} position - Position string\r\n */\r\nexport function setPosition(container, position) {\r\n // Reset all position properties first\r\n container.style.top = \"auto\";\r\n container.style.bottom = \"auto\";\r\n container.style.left = \"auto\";\r\n container.style.right = \"auto\";\r\n container.style.transform = \"none\";\r\n\r\n if (position.includes(\"bottom\")) {\r\n container.style.bottom = \"10px\";\r\n } else if (position.includes(\"top\")) {\r\n container.style.top = \"10px\";\r\n }\r\n\r\n if (position.includes(\"right\")) {\r\n container.style.right = \"10px\";\r\n } else if (position.includes(\"left\")) {\r\n container.style.left = \"10px\";\r\n } else if (position.includes(\"center\")) {\r\n container.style.top = \"50%\";\r\n container.style.left = \"50%\";\r\n container.style.transform = \"translate(-50%, -50%)\";\r\n }\r\n}\r\n","\"use strict\";\r\n\r\nimport { forceReflow, parseAnimationDuration } from \"../utils/dom.js\";\r\n\r\n/**\r\n * Create close button for toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport function createCloseButton(toast, options, onClose) {\r\n const closeButton = document.createElement(\"button\");\r\n closeButton.innerHTML = \"&times;\";\r\n Object.assign(closeButton.style, {\r\n background: \"none\",\r\n border: \"none\",\r\n color: options.textColor || \"white\",\r\n fontSize: \"18px\",\r\n marginLeft: \"10px\",\r\n cursor: \"pointer\",\r\n });\r\n\r\n closeButton.onclick = () => onClose(toast);\r\n toast.appendChild(closeButton);\r\n\r\n toast._cleanupCloseButton = () => {\r\n closeButton.onclick = null;\r\n };\r\n}\r\n\r\n/**\r\n * Create progress bar for toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n */\r\nexport function createProgressBar(toast, options) {\r\n const progressBar = document.createElement(\"div\");\r\n Object.assign(progressBar.style, {\r\n position: \"absolute\",\r\n left: \"0\",\r\n height: options.progressHeight || \"4px\",\r\n background: options.progressColor || \"rgba(255, 255, 255, 0.3)\",\r\n width: \"100%\",\r\n transition: `width ${options.duration || 3000}ms linear`,\r\n [options.progressPosition === \"top\" ? \"top\" : \"bottom\"]: \"0\",\r\n });\r\n\r\n toast.appendChild(progressBar);\r\n\r\n setTimeout(() => {\r\n forceReflow(progressBar);\r\n progressBar.style.width = \"0%\";\r\n }, 100);\r\n}\r\n\r\n/**\r\n * Run toast fade-in animation\r\n * @param {HTMLElement} toast - Toast element\r\n */\r\nexport function runToastAnimation(toast) {\r\n setTimeout(() => {\r\n toast.style.opacity = \"1\";\r\n toast.style.transform = \"translateY(0)\";\r\n }, 50);\r\n}\r\n\r\n/**\r\n * Apply rich styling to toast element\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport function applyRichStyling(toast, options, onClose) {\r\n const animDurationMs = parseAnimationDuration(\r\n options.animationDuration || \"0.5s\"\r\n );\r\n\r\n // Apply full styling\r\n Object.assign(toast.style, {\r\n background: options.backgroundColor || options.color || \"#333\",\r\n color: options.textColor || \"white\",\r\n padding: \"12px 20px\",\r\n marginBottom: \"10px\",\r\n borderRadius: \"5px\",\r\n display: \"flex\",\r\n alignItems: \"center\",\r\n justifyContent: \"space-between\",\r\n boxShadow: \"0 4px 6px rgba(0, 0, 0, 0.1)\",\r\n minWidth: \"250px\",\r\n maxWidth: \"400px\",\r\n opacity: \"0\",\r\n position: \"relative\",\r\n transition: `opacity ${options.animationDuration || \"0.5s\"} ${\r\n options.animationEasing || \"ease\"\r\n }, transform ${options.animationDuration || \"0.5s\"} ${\r\n options.animationEasing || \"ease\"\r\n }`,\r\n transform: \"translateY(20px)\",\r\n zIndex: \"9999\",\r\n });\r\n\r\n toast._animationDuration = animDurationMs;\r\n\r\n // Message span\r\n const messageSpan = document.createElement(\"span\");\r\n messageSpan.textContent = options.message || \"Notification\";\r\n messageSpan.style.flex = \"1\";\r\n toast.appendChild(messageSpan);\r\n\r\n // Close button\r\n if (options.showCloseButton) {\r\n createCloseButton(toast, options, onClose);\r\n }\r\n\r\n // Progress bar\r\n if (options.showProgressBar) {\r\n createProgressBar(toast, options);\r\n }\r\n\r\n // Animation\r\n runToastAnimation(toast);\r\n}\r\n\r\n/**\r\n * Create basic fallback toast\r\n * @param {HTMLElement} toast - Toast element\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport function createBasicToast(toast, options, onClose) {\r\n // Basic styling only\r\n Object.assign(toast.style, {\r\n background: \"#333\",\r\n color: \"white\",\r\n padding: \"10px 15px\",\r\n margin: \"10px\",\r\n borderRadius: \"3px\",\r\n position: \"fixed\",\r\n top: \"20px\",\r\n right: \"20px\",\r\n zIndex: \"99999\",\r\n maxWidth: \"300px\",\r\n wordWrap: \"break-word\",\r\n });\r\n\r\n toast.textContent = options.message || \"Notification\";\r\n\r\n if (options.showCloseButton) {\r\n toast.style.cursor = \"pointer\";\r\n toast.onclick = () => onClose(toast);\r\n }\r\n\r\n toast._animationDuration = 500;\r\n}\r\n\r\n/**\r\n * Emergency toast as last resort\r\n * @param {Object} options - Toast options\r\n * @param {Function} onClose - Close callback\r\n */\r\nexport function createEmergencyToast(options, onClose) {\r\n try {\r\n // Create emergency div\r\n const emergency = document.createElement(\"div\");\r\n emergency.id = `emergency-${Date.now()}`;\r\n emergency.innerHTML = `\r\n <div style=\"\r\n background: #333 !important;\r\n color: white !important;\r\n padding: 10px 15px !important;\r\n position: fixed !important;\r\n top: 20px !important;\r\n right: 20px !important;\r\n z-index: 99999 !important;\r\n border-radius: 3px !important;\r\n max-width: 250px !important;\r\n word-wrap: break-word !important;\r\n font-family: Arial, sans-serif !important;\r\n font-size: 14px !important;\r\n box-shadow: 0 2px 10px rgba(0,0,0,0.3) !important;\r\n cursor: pointer !important;\r\n \" onclick=\"this.parentNode.removeChild(this)\">\r\n ${options.message || \"Notification\"}\r\n <span style=\"float: right; margin-left: 10px; font-weight: bold;\">&times;</span>\r\n </div>\r\n `;\r\n\r\n emergency._animationDuration = 500;\r\n emergency._isEmergencyToast = true;\r\n\r\n // Auto remove\r\n setTimeout(() => {\r\n try {\r\n if (emergency.parentNode) {\r\n emergency.parentNode.removeChild(emergency);\r\n }\r\n onClose(emergency);\r\n } catch (error) {\r\n console.warn(\"Emergency cleanup failed:\", error);\r\n }\r\n }, options.duration || 3000);\r\n\r\n return emergency;\r\n } catch (emergencyError) {\r\n console.error(\"Emergency toast creation failed:\", emergencyError);\r\n\r\n // ULTIMATE FALLBACK: Alert\r\n setTimeout(() => {\r\n try {\r\n alert(options.message || \"Toast Notification\");\r\n onClose(null);\r\n } catch (alertError) {\r\n console.error(\"Ultimate fallback failed:\", alertError);\r\n onClose(null);\r\n }\r\n }, 100);\r\n\r\n return null;\r\n }\r\n}\r\n","// src/components/Toast.js //# Single responsibility\r\n\"use strict\";\r\n\r\nimport { createElementWithId } from \"../utils/dom.js\";\r\nimport {\r\n applyRichStyling,\r\n createBasicToast,\r\n createEmergencyToast,\r\n} from \"./toast-utils.js\";\r\n\r\n/**\r\n * Multi-layer toast creation with satellite-grade fallbacks\r\n * @param {Object} options - Toast configuration options\r\n * @param {Function} onClose - Callback when toast closes\r\n * @returns {HTMLElement} Toast element\r\n */\r\nexport function createToastElement(options, onClose) {\r\n let toast;\r\n let isEmergencyMode = false;\r\n\r\n // PRIMARY: Full-featured toast\r\n try {\r\n toast = createElementWithId(\"div\", \"toast\");\r\n\r\n if (toast._isEmergencyElement) {\r\n isEmergencyMode = true;\r\n console.warn(\"Toast created in emergency mode\");\r\n }\r\n } catch (error) {\r\n console.error(\"Toast creation failed:\", error);\r\n isEmergencyMode = true;\r\n // FALLBACK: Basic object structure\r\n toast = {\r\n id: `emergency-toast-${Date.now()}`,\r\n style: {},\r\n appendChild: () => {},\r\n innerHTML: \"\",\r\n textContent: \"\",\r\n _isEmergencyElement: true,\r\n };\r\n }\r\n\r\n // PRIMARY: Rich styling and features\r\n if (!isEmergencyMode) {\r\n try {\r\n applyRichStyling(toast, options, onClose);\r\n return toast;\r\n } catch (stylingError) {\r\n console.warn(\r\n \"Rich toast styling failed, switching to basic mode:\",\r\n stylingError\r\n );\r\n isEmergencyMode = true;\r\n }\r\n }\r\n\r\n // FALLBACK-A: Basic functional toast\r\n if (isEmergencyMode && !toast._isEmergencyElement) {\r\n try {\r\n createBasicToast(toast, options, onClose);\r\n return toast;\r\n } catch (basicError) {\r\n console.error(\"Basic toast creation failed:\", basicError);\r\n }\r\n }\r\n\r\n // FALLBACK-B: Emergency notification system\r\n return createEmergencyToast(options, onClose);\r\n}\r\n","// src/components/ToastManager.js //# State management\r\n\"use strict\";\r\n\r\nimport { createToastContainer } from \"./ToastContainer.js\";\r\nimport { createToastElement } from \"./Toast.js\";\r\nimport { removeElement } from \"../utils/dom.js\";\r\n\r\n// State management with fallback tracking\r\nlet isToastShowing = false;\r\nlet currentToast = null;\r\nlet emergencyTimeouts = new Set();\r\nlet emergencyCleanupScheduled = false;\r\n\r\n/**\r\n * Show toast with comprehensive fallback system\r\n */\r\nexport function showToast(options) {\r\n // Prevent multiple toasts (original behavior)\r\n if (isToastShowing) {\r\n console.warn(\"Toast already showing, ignoring request\");\r\n return;\r\n }\r\n\r\n isToastShowing = true;\r\n\r\n // PRIMARY: Full toast system\r\n try {\r\n const container = createToastContainer(options.position);\r\n const toast = createToastElement(options, closeToast);\r\n\r\n if (!toast) {\r\n throw new Error(\"Toast creation returned null\");\r\n }\r\n\r\n currentToast = toast;\r\n\r\n // Append to container\r\n if (container.appendChild) {\r\n container.appendChild(toast);\r\n } else {\r\n // Container is emergency fallback\r\n document.body.appendChild(toast);\r\n }\r\n\r\n // Schedule auto-dismiss\r\n const dismissTimeout = setTimeout(() => {\r\n closeToast(toast);\r\n }, options.duration || 3000);\r\n\r\n emergencyTimeouts.add(dismissTimeout);\r\n\r\n // Emergency cleanup backup\r\n scheduleEmergencyCleanup(options.duration || 3000);\r\n\r\n return;\r\n } catch (primaryError) {\r\n console.warn(\"Primary toast system failed:\", primaryError);\r\n }\r\n\r\n // FALLBACK-A: Direct body placement\r\n try {\r\n const simpleToast = createSimpleToast(options);\r\n currentToast = simpleToast;\r\n document.body.appendChild(simpleToast);\r\n\r\n setTimeout(() => {\r\n closeToast(simpleToast);\r\n }, options.duration || 3000);\r\n\r\n return;\r\n } catch (fallbackError) {\r\n console.warn(\"Fallback toast failed:\", fallbackError);\r\n }\r\n\r\n // FALLBACK-B: Browser alert\r\n try {\r\n alert(options.message || \"Notification\");\r\n isToastShowing = false;\r\n } catch (alertError) {\r\n console.error(\"All toast systems failed:\", alertError);\r\n isToastShowing = false;\r\n }\r\n}\r\n\r\n/**\r\n * Create simple toast for fallback\r\n */\r\nfunction createSimpleToast(options) {\r\n const simple = document.createElement(\"div\");\r\n simple.style.cssText = `\r\n position: fixed !important;\r\n top: 20px !important;\r\n right: 20px !important;\r\n background: #333 !important;\r\n color: white !important;\r\n padding: 12px 20px !important;\r\n border-radius: 5px !important;\r\n z-index: 99999 !important;\r\n max-width: 300px !important;\r\n font-family: Arial, sans-serif !important;\r\n cursor: pointer !important;\r\n `;\r\n simple.textContent = options.message || \"Notification\";\r\n simple.onclick = () => closeToast(simple);\r\n return simple;\r\n}\r\n\r\n/**\r\n * Close toast with multi-strategy cleanup\r\n */\r\nfunction closeToast(toast) {\r\n try {\r\n if (!toast) {\r\n resetToastState();\r\n return;\r\n }\r\n\r\n // Animation if supported\r\n if (toast.style && !toast._isEmergencyToast) {\r\n toast.style.opacity = \"0\";\r\n toast.style.transform = \"translateY(-20px)\";\r\n\r\n const animDuration = toast._animationDuration || 500;\r\n setTimeout(() => {\r\n performCleanup(toast);\r\n }, animDuration);\r\n } else {\r\n // Immediate cleanup for emergency toasts\r\n performCleanup(toast);\r\n }\r\n } catch (error) {\r\n console.error(\"Close toast failed:\", error);\r\n forceEmergencyCleanup();\r\n }\r\n}\r\n\r\n/**\r\n * Perform comprehensive cleanup\r\n */\r\nfunction performCleanup(toast) {\r\n try {\r\n // Cleanup event listeners\r\n if (toast._cleanupCloseButton) {\r\n toast._cleanupCloseButton();\r\n }\r\n\r\n // Remove from DOM\r\n removeElement(toast);\r\n\r\n // Reset state\r\n resetToastState();\r\n } catch (error) {\r\n console.error(\"Cleanup failed:\", error);\r\n forceEmergencyCleanup();\r\n }\r\n}\r\n\r\n/**\r\n * Reset all toast state\r\n */\r\nfunction resetToastState() {\r\n isToastShowing = false;\r\n currentToast = null;\r\n\r\n // Clear all timeouts\r\n emergencyTimeouts.forEach((id) => {\r\n try {\r\n clearTimeout(id);\r\n } catch (error) {\r\n console.warn(\"Timeout clear failed:\", error);\r\n }\r\n });\r\n emergencyTimeouts.clear();\r\n emergencyCleanupScheduled = false;\r\n}\r\n\r\n/**\r\n * Schedule emergency cleanup\r\n */\r\nfunction scheduleEmergencyCleanup(duration) {\r\n if (emergencyCleanupScheduled) return;\r\n\r\n emergencyCleanupScheduled = true;\r\n const emergencyTimeout = setTimeout(() => {\r\n console.warn(\"Emergency cleanup triggered\");\r\n forceEmergencyCleanup();\r\n }, duration * 2.5); // 2.5x safety margin\r\n\r\n emergencyTimeouts.add(emergencyTimeout);\r\n}\r\n\r\n/**\r\n * Force emergency cleanup of everything\r\n */\r\nfunction forceEmergencyCleanup() {\r\n try {\r\n // Remove current toast\r\n if (currentToast) {\r\n removeElement(currentToast);\r\n }\r\n\r\n // Clean up any orphaned toast elements\r\n const orphanedToasts = document.querySelectorAll(\r\n '[id*=\"toast\"], [id*=\"emergency\"]'\r\n );\r\n orphanedToasts.forEach((element) => {\r\n try {\r\n removeElement(element);\r\n } catch (error) {\r\n console.warn(\"Orphaned element cleanup failed:\", error);\r\n }\r\n });\r\n\r\n // Reset all state\r\n resetToastState();\r\n } catch (error) {\r\n console.error(\"Force cleanup failed:\", error);\r\n // Final state reset\r\n isToastShowing = false;\r\n currentToast = null;\r\n }\r\n}\r\n","// src/index.js\r\n/**\r\n * @fileoverview A simple toast notification library for any JavaScript framework.\r\n * @name Customizable Toast Notifications\r\n * @author Priyanshu Patel\r\n * @version __VERSION__\r\n * @build Production\r\n * @license Apache-2.0\r\n * @depends None\r\n * @description A lightweight and fully customizable toast notification library\r\n * designed for seamless integration with any JavaScript or framework-based UI.\r\n * Supports flexible positioning, theming, icons, animations, and timing options\r\n * out of the box — with zero dependencies.\r\n * Author: Priyanshu Patel\r\n * Email: priyanshu.alt191@gmail.com\r\n * Created: July 31, 2024\r\n * License: Apache-2.0\r\n * Dependencies: None\r\n */\r\n\r\n\"use strict\";\r\n\r\nimport { showToast } from \"./components/ToastManager.js\";\r\n\r\n// Protected state with fallbacks\r\nlet defaultColors = {\r\n success: \"#28a745\",\r\n error: \"#dc3545\",\r\n warning: \"#ffc107\",\r\n info: \"#17a2b8\",\r\n};\r\n\r\nlet defaultMessages = {\r\n success: \"Operation completed successfully!\",\r\n error: \"Something went wrong!\",\r\n warning: \"Warning message!\",\r\n info: \"Information message!\",\r\n};\r\n\r\n/**\r\n * Create toast with satellite-grade reliability\r\n */\r\nfunction createToast(options = {}) {\r\n try {\r\n // Input sanitization and validation\r\n const sanitizedOptions = sanitizeToastOptions(options);\r\n\r\n // Call main toast system\r\n showToast(sanitizedOptions);\r\n } catch (error) {\r\n console.error(\"CreateToast failed:\", error);\r\n\r\n // ULTIMATE FALLBACK: Browser alert with sanitized message\r\n const safeMessage =\r\n typeof options?.message === \"string\"\r\n ? options.message.substring(0, 200)\r\n : \"Toast notification failed\";\r\n\r\n try {\r\n alert(safeMessage);\r\n } catch (alertError) {\r\n console.error(\"Ultimate fallback failed:\", alertError);\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Sanitize and normalize toast options\r\n */\r\nfunction sanitizeToastOptions(options) {\r\n const defaults = {\r\n duration: 3000,\r\n position: \"bottom-right\",\r\n type: \"info\",\r\n backgroundColor: undefined,\r\n textColor: \"white\",\r\n showCloseButton: false,\r\n animationDuration: \"0.5s\",\r\n animationEasing: \"ease\",\r\n showProgressBar: false,\r\n progressColor: undefined,\r\n progressHeight: \"4px\",\r\n progressPosition: \"bottom\",\r\n };\r\n\r\n // Start with safe defaults\r\n let final = { ...defaults };\r\n\r\n // Merge user options safely\r\n if (options && typeof options === \"object\" && !Array.isArray(options)) {\r\n Object.keys(defaults).forEach((key) => {\r\n if (options.hasOwnProperty(key)) {\r\n final[key] = options[key];\r\n }\r\n });\r\n\r\n // Handle message separately\r\n if (options.message !== undefined) {\r\n final.message = options.message;\r\n }\r\n }\r\n\r\n // Validate and apply defaults\r\n try {\r\n if (!final.backgroundColor && final.type && defaultColors[final.type]) {\r\n final.backgroundColor = defaultColors[final.type];\r\n }\r\n\r\n if (!final.message && final.type && defaultMessages[final.type]) {\r\n final.message = defaultMessages[final.type];\r\n }\r\n } catch (error) {\r\n console.warn(\"Option processing failed:\", error);\r\n }\r\n\r\n // Final safety checks\r\n if (!final.message || typeof final.message !== \"string\") {\r\n final.message = \"Notification\";\r\n }\r\n\r\n if (typeof final.duration !== \"number\" || final.duration < 100) {\r\n final.duration = 3000;\r\n }\r\n\r\n return final;\r\n}\r\n\r\n/**\r\n * Set default colors with validation\r\n */\r\nfunction setDefaultColors(colors) {\r\n try {\r\n if (colors && typeof colors === \"object\" && !Array.isArray(colors)) {\r\n defaultColors = { ...defaultColors, ...colors };\r\n }\r\n } catch (error) {\r\n console.error(\"setDefaultColors failed:\", error);\r\n }\r\n}\r\n\r\n/**\r\n * Set default messages with validation\r\n */\r\nfunction setDefaultMessages(messages) {\r\n try {\r\n if (messages && typeof messages === \"object\" && !Array.isArray(messages)) {\r\n defaultMessages = { ...defaultMessages, ...messages };\r\n }\r\n } catch (error) {\r\n console.error(\"setDefaultMessages failed:\", error);\r\n }\r\n}\r\n\r\n// Module exports\r\nexport { createToast, setDefaultColors, setDefaultMessages };\r\n\r\n// Global assignment with protection\r\ntry {\r\n // UMD/Global support\r\n if (typeof window !== \"undefined\") {\r\n window.customizableToast = {\r\n createToast,\r\n setDefaultColors,\r\n setDefaultMessages,\r\n };\r\n }\r\n} catch (error) {\r\n console.error(\"Global assignment failed:\", error);\r\n}\r\n"],"names":["generateUniqueId","prefix","Date","now","Math","floor","random","removeElement","el","parentNode","removeChild","error","remove","fallbackError","style","display","opacity","pointerEvents","position","left","hideError","createToastContainer","toastContainer","document","getElementById","createElement","id","zIndex","container","top","bottom","right","transform","includes","setPosition","parent","child","contains","appendChild","insertAdjacentElement","body","insertAdjacentHTML","outerHTML","emergencyError","applyRichStyling","toast","options","onClose","animDurationMs","duration","endsWith","parsed","parseFloat","parseAnimationDuration","animationDuration","Object","assign","background","backgroundColor","color","textColor","padding","marginBottom","borderRadius","alignItems","justifyContent","boxShadow","minWidth","maxWidth","transition","animationEasing","_animationDuration","messageSpan","textContent","message","flex","showCloseButton","closeButton","innerHTML","border","fontSize","marginLeft","cursor","onclick","_cleanupCloseButton","createCloseButton","showProgressBar","progressBar","height","progressHeight","progressColor","width","progressPosition","setTimeout","offsetWidth","forceReflow","createProgressBar","runToastAnimation","createToastElement","isEmergencyMode","tagName","fallbackEl","setAttribute","_isEmergencyElement","createElementWithId","stylingError","margin","wordWrap","createBasicToast","basicError","emergency","_isEmergencyToast","alert","alertError","createEmergencyToast","isToastShowing","currentToast","emergencyTimeouts","Set","emergencyCleanupScheduled","showToast","closeToast","Error","dismissTimeout","add","emergencyTimeout","forceEmergencyCleanup","scheduleEmergencyCleanup","primaryError","simpleToast","simple","cssText","createSimpleToast","resetToastState","animDuration","performCleanup","forEach","clearTimeout","clear","querySelectorAll","element","defaultColors","success","warning","info","defaultMessages","createToast","sanitizedOptions","defaults","type","undefined","final","Array","isArray","keys","key","hasOwnProperty","sanitizeToastOptions","safeMessage","substring","setDefaultColors","colors","setDefaultMessages","messages","window","customizableToast"],"mappings":"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"}