customizable-toast-notification 3.3.1 β†’ 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md ADDED
@@ -0,0 +1,27 @@
1
+ # Changelog
2
+
3
+ ## [3.4.0] - 2025-01-19
4
+
5
+ ### ✨ Major Release - Production Ready
6
+
7
+ **πŸš€ New Features:**
8
+
9
+ - Zero-crash guarantee
10
+ - Dynamic versioning with CDN cache-busting
11
+ - Comprehensive error handling and memory leak prevention
12
+
13
+ **πŸ”§ Improvements:**
14
+
15
+ - Reduced cognitive complexity
16
+ - Modular architecture with helper functions separation
17
+ - Professional build output with author branding preservation
18
+
19
+ **πŸ› οΈ Fixes:**
20
+
21
+ - Rollup build warnings and mixed exports issues
22
+ - CDN caching problems with automatic invalidation
23
+ - Code organization for better maintainability
24
+
25
+ **⬆️ Upgrade:** Fully backward compatible - no breaking changes
26
+
27
+ **Author:** Priyanshu Patel | **License:** Apache-2.0
package/README.md CHANGED
@@ -1,214 +1,264 @@
1
- # 🌟 Connect with Me!
1
+ # 🍞 Customizable Toast Notifications
2
2
 
3
- Please feel free to connect or reach out for **feedback**, **suggestions**, or any kind of **requirements** or **fixes**β€”just anythingβ€”at:
3
+ [![npm version](https://badge.fury.io/js/customizable-toast-notification.svg)](https://www.npmjs.com/package/customizable-toast-notification)
4
+ [![License: Apache-2.0](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)
5
+ [![Downloads](https://img.shields.io/npm/dm/customizable-toast-notification.svg)](https://www.npmjs.com/package/customizable-toast-notification)
6
+ [![Bundle Size](https://img.shields.io/bundlephobia/minzip/customizable-toast-notification)](https://bundlephobia.com/package/customizable-toast-notification)
4
7
 
5
- πŸ“§ **priyanshu.alt191@gmail.com**
8
+ A **lightweight**, **zero-dependency** toast notification library for modern JavaScript applications. Built with production-grade reliability and comprehensive secret mechanisms.
6
9
 
7
- <u>Your support is highly appreciated! πŸ™Œ If you'd like to show some love, please leave a message of appreciation and don't forget to add your message when supporting me through the **QR Code** below
8
- or
9
- **GlobalUPI_ID(eureka91@upi)**
10
- or
11
- **πŸ‘‰ [Click here to send via PayPal](https://paypal.me/priyanshupatel1)**! πŸ’¬πŸ’–
12
- </u>
10
+ ## ✨ Key Features
13
11
 
14
- ![Support Me](https://github.com/sammy-cool/support_qr/blob/eb14a600e04dc48dacab11e22cd28f18a31f7a12/support_qr.png)
12
+ - 🚫 **Zero Dependencies** - Lightweight and fast
13
+ - πŸ›‘οΈ **Production Ready** - Reliable and scalable for production environments
14
+ - 🎨 **Highly Customizable** - Colors, positions, animations, progress bars
15
+ - 🌐 **Framework Agnostic** - Works with React, Vue, Angular, or vanilla JS
16
+ - πŸ“± **Responsive** - Works on all screen sizes and devices
17
+ - ⚑ **CDN Ready** - Easy integration via CDN or npm
18
+ - πŸ”§ **TypeScript Ready** - Full type support (coming soon)
15
19
 
16
- **will surely revert!**
17
- ---->
18
- **πŸ’–Thank you for your generosity!** πŸ™
20
+ ## πŸ“¦ Installation
19
21
 
20
- # Customizable Toast Notification Library
22
+ ### NPM/Yarn
21
23
 
22
- A simple and highly customizable toast notification library for modern JavaScript applications. This library allows you to easily display toast notifications with various configurations to enhance user experience.
24
+ ```bash
25
+ npm install customizable-toast-notification
26
+ ```
23
27
 
24
- ## Table of Contents
28
+ or
25
29
 
26
- - [Features](#features)
27
- - [Installation](#installation)
28
- - [Usage](#usage)
29
- - [API Reference](#api-reference)
30
- - [Examples](#examples)
31
- - [Contributing](#contributing)
32
- - [License](#license)
30
+ ```bash
31
+ yarn add customizable-toast-notification
32
+ ```
33
33
 
34
- ## Features
34
+ ### CDN (UMD Build)
35
35
 
36
- - Display notifications of different types: info, success, error, and warning.
37
- - Customizable background and text colors.
38
- - Support for custom messages and default messages.
39
- - Adjustable display duration and positioning on the screen.
40
- - Close button functionality for user control.
41
- - Animation effects for a smooth appearance and disappearance.
42
- - **NEW**: Optional animated progress bar synced to duration
36
+ ```bash
37
+ <script src="https://cdn.jsdelivr.net/npm/customizable-toast-notification@latest/dist/index.umd.js"></script>
38
+ ```
43
39
 
44
- ## Installation
40
+ ## πŸš€ Quick Start
45
41
 
46
- You can install the library via npm:
42
+ ### ES Modules
47
43
 
48
- ```bash
49
- npm install customizable-toast-notification
50
- ```
44
+ ```json
51
45
 
52
- ## Usage
46
+ import { createToast, setDefaultColors, setDefaultMessages } from 'customizable-toast-notification';
53
47
 
54
- πŸ”Œ CDN Usage (UMD:Universal Module Definition Build)
55
- You can use this toast notification library directly in your HTML file via a <script> tag:
48
+ // Simple usage
49
+ createToast({
50
+ message: "Hello World!",
51
+ type: "success",
52
+ duration: 3000
53
+ });
56
54
 
57
- <script src="https://cdn.jsdelivr.net/npm/customizable-toast-notification/dist/index.umd.js"></script>
58
- <script>
59
- customizableToast.createToast({
60
- message: "Hello from the browser!",
61
- type: "success",
62
- position: "top-center",
63
- duration: 4000
64
- });
65
- </script>
55
+ ```
66
56
 
67
- βœ… No build tools or framework needed
68
- βœ… Works in all modern browsers
57
+ ### CDN/Browser
69
58
 
70
- or To use the toast notification library, you need to import it in your JavaScript or TypeScript file:
59
+ ```json
71
60
 
72
- ```javascript
73
- import {
74
- createToast,
75
- setDefaultColors,
76
- setDefaultMessages,
77
- } from "customizable-toast-notification";
61
+ <script src="https://cdn.jsdelivr.net/npm/customizable-toast-notification@latest/dist/index.umd.js"></script>
62
+ <script> customizableToast.createToast({ message: "Hello from CDN!", type: "success", position: "top-right" }); </script>
78
63
 
79
- // Create a toast notification
80
- createToast({
81
- message: "This is a custom message!",
82
- duration: 5000, // Duration in milliseconds
83
- position: "top-right", // Position of the toast
84
- type: "success", // Type of notification
85
- backgroundColor: "green", // Custom background color
86
- textColor: "white", // Custom text color
87
- showCloseButton: true, // Show close button
88
- animationDuration: "0.5s", // Duration of the animations
89
- animationEasing: "ease", // Easing function for the animations
90
- });
91
64
  ```
92
65
 
93
- ## API Reference
66
+ ## πŸ“– API Reference
94
67
 
95
- ### createToast
68
+ ### `createToast(options)`
96
69
 
97
- Creates a toast notification with the provided options.
70
+ Creates and displays a toast notification.
98
71
 
99
- #### Parameters
72
+ #### Options
100
73
 
101
- ### βš™οΈ Options
74
+ | Parameter | Type | Default | Description |
75
+ | ------------------- | --------- | ----------------------- | --------------------------------------------- |
76
+ | `message` | `string` | Based on `type` | Toast message content |
77
+ | `type` | `string` | `"info"` | `"info"`, `"success"`, `"error"`, `"warning"` |
78
+ | `duration` | `number` | `3000` | Auto-dismiss time in milliseconds |
79
+ | `position` | `string` | `"bottom-right"` | Toast position on screen |
80
+ | `backgroundColor` | `string` | Based on `type` | Custom background color |
81
+ | `textColor` | `string` | `"white"` | Custom text color |
82
+ | `showCloseButton` | `boolean` | `false` | Show close (Γ—) button |
83
+ | `showProgressBar` | `boolean` | `false` | Show countdown progress bar |
84
+ | `animationDuration` | `string` | `"0.5s"` | CSS animation duration |
85
+ | `animationEasing` | `string` | `"ease"` | CSS animation easing function |
86
+ | `progressColor` | `string` | `rgba(255,255,255,0.3)` | Progress bar color |
87
+ | `progressHeight` | `string` | `"4px"` | Progress bar height |
88
+ | `progressPosition` | `string` | `"bottom"` | Progress bar position: `"top"` or `"bottom"` |
102
89
 
103
- | Option | Type | Default | Description |
104
- | ------------------- | --------- | --------------- | ----------------------------------------------------- |
105
- | `message` | `string` | Based on `type` | The toast content/message. |
106
- | `duration` | `number` | `3000` | Time in milliseconds to auto-dismiss. |
107
- | `position` | `string` | `bottom-right` | Position on screen (`top-left`, `bottom-right`, etc.) |
108
- | `type` | `string` | `info` | One of: `info`, `success`, `error`, `warning` |
109
- | `backgroundColor` | `string` | Based on `type` | Override background color. |
110
- | `textColor` | `string` | `white` | Override text color. |
111
- | `showCloseButton` | `boolean` | `false` | Show a close (Γ—) button. |
112
- | `animationDuration` | `string` | `0.5s` | CSS duration for fade in/out. |
113
- | `animationEasing` | `string` | `ease` | CSS easing function for transitions. |
114
- | `showProgressBar` | `boolean` | `false` | Show a countdown progress bar. |
115
- | `progressColor` | `string` | `textColor` | Color of the progress bar. |
116
- | `progressHeight` | `string` | `4px` | Height of the progress bar. |
117
- | `progressPosition` | `string` | `bottom` | Position of the progress bar: `top` or `bottom`. |
90
+ #### Position Options
118
91
 
119
- #### Example
92
+ ```josn
93
+
94
+ - `"top-left"`, `"top-right"`, `"top-center"`
95
+ - `"bottom-left"`, `"bottom-right"`, `"bottom-center"`
120
96
 
121
- ```javascript
122
- createToast({
123
- message: "Uploading file...",
124
- type: "info",
125
- duration: 5000,
126
- showProgressBar: true,
127
- progressColor: "#ffffff",
128
- progressHeight: "4px",
129
- progressPosition: "top",
130
- });
131
97
  ```
132
98
 
133
- ### setDefaultColors
99
+ ### `setDefaultColors(colors)`
100
+
101
+ ```json
134
102
 
135
- Sets default colors for different toast types.
103
+ Configure default colors for toast types.
104
+
105
+ setDefaultColors({
106
+ success: "#10b981",
107
+ error: "#ef4444",
108
+ warning: "#f59e0b",
109
+ info: "#3b82f6"
110
+ });
136
111
 
137
- #### Parameters
112
+ ```
138
113
 
139
- - `newColors` (Object): New colors to set for toast types, where keys are the toast types (info, success, error, warning).
114
+ ### `setDefaultMessages(messages)`
140
115
 
141
- #### Example
116
+ ```json
117
+ Configure default messages for toast types.
142
118
 
143
- ```javascript
144
- setDefaultColors({
145
- info: "blue",
146
- success: "green",
147
- error: "red",
148
- warning: "orange",
119
+ setDefaultMessages({
120
+ success: "Operation completed successfully!",
121
+ error: "Something went wrong!",
122
+ warning: "Please check your input!",
123
+ info: "Here's some information!"
149
124
  });
125
+
150
126
  ```
151
127
 
152
- ### setDefaultMessages
128
+ ## πŸ’‘ Examples
153
129
 
154
- Sets default messages for different toast types.
130
+ ### Basic Toast Types
155
131
 
156
- #### Parameters
132
+ ```json
133
+ // Success
134
+ createToast({ type: "success", message: "Data saved!" });
157
135
 
158
- - `newMessages` (Object): New messages to set for toast types, where keys are the toast types (info, success, error, warning).
136
+ // Error
137
+ createToast({ type: "error", message: "Save failed!" });
159
138
 
160
- #### Example
139
+ // Warning
140
+ createToast({ type: "warning", message: "Please confirm!" });
161
141
 
162
- ```javascript
163
- setDefaultMessages({
164
- info: "This is an informational message!",
165
- success: "Your action was successful!",
166
- error: "An error has occurred!",
167
- warning: "This is a warning message!",
168
- });
169
- ```
142
+ // Info
143
+ createToast({ type: "info", message: "New update available!" });
170
144
 
171
- ## Examples
145
+ ```
172
146
 
173
- ### Basic Usage
147
+ ### Advanced Customization
174
148
 
175
- ```javascript
149
+ ```json
176
150
  createToast({
177
- message: "Welcome to our website!",
178
- duration: 4000,
179
- type: "info",
151
+ message: "File uploading...",
152
+ type: "info",
153
+ duration: 5000,
154
+ position: "top-center",
155
+ showProgressBar: true,
156
+ showCloseButton: true,
157
+ backgroundColor: "#6366f1",
158
+ textColor: "white",
159
+ progressColor: "#e0e7ff",
160
+ progressPosition: "top",
161
+ animationDuration: "0.8s",
162
+ animationEasing: "ease-out"
180
163
  });
181
- ```
182
164
 
183
- ### Custom Colors and Messages
165
+ ### App-wide Configuration
184
166
 
185
- ```javascript
167
+ // Set your brand colors once
186
168
  setDefaultColors({
187
- success: "#28a745",
188
- error: "#dc3545",
169
+ success: "#10b981", // Your brand green
170
+ error: "#ef4444", // Your brand red
171
+ warning: "#f59e0b", // Your brand yellow
172
+ info: "#3b82f6" // Your brand blue
189
173
  });
190
174
 
175
+ // Set your app messages
191
176
  setDefaultMessages({
192
- success: "Data saved successfully!",
193
- error: "Failed to save data.",
177
+ success: "βœ… Success! Changes saved.",
178
+ error: "❌ Error! Please try again.",
179
+ warning: "⚠️ Warning! Check your input.",
180
+ info: "πŸ’‘ Info! Here's a tip."
194
181
  });
195
182
 
196
- createToast({
197
- type: "success",
198
- message: "Data saved successfully!",
199
- });
183
+ // Now just use types throughout your app
184
+ createToast({ type: "success" }); // Uses your custom colors & messages
185
+
200
186
  ```
201
187
 
202
- ## Contributing
188
+ ## πŸ›‘οΈ Reliability Features
189
+
190
+ ### Production-Grade System
191
+
192
+ - \*\*Rich toast β†’ Basic toast β†’ Emergency alert
193
+ - **Zero-Crash Guarantee**: Comprehensive error handling prevents application crashes
194
+ - **Memory Management**: Automatic cleanup prevents memory leaks
195
+ - **CDN Cache-Busting**: Ensures fresh content delivery
196
+
197
+ ### Browser Compatibility
203
198
 
204
- Contributions are welcome! Please read the [CONTRIBUTING.md]() for details on our code of conduct, and the process for submitting pull requests.
199
+ - βœ… Chrome
200
+ - βœ… Firefox
201
+ - βœ… Safari
202
+ - βœ… Edge
203
+ - βœ… Mobile browsers
205
204
 
206
- ## License
205
+ ## πŸ“ Bundle Information
207
206
 
208
- This project is licensed under the Apache-2.0 License - see the [LICENSE.md](LICENSE) file for details.
207
+ - **Size**: ~13KB minified, ~4KB gzipped
208
+ - **Dependencies**: Zero
209
+ - **Formats**: UMD, ES Modules
210
+ - **TypeScript**: Definitions included (coming soon)
211
+
212
+ ## 🀝 Contributing
213
+
214
+ Exciting times ahead! Looking for sponsors and eager to explore new collaborations:) . Contributions are welcome! Please read our [Contributing Guidelines](CONTRIBUTING.md) for details.
215
+
216
+ ### Development Setup
217
+
218
+ ```bash
219
+
220
+ git clone https://github.com/sammy-cool/customizable-toast-notification.git
221
+ cd customizable-toast-notification
222
+ npm install
223
+ npm run build
224
+
225
+ ```
226
+
227
+ ## πŸ“„ License
228
+
229
+ This project is licensed under the [Apache-2.0 License](LICENSE).
209
230
 
210
231
  ## πŸ‘¨β€πŸ’» Author
211
232
 
212
- Made with ❀️ by [Priyanshu Patel](https://github.com/sammy-cool/customizable-toast-notification)
233
+ **Priyanshu Patel**
234
+
235
+ - πŸ“§ Email: priyanshu.alt191@gmail.com
236
+ - πŸ™ GitHub: [@sammy-cool](https://github.com/sammy-cool)
237
+
238
+ ---
239
+
240
+ ## πŸ’– Support
241
+
242
+ If this library helped your project, please consider:
243
+
244
+ ⭐ **Star this repository** to show your support!
245
+
246
+ πŸ’Œ **Share feedback** at priyanshu.alt191@gmail.com
247
+
248
+ β˜• **Buy me a coffee** if you'd like to support development:
249
+
250
+ - 🌐 PayPal: [paypal.me/priyanshupatel1](https://paypal.me/priyanshupatel1)
251
+ - πŸ’³ UPI: `eureka91@upi`
252
+
253
+ <details>
254
+ <summary>πŸ“± Support via QR Code</summary>
255
+
256
+ ![Support QR](https://github.com/sammy-cool/support_qr/blob/eb14a600e04dc48dacab11e22cd28f18a31f7a12/support_qr.png)
257
+
258
+ </details>
259
+
260
+ **Thank you for your support! πŸ™**
261
+
262
+ ---
213
263
 
214
- Feel free to ⭐ this repository if you found it helpful!
264
+ _Made with ❀️ for the JavaScript community_
@@ -1,20 +1,13 @@
1
- /**
2
- * @fileoverview A simple toast notification library for any JavaScript framework.
3
- * @name Customizable Toast Notifications
4
- * @author Priyanshu Patel
5
- * @version "3.3.1"
6
- * @build Production
7
- * @license Apache-2.0
8
- * @depends None
9
- * @description A lightweight and fully customizable toast notification library
10
- * designed for seamless integration with any JavaScript or framework-based UI.
11
- * Supports flexible positioning, theming, icons, animations, and timing options
12
- * out of the box β€” with zero dependencies.
1
+ /*!
2
+ * Customizable Toast Notifications 3.4.0
3
+ * Build: 2025-07-19 18:22:36
4
+ * Cache-Buster: 1752949356123
13
5
  * Author: Priyanshu Patel
14
6
  * Email: priyanshu.alt191@gmail.com
15
- * Created: July 31, 2024
16
7
  * License: Apache-2.0
17
8
  * Dependencies: None
9
+ * Created: July 31, 2024
10
+ * A lightweight toast notification library for any JavaScript framework
18
11
  */
19
- let t={info:"blue",success:"green",error:"red",warning:"darkorange"},e={info:"This is an info message.",success:"Action completed successfully!",error:"An error occurred!",warning:"This is a warning message!"},o=!1;function n(t,e,n,s,i,r,a,l,c,d,p){const u=document.createElement("div");if(u.textContent=t,u.style.background=e,u.style.color=n,u.style.padding="10px 20px",u.style.marginTop="10px",u.style.borderRadius="5px",u.style.boxShadow="0 0 10px rgba(0, 0, 0, 0.1)",u.style.opacity="0",u.style.transition=`opacity ${s} ${i}`,u.style.position="relative",u.style.overflow="hidden",r&&function(t,e){const n=document.createElement("button");n.textContent="Γ—",n.style.marginLeft="10px",n.style.background="transparent",n.style.border="none",n.style.color=e,n.style.cursor="pointer",n.onclick=()=>{t.style.opacity="0",t.addEventListener("transitionend",()=>{t.remove(),o=!1})},t.appendChild(n)}(u,n),a){const t=document.createElement("div");t.style.position="absolute",t.style["top"===d?"top":"bottom"]="0",t.style.left="0",t.style.height=c||"4px",t.style.backgroundColor=l||n,t.style.width="100%",t.style.transition=`width ${p}ms linear`,requestAnimationFrame(()=>{t.style.width="0%"}),u.appendChild(t)}return u}function s({message:s,duration:i,position:r,type:a,backgroundColor:l,textColor:c,showCloseButton:d,animationDuration:p,animationEasing:u,showProgressBar:y,progressColor:g,progressHeight:m,progressPosition:f}){if(o)return;o=!0;const h=s||e[a]||"This is a default message.",b=l||t[a]||"gray",x=c||("white"===b?"black":"white"),C=function(t){let e=document.getElementById(`toast-container-${t}`);return e||(e=document.createElement("div"),e.id=`toast-container-${t}`,e.style.position="fixed",e.style.zIndex="9999",function(t,e){e.includes("bottom")?t.style.bottom="10px":e.includes("top")&&(t.style.top="10px"),e.includes("right")?t.style.right="10px":e.includes("left")?t.style.left="10px":e.includes("center")&&(t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%)")}(e,t),document.body.appendChild(e)),e}(r),w=n(h,b,x,p||"0.5s",u||"ease",d,y,g,m,f,i||3e3);C.appendChild(w),requestAnimationFrame(()=>{w.style.opacity="1"}),setTimeout(()=>{w.parentNode&&(w.style.opacity="0",w.addEventListener("transitionend",()=>{w.remove(),o=!1}))},i||3e3)}function i(t){if("object"!=typeof t)return;const{message:e,duration:o,position:n="bottom-right",type:i="info",backgroundColor:r,textColor:a,showCloseButton:l=!1,animationDuration:c,animationEasing:d,showProgressBar:p=!1,progressColor:u,progressHeight:y="4px",progressPosition:g="bottom"}=t;s({message:e,duration:o||3e3,position:n,type:i,backgroundColor:r,textColor:a,showCloseButton:l,animationDuration:c,animationEasing:d,showProgressBar:p,progressColor:u,progressHeight:y,progressPosition:g})}function r(e){"object"==typeof e&&Object.assign(t,e)}function a(t){"object"==typeof t&&Object.assign(e,t)}export{i as createToast,r as setDefaultColors,a as setDefaultMessages};
12
+ function t(t="toast"){return`${t}-${Date.now()}-${Math.floor(1e5*Math.random())}`}function e(t){if(!t)return!0;try{if(t.parentNode)return t.parentNode.removeChild(t),!0}catch(e){try{if(t.remove)return t.remove(),!0}catch(e){try{return t.style.display="none",t.style.opacity="0",t.style.pointerEvents="none",t.style.position="absolute",t.style.left="-9999px",!0}catch(t){return!1}}}return!0}function n(t){try{let e=document.getElementById(`toast-container-${t}`);return e||(e=document.createElement("div"),e.id=`toast-container-${t}`,e.style.position="fixed",e.style.zIndex="9999",function(t,e){t.style.top="auto",t.style.bottom="auto",t.style.left="auto",t.style.right="auto",t.style.transform="none",e.includes("bottom")?t.style.bottom="10px":e.includes("top")&&(t.style.top="10px"),e.includes("right")?t.style.right="10px":e.includes("left")?t.style.left="10px":e.includes("center")&&(t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%)")}(e,t),function(t,e){if(!t||!e)return!1;try{return t.contains(e)||t.appendChild(e),!0}catch(n){try{return t.insertAdjacentElement("beforeend",e),!0}catch(n){try{if(t===document.body)return e.style.position="fixed",e.style.top="10px",e.style.right="10px",e.style.zIndex="99999",document.body.insertAdjacentHTML("beforeend",e.outerHTML||""),!0}catch(t){return!1}}}}(document.body,e)),e}catch(t){return document.body}}function o(t,e,n){const o=function(t){try{if("number"==typeof t&&t>0)return t;if("string"==typeof t){if(t.endsWith("s")&&!t.endsWith("ms")){const e=1e3*parseFloat(t);return e>0?e:500}const e=parseFloat(t);return e>0?e:500}}catch(t){}return 500}(e.animationDuration||"0.5s");Object.assign(t.style,{background:e.backgroundColor||e.color||"#333",color:e.textColor||"white",padding:"12px 20px",marginBottom:"10px",borderRadius:"5px",display:"flex",alignItems:"center",justifyContent:"space-between",boxShadow:"0 4px 6px rgba(0, 0, 0, 0.1)",minWidth:"250px",maxWidth:"400px",opacity:"0",position:"relative",transition:`opacity ${e.animationDuration||"0.5s"} ${e.animationEasing||"ease"}, transform ${e.animationDuration||"0.5s"} ${e.animationEasing||"ease"}`,transform:"translateY(20px)",zIndex:"9999"}),t._animationDuration=o;const r=document.createElement("span");r.textContent=e.message||"Notification",r.style.flex="1",t.appendChild(r),e.showCloseButton&&function(t,e,n){const o=document.createElement("button");o.innerHTML="&times;",Object.assign(o.style,{background:"none",border:"none",color:e.textColor||"white",fontSize:"18px",marginLeft:"10px",cursor:"pointer"}),o.onclick=()=>n(t),t.appendChild(o),t._cleanupCloseButton=()=>{o.onclick=null}}(t,e,n),e.showProgressBar&&function(t,e){const n=document.createElement("div");Object.assign(n.style,{position:"absolute",left:"0",height:e.progressHeight||"4px",background:e.progressColor||"rgba(255, 255, 255, 0.3)",width:"100%",transition:`width ${e.duration||3e3}ms linear`,["top"===e.progressPosition?"top":"bottom"]:"0"}),t.appendChild(n),setTimeout(()=>{!function(t){try{return t?.offsetWidth||0}catch(t){return 0}}(n),n.style.width="0%"},100)}(t,e),function(t){setTimeout(()=>{t.style.opacity="1",t.style.transform="translateY(0)"},50)}(t)}function r(e,n){let r,i=!1;try{r=function(e,n){try{const o=document.createElement(e);return o.id=t(n),o}catch(o){try{const o=document.createElement("div");return o.id=t(n||"fallback"),o.setAttribute("data-original-tag",e),o}catch(e){return{id:t(n||"emergency"),style:{},appendChild:()=>{},setAttribute:()=>{},innerHTML:"",textContent:"",onclick:null,_isEmergencyElement:!0}}}}("div","toast"),r._isEmergencyElement&&(i=!0)}catch(t){i=!0,r={id:`emergency-toast-${Date.now()}`,style:{},appendChild:()=>{},innerHTML:"",textContent:"",_isEmergencyElement:!0}}if(!i)try{return o(r,e,n),r}catch(t){i=!0}if(i&&!r._isEmergencyElement)try{return function(t,e,n){Object.assign(t.style,{background:"#333",color:"white",padding:"10px 15px",margin:"10px",borderRadius:"3px",position:"fixed",top:"20px",right:"20px",zIndex:"99999",maxWidth:"300px",wordWrap:"break-word"}),t.textContent=e.message||"Notification",e.showCloseButton&&(t.style.cursor="pointer",t.onclick=()=>n(t)),t._animationDuration=500}(r,e,n),r}catch(t){}return function(t,e){try{const n=document.createElement("div");return n.id=`emergency-${Date.now()}`,n.innerHTML=`\n <div style="\n background: #333 !important;\n color: white !important;\n padding: 10px 15px !important;\n position: fixed !important;\n top: 20px !important;\n right: 20px !important;\n z-index: 99999 !important;\n border-radius: 3px !important;\n max-width: 250px !important;\n word-wrap: break-word !important;\n font-family: Arial, sans-serif !important;\n font-size: 14px !important;\n box-shadow: 0 2px 10px rgba(0,0,0,0.3) !important;\n cursor: pointer !important;\n " onclick="this.parentNode.removeChild(this)">\n ${t.message||"Notification"}\n <span style="float: right; margin-left: 10px; font-weight: bold;">&times;</span>\n </div>\n `,n._animationDuration=500,n._isEmergencyToast=!0,setTimeout(()=>{try{n.parentNode&&n.parentNode.removeChild(n),e(n)}catch(t){}},t.duration||3e3),n}catch(n){return setTimeout(()=>{try{alert(t.message||"Toast Notification"),e(null)}catch(t){e(null)}},100),null}}(e,n)}let i=!1,a=null,s=new Set,c=!1;function l(t){if(!i){i=!0;try{const e=n(t.position),o=r(t,p);if(!o)throw new Error("Toast creation returned null");a=o,e.appendChild?e.appendChild(o):document.body.appendChild(o);const i=setTimeout(()=>{p(o)},t.duration||3e3);return s.add(i),void function(t){if(c)return;c=!0;const e=setTimeout(()=>{m()},2.5*t);s.add(e)}(t.duration||3e3)}catch(t){}try{const e=function(t){const e=document.createElement("div");return e.style.cssText="\n position: fixed !important;\n top: 20px !important;\n right: 20px !important;\n background: #333 !important;\n color: white !important;\n padding: 12px 20px !important;\n border-radius: 5px !important;\n z-index: 99999 !important;\n max-width: 300px !important;\n font-family: Arial, sans-serif !important;\n cursor: pointer !important;\n ",e.textContent=t.message||"Notification",e.onclick=()=>p(e),e}(t);return a=e,document.body.appendChild(e),void setTimeout(()=>{p(e)},t.duration||3e3)}catch(t){}try{alert(t.message||"Notification"),i=!1}catch(t){i=!1}}}function p(t){try{if(!t)return void d();if(t.style&&!t._isEmergencyToast){t.style.opacity="0",t.style.transform="translateY(-20px)";const e=t._animationDuration||500;setTimeout(()=>{u(t)},e)}else u(t)}catch(t){m()}}function u(t){try{t._cleanupCloseButton&&t._cleanupCloseButton(),e(t),d()}catch(t){m()}}function d(){i=!1,a=null,s.forEach(t=>{try{clearTimeout(t)}catch(t){}}),s.clear(),c=!1}function m(){try{a&&e(a);document.querySelectorAll('[id*="toast"], [id*="emergency"]').forEach(t=>{try{e(t)}catch(t){}}),d()}catch(t){i=!1,a=null}}let y={success:"#28a745",error:"#dc3545",warning:"#ffc107",info:"#17a2b8"},f={success:"Operation completed successfully!",error:"Something went wrong!",warning:"Warning message!",info:"Information message!"};function h(t={}){try{const e=function(t){const e={duration:3e3,position:"bottom-right",type:"info",backgroundColor:void 0,textColor:"white",showCloseButton:!1,animationDuration:"0.5s",animationEasing:"ease",showProgressBar:!1,progressColor:void 0,progressHeight:"4px",progressPosition:"bottom"};let n={...e};t&&"object"==typeof t&&!Array.isArray(t)&&(Object.keys(e).forEach(e=>{t.hasOwnProperty(e)&&(n[e]=t[e])}),void 0!==t.message&&(n.message=t.message));try{!n.backgroundColor&&n.type&&y[n.type]&&(n.backgroundColor=y[n.type]),!n.message&&n.type&&f[n.type]&&(n.message=f[n.type])}catch(t){}n.message&&"string"==typeof n.message||(n.message="Notification");("number"!=typeof n.duration||n.duration<100)&&(n.duration=3e3);return n}(t);l(e)}catch(e){const n="string"==typeof t?.message?t.message.substring(0,200):"Toast notification failed";try{alert(n)}catch(t){}}}function g(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(y={...y,...t})}catch(t){}}function x(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(f={...f,...t})}catch(t){}}try{"undefined"!=typeof window&&(window.customizableToast={createToast:h,setDefaultColors:g,setDefaultMessages:x})}catch(t){}export{h as createToast,g as setDefaultColors,x as setDefaultMessages};
20
13
  //# sourceMappingURL=index.esm.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.esm.mjs","sources":["../src/index.js"],"sourcesContent":["\"use strict\";\r\n\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/**\r\n * Creates a toast notification.\r\n *\r\n * @param {Object} options - Options for the toast notification.\r\n * @param {string} [options.message] - The message to display in the toast. Defaults based on type if not provided.\r\n * @param {number} [options.duration=3000] - The duration the toast should be displayed, in milliseconds.\r\n * @param {string} [options.position='bottom-right'] - The position of the toast on the screen.\r\n * @param {string} [options.type='info'] - The type of the toast ('info', 'success', 'error', 'warning').\r\n * @param {string} [options.backgroundColor] - Custom background color for the toast notification.\r\n * @param {string} [options.textColor='white'] - Custom text color for the toast notification.\r\n * @param {string} [options.animationDuration='0.5s'] - Duration of the fade-in and fade-out animations.\r\n * @param {string} [options.animationEasing='ease'] - Easing function for the animations.\r\n * @param {boolean} [options.showCloseButton=false] - Whether to show a close button.\r\n * @return {void}\r\n */\r\n\r\n/** ########################################### Defaults ############################################ */\r\n\r\nconsole.log(\"Before toast creation\");\r\n\r\nlet defaultColors = {\r\n info: \"blue\",\r\n success: \"green\",\r\n error: \"red\",\r\n warning: \"darkorange\",\r\n};\r\n\r\nlet defaultMessages = {\r\n info: \"This is an info message.\",\r\n success: \"Action completed successfully!\",\r\n error: \"An error occurred!\",\r\n warning: \"This is a warning message!\",\r\n};\r\n\r\n// Flag to manage if a toast is currently being shown\r\nlet isToastShowing = false;\r\n\r\nfunction createToastContainer(position) {\r\n let toastContainer = document.getElementById(`toast-container-${position}`);\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 document.body.appendChild(toastContainer);\r\n }\r\n return toastContainer;\r\n}\r\n\r\nfunction setPosition(container, position) {\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\r\nfunction createToastElement(\r\n finalMessage,\r\n backgroundColor,\r\n textColor,\r\n animationDuration,\r\n animationEasing,\r\n showCloseButton,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n duration\r\n) {\r\n const toast = document.createElement(\"div\");\r\n toast.textContent = finalMessage;\r\n toast.style.background = backgroundColor;\r\n toast.style.color = textColor;\r\n toast.style.padding = \"10px 20px\";\r\n toast.style.marginTop = \"10px\";\r\n toast.style.borderRadius = \"5px\";\r\n toast.style.boxShadow = \"0 0 10px rgba(0, 0, 0, 0.1)\";\r\n toast.style.opacity = \"0\";\r\n toast.style.transition = `opacity ${animationDuration} ${animationEasing}`;\r\n toast.style.position = \"relative\";\r\n toast.style.overflow = \"hidden\";\r\n\r\n if (showCloseButton) {\r\n addCloseButton(toast, textColor);\r\n }\r\n\r\n if (showProgressBar) {\r\n const progressBar = document.createElement(\"div\");\r\n progressBar.style.position = \"absolute\";\r\n progressBar.style[progressPosition === \"top\" ? \"top\" : \"bottom\"] = \"0\";\r\n progressBar.style.left = \"0\";\r\n progressBar.style.height = progressHeight || \"4px\";\r\n progressBar.style.backgroundColor = progressColor || textColor;\r\n progressBar.style.width = \"100%\";\r\n progressBar.style.transition = `width ${duration}ms linear`;\r\n\r\n // Trigger animation\r\n requestAnimationFrame(() => {\r\n progressBar.style.width = \"0%\";\r\n });\r\n\r\n toast.appendChild(progressBar);\r\n }\r\n\r\n return toast;\r\n}\r\n\r\nfunction addCloseButton(toast, textColor) {\r\n const closeButton = document.createElement(\"button\");\r\n closeButton.textContent = \"Γ—\";\r\n closeButton.style.marginLeft = \"10px\";\r\n closeButton.style.background = \"transparent\";\r\n closeButton.style.border = \"none\";\r\n closeButton.style.color = textColor;\r\n closeButton.style.cursor = \"pointer\";\r\n\r\n closeButton.onclick = () => {\r\n toast.style.opacity = \"0\"; // Start fade out\r\n toast.addEventListener(\"transitionend\", () => {\r\n toast.remove();\r\n isToastShowing = false; // Reset the flag when the toast is removed\r\n });\r\n };\r\n\r\n toast.appendChild(closeButton);\r\n}\r\n\r\nfunction showToast({\r\n message,\r\n duration,\r\n position,\r\n type,\r\n backgroundColor,\r\n textColor,\r\n showCloseButton,\r\n animationDuration,\r\n animationEasing,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n}) {\r\n if (isToastShowing) return;\r\n isToastShowing = true;\r\n\r\n const finalMessage =\r\n message || defaultMessages[type] || \"This is a default message.\";\r\n const toastBackgroundColor = backgroundColor || defaultColors[type] || \"gray\";\r\n const toastTextColor =\r\n textColor || (toastBackgroundColor === \"white\" ? \"black\" : \"white\");\r\n\r\n const toastContainer = createToastContainer(position);\r\n const toast = createToastElement(\r\n finalMessage,\r\n toastBackgroundColor,\r\n toastTextColor,\r\n animationDuration || \"0.5s\",\r\n animationEasing || \"ease\",\r\n showCloseButton,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n duration || 3000\r\n );\r\n\r\n toastContainer.appendChild(toast);\r\n requestAnimationFrame(() => {\r\n toast.style.opacity = \"1\";\r\n });\r\n\r\n setTimeout(() => {\r\n if (toast.parentNode) {\r\n toast.style.opacity = \"0\";\r\n toast.addEventListener(\"transitionend\", () => {\r\n toast.remove();\r\n isToastShowing = false;\r\n });\r\n }\r\n }, duration || 3000);\r\n}\r\n\r\n/**\r\n * Create a toast notification with the provided options.\r\n *\r\n * @param {Object} options - Options for the toast notification.\r\n * @param {string} [options.message] - The message to display in the toast.\r\n * @param {number} [options.duration=3000] - The duration of the toast in milliseconds.\r\n * @param {string} [options.position='bottom-right'] - The position of the toast.\r\n * @param {string} [options.type='info'] - The type of the toast.\r\n * @param {string} [options.backgroundColor] - The custom background color.\r\n * @param {string} [options.textColor='white'] - The custom text color.\r\n * @param {boolean} [options.showCloseButton=false] - Whether to show a close button.\r\n * @param {string} [options.animationDuration='0.5s'] - Duration of animations.\r\n * @param {string} [options.animationEasing='ease'] - Easing function for animations.\r\n * @param {boolean} [options.showProgressBar=false] - Show a visual progress bar.\r\n * @param {string} [options.progressColor] - Color of the progress bar.\r\n * @param {string} [options.progressHeight='4px'] - Height of the progress bar.\r\n * @param {string} [options.progressPosition='bottom'] - 'top' or 'bottom' placement of the progress bar.\r\n * @return {void}\r\n */\r\nfunction createToast(options) {\r\n if (typeof options !== \"object\") {\r\n console.error(\"Options should be an object.\");\r\n return;\r\n }\r\n\r\n const {\r\n message,\r\n duration,\r\n position = \"bottom-right\",\r\n type = \"info\",\r\n backgroundColor,\r\n textColor,\r\n showCloseButton = false,\r\n animationDuration,\r\n animationEasing,\r\n showProgressBar = false,\r\n progressColor,\r\n progressHeight = \"4px\",\r\n progressPosition = \"bottom\",\r\n } = options;\r\n\r\n if (duration && typeof duration !== \"number\") {\r\n console.warn(\"Duration should be a number. Falling back to default value.\");\r\n }\r\n\r\n showToast({\r\n message,\r\n duration: duration || 3000,\r\n position,\r\n type,\r\n backgroundColor,\r\n textColor,\r\n showCloseButton,\r\n animationDuration,\r\n animationEasing,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n });\r\n}\r\n\r\n/**\r\n * Set default colors for toast types.\r\n *\r\n * @param {Object} newColors - New colors to set for toast types.\r\n * @return {void}\r\n */\r\nfunction setDefaultColors(newColors) {\r\n // Validate newColors\r\n if (typeof newColors !== \"object\") {\r\n console.error(\"New colors should be an object.\");\r\n return;\r\n }\r\n\r\n Object.assign(defaultColors, newColors);\r\n}\r\n\r\n/**\r\n * Set default messages for toast types.\r\n *\r\n * @param {Object} newMessages - New messages to set for toast types.\r\n * @return {void}\r\n */\r\nfunction setDefaultMessages(newMessages) {\r\n // Validate newMessages\r\n if (typeof newMessages !== \"object\") {\r\n console.error(\"New messages should be an object.\");\r\n return;\r\n }\r\n\r\n Object.assign(defaultMessages, newMessages);\r\n}\r\n\r\nexport { createToast, setDefaultColors, setDefaultMessages };\r\n\r\nconsole.log(\"After toast creation\");\r\n"],"names":["defaultColors","info","success","error","warning","defaultMessages","isToastShowing","createToastElement","finalMessage","backgroundColor","textColor","animationDuration","animationEasing","showCloseButton","showProgressBar","progressColor","progressHeight","progressPosition","duration","toast","document","createElement","textContent","style","background","color","padding","marginTop","borderRadius","boxShadow","opacity","transition","position","overflow","closeButton","marginLeft","border","cursor","onclick","addEventListener","remove","appendChild","addCloseButton","progressBar","left","height","width","requestAnimationFrame","showToast","message","type","toastBackgroundColor","toastTextColor","toastContainer","getElementById","id","zIndex","container","includes","bottom","top","right","transform","setPosition","body","createToastContainer","setTimeout","parentNode","createToast","options","setDefaultColors","newColors","Object","assign","setDefaultMessages","newMessages"],"mappings":"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"}
1
+ {"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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"}
package/dist/index.umd.js CHANGED
@@ -1,20 +1,13 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).customizableToast={})}(this,function(e){"use strict";
2
- /**
3
- * @fileoverview A simple toast notification library for any JavaScript framework.
4
- * @name Customizable Toast Notifications
5
- * @author Priyanshu Patel
6
- * @version "3.3.1"
7
- * @build Production
8
- * @license Apache-2.0
9
- * @depends None
10
- * @description A lightweight and fully customizable toast notification library
11
- * designed for seamless integration with any JavaScript or framework-based UI.
12
- * Supports flexible positioning, theming, icons, animations, and timing options
13
- * out of the box β€” with zero dependencies.
14
- * Author: Priyanshu Patel
15
- * Email: priyanshu.alt191@gmail.com
16
- * Created: July 31, 2024
17
- * License: Apache-2.0
18
- * Dependencies: None
19
- */let t={info:"blue",success:"green",error:"red",warning:"darkorange"},o={info:"This is an info message.",success:"Action completed successfully!",error:"An error occurred!",warning:"This is a warning message!"},s=!1;function n(e,t,o,n,i,r,a,l,c,d,p){const u=document.createElement("div");if(u.textContent=e,u.style.background=t,u.style.color=o,u.style.padding="10px 20px",u.style.marginTop="10px",u.style.borderRadius="5px",u.style.boxShadow="0 0 10px rgba(0, 0, 0, 0.1)",u.style.opacity="0",u.style.transition=`opacity ${n} ${i}`,u.style.position="relative",u.style.overflow="hidden",r&&function(e,t){const o=document.createElement("button");o.textContent="Γ—",o.style.marginLeft="10px",o.style.background="transparent",o.style.border="none",o.style.color=t,o.style.cursor="pointer",o.onclick=()=>{e.style.opacity="0",e.addEventListener("transitionend",()=>{e.remove(),s=!1})},e.appendChild(o)}(u,o),a){const e=document.createElement("div");e.style.position="absolute",e.style["top"===d?"top":"bottom"]="0",e.style.left="0",e.style.height=c||"4px",e.style.backgroundColor=l||o,e.style.width="100%",e.style.transition=`width ${p}ms linear`,requestAnimationFrame(()=>{e.style.width="0%"}),u.appendChild(e)}return u}function i({message:e,duration:i,position:r,type:a,backgroundColor:l,textColor:c,showCloseButton:d,animationDuration:p,animationEasing:u,showProgressBar:y,progressColor:g,progressHeight:f,progressPosition:m}){if(s)return;s=!0;const h=e||o[a]||"This is a default message.",b=l||t[a]||"gray",x=c||("white"===b?"black":"white"),C=function(e){let t=document.getElementById(`toast-container-${e}`);return t||(t=document.createElement("div"),t.id=`toast-container-${e}`,t.style.position="fixed",t.style.zIndex="9999",function(e,t){t.includes("bottom")?e.style.bottom="10px":t.includes("top")&&(e.style.top="10px"),t.includes("right")?e.style.right="10px":t.includes("left")?e.style.left="10px":t.includes("center")&&(e.style.top="50%",e.style.left="50%",e.style.transform="translate(-50%, -50%)")}(t,e),document.body.appendChild(t)),t}(r),w=n(h,b,x,p||"0.5s",u||"ease",d,y,g,f,m,i||3e3);C.appendChild(w),requestAnimationFrame(()=>{w.style.opacity="1"}),setTimeout(()=>{w.parentNode&&(w.style.opacity="0",w.addEventListener("transitionend",()=>{w.remove(),s=!1}))},i||3e3)}e.createToast=function(e){if("object"!=typeof e)return;const{message:t,duration:o,position:s="bottom-right",type:n="info",backgroundColor:r,textColor:a,showCloseButton:l=!1,animationDuration:c,animationEasing:d,showProgressBar:p=!1,progressColor:u,progressHeight:y="4px",progressPosition:g="bottom"}=e;i({message:t,duration:o||3e3,position:s,type:n,backgroundColor:r,textColor:a,showCloseButton:l,animationDuration:c,animationEasing:d,showProgressBar:p,progressColor:u,progressHeight:y,progressPosition:g})},e.setDefaultColors=function(e){"object"==typeof e&&Object.assign(t,e)},e.setDefaultMessages=function(e){"object"==typeof e&&Object.assign(o,e)},Object.defineProperty(e,"__esModule",{value:!0})});
1
+ /*!
2
+ * Customizable Toast Notifications 3.4.0
3
+ * Build: 2025-07-19 18:22:36
4
+ * Cache-Buster: 1752949356123
5
+ * Author: Priyanshu Patel
6
+ * Email: priyanshu.alt191@gmail.com
7
+ * License: Apache-2.0
8
+ * Dependencies: None
9
+ * Created: July 31, 2024
10
+ * A lightweight toast notification library for any JavaScript framework
11
+ */
12
+ !function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).customizableToast={})}(this,function(t){"use strict";function e(t="toast"){return`${t}-${Date.now()}-${Math.floor(1e5*Math.random())}`}function n(t){if(!t)return!0;try{if(t.parentNode)return t.parentNode.removeChild(t),!0}catch(e){try{if(t.remove)return t.remove(),!0}catch(e){try{return t.style.display="none",t.style.opacity="0",t.style.pointerEvents="none",t.style.position="absolute",t.style.left="-9999px",!0}catch(t){return!1}}}return!0}function o(t){try{let e=document.getElementById(`toast-container-${t}`);return e||(e=document.createElement("div"),e.id=`toast-container-${t}`,e.style.position="fixed",e.style.zIndex="9999",function(t,e){t.style.top="auto",t.style.bottom="auto",t.style.left="auto",t.style.right="auto",t.style.transform="none",e.includes("bottom")?t.style.bottom="10px":e.includes("top")&&(t.style.top="10px"),e.includes("right")?t.style.right="10px":e.includes("left")?t.style.left="10px":e.includes("center")&&(t.style.top="50%",t.style.left="50%",t.style.transform="translate(-50%, -50%)")}(e,t),function(t,e){if(!t||!e)return!1;try{return t.contains(e)||t.appendChild(e),!0}catch(n){try{return t.insertAdjacentElement("beforeend",e),!0}catch(n){try{if(t===document.body)return e.style.position="fixed",e.style.top="10px",e.style.right="10px",e.style.zIndex="99999",document.body.insertAdjacentHTML("beforeend",e.outerHTML||""),!0}catch(t){return!1}}}}(document.body,e)),e}catch(t){return document.body}}function r(t,e,n){const o=function(t){try{if("number"==typeof t&&t>0)return t;if("string"==typeof t){if(t.endsWith("s")&&!t.endsWith("ms")){const e=1e3*parseFloat(t);return e>0?e:500}const e=parseFloat(t);return e>0?e:500}}catch(t){}return 500}(e.animationDuration||"0.5s");Object.assign(t.style,{background:e.backgroundColor||e.color||"#333",color:e.textColor||"white",padding:"12px 20px",marginBottom:"10px",borderRadius:"5px",display:"flex",alignItems:"center",justifyContent:"space-between",boxShadow:"0 4px 6px rgba(0, 0, 0, 0.1)",minWidth:"250px",maxWidth:"400px",opacity:"0",position:"relative",transition:`opacity ${e.animationDuration||"0.5s"} ${e.animationEasing||"ease"}, transform ${e.animationDuration||"0.5s"} ${e.animationEasing||"ease"}`,transform:"translateY(20px)",zIndex:"9999"}),t._animationDuration=o;const r=document.createElement("span");r.textContent=e.message||"Notification",r.style.flex="1",t.appendChild(r),e.showCloseButton&&function(t,e,n){const o=document.createElement("button");o.innerHTML="&times;",Object.assign(o.style,{background:"none",border:"none",color:e.textColor||"white",fontSize:"18px",marginLeft:"10px",cursor:"pointer"}),o.onclick=()=>n(t),t.appendChild(o),t._cleanupCloseButton=()=>{o.onclick=null}}(t,e,n),e.showProgressBar&&function(t,e){const n=document.createElement("div");Object.assign(n.style,{position:"absolute",left:"0",height:e.progressHeight||"4px",background:e.progressColor||"rgba(255, 255, 255, 0.3)",width:"100%",transition:`width ${e.duration||3e3}ms linear`,["top"===e.progressPosition?"top":"bottom"]:"0"}),t.appendChild(n),setTimeout(()=>{!function(t){try{return t?.offsetWidth||0}catch(t){return 0}}(n),n.style.width="0%"},100)}(t,e),function(t){setTimeout(()=>{t.style.opacity="1",t.style.transform="translateY(0)"},50)}(t)}function i(t,n){let o,i=!1;try{o=function(t,n){try{const o=document.createElement(t);return o.id=e(n),o}catch(o){try{const o=document.createElement("div");return o.id=e(n||"fallback"),o.setAttribute("data-original-tag",t),o}catch(t){return{id:e(n||"emergency"),style:{},appendChild:()=>{},setAttribute:()=>{},innerHTML:"",textContent:"",onclick:null,_isEmergencyElement:!0}}}}("div","toast"),o._isEmergencyElement&&(i=!0)}catch(t){i=!0,o={id:`emergency-toast-${Date.now()}`,style:{},appendChild:()=>{},innerHTML:"",textContent:"",_isEmergencyElement:!0}}if(!i)try{return r(o,t,n),o}catch(t){i=!0}if(i&&!o._isEmergencyElement)try{return function(t,e,n){Object.assign(t.style,{background:"#333",color:"white",padding:"10px 15px",margin:"10px",borderRadius:"3px",position:"fixed",top:"20px",right:"20px",zIndex:"99999",maxWidth:"300px",wordWrap:"break-word"}),t.textContent=e.message||"Notification",e.showCloseButton&&(t.style.cursor="pointer",t.onclick=()=>n(t)),t._animationDuration=500}(o,t,n),o}catch(t){}return function(t,e){try{const n=document.createElement("div");return n.id=`emergency-${Date.now()}`,n.innerHTML=`\n <div style="\n background: #333 !important;\n color: white !important;\n padding: 10px 15px !important;\n position: fixed !important;\n top: 20px !important;\n right: 20px !important;\n z-index: 99999 !important;\n border-radius: 3px !important;\n max-width: 250px !important;\n word-wrap: break-word !important;\n font-family: Arial, sans-serif !important;\n font-size: 14px !important;\n box-shadow: 0 2px 10px rgba(0,0,0,0.3) !important;\n cursor: pointer !important;\n " onclick="this.parentNode.removeChild(this)">\n ${t.message||"Notification"}\n <span style="float: right; margin-left: 10px; font-weight: bold;">&times;</span>\n </div>\n `,n._animationDuration=500,n._isEmergencyToast=!0,setTimeout(()=>{try{n.parentNode&&n.parentNode.removeChild(n),e(n)}catch(t){}},t.duration||3e3),n}catch(n){return setTimeout(()=>{try{alert(t.message||"Toast Notification"),e(null)}catch(t){e(null)}},100),null}}(t,n)}let a=!1,s=null,c=new Set,l=!1;function u(t){if(!a){a=!0;try{const e=o(t.position),n=i(t,d);if(!n)throw new Error("Toast creation returned null");s=n,e.appendChild?e.appendChild(n):document.body.appendChild(n);const r=setTimeout(()=>{d(n)},t.duration||3e3);return c.add(r),void function(t){if(l)return;l=!0;const e=setTimeout(()=>{y()},2.5*t);c.add(e)}(t.duration||3e3)}catch(t){}try{const e=function(t){const e=document.createElement("div");return e.style.cssText="\n position: fixed !important;\n top: 20px !important;\n right: 20px !important;\n background: #333 !important;\n color: white !important;\n padding: 12px 20px !important;\n border-radius: 5px !important;\n z-index: 99999 !important;\n max-width: 300px !important;\n font-family: Arial, sans-serif !important;\n cursor: pointer !important;\n ",e.textContent=t.message||"Notification",e.onclick=()=>d(e),e}(t);return s=e,document.body.appendChild(e),void setTimeout(()=>{d(e)},t.duration||3e3)}catch(t){}try{alert(t.message||"Notification"),a=!1}catch(t){a=!1}}}function d(t){try{if(!t)return void m();if(t.style&&!t._isEmergencyToast){t.style.opacity="0",t.style.transform="translateY(-20px)";const e=t._animationDuration||500;setTimeout(()=>{p(t)},e)}else p(t)}catch(t){y()}}function p(t){try{t._cleanupCloseButton&&t._cleanupCloseButton(),n(t),m()}catch(t){y()}}function m(){a=!1,s=null,c.forEach(t=>{try{clearTimeout(t)}catch(t){}}),c.clear(),l=!1}function y(){try{s&&n(s);document.querySelectorAll('[id*="toast"], [id*="emergency"]').forEach(t=>{try{n(t)}catch(t){}}),m()}catch(t){a=!1,s=null}}let f={success:"#28a745",error:"#dc3545",warning:"#ffc107",info:"#17a2b8"},h={success:"Operation completed successfully!",error:"Something went wrong!",warning:"Warning message!",info:"Information message!"};function g(t={}){try{const e=function(t){const e={duration:3e3,position:"bottom-right",type:"info",backgroundColor:void 0,textColor:"white",showCloseButton:!1,animationDuration:"0.5s",animationEasing:"ease",showProgressBar:!1,progressColor:void 0,progressHeight:"4px",progressPosition:"bottom"};let n={...e};t&&"object"==typeof t&&!Array.isArray(t)&&(Object.keys(e).forEach(e=>{t.hasOwnProperty(e)&&(n[e]=t[e])}),void 0!==t.message&&(n.message=t.message));try{!n.backgroundColor&&n.type&&f[n.type]&&(n.backgroundColor=f[n.type]),!n.message&&n.type&&h[n.type]&&(n.message=h[n.type])}catch(t){}n.message&&"string"==typeof n.message||(n.message="Notification");("number"!=typeof n.duration||n.duration<100)&&(n.duration=3e3);return n}(t);u(e)}catch(e){const n="string"==typeof t?.message?t.message.substring(0,200):"Toast notification failed";try{alert(n)}catch(t){}}}function x(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(f={...f,...t})}catch(t){}}function b(t){try{t&&"object"==typeof t&&!Array.isArray(t)&&(h={...h,...t})}catch(t){}}try{"undefined"!=typeof window&&(window.customizableToast={createToast:g,setDefaultColors:x,setDefaultMessages:b})}catch(t){}t.createToast=g,t.setDefaultColors=x,t.setDefaultMessages=b,Object.defineProperty(t,"__esModule",{value:!0})});
20
13
  //# sourceMappingURL=index.umd.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.js","sources":["../src/index.js"],"sourcesContent":["\"use strict\";\r\n\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/**\r\n * Creates a toast notification.\r\n *\r\n * @param {Object} options - Options for the toast notification.\r\n * @param {string} [options.message] - The message to display in the toast. Defaults based on type if not provided.\r\n * @param {number} [options.duration=3000] - The duration the toast should be displayed, in milliseconds.\r\n * @param {string} [options.position='bottom-right'] - The position of the toast on the screen.\r\n * @param {string} [options.type='info'] - The type of the toast ('info', 'success', 'error', 'warning').\r\n * @param {string} [options.backgroundColor] - Custom background color for the toast notification.\r\n * @param {string} [options.textColor='white'] - Custom text color for the toast notification.\r\n * @param {string} [options.animationDuration='0.5s'] - Duration of the fade-in and fade-out animations.\r\n * @param {string} [options.animationEasing='ease'] - Easing function for the animations.\r\n * @param {boolean} [options.showCloseButton=false] - Whether to show a close button.\r\n * @return {void}\r\n */\r\n\r\n/** ########################################### Defaults ############################################ */\r\n\r\nconsole.log(\"Before toast creation\");\r\n\r\nlet defaultColors = {\r\n info: \"blue\",\r\n success: \"green\",\r\n error: \"red\",\r\n warning: \"darkorange\",\r\n};\r\n\r\nlet defaultMessages = {\r\n info: \"This is an info message.\",\r\n success: \"Action completed successfully!\",\r\n error: \"An error occurred!\",\r\n warning: \"This is a warning message!\",\r\n};\r\n\r\n// Flag to manage if a toast is currently being shown\r\nlet isToastShowing = false;\r\n\r\nfunction createToastContainer(position) {\r\n let toastContainer = document.getElementById(`toast-container-${position}`);\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 document.body.appendChild(toastContainer);\r\n }\r\n return toastContainer;\r\n}\r\n\r\nfunction setPosition(container, position) {\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\r\nfunction createToastElement(\r\n finalMessage,\r\n backgroundColor,\r\n textColor,\r\n animationDuration,\r\n animationEasing,\r\n showCloseButton,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n duration\r\n) {\r\n const toast = document.createElement(\"div\");\r\n toast.textContent = finalMessage;\r\n toast.style.background = backgroundColor;\r\n toast.style.color = textColor;\r\n toast.style.padding = \"10px 20px\";\r\n toast.style.marginTop = \"10px\";\r\n toast.style.borderRadius = \"5px\";\r\n toast.style.boxShadow = \"0 0 10px rgba(0, 0, 0, 0.1)\";\r\n toast.style.opacity = \"0\";\r\n toast.style.transition = `opacity ${animationDuration} ${animationEasing}`;\r\n toast.style.position = \"relative\";\r\n toast.style.overflow = \"hidden\";\r\n\r\n if (showCloseButton) {\r\n addCloseButton(toast, textColor);\r\n }\r\n\r\n if (showProgressBar) {\r\n const progressBar = document.createElement(\"div\");\r\n progressBar.style.position = \"absolute\";\r\n progressBar.style[progressPosition === \"top\" ? \"top\" : \"bottom\"] = \"0\";\r\n progressBar.style.left = \"0\";\r\n progressBar.style.height = progressHeight || \"4px\";\r\n progressBar.style.backgroundColor = progressColor || textColor;\r\n progressBar.style.width = \"100%\";\r\n progressBar.style.transition = `width ${duration}ms linear`;\r\n\r\n // Trigger animation\r\n requestAnimationFrame(() => {\r\n progressBar.style.width = \"0%\";\r\n });\r\n\r\n toast.appendChild(progressBar);\r\n }\r\n\r\n return toast;\r\n}\r\n\r\nfunction addCloseButton(toast, textColor) {\r\n const closeButton = document.createElement(\"button\");\r\n closeButton.textContent = \"Γ—\";\r\n closeButton.style.marginLeft = \"10px\";\r\n closeButton.style.background = \"transparent\";\r\n closeButton.style.border = \"none\";\r\n closeButton.style.color = textColor;\r\n closeButton.style.cursor = \"pointer\";\r\n\r\n closeButton.onclick = () => {\r\n toast.style.opacity = \"0\"; // Start fade out\r\n toast.addEventListener(\"transitionend\", () => {\r\n toast.remove();\r\n isToastShowing = false; // Reset the flag when the toast is removed\r\n });\r\n };\r\n\r\n toast.appendChild(closeButton);\r\n}\r\n\r\nfunction showToast({\r\n message,\r\n duration,\r\n position,\r\n type,\r\n backgroundColor,\r\n textColor,\r\n showCloseButton,\r\n animationDuration,\r\n animationEasing,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n}) {\r\n if (isToastShowing) return;\r\n isToastShowing = true;\r\n\r\n const finalMessage =\r\n message || defaultMessages[type] || \"This is a default message.\";\r\n const toastBackgroundColor = backgroundColor || defaultColors[type] || \"gray\";\r\n const toastTextColor =\r\n textColor || (toastBackgroundColor === \"white\" ? \"black\" : \"white\");\r\n\r\n const toastContainer = createToastContainer(position);\r\n const toast = createToastElement(\r\n finalMessage,\r\n toastBackgroundColor,\r\n toastTextColor,\r\n animationDuration || \"0.5s\",\r\n animationEasing || \"ease\",\r\n showCloseButton,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n duration || 3000\r\n );\r\n\r\n toastContainer.appendChild(toast);\r\n requestAnimationFrame(() => {\r\n toast.style.opacity = \"1\";\r\n });\r\n\r\n setTimeout(() => {\r\n if (toast.parentNode) {\r\n toast.style.opacity = \"0\";\r\n toast.addEventListener(\"transitionend\", () => {\r\n toast.remove();\r\n isToastShowing = false;\r\n });\r\n }\r\n }, duration || 3000);\r\n}\r\n\r\n/**\r\n * Create a toast notification with the provided options.\r\n *\r\n * @param {Object} options - Options for the toast notification.\r\n * @param {string} [options.message] - The message to display in the toast.\r\n * @param {number} [options.duration=3000] - The duration of the toast in milliseconds.\r\n * @param {string} [options.position='bottom-right'] - The position of the toast.\r\n * @param {string} [options.type='info'] - The type of the toast.\r\n * @param {string} [options.backgroundColor] - The custom background color.\r\n * @param {string} [options.textColor='white'] - The custom text color.\r\n * @param {boolean} [options.showCloseButton=false] - Whether to show a close button.\r\n * @param {string} [options.animationDuration='0.5s'] - Duration of animations.\r\n * @param {string} [options.animationEasing='ease'] - Easing function for animations.\r\n * @param {boolean} [options.showProgressBar=false] - Show a visual progress bar.\r\n * @param {string} [options.progressColor] - Color of the progress bar.\r\n * @param {string} [options.progressHeight='4px'] - Height of the progress bar.\r\n * @param {string} [options.progressPosition='bottom'] - 'top' or 'bottom' placement of the progress bar.\r\n * @return {void}\r\n */\r\nfunction createToast(options) {\r\n if (typeof options !== \"object\") {\r\n console.error(\"Options should be an object.\");\r\n return;\r\n }\r\n\r\n const {\r\n message,\r\n duration,\r\n position = \"bottom-right\",\r\n type = \"info\",\r\n backgroundColor,\r\n textColor,\r\n showCloseButton = false,\r\n animationDuration,\r\n animationEasing,\r\n showProgressBar = false,\r\n progressColor,\r\n progressHeight = \"4px\",\r\n progressPosition = \"bottom\",\r\n } = options;\r\n\r\n if (duration && typeof duration !== \"number\") {\r\n console.warn(\"Duration should be a number. Falling back to default value.\");\r\n }\r\n\r\n showToast({\r\n message,\r\n duration: duration || 3000,\r\n position,\r\n type,\r\n backgroundColor,\r\n textColor,\r\n showCloseButton,\r\n animationDuration,\r\n animationEasing,\r\n showProgressBar,\r\n progressColor,\r\n progressHeight,\r\n progressPosition,\r\n });\r\n}\r\n\r\n/**\r\n * Set default colors for toast types.\r\n *\r\n * @param {Object} newColors - New colors to set for toast types.\r\n * @return {void}\r\n */\r\nfunction setDefaultColors(newColors) {\r\n // Validate newColors\r\n if (typeof newColors !== \"object\") {\r\n console.error(\"New colors should be an object.\");\r\n return;\r\n }\r\n\r\n Object.assign(defaultColors, newColors);\r\n}\r\n\r\n/**\r\n * Set default messages for toast types.\r\n *\r\n * @param {Object} newMessages - New messages to set for toast types.\r\n * @return {void}\r\n */\r\nfunction setDefaultMessages(newMessages) {\r\n // Validate newMessages\r\n if (typeof newMessages !== \"object\") {\r\n console.error(\"New messages should be an object.\");\r\n return;\r\n }\r\n\r\n Object.assign(defaultMessages, newMessages);\r\n}\r\n\r\nexport { createToast, setDefaultColors, setDefaultMessages };\r\n\r\nconsole.log(\"After toast creation\");\r\n"],"names":["defaultColors","info","success","error","warning","defaultMessages","isToastShowing","createToastElement","finalMessage","backgroundColor","textColor","animationDuration","animationEasing","showCloseButton","showProgressBar","progressColor","progressHeight","progressPosition","duration","toast","document","createElement","textContent","style","background","color","padding","marginTop","borderRadius","boxShadow","opacity","transition","position","overflow","closeButton","marginLeft","border","cursor","onclick","addEventListener","remove","appendChild","addCloseButton","progressBar","left","height","width","requestAnimationFrame","showToast","message","type","toastBackgroundColor","toastTextColor","toastContainer","getElementById","id","zIndex","container","includes","bottom","top","right","transform","setPosition","body","createToastContainer","setTimeout","parentNode","options","newColors","Object","assign","newMessages"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.js","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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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "customizable-toast-notification",
3
- "version": "3.3.1",
4
- "description": "A lightweight and highly customizable toast notification library or component for modern web applications.",
3
+ "version": "3.4.1",
4
+ "description": "A lightweight, zero-dependency toast notification library for modern JavaScript applications with production-grade reliability and comprehensive system mechanisms",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
7
7
  "module": "dist/index.esm.mjs",
@@ -18,46 +18,48 @@
18
18
  "test": "echo \"Error: no test specified\" && exit 1"
19
19
  },
20
20
  "keywords": [
21
- "toast",
22
- "toast library",
23
- "toast notification",
24
- "toast ui",
25
- "toast alert",
26
- "toast message",
27
- "notification",
28
- "ui notification",
29
- "custom notification",
30
21
  "javascript",
31
- "javascript library",
32
- "popup",
33
- "popup notification",
22
+ "javascript-library",
23
+ "vanilla-js",
24
+ "notification",
25
+ "toast-notification",
26
+ "ui-component",
27
+ "zero-dependency",
28
+ "customizable",
29
+ "lightweight",
30
+ "production-ready",
31
+ "framework-agnostic",
32
+ "fallback-system",
34
33
  "alert",
35
- "frontend",
36
- "ui notification",
34
+ "popup",
35
+ "message",
37
36
  "library",
38
- "message popup",
39
- "npm library",
40
37
  "npm",
41
- "npm toast package",
42
- "customizable",
43
- "customizable toast notification",
38
+ "umd",
39
+ "esm",
40
+ "cjs",
41
+ "cdn",
42
+ "toast",
43
+ "toast-library",
44
+ "toast-alert",
45
+ "toast-message",
46
+ "custom-notification",
47
+ "popup-notification",
48
+ "frontend",
49
+ "message-popup",
50
+ "npm-library",
51
+ "npm-toast-package",
52
+ "customizable-toast-notification",
44
53
  "component",
45
- "toast component",
46
- "notification component",
54
+ "toast-component",
55
+ "notification-component",
47
56
  "customisable",
48
- "customisable toast notification",
49
- "react component",
50
- "react toast",
57
+ "customisable-toast-notification",
58
+ "react-component",
59
+ "react-toast",
51
60
  "frontend",
52
- "frontend library",
53
- "ESM",
54
- "CJS",
55
- "cdn",
56
- "umd",
57
- "notification",
58
- "custom-toast",
59
- "vanilla-js",
60
- "lightweight"
61
+ "frontend-library",
62
+ "custom-toast"
61
63
  ],
62
64
  "author": {
63
65
  "name": "Priyanshu Patel",
@@ -69,7 +71,8 @@
69
71
  "postinstall.js",
70
72
  "dist",
71
73
  "README.md",
72
- "LICENSE"
74
+ "LICENSE",
75
+ "CHANGELOG.md"
73
76
  ],
74
77
  "devDependencies": {
75
78
  "@rollup/plugin-commonjs": "^26.0.1",
@@ -80,8 +83,8 @@
80
83
  "postcss": "^8.5.6",
81
84
  "postcss-import": "^16.1.1",
82
85
  "rollup": "^2.78.0",
86
+ "rollup-plugin-bundle-size": "^1.0.3",
83
87
  "rollup-plugin-postcss": "^4.0.2",
84
- "rollup-plugin-size-snapshot": "^0.12.0",
85
88
  "rollup-plugin-visualizer": "^5.12.0"
86
89
  },
87
90
  "repository": {
package/postinstall.js CHANGED
@@ -28,8 +28,9 @@ try {
28
28
  count === 5
29
29
  ? "🎯Thanks for sticking with it!\nThis is the final message. πŸš€"
30
30
  : `πŸ“¦Thanks for using this package!`,
31
- "πŸ“˜ For help: Check the README.md",
32
- "🀝 Open to collaboration & teamwork.",
31
+ "πŸ“˜ In README.md - More professional",
32
+ "πŸ‘¨β€πŸ’» Author **Priyanshu Patel** -",
33
+ "🀝 Open to collaboration & teamwork",
33
34
  "πŸ’Ό Looking for exciting dev opportunities.",
34
35
  "πŸ”— Contact: priyanshu.alt191@gmail.com",
35
36
  "πŸš€ Built different. Stay creative.",
@@ -58,7 +59,7 @@ try {
58
59
  console.log(center(`\x1b[36mβ•š${"═".repeat(boxWidth)}╝\x1b[0m`) + "\n");
59
60
 
60
61
  process.exit(0); // βœ… Exit only after message shown
61
- }, 1200);
62
+ }, 300);
62
63
  }
63
64
  } catch (error) {
64
65
  process.exit(0); // Exit silently